📌 背景
OpenAI Codex CLI 严重缺少类似 Claude Code /rewind 的回退功能。用户群体反复强烈反馈,但官方尚未实现。这是一个高优先级、高需求的功能缺口。
📎 上游 Issue 引用(OpenAI/codex)
| Issue |
标题 |
状态 |
热度 |
| #11626 |
CLI: Add /rewind checkpoint restore that reverts both chat context and Codex-applied code edits |
Open |
🔥 42+ 👍 |
| #9203 |
Please make "/undo" back |
Open |
🔥 130+ 👍 |
| #4487 |
Undo code |
Closed (duplicate of openai#9203) |
32+ 👍 |
| #9344 |
Add file undo option to backtrack mode (Ctrl+Enter) |
Closed (duplicate of openai#11626) |
有实现代码 |
| #15367 |
VS Code extension: Undo/Revert must be reliable |
Open |
2 👍 |
🏗 Codex CLI 代码库上下文
以下是我们 fork 的 exomind-team/codex 仓库的关键结构信息。
仓库结构
exomind-team/codex
├── packages/
│ ├── codex-core/ # 核心逻辑,session 管理、checkpoint、操作执行
│ ├── codex-tui/ # 旧版 TUI(Rust,基于 ratatui)
│ ├── codex-tui2/ # 新版 TUI(Rust,基于 ratatui v2)
│ ├── codex-core/ # (如存在)核心能力层
│ └── ...
├── CLAUDE.md # Codex 内部开发规范
└── ...
关键概念
Checkpoint(检查点):
- Codex 在每次用户发送消息时自动创建 checkpoint,记录对话上下文快照
- 存储在 session 状态中,可通过 backtrack 机制恢复
- 包含:时间戳、用户消息内容、agent 响应历史
Ghost Commit(幽灵提交):
- Codex 在 agent 执行
apply_patch 后自动创建内部 git commit
- 这些 commit 对用户不可见(故名"ghost")
- 提供
Op::Undo 操作,可撤销最近一次 patch 应用
- 是 Codex 内部文件变更追踪的核心机制
Op::Undo(撤销操作):
Esc × 2(Backtrack):
- Codex CLI 的现有回退机制
- 第一次 Esc:显示 backtrack 菜单(可选择恢复对话的 fork 点)
- 第二次 Esc:确认回退到选中的 fork 点
- 仅回退对话上下文,不回退工作区文件
Backtrack 菜单:
- 在 TUI 中触发,显示当前 session 的消息历史
- 用户选择一个消息后,Codex 切到该点继续对话
- 这就是 Phase 1 需要增强的基础机制
🔑 核心问题归纳
问题 1:Codex 曾有 /undo,但被移除了
Issue openai#9203 揭示:
- 早期实验性实现存在 bug,影响了未使用该功能的用户
- 官方表示:「如果恢复它,需要重新设计」(etraut-openai,官方 Collaborator)
- 用户因此大量流失到 Claude Code、Cursor、AntiGravity 等竞品
问题 2:Esc 回退 ≠ 真正的 Undo
- Esc × 2(backtrack)仅回退对话历史,不还原代码变更
- 用户描述:「conversation rewind 是无用的,重要的是 agent 搞砸了能回退代码」
- 现有 workaround(
/diff、git restore)碎片化,体验差
问题 3:期望的功能形态
用户期望的 /rewind 行为(Issue openai#11626):
- 展示最近 checkpoints:时间戳、prompt 摘要、变更文件列表
- 选中 checkpoint 后同时回退对话状态 + Codex 生成的代码变更
- 回退前预览将要还原的文件变更
- 允许编辑恢复后的 prompt 再重新提交
问题 4:安全的 Undo 语义
- 只回退 Codex 创建的编辑,不触碰用户本地已有的变更
- 如果文件无法干净还原,显示冲突并要求显式确认
- 不触碰 Git staged 状态
💡 用户洞察(精选评论)
"You never want to revert the code and not the conversation, I believe."
— ericmeadows(5 👍)
"I use /undo often. I only check which files its working in... if not what I wanted, most likely going to use /undo."
— b20lopez
"Google anti Gravity is also a great alternative." (讽刺官方用 git 作为 workaround 的建议)
"This is the top feature that makes me favor Claude Code over Codex."
— JeanKaddour, ijin
🛠 已知实现线索
- 作者 huynhbaoking112 已有可工作实现,修改了
app_backtrack.rs(在 codex-tui 和 codex-tui2 中)
- 建议:
Enter = 仅回退对话;Ctrl+Enter = 同时回退对话 + 触发 Op::Undo
- 利用现有的 ghost commit/undo 基础设施(codex-core)
用户 miraclebakelaser 发现一个 workaround:
I don't like it. Undo the changes you just made in your previous message using the patch tool.
Do not use git commands to revert your work.
Do not touch anything else that appears changed unless you modified it directly in this session.
缺点:无法恢复被删除的文件,每次回退需要一次 LLM 调用。
Git 方案的局限性
.gitignore 中的文件无法 stage
- 新文件(未 commit)无法用 git 恢复
- Codex 可能通过 shell 命令删除文件,超出
apply_patch 追踪范围
🎯 分阶段实现计划
核心策略:优先交付对话回退(Phase 1),代码回退留作后续(Phase 2)。
这样可以快速验证 checkpoint 机制,同时避免 Phase 1 阶段引入代码变更的风险。
🟢 Phase 1(主):对话回退(/rewind — conversation only)
目标:实现 /rewind 命令,仅回退对话上下文,不触碰工作区文件。
具体行为:
- 用户输入
/rewind
- 展示当前会话的 checkpoint 列表(时间戳 + 最后一条用户消息摘要)
- 用户选择目标 checkpoint(或默认回退 N 步)
- 对话上下文回退到该 checkpoint,后续消息被丢弃
- 工作区文件 保持不变
- 用户可以继续对话,prompt 可编辑
与现有 Esc × 2 的区别:
- Esc × 2 只能回退到上一个 fork 点,无法选择历史
- Phase 1 提供 checkpoint 历史列表,支持选择性回退
实现要点:
- 利用 Codex 现有的会话状态管理机制(session state)
- 不引入新的文件操作,确保低风险
- 优先在
codex-tui2(新版 TUI)中实现,基于 app_backtrack.rs 扩展
验收标准:
🔴 Phase 2(后续):对话 + 代码回退(/rewind — full)
目标:在 Phase 1 基础上,增加代码变更回退能力。
具体行为:
- 用户输入
/rewind
- 展示 checkpoint 列表,同时显示该 checkpoint 之后变更的文件
- 用户选择目标 checkpoint
- 同时回退:对话上下文 + Codex 产生的文件变更
- 回退前显示预览,要求确认
实现路径(待 Phase 1 完成后细化):
安全要求:
- 只回退 Codex 创建的编辑,保留用户已有变更
- 冲突时提示用户确认
- 不触碰 Git staged 状态
📚 参考竞品
| 产品 |
Undo/Rewind 实现 |
| Claude Code |
/rewind 同时回退对话+代码,最完整的实现 |
| Gemini CLI |
已有 rewind 功能 |
| Cursor |
提供可靠的 undo |
| AntiGravity |
提供可靠的 undo |
| OpenAI Codex |
❌ 缺失,用户强烈要求中 |
🚀 Agent 起步建议
- 先阅读
packages/codex-tui2/src/ 下的 app_backtrack.rs(或类似文件),理解现有 backtrack 机制
- 查看
packages/codex-core/ 中的 session/checkpoint 数据结构定义
- 找到 command handler 的位置,添加
/rewind 命令入口
- 复用现有的 checkpoint 列表 UI 组件(backtrack 菜单已有)
- Phase 1 仅操作 session 状态,不调用
Op::Undo
本 issue 整理自 OpenAI/codex 上游 Issue openai#11626、openai#9203、openai#4487、openai#9344、openai#15367,作为 exomind-team/codex 自行实现该功能的需求输入。
📌 背景
OpenAI Codex CLI 严重缺少类似 Claude Code
/rewind的回退功能。用户群体反复强烈反馈,但官方尚未实现。这是一个高优先级、高需求的功能缺口。📎 上游 Issue 引用(OpenAI/codex)
🏗 Codex CLI 代码库上下文
仓库结构
关键概念
Checkpoint(检查点):
Ghost Commit(幽灵提交):
apply_patch后自动创建内部 git commitOp::Undo操作,可撤销最近一次 patch 应用Op::Undo(撤销操作):
apply_patchapp_backtrack.rs中尝试集成到 backtrack 流程Esc × 2(Backtrack):
Backtrack 菜单:
🔑 核心问题归纳
问题 1:Codex 曾有
/undo,但被移除了Issue openai#9203 揭示:
问题 2:Esc 回退 ≠ 真正的 Undo
/diff、git restore)碎片化,体验差问题 3:期望的功能形态
用户期望的
/rewind行为(Issue openai#11626):问题 4:安全的 Undo 语义
💡 用户洞察(精选评论)
🛠 已知实现线索
Issue openai#9344(已有关键代码)
app_backtrack.rs(在codex-tui和codex-tui2中)Enter= 仅回退对话;Ctrl+Enter= 同时回退对话 + 触发Op::UndoIssue openai#9203 中的 Prompt Hack
用户
miraclebakelaser发现一个 workaround:缺点:无法恢复被删除的文件,每次回退需要一次 LLM 调用。
Git 方案的局限性
.gitignore中的文件无法 stageapply_patch追踪范围🎯 分阶段实现计划
🟢 Phase 1(主):对话回退(/rewind — conversation only)
目标:实现
/rewind命令,仅回退对话上下文,不触碰工作区文件。具体行为:
/rewind与现有 Esc × 2 的区别:
实现要点:
codex-tui2(新版 TUI)中实现,基于app_backtrack.rs扩展验收标准:
/rewind命令可用🔴 Phase 2(后续):对话 + 代码回退(/rewind — full)
目标:在 Phase 1 基础上,增加代码变更回退能力。
具体行为:
/rewind实现路径(待 Phase 1 完成后细化):
安全要求:
📚 参考竞品
/rewind同时回退对话+代码,最完整的实现🚀 Agent 起步建议
packages/codex-tui2/src/下的app_backtrack.rs(或类似文件),理解现有 backtrack 机制packages/codex-core/中的 session/checkpoint 数据结构定义/rewind命令入口Op::Undo本 issue 整理自 OpenAI/codex 上游 Issue openai#11626、openai#9203、openai#4487、openai#9344、openai#15367,作为 exomind-team/codex 自行实现该功能的需求输入。