mirror of
https://github.com/Fission-AI/OpenSpec.git
synced 2026-11-12 10:23:48 +08:00
* feat: add AtomCode command adapter support Add AtomCode as a supported tool with its own command adapter. AtomCode is an open-source terminal AI coding assistant that uses the same Agent Skills spec as Claude Code. Changes: - New adapter: src/core/command-generation/adapters/atomcode.ts - File path: .atomcode/commands/opsx-<id>.md - Frontmatter: description only - Command references transformed from colon to hyphen format - Register adapter in index.ts, registry.ts, and config.ts - Update docs (supported-tools.md, cli.md) with AtomCode entry - Add 6 test cases for atomcodeAdapter - Add changeset for version tracking Closes #1210 Co-Authored-By: hu-qi, AtomCode (GLM-5.1) <huqi1024@gmail.com> * docs(atomcode): correct parser compatibility comments * test(atomcode): cover detection and registry registration The adapter shipped without the two per-tool checks its siblings carry: a detection test asserting `.atomcode` surfaces the tool from getAvailableTools, and registry assertions that the adapter is reachable by id. Also adds the missing AtomCode row to the docs-lab support matrix. Verified non-vacuous: removing the registry registration and the AI_TOOLS entry fails all four new assertions. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * test(atomcode): lock the literal name/args invariant AtomCode's custom-command loader scans for `key:` and takes the rest of the line verbatim, with no YAML unquoting, then matches `args` against the exact strings "required"/"optional". A quoted `args: "optional"` falls through to ArgsRequirement::None and silently drops every argument, so this adapter cannot use the shared escapeYamlValue helper the way its siblings do. That made the deviation look like an oversight inviting a "consistency" refactor. Document why it exists and add a case proving a description that needs quoting does not drag name/args into quotes. Also drops the literal `description:` assertion. It passed only because no current description needs quoting; the first one containing ": " would have failed it, looking like an adapter bug rather than a description edit. The parsed-frontmatter toEqual already covers it. Verified non-vacuous: routing all three fields through a quoting helper fails 13 tests, including the new one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(atomcode): declare args: none for workflows that take no input Every generated command shipped `args: optional`, including `onboard`, which reads no invocation input. AtomCode treats the two differently at the slash menu: `none` executes the command immediately, while `optional` completes to `/name ` and waits for a second Enter. Onboard therefore cost every AtomCode user an extra keystroke to start, and its body carried a `**Provided arguments**:` line that was always empty. Gate both on the `**Input**:` contract the workflow bodies already declare, matching how the Command Code adapter decides the same thing. Output for the other 11 workflows is byte-identical; only `onboard` changes. Adds the same tripwire assertion Command Code carries, so a future workflow cannot silently lose its arguments. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(atomcode): describe the args contract in the changeset Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(atomcode): keep updates in docs-lab --------- Co-authored-by: Clay Good <hi@claygood.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>