fix(#3749): route migrate-config, project_exists, and health repairs through the project-aware resolver (#3955)

* test(#3749): GSD_PROJECT-scoped migrate-config, project_exists, and repair paths

* fix(#3749): route migrate-config, project_exists, and health repairs through the project-aware resolver

* chore(#3749): changeset fragment (pr number backfilled after PR creation)

* chore(#3749): backfill changeset PR number (3955)

* test(#3749): assert on the POSIX-normalized project_path across platforms

---------

Co-authored-by: sim <sim@local>
This commit is contained in:
Tom Boucher
2026-08-27 17:57:05 -04:00
committed by GitHub
parent fa41bfec5c
commit ddeb141bd2
9 changed files with 177 additions and 15 deletions

View File

@@ -55,7 +55,7 @@ type HealthDiagnostic = healthDiagnosticMod.Diagnostic;
import planningSnapshotMod = require('./planning-snapshot.cjs');
const { buildPlanningSnapshot } = planningSnapshotMod;
const { planningDir, planningRoot } = planningWorkspace;
const { planningDir } = planningWorkspace;
const { extractFrontmatter, parseMustHavesBlock } = frontmatterMod;
const { readStateHeadFreshness } = stateMod;
@@ -1604,8 +1604,10 @@ function cmdValidateHealth(
return;
}
// rootBase always resolves to .planning/ (shared root — PROJECT.md, config.json live here)
const rootBase = planningRoot(cwd);
// rootBase resolves to the PROJECT-scoped planning root (`.planning[/<project>]`
// — PROJECT.md, config.json live here; #3749). Workstream-free by construction:
// planningDir(cwd, null) honors GSD_PROJECT and suppresses GSD_WORKSTREAM.
const rootBase = planningDir(cwd, null);
const _slashRuntime = resolveRuntime(cwd);
const slash = (name: string) => formatGsdSlash(name, _slashRuntime) as string;