name: second-opinion description: “运行外部LLM代码审查(OpenAI Codex或Google Gemini CLI)于未提交的更改、分支差异或特定提交。当用户要求二次意见、外部审查、codex审查、gemini审查或提到/second-opinion时使用。” allowed-tools:
- Bash
- Read
- Glob
- Grep
- AskUserQuestion
二次意见
通过外部LLM CLI进行独立代码审查,由不同模型提供支持。支持OpenAI Codex CLI和Google Gemini CLI。
何时使用
- 从不同模型获取代码更改的二次意见
- 在打开PR前审查分支差异
- 在提交前检查未提交的工作以发现问题
- 运行针对性审查(安全、性能、错误处理)
- 比较多个模型的审查输出
何时不使用
- 未安装Codex CLI或Gemini CLI
- 未为任一工具配置API密钥或订阅
- 审查非代码文件(文档、配置)
- 您想要Claude自己的审查(直接询问Claude)
安全说明
Gemini CLI使用--yolo调用,这会在没有确认的情况下自动批准所有工具调用。这是无头(非交互式)操作所必需的,但意味着Gemini将执行其扩展请求的任何工具操作,而无需提示。
快速参考
# Codex(无头执行,结构化JSON输出)
codex exec --sandbox read-only --ephemeral \
--output-schema codex-review-schema.json \
-o "$output_file" - < "$prompt_file"
# Gemini(代码审查扩展)
gemini -p "/code-review" --yolo -e code-review
# Gemini(无头与差异 — 参见references/中的完整模式)
git diff HEAD > /tmp/review-diff.txt
{ printf '%s
' 'Review this diff for issues.'; cat /tmp/review-diff.txt; } \
| gemini -p - --yolo -m gemini-3.1-pro-preview
调用
1. 交互式收集上下文
使用AskUserQuestion一次性收集审查参数。根据用户在调用中已提供的内容调整问题(跳过已回答的问题)。
将所有适用问题合并到单个AskUserQuestion调用中(最多4个问题)。
问题1 — 工具(如果用户已指定则跳过):
header: "审查工具"
question: "应使用哪个工具运行审查?"
options:
- "Both Codex and Gemini(推荐)" → 并行运行两者
- "Codex only" → codex exec
- "Gemini only" → gemini CLI
问题2 — 范围(如果用户已指定则跳过):
header: "审查范围"
question: "应审查什么?"
options:
- "未提交的更改" → git diff HEAD + 未跟踪文件
- "分支差异 vs main" → git diff <分支>...HEAD(自动检测默认分支)
- "特定提交" → git diff <sha>~1..<sha>(后续询问SHA)
问题3 — 项目上下文(如果CLAUDE.md或AGENTS.md均不存在则跳过):
首先检查仓库根目录中的CLAUDE.md,然后AGENTS.md。仅当至少一个存在时显示此问题。
header: "项目上下文"
question: "包含项目约定文件,以便审查检查您的标准?"
options:
- "是,包含它"
- "否,标准审查"
问题4 — 审查重点(始终询问):
header: "审查重点"
question: "审查有任何特定重点领域吗?"
options:
- "一般审查" → 无自定义提示
- "安全与认证" → 安全重点提示
- "性能" → 性能重点提示
- "错误处理" → 错误处理重点提示
2. 直接运行工具
不要预先检查工具可用性。立即运行所选工具。如果命令失败,出现"command not found"或缺少扩展,则从下面的错误处理表中报告安装命令并跳过该工具(如果选择"Both",则仅运行可用的一个)。
差异预览
收集答案后,显示差异统计:
# 对于未提交的(已跟踪 + 未跟踪):
git diff --stat HEAD
git ls-files --others --exclude-standard
# 对于分支差异:
git diff --stat <分支>...HEAD
# 对于特定提交:
git diff --stat <sha>~1..<sha>
如果差异为空,停止并告知用户。
如果差异非常大(>2000行更改),警告用户并询问是否继续或缩小范围。
跳过不适用检查
确定差异范围后,跳过不适用于实际更改文件的检查。
依赖扫描
仅当差异触及依赖清单文件时运行/security:scan-deps。使用以下命令检查:
git diff --name-only <范围> \
| grep -qiE '(package\.json|package-lock|yarn\.lock|pnpm-lock|Gemfile|\.gemspec|requirements\.txt|setup\.py|setup\.cfg|pyproject\.toml|poetry\.lock|uv\.lock|Cargo\.toml|Cargo\.lock|go\.mod|go\.sum|composer\.json|composer\.lock|Pipfile)'
如果差异中没有依赖文件,即使选择安全重点也跳过扫描。扫描分析整个项目的依赖树,不考虑差异范围,因此当未触及依赖项时,它增加大量时间而零价值。
自动检测默认分支
对于分支差异范围,检测默认分支名称:
git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null \
| sed 's@^refs/remotes/origin/@@' || echo main
Codex调用
参见references/codex-invocation.md以获取命令语法、提示组装和结构化输出模式的完整详情。
摘要:
- 使用
codex exec(非codex review)进行无头操作 - 模型:
gpt-5.3-codex,推理:xhigh - 使用OpenAI发布的代码审查提示(微调到模型中)
- 手动生成差异并通过stdin与提示一起传输
--output-schema生成结构化JSON发现-o仅捕获最终消息(无思考/执行噪音)- 所有三个范围(未提交、分支、提交)都支持项目上下文和重点指令(无限制)
- 在认证错误时回退到
gpt-5.2-codex - 输出是干净的JSON — 按优先级解析并呈现发现
- 在Bash调用上设置
timeout: 600000
Gemini调用
参见references/gemini-invocation.md以获取标志、范围映射和扩展使用的完整详情。
摘要:
- 模型:
gemini-3.1-pro-preview,标志:--yolo,-e,-m - 对于未提交的一般审查:
gemini -p "/code-review" --yolo -e code-review - 对于分支/提交差异:将
git diff传输到gemini -p - 安全扩展名称是
gemini-cli-security(非security) /security:analyze仅为交互式 — 使用带安全提示的-p代替- 仅当选择安全重点且差异触及依赖清单文件时运行
/security:scan-deps(参见差异感知优化) - 在Bash调用上设置
timeout: 600000
用于git diff的范围映射(Gemini无内置范围标志):
| 范围 | 差异命令 |
|---|---|
| 未提交 | git diff HEAD + 未跟踪(参见codex-invocation.md) |
| 分支差异 | git diff <分支>...HEAD |
| 特定提交 | git diff <sha>~1..<sha> |
运行两者
当用户选择"Both"(默认):
- 并行运行Codex和Gemini — 在单个响应中发出两个Bash工具调用。两个命令均为只读(它们通过外部API审查差异),因此无共享状态或git锁争用。
- 收集两个结果,然后使用清晰标题呈现:
## Codex审查 (gpt-5.3-codex)
<codex输出>
## Gemini审查 (gemini-3.1-pro-preview)
<gemini输出>
总结两个审查的同意和差异点。
错误处理
| 错误 | 操作 |
|---|---|
codex: command not found |
告知用户:npm i -g @openai/codex |
gemini: command not found |
告知用户:npm i -g @google/gemini-cli |
Gemini code-review扩展缺失 |
告知用户:gemini extensions install https://github.com/gemini-cli-extensions/code-review |
Gemini gemini-cli-security扩展缺失 |
告知用户:gemini extensions install https://github.com/gemini-cli-extensions/security |
| 模型认证错误(Codex) | 使用gpt-5.2-codex重试 |
| 空差异 | 告知用户无更改可审查 |
| 超时 | 告知用户并建议缩小差异范围 |
| 工具部分不可用 | 仅运行可用工具,注意跳过 |
示例
两种工具(默认):
用户:/second-opinion
Claude:[询问4个问题:工具、范围、上下文、重点]
用户:选择"Both","Branch diff","Yes include CLAUDE.md","Security"
Claude:[检测默认分支 = main]
Claude:[显示diff --stat:6文件,+103 -15]
Claude:[组装带审查指令 + CLAUDE.md + 安全重点 + 差异的提示]
Claude:[并行运行codex exec和gemini]
Claude:[读取codex输出文件,解析结构化发现]
Claude:[呈现两个审查,突出同意/差异]
仅Codex带内联参数:
用户:/second-opinion check uncommitted changes for bugs
Claude:[范围已知:未提交,重点已知:自定义]
Claude:[询问2个问题:工具、项目上下文]
用户:选择"Codex only","No context"
Claude:[显示diff --stat:3文件,+45 -10]
Claude:[编写带审查指令 + 差异的提示文件]
Claude:[运行codex exec,读取结构化JSON输出]
Claude:[按优先级呈现发现,带文件:行引用]
仅Gemini:
用户:/second-opinion
Claude:[询问4个问题]
用户:选择"Gemini only","Uncommitted","No","General"
Claude:[显示diff --stat:2文件,+20 -5]
Claude:[运行gemini -p "/code-review" --yolo -e code-review]
Claude:[呈现审查]
大差异警告:
用户:/second-opinion
Claude:[询问问题] → 用户选择"Both","Uncommitted","General"
Claude:[显示diff --stat:45文件,+3200 -890]
Claude:"大差异(3200+行)。继续,或缩小范围?"
用户:"proceed"
Claude:[运行两个审查]