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 |