首页 / AI工具 / 别再手动Review了:用OpenAI Codex CLI在终端里搞定代码审查与...

别再手动Review了:用OpenAI Codex CLI在终端里搞定代码审查与Bug修复

别再手动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%。

核心能力亮点:

二、环境准备: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需要遵循三条安全原则:

  1. 限制触发来源:使用allow-usersallow-bots参数防止恶意PR注入提示词
  2. 隔离执行:将Codex步骤放在流水线最后,使用sandbox: read-only模式
  3. 轮换密钥:若怀疑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+.(提升)快捷键实时调节,或通过配置文件预设:

任务类型推理力度原因
语法错误、拼写BugLow几乎不需要深层推理
明确堆栈的测试失败Medium标准诊断即可
跨模块交互BugHigh需要广泛阅读代码
竞态条件、并发BugExtra 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社区的实践统计:

6.4 最佳实践清单

七、常见问题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审查的工作流。