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

@@ -30,9 +30,9 @@ const path = require('path');
const fc = require('./helpers/fast-check-setup.cjs');
const { parseDecisions, extractDecisions } = require('../gsd-core/bin/lib/decisions.cjs');
const { iterateBullets } = require('../gsd-core/bin/lib/markdown-sectionizer.cjs');
const { runGsdTools, createTempProject, cleanup } = require('./helpers.cjs');
const { parseDecisions, extractDecisions } = require('../msd-core/bin/lib/decisions.cjs');
const { iterateBullets } = require('../msd-core/bin/lib/markdown-sectionizer.cjs');
const { runMsdTools, createTempProject, cleanup } = require('./helpers.cjs');
// ─── Regression #1364: markdown-header fallback ───────────────────────────────
@@ -417,7 +417,7 @@ function writePlanningConfig(planningDir, config) {
}
function runDecisionCoveragePlan(phaseDir, contextPath, cwd) {
return runGsdTools(['query', 'check.decision-coverage-plan', phaseDir, contextPath], cwd);
return runMsdTools(['query', 'check.decision-coverage-plan', phaseDir, contextPath], cwd);
}
describe('check.decision-coverage-plan — fail-loud on could-not-parse (#1365)', () => {
@@ -426,7 +426,7 @@ describe('check.decision-coverage-plan — fail-loud on could-not-parse (#1365)'
let phaseDir;
beforeEach(() => {
tmpDir = createTempProject('gsd-1365-');
tmpDir = createTempProject('msd-1365-');
planningDir = path.join(tmpDir, '.planning');
phaseDir = path.join(planningDir, 'phases', '01-init');
fs.mkdirSync(phaseDir, { recursive: true });
@@ -569,7 +569,7 @@ describe('check.decision-coverage-plan — boundary/threshold tests (#1365)', ()
let phaseDir;
beforeEach(() => {
tmpDir = createTempProject('gsd-1365-bva-');
tmpDir = createTempProject('msd-1365-bva-');
planningDir = path.join(tmpDir, '.planning');
phaseDir = path.join(planningDir, 'phases', '01-init');
fs.mkdirSync(phaseDir, { recursive: true });
@@ -693,7 +693,7 @@ describe('FIX B gate-level: parse-miss → passed:false regardless of covered de
let phaseDir;
beforeEach(() => {
tmpDir = createTempProject('gsd-1365-fixb-');
tmpDir = createTempProject('msd-1365-fixb-');
planningDir = path.join(tmpDir, '.planning');
phaseDir = path.join(planningDir, 'phases', '01-init');
fs.mkdirSync(phaseDir, { recursive: true });
@@ -783,7 +783,7 @@ describe('FIX B gate-level: parse-miss → passed:false regardless of covered de
writePlanFile(phaseDir, '01', '# Plan\n\n## Must Haves\n\n- D-01: implement JWT\n');
const contextPath = path.join(phaseDir, 'CONTEXT.md');
const result = runGsdTools(
const result = runMsdTools(
['query', 'check.decision-coverage-verify', phaseDir, contextPath],
tmpDir
);
@@ -844,8 +844,8 @@ describe('#3169: nested cross-reference bullet does not increment parseMisses',
assert.deepStrictEqual(result.decisions.map((d) => d.id), ['D-15']);
});
test('FAIL-FIRST row 20: end-to-end — /gsd-plan-phase §13a gate reports full coverage with nested cross-reference bullets present', () => {
const tmpDir = createTempProject('gsd-3169-');
test('FAIL-FIRST row 20: end-to-end — /msd-plan-phase §13a gate reports full coverage with nested cross-reference bullets present', () => {
const tmpDir = createTempProject('msd-3169-');
const planningDir = path.join(tmpDir, '.planning');
const phaseDir = path.join(planningDir, 'phases', '01-init');
fs.mkdirSync(phaseDir, { recursive: true });
@@ -952,14 +952,14 @@ describe('FIX C: curly-quote Claude’s Discretion → trackable:false (#1372)',
// ─── FIX D regressions: gap-checker surfaces decision parse failure independently ─
describe('FIX D: gap-checker surfaces decision could-not-parse even when requirements exist (#1372)', () => {
const { runGapAnalysis } = require('../gsd-core/bin/lib/gap-checker.cjs');
const { runGapAnalysis } = require('../msd-core/bin/lib/gap-checker.cjs');
let tmpDir;
let planningDir;
let phaseDir;
beforeEach(() => {
tmpDir = createTempProject('gsd-1372-fixd-');
tmpDir = createTempProject('msd-1372-fixd-');
planningDir = path.join(tmpDir, '.planning');
phaseDir = path.join(planningDir, 'phases', '01-init');
fs.mkdirSync(phaseDir, { recursive: true });
@@ -1071,7 +1071,7 @@ describe('check.decision-coverage-plan — planner-canonical tag scanning (#2372
let phaseDir;
beforeEach(() => {
tmpDir = createTempProject('gsd-2372-');
tmpDir = createTempProject('msd-2372-');
planningDir = path.join(tmpDir, '.planning');
phaseDir = path.join(planningDir, 'phases', '01-init');
fs.mkdirSync(phaseDir, { recursive: true });
@@ -1270,7 +1270,7 @@ describe('check.decision-coverage-plan — empty contextPath argument fails clos
let phaseDir;
beforeEach(() => {
tmpDir = createTempProject('gsd-2770-');
tmpDir = createTempProject('msd-2770-');
planningDir = path.join(tmpDir, '.planning');
phaseDir = path.join(planningDir, 'phases', '01-init');
fs.mkdirSync(phaseDir, { recursive: true });
@@ -1307,7 +1307,7 @@ describe('check.decision-coverage-plan — empty contextPath argument fails clos
test('undefined-ish argument omitted entirely → passed:false (fail closed)', () => {
// The CLI invocation drops a trailing empty arg in some shells; the handler must
// still fail closed when args[3] is absent (not just empty string).
const result = runGsdTools(['query', 'check.decision-coverage-plan', phaseDir], tmpDir);
const result = runMsdTools(['query', 'check.decision-coverage-plan', phaseDir], tmpDir);
const parsed = JSON.parse(result.output || '{}');
assert.strictEqual(parsed.passed, false,
`Missing contextPath argument must fail closed. Got: ${JSON.stringify(parsed)}`);
@@ -1318,7 +1318,7 @@ describe('check.decision-coverage-plan — empty contextPath argument fails clos
//
// parseDecisionLines matched each PHYSICAL line against the three bullet
// grammars, and all three require the closing `**` on the same line as the
// opening one. A decision bullet whose bold lead-in wraps — the shape GSD's own
// opening one. A decision bullet whose bold lead-in wraps — the shape MSD's own
// discuss-phase writer emits whenever a title runs past the wrap column — closes
// its bold run on a line the grammars never see together with the `- **D-`
// anchor, so all three miss and the #1365 parse-miss guard fires. One such miss
@@ -2184,7 +2184,7 @@ describe('check.decision-coverage-plan — wrapped bold lead-in does not hard-bl
let phaseDir;
beforeEach(() => {
tmpDir = createTempProject('gsd-3939-');
tmpDir = createTempProject('msd-3939-');
planningDir = path.join(tmpDir, '.planning');
phaseDir = path.join(planningDir, 'phases', '01-init');
fs.mkdirSync(phaseDir, { recursive: true });
@@ -2429,7 +2429,7 @@ describe('check.decision-coverage-plan — phase-prefixed decisions are readable
let phaseDir;
beforeEach(() => {
tmpDir = createTempProject('gsd-4130-');
tmpDir = createTempProject('msd-4130-');
planningDir = path.join(tmpDir, '.planning');
phaseDir = path.join(planningDir, 'phases', '01-init');
fs.mkdirSync(phaseDir, { recursive: true });
@@ -2494,7 +2494,7 @@ describe('check.decision-coverage-verify — phase-prefixed decisions are readab
let phaseDir;
beforeEach(() => {
tmpDir = createTempProject('gsd-4130v-');
tmpDir = createTempProject('msd-4130v-');
planningDir = path.join(tmpDir, '.planning');
phaseDir = path.join(planningDir, 'phases', '01-init');
fs.mkdirSync(phaseDir, { recursive: true });
@@ -2513,7 +2513,7 @@ describe('check.decision-coverage-verify — phase-prefixed decisions are readab
writePlanFile(phaseDir, '01', '# Plan\n## Must Haves\n- D4-01: provision the datastore\n');
const contextPath = path.join(phaseDir, 'CONTEXT.md');
const result = runGsdTools(
const result = runMsdTools(
['query', 'check.decision-coverage-verify', phaseDir, contextPath],
tmpDir,
);
@@ -2554,7 +2554,7 @@ describe('check.decision-coverage-plan — --context flag matches the positional
let phaseDir;
beforeEach(() => {
tmpDir = createTempProject('gsd-4130fu-');
tmpDir = createTempProject('msd-4130fu-');
planningDir = path.join(tmpDir, '.planning');
phaseDir = path.join(planningDir, 'phases', '01-init');
fs.mkdirSync(phaseDir, { recursive: true });
@@ -2563,7 +2563,7 @@ describe('check.decision-coverage-plan — --context flag matches the positional
afterEach(() => cleanup(tmpDir));
/** Invoke the gate with a raw arg vector (after the subcommand). */
const runDcp = (args) => runGsdTools(['query', 'check.decision-coverage-plan', ...args], tmpDir);
const runDcp = (args) => runMsdTools(['query', 'check.decision-coverage-plan', ...args], tmpDir);
const coveredContext = () => [
'# Phase 4 Context',
@@ -2710,11 +2710,11 @@ describe('check.decision-coverage-plan — --context flag matches the positional
// The verify gate is out of scope by directive: its positional contract
// is unchanged, and it does not gain --context handling.
const verify = JSON.parse(runGsdTools(['query', 'check.decision-coverage-verify', phaseDir, contextPath], tmpDir).output || '{}');
const verify = JSON.parse(runMsdTools(['query', 'check.decision-coverage-verify', phaseDir, contextPath], tmpDir).output || '{}');
assert.strictEqual(verify.total, 1);
assert.strictEqual(verify.honored, 1);
const verifyFlagForm = JSON.parse(runGsdTools(['query', 'check.decision-coverage-verify', phaseDir, '--context', contextPath], tmpDir).output || '{}');
const verifyFlagForm = JSON.parse(runMsdTools(['query', 'check.decision-coverage-verify', phaseDir, '--context', contextPath], tmpDir).output || '{}');
assert.strictEqual(verifyFlagForm.skipped, true,
`verify must keep reading args[3] positionally (unchanged base behavior). Got: ${JSON.stringify(verifyFlagForm)}`);
assert.strictEqual(verifyFlagForm.reason, 'CONTEXT.md missing');
@@ -3147,7 +3147,7 @@ describe('#4794: decision-coverage answers an unmeasured shape on could-not-pars
const contentWith = (bullets) => `<decisions>\n${bullets.map((b) => '- ' + b).join('\n')}\n</decisions>`;
beforeEach(() => {
tmpDir = createTempProject('gsd-4794-');
tmpDir = createTempProject('msd-4794-');
planningDir = path.join(tmpDir, '.planning');
phaseDir = path.join(planningDir, 'phases', '01-init');
fs.mkdirSync(phaseDir, { recursive: true });
@@ -3222,7 +3222,7 @@ describe('#4794: decision-coverage answers an unmeasured shape on could-not-pars
});
test('#4794: extractDecisions surfaces the ids of bullets that failed to parse', () => {
const { extractDecisions: extract } = require(path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'decisions.cjs'));
const { extractDecisions: extract } = require(path.join(__dirname, '..', 'msd-core', 'bin', 'lib', 'decisions.cjs'));
const md = contentWith([
'**D-01: The list shows one row per contact.** Nothing else changes.',
'**D-02: Two managers creating a card for the same pair: the second is rejected.** One pair, one card.',