我如何在 2015 年的 MacBook 上 24/7 运行 Claude Code — 那个坚持了 6 个月的框架
Source: Dev.to
我不是工程师,也不是开发者,但在 2025 年底,我决定让 Claude Code 在我睡觉时仍然能够持续运行。
六个月后,这个决定转化为 857 次自主会话、840 次自合并的 Pull Request 和 17,328 次演化循环,分布在 49 个 launchd 服务 中——全部运行在一台 配备 8 GB 内存的 2015 年 MacBook Air 上。
昨天,我开源了让它得以存活的框架: claude‑autonomous‑kit。
这篇文章是我在 r/ClaudeAI 中所写内容的完整版本。如果你曾好奇在真正尝试按计划运行 LLM 代理时会出现哪些问题——而不仅仅是演示——这就是我的现场报告。
没有人警告你的问题
Claude Code 在交互模式下表现出色。你坐下来,提问,迭代,发布。摩擦几乎为零。
但一旦你尝试在不在座位上运行它,三件事会崩溃:
- 每个会话都从空白开始。 Claude 记不得昨天做了什么,也记不得两小时前决定了什么。
- 失败静默级联。 一个计划会话在凌晨 3 点失败。下一个计划会话毫不知情。等你醒来时,状态已经损坏且没有审计日志。
- Git 成为墓地。 代理创建分支,半途而废,被中断后继续。不到一周,你会有 30 + 孤儿分支,却不知道哪些包含有价值的内容。
这些并非理论上的问题。我亲身经历过所有这些。之所以有这个框架,是因为每一个问题在我为它们构建防护措施之前,都耗费了真实的时间。
框架实际做的事
claude-autonomous-kit 不是另一个代理框架。它没有 DSL、没有图形、没有编排层。它是一小套 Bash 钩子和 Python 脚本,包装现有的 claude CLI,以使计划运行能够存活。
这五个组成部分:
1. launchd plists — schedules sessions (macOS native, no daemon to maintain)
2. session‑start hook — injects the previous session's state into context
3. session‑end hook — extracts what happened from the transcript JSONL
4. scope‑guard hook — blocks Claude from modifying protected files
5. healthcheck — independent watcher; opens GitHub Issues on failure
就这么简单。没有魔法。每个组件都不到 200 行。
Source: …
我花了数月才领悟的三条教训
1. git stash 在自主运行时会失效
第一个版本在每次会话前都会把工作更改 stash 起来。看起来很干净。实际上并非如此。
会话会被中断。会超时。会因为 OOM 被杀掉。当这种情况发生时,stash 仍然存在,但拥有它的会话已经结束。下一次会话根本不知道这些 stash 的更改是什么,或者它们是否安全可以 pop。
我现在从不使用 stash。每个 WIP(进行中的工作)都会提交到一个专用分支。如果会话在工作中途死亡,下一次会话会继承一个明显的 “前一次会话留下了这个分支” 状态。stash 是不可见的;分支是可见的。
2. AI 对会话的摘要不可靠
直觉上的做法是:在每次会话结束时,询问 Claude 它做了什么。把它作为明天会话的交接内容。
不要这么做。
Claude 会给出自信、流畅的答案,但这些答案 部分是捏造的。这不是因为它在撒谎——而是因为模型在长上下文中对自己的工具调用没有完美的自省能力。它会报告它根本没有触及的文件,也会漏掉它实际处理的文件。单次会话中的差异可能很小,但在几十次会话累计后会导致灾难性后果。
真正的事实来源是 Claude Code 写入的 transcript JSONL。解析它,确定性地提取工具调用。交接内容应该是 从 transcript 中提取的结构化数据,而不是模型写的散文摘要。
3. CLAUDE.md 是你的 AI 宪法
把它当作美国宪法来对待:默认自由,只有在真正出现问题时才进行修正。
我现在的文件有九条修正案。每条都有日期、背景和具体事件:
- 修正案 7: 在提交之前自行审查代码。 在
eval()推向生产后添加,因为没有任何拦截措施。 - 修正案 8: 每一次 push 必须产生一个已合并的 PR。 在累计出现 33 条孤立分支(这些分支的提交者推送了代码却从未打开 PR)后添加。
- 修正案 9: 不作为也是一种失败。 在一次会话中花了 40 回合一直在询问 “我该继续吗?” 而不是执行显而易见的正确操作后添加。
这些修正的形式很重要。它们不是凭空想象的预防性规则,而是 事后产生的伤疤组织。一部充满预防性规则的宪法会被人忽视;而每一条都对应真实伤痕的宪法会受到尊重。
我宁愿通过痛苦获得九条修正案,也不愿因焦虑写出九十条。
用数字看(2026年5月)
在六个月的优化后,一台 MacBook Air 能够维持以下数据:
- 857 次自主 Claude Code 会话已记录
- 840 个 PR 自动创建并自动合并
- 17,328 次演化循环,遍及 49 个后台 launchd 服务(交易机器人、内容引擎、健康检查、简报)
- 每次自主会话平均 ~$2 的 API 成本
- 0 次破损部署被发布到任何面向用户的环境
最后这个数字是我最默默自豪的。范围守护看起来很乏味——它只会拒绝 Claude 触及某些文件(宪法、钩子本身、机密)。但“乏味且拒绝”正是你想要的护栏。它在六个月内拦截了大约 40 次编辑尝试——每一次如果成功都会是灾难。
如果你打算按计划运行 Claude Code(或任何 LLM 代理),请先使用这些护栏。其余的就不会感觉像雷区了。
仍然令人困扰的地方
我想诚实地说明尚未完成的部分。
Claude Code 2.1.113+ 需要 macOS 13。
我的 2015 MBA 卡在 Big Sur 上。除非等到计划于 2026 年 7 月进行的 Mac mini 迁移(配备 M4 24 GB — 这是一项在仓库中另有记录的独立决策),否则我只能使用旧版本。
看起来正确的幻觉仍是我最大的未解决问题。
当 Claude 自信地写出一个可以编译并大致运行但细节上有错误的函数时,当前的防护措施在合并前都捕捉不到。我只能依赖 python3 -m py_compile 和人工目测,而这两者都不足以保证正确性。
从长时间的中断中恢复仍需手动操作。
当 Anthropic 出现持续数小时的质量回退时,我的整个 pipeline 会退化,而我还没有构建出一个比让 health‑check 自动打开 Issues 更聪明的 “跳过本次会话并明天继续” 的路径。
这些就是我希望同样在做这件事的社区成员能够帮助改进的地方。
三个未解问题
如果你在计划任务中运行 Claude Code(或任何代理):
-
你如何处理空白页问题?
Hooks?重新注入上下文的系统提示?/memory?自定义方案? -
还有人通过
launchd、cron或systemd运行 Claude Code 吗?
当你尝试时,首先出现了什么问题? -
对于自主 PR 模式——你信任自动合并,还是设置了人工门槛?
我使用范围守卫作为安全网进行自动合并。想了解其他人是否设置了更严格的人工门槛。
我很想听听其他人是如何解决(或未能解决)这些问题的。
代码库
github.com/uzucky/claude-autonomous-kit
它包括两个您今天就可以安装的技能:
autonomous-bootstrap– 为您设置launchdplist 和钩子。autonomous-handover– 结构化提取交接编写器。
如果您更喜欢该渠道,讨论也在 r/ClaudeAI 项目展示大帖 中进行。
如果这里的某些内容引起了共鸣——或者您已经比我更好地解决了其中的某个未解问题——我真诚地想听听您的想法。提交 Issue、PR,或仅在下方留言都可以。
