事情是这样的。
上个月有个需求,要把HDFS上的文件同步到OSS。我打开Codex,跟GPT说了一段需求,几秒钟代码就出来了。看起来挺对的,逻辑清晰,注释完整,连异常处理都有。
然后我习惯性地敲了一行命令。
「claude-review review --scope working-tree --wait」
几秒后,DeepSeek告诉我,你的module.exports被覆盖了。第一次导出的{ add }被第二次导出给盖掉了。
我当时就愣住了。
这个问题我自己review了两遍都没看出来。GPT自己生成的代码,它也没看出来。但DeepSeek一眼就看到了。
为什么?
因为GPT在写这段代码的时候,注意力在「怎么实现功能」上。它的思维框架是创造。而DeepSeek在审查的时候,注意力在「这段代码有没有问题」上。它的思维框架是挑刺。
创造和挑刺,需要的是完全不同的思维模式。
我突然想到了一个人。
周伯通。
金庸笔下,周伯通有一招叫「左右互搏」。左手和右手,各使一套武功,互不干扰,却又配合得天衣无缝。
左手画方,右手画圆。
听起来像是一心二用,但仔细想想,这不就是两个独立的系统在协同工作吗?左手有左手的逻辑,右手有右手的逻辑。它们共享一个身体,但各自独立运行。
我用Codex写代码,用Claude Code审代码,本质上就是左右互搏。
Codex是左手,负责创造。它生成代码、搭建骨架、实现功能。它的优势是速度快、思路广、能快速把需求变成可运行的代码。
Claude Code是右手,负责审查。它检查逻辑、发现漏洞、优化细节。它的优势是视角不同、盲区不同、能发现创造者看不到的问题。
左手写,右手审。两个AI,两套逻辑,两种视角。
这不是重复劳动,这是协同进化。
有人会问,那我让GPT自己审自己不行吗?
行,当然行。但效果差很多。
这就像让周伯通用左手打左手。能打吗?能。但打不出真正的变化。因为左手知道右手会怎么出招,右手也知道左手的套路。它们共享同一套认知框架,盲区是一样的。
GPT写代码,GPT审代码,它的盲区不会因为多看一遍就消失。它漏掉的东西,它再看一遍,大概率还是漏掉。
但如果你换一个模型来审呢?
GPT有GPT的盲区,DeepSeek有DeepSeek的盲区。这些盲区的位置是不一样的。用两个不同的模型交叉审查,就像周伯通的左右手,虽然长在同一个人身上,但各自独立,互为补充。
之前GPT开源了其在Claude Code中的review插件,我的这个插件,其实是将其1:1复刻到了Codex中,让使用Codex作为主力编程工具的人,可以通过调用Claude Code,进行review。
我做这个插件的初衷,其实就是想把左右互搏这件事自动化。
Claude Review for Codex,做的事很简单,在Codex的工作流里,一键调用Claude Code,来审查你刚刚用Codex写的代码。
你不需要离开终端,不需要复制粘贴,不需要切换工具。
一行命令,两个大脑。
你用Codex写代码,GPT帮你生成/修改,然后你敲一行「claude-review review」,插件自动收集git diff发给Claude Code,DeepSeek模型独立审查,返回结果。你拿到一份「第二意见」,决定是否采纳。
整个过程你始终在终端里,始终在你熟悉的工作流里。
左手写完,右手自动接上。
我给你演示一下完整的流程。
前几天我在Codex里写一个用户认证模块。我跟GPT说。
「帮我写一个用户登录接口,要支持JWT token,密码用bcrypt加密」
几秒钟,代码出来了。看起来挺对的,有注册、有登录、有token生成。我没急着提交,而是在Codex里直接说了一句。
「帮我review一下刚才写的代码」
这句话触发了Claude Review插件。它自动收集了刚才GPT生成的所有代码变更,发给DeepSeek审查。
几秒后,结果出来了。
代码审查发现
- 1.安全风险:密码明文存储(高)
文件: src/auth/register.js:23
用户密码直接存入数据库,未进行bcrypt哈希处理。
说明: 虽然import了bcrypt,但实际存储时用的是原始密码。
修复: 存储前调用 bcrypt.hashSync(password, 10)
- 2.安全风险:token过期时间硬编码(中)
文件: src/auth/login.js:45
JWT过期时间硬编码为'24h',无法配置。
说明: 生产环境需要根据安全策略调整过期时间。
修复: 从环境变量读取,如 process.env.JWT_EXPIRES_IN
- 3.缺少速率限制(中)
文件: src/auth/login.js:12
登录接口没有速率限制,容易被暴力破解。
修复: 添加 express-rate-limit 中间件
总结: 发现 3 个问题(1 高,2 中)
我一看,第一个问题直接给我整懵了。
GPT确实import了bcrypt,代码里也写了bcrypt.hashSync,但在实际存储的时候,它不知道怎么回事,把原始密码直接存进去了。可能是生成过程中上下文丢失,也可能是它「觉得」hashSync已经在前面调用过了。
这种bug,我自己review大概率看不出来。因为我看到import了bcrypt,就会「以为」密码已经加密了。但DeepSeek不会被这种表象迷惑,它会顺着数据流一路追下去,发现实际存储的是什么。
这就是左右互搏的威力,GPT负责把功能写出来,DeepSeek负责确保功能是安全的。
我根据审查结果逐个修复,然后再次跑了一遍审查,这次通过了。整个过程不到五分钟。
左手写,右手审,发现问题,修复,再审。
搞定。
安装也挺简单的。
最简单的方式,在Codex里直接说一句「install codex-claude-review」,Agent会自动完成一切。
或者手动装「npm install -g codex-claude-review」
然后「claude-review enable」注册到Codex配置,「claude-review doctor」检查依赖是否就绪。
整个过程不到五分钟。
安装完成后,在你codex中的插件中,就可以找到Claude Review了
装上这个插件,然后在下一次提交前,习惯性地多敲一行。
「claude-review review --scope working-tree --wait」,或者直接说「使用Claude进行review」
当DeepSeek帮你揪出GPT写的bug的时候,你会明白。
左右互搏,共同进化。
两个AI看到的世界,永远比一个AI更完整。
项目地址:github.com/sljdxde/claude-review-plugin
npm包:npmjs.com/package/codex-claude-review
MIT协议,开源,欢迎Star和PR。
夜雨聆风