code-review-deep-zh
全面的深度代码审查,覆盖 10 个维度:正确性、安全性、性能、可靠性、架构、数据完整性、可维护性、一致性、可观测性和文档。使用 7 个并行审查代理进行彻底分析并生成结构化报告。自动从差异(diff)中检测所有编程语言和框架。当用户请求深度代码审查、全面审查、完整审查、彻底审查、安全审计、架构评估、代码质量分析、性能审查,或提及 /code-review-deep-zh 时使用。同样适用于合并前的最
SKILL.md.claude/skills/code-review-deep-zh/SKILL.md
GitHub深度代码审查 (code-review-deep-zh)
一个全面的、多维度的代码审查 skill,使用 7 个并行代理在 10 个审查维度上分析代码变更。支持所有编程语言,具备自动检测和动态适配能力。
审查维度
| # | 维度 | 代理 |
|---|---|---|
| 1 | 正确性 | Agent 1 |
| 2 | 安全性 | Agent 2 |
| 3 | 性能 | Agent 3 |
| 4 | 可靠性 | Agent 3 |
| 5 | 架构与设计 | Agent 4 |
| 6 | 数据完整性 | Agent 5 |
| 7 | 可维护性 | Agent 6 |
| 8 | 文档 | Agent 6 |
| 9 | 一致性 | Agent 7 |
| 10 | 可观测性 | Agent 7 |
工作流程
按顺序执行以下 4 个阶段。不要跳过任何阶段。
阶段 1:上下文收集
你(主代理)直接执行此阶段。 在派发审查代理之前收集所有所需的上下文。
步骤 1.1:确定审查范围
从用户输入中检测审查范围:
- PR 差异(diff)(默认):运行
git diff main...HEAD,如果用户指定了基准分支则运行git diff <base>...HEAD - 暂存变更:如果用户提及 "staged" 或 "cached",运行
git diff --cached - 工作树:如果用户提及 "uncommitted" 或不存在上游分支,运行
git diff HEAD - 特定文件/目录:如果用户指定了文件路径,将审查范围限定到这些文件
- PR 编号:如果用户提供了 GitHub PR 编号,使用
gh pr diff <number>
如果差异(diff)为空,告知用户并停止。
步骤 1.2:收集上下文
并行运行以下命令:
git diff <scope>— 获取完整的统一差异(diff)git log --oneline -20— 最近的提交历史- 读取 CLAUDE.md 文件:根目录的 CLAUDE.md + 差异(diff)所触及目录中的任何 CLAUDE.md
- 检查仓库中的框架配置文件(package.json、pom.xml、go.mod、Cargo.toml、requirements.txt、build.gradle 等)
git diff <scope> --stat— 获取文件变更统计(每个文件的增加/删除行数)
步骤 1.3:自动检测语言与框架
从差异(diff)和配置文件中,识别:
- 语言:从差异(diff)中的文件扩展名检测(例如
.java、.go、.py、.rs、.js、.ts、.kt、.swift、.rb、.php、.cs、.cpp、.c、.scala、.dart等) - 框架:从导入语句/配置文件检测(例如 Spring、Django、Flask、React、Vue、Angular、Gin、Echo、Actix、Express、Next.js 等)
- 构建工具:从配置文件检测(Maven、Gradle、npm、pip、cargo 等)
准备一个 language_context 摘要字符串,例如:
Languages: Java, TypeScript
Frameworks: Spring Boot, React
Build tools: Maven, npm
步骤 1.4:文件风险分类
根据每个变更文件的路径和角色,将其归入一个风险层级:
| 风险层级 | 权重 | 示例 |
|---|---|---|
| Critical(关键) | 3x | 支付/计费、认证/安全、数据迁移、核心业务逻辑、加密、API 网关 |
| High(高) | 2x | 数据库模型/仓储、API 控制器/处理器、中间件、配置、基础设施 |
| Normal(普通) | 1x | 业务逻辑、服务、工具类、UI 组件 |
| Low(低) | 0.5x | 文档、静态资源、生成代码、CI 配置、README |
分类规则:
- 文件路径包含
auth、security、payment、billing、crypto、migration、gateway→ Critical(关键) - 文件路径包含
model、entity、repository、dao、controller、handler、middleware、config、infra→ High(高) - 文件路径包含
test、spec、mock、fixture→ Normal(普通)(测试质量很重要;不要将测试文件视为低风险) - 文件路径包含
doc、README、.md、assets、.generated、.ci、.github→ Low(低) - 其他所有情况 → Normal(普通)
- 如果不确定,归类为 Normal(普通)
准备一个 risk_profile 摘要:
Critical files: 2 (src/auth/jwt.go, src/payment/charge.go)
High files: 3 (src/models/user.go, src/api/handler.go, config/app.yaml)
Normal files: 5
Low files: 2
Overall risk tier: HIGH
步骤 1.5:大差异(diff)处理
统计差异(diff)的总行数。采用以下策略之一:
- 小差异(diff)(≤ 500 行):将完整差异(diff)传给所有代理。无需特殊处理。
- 中等差异(diff)(501–2000 行):传递完整差异(diff),但指示代理优先处理 Critical(关键)和 High(高)风险文件。包含
risk_profile,以便代理知道应该聚焦在哪里。 - 大差异(diff)(2001–5000 行):按文件拆分差异(diff)。将文件分组为 2-3 个分片,在分片 1 中优先放入 Critical/High 文件。每个代理接收所有分片,但被指示深入聚焦分片 1,并以更高层级扫描分片 2-3。
- 超大差异(diff)(> 5000 行):告知用户差异(diff)非常大,并建议分成更小的批次审查。如果用户仍希望进行完整审查,按文件风险层级拆分:
- 第 1 轮:仅审查 Critical + High 文件(完整深度)
- 第 2 轮:审查 Normal 文件(标准深度)
- 跳过:Low 风险文件(在报告中提及它们被跳过)
对于大/超大差异(diff),在代理提示中包含此说明:
NOTE: This is a large diff. Focus your deepest analysis on the files marked as
Critical and High risk. For Normal/Low risk files, only flag P0 and P1 issues.
步骤 1.6:聚焦模式检测
检查用户是否使用 --focus 指定了维度名称:
--focus security→ 仅派发 Agent 2(安全性)--focus security,performance→ 仅派发 Agent 2 + Agent 3--focus correctness,data→ 仅派发 Agent 1 + Agent 5
--focus 的维度名称映射:
| Input keyword | 派发的代理 |
|---|---|
correctness |
Agent 1 |
security |
Agent 2 |
performance |
Agent 3 |
reliability |
Agent 3 |
architecture |
Agent 4 |
data / data-integrity |
Agent 5 |
maintainability |
Agent 6 |
documentation / docs |
Agent 6 |
consistency |
Agent 7 |
observability |
Agent 7 |
如果未指定 --focus,派发全部 7 个代理(默认完整审查)。
步骤 1.7:准备代理输入
准备以下数据传给代理:
diff:完整的统一差异(diff)(对于大差异(diff)则为分片后的差异(diff))language_context:检测到的语言/框架字符串claude_md_rules:相关 CLAUDE.md 文件的内容(或 "No CLAUDE.md found")file_list:变更文件及其路径的列表risk_profile:来自步骤 1.4 的文件风险分类diff_size:差异(diff)总行数及所采用的处理策略
阶段 2:并行深度分析
使用 Agent 工具同时启动代理。在单条消息中发送全部代理,使它们并行运行。
- 完整审查(无
--focus):启动全部 7 个代理 - 聚焦模式:仅启动匹配所聚焦维度的代理
对于每个代理,从 references/agent-<name>.md 读取其参考文件,并通过包含以下内容来构建提示:
- 代理的角色和检查清单(来自参考文件)
diff内容language_contextclaude_md_rulesfile_listrisk_profile
重要:每个代理必须以 JSON 数组形式返回其发现项。指示每个代理在其响应末尾仅输出一个 JSON 数组,格式完全如下:
[
{
"id": "CORR-001",
"dimension": "Correctness",
"severity": "P0",
"file": "path/to/file.ext",
"line": 123,
"summary": "One-line description of the issue",
"description": "Detailed explanation of what is wrong",
"impact": "What happens if this is not fixed",
"fix_suggestion": "Concrete fix recommendation in natural language",
"fix_code": "```lang\n// Suggested code replacement\n```",
"confidence": 85,
"language": "Java"
}
]
字段说明:
fix_suggestion:用自然语言描述如何修复该问题fix_code:在可能的情况下,提供一段展示修正版本的具体代码片段。使用原始代码的语言和风格。如果修复过于依赖上下文而无法用代码表达,则设为""(空字符串)。对于 P0 和 P1 问题,始终尝试提供fix_code。
代理 ID 前缀:
- Agent 1(正确性):
CORR-NNN - Agent 2(安全性):
SEC-NNN - Agent 3(性能与可靠性):
PERF-NNN/REL-NNN - Agent 4(架构与设计):
ARCH-NNN - Agent 5(数据完整性):
DATA-NNN - Agent 6(可维护性与文档):
MAINT-NNN/DOC-NNN - Agent 7(一致性与可观测性):
CONS-NNN/OBS-NNN
代理派发模板:
你是一个专注于 [DIMENSION] 的专业代码审查代理。
## 你的角色
[读取并包含来自 references/agent-<name>.md 的内容]
## 上下文
- 语言与框架:{language_context}
- CLAUDE.md 规则:{claude_md_rules}
## 文件风险分类
{risk_profile}
## 变更文件
{file_list}
## 待审查的差异(diff)
{diff}
## 指令
1. 仔细阅读整个差异(diff)
2. 对于每个变更文件,同时 Read 完整文件以理解变更周围的上下文
3. 优先分析 Critical(关键)和 High(高)风险文件——它们值得最深入的审视
4. 应用你角色定义中的检查清单,适配检测到的语言
5. 对于每个发现项,根据你对它是真实问题的确定程度评估置信度(0-100)
6. 对于 P0 和 P1 发现项,你必须提供包含具体代码修复的 fix_code 字段
7. 对于 P2-P4 发现项,在修复直观明了时提供 fix_code
8. 仅返回你认为是真实问题且置信度 >= 50 的发现项
9. 在响应末尾以 JSON 数组形式输出你的发现项
## 输出格式
返回一个发现项的 JSON 数组。如果未发现问题,返回 []。
每个发现项必须包含:id, dimension, severity (P0-P4), file, line, summary, description, impact, fix_suggestion, fix_code, confidence, language
代理失败处理
在所有代理完成(或超时)后,应用以下规则:
- JSON 解析失败:如果某个代理的响应不包含有效的 JSON 数组,按顺序使用以下回退方式尝试从响应中提取 JSON:
- 查找响应中
[与最后一个]之间的内容 - 查找 ```json 代码围栏内部的内容
- 如果两者均失败,将该代理的输出视为
[](无发现项)并在报告中记录此失败
- 查找响应中
- 代理超时或出错:如果某个代理在分配的时间内未能返回,或返回了错误,将其维度视为
[]并在报告中记录:"Agent X (Dimension) did not complete — results may be incomplete for this dimension" - 部分结果:使用代理实际返回的任何结果继续进行。即使覆盖不完整,审查仍然有价值。报告应清楚地指明哪些维度已被完整分析。
- 所有代理失败:如果全部 7 个代理都失败,告知用户并建议重试或使用更简单的审查范围。
阶段 3:交叉验证与去重
在所有代理完成(或超时)后,处理它们的结果:
步骤 3.1:解析结果
使用上述失败处理规则从每个代理的响应中提取 JSON 数组。跟踪哪些代理返回了有效结果。
步骤 3.2:合并与去重
将所有发现项合并到一个列表中,然后去重:
- 相同文件 + 相同行范围(5 行以内)+ 相同根因 → 保留置信度更高的那个,并记录相互印证
- 合并重复项时,每有一个相互印证的代理,就将存留发现项的置信度提升 +15
步骤 3.3:置信度调整
对每个发现项的置信度评分应用以下调整:
加分项:
- 多代理相互印证:每有一个额外代理标记了同一问题,+15
- 违反明确的 CLAUDE.md 规则:如果该发现项直接违背了某条 CLAUDE.md 指令,+10
- 关键文件:如果问题位于 Critical(关键)风险文件中,+10
- 高风险文件:如果问题位于 High(高)风险文件中,+5
减分项:
- 既有问题:如果问题位于差异(diff)未修改的行上,-30
- 无 CLAUDE.md 依据的纯风格问题:如果纯粹是风格问题且无 CLAUDE.md 支撑,-20
- 可被 Linter/编译器捕获:如果标准 linter 或编译器能捕获此问题,-15
- 低风险文件:如果问题位于 Low(低)风险文件中且严重级别为 P2 或以下,-10
置信度上限为 100,下限为 0。
步骤 3.4:过滤
移除所有调整后置信度 < 60 的发现项。
步骤 3.5:排序
按以下顺序对剩余发现项排序:
- 严重级别(P0 优先)
- 文件风险层级(Critical 优先)
- 置信度(最高优先)
- 维度(正确性 > 安全性 > 性能 > ... > 文档)
阶段 4:报告生成
步骤 4.1:计算总体风险评分
使用以下公式为整个变更计算风险评分(0-100):
risk_score = 0
For each surviving finding:
weight = severity_weight × file_risk_weight × (confidence / 100)
risk_score += weight
Severity weights: P0=25, P1=15, P2=8, P3=3, P4=1
File risk weights: Critical=3, High=2, Normal=1, Low=0.5
Cap risk_score at 100.
将风险评分映射到风险等级:
| Score | 风险等级 | 标签 |
|---|---|---|
| 0 | None | 🟢 无风险 |
| 1-20 | Low | 🟢 低风险 |
| 21-40 | Medium | 🟡 中风险 |
| 41-60 | High | 🟠 高风险 |
| 61-80 | Very High | 🔴 很高风险 |
| 81-100 | Critical | 🔴 严重风险 |
步骤 4.2:生成报告
以中文生成最终报告(依据用户的 CLAUDE.md 规则 #1)。使用以下模板:
# 深度代码审查报告
## 审查信息
- **审查范围**: {scope description}
- **变更文件**: {file_count} 个
- **变更行数**: +{additions} / -{deletions}
- **检测语言**: {languages}
- **检测框架**: {frameworks}
- **审查维度**: {n} 个维度 / {n} 个并行审查代理
- **审查模式**: {全量审查 | 聚焦审查: security, performance | 分片审查(大diff)}
## 变更风险评估
**风险评分**: {score}/100 {risk_emoji} {risk_label}
**风险依据**:
- {1-3 句话解释为什么给出这个风险评分,引用最关键的发现}
**文件风险分布**:
| 风险层级 | 文件数量 | 涉及文件 |
|---------|---------|---------|
| 🔴 关键 | {n} | `file1.ext`, `file2.ext` |
| 🟠 高 | {n} | `file3.ext`, `file4.ext` |
| 🟢 普通 | {n} | (省略列表) |
| ⚪ 低 | {n} | (省略列表) |
## 总体评估
**合并建议**: {recommendation}
- 若存在 P0: "❌ 不建议合并 — 存在严重问题需要修复"
- 若存在 P1 但无 P0: "⚠️ 修复后合并 — 存在高优先级问题"
- 若仅有 P2 及以下: "✅ 可以合并 — 建议关注以下改进点"
- 若无发现: "✅ 可以合并 — 未发现问题"
**问题统计**:
| 级别 | 数量 | 说明 |
|------|------|------|
| P0 严重 | {n} | 合并前必须修复 |
| P1 高 | {n} | 应在合并前修复 |
| P2 中 | {n} | 建议修复或创建跟进 |
| P3 低 | {n} | 建议改进 |
| P4 信息 | {n} | 仅供参考 |
## 发现详情
### P0 严重问题
#### [DR-001] {summary}
- **维度**: {dimension}
- **文件**: `{file}:{line}` ({risk_tier} 风险文件)
- **置信度**: {confidence}/100
- **问题描述**: {description}
- **影响分析**: {impact}
- **修复建议**: {fix_suggestion}
- **建议修复代码**:
{fix_code}
(repeat for each finding, grouped by severity level)
(for P2-P4, fix_code is optional — only include when provided)
## 代码亮点
列出 2-3 处代码做得好的地方。如果代码整体质量良好,明确说明这一点。
本节有助于平衡审查并肯定优秀的工作。
## 维度总结
| 维度 | 状态 | 发现数量 | 简评 |
|------|------|---------|------|
| 正确性 | ✅/⚠️/❌ | {n} | {one-line summary} |
| 安全性 | ✅/⚠️/❌ | {n} | {one-line summary} |
| 性能 | ✅/⚠️/❌ | {n} | {one-line summary} |
| 可靠性 | ✅/⚠️/❌ | {n} | {one-line summary} |
| 架构与设计 | ✅/⚠️/❌ | {n} | {one-line summary} |
| 数据完整性 | ✅/⚠️/❌ | {n} | {one-line summary} |
| 可维护性 | ✅/⚠️/❌ | {n} | {one-line summary} |
| 一致性 | ✅/⚠️/❌ | {n} | {one-line summary} |
| 可观测性 | ✅/⚠️/❌ | {n} | {one-line summary} |
| 文档 | ✅/⚠️/❌ | {n} | {one-line summary} |
Status: ✅ = no issues, ⚠️ = P2-P4 issues only, ❌ = P0 or P1 issues
If an agent failed or timed out, mark its dimensions as:
⏳ = agent did not complete (results may be incomplete)
当代理失败时,在 审查信息 之后添加此小节:
## ⚠️ 审查完整性说明
以下维度的审查代理未能正常返回结果,相关维度的审查可能不完整:
- {dimension}: {failure reason}
建议针对这些维度进行手动审查或重新运行。
如果过滤后没有发现项存留,输出一份简短报告:
# 深度代码审查报告
## 审查信息
(same as above)
## 变更风险评估
**风险评分**: 0/100 🟢 无风险
## 总体评估
**合并建议**: ✅ 可以合并 — 未发现问题
已对代码进行 {n} 个维度的深度审查,未发现需要关注的问题。
## 代码亮点
(list good things about the code)
误报指引
以下情况不是问题——不要将它们纳入发现项:
- 既有问题:位于差异(diff)未修改行上的问题
- Linter/编译器可捕获:标准工具会捕获的问题(类型错误、格式问题、导入问题)。假设 CI 会运行这些工具。
- 有意的变更:在 PR 上下文中明显属于有意为之的行为变更
- 主观偏好:"我会用不同方式来做",但没有具体缺陷
- 琐碎的吹毛求疵:资深工程师在审查中不会标记的问题
- 已被显式抑制:带有显式抑制注释(lint ignore、type ignore 等)的问题
- 测试风格:对测试工具格式、mock 样板风格或 fixture 冗长度的过于严苛的审查。但是,测试正确性、覆盖完整性、断言质量、测试隔离性以及不稳定(flaky)测试模式仍然必须被彻底审查——这些是真实的质量问题,而非风格问题
范围修饰符
用户可以传递参数来自定义审查:
- 无参数:审查
git diff(自动检测最佳差异(diff)范围) <branch>:审查相对于指定分支的差异(diff)<PR#>:按编号审查一个 GitHub PR<file-path>:审查特定文件--staged:仅审查暂存的变更--focus <dims>:仅审查指定的维度(以逗号分隔)。示例:--focus security,performance