Skip to content

Move OpenSpec to Agent Skills only (deprecate generated commands) #2022

Open

Description

@TabishB

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/
⚠️ Partial or unclear (5) 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 ⚠️ user only .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 ⚠️ user only .grok/skills
GSD No ✅ .agents/skills Only folder
Hermes Agent No ⚠️ trust or config .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 ⚠️ conflicting .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 ⚠️ maybe .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

  1. .agents/skills/ when the tool reads it at project level.
  2. .<tool>/skills/ when the tool only reads its own folder.
  3. 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:

  1. CoStrict: we write skills to .cospec/, which CoStrict never reads for skills. It reads .roo/skills and .agents/skills.
  2. Amazon Q Developer: .amazonq/skills loads nowhere. The product is being retired in favor of Kiro.
  3. 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:propose today. 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/skills and 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/skills in 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.
  • .agents is not formally standardized. agentskills.io defines the SKILL.md format 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

  1. clay-good commented on Oct 7, 2026

    @clay-good
    Collaborator

    Proposed build — Phase 1 is in review

    Scope is unchanged: this only affects generated command files. The openspec CLI stays, since skills still call it for status, validate and archive.

    Phase 1 PRs (merge in this order)

    # PR What it does
    1 #2087 update deletes only command files OpenSpec generated. Edits, and files it can't read, are kept and listed
    2 #2089 update prints a deprecation notice with the switch and keep-commands steps; docs say the same
    3 #2091 Amazon Q keeps its prompts under every delivery setting, since it loads no skills
    4 #2092 CoStrict skills install where CoStrict reads them; Hermes note made current. Closes this issue, so it merges last

    Nothing 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 main already has.

    Design principles

    1. openspec update is the migration. No script, no flag, no manual steps.
    2. Never delete a file we didn't write. Compare before unlinking; keep anything that differs and print its path.
    3. Reconstruct the generation inputs from disk. Command content depends on which workflows were installed, so compare against the set actually present.
    4. Write skills before touching commands. A run that dies halfway leaves working commands.
    5. Separate detection from writing. An adapter's getFilePath finds command files; formatFile writes them. Writing can go long before detection.
    6. Deprecate the default, not the feature. delivery: both keeps working until there's evidence nobody needs it.

    Phases

    Phase Release What changes
    1 Next minor The four PRs above
    2 Next major Default becomes delivery: skills; generated commands cleared; warning shown
    3 After an observation period Remove command writing and the delivery setting
    4 Later Remove the adapter shells

    What 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:

    • OpenCode needs no change. I said a skill becomes /name only with metadata: opencode/slash: "true". OpenCode's docs say so, but no code in the release or on main reads that key. In released v1.19.0, command/index.ts registers every skill as a slash command. The planned OpenCode PR was dropped.
    • Amazon Q needed real work. Its CLI reads .amazonq/prompts and 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:

    • Gemini CLI registers every skill as a slash command (SkillCommandLoader.ts, autoExecute: true), so no tool is left without a way to start a workflow.
    • CoStrict reads project skills from .agents, .claude and .roo, never .cospec. Its users relied on commands alone, so the flip would have broken them too.
    • Hermes v2026.6.5+ loads a trusted repo's .hermes/skills after hermes skills trust.

    Traps found and fixed along the way

    • Global delivery inference. On first run, OpenSpec saves a delivery inferred from the files on disk globally. An Amazon-Q-only project would have saved delivery: commands and 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.
    • Update loop, already on main. A tool sharing .agents with an owner tool, plus a customized legacy skill, re-synced on every update. 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

    • Migrated users have an explicit delivery: both they never chose. migrateIfNeeded writes the inferred value, so a flip that keeps explicit settings would skip most existing users. That needs deciding before the flip.
    • Edited command files are already overwritten by a plain update under both, 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.
    • Keep the adapters through Phase 3. Cleanup is gated on CommandAdapterRegistry.has(toolId) and finds files via adapter.getFilePath(). Delete an adapter and update silently stops finding that tool's leftovers.
    • Still to settle: what evidence moves us from Phase 2 to Phase 3.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions