| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- #!/bin/bash
- # Ralph Loop Setup Script
- # Creates state file for in-session Ralph loop
- set -euo pipefail
- # Parse arguments
- PROMPT_PARTS=()
- MAX_ITERATIONS=0
- COMPLETION_PROMISE="null"
- # Parse options and positional arguments
- while [[ $# -gt 0 ]]; do
- case $1 in
- -h|--help)
- cat << 'HELP_EOF'
- Ralph Loop - Interactive self-referential development loop
- USAGE:
- /ralph-loop [PROMPT...] [OPTIONS]
- ARGUMENTS:
- PROMPT... Initial prompt to start the loop (can be multiple words without quotes)
- OPTIONS:
- --max-iterations <n> Maximum iterations before auto-stop (default: unlimited)
- --completion-promise '<text>' Promise phrase (USE QUOTES for multi-word)
- -h, --help Show this help message
- DESCRIPTION:
- Starts a Ralph Loop in your CURRENT session. The stop hook prevents
- exit and feeds your output back as input until completion or iteration limit.
- To signal completion, you must output: <promise>YOUR_PHRASE</promise>
- Use this for:
- - Interactive iteration where you want to see progress
- - Tasks requiring self-correction and refinement
- - Learning how Ralph works
- EXAMPLES:
- /ralph-loop Build a todo API --completion-promise 'DONE' --max-iterations 20
- /ralph-loop --max-iterations 10 Fix the auth bug
- /ralph-loop Refactor cache layer (runs forever)
- /ralph-loop --completion-promise 'TASK COMPLETE' Create a REST API
- STOPPING:
- Only by reaching --max-iterations or detecting --completion-promise
- No manual stop - Ralph runs infinitely by default!
- MONITORING:
- # View current iteration:
- grep '^iteration:' .claude/ralph-loop.local.md
- # View full state:
- head -10 .claude/ralph-loop.local.md
- HELP_EOF
- exit 0
- ;;
- --max-iterations)
- if [[ -z "${2:-}" ]]; then
- echo "โ Error: --max-iterations requires a number argument" >&2
- echo "" >&2
- echo " Valid examples:" >&2
- echo " --max-iterations 10" >&2
- echo " --max-iterations 50" >&2
- echo " --max-iterations 0 (unlimited)" >&2
- echo "" >&2
- echo " You provided: --max-iterations (with no number)" >&2
- exit 1
- fi
- if ! [[ "$2" =~ ^[0-9]+$ ]]; then
- echo "โ Error: --max-iterations must be a positive integer or 0, got: $2" >&2
- echo "" >&2
- echo " Valid examples:" >&2
- echo " --max-iterations 10" >&2
- echo " --max-iterations 50" >&2
- echo " --max-iterations 0 (unlimited)" >&2
- echo "" >&2
- echo " Invalid: decimals (10.5), negative numbers (-5), text" >&2
- exit 1
- fi
- MAX_ITERATIONS="$2"
- shift 2
- ;;
- --completion-promise)
- if [[ -z "${2:-}" ]]; then
- echo "โ Error: --completion-promise requires a text argument" >&2
- echo "" >&2
- echo " Valid examples:" >&2
- echo " --completion-promise 'DONE'" >&2
- echo " --completion-promise 'TASK COMPLETE'" >&2
- echo " --completion-promise 'All tests passing'" >&2
- echo "" >&2
- echo " You provided: --completion-promise (with no text)" >&2
- echo "" >&2
- echo " Note: Multi-word promises must be quoted!" >&2
- exit 1
- fi
- COMPLETION_PROMISE="$2"
- shift 2
- ;;
- *)
- # Non-option argument - collect all as prompt parts
- PROMPT_PARTS+=("$1")
- shift
- ;;
- esac
- done
- # Join all prompt parts with spaces
- PROMPT="${PROMPT_PARTS[*]:-}"
- # Validate prompt is non-empty
- if [[ -z "$PROMPT" ]]; then
- echo "โ Error: No prompt provided" >&2
- echo "" >&2
- echo " Ralph needs a task description to work on." >&2
- echo "" >&2
- echo " Examples:" >&2
- echo " /ralph-loop Build a REST API for todos" >&2
- echo " /ralph-loop Fix the auth bug --max-iterations 20" >&2
- echo " /ralph-loop --completion-promise 'DONE' Refactor code" >&2
- echo "" >&2
- echo " For all options: /ralph-loop --help" >&2
- exit 1
- fi
- # Create state file for stop hook (markdown with YAML frontmatter)
- mkdir -p .claude
- # Quote completion promise for YAML if it contains special chars or is not null
- if [[ -n "$COMPLETION_PROMISE" ]] && [[ "$COMPLETION_PROMISE" != "null" ]]; then
- COMPLETION_PROMISE_YAML="\"$COMPLETION_PROMISE\""
- else
- COMPLETION_PROMISE_YAML="null"
- fi
- cat > .claude/ralph-loop.local.md <<EOF
- ---
- active: true
- iteration: 1
- session_id: ${CLAUDE_CODE_SESSION_ID:-}
- max_iterations: $MAX_ITERATIONS
- completion_promise: $COMPLETION_PROMISE_YAML
- started_at: "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
- ---
- $PROMPT
- EOF
- # Output setup message
- cat <<EOF
- ๐ Ralph loop activated in this session!
- Iteration: 1
- Max iterations: $(if [[ $MAX_ITERATIONS -gt 0 ]]; then echo $MAX_ITERATIONS; else echo "unlimited"; fi)
- Completion promise: $(if [[ "$COMPLETION_PROMISE" != "null" ]]; then echo "${COMPLETION_PROMISE//\"/} (ONLY output when TRUE - do not lie!)"; else echo "none (runs forever)"; fi)
- The stop hook is now active. When you try to exit, the SAME PROMPT will be
- fed back to you. You'll see your previous work in files, creating a
- self-referential loop where you iteratively improve on the same task.
- To monitor: head -10 .claude/ralph-loop.local.md
- โ ๏ธ WARNING: This loop cannot be stopped manually! It will run infinitely
- unless you set --max-iterations or --completion-promise.
- ๐
- EOF
- # Output the initial prompt if provided
- if [[ -n "$PROMPT" ]]; then
- echo ""
- echo "$PROMPT"
- fi
- # Display completion promise requirements if set
- if [[ "$COMPLETION_PROMISE" != "null" ]]; then
- echo ""
- echo "โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"
- echo "CRITICAL - Ralph Loop Completion Promise"
- echo "โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"
- echo ""
- echo "To complete this loop, output this EXACT text:"
- echo " <promise>$COMPLETION_PROMISE</promise>"
- echo ""
- echo "STRICT REQUIREMENTS (DO NOT VIOLATE):"
- echo " โ Use <promise> XML tags EXACTLY as shown above"
- echo " โ The statement MUST be completely and unequivocally TRUE"
- echo " โ Do NOT output false statements to exit the loop"
- echo " โ Do NOT lie even if you think you should exit"
- echo ""
- echo "IMPORTANT - Do not circumvent the loop:"
- echo " Even if you believe you're stuck, the task is impossible,"
- echo " or you've been running too long - you MUST NOT output a"
- echo " false promise statement. The loop is designed to continue"
- echo " until the promise is GENUINELY TRUE. Trust the process."
- echo ""
- echo " If the loop should stop, the promise statement will become"
- echo " true naturally. Do not force it by lying."
- echo "โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"
- fi
|