mirror of
https://github.com/Fission-AI/OpenSpec.git
synced 2026-11-07 09:14:38 +08:00
* feat(zcode): add ZCode as supported tool Register ZCode in the AI tools registry and provide a command adapter so `openspec init --tools zcode` generates per-project artifacts under a single .zcode/ root (no split across .agents + .zcode): - Skills: .zcode/skills/openspec-*/SKILL.md (ZCode-native discovery path, highest priority among project-level skill roots) - Commands: .zcode/commands/opsx/<id>.md (Claude-compatible frontmatter) Both .zcode/skills and .agents/skills are valid ZCode discovery roots (verified from ZCode source: skillRootsForBase registers them in pairs); we use .zcode to keep all artifacts under one directory. ZCode auto-detection triggers on .zcode or .agents at the project root. Verification: - pnpm build passes (TypeScript compiles clean) - pnpm lint passes (no new warnings) - pnpm test: 1661 tests pass (no regressions) - E2E: `openspec init --tools zcode --profile core` produces 5 skills + 5 commands, all under .zcode/ (no .agents created) * fix(zcode): scope auto-detection to .zcode only ZCode's detectionPaths included '.agents', a generic directory used by many agent frameworks. A bare '.agents' at the project root caused false-positive ZCode detection (mirroring the Copilot bare-.github problem the codebase already guards against). Drop the detectionPaths override so ZCode is detected solely via its strongly-identifying skillsDir '.zcode'. Add tests locking the new contract: a bare '.agents' must not trigger detection, and '.agents' co-located with '.zcode' must not suppress real detection. * test(zcode): lock adapter path and frontmatter escaping contract Add focused coverage for the ZCode command adapter that the existing broad tests did not protect: - getFilePath lands under .zcode/commands/opsx/<id>.md and never references .agents - formatFile emits name/description/category/tags frontmatter - YAML escaping across all branches: colons/quotes/newlines (quoted values), special chars in name/category, per-tag quoting, plus the previously uncovered backslash-doubling and leading/trailing whitespace branches * test(zcode): lock command adapter registry presence Verify the ZCode adapter is registered in CommandAdapterRegistry so openspec init/update can resolve it via get/getAll/has. The existing registry tests only sampled a few tools, so a future refactor that drops the zcode registration would have passed silently. * test(zcode): lock init/update generation stays under .zcode End-to-end coverage that init and update generate ZCode skills and commands under .zcode/ and never create a .agents directory. The adapter path/detection unit tests alone cannot catch a generation-time regression that writes outside .zcode, so this asserts the contract on disk for both entry points. --------- Co-authored-by: young <young@example.com> Co-authored-by: Clay Good <hi@claygood.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>