#!/bin/bash
Ralph Wiggum - Long-running AI agent loop
Usage: ./ralph.sh [—tool amp|claude] [max_iterations]
set -e
Parse arguments
TOOL=“amp” # Default to amp for backwards compatibility MAX_ITERATIONS=10
while [[ #--gt-0-| -gt 0 ]]; do case 1 in —tool) TOOL=“{1#*=}” shift ;; *) # Assume it’s max_iterations if it’s a number if [[ ” ]]; then MAX_ITERATIONS=“$1” fi shift ;; esac done
Validate tool choice
if [[ “TOOL" != "amp" && "TOOL” != “claude” ]]; then echo “Error: Invalid tool ‘(cd “{BASH_SOURCE[0]}”)” && pwd)” PRD_FILE=“SCRIPT_DIR/progress.txt” ARCHIVE_DIR=“SCRIPT_DIR/.last-branch”
Archive previous run if branch changed
if [ -f “PRD_FILE" ] && [ -f "LAST_BRANCH_FILE” ]; then CURRENT_BRANCH=PRD_FILE” 2>/dev/null || echo "") LAST_BRANCH=LAST_BRANCH_FILE” 2>/dev/null || echo "")
if [ -n “CURRENT_BRANCH" ] && [ -n "LAST_BRANCH” ] && [ “LAST_BRANCH” ]; then # Archive the previous run DATE=(date +%Y-%m-%d) # Strip "ralph/" prefix from branch name for folder FOLDER_NAME=(echo “ARCHIVE_DIR/FOLDER_NAME”
echo "Archiving previous run: $LAST_BRANCH"
mkdir -p "$ARCHIVE_FOLDER"
[ -f "$PRD_FILE" ] && cp "$PRD_FILE" "$ARCHIVE_FOLDER/"
[ -f "$PROGRESS_FILE" ] && cp "$PROGRESS_FILE" "$ARCHIVE_FOLDER/"
echo " Archived to: $ARCHIVE_FOLDER"
# Reset progress file for new run
echo "# Ralph Progress Log" > "$PROGRESS_FILE"
echo "Started: $(date)" >> "$PROGRESS_FILE"
echo "---" >> "$PROGRESS_FILE"
fi fi
Track current branch
if [ -f “(jq -r ‘.branchName // empty’ “CURRENT_BRANCH” ]; then echo “LAST_BRANCH_FILE” fi fi
Initialize progress file if it doesn’t exist
if [ ! -f “PROGRESS_FILE" ]; then echo "# Ralph Progress Log" > "PROGRESS_FILE” echo “Started: PROGRESS_FILE” echo ”---” >> “$PROGRESS_FILE” fi
echo “Starting Ralph - Tool: MAX_ITERATIONS”
for i in MAX_ITERATIONS); do echo "" echo ”===============================================================” echo ” Ralph Iteration MAX_ITERATIONS ($TOOL)” echo ”===============================================================“
Run the selected tool with the ralph prompt
if [[ “(cat “SCRIPT_DIR/prompt.md" | amp --dangerously-allow-all 2>&1 | tee /dev/stderr) || true else # Claude Code: use --dangerously-skip-permissions for autonomous operation, --print for output OUTPUT=(claude —dangerously-skip-permissions —print < “$SCRIPT_DIR/CLAUDE.md” 2>&1 | tee /dev/stderr) || true fi
Check for completion signal
if echo “i of $MAX_ITERATIONS” exit 0 fi
echo “Iteration $i complete. Continuing…” sleep 2 done
echo "" echo “Ralph reached max iterations (PROGRESS_FILE for status.” exit 1