大多数开发者使用 AI Agent 的方式都是被动的——你输入提示词(Prompt),它回复,然后你继续下一步。
但如果你合上笔记本电脑后,Agent 还能继续工作呢? 如果它能复盘一天的工作,提取经验教训,更新自己的指令集,然后从你的待办事项(Backlog)中选取下一个功能进行开发呢?
这就是我构建的系统:一个夜间循环。我的 Agent 会从每一个对话线程中学习,将知识以“复利”的方式存入持久记忆,然后在我睡觉时交付下一个优先事项。
以下是设置方法。
基础组件
这套设置建立在三个开源项目之上:
- Compound Engineering Plugin (由 @kieranklaassen 开发)
- 最初为 Claude Code 开发的“复合工程”技能。安装它,赋予你的 Agent 从每次会话中提取并持久化保存学习成果的能力。
- Compound Product
- 这是一个自动化层,负责将按优先级排序的报告转化为已提交的代码 PR(Pull Request)。它包含
auto-compound.sh脚本、执行循环以及从 PRD 到任务的流水线。
- Ralph
- 一个自主 Agent 循环,可以持续运行,领取任务并执行直到完成。
正在使用 Claude Code? 本指南使用 Amp,但同样的工作流也适用于 Claude Code。只需将脚本中的
amp execute替换为claude -p "..." --dangerously-skip-permissions,并将文中提到的AGENTS.md引用更新为CLAUDE.md即可。
两阶段循环
系统每晚按顺序运行两个任务:
-
🕙 晚上 10:30 - 复合复盘 (Compound Review)
-
审查过去 24 小时的所有对话线程,提取经验教训,并更新
AGENTS.md文件。 -
🕚 晚上 11:00 - 自动复合 (Auto-Compound)
-
拉取最新代码(包含刚刚更新的新鲜经验),从报告中选取 #1 优先级的项目,进行代码实现,并创建一个 PR。
顺序至关重要。 复盘任务会将白天发现的模式和踩过的坑更新到 AGENTS.md 文件中。随后的实现任务在领取新工作时,就能利用这些最新的经验。
第一步:复合复盘脚本 (The Compound Review Script)
这个脚本指示你的 AI Agent 审查过去 24 小时的所有线程,并对遗漏的学习内容进行补充:
#!/bin/bash
# scripts/daily-compound-review.sh
# 在 auto-compound.sh 之前运行,用最新的经验更新 AGENTS.md
cd ~/projects/your-project
# 确保我们在 main 分支并更新到最新
git checkout main
git pull origin main
amp execute "Load the compound-engineering skill. Look through and read each Amp thread from the last 24 hours. For any thread where we did NOT use the Compound Engineering skill to compound our learnings at the end, do so now - extract the key learnings from that thread and update the relevant AGENTS.md files so we can learn from our work and mistakes. Commit your changes and push to main."
# (中文译意:加载 compound-engineering 技能。浏览并阅读过去24小时的每个 Amp 线程。对于任何最后没有使用该技能进行复盘的线程,现在执行复盘——提取关键经验并更新相关的 AGENTS.md 文件,以便我们能从工作和错误中学习。提交更改并推送到 main 分支。)
让脚本可执行:
chmod +x scripts/daily-compound-review.sh
它的作用: Agent 将会:
- 找到过去 24 小时内的所有线程。
- 检查每个线程是否以“compound(复盘)”步骤结束。
- 对于没有复盘的线程,追溯提取经验。
- 更新相关的
AGENTS.md文件(记录模式、坑点和上下文)。 - 提交并推送到 main 分支。
你的 AGENTS.md 文件将变成一个每晚都在成长的活体知识库。
第二步:自动复合脚本 (The Auto-Compound Script)
这是实现引擎。它读取你的优先级报告,选取首要项目,创建 PRD(产品需求文档),将其拆解为任务并执行:
#!/bin/bash
# scripts/compound/auto-compound.sh
# 完整流水线:报告 → PRD → 任务 → 实现 → PR
set -e
cd ~/projects/your-project
# 加载环境变量
source .env.local
# 获取最新代码(包含今晚 AGENTS.md 的更新)
git fetch origin main
git reset --hard origin/main
# 找到最新的优先级报告
LATEST_REPORT=$(ls -t reports/*.md | head -1)
# 分析并选取 #1 优先级项目
ANALYSIS=$(./scripts/compound/analyze-report.sh "$LATEST_REPORT")
PRIORITY_ITEM=$(echo "$ANALYSIS" | jq -r '.priority_item')
BRANCH_NAME=$(echo "$ANALYSIS" | jq -r '.branch_name')
# 创建功能分支
git checkout -b "$BRANCH_NAME"
# 创建 PRD
amp execute "Load the prd skill. Create a PRD for: $PRIORITY_ITEM. Save to tasks/prd-$(basename $BRANCH_NAME).md"
# 转换为任务列表
amp execute "Load the tasks skill. Convert the PRD to scripts/compound/prd.json"
# 运行执行循环
./scripts/compound/loop.sh 25
# 创建 PR
git push -u origin "$BRANCH_NAME"
gh pr create --draft --title "Compound: $PRIORITY_ITEM" --base main
loop.sh 脚本会迭代运行你的 Agent——一次处理一个任务——直到所有任务通过或达到迭代限制。
第三步:设置 launchd (macOS)
虽然 Cron 也能用,但 launchd 是 macOS 原生的,能更好地处理边缘情况。创建以下 plist 文件:
1. 复合复盘 (晚上 10:30)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.yourproject.daily-compound-review</string>
<key>ProgramArguments</key>
<array>
<string>/Users/you/projects/your-project/scripts/daily-compound-review.sh</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/you/projects/your-project</string>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>22</integer>
<key>Minute</key>
<integer>30</integer>
</dict>
<key>StandardOutPath</key>
<string>/Users/you/projects/your-project/logs/compound-review.log</string>
<key>StandardErrorPath</key>
<string>/Users/you/projects/your-project/logs/compound-review.log</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
</dict>
</dict>
</plist>
2. 自动复合 (晚上 11:00)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.yourproject.auto-compound</string>
<key>ProgramArguments</key>
<array>
<string>/Users/you/projects/your-project/scripts/compound/auto-compound.sh</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/you/projects/your-project</string>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>23</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>StandardOutPath</key>
<string>/Users/you/projects/your-project/logs/auto-compound.log</string>
<key>StandardErrorPath</key>
<string>/Users/you/projects/your-project/logs/auto-compound.log</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
</dict>
</dict>
</plist>
加载它们:
launchctl load ~/Library/LaunchAgents/com.yourproject.daily-compound-review.plist
launchctl load ~/Library/LaunchAgents/com.yourproject.auto-compound.plist
验证:
launchctl list | grep yourproject
第四步:保持 Mac 唤醒
launchd 无法唤醒处于睡眠状态的 Mac。使用 caffeinate 命令在自动化窗口期间保持电脑唤醒:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.yourproject.caffeinate</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/caffeinate</string>
<string>-i</string>
<string>-t</string>
<string>32400</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>17</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
</dict>
</plist>
这将使你的 Mac 从下午 5 点保持唤醒到凌晨 2 点——这对完成夜间任务来说绰绰有余。
复利效应 (The Compound Effect)
每天晚上都会发生以下情况:
- 22:30 - Agent 复盘白天的线程,发现遗漏的知识点,更新
AGENTS.md文件,推送到 main。 - 23:00 - Agent 拉取 main 分支(此时已包含最新的上下文),选取最高优先级的任务,实现它,并开启一个 PR。
当你醒来时,你将拥有:
- 更新后的
AGENTS.md文件:包含了 Agent 学到的新模式。 - 一个 PR 草稿:已经实现了你的下一个优先事项。
- 日志:显示确切发生了什么。
Agent 每天都在变聪明,因为它在每次执行实现任务之前,都会阅读自己更新后的指令。周一发现的模式会指导周二的工作。周三踩过的坑,周四就会避开。
调试
检查任务是否已调度:
launchctl list | grep yourproject
查看日志:
tail -f ~/projects/your-project/logs/compound-review.log
tail -f ~/projects/your-project/logs/auto-compound.log
手动测试:
launchctl start com.yourproject.daily-compound-review
进阶思路
一些扩展建议:
- 当 PR 创建成功或任务失败时发送 Slack 通知。
- 多优先级轨道——在不同的晚上运行不同的报告。
- 如果 CI 通过且更改很小,尝试 自动合并 PR。
- 周报摘要——让 Agent 编写一份本周已发布内容的变更日志。
目标是一个自我改进的循环:每一单位的工作都让未来的工作变得更简单。你的 AGENTS.md 文件变成了机构记忆,你的 Agent 变成了你代码库的专家。
停止单纯的提示。开始复利式增长。