feat(#2505): Phase 2 — kimi-code Agent Skills install layout (#2520)

* 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 <configDir>/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)
This commit is contained in:
Tom Boucher
2026-07-22 00:58:58 -04:00
committed by GitHub
parent bf8f320083
commit c2a305c44d
10 changed files with 211 additions and 159 deletions

View File

@@ -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)

View File

@@ -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",

View File

@@ -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",

View File

@@ -683,6 +683,7 @@ const VALID_CONVERTER_NAMES = new Set([
'convertClaudeCommandToCursorSkill',
'convertClaudeCommandToKiloSkill',
'convertClaudeCommandToKimiSkill',
'convertClaudeCommandToKimiCodeSkill',
'convertClaudeCommandToOpencodeSkill',
'convertClaudeCommandToTraeSkill',
'convertClaudeCommandToWindsurfSkill',

View File

@@ -135,6 +135,7 @@ function convertClaudeCommandToKiloSkill(content: string, skillName: string): st
const SKILLS_CONVERTER_REGISTRY: Record<string, (content: string, skillName: string) => string> = {
convertClaudeCommandToOpencodeSkill,
convertClaudeCommandToKiloSkill,
convertClaudeCommandToKimiCodeSkill: runtimeArtifactConversion.convertClaudeCommandToKimiCodeSkill,
};
// ---------------------------------------------------------------------------

View File

@@ -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:<name>`,
* 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,

View File

@@ -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', () => {

View File

@@ -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"
}

View File

@@ -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"
]

View File

@@ -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 });