#!/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