# ralph-run
> Run RALPH autonomous development loop to implement features from the PRD.
- Author: dorav
- Repository: doravidan/supreme-ralph
- Version: 20260122193650
- Stars: 0
- Forks: 0
- Last Updated: 2026-02-06
- Source: https://github.com/doravidan/supreme-ralph
- Web: https://mule.run/skillshub/@@doravidan/supreme-ralph~ralph-run:20260122193650
---
---
name: ralph-run
description: Run RALPH autonomous development loop to implement features from the PRD.
allowed-tools: Bash, Read, Edit, Write, Grep, Glob
---
# Run RALPH - Autonomous Development
Execute the RALPH autonomous development loop to implement features from the PRD.
## Two Operating Modes
### 1. PRD Loop Mode (Greenfield)
For implementing features from a PRD file:
```bash
./scripts/ralph/ralph.sh 20
```
### 2. Single-Task Mode (Brownfield)
For quick one-off tasks without a PRD:
```bash
./scripts/ralph/ralph.sh --task "Fix the login button styling"
```
## Trigger
This skill activates when:
- `/ralph-run` - Start RALPH with default iterations (10)
- `/ralph-run 20` - Start RALPH with specified iterations
- `/ralph-run --task "description"` - Single-task mode
- User says "run RALPH", "start autonomous development", etc.
## Prerequisites Check
### 1. Verify PRD exists (supports multiple formats)
```bash
# Check for PRD in multiple formats
if [ -f prd.json ]; then
echo "✓ Found prd.json (JSON format)"
# Validate JSON
cat prd.json | jq . > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "❌ prd.json is not valid JSON"
exit 1
fi
# Check for incomplete stories
REMAINING=$(cat prd.json | jq '[.userStories[] | select(.passes == false)] | length')
elif [ -f PRD.md ]; then
echo "✓ Found PRD.md (Markdown format)"
# Count unchecked tasks
REMAINING=$(grep -c '^\s*- \[ \]' PRD.md || echo "0")
elif [ -f tasks.yaml ]; then
echo "✓ Found tasks.yaml (YAML format)"
REMAINING=$(grep -c 'completed: false' tasks.yaml || echo "0")
else
echo "❌ No PRD found"
echo ""
echo "Create one first:"
echo " /prd [feature description]"
echo " or"
echo " Create prd.json, PRD.md, or tasks.yaml"
exit 1
fi
if [ "$REMAINING" -eq 0 ]; then
echo "✓ All stories already complete!"
exit 0
fi
echo "✓ Found $REMAINING incomplete stories/tasks"
```
### 2. Check RALPH configuration
```bash
# Check for .ralph/config.yaml
if [ -f .ralph/config.yaml ]; then
echo "✓ Found .ralph/config.yaml"
# Show configured commands
echo " Quality gates:"
grep -A4 "commands:" .ralph/config.yaml | tail -4
else
echo "⚠ No .ralph/config.yaml found"
echo " Run /setup-project to generate it"
fi
```
### 3. Verify PROJECT_SPEC.md exists (recommended)
```bash
if [ ! -f PROJECT_SPEC.md ]; then
echo "⚠ PROJECT_SPEC.md not found"
echo " RALPH works better with project context"
echo " Run /setup-project to generate it"
fi
```
### 4. Check Git status
```bash
# Ensure clean working directory or uncommitted changes are intentional
git status --short
```
### 5. Show PRD status
```bash
echo "=== PRD Status ==="
if [ -f prd.json ]; then
cat prd.json | jq '{
project: .project,
branch: .branchName,
total: (.userStories | length),
complete: ([.userStories[] | select(.passes == true)] | length),
remaining: ([.userStories[] | select(.passes == false)] | length)
}'
echo ""
echo "=== Stories to Implement ==="
cat prd.json | jq -r '.userStories[] | select(.passes == false) | " \(.id): \(.title) (Priority \(.priority))"'
elif [ -f PRD.md ]; then
echo "Remaining tasks:"
grep '^\s*- \[ \]' PRD.md
elif [ -f tasks.yaml ]; then
echo "Remaining tasks:"
grep -B1 'completed: false' tasks.yaml | grep 'title:'
fi
```
## Running RALPH
### Option 1: Bash Script (Recommended)
```bash
./scripts/ralph/ralph.sh 20
```
The script:
1. Detects PRD format (JSON/Markdown/YAML) automatically
2. Loads configuration from .ralph/config.yaml (rules, boundaries)
3. Runs Claude with context-aware RALPH prompt
4. Each iteration implements ONE story
5. Runs quality gates (typecheck, lint, tests)
6. Checks for `COMPLETE` signal
7. Stops when all stories pass or max iterations reached
### With CLI Options:
```bash
# Skip tests (faster iteration)
./scripts/ralph/ralph.sh --skip-tests 20
# Skip linting
./scripts/ralph/ralph.sh --skip-lint 20
# Custom branch
./scripts/ralph/ralph.sh --branch feature/my-feature 20
# Dry run (no commits)
./scripts/ralph/ralph.sh --dry-run 20
# Single-task mode (no PRD needed)
./scripts/ralph/ralph.sh --task "Add dark mode toggle to settings page"
```
### Option 2: Node.js Runner
```bash
node scripts/run-ralph.js 20
```
Additional options:
```bash
node scripts/run-ralph.js --status # Show PRD status
node scripts/run-ralph.js --validate # Validate prd.json
node scripts/run-ralph.js --reset # Reset progress.txt
node scripts/run-ralph.js --analyze # Re-analyze project
node scripts/run-ralph.js --skip-tests # Skip test quality gate
node scripts/run-ralph.js --skip-lint # Skip lint quality gate
node scripts/run-ralph.js --dry-run # Don't commit changes
```
## Configuration
RALPH configuration is stored in `.ralph/config.yaml`:
```yaml
# Rules - AI MUST follow these on every task
rules:
- "Always use TypeScript strict mode"
- "Follow existing patterns in src/utils/"
- "Write tests for all new functions"
# Boundaries - AI should NOT modify these files
boundaries:
never_touch:
- "src/legacy/**"
- "migrations/**"
- "*.lock"
# Quality gate commands
commands:
test: "npm test"
lint: "npm run lint"
typecheck: "npx tsc --noEmit"
build: "npm run build"
# Execution settings
settings:
max_retries: 3
retry_delay: 5
auto_commit: true
```
### Option 3: Manual Iteration
For more control, run iterations manually:
```bash
# Run single iteration
claude -p "$(cat scripts/ralph/CLAUDE.md)"
# Check progress
cat prd.json | jq '.userStories[] | {id, title, passes}'
# Review changes
git log --oneline -5
git diff HEAD~1
# Continue if needed
claude -p "$(cat scripts/ralph/CLAUDE.md)"
```
## RALPH Execution Flow
Each RALPH iteration follows this flow:
```
┌─────────────────────────────────────────────────────────┐
│ RALPH ITERATION │
├─────────────────────────────────────────────────────────┤
│ │
│ 1. READ CONTEXT │
│ ├── prd.json (stories, completion status) │
│ ├── PROJECT_SPEC.md (tech stack, patterns) │
│ ├── progress.txt (learnings from prior iterations) │
│ └── git log (what was done before) │
│ │
│ 2. SELECT STORY │
│ └── Pick highest priority with passes: false │
│ │
│ 3. IMPLEMENT │
│ ├── Follow PROJECT_SPEC.md patterns │
│ ├── Write clean, production-ready code │
│ └── Meet ALL acceptance criteria │
│ │
│ 4. QUALITY GATES │
│ ├── Typecheck: npm run typecheck / npx tsc │
│ ├── Lint: npm run lint │
│ └── Test: npm test │
│ │
│ 5. COMMIT │
│ └── git commit -m "feat: US-XXX - Story Title" │
│ │
│ 6. UPDATE PRD │
│ └── Set passes: true in prd.json │
│ │
│ 7. LOG PROGRESS │
│ └── Append learnings to progress.txt │
│ │
│ 8. CHECK COMPLETION │
│ ├── If all stories pass: COMPLETE│
│ └── Otherwise: exit for next iteration │
│ │
└─────────────────────────────────────────────────────────┘
```
## Monitoring Progress
### Watch progress.txt
```bash
# Real-time monitoring
tail -f progress.txt
# Last 50 lines
tail -50 progress.txt
```
### Check story status
```bash
# All stories
cat prd.json | jq '.userStories[] | {id, title, passes}'
# Remaining stories
cat prd.json | jq '.userStories[] | select(.passes == false) | {id, title, priority}'
# Completion percentage
cat prd.json | jq '
(.userStories | length) as $total |
([.userStories[] | select(.passes == true)] | length) as $done |
{total: $total, done: $done, remaining: ($total - $done), percent: (($done / $total) * 100 | floor)}
'
```
### View Git commits
```bash
# Recent commits
git log --oneline -10
# Commits on this branch
git log --oneline main..HEAD
# Show files changed
git diff --stat main..HEAD
```
## If RALPH Gets Stuck
### 1. Check progress.txt for patterns
```bash
# Look for recurring issues
grep -i "error\|fail\|stuck\|retry" progress.txt
# Review last iteration
tail -100 progress.txt
```
### 2. Fix blocking issues manually
```bash
# If tests fail, fix them
npm test
# If typecheck fails, fix types
npx tsc --noEmit
# If lint fails, fix or auto-fix
npm run lint -- --fix
```
### 3. Reset and continue
```bash
# Reset progress (preserves patterns)
node scripts/run-ralph.js --reset
# Or manually clear the stuck iteration
# Edit progress.txt to remove failed attempt
# Resume
./scripts/ralph/ralph.sh 20
```
### 4. Adjust the story
If a story is too complex:
```bash
# Edit prd.json to split the story
# Set the original back to passes: false
# Add new smaller stories with higher priority numbers
```
## Completion
When RALPH finishes:
### All stories complete
```
=== RALPH Complete ===
Project: [Feature Name]
Branch: ralph/[feature-slug]
Stories: [N]/[N] complete
Commits:
abc1234 feat: US-001 - Story Title
def5678 feat: US-002 - Story Title
...
Next Steps:
1. Review the implementation:
git diff main..HEAD
2. Run full test suite:
npm test
3. Create PR:
gh pr create --base main --title "feat: [Feature Name]"
```
### Partial completion (max iterations reached)
```
=== RALPH Paused ===
Completed: [X]/[N] stories
Remaining: [Y] stories
To continue:
./scripts/ralph/ralph.sh 20
To review progress:
cat progress.txt
cat prd.json | jq '.userStories[] | select(.passes == false)'
```
## Quality Commands Reference
### TypeScript/JavaScript
```bash
# Typecheck
npm run typecheck
# or
npx tsc --noEmit
# Lint
npm run lint
# or
npx eslint . --ext .ts,.tsx
# Test
npm test
# or
npx vitest run
```
### Python
```bash
# Type check
mypy .
# Lint
ruff check .
# or
pylint **/*.py
# Test
pytest
```
### Go
```bash
# Build
go build ./...
# Lint
golangci-lint run
# Test
go test ./...
```
## Example Session
```bash
# 1. Create PRD
/prd Add user authentication with email/password
# 2. Review generated PRD
cat prd.json
cat tasks/prd-user-authentication.md
# 3. Adjust if needed
# (edit prd.json)
# 4. Create feature branch
git checkout -b ralph/user-authentication
# 5. Run RALPH
./scripts/ralph/ralph.sh 20
# 6. Monitor (in another terminal)
watch -n 5 'cat prd.json | jq ".userStories[] | {id, passes}"'
# 7. When complete, review
git log --oneline main..HEAD
npm test
# 8. Create PR
gh pr create --base main
```
## Troubleshooting
### "No prd.json found"
Create one with `/prd [feature]` or `/ralph-convert tasks/prd-[name].md`
### "All stories already complete"
Reset with `--reset` flag or edit prd.json to set `passes: false`
### "Tests keep failing"
Check progress.txt for patterns, fix tests manually, then continue
### "RALPH making same mistake repeatedly"
Add explicit notes to progress.txt about the issue and correct approach
### "Story too large for one iteration"
Split into smaller stories in prd.json, adjust priorities
### "Quality gates passing but story not complete"
Check acceptance criteria - may need more specific criteria