工具背景
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"或"重构这个模块"),它不仅是写一次代码,而是会:
-
"Shipping Code" (交付代码): 标题中的 "get Ralph working and shipping code" 指的是配置好这个自动化循环,让 AI 能够在你睡觉或做其他事时,不知疲倦地通过成百上千次试错,最终交付可运行的代码。
它由Geoffrey Huntley创建,并在他的原始帖子中宣布。Ralph反复运行AmpCode(或你选择的其他AI代理),直到所有任务完成。
每次迭代都使用全新的上下文窗口(保持对话线程小而高效)。记忆通过git历史和文本文件持久化。
工作原理
Ralph是一个bash循环,执行以下步骤:
- 将提示传递给AI代理
- 代理从prd.json中选择下一个任务
- 代理实现该任务
- 代理运行类型检查和测试
- 如果通过,代理提交代码
- 代理标记任务完成
- 代理记录学习成果
- 循环重复直到所有任务完成
记忆仅通过以下方式持久化:
- 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 typechecknpm test
没有这些,错误的代码会不断累积。
3. 明确的标准
shell
❌ 模糊:
> "用户可以登录"
✅ 明确:
> - 邮箱/密码字段
> - 验证邮箱格式
> - 失败时显示错误
> - 类型检查通过
> - 在localhost:$PORT/login验证(PORT默认为3000)
4. 学习成果累积
到第10个任务时,Ralph已经知道了任务1-9的模式。
学习成果的两个位置:
- progress.txt --- Ralph迭代的会话记忆
- AGENTS.md --- 人类和未来代理的永久文档
在提交之前,Ralph会更新已编辑文件所在目录的AGENTS.md文件(如果发现可重用模式、问题或约定)。
5. AGENTS.md更新
当Ralph学到值得保留的东西时,会更新AGENTS.md:
diff
✅ 好的添加:
- "修改X时,也要更新Y"
- "这个模块使用模式Z"
- "测试需要开发服务器运行"
❌ 不要添加:
- 特定任务的细节
- 临时笔记
- 已在progress.txt中的信息
6. 浏览器测试
对于UI更改,使用@sawyerhood的dev-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
只有通过截图验证才算完成。
常见问题
-
幂等迁移:
sqlADD COLUMN IF NOT EXISTS email TEXT; -
交互式提示:
bashecho -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