fix(#1422,#1447): fix sub_repos/.git precedence; guard uncommitted data in new-milestone (#1484)
* fix(#1422): sub_repos config takes precedence over .git in findProjectRoot When heuristic-3 (.git + parent .planning/) fires, do a lookahead walk over ancestors above the matching parent to check if any further ancestor has a sub_repos entry that explicitly claims the starting directory. If found, return that ancestor instead — explicit config wins over the implicit .git signal. Regression tests updated: the heuristic-3 precedence test now asserts the correct new behavior (sub_repos wins), and two additional coverage cases added (startDir directly in sub_repo child, and startDir nested 2+ levels inside the child). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(#1447): guard against uncommitted changes before deleting phase dirs in new-milestone cmdPhasesClear now runs `git status --porcelain <phasesDir>` before executing any rmSync. If uncommitted changes are detected it calls error() and aborts, preventing silent data loss when new-milestone's §6 "phases.clear --confirm" fires before the operator has archived or committed outgoing phase work. A new --force flag is added to bypass the guard for callers that have already verified archival is done (or explicitly accept the loss). When git is unavailable or the directory is not inside a git repo the guard silently skips, preserving the existing behaviour for non-git projects. Five new regression tests cover: untracked files abort, staged-but- uncommitted abort, --force bypasses, committed files pass, non-git project passes without guard. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: add changeset for #1422 and #1447 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: correct changeset format Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
9
.changeset/fix-1422-1447-projectroot-milestone-guards.md
Normal file
9
.changeset/fix-1422-1447-projectroot-milestone-guards.md
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
type: Fixed
|
||||
pr: 1484
|
||||
---
|
||||
**`findProjectRoot` now respects explicit `sub_repos` config over implicit `.git`** — when a parent workspace's `.planning/config.json` lists a child directory in `sub_repos`, that declaration takes precedence over the child's own `.git/` directory. Previously, if the child had both `.planning/` and `.git/`, the `.git` heuristic fired first and resolved to the child rather than the parent workspace, making the `sub_repos` declaration ineffective. (#1422)
|
||||
|
||||
**`phases clear` now refuses to delete phase directories with uncommitted changes** — `cmdPhasesClear` runs `git status --porcelain` over the phases directory before executing any deletion. If uncommitted or staged-but-not-committed files are found it aborts with a clear error message, preventing silent data loss at `new-milestone` time. Pass `--force` to bypass the guard when archival is already complete. Non-git projects are unaffected. (#1447, data-loss fix)
|
||||
|
||||
<!-- docs-exempt: internal CLI guard in milestone.cts — no public docs surface change; --force flag is an operator escape hatch, not a user-visible API change -->
|
||||
Reference in New Issue
Block a user