想让 Claude Code 和 Codex 一起工作,就把它们当成同一个团队的两个成员:开发用 Claude Code,评审用 Codex,由 Crewly 在两者之间传消息。我们在一台 Mac 上真的跑了一遍:Claude Code 提交了一个带 bug 的函数,请 Codex 评审这次提交,Codex 找到了这个 bug;Claude Code 修好后,Codex 通过了。
Crewly 是一个开源平台,可以把 Claude Code 和 Codex 组成一个 agent 团队来运行。这篇文章就是我们当时的配置,包括中途出的两个问题,以及一次抓到埋入 bug 的评审。
让 Claude Code 和 Codex 一起用的三种方式
| 方式 | 谁来传消息 | 适合什么时候 |
|---|---|---|
| 你自己当中间人 | 你把计划或 diff 从一个工具复制到另一个 | 偶尔要一个第二意见 |
| 一个工具调用另一个 | 其中一个工具里的插件或 MCP 桥 | 你待在一个工具里,把另一个当帮手 |
| 角色绑定到 CLI 的团队 | Crewly 在常驻会话之间传消息 | 想要固定的开发和固定的评审,不用你在中间 |
别的文章讲了前两种(有人提到 Claude Code 的官方 Codex 插件,或者运行 codex mcp-server);这些我们没测过,所以不做担保。本文讲第三种。
为什么让第二个 CLI 来评审
没有写过这段代码的评审,不记得为什么这样写,会像一个同事那样读这次提交。很多人推荐这个做法,但它只是一种观点,不是我们测出来的。我们不是说 Codex 评审得比 Claude Code 好,或者反过来;我们说的是,另一个会话、另一个模型家族,是一个不同的读者。
Claude Code 本身不做什么
Claude Code 有两样听起来相近的东西:
- Agent teams(文档)是实验功能,默认关闭(
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1)。队友是独立的 Claude Code 实例。文档里没有描述让队友运行 Codex 的方法。 - 跨会话消息(文档)让 Claude 用纯文本给你的其他 Claude Code 会话发消息。那一页里的每个对象都是 Claude Code 会话。
两者各有所长,但都没法把一个 Codex 会话放进你的团队。
用 Crewly 搭起来
前提
- macOS。 我们只在 Apple Silicon 的 macOS 上测过。
- 统一的 Node。 在 Apple Silicon 上,全程使用 arm64 的 Node。见下文「中途出了什么问题」。
- Claude Code 已安装并登录。先在项目文件夹里运行一次
claude,接受「是否信任这个文件夹」的提示。 - Codex 已安装并登录。我们用的是
codex-cli 0.159.2,通过 npm 安装;OpenAI 的 CLI 页面还列出了独立安装脚本和 Homebrew。
1. 安装并启动 Crewly
curl -fsSL https://crewlyai.com/install.sh | bash
打开一个新终端,运行:
crewly start
2. 创建项目和一个有两种运行时的团队
下面都在 crewly start 打开的仪表盘里完成。
- Projects → New Project。 起个名字,填上团队要工作的仓库的绝对路径。
- Teams → New Team。 填团队名,把 Assigned Project 设成你的项目,再添加两个成员。每个成员都有自己的 Runtime Type 下拉框。把 Dev(角色 Developer)设成 Claude CLI,把 Reviewer(角色 QA Engineer)设成 Codex CLI:
New Team 表单:Dev 用 Claude CLI,Reviewer 用 Codex CLI
- 点团队卡片上的播放按钮启动团队。这一次点击后两个成员都变成了 active:
Mixed CLI Team 卡片显示 Active,两个成员
让团队「混合」的,只是运行时这一项。你也可以通过 Crewly 的 HTTP API 创建同样的团队;本文我们跑的是仪表盘这条路,所以只展示这一条。
3. 给开发一个包含评审的任务
打开仪表盘右下角的终端面板。它的 Session 下拉框按会话名列出每个正在运行的成员,比如 mixed-cli-team-dev-87d03dee 和 mixed-cli-team-reviewer-e3ba1cdd(你的后缀会不一样)。选中 Dev 的会话,粘贴任务,把评审的会话名从下拉框里抄过来填上:
Fix the trailing-hyphen bug the reviewer reported in slugify.js and add a boundary test, run node --test, commit. Then send a message to the agent session <reviewer-session> asking it to re-review the new commit (git show HEAD) and reply LGTM or concrete problems. Keep the request to 3 lines.
(这是我们第二轮的任务,是直接敲进终端面板的;第一轮见下文。)我们没有测试按角色而不是按会话名指定评审,所以请用会话名。
4. 发生了什么
为了看评审到底有没有用,我们在评审之前自己提交了一个像样的 bug。slugify(str, maxLength = 40) 在去掉连字符之后才按 maxLength 截断,所以截断点恰好落在连字符后面时,结果末尾会留下一个连字符。我们写的四个测试全部通过,因为没有一个覆盖这个边界。
第一轮。 我们让 Dev 请 Reviewer 评审这次提交(这条指令是用 Crewly 的 send-message 技能发的,没有走终端面板)。Dev(Claude Code)通过 Crewly 的 send-message 技能给 Codex 评审发了消息。Reviewer(Codex)读了提交、跑了测试,并报告了一个具体问题:截断可能留下末尾连字符,slugify("hello world", 6) 返回 hello-,而现有的截断测试只检查长度。它还找到了默认长度下的第二个例子。Crewly 把这条回复送回给 Dev。
第二轮。 Dev 调整了截断和去连字符的顺序,加了边界测试并提交。Reviewer 重新评审后回复 LGTM;node --test 5 个全部通过。
ebf7efc Fix trailing hyphen after slugify truncation
0b57454 Add slugify with maxLength
需要说清楚的几点:这个 bug 是我们埋的,而且选的是容易的那种:一个函数、一份清楚的约定、一个现有测试没覆盖到的 bug。一个任务上抓到一次,只是个例。它证明通道可用,也证明 Codex 在这里做好了评审的工作;它不证明 Codex 比 Claude Code 抓得更多,也不证明它能抓到更隐蔽的 bug。
中途出了什么问题
x64 和 arm64 的 Node 混用,导致 Codex「未安装」。 在 Apple Silicon 的 Mac 上,如果 Intel(x64)的 Node 排在 PATH 前面,Codex 成员会启动失败,报「Codex CLI (codex) is not installed on this machine」。其实 Codex 已经装了,只是在 x64 的 Node 下找不到它的 arm64 原生包。解决办法:整个过程用同一个 arm64 Node,并用它来安装 Crewly 和 Codex。
信任提示不会自动回答。 在一个全新的仓库里,Claude Code 会问「Is this a project you created or one you trust?」。在有人回答之前,Crewly 会把这个成员标成在等人处理。要么先在这个文件夹里运行一次 claude,要么在仪表盘的终端面板里回答它。
局限
- 只在 Apple Silicon 的 macOS 上,Crewly 1.20.174,一个两人团队,一个小任务,一个埋下的 bug。
- Crewly 以
codex -a never -s danger-full-access启动 Codex 成员:没有审批提示、没有沙箱。按codex --help,相关的--dangerously-bypass-approvals-and-sandbox标志"仅用于外部已有沙箱的环境"。请先在临时仓库里试。 - 上面表格里的插件和 MCP 桥这两种方式,我们没有测试过。
常见问题
Claude Code 和 Codex 能互相通信吗?
它们自己做不到。Claude Code 的跨会话消息只能发给你的其他 Claude Code 会话,它的 agent teams 也是由 Claude Code 会话组成的。在 Crewly 团队里,每个成员是各自 CLI 上的一个会话,成员之间通过 Crewly 互发消息。我们的运行里,Claude Code 开发给 Codex 评审发了消息,并收到了指出真实 bug 的回复。
怎么用 Codex 评审 Claude Code 写的代码?
把两个角色交给两个团队成员:开发用 claude-code 运行时,评审用 codex-cli 运行时。评审没有写过这段代码,也和作者没有共享对话,所以是用全新的视角读这次提交。
两个都需要 API key 吗?
Claude Code 和 Codex 都要按各自文档的方式装好并登录。Crewly 只是启动你已有的 CLI,不会替你登录。
Linux 或 Windows 能用吗?
我们只在 Apple Silicon 的 macOS 上跑过,没有测 Linux 和 Windows,所以不对它们做任何说明。
让 Codex 评审运行安全吗?
Crewly 用 -a never -s danger-full-access 启动 Codex 成员,也就是没有审批提示、没有沙箱。Codex 自己的帮助文本把它的绕过标志称为在没有外部沙箱的环境里极其危险。在习惯之前,请先用临时的仓库。