refactor(query): manifest-backed routing seam + family adapters (#2908)

Merging validated command-seam foundation.
This commit is contained in:
Tom Boucher
2026-04-30 14:04:50 -04:00
committed by GitHub
parent 6dce1de4a7
commit 444db1714b
29 changed files with 1478 additions and 411 deletions

View File

@@ -0,0 +1,87 @@
#!/usr/bin/env node
import { createRequire } from 'node:module';
import { resolve, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
const require = createRequire(import.meta.url);
const here = dirname(fileURLToPath(import.meta.url));
const {
STATE_COMMAND_MANIFEST,
} = await import('../dist/query/command-manifest.state.js');
const {
VERIFY_COMMAND_MANIFEST,
} = await import('../dist/query/command-manifest.verify.js');
const {
INIT_COMMAND_MANIFEST,
} = await import('../dist/query/command-manifest.init.js');
const {
PHASE_COMMAND_MANIFEST,
} = await import('../dist/query/command-manifest.phase.js');
const {
PHASES_COMMAND_MANIFEST,
} = await import('../dist/query/command-manifest.phases.js');
const {
VALIDATE_COMMAND_MANIFEST,
} = await import('../dist/query/command-manifest.validate.js');
const {
ROADMAP_COMMAND_MANIFEST,
} = await import('../dist/query/command-manifest.roadmap.js');
const {
STATE_COMMAND_ALIASES,
VERIFY_COMMAND_ALIASES,
INIT_COMMAND_ALIASES,
PHASE_COMMAND_ALIASES,
PHASES_COMMAND_ALIASES,
VALIDATE_COMMAND_ALIASES,
ROADMAP_COMMAND_ALIASES,
} = await import('../dist/query/command-aliases.generated.js');
const cjsAliases = require(resolve(here, '..', '..', 'get-shit-done', 'bin', 'lib', 'command-aliases.generated.cjs'));
function toAliasEntries(manifest, family) {
const prefix = `${family}.`;
return manifest.map((entry) => ({
canonical: entry.canonical,
aliases: [...entry.aliases],
subcommand: entry.canonical.slice(prefix.length),
mutation: entry.mutation,
}));
}
function assertEqual(label, actual, expected) {
const a = JSON.stringify(actual);
const e = JSON.stringify(expected);
if (a !== e) {
throw new Error(
`${label} drift detected. Regenerate command alias artifacts and commit them.`,
);
}
}
const expectedState = toAliasEntries(STATE_COMMAND_MANIFEST, 'state');
const expectedVerify = toAliasEntries(VERIFY_COMMAND_MANIFEST, 'verify');
const expectedInit = toAliasEntries(INIT_COMMAND_MANIFEST, 'init');
const expectedPhase = toAliasEntries(PHASE_COMMAND_MANIFEST, 'phase');
const expectedPhases = toAliasEntries(PHASES_COMMAND_MANIFEST, 'phases');
const expectedValidate = toAliasEntries(VALIDATE_COMMAND_MANIFEST, 'validate');
const expectedRoadmap = toAliasEntries(ROADMAP_COMMAND_MANIFEST, 'roadmap');
assertEqual('TS STATE_COMMAND_ALIASES', STATE_COMMAND_ALIASES, expectedState);
assertEqual('TS VERIFY_COMMAND_ALIASES', VERIFY_COMMAND_ALIASES, expectedVerify);
assertEqual('TS INIT_COMMAND_ALIASES', INIT_COMMAND_ALIASES, expectedInit);
assertEqual('TS PHASE_COMMAND_ALIASES', PHASE_COMMAND_ALIASES, expectedPhase);
assertEqual('TS PHASES_COMMAND_ALIASES', PHASES_COMMAND_ALIASES, expectedPhases);
assertEqual('TS VALIDATE_COMMAND_ALIASES', VALIDATE_COMMAND_ALIASES, expectedValidate);
assertEqual('TS ROADMAP_COMMAND_ALIASES', ROADMAP_COMMAND_ALIASES, expectedRoadmap);
assertEqual('CJS STATE_COMMAND_ALIASES', cjsAliases.STATE_COMMAND_ALIASES, expectedState);
assertEqual('CJS VERIFY_COMMAND_ALIASES', cjsAliases.VERIFY_COMMAND_ALIASES, expectedVerify);
assertEqual('CJS INIT_COMMAND_ALIASES', cjsAliases.INIT_COMMAND_ALIASES, expectedInit);
assertEqual('CJS PHASE_COMMAND_ALIASES', cjsAliases.PHASE_COMMAND_ALIASES, expectedPhase);
assertEqual('CJS PHASES_COMMAND_ALIASES', cjsAliases.PHASES_COMMAND_ALIASES, expectedPhases);
assertEqual('CJS VALIDATE_COMMAND_ALIASES', cjsAliases.VALIDATE_COMMAND_ALIASES, expectedValidate);
assertEqual('CJS ROADMAP_COMMAND_ALIASES', cjsAliases.ROADMAP_COMMAND_ALIASES, expectedRoadmap);
console.log('command alias artifacts are fresh');

View File

@@ -0,0 +1,124 @@
#!/usr/bin/env node
/**
* Build-time alias generator skeleton for command-manifest-driven routing.
*
* This pilot commits generated artifacts directly; this script documents and
* preserves the generation seam so future command families can be migrated
* without hand-maintained alias duplication.
*/
import { writeFile } from 'node:fs/promises';
import { fileURLToPath } from 'node:url';
import { STATE_COMMAND_MANIFEST } from '../src/query/command-manifest.state.js';
import { VERIFY_COMMAND_MANIFEST } from '../src/query/command-manifest.verify.js';
import { INIT_COMMAND_MANIFEST } from '../src/query/command-manifest.init.js';
import { PHASE_COMMAND_MANIFEST } from '../src/query/command-manifest.phase.js';
import { PHASES_COMMAND_MANIFEST } from '../src/query/command-manifest.phases.js';
import { VALIDATE_COMMAND_MANIFEST } from '../src/query/command-manifest.validate.js';
import { ROADMAP_COMMAND_MANIFEST } from '../src/query/command-manifest.roadmap.js';
function toSubcommand(canonical: string, family: 'state' | 'verify' | 'init' | 'phase' | 'phases' | 'validate' | 'roadmap'): string {
const prefix = `${family}.`;
return canonical.startsWith(prefix) ? canonical.slice(prefix.length) : canonical;
}
async function main(): Promise<void> {
const stateEntries = STATE_COMMAND_MANIFEST.map((entry) => ({
canonical: entry.canonical,
aliases: entry.aliases,
subcommand: toSubcommand(entry.canonical, 'state'),
mutation: entry.mutation,
}));
const verifyEntries = VERIFY_COMMAND_MANIFEST.map((entry) => ({
canonical: entry.canonical,
aliases: entry.aliases,
subcommand: toSubcommand(entry.canonical, 'verify'),
mutation: entry.mutation,
}));
const initEntries = INIT_COMMAND_MANIFEST.map((entry) => ({
canonical: entry.canonical,
aliases: entry.aliases,
subcommand: toSubcommand(entry.canonical, 'init'),
mutation: entry.mutation,
}));
const phaseEntries = PHASE_COMMAND_MANIFEST.map((entry) => ({
canonical: entry.canonical,
aliases: entry.aliases,
subcommand: toSubcommand(entry.canonical, 'phase'),
mutation: entry.mutation,
}));
const phasesEntries = PHASES_COMMAND_MANIFEST.map((entry) => ({
canonical: entry.canonical,
aliases: entry.aliases,
subcommand: toSubcommand(entry.canonical, 'phases'),
mutation: entry.mutation,
}));
const validateEntries = VALIDATE_COMMAND_MANIFEST.map((entry) => ({
canonical: entry.canonical,
aliases: entry.aliases,
subcommand: toSubcommand(entry.canonical, 'validate'),
mutation: entry.mutation,
}));
const roadmapEntries = ROADMAP_COMMAND_MANIFEST.map((entry) => ({
canonical: entry.canonical,
aliases: entry.aliases,
subcommand: toSubcommand(entry.canonical, 'roadmap'),
mutation: entry.mutation,
}));
const outPath = fileURLToPath(new URL('../src/query/command-aliases.generated.ts', import.meta.url));
const header = `/**\n * GENERATED FILE — command alias expansion for state.*, verify.*, init.*, phase.*, phases.*, validate.*, and roadmap.* pilots.\n * Source: sdk/src/query/command-manifest.{state,verify,init,phase,phases,validate,roadmap}.ts\n */\n\n`;
const body = [
`export const STATE_COMMAND_ALIASES = ${JSON.stringify(stateEntries, null, 2)} as const;`,
'',
`export const VERIFY_COMMAND_ALIASES = ${JSON.stringify(verifyEntries, null, 2)} as const;`,
'',
`export const INIT_COMMAND_ALIASES = ${JSON.stringify(initEntries, null, 2)} as const;`,
'',
`export const PHASE_COMMAND_ALIASES = ${JSON.stringify(phaseEntries, null, 2)} as const;`,
'',
`export const PHASES_COMMAND_ALIASES = ${JSON.stringify(phasesEntries, null, 2)} as const;`,
'',
`export const VALIDATE_COMMAND_ALIASES = ${JSON.stringify(validateEntries, null, 2)} as const;`,
'',
`export const ROADMAP_COMMAND_ALIASES = ${JSON.stringify(roadmapEntries, null, 2)} as const;`,
'',
'export const STATE_SUBCOMMANDS = new Set<string>(STATE_COMMAND_ALIASES.map((entry) => entry.subcommand));',
'export const VERIFY_SUBCOMMANDS = new Set<string>(VERIFY_COMMAND_ALIASES.map((entry) => entry.subcommand));',
'export const INIT_SUBCOMMANDS = new Set<string>(INIT_COMMAND_ALIASES.map((entry) => entry.subcommand));',
'export const PHASE_SUBCOMMANDS = new Set<string>(PHASE_COMMAND_ALIASES.map((entry) => entry.subcommand));',
'export const PHASES_SUBCOMMANDS = new Set<string>(PHASES_COMMAND_ALIASES.map((entry) => entry.subcommand));',
'export const VALIDATE_SUBCOMMANDS = new Set<string>(VALIDATE_COMMAND_ALIASES.map((entry) => entry.subcommand));',
'export const ROADMAP_SUBCOMMANDS = new Set<string>(ROADMAP_COMMAND_ALIASES.map((entry) => entry.subcommand));',
'',
'export const STATE_MUTATION_COMMANDS: readonly string[] = STATE_COMMAND_ALIASES',
' .filter((entry) => entry.mutation)',
' .flatMap((entry) => [entry.canonical, ...entry.aliases]);',
'',
'export const PHASE_MUTATION_COMMANDS: readonly string[] = PHASE_COMMAND_ALIASES',
' .filter((entry) => entry.mutation)',
' .flatMap((entry) => [entry.canonical, ...entry.aliases]);',
'',
'export const PHASES_MUTATION_COMMANDS: readonly string[] = PHASES_COMMAND_ALIASES',
' .filter((entry) => entry.mutation)',
' .flatMap((entry) => [entry.canonical, ...entry.aliases]);',
'',
'export const ROADMAP_MUTATION_COMMANDS: readonly string[] = ROADMAP_COMMAND_ALIASES',
' .filter((entry) => entry.mutation)',
' .flatMap((entry) => [entry.canonical, ...entry.aliases]);',
'',
].join('\n');
await writeFile(outPath, header + body, 'utf-8');
}
main().catch((err) => {
console.error(err);
process.exit(1);
});