智能体上夜班:在你睡觉时自动复盘学习提交代码的终极自动化方案


利用Compound Engineering技能与launchd定时任务,搭建夜间双阶段自动化流水线,让AI代理每晚自动复盘对话提取经验并执行优先级任务,实现真正的24小时不间断开发,次日醒来即可Review由AI自动创建的代码PR。

大多数程序员用AI都是被动模式:你敲键盘发指令,AI乖乖回答,然后你合上笔记本走人。但Ryan Carson搞了一套夜间自动循环系统,让AI在你打呼噜的时候继续干活。这套系统每晚十点半先复盘当天所有对话,把学到的东西写进记忆文件,十一点再自动抓取最高优先级的任务,写代码、测功能、发PR,一整套流程全自动。三个开源工具打底,加上两个定时脚本,Mac电脑用launchd调度,配合caffeinate防睡眠,早上醒来你就能看到AI昨晚提交的代码仓库。这不是科幻,这是2025年程序员的真实日常。



别再当AI的打字员了

咱们先来聊一个扎心的事实:你现在用AI写代码的样子,像极了二十年前用搜索引擎查资料的父辈。你打开Claude或者Cursor,像个打字员一样敲一堆提示词,AI给你吐出一堆代码,你复制粘贴,改巴改巴,合上笔记本,一天结束。第二天再来一遍,AI昨天跟你聊过啥?全忘了。你们的关系就像那种一次性网友,聊完就散,谁也不记得谁。

但你有没有想过,AI完全可以更聪明一点?它完全可以记住你们聊过的每一个坑,记住你代码库里那些奇葩的命名规范,记住你上周踩过的那个异步回调的雷。更重要的是,它完全可以在你睡觉的时候继续干活。没错,就是那种真正的自动化,不是你盯着屏幕等它跑完,而是你躺在床上做梦,它在键盘上敲代码。

Ryan Carson就搞了这么一套系统。这哥们不是纸上谈兵,是真的搭出来了一个夜间循环,让AI代理每天晚上自动复盘、自动学习、自动提交代码。早上你醒来,咖啡还没泡好,GitHub上已经躺着一个新鲜的PR等着你看。这感觉就像请了一个不用睡觉、不要工资、还不会抱怨的实习生,而且这实习生越干越聪明,因为它每天都在学习。



被动模式 vs 主动模式

咱们得先搞清楚一个概念:什么叫被动式使用AI。你现在打开Claude Code,输入"帮我写个登录功能",它给你生成代码,你测试一下,能用,收工。这就是被动式。AI在这个模式里就是个高级搜索引擎,你问它答,你不问它就傻站着。

但主动模式完全不一样。想象你有个真正的编程搭档,你们白天一起写代码,晚上这个搭档不回家,而是打开今天的所有聊天记录,拿出小本本记笔记:"原来这个项目用Tab缩进而不是空格"、"数据库连接池要设置最大连接数"、"用户认证模块不能用明文存密码"。然后它把这些笔记整理成一份内部文档,第二天一早,它拿着这份文档去干下一个活。

Ryan Carson管这个叫Compound Engineering,复合式工程。核心思想就是:每一次工作都要让下一次工作更容易。你今天解决的bug,明天不会再犯。你今天学到的模式,明天自动应用。这不是简单的代码生成,这是知识管理,是经验积累,是让AI真正变成你的团队一员,而不是一个用完即走的工具人。



三个开源神器撑起整个系统

这套系统不是Ryan Carson从零开始写的,他站在三个开源项目的肩膀上。第一个叫Compound Engineering Skill,这是给Claude Code用的技能包,装上之后,你的代理就具备了从历史对话中提取经验教训的能力。它会自动扫描你们的聊天记录,找出那些"啊哈时刻",然后整理成结构化文档。

第二个叫Auto-Compound,这是整个流程的自动化引擎。它负责读取你的优先级报告,把排在第一位的任务拎出来,生成PRD(产品需求文档),再把PRD拆成具体任务,最后执行这些任务直到完成为止。你可以把它理解为一个项目经理加开发工程师的合体,而且是不领加班费的那种。

第三个叫Agent Loop,这是一个可以持续运行的代理循环。普通的AI交互是你问一句它答一句,但这个循环可以让代理自己给自己布置任务,自己检查完成度,自己决定下一步干啥,直到整个目标达成为止。这三个工具组合在一起,就构成了一个完整的夜间自动化流水线。

如果你用的是Claude Code而不是Amp,也完全没问题。把代码里的amp execute换成claude -p "..." --dangerously-skip-permissions,再把路径从.amp改成.claude,整套系统照样跑起来。Ryan Carson写这个指南的时候用Amp做示例,但原理是通用的,工具可以替换,思路才是核心。



夜间双阶段作战计划

整个系统每天晚上跑两个任务,时间卡得死死的,顺序绝对不能乱。晚上十点半先跑第一阶段,叫Compound Review,复盘审查。这个阶段的任务是回顾过去24小时所有的对话线程,检查哪些对话没有做过知识提取,把那些漏网之鱼补上,然后更新记忆文件。

晚上十一点跑第二阶段,叫Auto-Compound,自动复合。这个阶段代理会拉取最新的代码库(包括刚才更新的记忆文件),从你的报告目录里找出最新的一份优先级清单,分析哪个任务排第一,然后开干。生成需求文档、拆解任务、写代码、测功能、提交PR,一条龙服务。

顺序为啥这么重要?因为第一阶段更新的记忆文件,第二阶段马上就能用上。假设你白天跟AI讨论了一个特别 tricky 的API调用方式,十点半的复盘会把这个知识点写进记忆文件,十一点执行新任务的时候,代理读取这些文件,就会知道"哦,原来这个项目里API要这么调",不会重蹈覆辙。这种知识的即时传递,就是复合式工程的精髓所在。



复盘脚本:让AI学会记笔记

咱们来看看第一阶段的脚本长啥样。这是一个bash脚本,放在scripts/daily-compound-review.sh路径下。脚本开头先切到你的项目目录,确保自己在main分支上,然后把远程最新的代码拉下来。这一步很关键,因为可能白天你自己也提交了代码,得保证本地是最新的。

然后核心命令来了:amp execute "Load the compound-engineering skill. Look through and read each Amp thread from the last 24 hours..."。这段指令告诉代理加载复合工程技能,然后扫描过去24小时的所有对话线程。对于每一个线程,代理会检查这个对话有没有在结尾做过知识提取。如果没有,它就会 retroactively 地补上这个步骤,从对话内容里抽取出关键经验教训。

提取出来的内容会更新到相关的记忆文件里。这些文件通常叫AGENTS.md或者类似的命名,放在项目目录下。里面记录了项目的各种约定、常见坑点、架构决策等等。更新完之后,脚本会自动提交更改并推送到main分支。这样一来,你的记忆文件就成了一个活的知识库,每天晚上都在自动生长。

你得给这个脚本执行权限,命令是chmod +x scripts/daily-compound-review.sh。别小看这一步,很多自动化失败就是因为忘了加执行权限,脚本在那儿躺尸,定时任务调用的时候报错,你早上醒来啥也没有,还以为是AI罢工了。



执行脚本:从需求到PR全自动

第二阶段的脚本更复杂,路径是scripts/compound/auto-compound.sh。开头设置了set -e,意思是只要有一个命令报错,整个脚本就停止。这是为了防止半吊子状态,比如代码写了一半报错了,要是继续往下跑,可能会搞出一堆乱七八糟的提交。

脚本先加载环境变量,然后从远程拉取最新的main分支,并且用git reset --hard强制重置。这一步看起来有点暴力,但很有必要,因为第一阶段可能已经推送了新的记忆文件,你得确保本地包含了这些最新的上下文。

接下来是找报告文件。ls -t reports/*.md | head -1这条命令会列出reports目录下所有的markdown文件,按时间排序,取最新的一个。这就是你的优先级报告,里面应该列出了待办事项的优先级排序。然后调用analyze-report.sh分析这个报告,提取出排在第一位的任务项,以及建议的分支名称。

有了任务项和分支名,脚本就创建一个新的功能分支。然后进入核心循环:先用PRD技能生成产品需求文档,保存到tasks目录下;再用任务技能把PRD转换成结构化的任务列表,存为JSON格式;最后调用loop.sh执行循环,最多迭代25次,直到所有任务完成或者达到上限。

循环跑完之后,脚本把分支推送到远程,然后用gh pr create创建一个草稿状态的PR。为什么是草稿?因为你想早上醒来先检查一下,确认没问题再正式发布。要是AI半夜抽风写了坨屎代码,你也不至于直接合并到main分支里。



Mac用户的定时任务神器:launchd

Linux用户可能熟悉cron,但Ryan Carson推荐Mac用户使用launchd,这是macOS原生的定时任务管理系统,比cron处理边缘情况更靠谱。你需要创建两个plist文件,放在~/Library/LaunchAgents/目录下。

第一个plist对应复盘任务,晚上十点半执行。文件里定义了Label(任务的唯一标识)、ProgramArguments(要执行的脚本路径)、WorkingDirectory(工作目录)、StartCalendarInterval(定时规则,这里设置Hour为22,Minute为30)。还指定了标准输出和标准错误日志的路径,方便你排查问题。EnvironmentVariables里设置了PATH环境变量,确保脚本能找到amp或者其他命令行工具。

第二个plist对应执行任务,晚上十一点整触发。结构跟第一个差不多,只是时间改成了23点0分,脚本路径换成了auto-compound.sh。这两个任务之间留有30分钟的间隔,给复盘任务留出足够的运行时间。要是你的项目特别大,对话线程特别多,复盘可能需要更长时间,你可以把间隔拉大到一个小时。

创建完plist文件后,用launchctl load命令加载它们。验证是否加载成功可以用launchctl list | grep yourproject,如果看到对应的任务名,说明系统已经接管了定时执行。



防止电脑睡着的黑科技

这里有个坑需要注意:launchd不会唤醒正在睡眠的Mac。如果你的电脑在晚上十点半进入了睡眠状态,定时任务是不会执行的。Ryan Carson的解决方案是用caffeinate命令,这是macOS自带的防睡眠工具。

再创建一个plist文件,让caffeinate在下午五点启动,持续运行9个小时(32400秒),直到凌晨两点。这样一来,从晚上十点半到十一点的关键执行窗口,电脑肯定是醒着的。caffeinate的参数-i表示阻止系统空闲睡眠,-t后面跟秒数。

这个安排很合理。下午五点启动,覆盖晚上加班的时间,也覆盖夜间自动化的窗口。到凌晨两点,就算代理执行任务比较慢,9个小时也绝对够用了。早上你来到电脑前,电脑已经自动恢复正常的睡眠策略,不会一直开着浪费电。



每天早上醒来你会看到什么

想象一下这个场景:你昨晚十一点准时上床,刷了会儿手机睡着了。与此同时,你的MacBook屏幕微微亮着,AI代理正在辛勤工作。十点半,它读完了你们白天的所有对话,把学到的经验写进了记忆文件。十一点,它读取这些新鲜的记忆,分析了你的优先级报告,决定先实现那个用户认证模块的重构。

它创建了功能分支,写了详细的PRD,把任务拆解成十几个小步骤,然后开始写代码。遇到测试失败,它自动修复;遇到依赖缺失,它自动安装;遇到逻辑冲突,它自动调整。凌晨一点,所有任务完成,它提交了代码,推送了分支,在GitHub上创建了一个草稿PR,标题是"Compound: 重构用户认证模块"。

早上七点,你闹钟响了。你迷迷糊糊拿起手机,打开GitHub App,看到一个新通知:你的代理刚刚提交了一个PR。你瞬间清醒了,这不是做梦,这是真实发生的。你泡了杯咖啡,打开笔记本电脑,查看那个PR。代码写得整整齐齐,测试全过了,文档也更新了。你只需要Review一下,点一下合并按钮,这个功能就上线了。

这就是复合式工程的魔力。你的记忆文件里多了昨晚学到的新模式,你的代码库里多了一个完整的功能,你的代理比以前更聪明了,因为它已经记住了这次重构的所有细节。今晚它再写新功能的时候,会基于这些经验做出更好的决策。



日志和调试:别让AI黑箱操作

自动化系统最怕的就是黑箱,你不知道它干了啥,也不知道为啥失败。Ryan Carson在脚本里配置了详细的日志输出。复盘任务的日志在logs/compound-review.log,执行任务的日志在logs/auto-compound.log。你可以用tail -f实时查看,也可以早上起床后翻阅。

如果你想手动触发任务测试一下,可以用launchctl start命令加上任务的Label名。这比等晚上十点半方便多了,你可以随时验证脚本是否正常工作。要是发现任务没在列表里,用launchctl load重新加载plist文件。

常见问题包括:环境变量没设置对导致命令找不到、Git权限问题导致推送失败、AI执行过程中遇到意外情况卡住。看日志是排查问题的第一步,如果日志里没有足够信息,可以临时在脚本里加一些echo语句输出中间状态。



这套系统的进化方向

Ryan Carson在文章结尾给了一些扩展思路,让这套系统变得更强大。比如加Slack通知,PR创建或者任务失败的时候自动发消息到你的手机。这样你不用刷GitHub也能知道AI昨晚干了啥,失败了还能及时干预。

还可以设置多条优先级轨道,不同的晚上跑不同的报告。比如周一三五跑功能开发报告,周二四跑技术债清理报告,周末跑文档更新报告。这样代理的工作更有节奏感,不会一直堆在一个方向上。

更进一步,可以设置自动合并。如果CI通过了,而且改动的代码量很小,代理可以直接把PR合并到main分支,不需要等你早上审批。这适合那些低风险的重构或者文档更新。但对于核心功能变更,还是建议保留人工Review的环节。

每周还可以让代理生成一份总结报告,列出这周自动提交的所有PR,相当于AI写的周报。你可以把这个报告分享给团队,让大家知道AI代理的贡献。时间长了,这些记忆文件和总结报告就构成了你们项目的"数字考古层",新加入的开发者可以通过阅读这些文档快速了解项目的历史决策和技术演进。



从工具人到搭档的质变

咱们再回头想想这件事的意义。以前你用AI,它是一个工具,你握着它的手柄,指哪打哪。现在你用这套系统,它是一个搭档,你们白天协作,它晚上加班,而且越干越默契。你们的关系从一次性交易变成了长期合作,从单向指令变成了双向学习。

那些记忆文件就是你们合作的结晶。它们记录了项目的 DNA,记录了你们踩过的每一个坑,记录的每一个灵光一现的解决方案。这些知识不再散落在各个对话线程里,不再依赖于你的大脑记忆,而是被结构化地保存下来,被AI代理在每一次新任务中主动调用。

这就是Compound Engineering的真正含义:复合、累积、复利。每一次工作都让下一次工作更容易,每一个学到的经验都在未来产生回报。你的AI代理不再是那个每次都要重新了解项目背景的新手,它变成了一个有记忆、有经验、有上下文的资深工程师,而且是一个永不疲倦、永不抱怨、永远在你睡觉时默默进步的完美搭档。



停止提示词工程,开始复合工程

Ryan Carson在文章最后说了一句狠话:Stop prompting. Start compounding. 别再沉迷于提示词工程了,那些花里胡哨的prompt技巧只是雕虫小技。真正的效率提升来自于系统化的知识管理和自动化的工作流。

提示词工程是你和AI的单次对话优化,复合工程是你和AI的长期关系建设。前者让你在某一次任务中得到更好的结果,后者让你在每一次任务中都得到更好的结果,而且这个"更好"是持续累积的。

当其他程序员还在研究怎么写更好的prompt来让AI生成一段代码的时候,你已经搭建好了一套系统,让AI在你睡觉的时候自动学习、自动编码、自动提交。早上醒来,你的项目又前进了一步,而你还穿着睡衣。这种降维打击的感觉,就是技术复利的力量。