#!/usr/bin/env bash # auto-phase.sh — run the full phased pipeline, no LLM in the loop. # # Processes every pending task in .agents/phases/todo/ in pipeline order # (phase order, then task order within each phase). Each task runs in its # own pi process (fresh context); .agents/validate.sh runs after EVERY task. # On failure the executor's session is resumed for up to MAX_FIX_ATTEMPTS # fixer rounds. A task moves to .agents/phases/complete/ only after the # child exits 0 AND validation passes; a phase completes when its # 00_phase.md final pass succeeds (legacy phases: when their file moves). # Stops at the first task that cannot be completed — re-run this script to # continue where it stopped. # # Env: see SKILL.md (MAX_FIX_ATTEMPTS, PHASE_MODEL, PHASE_THINKING, # PHASE_COMMIT, PI_TRUST, FRESH_FIX). set -uo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/lib.sh" # Make interruptions visible: state stays in .agents/phases/todo, and the # failed executor's session is still resumable on the next run. trap 'echo; echo "✗ ERROR: interrupted (SIGINT) — ${unit:-the pipeline} is left in $PHASE_TODO/; re-run to continue where it stopped" >&2; exit 130' INT trap 'echo; echo "✗ ERROR: interrupted (SIGTERM) — ${unit:-the pipeline} is left in $PHASE_TODO/; re-run to continue where it stopped" >&2; exit 143' TERM cd "$(find_root)" || die "no .agents/phases/todo found in this or parent directories (run /to-phase or /audit-create first)" build_pi_args delivered=() while unit="$(next_unit)"; do [[ -n "$unit" ]] || break if ! execute_unit "$unit"; then # execute_unit printed the failure detail (task failure: errors, logs, # resume command — or phase-commit failure: the hand-fix command). echo "✗ ERROR: pipeline stopped — $unit did not complete (see the error output above)" >&2 echo " re-run this script to continue where it stopped" >&2 exit 1 fi delivered+=("$unit") # Notify after every unit completes: a phase-end (00_phase.md / legacy file) # announces the phase; a normal task file announces the task. if is_phase_end "$unit"; then notify_task "$unit" phase; else notify_task "$unit" task; fi done echo echo "✓ pipeline done — ${#delivered[@]} task(s) delivered this run: ${delivered[*]:-none}" remaining="$(count_units)" echo " remaining in $PHASE_TODO/: $remaining task(s)"