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