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:
@@ -6,7 +6,7 @@
|
||||
|
||||
/**
|
||||
* #2072 — model_overrides / models.<phaseType> were silently inert for
|
||||
* gsd-assumptions-analyzer and gsd-code-reviewer on Claude: the resolver honored
|
||||
* msd-assumptions-analyzer and msd-code-reviewer on Claude: the resolver honored
|
||||
* them, but the workflows spawned the agents with NO model= param, so the resolved
|
||||
* value never reached the Agent tool and the agents inherited the session model.
|
||||
*
|
||||
@@ -20,10 +20,10 @@ const assert = require('node:assert/strict');
|
||||
const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
|
||||
const WF = path.join(__dirname, '..', 'gsd-core', 'workflows');
|
||||
const WF = path.join(__dirname, '..', 'msd-core', 'workflows');
|
||||
const read = (rel) => fs.readFileSync(path.join(WF, rel), 'utf-8');
|
||||
|
||||
// Every .md under gsd-core/workflows (incl. nested steps/ and modes/).
|
||||
// Every .md under msd-core/workflows (incl. nested steps/ and modes/).
|
||||
function allWorkflowMd() {
|
||||
const out = [];
|
||||
(function walk(dir, rel) {
|
||||
@@ -71,44 +71,44 @@ function agentCalls(content) {
|
||||
}
|
||||
|
||||
describe('#2072: routed-agent spawns thread the resolved model', () => {
|
||||
test('discuss-phase-assumptions.md resolves + threads gsd-assumptions-analyzer model', () => {
|
||||
test('discuss-phase-assumptions.md resolves + threads msd-assumptions-analyzer model', () => {
|
||||
const c = read('discuss-phase-assumptions.md');
|
||||
assert.match(c, /resolve-model gsd-assumptions-analyzer/, 'must resolve the routed model');
|
||||
assert.match(c, /resolve-model msd-assumptions-analyzer/, 'must resolve the routed model');
|
||||
assert.match(
|
||||
c,
|
||||
/subagent_type="gsd-assumptions-analyzer",\s*model="\{ANALYZER_MODEL\}"/,
|
||||
/subagent_type="msd-assumptions-analyzer",\s*model="\{ANALYZER_MODEL\}"/,
|
||||
'spawn must thread the resolved model=',
|
||||
);
|
||||
});
|
||||
|
||||
test('code-review.md resolves + threads gsd-code-reviewer model', () => {
|
||||
test('code-review.md resolves + threads msd-code-reviewer model', () => {
|
||||
const c = read('code-review.md');
|
||||
assert.match(c, /resolve-model gsd-code-reviewer/);
|
||||
assert.match(c, /subagent_type="gsd-code-reviewer",\s*model="\{REVIEWER_MODEL\}"/);
|
||||
assert.match(c, /resolve-model msd-code-reviewer/);
|
||||
assert.match(c, /subagent_type="msd-code-reviewer",\s*model="\{REVIEWER_MODEL\}"/);
|
||||
});
|
||||
|
||||
test('code-review-fix.md re-review resolves + threads gsd-code-reviewer model', () => {
|
||||
test('code-review-fix.md re-review resolves + threads msd-code-reviewer model', () => {
|
||||
const c = read('code-review-fix.md');
|
||||
assert.match(c, /resolve-model gsd-code-reviewer/);
|
||||
assert.match(c, /subagent_type="gsd-code-reviewer",\s*model="\{REVIEWER_MODEL\}"/);
|
||||
assert.match(c, /resolve-model msd-code-reviewer/);
|
||||
assert.match(c, /subagent_type="msd-code-reviewer",\s*model="\{REVIEWER_MODEL\}"/);
|
||||
});
|
||||
|
||||
test('quick.md review step threads gsd-code-reviewer own model (not executor_model)', () => {
|
||||
test('quick.md review step threads msd-code-reviewer own model (not executor_model)', () => {
|
||||
const c = read('quick.md');
|
||||
// reviewer_model comes from the init.quick bundle; the spawn must use it.
|
||||
assert.match(c, /subagent_type="gsd-code-reviewer",\s*\n\s*model="\{reviewer_model\}"/);
|
||||
assert.match(c, /subagent_type="msd-code-reviewer",\s*\n\s*model="\{reviewer_model\}"/);
|
||||
assert.doesNotMatch(
|
||||
c,
|
||||
/subagent_type="gsd-code-reviewer",\s*\n\s*model="\{executor_model\}"/,
|
||||
/subagent_type="msd-code-reviewer",\s*\n\s*model="\{executor_model\}"/,
|
||||
'reviewer must not reuse the executor model (own model_overrides would be ignored)',
|
||||
);
|
||||
});
|
||||
|
||||
test('code-review-fix.md threads gsd-code-fixer model at both fixer spawns', () => {
|
||||
test('code-review-fix.md threads msd-code-fixer model at both fixer spawns', () => {
|
||||
const c = read('code-review-fix.md');
|
||||
assert.match(c, /resolve-model gsd-code-fixer/, 'must resolve the fixer model');
|
||||
const fixerSpawns = c.match(/subagent_type="gsd-code-fixer", model="\{FIXER_MODEL\}"/g) || [];
|
||||
assert.strictEqual(fixerSpawns.length, 2, 'both gsd-code-fixer spawns must thread FIXER_MODEL');
|
||||
assert.match(c, /resolve-model msd-code-fixer/, 'must resolve the fixer model');
|
||||
const fixerSpawns = c.match(/subagent_type="msd-code-fixer", model="\{FIXER_MODEL\}"/g) || [];
|
||||
assert.strictEqual(fixerSpawns.length, 2, 'both msd-code-fixer spawns must thread FIXER_MODEL');
|
||||
});
|
||||
|
||||
// Parity guard: EVERY spawn of the fixed routed agents across ALL workflows must
|
||||
@@ -117,7 +117,7 @@ describe('#2072: routed-agent spawns thread the resolved model', () => {
|
||||
// for single-line and multi-line calls, multiple spawns per file, and either param
|
||||
// ordering (subagent_type= before OR after the prompt body).
|
||||
test('no spawn of the fixed routed agents is missing a model= (parity guard)', () => {
|
||||
const ROUTED = /subagent_type="(gsd-code-reviewer|gsd-assumptions-analyzer|gsd-code-fixer)"/;
|
||||
const ROUTED = /subagent_type="(msd-code-reviewer|msd-assumptions-analyzer|msd-code-fixer)"/;
|
||||
const offenders = [];
|
||||
for (const rel of allWorkflowMd()) {
|
||||
for (const call of agentCalls(read(rel))) {
|
||||
@@ -137,11 +137,11 @@ describe('#2072: routed-agent spawns thread the resolved model', () => {
|
||||
const synthetic = [
|
||||
'Agent(',
|
||||
' prompt="""do the thing (with parens) and a " quote""",',
|
||||
' subagent_type="gsd-code-reviewer"',
|
||||
' subagent_type="msd-code-reviewer"',
|
||||
')',
|
||||
].join('\n');
|
||||
const [call] = agentCalls(synthetic);
|
||||
assert.ok(/subagent_type="gsd-code-reviewer"/.test(call), 'scanner must capture the prompt-first subagent_type');
|
||||
assert.ok(/subagent_type="msd-code-reviewer"/.test(call), 'scanner must capture the prompt-first subagent_type');
|
||||
assert.ok(!/\bmodel\s*=/.test(call), 'and correctly see that model= is absent');
|
||||
// A well-formed prompt-first spawn WITH model= must be accepted.
|
||||
const ok = agentCalls(synthetic.replace(')', ' model="{reviewer_model}"\n)'))[0];
|
||||
|
||||
Reference in New Issue
Block a user