mirror of
https://github.com/obra/superpowers.git
synced 2026-07-09 19:49:05 +08:00
fix(skills): capture worktree path before Step 5 changes directory
Step 6 recomputed WORKTREE_PATH after Option 1 and discard had already cd'd to the main repo root, so --show-toplevel returned the main root: the provenance check could never match, cleanup silently no-oped, and the branch delete failed with the worktree still attached. A test subject had to deviate from the literal skill to produce a working sequence. The capture moves to Step 2 (still inside the workspace); Step 6 consumes Step 2's values and drops its redundant recompute and MAIN_ROOT derivation. Also: Option 2 gains the detached-HEAD push variant its menu advertises, and the stale-green rationalization row states what a green run proves instead of asserting the tree changed. Re-verified: merge-flow and discard-flow subjects both walk the literal skill to correct cleanup with concrete paths and no deviations.
This commit is contained in:
@@ -30,6 +30,9 @@ Tests failing (<N> failures). Must fix before completing:
|
|||||||
```bash
|
```bash
|
||||||
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
|
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
|
||||||
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
|
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
|
||||||
|
# Capture now, while still inside the workspace — Step 5 changes directory
|
||||||
|
# before cleanup (Step 6) needs this value
|
||||||
|
WORKTREE_PATH=$(git rev-parse --show-toplevel)
|
||||||
```
|
```
|
||||||
|
|
||||||
This determines which menu to show and how cleanup works:
|
This determines which menu to show and how cleanup works:
|
||||||
@@ -111,6 +114,8 @@ git branch -d <feature-branch>
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
git push -u origin <feature-branch>
|
git push -u origin <feature-branch>
|
||||||
|
# From a detached HEAD, name the new branch on the remote:
|
||||||
|
# git push origin HEAD:refs/heads/<new-branch>
|
||||||
```
|
```
|
||||||
|
|
||||||
Then create the pull/merge request against <base-branch> with the forge's
|
Then create the pull/merge request against <base-branch> with the forge's
|
||||||
@@ -154,23 +159,17 @@ git branch -D <feature-branch>
|
|||||||
## Step 6: Cleanup Workspace
|
## Step 6: Cleanup Workspace
|
||||||
|
|
||||||
**Runs for Option 1 and confirmed discards.** Options 2 and 3 always
|
**Runs for Option 1 and confirmed discards.** Options 2 and 3 always
|
||||||
preserve the worktree.
|
preserve the worktree. Both callers have already changed directory to the
|
||||||
|
main repo root — worktree removal must run from outside the worktree —
|
||||||
```bash
|
and use the `GIT_DIR`/`GIT_COMMON`/`WORKTREE_PATH` values captured in
|
||||||
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
|
Step 2, from before that directory change.
|
||||||
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
|
|
||||||
WORKTREE_PATH=$(git rev-parse --show-toplevel)
|
|
||||||
```
|
|
||||||
|
|
||||||
**If `GIT_DIR == GIT_COMMON`:** Normal repo, no worktree to clean up. Done.
|
**If `GIT_DIR == GIT_COMMON`:** Normal repo, no worktree to clean up. Done.
|
||||||
|
|
||||||
**If worktree path is under `.worktrees/` or `worktrees/`:** Superpowers
|
**If `WORKTREE_PATH` is under `.worktrees/` or `worktrees/`:** Superpowers
|
||||||
created this worktree — we own cleanup. Run it from the main repo root
|
created this worktree — we own cleanup:
|
||||||
(removal fails from inside the worktree being removed):
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
MAIN_ROOT=$(git -C "$(git rev-parse --git-common-dir)/.." rev-parse --show-toplevel)
|
|
||||||
cd "$MAIN_ROOT"
|
|
||||||
git worktree remove "$WORKTREE_PATH"
|
git worktree remove "$WORKTREE_PATH"
|
||||||
git worktree prune # Self-healing: clean up any stale registrations
|
git worktree prune # Self-healing: clean up any stale registrations
|
||||||
```
|
```
|
||||||
@@ -191,7 +190,7 @@ place. If your platform provides a workspace-exit tool, use it.
|
|||||||
|
|
||||||
| Excuse | Reality |
|
| Excuse | Reality |
|
||||||
|--------|---------|
|
|--------|---------|
|
||||||
| "Tests passed earlier this session" | Run the suite now. The tree changed since the last green run. |
|
| "Tests passed earlier this session" | Run the suite on the tree you are about to integrate. A green run only proves the tree it ran on. |
|
||||||
| "They obviously want it merged" | Integration is your human partner's decision. Present the menu and wait. |
|
| "They obviously want it merged" | Integration is your human partner's decision. Present the menu and wait. |
|
||||||
| "They seem done with this feature — I'll offer to discard it" | The menu is complete as written. Discard happens only when your human partner asks for it in so many words. |
|
| "They seem done with this feature — I'll offer to discard it" | The menu is complete as written. Discard happens only when your human partner asks for it in so many words. |
|
||||||
| "'Yeah, get rid of it' counts as confirmation" | Only the typed word `discard` authorizes deletion. |
|
| "'Yeah, get rid of it' counts as confirmation" | Only the typed word `discard` authorizes deletion. |
|
||||||
|
|||||||
Reference in New Issue
Block a user