|
1 | 1 | #!/bin/bash |
2 | 2 | # Ralph Wiggum - Long-running AI agent loop |
3 | | -# Usage: ./ralph.sh [--tool amp|claude] [max_iterations] |
| 3 | +# Usage: ./ralph.sh --agent amp|claude|codex [max_iterations] |
4 | 4 |
|
5 | 5 | set -e |
6 | 6 |
|
7 | | -# Parse arguments |
8 | | -TOOL="amp" # Default to amp for backwards compatibility |
9 | | -MAX_ITERATIONS=10 |
10 | | - |
11 | | -while [[ $# -gt 0 ]]; do |
12 | | - case $1 in |
13 | | - --tool) |
14 | | - TOOL="$2" |
15 | | - shift 2 |
16 | | - ;; |
17 | | - --tool=*) |
18 | | - TOOL="${1#*=}" |
19 | | - shift |
20 | | - ;; |
21 | | - *) |
22 | | - # Assume it's max_iterations if it's a number |
23 | | - if [[ "$1" =~ ^[0-9]+$ ]]; then |
24 | | - MAX_ITERATIONS="$1" |
25 | | - fi |
26 | | - shift |
27 | | - ;; |
28 | | - esac |
29 | | -done |
30 | | - |
31 | | -# Validate tool choice |
32 | | -if [[ "$TOOL" != "amp" && "$TOOL" != "claude" ]]; then |
33 | | - echo "Error: Invalid tool '$TOOL'. Must be 'amp' or 'claude'." |
34 | | - exit 1 |
35 | | -fi |
36 | | -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
37 | | -PRD_FILE="$SCRIPT_DIR/prd.json" |
38 | | -PROGRESS_FILE="$SCRIPT_DIR/progress.txt" |
39 | | -ARCHIVE_DIR="$SCRIPT_DIR/archive" |
40 | | -LAST_BRANCH_FILE="$SCRIPT_DIR/.last-branch" |
41 | | - |
42 | | -# Archive previous run if branch changed |
43 | | -if [ -f "$PRD_FILE" ] && [ -f "$LAST_BRANCH_FILE" ]; then |
44 | | - CURRENT_BRANCH=$(jq -r '.branchName // empty' "$PRD_FILE" 2>/dev/null || echo "") |
45 | | - LAST_BRANCH=$(cat "$LAST_BRANCH_FILE" 2>/dev/null || echo "") |
46 | | - |
47 | | - if [ -n "$CURRENT_BRANCH" ] && [ -n "$LAST_BRANCH" ] && [ "$CURRENT_BRANCH" != "$LAST_BRANCH" ]; then |
48 | | - # Archive the previous run |
49 | | - DATE=$(date +%Y-%m-%d) |
50 | | - # Strip "ralph/" prefix from branch name for folder |
51 | | - FOLDER_NAME=$(echo "$LAST_BRANCH" | sed 's|^ralph/||') |
52 | | - ARCHIVE_FOLDER="$ARCHIVE_DIR/$DATE-$FOLDER_NAME" |
53 | | - |
54 | | - echo "Archiving previous run: $LAST_BRANCH" |
55 | | - mkdir -p "$ARCHIVE_FOLDER" |
56 | | - [ -f "$PRD_FILE" ] && cp "$PRD_FILE" "$ARCHIVE_FOLDER/" |
57 | | - [ -f "$PROGRESS_FILE" ] && cp "$PROGRESS_FILE" "$ARCHIVE_FOLDER/" |
58 | | - echo " Archived to: $ARCHIVE_FOLDER" |
59 | | - |
60 | | - # Reset progress file for new run |
61 | | - echo "# Ralph Progress Log" > "$PROGRESS_FILE" |
62 | | - echo "Started: $(date)" >> "$PROGRESS_FILE" |
63 | | - echo "---" >> "$PROGRESS_FILE" |
64 | | - fi |
65 | | -fi |
66 | | - |
67 | | -# Track current branch |
68 | | -if [ -f "$PRD_FILE" ]; then |
69 | | - CURRENT_BRANCH=$(jq -r '.branchName // empty' "$PRD_FILE" 2>/dev/null || echo "") |
70 | | - if [ -n "$CURRENT_BRANCH" ]; then |
71 | | - echo "$CURRENT_BRANCH" > "$LAST_BRANCH_FILE" |
72 | | - fi |
73 | | -fi |
74 | | - |
75 | | -# Initialize progress file if it doesn't exist |
76 | | -if [ ! -f "$PROGRESS_FILE" ]; then |
77 | | - echo "# Ralph Progress Log" > "$PROGRESS_FILE" |
78 | | - echo "Started: $(date)" >> "$PROGRESS_FILE" |
79 | | - echo "---" >> "$PROGRESS_FILE" |
80 | | -fi |
81 | | - |
82 | | -echo "Starting Ralph - Tool: $TOOL - Max iterations: $MAX_ITERATIONS" |
83 | | - |
84 | | -for i in $(seq 1 $MAX_ITERATIONS); do |
85 | | - echo "" |
86 | | - echo "===============================================================" |
87 | | - echo " Ralph Iteration $i of $MAX_ITERATIONS ($TOOL)" |
88 | | - echo "===============================================================" |
89 | | - |
90 | | - # Run the selected tool with the ralph prompt |
91 | | - if [[ "$TOOL" == "amp" ]]; then |
92 | | - OUTPUT=$(cat "$SCRIPT_DIR/prompt.md" | amp --dangerously-allow-all 2>&1 | tee /dev/stderr) || true |
93 | | - else |
94 | | - # Claude Code: use --dangerously-skip-permissions for autonomous operation, --print for output |
95 | | - OUTPUT=$(claude --dangerously-skip-permissions --print < "$SCRIPT_DIR/CLAUDE.md" 2>&1 | tee /dev/stderr) || true |
96 | | - fi |
97 | | - |
98 | | - # Check for completion signal |
99 | | - if echo "$OUTPUT" | grep -q "<promise>COMPLETE</promise>"; then |
100 | | - echo "" |
101 | | - echo "Ralph completed all tasks!" |
102 | | - echo "Completed at iteration $i of $MAX_ITERATIONS" |
103 | | - exit 0 |
104 | | - fi |
105 | | - |
106 | | - echo "Iteration $i complete. Continuing..." |
107 | | - sleep 2 |
| 7 | +SOURCE="${BASH_SOURCE[0]}" |
| 8 | +while [ -h "$SOURCE" ]; do |
| 9 | + DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" |
| 10 | + TARGET="$(readlink "$SOURCE")" |
| 11 | + if [[ "$TARGET" = /* ]]; then |
| 12 | + SOURCE="$TARGET" |
| 13 | + else |
| 14 | + SOURCE="$DIR/$TARGET" |
| 15 | + fi |
108 | 16 | done |
109 | | - |
110 | | -echo "" |
111 | | -echo "Ralph reached max iterations ($MAX_ITERATIONS) without completing all tasks." |
112 | | -echo "Check $PROGRESS_FILE for status." |
113 | | -exit 1 |
| 17 | +SCRIPT_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" |
| 18 | +cd "$SCRIPT_DIR" |
| 19 | +exec uv run --script ralphython.py "$@" |
0 commit comments