# Harness Skills Capabilities Reference Source of truth for what each AI coding harness supports in terms of agent skills. Used to inform provider configs in `scripts/lib/transformers/providers.js`. Last verified: 2026-04-28 ## Official Documentation | Harness | Docs URL | |---------|----------| | Claude Code | https://code.claude.com/docs/en/skills | | Cursor | https://cursor.com/docs/context/skills | | Gemini CLI | https://geminicli.com/docs/cli/skills/ | | Codex CLI | https://developers.openai.com/codex/skills | | GitHub Copilot (Agents) | https://code.visualstudio.com/docs/copilot/customization/agent-skills | | Kiro | https://kiro.dev/docs/skills/ | | OpenCode | https://opencode.ai/docs/skills/ | | Pi | https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/skills.md | | Qoder | https://docs.qoder.com/extensions/skills | | Trae | TBD (no official skills docs found yet) | | Rovo Dev | https://support.atlassian.com/rovo/docs/extend-rovo-dev-cli-with-agent-skills | ## Spec Compliance All harnesses follow the [Agent Skills specification](https://agentskills.io/specification) to varying degrees. The spec defines these frontmatter fields: `name`, `description`, `license`, `compatibility`, `metadata`, `allowed-tools`. Provider-specific extensions beyond the spec: `user-invocable`, `argument-hint`, `disable-model-invocation`, `allowed-tools` (extended syntax), `model`, `effort`, `context`, `agent`, `hooks`, `subtask`, `mcp`. ## Frontmatter Support Fields marked with * are spec-standard. Others are provider extensions. | Field | Claude Code | Cursor | Gemini | Codex | Copilot | Kiro | OpenCode | Pi | Qoder | Rovo Dev | |-------|:-----------:|:------:|:------:|:-----:|:-------:|:----:|:--------:|:--:|:-----:|:--------:| | `name`* | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | `description`* | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | `license`* | Yes | Yes | Ignored | No | Yes | Yes | Yes | Yes | Yes | Yes | | `compatibility`* | Yes | Yes | Ignored | No | Yes | Yes | Yes | Yes | Yes | Yes | | `metadata`* | Yes | Yes | Ignored | No | Yes | Yes | Yes | Yes | Yes | Yes | | `allowed-tools`* | Yes | No | Ignored | No | No | No | Yes | Yes | Yes | Yes | | `user-invocable` | Yes | No | No | No | Yes | No | Yes | No | Yes | Yes | | `argument-hint` | Yes | No | No | No | Yes | No | Yes | No | Yes | Yes | | `disable-model-invocation` | Yes | Yes | No | No | Yes | No | Yes | Yes | TBD | TBD | | `model` | Yes | No | No | No | No | No | Yes | No | No | No | | `effort` | Yes | No | No | No | No | No | No | No | No | No | | `context` | Yes | No | No | No | No | No | No | No | No | No | | `agent` | Yes | No | No | No | No | No | Yes | No | No | No | | `hooks` | Yes | No | No | No | No | No | No | No | No | No | Notes: - Gemini CLI validates only `name` and `description`; other spec fields are parsed but ignored. - Codex CLI uses a separate `agents/openai.yaml` sidecar for extended metadata (icons, branding, MCP tools, invocation control). - Kiro recognizes `user-invocable` and `disable-model-invocation` per community reports but does not formally document them. - Unknown fields are silently ignored by all harnesses. ## Skill Directory Structure | Harness | Native directory | Also reads | |---------|-----------------|------------| | Claude Code | `.claude/skills/` | - | | Cursor | `.cursor/skills/` | `.agents/skills/`, `.claude/skills/` | | Gemini CLI | `.gemini/skills/` | `.agents/skills/` | | Codex CLI | `.agents/skills/` (primary) | - | | GitHub Copilot | `.github/skills/` | `.agents/skills/`, `.claude/skills/` | | Kiro | `.kiro/skills/` | - | | OpenCode | `.opencode/skills/` | `.agents/skills/`, `.claude/skills/` | | Pi | `.pi/skills/` | `.agents/skills/` | | Qoder | `.qoder/skills/` | `~/.qoder/skills/` (user-level) | | Trae China | `.trae-cn/skills/` | TBD | | Trae International | `.trae/skills/` | TBD | | Rovo Dev | `.rovodev/skills/` | `~/.rovodev/skills/` (user-level) | All harnesses support the `{skill-name}/SKILL.md` directory structure with optional `reference/`, `scripts/`, and `assets/` subdirectories. ## Placeholder / Variable Substitution Claude Code supports runtime variable substitution directly in SKILL.md bodies: `$ARGUMENTS`, `$0`-`$N`, `${CLAUDE_SKILL_DIR}`, `${CLAUDE_SESSION_ID}`. No other harness supports substitution in skills. Some harnesses have separate "custom commands" systems (distinct from skills) with their own substitution: | Harness | Command system | Substitution syntax | |---------|---------------|-------------------| | Gemini CLI | `.gemini/commands/` (TOML) | `{{args}}`, `!{shell}`, `@{file}` | | Codex CLI | `.codex/prompts/` | `$ARGNAME` | | OpenCode | `.opencode/commands/` | `$ARGUMENTS`, `$1`-`$N`, `` !`shell` `` | Our build system handles cross-provider placeholders at compile time via `replacePlaceholders()` for `{{model}}`, `{{config_file}}`, `{{ask_instruction}}`, and `{{available_commands}}`.