refactor: hard-fork GSD -> MSD (Make Software Done)

Mechanical rename produced by scripts/msd-rename.cjs: gsd/Gsd/GSD -> msd/Msd/MSD
across contents and paths, upstream package/repo coordinates -> @golem15/msd-core
and golem15com/msd-core. Deep links into upstream history, sibling upstream
packages, the GSD-2 import feature, CHANGELOG.md and .changeset/ are kept as-is.

Hand edits on top: MSD block-letter banner and logos, LICENSE copyright line,
package/plugin identity, regenerated lockfile, install-tree fixtures, derived
registries and benchmark baseline; migration checksum baseline re-locked
(MSD keeps its own install state, so no install had applied the old sums);
sort-order and regex-escaped expectations in tests adjusted.
This commit is contained in:
Jakub Zych
2026-10-06 01:47:40 +02:00
parent fe069b2a56
commit a9a7a328e6
2763 changed files with 78465 additions and 78434 deletions

View File

@@ -4,10 +4,10 @@
// exception matrix.
/**
* GSD Tools Tests - #4051 freeform routing specificity contract
* MSD Tools Tests - #4051 freeform routing specificity contract
*
* Validates that the `/gsd:progress --do` dispatcher workflow
* (gsd-core/workflows/do.md):
* Validates that the `/msd:progress --do` dispatcher workflow
* (msd-core/workflows/do.md):
* 1. Orders specific routing rules BEFORE the generic rules they shadow
* (brownfield onboarding before greenfield "set up"; spike/sketch
* wrap-up before generic spike/sketch).
@@ -35,34 +35,34 @@ const path = require('path');
describe('#4051 freeform routing specificity', () => {
const repoRoot = path.join(__dirname, '..');
const doMd = () => fs.readFileSync(path.join(repoRoot, 'gsd-core', 'workflows', 'do.md'), 'utf8');
const doMd = () => fs.readFileSync(path.join(repoRoot, 'msd-core', 'workflows', 'do.md'), 'utf8');
const commandMd = (name) =>
fs.readFileSync(path.join(repoRoot, 'commands', 'gsd', `${name}.md`), 'utf8');
fs.readFileSync(path.join(repoRoot, 'commands', 'msd', `${name}.md`), 'utf8');
test('do.md orders specific routes before the generic rules they shadow', () => {
const content = doMd();
// Specific brownfield onboarding BEFORE generic greenfield "set up" —
// "set up this existing codebase" must not first-match the greenfield row.
const onboardIdx = content.indexOf('/gsd:onboard');
const newProjectIdx = content.indexOf('/gsd:new-project');
assert.ok(onboardIdx > -1, 'do.md must route to /gsd:onboard');
assert.ok(newProjectIdx > -1, 'do.md must route to /gsd:new-project');
const onboardIdx = content.indexOf('/msd:onboard');
const newProjectIdx = content.indexOf('/msd:new-project');
assert.ok(onboardIdx > -1, 'do.md must route to /msd:onboard');
assert.ok(newProjectIdx > -1, 'do.md must route to /msd:new-project');
assert.ok(
onboardIdx < newProjectIdx,
'the brownfield onboarding (/gsd:onboard) rule must precede the greenfield (/gsd:new-project) "set up" rule so "set up this existing codebase" matches onboarding first'
'the brownfield onboarding (/msd:onboard) rule must precede the greenfield (/msd:new-project) "set up" rule so "set up this existing codebase" matches onboarding first'
);
// Spike/sketch wrap-up BEFORE the generic spike/sketch rows —
// "wrap up the spike findings" must not first-match "start a new spike".
const spikeWrapIdx = content.indexOf('/gsd:spike --wrap-up');
const sketchWrapIdx = content.indexOf('/gsd:sketch --wrap-up');
assert.ok(spikeWrapIdx > -1, 'do.md must route spike wrap-up to /gsd:spike --wrap-up');
assert.ok(sketchWrapIdx > -1, 'do.md must route sketch wrap-up to /gsd:sketch --wrap-up');
const genericSpikeIdx = content.indexOf('| `/gsd:spike` |');
const genericSketchIdx = content.indexOf('| `/gsd:sketch` |');
assert.ok(genericSpikeIdx > -1, 'do.md must keep the generic /gsd:spike route');
assert.ok(genericSketchIdx > -1, 'do.md must keep the generic /gsd:sketch route');
const spikeWrapIdx = content.indexOf('/msd:spike --wrap-up');
const sketchWrapIdx = content.indexOf('/msd:sketch --wrap-up');
assert.ok(spikeWrapIdx > -1, 'do.md must route spike wrap-up to /msd:spike --wrap-up');
assert.ok(sketchWrapIdx > -1, 'do.md must route sketch wrap-up to /msd:sketch --wrap-up');
const genericSpikeIdx = content.indexOf('| `/msd:spike` |');
const genericSketchIdx = content.indexOf('| `/msd:sketch` |');
assert.ok(genericSpikeIdx > -1, 'do.md must keep the generic /msd:spike route');
assert.ok(genericSketchIdx > -1, 'do.md must keep the generic /msd:sketch route');
assert.ok(
spikeWrapIdx < genericSpikeIdx,
'the spike wrap-up rule must precede the generic spike rule'
@@ -72,12 +72,12 @@ describe('#4051 freeform routing specificity', () => {
'the sketch wrap-up rule must precede the generic sketch rule'
);
// Source review must be routable to /gsd:code-review, not only the
// Source review must be routable to /msd:code-review, not only the
// generic verify-work fallback.
const codeReviewIdx = content.indexOf('/gsd:code-review');
const verifyWorkIdx = content.indexOf('| `/gsd:verify-work` |');
assert.ok(codeReviewIdx > -1, 'do.md must route source review to /gsd:code-review');
assert.ok(verifyWorkIdx > -1, 'do.md must keep the generic /gsd:verify-work route');
const codeReviewIdx = content.indexOf('/msd:code-review');
const verifyWorkIdx = content.indexOf('| `/msd:verify-work` |');
assert.ok(codeReviewIdx > -1, 'do.md must route source review to /msd:code-review');
assert.ok(verifyWorkIdx > -1, 'do.md must keep the generic /msd:verify-work route');
assert.ok(
codeReviewIdx < verifyWorkIdx,
'the source code review rule must precede the generic verify-work quality rule'
@@ -87,16 +87,16 @@ describe('#4051 freeform routing specificity', () => {
test('do.md routes existing command families distinctly', () => {
const content = doMd();
const requiredRoutes = [
['/gsd:onboard', 'brownfield onboarding'],
['/gsd:code-review', 'source code review'],
['/gsd:review', 'plan review (cross-AI peer review)'],
['/gsd:docs-update', 'documentation update'],
['/gsd:audit-milestone', 'milestone audit'],
['/gsd:audit-fix', 'autonomous audit-to-fix pass'],
['/gsd:ui-review', 'UI review'],
['/gsd:secure-phase', 'security verification'],
['/gsd:execute-phase', 'SDD phase execution'],
['/gsd:phase', 'multi-phase (roadmap CRUD) management'],
['/msd:onboard', 'brownfield onboarding'],
['/msd:code-review', 'source code review'],
['/msd:review', 'plan review (cross-AI peer review)'],
['/msd:docs-update', 'documentation update'],
['/msd:audit-milestone', 'milestone audit'],
['/msd:audit-fix', 'autonomous audit-to-fix pass'],
['/msd:ui-review', 'UI review'],
['/msd:secure-phase', 'security verification'],
['/msd:execute-phase', 'SDD phase execution'],
['/msd:phase', 'multi-phase (roadmap CRUD) management'],
];
for (const [route, family] of requiredRoutes) {
assert.ok(content.includes(route), `do.md routing table must cover ${family} via ${route}`);
@@ -168,15 +168,15 @@ describe('#4051 freeform routing specificity', () => {
test('do.md keeps generic fallback routes dispatching (no over-suppression)', () => {
const content = doMd();
const genericRoutes = [
['| `/gsd:new-project` |', 'greenfield project setup'],
['| `/gsd:spike` |', 'new spike'],
['| `/gsd:sketch` |', 'new sketch'],
['| `/gsd:verify-work` |', 'generic quality concern fallback'],
['| `/gsd:debug` |', 'bug investigation'],
['| `/gsd:quick` |', 'small actionable task'],
['| `/gsd:explore` |', 'research / how-does-X-work'],
['| `/gsd:progress` |', 'status check'],
['| `/gsd:capture` |', 'note capture'],
['| `/msd:new-project` |', 'greenfield project setup'],
['| `/msd:spike` |', 'new spike'],
['| `/msd:sketch` |', 'new sketch'],
['| `/msd:verify-work` |', 'generic quality concern fallback'],
['| `/msd:debug` |', 'bug investigation'],
['| `/msd:quick` |', 'small actionable task'],
['| `/msd:explore` |', 'research / how-does-X-work'],
['| `/msd:progress` |', 'status check'],
['| `/msd:capture` |', 'note capture'],
];
for (const [marker, family] of genericRoutes) {
assert.ok(content.includes(marker), `do.md must keep routing ${family} (${marker})`);