Skip to content

INTEGRATIONS

Mike Crowe edited this page Aug 15, 2026 · 5 revisions

External Integrations

Analysis Date: 2026-08-15

Container Runtime

  • podman — host-native pod/container management; no daemon socket, no Docker-in-Docker. The CLI (src/harnessed/launcher.py) shells out to podman directly for build, pod create, run, volume operations. HARNESSED_PODMAN=1 gates integration tests that require a real podman installation.

MCP Hub (hatago)

  • hatago — in-process MCP hub baked into the agent container. hatago runs as a child process inside the harness container; the harness's .mcp.json carries a single entry pointing at hatago's Streamable-HTTP endpoint. Recipe MCP servers (stdio or HTTP sidecars) register with hatago; the harness never talks to them directly.
  • Transport: Streamable-HTTP only — SSE is deprecated. All recipe MCP servers must expose a Streamable-HTTP surface (or be a stdio child spawned by hatago). This constraint is enforced in CLAUDE.md and documented in ARCHITECTURE.md.
  • Harness config paths (src/harnessed/schema.py HARNESS_CONFIG_DIR):
    • claude.claude (native .mcp.json + skills/commands/agents)
    • omp.claude (claude-hooks-bridge)
    • opencode.claude (reads skills/**/SKILL.md + CLAUDE.md natively; MCP via image-baked ~/.config/opencode)
    • antigravity.claude (MCP via image-baked ~/.gemini/config/mcp_config.json)
    • codex.claude (MCP via image-baked ~/.codex/config.toml; reads AGENTS.md)

AI Agents (Harnesses)

Defined in catalog/agents/<name>/agent.yaml. All build FROM harnessed-base.

Agent Image Notable
claude harnessed-claude Claude Code CLI 2.1.223 (pinned; hold: — version unqueryable from upstream)
omp harnessed-omp Claude via claude-hooks-bridge; catalog/base/Dockerfile.harnessed-omp
opencode harnessed-opencode catalog/base/Dockerfile.harnessed-opencode
antigravity harnessed-antigravity Google Gemini harness; catalog/base/Dockerfile.harnessed-antigravity
codex harnessed-codex OpenAI Codex; catalog/base/Dockerfile.harnessed-codex

Services (Shared Sidecars)

Defined in catalog/services/<name>/service.yaml. All scope: global (default) — one shared container per host, outliving any agent instance.

agentmemory (catalog/services/agentmemory/)

  • Purpose: persistent shared memory store for all agents and instances
  • Image: harnessed-agentmemory:latest
  • Port: 3111 (REST; reached at host.containers.internal:3111)
  • Storage: named volume agentmemory-data (SQLite via embedded iii-engine)
  • MCP surface: none on the service itself — the agentmemory recipe ships a stdio MCP shim that proxies the REST API over AGENTMEMORY_URL
  • Healthcheck: curl -sf http://localhost:3111/agentmemory/livez

ping (catalog/services/ping/)

  • Purpose: lightweight network-native MCP tracer (proof-of-concept shared service)
  • Image: harnessed-ping:latest
  • Port: 8080 (Streamable-HTTP MCP; host.containers.internal:8080)
  • Storage: named volume ping-data
  • Healthcheck: curl -sf http://localhost:8080/health

gbrain (catalog/services/gbrain/)

  • Purpose: shared long-lived knowledge brain; multiple agent types read/write the same memory
  • Image: harnessed-gbrain:latest
  • Port: 3112
  • External dependency: operator-supplied Postgres+pgvector (DATABASE_URL → Supabase / Neon / self-hosted). The service does not manage the database; v2 (deferred, GAP 7) will add a managed Postgres sidecar via a compose file.
  • Storage: named volume for brain repo (markdown) + ~/.gbrain/ config; retrieval index in the external Postgres DB.

External Package Registries

  • npm registry — all npm-based tool installs in images go through pnpm (supply-chain policy BLD-01/BLD-03). Examples: gsd-core@1.9.1 (catalog/recipes/gsd-core/), markdownlint-cli2@0.23.2 (catalog/base/extra-tools.default.txt), pyright@1.1.411 (mise.toml)
  • PyPI — host Python deps via uv; container Python deps via uv inside images
  • GitHub releases — binary tools in catalog/recipes/*/mise.lock (e.g. codebase-memory-mcp static binary); mise fetches and verifies sha256 checksums from release assets

Credential / Secret Stores

  • 1Password CLI (op) — installed in catalog/base/Dockerfile.harnessed-base (best-effort; warns and continues if downloads.1password.com is unreachable). Used for SSH commit signing (op-ssh-sign). The SSH agent socket is forwarded from the host when present (launcher._ssh_agent_args).
  • Credential mounts — handled by src/harnessed/credmounts.py. Credentials are referenced (via mount, symlink, or token/broker URL) and never baked, copied, or snapshotted into any container or volume. This is a hard constraint enforced in CLAUDE.md.

Version Control / CI

  • GitHub — primary remote; gh CLI used in mise.toml tasks (e.g. upgrade-pr)
  • GitHub Actions — CI pipelines under .github/workflows/; all actions pinned to commit SHAs (not mutable tags):
    • test.ymlpytest on Python 3.12 + 3.13 (two separate jobs to preserve the required-check name)
    • lint.yml — ruff + pyright + shellcheck; held at zero findings; uses mise-action to reproduce local tool versions
    • live.yml — full podman integration suite; runs on push to main, nightly at 04:00 UTC, and on dispatch
    • pin-check.yml — detects floating pins
    • deploy-web.yml — web/wiki deployment

MCP Recipe Servers (catalog)

Recipes may ship MCP servers consumed by the harness through hatago.

Recipe Transport Notes
ping (via service) Streamable-HTTP Reference sidecar; global scope
agentmemory stdio (shim) Proxies the agentmemory REST service
codebase-memory-mcp stdio Static binary (tree-sitter); baked via tools:; mise.lock verifies sha256
time stdio (uvx) Hatago spawns as child
serena stdio/LSP serena init -b LSP in install.sh
context-mode (recipe) catalog/recipes/context-mode/
repowise stdio catalog/recipes/repowise/
gstack (recipe) catalog/recipes/gstack/

Tool Vendors (Recipe Content)

Recipes pull upstream skill/tool content from external authors, pinned via install.refs::

  • Superpowers (Jesse Vincent / Prime Radiant) — catalog/recipes/superpowers/; pinned GitHub release tag; 14 Claude-canonical skills
  • GSD Core (opengsd.net) — catalog/recipes/gsd-core/; npm:@opengsd/gsd-core@1.9.1 via pnpm
  • Serenacatalog/recipes/serena/; language-server-protocol MCP bridge
  • OpenBraincatalog/recipes/openbrain-example/
  • Cavemancatalog/recipes/caveman/

All upstream content is pinned and fetched at build time; no @latest or --branch main is accepted (PinValidationError enforced in src/harnessed/schema.py).

Clone this wiki locally