-
Notifications
You must be signed in to change notification settings - Fork 0
INTEGRATIONS
Analysis Date: 2026-06-27
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(incatalog/base/Dockerfile.harnessed-claude) - Auth:
~/.claude/.credentials.jsonmounted read-only into the container - Config:
~/.claude/(skills, commands, agents, hooks,.mcp.json) — mounted from the assembled profile - MCP wiring: reads
.claude/.mcp.jsonnatively; points at hatago hubhttp://localhost:3535/mcp - Headless mode:
claude -p ... --output-format jsonfor 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 incatalog/agents/omp/agent.yaml) - Bridge:
@drmikecrowe/omp-claude-hooks-bridgepre-installed in image viaomp plugin install - Auth: shares host
~/.omp/(default profile; no--profileisolation) - 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(incatalog/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.mdand~/.claude/CLAUDE.mdnatively; does NOT read.claude/commandsor.claude/agents
gemini-cli (Google):
- Purpose: AI coding harness
- Installer:
mise use -g npm:@google/gemini-cli(via pnpm supply-chain policy) - Auth: host
~/.geminiOAuth credentials mounted, orGEMINI_API_KEY/GOOGLE_API_KEYenv - Config: baked
~/.gemini/settings.json(incatalog/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(incatalog/base/Dockerfile.harnessed-antigravity) - MCP wiring:
{"mcpServers": {"hatago": {"serverUrl": "http://localhost:3535/mcp"}}}— noteserverUrl(differs from gemini-cli'surl)
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.jsonmounted read-only, orOPENAI_API_KEYenv - Config: baked
~/.codex/config.toml(incatalog/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.mdbut NOT Claude skills/commands natively
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}"(incatalog/base/Dockerfile.hatago) - Endpoint:
http://localhost:3535/mcp(all harnesses point here; shared pod network namespace) - Config:
hatago.config.jsongenerated 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 viauv tool install "mcp-server-time==${MCP_SERVER_TIME_VERSION}"; runs as hatago stdio child; network-free -
pingservice — FastMCP streamable-http server incatalog/services/ping/; runs as a separate pod container, exposed onhost.containers.internal:8080
osv-scanner (Google, V2 2.3.x) — credential-free, always-on:
- Purpose: Source + image vulnerability scanning; always-on baseline gate
- Invocation:
src/harnessed/scan.py→run_source_scan,run_image_scan,run_image_scan_online - Severity gate: Python CVSS v3 scoring over
--format jsonoutput (never scanner exit code); HIGH threshold = CVSS ≥ 7.0 - Image scanning: called host-side against
podman savearchives (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-auditinsideharnessed-baseimage - Invoked by:
src/harnessed/scan.pyrun_source_scanfor 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 snykinsideharnessed-baseimage - Auth env var:
SNYK_TOKEN(resolved via varlock + 1Password if.env.schemapresent) - Behavior without token: warns and skips; build stays non-interactive
- Container scan:
scan-snyk-containersubcommand insrc/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
varlock (dmno-dev/varlock 0.x) — opt-in:
- Purpose: Resolves
op://references in.env.schemaand injects resolved env at launch - Schema location:
~/.config/harnessed/.env.schema(example at.env.schema.examplein 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/fieldrefs for varlock + scanner tokens - Install: official apt repo (
downloads.1password.com), baked intoharnessed-baseimage - Desktop app also installed in base image (for
op-ssh-signSSH 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)
Podman (rootless):
- Purpose: Pod and container lifecycle; the only host dependency
- Driver:
src/harnessed/launcher.pycallssubprocess/os.execvpto drive podman - Socket:
unix:///run/user/$UID/podman/podman.sock— set asCONTAINER_HOST/DOCKER_HOST - Pod naming:
harnessed-<stack>-<sha1[:8] of project_path>(fromsrc/harnessed/paths.py) - DooD pattern: all
-vbind mounts use host-absolute paths; hostHOME/PWDpassed as env
Nightly re-scan:
-
systemd/harnessed-rescan.timer—OnCalendar=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 $USERrequired
No CI pipeline configured — local single-user tooling; no GitHub Actions or remote CI detected.
Profiles:
- Location:
$XDG_DATA_HOME/harnessed/profiles/<stack>/(defaults to~/.local/share/harnessed/profiles/) - Written by:
harnessed build(viaharnessed-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.
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)
No incoming or outgoing webhooks — this is a local developer tooling project with no web-facing endpoints.
Integration audit: 2026-06-27
Start Here
Guides
- Recipe authoring
- Service authoring
- Stacks
- Extending stacks (proposed)
- Recipe catalog
- System prompt & rules (proposed)
- Secrets
- AWS SSO
- Pulumi (host login forwarding)
- Egress & exposing services
- Container filesystem
- Git hooks
- Troubleshooting
- Pin management (harnessed update)
Codebase Map
Planning & Roadmap
- open work: GitHub Issues
Research & Prompts
- research/ (home-folder requirements per harness, browse in-repo)
- prompts/ (reusable prompt templates, browse in-repo)