mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-12 06:06:37 +03:00
Qoder ships an Agent Skills system at .qoder/skills/{name}/SKILL.md with
slash-command invocation, mapping cleanly onto the existing transformer
pipeline. Adds Qoder as a 13th first-class harness:
- PROVIDER_PLACEHOLDERS entry in scripts/lib/utils.js (model, config_file,
ask_instruction, command_prefix) mirroring the Pi/Rovo Dev shape.
- PROVIDERS entry in scripts/lib/transformers/providers.js with
configDir=.qoder and the OpenCode/Claude Code frontmatter field set
(user-invocable, argument-hint, license, compatibility, metadata,
allowed-tools), since Qoder docs explicitly support those.
- transformQoder named export in scripts/lib/transformers/index.js for
test-spy parity (kept per CLAUDE.md guidance, even though build.js uses
PROVIDERS directly).
- .qoder added to PROVIDER_DIRS in bin/commands/skills.mjs so the CLI
detects existing Qoder installs.
- HARNESSES.md updated: official docs row, frontmatter support column,
directory structure row, and "Last verified" date bumped.
- DEVELOP.md reference link added.
- .github/ISSUE_TEMPLATE/feature_request.md and PULL_REQUEST_TEMPLATE.md
extended with Qoder in the provider checklists.
- Built .qoder/skills/impeccable/ tree committed (per CLAUDE.md harness
output dirs are tracked so npx skills can read them at install time).
The dynamic providers.test.js loop picks up Qoder automatically; all
non-prefix Qoder cases pass. The pre-existing Windows-only prefix-test
flake affects every provider equally and is out of scope for this PR.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
89 lines
4.9 KiB
Markdown
89 lines
4.9 KiB
Markdown
# 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}}`.
|