← Back to Index

CmdForge Architecture

Module Structure

src/cmdforge/
├── cli/                    # CLI commands
│   ├── __init__.py
│   ├── tool_commands.py    # list, create, edit, delete
│   ├── provider_commands.py # providers management
│   └── registry_commands.py # publish, install
├── registry/               # Registry API
│   ├── app.py              # Flask API endpoints
│   ├── db.py               # SQLite schema and queries
│   ├── sync.py             # Git repo sync
│   └── rate_limit.py
├── web/                    # Web UI
│   ├── app.py              # Flask app factory
│   ├── routes.py           # Page routes
│   ├── auth.py             # User authentication
│   ├── forum/              # Forum feature
│   ├── templates/          # Jinja2 templates
│   └── static/             # CSS, JS
├── ui_urwid/               # Terminal UI
│   ├── __init__.py         # Main TUI
│   ├── widgets.py          # Custom widgets
│   └── palette.py          # Color scheme
├── tool.py                 # Tool dataclass and loading
├── runner.py               # Tool execution engine
└── providers.py            # AI provider abstraction

Data Flow

CLI Tool Execution

User Input (stdin)
       │
       ▼
┌─────────────┐
│  runner.py  │ ──── Loads tool from ~/.cmdforge/<name>/config.yaml
└─────────────┘
       │
       ▼
┌─────────────┐
│   Steps     │
│  (prompt/   │ ──── For prompt steps, calls providers.py
│   code)     │ ──── For code steps, exec() Python
└─────────────┘
       │
       ▼
    Output (stdout)

Web UI Request Flow

Browser Request
       │
       ▼
┌─────────────────┐
│   Cloudflare    │ ──── HTTPS termination
└─────────────────┘
       │
       ▼
┌─────────────────┐
│  Flask :5050    │ ──── web/app.py
└─────────────────┘
       │
       ├──── /api/* → registry/app.py (API)
       └──── /* → web/routes.py (Pages)
              │
              ▼
       ┌─────────────┐
       │  SQLite DB  │
       └─────────────┘

Key Classes

Tool (tool.py)

@dataclass
class Tool:
    name: str
    description: str
    category: str
    arguments: List[ToolArgument]
    steps: List[Step]           # PromptStep | CodeStep | ToolStep
    output: str
    dependencies: List[str]
    source: Optional[ToolSource]  # Attribution for imports
    version: str

ToolSource (tool.py)

@dataclass
class ToolSource:
    type: str          # "original", "imported", "forked"
    license: str
    url: str
    author: str
    original_tool: str  # e.g., "fabric/patterns/extract_wisdom"

Provider (providers.py)

@dataclass
class Provider:
    name: str           # e.g., "opencode-pickle"
    command: str        # e.g., "$HOME/.opencode/bin/opencode run --model ..."
    description: str

Configuration Files

File Location Purpose
Tool config ~/.cmdforge/<name>/config.yaml Tool definition
Providers ~/.cmdforge/providers.yaml AI provider commands
Main config ~/.cmdforge/config.yaml Registry URL, client ID