跳转到正文

codex-plugin-cc 精读:Claude × Codex 协同的上下文与控制面设计 ​

代码快照:v1.0.6 · 2026-08-21OpenAI 官方项目 · Apache-2.0

🎯 这篇研究解决什么

codex-plugin-cc 不只是“在 Claude Code 里再调用一个模型”。它真正解决的是四个工程问题:谁做主控、什么上下文交给 Codex、谁可以写工作区,以及长任务如何追踪和续接。

本文先还原项目当前实现,再从其架构与行为边界中提炼可复用的协同工作法。重点不是比较两个模型谁更强,而是减少重复读文件、上下文搬运、双写冲突和无人负责的评审结论。

⚠️ 证据边界

本文基于 openai/codex-plugin-cc v1.0.6、提交 db52e28 的代码快照。研究时重新克隆上游并运行其测试,结果为 91 项通过、0 项失败。


一、先给结论:它是 Claude 主控下的 Codex 执行桥 ​

codex-plugin-cc 的主从关系非常明确:

Claude Code 是控制面,Codex 是按需启动的审查者、执行者或接管者。

插件没有让 Claude 与 Codex 实时共享一个“大脑”,也没有建立双向自动同步。它把不同上下文需求拆成四条路径:

需求入口上下文策略写入能力
只检查当前代码改动/codex:review新建临时 Codex review thread只读
带项目判据质疑方案/codex:adversarial-review新建临时 thread,并注入 focus 与结构化输出约束只读
调查、实现、测试并继续修复/codex:rescue新建或恢复持久 Codex task thread默认可写
长讨论后把整段工作迁往 Codex/codex:transfer一次性导入 Claude transcript,生成可恢复 Codex thread转移后由 Codex 决定

这四条路径最有价值的地方,不是命令数量,而是没有把所有任务都塞进一个永久膨胀的共享上下文。普通 review 用完即弃;连续执行才保留 thread;只有完整对话确实不可替代时才 transfer。


二、项目是什么 ​

维度当前事实
仓库openai/codex-plugin-cc
定位在 Claude Code 中调用 Codex 做代码审查、对抗审查、任务委派与会话转移
当前版本v1.0.6,2026-07-08 发布
许可证Apache-2.0
运行要求Node.js 18.18+;本机安装并完成认证的 Codex CLI
Codex 接口本地 Codex App Server,而非插件自建的第二套 agent runtime
工作区Claude 与 Codex 使用同一台机器、同一个仓库 checkout

Claude Code 官方把插件定义为由 skills、agents、hooks、MCP 等组件组成的自包含扩展目录;该项目正好使用了其中三类:

  • commands/:提供 /codex:* 命令;
  • agents/codex-rescue.md:把复杂任务转交给 Codex;
  • hooks/hooks.json:记录会话身份、清理后台任务,并可选启用 Stop review gate。

插件内部的 Node.js companion runtime 再连接本地 Codex App Server。OpenAI 将 App Server 定义为面向深度客户端集成的协议层,提供认证、conversation history、approval、thread/turn 与流式事件;插件复用了这套原语,而不是通过 shell 文本抓取 Codex TUI 输出。Claude Code 插件参考 · Codex App Server


三、架构:两个 Agent,共享仓库,不共享全部上下文 ​

这张图揭示了三个关键边界。

3.1 Claude 是编排者,不代表 Claude 必须亲自执行 ​

Claude 主会话负责理解需求、保存讨论历史、选择命令、解释 Codex 结果。真正的仓库搜索、代码修改、测试和第二视角 review 可以交给 Codex。主控权与劳动量不是同一个概念。

3.2 Git 工作区是共享事实,不是隔离沙箱 ​

插件把 App Server 的 cwd 指向当前仓库。Claude 与 Codex 看到的是同一份文件和 Git 状态,没有自动创建 worktree。优点是交接简单、结果立即可见;代价是两个写者并发修改同一 checkout 会产生竞态。

因此,可靠协作的第一条不是“多开几个 Agent”,而是:

同一时刻只有一个写者;另一个 Agent 只读、等待或评审。

3.3 状态按 Claude session 隔离 ​

插件在 SessionStart 时记录 Claude session ID 与 transcript 路径,status、result 和默认 resume 会优先限定在当前 Claude session。SessionEnd 会终止该 session 仍在运行的 job 并清理索引。

所以 --background 表示“当前 Claude 会话内非阻塞”,不等于跨会话、跨机器的持久任务队列。需要真正长期运行或 CI 自动化时,应改用 Codex SDK、云端任务或 CI 集成,而不是把本地插件当作调度平台。

实现依据:session-lifecycle-hook.mjs · state.mjs


四、四条上下文路径分别解决什么 ​

4.1 /codex:review:把 diff 交给 Codex 内置 reviewer ​

这个入口直接调用 App Server 的 review/start。OpenAI 官方 review 支持未提交改动、基准分支和指定 commit;插件当前暴露的是 working tree 与 base branch 两类目标。Codex Code Review · App Server review/start

当前行为:

  • dirty working tree 默认审查未提交改动;
  • clean working tree 默认对比推断出的主分支;
  • thread 为 ephemeral: true;
  • sandbox 为 read-only;
  • 不接受 focus text,也不支持 staged-only / unstaged-only;
  • 结果只报告 findings,不修改工作区。

它适合回答“这份 diff 有没有具体缺陷”,不适合回答“这个方案是否违反我们三个月前定下的项目原则”。

4.2 /codex:adversarial-review:把项目判据注入第二视角 ​

对抗审查不是“更严厉的普通 review”。插件给 Codex 一份明确的攻击式提示词:质疑实现方向、假设、失败路径、回滚、并发、权限与数据风险,并用 JSON Schema 约束 verdict、severity、文件、行号、置信度和建议。

它仍然是只读临时 thread,但允许在命令末尾写 focus:

text
/codex:adversarial-review --background --scope working-tree \
重点核对是否违反项目既有契约、是否遗漏跨文件同步、是否把主观判断误写成硬规则;不要报告风格与命名问题。

小 diff 会作为上下文直接提供;改动较大时,插件只给轻量摘要,让 Codex 在只读 sandbox 中自行检查目标 diff。这样避免把大段补丁先复制进桥接 prompt。

实现依据:adversarial-review.md · review-output.schema.json

4.3 /codex:rescue:真正把劳动交给 Codex ​

rescue 经由一个很薄的 Claude subagent 调用 companion runtime。这个 subagent 不应自己读仓库或解决问题,只负责整理并转发任务。首次调用创建持久 Codex task thread;后续可用 --resume 延续同一 thread,也可用 --fresh 明确开新线程。

最重要的安全事实是:

通过 rescue agent 发起的任务,除非用户明确要求只读诊断、研究或 review,否则默认带 --write,Codex 运行在 workspace-write。

因此,任务说明必须明确写出目标、可改范围、禁止事项和验收标准。不要假设后台 Codex 会在危险动作前回到 Claude 里追问:插件创建 App Server thread 时使用 approvalPolicy: never,需要额外授权的动作应失败或绕回安全路径,而不是形成交互审批闭环。

模型与 reasoning effort 也只有 task/rescue 路径支持显式参数。若不传,插件沿用本地 Codex 配置;这比把易变的模型名写死在团队工作流里更稳。

实现依据:codex-rescue.md · codex.mjs

4.4 /codex:transfer:迁移完整会话,而不是实时同步 ​

transfer 使用 App Server 的 external-agent import,把当前 Claude transcript 转换为一个带可见 turn history 的 Codex thread,并返回:

text
codex resume <session-id>

源文件必须位于 ~/.claude/projects/ 且为 JSONL。这个路径限制能防止命令随意导入任意本地文件,但它不改变数据边界:完整 transcript 中的需求、代码片段、日志和可能出现的敏感信息都会进入 Codex 会话。执行前仍应判断是否真的需要整段迁移。

还要特别注意:transfer 是一次性复制,不是双向共享。导入后 Claude 与 Codex 各自继续,只有 Git 工作区保持共享;后续对话不会自动互相同步。App Server external-agent import


五、可复用的协同工作法 ​

下面这套规则是对前述实现边界的实践性归纳。它是工作法,不是插件强制执行的机制。

5.1 单一主控:上下文在哪里,控制面就在哪里 ​

如果需求讨论、项目记忆和历史裁决主要沉淀在 Claude,Claude 就应保持主控;如果主要沉淀在 Codex,则不必为了使用这个插件强行把 Claude 设为主控。

不要同时维护两个不断增长、都自称权威的主会话。双主架构最常见的结果不是更聪明,而是:

  • 同一决策被解释两遍;
  • 两边各自持有不同版本的约束;
  • 发现冲突后,不知道哪一份结论应覆盖另一份;
  • 为同步上下文消耗的成本超过第二模型带来的收益。

5.2 Claude 做判断,Codex 做劳动 ​

当 Claude 主会话承载需求历史与项目裁决,而 Codex 负责仓库执行时,职责可以这样划分:

角色主要职责
Claude明确目标、非目标、历史裁决、风险边界和验收标准;裁决 Codex finding 是否应采纳
Codex阅读仓库、调查根因、修改文件、运行测试、做机械 sweep、产生可核验结果
Git 与测试提供双方共同的当前事实,不依赖任何一方对旧对话的记忆
用户批准提交、推送、删除、部署及其他高影响动作;对最终结果做接受判断

“判断”和“劳动”不是模型能力排名,而是上下文归属。Codex 可以给出逻辑自洽的修改,但如果它没有收到项目历史,就无法凭空知道某条 MUST 为什么不能降级、某个示例为什么只作启示而非枚举。

5.3 Plan 是委派合同,不是文件内容的复制品 ​

给 Codex 的 plan 应包含:

  1. 目标:解决什么问题;
  2. 范围:允许修改哪些路径;
  3. 约束:不能改变什么行为;
  4. 验收:运行哪些检查,看到什么才算完成;
  5. 交付:列出改动文件、验证结果与残余风险。

不要为了写 plan 先把大段源码、日志和文档复制进 Claude 上下文。告诉 Codex 去哪里读、用什么判据判断,通常更精确,也减少重复搬运。

5.4 Focus 写项目不变量,不写“仔细一点” ​

adversarial-review 已经负责“怀疑”。focus 应补充 Codex 从 diff 推不出来的内容,例如:

  • 哪些约束是不可降级的项目契约;
  • 哪些模块发生规则变化时必须同步;
  • 哪些曾被明确拒绝的方案不能重新引入;
  • 哪些检查器只能保持 advisory,不能升级成 hard error;
  • 哪类建议属于风格噪音,不应报告。

一份高质量 focus 相当于把维护者判断压缩成 review rubric,而不是把全部历史对话导入第二个模型。

5.5 Background 是上下文准入控制,不只是速度选项 ​

非平凡任务默认后台运行的核心收益,是 Claude 当前 turn 不等待并吞入完整执行输出。需要时再用:

text
/codex:status
/codex:result <job-id>
/codex:cancel <job-id>

这让进入主会话的是“最终结论与必要证据”,而不是每条搜索、命令和测试日志。等待多久是延迟问题;把多少无复用价值的工具输出带回主上下文,才是上下文工程问题。


六、推荐的三段式闭环 ​

6.1 第一步:Claude 定义交接包 ​

text
/codex:rescue --fresh --background \
在 <路径> 解决 <问题>。允许修改 <范围>;不得改变 <边界>。\
完成后运行 <验证命令>,并报告改动文件、实际结果和未验证事项。\
不要提交、推送或扩大任务范围。

同一问题继续修复时使用 --resume;任务目标改变时使用 --fresh。不要让一个长期 task thread 混入多个无关目标。

6.2 第二步:Codex 自证,Claude 只读关键结果 ​

Codex 应给出:

  • 实际修改了什么;
  • 运行了什么验证;
  • 哪些结论是事实,哪些只是推断;
  • 哪些风险仍需人工判断。

Claude 复核当前 git diff、验证摘要和项目裁决,不需要重新扮演第二个执行者。若结果不完整,优先让同一 Codex thread 继续补证,而不是 Claude 重新从头调查。

6.3 第三步:把“代码正确”与“方向正确”分开审 ​

普通缺陷检查:

text
/codex:review --background --scope working-tree

契约、架构或高风险改动:

text
/codex:adversarial-review --background --scope working-tree <项目不变量与风险重点>

Codex 的 finding 是证据输入,不是自动执行指令。Claude 或维护者必须判断:finding 是否真实、是否属于本次范围、是否与已确立路线冲突。未经确认,不应因为 reviewer 给出建议就自动修改。


七、最容易踩的边界 ​

7.1 review 不能带 focus ​

/codex:review 映射 Codex 内置 reviewer,传 focus 会直接报错。需要定向质疑时用 adversarial-review,不要把二者理解成同一命令的“普通档/高级档”。

7.2 rescue 默认可写 ​

只想研究、诊断或审查时,任务中必须明确写“只读,不修改文件”。否则 rescue agent 的默认行为是加入 --write。

7.3 Background 不允许双写 ​

Codex 在后台改文件时,Claude 不应同时编辑相同 checkout。可以继续讨论或读取无冲突信息,但真正修改应等待当前写任务结束或先取消它。

7.4 Transfer 不是默认交接方式 ​

完整 transcript 信息量最大,也最容易带入过时讨论、无关日志和敏感内容。只有“关键决策主要存在于对话、压缩成 brief 会显著失真”时才值得 transfer。多数任务使用一份自足 brief 更清晰。

7.5 Stop review gate 不是安全证明 ​

/codex:setup --enable-review-gate 会在 Claude 准备停止时审查上一轮是否真的产生了代码改动,并依据 ALLOW / BLOCK 决定是否放行。它能兜住“Claude 临时自己改了文件却没复核”的场景,但仓库 README 明确警告:gate 可能形成长时间 Claude/Codex 循环并快速消耗额度。

因此更稳的使用方式是:

  • 默认保持关闭;
  • 只在高风险、有人监控的短会话中启用;
  • 不用它替代测试、Git diff、权限边界和人工验收;
  • 会话结束前确认没有仍在运行的 background job。

7.6 Changelog 不是完整版本史 ​

当前仓库的 CHANGELOG.md 只记录 1.0.0,而实际版本已到 1.0.6。排查命令差异时应查 GitHub release、tag 与提交历史,不能只读 changelog。


八、项目设计的优点与限制 ​

设计优点限制与使用含义
Claude Code 作为单一控制面用户不必在两个终端复制粘贴普通任务Codex 作为主控的用户会觉得方向相反
review 使用临时只读 thread上下文干净,不污染长期执行会话不了解未显式传入的历史裁决
rescue 使用持久 task thread可连续调查、修改和复核长 thread 仍会积累旧假设,应按任务切分
background job + status/result长任务不阻塞主会话,过程可追踪job 生命周期受本地 Claude session 约束
transfer 导入完整会话复杂前情无需人工复述单向、信息面大、需要额外隐私判断
共享本地 Codex 配置与认证无第二套账户与 runtime 配置本机配置漂移会直接改变插件行为
Stop review gate可自动阻止带明显问题的结束动作可能循环、误阻塞,也不是确定性安全边界

这个项目最成熟的地方,是把“第二模型”从一个模糊概念拆成了审查、对抗审查、执行续接和完整迁移四种不同协议。它最明显的限制也来自同一选择:这是 Claude Code 的 Codex companion,不是一个对称的双 Agent 调度平台。


九、什么时候不该用它 ​

  • 任务只有一次小修改:单 Agent 完成并检查 diff,通常更快。
  • Codex 本来就是主控:直接在 Codex 中工作,按需调用 Claude 做只读复核,比反向绕进 Claude Code 更自然。
  • 需要两个 Agent 并行写代码:使用独立 worktree 或隔离 checkout;不要共享同一工作区并发修改。
  • 任务必须跨会话、跨机器持续运行:使用 Codex SDK、云端任务或 CI,而不是依赖本地 Claude session。
  • 对话包含不应迁移的数据:不要使用 transfer,改写成经过脱敏的最小交接包。
  • 只有“想多一个模型看看”而没有独立判据:第二个模型往往只会重复第一份分析,不能自动带来有效审查。

十、最终判断:协同质量取决于交接协议,不取决于 Agent 数量 ​

codex-plugin-cc 的核心贡献不是证明“Claude + Codex 一定比单模型好”,而是给出了一个可检查的交接协议:

  1. 只看代码,用临时只读 review;
  2. 需要项目判断,用带 focus 的 adversarial review;
  3. 需要劳动与连续修复,用可恢复的 rescue thread;
  4. 关键上下文无法压缩,才迁移完整 transcript;
  5. 所有路径共享一个 Git 事实源,但任何时刻只保留一个写者;
  6. 提交、推送、删除和部署仍由人类明确授权。

这套协同关系可以概括为:

Claude 负责带历史的判断,Codex 负责可验证的劳动;Git 保存当前事实,人类保留最终授权。

一旦目标、上下文、写权限和验收责任都被明确,第二个 Agent 才是能力放大器。否则,多 Agent 只会更快地产生两份互相不完全理解的答案。


参考资料 ​

站内相关:AI Agent 完全指南 · AI Skills 与 Function Calling 指南 · learn-claude-code 精读 · 常用 Workflow 指南


← 返回 AI 知识库