Harness registry
Technical registry reference for built-in Apothem harness adapters.
The harness registry is the source-of-truth adapter inventory used by the CLI,
documentation, fixture tests, and convention-pin validation. The runtime source
is src/apothem/lib/harness_registry.py; every row below is traceable to that
registry, the per-adapter capabilities.yml, and each adapter's
STANDARD-CONVENTION-PIN.md.
Registry matrix
| Harness | Install name | Scope | Format | Targets | MCP | Convention pin |
|---|---|---|---|---|---|---|
| Antigravity | antigravity | user | markdown | ~/.gemini/GEMINI.md; ~/.gemini/antigravity-cli/plugins/apothem/ | discovery-pending | src/apothem/harnesses/antigravity/STANDARD-CONVENTION-PIN.md |
| Claude Code | claude-code | user | json | ~/.claude/settings.json; ~/.claude/CLAUDE.md; native agents, rules, skills, statuslines, output-styles; ~/.claude/.apothem/support/ | discovery-pending | src/apothem/harnesses/claude_code/STANDARD-CONVENTION-PIN.md |
| CodeBuddy | codebuddy | project | markdown | <project>/.codebuddy/rules/apothem-rules.md; <project>/.codebuddy/agents/; <project>/.codebuddy/settings.local.json; <project>/.apothem/support/hooks/; ~/.codebuddy/skills/; ~/.config/apothem/{rules,templates}/ | discovery-pending | src/apothem/harnesses/codebuddy/STANDARD-CONVENTION-PIN.md |
| Codex | codex | user | markdown | ~/.codex/AGENTS.md; hooks.json; hooks/; agents/*.toml; ~/.agents/skills/; ~/.config/apothem/ | discovery-pending | src/apothem/harnesses/codex/STANDARD-CONVENTION-PIN.md |
| Cursor | cursor | project | mdc | <project>/.cursor/rules/apothem-rules.mdc; <project>/.cursor/agents/; <project>/.cursor/hooks.json; <project>/.apothem/support/cursor/hooks/; ~/.agents/skills/; ~/.config/apothem/{rules,templates}/ | discovery-pending | src/apothem/harnesses/cursor/STANDARD-CONVENTION-PIN.md |
| Gemini CLI | gemini-cli | project | markdown | <project>/GEMINI.md; <project>/.gemini/{commands,skills,agents}/; <project>/.gemini/.apothem/support/ | discovery-pending | src/apothem/harnesses/gemini_cli/STANDARD-CONVENTION-PIN.md |
| GitHub Copilot | github-copilot | project | markdown | <project>/.github/copilot-instructions.md; <project>/.github/agents/; <project>/.github/hooks/apothem.json; <project>/.apothem/support/github-copilot/hooks/; ~/.agents/skills/; ~/.config/apothem/{rules,templates}/ | unsupported | src/apothem/harnesses/github_copilot/STANDARD-CONVENTION-PIN.md |
| GLM (Z.ai) | glm | project | toml | <project>/.apothem/providers/glm.toml | unsupported | src/apothem/harnesses/glm/STANDARD-CONVENTION-PIN.md |
| Hermes | hermes | user | yaml | ~/.hermes/config.yaml; ~/.hermes/.apothem/support/ | native | src/apothem/harnesses/hermes/STANDARD-CONVENTION-PIN.md |
| Kimi Code | kimi-code | project | markdown | <project>/AGENTS.md; <project>/.kimi-code/skills/; <project>/.kimi-code/agents/; <project>/.kimi-code/.apothem/support/ | discovery-pending | src/apothem/harnesses/kimi_code/STANDARD-CONVENTION-PIN.md |
| Kiro | kiro | project | markdown | <project>/.kiro/steering/apothem-rules.md; <project>/.kiro/agents/; <project>/.kiro/hooks/apothem.json; <project>/.apothem/support/kiro/hooks/; ~/.kiro/skills/; ~/.config/apothem/{rules,templates}/ | discovery-pending | src/apothem/harnesses/kiro/STANDARD-CONVENTION-PIN.md |
| Open-Claw | open-claw | user | json | ~/.openclaw/openclaw.json; ~/.openclaw/.apothem/support/ | unsupported | src/apothem/harnesses/open_claw/STANDARD-CONVENTION-PIN.md |
| OpenCode | opencode | user | json | ~/.config/opencode/opencode.json; native commands, skills, agents; ~/.config/opencode/.apothem/support/ | native | src/apothem/harnesses/opencode/STANDARD-CONVENTION-PIN.md |
| Qwen Code | qwen-code | user | json | ~/.qwen/settings.json; ~/.qwen/QWEN.md; native commands, skills, agents; ~/.qwen/.apothem/support/ | native | src/apothem/harnesses/qwen_code/STANDARD-CONVENTION-PIN.md |
| Trae | trae | project | markdown | <project>/.trae/rules/apothem-rules.md; <project>/.trae/agents/; ~/.trae/skills/; ~/.config/apothem/{rules,templates}/ | discovery-pending | src/apothem/harnesses/trae/STANDARD-CONVENTION-PIN.md |
| Windsurf | windsurf | project | markdown | <project>/.devin/rules/apothem-rules.md; <project>/.devin/agents/; <project>/.devin/config.local.json; <project>/.apothem/support/windsurf/hooks/; ~/.agents/skills/; ~/.config/apothem/{rules,templates}/ | discovery-pending | src/apothem/harnesses/windsurf/STANDARD-CONVENTION-PIN.md |
| Zed | zed | project | markdown | <project>/.rules; ~/.agents/skills/; ~/.config/apothem/{rules,templates}/ | discovery-pending | src/apothem/harnesses/zed/STANDARD-CONVENTION-PIN.md |
Payload cohort support
Status values are native, converted, support-tree,
profile-projected, unsupported, not-applicable, and
discovery-pending.
A converted cohort is rewritten into the harness's own format, and some
source fields have no place in it. For each converted commands, agents, or
rules cohort, the adapter's capabilities.yml carries a conversion_losses
map that says what happens to every source frontmatter field:
| Value | Meaning |
|---|---|
native:<field> | The harness reads it under that field. |
sidecar:<path> | It is written to a separate file next to the converted one, such as Codex's agents/openai.yaml. |
filename | The file or folder name carries it. |
inlined | It moves into the prompt or body text. |
ignored | It stays in the file, but the harness does not read it. |
dropped | It is left out. |
A test renders every converted file and checks the maps against the output.
| Harness | Native or converted payloads | Support-tree payloads | Unsupported or pending warnings |
|---|---|---|---|
| Antigravity | converted commands, agents, and rules; native skills, sub-agent dispatch, system prompt templates | hooks, templates | statuslines, output styles; MCP and memory discovery pending |
| Claude Code | converted commands; native skills, hooks, agents, rules, statuslines, output styles, sub-agent dispatch | templates | CLAUDE.md stays operator-owned apart from the one Apothem block; no adapter-written system prompt template; MCP discovery pending |
| CodeBuddy | converted commands and agents; native skills, hooks, rules, sub-agent dispatch, system prompt templates | templates | statuslines, output styles; MCP discovery pending |
| Codex | converted commands and agents; native skills, hooks, sub-agent dispatch, system prompt templates | rules, templates | statuslines, output styles; MCP discovery pending because Apothem does not overwrite config.toml |
| Cursor | converted commands and agents; native skills, hooks, rules, sub-agent dispatch, system prompt templates | templates | statuslines, output styles, memory; MCP discovery pending |
| Gemini CLI | converted commands and agents; native skills, sub-agent dispatch, system prompt templates, memory | hooks, rules, templates | statuslines, output styles; MCP discovery pending |
| GitHub Copilot | converted commands and agents; native skills, hooks, rules, sub-agent dispatch, system prompt templates | templates | statuslines, output styles, MCP, memory |
| GLM (Z.ai) | none | none | commands, skills, hooks, agents, rules, templates, statuslines, output styles, MCP, sub-agent dispatch, tool restrictions, system prompt templates, memory — GLM is a model backend with no native config surface |
| Hermes | converted commands; native system prompt templates, MCP, sub-agent dispatch | skills, hooks, agents, rules, templates | statuslines, output styles |
| Kimi Code | converted commands and agents; native skills, sub-agent dispatch, system prompt templates, memory | hooks, rules, templates | statuslines, output styles; MCP and tool restrictions discovery pending |
| Kiro | converted commands and agents; native skills, hooks, rules, sub-agent dispatch, system prompt templates | templates | statuslines, output styles; MCP discovery pending |
| Open-Claw | converted commands; native system prompt templates, sub-agent dispatch | skills, hooks, agents, rules, templates | statuslines, output styles, MCP |
| OpenCode | converted commands and agents; native skills, MCP, sub-agent dispatch, system prompt templates | hooks, rules, templates | statuslines, output styles |
| Qwen Code | converted commands and agents; native skills, hooks, MCP, sub-agent dispatch, system prompt templates | rules, templates | statuslines, output styles |
| Trae | converted commands and agents; native skills, rules, sub-agent dispatch, system prompt templates | templates | hooks, statuslines, output styles, memory; MCP discovery pending |
| Windsurf | converted commands and agents; native skills, hooks, rules, sub-agent dispatch, system prompt templates | templates | statuslines, output styles, memory; MCP discovery pending |
| Zed | converted commands; native skills, rules, system prompt templates | templates | hooks, agents, statuslines, output styles, sub-agent dispatch, memory; MCP discovery pending |
The table leaves out the cells the registry marks not-applicable: tool
restrictions on every harness except Kimi Code (discovery-pending) and
GLM (Z.ai) (unsupported), and memory on Claude Code, CodeBuddy, Codex,
Hermes, Kiro, Open-Claw, OpenCode, and Qwen Code.
Shared roots
Some install targets are loaded by harnesses other than the one that writes
them. The registry records each such path in SHARED_ROOTS with one registered
owner (the adapter the vendor documents the path for), the co-installers that
write the same files to it, and the readers whose vendor docs load it by
default, plus the vendor pages that show it and the date they were retrieved.
A path with co-installers is a user-level folder in the home directory that
several installs write with the same bytes. A machine with only Cursor
installed has no Codex to write ~/.agents/skills/, so each install that
names the folder writes it, and the install ledger counts the installs that use
it. The owner of record is the registered owner while it uses the folder, and
otherwise the oldest install that does; nothing moves when the registered owner
is uninstalled. An uninstall removes the folder only when no other install still
uses it (see uninstall).
Installing a reader puts no files in the folder; installing the owner or a
co-installer puts Apothem content in front of every reader.
| Path | Owner | Co-installers | Readers |
|---|---|---|---|
~/.agents/skills/ | Codex | Cursor, GitHub Copilot, Windsurf, Zed | Gemini CLI, Kimi Code, Open-Claw, OpenCode, Qwen Code |
~/.config/apothem/rules/ | Codex | CodeBuddy, Cursor, GitHub Copilot, Kiro, Trae, Windsurf, Zed | none |
~/.config/apothem/templates/ | Codex | CodeBuddy, Cursor, GitHub Copilot, Kiro, Trae, Windsurf, Zed | none |
~/.claude/skills/ | Claude Code | none | Cursor, OpenCode |
~/.claude/agents/ | Claude Code | none | Cursor |
~/.codex/agents/ | Codex | none | Cursor |
~/.claude/CLAUDE.md | Claude Code | none | OpenCode |
<project>/AGENTS.md | Kimi Code | none | Antigravity, CodeBuddy, Codex, Cursor, GitHub Copilot, Hermes, Kiro, OpenCode, Windsurf, Zed |
<project>/GEMINI.md | Gemini CLI | none | Antigravity, GitHub Copilot, Zed |
~/.gemini/GEMINI.md | Antigravity | none | Gemini CLI |
<project>/.github/copilot-instructions.md | GitHub Copilot | none | Zed |
~/.config/apothem/rules/ and ~/.config/apothem/templates/ hold the files
Apothem's own skills and instruction files cite. No other tool loads them, so
they have no readers and no vendor pages. CodeBuddy, Kiro, and Trae also
write a skills folder of their own (~/.codebuddy/skills/, ~/.kiro/skills/,
and ~/.trae/skills/); only that tool loads it, so it is not a shared root.
A reader is listed only where its vendor docs show a default load of that
exact path. One reader carries a condition, and the install note repeats it:
Open-Claw indexes ~/.agents/skills/ only under its default state directory
(it skips the folder when OPENCLAW_STATE_DIR points elsewhere). The Cursor
docs list ~/.codex/agents/ as a Codex compatibility folder but do not say
which file formats Cursor parses there, and a Codex install writes TOML
files, so whether Cursor reads those helpers is not confirmed. The Cursor
install also writes its own <project>/.cursor/agents/ copy of the helpers,
which the vendor's precedence ranks above the folders it imports, so in an
installed project the native copy supersedes the one from ~/.claude/agents/.
Some tools are deliberately not readers of ~/.agents/skills/: the
Antigravity, CodeBuddy, Kiro, and Trae docs do not say they load it by
default (Trae loads the project .agents/skills/ folder only after a setting
is switched on), which is why CodeBuddy, Kiro, and Trae get a skills
folder of their own. The Hermes docs name it only as an example value for
skills.external_dirs. GitHub Copilot is not a reader of ~/.claude/agents/:
the VS Code docs list that folder for the Anthropic Claude agent, not for the
agent GitHub Copilot runs.
The Apothem block an owner writes into a shared instruction file names no
single tool as its reader. tests/unit/test_shared_roots.py fails when the adapters that
write a registry target are not exactly its owner and its co-installers, and when a registry target named like a
cross-tool instruction file (AGENTS.md, CLAUDE.md, GEMINI.md,
copilot-instructions.md) has no declared owner. The one exception is
~/.codex/AGENTS.md, which no other registered harness documents loading.
Validation hooks
The registry stays synchronized through these checks:
| Check | Purpose |
|---|---|
python scripts/dev/validate_harness_convention_pins.py --today YYYY-MM-DD | Confirms each adapter has a convention pin that is at most 90 days old, cites at least one vendor URL, and has no overdue discovery target. CI runs it on every pull request, weekly, and before a release. |
python scripts/dev/check_vendor_urls.py | Fetches every vendor URL the pins and harness templates cite and fails on a moved or dead page, including a host name that no longer resolves or a certificate that fails verification; a timeout, a refused or reset connection, or a 5xx server error is reported as unreachable and does not fail it. A host name that resolves only to a placeholder address no server can hold, which a vendor's name servers can return for the region the check runs from, gets no request: it is reported as unroutable, does not fail the check, and its pages need a check by hand. The weekly convention monitor runs it, warns about each such host on every run, and lists its pages in the issue it files. |
python -m apothem.conformity.gate --all . | Runs the documentation and implementation conformity checks. |
python -m pytest | Exercises registry fixture tests and adapter contract tests. |
Generated Harness Adapter Reference
| Harness | Scope | Format | Target paths |
|---|---|---|---|
Antigravity (antigravity) | user | markdown | ~/.gemini/GEMINI.md~/.gemini/antigravity-cli/plugins/apothem/ |
Claude Code (claude-code) | user | json | ~/.claude/.apothem/support/{templates,hooks,conformity,schemas}/~/.claude/CLAUDE.md~/.claude/settings.json~/.claude/{agents,rules,skills,statuslines,output-styles}/ |
CodeBuddy (codebuddy) | project | markdown | <project>/.apothem/support/hooks/<project>/.codebuddy/agents/<project>/.codebuddy/rules/apothem-rules.md<project>/.codebuddy/settings.local.json~/.codebuddy/skills/~/.config/apothem/{rules,templates}/ |
Codex (codex) | user | markdown | ~/.agents/skills/~/.codex/AGENTS.md~/.codex/agents/*.toml~/.codex/hooks.json~/.codex/hooks/~/.config/apothem/{rules,templates}/ |
Cursor (cursor) | project | mdc | <project>/.apothem/support/cursor/hooks/<project>/.cursor/agents/<project>/.cursor/hooks.json<project>/.cursor/rules/apothem-rules.mdc~/.agents/skills/~/.config/apothem/{rules,templates}/ |
Gemini CLI (gemini-cli) | project | markdown | <project>/.gemini/.apothem/support/<project>/.gemini/{commands,skills,agents}/<project>/GEMINI.md |
GitHub Copilot (github-copilot) | project | markdown | <project>/.apothem/support/github-copilot/hooks/<project>/.github/agents/<project>/.github/copilot-instructions.md<project>/.github/hooks/apothem.json~/.agents/skills/~/.config/apothem/{rules,templates}/ |
GLM (Z.ai) (glm) | project | toml | <project>/.apothem/providers/glm.toml |
Hermes (hermes) | user | yaml | ~/.hermes/.apothem/support/~/.hermes/config.yaml |
Kimi Code (kimi-code) | project | markdown | <project>/.kimi-code/.apothem/support/<project>/.kimi-code/agents/<project>/.kimi-code/skills/<project>/AGENTS.md |
Kiro (kiro) | project | markdown | <project>/.apothem/support/kiro/hooks/<project>/.kiro/agents/<project>/.kiro/hooks/apothem.json<project>/.kiro/steering/apothem-rules.md~/.config/apothem/{rules,templates}/~/.kiro/skills/ |
Open-Claw (open-claw) | user | json | ~/.openclaw/.apothem/support/~/.openclaw/openclaw.json |
OpenCode (opencode) | user | json | ~/.config/opencode/.apothem/support/~/.config/opencode/opencode.json~/.config/opencode/{commands,skills,agents}/ |
Qwen Code (qwen-code) | user | json | ~/.qwen/.apothem/support/~/.qwen/QWEN.md~/.qwen/settings.json~/.qwen/{commands,skills,agents}/ |
Trae (trae) | project | markdown | <project>/.trae/agents/<project>/.trae/rules/apothem-rules.md~/.config/apothem/{rules,templates}/~/.trae/skills/ |
Windsurf (windsurf) | project | markdown | <project>/.apothem/support/windsurf/hooks/<project>/.devin/agents/<project>/.devin/config.local.json<project>/.devin/rules/apothem-rules.md~/.agents/skills/~/.config/apothem/{rules,templates}/ |
Zed (zed) | project | markdown | <project>/.rules~/.agents/skills/~/.config/apothem/{rules,templates}/ |