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-V5)

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.