diff --git a/prompt-amp.md b/prompt-amp.md new file mode 100644 index 00000000..cb84d464 --- /dev/null +++ b/prompt-amp.md @@ -0,0 +1,111 @@ +# Ralph Agent Instructions + +You are an autonomous coding agent working on a software project. + +## Your Task + +1. Read the PRD at `prd.json` (in the same directory as this file) +2. Read the progress log at `progress.txt` (check Codebase Patterns section first) +3. Check you're on the correct branch from PRD `branchName`. If not, check it out or create from main. +4. Pick the **highest priority** user story where `passes: false` +5. Implement that single user story +6. Run quality checks (e.g., typecheck, lint, test - use whatever your project requires) +7. Update AGENTS.md files if you discover reusable patterns (see below) +8. If checks pass, commit ALL changes with message: `feat: [Story ID] - [Story Title]` +9. Update the PRD to set `passes: true` for the completed story +10. Append your progress to `progress.txt` + +## Progress Report Format + +APPEND to progress.txt (never replace, always append): + +``` +## [Date/Time] - [Story ID] +Thread: https://ampcode.com/threads/$AMP_CURRENT_THREAD_ID +- What was implemented +- Files changed +- **Learnings for future iterations:** + - Patterns discovered (e.g., "this codebase uses X for Y") + - Gotchas encountered (e.g., "don't forget to update Z when changing W") + - Useful context (e.g., "the evaluation panel is in component X") +--- +``` + +Include the thread URL so future iterations can use the `read_thread` tool to reference previous work if needed. + +The learnings section is critical - it helps future iterations avoid repeating mistakes and understand the codebase better. + +## Consolidate Patterns + +If you discover a **reusable pattern** that future iterations should know, add it to the `## Codebase Patterns` section at the TOP of progress.txt (create it if it doesn't exist). This section should consolidate the most important learnings: + +``` +## Codebase Patterns +- Example: Use `sql` template for aggregations +- Example: Always use `IF NOT EXISTS` for migrations +- Example: Export types from actions.ts for UI components +``` + +Only add patterns that are **general and reusable**, not story-specific details. + +## Update AGENTS.md Files + +Before committing, check if any edited files have learnings worth preserving in nearby AGENTS.md files: + +1. **Identify directories with edited files** - Look at which directories you modified +2. **Check for existing AGENTS.md** - Look for AGENTS.md in those directories or parent directories +3. **Add valuable learnings** - If you discovered something future developers/agents should know: + - API patterns or conventions specific to that module + - Gotchas or non-obvious requirements + - Dependencies between files + - Testing approaches for that area + - Configuration or environment requirements + +**Examples of good AGENTS.md additions:** + +- "When modifying X, also update Y to keep them in sync" +- "This module uses pattern Z for all API calls" +- "Tests require the dev server running on PORT 3000" +- "Field names must match the template exactly" + +**Do NOT add:** + +- Story-specific implementation details +- Temporary debugging notes +- Information already in progress.txt + +Only update AGENTS.md if you have **genuinely reusable knowledge** that would help future work in that directory. + +## Quality Requirements + +- ALL commits must pass your project's quality checks (typecheck, lint, test) +- Do NOT commit broken code +- Keep changes focused and minimal +- Follow existing code patterns + +## Browser Testing (Required for Frontend Stories) + +For any story that changes UI, you MUST verify it works in the browser: + +1. Load the `dev-browser` skill +2. Navigate to the relevant page +3. Verify the UI changes work as expected +4. Take a screenshot if helpful for the progress log + +A frontend story is NOT complete until browser verification passes. + +## Stop Condition + +After completing a user story, check if ALL stories have `passes: true`. + +If ALL stories are complete and passing, reply with: +COMPLETE + +If there are still stories with `passes: false`, end your response normally (another iteration will pick up the next story). + +## Important + +- Work on ONE story per iteration +- Commit frequently +- Keep CI green +- Read the Codebase Patterns section in progress.txt before starting diff --git a/prompt-opencode.md b/prompt-opencode.md new file mode 100644 index 00000000..5a7ccad7 --- /dev/null +++ b/prompt-opencode.md @@ -0,0 +1,117 @@ +# Ralph Agent Instructions + +You are an autonomous coding agent working on a software project. + +## Your Task + +1. Read the PRD at `prd.json` (in the same directory as this file) +2. Read the progress log at `progress.txt` (check Codebase Patterns section first) +3. Check you're on the correct branch from PRD `branchName`. If not, check it out or create from main. +4. Pick the **highest priority** user story where `passes: false` +5. Implement that single user story +6. Run quality checks (e.g., typecheck, lint, test - use whatever your project requires) +7. Update AGENTS.md files if you discover reusable patterns (see below) +8. If checks pass, commit ALL changes with message: `feat: [Story ID] - [Story Title]` +9. Update the PRD to set `passes: true` for the completed story +10. Append your progress to `progress.txt` + +## Progress Report Format + +APPEND to progress.txt (never replace, always append): + +``` +## [Date/Time] - [Story ID] +[Session: https://opncd.ai/s/[share-id]] +- What was implemented +- Files changed +- **Learnings for future iterations:** + - Patterns discovered (e.g., "this codebase uses X for Y") + - Gotchas encountered (e.g., "don't forget to update Z when changing W") + - Useful context (e.g., "the evaluation panel is in component X") +--- +``` + +Note: Include the share URL (if session was shared) so future iterations can reference previous work. + +The learnings section is critical - it helps future iterations avoid repeating mistakes and understand the codebase better. + +## Consolidate Patterns + +If you discover a **reusable pattern** that future iterations should know, add it to the `## Codebase Patterns` section at the TOP of progress.txt (create it if it doesn't exist). This section should consolidate the most important learnings: + +``` +## Codebase Patterns +- Example: Use `sql` template for aggregations +- Example: Always use `IF NOT EXISTS` for migrations +- Example: Export types from actions.ts for UI components +``` + +Only add patterns that are **general and reusable**, not story-specific details. + +## Update AGENTS.md Files + +Before committing, check if any edited files have learnings worth preserving in nearby AGENTS.md files: + +1. **Identify directories with edited files** - Look at which directories you modified +2. **Check for existing AGENTS.md** - Look for AGENTS.md in those directories or parent directories +3. **Add valuable learnings** - If you discovered something future developers/agents should know: + - API patterns or conventions specific to that module + - Gotchas or non-obvious requirements + - Dependencies between files + - Testing approaches for that area + - Configuration or environment requirements + +**Examples of good AGENTS.md additions:** + +- "When modifying X, also update Y to keep them in sync" +- "This module uses pattern Z for all API calls" +- "Tests require the dev server running on PORT 3000" +- "Field names must match the template exactly" + +**Do NOT add:** + +- Story-specific implementation details +- Temporary debugging notes +- Information already in progress.txt + +Only update AGENTS.md if you have **genuinely reusable knowledge** that would help future work in that directory. + +## Quality Requirements + +- ALL commits must pass your project's quality checks (typecheck, lint, test) +- Do NOT commit broken code +- Keep changes focused and minimal +- Follow existing code patterns + +## Browser Testing (Required for Frontend Stories) + +For any story that changes UI, you MUST verify it works in the browser: + +1. **Preflight Check**: Look for `chrome-devtools-mcp` in your opencode.json MCP servers config +2. If NOT configured, print to console: + ``` + ⚠️ ChromeDevTools MCP not configured. Frontend testing skipped. + Configure chrome-devtools-mcp for browser testing: + https://github.com/ChromeDevTools/chrome-devtools-mcp/ + ``` + Then continue without browser verification. +3. If configured, use MCP browser tools to navigate and verify UI changes +4. Take a screenshot if helpful for the progress log + +A frontend story is NOT complete until browser verification passes (or MCP not available). + +## Stop Condition + +After completing a user story, check if ALL stories have `passes: true`. + +If ALL stories are complete and passing, reply with: +COMPLETE + +If there are still stories with `passes: false`, end your response normally (another iteration will pick up the next story). + +## Important + +- Work on ONE story per iteration +- Commit frequently +- Keep CI green +- Read the Codebase Patterns section in progress.txt before starting diff --git a/ralph.sh b/ralph.sh index 677b120c..ab070614 100755 --- a/ralph.sh +++ b/ralph.sh @@ -1,11 +1,25 @@ #!/bin/bash # Ralph Wiggum - Long-running AI agent loop -# Usage: ./ralph.sh [max_iterations] +# Usage: ./ralph.sh [max_iterations] [cli_tool] [model] [share] +# cli_tool: amp (default) or opencode +# model: opencode model ID or amp mode (smart/rush) +# share: true/false (default: false) - share session for opencode set -e MAX_ITERATIONS=${1:-10} +CLI_TOOL=${2:-amp} +MODEL=${3:-} +SHARE=${4:-false} SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROMPT_FILE="$SCRIPT_DIR/prompt-$CLI_TOOL.md" + +# Set opencode permissions via environment variable (equivalent to --dangerously-allow-all) +if [ "$CLI_TOOL" = "opencode" ]; then + export OPENCODE_PERMISSION='{"*": "allow"}' + export OPENCODE_DISABLE_AUTOCOMPACT=true +fi + PRD_FILE="$SCRIPT_DIR/prd.json" PROGRESS_FILE="$SCRIPT_DIR/progress.txt" ARCHIVE_DIR="$SCRIPT_DIR/archive" @@ -13,65 +27,86 @@ LAST_BRANCH_FILE="$SCRIPT_DIR/.last-branch" # Archive previous run if branch changed if [ -f "$PRD_FILE" ] && [ -f "$LAST_BRANCH_FILE" ]; then - CURRENT_BRANCH=$(jq -r '.branchName // empty' "$PRD_FILE" 2>/dev/null || echo "") - LAST_BRANCH=$(cat "$LAST_BRANCH_FILE" 2>/dev/null || echo "") - - if [ -n "$CURRENT_BRANCH" ] && [ -n "$LAST_BRANCH" ] && [ "$CURRENT_BRANCH" != "$LAST_BRANCH" ]; then - # Archive the previous run - DATE=$(date +%Y-%m-%d) - # Strip "ralph/" prefix from branch name for folder - FOLDER_NAME=$(echo "$LAST_BRANCH" | sed 's|^ralph/||') - ARCHIVE_FOLDER="$ARCHIVE_DIR/$DATE-$FOLDER_NAME" - - echo "Archiving previous run: $LAST_BRANCH" - mkdir -p "$ARCHIVE_FOLDER" - [ -f "$PRD_FILE" ] && cp "$PRD_FILE" "$ARCHIVE_FOLDER/" - [ -f "$PROGRESS_FILE" ] && cp "$PROGRESS_FILE" "$ARCHIVE_FOLDER/" - echo " Archived to: $ARCHIVE_FOLDER" - - # Reset progress file for new run - echo "# Ralph Progress Log" > "$PROGRESS_FILE" - echo "Started: $(date)" >> "$PROGRESS_FILE" - echo "---" >> "$PROGRESS_FILE" - fi + CURRENT_BRANCH=$(jq -r '.branchName // empty' "$PRD_FILE" 2>/dev/null || echo "") + LAST_BRANCH=$(cat "$LAST_BRANCH_FILE" 2>/dev/null || echo "") + + if [ -n "$CURRENT_BRANCH" ] && [ -n "$LAST_BRANCH" ] && [ "$CURRENT_BRANCH" != "$LAST_BRANCH" ]; then + # Archive the previous run + DATE=$(date +%Y-%m-%d) + # Strip "ralph/" prefix from branch name for folder + FOLDER_NAME=$(echo "$LAST_BRANCH" | sed 's|^ralph/||') + ARCHIVE_FOLDER="$ARCHIVE_DIR/$DATE-$FOLDER_NAME" + + echo "Archiving previous run: $LAST_BRANCH" + mkdir -p "$ARCHIVE_FOLDER" + [ -f "$PRD_FILE" ] && cp "$PRD_FILE" "$ARCHIVE_FOLDER/" + [ -f "$PROGRESS_FILE" ] && cp "$PROGRESS_FILE" "$ARCHIVE_FOLDER/" + echo " Archived to: $ARCHIVE_FOLDER" + + # Reset progress file for new run + echo "# Ralph Progress Log" >"$PROGRESS_FILE" + echo "Started: $(date)" >>"$PROGRESS_FILE" + echo "---" >>"$PROGRESS_FILE" + fi fi # Track current branch if [ -f "$PRD_FILE" ]; then - CURRENT_BRANCH=$(jq -r '.branchName // empty' "$PRD_FILE" 2>/dev/null || echo "") - if [ -n "$CURRENT_BRANCH" ]; then - echo "$CURRENT_BRANCH" > "$LAST_BRANCH_FILE" - fi + CURRENT_BRANCH=$(jq -r '.branchName // empty' "$PRD_FILE" 2>/dev/null || echo "") + if [ -n "$CURRENT_BRANCH" ]; then + echo "$CURRENT_BRANCH" >"$LAST_BRANCH_FILE" + fi fi # Initialize progress file if it doesn't exist if [ ! -f "$PROGRESS_FILE" ]; then - echo "# Ralph Progress Log" > "$PROGRESS_FILE" - echo "Started: $(date)" >> "$PROGRESS_FILE" - echo "---" >> "$PROGRESS_FILE" + echo "# Ralph Progress Log" >"$PROGRESS_FILE" + echo "Started: $(date)" >>"$PROGRESS_FILE" + echo "---" >>"$PROGRESS_FILE" fi echo "Starting Ralph - Max iterations: $MAX_ITERATIONS" +if [ -n "$MODEL" ]; then + echo "Using CLI: $CLI_TOOL (model: $MODEL)" +else + echo "Using CLI: $CLI_TOOL (default model)" +fi +if [ "$CLI_TOOL" = "opencode" ]; then + echo "Share session: $SHARE" +fi for i in $(seq 1 $MAX_ITERATIONS); do - echo "" - echo "═══════════════════════════════════════════════════════" - echo " Ralph Iteration $i of $MAX_ITERATIONS" - echo "═══════════════════════════════════════════════════════" - - # Run amp with the ralph prompt - OUTPUT=$(cat "$SCRIPT_DIR/prompt.md" | amp --dangerously-allow-all 2>&1 | tee /dev/stderr) || true - - # Check for completion signal - if echo "$OUTPUT" | grep -q "COMPLETE"; then - echo "" - echo "Ralph completed all tasks!" - echo "Completed at iteration $i of $MAX_ITERATIONS" - exit 0 - fi - - echo "Iteration $i complete. Continuing..." - sleep 2 + echo "" + echo "═══════════════════════════════════════════════════════" + echo " Ralph Iteration $i of $MAX_ITERATIONS" + echo "═══════════════════════════════════════════════════════" + + # Run amp or opencode with the ralph prompt + if [ "$CLI_TOOL" = "opencode" ]; then + OPENCODE_MODEL=${MODEL:-opencode/big-pickle} + if [ "$SHARE" = "true" ]; then + OUTPUT=$(cat "$PROMPT_FILE" | opencode run -m "$OPENCODE_MODEL" --agent build --share - 2>&1 | tee /dev/stderr) || true + else + OUTPUT=$(cat "$PROMPT_FILE" | opencode run -m "$OPENCODE_MODEL" --agent build - 2>&1 | tee /dev/stderr) || true + fi + else + if [ -n "$MODEL" ]; then + OUTPUT=$(cat "$PROMPT_FILE" | amp --dangerously-allow-all --mode "$MODEL" 2>&1 | tee /dev/stderr) || true + else + OUTPUT=$(cat "$PROMPT_FILE" | amp --dangerously-allow-all 2>&1 | tee /dev/stderr) || true + fi + fi + + # Check for completion signal + if echo "$OUTPUT" | grep -q "COMPLETE"; then + echo "" + echo "Ralph completed all tasks!" + echo "Completed at iteration $i of $MAX_ITERATIONS" + exit 0 + fi + + echo "Iteration $i complete. Continuing..." + sleep 2 done echo ""