#!/usr/bin/env sh # Headless loop script for overnight Claude Code automation. # Set CLAUDE_AUTONOMOUS=1 for Ralph Wiggum (Stop hook blocks until plan is complete). set -eu PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(cd "$(dirname "$0")/.." && pwd)}" PROMPT_FILE="${PROMPT_FILE:-$PROJECT_DIR/loop/prompt.md}" LOG_FILE="${LOG_FILE:-$PROJECT_DIR/loop/loop.log}" ITERATION_COUNT="${ITERATION_COUNT:-1}" ITERATION_DELAY="${ITERATION_DELAY:-600}" CLAUDE_BIN="${CLAUDE_BIN:-claude}" cd "$PROJECT_DIR" echo "=== Overnight loop started $(date '+%Y-%m-%dT%H:%M:%S' 2>/dev/null || date) ===" | tee -a "$LOG_FILE" echo " PROMPT_FILE=$PROMPT_FILE" | tee -a "$LOG_FILE" echo " CLAUDE_AUTONOMOUS=${CLAUDE_AUTONOMOUS:-0}" | tee -a "$LOG_FILE" echo " ITERATION_COUNT=$ITERATION_COUNT" | tee -a "$LOG_FILE" echo "" | tee -a "$LOG_FILE" i=1 while [ "$i" -le "$ITERATION_COUNT" ]; do echo "--- Iteration $i/$ITERATION_COUNT @ $(date '+%Y-%m-%dT%H:%M:%S' 2>/dev/null || date) ---" | tee -a "$LOG_FILE" export CLAUDE_PROJECT_DIR="$PROJECT_DIR" export CLAUDE_AUTONOMOUS="${CLAUDE_AUTONOMOUS:-1}" # Run Claude with autonomous permissions; prompt from file if [ -f "$PROMPT_FILE" ]; then "$CLAUDE_BIN" -p --dangerously-skip-permissions --output-format=stream-json \ < "$PROMPT_FILE" 2>&1 | tee -a "$LOG_FILE" || true else echo "Error: $PROMPT_FILE not found" | tee -a "$LOG_FILE" exit 1 fi i=$((i + 1)) if [ "$i" -le "$ITERATION_COUNT" ] && [ "$ITERATION_DELAY" -gt 0 ]; then echo "Waiting ${ITERATION_DELAY}s before next iteration..." | tee -a "$LOG_FILE" sleep "$ITERATION_DELAY" fi done echo "=== Loop complete $(date '+%Y-%m-%dT%H:%M:%S' 2>/dev/null || date) ===" | tee -a "$LOG_FILE"