refactor(#1679): ADR-1239 Phase B — collapse program + command chains [AC2 slice 4] (#1813)

* refactor(#1679): ADR-1239 Phase B — collapse program + command chains [AC2 slice 4]

Phase 2 AC2 slice 4. Collapses two more duplicated runtime->string chains in
bin/install.js's post-install next-step message:

- program (14 branches): an EXACT duplicate of runtimeLabel -> getRuntimeLabel.
- command (14 branches): the per-runtime /gsd-new-project invocation syntax
  (gemini '/gsd:', codex '$', cursor skill-mention, kimi '/skill:', default
  '/gsd-new-project') -> new getRuntimeNewProjectCommand(runtime) helper.

- src/runtime-name-policy.cts: RUNTIME_NEW_PROJECT_COMMANDS table +
  getRuntimeNewProjectCommand(runtime) (sibling to runtimeFlags/getRuntimeLabel).
- bin/install.js: import getRuntimeNewProjectCommand; replace the program +
  command chains with single lookups.
- tests/runtime-label-policy.test.cjs: 2 new tests for
  getRuntimeNewProjectCommand (4 overrides + default for the other 12).

runtime === count: 53 -> 25 (-28). Cumulative Phase 2 this session: 129 -> 25
(-104). golden-install-parity 16/16 (program/command are stdout-only so not
parity-covered, but program matches RUNTIME_LABELS exactly and command values
are preserved verbatim in the table). AC2 data-collapse now essentially
exhausted; remaining 25 branches are the ADR-1235 agent-loop tail + per-runtime
semantic behavior.

* chore(changeset): add Changed fragment for program+command collapse (#1679)
This commit is contained in:
Tom Boucher
2026-06-28 15:22:13 -04:00
committed by GitHub
parent f954bb4cac
commit a47979bb92
4 changed files with 62 additions and 33 deletions

View File

@@ -284,3 +284,24 @@ export function runtimeFlags(runtime: string): Readonly<Record<string, boolean>>
}
return Object.freeze(flags);
}
/**
* The `/gsd-new-project` invocation syntax per runtime — the post-install
* "next step" command string. Most runtimes use the default `/gsd-new-project`;
* a few hosts need a different surface syntax. Collapses the 14-line
* `if (runtime === 'x') command = ...` chain in bin/install.js's next-step
* message (ADR-1239 Phase B / #1679 AC2). Pure: no I/O.
*/
const DEFAULT_NEW_PROJECT_COMMAND = '/gsd-new-project';
const RUNTIME_NEW_PROJECT_COMMANDS: Readonly<Record<string, string>> = {
gemini: '/gsd:new-project',
codex: '$gsd-new-project',
cursor: 'gsd-new-project (mention the skill name)',
kimi: '/skill:gsd-new-project',
};
export function getRuntimeNewProjectCommand(runtime: string): string {
if (!runtime) return DEFAULT_NEW_PROJECT_COMMAND;
const c = RUNTIME_NEW_PROJECT_COMMANDS[runtime];
return typeof c === 'string' && c.length > 0 ? c : DEFAULT_NEW_PROJECT_COMMAND;
}