Skip to content

Targets matrix

The canonical reference for what APM deploys, where, for every supported harness. Use this page to choose a target, debug an unexpected deploy location, or confirm whether a primitive is supported on a given tool.

For background on the target model, see Primitives and targets. For the runtime CLI surface, see apm targets and apm compile. For the primitive types themselves, see Primitive types.

TargetDeploy rootinstructionspromptsagentsskillscommandshooksmcp
copilot.github/[x][x][x][x][ ][x][x]
claude.claude/[x][ ][x][x][x][x][x]
cursor.cursor/[x][ ][x][x][x][x][x]
codex.codex/ + .agents/[ ][ ][x][x][ ][x][x]
gemini.gemini/[ ][ ][ ][x][x][x][x]
opencode.opencode/[ ][ ][x][x][x][ ][x]
windsurf.windsurf/[x][ ][ ][x][x][x][x]
agent-skills.agents/[ ][ ][ ][x][ ][ ][ ]

Skills deploy to .agents/skills/ for Copilot, Cursor, OpenCode, Gemini, and Codex by default (see Skills convergence below). Claude and Windsurf keep target-native skill directories.

copilot-cowork (Microsoft 365 Copilot) and copilot-app (GitHub Copilot desktop App) are gated behind experimental flags and not listed above. See Experimental.

apm install and apm compile resolve the active target list with this priority:

  1. --target / --all on the command line.
  2. targets: in apm.yml.
  3. Auto-detection from filesystem signals (table below).

If none of the above produce a target, the command falls back to copilot. Use apm targets to preview the resolved list before compile or install.

TargetSignals (any one activates the target)
claude.claude/ directory, or CLAUDE.md file
copilot.github/copilot-instructions.md file
cursor.cursor/ directory, or .cursorrules file
codex.codex/ directory
gemini.gemini/ directory, or GEMINI.md file
opencode.opencode/ directory
windsurf.windsurf/ directory

agent-skills, copilot-cowork, and copilot-app are never auto-detected. Select them explicitly with --target, or list them in a project’s apm.yml targets: field so contributors running plain apm install pick them up automatically.

GitHub Copilot (CLI and IDE).

  • Detection. .github/copilot-instructions.md.
  • Deploy directory. .github/ at project scope; ~/.copilot/ at user scope.
  • Supported primitives. instructions, prompts, agents, skills, hooks, mcp.
  • File conventions.
    • instructions: .github/instructions/<name>.instructions.md
    • prompts: .github/prompts/<name>.prompt.md
    • agents: .github/agents/<name>.agent.md
    • skills: .agents/skills/<name>/SKILL.md
    • hooks: .github/hooks/<name>.json
    • generated: .github/copilot-instructions.md (compile output)
  • User scope. Partial. prompts and instructions are not supported at user scope; user-scope deploys land under ~/.copilot/, not ~/.github/.

Claude Code.

  • Detection. .claude/ directory, or CLAUDE.md.
  • Deploy directory. .claude/ (project and user scope; user scope honors CLAUDE_CONFIG_DIR if set).
  • Supported primitives. instructions, agents, skills, commands, hooks, mcp. (No prompts.)
  • File conventions.
    • instructions: .claude/rules/<name>.md
    • agents: .claude/agents/<name>.md
    • commands: .claude/commands/<name>.md
    • skills: .agents/skills/<name>/SKILL.md
    • hooks: merged into .claude/settings.json
  • Compile output. CLAUDE.md and per-rule files under .claude/rules/.

Cursor.

  • Detection. .cursor/ directory, or legacy .cursorrules file.
  • Deploy directory. .cursor/.
  • Supported primitives. instructions, agents, skills, commands, hooks, mcp. (No prompts.)
  • File conventions.
    • instructions: .cursor/rules/<name>.mdc
    • agents: .cursor/agents/<name>.md
    • commands: .cursor/commands/<name>.md
    • skills: .agents/skills/<name>/SKILL.md
    • hooks: .cursor/hooks.json
  • User scope. Partial. instructions is excluded at user scope; Cursor reads global rules from its Settings UI rather than from disk.
  • Caveat. Command files use the shared claude_command transformer today; Cursor-specific frontmatter keys (author, mcp, parameters, …) are dropped at install time and surfaced via diagnostics.

OpenAI Codex CLI.

  • Detection. .codex/ directory.
  • Deploy directory. .codex/ plus .agents/ for skills.
  • Supported primitives. agents, skills, hooks, mcp. (No instructions, prompts, or commands.)
  • File conventions.
    • agents: .codex/agents/<name>.toml
    • skills: .agents/skills/<name>/SKILL.md
    • hooks: .codex/hooks.json
  • Compile output. AGENTS.md only. Per-file instructions are not installed for Codex.

Gemini CLI.

  • Detection. .gemini/ directory, or GEMINI.md.
  • Deploy directory. .gemini/ (project and user scope).
  • Supported primitives. commands, skills, hooks, mcp.
  • File conventions.
    • commands: .gemini/commands/<name>.toml
    • skills: .agents/skills/<name>/SKILL.md
    • hooks: merged into .gemini/settings.json
  • Compile output. GEMINI.md. Gemini CLI does not read per-file rules from .gemini/rules/, so instructions is compile-only.

OpenCode.

  • Detection. .opencode/ directory.
  • Deploy directory. .opencode/ at project scope; ~/.config/opencode/ at user scope.
  • Supported primitives. agents, commands, skills, mcp.
  • File conventions.
    • agents: .opencode/agents/<name>.md
    • commands: .opencode/commands/<name>.md
    • skills: .agents/skills/<name>/SKILL.md
  • Caveat. OpenCode has no hooks concept; the hooks primitive is silently skipped for this target.

Windsurf / Cascade.

  • Detection. .windsurf/ directory.
  • Deploy directory. .windsurf/ at project scope; ~/.codeium/windsurf/ at user scope.
  • Supported primitives. instructions, skills, commands, hooks, mcp.
  • File conventions.
    • instructions: .windsurf/rules/<name>.md
    • skills: .windsurf/skills/<name>/SKILL.md
    • commands: .windsurf/workflows/<name>.md
    • hooks: .windsurf/hooks.json
  • Agents. Not deployed. Cascade auto-invokes any SKILL.md by its description: frontmatter, so a separate agents primitive would collide with skills on the same path. Ship personas as skills under .apm/skills/<name>/SKILL.md instead.
  • User scope. Partial. instructions is excluded at user scope; Windsurf stores global memory in a single ~/.codeium/windsurf/memories/global_rules.md file with a different format.

Cross-client shared skills directory.

  • Detection. Never auto-detected. Select with --target agent-skills.
  • Deploy directory. .agents/.
  • Supported primitives. skills only.
  • File conventions. .agents/skills/<name>/SKILL.md.
  • Use case. Author-time target for shipping a SKILL bundle that any Skills-aware client (Codex, Copilot CLI, Claude Code, etc.) can read without per-tool deployment.

By default, every target with a skills primitive deploys to .agents/skills/<name>/SKILL.md rather than under the target root. This matches the cross-tool agent skills convention so a single skill bundle serves every harness.

To restore the pre-convergence per-target layout (skills land under each target’s own root), use the --legacy-skill-paths flag on apm install or set APM_LEGACY_SKILL_PATHS=1.

MCP is not a TargetProfile primitive; it is wired by a separate integrator that writes per-client config files (e.g. .vscode/mcp.json, .cursor/mcp.json, .claude.json) for every target in the active set that has an MCP client adapter. Active set follows the same --target > targets: > auto-detect chain as apm install: a runtime with an adapter but outside the active set is skipped and APM emits an [i] Skipped MCP config for X (active targets: Y) line so the gate decision is observable. The matrix above marks mcp supported when an adapter exists; whether the config gets written on a given install is a function of the active target set, not just adapter availability. See Install MCP servers for the gate behavior and apm mcp for the runtime surface.