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:
@@ -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.',
|
||||
|
||||
Reference in New Issue
Block a user