Skip to content

Architecture ​

Overview ​

Components ​

mecha binary (Go) ​

The single binary handles worker management, event routing, task dispatch, and policy enforcement:

PackageResponsibility
cmd/mecha/CLI entry point
cmd/mecha-mcp/MCP server (14 tools: docs + orchestration)
internal/cli/Cobra commands, Docker lifecycle, adapter management
internal/serve/HTTP server, dispatch loop, retry, rate limiter, metrics
internal/source/Event sources: GitHub, GitLab, Slack, Telegram, Cron, Generic
internal/events/Event types, store, dedup enforcement
internal/tasks/Task lifecycle, retry with exponential backoff
internal/policies/Policy filter: comment, labels, status, commit, metadata
internal/adapter/LLM adapters: Ollama, OpenAI-compatible
internal/workers/Config, registry, Docker client, secrets, health, redaction
internal/writeback/GitHub write-back (comments, labels, status, diffs)
internal/store/SQLite database, versioned migrations (V1-V7)

Worker runtime (TypeScript/Bun) ​

Inside each container, a Bun HTTP server receives tasks and dispatches to the backend:

  • Claude: calls the Agent SDK query() directly (structured response, no subprocess)
  • Codex: available as an MCP child process within the Claude session (auto-detected via credential mount)

The server is single-flight: one task at a time. A second request while busy returns 429 Too Many Requests.

Registry ​

State is persisted to ~/.mecha/mecha.db (SQLite, WAL mode):

TablePurpose
workersWorker definitions + runtime state (JSON)
tasksTask lifecycle (pending → dispatched → completed/failed)
eventsWebhook events + matching state

The registry uses clone-on-write: mutations clone the in-memory map, persist to SQLite in a transaction, then swap the pointer. On persistence failure, in-memory state is unchanged.

Secrets ​

Tokens live in ~/.mecha/secrets.yml, referenced by backend.name:

text
docker.token: claude.xiaolaidev
  → secrets.yml lookup
  → sk-ant-oat01-xxx...
  → detect prefix → CLAUDE_CODE_OAUTH_TOKEN
  → inject into container env

See Secrets for full details.

Worker Lifecycle ​

Docker Start Sequence ​

Rollback on Failure ​

Failure pointCleanup
Create failsSet error state, no container to clean
Start failsRemove created container, set error
Health timeoutStop + remove container, set error
Registry persist failsContainer runs, recoverable via label discovery

Security Model ​

  • Workers receive LLM tokens via env vars or credential mounts
  • GitHub tokens are blocked from container env
  • All GitHub writes go through mecha → Policy
  • Error messages are redacted before display

Dependencies ​

DependencyVersionPurpose
github.com/spf13/cobra1.10.2CLI framework
gopkg.in/yaml.v33.0.1Worker YAML parsing
github.com/moby/moby/api1.54.0Docker API types
github.com/moby/moby/client0.3.0Docker container management
modernc.org/sqlite1.48.0SQLite persistence (workers, tasks, events)

Released under the ISC License.