@iannuttall/ralph
v0.1.3
Published
Minimal, file-based agent loop for autonomous coding.
Readme
Ralph

Ralph is a minimal, file‑based agent loop for autonomous coding. Each iteration starts fresh, reads the same on‑disk state, and commits work for one story at a time.
How it works
Ralph treats files and git as memory, not the model context:
- PRD (JSON) defines stories, gates, and status
- Loop executes one story per iteration
- State persists in
.ralph/
Global CLI (recommended)
Install and run Ralph from anywhere:
npm i -g @iannuttall/ralph
ralph prd # launches an interactive prompt
ralph build 1 # one Ralph runTemplate hierarchy
Ralph will look for templates in this order:
.agents/ralph/in the current project (if present)- Bundled defaults shipped with this repo
State and logs always go to .ralph/ in the project.
Install templates into a project (optional overrides)
ralph installThis creates .agents/ralph/ in the current repo so you can customize prompts and loop behavior. During install, you’ll be asked if you want to add the required skills.
Install required skills (optional)
ralph install --skillsYou’ll be prompted for agent (codex/claude/droid/opencode) and local vs global install. Skills installed: commit, dev-browser, prd.
If you skipped skills during ralph install, you can run ralph install --skills anytime.
Quick start (project)
- Create your PRD (JSON) or generate one:
ralph prdRequires the prd skill (install via ralph install --skills).
Example prompt text:
A lightweight uptime monitor (Hono app), deployed on Cloudflare, with email alerts via AWS SESDefault output (agent chooses a short filename in .agents/tasks/):
.agents/tasks/prd-<short>.json- Run one build iteration:
ralph build 1 # one Ralph runNo‑commit dry run:
ralph build 1 --no-commit # one Ralph runOverride PRD output for ralph prd:
ralph prd --out .agents/tasks/prd-api.jsonOptional human overview (generated from JSON):
ralph overviewThis writes a tiny overview alongside the PRD: prd-<slug>.overview.md.
PRD story status fields are updated automatically by the loop:
open→ selectablein_progress→ locked by a running loop (withstartedAt)done→ completed (withcompletedAt)
If a loop crashes and a story stays in_progress, you can set STALE_SECONDS in .agents/ralph/config.sh to allow Ralph to automatically reopen stalled stories.
Override PRD paths
You can point Ralph at a different PRD JSON file via CLI flags:
ralph build 1 --prd .agents/tasks/prd-api.json # one Ralph runOptional progress override:
ralph build 1 --progress .ralph/progress-api.md # one Ralph runIf multiple PRD JSON files exist in .agents/tasks/ and you omit --prd, Ralph will prompt you to choose.
Optional config file (if you installed templates):
.agents/ralph/config.shChoose the agent runner
Set AGENT_CMD in .agents/ralph/config.sh to switch agents:
AGENT_CMD="codex exec --yolo -"
AGENT_CMD="claude -p --dangerously-skip-permissions \"\$(cat {prompt})\""
AGENT_CMD="droid exec --skip-permissions-unsafe -f {prompt}"
AGENT_CMD="opencode run \"$(cat {prompt})\""Or override per run:
ralph prd --agent=codex
ralph build 1 --agent=codex # one Ralph run
ralph build 1 --agent=claude # one Ralph run
ralph build 1 --agent=droid # one Ralph run
ralph build 1 --agent=opencode # one Ralph runIf the CLI isn’t installed, Ralph prints install hints:
codex -> npm i -g @openai/codex
claude -> curl -fsSL https://claude.ai/install.sh | bash
droid -> curl -fsSL https://app.factory.ai/cli | sh
opencode -> curl -fsSL https://opencode.ai/install.sh | bashState files (.ralph/)
progress.md— append‑only progress logguardrails.md— “Signs” (lessons learned)activity.log— activity + timing logerrors.log— repeated failures and notesruns/— raw run logs + summaries
Notes
.agents/ralphis portable and can be copied between repos..ralphis per‑project state.- Use
{prompt}inAGENT_CMDwhen agent needs a file path instead of stdin. - Examples: see
examples/commands.md. - OpenCode server mode: For faster performance with OpenCode, run
opencode servein a separate terminal and uncomment theAGENT_OPENCODE_CMDlines in.agents/ralph/agents.shto use--attach http://localhost:4096. This avoids cold boot on every run.
Tests
Dry-run smoke tests (no agent required):
npm testFast agent health check (real agent call, minimal output):
npm run test:pingOptional integration test (requires agents installed):
RALPH_INTEGRATION=1 npm testFull real-agent loop test:
npm run test:real