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,27 +4,27 @@
* Refactor-trigger integration + e2e tests (issue #1953).
*
* Covers test matrix rows 54b and 55-92 — the git adapter, the CLI contract
* (`gsd-tools refactor <subcommand>`), disposition + ledger interplay, strict
* (`msd-tools refactor <subcommand>`), disposition + ledger interplay, strict
* mode's broken-windows integration, and the loop/registry wiring. Rows 1-54
* (analyzer, evaluator, baseline persistence) live in
* tests/complexity-trigger.test.cjs — out of scope here.
*
* Spec sources (authoritative):
* - .gsd/phase/feat-1953-complexity-triggered-refactor/42-router-contract.md
* - .gsd/phase/feat-1953-complexity-triggered-refactor/50-test-matrix.md
* - .gsd/phase/feat-1953-complexity-triggered-refactor/40-design.md
* - .msd/phase/feat-1953-complexity-triggered-refactor/42-router-contract.md
* - .msd/phase/feat-1953-complexity-triggered-refactor/50-test-matrix.md
* - .msd/phase/feat-1953-complexity-triggered-refactor/40-design.md
*
* Automation split (per 50-test-matrix.md Step 1): rows 55-56/61-62/74-90 use
* the router's `_git`/`_windows`/`_core` injection seams in-process (no real
* git/broken-windows I/O, no temp-dir races); rows 57-60/63-73 exercise the
* real `gsd-tools` CLI subprocess via tests/helpers/process-seam.cjs, because
* real `msd-tools` CLI subprocess via tests/helpers/process-seam.cjs, because
* they are the actual CLI-contract/subprocess-degrade surface.
*
* Hermetic: every fixture dir via createTempGitProject/createTempDir +
* t.after(cleanup); every fs/require mock via mock.method(...), restored via
* t.after(...mock.restore()). No shared module-level fixture state (row 91).
* Every gsd-tools subprocess invocation clears GSD_WORKSTREAM/GSD_PROJECT/
* GSD_SESSION_KEY so a developer's shell cannot redirect the fixture (row 92).
* Every msd-tools subprocess invocation clears MSD_WORKSTREAM/MSD_PROJECT/
* MSD_SESSION_KEY so a developer's shell cannot redirect the fixture (row 92).
*/
const { describe, test, mock } = require('node:test');
@@ -43,21 +43,21 @@ const {
PROPOSAL_SUFFIX,
DEFAULTS,
analyzeSource,
} = require('../gsd-core/bin/lib/complexity-trigger.cjs');
const gitBaseBranch = require('../gsd-core/bin/lib/git-base-branch.cjs');
const windowsModule = require('../gsd-core/bin/lib/broken-windows.cjs');
const lockModule = require('../gsd-core/bin/lib/capability-lock.cjs');
const { routeRefactorTriggerCommand } = require('../gsd-core/bin/lib/refactor-trigger-command-router.cjs');
const registry = require('../gsd-core/bin/lib/capability-registry.cjs');
const { validateCapability, VALID_LOOP_POINTS } = require('../gsd-core/bin/lib/capability-validator.cjs');
const { resolveLoopHooks } = require('../gsd-core/bin/lib/loop-resolver.cjs');
const { ERROR_REASON } = require('../gsd-core/bin/lib/io.cjs');
} = require('../msd-core/bin/lib/complexity-trigger.cjs');
const gitBaseBranch = require('../msd-core/bin/lib/git-base-branch.cjs');
const windowsModule = require('../msd-core/bin/lib/broken-windows.cjs');
const lockModule = require('../msd-core/bin/lib/capability-lock.cjs');
const { routeRefactorTriggerCommand } = require('../msd-core/bin/lib/refactor-trigger-command-router.cjs');
const registry = require('../msd-core/bin/lib/capability-registry.cjs');
const { validateCapability, VALID_LOOP_POINTS } = require('../msd-core/bin/lib/capability-validator.cjs');
const { resolveLoopHooks } = require('../msd-core/bin/lib/loop-resolver.cjs');
const { ERROR_REASON } = require('../msd-core/bin/lib/io.cjs');
const refactorTriggerCapability = require('../capabilities/refactor-trigger/capability.json');
const GSD_TOOLS = path.join(__dirname, '..', 'gsd-core', 'bin', 'gsd-tools.cjs');
const ROUTER_MODULE_PATH = require.resolve('../gsd-core/bin/lib/refactor-trigger-command-router.cjs');
const MSD_TOOLS = path.join(__dirname, '..', 'msd-core', 'bin', 'msd-tools.cjs');
const ROUTER_MODULE_PATH = require.resolve('../msd-core/bin/lib/refactor-trigger-command-router.cjs');
// A `gsd-tools refactor` subprocess in this suite does module require plus one
// A `msd-tools refactor` subprocess in this suite does module require plus one
// or two bounded (<=15s) git calls against a tiny mkdtemp repo — well over any
// observed duration for that class of call (mirrors the reasoning in
// tests/helpers/timeouts.cjs's own per-class constants; this call class is not
@@ -108,16 +108,16 @@ function commitFile(dir, relPath, content, message) {
}
function runCliOnce(args, cwd, envOverrides = {}) {
return runNode([GSD_TOOLS, ...args], {
return runNode([MSD_TOOLS, ...args], {
cwd,
timeoutMs: CLI_TIMEOUT_MS,
env: {
...process.env,
// Row 92: clear ambient GSD_* env so a developer's shell cannot
// Row 92: clear ambient MSD_* env so a developer's shell cannot
// redirect the fixture.
GSD_WORKSTREAM: '',
GSD_PROJECT: '',
GSD_SESSION_KEY: '',
MSD_WORKSTREAM: '',
MSD_PROJECT: '',
MSD_SESSION_KEY: '',
...envOverrides,
},
});
@@ -156,7 +156,7 @@ function setupTriggeringProject(prefix, strict) {
describe('refactor-trigger router: continues analyzing after one unreadable touched file (row 54b)', () => {
test('continuesAnalyzingAfterUnreadableFile', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-54b-');
const dir = createTempGitProject('msd-refactor-cli-54b-');
t.after(() => cleanup(dir));
writeConfig(dir, { refactor: { trigger_enabled: true, complexity_threshold: 1, complexity_jump_delta: 100 } });
seedPhaseAndAnchor(dir);
@@ -201,7 +201,7 @@ describe('refactor-trigger router: continues analyzing after one unreadable touc
describe('refactor-trigger: touched-file discovery (git adapter)', () => {
test('returnsTouchedPathsFromDiff', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-55-');
const dir = createTempGitProject('msd-refactor-cli-55-');
t.after(() => cleanup(dir));
const before = gitOrThrow(['rev-parse', 'HEAD'], { cwd: dir }).trim();
commitFile(dir, 'a.js', FLAT_JS, 'add a');
@@ -214,7 +214,7 @@ describe('refactor-trigger: touched-file discovery (git adapter)', () => {
});
test('handlesEmptyTouchedSet', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-56-');
const dir = createTempGitProject('msd-refactor-cli-56-');
t.after(() => cleanup(dir));
writeConfig(dir, { refactor: { trigger_enabled: true } });
seedPhaseAndAnchor(dir);
@@ -229,7 +229,7 @@ describe('refactor-trigger: touched-file discovery (git adapter)', () => {
});
test('degradesWhenNotAGitRepository', (t) => {
const dir = createTempDir('gsd-refactor-cli-57-');
const dir = createTempDir('msd-refactor-cli-57-');
t.after(() => cleanup(dir));
writeConfig(dir, { refactor: { trigger_enabled: true } });
const phaseDir = path.join(dir, '.planning', 'phases', '01-feat');
@@ -272,7 +272,7 @@ describe('refactor-trigger: touched-file discovery (git adapter)', () => {
});
test('roundTripsHostilePathsViaNulSeparatedDiff', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-60-');
const dir = createTempGitProject('msd-refactor-cli-60-');
t.after(() => cleanup(dir));
const before = gitOrThrow(['rev-parse', 'HEAD'], { cwd: dir }).trim();
const spaceName = 'a file with spaces.js';
@@ -288,7 +288,7 @@ describe('refactor-trigger: touched-file discovery (git adapter)', () => {
});
test('doesNotInterpretFlagLikePathAsGitOption', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-61-');
const dir = createTempGitProject('msd-refactor-cli-61-');
t.after(() => cleanup(dir));
const before = gitOrThrow(['rev-parse', 'HEAD'], { cwd: dir }).trim();
const flagLikeName = '--upload-pack=evil.js';
@@ -300,7 +300,7 @@ describe('refactor-trigger: touched-file discovery (git adapter)', () => {
});
test('refusesPathEscapingRepoRoot', (t) => {
const dir = createTempDir('gsd-refactor-cli-62-');
const dir = createTempDir('msd-refactor-cli-62-');
t.after(() => cleanup(dir));
writeConfig(dir, { refactor: { trigger_enabled: true } });
const phaseDir = path.join(dir, '.planning', 'phases', '01-feat');
@@ -309,7 +309,7 @@ describe('refactor-trigger: touched-file discovery (git adapter)', () => {
// A real, readable file OUTSIDE the project root that a traversal path
// could reach if the router failed to confine it.
const secretParent = createTempDir('gsd-refactor-cli-62-secret-');
const secretParent = createTempDir('msd-refactor-cli-62-secret-');
t.after(() => cleanup(secretParent));
const secretFile = path.join(secretParent, 'escaped.js');
fs.writeFileSync(secretFile, TRIGGERING_JS, 'utf8');
@@ -345,11 +345,11 @@ describe('refactor-trigger: touched-file discovery (git adapter)', () => {
});
});
// ─── Rows 63-73 — CLI contract: `gsd-tools refactor` ─────────────────────────
// ─── Rows 63-73 — CLI contract: `msd-tools refactor` ─────────────────────────
describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
describe('refactor-trigger: CLI contract — msd-tools refactor', () => {
test('writesProposalArtifactForTriggeringPhase', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-63-', false);
const dir = setupTriggeringProject('msd-refactor-cli-63-', false);
t.after(() => cleanup(dir));
const result = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--raw'], dir);
@@ -363,7 +363,7 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
});
test('writesNoArtifactBelowThreshold', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-64-');
const dir = createTempGitProject('msd-refactor-cli-64-');
t.after(() => cleanup(dir));
writeConfig(dir, { refactor: { trigger_enabled: true, complexity_threshold: 1000, complexity_jump_delta: 1000 } });
seedPhaseAndAnchor(dir);
@@ -380,7 +380,7 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
});
test('returnsDisabledResponseWhenCapabilityOff', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-65-');
const dir = createTempGitProject('msd-refactor-cli-65-');
t.after(() => cleanup(dir));
seedPhaseAndAnchor(dir);
@@ -392,10 +392,10 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
});
test('rejectsMissingPhaseArgument', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-66-', false);
const dir = setupTriggeringProject('msd-refactor-cli-66-', false);
t.after(() => cleanup(dir));
const result = runCliOnce(['refactor', 'evaluate', '--raw'], dir, { GSD_JSON_ERRORS: '1' });
const result = runCliOnce(['refactor', 'evaluate', '--raw'], dir, { MSD_JSON_ERRORS: '1' });
assertExited(result, 'row66');
assert.notStrictEqual(result.exitCode, 0);
const parsed = parseStderr(result);
@@ -404,11 +404,11 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
});
test('rejectsEmptyAndWhitespacePhase', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-67-', false);
const dir = setupTriggeringProject('msd-refactor-cli-67-', false);
t.after(() => cleanup(dir));
for (const phaseValue of ['', ' ']) {
const result = runCliOnce(['refactor', 'evaluate', '--phase', phaseValue, '--raw'], dir, { GSD_JSON_ERRORS: '1' });
const result = runCliOnce(['refactor', 'evaluate', '--phase', phaseValue, '--raw'], dir, { MSD_JSON_ERRORS: '1' });
assertExited(result, `row67(${JSON.stringify(phaseValue)})`);
assert.notStrictEqual(result.exitCode, 0);
const parsed = parseStderr(result);
@@ -424,11 +424,11 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
// which agree with each other; the matrix wording is the stale one here —
// see the final report for this discrepancy.
test('rejectsMalformedPhaseAssignment', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-68-', false);
const dir = setupTriggeringProject('msd-refactor-cli-68-', false);
t.after(() => cleanup(dir));
for (const arg of ['--phase=', '--phase==3']) {
const result = runCliOnce(['refactor', 'evaluate', arg, '--raw'], dir, { GSD_JSON_ERRORS: '1' });
const result = runCliOnce(['refactor', 'evaluate', arg, '--raw'], dir, { MSD_JSON_ERRORS: '1' });
assertExited(result, `row68(${arg})`);
assert.notStrictEqual(result.exitCode, 0);
const parsed = parseStderr(result);
@@ -437,10 +437,10 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
});
test('rejectsDuplicatePhaseFlag', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-69-', false);
const dir = setupTriggeringProject('msd-refactor-cli-69-', false);
t.after(() => cleanup(dir));
const result = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--phase', '2', '--raw'], dir, { GSD_JSON_ERRORS: '1' });
const result = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--phase', '2', '--raw'], dir, { MSD_JSON_ERRORS: '1' });
assertExited(result, 'row69');
assert.notStrictEqual(result.exitCode, 0);
const parsed = parseStderr(result);
@@ -448,10 +448,10 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
});
test('rejectsFlagLikePhaseValue', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-70-', false);
const dir = setupTriggeringProject('msd-refactor-cli-70-', false);
t.after(() => cleanup(dir));
const result = runCliOnce(['refactor', 'evaluate', '--phase', '--raw'], dir, { GSD_JSON_ERRORS: '1' });
const result = runCliOnce(['refactor', 'evaluate', '--phase', '--raw'], dir, { MSD_JSON_ERRORS: '1' });
assertExited(result, 'row70');
assert.notStrictEqual(result.exitCode, 0);
const parsed = parseStderr(result);
@@ -459,10 +459,10 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
});
test('reportsUnknownSubcommandWithAvailableList', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-71-', false);
const dir = setupTriggeringProject('msd-refactor-cli-71-', false);
t.after(() => cleanup(dir));
const result = runCliOnce(['refactor', 'frobnicate', '--raw'], dir, { GSD_JSON_ERRORS: '1' });
const result = runCliOnce(['refactor', 'frobnicate', '--raw'], dir, { MSD_JSON_ERRORS: '1' });
assertExited(result, 'row71');
assert.notStrictEqual(result.exitCode, 0);
const parsed = parseStderr(result);
@@ -470,7 +470,7 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
});
test('rejectsOverlongAndUnicodePhaseValues', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-72-', false);
const dir = setupTriggeringProject('msd-refactor-cli-72-', false);
t.after(() => cleanup(dir));
// Overlong: matches the positive-integer regex (all digits), so it clears
@@ -486,7 +486,7 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
assert.strictEqual(overlongParsed.reason, REASON.REFACTOR_INVALID_PHASE);
// Unicode: fails the arg-validation regex outright.
const unicodeResult = runCliOnce(['refactor', 'evaluate', '--phase', '一二三', '--raw'], dir, { GSD_JSON_ERRORS: '1' });
const unicodeResult = runCliOnce(['refactor', 'evaluate', '--phase', '一二三', '--raw'], dir, { MSD_JSON_ERRORS: '1' });
assertExited(unicodeResult, 'row72(unicode)');
assert.notStrictEqual(unicodeResult.exitCode, 0);
const unicodeParsed = parseStderr(unicodeResult);
@@ -494,7 +494,7 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
});
test('provesNoShellInterpolationOfPhaseValue', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-73-', false);
const dir = setupTriggeringProject('msd-refactor-cli-73-', false);
t.after(() => cleanup(dir));
const sentinel = path.join(dir, 'SENTINEL');
@@ -504,7 +504,7 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
'`touch ' + sentinel + '`',
];
for (const payload of payloads) {
const result = runCliOnce(['refactor', 'evaluate', '--phase', payload, '--raw'], dir, { GSD_JSON_ERRORS: '1' });
const result = runCliOnce(['refactor', 'evaluate', '--phase', payload, '--raw'], dir, { MSD_JSON_ERRORS: '1' });
assertExited(result, `row73(${JSON.stringify(payload)})`);
assert.notStrictEqual(result.exitCode, 0);
assert.strictEqual(fs.existsSync(sentinel), false, `sentinel must not exist after payload ${JSON.stringify(payload)}`);
@@ -518,7 +518,7 @@ describe('refactor-trigger: CLI contract — gsd-tools refactor', () => {
describe('refactor-trigger: disposition + ledger', () => {
test('recordsDeclinedRefactorAsDeviationWindow', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-74-', true);
const dir = setupTriggeringProject('msd-refactor-cli-74-', true);
t.after(() => cleanup(dir));
const evalResult = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--raw'], dir);
assert.strictEqual(evalResult.exitCode, 0);
@@ -538,7 +538,7 @@ describe('refactor-trigger: disposition + ledger', () => {
});
test('declinesGracefullyWithoutBrokenWindows', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-75-');
const dir = createTempGitProject('msd-refactor-cli-75-');
t.after(() => cleanup(dir));
writeConfig(dir, { refactor: { trigger_enabled: true, trigger_strict: false, complexity_threshold: 1, complexity_jump_delta: 100 } });
seedPhaseAndAnchor(dir);
@@ -586,27 +586,27 @@ describe('refactor-trigger: disposition + ledger', () => {
});
test('rejectsEmptyDeclineReason', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-76-', false);
const dir = setupTriggeringProject('msd-refactor-cli-76-', false);
t.after(() => cleanup(dir));
const evalResult = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--raw'], dir);
assert.strictEqual(evalResult.exitCode, 0);
const artifactPath = parseStdout(evalResult).artifact_path;
for (const reason of ['', ' ']) {
const result = runCliOnce(['refactor', 'decline', '--phase', '1', '--reason', reason, '--raw'], dir, { GSD_JSON_ERRORS: '1' });
const result = runCliOnce(['refactor', 'decline', '--phase', '1', '--reason', reason, '--raw'], dir, { MSD_JSON_ERRORS: '1' });
assertExited(result, `row76(${JSON.stringify(reason)})`);
assert.notStrictEqual(result.exitCode, 0);
const parsed = parseStderr(result);
assert.strictEqual(parsed.reason, REASON.REFACTOR_DECLINE_REASON_EMPTY);
}
const { parseProposal } = require('../gsd-core/bin/lib/complexity-trigger.cjs');
const { parseProposal } = require('../msd-core/bin/lib/complexity-trigger.cjs');
const proposal = parseProposal(fs.readFileSync(artifactPath, 'utf8'));
assert.strictEqual(proposal.status, 'proposed', 'a rejected decline must not change the proposal status');
});
test('doesNotAppendDuplicateWindowOnRepeatedDecline', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-77-', true);
const dir = setupTriggeringProject('msd-refactor-cli-77-', true);
t.after(() => cleanup(dir));
const evalResult = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--raw'], dir);
assert.strictEqual(evalResult.exitCode, 0);
@@ -614,7 +614,7 @@ describe('refactor-trigger: disposition + ledger', () => {
const first = runCliOnce(['refactor', 'decline', '--phase', '1', '--reason', 'first', '--raw'], dir);
assert.strictEqual(first.exitCode, 0);
const second = runCliOnce(['refactor', 'decline', '--phase', '1', '--reason', 'second', '--raw'], dir, { GSD_JSON_ERRORS: '1' });
const second = runCliOnce(['refactor', 'decline', '--phase', '1', '--reason', 'second', '--raw'], dir, { MSD_JSON_ERRORS: '1' });
assertExited(second, 'row77(second)');
assert.notStrictEqual(second.exitCode, 0);
assert.strictEqual(parseStderr(second).reason, REASON.REFACTOR_ALREADY_DISPOSITIONED);
@@ -625,19 +625,19 @@ describe('refactor-trigger: disposition + ledger', () => {
});
test('rejectsDeclineWithNoProposal', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-78-');
const dir = createTempGitProject('msd-refactor-cli-78-');
t.after(() => cleanup(dir));
writeConfig(dir, { refactor: { trigger_enabled: true } });
seedPhaseAndAnchor(dir);
const result = runCliOnce(['refactor', 'decline', '--phase', '1', '--reason', 'x', '--raw'], dir, { GSD_JSON_ERRORS: '1' });
const result = runCliOnce(['refactor', 'decline', '--phase', '1', '--reason', 'x', '--raw'], dir, { MSD_JSON_ERRORS: '1' });
assertExited(result, 'row78');
assert.notStrictEqual(result.exitCode, 0);
assert.strictEqual(parseStderr(result).reason, REASON.REFACTOR_ARTIFACT_NOT_FOUND);
});
test('treatsAcceptAndDeclineAsMutuallyExclusive', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-79-', false);
const dir = setupTriggeringProject('msd-refactor-cli-79-', false);
t.after(() => cleanup(dir));
const evalResult = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--raw'], dir);
assert.strictEqual(evalResult.exitCode, 0);
@@ -646,7 +646,7 @@ describe('refactor-trigger: disposition + ledger', () => {
assert.strictEqual(acceptResult.exitCode, 0);
assert.strictEqual(parseStdout(acceptResult).status, 'accepted');
const declineResult = runCliOnce(['refactor', 'decline', '--phase', '1', '--reason', 'x', '--raw'], dir, { GSD_JSON_ERRORS: '1' });
const declineResult = runCliOnce(['refactor', 'decline', '--phase', '1', '--reason', 'x', '--raw'], dir, { MSD_JSON_ERRORS: '1' });
assertExited(declineResult, 'row79');
assert.notStrictEqual(declineResult.exitCode, 0);
assert.strictEqual(parseStderr(declineResult).reason, REASON.REFACTOR_ALREADY_DISPOSITIONED);
@@ -657,7 +657,7 @@ describe('refactor-trigger: disposition + ledger', () => {
describe('refactor-trigger router: locked-ledger degrade (#3780)', () => {
test('evaluate degrades ledger_recorded to false with a note when a writer holds the ledger lock', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-3780-lock-', true);
const dir = setupTriggeringProject('msd-refactor-cli-3780-lock-', true);
t.after(() => cleanup(dir));
const lockPath = path.join(dir, '.planning', '.WINDOWS.lock');
const handle = lockModule.acquireLock(lockPath, { maxAttempts: 1 });
@@ -687,7 +687,7 @@ describe('refactor-trigger router: locked-ledger degrade (#3780)', () => {
describe('refactor-trigger: strict mode -> broken-windows ledger', () => {
test('appendsNoWindowInAdvisoryMode', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-80-', false);
const dir = setupTriggeringProject('msd-refactor-cli-80-', false);
t.after(() => cleanup(dir));
const result = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--raw'], dir);
@@ -700,7 +700,7 @@ describe('refactor-trigger: strict mode -> broken-windows ledger', () => {
});
test('appendsNoWindowWhenNothingTriggered', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-81-');
const dir = createTempGitProject('msd-refactor-cli-81-');
t.after(() => cleanup(dir));
writeConfig(dir, {
refactor: { trigger_enabled: true, trigger_strict: true, complexity_threshold: 1000, complexity_jump_delta: 1000 },
@@ -718,7 +718,7 @@ describe('refactor-trigger: strict mode -> broken-windows ledger', () => {
});
test('appendsDeviationWindowForUntriagedProposal', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-82-', true);
const dir = setupTriggeringProject('msd-refactor-cli-82-', true);
t.after(() => cleanup(dir));
const result = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--raw'], dir);
@@ -737,7 +737,7 @@ describe('refactor-trigger: strict mode -> broken-windows ledger', () => {
});
test('resolvesWindowOnAcceptRegardlessOfScore', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-83-', true);
const dir = setupTriggeringProject('msd-refactor-cli-83-', true);
t.after(() => cleanup(dir));
const evalResult = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--raw'], dir);
@@ -762,7 +762,7 @@ describe('refactor-trigger: strict mode -> broken-windows ledger', () => {
});
test('waivesWindowWithReasonOnDecline', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-84-', true);
const dir = setupTriggeringProject('msd-refactor-cli-84-', true);
t.after(() => cleanup(dir));
const evalResult = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--raw'], dir);
assert.strictEqual(evalResult.exitCode, 0);
@@ -780,7 +780,7 @@ describe('refactor-trigger: strict mode -> broken-windows ledger', () => {
});
test('doesNotDuplicateWindowOnReEvaluate', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-85-', true);
const dir = setupTriggeringProject('msd-refactor-cli-85-', true);
t.after(() => cleanup(dir));
const first = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--raw'], dir);
@@ -796,7 +796,7 @@ describe('refactor-trigger: strict mode -> broken-windows ledger', () => {
});
test('notesLedgerUnavailableWithoutBrokenWindows', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-86-');
const dir = createTempGitProject('msd-refactor-cli-86-');
t.after(() => cleanup(dir));
writeConfig(dir, {
refactor: { trigger_enabled: true, trigger_strict: true, complexity_threshold: 1, complexity_jump_delta: 100 },
@@ -841,7 +841,7 @@ describe('refactor-trigger: strict mode -> broken-windows ledger', () => {
describe('refactor-trigger: strict-mode enforcement-gap warning', () => {
test('warnsWhenStrictOnAndWindowsEnforceOff', (t) => {
const dir = setupTriggeringProject('gsd-refactor-cli-swe-1-', true);
const dir = setupTriggeringProject('msd-refactor-cli-swe-1-', true);
t.after(() => cleanup(dir));
const result = runCliOnce(['refactor', 'evaluate', '--phase', '1', '--raw'], dir);
@@ -856,7 +856,7 @@ describe('refactor-trigger: strict-mode enforcement-gap warning', () => {
});
test('omitsWarningWhenStrictOnAndWindowsEnforceOn', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-swe-2-');
const dir = createTempGitProject('msd-refactor-cli-swe-2-');
t.after(() => cleanup(dir));
writeConfig(dir, {
refactor: { trigger_enabled: true, trigger_strict: true, complexity_threshold: 1, complexity_jump_delta: 100 },
@@ -873,7 +873,7 @@ describe('refactor-trigger: strict-mode enforcement-gap warning', () => {
});
test('warnsWhenStrictOnAndBrokenWindowsAbsent', (t) => {
const dir = createTempGitProject('gsd-refactor-cli-swe-3-');
const dir = createTempGitProject('msd-refactor-cli-swe-3-');
t.after(() => cleanup(dir));
writeConfig(dir, {
refactor: { trigger_enabled: true, trigger_strict: true, complexity_threshold: 1, complexity_jump_delta: 100 },
@@ -913,7 +913,7 @@ describe('refactor-trigger: strict-mode enforcement-gap warning', () => {
test('neverWarnsWhenStrictOffRegardlessOfWindowsEnforce', (t) => {
for (const windowsEnforce of [true, false]) {
const dir = createTempGitProject('gsd-refactor-cli-swe-4-');
const dir = createTempGitProject('msd-refactor-cli-swe-4-');
t.after(() => cleanup(dir));
writeConfig(dir, {
refactor: { trigger_enabled: true, trigger_strict: false, complexity_threshold: 1, complexity_jump_delta: 100 },