Repository navigation
Move OpenSpec to Agent Skills only (deprecate generated commands) #2022
Description
Summary
OpenSpec installs its workflows into each AI tool twice. It writes a skill and a tool-specific command file. We want to install skills only, using the Agent Skills standard (SKILL.md folders). The shared .agents/skills/ folder comes first wherever a tool reads it.
We audited all 49 tools OpenSpec supports. 48 of 49 already load Agent Skills. The only exception is Amazon Q Developer, which AWS is retiring.
This issue proposes a direction, not a fix. It lays out the audit, a phased plan, and what we still need to find out before we commit.
Why
- One format instead of 35. Today we keep 34 command adapters, each with its own file layout and syntax (Markdown, TOML, prefixed names). Every new tool means another adapter. Skills are one format that works everywhere.
- The ecosystem has moved. Skills used to be a Claude-only feature. Now nearly every coding agent supports them, and most read a shared
.agents/skills/folder. - Fewer files in user repos. A project set up for several tools gets one shared skills folder instead of a commands folder per tool.
- Adding a tool gets cheap. A tool that reads
.agents/skills/needs no tool-specific code at all. The Universal target already proves this.
Where we are today
| Count | |
|---|---|
| Tools OpenSpec supports | 49 (plus the Universal .agents target) |
| Tools that get command files today | 34 |
| Tools that are already skills-only | 15 |
Default install (delivery) |
both: skills and commands |
Tools OpenSpec already points at .agents/skills |
5 (Amp, Antigravity, Codex, GSD, Zed) |
Users can already choose skills only (delivery: skills), so the building blocks exist. This proposal makes skills only the default, and later the only option.
Audit: Agent Skills support per tool
Checked against official docs, changelogs and source code on 2026-10-01.
| Group | Tools | Install target |
|---|---|---|
✅ Reads project .agents/skills/ (30) |
Amp, Antigravity, Auggie, Code Studio, Codex, Command Code, CoStrict, Crush, Cursor, DeepSeek Harness, Devin Desktop, Factory Droid, Gemini CLI, GitHub Copilot, GSD, Junie, Kilo Code, Kimi Code, MiniMax Code, Mistral Vibe, Oh My Pi, OpenCode, Pi, Qwen Code, Rovo Dev CLI, SourceCraft, Warp, Zed Agent, ZCode, Zoo Code | .agents/skills/ |
ForgeCode, Grok Build (both read only the user ~/.agents/skills), Hermes Agent (needs trust or config), Lingma (changelog and docs disagree), Veai (reads other tools' folders, .agents not named) |
Own folder for now | |
| 📁 Skills in own folder only (13) | AtomCode, Claude Code, Cline, CodeArts, CodeBuddy, Continue, EasyCode, GigaCode, IBM Bob, iFlow, Kiro, Qoder, Trae | .<tool>/skills/ |
| ❌ No skills support (1) | Amazon Q Developer | None (Kiro replaces it) |
Full table (49 tools)
| Tool | Gets commands today | Reads .agents/skills |
Native skills folder | Notes |
|---|---|---|---|---|
| Amazon Q Developer | Yes | ❌ No skills | none | IDE plugin reads rules only. End of support 2027-04-30, replaced by Kiro |
| Amp | No | ✅ | .agents/skills |
|
| Antigravity | Yes | ✅ project only | .agents/skills |
Legacy .agent/skills still works |
| AtomCode | Yes | 📁 | .atomcode/skills |
|
| Auggie | Yes | ✅ | .augment/skills |
.agents has the lowest precedence |
| IBM Bob | Yes | 📁 | .bob/skills |
|
| Claude Code | Yes | 📁 | .claude/skills |
Request to read .agents closed as not planned |
| Cline | Yes | 📁 | .cline/skills |
Open bug: .agents/skills not loaded |
| Command Code | Yes | ✅ | .commandcode/skills |
Compatibility path |
| CodeArts | No | 📁 | .codeartsdoer/skills |
|
| Codex | No | ✅ | .agents/skills |
Native folder |
| DeepSeek Harness | No | ✅ | .dsh/skills |
|
| Devin Desktop | Yes | ✅ | .devin/skills |
|
| ForgeCode | No | .forge/skills |
||
| CodeBuddy Code | Yes | 📁 | .codebuddy/skills |
|
| Code Studio | Yes | ✅ | .codestudio/skills |
Rebrand to BoldCreate (.boldcreate) in progress |
| Continue | Yes | 📁 | .continue/skills |
Also reads .claude/skills |
| CoStrict | Yes | ✅ | .roo/skills |
We write .cospec, which it never reads for skills |
| Crush | Yes | ✅ | .crush/skills |
|
| Cursor | Yes | ✅ | .cursor/skills |
|
| EasyCode | Yes | 📁 | .easycode/skills |
User folder is ~/.easycode-user/skills |
| Factory Droid | Yes | ✅ | .factory/skills |
Docs label .agents as "legacy" |
| Gemini CLI | Yes | ✅ | .gemini/skills |
|
| GitHub Copilot | Yes | ✅ | .github/skills |
|
| GigaCode | Yes | 📁 | .gigacode/skills |
|
| Grok Build | No | .grok/skills |
||
| GSD | No | ✅ | .agents/skills |
Only folder |
| Hermes Agent | No | .hermes/skills |
||
| iFlow | Yes | 📁 | .iflow/skills |
|
| Junie | Yes | ✅ | .junie/skills |
|
| Kilo Code | Yes | ✅ | .kilo/skills |
Legacy .kilocode/skills still loads |
| Kimi Code | No | ✅ | .kimi-code/skills |
|
| Kiro | Yes | 📁 | .kiro/skills |
|
| Lingma | Yes | .lingma/skills |
||
| MiniMax Code | No | ✅ | .minimax/skills |
OpenSpec installs globally today |
| Mistral Vibe | No | ✅ trusted folders | .vibe/skills |
|
| Oh My Pi | Yes | ✅ | .omp/skills |
|
| OpenCode | Yes | ✅ | .opencode/skills |
|
| Pi | Yes | ✅ trust prompt | .pi/skills |
|
| SourceCraft | Yes | ✅ | .codeassistant/skills |
|
| Qoder | Yes | 📁 | .qoder/skills |
|
| Qwen Code | Yes | ✅ source only | .qwen/skills |
Docs out of date |
| Rovo Dev CLI | No | ✅ | .rovodev/skills |
|
| Zoo Code | Yes | ✅ source only | .roo/skills |
Upstream Roo Code never added it |
| Trae | Yes | 📁 | .trae/skills |
|
| Veai | No | .veai/skills |
||
| Warp | No | ✅ recommended | .agents/skills |
|
| Zed Agent | No | ✅ | .agents/skills |
Only folder |
| ZCode | Yes | ✅ source only | .zcode/skills |
Docs out of date |
Proposed direction
Where skills get installed
.agents/skills/when the tool reads it at project level..<tool>/skills/when the tool only reads its own folder.- The user-level folder only when a tool has no project folder.
When a user picks several tools that all read .agents/skills/, OpenSpec writes one copy.
Phased rollout
| Phase | What changes | What users see |
|---|---|---|
| Now (minor) | Fix the bugs below. Test unclear tools by hand. | Nothing changes |
| Next major | Default becomes skills only. Commands still work as an opt-in and show a deprecation notice. | New installs get skills. Existing users get a notice and a migration path |
| Later (timing TBD) | Decide whether to remove command generation, based on feedback and usage | To be decided |
We are not proposing to remove commands in the next major. We deprecate them there and keep them working until we have a removal plan we're confident in.
Problems the audit found today
These are bugs whatever we decide here:
- CoStrict: we write skills to
.cospec/, which CoStrict never reads for skills. It reads.roo/skillsand.agents/skills. - Amazon Q Developer:
.amazonq/skillsloads nowhere. The product is being retired in favor of Kiro. - Hermes: our setup note says Hermes only loads
~/.hermes/skills, but its docs now say it scans project folders too.
Open questions and unknowns
User experience
- How do users trigger a workflow? Users run commands like
/opsx:proposetoday. Each tool triggers skills differently: some by slash name, some by$name, some only automatically. We need a per-tool answer before dropping commands. - The names change. Skill names (
openspec-propose) differ from command names (opsx:propose). Docs, tutorials and muscle memory all use the command spelling. - Do commands do anything skills can't? For example, argument passing or tool-specific front matter. We should list any gaps.
Install behavior
- Duplicates. Many tools read both
.agents/skillsand their own folder. Upgraded projects could load the same skill twice, with tool-specific precedence deciding which copy wins. - Trust gates. Pi, Mistral Vibe and Hermes only read
.agents/skillsin trusted folders. Will first-run users think the install failed? - Cleanup on upgrade. How do we remove old command files safely without touching files the user edited?
Evidence gaps
- Support found only in source, not docs: Qwen Code, Zoo Code and ZCode. Lingma's docs contradict each other. Veai and Trae are unclear. We should test these by hand.
.agentsis not formally standardized. agentskills.io defines theSKILL.mdformat but no canonical folder. Factory already calls.agents"legacy" and Claude Code declined it. What happens if a tool drops it?- Tool churn. Code Studio is mid-rebrand and Amazon Q is being retired. How do we keep this audit current?
Release
- Removal criteria. What tells us it's safe to remove commands entirely? Usage data, open issues, a fixed number of releases?
- Amazon Q users. Do we drop the target, point those users to Kiro, or keep commands for it only?
Out of scope
- Changing the content of OpenSpec's workflows.
- Changing how tools are detected during
openspec init. - Implementation details. Those come in a change proposal once the open questions are answered.
Activity
clay-good commentedon Oct 7, 2026
Proposed build — Phase 1 is in review
Scope is unchanged: this only affects generated command files. The
openspecCLI stays, since skills still call it for status, validate and archive.Phase 1 PRs (merge in this order)
updatedeletes only command files OpenSpec generated. Edits, and files it can't read, are kept and listedupdateprints a deprecation notice with the switch and keep-commands steps; docs say the sameClosesthis issue, so it merges lastNothing changes on the default delivery in Phase 1. Merged together locally, the four pass the full suite: 6,440 tests, plus the same 10 failures
mainalready has.Design principles
openspec updateis the migration. No script, no flag, no manual steps.getFilePathfinds command files;formatFilewrites them. Writing can go long before detection.delivery: bothkeeps working until there's evidence nobody needs it.Phases
delivery: skills; generated commands cleared; warning showndeliverysettingWhat the audit got wrong, and what changed
Every per-tool claim was rechecked against upstream source, not docs. Two of my earlier statements were wrong:
/nameonly withmetadata: opencode/slash: "true". OpenCode's docs say so, but no code in the release or onmainreads that key. In released v1.19.0,command/index.tsregisters every skill as a slash command. The planned OpenCode PR was dropped..amazonq/promptsand has no skill support. Under skills-only delivery it would have had no working workflow at all, so the default flip would have broken every Amazon Q user. That's fix(amazon-q): keep Amazon Q's prompts under every delivery setting #2091, which takes the least disruptive answer to the open Amazon Q question: keep its commands. AWS ends support for the IDE plugins on April 30, 2027 and points users to Kiro, which OpenSpec supports.Also confirmed in source:
SkillCommandLoader.ts,autoExecute: true), so no tool is left without a way to start a workflow..agents,.claudeand.roo, never.cospec. Its users relied on commands alone, so the flip would have broken them too..hermes/skillsafterhermes skills trust.Traps found and fixed along the way
delivery: commandsand stripped skills from every other project on the machine. Fixed in fix(amazon-q): keep Amazon Q's prompts under every delivery setting #2091; shown before and after on the real CLI.main. A tool sharing.agentswith an owner tool, plus a customized legacy skill, re-synced on everyupdate. Reproduced with Antigravity and Codex. The CoStrict move would have spread it to every CoStrict user sharing.agents. Fixed in fix(costrict): install skills where CoStrict reads them #2092.For Phase 2, not Phase 1
delivery: boththey never chose.migrateIfNeededwrites the inferred value, so a flip that keeps explicit settings would skip most existing users. That needs deciding before the flip.updateunderboth, by design ("generated files are OpenSpec's to own"). fix(update): keep command files the user edited when moving to skills #2087 guarantees the switch never deletes an edit still on disk. The notice's own advice,openspec config set delivery skills && openspec update, switches before any regeneration.CommandAdapterRegistry.has(toolId)and finds files viaadapter.getFilePath(). Delete an adapter andupdatesilently stops finding that tool's leftovers.fix(update): report unreadable command files apart from edits
docs(update): describe when the deprecation notice shows accurately
fix(update): only advise switching where it changes something
docs(amazon-q): say when leftover skill folders are removed
test: give the deprecation notice tests their own anchor in update.te…
test: give the Amazon Q tests their own anchor in update.test.ts
fix(costrict): install skills where CoStrict reads them
fix(costrict): install skills where CoStrict reads them
test: read the supported-tools page with normalized line endings