别再手动Review了:用OpenAI Codex CLI在终端里搞定代码审查与Bug修复
每次提PR前手动审查代码、逐行排查Bug、反复跑测试确认修复——这些机械劳动占用了开发者大量时间。2026年,OpenAI Codex CLI已经进化为一个能在终端中自主执行"代码审查-Bug定位-自动修复-回归验证"完整闭环的智能代理。本文将通过真实场景,手把手带你搭建一套基于Codex CLI的自动化审查与修复工作流。
一、Codex CLI 2026:不只是终端里的ChatGPT
OpenAI Codex CLI于2025年中开源,经过一年的快速迭代,当前推荐版本为v0.139.0+,底层模型已升级至GPT-5.5。它在Terminal-Bench 2.0基准测试中得分82.7%,相比上一代GPT-5.4提升了8.7个百分点,幻觉率降低了60%。
核心能力亮点:
- 沙盒安全模型:三级沙盒模式(read-only / workspace-write / danger-full-access)+ 四级审批策略,AI操作不会破坏系统
- 多模态输入:支持直接传入截图进行视觉Bug诊断(
-i参数) - 400K Token上下文:GPT-5.5在Codex中的上下文窗口达400K,足以覆盖大型代码库的单次分析
- 结构化输出:
--output-schema支持JSON Schema约束输出格式,便于CI门禁自动化判断 - Skills框架:通过AGENTS.md和SKILL.md将团队工程规范封装为可复用的审查标准
二、环境准备:5分钟完成安装
2.1 安装Codex CLI
三种主流安装方式,任选其一:
# 方式一:npm安装(跨平台通用,推荐)
npm install -g @openai/codex@latest
# 方式二:macOS Homebrew
brew install --cask codex
# 方式三:Linux/macOS一键脚本
curl -fsSL https://chatgpt.com/codex/install.sh | sh
安装后验证:
codex --version
# 输出类似:codex v0.139.0
2.2 配置认证
个人开发者使用ChatGPT订阅登录最方便:
codex login
# 自动打开浏览器完成OAuth授权
团队或CI环境使用API Key:
export OPENAI_API_KEY="sk-proj-your-key-here"
# 写入 ~/.bashrc 或 ~/.zshrc 持久化
提示:ChatGPT Plus用户每月赠送$5 API额度,Pro用户每月$50,日常开发完全够用。
2.3 项目初始化配置
在项目根目录创建AGENTS.md,这是Codex理解你项目规范的核心文件:
# AGENTS.md
## 构建与测试命令
- 单元测试:`pytest tests/ -v`
- 类型检查:`mypy src/`
- 代码格式:`ruff check src/`
## 审查指南(Review Guidelines)
- 函数超过40行标记为P1
- 所有公共API必须有集成测试
- 禁止记录PII信息,发现标记为P0
- 数据库操作必须使用参数化查询,SQL注入标记为P0
- 新代码优先使用组合而非继承
## 调试约束
- 禁止通过削弱测试断言来通过测试
- 禁止删除或跳过失败测试
- 临时调试日志(print/console.log)提交前必须清除
- 最多8次修复迭代,超过则升级给人类处理
项目级配置文件.codex/config.toml:
model = "gpt-5.5"
approval_policy = "on-request"
sandbox_mode = "workspace-write"
[features]
web_search = "disabled"
suggest_after_edit = true
三、实战场景:代码审查全流程
3.1 场景设定
假设我们有一个Python订单处理服务,包含以下有Bug的代码。创建一个示例项目来演示:
# src/order_service.py —— 包含多个典型Bug的订单服务
from dataclasses import dataclass
from datetime import datetime
from typing import List, Optional
import json
import sqlite3
@dataclass
class OrderItem:
product_id: str
quantity: int
unit_price: float
@dataclass
class Order:
order_id: str
items: List[OrderItem]
status: str = "pending"
@property
def total_amount(self) -> float:
# Bug 1: 浮点数精度问题
return sum(item.quantity * item.unit_price for item in self.items)
def to_dict(self) -> dict:
return {
"order_id": self.order_id,
"items": [
{"product_id": i.product_id, "qty": i.quantity, "price": i.unit_price}
for i in self.items
],
"status": self.status,
"total": self.total_amount,
}
class OrderRepository:
def __init__(self, db_path: str = ":memory:"):
self.conn = sqlite3.connect(db_path)
self._init_schema()
def _init_schema(self):
self.conn.execute("""
CREATE TABLE IF NOT EXISTS orders (
order_id TEXT PRIMARY KEY,
data TEXT NOT NULL,
status TEXT DEFAULT 'pending',
created_at TEXT
)
""")
self.conn.commit()
def save_order(self, order: Order) -> None:
# Bug 2: SQL注入风险 —— 直接拼接字符串
data_json = json.dumps(order.to_dict())
self.conn.execute(
f"INSERT INTO orders (order_id, data, status, created_at) "
f"VALUES ('{order.order_id}', '{data_json}', '{order.status}', "
f"'{datetime.now().isoformat()}')"
)
self.conn.commit()
def get_order(self, order_id: str) -> Optional[Order]:
cursor = self.conn.execute(
f"SELECT data FROM orders WHERE order_id = '{order_id}'"
)
row = cursor.fetchone()
if row is None:
return None
data = json.loads(row[0])
items = [OrderItem(**i) for i in data["items"]]
return Order(order_id=data["order_id"], items=items, status=data["status"])
def get_orders_by_status(self, status: str) -> List[Order]:
# Bug 3: 未使用参数化查询
cursor = self.conn.execute(
f"SELECT data FROM orders WHERE status = '{status}'"
)
return [self._row_to_order(row) for row in cursor.fetchall()]
def _row_to_order(self, row) -> Order:
data = json.loads(row[0])
items = [OrderItem(**i) for i in data["items"]]
return Order(order_id=data["order_id"], items=items, status=data["status"])
def close(self):
self.conn.close()
3.2 一键执行代码审查
在终端中进入项目目录,启动Codex交互式审查:
cd /path/to/your/project
codex
进入交互界面后,输入:
/review
选择"Review against base branch"模式,Codex会自动分析所有变更文件,依据AGENTS.md中的审查指南输出P0/P1分级结果。对于上面的示例代码,Codex典型输出如下:
[P0] src/order_service.py:38 — SQL Injection Risk
save_order() 使用 f-string 直接拼接SQL,order_id 和 data_json
均未转义。攻击者可通过构造恶意 order_id 执行任意SQL。
建议:改用参数化查询 (?,?,?,?)
[P0] src/order_service.py:52 — SQL Injection Risk
get_order() 同样存在SQL注入漏洞,应使用参数化查询。
[P0] src/order_service.py:60 — SQL Injection Risk
get_orders_by_status() 未使用参数化查询。
[P1] src/order_service.py:22 — Floating Point Precision
total_amount 使用浮点数累加,可能导致 0.1+0.2 != 0.3 问题。
建议:使用 round() 或 decimal.Decimal。
[P1] src/order_service.py:48 — Error Handling Missing
get_order() 未处理 JSON 解析异常,非法数据会导致 500 错误。
3.3 让Codex自动修复
审查完成后,在同一会话中直接要求修复:
修复上面所有的P0和P1问题。不要修改测试断言,不要删除任何功能代码。
修复完成后运行测试验证。
Codex会自主完成"读取代码 - 定位Bug - 应用补丁 - 运行测试"的完整循环。以下是修复后的关键代码片段:
# 修复后的 OrderRepository —— 使用参数化查询 + Decimal精度
from decimal import Decimal, ROUND_HALF_UP
@dataclass
class OrderItem:
product_id: str
quantity: int
unit_price: Decimal # 改用Decimal
@dataclass
class Order:
order_id: str
items: List[OrderItem]
status: str = "pending"
@property
def total_amount(self) -> Decimal:
# Bug 1 修复:使用Decimal避免浮点精度问题
total = Decimal("0")
for item in self.items:
total += Decimal(str(item.quantity)) * item.unit_price
return total.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
class OrderRepository:
# ...
def save_order(self, order: Order) -> None:
# Bug 2 修复:使用参数化查询
data_json = json.dumps(order.to_dict())
self.conn.execute(
"INSERT INTO orders (order_id, data, status, created_at) "
"VALUES (?, ?, ?, ?)",
(order.order_id, data_json, order.status, datetime.now().isoformat()),
)
self.conn.commit()
def get_order(self, order_id: str) -> Optional[Order]:
# Bug 3 修复:参数化查询 + 异常处理
cursor = self.conn.execute(
"SELECT data FROM orders WHERE order_id = ?", (order_id,)
)
row = cursor.fetchone()
if row is None:
return None
try:
data = json.loads(row[0])
except json.JSONDecodeError:
return None # P1修复:优雅处理异常数据
items = [OrderItem(**i) for i in data["items"]]
return Order(order_id=data["order_id"], items=items, status=data["status"])
def get_orders_by_status(self, status: str) -> List[Order]:
# Bug 3 修复:参数化查询
cursor = self.conn.execute(
"SELECT data FROM orders WHERE status = ?", (status,)
)
return [self._row_to_order(row) for row in cursor.fetchall()]
3.4 非交互式批量审查(codex exec)
对于自动化场景,使用codex exec进行单次执行,无需人工交互:
# 管道方式:将测试失败输出直接喂给Codex
pytest tests/ -x 2>&1 | codex exec \
"分析这个测试失败,定位根因,修复实现代码(不是测试),然后重跑测试确认。"
# 直接指定审查范围
codex exec \
--sandbox read-only \
"审查 src/order_service.py 中的安全问题,输出JSON格式的审查报告" \
--output-schema '{
"type": "object",
"properties": {
"p0_issues": {"type": "integer"},
"p1_issues": {"type": "integer"},
"findings": {"type": "array"}
},
"required": ["p0_issues", "p1_issues", "findings"]
}'
四、与CI/CD集成:让审查自动化运行
4.1 GitHub Actions工作流配置
在项目中创建.github/workflows/codex-review.yml:
name: Codex Auto Review & Fix
on:
pull_request:
types: [opened, synchronize, reopened]
# 也可在测试失败时触发自动修复
workflow_dispatch:
jobs:
codex-review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0 # 必须全量克隆,否则merge-base diff不完整
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install dependencies
run: pip install -r requirements-dev.txt
- name: Run Codex Review
id: review
uses: openai/codex-action@v1
with:
openai-api-key: ${{ secrets.OPENAI_API_KEY }}
prompt-file: .github/codex/prompts/review.md
output-file: codex-review-output.json
model: gpt-5.5
sandbox: read-only
- name: Check P0 Issues
run: |
P0=$(jq '.p0_issues' codex-review-output.json)
if [ "$P0" -gt 0 ]; then
echo "::error::Codex发现 $P0 个P0问题,阻止合并"
jq '.findings[] | select(.severity=="P0")' codex-review-output.json
exit 1
fi
echo "审查通过:P0=0"
- name: Post Review Comment
if: always()
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const result = JSON.parse(fs.readFileSync('codex-review-output.json', 'utf8'));
const body = `## Codex 自动审查结果\n\n` +
`- P0 问题:${result.p0_issues}\n` +
`- P1 问题:${result.p1_issues}\n\n` +
`### 详情\n${result.summary}`;
github.rest.issues.createComment({
...context.repo,
issue_number: context.issue.number,
body: body
});
4.2 审查提示词模板
创建.github/codex/prompts/review.md:
审查此Pull Request中的所有变更,对照基础分支的diff进行分析。
审查重点:
1. 正确性 —— 逻辑错误、空值处理、边界条件
2. 安全性 —— SQL注入、XSS、硬编码密钥、PII泄露
3. 性能 —— N+1查询、无界循环、缺少索引
4. 测试覆盖 —— 新代码路径是否有对应测试
输出要求:
- 严格遵循AGENTS.md中的Review guidelines
- P0:必须修复(安全漏洞、数据丢失风险)
- P1:建议修复(代码质量、可维护性)
- 每个发现包含:文件路径、行号范围、问题描述、修复建议
以JSON格式输出,包含 p0_issues、p1_issues、summary、approve、findings 字段。
4.3 安全注意事项
在CI中运行Codex需要遵循三条安全原则:
- 限制触发来源:使用
allow-users和allow-bots参数防止恶意PR注入提示词 - 隔离执行:将Codex步骤放在流水线最后,使用
sandbox: read-only模式 - 轮换密钥:若怀疑API Key泄露,立即在OpenAI平台轮换
五、自定义提示词模板库
在.github/codex/prompts/目录下维护不同场景的提示词模板,通过prompt-file参数切换:
.github/codex/prompts/
├── review.md # 通用代码审查
├── security-audit.md # 安全专项审查
├── perf-audit.md # 性能专项审查
├── autofix.md # 自动修复模板
└── migration-review.md # 数据库迁移审查
自动修复模板(autofix.md)示例:
测试套件在CI中失败。请执行以下步骤:
1. 运行 `pytest tests/ -x --tb=short` 复现失败
2. 读取失败测试的代码,理解预期行为
3. 读取对应的实现代码,定位Bug根因
4. 应用最小化修复补丁(不要修改测试断言)
5. 重跑失败测试确认修复
6. 运行完整测试套件检查回归
输出JSON:{"fixed": true/false, "tests_fixed": [...], "regressions": [...]}
六、性能对比与最佳实践
6.1 推理力度调优
GPT-5.5支持四级推理力度,通过TUI中的Alt+,(降低)和Alt+.(提升)快捷键实时调节,或通过配置文件预设:
| 任务类型 | 推理力度 | 原因 |
|---|---|---|
| 语法错误、拼写Bug | Low | 几乎不需要深层推理 |
| 明确堆栈的测试失败 | Medium | 标准诊断即可 |
| 跨模块交互Bug | High | 需要广泛阅读代码 |
| 竞态条件、并发Bug | Extra High | 需要复杂因果推理 |
| 代码审查(CI门禁) | High | 审查每个PR仅运行一次,值得投入 |
6.2 模型路由策略
成本敏感场景下的分层模型策略:
# 快速初筛:用o4-mini做初步审查(低成本)
codex -m o4-mini "快速扫描 src/ 中的明显安全问题"
# 深度审查:用GPT-5.5做正式Review(高质量)
codex -m gpt-5.5 --reasoning-effort high \
-p review "对当前分支的完整diff做深度审查"
# Profile配置:为不同用途指定默认模型
# ~/.codex/config.toml
[profiles.review]
model = "gpt-5.5"
model_reasoning_effort = "high"
approval_policy = "on-request"
[profiles.quick-fix]
model = "o4-mini"
model_reasoning_effort = "medium"
6.3 关键数据
根据OpenAI社区的实践统计:
- 本地
/review可在推送前捕获60%-70%的问题,大幅减少CI返工 - 添加项目级AGENTS.md审查指南后,可操作发现项增加40%-50%
- 使用GPT-5.5 + High推理力度的审查,在安全回归检测上比Medium力度多发现约30%的漏洞
6.4 最佳实践清单
- 先写AGENTS.md再开发:在编码前就定义好审查标准,让Codex在实现阶段就遵循规范
- 使用Git Worktree隔离:为每个功能分支创建独立worktree,避免Codex操作污染主工作区
- 审查用高推理力度,实现用标准力度:审查每个PR只运行一次,值得用GPT-5.5 + High
- 测试作为外部Oracle:让Codex"测试-修复-重测",而不是自行判断正确性
- 人机协作而非完全替代:Agent审查擅长捕获机械性问题(Bug、缺失测试、安全模式),人类审查员应聚焦于架构对齐和团队规范漂移
七、常见问题FAQ
Q1:Codex CLI免费吗?
Codex CLI本身开源免费。使用ChatGPT Plus订阅登录可获每月$5免费API额度(Pro为$50),超出部分按API标准计费。也可以直接使用API Key按量付费。
Q2:审查结果可靠吗?会漏报吗?
GPT-5.5的幻觉率相比上一代降低60%,但不为零。建议将Codex审查作为"预筛"层,关键业务逻辑仍需人工复审。根据社区数据,本地/review能捕获60%-70%的问题,CI + GitHub双重审查覆盖率更高。
Q3:Codex会偷偷修改测试断言来"通过"测试吗?
这是早期版本的已知问题。解决方法是在AGENTS.md中明确添加约束:禁止通过削弱测试断言来通过测试,并始终审查diff中是否有对测试文件的断言修改。
Q4:Windows上能用吗?
原生Windows支持仍在改进中,推荐通过WSL2使用。在WSL2 Ubuntu中执行npm install -g @openai/codex@latest即可。
Q5:如何处理大型代码库的审查性能?
对于超过400K token上下文的项目,建议:使用--add-dir参数只暴露需要审查的目录;先用o4-mini做快速扫描定位问题文件,再用GPT-5.5对问题文件做深度审查。
Q6:codex-action和GitHub @codex review有什么区别?
两者是独立的审查表面。codex-action运行在你的CI流水线中,适合做自动化门禁;@codex review是GitHub上的云代理,直接在PR页面发布行内评审评论。建议两者配合使用:CI做自动化阻塞,GitHub做可视化反馈。
从手动逐行审查到AI驱动的自动化闭环,Codex CLI正在重新定义代码质量保障的效率上限。关键不在于让AI完全替代人类审查,而在于把机械性的Bug检测和修复工作交给Agent,让工程师把精力集中在真正需要人类判断的架构决策上。建议从今天的项目开始,先写一份AGENTS.md,跑一次/review,体验一下终端中AI审查的工作流。