fix(issue-21): PR #29 delta review follow-up - prepare installs the delegate-job requirements, removes a half-made venv on install failure; prompt dirty flag sees untracked files
- worktree_prepare.sh installs the same files deploy/install.sh does (.agents/skills/multi-agent-mux-delegate-job/requirements.txt: paho-mqtt, PyYAML) plus requirements*.txt. Without paho the loop wrapper, stop_session and the subscriber tests fail in the worktree - seen as 4 suite failures in a worktree without its own venv, all passing with one. - review D1: a failed pip install removes the venv it half made, so the next run recreates it instead of reporting VENV=kept (test w1c). - review D3: the [worktree context] block's uncommitted-changes flag uses --untracked-files=all like the guards. - review D2: the create skill doc says the install needs the package index. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
This commit is contained in:
1 parent
08db1da9d5
commit
80a5614f7c
5 files changed
+26
-7
No files matched your search
@@ -578,7 +578,7 @@ class LoopRunner:
|
||||
r = self._git(src, "rev-list", "--count", f"{base}..HEAD")
|
||||
if r.returncode == 0 and r.stdout.strip():
|
||||
count = r.stdout.strip()
|
||||
st = self._git(src, "status", "--porcelain")
|
||||
st = self._git(src, "status", "--porcelain", "--untracked-files=all")
|
||||
dirty = "알 수 없음" if st.returncode != 0 else ("있음" if st.stdout.strip() else "없음")
|
||||
# a remote reviewer (diff-only) cannot reach this host's paths (B6)
|
||||
src_line = ("- 소스 경로: (오케스트레이터 호스트 전용 — 원격 리뷰어는 접근할 수 없음)\n" if remote
|
||||
|
||||
@@ -243,7 +243,7 @@ bash .agents/skills/multi-agent-mux-create/scripts/worktree_prepare.sh \
|
||||
[--creator-agent claude [--session <name>] [--role creator] [--herdr-session <s>] [--herdr-workspace <w>] [--onboard]] [--dry-run]
|
||||
```
|
||||
|
||||
- Creates the worktree next to the control root (a path **inside** it is refused), idempotently; creates the worktree's **own** `.venv` from the control root's `.venv/bin/python` and installs `requirements.txt` / `requirements-dev.txt` when present (never a link - a leftover link is refused with exit 1; no control-root interpreter is a warning and `VENV=skipped`); adds `/.venv` and `.pytest_cache/` to the shared `info/exclude` (a linked worktree's exclude file is `$GIT_COMMON_DIR/info/exclude`, so it applies to the main checkout too).
|
||||
- Creates the worktree next to the control root (a path **inside** it is refused), idempotently; creates the worktree's **own** `.venv` from the control root's `.venv/bin/python` and installs the delegate-job skill's `requirements.txt` (paho-mqtt, PyYAML - what `deploy/install.sh` installs) plus `requirements.txt` / `requirements-dev.txt` when present (needs network access to the package index; a failed install removes the half-made venv and exits 1 so a re-run starts over; never a link - a leftover link is refused with exit 1; no control-root interpreter is a warning and `VENV=skipped`); adds `/.venv` and `.pytest_cache/` to the shared `info/exclude` (a linked worktree's exclude file is `$GIT_COMMON_DIR/info/exclude`, so it applies to the main checkout too).
|
||||
- **Submodules are opt-in** (`--submodules`). Initialisation writes `submodule.<name>.url` to the shared `.git/config`, and any attempt - even a failed one - leaves a `modules/` directory that makes a plain `git worktree remove` refuse. A failed `--submodules` undoes only what that attempt created - new submodule checkouts are deinitialised before their git dirs are deleted, so the worktree stays a usable checkout; submodules initialised earlier and pre-existing `submodule.*` values are kept - and exits 1; re-run without `--submodules` to finish.
|
||||
- `--creator-agent` creates the creator through this skill with the control root's binding and `MAM_NO_SUBSCRIBER_DAEMON=1`; the row's `pane.cwd` is the worktree.
|
||||
- Prints `BASE=<sha>`: record it **before** delegating the implementation, then review with `run_loop.sh --worktree <WT> --base "$BASE" --review-only`.
|
||||
|
||||
@@ -79,7 +79,7 @@ fi
|
||||
if [ "$DRY_RUN" = "1" ]; then
|
||||
echo "[dry-run] control root: $MAIN"
|
||||
echo "[dry-run] worktree: $WT (branch $BRANCH${BASE_REF:+, base $BASE_REF})"
|
||||
echo "[dry-run] own .venv (from $MAIN/.venv/bin/python + requirements*.txt) and shared info/exclude entries; submodules: $([ "$SUBMODULES" = 1 ] && echo init || echo skipped)"
|
||||
echo "[dry-run] own .venv (from $MAIN/.venv/bin/python + the delegate-job requirements.txt and requirements*.txt) and shared info/exclude entries; submodules: $([ "$SUBMODULES" = 1 ] && echo init || echo skipped)"
|
||||
[ -n "$CREATOR_AGENT" ] && echo "[dry-run] creator: $CREATOR_AGENT as $SESSION (role $ROLE)"
|
||||
exit 0
|
||||
fi
|
||||
@@ -122,12 +122,16 @@ elif [ -x "$WT/.venv/bin/python" ]; then
|
||||
elif [ -x "$MAIN/.venv/bin/python" ]; then
|
||||
"$MAIN/.venv/bin/python" -m venv "$WT/.venv" || { echo "ERROR: could not create '$WT/.venv'" >&2; exit 1; }
|
||||
req=()
|
||||
for f in requirements.txt requirements-dev.txt; do
|
||||
# the same files deploy/install.sh installs into the control root's venv
|
||||
for f in .agents/skills/multi-agent-mux-delegate-job/requirements.txt requirements.txt requirements-dev.txt; do
|
||||
[ -f "$WT/$f" ] && req+=(-r "$WT/$f")
|
||||
done
|
||||
if [ "${#req[@]}" -gt 0 ]; then
|
||||
"$WT/.venv/bin/python" -m pip install -q "${req[@]}" \
|
||||
|| { echo "ERROR: pip install into '$WT/.venv' failed; fix it and re-run (the worktree is kept)" >&2; exit 1; }
|
||||
if ! "$WT/.venv/bin/python" -m pip install -q "${req[@]}"; then
|
||||
rm -rf "$WT/.venv" # review D1: a half-made venv would be reported as kept by the next run
|
||||
echo "ERROR: pip install into '$WT/.venv' failed (network to the package index is needed); the venv was removed, the worktree is kept - fix it and re-run" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
VENV_STATE="created"
|
||||
else
|
||||
|
||||
Reference in new issue
Block a user