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

@@ -15,7 +15,7 @@ import frontmatterMod = require('./frontmatter.cjs');
// eslint-disable-next-line @typescript-eslint/no-require-imports -- state.cjs is an export= CommonJS module
import stateMod = require('./state.cjs');
import { platformWriteSync, platformReadSync, platformEnsureDir, execGit, retryRenameSync, contentChangedAfterNormalize } from './shell-command-projection.cjs';
import { formatGsdSlash, resolveRuntime } from './runtime-slash.cjs';
import { formatMsdSlash, resolveRuntime } from './runtime-slash.cjs';
import { realClock } from './clock.cjs';
import { transitionCore } from './state-transition.cjs';
import { writeSetComplete } from './write-set.cjs';
@@ -106,7 +106,7 @@ interface MilestoneCompleteOptions {
*
* F1 (#2245 review, BLOCKER): `updateTableCell` binds to the FIRST GFM table
* found in whatever text it is given. The shipped requirements template
* (gsd-core/templates/requirements.md) puts an `## Out of Scope` table
* (msd-core/templates/requirements.md) puts an `## Out of Scope` table
* (`| Feature | Reason |`, no `Status` column) BEFORE `## Traceability` — so
* an unscoped whole-file call targets the Out-of-Scope table instead, fails
* with `{ok:false, reason:'unknown column: Status'}`, and the real
@@ -578,7 +578,7 @@ function cmdMilestoneComplete(cwd: string, version: string, options: MilestoneCo
// #3726: confirmation gate — refuse before ANY read of the tree beyond the
// arg checks above, so an unconfirmed invocation is a guaranteed no-op on
// disk. The threat model is the NEVER_VALID_FLAGS one (gsd-tools.cjs): a
// disk. The threat model is the NEVER_VALID_FLAGS one (msd-tools.cjs): a
// caller supplies a token it believes is inert and a destructive operation
// proceeds unchecked — here the caller-side belief was that the `query`
// meta-prefix implies a read, and `query milestone.complete <v>` archived
@@ -601,7 +601,7 @@ function cmdMilestoneComplete(cwd: string, version: string, options: MilestoneCo
const statePath = planningPaths(cwd).state;
// #1911: derive the archive base from the workstream-aware planning root so
// `milestone complete --ws` archives into the workstream, not root. planningPaths(cwd).planning
// resolves to the workstream base when GSD_WORKSTREAM is set and to root .planning otherwise
// resolves to the workstream base when MSD_WORKSTREAM is set and to root .planning otherwise
// (flat mode is a no-op).
const planningBase = planningPaths(cwd).planning;
const milestonesPath = path.join(planningBase, 'MILESTONES.md');
@@ -698,7 +698,7 @@ function cmdMilestoneComplete(cwd: string, version: string, options: MilestoneCo
if (stateVersion !== null && stateVersion !== version) {
// #2946: emit a WARNING so the suspicious STATE mismatch is visible
// rather than silently disarming the guard. Plain-text diagnostic on
// stderr, matching the existing [gsd-tools] WARNING convention
// stderr, matching the existing [msd-tools] WARNING convention
// (state.cts). A missing STATE.md `milestone:` field is not warned
// here — the scan still runs, and "no milestone declared" is a normal
// state for a fresh project, not a suspicious drift.
@@ -711,7 +711,7 @@ function cmdMilestoneComplete(cwd: string, version: string, options: MilestoneCo
// stderr). `version` is already constrained to [A-Za-z0-9._-].
const safeStateVersion = stateVersion.replace(/[\x00-\x1f\x7f]/g, '?').slice(0, 80);
process.stderr.write(
`[gsd-tools] WARNING: STATE.md milestone: "${safeStateVersion}" ≠ requested "${version}" — ` +
`[msd-tools] WARNING: STATE.md milestone: "${safeStateVersion}" ≠ requested "${version}" — ` +
`running the unstarted-phase guard against the ROADMAP scoped for "${version}" anyway.\n`,
);
}
@@ -1079,7 +1079,7 @@ function cmdMilestoneComplete(cwd: string, version: string, options: MilestoneCo
{
kind: 'milestoneComplete',
version,
nextMilestoneCommand: formatGsdSlash('new-milestone', resolveRuntime(cwd)) as string,
nextMilestoneCommand: formatMsdSlash('new-milestone', resolveRuntime(cwd)) as string,
},
{ clock: realClock, sourcePath: statePath },
);
@@ -1123,8 +1123,8 @@ function cmdMilestoneComplete(cwd: string, version: string, options: MilestoneCo
// shapes are NOT equally noteworthy (design doc §40, behavior table
// row 5): an ABSENT "Quick Tasks Completed" section is the normal,
// common case — the section is created lazily by
// `gsd-core/workflows/quick.md` Step 7b, not by
// `gsd-core/templates/state.md`, so most projects simply don't have
// `msd-core/workflows/quick.md` Step 7b, not by
// `msd-core/templates/state.md`, so most projects simply don't have
// one — and is silently skipped (compared via the shared
// `QUICK_TASKS_SECTION_ABSENT` sentinel, never by matching on the
// free-form reason string). A section that EXISTS but couldn't be
@@ -1315,7 +1315,7 @@ function cmdPhasesClear(cwd: string, raw: boolean, args: string[]): void {
// sentinel was DELETED here. Routed through the canonical predicate so
// every reader of "is this a sentinel phase" agrees by construction.
// #3639: the DIR-AWARE recognizer — the convention-less id predicate
// never saw bracket sentinel dirs (GSD.999-07-icebox), so they were
// never saw bracket sentinel dirs (MSD.999-07-icebox), so they were
// counted for deletion here while the disk guards (post-#3639) preserve
// them; the destructive path must not be the one blind reader left.
const dirs = entries.filter((e) => e.isDirectory() && !isSentinelPhaseDir(e.name));
@@ -1776,7 +1776,7 @@ interface QuickArchiveOptions {
* under the existing `milestone` namespace rather than adding a new top-level
* command) — the narrow archival helper the issue's own "Scope of changes"
* anticipated ("a `quick.archive`-style routine"), for callers (chiefly
* `gsd-core/workflows/cleanup.md`) that need to sweep
* `msd-core/workflows/cleanup.md`) that need to sweep
* `.planning/quick/*` WITHOUT the full `milestone complete` close-out.
*
* `milestone complete --archive-quick` cannot be reused for this: it
@@ -1796,7 +1796,7 @@ interface QuickArchiveOptions {
*
* #2142 MAJOR 6 (review): the STATE.md write now routes through
* `readModifyWriteStateMd` — the same owned read-transform-write composition
* `gsd-tools.cjs`'s `quick-tasks-append` handler uses (ADR-3408 §8.3 / #3469:
* `msd-tools.cjs`'s `quick-tasks-append` handler uses (ADR-3408 §8.3 / #3469:
* "the single owned composition ... so the composition cannot diverge"). A
* prior version of this function called `platformWriteSync` directly with
* the reset result, bypassing `syncAndPreserveStateMd` entirely — the exact