CLI

Supported harnesses

HarnessTap registers 33 agent harnesses today. Each harness declares which resource types it can scan, compose in layers, and materialize on disk, plus...

HarnessTap registers 33 agent harnesses today. Each harness declares which resource types it can scan, compose in layers, and materialize on disk, plus default project and global paths. The registry in src/platforms/registry.ts is the source of truth; ht harness list prints the same set at runtime.

For portability caveats (hooks with ${*_PLUGIN_ROOT}, OpenCode server plugins, instruction-only skill emission, and mirror warnings), see Portability limits.

Resource types

HarnessTap separates context-side resources (what the model sees) from environment-side resources (how it runs).

Context-side material resources

These are the atomic resources you scan, curate, attach to layers, and re-emit during layer apply:

TypeDescription
instructionsAlways-on context files (AGENTS.md, CLAUDE.md, .windsurfrules, .github/copilot-instructions.md, …)
skillsSKILL.md trees under harness-native skill directories
rulesPath-scoped or always-on rules (.cursor/rules/*.mdc, .claude/rules/, .kiro/steering/, …)
mcpMCP server definitions from harness MCP config files
permissionsAllow/deny patterns (Claude Code and Codex settings)
hooksHook event definitions from settings or hooks.json
agentsAgent manifest files under harness agents/ directories
commandsStatic command definitions (markdown, TOML, or manifest pointers)

Layer composition adds two attachment kinds on top of material resources:

AttachmentRole
plugin_pinLazy link to a host marketplace or local plugin (plugin_pin:name@marketplace); materializes after resource sync or layer apply --sync-plugins
layerNested layer reference expanded depth-first at apply time

Environment resources

Environments carry how values that override matching layer resources during apply (home → layer default → deck active):

TypeDescription
env_varPlain environment variable key/value pairs
model_configDefault model and provider selection
permissionPermission allow/deny overrides
secret_refIndirection to secrets (keychain, env, file) — never embedded in exports

Only harnesses whose registry entry includes env_vars, model_config, and/or permissions and whose native serializer implements those surfaces receive environment values on disk. Today that means Claude Code and Codex for the full environment trio.

All harnesses whose serializer emits MCP config still receive MCP ${VAR} substitution from the environment cascade at apply time (tokens in MCP env / args). OAuth sessions managed by the host IDE are outside this path — see Environments — MCP authentication limitations.

HarnessMCP scan/emitFull env emissionMCP ${VAR} substitution
claude-codeYes (.mcp.json)YesYes
codexYes (config.toml)YesYes
cursorYes (.cursor/mcp.json)NoYes
copilot-cli, github-copilotYesNoYes
opencode, goose, genericYesNoYes

Plugin manifest layouts

scan and plugin-source import recognize these on-disk plugin trees (in addition to per-harness project files):

Manifest pathHarness familyImported as
.claude-plugin/plugin.jsonClaude Codeclaude-plugin
.claude-plugin/marketplace.jsonClaude Code (marketplace root)marketplace
.cursor-plugin/plugin.jsonCursorcursor-plugin
.cursor-plugin/marketplace.jsonCursor (marketplace root)marketplace
.codex-plugin/plugin.jsonCodexcodex-plugin
.github/plugin/plugin.jsonGitHub Copilot / Copilot CLIcopilot-plugin
plugin.json / .goose-plugin/plugin.json / .plugin/plugin.jsonGoose (Open Plugins)goose-plugin

Scanning a repo with both harness files and a plugin manifest merges both sources automatically. See Portability limits — dual-mode scan.

Plugin install and sync providers

During layer apply, HarnessTap can install and sync plugins from host install trees for:

HarnessProviderTypical install location
claude-codeClaude Code marketplace / claude plugin~/.claude/plugins/
cursorCursor plugin cache (git-backed marketplaces)~/.cursor/plugins/
goosegoose plugin install (git-backed Open Plugins)~/.agents/plugins/

Other harnesses still benefit from plugin-source scan and resource sync when you point at an install tree or plugin repo, but do not have an automated install provider yet.

Claude layer pins and marketplace metadata (layer showclaude block) apply only when materializing to claude-code.

Serializers

TierHarnessesNotes
Nativeclaude-code, codex, cursor, goose, opencode, github-copilot, copilot-cli, gemini-cliDedicated scan/serialize logic
GenericAll other registered harnessesPath-driven serializer driven by registry projectPaths / globalPaths

Filter native harnesses at the CLI:

ht harness list --supported
ht harness list --format json

Skill emission modes

Most harnesses emit skills to native skill directories. These harnesses declare skillEmission: instruction-only — skills merge into instructions or rules instead of a separate skill tree:

HarnessEmission target
github-copilot.github/copilot-instructions.md
gemini-cliInstruction/rules paths per Gemini serializer
windsurf.windsurf/rules/{name}.md
cline.clinerules/{name}.md (or merged rules file)
kiro.kiro/steering/{name}.md

Cursor additionally honors project cursor_skill_mode (agent-requested, always-on, agents-skills). Inspect with ht harness project status --project . --format json.

Agent / subagent bridging

Harnesses with a delegated subagent model normalize into a shared canonical shape (description, instruction body, model, reasoning_effort, sandbox/readonly flags) via src/services/agent-bridge.ts:

HarnessNative formatApply notes
codex.codex/agents/*.tomldeveloper_instructions, model_reasoning_effort, sandbox_mode
claude-code.claude/agents/*.md + YAMLRichest metadata; extra Claude-only keys preserved in metadata.extra
cursor.cursor/agents/*.md + YAMLreadonly / is_background; sandbox_mode: read-only maps to readonly: true
opencode, github-copilot, copilot-cli*/agents/*.mdMarkdown with optional frontmatter
generic harnesses with agents: paths*.mdSame as OpenCode/Copilot emission

Plugin import scans agents/*.md and agents/*.toml (Codex packs). Cross-harness layer apply re-emits valid native files per target harness.

Harness reference

Legend for the Resources column: instr instructions · skill skills · rule rules · mcp MCP · perm permissions · hook hooks · agent agents · cmd commands · env env vars · model model config.

IDNameSerializerResourcesSkill emissionPlugin install
claude-codeClaude CodeNativeinstr, skill, rule, mcp, perm, hook, agent, cmd, env, modelNative skillsYes
codexCodexNativeinstr, skill, rule, mcp, perm, hook, agent, env, modelNative skills
cursorCursorNativeinstr, skill, rule, mcp, hook, agentNative skillsYes
opencodeOpenCodeNativeinstr, skill, mcp, agent, cmdNative skills
github-copilotGitHub CopilotNativeinstr, skill, mcp, agentInstruction-only
copilot-cliCopilot CLINativeinstr, skill, mcp, agentNative skills
gemini-cliGemini CLINativeinstr, skill, cmdInstruction-only
windsurfWindsurfGenericinstr, skill, rule, mcpInstruction-only
clineClineGenericinstr, skill, rule, mcpInstruction-only
rooRoo CodeGenericinstr, skill, rule, mcpNative skills
continueContinueGenericinstr, skill, mcpNative skills
gooseGooseNativeinstr, skill, mcp, hook, cmdNative skillsYes
traeTraeGenericinstr, skill, rule, mcpNative skills
openhandsOpenHandsGenericinstr, skill, mcpNative skills
kiroKiroGenericinstr, skill, ruleInstruction-only
warpWarpGenericinstr, skillNative skills
piPiGenericinstr, skillNative skills
ampAmpGenericinstr, skillNative skills
kiloKilo CodeGenericinstr, skillNative skills
augmentAugmentGenericinstr, skillNative skills
firebenderFirebenderGenericinstr, skillNative skills
junieJunieGenericinstr, skillNative skills
zencoderZencoderGenericinstr, skillNative skills
deepagentsDeep AgentsGenericinstr, skillNative skills
qwen-codeQwen CodeGenericinstr, skillNative skills
crushCrushGenericinstr, skillNative skills
droidDroidGenericinstr, skillNative skills
codebuddyCodeBuddyGenericinstr, skillNative skills
muxMuxGenericinstr, skillNative skills
kodeKodeGenericinstr, skillNative skills
command-codeCommand CodeGenericinstr, skillNative skills
cortexCortex CodeGenericinstr, skillNative skills
neovateNeovateGenericinstr, skillNative skills

On-disk paths (selected harnesses)

These are the primary project paths HarnessTap scans and writes. Global paths follow the same keys under each harness home directory (see ht harness list --format json).

HarnessInstructionsSkillsRulesMCPAgentsCommandsSettings
claude-codeCLAUDE.md.claude/skills/.claude/rules/.mcp.json.claude/agents/.claude/commands/.claude/settings.json
codexAGENTS.md.agents/skills/.codex/config.toml.codex/agents/.codex/config.toml
cursorAGENTS.md (+ legacy .cursorrules).agents/skills/.cursor/rules/.cursor/mcp.json.cursor/agents/
opencodeAGENTS.md.opencode/skills/opencode.json.opencode/agents/.opencode/commands/
github-copilot.github/copilot-instructions.md.agents/skills/(global ~/.copilot/mcp-config.json).github/agents/
copilot-cliAGENTS.md.agents/skills/.copilot/mcp-config.json.github/agents/
gemini-cliAGENTS.md.agents/skills/commands/gemini-extension.json
windsurf.windsurfrules.agents/skills/.windsurf/rules/(global MCP config)
rooAGENTS.md.roo/skills/.roomodes.roo/mcp.json
gooseAGENTS.md, .goosehints.agents/skills/ (+ .goose/skills/).config/goose/config.yaml (project), ~/.config/goose/config.yaml (global)recipes/*.yaml~/.config/goose/config.yaml

Generic harnesses in the skills-only tier use harness-specific skill roots such as .kilocode/skills/, .crush/skills/, or .factory/skills/ with AGENTS.md instructions — see the registry for the full list.

Goose context engineering

HarnessTap maps Goose context engineering surfaces as follows:

Goose featureHarnessTap support
goosehints (.goosehints, nested, global ~/.config/goose/.goosehints)Scanned and emitted as instruction resources
Agent skills (.agents/skills/, legacy .goose/skills/)Native skill resources
Open Plugins (plugin.json, .goose-plugin/, .agents/plugins/)Plugin-source import + goose plugin install sync
Hooks (plugin hooks/hooks.json)hook resources; layer apply emits .agents/plugins/harnesstap-layer/
MCP extensions (config.yaml extensions:)mcp_server resources via native serializer
Recipes (recipes/*.yaml)command resources
Subagents, plan mode, prompt templates, MOIM, memory extensionRuntime-only — not layer resources (see portability limits)
ht harness list                          # all registered harnesses
ht harness list --supported              # native serializers only
ht harness status                        # global main + alias selection
ht harness project status --project .    # per-project harness prefs + cursor_skill_mode
ht scan . --dry-run              # detect harnesses and resources in a repo
ht environment list                      # named environments (env vars, models, permissions)

See also