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

@@ -431,10 +431,10 @@ const isSentinelPhase = (num: string, bracketId?: string): boolean => {
// #2761 M1: missing-detail identity is milestone-qualified under bracket.
// Prefer the canonical qualified-key owner, which case-folds accepted ids, so
// `[gsd.02] 01` and `[GSD.02] 01` are one occurrence. It is intentionally not
// `[msd.02] 01` and `[MSD.02] 01` are one occurrence. It is intentionally not
// padding-tolerant: the milestone grammar has one canonical spelling (pad2
// below 100, no leading zero above), so `[GSD.2]` is malformed rather than an
// alternate spelling of `[GSD.02]`. Hyphenated tokens and other shapes the
// below 100, no leading zero above), so `[MSD.2]` is malformed rather than an
// alternate spelling of `[MSD.02]`. Hyphenated tokens and other shapes the
// qualified-key owner refuses retain a folded composite, keeping distinct
// bracket/token pairs from collapsing onto one missing-detail verdict.
const occurrenceKey = (num: string, bracketId?: string): string => {
@@ -546,7 +546,7 @@ function collectAnalyzePhases(
// heading/checklist patterns above already thread. Left two-argument, this
// one call reported EVERY canonical `{CODE}.{MM}-{PP}-slug` directory as
// `disk_status: "no_directory"` with `plan_count`/`summary_count` 0 —
// `extractPhaseToken('GSD.02-01-one')` with no convention returns the whole
// `extractPhaseToken('MSD.02-01-one')` with no convention returns the whole
// dir name — while the same build resolved those same directories correctly
// in three other places on the same repo (W006/W007 through their shared
// directory matcher, `state json` via the milestone filter, and the W026
@@ -766,7 +766,7 @@ function cmdRoadmapAnalyze(cwd: string, raw: boolean): void {
// IDs (e.g. `1-01`) match the detail-heading scanner above; otherwise they truncate
// at the dash (`1-01` -> `1`) and every such phase reports a phantom missing detail.
// #612: CAPTURING label-only intro — the bracket id rides along so the
// sentinel filter below is not blind to `- [ ] **[GSD.999] 01: Icebox**`.
// sentinel filter below is not blind to `- [ ] **[MSD.999] 01: Icebox**`.
// phase-id-owner: uses the [.-] (dot-or-dash) separator variant, not the canonical dot-only token; a swap to PHASE_NUMBER_TOKEN_SOURCE would drop hyphenated phase-id matches.
// #3036: widen to accept non-numeric-leading ids (same widening as the detail-heading pattern above).
// phase-id-owner: uses the [.-] (dot-or-dash) separator variant, not the canonical dot-only token; a swap to PHASE_NUMBER_TOKEN_SOURCE would drop hyphenated phase-id matches.
@@ -774,7 +774,7 @@ function cmdRoadmapAnalyze(cwd: string, raw: boolean): void {
// #2761 M1: an OCCURRENCE list keyed by `occurrenceKey`, not a token->bracket
// map. The map was first-wins on the bare token, so of two checklist entries
// sharing a token across brackets the FIRST one's bracket id classified BOTH:
// `- [ ] **[GSD.999] 01: Icebox**` written above `- [ ] **[GSD.02] 01: …**`
// `- [ ] **[MSD.999] 01: Icebox**` written above `- [ ] **[MSD.02] 01: …**`
// made the real phase inherit the icebox's sentinel verdict and vanish from
// `missing_phase_details`; written below it, the same document reported it.
// Dedupe still happens — it is now per PHASE rather than per token, which is
@@ -1005,7 +1005,7 @@ function cmdRoadmapUpdatePlanProgress(cwd: string, phaseNum: string | null | und
// Verification gate (#2022): do NOT check the phase checkbox or stamp a
// completion date until the phase's verification status is 'passed', matching
// cmdPhaseComplete's gate (phase.cts:1436). Previously the checkbox fired the
// moment the last plan summary landed — before gsd-verifier had verified.
// moment the last plan summary landed — before msd-verifier had verified.
//
// ADR-3180 §7.4 (issue #3186, disk-strict): routed through the canonical
// owner (`isPhaseComplete`) instead of hand-rolling `summaryCount >=
@@ -1160,7 +1160,7 @@ function cmdRoadmapUpdatePlanProgress(cwd: string, phaseNum: string | null | und
// Update plan count in phase detail section.
// Three recognised forms (all tolerated; canonical template uses the first):
// `**Plans**: N plans` — bold word + outer colon (gsd-core/templates/roadmap.md)
// `**Plans**: N plans` — bold word + outer colon (msd-core/templates/roadmap.md)
// `**Plans:** N plans` — bold "Plans:" (colon inside bold)
// `Plans: N plans` — plain text header
//
@@ -1169,7 +1169,7 @@ function cmdRoadmapUpdatePlanProgress(cwd: string, phaseNum: string | null | und
// `Plans:` label + trailing whitespace (unchanged). Group $2 = the existing
// count token to replace: matches `N/N plans complete`, `N/N plans executed`,
// or the bare template `N plan(s)` form — singular is part of the tool's OWN
// grammar (gsd-core/templates/roadmap.md:62 ships `**Plans**: 1 plan` as the
// grammar (msd-core/templates/roadmap.md:62 ships `**Plans**: 1 plan` as the
// documented one-plan-phase shape), so the `s` is optional there (bug #3584
// Finding B; pre-fix a bare `1 plan` fell into the drop-everything path and
// was accidentally overwritten with the correct count — post-fix it must be
@@ -1182,7 +1182,7 @@ function cmdRoadmapUpdatePlanProgress(cwd: string, phaseNum: string | null | und
// 1. $2 present (a real count token) → rewrite the token, preserve $3
// verbatim (an annotation a human wrote after a real count; #2853).
// 2. $2 absent AND $3, trimmed, is the fresh-template PLACEHOLDER shipped
// by gsd-core/templates/roadmap.md — either
// by msd-core/templates/roadmap.md — either
// `[Number of plans, e.g., "3 plans" or "TBD"]` (line 37) or
// `[Number of plans]` (lines 51/75/88) → replace it with the computed
// count. Detected POSITIVELY on the distinctive `Number of plans`
@@ -1212,7 +1212,7 @@ function cmdRoadmapUpdatePlanProgress(cwd: string, phaseNum: string | null | und
: `${summaryCount}/${planCount} plans executed`;
// Positive detector for the fresh-template placeholder ONLY (bug #3584
// Finding A). Anchored to the distinctive `Number of plans` wording that
// gsd-core/templates/roadmap.md actually ships, not to "anything in
// msd-core/templates/roadmap.md actually ships, not to "anything in
// brackets" — a bracketed human annotation like `[Deferred pending
// re-scope]` is structurally bracketed too but carries none of this
// wording, so it correctly falls through to arm 3 untouched. Kept as a
@@ -1225,7 +1225,7 @@ function cmdRoadmapUpdatePlanProgress(cwd: string, phaseNum: string | null | und
// Positive detectors for the two "real count token" shapes (#2853 /
// #3584 Finding B): a fraction count (`N/M plans complete|executed`) or a
// bare singular/plural count (`N plan`/`N plans`, the fresh single-plan
// template shape at gsd-core/templates/roadmap.md:62). Either one is an
// template shape at msd-core/templates/roadmap.md:62). Either one is an
// existing count token to overwrite (arm 1), never template placeholder
// (arm 2) or freeform prose (arm 3).
// #4906 regression fix: PREFIX match (not full-string) — a real count
@@ -1252,7 +1252,7 @@ function cmdRoadmapUpdatePlanProgress(cwd: string, phaseNum: string | null | und
}
const fieldId = findField(parsed.value, 'Plans');
if (!fieldId) {
// #4906 regression (#1163, caught by gsd-test): a hand-edited or
// #4906 regression (#1163, caught by msd-test): a hand-edited or
// pre-template ROADMAP.md may carry a PLAIN (non-bold) `Plans:` line
// rather than the canonical `**Plans**:`/`**Plans:**` bold field.
// BOLD_FIELD_RE is deliberately bold-only (widening it to any bare
@@ -1399,7 +1399,7 @@ function cmdRoadmapUpdatePlanProgress(cwd: string, phaseNum: string | null | und
// where a single alternation would stop at the first matching alternative
// (the bold summary) before reaching the checklist header.
//
// Canonical template (gsd-core/templates/roadmap.md) uses BOTH lines:
// Canonical template (msd-core/templates/roadmap.md) uses BOTH lines:
// **Plans**: N plans ← summary (colon outside bold)
// Plans: ← checklist header (PREFERRED insertion anchor)
// Rows must land after `Plans:`, not between the summary and the header.