如何在不“看着”Claude Code的情况下让它自主运行数小时
我让 Claude Code 在一个真实任务上运行了一整夜。通过 Telegram 的网页界面测试我的个人 AI 代理 AIdaemon。我白天检查了一次,让它通宵运行,到第二天早上,它已经运行了超过 27 个小时。完成了 84 个任务。它找到了 bug,修复了代码,重新测试,然后继续进行更难的测试。所有这些都是在我没有干预的情况下完成的。我使用的是 Claude Code 的 20x 计划,这提供了足够的容量来实际运行这样的会话。
实现这一点的设置是三个标志和一个好的提示文件。

跳过权限提示
Claude Code 通常在运行命令或编辑文件前会请求确认。当你在旁边坐着时,这没问题。但对于通宵运行,每个权限提示都会导致会话停滞。会话会一直停在那里,等着你点击“允许”。
claude --dangerously-skip-permissions这个标志的名称故意设置得很吓人。它意味着 Claude Code 在不询问的情况下执行所有工具调用。我不会在有生产机密信息的机器上使用它。但在一个有范围限制任务的开发机器上,它使得无人值守运行成为可能。
给它一个浏览器
我需要 Claude Code 与一个 Web 应用进行交互。我正在通过 Telegram Web 测试 AIdaemon 的 Telegram 机器人,而 Claude Code 本身无法做到这一点,因为它存在于终端中。
--chrome 标志通过 Claude in Chrome MCP 扩展将其连接到 Chrome。它可以导航页面、点击按钮、填写表单、读取内容、截屏。将两个标志结合起来,你就能得到一个可以在终端中编写代码并在浏览器中测试它的东西。
claude --chrome --dangerously-skip-permissions在我的案例中,Claude Code 会通过 Telegram Web 向 AIdaemon 发送消息,读取响应,判断代理是否做对了,如果没做对就去修复代码。然后再次尝试以确认。
使用 Ralph Loop 保持运行
如果你只是用一个大的提示启动 Claude Code,它会完成并退出。或者它认为自己完成了并退出。这对于快速任务来说没问题,但对于应该花费数小时的任务则毫无用处。
Ralph Loop 是一个解决这个问题的 Claude Code 插件。它安装了一个停止钩子。当 Claude 尝试退出时,钩子会捕获它并将相同的提示重新输入进去。每次迭代都会以相同的提示开始一个新的对话,但 Claude 可以看到文件的当前状态和 git 历史记录。它会弄清楚已经完成了什么,并决定下一步该做什么。这个名字来源于 Geoffrey Huntley 的 Ralph Wiggum 技术。最初的想法非常简单,就是一个 bash while true 循环,不断地将提示文件输入到 AI 代理中,直到它做对为止。蛮力遇到了坚持不懈,就像《辛普森一家》中那个无论如何都会坚持下去的角色一样。Anthropic 认为它足够好,甚至将一个 Ralph Wiggum 插件作为 Claude Code 的一部分发布。
/ralph-loop "你的任务提示在这里" --completion-promise "DONE"--completion-promise 是唯一退出的方式。Claude 只能通过输出完全相同的字符串来打破循环。你也可以设置 --max-iterations 作为安全网。
编写一个真正的提示
上述工具是“机械装置”。但提示决定了你得到的是一小时的有用工作还是二十七小时。 “测试我的应用并修复 bug”可能只会让你工作一小时,然后 Claude 在修复一个 bug 后就宣布胜利了。
对于任何严肃的任务,我都会写一个 markdown 文件。包括架构、目标、约束条件、“完成”到底意味着什么。然后将其传递给 ralph-loop。
/ralph-loop "$(cat task-prompt.md)" --completion-promise "DONE"我用于 27 小时会话的提示大致如下所示。
# 任务. 测试和加固 AIdaemon Telegram 代理
## 背景
AIdaemon 是一个可通过 Telegram 访问的多功能 AI 代理。
网页界面位于 https://web.telegram.org/k/#@aidaemon_coding_bot
## 目标
- 用难度递增的任务来挑战代理
- 不仅测试“快乐路径”。尝试边缘情况、格式错误的输入、
复杂的多步操作
- 出现问题时,修复底层代码
(而不是针对该特定情况的临时补丁)
- 每次修复后重新测试,以确认它有效且没有引入其他问题
## 架构说明
(相关的_文件路径_、代理如何处理消息、
关键模块、数据库_架构_,任何 Claude 需要的信息)
## 成功标准
- 所有基本操作都能可靠地工作
- 边缘情况得到妥善处理
- 错误消息有帮助,而不是晦涩难懂的
- 没有引入先前修复的回归问题
- 当以上所有条件都满足时,输出 DONE没有架构说明,Claude 会浪费迭代来理解代码库。没有明确的成功标准,它就不知道何时停止。如果没有让它进行通用修复的指示,它只会为当前测试通过编写一个 if 语句就结束了。
27 小时内发生了什么
我运行了命令然后去睡觉了。
第一个小时是基础工作。向机器人发送简单消息,检查响应。然后它开始自行升级。多文件重构任务。使用错误输入进行错误恢复。它发现了一个提示注入漏洞,编写了一个防御措施,然后测试了一个更难的注入变体以检查防御是否有效。
到测试 88 时,它让代理从头开始构建一个带有 79 个测试用例的 JSON 解析器。早些时候,它修复了后台通知 ping 限制,解决了工具名称解析错误,并发现了一个用户体验问题,即内部机制显示在了面向用户的消息中。
修复是真实的,而不是表面上的。 “廉价配置文件”使用的是 first_fallback 而不是默认模型,所以它修复了配置逻辑。读取饱和工具名称解析失败了,所以它为所有深度添加了级联回退,而不仅仅是失败的那一个。
总共 84 个任务。测试、修复、重新测试。全部自主完成。
我会与尝试这样做的人分享什么
在此之前,我用一些单行提示运行了几个会话。它们在一两个小时后就“没电”了。27 小时的会话之所以能持续下去,是因为提示文件提供了足够的上下文,使 Claude 能够在数十次迭代中保持正轨。
告诉 Claude 进行通用修复而不是特定补丁带来了真正的不同。如果没有这个指示,它只会编写最少的代码来使当前测试通过。有了它,修复实际上也预防了相关的 bug。
浏览器访问捕获了单元测试无法发现的问题。UI 上的小怪癖、时序问题、格式化问题。--chrome 让 Claude 能够进行真正的端到端测试,而不仅仅是在隔离环境中运行代码。
事后我审查了所有更改。大多数都很好。有几个过度设计了,还有一个重构触及的文件比它需要的要多。但总的来说,发现了并修复了几十个真正的 bug,每个都通过重新测试确认了。
如果你想尝试一下,请安装 Ralph Loop 插件,编写一个合适的提示文件,从小处开始。在一个受控的任务上使用 --max-iterations 10。在扩大规模之前先看看效果如何。