feat(worktree): add worktree up/down and harden branch gc
pkgmgr worktree up and down create and release a branch worktree with its own slot and run the operator-pinned worktree-init and worktree-fini hooks; branch gc removes merged worktrees, now also patch-merged ones (git cherry), and the hooks of each repository run only from worktree_hooks pins of a managed repository whose git directory is its own. Removal walks to the worktree without following a symbolic link and skips paths that are not their own realpath. A bare-name hook program resolves once to a root-controlled file on a root-controlled PATH: root is uid 0 only in the initial user namespace and the overflow uid elsewhere, nosuid mounts never count on the host, and the hook runs the resolved file with only those PATH entries, stdin closed and a timeout over its process group. 🎯 Fix: 93 % 💥 Break: 3 % 💸 Cost: 114 % ⏱️ Time: 129 % 🛡️ Security: 100 % 🏆 Score: 61 🚦 Gate: cost 114 % and time 129 %: accepted by the operator for B (2026-11-07) after skeptic round 6 found no hole and MEDUSA reached 100 % Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
54f0cbb37b
commit
102c74f1e0
32 files changed
+2593
-207
No files matched your search
@@ -70,6 +70,43 @@ versioning features it can drive **end-to-end workflows**:
|
||||
|
||||
---
|
||||
|
||||
### Worktrees and garbage collection
|
||||
|
||||
| Command | Does |
|
||||
| --- | --- |
|
||||
| `pkgmgr worktree up <branch> [--base REF] [--path DIR]` | Checks the branch out under `<directories.worktrees>/<host>/<owner>/<repo>/<branch>` or at `--path`, assigns a free slot and runs the pinned `worktree-init` hook |
|
||||
| `pkgmgr worktree cleanup [--apply]` | Removes clean worktrees whose commits are merged or pushed: pinned `worktree-fini` hook, compose stack, checkout; the branch stays |
|
||||
| `pkgmgr branch cleanup [--apply]` | Removes merged branches that no worktree holds, locally and on the remotes |
|
||||
| `pkgmgr branch tree [--format json\|yaml] [--output FILE]` | Writes every managed repository's branches and worktrees with their cleanup state, without fetching |
|
||||
| `pkgmgr gc [--all] [--apply]` | Both cleanups in one pass, for the current repository or every managed one |
|
||||
| `pkgmgr worktree orphans --stale-days N --top N` | Lists merged and abandoned branches and worktrees with a proposal each |
|
||||
|
||||
A hook runs only when the `worktree_hooks` config pins its command under the
|
||||
`<provider>/<account>/<repository>` of a repository managed in the pkgmgr
|
||||
config, and only for that repository's directory; origin's URL, which the
|
||||
repository's own config sets, never selects a pin. `{path}` and `{slot}` are
|
||||
replaced; a
|
||||
`worktree-init` or `worktree-fini` target in the repository's Makefile is
|
||||
reported, never run, because an agent may have written it. The pinned program
|
||||
must be an absolute path or a root-owned command on a `PATH` entry that root
|
||||
owns and no group or other user can write, up to `/`, so a binary planted in a
|
||||
user-writable directory such as a virtualenv never runs. A bare name runs as
|
||||
the resolved file that was checked. Inside a user namespace other than the
|
||||
initial one, root means the overflow uid, under which the real root's files
|
||||
show there, as do those of every other unmapped owner. Outside such a
|
||||
namespace a directory on a nosuid mount, where udisks2 and FUSE put user
|
||||
mounts, never counts as root's. The hook runs with
|
||||
stdin closed, only those `PATH` entries and a 30 minute timeout. Removal walks to
|
||||
the worktree without following a symbolic link and skips a worktree path that
|
||||
is not its own realpath. A pinned command that reads repository files, such as `make` or a
|
||||
script in the repository, trusts the worktree's content, tracked or ignored.
|
||||
|
||||
Every cleanup is a dry run until `--apply`, and `--json` prints the plan for
|
||||
other tools. The [agent skills](https://github.com/kevinveenbirkenbach/skills)
|
||||
wrap these commands; see [AGENTS.md](AGENTS.md) for the split.
|
||||
|
||||
---
|
||||
|
||||
## Architecture & Setup Map 🗺️
|
||||
|
||||
The following diagram gives a full overview of:
|
||||
|
||||
Reference in new issue
Block a user