手把手配置 Ralph -- 火爆 X 的全自动 AI 编程工具

工具背景

1. 角色介绍:Ralph Wiggum (拉尔夫·维/威格姆)

出处: 《辛普森一家》(The Simpsons)[1][2][3]

  • 身份: 斯普林菲尔德小学 (Springfield Elementary) 的二年级学生,这也是警察局长克兰西·维格姆 (Chief Wiggum) 的儿子。

  • 性格特征:

    • 天真与怪诞: Ralph 是剧中典型的"大智若愚"或纯粹"脱线"的角色。他经常说出一些毫无逻辑、与当下情境无关的经典台词(Non-sequiturs),既好笑又带有一种奇怪的诗意。

    • 单纯善良: 尽管他经常被视为"由于某种原因不太聪明"的孩子,但他心地非常善良,几乎没有恶意。

    • 经典台词:

      • "I'm in danger!" (我即使身处险境也只会傻笑地说这句话,已成为极著名的互联网迷因/表情包)
      • "Me fail English? That's unpossible!" (我英语挂科了?那是不可能的!------语法本身就是错的)
      • "My cat's breath smells like cat food." (我猫咪的嘴巴闻起来像猫粮。)

2. 工具介绍:Ralph (AI Coding Agent / Workflow)

The Ralph Wiggum Technique (拉尔夫[1][2][4][5]·维格姆技术) 或 Ralph Loop ,是近期(2024-2025年)在 AI 辅助编程领域兴起的一种工具/工作流概念。[2][3]

背景与命名来源:

这个工具/技术的命名正是致敬了上述的《辛普森一家》角色 Ralph Wiggum。开发者之所以这样命名,是因为这个 AI 代理的工作方式就像 Ralph 一样------虽然它可能一开始看起来笨笨的,总是犯错(比如代码跑不通),但它非常执着(Persistent),会一直尝试直到把事情做对。

核心功能与用途:

  • 不仅仅是聊天机器人: 它是基于 Claude Code (Anthropic 推出的 CLI 工具) 或类似 LLM 的一种自动化脚本或插件。

  • 死循环纠错 (The Loop): 它的核心是一个 Bash 循环 (Loop)。当你给它一个编程任务(比如"修复这个 bug"或"重构这个模块"),它不仅是写一次代码,而是会:

    1. 写代码。[4][6]
    2. 运行测试/命令。[4][6]
    3. 如果报错,它会读取错误信息。
    4. 自动再次尝试修复,直到测试通过(Exit code 0)。
  • "Shipping Code" (交付代码): 标题中的 "get Ralph working and shipping code" 指的是配置好这个自动化循环,让 AI 能够在你睡觉或做其他事时,不知疲倦地通过成百上千次试错,最终交付可运行的代码。

它由Geoffrey Huntley创建,并在他的原始帖子中宣布。Ralph反复运行AmpCode(或你选择的其他AI代理),直到所有任务完成。

每次迭代都使用全新的上下文窗口(保持对话线程小而高效)。记忆通过git历史和文本文件持久化。

工作原理

Ralph是一个bash循环,执行以下步骤:

  1. 将提示传递给AI代理
  2. 代理从prd.json中选择下一个任务
  3. 代理实现该任务
  4. 代理运行类型检查和测试
  5. 如果通过,代理提交代码
  6. 代理标记任务完成
  7. 代理记录学习成果
  8. 循环重复直到所有任务完成

记忆仅通过以下方式持久化:

  • Git提交
  • progress.txt(学习成果)
  • prd.json(任务状态)

文件结构

bash 复制代码
scripts/ralph/
├── ralph.sh      # 主脚本
├── prompt.md     # 每次迭代的指令
├── prd.json      # 任务列表
└── progress.txt  # 进度日志

详细文件说明

ralph.sh

主循环脚本:

bash 复制代码
#!/bin/bash
set -e

MAX_ITERATIONS=${1:-10}
SCRIPT_DIR="$(cd "$(dirname 
  "${BASH_SOURCE[0]}")" && pwd)"

echo "🚀 Starting Ralph"

for i in $(seq 1 $MAX_ITERATIONS); do
  echo "═══ Iteration $i ═══"
  
  OUTPUT=$(cat "$SCRIPT_DIR/prompt.md" \
    | amp --dangerously-allow-all 2>&1 \
    | tee /dev/stderr) || true
  
  if echo "$OUTPUT" | \
    grep -q "<promise>COMPLETE</promise>"
  then
    echo "✅ Done!"
    exit 0
  fi
  
  sleep 2
done

echo "⚠️ Max iterations reached"
exit 1

使其可执行:

bash 复制代码
chmod +x scripts/ralph/ralph.sh

支持的其他代理:

  • Claude Code: claude --dangerously-skip-permissions

prompt.md

每次迭代的指令:

markdown 复制代码
# Ralph Agent Instructions

## 你的任务

1. 读取 `scripts/ralph/prd.json`
2. 读取 `scripts/ralph/progress.txt`(先查看代码库模式)
3. 检查你是否在正确的分支上
4. 选择优先级最高且 `passes: false` 的任务
5. 实现那一个任务
6. 运行类型检查和测试
7. 使用学习成果更新AGENTS.md文件
8. 提交:`feat: [ID] - [Title]`
9. 更新prd.json:`passes: true`
10. 将学习成果追加到progress.txt

## 进度格式

追加到progress.txt:


## [日期] - [任务ID]
- 实现了什么
- 更改了哪些文件
- **学习成果:**
  - 发现的模式
  - 遇到的问题
---


## 代码库模式

将可重用模式添加到progress.txt的顶部:


## Codebase Patterns
- 迁移:使用IF NOT EXISTS
- React:useRef<Timeout | null>(null)


## 停止条件

如果所有任务都通过,回复:

<promise>COMPLETE</promise>


否则正常结束。

prd.json

任务列表:

json 复制代码
{
  "branchName": "ralph/feature",
  "userStories": [
    {
      "id": "US-001",
      "title": "添加登录表单",
      "acceptanceCriteria": [
        "邮箱/密码字段",
        "验证邮箱格式",
        "类型检查通过"
      ],
      "priority": 1,
      "passes": false,
      "notes": ""
    }
  ]
}

关键字段:

  • branchName --- 使用的分支
  • priority --- 数值越小优先级越高
  • passes --- 完成时设置为true

progress.txt

开始时包含上下文:

markdown 复制代码
# Ralph Progress Log
Started: 2024-01-15

## Codebase Patterns
- 迁移:IF NOT EXISTS
- 类型:从actions.ts导出

## Key Files
- db/schema.ts
- app/auth/actions.ts
---

Ralph在每个任务后追加内容,模式在迭代中累积。

运行Ralph

bash 复制代码
./scripts/ralph/ralph.sh 25

运行最多25次迭代。Ralph将:

  • 创建功能分支
  • 逐个完成任务
  • 每个任务完成后提交
  • 当所有任务通过时停止

成功的关键因素

1. 小任务

必须适合一个上下文窗口:

shell 复制代码
❌ 太大:
> "构建整个认证系统"
✅ 合适大小:
> "添加登录表单"
> "添加邮箱验证"
> "添加认证服务器操作"

2. 反馈循环

Ralph需要快速反馈:

  • npm run typecheck
  • npm test

没有这些,错误的代码会不断累积。

3. 明确的标准

shell 复制代码
❌ 模糊:
> "用户可以登录"
✅ 明确:
> - 邮箱/密码字段
> - 验证邮箱格式
> - 失败时显示错误
> - 类型检查通过
> - 在localhost:$PORT/login验证(PORT默认为3000)

4. 学习成果累积

到第10个任务时,Ralph已经知道了任务1-9的模式。

学习成果的两个位置:

  1. progress.txt --- Ralph迭代的会话记忆
  2. AGENTS.md --- 人类和未来代理的永久文档

在提交之前,Ralph会更新已编辑文件所在目录的AGENTS.md文件(如果发现可重用模式、问题或约定)。

5. AGENTS.md更新

当Ralph学到值得保留的东西时,会更新AGENTS.md

diff 复制代码
✅ 好的添加:
- "修改X时,也要更新Y"
- "这个模块使用模式Z"
- "测试需要开发服务器运行"
❌ 不要添加:
- 特定任务的细节
- 临时笔记
- 已在progress.txt中的信息

6. 浏览器测试

对于UI更改,使用@sawyerhooddev-browser技能。使用Load the dev-browser skill加载它,然后:

bash 复制代码
# 启动浏览器服务器
~/.config/amp/skills/dev-browser/server.sh &
# 等待"Ready"消息

# 使用 heredocs 编写脚本
cd ~/.config/amp/skills/dev-browser && npx tsx <<'EOF'
import { connect, waitForPageLoad } from "@/client.js";

const client = await connect();
const page = await client.page("test");
await page.setViewportSize({ width: 1280, height: 900 });
const port = process.env.PORT || "3000";
await page.goto(`http://localhost:${port}/your-page`);
await waitForPageLoad(page);
await page.screenshot({ path: "tmp/screenshot.png" });
await client.disconnect();
EOF

只有通过截图验证才算完成。

常见问题

  • 幂等迁移:

    sql 复制代码
    ADD COLUMN IF NOT EXISTS email TEXT;
  • 交互式提示:

    bash 复制代码
    echo -e "\n\n\n" | npm run db:generate
  • 模式更改: 编辑模式后,检查:

    • 服务器操作
    • UI组件
    • API路由
  • 修复相关文件是可以的: 如果类型检查需要其他更改,可以进行这些更改,这不算是范围蔓延。

监控

bash 复制代码
# 任务状态
cat scripts/ralph/prd.json | \
jq '.userStories[] | {id, passes}'
# 学习成果
cat scripts/ralph/progress.txt
# 提交记录
git log --oneline -10

实际结果

我们构建了一个评估系统:

  • 13个用户故事
  • 约15次迭代
  • 每次2-5分钟
  • 总共约1小时

学习成果会累积。到第10个任务时,Ralph已经了解了我们的模式。

不适合使用的场景

  • 探索性工作
  • 没有明确标准的重大重构
  • 安全关键代码
  • 需要人工审查的任何内容

视频教程

有关如何使用Ralph的精彩视频演练,请查看@mattpocockuk的视频...

My Ralph Wiggum breakdown went viral. It's a keep-it-simple-stupid approach to AI coding that lets you ship while you sleep. So here's a full explanation, example code, and demo.

15:51 视频时长

关于作者

Ryan Carson - 父亲、CEO、创始人、开发者

关注他:@ryancarson


相关推荐
程序员Agions1 天前
小程序"邪修"秘籍:那些官方文档不会告诉你的骚操作
前端·javascript
我真的叫奥运1 天前
scss mixin svg 颜色控制 以及与 png 方案对比讨论
前端·svg
雲墨款哥1 天前
从一行好奇的代码说起:React的 useEffect 到底是不是生命周期?
前端·react.js·设计模式
weixin_584121431 天前
HTML+layui表单校验范围值,根据条件显示隐藏某输入框
前端·html·layui
加油乐1 天前
react基础概念合集
前端·react.js
CRUD酱1 天前
后端使用POI解析.xlsx文件(附源码)
java·后端
小白探索世界欧耶!~1 天前
用iframe实现单个系统页面在多个系统中复用
开发语言·前端·javascript·vue.js·经验分享·笔记·iframe
bl4ckpe4ch1 天前
用可复现实验直观理解 CORS 与 CSRF 的区别与联系
前端·web安全·网络安全·csrf·cors
阿珊和她的猫1 天前
Webpack中import的原理剖析
前端·webpack·node.js