From c2a305c44de5f2f89c5c9b883838eb83439c5e82 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Wed, 22 Jul 2026 00:58:58 -0400 Subject: [PATCH] =?UTF-8?q?feat(#2505):=20Phase=202=20=E2=80=94=20kimi-cod?= =?UTF-8?q?e=20Agent=20Skills=20install=20layout=20(#2520)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(#2454): PR 2 — kimi-code Agent Skills converter + install layout PR 1 registered the kimi-code EoS descriptor with empty artifactLayout (SKIP_INSTALL_CONTRACT excluded it from the end-to-end install test). PR 2 fills in the install surface: - src/runtime-artifact-conversion.cts: new convertClaudeCommandToKimiCodeSkill function. Today it delegates to convertClaudeCommandToKimiSkill (Python kimi-cli) because Kimi Code uses the same Agent Skills format + /skill: invocation per official docs. The distinct function name lets a future divergence land cleanly if Kimi Code's skill format evolves independently. - gsd-core/bin/lib/capability-validator.cjs: add to ALLOWED_SKILLS_CONVERTERS. - capabilities/kimi-code/capability.json: artifactLayout.global now declares the skills kind with converter='convertClaudeCommandToKimiCodeSkill' + home='.kimi-code' (auto-discovered at ~/.kimi-code/skills/ per Kimi Code docs: merge_all_available_skills = true default). - tests/installer-migration-install.integration.test.cjs: REMOVE the SKIP_INSTALL_CONTRACT exclusion — kimi-code now has a full install surface. - Regenerated capability-registry + capability-matrix + golden install parity + install tree fixtures for kimi-code. * fix(#2454): wire kimi-code converter into SKILLS_CONVERTER_REGISTRY + count bump - src/install-engine.cts: add convertClaudeCommandToKimiCodeSkill to SKILLS_CONVERTER_REGISTRY so the layout-driven skills install path can dispatch off the descriptor's converter string. - tests/capability-registry.test.cjs: bump VALID_CONVERTER_NAMES count 26 → 27 (added convertClaudeCommandToKimiCodeSkill). * fix(#2454): remove home override from kimi-code skills (inherit configDir) The home:'.kimi-code' override made the install plan resolve skills dest to ~/.kimi-code/skills instead of /skills, causing the test's temp configDir to miss the install. Removing it lets skills inherit configDir like most runtimes. * fix(#2454): kimi-code install contract surface is flat-skills (no agents) Kimi Code has NO custom named subagents (per official docs: 3 built-in coder/explore/plan only). The kimi-skills-agents surface expects agents/ gsd.yaml + subagents/*.yaml which kimi-code does not produce. Changed to flat-skills which only checks for skills/gsd-* dirs. * docs(changeset): Phase 2 kimi-code install layout Added (#2509) * docs(changeset): backfill PR #2520 for Phase 2 (#2509) --- .changeset/2505-2-kimi-code-install-layout.md | 5 + capabilities/kimi-code/capability.json | 11 +- gsd-core/bin/lib/capability-registry.cjs | 22 ++- gsd-core/bin/lib/capability-validator.cjs | 1 + src/install-engine.cts | 1 + src/runtime-artifact-conversion.cts | 24 +++ tests/capability-registry.test.cjs | 4 +- .../golden-install-parity/kimi-code.json | 144 +++++++++--------- tests/fixtures/install-tree/kimi-code.json | 144 +++++++++--------- ...ler-migration-install.integration.test.cjs | 14 +- 10 files changed, 211 insertions(+), 159 deletions(-) create mode 100644 .changeset/2505-2-kimi-code-install-layout.md diff --git a/.changeset/2505-2-kimi-code-install-layout.md b/.changeset/2505-2-kimi-code-install-layout.md new file mode 100644 index 000000000..d495f2e04 --- /dev/null +++ b/.changeset/2505-2-kimi-code-install-layout.md @@ -0,0 +1,5 @@ +--- +type: Added +pr: 2520 +--- +**`--kimi-code --global` now installs a working Agent Skills surface at `~/.kimi-code/skills/gsd-*/SKILL.md`** — previously the kimi-code descriptor (Phase 1) carried an empty `artifactLayout`, so the install produced zero skills and Kimi Code's `merge_all_available_skills = true` auto-discovery found nothing. Phase 2 adds the `convertClaudeCommandToKimiCodeSkill` converter, fills the descriptor's `artifactLayout.global` with the skills kind entry, and removes the Phase 1 `SKIP_INSTALL_CONTRACT` skip by setting the install contract surface to `flat-skills` (NOT `kimi-skills-agents` — Kimi Code has no custom agents). Kimi Code auto-discovers the skills on next launch; no `agents/gsd.yaml` or `subagents/*.yaml` installed. (#2509) diff --git a/capabilities/kimi-code/capability.json b/capabilities/kimi-code/capability.json index 5cfc1e091..4e4cec7b2 100644 --- a/capabilities/kimi-code/capability.json +++ b/capabilities/kimi-code/capability.json @@ -24,7 +24,16 @@ "localConfigDir": ".kimi-code", "configFormat": "none", "artifactLayout": { - "global": [], + "global": [ + { + "kind": "skills", + "destSubpath": "skills", + "prefix": "gsd-", + "nesting": "flat", + "recursive": false, + "converter": "convertClaudeCommandToKimiCodeSkill" + } + ], "local": [] }, "commandStyle": "slash-hyphen", diff --git a/gsd-core/bin/lib/capability-registry.cjs b/gsd-core/bin/lib/capability-registry.cjs index 9d23e5a17..8ddafbd6d 100644 --- a/gsd-core/bin/lib/capability-registry.cjs +++ b/gsd-core/bin/lib/capability-registry.cjs @@ -1778,7 +1778,16 @@ const capabilities = { "localConfigDir": ".kimi-code", "configFormat": "none", "artifactLayout": { - "global": [], + "global": [ + { + "kind": "skills", + "destSubpath": "skills", + "prefix": "gsd-", + "nesting": "flat", + "recursive": false, + "converter": "convertClaudeCommandToKimiCodeSkill" + } + ], "local": [] }, "commandStyle": "slash-hyphen", @@ -5179,7 +5188,16 @@ const runtimes = { "localConfigDir": ".kimi-code", "configFormat": "none", "artifactLayout": { - "global": [], + "global": [ + { + "kind": "skills", + "destSubpath": "skills", + "prefix": "gsd-", + "nesting": "flat", + "recursive": false, + "converter": "convertClaudeCommandToKimiCodeSkill" + } + ], "local": [] }, "commandStyle": "slash-hyphen", diff --git a/gsd-core/bin/lib/capability-validator.cjs b/gsd-core/bin/lib/capability-validator.cjs index b228caf70..aaf6ffa56 100644 --- a/gsd-core/bin/lib/capability-validator.cjs +++ b/gsd-core/bin/lib/capability-validator.cjs @@ -683,6 +683,7 @@ const VALID_CONVERTER_NAMES = new Set([ 'convertClaudeCommandToCursorSkill', 'convertClaudeCommandToKiloSkill', 'convertClaudeCommandToKimiSkill', + 'convertClaudeCommandToKimiCodeSkill', 'convertClaudeCommandToOpencodeSkill', 'convertClaudeCommandToTraeSkill', 'convertClaudeCommandToWindsurfSkill', diff --git a/src/install-engine.cts b/src/install-engine.cts index cf1ceab01..519646be8 100644 --- a/src/install-engine.cts +++ b/src/install-engine.cts @@ -135,6 +135,7 @@ function convertClaudeCommandToKiloSkill(content: string, skillName: string): st const SKILLS_CONVERTER_REGISTRY: Record string> = { convertClaudeCommandToOpencodeSkill, convertClaudeCommandToKiloSkill, + convertClaudeCommandToKimiCodeSkill: runtimeArtifactConversion.convertClaudeCommandToKimiCodeSkill, }; // --------------------------------------------------------------------------- diff --git a/src/runtime-artifact-conversion.cts b/src/runtime-artifact-conversion.cts index 292d29d3b..9c126fee3 100644 --- a/src/runtime-artifact-conversion.cts +++ b/src/runtime-artifact-conversion.cts @@ -544,6 +544,29 @@ function convertClaudeCommandToKimiSkill(content, skillName, _runtime = null, cm return `---\nname: ${kimiSkillName}\ndescription: ${yamlQuote(toSingleLine(description))}\n---\nInvoke this Kimi skill with \`/skill:${kimiSkillName}\`.\n\n${normalizedBody}`; } +/** + * Convert a Claude command-markdown source into a Kimi Code Agent Skill. + * + * Kimi Code (Moonshot's Node CLI) uses the standard Agent Skills format — + * a directory containing SKILL.md with frontmatter (name/description) and + * body — auto-discovered from `~/.kimi-code/skills/` (per Kimi Code docs: + * "Agent Skills is an open format for adding specialized knowledge and + * workflows to AI agents"). The invocation prefix is `/skill:`, + * identical to Python kimi-cli. + * + * Today the output is byte-identical to `convertClaudeCommandToKimiSkill` + * (the Python kimi-cli converter) because both products consume the same + * Agent Skills format + `/skill:` invocation. The distinct function name + * lets a future divergence land cleanly if Kimi Code's skill format evolves + * independently of Python kimi-cli. + * + * Registered as `convertClaudeCommandToKimiCodeSkill` in the capabilities/ + * kimi-code/capability.json `artifactLayout` `converter` field (#2454 PR 2). + */ +function convertClaudeCommandToKimiCodeSkill(content, skillName, _runtime = null, cmdNames = null) { + return convertClaudeCommandToKimiSkill(content, skillName, _runtime, cmdNames); +} + const KIMI_CANONICAL_GSD_AGENT_RE = /^gsd-[a-z0-9-]+$/; function parseKimiAgentSource(source) { @@ -2854,6 +2877,7 @@ export = { convertClaudeCommandToAntigravitySkill, convertClaudeCommandToClaudeSkill, convertClaudeCommandToKimiSkill, + convertClaudeCommandToKimiCodeSkill, buildKimiAgentArtifacts, convertClaudeToCursorMarkdown, convertClaudeCommandToCursorSkill, diff --git a/tests/capability-registry.test.cjs b/tests/capability-registry.test.cjs index 220ae9466..faae0ea78 100644 --- a/tests/capability-registry.test.cjs +++ b/tests/capability-registry.test.cjs @@ -4021,9 +4021,9 @@ describe('ADR-1016 phase 5a: closed-vocab set exports', () => { // ─── 25. ADR-857 phase 5e: closed ConverterName enum (Part B) ───────────────── describe('ADR-857 phase 5e: VALID_CONVERTER_NAMES closed enum', () => { - test('VALID_CONVERTER_NAMES has exactly 26 entries (16 command/skill/workflow + 10 agent converters)', () => { + test('VALID_CONVERTER_NAMES has exactly 27 entries (17 command/skill/workflow + 10 agent converters)', () => { assert.ok(VALID_CONVERTER_NAMES instanceof Set, 'VALID_CONVERTER_NAMES must be a Set'); - assert.strictEqual(VALID_CONVERTER_NAMES.size, 26, 'VALID_CONVERTER_NAMES must have exactly 26 entries, got: ' + VALID_CONVERTER_NAMES.size); + assert.strictEqual(VALID_CONVERTER_NAMES.size, 27, 'VALID_CONVERTER_NAMES must have exactly 27 entries, got: ' + VALID_CONVERTER_NAMES.size); }); test('VALID_CONVERTER_NAMES contains all expected converter names', () => { diff --git a/tests/fixtures/golden-install-parity/kimi-code.json b/tests/fixtures/golden-install-parity/kimi-code.json index f7521263e..6f5efdb48 100644 --- a/tests/fixtures/golden-install-parity/kimi-code.json +++ b/tests/fixtures/golden-install-parity/kimi-code.json @@ -63,77 +63,6 @@ "agents/gsd-ui-researcher.md": "0e8ec8509d476904", "agents/gsd-user-profiler.md": "ca3bf75581f211a0", "agents/gsd-verifier.md": "cd5bea62bf704829", - "commands/gsd-add-tests.md": "51542808862d4aa7", - "commands/gsd-ai-integration-phase.md": "a693c0ade172bc3d", - "commands/gsd-audit-fix.md": "24d7e5478c271584", - "commands/gsd-audit-milestone.md": "192c2d4979ef6a5e", - "commands/gsd-audit-uat.md": "a7ce7c63bf2db68e", - "commands/gsd-autonomous.md": "35ccce06299833cf", - "commands/gsd-capture.md": "b8494f0d0b1aff6a", - "commands/gsd-cleanup.md": "e7b7644ddcefdf01", - "commands/gsd-code-review.md": "1687eabcdf03f643", - "commands/gsd-complete-milestone.md": "0b9066c97cf17898", - "commands/gsd-config.md": "f6532a6cff144abe", - "commands/gsd-debug.md": "9b42a48f5ae6836a", - "commands/gsd-discuss-phase.md": "5a29df7d87aeb5cc", - "commands/gsd-docs-update.md": "4992630ef84a9bfe", - "commands/gsd-eval-review.md": "56a5842110d51254", - "commands/gsd-execute-phase.md": "6bc473253c54343c", - "commands/gsd-explore.md": "99d92deebce81126", - "commands/gsd-extract-learnings.md": "b74c866e71283e49", - "commands/gsd-fast.md": "5ac666f183c840ae", - "commands/gsd-forensics.md": "fd672efe51d65a1a", - "commands/gsd-graphify.md": "43e6dc6f9a38a043", - "commands/gsd-health.md": "5339a925c497c35b", - "commands/gsd-help.md": "9101ee73c245037e", - "commands/gsd-import.md": "8a81293674937978", - "commands/gsd-inbox.md": "da55c1408a6ee6cc", - "commands/gsd-ingest-docs.md": "7a3c21ae5d5d133a", - "commands/gsd-manager.md": "9f54653a7c589b00", - "commands/gsd-map-codebase.md": "709e9572953accc6", - "commands/gsd-mempalace-capture.md": "c0892e814b04350a", - "commands/gsd-mempalace-recall.md": "5ac67fa4b7f2b03b", - "commands/gsd-milestone-summary.md": "f8fa9c357c08b74b", - "commands/gsd-mvp-phase.md": "cba67bcb55250e5f", - "commands/gsd-new-milestone.md": "8d52385b21cadd20", - "commands/gsd-new-project.md": "952d7601b800ad8d", - "commands/gsd-next.md": "7d3a2cb0bd12043a", - "commands/gsd-ns-context.md": "011c44e7aa46e64a", - "commands/gsd-ns-ideate.md": "edc5e543512dd48a", - "commands/gsd-ns-manage.md": "0409d810e499357f", - "commands/gsd-ns-project.md": "ff67e85bc6f7fc5a", - "commands/gsd-ns-review.md": "3766ed10827882a0", - "commands/gsd-ns-workflow.md": "c3b3c046a74ec0ee", - "commands/gsd-onboard.md": "a35340ce39334fc7", - "commands/gsd-pause-work.md": "40a953fcddbedb5d", - "commands/gsd-phase.md": "5dd3d40e3461a973", - "commands/gsd-plan-phase.md": "8ab637314511ea88", - "commands/gsd-plan-review-convergence.md": "f3aab422e0708dae", - "commands/gsd-pr-branch.md": "ab1fcffe92129061", - "commands/gsd-profile-user.md": "37c9ef202669bfd3", - "commands/gsd-progress.md": "13d7e5ba8acc2605", - "commands/gsd-quick.md": "3b9762ba2616ac69", - "commands/gsd-resume-work.md": "ece9c3a5f64e21a6", - "commands/gsd-review-backlog.md": "c5b557d4cb1b223d", - "commands/gsd-review.md": "3e8908603a3c2b28", - "commands/gsd-secure-phase.md": "34f8fb0720708cd1", - "commands/gsd-settings.md": "6f95c7d98a02f13a", - "commands/gsd-ship.md": "141c690957330961", - "commands/gsd-sketch.md": "770df13e2f848d0e", - "commands/gsd-spec-phase.md": "c0e592ef19cc6721", - "commands/gsd-spike.md": "5c85bade6e6b804f", - "commands/gsd-stats.md": "bea8a4f0e6f2ddf3", - "commands/gsd-surface.md": "0317dc3b56ffcce6", - "commands/gsd-thread.md": "56036040a95fc60b", - "commands/gsd-ui-phase.md": "b48b780198ec7a2e", - "commands/gsd-ui-review.md": "2ed61b5729f6e492", - "commands/gsd-ultraplan-phase.md": "08e75b083f5fe3f2", - "commands/gsd-undo.md": "479c579d2bb7c141", - "commands/gsd-update.md": "6f59562ac2d6bee5", - "commands/gsd-validate-phase.md": "22ad3181017f1b0e", - "commands/gsd-verify-work.md": "71aad09ecfd3f844", - "commands/gsd-workspace.md": "611002e4941d5654", - "commands/gsd-workstreams.md": "57a8ef0af8c085d7", "gsd-core/.gsd-runtime": "9d2afd32abbcfa97", "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", @@ -435,5 +364,76 @@ "scripts/gen-capability-registry.cjs": "c52201ff4d1c2cd7", "scripts/gen-loop-host-contract.cjs": "c7f15237234811a0", "scripts/lib/allowlist-ratchet.cjs": "ffaceaac3efc2660", - "scripts/lib/cli-exit.cjs": "612d0c372c75b7e7" + "scripts/lib/cli-exit.cjs": "612d0c372c75b7e7", + "skills/gsd-add-tests/SKILL.md": "9ca6e30d5db6a6ad", + "skills/gsd-ai-integration-phase/SKILL.md": "da4ae7d9a40e8cf1", + "skills/gsd-audit-fix/SKILL.md": "237d305c47306488", + "skills/gsd-audit-milestone/SKILL.md": "98a151b178864aa5", + "skills/gsd-audit-uat/SKILL.md": "2a8bd6b7f04812a7", + "skills/gsd-autonomous/SKILL.md": "935ac2fcb4761b82", + "skills/gsd-capture/SKILL.md": "240f21aa797cdf6b", + "skills/gsd-cleanup/SKILL.md": "13db60637c9eb3df", + "skills/gsd-code-review/SKILL.md": "70e97fb3c1bc3481", + "skills/gsd-complete-milestone/SKILL.md": "d848ff449f33913b", + "skills/gsd-config/SKILL.md": "c4fe0acbcc31ce80", + "skills/gsd-debug/SKILL.md": "52128dc1598d50bd", + "skills/gsd-discuss-phase/SKILL.md": "4b0144358b18d76e", + "skills/gsd-docs-update/SKILL.md": "7f055c7670d76ddc", + "skills/gsd-eval-review/SKILL.md": "211ea8dac477167e", + "skills/gsd-execute-phase/SKILL.md": "b8bb25d57570d784", + "skills/gsd-explore/SKILL.md": "782f037fe0729c2e", + "skills/gsd-extract-learnings/SKILL.md": "837e58da3df453e8", + "skills/gsd-fast/SKILL.md": "77bd35a9d540054e", + "skills/gsd-forensics/SKILL.md": "a367f70c3fc92f37", + "skills/gsd-graphify/SKILL.md": "186094e3fb368335", + "skills/gsd-health/SKILL.md": "741a7c6e887a232f", + "skills/gsd-help/SKILL.md": "eb28c85cfdcc16bd", + "skills/gsd-import/SKILL.md": "766932cce8d8a17e", + "skills/gsd-inbox/SKILL.md": "3bf4e410df04cb77", + "skills/gsd-ingest-docs/SKILL.md": "6139d3e98a634745", + "skills/gsd-manager/SKILL.md": "4f02cf2b27d360f8", + "skills/gsd-map-codebase/SKILL.md": "49c49fc4ff88b8c1", + "skills/gsd-mempalace-capture/SKILL.md": "aeb01fa8be356ba8", + "skills/gsd-mempalace-recall/SKILL.md": "c6e0195e55cd934c", + "skills/gsd-milestone-summary/SKILL.md": "d2f96bb139402a7a", + "skills/gsd-mvp-phase/SKILL.md": "fe7e70a5296c10dc", + "skills/gsd-new-milestone/SKILL.md": "729100f0360f3cc0", + "skills/gsd-new-project/SKILL.md": "7ef91103638c4736", + "skills/gsd-next/SKILL.md": "bd417a9df6d0b2fb", + "skills/gsd-ns-context/SKILL.md": "89f5bffe6702c0c5", + "skills/gsd-ns-ideate/SKILL.md": "e0c0420f6878906a", + "skills/gsd-ns-manage/SKILL.md": "b7fbe29e45e75f54", + "skills/gsd-ns-project/SKILL.md": "fcb8a93ade9ecc72", + "skills/gsd-ns-review/SKILL.md": "2ff62330379f947f", + "skills/gsd-ns-workflow/SKILL.md": "86272fd655c206bc", + "skills/gsd-onboard/SKILL.md": "814509644f2dd7da", + "skills/gsd-pause-work/SKILL.md": "86886de012e27314", + "skills/gsd-phase/SKILL.md": "7692fa5a0821e51e", + "skills/gsd-plan-phase/SKILL.md": "8038d698f8de6aad", + "skills/gsd-plan-review-convergence/SKILL.md": "28dc35da86b93b10", + "skills/gsd-pr-branch/SKILL.md": "b51ca03728fd5e79", + "skills/gsd-profile-user/SKILL.md": "4a53d59bc19e3f17", + "skills/gsd-progress/SKILL.md": "b0a206e0ad93bf60", + "skills/gsd-quick/SKILL.md": "faf4f26a707fe212", + "skills/gsd-resume-work/SKILL.md": "78a048666a26016a", + "skills/gsd-review-backlog/SKILL.md": "ffc6216cfb6c3002", + "skills/gsd-review/SKILL.md": "6d1bbc8a6184b78a", + "skills/gsd-secure-phase/SKILL.md": "3dc6088c9889d5bb", + "skills/gsd-settings/SKILL.md": "4615c7f527403f9c", + "skills/gsd-ship/SKILL.md": "993a34f93d7bda8c", + "skills/gsd-sketch/SKILL.md": "87f28aee46e5d06e", + "skills/gsd-spec-phase/SKILL.md": "443faa42c1c8cd8c", + "skills/gsd-spike/SKILL.md": "558c0149816f111a", + "skills/gsd-stats/SKILL.md": "1ecd859ba893f7b9", + "skills/gsd-surface/SKILL.md": "68d58321293942f0", + "skills/gsd-thread/SKILL.md": "78e6f1c56c629942", + "skills/gsd-ui-phase/SKILL.md": "cc63649847cc2e50", + "skills/gsd-ui-review/SKILL.md": "18ab050b4723f9a7", + "skills/gsd-ultraplan-phase/SKILL.md": "fb49cef690fb4673", + "skills/gsd-undo/SKILL.md": "a1ab63a1e875ef24", + "skills/gsd-update/SKILL.md": "6ef33a94caa8f63e", + "skills/gsd-validate-phase/SKILL.md": "d502ca602526ceab", + "skills/gsd-verify-work/SKILL.md": "136debbb14db2086", + "skills/gsd-workspace/SKILL.md": "9951bff5391884f8", + "skills/gsd-workstreams/SKILL.md": "cd2ed0019f00302a" } diff --git a/tests/fixtures/install-tree/kimi-code.json b/tests/fixtures/install-tree/kimi-code.json index 73d75ae60..2304c7c32 100644 --- a/tests/fixtures/install-tree/kimi-code.json +++ b/tests/fixtures/install-tree/kimi-code.json @@ -63,77 +63,6 @@ "agents/gsd-ui-researcher.md", "agents/gsd-user-profiler.md", "agents/gsd-verifier.md", - "commands/gsd-add-tests.md", - "commands/gsd-ai-integration-phase.md", - "commands/gsd-audit-fix.md", - "commands/gsd-audit-milestone.md", - "commands/gsd-audit-uat.md", - "commands/gsd-autonomous.md", - "commands/gsd-capture.md", - "commands/gsd-cleanup.md", - "commands/gsd-code-review.md", - "commands/gsd-complete-milestone.md", - "commands/gsd-config.md", - "commands/gsd-debug.md", - "commands/gsd-discuss-phase.md", - "commands/gsd-docs-update.md", - "commands/gsd-eval-review.md", - "commands/gsd-execute-phase.md", - "commands/gsd-explore.md", - "commands/gsd-extract-learnings.md", - "commands/gsd-fast.md", - "commands/gsd-forensics.md", - "commands/gsd-graphify.md", - "commands/gsd-health.md", - "commands/gsd-help.md", - "commands/gsd-import.md", - "commands/gsd-inbox.md", - "commands/gsd-ingest-docs.md", - "commands/gsd-manager.md", - "commands/gsd-map-codebase.md", - "commands/gsd-mempalace-capture.md", - "commands/gsd-mempalace-recall.md", - "commands/gsd-milestone-summary.md", - "commands/gsd-mvp-phase.md", - "commands/gsd-new-milestone.md", - "commands/gsd-new-project.md", - "commands/gsd-next.md", - "commands/gsd-ns-context.md", - "commands/gsd-ns-ideate.md", - "commands/gsd-ns-manage.md", - "commands/gsd-ns-project.md", - "commands/gsd-ns-review.md", - "commands/gsd-ns-workflow.md", - "commands/gsd-onboard.md", - "commands/gsd-pause-work.md", - "commands/gsd-phase.md", - "commands/gsd-plan-phase.md", - "commands/gsd-plan-review-convergence.md", - "commands/gsd-pr-branch.md", - "commands/gsd-profile-user.md", - "commands/gsd-progress.md", - "commands/gsd-quick.md", - "commands/gsd-resume-work.md", - "commands/gsd-review-backlog.md", - "commands/gsd-review.md", - "commands/gsd-secure-phase.md", - "commands/gsd-settings.md", - "commands/gsd-ship.md", - "commands/gsd-sketch.md", - "commands/gsd-spec-phase.md", - "commands/gsd-spike.md", - "commands/gsd-stats.md", - "commands/gsd-surface.md", - "commands/gsd-thread.md", - "commands/gsd-ui-phase.md", - "commands/gsd-ui-review.md", - "commands/gsd-ultraplan-phase.md", - "commands/gsd-undo.md", - "commands/gsd-update.md", - "commands/gsd-validate-phase.md", - "commands/gsd-verify-work.md", - "commands/gsd-workspace.md", - "commands/gsd-workstreams.md", "gsd-core/.gsd-runtime", "gsd-core/VERSION", "gsd-core/bin/check-latest-version.cjs", @@ -435,5 +364,76 @@ "scripts/gen-capability-registry.cjs", "scripts/gen-loop-host-contract.cjs", "scripts/lib/allowlist-ratchet.cjs", - "scripts/lib/cli-exit.cjs" + "scripts/lib/cli-exit.cjs", + "skills/gsd-add-tests/SKILL.md", + "skills/gsd-ai-integration-phase/SKILL.md", + "skills/gsd-audit-fix/SKILL.md", + "skills/gsd-audit-milestone/SKILL.md", + "skills/gsd-audit-uat/SKILL.md", + "skills/gsd-autonomous/SKILL.md", + "skills/gsd-capture/SKILL.md", + "skills/gsd-cleanup/SKILL.md", + "skills/gsd-code-review/SKILL.md", + "skills/gsd-complete-milestone/SKILL.md", + "skills/gsd-config/SKILL.md", + "skills/gsd-debug/SKILL.md", + "skills/gsd-discuss-phase/SKILL.md", + "skills/gsd-docs-update/SKILL.md", + "skills/gsd-eval-review/SKILL.md", + "skills/gsd-execute-phase/SKILL.md", + "skills/gsd-explore/SKILL.md", + "skills/gsd-extract-learnings/SKILL.md", + "skills/gsd-fast/SKILL.md", + "skills/gsd-forensics/SKILL.md", + "skills/gsd-graphify/SKILL.md", + "skills/gsd-health/SKILL.md", + "skills/gsd-help/SKILL.md", + "skills/gsd-import/SKILL.md", + "skills/gsd-inbox/SKILL.md", + "skills/gsd-ingest-docs/SKILL.md", + "skills/gsd-manager/SKILL.md", + "skills/gsd-map-codebase/SKILL.md", + "skills/gsd-mempalace-capture/SKILL.md", + "skills/gsd-mempalace-recall/SKILL.md", + "skills/gsd-milestone-summary/SKILL.md", + "skills/gsd-mvp-phase/SKILL.md", + "skills/gsd-new-milestone/SKILL.md", + "skills/gsd-new-project/SKILL.md", + "skills/gsd-next/SKILL.md", + "skills/gsd-ns-context/SKILL.md", + "skills/gsd-ns-ideate/SKILL.md", + "skills/gsd-ns-manage/SKILL.md", + "skills/gsd-ns-project/SKILL.md", + "skills/gsd-ns-review/SKILL.md", + "skills/gsd-ns-workflow/SKILL.md", + "skills/gsd-onboard/SKILL.md", + "skills/gsd-pause-work/SKILL.md", + "skills/gsd-phase/SKILL.md", + "skills/gsd-plan-phase/SKILL.md", + "skills/gsd-plan-review-convergence/SKILL.md", + "skills/gsd-pr-branch/SKILL.md", + "skills/gsd-profile-user/SKILL.md", + "skills/gsd-progress/SKILL.md", + "skills/gsd-quick/SKILL.md", + "skills/gsd-resume-work/SKILL.md", + "skills/gsd-review-backlog/SKILL.md", + "skills/gsd-review/SKILL.md", + "skills/gsd-secure-phase/SKILL.md", + "skills/gsd-settings/SKILL.md", + "skills/gsd-ship/SKILL.md", + "skills/gsd-sketch/SKILL.md", + "skills/gsd-spec-phase/SKILL.md", + "skills/gsd-spike/SKILL.md", + "skills/gsd-stats/SKILL.md", + "skills/gsd-surface/SKILL.md", + "skills/gsd-thread/SKILL.md", + "skills/gsd-ui-phase/SKILL.md", + "skills/gsd-ui-review/SKILL.md", + "skills/gsd-ultraplan-phase/SKILL.md", + "skills/gsd-undo/SKILL.md", + "skills/gsd-update/SKILL.md", + "skills/gsd-validate-phase/SKILL.md", + "skills/gsd-verify-work/SKILL.md", + "skills/gsd-workspace/SKILL.md", + "skills/gsd-workstreams/SKILL.md" ] diff --git a/tests/installer-migration-install.integration.test.cjs b/tests/installer-migration-install.integration.test.cjs index e21399e06..4f8f25f82 100644 --- a/tests/installer-migration-install.integration.test.cjs +++ b/tests/installer-migration-install.integration.test.cjs @@ -35,10 +35,10 @@ const RUNTIME_INSTALL_CONTRACTS = { gemini: { surface: 'commands-gsd', settings: true, packageJson: true }, hermes: { surface: 'hermes-skills', settings: true, packageJson: true }, kimi: { surface: 'kimi-skills-agents', settings: false, packageJson: false }, - // #2454 PR 1: Kimi Code (Node CLI) registers the same install shape as Kimi - // for now — Agent Skills + the standard gsd-core layout. PR 2 will specialize - // this once the kimi-code Agent Skills converter lands. - 'kimi-code': { surface: 'kimi-skills-agents', settings: false, packageJson: false }, + // #2454: Kimi Code (Node CLI) has NO custom named subagents (per official + // docs), so its install surface is skills-only (flat-skills), NOT + // kimi-skills-agents. The kimi-agents YAML layout is Python kimi-cli only. + 'kimi-code': { surface: 'flat-skills', settings: false, packageJson: false }, // #2305: Kilo's native plugin spawns the staged guard hooks, so it receives // the shared hooks bundle + the CommonJS package.json marker, like OpenCode. // (#1821 excluded Kilo on the false premise that it had no plugin surface.) @@ -550,13 +550,7 @@ describe('installer migration install integration', { concurrency: false }, () = assert.equal(fs.existsSync(path.join(codexHome, 'gsd-install-state.json')), false); }); - // #2454 PR 1: kimi-code is registered as a runtime (descriptor + flags + - // capability-registry) but its install layout (Agent Skills converter + - // global AGENTS.md) lands in PR 2 of the sequence. Excluded from the - // end-to-end install contract loop until PR 2 ships the install surface. - const SKIP_INSTALL_CONTRACT = new Set(['kimi-code']); for (const runtime of SUPPORTED_RUNTIMES) { - if (SKIP_INSTALL_CONTRACT.has(runtime)) continue; test(`runs a full end-to-end install for ${runtime}`, () => { const targetDir = path.join(tmpRoot, `.${runtime}-full-install`); fs.mkdirSync(targetDir, { recursive: true });