loopback
Loopback 迭代开发循环
快速开始(推荐)
- 直接启动(默认会进入“向导模式”)
/loopback "修复 X。完成后输出 <promise>DONE</promise>。" --completion-promise "DONE" --max-iterations 10
说明:
- 如果当前环境支持交互式输入,
/loopback会默认进入向导:先展示全局步骤,再一步步帮你完善参数与契约 - 如果当前环境不支持交互式输入,
/loopback会输出步骤概览,并在缺少关键契约时直接失败(避免跑飞) - 如需跳过向导:加
--no-wizard
- 不确定怎么传参:先看参数说明(不会创建状态文件、不会启动循环)
/loopback --guide
- 参数看起来没问题:先用
--dry-run预演(不会创建状态文件、不会启动循环)
/loopback "修复 X。完成后输出 <promise>DONE</promise>。" --completion-promise "DONE" --max-iterations 10 --dry-run
- 正式启动
/loopback "修复 X。完成后输出 <promise>DONE</promise>。" --completion-promise "DONE" --max-iterations 10
什么是 Loopback?
Loopback 是一个基于 Ralph Loop 思想的迭代开发方法论,适配到 Codex CLI 环境。
核心概念:
while true; do
# 从 .codex/loopback.local.md 读取同一条 PROMPT
# 运行 Codex 一轮(例如:codex exec)
# 检查停止条件(max-iterations / completion-promise / cancel)
if is_complete; then break; fi
done
同样的提示词被反复发送给 Codex。Codex 通过以下方式"看到"自己的先前工作:
- 文件系统中的修改文件
- git 历史记录
- 之前生成的代码
⚠️ 注意:Codex CLI 本身不会“自动重复同一条 prompt”。Loopback 通过状态文件
.codex/loopback.local.md 持久化上下文,再由 driver 脚本反复调用 codex exec 来实现循环。
每次迭代:
- Codex 接收相同的提示词
- 在任务上工作,修改文件
- 尝试完成
- 检查完成条件
- 如果未完成,进入下一次迭代
- 看到之前的工作,逐步改进
- 直到完成或达到最大迭代次数
命令
/loopback [OPTIONS]
在当前 Codex 会话中启动 Loopback 循环。
用法:
/loopback "重构缓存层" --max-iterations 20
/loopback "添加测试" --completion-promise "TESTS COMPLETE"
/loopback "修复认证 bug" --dry-run
选项:
--max-iterations <n>- 最大迭代次数(默认:无限)--completion-promise <text>- 完成承诺短语(当该短语出现时停止)--guide- 输出轻量参数说明(不启动循环)--wizard- 强制启用向导流程(默认已启用;有些环境会自动降级为非交互预检)--no-wizard- 跳过默认向导(直接按原始参数运行)--allow-infinite- 允许缺少停止契约(危险:可能无限运行;不推荐)--dry-run- 仅显示计划,不执行--no-run- 仅创建状态文件,不启动 driver(用于手动运行 wrapper/调试)--reuse-session- 复用同一个 Codex session(默认,更像 Ralph Loop 的“同一对话”迭代)--fresh-session- 每轮启动新 Codex session(更隔离,但更不“自引用对话”)
/cancel-loop
取消活动的 Loopback 循环。
用法:
/cancel-loop
注意:不要把取消命令当成 prompt 传给 /loopback(例如 /loopback /cancel-loop)。取消应使用 /cancel-loop,或手动删除 .codex/loopback.local.md。
完成承诺
为了标记任务完成,Codex 必须输出一个 <promise> 标签:
<promise>TASK COMPLETE</promise>
Loopback 会查找这个特定的标签。如果没有它(或 --max-iterations),Loopback 会无限运行。
建议的“契约写法”(让 loop 更容易收敛)
强烈建议在 PROMPT 里把“完成标准”写得像可验证的契约,而不是一句“做完就说 DONE”。例如:
目标:修复认证 bug。
验收:
- `pytest -q` 全绿
- 复现步骤 A 不再报错
完成后输出:<promise>DONE</promise>
若未完成:说明阻塞点 + 下一步要做什么 + 哪些验证已完成/未完成(不要输出 promise)
最佳实践:默认要求“停止契约”
为了避免无限跑飞(尤其在非交互环境),Loopback 默认会要求你至少提供一个停止条件(满足其一即可):
--completion-promise 'DONE'--max-iterations 10
如果你确实要允许无限循环(不推荐),需要显式声明:
--allow-infinite
实现细节:driver 会将每一轮输出写入 .codex/loopback.outputs/iteration-N.log,并在该输出中检测
是否出现 <promise>COMPLETION_PROMISE</promise>。
更稳健的实现:在 --reuse-session 模式下,driver 会使用 codex exec --json/codex exec resume --json,
从 JSON 事件 thread.started.thread_id 获取 session_id,避免依赖本地 session 文件名/日期推断。
另外:driver 会在“当前目录不是 git repo”时自动为 codex exec 添加 --skip-git-repo-check,这样你可以在
类似 ~/Documents/GitHub 这种“仓库集合目录”里直接跑用例(仍然建议在目标仓库根目录运行以提升速度/减少上下文噪音)。
自引用机制
"循环"不意味着 Codex 与自己对话。它的意思是:
- 相同的提示词重复
- Codex 的工作在文件中持久化
- 每次迭代看到之前的尝试
- 逐步构建向目标迈进
示例
交互式 Bug 修复
/loopback "修复 auth.ts 中的令牌刷新逻辑。当所有测试通过时输出 <promise>FIXED</promise>。" --completion-promise "FIXED" --max-iterations 10
你会看到 Loopback:
- 尝试修复
- 运行测试
- 看到失败
- 迭代解决方案
- 在当前会话中
何时使用 Loopback
适用于:
- 定义明确、成功标准清晰的目标
- 需要迭代和改进的任务
- 带有自我修正的迭代开发
- 全新项目
不适用于:
- 需要人工判断或设计决策的任务
- 一次性操作
- 成功标准不明确的目标
- 调试生产问题(改用针对性调试)
与 Ralph Loop 的区别
| 特性 | Ralph Loop (Claude Code) | Loopback (Codex) |
|---|---|---|
| 环境 | Claude Code CLI | Codex CLI |
| 迭代机制 | stop hook | 文件状态检查 |
| 状态存储 | .claude/ralph-loop.local.md |
.codex/loopback.local.md |
| 命令 | /ralph-loop, /cancel-ralph |
/loopback, /cancel-loop |
| 工作原理 | 拦截退出信号 | 检查完成条件 |
工作原理
初始化
当运行 /loopback 命令时:
- 创建
.codex/loopback.local.md状态文件 - 设置初始迭代计数为 1
- 记录最大迭代次数和完成承诺
- 保存原始提示词
迭代过程
driver 每次迭代会:
- 读取
.codex/loopback.local.md - 运行
codex exec(同一条 PROMPT) - 将输出写入
.codex/loopback.outputs/iteration-N.log - 检查停止条件:
- 是否达到
--max-iterations - 是否在输出中检测到
<promise>COMPLETION_PROMISE</promise> - 状态文件是否被
/cancel-loop删除(视为取消)
- 是否达到
- 若未满足停止条件:递增
iteration并进入下一轮
清理
当运行 /cancel-loop 时:
- 检查
.codex/loopback.local.md是否存在 - 如果存在,读取当前迭代数
- 删除状态文件
- 报告取消状态和迭代数