A single binary, hexagonal design, zero SDK dependencies. Here's how it all fits together.
Ports-and-adapters pattern. Each layer depends only on the interfaces below it.
Every user message goes through the same cycle. The engine is provider-agnostic — it only sees events.
Providers register via init() + llm.Register(). The engine calls llm.Resolve("provider/model") and gets back a Provider interface.
net/http, bufio, encoding/json. No SDK dependencies. Gemini, Alibaba, and LiteLLM use WithCompat() which disables OpenAI-specific features.Every tool call goes through the registry. File writes are gated by user confirmation. Undo reverts the last write.
Orchestrator agents delegate to specialists. Spokes return structured JSON. Multiple delegations run in parallel.
Agent references an MCP server by name. The manager spawns it, handshakes, discovers tools, and namespaces them.
When response_schema is set in frontmatter, the engine enforces valid JSON via each provider's native mechanism.
| Feature | AgentCTL | Cursor | GitHub Copilot | Aider | Continue |
|---|---|---|---|---|---|
| Interface | CLI / TUI | IDE (VS Code fork) | IDE plugin | CLI | IDE plugin |
| Agent definition | Markdown files | Built-in | Built-in | Config flags | JSON config |
| Multi-provider | ✓ 6 providers | ~ 3 | ✗ OpenAI only | ✓ Many | ✓ Many |
| Local models | ✓ Ollama | ~ Limited | ✗ | ✓ | ✓ |
| MCP support | ✓ Stdio | ✗ | ✗ | ✗ | ✓ |
| Sub-agents | ✓ Hub-and-spoke | ✗ | ✗ | ✗ | ✗ |
| Structured output | ✓ JSON schema | ✗ | ✗ | ✗ | ✗ |
| File write confirm | ✓ Always | ✓ Diff view | ~ Auto | ✓ | ✓ |
| Version control | ✓ Git built-in | ~ IDE git | ~ IDE git | ✓ Auto-commit | ✗ |
| Binary size | 7.8 MB | ~500 MB | Plugin | pip install | Plugin |
| Dependencies | ✓ Zero | Electron | VS Code | Python | VS Code |
| Price | Free (+ API costs) | $20/mo | $10/mo | Free (+ API) | Free (+ API) |
No provider-specific code in the engine or tools. Swap backends without touching core logic.
No SDK deps. Every HTTP call is plain net/http. Easy to debug, easy to fork.
macOS Keychain or Linux libsecret. Never in config files. Never in plaintext.
Agents, skills, tools, MCP servers — all defined in Markdown with YAML frontmatter.
K8s, Terraform, Helm accessed via shell — no client-go, no version coupling, binary stays small.
ConfigSource, Secrets, StateStore interfaces. Swap implementations without engine changes.