Back to Skills
    🦞

    ralph-loop

    Generate copy-paste bash scripts for Ralph Wiggum/AI agent

    By @jordyvandomselaar
    View on GitHub
    SKILL.md
    ---
    name: ralph-loop
    description: Generate copy-paste bash scripts for Ralph Wiggum/AI agent loops (Codex, Claude Code, OpenCode, Goose). Use when asked for a “Ralph loop”, “Ralph Wiggum loop”, or an AI loop to plan/build code via PROMPT.md + AGENTS.md, SPECS, and IMPLEMENTATION_PLAN.md, including PLANNING vs BUILDING modes, backpressure, sandboxing, and completion conditions.
    ---
    
    # Ralph Loop
    
    ## Overview
    Generate a ready-to-run bash script that runs an AI coding CLI in a loop. Align with the Ralph playbook flow:
    
    1) **Define requirements** → JTBD → topics of concern → `specs/*.md`
    2) **PLANNING loop** → create/update `IMPLEMENTATION_PLAN.md` (no implementation)
    3) **BUILDING loop** → implement tasks, run tests (backpressure), update plan, commit
    
    The loop persists context via `PROMPT.md` + `AGENTS.md` (loaded every iteration) plus the on-disk plan/specs.
    
    ## Workflow
    
    ### 1) Collect inputs (ask if missing)
    - **Goal / JTBD** (what outcome is needed)
    - CLI (`codex`, `claude-code`, `opencode`, `goose`, other)
    - **Mode**: `PLANNING`, `BUILDING`, or `BOTH`
    - **Completion condition**
      - Promise phrase (string to detect), **or**
      - Test/command to run each iteration, **or**
      - Plan sentinel (e.g., a line `STATUS: COMPLETE` in `IMPLEMENTATION_PLAN.md`)
    - Max iterations
    - Sandbox choice (`none` | `docker` | other) + **security posture**
    - **Backpressure commands** (tests/lints/build) to embed in `AGENTS.md`
    - **Auto‑approve flags** (ask explicitly)
      - Codex: `--full-auto`
      - Claude Code: `--dangerously-skip-permissions`
    
    ### 2) Phase 1 — Requirements → specs
    If the user wants “full Ralph” (or unclear requirements), do this before the loop:
    - Break the JTBD into **topics of concern** (1 topic = 1 spec file).
    - For each topic, draft `specs/<topic>.md`.
    - Use subagents to load URLs or existing docs into context for spec quality.
    - Keep specs short and testable.
    
    ### 3) Phase 2/3 — PROMPT.md + AGENTS.md
    - **Context loaded each iteration:** `PROMPT.md` + `AGENTS.md`.
    - `AGENTS.md` should include:
      - project test commands (backpressure)
      - build/run instructions
      - any operational learnings
    - `PROMPT.md` should reference:
      - `specs/*.md`
      - `IMPLEMENTATION_PLAN.md`
      - any relevant project files/dirs
    
    ### 4) Two prompt templates (PLANNING vs BUILDING)
    Create **two prompts** and swap `PROMPT.md` based on mode.
    
    **PLANNING prompt (no implementation):**
    ```
    You are running a Ralph PLANNING loop for: <JTBD/GOAL>.
    
    Read specs/* and the current codebase. Do a gap analysis and update IMPLEMENTATION_PLAN.md only.
    Rules:
    - Do NOT implement.
    - Do NOT commit.
    - Prioritize tasks and keep plan concise.
    - If requirements are unclear, write clarifying questions into the plan.
    
    Completion:
    If the plan is complete, add line: STATUS: COMPLETE
    ```
    
    **BUILDING prompt:**
    ```
    You are running a Ralph BUILDING loop for: <JTBD/GOAL>.
    
    Context:
    - specs/*
    - IMPLEMENTATION_PLAN.md
    - AGENTS.md (tests/backpressure)
    
    Tasks:
    1) Pick the most important task from IMPLEMENTATION_PLAN.md.
    2) Investigate relevant code (don’t assume missing).
    3) Implement.
    4) Run the backpressure commands from AGENTS.md.
    5) Update IMPLEMENTATION_PLAN.md (mark done + notes).
    6) Update AGENTS.md if you learned new operational details.
    7) Commit with a clear message.
    
    Completion:
    If all tasks are done, add line: STATUS: COMPLETE
    ```
    
    ### 5) Build the per‑iteration command
    - Codex: `codex exec <FLAGS> "$(cat PROMPT.md)"`
      - Requires git repo.
    - Claude Code: `claude <FLAGS> "$(cat PROMPT.md)"`
    - OpenCode: `opencode run "$(cat PROMPT.md)"`
    - Goose: `goose run "$(cat PROMPT.md)"` (ask if they want the Goose recipe)
    
    If the CLI is unknown, ask for the exact command to run each iteration.
    
    ### 6) Output a copy‑paste script
    Provide **either** a minimal loop or a controlled loop with max iters + stop conditions.
    
    **Minimal loop (Geoff style):**
    ```bash
    while :; do cat PROMPT.md | claude ; done
    ```
    
    **Controlled loop (recommended):**
    ```bash
    #!/usr/bin/env bash
    set -euo pipefail
    
    PROMISE='...'
    MAX_ITERS=...
    CLI_FLAGS="..."  # optional
    PLAN_SENTINEL='STATUS: COMPLETE'
    TEST_CMD='...'   # optional
    
    if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
      echo "❌ Run this inside a git repo."
      exit 1
    fi
    
    touch PROMPT.md AGENTS.md IMPLEMENTATION_PLAN.md
    LOG_FILE=".ralph/ralph.log"
    mkdir -p .ralph
    
    CLI_CMD="..." # e.g. "codex exec" or "claude"
    
    for i in $(seq 1 "$MAX_ITERS"); do
      echo -e "\n=== Ralph iteration $i/$MAX_ITERS ===" | tee -a "$LOG_FILE"
    
      $CLI_CMD $CLI_FLAGS "$(cat PROMPT.md)" | tee -a "$LOG_FILE"
    
      if [[ -n "${TEST_CMD}" ]]; then
        echo "Running tests: $TEST_CMD" | tee -a "$LOG_FILE"
        bash -lc "$TEST_CMD" | tee -a "$LOG_FILE"
      fi
    
      if grep -Fq "$PROMISE" "$LOG_FILE" || grep -Fq "$PLAN_SENTINEL" IMPLEMENTATION_PLAN.md; then
        echo "âś… Completion detected. Stopping." | tee -a "$LOG_FILE"
        exit 0
      fi
    
    done
    
    echo "❌ Max iterations reached without completion." | tee -a "$LOG_FILE"
    exit 1
    ```
    
    ## Safety/Sandbox Guidance (must mention)
    - Running with `--dangerously-skip-permissions` or `--full-auto` implies **trust + risk**.
    - Recommend a **sandbox** (docker/e2b/fly) with minimal credentials and restricted network.
    - Escape hatches: `Ctrl+C` to stop; `git reset --hard` to revert.
    
    ## Guardrails
    - If requirements are unclear, insist on specs before BUILDING.
    - If the plan looks stale/wrong, regenerate it (PLANNING loop).
    - If backpressure commands are missing, ask for them and add to `AGENTS.md`.