长运行 Agent
Initializer + Coding Agent
核心思路:把一个 Agent 拆成两个角色,一个负责规划,一个负责执行。每次交接都留下干净的状态。
双角色解决方案
两个 Agent,明确分工
只跑第一轮
Initializer Agent
负责从零到有:搭环境、定计划、做第一次提交
- 创建
init.sh脚本搭建开发环境 - 写
claude-progress.txt进度文件 - 把用户的高级提示展开成详细的功能清单(JSON 格式)
- 做第一次 git commit,确保仓库状态干净
每轮都跑
Coding Agent
负责从有到多:逐个功能实现,持续推进
- 读 progress 文件,了解当前状态
- 一次只做一个功能
- 完成后更新 progress 文件
- git commit 并写清楚做了什么
功能清单的设计
一种验证有效的做法是用 JSON 格式来记录功能清单,Markdown 不适合这个用途。原因是:模型更不容易错误修改结构化的 JSON,而 Markdown 容易被模型顺手重写。
// claude-progress.txt 中的功能清单
{
"features": [
{
"category": "authentication",
"description": "Email/password login with session management",
"steps": [
"Create login form component",
"Implement auth API endpoint",
"Add session cookie handling",
"Write end-to-end test"
],
"passes": false
},
{
"category": "chat",
"description": "Real-time streaming chat with Claude API",
"steps": ["..."],
"passes": false
}
]
}
Prompt 中使用强措辞:明确告诉 Agent「不允许删除或修改已有的测试内容」。否则 Agent 会为了让测试通过而降低测试标准。
增量进度:一次只做一个功能
为什么"一次一个"是关键
- 1 每次完成一个功能后,代码处于可合并状态:没有半成品、没有语法错误
- 2 Git commit 提供回滚点:如果下一轮搞坏了什么,可以回到上一个干净状态
- 3 Progress 文件提供上下文:新 Agent 不用猜做到哪了,直接读文件就知道
- 4 上下文窗口不会溢出:每轮只需关注一个功能的上下文,不会积累到爆
测试验证
Agent 容易以为做完了却没有端到端验证。它说「实现了登录功能」,但实际上按钮根本点不动。解决方案:
明确要求 Agent 用浏览器自动化做端到端测试。
要真正打开浏览器、点击按钮、验证结果,光有单元测试还不够。让 Agent 用 Puppeteer / Playwright 写 E2E 测试,作为功能是否真正"passes"的判定标准。
要真正打开浏览器、点击按钮、验证结果,光有单元测试还不够。让 Agent 用 Puppeteer / Playwright 写 E2E 测试,作为功能是否真正"passes"的判定标准。
最终效果
200+ 功能的 claude.ai 克隆成功构建
通过 Initializer + Coding Agent 的双角色方案,成功让 Agent 自主构建了一个包含 200+ 功能的完整 Web 应用。每个功能都有对应的 E2E 测试,代码始终保持可合并状态。
好的交接机制 = 好的长运行 Agent。进度文件、功能清单、增量提交,这些是让 Agent 能持续推进的最基本保障,一点也不花哨。