ralph-loop — Claude Code plugin: loop until the task is done
Runs Claude on the same prompt over and over until the task is finished. Useful when the work needs retries: tests, debugging, building an API.
/plugin install ralph-loop@claude-plugins-official
/plugin marketplace add anthropics/claude-plugins-officialWhat ralph-loop does
The plugin implements the Ralph Wiggum technique. Claude works on the task, tries to end the session, and the Stop hook in hooks/stop-hook.sh blocks the exit and feeds the same prompt back. The loop lives inside your current session, so no external while true is needed. The prompt never changes between iterations, but files and git history do — on the next pass Claude reads its own past work and fixes it.
You start it once: /ralph-loop "task description" --completion-promise "DONE". The --max-iterations <n> option stops the loop after N passes; without it there is no limit. To stop early, run /cancel-ralph. The completion phrase is matched as an exact string, so you cannot use it for several exit conditions.
On Windows the hook can break because bash may resolve to WSL instead of Git Bash. The fix is to edit hooks/hooks.json in the plugin cache and point it at Git/bin/bash.exe explicitly. Tasks that need human judgement or have fuzzy success criteria are a bad fit — Claude will just spin.
What it helps with
- get failing tests to a green run
- build a REST API from a requirements list
- walk through task phases without restarting by hand
- debug code from linter and test output
- finish a feature when the done criteria are written down
Example prompts for the agent
- /ralph-loop "Build a REST API for todos: CRUD, input validation, tests. Output <promise>COMPLETE</promise> when done." --completion-promise "COMPLETE" --max-iterations 50
- /ralph-loop "Implement feature X with TDD: failing tests first, then code, run tests until all green" --max-iterations 20
- /cancel-ralph
How to install ralph-loop
Plugin marketplace
/plugin install ralph-loop@claude-plugins-official/plugin marketplace add anthropics/claude-plugins-officialStep by step, with commands for each platform: Claude Code plugins: marketplaces, installing, and building your own
Questions about ralph-loop
How do I install ralph-loop in Claude?
Add the marketplace first: /plugin marketplace add anthropics/claude-plugins-official. Then install the plugin: /plugin install ralph-loop@claude-plugins-official.
What does ralph-loop do?
It keeps feeding Claude the same prompt until the task is complete. A Stop hook blocks session exit, so the iterations run inside your current session.
What limits the ralph-loop cycle?
The --max-iterations <n> option — without it there is no cap. The --completion-promise phrase is matched exactly, so it cannot cover multiple exit conditions.
Source text
ralph-loop · Apache-2.0
# Ralph Loop Plugin
Implementation of the Ralph Wiggum technique for iterative, self-referential AI development loops in Claude Code.
## What is Ralph Loop?
Ralph Loop is a development methodology based on continuous AI agent loops. As Geoffrey Huntley describes it: **"Ralph is a Bash loop"** - a simple `while true` that repeatedly feeds an AI agent a prompt file, allowing it to iteratively improve its work until completion.
This technique is inspired by the Ralph Wiggum coding technique (named after the character from The Simpsons), embodying the philosophy of persistent iteration despite setbacks.
### Core Concept
This plugin implements Ralph using a **Stop hook** that intercepts Claude's exit attempts:
```bash
# You run ONCE:
/ralph-loop "Your task description" --completion-promise "DONE"
# Then Claude Code automatically:
# 1. Works on the task
# 2. Tries to exit
# 3. Stop hook blocks exit
# 4. Stop hook feeds the SAME prompt back
# 5. Repeat until completion
```
The loop happens **inside your current session** - you don't need external bash loops. The Stop hook in `hooks/stop-hook.sh` creates the self-referential feedback loop by blocking normal session exit.
This creates a **self-referential feedback loop** where:
- The prompt never changes between iterations
- Claude's previous work persists in files
- Each iteration sees modified files and git history
- Claude autonomously improves by reading its own past work in files
## Quick Start
```bash
/ralph-loop "Build a REST API for todos. Requirements: CRUD operations, input validation, tests. Output <promise>COMPLETE</promise> when done." --completion-promise "COMPLETE" --max-iterations 50
```
Claude will:
- Implement the API iteratively
- Run tests and see failures
- Fix bugs based on test output
- Iterate until all requirements met
- Output the completion promise when done
## Commands
### /ralph-loop
Start a Ralph loop in your current session.
**Usage:**
```bash
/ralph-loop "<prompt>" --max-iterations <n> --completion-promise "<text>"
```
**Options:**
- `--max-iterations <n>` - Stop after N iterations (default: unlimited)
- `--completion-promise <text>` - Phrase that signals completion
### /cancel-ralph
Cancel the active Ralph loop.
**Usage:**
```bash
/cancel-ralph
```
## Prompt Writing Best Practices
### 1. Clear Completion Criteria
❌ Bad: "Build a todo API and make it good."
✅ Good:
```markdown
Build a REST API for todos.
When complete:
- All CRUD endpoints working
- Input validation in place
- Tests passing (coverage > 80%)
- README with API docs
- Output: <promise>COMPLETE</promise>
```
### 2. Incremental Goals
❌ Bad: "Create a complete e-commerce platform."
✅ Good:
```markdown
Phase 1: User authentication (JWT, tests)
Phase 2: Product catalog (list/search, tests)
Phase 3: Shopping cart (add/remove, tests)
Output <promise>COMPLETE</promise> when all phases done.
```
### 3. Self-Correction
❌ Bad: "Write code for feature X."
✅ Good:
```markdown
Implement feature X following TDD:
1. Write failing tests
2. Implement feature
3. Run tests
4. If any fail, debug and fix
5. Refactor if needed
6. Repeat until all green
7. Output: <promise>COMPLETE</promise>
```
### 4. Escape Hatches
Always use `--max-iterations` as a safety net to prevent infinite loops on impossible tasks:
```bash
# Recommended: Always set a reasonable iteration limit
/ralph-loop "Try to implement feature X" --max-iterations 20
# In your prompt, include what to do if stuck:
# "After 15 iterations, if not complete:
# - Document what's blocking progress
# - List what was attempted
# - Suggest alternative approaches"
```
**Note**: The `--completion-promise` uses exact string matching, so you cannot use it for multiple completion conditions (like "SUCCESS" vs "BLOCKED"). Always rely on `--max-iterations` as your primary safety mechanism.
## Philosophy
Ralph embodies several key principles:
### 1. Iteration > Perfection
Don't aim for perfect on first try. Let the loop refine the work.
### 2. Failures Are Data
"Deterministically bad" means failures are predictable and informative. Use them to tune prompts.
### 3. Operator Skill Matters
Success depends on writing good prompts, not just having a good model.
### 4. Persistence Wins
Keep trying until success. The loop handles retry logic automatically.
## When to Use Ralph
**Good for:**
- Well-defined tasks with clear success criteria
- Tasks requiring iteration and refinement (e.g., getting tests to pass)
- Greenfield projects where you can walk away
- Tasks with automatic verification (tests, linters)
**Not good for:**
- Tasks requiring human judgment or design decisions
- One-shot operations
- Tasks with unclear success criteria
- Production debugging (use targeted debugging instead)
## Real-World Results
- Successfully generated 6 repositories overnight in Y Combinator hackathon testing
- One $50k contract completed for $297 in API costs
- Created entire programming language ("cursed") over 3 months using this approach
## Windows Compatibility
The stop hook uses a bash script that requires Git for Windows to run properly.
**Issue**: On Windows, the `bash` command may resolve to WSL bash (often misconfigured) instead of Git Bash, causing the hook to fail with errors like:
- `wsl: Unknown key 'automount.crossDistro'`
- `execvpe(/bin/bash) failed: No such file or directory`
**Workaround**: Edit the cached plugin's `hooks/hooks.json` to use Git Bash explicitly:
```json
"command": "\"C:/Program Files/Git/bin/bash.exe\" ${CLAUDE_PLUGIN_ROOT}/hooks/stop-hook.sh"
```
**Location**: `~/.claude/plugins/cache/claude-plugins-official/ralph-wiggum/<hash>/hooks/hooks.json`
**Note**: Use `Git/bin/bash.exe` (the wrapper with proper PATH), not `Git/usr/bin/bash.exe` (raw MinGW bash without utilities in PATH).
## Learn More
- Original technique: https://ghuntley.com/ralph/
- Ralph Orchestrator: https://github.com/mikeyobrien/ralph-orchestrator
## For Help
Run `/help` in Claude Code for detailed command reference and examples.
© Anthropic · Apache-2.0 · anthropics/claude-plugins-official