我们将编程代理置于循环中,一夜之间交付了 6 个代码库
在 YC Agents 黑客马拉松的这个周末,我们自问: 使用编程代理最奇特的方式是什么?
我们的答案是:让 Claude Code 无头模式永久循环运行,看看会发生什么。
结果发现:醒来时你会看到 1000 多次提交、六个移植的代码库,以及一个我们称之为 RepoMirror 的小巧工具。
我们如何走到这一步
我们最近偶然发现了一种由 Geoff Huntley 推广的技术,即在 while 循环中运行编码代理:
while :; do cat prompt.md | amp; done
我们团队的一名成员 Simon 是 assistant-ui 的创建者,这是一个用于在 React 中构建 AI 界面的 React 库。他收到了很多添加 Vue.js 支持的请求,于是他想知道这种方法是否适用于将 assistant-ui 移植到 Vue.js。
工作原理
我们最终采取的方法听起来可能很蠢,但效果却出奇地好——我们使用了 Claude Code 进行循环:
while :; do cat prompt.md | claude -p --dangerously-skip-permissions; done
提示很简单:
Your job is to port assistant-ui-react monorepo (for react) to assistant-ui-vue (for vue) and maintain the repository.
You have access to the current assistant-ui-react repository as well as the assistant-ui-vue repository.
Make a commit and push your changes after every single file edit.
Use the assistant-ui-vue/.agent/ directory as a scratchpad for your work. Store long term plans and todo lists there.
The original project was mostly tested by manually running the code. When porting, you will need to write end to end and unit tests for the project. But make sure to spend most of your time on the actual porting, not on the testing. A good heuristic is to spend 80% of your time on the actual porting, and 20% on the
testing.
你的任务是将 assistant-ui-react 单一代码库(用于 React)迁移到 assistant-ui-vue(用于 Vue)并维护该代码库。
你有访问当前 assistant-ui-react 代码库和 assistant-ui-vue 代码库的权限。
每次编辑单个文件后,请提交并推送你的更改。
将 assistant-ui-vue/.agent/ 目录用作你的工作草稿本。在那里存储长期计划和待办事项。
原始项目主要是通过手动运行代码进行测试的。在迁移过程中,你需要为项目编写端到端和单元测试。但请确保将大部分时间花在实际迁移上,而不是测试上。一个好的经验法则是将 80% 的时间花在实际迁移上,将 20% 的时间花在测试上。
将 Browser-Use 移植到 TypeScript
由于我们当时在参加黑客马拉松,想做一些与赞助商工具相关的事情,于是决定看看 Ralph 能否将 Browser Use——一个 YC 支持的网页代理工具——从 Python 移植到 TypeScript。
我们以一个简单的提示开始了循环:
Your job is to port browser-use monorepo (Python) to better-use (Typescript) and maintain the repository.
Make a commit and push your changes after every single file edit.
Keep track of your current status in browser-use-ts/agent/TODO.md
你的任务是将浏览器使用的单一代码库(Python)转换为更易用的(TypeScript)并维护该仓库。
在每次单独编辑文件后,请提交并推送你的更改。
在 browser-use-ts/agent/TODO.md 中跟踪你的当前状态。
经过几轮循环迭代后,一切似乎步入正轨:
发生了什么
我们一直工作到凌晨两点多,设置了几台虚拟机实例(GCP 实例上的 tmux 会话)来运行 Claude 代码循环,然后回家小睡几个小时。
我们早上回来时,发现 Browser Use 已经几乎完全移植到了 TypeScript。
这里正在抓取 Hacker News 上的前三篇帖子。
Browser Use 创始人 @gregpr07 正在查看代码。我们觉得他很喜欢。
我们做了更多
既然我们已经在启动几个循环了,我们决定再移植几个软件项目,看看会有什么结果。
Vercel AI SDK 是用 TypeScript 编写的……但如果你能在 Python 中使用它呢?是的…… 某种程度上是可行的 。
如果你曾为 AI SDK 中一些深度嵌套的类型构造器而头疼,那么现在,你可以在 Python 中继续头疼了。
我们还尝试了几次从规格到代码的循环——根据文档中的 llms-full.txt 重新创建了 Convex 和 Dedalus。这是对 OpenDedalus 的初步尝试。
我们学到了什么
早停
在启动代理时,我们有很多疑问。代理会编写测试吗?它会陷入无限循环并偏离到随机无关的功能吗?
我们惊喜地发现,该代理编写了测试,严格遵守原始指令,从未陷入停滞,有效控制了范围,并且大多时候都宣布端口“完成”。
端口完成后,大多数代理选择编写额外测试或持续更新 agent/TODO.md,以明确其“完成”程度。有一次,一个代理在意识到自己陷入无限循环后,竟使用 pkill
终止了自身 。
超额完成
另一个很酷的涌现行为(这在 LLMs 中很常见)——完成初始移植后,我们的 AI SDK Python 代理开始添加额外功能,比如为 Flask 和 FastAPI 提供集成(这在 AI SDK JS 版本中没有对应功能),以及通过 Pydantic、Marshmallow、JSONSchema 等支持模式验证器。
保持提示简洁
总的来说,我们发现少即是多——简单的提示优于复杂的提示。你应该专注于引擎,而不是脚手架。我们团队中启动不同项目的成员尝试了各种指令和排序方式。你可以在提示文件夹中查看我们实际使用的提示。
有一次我们尝试借助 Claude 的帮助“改进”提示词,结果它膨胀到了 1500 字。智能体立刻变得又慢又笨。我们回归到 103 字后,它便重回正轨。
这并不完美
对于 better-use 和 ai-sdk-python 来说,无头代理并不总能提供完美运行的代码。我们最终不得不逐步更新提示词,或与 Claude Code 进行交互式合作,将完成度从 90%提升到 100%。
尽管 Claude 可能声称已 100%完美实现 ,但 Python 项目中的一些浏览器使用演示在 TypeScript 中尚未能正常运行。
数字
我们在项目推理上花费了略低于 800 美元。总体而言,智能体在所有软件项目中进行了约 1100 次提交。每个 Sonnet 智能体夜间运行的成本约为每小时 10.50 美元。
围绕它我们构建了什么
在启动这么多项目过程中,我们开发了一个简单工具来帮助建立用于同步工作的源/目标代码库对。(没错, 这个工具也是用 Ralph 构建的 )
npx repomirror init \
--source-dir ./browser-use \
--target-dir ./browser-use-zig \
--instructions "convert browser use to Zig"
指令可以是任何内容,例如“从 React 转换到 Vue”或“使用 OpenAPI 规范代码生成从 gRPC 更改为 REST”。
它的架构并非完美,还带点临时拼凑的痕迹。但足以快速搭建原型,其设计理念类似于 shadcn 的“开放式”方案——在 init
阶段后会生成可自由修改的脚本/提示词。
初始化阶段结束后,您将获得:
.repomirror/
- prompt.md
- sync.sh
- ralph.sh
当您查看完提示词并准备测试时,可运行 npx repomirror sync
进行单次循环迭代,或执行 npx repomirror sync-forever
启动拉尔夫无限循环模式。
如果你想尝试其他仓库,它们在 README 文件中都有列出。better-use 现已发布在 npm 上:
npx better-use run
ai-sdk-python 在登陆 PyPI 之前还有一两个问题需要我们解决。
结束语
正如你可能想象的那样,我们的思绪都有些混乱和矛盾,因此与其给出一个连贯的结论,不如分享我们团队对过去约29小时的一些个人感悟:
我有点感受到 AGI 了,这既令人兴奋又有点可怕。
我内心的极简主义者很高兴有确凿证据表明我们可能把事情复杂化了。
我清楚地意识到,我们正处于指数级起飞曲线的最最开端。
感谢整个团队,来自 @yonom 和 @AVGVSTVS96 的 assistant-ui,来自 HumanLayer 的 @dexhorthy,来自 github.gg 的 @Lantos1618,以及感谢 Geoff 带来的灵感。
原文链接:
https://github.com/repomirrorhq/repomirror/blob/main/repomirror.md