Skip to content

redline 是一个开源的参考实现,通过 Claude Code 的 Stop Hook 机制,在每次 AI 完成响应后自动检查是否有未提交的代码变更,若变更值得审查,则由 Claude 以后台任务形式启动 Codex CLI 进行异步代码审查。两个 agent(Claude Code 和 Codex)均通过 OpenRouter 路由,可在一个面板中统一监控成本。整个流程无阻塞、无守护进程,完全透明可控。

redline 是一个参考实现,将 Claude Code 的 hook 系统与 Codex CLI 的代码审查能力连接起来。

核心特性:

  • Claude(或你)判断是否需要审查,而非每次都强制触发
  • Claude Code 完全控制审查 agent,以异步后台进程运行
  • 两个 agent 均在 OpenRouter 上可观测、可定制、可监控成本
  • 一条命令完成双 agent 登录:redline login
  • 以单个 Claude Code Stop Hook 实现,完全透明可定制

工作效果

每次 Claude Code 完成响应且有未提交变更时,hook 自动触发一个后台 Codex 代码审查——不阻塞你的工作流。你继续工作,审查在后台运行。完成后,Claude 读取输出并呈现发现的问题。

无后台进程,无守护进程,无文件系统协议。 Hook 是触发器,Claude Code 自身的后台任务系统处理异步执行。

前置要求

  • OpenRouter API key
  • Claude Code 已安装(claude 在 PATH 中)
  • Codex CLI 已安装(codex 在 PATH 中)
  • Bun 或 Node.js 运行时

配置 OpenRouter

两个 agent 均通过 OpenRouter 路由,但使用不同的 API 协议层和 base URL。

Claude Code 配置

在 shell profile(~/.zshrc~/.bashrc)中设置环境变量,不要使用 .env 文件(Claude Code 不读取):

bash
export ANTHROPIC_BASE_URL="https://openrouter.ai/api"
export ANTHROPIC_AUTH_TOKEN="sk-or-..."
export ANTHROPIC_API_KEY=""   # 必须显式置空,防止回退到 Anthropic 直连

注意:base URL 是 https://openrouter.ai/api不加 /v1 后缀。这是 OpenRouter 的 Anthropic 协议层。加上 /v1 会导致模型找不到错误。

Codex CLI 配置

创建或编辑 ~/.codex/config.toml

toml
[model_providers.openrouter]
name = "openrouter"
base_url = "https://openrouter.ai/api/v1"
env_key = "OPENROUTER_API_KEY"

然后设置 API key:

bash
export OPENROUTER_API_KEY="sk-or-..."

运行时通过 -c 'model_provider="openrouter"' 指定使用 OpenRouter。

常见错误:Codex CLI 没有 --provider 参数,所有运行时配置覆盖必须用 -c。TOML 中的 section 名是 [model_providers.openrouter] 而非 [provider.openrouter]

Stop Hook 工作原理

Claude Code 的 hook 配置在 settings.json 中。Stop hook 在 Claude 每次完成响应后触发。

decision: "block" 机制

  1. hook 命令运行并向 stdout 输出 JSON
  2. 如果 JSON 包含 "decision": "block""reason" 字符串,Claude Code 不会停止,而是将 reason 内容注入 Claude 的上下文
  3. Claude 处理这些信息并决定是否启动审查任务
  4. 若命令以 0 退出且无 JSON 输出,Claude 正常继续

Hook 配置

.claude/settings.local.json(项目级本地配置,不影响其他协作者)中添加:

json
{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "redline check",
            "timeout": 10
          }
        ]
      }
    ]
  }
}

超时设为 10 秒——check 命令很快。远低于同步审查所需的 300 秒。

为什么要异步

同步方式的三个问题:

  1. 阻塞codex exec review 可能需要几分钟,同步 Stop Hook 期间 Claude Code 完全卡住
  2. 无过滤:每次响应都触发,包括没有代码变更的纯对话
  3. 重复审查:无机制防止已有审查正在运行时再次触发

异步方案解决了所有问题:check 极快(<1s),仅在有变更时触发,通过 diff stat 哈希跳过未变化内容,实际审查作为 Claude Code 后台任务运行,用户可监控和取消。

两命令架构

工具分为两个命令:check(快速门控,由 Hook 调用)和 review(实际工作,由 Claude 作为后台任务启动)。

check 命令:

  • 运行 git diff --stat HEAD 获取变更摘要,回退到 git status --porcelain
  • 对 diff stat 哈希化,与上次检查比对,未变化则静默退出
  • 若有新变更,输出包含 diff 摘要和审查指令的 decision: "block" JSON
  • Claude 看到摘要,自行判断是否值得审查,决定是否启动后台任务

review 命令:

  • 作为 Claude Code 后台任务被启动
  • 实时流式输出 Codex 进展
  • 使用 -o <file> 将最终结果写入文件,审查完成后打印摘要

安装与卸载 Hook

bash
# 安装(幂等,重复运行安全)
redline install

# 卸载
redline uninstall

常见问题

Q: 如果 Codex 审查正在运行,会触发第二次审查吗?

A: 不会。check 命令的 reason 中明确告诉 Claude:"若已有审查正在运行则跳过"。Claude 会检查其后台任务列表,避免重复启动。

Q: 两个 agent 的费用如何追踪?

A: 两个 agent(Claude Code 通过 Anthropic 协议层、Codex 通过 OpenAI 兼容层)都路由到 OpenRouter,所有请求统一出现在 OpenRouter 活动面板中,可按 API key 分别追踪。redline login 一条命令配置两个 agent 的 OpenRouter 认证。

Q: 可以自定义审查使用的模型吗?

A: 可以。使用 redline review --model openai/gpt-5.4-pro 或在 check 命令中传入 --model 参数,会自动注入到 Claude 启动的 review 命令中。