mm-worktree-task: --base flag + set -e safe returns (uncommitted WIP)

Committing work found uncommitted in the checkout: --base lets a unit be based
on a branch other than main (used throughout the M32 cut-over session for
u6-tests and hatchmate-migration bases), and the bare 'return' statements
become 'return 0' so they cannot abort under set -e when the preceding test is
false.

Per the project agent-safety rule: untracked/uncommitted work that matters gets
committed the day it is found, so local loss cannot take it.

Claude-Session: https://claude.ai/code/session_014KNyfHmHpMbdMrHZXDRkAp
This commit is contained in:
Paul O'Reilly
2026-09-23 19:26:52 +12:00
parent 070090e751
commit cbab812917
3 changed files with 20 additions and 11 deletions

View File

@@ -25,6 +25,8 @@ Arguments:
Options:
--slug <slug> Worktree/branch suffix (default: first 8 chars of uuid)
--base <ref> Branch/commit the worktree is created from and that
--collect diffs against (default: main)
--focus "<line>" One-line focus appended to the task frame
--brief <file> Use this file as the task body instead of/in addition
to the fetched item
@@ -56,6 +58,7 @@ UUID=""
SLUG=""
FOCUS=""
BRIEF=""
BASE="main"
DOCS="recent"
EXTRA_TOOLS=""
TIMEOUT=1800
@@ -69,6 +72,7 @@ while [[ $# -gt 0 ]]; do
--slug) SLUG="$2"; shift 2 ;;
--focus) FOCUS="$2"; shift 2 ;;
--brief) BRIEF="$2"; shift 2 ;;
--base) BASE="$2"; shift 2 ;;
--docs) DOCS="$2"; shift 2 ;;
--tools) EXTRA_TOOLS="$2"; shift 2 ;;
--timeout) TIMEOUT="$2"; shift 2 ;;
@@ -171,11 +175,11 @@ if [[ $COLLECT -eq 1 ]]; then
err "no worktree found for slug '${SLUG}' (${WORKTREE})"
exit 1
fi
info "git log --oneline main..HEAD"
git -C "$WORKTREE" log --oneline main..HEAD || true
info "git log --oneline ${BASE}..HEAD"
git -C "$WORKTREE" log --oneline "${BASE}..HEAD" || true
echo
info "git diff --stat main...HEAD"
git -C "$WORKTREE" diff --stat main...HEAD || true
info "git diff --stat ${BASE}...HEAD"
git -C "$WORKTREE" diff --stat "${BASE}...HEAD" || true
echo
if [[ -f "$RESULT_FILE" ]]; then
info "report: $RESULT_FILE"
@@ -223,15 +227,15 @@ fetch_item() {
}
fetch_docs() {
[[ "$DOCS" == "none" ]] && return
[[ "$DOCS" == "none" ]] && return 0
local list_json
if [[ -n "${MM_WORKTREE_TASK_FAKE_DOCS_DIR:-}" ]]; then
[[ -f "${MM_WORKTREE_TASK_FAKE_DOCS_DIR}/list.json" ]] || return
[[ -f "${MM_WORKTREE_TASK_FAKE_DOCS_DIR}/list.json" ]] || return 0
list_json="$(cat "${MM_WORKTREE_TASK_FAKE_DOCS_DIR}/list.json")"
elif [[ -n "$UUID" ]]; then
list_json="$(cp_cli planner items documents list "$UUID" --json 2>/dev/null || echo '{"documents":[]}')"
else
return
return 0
fi
while IFS=$'\t' read -r name updated; do
@@ -368,6 +372,7 @@ if [[ $DRYRUN -eq 1 ]]; then
echo " cp-cli from: ${CP_CLI_DIR:-<not found>}"
echo " cp-cli ctx: ${CP_CONTEXT:-<cp-cli default>}"
echo " Slug: ${SLUG}"
echo " Base: ${BASE}"
echo " UUID: ${UUID:-(none, --brief only)}"
echo " Worktree: ${WORKTREE}"
echo " Branch: ${BRANCH}"
@@ -399,7 +404,7 @@ if [[ -d "$WORKTREE" ]] || git -C "$REPO_ROOT" show-ref --verify --quiet "refs/h
fi
info "creating worktree ${WORKTREE} on branch ${BRANCH}"
git -C "$REPO_ROOT" worktree add "$WORKTREE" -b "$BRANCH" main
git -C "$REPO_ROOT" worktree add "$WORKTREE" -b "$BRANCH" "$BASE"
info "launching ask-minimax-run (detached, timeout ${TIMEOUT}s)"
(