Skip to content

INTEGRATIONS

Mike Crowe edited this page Jul 2, 2026 · 5 revisions

External Integrations

Analysis Date: 2026-06-27

AI Harness CLIs (containerized, not host)

All harness CLIs run inside podman containers only. They are never installed on the host.

Claude Code (Anthropic):

  • Purpose: Primary AI coding harness; Claude Code format is the canonical profile format (design §8)
  • Installer: curl -fsSL https://claude.ai/install.sh | bash (in catalog/base/Dockerfile.harnessed-claude)
  • Auth: ~/.claude/.credentials.json mounted read-only into the container
  • Config: ~/.claude/ (skills, commands, agents, hooks, .mcp.json) — mounted from the assembled profile
  • MCP wiring: reads .claude/.mcp.json natively; points at hatago hub http://localhost:3535/mcp
  • Headless mode: claude -p ... --output-format json for capability tests

omp / Oh My Pi (can1357):

  • Purpose: AI coding harness; consumes Claude-canonical profile via claude-hooks-bridge
  • Installer: mise use -g "github:can1357/oh-my-pi@${OMP_VERSION}" (version pinned in catalog/agents/omp/agent.yaml)
  • Bridge: @drmikecrowe/omp-claude-hooks-bridge pre-installed in image via omp plugin install
  • Auth: shares host ~/.omp/ (default profile; no --profile isolation)
  • MCP: via claude-hooks-bridge reading the profile's .mcp.json

opencode (sst/opencode):

  • Purpose: AI coding harness; reads Claude skills and CLAUDE.md natively
  • Installer: curl -fsSL https://opencode.ai/install | bash -s -- --version "${OPENCODE_VERSION}" --no-modify-path (pinned ARG)
  • Install target: ~/.opencode/bin/ inside container
  • Config: baked ~/.config/opencode/opencode.json (in catalog/base/Dockerfile.harnessed-opencode)
  • MCP wiring: {"mcp": {"hatago": {"type": "remote", "url": "http://localhost:3535/mcp"}}} — does NOT read .mcp.json
  • Skills: reads .claude/skills/**/SKILL.md and ~/.claude/CLAUDE.md natively; does NOT read .claude/commands or .claude/agents

gemini-cli (Google):

  • Purpose: AI coding harness
  • Installer: mise use -g npm:@google/gemini-cli (via pnpm supply-chain policy)
  • Auth: host ~/.gemini OAuth credentials mounted, or GEMINI_API_KEY/GOOGLE_API_KEY env
  • Config: baked ~/.gemini/settings.json (in catalog/base/Dockerfile.harnessed-gemini)
  • MCP wiring: {"mcpServers": {"hatago": {"url": "http://localhost:3535/mcp", "type": "http"}}} — does NOT read .mcp.json
  • Skills: does NOT consume Claude skills/commands natively

Antigravity / agy (Google):

  • Purpose: AI coding harness (gemini-cli-derived)
  • Installer: curl -fsSL https://antigravity.google/cli/install.sh | bash — no version-pin (Google controls the manifest)
  • Auth: Google OAuth via OS keyring/Secret Service; no API key env var — prompts for browser auth on first launch (known limitation in containers)
  • Config: baked ~/.gemini/config/mcp_config.json (in catalog/base/Dockerfile.harnessed-antigravity)
  • MCP wiring: {"mcpServers": {"hatago": {"serverUrl": "http://localhost:3535/mcp"}}} — note serverUrl (differs from gemini-cli's url)

OpenAI Codex CLI:

  • Purpose: AI coding harness
  • Installer: mise use -g npm:@openai/codex (Rust platform binaries as optionalDependencies — no blocked postinstall)
  • Auth: host ~/.codex/auth.json mounted read-only, or OPENAI_API_KEY env
  • Config: baked ~/.codex/config.toml (in catalog/base/Dockerfile.harnessed-codex)
  • MCP wiring: [mcp_servers.hatago]\nurl = "http://localhost:3535/mcp" (TOML; Codex 0.139+ native Streamable-HTTP MCP)
  • Skills: reads AGENTS.md but NOT Claude skills/commands natively

MCP Hub

hatago (@himorishige/hatago-mcp-hub 0.0.16):

  • Purpose: Aggregates all stack MCP servers behind one Streamable-HTTP endpoint inside the pod
  • Install: pnpm add -g "@himorishige/hatago-mcp-hub@${HATAGO_VERSION}" (in catalog/base/Dockerfile.hatago)
  • Endpoint: http://localhost:3535/mcp (all harnesses point here; shared pod network namespace)
  • Config: hatago.config.json generated by assembler at build time; mounted at run time by the launcher
  • Transports: spawns stdio servers as children (stdio→HTTP); proxies network-native servers by URL
  • MCP spec: Streamable HTTP (SSE is deprecated and not used)
  • Port: 3535 (EXPOSE in hatago Dockerfile)

MCP Servers (built-in / tracer):

  • mcp-server-time 2026.6.4 — baked into hatago image via uv tool install "mcp-server-time==${MCP_SERVER_TIME_VERSION}"; runs as hatago stdio child; network-free
  • ping service — FastMCP streamable-http server in catalog/services/ping/; runs as a separate pod container, exposed on host.containers.internal:8080

Supply-Chain Scanners

osv-scanner (Google, V2 2.3.x) — credential-free, always-on:

  • Purpose: Source + image vulnerability scanning; always-on baseline gate
  • Invocation: src/harnessed/scan.pyrun_source_scan, run_image_scan, run_image_scan_online
  • Severity gate: Python CVSS v3 scoring over --format json output (never scanner exit code); HIGH threshold = CVSS ≥ 7.0
  • Image scanning: called host-side against podman save archives (no daemon-in-container)
  • In-image wrapper: catalog/base/harnessed-scan (copied to /usr/local/bin/harnessed-scan)

pip-audit (PyPA) — credential-free, always-on:

  • Purpose: Python dependency audit (PyPI advisory DB + OSV)
  • Install: uv tool install pip-audit inside harnessed-base image
  • Invoked by: src/harnessed/scan.py run_source_scan for any recipe with Python deps

snyk — token-gated, warn-and-skip:

  • Purpose: JS/Python supply-chain scan; snyk test --severity-threshold=high
  • Install: pnpm add -g snyk inside harnessed-base image
  • Auth env var: SNYK_TOKEN (resolved via varlock + 1Password if .env.schema present)
  • Behavior without token: warns and skips; build stays non-interactive
  • Container scan: scan-snyk-container subcommand in src/harnessed/cli.py

Socket.dev — token-gated, optional:

  • Purpose: Deeper supply-chain behavioral signals
  • Auth env var: SOCKET_SECURITY_API_KEY
  • Behavior without token: warns and skips

Secrets Management

varlock (dmno-dev/varlock 0.x) — opt-in:

  • Purpose: Resolves op:// references in .env.schema and injects resolved env at launch
  • Schema location: ~/.config/harnessed/.env.schema (example at .env.schema.example in repo)
  • Activation: inert with no schema present; activated automatically when schema file exists
  • Plugin: @varlock/1password-plugin@1.2.0 (declared in schema header)
  • Auth: allowAppAuth=true (mounted 1Password desktop app agent socket — preferred for interactive use)

1Password CLI (op 2.x):

  • Purpose: Resolves op://Vault/Item/field refs for varlock + scanner tokens
  • Install: official apt repo (downloads.1password.com), baked into harnessed-base image
  • Desktop app also installed in base image (for op-ssh-sign SSH signing)
  • Auth variants: mounted agent socket (interactive) or OP_SERVICE_ACCOUNT_TOKEN (headless/CI)
  • Secret refs declared in .env.schema.example:
    • SNYK_TOKEN = op(op://Private/SNYK_API_TOKEN/credential)
    • SOCKET_SECURITY_API_KEY = op(op://Private/SocketDev/credential)

Container Engine

Podman (rootless):

  • Purpose: Pod and container lifecycle; the only host dependency
  • Driver: src/harnessed/launcher.py calls subprocess / os.execvp to drive podman
  • Socket: unix:///run/user/$UID/podman/podman.sock — set as CONTAINER_HOST/DOCKER_HOST
  • Pod naming: harnessed-<stack>-<sha1[:8] of project_path> (from src/harnessed/paths.py)
  • DooD pattern: all -v bind mounts use host-absolute paths; host HOME/PWD passed as env

CI/CD & Nightly Scanning

Nightly re-scan:

  • systemd/harnessed-rescan.timerOnCalendar=daily, Persistent=true; user-level systemd
  • systemd/harnessed-rescan.service — runs online osv-scanner against saved image archives
  • Install: user copies to ~/.config/systemd/user/; loginctl enable-linger $USER required

No CI pipeline configured — local single-user tooling; no GitHub Actions or remote CI detected.

Data Storage

Profiles:

  • Location: $XDG_DATA_HOME/harnessed/profiles/<stack>/ (defaults to ~/.local/share/harnessed/profiles/)
  • Written by: harnessed build (via harnessed-tools assemble)
  • Contains: assembled .claude/ profile tree + .mcp.json + hatago.config.json

No database, no file storage service, no caching layer — all state is local filesystem.

Authentication Flows

Claude Code: OAuth credentials at ~/.claude/.credentials.json on host; mounted read-only into harness container omp: Shares host's default omp profile (auth + sessions); no isolation flag gemini: ~/.gemini/ OAuth creds on host, mounted read-only, or API key env codex: ~/.codex/auth.json on host, mounted read-only, or OPENAI_API_KEY env antigravity: Requires interactive browser auth on first container launch (OS keyring not available in clean container)

Webhooks & Callbacks

No incoming or outgoing webhooks — this is a local developer tooling project with no web-facing endpoints.


Integration audit: 2026-06-27

Clone this wiki locally