feat(#2505): Phase 1 — EoS descriptor split (kimi-code capability.json + drift-guard registration) (#2519)
* feat(#2454): add kimi-code as an EoS capability (Node Kimi Code CLI) PR 1 of N for #2454. Establishes the EoS descriptor foundation for splitting GSD's kimi support into two distinct products per the user's directive: - kimi (existing): Moonshot's Python kimi-cli (~/.kimi, runtime: python) - kimi-code (new): Moonshot's Node Kimi Code CLI (~/.kimi-code, runtime: node, KIMI_CODE_HOME env) Per ADR-1239 EoS, runtime behavior is driven by capabilities/<id>/capability.json descriptors, not hardcoded branches in install.js. The new descriptor uses the existing primitives (dot-home configHome, skills artifactLayout, kimi-hooks-toml hooksSurface — same TOML [[hooks]] format Kimi Code reads per its docs). Critical Kimi Code constraint reflected in the descriptor: hostIntegration.dispatch.namedDispatch: false hostIntegration.dispatch.builtInSubagents: ['coder', 'explore', 'plan'] hostBehaviors.namedSubagentsSupported: false Kimi Code's official docs confirm only 3 built-in subagents with NO custom- subagent registration (the [subagent] table only has timeout_ms). The kimi-agents YAML layout (used by Python kimi-cli) is therefore NOT in kimi-code's artifactLayout. Schema adjustments: - subagentToolkit set to 'undocumented' (the existing escape hatch); the schema enum (full/read-only) lacks a 'limited'/'built-in-only' value. A follow-up PR can extend the schema enum to add 'built-in-only' as a first-class axis value reflecting Kimi Code's documented model. Registration: - capabilities/kimi-code/capability.json (new descriptor, modeled on codex) - bin/install.js: allRuntimes array + --all list + --kimi-code flag - gsd-core/bin/shared/runtime-aliases.manifest.json: kimi-code aliases (kimi-code, kimicode, kimi_code) - src/runtime-name-policy.cts: FALLBACK_ALIASES map - gsd-core/bin/lib/capability-registry.cjs: regenerated via scripts/gen-capability-registry.cjs --write Tests: - tests/multi-runtime-select.test.cjs updated for the new runtime count (18) + new --kimi-code flag test + 'All' shortcut renumbered 18 → 19. Out of scope for PR 1 (follow-up PRs in the sequence): - Install-time decision logic (kimi vs kimi-code detection / prompt) - agent-install-check semantics for kimi-code (verify Agent Skills presence) - cmdAgentSkills fallback returning subagent prompt content - Workflow template mapping (named agents → built-in coder/explore/plan) - Migration guidance for users currently on 'kimi' who are actually on Kimi Code - Schema enum extension for subagentToolkit: 'built-in-only' Refs #2454, #2095 (EoS/kimi migration epic), ADR-1239 (EoS). * fix(#2454): complete drift-guard registrations for kimi-code runtime The drift guards caught every surface that pins runtime enumeration. Each update is mechanical, driven by the guard's named failure mode: - src/runtime-name-policy.cts RUNTIME_LABELS: 'Kimi Code' label for kimi-code - src/runtime-name-policy.cts RUNTIME_FLAG_IDS: add kimi-code to the isKimiCode predicate generator - bin/install.js runtimeMap: option '11' → 'kimi-code', renumber downstream entries (11..17 → 12..18), ALL_RUNTIMES_OPTION 18 → 19 - gsd-core/bin/shared/model-catalog.json runtimeTierDefaults: kimi-code entry (null/null/null — same as kimi, no model tier defaults until configured) - docs/reference/capability-matrix.md: regenerated via scripts/gen-capability-matrix.cjs --write (kimi-code row added) - tests/global-config-home-fragment.test.cjs GOLDEN_FRAGMENT_MAP: kimi-code → '.kimi-code' - tests/fixtures/golden-install-parity/*.json: regenerated via npm run gen:golden (the runtime-aliases.manifest.json hash changed; all 17 runtime fixtures updated) The capability-registry is already regenerated from the prior commit. * test(#2454): update drift-guard tests for kimi-code runtime registration Multiple drift guards pin runtime enumeration counts and option numbering. Each update is mechanical, driven by the guard's named failure mode: - tests/runtime-flags.test.cjs: EXPECTED_FLAGS gains isKimiCode (16 → 17); 'all 16 flags' → 'all 17 flags' in test names + messages. - tests/multi-runtime-select.test.cjs: parseRuntimeInput option renumbering cascade — kilo moves 11→12, opencode 12→13, pi 13→14, qwen 14→15, trae 15→16, windsurf 16→17, zcode 17→18, All 18→19. New single-choice test for kimi-code (option 11). Prompt test updated for new numbering. - tests/host-integration-descriptors.test.cjs: EXPECTED_PROFILES gains kimi-code → 'programmatic-cli' (terminal CLI per Kimi Code docs); EXPECTED_FLATTEN gains kimi-code → false (backgroundDispatch:true per docs, same as Python kimi/opencode). - tests/global-config-home-fragment.test.cjs: table-count test renamed 13 → 14 table runtimes (kimi-code added to GOLDEN_FRAGMENT_MAP earlier). * fix(#2454): empty artifactLayout for kimi-code (PR 1 scope) The skills kind requires a converter (existing converters are per-runtime like convertClaudeCommandToKimiSkill). PR 1 of this multi-PR sequence only registers the descriptor; the actual Agent Skills converter (and a new 'convertClaudeCommandToKimiCodeSkill' function) lands in PR 2 alongside the install-time decision logic. Empty artifactLayout.global is valid and means 'nothing to install yet via the layout seam'. Also: added kimi-code to RUNTIME_META in tests/helpers/install-shared.cjs (localDir .kimi-code, globalSuffix .kimi-code), and added Kimi Code as option 11 in install.js's buildRuntimePromptText (renumbered downstream options 11..17 → 12..18, All 18 → 19). * fix(#2454): camelCase runtimeFlags for hyphenated ids (kimi-code → isKimiCode) The runtimeFlags generator previously produced 'isKimi-code' (hyphen preserved) for the new kimi-code runtime id. Property names with hyphens are awkward for consumers (flags['isKimi-code'] instead of flags.isKimiCode). The new runtimeIdToFlagName helper folds -[a-z] boundaries to uppercase, producing the conventional PascalCase flag name. The 16 prior single-word runtime ids are unaffected (the regex finds no hyphens). * fix(#2454): update remaining drift-guard tests + gen kimi-code fixtures - tests/runtime-flags.test.cjs drift guard: use proper kebab-case conversion (isKimiCode → kimi-code, not 'kimicode') so the registry comparison doesn't false-positive on hyphenated runtime ids. - tests/multi-runtime-select.test.cjs: fix kilo/opencode/pi/qwen/trae single-choice tests for the renumbered options (kilo 11→12, opencode 12→13, pi 13→14, qwen 14→15, trae 15→16). - tests/install.test.cjs: Kilo integration option 11→12, prompt test regex updated. - tests/fixtures/golden-install-parity/kimi-code.json + install-tree/ kimi-code.json: generated via UPDATE_GOLDEN=1 + UPDATE_INSTALL_TREE=1. The kimi-code install produces the standard GSD install layout (skills, contexts, references, etc.) — 436 paths, same shape as other runtimes that have no custom converter yet. * fix(#2454): add kimi-code install contract + global config home fragment - src/runtime-name-policy.cts GLOBAL_CONFIG_HOME_FRAGMENTS: add kimi-code → '.kimi-code' so getGlobalConfigHomeFragment returns the correct path instead of falling through to the default '.claude'. - tests/installer-migration-install.integration.test.cjs RUNTIME_INSTALL_CONTRACTS: kimi-code entry (same surface as kimi for PR 1; PR 2 will specialize once the Agent Skills converter lands). - tests/multi-runtime-select.test.cjs: fix space-separated-choices test for the renumbered kilo option (11 → 12). - tests/fixtures/golden-install-parity/kimi-code.json + install-tree/ kimi-code.json: regenerated after rebasing onto current next (new planner-reversibility.md from #2471 etc. now included). * test(#2454): skip kimi-code install contract until PR 2 ships install layout The end-to-end install test (tests/installer-migration-install.integration .test.cjs) asserts every allRuntimes entry installs a runtime-specific artifact surface. PR 1 of #2454 registers kimi-code in allRuntimes + the capability descriptor + flags + labels, but the install LAYOUT (Agent Skills converter + global AGENTS.md at $KIMI_CODE_HOME/AGENTS.md) lands in PR 2. The SKIP_INSTALL_CONTRACT set marks this exclusion explicit and self-removing — PR 2 removes the entry alongside adding the install surface, restoring the contract loop to full coverage. * fix(#2454): restore compact model-catalog.json format (M1 review) Per code-review M1: my prior 'fix(#2454): complete drift-guard registrations' commit used python json.dump(indent=2) which inflated the file from 165→607 lines (every nested entry got expanded) and lost the trailing newline. The semantic change was just a 3-line kimi-code entry. Restored the original hybrid format (top-level indent=2 + inner entries' one-line style) and added kimi-code in matching form. Regenerated golden install parity + install tree fixtures since the model-catalog.json hash changed. * fix(#2454): update CONTEXT.md allRuntimes glossary (17 → 18, add kimi-code) CI lint-tests job failed on the glossary drift guard (scripts/check-glossary-refs.cjs --check): ✗ CONTEXT.md's allRuntimes enum-count sentence claims 17 values but bin/install.js's allRuntimes array has 18. ✗ CONTEXT.md's allRuntimes member list has drifted from bin/install.js (missing from CONTEXT.md's list: kimi-code). Missed in the prior commits because gsd-test does not run the glossary check (it's a CI lint-tests-only check). Updating CONTEXT.md's two claims to 18 values + kimi-code in the member list. * chore(#2505): regen capability-registry + stamp kimi-code version 1.8.0 (#2511) * docs(changeset): Phase 1 kimi-code runtime Added (#2511) * test(#2511): regen kimi-code golden parity fixture after Phase 0 guard normalization lands * docs(changeset): backfill PR #2519 for Phase 1 (#2511)
This commit is contained in:
5
.changeset/2505-1-kimi-code-runtime.md
Normal file
5
.changeset/2505-1-kimi-code-runtime.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
type: Added
|
||||
pr: 2519
|
||||
---
|
||||
**New `kimi-code` runtime (Node Kimi Code CLI) registered as a distinct EoS capability** — Kimi Code users running `--kimi --global` were silently installing the Python kimi-cli agent YAMLs (which Kimi Code ignores) and getting an empty `gsd-tools query agent-skills` response. The split adds a `kimi-code` descriptor with `runtime: "node"`, `dispatch.namedDispatch: false`, `builtInSubagents: [coder, explore, plan]`, and registers it across every drift-guarded surface (allRuntimes, runtimeMap, FALLBACK_ALIASES, RUNTIME_LABELS, model-catalog, runtime-aliases manifest, capability-registry, capability-matrix, CONTEXT.md glossary). `runtimeFlags('kimi-code').isKimiCode === true`; `--kimi-code` selects kimi-code without interactive prompt; existing `kimi` (Python kimi-cli) users see no behavior change beyond the corrected `localConfigDir: ".kimi"`. (#2511)
|
||||
@@ -140,7 +140,7 @@ Module owning the layout-driven runtime-artifact install pipeline — `installRu
|
||||
Module owning validation for Installer Migration Module records and planned actions. It enforces migration metadata, explicit install scopes, ownership evidence for destructive/config actions, and runtime contract citations for runtime config rewrites before a migration can enter planning or apply.
|
||||
|
||||
### Installer Module
|
||||
Primary installer for all runtimes. Single production file: `bin/install.js` (generated). Exports: `install(isGlobal, runtime[, configDir])` → typed result `{ runtime, configDir, settingsPath, settings, statuslineCommand, updateBannerCommand }`; `uninstall(isGlobal, runtime[, configDir])`; `installRuntimeArtifacts(runtime, configDir, scope, resolvedProfile)`; `uninstallRuntimeArtifacts(runtime, configDir, scope)`; `writeManifest(configDir, runtime)`. Runtime enum: `allRuntimes` (17 values: claude, antigravity, augment, cline, codebuddy, codex, copilot, cursor, hermes, kimi, kilo, opencode, pi, qwen, trae, windsurf, zcode). Directory helpers: `getDirName(runtime)` → local dir name; `getConfigDirFromHome(runtime, isGlobal)` → shell-quoted path fragment. Per-runtime global config-dir resolution is delegated to `gsd-core/bin/lib/runtime-homes.cjs:getGlobalConfigDir(runtime[, explicitDir])` — the canonical, env-var–aware projection (`explicitDir` override + opencode/kilo `*_CONFIG` file-path precedence); the legacy in-installer `getGlobalDir`/`getOpencodeGlobalDir`/`getKiloGlobalDir` were retired into it (#56). The same module exposes `detectAntigravityDirAmbiguity(opts)` — a side-effect-free probe reporting whether multiple `~/.gemini/antigravity{,-ide,-cli}` dirs coexist and which one GSD's `gsd-core/VERSION` marker (the `dot-home-nested` `probeExists`) resolves to, for installer / `/gsd-update` operator guidance when a pre-#217 install landed in the wrong sibling dir (#1441). Runtime-specific helpers: `resolveKiloConfigPath(configDir)`, `configureKiloPermissions(isGlobal[, explicitDir])`. Claude-specific permission helpers: `mergeClaudePermissions(settings)` — non-destructively appends GSD-owned allow/deny entries (see `GSD_CLAUDE_ALLOW_PERMISSIONS`, `GSD_CLAUDE_DENY_PERMISSIONS` constants) to a Claude Code settings object; called from `finishInstall` for `runtime === 'claude'` only; uninstall removes exactly these entries (#768). Layout-driven artifact copy/removal delegates to `gsd-core/bin/lib/runtime-artifact-layout.cjs:resolveRuntimeArtifactLayout` (throws `TypeError` for unknown runtimes). Five runtimes with non-recursive skill loaders (cline, qwen, hermes, augment, trae) use a nested router layout: 6 `gsd-ns-*` router bundles emitted as top-level skills, with concrete skills nested at `<router>/skills/<name>/SKILL.md` (hermes prefix='': `skills/gsd/ns-*/…`). claude (reverted from nested per #924 — the Skill tool errors on unrouted names) and antigravity (one-level scan, but concrete skills must be top-level discoverable) plus the remaining skills-runtimes (cursor, codex, copilot, windsurf, codebuddy, opencode, kilo) use the flat `skills/gsd-<stem>/` layout. See Skill Surface Budget Module and Runtime Artifact Layout Module.
|
||||
Primary installer for all runtimes. Single production file: `bin/install.js` (generated). Exports: `install(isGlobal, runtime[, configDir])` → typed result `{ runtime, configDir, settingsPath, settings, statuslineCommand, updateBannerCommand }`; `uninstall(isGlobal, runtime[, configDir])`; `installRuntimeArtifacts(runtime, configDir, scope, resolvedProfile)`; `uninstallRuntimeArtifacts(runtime, configDir, scope)`; `writeManifest(configDir, runtime)`. Runtime enum: `allRuntimes` (18 values: claude, antigravity, augment, cline, codebuddy, codex, copilot, cursor, hermes, kimi, kimi-code, kilo, opencode, pi, qwen, trae, windsurf, zcode). Directory helpers: `getDirName(runtime)` → local dir name; `getConfigDirFromHome(runtime, isGlobal)` → shell-quoted path fragment. Per-runtime global config-dir resolution is delegated to `gsd-core/bin/lib/runtime-homes.cjs:getGlobalConfigDir(runtime[, explicitDir])` — the canonical, env-var–aware projection (`explicitDir` override + opencode/kilo `*_CONFIG` file-path precedence); the legacy in-installer `getGlobalDir`/`getOpencodeGlobalDir`/`getKiloGlobalDir` were retired into it (#56). The same module exposes `detectAntigravityDirAmbiguity(opts)` — a side-effect-free probe reporting whether multiple `~/.gemini/antigravity{,-ide,-cli}` dirs coexist and which one GSD's `gsd-core/VERSION` marker (the `dot-home-nested` `probeExists`) resolves to, for installer / `/gsd-update` operator guidance when a pre-#217 install landed in the wrong sibling dir (#1441). Runtime-specific helpers: `resolveKiloConfigPath(configDir)`, `configureKiloPermissions(isGlobal[, explicitDir])`. Claude-specific permission helpers: `mergeClaudePermissions(settings)` — non-destructively appends GSD-owned allow/deny entries (see `GSD_CLAUDE_ALLOW_PERMISSIONS`, `GSD_CLAUDE_DENY_PERMISSIONS` constants) to a Claude Code settings object; called from `finishInstall` for `runtime === 'claude'` only; uninstall removes exactly these entries (#768). Layout-driven artifact copy/removal delegates to `gsd-core/bin/lib/runtime-artifact-layout.cjs:resolveRuntimeArtifactLayout` (throws `TypeError` for unknown runtimes). Five runtimes with non-recursive skill loaders (cline, qwen, hermes, augment, trae) use a nested router layout: 6 `gsd-ns-*` router bundles emitted as top-level skills, with concrete skills nested at `<router>/skills/<name>/SKILL.md` (hermes prefix='': `skills/gsd/ns-*/…`). claude (reverted from nested per #924 — the Skill tool errors on unrouted names) and antigravity (one-level scan, but concrete skills must be top-level discoverable) plus the remaining skills-runtimes (cursor, codex, copilot, windsurf, codebuddy, opencode, kilo) use the flat `skills/gsd-<stem>/` layout. See Skill Surface Budget Module and Runtime Artifact Layout Module.
|
||||
|
||||
### I/O Module
|
||||
Module owning the tool's CLI I/O primitives: `output()` result emission (with large-payload temp-file spillover via `GSD_TEMP_DIR`/`ensureGsdTempDir`/`reapStaleTempFiles`), `error()` stderr emission with exit-code mapping, and the JSON-error-mode toggle (`setJsonErrorMode`/`getJsonErrorMode`, `ERROR_REASON`). Extracted from the Core module per ADR-857 rollout phase 1 (#859) so feature modules (`graphify`, `intel`, `audit`, `profile-pipeline`) depend on a small I/O seam instead of the core god-module; the `core.cjs` re-export spine was retired in epic #1267, so callers import this leaf directly. Source of truth: `gsd-core/bin/lib/io.cjs` (generated from `src/io.cts`).
|
||||
|
||||
@@ -627,7 +627,7 @@ if (hasMinimal && _profileArgRaw) {
|
||||
|
||||
function selectRuntimesFromArgs(runtimeArgs) {
|
||||
if (runtimeArgs.includes('--all')) {
|
||||
return ['claude', 'kimi', 'kilo', 'opencode', 'pi', 'codex', 'copilot', 'antigravity', 'cursor', 'windsurf', 'augment', 'trae', 'qwen', 'hermes', 'codebuddy', 'cline', 'zcode'];
|
||||
return ['claude', 'kimi', 'kimi-code', 'kilo', 'opencode', 'pi', 'codex', 'copilot', 'antigravity', 'cursor', 'windsurf', 'augment', 'trae', 'qwen', 'hermes', 'codebuddy', 'cline', 'zcode'];
|
||||
}
|
||||
if (runtimeArgs.includes('--both')) {
|
||||
return ['claude', 'opencode'];
|
||||
@@ -648,6 +648,7 @@ function selectRuntimesFromArgs(runtimeArgs) {
|
||||
if (runtimeArgs.includes('--qwen')) selected.push('qwen');
|
||||
if (runtimeArgs.includes('--hermes')) selected.push('hermes');
|
||||
if (runtimeArgs.includes('--kimi')) selected.push('kimi');
|
||||
if (runtimeArgs.includes('--kimi-code')) selected.push('kimi-code');
|
||||
if (runtimeArgs.includes('--codebuddy')) selected.push('codebuddy');
|
||||
if (runtimeArgs.includes('--cline')) selected.push('cline');
|
||||
if (runtimeArgs.includes('--zcode')) selected.push('zcode');
|
||||
@@ -12390,16 +12391,17 @@ const runtimeMap = {
|
||||
'8': 'cursor',
|
||||
'9': 'hermes',
|
||||
'10': 'kimi',
|
||||
'11': 'kilo',
|
||||
'12': 'opencode',
|
||||
'13': 'pi',
|
||||
'14': 'qwen',
|
||||
'15': 'trae',
|
||||
'16': 'windsurf',
|
||||
'17': 'zcode'
|
||||
'11': 'kimi-code',
|
||||
'12': 'kilo',
|
||||
'13': 'opencode',
|
||||
'14': 'pi',
|
||||
'15': 'qwen',
|
||||
'16': 'trae',
|
||||
'17': 'windsurf',
|
||||
'18': 'zcode'
|
||||
};
|
||||
const allRuntimes = ['claude', 'antigravity', 'augment', 'cline', 'codebuddy', 'codex', 'copilot', 'cursor', 'hermes', 'kimi', 'kilo', 'opencode', 'pi', 'qwen', 'trae', 'windsurf', 'zcode'];
|
||||
const ALL_RUNTIMES_OPTION = '18';
|
||||
const allRuntimes = ['claude', 'antigravity', 'augment', 'cline', 'codebuddy', 'codex', 'copilot', 'cursor', 'hermes', 'kimi', 'kimi-code', 'kilo', 'opencode', 'pi', 'qwen', 'trae', 'windsurf', 'zcode'];
|
||||
const ALL_RUNTIMES_OPTION = '19';
|
||||
|
||||
/**
|
||||
* Build the runtime-selection prompt text shown by the interactive installer.
|
||||
@@ -12417,14 +12419,15 @@ function buildRuntimePromptText() {
|
||||
${cyan}8${reset}) Cursor ${dim}(~/.cursor)${reset}
|
||||
${cyan}9${reset}) Hermes Agent ${dim}(~/.hermes)${reset}
|
||||
${cyan}10${reset}) Kimi ${dim}(~/.config/agents, then ~/.agents if existing)${reset}
|
||||
${cyan}11${reset}) Kilo ${dim}(~/.config/kilo)${reset}
|
||||
${cyan}12${reset}) OpenCode ${dim}(~/.config/opencode)${reset}
|
||||
${cyan}13${reset}) pi ${dim}(~/.pi/agent)${reset}
|
||||
${cyan}14${reset}) Qwen Code ${dim}(~/.qwen)${reset}
|
||||
${cyan}15${reset}) Trae ${dim}(~/.trae)${reset}
|
||||
${cyan}16${reset}) Windsurf ${dim}(~/.codeium/windsurf)${reset}
|
||||
${cyan}17${reset}) ZCode ${dim}(~/.zcode)${reset}
|
||||
${cyan}18${reset}) All
|
||||
${cyan}11${reset}) Kimi Code ${dim}(~/.kimi-code)${reset}
|
||||
${cyan}12${reset}) Kilo ${dim}(~/.config/kilo)${reset}
|
||||
${cyan}13${reset}) OpenCode ${dim}(~/.config/opencode)${reset}
|
||||
${cyan}14${reset}) pi ${dim}(~/.pi/agent)${reset}
|
||||
${cyan}15${reset}) Qwen Code ${dim}(~/.qwen)${reset}
|
||||
${cyan}16${reset}) Trae ${dim}(~/.trae)${reset}
|
||||
${cyan}17${reset}) Windsurf ${dim}(~/.codeium/windsurf)${reset}
|
||||
${cyan}18${reset}) ZCode ${dim}(~/.zcode)${reset}
|
||||
${cyan}19${reset}) All
|
||||
|
||||
${dim}Select multiple: 1,2,6 or 1 2 6${reset}
|
||||
`;
|
||||
@@ -12435,7 +12438,7 @@ function buildRuntimePromptText() {
|
||||
* Pure function — exported so tests can verify split/dedupe/fallback behavior.
|
||||
* - Accepts comma- and/or whitespace-separated choices
|
||||
* - Deduplicates while preserving order
|
||||
* - Maps option 16 ("All") to every runtime
|
||||
* - Maps option 19 ("All") to every runtime
|
||||
* - Falls back to ['claude'] when nothing valid is selected
|
||||
*/
|
||||
function parseRuntimeInput(answer) {
|
||||
|
||||
76
capabilities/kimi-code/capability.json
Normal file
76
capabilities/kimi-code/capability.json
Normal file
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"id": "kimi-code",
|
||||
"role": "runtime",
|
||||
"version": "1.8.0",
|
||||
"title": "Kimi Code CLI",
|
||||
"description": "Kimi Code CLI (Moonshot AI, Node) — Agent Skills auto-discovered at ~/.kimi-code/skills; global AGENTS.md at ~/.kimi-code/AGENTS.md; native config.toml + [[hooks]] bus; three built-in subagents (coder/explore/plan), NO custom named subagents; background dispatch; tier-2 support. Distinct from Python kimi-cli (the 'kimi' capability) per ADR-1239 EoS — Kimi Code cannot dispatch named subagents so the kimi-agents YAML layout does NOT apply; persona injection rides the existing ${AGENT_SKILLS_*} workflow fallback. Install-layout, agent-install-check, and install-time decision (kimi vs kimi-code) land in follow-up PRs; this descriptor is the EoS foundation.",
|
||||
"tier": "core",
|
||||
"requires": [],
|
||||
"engines": {
|
||||
"gsd": ">=1.7.0"
|
||||
},
|
||||
"runtime": {
|
||||
"configHome": {
|
||||
"kind": "dot-home",
|
||||
"name": ".kimi-code",
|
||||
"env": [
|
||||
"KIMI_CODE_HOME"
|
||||
],
|
||||
"probe": [
|
||||
"~/.kimi-code"
|
||||
],
|
||||
"probeExists": "config.toml"
|
||||
},
|
||||
"localConfigDir": ".kimi-code",
|
||||
"configFormat": "none",
|
||||
"artifactLayout": {
|
||||
"global": [],
|
||||
"local": []
|
||||
},
|
||||
"commandStyle": "slash-hyphen",
|
||||
"hooksSurface": "kimi-hooks-toml",
|
||||
"hookEvents": "claude",
|
||||
"sandboxTier": "none",
|
||||
"supportTier": 2,
|
||||
"installSurface": "profile-marker-only",
|
||||
"writesSharedSettings": false,
|
||||
"permissionWriter": null,
|
||||
"extendedHookEvents": [
|
||||
"SubagentStop",
|
||||
"Stop",
|
||||
"PreCompact",
|
||||
"SubagentStart"
|
||||
],
|
||||
"hostIntegration": {
|
||||
"embeddingMode": "imperative",
|
||||
"commandSurface": "slash-file",
|
||||
"dispatch": {
|
||||
"namedDispatch": false,
|
||||
"nested": false,
|
||||
"maxDepth": 1,
|
||||
"background": true,
|
||||
"subagentToolkit": "undocumented",
|
||||
"backgroundDispatch": true,
|
||||
"builtInSubagents": [
|
||||
"coder",
|
||||
"explore",
|
||||
"plan"
|
||||
]
|
||||
},
|
||||
"modelMode": "passive",
|
||||
"hookBus": "host",
|
||||
"stateIO": "filesystem",
|
||||
"transport": "mcp",
|
||||
"runtime": "node"
|
||||
},
|
||||
"hostBehaviors": {
|
||||
"reapplyCommand": "/skill:gsd-update --reapply",
|
||||
"localInstallDeferred": true,
|
||||
"verificationStyle": "kimi-code",
|
||||
"agentManifestStyle": "none",
|
||||
"doneBannerStyle": "kimi-code",
|
||||
"skipSharedHooksInstall": true,
|
||||
"namedSubagentsSupported": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -73,7 +73,7 @@ points.
|
||||
| `tdd` | feature | full | `>=1.6.0` | `plan:pre`, `execute:post` | contribution, gate | first-party |
|
||||
| `ui` | feature | full | `>=1.6.0` | `plan:pre`, `execute:wave:post`, `verify:post` | step, gate | first-party |
|
||||
|
||||
### Runtime capabilities (role: runtime) — 18
|
||||
### Runtime capabilities (role: runtime) — 19
|
||||
|
||||
Runtime capabilities adapt GSD to a specific AI runtime or IDE — emitting
|
||||
skills, agents, hooks configuration, and surface files for that host. They
|
||||
@@ -93,6 +93,7 @@ emission), so their extension-point and hook-kind cells are `—`.
|
||||
| `hermes` | runtime | core | `>=1.6.0` | — | — | first-party |
|
||||
| `kilo` | runtime | core | `>=1.6.0` | — | — | first-party |
|
||||
| `kimi` | runtime | core | `>=1.6.0` | — | — | first-party |
|
||||
| `kimi-code` | runtime | core | `>=1.7.0` | — | — | first-party |
|
||||
| `opencode` | runtime | core | `>=1.6.0` | — | — | first-party |
|
||||
| `pi` | runtime | core | `>=1.7.0` | — | — | first-party |
|
||||
| `qwen` | runtime | core | `>=1.6.0` | — | — | first-party |
|
||||
|
||||
@@ -1752,6 +1752,82 @@ const capabilities = {
|
||||
}
|
||||
}
|
||||
},
|
||||
"kimi-code": {
|
||||
"id": "kimi-code",
|
||||
"role": "runtime",
|
||||
"version": "1.8.0",
|
||||
"title": "Kimi Code CLI",
|
||||
"description": "Kimi Code CLI (Moonshot AI, Node) — Agent Skills auto-discovered at ~/.kimi-code/skills; global AGENTS.md at ~/.kimi-code/AGENTS.md; native config.toml + [[hooks]] bus; three built-in subagents (coder/explore/plan), NO custom named subagents; background dispatch; tier-2 support. Distinct from Python kimi-cli (the 'kimi' capability) per ADR-1239 EoS — Kimi Code cannot dispatch named subagents so the kimi-agents YAML layout does NOT apply; persona injection rides the existing ${AGENT_SKILLS_*} workflow fallback. Install-layout, agent-install-check, and install-time decision (kimi vs kimi-code) land in follow-up PRs; this descriptor is the EoS foundation.",
|
||||
"tier": "core",
|
||||
"requires": [],
|
||||
"engines": {
|
||||
"gsd": ">=1.7.0"
|
||||
},
|
||||
"runtime": {
|
||||
"configHome": {
|
||||
"kind": "dot-home",
|
||||
"name": ".kimi-code",
|
||||
"env": [
|
||||
"KIMI_CODE_HOME"
|
||||
],
|
||||
"probe": [
|
||||
"~/.kimi-code"
|
||||
],
|
||||
"probeExists": "config.toml"
|
||||
},
|
||||
"localConfigDir": ".kimi-code",
|
||||
"configFormat": "none",
|
||||
"artifactLayout": {
|
||||
"global": [],
|
||||
"local": []
|
||||
},
|
||||
"commandStyle": "slash-hyphen",
|
||||
"hooksSurface": "kimi-hooks-toml",
|
||||
"hookEvents": "claude",
|
||||
"sandboxTier": "none",
|
||||
"supportTier": 2,
|
||||
"installSurface": "profile-marker-only",
|
||||
"writesSharedSettings": false,
|
||||
"permissionWriter": null,
|
||||
"extendedHookEvents": [
|
||||
"SubagentStop",
|
||||
"Stop",
|
||||
"PreCompact",
|
||||
"SubagentStart"
|
||||
],
|
||||
"hostIntegration": {
|
||||
"embeddingMode": "imperative",
|
||||
"commandSurface": "slash-file",
|
||||
"dispatch": {
|
||||
"namedDispatch": false,
|
||||
"nested": false,
|
||||
"maxDepth": 1,
|
||||
"background": true,
|
||||
"subagentToolkit": "undocumented",
|
||||
"backgroundDispatch": true,
|
||||
"builtInSubagents": [
|
||||
"coder",
|
||||
"explore",
|
||||
"plan"
|
||||
]
|
||||
},
|
||||
"modelMode": "passive",
|
||||
"hookBus": "host",
|
||||
"stateIO": "filesystem",
|
||||
"transport": "mcp",
|
||||
"runtime": "node"
|
||||
},
|
||||
"hostBehaviors": {
|
||||
"reapplyCommand": "/skill:gsd-update --reapply",
|
||||
"localInstallDeferred": true,
|
||||
"verificationStyle": "kimi-code",
|
||||
"agentManifestStyle": "none",
|
||||
"doneBannerStyle": "kimi-code",
|
||||
"skipSharedHooksInstall": true,
|
||||
"namedSubagentsSupported": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"mempalace": {
|
||||
"id": "mempalace",
|
||||
"role": "feature",
|
||||
@@ -5077,6 +5153,82 @@ const runtimes = {
|
||||
}
|
||||
}
|
||||
},
|
||||
"kimi-code": {
|
||||
"id": "kimi-code",
|
||||
"role": "runtime",
|
||||
"version": "1.8.0",
|
||||
"title": "Kimi Code CLI",
|
||||
"description": "Kimi Code CLI (Moonshot AI, Node) — Agent Skills auto-discovered at ~/.kimi-code/skills; global AGENTS.md at ~/.kimi-code/AGENTS.md; native config.toml + [[hooks]] bus; three built-in subagents (coder/explore/plan), NO custom named subagents; background dispatch; tier-2 support. Distinct from Python kimi-cli (the 'kimi' capability) per ADR-1239 EoS — Kimi Code cannot dispatch named subagents so the kimi-agents YAML layout does NOT apply; persona injection rides the existing ${AGENT_SKILLS_*} workflow fallback. Install-layout, agent-install-check, and install-time decision (kimi vs kimi-code) land in follow-up PRs; this descriptor is the EoS foundation.",
|
||||
"tier": "core",
|
||||
"requires": [],
|
||||
"engines": {
|
||||
"gsd": ">=1.7.0"
|
||||
},
|
||||
"runtime": {
|
||||
"configHome": {
|
||||
"kind": "dot-home",
|
||||
"name": ".kimi-code",
|
||||
"env": [
|
||||
"KIMI_CODE_HOME"
|
||||
],
|
||||
"probe": [
|
||||
"~/.kimi-code"
|
||||
],
|
||||
"probeExists": "config.toml"
|
||||
},
|
||||
"localConfigDir": ".kimi-code",
|
||||
"configFormat": "none",
|
||||
"artifactLayout": {
|
||||
"global": [],
|
||||
"local": []
|
||||
},
|
||||
"commandStyle": "slash-hyphen",
|
||||
"hooksSurface": "kimi-hooks-toml",
|
||||
"hookEvents": "claude",
|
||||
"sandboxTier": "none",
|
||||
"supportTier": 2,
|
||||
"installSurface": "profile-marker-only",
|
||||
"writesSharedSettings": false,
|
||||
"permissionWriter": null,
|
||||
"extendedHookEvents": [
|
||||
"SubagentStop",
|
||||
"Stop",
|
||||
"PreCompact",
|
||||
"SubagentStart"
|
||||
],
|
||||
"hostIntegration": {
|
||||
"embeddingMode": "imperative",
|
||||
"commandSurface": "slash-file",
|
||||
"dispatch": {
|
||||
"namedDispatch": false,
|
||||
"nested": false,
|
||||
"maxDepth": 1,
|
||||
"background": true,
|
||||
"subagentToolkit": "undocumented",
|
||||
"backgroundDispatch": true,
|
||||
"builtInSubagents": [
|
||||
"coder",
|
||||
"explore",
|
||||
"plan"
|
||||
]
|
||||
},
|
||||
"modelMode": "passive",
|
||||
"hookBus": "host",
|
||||
"stateIO": "filesystem",
|
||||
"transport": "mcp",
|
||||
"runtime": "node"
|
||||
},
|
||||
"hostBehaviors": {
|
||||
"reapplyCommand": "/skill:gsd-update --reapply",
|
||||
"localInstallDeferred": true,
|
||||
"verificationStyle": "kimi-code",
|
||||
"agentManifestStyle": "none",
|
||||
"doneBannerStyle": "kimi-code",
|
||||
"skipSharedHooksInstall": true,
|
||||
"namedSubagentsSupported": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"opencode": {
|
||||
"id": "opencode",
|
||||
"role": "runtime",
|
||||
@@ -5859,6 +6011,7 @@ const _requiresGraph = {
|
||||
"intel": [],
|
||||
"kilo": [],
|
||||
"kimi": [],
|
||||
"kimi-code": [],
|
||||
"mempalace": [],
|
||||
"nyquist": [],
|
||||
"opencode": [],
|
||||
|
||||
@@ -52,6 +52,11 @@
|
||||
"sonnet": null,
|
||||
"haiku": null
|
||||
},
|
||||
"kimi-code": {
|
||||
"opus": null,
|
||||
"sonnet": null,
|
||||
"haiku": null
|
||||
},
|
||||
"cursor": {
|
||||
"opus": null,
|
||||
"sonnet": null,
|
||||
|
||||
@@ -63,6 +63,11 @@
|
||||
"kimi": [
|
||||
"kimi"
|
||||
],
|
||||
"kimi-code": [
|
||||
"kimi-code",
|
||||
"kimicode",
|
||||
"kimi_code"
|
||||
],
|
||||
"codebuddy": [
|
||||
"codebuddy",
|
||||
"codebuddy-cli"
|
||||
|
||||
@@ -28,6 +28,7 @@ const FALLBACK_ALIASES: Readonly<Record<string, string[]>> = {
|
||||
qwen: ['qwen', 'qwen-code', 'qwen-cli'],
|
||||
hermes: ['hermes', 'hermes-agent', 'hermes-cli'],
|
||||
kimi: ['kimi'],
|
||||
'kimi-code': ['kimi-code', 'kimicode', 'kimi_code'],
|
||||
codebuddy: ['codebuddy', 'codebuddy-cli'],
|
||||
cline: ['cline', 'cline-cli'],
|
||||
};
|
||||
@@ -236,6 +237,7 @@ const RUNTIME_LABELS: Readonly<Record<string, string>> = {
|
||||
qwen: 'Qwen Code',
|
||||
hermes: 'Hermes Agent',
|
||||
kimi: 'Kimi CLI',
|
||||
'kimi-code': 'Kimi Code',
|
||||
codebuddy: 'CodeBuddy',
|
||||
cline: 'Cline',
|
||||
zcode: 'ZCode',
|
||||
@@ -292,6 +294,7 @@ const GLOBAL_CONFIG_HOME_FRAGMENTS: Readonly<Record<string, string>> = {
|
||||
codebuddy: "'.codebuddy'",
|
||||
cline: "'.cline'",
|
||||
kimi: "'.config', 'agents'",
|
||||
'kimi-code': "'.kimi-code'",
|
||||
zcode: "'.zcode'",
|
||||
// pi's global config home is ~/.pi/agent (configHome: dot-home-nested,
|
||||
// parent '.pi', name 'agent' — capabilities/pi/capability.json), matching
|
||||
@@ -327,9 +330,20 @@ export function getGlobalConfigHomeFragment(runtime: string): string {
|
||||
// folds the shared-hooks-install skip).
|
||||
const RUNTIME_FLAG_IDS = Object.freeze([
|
||||
'opencode', 'kilo', 'codex', 'copilot', 'antigravity', 'cursor',
|
||||
'windsurf', 'augment', 'trae', 'qwen', 'hermes', 'codebuddy', 'cline', 'kimi', 'zcode', 'pi',
|
||||
'windsurf', 'augment', 'trae', 'qwen', 'hermes', 'codebuddy', 'cline', 'kimi', 'kimi-code', 'zcode', 'pi',
|
||||
] as const);
|
||||
|
||||
/**
|
||||
* Convert a runtime id (kebab-case, e.g. 'kimi-code') to its `is<Foo>` flag
|
||||
* name in PascalCase (e.g. 'isKimiCode'). The first letter is capitalised and
|
||||
* every `-[a-z]` boundary is folded to its uppercase twin. Single-word ids
|
||||
* (the prior 16: opencode, kilo, codex, …) are unaffected — only hyphenated
|
||||
* ids like 'kimi-code' (#2454) hit the folding branch.
|
||||
*/
|
||||
function runtimeIdToFlagName(id: string): string {
|
||||
return 'is' + id.charAt(0).toUpperCase() + id.slice(1).replace(/-([a-z])/g, (_m, c: string) => c.toUpperCase());
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a frozen map of `is<Runtime>` boolean predicates for the given runtime
|
||||
* id (e.g. `flags.isOpencode`). Collapses the four duplicated `const isX =
|
||||
@@ -340,7 +354,7 @@ const RUNTIME_FLAG_IDS = Object.freeze([
|
||||
export function runtimeFlags(runtime: string): Readonly<Record<string, boolean>> {
|
||||
const flags: Record<string, boolean> = {};
|
||||
for (const id of RUNTIME_FLAG_IDS) {
|
||||
flags['is' + id.charAt(0).toUpperCase() + id.slice(1)] = runtime === id;
|
||||
flags[runtimeIdToFlagName(id)] = runtime === id;
|
||||
}
|
||||
return Object.freeze(flags);
|
||||
}
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "8bc541aabc2e143c",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -114,8 +114,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -113,8 +113,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -46,8 +46,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -114,8 +114,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -149,8 +149,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -44,8 +44,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "10226e9512dd44bf",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -114,8 +114,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -114,8 +114,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
439
tests/fixtures/golden-install-parity/kimi-code.json
vendored
Normal file
439
tests/fixtures/golden-install-parity/kimi-code.json
vendored
Normal file
@@ -0,0 +1,439 @@
|
||||
{
|
||||
".gsd-profile": "0e716a5fef4e6dc1",
|
||||
".gsd/defaults.json": "69d7d1cb64e02085",
|
||||
".kimi/hooks/gsd-check-update-worker.js": "6593f80914f4edee",
|
||||
".kimi/hooks/gsd-check-update.js": "0f8b9e967af103fb",
|
||||
".kimi/hooks/gsd-config-reload.js": "96546e0e8bb47904",
|
||||
".kimi/hooks/gsd-context-monitor.js": "4c0535bc269e130e",
|
||||
".kimi/hooks/gsd-cursor-post-tool.js": "9168e0a09de1972a",
|
||||
".kimi/hooks/gsd-cursor-pre-tool.js": "873998b25e308c29",
|
||||
".kimi/hooks/gsd-cursor-session-start.js": "9b2e6f4f0c405375",
|
||||
".kimi/hooks/gsd-cursor-stop.js": "bfaaf60f419e3238",
|
||||
".kimi/hooks/gsd-cursor-subagent-start.js": "06d77fde5c1372b6",
|
||||
".kimi/hooks/gsd-cursor-subagent-stop.js": "4bbf22917da4d389",
|
||||
".kimi/hooks/gsd-ensure-canonical-path.js": "353a5d7bf6697acb",
|
||||
".kimi/hooks/gsd-graphify-update.sh": "81d716df76159e60",
|
||||
".kimi/hooks/gsd-phase-boundary.sh": "4f3daad099fcdd50",
|
||||
".kimi/hooks/gsd-prompt-guard.js": "696a0f65b9535cd1",
|
||||
".kimi/hooks/gsd-read-guard.js": "54e1dcaaffe47693",
|
||||
".kimi/hooks/gsd-read-injection-scanner.js": "c97a8a46a07058b2",
|
||||
".kimi/hooks/gsd-session-state.sh": "e54379ba86bf1b6d",
|
||||
".kimi/hooks/gsd-statusline.js": "9a92a1986182921a",
|
||||
".kimi/hooks/gsd-update-banner.js": "55143a25f978f301",
|
||||
".kimi/hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
|
||||
".kimi/hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
|
||||
".kimi/hooks/gsd-windsurf-pre-write.js": "92d4dbfbc36ab0cf",
|
||||
".kimi/hooks/gsd-workflow-guard.js": "d0cea21bc596fd27",
|
||||
".kimi/hooks/gsd-worktree-path-guard.js": "b49b03fa9de7df3b",
|
||||
".kimi/hooks/lib/git-cmd.js": "268ba15992ca0b23",
|
||||
".kimi/hooks/lib/gsd-graphify-rebuild.sh": "66af89601074d2a9",
|
||||
".kimi/hooks/managed-hooks-registry.cjs": "08ec2585a3f8f132",
|
||||
".kimi/package.json": "dbf8353f77358bc1",
|
||||
"agents/gsd-advisor-researcher.md": "f1c4a47d3d8cea72",
|
||||
"agents/gsd-ai-researcher.md": "2f2da4b89d445860",
|
||||
"agents/gsd-assumptions-analyzer.md": "f11a80795163bb5d",
|
||||
"agents/gsd-code-fixer.md": "78549833f0411b0c",
|
||||
"agents/gsd-code-reviewer.md": "7d94fe8bfa6661aa",
|
||||
"agents/gsd-codebase-mapper.md": "7cc9d387f29c46e1",
|
||||
"agents/gsd-debug-session-manager.md": "dc4e8a556dbf1708",
|
||||
"agents/gsd-debugger.md": "7840ed78e3f662a8",
|
||||
"agents/gsd-doc-classifier.md": "146acf4d176134b5",
|
||||
"agents/gsd-doc-synthesizer.md": "b1f5e2eb28fa3659",
|
||||
"agents/gsd-doc-verifier.md": "7ed4d9611f678a95",
|
||||
"agents/gsd-doc-writer.md": "3ed3dc255d7eca8d",
|
||||
"agents/gsd-domain-researcher.md": "049f588663814fa2",
|
||||
"agents/gsd-eval-auditor.md": "54870d3b07433525",
|
||||
"agents/gsd-eval-planner.md": "552e9fa164c51ce8",
|
||||
"agents/gsd-executor.md": "1154cdd7b22f9754",
|
||||
"agents/gsd-framework-selector.md": "8a795f230436ad2e",
|
||||
"agents/gsd-integration-checker.md": "c1760a0bbd4f7bf5",
|
||||
"agents/gsd-intel-updater.md": "944f1d903e2e9e09",
|
||||
"agents/gsd-mempalace-curator.md": "399e90e473b33814",
|
||||
"agents/gsd-nyquist-auditor.md": "f2232a1be0835709",
|
||||
"agents/gsd-pattern-mapper.md": "68ecefd60811a669",
|
||||
"agents/gsd-phase-researcher.md": "2235f61764d8e969",
|
||||
"agents/gsd-plan-checker.md": "bb38f345d3d41edc",
|
||||
"agents/gsd-planner.md": "4b7405292d3866ad",
|
||||
"agents/gsd-project-researcher.md": "f572892f138734ff",
|
||||
"agents/gsd-research-synthesizer.md": "29949bf3f049a8f1",
|
||||
"agents/gsd-roadmapper.md": "840ac933e3b094f9",
|
||||
"agents/gsd-security-auditor.md": "4b86fa11ebda981e",
|
||||
"agents/gsd-ui-auditor.md": "76f446c50edf81f8",
|
||||
"agents/gsd-ui-checker.md": "15949ccab982b71c",
|
||||
"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",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "9ad2ecce8b087676",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
"gsd-core/contexts/review.md": "dc578fdd74bbea11",
|
||||
"gsd-core/references/agent-contracts.md": "ff65e633c656c0d2",
|
||||
"gsd-core/references/agent-skills-bootstrap.md": "5ab875054b1adda9",
|
||||
"gsd-core/references/ai-evals.md": "b5afa786b938671e",
|
||||
"gsd-core/references/ai-frameworks.md": "f827de93dde124eb",
|
||||
"gsd-core/references/api-coverage.md": "913654a1cdb3baf1",
|
||||
"gsd-core/references/artifact-types.md": "a6d2e1f9453ffbf5",
|
||||
"gsd-core/references/autonomous-smart-discuss.md": "2fc710cde0ec7785",
|
||||
"gsd-core/references/checkpoints.md": "c2fe89c42ca88349",
|
||||
"gsd-core/references/common-bug-patterns.md": "a4cfea8954dede29",
|
||||
"gsd-core/references/context-budget.md": "f1ce57bf418824af",
|
||||
"gsd-core/references/continuation-format.md": "ce73e57d053ab8a7",
|
||||
"gsd-core/references/debugger-bug-taxonomy.md": "78fb8c1711acc971",
|
||||
"gsd-core/references/debugger-fix-acceptance.md": "5616622f33e00436",
|
||||
"gsd-core/references/debugger-philosophy.md": "16f0cb55eb457f33",
|
||||
"gsd-core/references/debugger-prevention.md": "74b6c5556a428efd",
|
||||
"gsd-core/references/debugger-rca-branching.md": "7dcf3ddbe3591250",
|
||||
"gsd-core/references/debugger-repro-hardening.md": "fdf55a6cee9b1792",
|
||||
"gsd-core/references/debugger-sbfl.md": "a7d0cd5940d6d2cd",
|
||||
"gsd-core/references/debugger-semantic-recall.md": "4add324d495cb25c",
|
||||
"gsd-core/references/decimal-phase-calculation.md": "46b5ba045852c474",
|
||||
"gsd-core/references/doc-conflict-engine.md": "67d019d23e17f934",
|
||||
"gsd-core/references/domain-probes.md": "62d23ed1992c48a9",
|
||||
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json": "72d1e29cedc854ec",
|
||||
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json": "fbc1b355d8625eeb",
|
||||
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json": "fad67dcc8294f6da",
|
||||
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json": "30a78ee9ce3473ea",
|
||||
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json": "66dd60957fee45f0",
|
||||
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json": "47fca61f076835fa",
|
||||
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json": "72d1e29cedc854ec",
|
||||
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json": "80f04f5c04fb24cf",
|
||||
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json": "fad67dcc8294f6da",
|
||||
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json": "d38147adb0e5b342",
|
||||
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json": "bc552c01939bf4f8",
|
||||
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json": "30a78ee9ce3473ea",
|
||||
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json": "688ec62c13e08afe",
|
||||
"gsd-core/references/edge-probe.md": "5687eba25a078561",
|
||||
"gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc",
|
||||
"gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e",
|
||||
"gsd-core/references/execute-phase-context-guard.md": "982006c1f3364242",
|
||||
"gsd-core/references/execute-phase-quota-recovery.md": "c4ca0ee3875b6e02",
|
||||
"gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2",
|
||||
"gsd-core/references/execute-phase-response-language.md": "c240dc476dd15df5",
|
||||
"gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8",
|
||||
"gsd-core/references/executor-examples.md": "ba59243ed45c8ab1",
|
||||
"gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4",
|
||||
"gsd-core/references/few-shot-examples/verifier.md": "5badee4560b14ae8",
|
||||
"gsd-core/references/gate-prompts.md": "e69f5993ab944d80",
|
||||
"gsd-core/references/gates.md": "bd79c7f90c8cb8d7",
|
||||
"gsd-core/references/git-integration.md": "77bf9dff38b2c9d4",
|
||||
"gsd-core/references/git-planning-commit.md": "f897a15ebfc3f5a7",
|
||||
"gsd-core/references/gsd-run-resolver.md": "e71eb728b84641b1",
|
||||
"gsd-core/references/honest-verifier.md": "8815c9fc18c35719",
|
||||
"gsd-core/references/ios-scaffold.md": "5ef0cb7e0fac891f",
|
||||
"gsd-core/references/loop-hook-dispatch.md": "32e5dfb4dba76987",
|
||||
"gsd-core/references/mandatory-initial-read.md": "fe59abce693717cf",
|
||||
"gsd-core/references/model-profile-resolution.md": "f32bb05102839767",
|
||||
"gsd-core/references/model-profiles.md": "e067ad3df6770db1",
|
||||
"gsd-core/references/mvp-concepts.md": "72f7e8b1f8ae7118",
|
||||
"gsd-core/references/phase-argument-parsing.md": "e5bbb985f3bc3e34",
|
||||
"gsd-core/references/planner-antipatterns.md": "013ad54062399dad",
|
||||
"gsd-core/references/planner-chunked.md": "79fe674221e738e6",
|
||||
"gsd-core/references/planner-gap-closure.md": "76bee257911413e7",
|
||||
"gsd-core/references/planner-graphify-auto-update.md": "6aeffd9097e25e22",
|
||||
"gsd-core/references/planner-guidance.md": "96486cac2f7885e6",
|
||||
"gsd-core/references/planner-human-verify-mode.md": "56d05e841630b3f4",
|
||||
"gsd-core/references/planner-interface-context.md": "b28fa3da6ae739a8",
|
||||
"gsd-core/references/planner-load-graph-context.md": "ca7a7af3f35ae61b",
|
||||
"gsd-core/references/planner-mvp-mode.md": "cfd535c9c545e73e",
|
||||
"gsd-core/references/planner-preconditions.md": "4511829607ec9107",
|
||||
"gsd-core/references/planner-reversibility.md": "d75786c2d3e6ff5c",
|
||||
"gsd-core/references/planner-reviews.md": "dda0193a0fbd4947",
|
||||
"gsd-core/references/planner-revision.md": "86ba8a511f081f05",
|
||||
"gsd-core/references/planner-source-audit.md": "7de5bdb07232ce0b",
|
||||
"gsd-core/references/planning-config.md": "ac409835e8260a3e",
|
||||
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json": "f10df472f2846cc6",
|
||||
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json": "31e8a781eeffe020",
|
||||
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json": "70a532a7cc1b6ae8",
|
||||
"gsd-core/references/prohibition-probe.md": "605dc3f5a118ff3b",
|
||||
"gsd-core/references/project-skills-discovery.md": "c155e03dce8dc3c2",
|
||||
"gsd-core/references/questioning.md": "a8c988cab05f4651",
|
||||
"gsd-core/references/research-documentation-lookup.md": "c070007d1d72ab71",
|
||||
"gsd-core/references/research-philosophy.md": "62930e66cc979c1a",
|
||||
"gsd-core/references/research-verification-protocol.md": "9c38c9d9a687e679",
|
||||
"gsd-core/references/reviewer-instances.md": "ae64e44f2f132bc2",
|
||||
"gsd-core/references/revision-loop.md": "e55ff32dd98c63df",
|
||||
"gsd-core/references/scout-codebase.md": "ba266ecc18fbf172",
|
||||
"gsd-core/references/security-asvs-levels.md": "4774fac3b94b6ca8",
|
||||
"gsd-core/references/skeleton-template.md": "f11e9cd2948bd33c",
|
||||
"gsd-core/references/sketch-interactivity.md": "7d982fe877e1e1cc",
|
||||
"gsd-core/references/sketch-theme-system.md": "33e2e96e450456f8",
|
||||
"gsd-core/references/sketch-tooling.md": "df6c4f24c1c27611",
|
||||
"gsd-core/references/sketch-variant-patterns.md": "66c197aa4fb52810",
|
||||
"gsd-core/references/specless-probe-fallback.md": "5e400dc05a15e972",
|
||||
"gsd-core/references/spidr-splitting.md": "074ac154c0e4f906",
|
||||
"gsd-core/references/tdd.md": "e4708ede157478b6",
|
||||
"gsd-core/references/thinking-models-debug.md": "2da61022b16c4e7c",
|
||||
"gsd-core/references/thinking-models-execution.md": "dcc650a8b5f3e049",
|
||||
"gsd-core/references/thinking-models-planning.md": "ef519bff8c8bd572",
|
||||
"gsd-core/references/thinking-models-research.md": "5f6bf3f3b889c6e4",
|
||||
"gsd-core/references/thinking-models-verification.md": "a71a933d51ca3d8d",
|
||||
"gsd-core/references/thinking-partner.md": "41069529ef776e39",
|
||||
"gsd-core/references/ui-brand.md": "48717bcfcd63bd27",
|
||||
"gsd-core/references/ui-consideration-probe.md": "7e019dfaae47f4c4",
|
||||
"gsd-core/references/universal-anti-patterns.md": "6a1245050b21df01",
|
||||
"gsd-core/references/untrusted-input-boundary.md": "d33b80d4d348599a",
|
||||
"gsd-core/references/user-profiling.md": "b50416fe57c1b321",
|
||||
"gsd-core/references/user-story-template.md": "0cc50e06a144ff8a",
|
||||
"gsd-core/references/verification-overrides.md": "8213de9bd62283b6",
|
||||
"gsd-core/references/verification-patterns.md": "72f4d4814fdae9a8",
|
||||
"gsd-core/references/verify-mvp-mode.md": "534bdc7f2432903a",
|
||||
"gsd-core/references/workstream-flag.md": "ca99ca79e716f0f5",
|
||||
"gsd-core/references/worktree-branch-check.md": "21d9c31bf6542b93",
|
||||
"gsd-core/references/worktree-path-safety.md": "3c8d74756f9b16a8",
|
||||
"gsd-core/templates/AI-SPEC.md": "efa1f8354bd3a24b",
|
||||
"gsd-core/templates/DEBUG.md": "c8768312f4c1e438",
|
||||
"gsd-core/templates/README.md": "93d3426fc64e2c12",
|
||||
"gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f",
|
||||
"gsd-core/templates/UAT.md": "9e296471b97ebcec",
|
||||
"gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec",
|
||||
"gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1",
|
||||
"gsd-core/templates/claude-md.md": "d1d333e4b963c0d2",
|
||||
"gsd-core/templates/codebase/architecture.md": "6be88214162fdd89",
|
||||
"gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25",
|
||||
"gsd-core/templates/codebase/conventions.md": "c2e07698dad6b364",
|
||||
"gsd-core/templates/codebase/integrations.md": "39bd23c71eedd564",
|
||||
"gsd-core/templates/codebase/stack.md": "116e7e67dd87ddec",
|
||||
"gsd-core/templates/codebase/structure.md": "222997133232a6f5",
|
||||
"gsd-core/templates/codebase/testing.md": "76abff7f2050c9ea",
|
||||
"gsd-core/templates/config.json": "a4b783ef759a0f37",
|
||||
"gsd-core/templates/context.md": "69b01e7909ea3f66",
|
||||
"gsd-core/templates/continue-here.md": "f522a51b6895fba8",
|
||||
"gsd-core/templates/copilot-instructions.md": "aea34bc52ff548ea",
|
||||
"gsd-core/templates/debug-subagent-prompt.md": "920656683dedb869",
|
||||
"gsd-core/templates/dev-preferences.md": "88d0a65ec0993a3a",
|
||||
"gsd-core/templates/discovery.md": "9a0e0935cc825dbc",
|
||||
"gsd-core/templates/discussion-log.md": "cac1b48ec0f4dcb8",
|
||||
"gsd-core/templates/milestone-archive.md": "591b6decdc0c0e51",
|
||||
"gsd-core/templates/milestone.md": "74d2f750ae9f4a9c",
|
||||
"gsd-core/templates/phase-prompt.md": "b811bf951092df2f",
|
||||
"gsd-core/templates/planner-subagent-prompt.md": "ebf29dbb27042370",
|
||||
"gsd-core/templates/project.md": "4f311fb1b05b823b",
|
||||
"gsd-core/templates/requirements.md": "a44de4c2f146e473",
|
||||
"gsd-core/templates/research-project/ARCHITECTURE.md": "746b9ef791d758b0",
|
||||
"gsd-core/templates/research-project/FEATURES.md": "f2b800de5df91b0f",
|
||||
"gsd-core/templates/research-project/PITFALLS.md": "3ef75fa768422eec",
|
||||
"gsd-core/templates/research-project/STACK.md": "82c85799ac4dd344",
|
||||
"gsd-core/templates/research-project/SUMMARY.md": "dceb2f346388839d",
|
||||
"gsd-core/templates/research.md": "88ce0920417091d0",
|
||||
"gsd-core/templates/retrospective.md": "03981e30dd760103",
|
||||
"gsd-core/templates/roadmap.md": "e4e35a9eb5dd4d4f",
|
||||
"gsd-core/templates/spec.md": "26d55bce940f0288",
|
||||
"gsd-core/templates/state.md": "4d123aa6cea167fe",
|
||||
"gsd-core/templates/summary-complex.md": "a5e40574fd8894dc",
|
||||
"gsd-core/templates/summary-minimal.md": "7d09b5e709e2e67c",
|
||||
"gsd-core/templates/summary-standard.md": "e8d9cf4a8377cdff",
|
||||
"gsd-core/templates/summary.md": "23c40f6503b3ea98",
|
||||
"gsd-core/templates/user-profile.md": "20749f23e4c413fc",
|
||||
"gsd-core/templates/user-setup.md": "78b7d718b6e8d67c",
|
||||
"gsd-core/templates/verification-report.md": "dd5faa6254183731",
|
||||
"gsd-core/workflows/_runtime-launcher.snippet.sh": "bf2dd5d1debd5335",
|
||||
"gsd-core/workflows/add-backlog.md": "1bc7377b105194fc",
|
||||
"gsd-core/workflows/add-phase.md": "ac43883e2d8e34d8",
|
||||
"gsd-core/workflows/add-tests.md": "7e7268602f9e1b2a",
|
||||
"gsd-core/workflows/add-todo.md": "5dc04cfaa0b6b072",
|
||||
"gsd-core/workflows/ai-integration-phase.md": "0d6d7183ae189fbe",
|
||||
"gsd-core/workflows/analyze-dependencies.md": "52942af10f140717",
|
||||
"gsd-core/workflows/audit-fix.md": "d511f4094ce351aa",
|
||||
"gsd-core/workflows/audit-milestone.md": "3835762c3147a927",
|
||||
"gsd-core/workflows/audit-uat.md": "fcfbec501620b564",
|
||||
"gsd-core/workflows/autonomous.md": "7e5683728ef33707",
|
||||
"gsd-core/workflows/check-todos.md": "f39e3251a78f6f5a",
|
||||
"gsd-core/workflows/cleanup.md": "df79d1dc7b84d736",
|
||||
"gsd-core/workflows/code-review-fix.md": "2e113d1f4350a075",
|
||||
"gsd-core/workflows/code-review.md": "c877ad812b4a511e",
|
||||
"gsd-core/workflows/complete-milestone.md": "8f98d7b05793cf4a",
|
||||
"gsd-core/workflows/debug.md": "a2d04237fbbce72b",
|
||||
"gsd-core/workflows/diagnose-issues.md": "c92d189ccd2122cd",
|
||||
"gsd-core/workflows/discovery-phase.md": "0aa8d8d872b53858",
|
||||
"gsd-core/workflows/discuss-phase-assumptions.md": "185419d61517727b",
|
||||
"gsd-core/workflows/discuss-phase-power.md": "0841f7dc6e9a054a",
|
||||
"gsd-core/workflows/discuss-phase.md": "0c0465ba668adb33",
|
||||
"gsd-core/workflows/discuss-phase/modes/advisor.md": "db488d74d080c653",
|
||||
"gsd-core/workflows/discuss-phase/modes/all.md": "fa70d79066562e54",
|
||||
"gsd-core/workflows/discuss-phase/modes/analyze.md": "da0788f3be7f8105",
|
||||
"gsd-core/workflows/discuss-phase/modes/auto.md": "d06f0bea2ba0b240",
|
||||
"gsd-core/workflows/discuss-phase/modes/batch.md": "6946597770e2d448",
|
||||
"gsd-core/workflows/discuss-phase/modes/chain.md": "5502a67de7776853",
|
||||
"gsd-core/workflows/discuss-phase/modes/default.md": "67d1b67f61f03966",
|
||||
"gsd-core/workflows/discuss-phase/modes/power.md": "fdc7a728eaaa2261",
|
||||
"gsd-core/workflows/discuss-phase/modes/text.md": "da6d45207da4a988",
|
||||
"gsd-core/workflows/discuss-phase/templates/checkpoint.json": "e3bc3dca49db59eb",
|
||||
"gsd-core/workflows/discuss-phase/templates/context.md": "eeebda60636d1ad0",
|
||||
"gsd-core/workflows/discuss-phase/templates/discussion-log.md": "1bbd7703f11128e1",
|
||||
"gsd-core/workflows/do.md": "90df4f1fe248cdf3",
|
||||
"gsd-core/workflows/docs-update.md": "b5cdf1c35043cf7b",
|
||||
"gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04",
|
||||
"gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7",
|
||||
"gsd-core/workflows/execute-phase.md": "9d659e566b2ee1d5",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md": "7a49bc47da5411ea",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e",
|
||||
"gsd-core/workflows/execute-plan.md": "3399bf5491e85a7c",
|
||||
"gsd-core/workflows/explore.md": "6c04f2e658d93261",
|
||||
"gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4",
|
||||
"gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3",
|
||||
"gsd-core/workflows/forensics.md": "0d500a3f5ab26913",
|
||||
"gsd-core/workflows/graduation.md": "973dcebcd17e1b10",
|
||||
"gsd-core/workflows/health.md": "c25b5e5f62874c31",
|
||||
"gsd-core/workflows/help.md": "5d040504b9ab35e3",
|
||||
"gsd-core/workflows/help/modes/brief.md": "924860e1f07defb0",
|
||||
"gsd-core/workflows/help/modes/default.md": "08a02976c0c5cc50",
|
||||
"gsd-core/workflows/help/modes/full.md": "4e99773be20a97e2",
|
||||
"gsd-core/workflows/help/modes/topic.md": "5c160093f3cbf35d",
|
||||
"gsd-core/workflows/import.md": "31a0f3a33154939f",
|
||||
"gsd-core/workflows/inbox.md": "a7d439981775bc29",
|
||||
"gsd-core/workflows/ingest-docs.md": "e5c63b5e539f6e17",
|
||||
"gsd-core/workflows/insert-phase.md": "08dca838d831bb5b",
|
||||
"gsd-core/workflows/list-phase-assumptions.md": "53dd4b69536c1bc3",
|
||||
"gsd-core/workflows/list-seeds.md": "b687f2a843032d65",
|
||||
"gsd-core/workflows/list-workspaces.md": "7f94e18b5c549453",
|
||||
"gsd-core/workflows/manager.md": "c18fab593344253d",
|
||||
"gsd-core/workflows/map-codebase.md": "8fb02d635a86d6b2",
|
||||
"gsd-core/workflows/milestone-summary.md": "e0cdfddbd39a9043",
|
||||
"gsd-core/workflows/mvp-phase.md": "58a952b4715db283",
|
||||
"gsd-core/workflows/new-milestone.md": "f6029bcb535bee69",
|
||||
"gsd-core/workflows/new-project.md": "032fd380752ad3ef",
|
||||
"gsd-core/workflows/new-workspace.md": "bbeb706c7a697617",
|
||||
"gsd-core/workflows/next.md": "13fb800f2472d970",
|
||||
"gsd-core/workflows/node-repair.md": "07a1628e5a1ff96b",
|
||||
"gsd-core/workflows/note.md": "5a99eb396c744619",
|
||||
"gsd-core/workflows/onboard.md": "f29c4fbef3b473fd",
|
||||
"gsd-core/workflows/pause-work.md": "f2b33bba5593d422",
|
||||
"gsd-core/workflows/plan-milestone-gaps.md": "852f6d7c0c4299dc",
|
||||
"gsd-core/workflows/plan-phase.md": "3d7655de200ce3f7",
|
||||
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md": "b36f77ac7344a072",
|
||||
"gsd-core/workflows/plan-phase/steps/prd-express-path.md": "197c0590326371b2",
|
||||
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md": "49f58c3f75be3eb5",
|
||||
"gsd-core/workflows/plan-review-convergence.md": "1c31d4905c1556c8",
|
||||
"gsd-core/workflows/plant-seed.md": "9596db80ab282c6f",
|
||||
"gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b",
|
||||
"gsd-core/workflows/profile-user.md": "37af07833c81a0bd",
|
||||
"gsd-core/workflows/progress.md": "46c83ad61b3c4a84",
|
||||
"gsd-core/workflows/quick.md": "de86fb74fe1b4b92",
|
||||
"gsd-core/workflows/reapply-patches.md": "39050f72601aec89",
|
||||
"gsd-core/workflows/remove-phase.md": "df9a45f0b1880999",
|
||||
"gsd-core/workflows/remove-workspace.md": "f67860c795fb4bfe",
|
||||
"gsd-core/workflows/resume-project.md": "f28da1200e4545f4",
|
||||
"gsd-core/workflows/review.md": "d4f26b05b3eff7f6",
|
||||
"gsd-core/workflows/scan.md": "e6424af05656725a",
|
||||
"gsd-core/workflows/secure-phase.md": "f8b9436c35372281",
|
||||
"gsd-core/workflows/session-report.md": "2e5b1205324ddefa",
|
||||
"gsd-core/workflows/settings-advanced.md": "414db4dbea97ba44",
|
||||
"gsd-core/workflows/settings-integrations.md": "effcef778d4a855f",
|
||||
"gsd-core/workflows/settings.md": "85ceb482dc713169",
|
||||
"gsd-core/workflows/ship.md": "6693c61fb6a5cd9b",
|
||||
"gsd-core/workflows/sketch-wrap-up.md": "b767a1d3db129a8a",
|
||||
"gsd-core/workflows/sketch.md": "5f0a7d3640cdff54",
|
||||
"gsd-core/workflows/smart-entry.md": "004b4060eab97cb9",
|
||||
"gsd-core/workflows/spec-phase.md": "fa8669b75392cf6c",
|
||||
"gsd-core/workflows/spike-wrap-up.md": "da0dcb252c54fa82",
|
||||
"gsd-core/workflows/spike.md": "a51eaa05bd40e3cf",
|
||||
"gsd-core/workflows/stats.md": "76a42cbeaf6007c2",
|
||||
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
|
||||
"gsd-core/workflows/thread.md": "927e7eeefd2fcf5c",
|
||||
"gsd-core/workflows/transition.md": "aea486bb7a0e80e7",
|
||||
"gsd-core/workflows/ui-phase.md": "9bcc048f577d7ea5",
|
||||
"gsd-core/workflows/ui-review.md": "202c4e399cd95719",
|
||||
"gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d",
|
||||
"gsd-core/workflows/undo.md": "1712417bade30b30",
|
||||
"gsd-core/workflows/update.md": "eab6ce95ff7bdee1",
|
||||
"gsd-core/workflows/validate-phase.md": "2e19caff07397728",
|
||||
"gsd-core/workflows/verify-phase.md": "d26a2c3269340caf",
|
||||
"gsd-core/workflows/verify-work.md": "5b92e34f1d0da848",
|
||||
"scripts/changeset/README.md": "86ff89331dfd94b2",
|
||||
"scripts/changeset/cli.cjs": "68f92a344b199271",
|
||||
"scripts/changeset/github-release-notes.cjs": "795677f0c009b132",
|
||||
"scripts/changeset/lint.cjs": "23cb53f77a6ea180",
|
||||
"scripts/changeset/new.cjs": "4991e21fd17f5541",
|
||||
"scripts/changeset/parse.cjs": "c0a9bbc3914aee04",
|
||||
"scripts/changeset/render.cjs": "e47bc3e1587c3cae",
|
||||
"scripts/changeset/serialize.cjs": "ac0b8fe6f87cdb0e",
|
||||
"scripts/fix-slash-commands.cjs": "0519742531ff3529",
|
||||
"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"
|
||||
}
|
||||
@@ -107,8 +107,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -114,8 +114,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
4
tests/fixtures/golden-install-parity/pi.json
vendored
4
tests/fixtures/golden-install-parity/pi.json
vendored
@@ -10,8 +10,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
@@ -114,8 +114,8 @@
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "2f60b9eaa6cf6bc1",
|
||||
"gsd-core/bin/shared/model-catalog.json": "b55176ca044728d3",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "2df2c5ac1957911a",
|
||||
"gsd-core/bin/shared/model-catalog.json": "59f3233132969e27",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json": "e14346bdbd0ebd64",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs": "caec5dbce11e3904",
|
||||
"gsd-core/contexts/dev.md": "dcb0de9dce33cf41",
|
||||
"gsd-core/contexts/research.md": "b3285d8e7209cc3b",
|
||||
|
||||
439
tests/fixtures/install-tree/kimi-code.json
vendored
Normal file
439
tests/fixtures/install-tree/kimi-code.json
vendored
Normal file
@@ -0,0 +1,439 @@
|
||||
[
|
||||
".gsd-profile",
|
||||
".gsd/defaults.json",
|
||||
".kimi/hooks/gsd-check-update-worker.js",
|
||||
".kimi/hooks/gsd-check-update.js",
|
||||
".kimi/hooks/gsd-config-reload.js",
|
||||
".kimi/hooks/gsd-context-monitor.js",
|
||||
".kimi/hooks/gsd-cursor-post-tool.js",
|
||||
".kimi/hooks/gsd-cursor-pre-tool.js",
|
||||
".kimi/hooks/gsd-cursor-session-start.js",
|
||||
".kimi/hooks/gsd-cursor-stop.js",
|
||||
".kimi/hooks/gsd-cursor-subagent-start.js",
|
||||
".kimi/hooks/gsd-cursor-subagent-stop.js",
|
||||
".kimi/hooks/gsd-ensure-canonical-path.js",
|
||||
".kimi/hooks/gsd-graphify-update.sh",
|
||||
".kimi/hooks/gsd-phase-boundary.sh",
|
||||
".kimi/hooks/gsd-prompt-guard.js",
|
||||
".kimi/hooks/gsd-read-guard.js",
|
||||
".kimi/hooks/gsd-read-injection-scanner.js",
|
||||
".kimi/hooks/gsd-session-state.sh",
|
||||
".kimi/hooks/gsd-statusline.js",
|
||||
".kimi/hooks/gsd-update-banner.js",
|
||||
".kimi/hooks/gsd-validate-commit.sh",
|
||||
".kimi/hooks/gsd-windsurf-pre-command.js",
|
||||
".kimi/hooks/gsd-windsurf-pre-write.js",
|
||||
".kimi/hooks/gsd-workflow-guard.js",
|
||||
".kimi/hooks/gsd-worktree-path-guard.js",
|
||||
".kimi/hooks/lib/git-cmd.js",
|
||||
".kimi/hooks/lib/gsd-graphify-rebuild.sh",
|
||||
".kimi/hooks/managed-hooks-registry.cjs",
|
||||
".kimi/package.json",
|
||||
"agents/gsd-advisor-researcher.md",
|
||||
"agents/gsd-ai-researcher.md",
|
||||
"agents/gsd-assumptions-analyzer.md",
|
||||
"agents/gsd-code-fixer.md",
|
||||
"agents/gsd-code-reviewer.md",
|
||||
"agents/gsd-codebase-mapper.md",
|
||||
"agents/gsd-debug-session-manager.md",
|
||||
"agents/gsd-debugger.md",
|
||||
"agents/gsd-doc-classifier.md",
|
||||
"agents/gsd-doc-synthesizer.md",
|
||||
"agents/gsd-doc-verifier.md",
|
||||
"agents/gsd-doc-writer.md",
|
||||
"agents/gsd-domain-researcher.md",
|
||||
"agents/gsd-eval-auditor.md",
|
||||
"agents/gsd-eval-planner.md",
|
||||
"agents/gsd-executor.md",
|
||||
"agents/gsd-framework-selector.md",
|
||||
"agents/gsd-integration-checker.md",
|
||||
"agents/gsd-intel-updater.md",
|
||||
"agents/gsd-mempalace-curator.md",
|
||||
"agents/gsd-nyquist-auditor.md",
|
||||
"agents/gsd-pattern-mapper.md",
|
||||
"agents/gsd-phase-researcher.md",
|
||||
"agents/gsd-plan-checker.md",
|
||||
"agents/gsd-planner.md",
|
||||
"agents/gsd-project-researcher.md",
|
||||
"agents/gsd-research-synthesizer.md",
|
||||
"agents/gsd-roadmapper.md",
|
||||
"agents/gsd-security-auditor.md",
|
||||
"agents/gsd-ui-auditor.md",
|
||||
"agents/gsd-ui-checker.md",
|
||||
"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",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs",
|
||||
"gsd-core/bin/gsd-tools.cjs",
|
||||
"gsd-core/bin/gsd_run",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json",
|
||||
"gsd-core/bin/shared/model-catalog.json",
|
||||
"gsd-core/bin/shared/runtime-aliases.manifest.json",
|
||||
"gsd-core/bin/verify-reapply-patches.cjs",
|
||||
"gsd-core/contexts/dev.md",
|
||||
"gsd-core/contexts/research.md",
|
||||
"gsd-core/contexts/review.md",
|
||||
"gsd-core/references/agent-contracts.md",
|
||||
"gsd-core/references/agent-skills-bootstrap.md",
|
||||
"gsd-core/references/ai-evals.md",
|
||||
"gsd-core/references/ai-frameworks.md",
|
||||
"gsd-core/references/api-coverage.md",
|
||||
"gsd-core/references/artifact-types.md",
|
||||
"gsd-core/references/autonomous-smart-discuss.md",
|
||||
"gsd-core/references/checkpoints.md",
|
||||
"gsd-core/references/common-bug-patterns.md",
|
||||
"gsd-core/references/context-budget.md",
|
||||
"gsd-core/references/continuation-format.md",
|
||||
"gsd-core/references/debugger-bug-taxonomy.md",
|
||||
"gsd-core/references/debugger-fix-acceptance.md",
|
||||
"gsd-core/references/debugger-philosophy.md",
|
||||
"gsd-core/references/debugger-prevention.md",
|
||||
"gsd-core/references/debugger-rca-branching.md",
|
||||
"gsd-core/references/debugger-repro-hardening.md",
|
||||
"gsd-core/references/debugger-sbfl.md",
|
||||
"gsd-core/references/debugger-semantic-recall.md",
|
||||
"gsd-core/references/decimal-phase-calculation.md",
|
||||
"gsd-core/references/doc-conflict-engine.md",
|
||||
"gsd-core/references/domain-probes.md",
|
||||
"gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json",
|
||||
"gsd-core/references/edge-probe-fixtures/01-round-half-even/requirements.json",
|
||||
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json",
|
||||
"gsd-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json",
|
||||
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json",
|
||||
"gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json",
|
||||
"gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json",
|
||||
"gsd-core/references/edge-probe-fixtures/04-money-rounding/requirements.json",
|
||||
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json",
|
||||
"gsd-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json",
|
||||
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json",
|
||||
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json",
|
||||
"gsd-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json",
|
||||
"gsd-core/references/edge-probe.md",
|
||||
"gsd-core/references/execute-mvp-tdd.md",
|
||||
"gsd-core/references/execute-phase-between-wave-reset.md",
|
||||
"gsd-core/references/execute-phase-context-guard.md",
|
||||
"gsd-core/references/execute-phase-quota-recovery.md",
|
||||
"gsd-core/references/execute-phase-requirement-revert.md",
|
||||
"gsd-core/references/execute-phase-response-language.md",
|
||||
"gsd-core/references/execute-phase-wave-guard.md",
|
||||
"gsd-core/references/executor-examples.md",
|
||||
"gsd-core/references/few-shot-examples/plan-checker.md",
|
||||
"gsd-core/references/few-shot-examples/verifier.md",
|
||||
"gsd-core/references/gate-prompts.md",
|
||||
"gsd-core/references/gates.md",
|
||||
"gsd-core/references/git-integration.md",
|
||||
"gsd-core/references/git-planning-commit.md",
|
||||
"gsd-core/references/gsd-run-resolver.md",
|
||||
"gsd-core/references/honest-verifier.md",
|
||||
"gsd-core/references/ios-scaffold.md",
|
||||
"gsd-core/references/loop-hook-dispatch.md",
|
||||
"gsd-core/references/mandatory-initial-read.md",
|
||||
"gsd-core/references/model-profile-resolution.md",
|
||||
"gsd-core/references/model-profiles.md",
|
||||
"gsd-core/references/mvp-concepts.md",
|
||||
"gsd-core/references/phase-argument-parsing.md",
|
||||
"gsd-core/references/planner-antipatterns.md",
|
||||
"gsd-core/references/planner-chunked.md",
|
||||
"gsd-core/references/planner-gap-closure.md",
|
||||
"gsd-core/references/planner-graphify-auto-update.md",
|
||||
"gsd-core/references/planner-guidance.md",
|
||||
"gsd-core/references/planner-human-verify-mode.md",
|
||||
"gsd-core/references/planner-interface-context.md",
|
||||
"gsd-core/references/planner-load-graph-context.md",
|
||||
"gsd-core/references/planner-mvp-mode.md",
|
||||
"gsd-core/references/planner-preconditions.md",
|
||||
"gsd-core/references/planner-reversibility.md",
|
||||
"gsd-core/references/planner-reviews.md",
|
||||
"gsd-core/references/planner-revision.md",
|
||||
"gsd-core/references/planner-source-audit.md",
|
||||
"gsd-core/references/planning-config.md",
|
||||
"gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json",
|
||||
"gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json",
|
||||
"gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json",
|
||||
"gsd-core/references/prohibition-probe.md",
|
||||
"gsd-core/references/project-skills-discovery.md",
|
||||
"gsd-core/references/questioning.md",
|
||||
"gsd-core/references/research-documentation-lookup.md",
|
||||
"gsd-core/references/research-philosophy.md",
|
||||
"gsd-core/references/research-verification-protocol.md",
|
||||
"gsd-core/references/reviewer-instances.md",
|
||||
"gsd-core/references/revision-loop.md",
|
||||
"gsd-core/references/scout-codebase.md",
|
||||
"gsd-core/references/security-asvs-levels.md",
|
||||
"gsd-core/references/skeleton-template.md",
|
||||
"gsd-core/references/sketch-interactivity.md",
|
||||
"gsd-core/references/sketch-theme-system.md",
|
||||
"gsd-core/references/sketch-tooling.md",
|
||||
"gsd-core/references/sketch-variant-patterns.md",
|
||||
"gsd-core/references/specless-probe-fallback.md",
|
||||
"gsd-core/references/spidr-splitting.md",
|
||||
"gsd-core/references/tdd.md",
|
||||
"gsd-core/references/thinking-models-debug.md",
|
||||
"gsd-core/references/thinking-models-execution.md",
|
||||
"gsd-core/references/thinking-models-planning.md",
|
||||
"gsd-core/references/thinking-models-research.md",
|
||||
"gsd-core/references/thinking-models-verification.md",
|
||||
"gsd-core/references/thinking-partner.md",
|
||||
"gsd-core/references/ui-brand.md",
|
||||
"gsd-core/references/ui-consideration-probe.md",
|
||||
"gsd-core/references/universal-anti-patterns.md",
|
||||
"gsd-core/references/untrusted-input-boundary.md",
|
||||
"gsd-core/references/user-profiling.md",
|
||||
"gsd-core/references/user-story-template.md",
|
||||
"gsd-core/references/verification-overrides.md",
|
||||
"gsd-core/references/verification-patterns.md",
|
||||
"gsd-core/references/verify-mvp-mode.md",
|
||||
"gsd-core/references/workstream-flag.md",
|
||||
"gsd-core/references/worktree-branch-check.md",
|
||||
"gsd-core/references/worktree-path-safety.md",
|
||||
"gsd-core/templates/AI-SPEC.md",
|
||||
"gsd-core/templates/DEBUG.md",
|
||||
"gsd-core/templates/README.md",
|
||||
"gsd-core/templates/SECURITY.md",
|
||||
"gsd-core/templates/UAT.md",
|
||||
"gsd-core/templates/UI-SPEC.md",
|
||||
"gsd-core/templates/VALIDATION.md",
|
||||
"gsd-core/templates/claude-md.md",
|
||||
"gsd-core/templates/codebase/architecture.md",
|
||||
"gsd-core/templates/codebase/concerns.md",
|
||||
"gsd-core/templates/codebase/conventions.md",
|
||||
"gsd-core/templates/codebase/integrations.md",
|
||||
"gsd-core/templates/codebase/stack.md",
|
||||
"gsd-core/templates/codebase/structure.md",
|
||||
"gsd-core/templates/codebase/testing.md",
|
||||
"gsd-core/templates/config.json",
|
||||
"gsd-core/templates/context.md",
|
||||
"gsd-core/templates/continue-here.md",
|
||||
"gsd-core/templates/copilot-instructions.md",
|
||||
"gsd-core/templates/debug-subagent-prompt.md",
|
||||
"gsd-core/templates/dev-preferences.md",
|
||||
"gsd-core/templates/discovery.md",
|
||||
"gsd-core/templates/discussion-log.md",
|
||||
"gsd-core/templates/milestone-archive.md",
|
||||
"gsd-core/templates/milestone.md",
|
||||
"gsd-core/templates/phase-prompt.md",
|
||||
"gsd-core/templates/planner-subagent-prompt.md",
|
||||
"gsd-core/templates/project.md",
|
||||
"gsd-core/templates/requirements.md",
|
||||
"gsd-core/templates/research-project/ARCHITECTURE.md",
|
||||
"gsd-core/templates/research-project/FEATURES.md",
|
||||
"gsd-core/templates/research-project/PITFALLS.md",
|
||||
"gsd-core/templates/research-project/STACK.md",
|
||||
"gsd-core/templates/research-project/SUMMARY.md",
|
||||
"gsd-core/templates/research.md",
|
||||
"gsd-core/templates/retrospective.md",
|
||||
"gsd-core/templates/roadmap.md",
|
||||
"gsd-core/templates/spec.md",
|
||||
"gsd-core/templates/state.md",
|
||||
"gsd-core/templates/summary-complex.md",
|
||||
"gsd-core/templates/summary-minimal.md",
|
||||
"gsd-core/templates/summary-standard.md",
|
||||
"gsd-core/templates/summary.md",
|
||||
"gsd-core/templates/user-profile.md",
|
||||
"gsd-core/templates/user-setup.md",
|
||||
"gsd-core/templates/verification-report.md",
|
||||
"gsd-core/workflows/_runtime-launcher.snippet.sh",
|
||||
"gsd-core/workflows/add-backlog.md",
|
||||
"gsd-core/workflows/add-phase.md",
|
||||
"gsd-core/workflows/add-tests.md",
|
||||
"gsd-core/workflows/add-todo.md",
|
||||
"gsd-core/workflows/ai-integration-phase.md",
|
||||
"gsd-core/workflows/analyze-dependencies.md",
|
||||
"gsd-core/workflows/audit-fix.md",
|
||||
"gsd-core/workflows/audit-milestone.md",
|
||||
"gsd-core/workflows/audit-uat.md",
|
||||
"gsd-core/workflows/autonomous.md",
|
||||
"gsd-core/workflows/check-todos.md",
|
||||
"gsd-core/workflows/cleanup.md",
|
||||
"gsd-core/workflows/code-review-fix.md",
|
||||
"gsd-core/workflows/code-review.md",
|
||||
"gsd-core/workflows/complete-milestone.md",
|
||||
"gsd-core/workflows/debug.md",
|
||||
"gsd-core/workflows/diagnose-issues.md",
|
||||
"gsd-core/workflows/discovery-phase.md",
|
||||
"gsd-core/workflows/discuss-phase-assumptions.md",
|
||||
"gsd-core/workflows/discuss-phase-power.md",
|
||||
"gsd-core/workflows/discuss-phase.md",
|
||||
"gsd-core/workflows/discuss-phase/modes/advisor.md",
|
||||
"gsd-core/workflows/discuss-phase/modes/all.md",
|
||||
"gsd-core/workflows/discuss-phase/modes/analyze.md",
|
||||
"gsd-core/workflows/discuss-phase/modes/auto.md",
|
||||
"gsd-core/workflows/discuss-phase/modes/batch.md",
|
||||
"gsd-core/workflows/discuss-phase/modes/chain.md",
|
||||
"gsd-core/workflows/discuss-phase/modes/default.md",
|
||||
"gsd-core/workflows/discuss-phase/modes/power.md",
|
||||
"gsd-core/workflows/discuss-phase/modes/text.md",
|
||||
"gsd-core/workflows/discuss-phase/templates/checkpoint.json",
|
||||
"gsd-core/workflows/discuss-phase/templates/context.md",
|
||||
"gsd-core/workflows/discuss-phase/templates/discussion-log.md",
|
||||
"gsd-core/workflows/do.md",
|
||||
"gsd-core/workflows/docs-update.md",
|
||||
"gsd-core/workflows/edit-phase.md",
|
||||
"gsd-core/workflows/eval-review.md",
|
||||
"gsd-core/workflows/execute-phase.md",
|
||||
"gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md",
|
||||
"gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md",
|
||||
"gsd-core/workflows/execute-phase/steps/post-merge-gate.md",
|
||||
"gsd-core/workflows/execute-phase/steps/regression-gate.md",
|
||||
"gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md",
|
||||
"gsd-core/workflows/execute-plan.md",
|
||||
"gsd-core/workflows/explore.md",
|
||||
"gsd-core/workflows/extract-learnings.md",
|
||||
"gsd-core/workflows/fast.md",
|
||||
"gsd-core/workflows/forensics.md",
|
||||
"gsd-core/workflows/graduation.md",
|
||||
"gsd-core/workflows/health.md",
|
||||
"gsd-core/workflows/help.md",
|
||||
"gsd-core/workflows/help/modes/brief.md",
|
||||
"gsd-core/workflows/help/modes/default.md",
|
||||
"gsd-core/workflows/help/modes/full.md",
|
||||
"gsd-core/workflows/help/modes/topic.md",
|
||||
"gsd-core/workflows/import.md",
|
||||
"gsd-core/workflows/inbox.md",
|
||||
"gsd-core/workflows/ingest-docs.md",
|
||||
"gsd-core/workflows/insert-phase.md",
|
||||
"gsd-core/workflows/list-phase-assumptions.md",
|
||||
"gsd-core/workflows/list-seeds.md",
|
||||
"gsd-core/workflows/list-workspaces.md",
|
||||
"gsd-core/workflows/manager.md",
|
||||
"gsd-core/workflows/map-codebase.md",
|
||||
"gsd-core/workflows/milestone-summary.md",
|
||||
"gsd-core/workflows/mvp-phase.md",
|
||||
"gsd-core/workflows/new-milestone.md",
|
||||
"gsd-core/workflows/new-project.md",
|
||||
"gsd-core/workflows/new-workspace.md",
|
||||
"gsd-core/workflows/next.md",
|
||||
"gsd-core/workflows/node-repair.md",
|
||||
"gsd-core/workflows/note.md",
|
||||
"gsd-core/workflows/onboard.md",
|
||||
"gsd-core/workflows/pause-work.md",
|
||||
"gsd-core/workflows/plan-milestone-gaps.md",
|
||||
"gsd-core/workflows/plan-phase.md",
|
||||
"gsd-core/workflows/plan-phase/steps/closed-phase-gate.md",
|
||||
"gsd-core/workflows/plan-phase/steps/prd-express-path.md",
|
||||
"gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md",
|
||||
"gsd-core/workflows/plan-review-convergence.md",
|
||||
"gsd-core/workflows/plant-seed.md",
|
||||
"gsd-core/workflows/pr-branch.md",
|
||||
"gsd-core/workflows/profile-user.md",
|
||||
"gsd-core/workflows/progress.md",
|
||||
"gsd-core/workflows/quick.md",
|
||||
"gsd-core/workflows/reapply-patches.md",
|
||||
"gsd-core/workflows/remove-phase.md",
|
||||
"gsd-core/workflows/remove-workspace.md",
|
||||
"gsd-core/workflows/resume-project.md",
|
||||
"gsd-core/workflows/review.md",
|
||||
"gsd-core/workflows/scan.md",
|
||||
"gsd-core/workflows/secure-phase.md",
|
||||
"gsd-core/workflows/session-report.md",
|
||||
"gsd-core/workflows/settings-advanced.md",
|
||||
"gsd-core/workflows/settings-integrations.md",
|
||||
"gsd-core/workflows/settings.md",
|
||||
"gsd-core/workflows/ship.md",
|
||||
"gsd-core/workflows/sketch-wrap-up.md",
|
||||
"gsd-core/workflows/sketch.md",
|
||||
"gsd-core/workflows/smart-entry.md",
|
||||
"gsd-core/workflows/spec-phase.md",
|
||||
"gsd-core/workflows/spike-wrap-up.md",
|
||||
"gsd-core/workflows/spike.md",
|
||||
"gsd-core/workflows/stats.md",
|
||||
"gsd-core/workflows/sync-skills.md",
|
||||
"gsd-core/workflows/thread.md",
|
||||
"gsd-core/workflows/transition.md",
|
||||
"gsd-core/workflows/ui-phase.md",
|
||||
"gsd-core/workflows/ui-review.md",
|
||||
"gsd-core/workflows/ultraplan-phase.md",
|
||||
"gsd-core/workflows/undo.md",
|
||||
"gsd-core/workflows/update.md",
|
||||
"gsd-core/workflows/validate-phase.md",
|
||||
"gsd-core/workflows/verify-phase.md",
|
||||
"gsd-core/workflows/verify-work.md",
|
||||
"scripts/changeset/README.md",
|
||||
"scripts/changeset/cli.cjs",
|
||||
"scripts/changeset/github-release-notes.cjs",
|
||||
"scripts/changeset/lint.cjs",
|
||||
"scripts/changeset/new.cjs",
|
||||
"scripts/changeset/parse.cjs",
|
||||
"scripts/changeset/render.cjs",
|
||||
"scripts/changeset/serialize.cjs",
|
||||
"scripts/fix-slash-commands.cjs",
|
||||
"scripts/gen-capability-registry.cjs",
|
||||
"scripts/gen-loop-host-contract.cjs",
|
||||
"scripts/lib/allowlist-ratchet.cjs",
|
||||
"scripts/lib/cli-exit.cjs"
|
||||
]
|
||||
@@ -46,6 +46,7 @@ const GOLDEN_FRAGMENT_MAP = {
|
||||
codebuddy: "'.codebuddy'",
|
||||
cline: "'.cline'",
|
||||
kimi: "'.config', 'agents'",
|
||||
'kimi-code': "'.kimi-code'",
|
||||
zcode: "'.zcode'",
|
||||
pi: "'.pi', 'agent'",
|
||||
};
|
||||
@@ -56,7 +57,7 @@ const GOLDEN_FRAGMENT_MAP = {
|
||||
// all — getGlobalConfigHomeFragment is never invoked for it (no install surface).
|
||||
const SPECIAL_CASED = new Set(['claude', 'antigravity', 'vscode']);
|
||||
|
||||
test('getGlobalConfigHomeFragment: golden map matches for all 13 table runtimes', () => {
|
||||
test('getGlobalConfigHomeFragment: golden map matches for all 14 table runtimes', () => {
|
||||
for (const [id, expected] of Object.entries(GOLDEN_FRAGMENT_MAP)) {
|
||||
const actual = getGlobalConfigHomeFragment(id);
|
||||
assert.strictEqual(
|
||||
|
||||
@@ -62,6 +62,7 @@ const RUNTIME_META = {
|
||||
cursor: { localDir: '.cursor', globalSuffix: '.cursor' },
|
||||
hermes: { localDir: '.hermes', globalSuffix: '.hermes' },
|
||||
kimi: { localDir: '.kimi-code', globalSuffix: path.join('.config', 'agents') },
|
||||
'kimi-code': { localDir: '.kimi-code', globalSuffix: '.kimi-code' },
|
||||
kilo: { localDir: '.kilo', globalSuffix: path.join('.config', 'kilo') },
|
||||
opencode: { localDir: '.opencode', globalSuffix: path.join('.config', 'opencode') },
|
||||
pi: { localDir: '.pi', globalSuffix: path.join('.pi', 'agent') },
|
||||
|
||||
@@ -38,7 +38,7 @@ const DISPATCH_KEYS = ['namedDispatch', 'nested', 'maxDepth', 'background', 'sub
|
||||
const RUNTIME_IDS = Object.keys(registry.runtimes);
|
||||
|
||||
// Contract-pinned profile split (derived from .host-cli-final.json):
|
||||
// programmatic-cli: claude, cline, cursor, hermes, kilo, kimi, opencode, pi, qwen, trae (10)
|
||||
// programmatic-cli: claude, cline, cursor, hermes, kilo, kimi, kimi-code, opencode, pi, qwen, trae (11)
|
||||
// declarative-cli: antigravity, augment, codebuddy, codex, copilot, windsurf, zcode (7)
|
||||
// ide: vscode (1) — #2103, the first installed ide-profile host.
|
||||
const EXPECTED_PROFILES = {
|
||||
@@ -48,6 +48,7 @@ const EXPECTED_PROFILES = {
|
||||
hermes: 'programmatic-cli',
|
||||
kilo: 'programmatic-cli',
|
||||
kimi: 'programmatic-cli',
|
||||
'kimi-code': 'programmatic-cli',
|
||||
opencode: 'programmatic-cli',
|
||||
pi: 'programmatic-cli',
|
||||
qwen: 'programmatic-cli',
|
||||
@@ -285,6 +286,10 @@ describe('ADR-1239 Phase A: hostIntegration descriptors', () => {
|
||||
// true → dispatch.background/backgroundDispatch both true → NOT
|
||||
// force-flattened (mirrors the #2087 OpenCode precedent below).
|
||||
kimi: false,
|
||||
// #2454: Kimi Code (Node CLI) — same background-dispatch model as Python
|
||||
// kimi-cli per Kimi Code docs (dispatch.background/backgroundDispatch both
|
||||
// true) → NOT force-flattened.
|
||||
'kimi-code': false,
|
||||
// #2087: OpenCode background subagents (v1.15 param, v1.17 default-on) →
|
||||
// dispatch.background/backgroundDispatch true → NOT force-flattened.
|
||||
opencode: false,
|
||||
|
||||
@@ -768,14 +768,14 @@ describe('Kilo integration — install/uninstall behaviour', () => {
|
||||
assert.deepStrictEqual(selectRuntimesFromArgs(['--kilo']), ['kilo']);
|
||||
});
|
||||
|
||||
test('runtimeMap has Kilo as option 11 after Kimi', () => {
|
||||
assert.strictEqual(runtimeMap['11'], 'kilo');
|
||||
test('runtimeMap has Kilo as option 12 after Kimi Code (#2454)', () => {
|
||||
assert.strictEqual(runtimeMap['12'], 'kilo');
|
||||
});
|
||||
|
||||
test('prompt text shows Kilo above OpenCode without marketing copy', () => {
|
||||
const plain = stripAnsi(buildRuntimePromptText());
|
||||
assert.ok(/\b11\)\s*Kilo\b/.test(plain));
|
||||
assert.ok(plain.indexOf('11) Kilo') < plain.indexOf('OpenCode'));
|
||||
assert.ok(/\b12\)\s*Kilo\b/.test(plain));
|
||||
assert.ok(plain.indexOf('12) Kilo') < plain.indexOf('OpenCode'));
|
||||
assert.ok(!plain.includes('the #1 AI coding platform on OpenRouter'));
|
||||
});
|
||||
|
||||
|
||||
@@ -35,6 +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 },
|
||||
// #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.)
|
||||
@@ -546,7 +550,13 @@ 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 });
|
||||
|
||||
@@ -60,7 +60,7 @@ describe('multi-runtime selection parsing', () => {
|
||||
|
||||
test('space-separated choices return multiple runtimes', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('1 7 9'), ['claude', 'copilot', 'hermes']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('8 11'), ['cursor', 'kilo']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('8 12'), ['cursor', 'kilo']);
|
||||
});
|
||||
|
||||
test('mixed comma and space separators work', () => {
|
||||
@@ -73,50 +73,54 @@ describe('multi-runtime selection parsing', () => {
|
||||
});
|
||||
|
||||
test('single choice for kilo', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('11'), ['kilo']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('12'), ['kilo']);
|
||||
});
|
||||
|
||||
test('single choice for opencode', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('12'), ['opencode']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('13'), ['opencode']);
|
||||
});
|
||||
|
||||
test('single choice for pi', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('13'), ['pi']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('14'), ['pi']);
|
||||
});
|
||||
|
||||
test('single choice for qwen', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('14'), ['qwen']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('15'), ['qwen']);
|
||||
});
|
||||
|
||||
test('single choice for trae', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('15'), ['trae']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('16'), ['trae']);
|
||||
});
|
||||
|
||||
test('single choice for windsurf', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('16'), ['windsurf']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('17'), ['windsurf']);
|
||||
});
|
||||
|
||||
test('single choice for zcode', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('17'), ['zcode']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('18'), ['zcode']);
|
||||
});
|
||||
|
||||
test('single choice for kimi', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('10'), ['kimi']);
|
||||
});
|
||||
|
||||
test('choice 18 returns all runtimes', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('18'), allRuntimes);
|
||||
test('single choice for kimi-code (#2454)', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('11'), ['kimi-code']);
|
||||
});
|
||||
|
||||
test('choice 18 returns all runtimes when mixed with separators or other tokens', () => {
|
||||
// CR feedback: tokenized inputs that include 18 (e.g. trailing comma, or
|
||||
test('choice 19 returns all runtimes', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('19'), allRuntimes);
|
||||
});
|
||||
|
||||
test('choice 19 returns all runtimes when mixed with separators or other tokens', () => {
|
||||
// CR feedback: tokenized inputs that include 19 (e.g. trailing comma, or
|
||||
// alongside other choices) must still expand to all-runtimes — previously
|
||||
// only the bare all-runtimes option matched, so "18," or "18 1" silently installed a
|
||||
// only the bare all-runtimes option matched, so "19," or "19 1" silently installed a
|
||||
// subset.
|
||||
assert.deepStrictEqual(parseRuntimeInput('18,'), allRuntimes);
|
||||
assert.deepStrictEqual(parseRuntimeInput('18 1'), allRuntimes);
|
||||
assert.deepStrictEqual(parseRuntimeInput('1,18'), allRuntimes);
|
||||
assert.deepStrictEqual(parseRuntimeInput(' 18 '), allRuntimes);
|
||||
assert.deepStrictEqual(parseRuntimeInput('19,'), allRuntimes);
|
||||
assert.deepStrictEqual(parseRuntimeInput('19 1'), allRuntimes);
|
||||
assert.deepStrictEqual(parseRuntimeInput('1,19'), allRuntimes);
|
||||
assert.deepStrictEqual(parseRuntimeInput(' 19 '), allRuntimes);
|
||||
});
|
||||
|
||||
test('empty input defaults to claude', () => {
|
||||
@@ -125,13 +129,13 @@ describe('multi-runtime selection parsing', () => {
|
||||
});
|
||||
|
||||
test('invalid choices are ignored, falls back to claude if all invalid', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('19'), ['claude']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('20'), ['claude']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('0'), ['claude']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('abc'), ['claude']);
|
||||
});
|
||||
|
||||
test('invalid choices mixed with valid are filtered out', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('1,19,7'), ['claude', 'copilot']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('1,20,7'), ['claude', 'copilot']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('abc 3 xyz'), ['augment']);
|
||||
});
|
||||
|
||||
@@ -142,7 +146,7 @@ describe('multi-runtime selection parsing', () => {
|
||||
|
||||
test('preserves selection order', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('9,1,7'), ['hermes', 'claude', 'copilot']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('11,2,8'), ['kilo', 'antigravity', 'cursor']);
|
||||
assert.deepStrictEqual(parseRuntimeInput('12,2,8'), ['kilo', 'antigravity', 'cursor']);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -158,17 +162,18 @@ describe('install.js exports multi-select runtime metadata', () => {
|
||||
'8': 'cursor',
|
||||
'9': 'hermes',
|
||||
'10': 'kimi',
|
||||
'11': 'kilo',
|
||||
'12': 'opencode',
|
||||
'13': 'pi',
|
||||
'14': 'qwen',
|
||||
'15': 'trae',
|
||||
'16': 'windsurf',
|
||||
'17': 'zcode',
|
||||
'11': 'kimi-code',
|
||||
'12': 'kilo',
|
||||
'13': 'opencode',
|
||||
'14': 'pi',
|
||||
'15': 'qwen',
|
||||
'16': 'trae',
|
||||
'17': 'windsurf',
|
||||
'18': 'zcode',
|
||||
};
|
||||
const expectedRuntimes = [
|
||||
'claude', 'antigravity', 'augment', 'cline', 'codebuddy', 'codex',
|
||||
'copilot', 'cursor', 'hermes', 'kimi', 'kilo', 'opencode', 'pi',
|
||||
'copilot', 'cursor', 'hermes', 'kimi', 'kimi-code', 'kilo', 'opencode', 'pi',
|
||||
'qwen', 'trae', 'windsurf', 'zcode',
|
||||
];
|
||||
|
||||
@@ -186,14 +191,18 @@ describe('install.js exports multi-select runtime metadata', () => {
|
||||
'allRuntimes has no duplicates');
|
||||
});
|
||||
|
||||
test('"All" shortcut (option 18) selects every runtime', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('18'), allRuntimes);
|
||||
test('"All" shortcut (option 19) selects every runtime', () => {
|
||||
assert.deepStrictEqual(parseRuntimeInput('19'), allRuntimes);
|
||||
});
|
||||
|
||||
test('--kimi flag selects Kimi without interactive prompt', () => {
|
||||
test('--kimi flag selects Kimi (Python kimi-cli) without interactive prompt', () => {
|
||||
assert.deepStrictEqual(selectRuntimesFromArgs(['--kimi']), ['kimi']);
|
||||
});
|
||||
|
||||
test('--kimi-code flag selects Kimi Code (Node CLI) without interactive prompt (#2454)', () => {
|
||||
assert.deepStrictEqual(selectRuntimesFromArgs(['--kimi-code']), ['kimi-code']);
|
||||
});
|
||||
|
||||
test('--zcode flag selects ZCode without interactive prompt', () => {
|
||||
assert.deepStrictEqual(selectRuntimesFromArgs(['--zcode']), ['zcode']);
|
||||
});
|
||||
@@ -223,7 +232,7 @@ describe('install.js exports multi-select runtime metadata', () => {
|
||||
'--all includes pi exactly once');
|
||||
});
|
||||
|
||||
test('prompt lists pi (13), ZCode (17), and All (18)', () => {
|
||||
test('prompt lists pi (14), ZCode (18), and All (19)', () => {
|
||||
const prompt = stripAnsi(buildRuntimePromptText());
|
||||
assert.ok(/\b9\)\s*Hermes Agent\b/.test(prompt),
|
||||
'prompt lists Hermes Agent as option 9');
|
||||
@@ -231,16 +240,18 @@ describe('install.js exports multi-select runtime metadata', () => {
|
||||
'prompt lists Kimi as option 10');
|
||||
assert.ok(/Kimi\s+\(~\/\.config\/agents, then ~\/\.agents if existing\)/.test(prompt),
|
||||
'prompt shows the Kimi first-existing generic root policy');
|
||||
assert.ok(/\b13\)\s*pi\b/.test(prompt),
|
||||
'prompt lists pi as option 13');
|
||||
assert.ok(/\b14\)\s*Qwen Code\b/.test(prompt),
|
||||
'prompt lists Qwen Code as option 14');
|
||||
assert.ok(/\b15\)\s*Trae\b/.test(prompt),
|
||||
'prompt lists Trae as option 15');
|
||||
assert.ok(/\b17\)\s*ZCode\b/.test(prompt),
|
||||
'prompt lists ZCode as option 17');
|
||||
assert.ok(/\b18\)\s*All\b/.test(prompt),
|
||||
'prompt lists All as option 18');
|
||||
assert.ok(/\b11\)\s*Kimi Code\b/.test(prompt),
|
||||
'prompt lists Kimi Code as option 11 (#2454)');
|
||||
assert.ok(/\b14\)\s*pi\b/.test(prompt),
|
||||
'prompt lists pi as option 14');
|
||||
assert.ok(/\b15\)\s*Qwen Code\b/.test(prompt),
|
||||
'prompt lists Qwen Code as option 15');
|
||||
assert.ok(/\b16\)\s*Trae\b/.test(prompt),
|
||||
'prompt lists Trae as option 16');
|
||||
assert.ok(/\b18\)\s*ZCode\b/.test(prompt),
|
||||
'prompt lists ZCode as option 18');
|
||||
assert.ok(/\b19\)\s*All\b/.test(prompt),
|
||||
'prompt lists All as option 19');
|
||||
});
|
||||
|
||||
test('prompt does not list Gemini (removed #1928)', () => {
|
||||
|
||||
@@ -14,7 +14,7 @@ const registry = require('../gsd-core/bin/lib/capability-registry.cjs');
|
||||
const EXPECTED_FLAGS = [
|
||||
'isOpencode', 'isKilo', 'isCodex', 'isCopilot', 'isAntigravity',
|
||||
'isCursor', 'isWindsurf', 'isAugment', 'isTrae', 'isQwen', 'isHermes',
|
||||
'isCodebuddy', 'isCline', 'isKimi', 'isZcode', 'isPi',
|
||||
'isCodebuddy', 'isCline', 'isKimi', 'isKimiCode', 'isZcode', 'isPi',
|
||||
];
|
||||
|
||||
// #2103: registry runtimes that are NEVER CLI-installed via bin/install.js
|
||||
@@ -26,11 +26,19 @@ const EXPECTED_FLAGS = [
|
||||
const NON_INSTALLABLE_RUNTIMES = new Set(['vscode']);
|
||||
|
||||
test('runtimeFlags: every known non-claude runtime sets exactly its own flag true', () => {
|
||||
const ids = EXPECTED_FLAGS.map((f) => f.slice(2).toLowerCase());
|
||||
for (const id of ids) {
|
||||
// Convert a flag name (camelCase, e.g. isKimiCode) to the runtime id it
|
||||
// represents (kimi-code). Strip the 'is' prefix, then split camelCase
|
||||
// boundaries into hyphen-separated lowercase words. The simpler
|
||||
// slice(2).toLowerCase() worked while every runtime id was a single word;
|
||||
// kimi-code is the first hyphenated id.
|
||||
const flagToId = (flag) => flag.slice(2)
|
||||
.replace(/[A-Z]/g, (m, i) => (i > 0 ? '-' : '') + m.toLowerCase());
|
||||
const idToFlag = (id) => 'is' + id.charAt(0).toUpperCase() + id.slice(1).replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
||||
for (const flag of EXPECTED_FLAGS) {
|
||||
const id = flagToId(flag);
|
||||
const flags = runtimeFlags(id);
|
||||
const trues = EXPECTED_FLAGS.filter((f) => flags[f] === true);
|
||||
assert.deepStrictEqual(trues, ['is' + id.charAt(0).toUpperCase() + id.slice(1)], `runtime '${id}' must set exactly its own flag`);
|
||||
assert.deepStrictEqual(trues, [idToFlag(id)], `runtime '${id}' must set exactly its own flag`);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -43,12 +51,12 @@ test('runtimeFlags: claude / unknown / empty → all flags false (fail-closed)',
|
||||
}
|
||||
});
|
||||
|
||||
test('runtimeFlags: all 16 flags present + boolean + the object is frozen', () => {
|
||||
test('runtimeFlags: all 17 flags present + boolean + the object is frozen', () => {
|
||||
const flags = runtimeFlags('opencode');
|
||||
for (const f of EXPECTED_FLAGS) {
|
||||
assert.strictEqual(typeof flags[f], 'boolean', `${f} must be boolean`);
|
||||
}
|
||||
assert.deepStrictEqual(Object.keys(flags).sort(), [...EXPECTED_FLAGS].sort(), 'exactly the 16 flags');
|
||||
assert.deepStrictEqual(Object.keys(flags).sort(), [...EXPECTED_FLAGS].sort(), 'exactly the 17 flags');
|
||||
assert.ok(Object.isFrozen(flags), 'flags object must be frozen');
|
||||
});
|
||||
|
||||
@@ -58,10 +66,15 @@ test('runtimeFlags drift guard: covers every registry runtime except claude and
|
||||
// NON_INSTALLABLE_RUNTIMES (#2103) is filtered out first: a runtime that is
|
||||
// never CLI-installed (e.g. vscode — Marketplace/VSIX only) has no --<rt>
|
||||
// flag by design and must not trip this guard.
|
||||
//
|
||||
// #2454: the flag-name → runtime-id conversion must fold PascalCase boundaries
|
||||
// back to kebab-case (isKimiCode → kimi-code, not 'kimicode').
|
||||
const flagToId = (flag) => flag.slice(2)
|
||||
.replace(/[A-Z]/g, (m, i) => (i > 0 ? '-' : '') + m.toLowerCase());
|
||||
const registryNonClaude = Object.keys(registry.runtimes)
|
||||
.filter((r) => r !== 'claude' && !NON_INSTALLABLE_RUNTIMES.has(r))
|
||||
.sort();
|
||||
const flagIds = EXPECTED_FLAGS.map((f) => f.slice(2).toLowerCase()).sort();
|
||||
const flagIds = EXPECTED_FLAGS.map(flagToId).sort();
|
||||
const missing = registryNonClaude.filter((r) => !flagIds.includes(r));
|
||||
assert.deepEqual(missing, [], `registry runtimes missing a runtimeFlags entry: ${missing.join(', ')} — add to RUNTIME_FLAG_IDS`);
|
||||
});
|
||||
@@ -74,5 +87,5 @@ test('#2103: vscode is registered but intentionally excluded from runtimeFlags (
|
||||
assert.strictEqual(flags[f], false, `runtime 'vscode': ${f} must be false (no isVscode flag exists)`);
|
||||
}
|
||||
assert.deepStrictEqual(Object.keys(flags).sort(), [...EXPECTED_FLAGS].sort(),
|
||||
'runtimeFlags(\'vscode\') must NOT introduce a new isVscode key — still exactly the 16 flags');
|
||||
'runtimeFlags(\'vscode\') must NOT introduce a new isVscode key — still exactly the 17 flags');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user