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:
@@ -15,13 +15,13 @@ const { test, describe } = require('node:test');
|
||||
const assert = require('node:assert/strict');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { scanFencedBlocks } = require('../gsd-core/bin/lib/markdown-sectionizer.cjs');
|
||||
const { scanFencedBlocks } = require('../msd-core/bin/lib/markdown-sectionizer.cjs');
|
||||
|
||||
const COMMAND_PATH = path.join(__dirname, '..', 'commands', 'gsd', 'execute-phase.md');
|
||||
const COMMAND_PATH = path.join(__dirname, '..', 'commands', 'msd', 'execute-phase.md');
|
||||
|
||||
describe('execute-phase command: active flags are explicit', () => {
|
||||
test('command file exists', () => {
|
||||
assert.ok(fs.existsSync(COMMAND_PATH), 'commands/gsd/execute-phase.md should exist');
|
||||
assert.ok(fs.existsSync(COMMAND_PATH), 'commands/msd/execute-phase.md should exist');
|
||||
});
|
||||
|
||||
test('objective says documented flags are not implied active', () => {
|
||||
@@ -96,14 +96,14 @@ const assert = require('node:assert/strict');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const EXECUTE_PHASE_PATH = path.join(__dirname, '..', 'gsd-core', 'workflows', 'execute-phase.md');
|
||||
const AUDIT_FIX_PATH = path.join(__dirname, '..', 'gsd-core', 'workflows', 'audit-fix.md');
|
||||
const EXECUTE_PHASE_PATH = path.join(__dirname, '..', 'msd-core', 'workflows', 'execute-phase.md');
|
||||
const AUDIT_FIX_PATH = path.join(__dirname, '..', 'msd-core', 'workflows', 'audit-fix.md');
|
||||
// #1857: execute-phase's regression-gate test-command resolution was extracted
|
||||
// to this step file (execute-phase.md is size-frozen — phase-6 capstone).
|
||||
// #2932: steps/regression-gate.md now only discovers prior-phase test files and
|
||||
// delegates (via "Read and execute") to steps/regression-gate-run.md, which
|
||||
// carries the actual test-command resolution (Makefile/config-get priority).
|
||||
const REGRESSION_GATE_PATH = path.join(__dirname, '..', 'gsd-core', 'workflows', 'execute-phase', 'steps', 'regression-gate-run.md');
|
||||
const REGRESSION_GATE_PATH = path.join(__dirname, '..', 'msd-core', 'workflows', 'execute-phase', 'steps', 'regression-gate-run.md');
|
||||
|
||||
function assertMakefileCheckBeforeNpmTest(filePath, label) {
|
||||
const content = fs.readFileSync(filePath, 'utf-8');
|
||||
@@ -227,18 +227,18 @@ const path = require('path');
|
||||
const WORKFLOW_PATH = path.join(
|
||||
__dirname,
|
||||
'..',
|
||||
'gsd-core',
|
||||
'msd-core',
|
||||
'workflows',
|
||||
'execute-phase.md'
|
||||
);
|
||||
|
||||
describe('bug #2516: executor_model "inherit" must not be passed literally to Task()', () => {
|
||||
test('workflow file exists', () => {
|
||||
assert.ok(fs.existsSync(WORKFLOW_PATH), 'gsd-core/workflows/execute-phase.md should exist');
|
||||
assert.ok(fs.existsSync(WORKFLOW_PATH), 'msd-core/workflows/execute-phase.md should exist');
|
||||
});
|
||||
|
||||
test('workflow contains instructions for handling the "inherit" case', () => {
|
||||
assert.ok(fs.existsSync(WORKFLOW_PATH), 'gsd-core/workflows/execute-phase.md should exist');
|
||||
assert.ok(fs.existsSync(WORKFLOW_PATH), 'msd-core/workflows/execute-phase.md should exist');
|
||||
const content = fs.readFileSync(WORKFLOW_PATH, 'utf-8');
|
||||
const hasInheritInstruction =
|
||||
content.includes('"inherit"') &&
|
||||
@@ -253,7 +253,7 @@ describe('bug #2516: executor_model "inherit" must not be passed literally to Ta
|
||||
});
|
||||
|
||||
test('workflow does not instruct passing model="inherit" literally to Task', () => {
|
||||
assert.ok(fs.existsSync(WORKFLOW_PATH), 'gsd-core/workflows/execute-phase.md should exist');
|
||||
assert.ok(fs.existsSync(WORKFLOW_PATH), 'msd-core/workflows/execute-phase.md should exist');
|
||||
const content = fs.readFileSync(WORKFLOW_PATH, 'utf-8');
|
||||
// The workflow must not have an unconditional model="{executor_model}" template
|
||||
// that would pass "inherit" through. It should document conditional logic.
|
||||
@@ -298,7 +298,7 @@ describe('bug #2516: executor_model "inherit" must not be passed literally to Ta
|
||||
});
|
||||
|
||||
test('workflow documents that omitting model= causes inheritance from orchestrator', () => {
|
||||
assert.ok(fs.existsSync(WORKFLOW_PATH), 'gsd-core/workflows/execute-phase.md should exist');
|
||||
assert.ok(fs.existsSync(WORKFLOW_PATH), 'msd-core/workflows/execute-phase.md should exist');
|
||||
const content = fs.readFileSync(WORKFLOW_PATH, 'utf-8');
|
||||
const hasInheritanceExplanation =
|
||||
content.includes('inherit') &&
|
||||
@@ -335,8 +335,8 @@ describe('bug #2516: executor_model "inherit" must not be passed literally to Ta
|
||||
* recommendation, leaving agents without guidance on the correct first step.
|
||||
*
|
||||
* Fixed: offer_next now checks for {next}-CONTEXT.md in the phase directory.
|
||||
* - If CONTEXT.md is missing: primary suggestion is /gsd-discuss-phase
|
||||
* - If CONTEXT.md exists: primary suggestion is /gsd-plan-phase
|
||||
* - If CONTEXT.md is missing: primary suggestion is /msd-discuss-phase
|
||||
* - If CONTEXT.md exists: primary suggestion is /msd-plan-phase
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
@@ -347,7 +347,7 @@ const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
|
||||
const workflowPath = path.resolve(
|
||||
__dirname, '..', 'gsd-core', 'workflows', 'execute-phase.md'
|
||||
__dirname, '..', 'msd-core', 'workflows', 'execute-phase.md'
|
||||
);
|
||||
|
||||
describe('bug #2002: next-step suggestion checks CONTEXT.md (now via transition offer_next_phase, reached by execute-phase post-completion delegation — #1526)', () => {
|
||||
@@ -355,7 +355,7 @@ describe('bug #2002: next-step suggestion checks CONTEXT.md (now via transition
|
||||
// post-completion to the transition workflow, whose offer_next_phase step performs
|
||||
// the #2002 CONTEXT.md-gated next-step suggestion. These tests track that behavior
|
||||
// in its new home (transition.md) and assert the delegation reaches it.
|
||||
const transPath = path.resolve(__dirname, '..', 'gsd-core', 'workflows', 'transition.md');
|
||||
const transPath = path.resolve(__dirname, '..', 'msd-core', 'workflows', 'transition.md');
|
||||
let offerNextPhase;
|
||||
|
||||
test('setup: transition.md offer_next_phase section is readable', () => {
|
||||
@@ -370,7 +370,7 @@ describe('bug #2002: next-step suggestion checks CONTEXT.md (now via transition
|
||||
test('#1526: execute-phase delegates post-completion to transition (no inline offer_next step)', () => {
|
||||
const wf = fs.readFileSync(workflowPath, 'utf-8');
|
||||
assert.ok(wf.includes('delegate_post_completion_to_transition'), 'execute-phase must delegate post-completion to transition');
|
||||
assert.ok(wf.includes('@~/.claude/gsd-core/workflows/transition.md'), 'execute-phase must @-include transition.md');
|
||||
assert.ok(wf.includes('@~/.claude/msd-core/workflows/transition.md'), 'execute-phase must @-include transition.md');
|
||||
assert.equal(wf.includes('<step name="offer_next">'), false, 'inline offer_next step is intentionally removed (delegated to transition.offer_next_phase)');
|
||||
});
|
||||
|
||||
@@ -381,18 +381,18 @@ describe('bug #2002: next-step suggestion checks CONTEXT.md (now via transition
|
||||
);
|
||||
});
|
||||
|
||||
test('offer_next_phase presents /gsd-discuss-phase when CONTEXT.md does not exist', () => {
|
||||
test('offer_next_phase presents /msd-discuss-phase when CONTEXT.md does not exist', () => {
|
||||
assert.ok(
|
||||
/CONTEXT\.md.*does not exist|CONTEXT\.md.*not.*exist|If CONTEXT\.md does/i.test(offerNextPhase) ||
|
||||
/discuss-phase/i.test(offerNextPhase),
|
||||
'offer_next_phase must present /gsd-discuss-phase as primary when CONTEXT.md does not exist'
|
||||
'offer_next_phase must present /msd-discuss-phase as primary when CONTEXT.md does not exist'
|
||||
);
|
||||
});
|
||||
|
||||
test('offer_next_phase presents /gsd-plan-phase when CONTEXT.md exists', () => {
|
||||
test('offer_next_phase presents /msd-plan-phase when CONTEXT.md exists', () => {
|
||||
assert.ok(
|
||||
/CONTEXT\.md.*exists|exists.*CONTEXT\.md|If CONTEXT\.md/i.test(offerNextPhase),
|
||||
'offer_next_phase must present /gsd-plan-phase as primary when CONTEXT.md exists'
|
||||
'offer_next_phase must present /msd-plan-phase as primary when CONTEXT.md exists'
|
||||
);
|
||||
});
|
||||
|
||||
@@ -426,7 +426,7 @@ const path = require('node:path');
|
||||
const fc = require('fast-check');
|
||||
|
||||
const ROOT = path.join(__dirname, '..');
|
||||
const WORKFLOW = path.join(ROOT, 'gsd-core', 'workflows', 'execute-phase.md');
|
||||
const WORKFLOW = path.join(ROOT, 'msd-core', 'workflows', 'execute-phase.md');
|
||||
const MATRIX = path.join(ROOT, 'docs', 'reference', 'host-integration-capability-matrix.md');
|
||||
const DESCRIPTOR = path.join(ROOT, 'capabilities', 'claude', 'capability.json');
|
||||
|
||||
@@ -488,7 +488,7 @@ describe('#3177: execute-phase.md states Claude Code dispatch truthfully', () =>
|
||||
+ 'opt-out is not the guidance here — confirming completion is.',
|
||||
);
|
||||
assert.ok(
|
||||
bullet.includes('Agent(subagent_type="gsd-executor"'),
|
||||
bullet.includes('Agent(subagent_type="msd-executor"'),
|
||||
'the bullet must still carry the dispatch mechanism the rest of the file depends on',
|
||||
);
|
||||
});
|
||||
@@ -610,14 +610,14 @@ describe('#3177: matrix section extraction is bounded by its heading', () => {
|
||||
});
|
||||
|
||||
describe('#3177: debug.md dispatches its session manager in the foreground', () => {
|
||||
const DEBUG_WF = path.join(ROOT, 'gsd-core', 'workflows', 'debug.md');
|
||||
const DEBUG_WF = path.join(ROOT, 'msd-core', 'workflows', 'debug.md');
|
||||
const debugText = () => fs.readFileSync(DEBUG_WF, 'utf8');
|
||||
|
||||
/**
|
||||
* Every fenced `Agent( … )` block in debug.md that dispatches the session manager.
|
||||
*
|
||||
* Anchored on a line that is exactly `Agent(` so the PROSE mention of
|
||||
* `Agent(subagent_type="gsd-debug-session-manager", …)` inside the blockquote at
|
||||
* `Agent(subagent_type="msd-debug-session-manager", …)` inside the blockquote at
|
||||
* :206 is not mistaken for a dispatch. Positional selection (first match wins) was
|
||||
* the original bug here: it silently checked the continue path while the
|
||||
* new-session path went unexamined.
|
||||
@@ -628,7 +628,7 @@ describe('#3177: debug.md dispatches its session manager in the foreground', ()
|
||||
const close = text.indexOf('\n)', m.index);
|
||||
if (close === -1) continue;
|
||||
const block = text.slice(m.index, close);
|
||||
if (block.includes('subagent_type="gsd-debug-session-manager"')) blocks.push(block);
|
||||
if (block.includes('subagent_type="msd-debug-session-manager"')) blocks.push(block);
|
||||
}
|
||||
return blocks;
|
||||
}
|
||||
@@ -649,7 +649,7 @@ describe('#3177: debug.md dispatches its session manager in the foreground', ()
|
||||
for (const block of blocks) {
|
||||
assert.match(
|
||||
block, /run_in_background\s*=\s*false/,
|
||||
'every gsd-debug-session-manager dispatch must pass run_in_background=false — without '
|
||||
'every msd-debug-session-manager dispatch must pass run_in_background=false — without '
|
||||
+ 'it Claude Code backgrounds the spawn and the compact summary never returns (#2196).',
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user