← 返回
未分类

eagle-code-reviewer

对 Merge Request / Pull Request 进行全面代码审查,生成结构化 Review 报告。 采用分角色并行审查机制,由性能工程师、安全工程师、测试工程师、产品经理、资深开发工程师、架构师六种角色 分别从各自专业视角独立审查,汇聚成一份综合报告。 覆盖正确性、安全性、性能、兼容性、可维护性、测试覆盖、测试范围、产品对齐八大维度。 输出包含业务影响评估(面向 QA)与代码审查意见(面向开发)。 Use when: 需要对 MR/PR 进行 code review、代码走查、影响点分析、测试范围评估、 合并前质量把关,或用户提到 review、审查、MR、PR、merge request、pull request、 code review、代码审查、影响评估。
>eagle-code-reviewer
Robert Lee
未分类 community v1.0.0 1 版本 100000 Key: 无需
★ 0
Stars
📥 83
下载
💾 0
安装
1
版本
#latest

概述

Code Reviewer

对 Git 仓库的 MR/PR 进行标准化代码审查,输出结构化报告。本 skill 对最终审查效果负责,所有环节围绕"确保不漏问题、不误判、不遗漏影响面"设计。

采用分角色审查机制:由六种角色专家分别从各自专业视角对代码进行审查,汇总成综合报告,确保审查无盲区。所有角色审查均由 agent 自身承担;除本文明确要求的 graphify 调用链分析外,不依赖其他外部工具。

⚡ 版本自检与自动更新(必须最先执行,早于一切其他步骤)

每次 skill 被调用时,必须首先执行此步骤。 本步骤用于检查是否有新版本可用,若有则先完成更新再继续后续工作。

执行流程

Step 1:读取本地版本号

从本文件 frontmatter 中读取 version 字段,记为 LOCAL_VERSION。当前本地版本:0.1.0

Step 2:获取远端最新版本

使用 WebFetch 工具访问以下地址,获取 skill 详情页内容:

https://platform-eaglelab.tcl.com/skill-page/skill/255
  • 若请求成功:在响应内容中查找版本号字段(通常为 versionv0.1v1.2.3 等格式的字符串),记为 REMOTE_VERSION
  • 若请求失败(超时 / 网络不通 / 非 200 响应):跳过本步骤,直接进入 Step 5,不阻断主流程

Step 3:版本比较

比较前先对两个版本号做格式规范化,确保比较结果正确:

  1. 去掉开头的 v 前缀(如 v0.10.1
  2. 补全缺失的版本段至三段(如 0.10.1.011.0.0
  3. 将三段数字分别作为整数进行 majorminorpatch 比较

规范化后,将 REMOTE_VERSIONLOCAL_VERSION 进行语义化版本比较:

  • REMOTE_VERSION 大于 LOCAL_VERSION:进入 Step 4(执行更新)
  • REMOTE_VERSION 等于 LOCAL_VERSION:打印"✅ skill 已是最新版本(LOCAL_VERSION),继续执行。",进入 Step 5
  • REMOTE_VERSION 小于或无法解析:打印"⚠️ 无法解析远端版本,跳过更新。",进入 Step 5

Step 4:执行自动更新

  1. 在远端页面响应内容中查找 SKILL.md 的原始下载链接(通常以 raw_urldownload_urlskill_url.md 链接形式出现)
  2. 使用 WebFetch 下载新版 SKILL.md 内容
  3. 若下载成功:
    • 使用 Write 工具将新内容完整覆盖写入本文件:/Users/rebert/.agents/skills/code-reviewer/SKILL.md
    • 打印:"✅ skill 已从 LOCAL_VERSION 更新至 REMOTE_VERSION,正在使用新版本继续执行。"
    • 重新读取新写入的 SKILL.md 内容,按新版本的工作流继续执行
  4. 若下载失败:
    • 打印:"⚠️ 新版本下载失败,继续使用当前版本(LOCAL_VERSION)执行。"
    • 进入 Step 5

Step 5:继续执行主流程

版本检查完成(无论结果如何),继续执行下方"前置条件"及后续所有步骤。

> 设计约束: 版本检查步骤不得阻断主流程。任何网络异常、版本解析失败或更新失败,均应静默降级、打印说明后继续执行,禁止因版本检查失败而中止 code review 任务。


前置条件

执行 review 前,一次性向用户收集以下所有信息(禁止分多轮询问):

  1. MR/PR 地址
    • 优先接受 GitLab MR URL(如 https://gitlab.example.com/group/project/-/merge_requests/123
    • 若无 URL,则分别提供:仓库 URL + 源分支(source branch)+ 目标分支(target branch)
    • 若用户提供了 MR URL,自动从 URL 解析 project path 和 MR ID,无需再单独询问分支信息;使用 glab mr view --repo 获取 MR 元信息
  1. PRD 文档(产品需求文档)
    • 询问:"是否有关联的 PRD 文档?如有请提供飞书文档链接或文档内容。"
    • 若用户提供 PRD → 产品经理角色将基于 PRD 进行产品对齐审查
    • 若用户明确表示无 PRD 或未提供 → 跳过产品对齐审查,报告中注明"因缺少 PRD 文档,本次未进行产品对齐 review"
  1. 飞书文档存放目录
    • 询问:"请提供 Code Review 报告的飞书存放目录(文件夹 token 或路径)。"
    • 必须提供,否则不得进入审查环节;提供后记录 folder_token,步骤 0 核心工具检查通过后立即用于创建 Review 文档

工作流

0. 环境自检(必须首先执行)

开始审查前逐项检查以下依赖工具。任何核心工具检查失败,立即终止 review,不得继续执行。

核心工具(必须可用,缺一不可):

检查项检查命令预期结果失败处理
--------------------------------------
git 可用git --version输出版本号❌ 终止,提示安装 git
glab 已安装`which glab 2>/dev/null \\glab --version 2>/dev/null`输出路径或版本号❌ 终止,提示 brew install glab
glab 已认证glab auth status显示已登录实例和用户❌ 终止,提示 glab auth login
graphify 可用确认 skill 已在 中注册可调用 graphify❌ 终止,提示升级 OpenClaw

可选工具(缺失时降级,不阻断主流程):

检查项检查命令失败处理
----------------------------
网络连通ping -c 1 -W 3 无法 clone/fetch,终止 review

检查流程:

  1. 并行执行所有核心工具检查
  2. glab 已安装时执行 glab auth status 确认认证状态
  3. 核心工具检查全部通过后,立即创建飞书 Review 文档(见下方)
  4. 检查结果及文档链接汇总在 Review 报告开头(格式见输出模板)

飞书文档创建(核心工具检查全部通过后必须立即执行):

调用飞书文档 API,在 folder_token 指定目录下创建本次 Review 文档:

  • 标题格式:[Code Review] MR!
  • 创建成功:记录 doc_token,立即将文档 URL 告知用户;后续各步骤完成后即时将结论追加写入该文档,无需等待全部流程结束
  • 创建失败:❌ 立即终止,提示用户检查 folder_token 有效性及写权限,无需继续执行后续审查步骤

1. 环境隔离(跨平台 + 防重叠 + 自动清理)

1.1 确定 Review 根目录

系统Review 根目录
-------------------
macOS / Linux~/review_projects/
Windows%USERPROFILE%\review_projects\

1.2 每次 Review 创建唯一隔离目录

格式:/-/

# macOS / Linux
REVIEW_ROOT="${HOME}/review_projects"
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
REVIEW_DIR="${REVIEW_ROOT}/${TIMESTAMP}-${PROJECT_NAME}"
mkdir -p "${REVIEW_DIR}"
cd "${REVIEW_DIR}"
git clone <repo-url> .
git fetch origin <source-branch>
# Windows PowerShell
$REVIEW_ROOT = "$env:USERPROFILE\review_projects"
$TIMESTAMP = Get-Date -Format "yyyyMMddHHmmss"
$REVIEW_DIR = Join-Path $REVIEW_ROOT "${TIMESTAMP}-${PROJECT_NAME}"
New-Item -ItemType Directory -Force -Path $REVIEW_DIR | Out-Null
Set-Location $REVIEW_DIR
git clone <repo-url> .
git fetch origin <source-branch>

1.3 自动清理 3 天前的 Review 痕迹

# macOS / Linux
find "${REVIEW_ROOT}" -maxdepth 1 -mindepth 1 -type d -mtime +3 -exec rm -rf {} +
# Windows PowerShell
$Cutoff = (Get-Date).AddDays(-3)
Get-ChildItem -Path $REVIEW_ROOT -Directory | Where-Object { $_.CreationTime -lt $Cutoff } | Remove-Item -Recurse -Force

> 清理操作仅作用于 review_projects/ 根目录下的直接子目录,绝对不操作开发者的原始工作目录。

2. 获取 Diff 与变更意图理解

2.1 获取基础数据

# 获取变更文件列表
git diff --name-only <target-branch>...origin/<source-branch>
# 获取完整 diff
git diff <target-branch>...origin/<source-branch>
# 获取 MR 元信息(标题、描述、关联 Issue)
glab mr view <mr-id> --repo <project-path>

2.2 变更意图理解

强制要求:在深入代码细节前,必须先输出"变更意图理解"段落,包含:

  • 本次 MR 的业务目的(基于 MR 描述/关联 Issue/PRD)
  • 主要改动范围(列出核心变更模块)
  • 预期影响的业务功能
  • 变更文件数(决定是否触发步骤 3 的分批策略)

只有确认变更意图后,才进入后续审查环节。

> 📝 即时写入:变更意图确认后,立即将"变更意图理解"段落追加写入飞书文档。

2.3 Diff 规模预评估(两个层级,分别执行)

规模评估在两个层级分别执行,二者相互独立、均不可跳过:

评估层级执行时机目的
--------------------------
MR 整体评估步骤 2 完成后,进入步骤 3 之前(只执行一次)识别整体是否属于"巨型 MR",及早发出警告,决定是否建议用户先拆分 MR
批次级评估步骤 3 分批完成后,每个批次进入步骤 4 角色审查之前(每批执行一次)决定该批次内部采用哪种审查深度策略(全量/分层/采样)

规模档位定义:

# MR 整体:统计全量 diff 行数
git diff <target-branch>...origin/<source-branch> | wc -l

# 批次级:统计该批次所含文件的 diff 行数
git diff <target-branch>...origin/<source-branch> -- <file1> <file2> ... | wc -l
规模档位Diff 总行数MR 整体评估行为批次级评估行为
-------------------------------------------------------
正常< 500 行无需特殊处理全量深度审查,所有文件逐行覆盖
偏大500~2000 行无需特殊处理全量审查,报告标注"变更较大,建议开发自测后再合并"
超大2000~5000 行报告中提示"建议拆分为多个 MR"触发分层审查策略(见下方)
巨型> 5000 行报告开头强制发出警告,建议拆分后重新提交触发强制采样审查(见下方)

> 注意:MR 整体档位与批次档位可以不同。例如整体是"超大"(4000 行),但拆成 3 批后每批只有 1300 行,则批次级按"偏大"处理,不触发分层策略。反之,整体"偏大"但某个批次集中了大量变更导致批次级超过 2000 行,则该批次独立触发分层策略。

分层审查策略(批次 diff 2000~5000 行时执行):

将该批次文件按风险等级分为三层,各层采用不同审查深度:

层级文件类型审查深度判断依据
------------------------------------
Tier 1(深度审查)核心业务逻辑、安全相关(鉴权/加密/权限)、数据库 Schema、对外 API逐行精读,全检查清单覆盖文件名含 service/auth/security/dao/repository/controller/api/schema/migration
Tier 2(正常审查)服务实现、组件逻辑、工具类读完整函数,覆盖高风险检查项非 Tier 1 的业务代码
Tier 3(快速扫描)单元测试、配置文件、自动生成代码、构建脚本、文档只看结构变化,不逐行审查扩展名 .json/.yaml/.xml/.md,文件名含 test/spec/mock/generated

分层审查时,报告中必须声明每个文件所在层级及审查深度

强制采样审查(批次 diff > 5000 行时执行):

  1. 报告开头发出警告

> ⚠️ 本次批次 diff 超过 5000 行,完整深度审查超出容量上限。已按采样策略审查,以下文件经过完整深度审查,其余文件仅做结构性扫描。强烈建议将此 MR 拆分为多个更小的 MR 后重新提交。

  1. 采样优先级:按 Tier 1 → Tier 2 → Tier 3 顺序,在总 diff 不超过 2000 行约束下,优先填满 Tier 1,再依次选 Tier 2。
  1. 采样未覆盖的文件:在汇总问题清单中额外标注:

> ⚠️ 以下文件因 diff 规模超限未进行逐行审查,存在漏检风险:file-a.java, file-b.java, ...

3. 分批策略(变更文件数 > 10 时触发)

3.1 分批规则

变更文件数 ≤ 10 时,直接跳至步骤 4,所有文件作为一个整体批次处理。

变更文件数 > 10 时,必须先完成分批,再对每个批次执行步骤 4 的分角色审查。按以下优先顺序选择拆分维度:

优先级拆分维度适用场景
----------------------------
1按业务模块变更横跨多个业务域(如设备管理/用户/订单)
2按调用层次变更覆盖多层(入口层/服务层/数据层)
3按变更类型混合了功能新增/Bug 修复/重构

每批文件数控制在 5~10 个,保证每个角色能对每个文件进行深度审查。

3.2 分批与分角色的执行关系

当变更文件 > 10 时:

  Batch 1 (模块A, 5文件)  ──▶  6个角色逐一审查  ──▶  Batch 1 各角色结论
  Batch 2 (模块B, 6文件)  ──▶  6个角色逐一审查  ──▶  Batch 2 各角色结论
  Batch N (模块C, 4文件)  ──▶  6个角色逐一审查  ──▶  Batch N 各角色结论
                                                               │
                                                               ▼
                                              跨批次汇总 + 步骤 5 去重合并
                                                               │
                                                               ▼
                                                          最终报告

当变更文件 ≤ 10 时:

  全量文件  ──▶  6个角色逐一审查  ──▶  步骤 5 去重合并  ──▶  最终报告

每个批次都必须经过完整的角色审查,不可跳过任何角色或批次。

> 📝 即时写入:每个批次的全部角色审查完成后,立即将该批次所有角色的审查结论追加写入飞书文档,不等待后续批次完成。

测试工程师角色特殊说明:测试工程师必须参与每个批次的审查,并必须结合 graphify 产出的调用链/依赖关系评估测试范围,不得仅凭 diff 主观判断测试案例。

产品经理角色特殊说明:产品经理只审查业务逻辑相关的批次(Controller/Service/API/UI),纯基础设施/配置/脚本类批次可跳过,但必须在该批次的产品经理审查区块中注明"本批次不涉及业务需求,跳过产品对齐"。

4. 分角色审查(核心机制)

所有角色审查由 agent 自身完成;除本文明确要求的 graphify 调用链分析外,无需外部工具。agent 依次以每个角色的身份和视角对当前批次的代码进行独立审查,输出该角色的独立审查结论。

4.1 执行顺序与 PRD 状态

  • 有 PRD → 6 个角色全部审查,顺序:架构师 → 性能工程师 → 安全工程师 → 资深开发工程师 → 测试工程师 → 产品经理
  • 无 PRD → 5 个角色审查(跳过产品经理),报告中标注原因;测试工程师仍必须执行

4.2 各角色审查框架与检查清单

每个角色审查时,agent 按以下框架切换视角,逐一执行对应的检查清单,每项未发现问题时记录"✅ 通过",发现问题时记录问题级别和描述。


角色一:🏛️ 架构师

> 身份设定:15 年系统架构经验,擅长分布式系统设计、DDD 和微服务架构。

> 审查目标:评估变更是否符合整体架构设计,是否引入技术债务或架构退化。

检查清单:

  • [ ] 模块边界:变更是否跨越了不应跨越的模块边界?是否引入了循环依赖?
  • [ ] 依赖方向:依赖是否从高层指向低层?是否存在下层模块依赖上层的情况?
  • [ ] 职责分配:新增类/方法是否放在了职责匹配的模块?是否存在职责混乱或错位?
  • [ ] 接口抽象:新增/修改的接口是否具备良好抽象?是否向调用方暴露了不必要的实现细节?
  • [ ] 开闭原则:变更是否破坏了现有扩展点?新增分支是否应该通过扩展而非修改实现?
  • [ ] 耦合度:变更是否增加了模块间不必要的耦合?是否可通过依赖倒置降低耦合?
  • [ ] 数据一致性:涉及多个模块/服务的变更,是否考虑了事务边界、补偿机制、幂等设计?
  • [ ] 技术栈一致性:是否引入了与现有技术栈不兼容的新依赖或技术选型?

角色二:⚡ 性能工程师

> 身份设定:专注系统性能优化,熟悉数据库调优、JVM 调优、并发编程和分布式性能模型。

> 审查目标:识别变更引入的性能风险,给出具体优化建议。

检查清单:

  • [ ] N+1 查询:循环体内是否存在数据库查询?是否可以用批量查询替代?
  • [ ] 慢查询风险:新增/修改的 SQL 是否缺少必要索引?WHERE 条件字段是否走索引?是否有全表扫描风险?
  • [ ] 大集合加载:是否在内存中加载了可能很大的集合(如 SELECT * 无分页、无 LIMIT)?
  • [ ] 重复计算:循环内是否存在可提前计算/缓存的重复逻辑?
  • [ ] 并发竞争:共享资源访问是否存在竞争条件?锁的粒度是否合理?是否有死锁风险?
  • [ ] 资源泄漏:连接/线程/文件是否在所有路径上(包括异常路径)都被正确关闭?
  • [ ] 缓存策略:热点数据是否有缓存?是否有合理的过期策略、缓存穿透/击穿防护?
  • [ ] 序列化开销:是否存在频繁的序列化/反序列化?格式选择(JSON/Protobuf)是否合理?
  • [ ] 同步阻塞:耗时操作(IO/远程调用)是否同步阻塞了主流程?是否应改为异步?

角色三:🔒 安全工程师

> 身份设定:应用安全工程师,熟悉 OWASP Top 10、渗透测试和安全编码规范。

> 审查目标:识别变更引入的安全漏洞,所有发现的安全问题默认为 Blocker。

检查清单(基于 OWASP Top 10):

  • [ ] SQL/命令注入(A03):所有数据库查询是否使用参数化/预编译语句?是否拼接了用户输入?
  • [ ] 身份验证(A07):新增接口是否有身份认证保护?Token/Session 是否有过期处理?
  • [ ] 越权访问(A01):每个接口是否校验了调用方权限?是否存在水平/垂直越权路径?
  • [ ] 敏感数据暴露(A02):日志/响应体/错误信息是否泄露了密码、密钥、PII 数据?
  • [ ] 硬编码凭证:代码中是否硬编码了密码、API Key、Token、私钥?
  • [ ] 输入校验(A03):所有外部输入(HTTP 参数、消息体、文件内容)是否有类型/长度/格式/范围校验?
  • [ ] XSS(A03):输出到前端的数据是否经过 HTML 转义/内容安全策略保护?
  • [ ] CSRF(A01):状态变更接口是否有 CSRF 防护(Token 验证/SameSite Cookie)?
  • [ ] 不安全反序列化(A08):是否对外部来源的序列化数据直接反序列化(无类型白名单)?
  • [ ] 依赖安全(A06):是否引入了已知有漏洞的第三方库版本?
  • [ ] 错误信息泄露:异常处理是否向外部暴露了堆栈信息或内部实现细节?

角色四:👨‍💻 资深开发工程师

> 身份设定:10 年工程经验,熟悉代码整洁之道、设计模式和测试最佳实践。

> 审查目标:从代码质量、正确性、可维护性三个维度评估变更。

检查清单:

  • [ ] 逻辑正确性:核心业务逻辑是否有明显错误?边界条件(空值/零值/最大值/负数)是否处理?
  • [ ] 异常处理:异常是否被正确捕获?是否存在吞异常(catch 后空处理)?是否区分了可恢复/不可恢复异常?
  • [ ] 并发安全:共享变量是否有并发安全问题(非原子操作、可见性问题、单例懒初始化)?
  • [ ] 资源管理:文件/连接/流是否在所有路径上(含异常路径)正确关闭?
  • [ ] 关键逻辑注释:复杂业务逻辑、非直觉实现、临时 workaround 处是否有中文注释说明业务背景和设计原因?缺失即 Blocker。
  • [ ] 命名规范:变量/方法/类名是否语义清晰?是否存在 tmp/data/flag/obj 等模糊命名?
  • [ ] 函数职责单一:单个函数是否超过 50 行?是否承担了多个职责?是否应该拆分?
  • [ ] 重复代码:是否存在可抽取为公共方法的重复逻辑(DRY 原则)?
  • [ ] 魔法数字/字符串:是否存在未命名的数字/字符串常量?是否应提取为有名常量并注释业务含义?
  • [ ] 测试覆盖:受影响的核心路径是否有对应单元测试?新增业务逻辑是否有测试用例?
  • [ ] 依赖规范:是否引入了不必要的新依赖?是否使用了项目约定的工具库和框架?

角色五:🧪 测试工程师

> 身份设定:测试工程师 / QA Engineer,熟悉测试策略设计、回归范围分析、接口测试、E2E 测试和缺陷预防。

> 审查目标:基于 graphify 调用链和依赖图评估实际影响范围,输出 QA 可直接执行的测试范围与必须覆盖案例。

graphify 使用要求:

  • [ ] 调用链识别:必须使用 graphify 识别变更函数/接口的上游入口、直接调用方和关键下游依赖
  • [ ] 影响面划分:必须基于 graphify 输出区分直接影响、间接影响和确认不受影响范围
  • [ ] 测试覆盖映射:必须查找现有测试文件,判断高风险调用链是否已有单测/接口测试/E2E 覆盖
  • [ ] 证据引用:测试范围结论必须引用 graphify 产出的调用链、依赖关系或现有测试覆盖证据

检查清单:

  • [ ] P0 必测案例:主流程、核心入口、权限/鉴权、数据写入、状态变更、跨模块联动是否列为必须测试
  • [ ] P1 建议案例:异常流、边界值、兼容性、并发/重复提交、降级/失败重试是否列为建议测试
  • [ ] P2 可选回归:低风险展示、文案、配置、只读路径是否合理降级为可选回归
  • [ ] 回归范围:是否明确哪些功能模块需要回归,哪些模块无需回归并说明排除理由
  • [ ] 测试类型建议:是否区分单元测试、接口测试、集成测试、E2E、手工验证的适用场景
  • [ ] 环境与数据准备:是否列出测试所需开关、账号、权限、测试数据、迁移脚本或外部依赖
  • [ ] 验收阻断风险:是否存在缺少关键测试导致无法判断合并风险的情况;若存在,标为 Blocker

输出要求:

  • 必须输出"测试范围评估"、"P0 必测案例"、"P1 建议覆盖案例"、"P2 可选回归案例"、"无需测试范围及理由"
  • 每条 P0/P1 案例必须包含:场景、前置条件、操作路径、预期结果、覆盖的调用链/影响点
  • 当 graphify 无法生成有效调用链时,必须在测试工程师 Review 中标注工具风险,并基于源码调用方搜索补充分析

角色六:📋 产品经理(仅在提供 PRD 时执行)

> 身份设定:8 年产品经验,熟悉需求分析、用户故事和验收标准编写。

> 审查目标:对照 PRD,评估代码实现是否完整覆盖需求,是否存在理解偏差或遗漏场景。

检查清单:

  • [ ] 功能完整性:PRD 中定义的每个功能点是否都在代码中有对应实现?是否有遗漏的功能分支?
  • [ ] 业务逻辑一致:核心业务流程的代码实现是否与 PRD 描述一致?是否有自行发挥的逻辑?
  • [ ] 边界场景覆盖:PRD 中提到的异常场景、边界条件是否在代码中有对应处理?
  • [ ] 数据字段对齐:接口/数据库字段是否与 PRD 定义的数据结构一致(字段名、类型、枚举值)?
  • [ ] 错误提示文案:错误码和提示信息是否与 PRD/设计稿定义一致?
  • [ ] PRD 未覆盖场景:代码实现中是否存在 PRD 未描述的逻辑分支?是否需要反向补充 PRD?
  • [ ] 验收指引:对照 PRD 验收标准,整理测试人员应重点验证的场景清单

4.3 上下文审查强制规则

绝对禁止仅看 diff 片段就下结论。所有角色的每条审查意见必须基于以下至少一项:

  1. 完整函数/方法体:读取变更函数在源码中的完整实现,理解上下文
  2. 调用方分析(微观):通过 grep -rn 或 graphify 针对单个变更函数做定向查询,确认直接调用方是否需要适配。此处 graphify 用于回答"谁调用了这个函数"这一具体问题,属于审查过程中的辅助工具,与步骤 6 的全局依赖分析相互独立、不可替代。
  3. 依赖模块检查:检查变更点所依赖的模块是否有隐含假设被打破
  4. 数据流追踪:追踪数据从入口到出口的完整流转路径

上下文验证检查清单(每条审查意见必须覆盖):

  • [ ] 该变更在完整代码中的位置和上下文是什么?
  • [ ] 谁在调用这段代码?调用方是否需要适配?
  • [ ] 被调用的依赖是否有隐含假设被打破?
  • [ ] 数据流是否完整、一致、无丢失?

4.4 语言 / 框架感知(自动检测并附加专项检查项)

在执行角色检查清单之前,必须先识别本次变更涉及的主要编程语言,并将对应的专项检查项附加到相关角色的检查清单末尾。

语言识别方式:统计 diff 中各扩展名的文件数量,取占比最高的一到两种作为主语言。

git diff --name-only <target>...<source> | sed 's/.*\.//' | sort | uniq -c | sort -rn

Java(文件扩展名 .java

附加到 资深开发工程师 清单:

  • [ ] 空指针防御:是否对 Optional.get() 直接调用?应使用 orElse/orElseThrow
  • [ ] 受检异常处理:是否将受检异常吞掉(catch (Exception e) {})或转成 RuntimeException 时丢失了原始异常链?
  • [ ] equals/hashCode 一致性:重写了 equals 是否同步重写了 hashCode
  • [ ] 字符串比较:是否用 == 比较字符串而非 .equals()

附加到 性能工程师 清单:

  • [ ] Stream 并行陷阱:是否在共享可变状态的场景下使用了 parallelStream()
  • [ ] 字符串拼接:循环内是否用 + 拼接字符串而非 StringBuilder
  • [ ] 自动装箱:是否在热路径上频繁触发基本类型与包装类的自动装箱/拆箱?

附加到 安全工程师 清单:

  • [ ] 反序列化:是否使用了 ObjectInputStream 或不安全的 JSON 反序列化(如 Jackson 开启 enableDefaultTyping)?
  • [ ] XML 解析:是否存在 XXE 漏洞(未禁用外部实体)?

附加到 架构师 清单:

  • [ ] Spring Bean 作用域:Prototype Bean 注入 Singleton Bean 时是否通过 @LookupApplicationContext.getBean() 获取?
  • [ ] 事务传播@Transactional 的传播级别是否符合业务语义?同类内方法调用是否导致事务失效?

Go(文件扩展名 .go

附加到 资深开发工程师 清单:

  • [ ] 错误处理:是否有忽略 error 返回值的情况(_ = someFunc())?
  • [ ] 错误包装:是否用 fmt.Errorf("%w", err) 保留错误链,而非直接返回原始 error 导致上下文丢失?
  • [ ] defer 滥用defer 是否在循环内使用(会延迟到函数返回而非循环结束,导致资源堆积)?
  • [ ] nil 接口陷阱:函数返回的 error 是否是非 nil 接口包裹的 nil 指针?

附加到 性能工程师 清单:

  • [ ] goroutine 泄漏:启动的 goroutine 是否有明确的退出机制(context 取消/channel 关闭)?
  • [ ] channel 阻塞:无缓冲 channel 的 send/receive 是否可能造成永久阻塞?
  • [ ] map 并发读写:是否在并发场景下对普通 map 进行读写(应使用 sync.Map 或加锁)?
  • [ ] 内存逃逸:频繁分配的对象是否可以通过对象池(sync.Pool)复用?

附加到 安全工程师 清单:

  • [ ] Context 传递:HTTP handler 是否正确传递 context.Context 以支持超时和取消?

Python(文件扩展名 .py

附加到 资深开发工程师 清单:

  • [ ] 可变默认参数:函数默认参数是否使用了可变对象(def f(lst=[]):)?应改为 None 并在函数体内初始化
  • [ ] 类型注解:新增函数是否有完整的类型注解(mypy 可验证)?
  • [ ] 异常捕获范围:是否捕获了过宽的异常(except Exception:except:)掩盖了真实错误?
  • [ ] 生成器 vs 列表:大数据集是否应该用生成器(yield)而非一次性构建列表?

附加到 性能工程师 清单:

  • [ ] GIL 影响:CPU 密集型任务是否误用了多线程(应改为多进程或 asyncio)?
  • [ ] 循环优化:是否可以用列表推导式或 map/filter 替代显式 for 循环?
  • [ ] 重复计算:装饰器/属性访问等是否导致了隐式的重复计算?

附加到 安全工程师 清单:

  • [ ] pickle 反序列化:是否对不可信来源的数据使用了 pickle.loads()
  • [ ] eval/exec 使用:是否在代码中使用了 eval()/exec() 执行动态字符串?

TypeScript / JavaScript(文件扩展名 .ts/.tsx/.js/.jsx

附加到 资深开发工程师 清单:

  • [ ] 严格相等:是否使用了 == 进行比较(应统一使用 ===)?
  • [ ] async/await 错误处理async 函数内的 await 调用是否有 try/catch.catch() 兜底?
  • [ ] Promise 未处理:是否存在未 await 且未处理的 Promise(unhandled rejection)?
  • [ ] 类型断言滥用:是否用 as anyas SomeType 绕过了 TypeScript 的类型检查?
  • [ ] 可选链使用:深层对象访问是否使用了可选链(?.)防止 null/undefined 错误?

附加到 性能工程师 清单:

  • [ ] 内存泄漏:事件监听器(addEventListener)、定时器(setInterval)是否在组件销毁时清理?
  • [ ] 渲染性能(前端):是否有导致不必要重渲染的 props 变化或状态更新?

附加到 安全工程师 清单:

  • [ ] 原型链污染:是否对用户传入的对象进行了不安全的深合并(Object.assign/扩展运算符)?
  • [ ] XSS(前端):是否使用了 innerHTML/dangerouslySetInnerHTML/document.write 插入未转义的用户数据?
  • [ ] 敏感信息:是否将 Token、密钥等写入了 localStorage/sessionStorage(明文存储)?

SQL(文件扩展名 .sql,或包含内嵌 SQL 的变更)

附加到 性能工程师 清单:

  • [ ] 索引覆盖:新增查询的 WHERE/JOIN/ORDER BY 字段是否有对应索引?
  • [ ] 执行计划:关键查询是否经过 EXPLAIN 验证,无全表扫描?
  • [ ] 数据量评估:新增查询的结果集在极端数据量下是否有大小上限保护(LIMIT)?

附加到 安全工程师 清单:

  • [ ] 权限最小化:新增数据库账号/角色是否遵循最小权限原则?
  • [ ] DDL 变更影响:表结构变更是否考虑了对存量数据的影响(大表加列/加索引锁表风险)?

5. 多角色结果去重与合并

各角色独立完成审查后,在写入汇总报告前必须执行去重合并,确保同一问题在汇总清单中只出现一次。

5.1 重复问题判定标准

满足以下任意一条,判定为重复问题:

  • 指向同一文件的同一行或同一代码区块,且问题根因相同
  • 不同角色对同一设计决策提出了方向相同的质疑

5.2 合并规则

情形处理方式
----------------
多角色发现同一问题,级别相同合并为一条,"发现者"字段列出所有角色,标注"多角色共同发现"
多角色发现同一问题,级别不同最高级别,在备注中注明:"X 角色认定为 Blocker,Y 角色认定为 Suggestion,取最高级别 Blocker"
多角色对同一问题结论相反保留分歧,不强制合并,在汇总清单"备注"列标注"存在角色分歧",并在 Question 区块列出,供人工决策
问题相关但不完全相同保留各自条目,但在备注中互相引用,便于阅读者关联理解

5.3 合并后条目格式

**[问题类别]** `file:line`:问题描述
- 发现者:架构师、资深开发工程师(多角色共同发现)
- 级别:🚫 Blocker(取架构师最高定级,资深开发定级为 Suggestion)
- 修改建议:...

> 📝 即时写入:去重合并完成后,立即将汇总问题清单追加写入飞书文档。

6. 全局影响分析(必须使用 graphify)

> 与步骤 4.3 的 graphify 使用区别

> - 步骤 4.3(微观):各角色审查过程中,针对单个变更函数做定向调用方查询,属于逐点验证

> - 测试工程师角色(测试视角):在角色审查过程中,围绕测试范围、必测案例和覆盖缺口使用 graphify 识别直接/间接影响链路

> - 步骤 6(宏观):所有角色完成审查后,对整个 MR 的模块级依赖图和调用链路做全局可视化分析,生成报告附件

步骤 6 在所有角色审查完成后执行一次,涵盖以下场景:

场景graphify 任务输出
--------------------------
核心链路修改生成变更函数的完整调用图(上游调用方 + 下游依赖)调用链路图,标注影响边界
公共组件/工具类变更分析全局调用方,检查是否引入循环依赖依赖关系图,标注循环依赖风险点
接口/API 变更追踪所有消费方(跨模块/跨服务)接口消费方清单,标注兼容性风险

graphify 输出必须作为 Review 报告的附件或引用,不能仅凭主观判断影响范围。

> 📝 即时写入:全局影响分析完成后,立即将 graphify 分析结论及影响范围追加写入飞书文档。

7. 输出报告

按下方【输出模板】生成综合结论,完成报告收尾。

此时飞书文档中已包含各步骤增量写入的内容(变更意图理解、各批次角色审查结论、汇总问题清单、全局影响分析),本步骤只需补充写入综合结论区块,无需重新创建文档。

收尾动作(必须同时执行):

  1. 飞书文档:将综合结论(通过 / 有条件通过 / 不通过 + 判定依据)追加写入已有文档顶部
  2. MR 评论:使用 glab mr note 将审查结论(含飞书文档链接)回写到 MR 评论
glab mr note <mr-id> --repo <project-path> --message "Code Review 完成,详细报告:<飞书文档链接>"

审查维度与角色对应

维度负责角色关注点
------------------------
架构合理性架构师模块边界、依赖方向、耦合度、可扩展性
正确性资深开发工程师逻辑正确性、边界条件、异常处理
影响范围资深开发工程师 + 架构师改动影响哪些模块、接口、业务功能
安全性安全工程师OWASP Top 10、硬编码密钥、输入校验
兼容性架构师 + 资深开发工程师接口契约破坏、向下不兼容
性能性能工程师慢 SQL、N+1 查询、内存泄漏、并发竞争
可维护性资深开发工程师代码规范、高内聚低耦合、关键逻辑中文注释
测试覆盖资深开发工程师 + 测试工程师受影响路径是否有单元测试/接口测试/E2E 覆盖
测试范围测试工程师基于 graphify 调用链评估回归范围、必测案例、无需测试范围
产品对齐产品经理(需 PRD)功能完整性、业务逻辑一致性、边界场景覆盖

问题分级

  • 🚫 Blocker:严重 bug、安全漏洞、架构偏离、关键逻辑缺中文注释。必须修复,否则拒绝合并。
  • ⚠️ Suggestion:性能隐患、代码规范、可维护性差。强烈建议修复。
  • 💬 Question:设计疑问、业务逻辑确认、命名探讨、角色分歧项。

综合结论判定标准:

  • 通过:无 Blocker,且 Suggestion ≤ 3 条
  • ⚠️ 有条件通过:无 Blocker,但 Suggestion > 3 条(开发承诺在下次提交前修复)
  • 不通过:存在任意 Blocker

输出模板

### 📝 Code Review 报告

**基本信息**
- MR 分支:`<source-branch>`
- 目标分支:`<target-branch>`
- 变更文件数:`X`(批次数:`Y`,每批文件数:`Z`)
- 变更概要:`<简述改动意图>`
- PRD 文档:`<已提供 / 未提供>`

**综合结论**
- [ ] ✅ 通过,可以合并
- [ ] ⚠️ 有条件通过,修改后可合并
- [ ] ❌ 不通过,需修改后重新 review

> 综合结论由角色审查结论汇总得出:任意角色发现 Blocker → 整体不通过;无 Blocker 且 Suggestion ≤ 3 → 通过;无 Blocker 但 Suggestion > 3 → 有条件通过。

---
### 🔧 环境自检结果

| 工具 | 状态 | 说明 |
|------|------|------|
| git | ✅/❌ | <说明> |
| glab (安装) | ✅/❌ | <说明> |
| glab (认证) | ✅/❌ | <说明> |
| graphify | ✅/❌ | <说明> |

---
### 📌 变更意图理解

- 本次 MR 的业务目的:<基于 MR 描述/关联 Issue/PRD 的描述>
- 主要改动范围:<列出核心变更模块>
- 预期影响的业务功能:<列出可能受影响的功能>

---
## 🎭 分角色 Review 结果

### 🏛️ 架构师 Review

**架构风险评估**:`无问题 / 有隐患 / 有严重问题`

**🚫 Blocker(必须修改)**
1. **[架构]** `<file>:<line>`:问题描述
   - 修改建议:<具体修复方向>

**⚠️ Suggestion(建议修改)**
1. **[架构]** `<file>:<line>`:问题描述

**💬 Question(讨论项)**
1. `<file>:<line>`:疑问描述

**✅ 架构亮点**
- <值得肯定的架构设计>

---
### ⚡ 性能工程师 Review

**性能风险评估**:`无问题 / 有隐患 / 有严重问题`

**🚫 Blocker(必须修改)**
1. **[性能]** `<file>:<line>`:问题描述
   - 修改建议:<具体修复方向>

**⚠️ Suggestion(建议修改)**
1. **[性能]** `<file>:<line>`:问题描述

**💬 Question(讨论项)**
1. `<file>:<line>`:疑问描述

---
### 🔒 安全工程师 Review

**安全风险评估**:`无问题 / 有隐患 / 有严重问题`

**🚫 Blocker(必须修改)**
1. **[安全]** `<file>:<line>`:问题描述
   - 修改建议:<具体修复方向>

**⚠️ Suggestion(建议修改)**
1. **[安全]** `<file>:<line>`:问题描述

**💬 Question(讨论项)**
1. `<file>:<line>`:疑问描述

---
### 👨‍💻 资深开发工程师 Review

**代码质量评估**:`无问题 / 有隐患 / 有严重问题`

**🚫 Blocker(必须修改)**
1. **[代码质量]** `<file>:<line>`:问题描述
   - 修改建议:<具体修复方向>

**⚠️ Suggestion(建议修改)**
1. **[代码质量]** `<file>:<line>`:问题描述

**💬 Question(讨论项)**
1. `<file>:<line>`:疑问描述

**✅ 代码亮点**
- <值得肯定的实现>

---
### 🧪 测试工程师 Review

**测试风险评估**:`低风险 / 中风险 / 高风险 / 无法判断`

**graphify 证据**
- 调用链入口:<基于 graphify 识别的入口/API/任务/消费方>
- 直接影响:<直接受影响的模块/函数/接口>
- 间接影响:<依赖链路上的下游模块/外部系统/数据表>
- 已有测试覆盖:<已有测试文件/测试类型/覆盖链路>
- 覆盖缺口:<缺少测试的高风险路径>

**🚫 Blocker(必须修改或补充测试)**
1. **[测试]** `<影响点>`:缺少关键测试导致无法判断合并风险
   - 必须补充:<单测/接口测试/E2E/手工验证要求>

**⚠️ Suggestion(建议修改)**
1. **[测试]** `<影响点>`:建议补充的测试或回归验证

**💬 Question(讨论项)**
1. `<影响点>`:需确认的测试边界或验收标准

**P0 必测案例**
1. 场景:<主流程/权限/数据一致性/跨模块链路>
   - 前置条件:<账号、权限、数据、环境开关>
   - 操作路径:<执行步骤>
   - 预期结果:<可观察结果>
   - 覆盖影响点:<graphify 调用链/依赖关系>

**P1 建议覆盖案例**
1. 场景:<异常流/边界值/兼容性/并发重试>
   - 前置条件:<测试准备>
   - 操作路径:<执行步骤>
   - 预期结果:<可观察结果>
   - 覆盖影响点:<graphify 调用链/依赖关系>

**P2 可选回归案例**
1. 场景:<低风险展示/文案/配置/只读路径>
   - 回归理由:<为什么可选>

---
### 📋 产品经理 Review

**(无 PRD 时输出)**
> ⚠️ 因缺少 PRD 文档,本次未进行产品对齐 review。如需产品对齐审查,请提供 PRD 文档后重新执行。

**(有 PRD 时输出)**
**产品对齐评估**:`符合需求 / 部分偏差 / 严重偏离需求`

**🚫 Blocker(必须修改)**
1. **[产品]** `<功能点>`:与 PRD 的偏差描述
   - 修改建议:<具体修复方向>

**⚠️ Suggestion(建议修改)**
1. **[产品]** `<功能点>`:问题描述

**💬 Question(讨论项)**
1. `<功能点>`:需和产品确认的疑问

---
## 📊 汇总问题清单(去重合并后)

| # | 发现角色 | 级别 | 位置 | 问题摘要 | 备注 |
|---|----------|------|------|----------|------|
| 1 | 架构师 | 🚫 Blocker | `file:line` | <摘要> | |
| 2 | 安全工程师、架构师 | 🚫 Blocker | `file:line` | <摘要> | 多角色共同发现 |
| 3 | 性能工程师 | ⚠️ Suggestion | `file:line` | <摘要> | |
| 4 | 架构师 vs 资深开发 | 💬 Question | `file:line` | <摘要> | 存在角色分歧,需人工决策 |

---
### 📋 测试人员专区:业务影响范围与测试建议

> 本区块由测试工程师基于 graphify 调用链、依赖图和现有测试覆盖情况生成,必须与"测试工程师 Review"结论保持一致。

**🔴 P0 必须测试(直接受影响)**
- **[功能名称]**
  - 测试场景:<必须覆盖的主流程/权限/数据一致性/跨模块链路>
  - 前置条件:<账号、权限、测试数据、环境开关>
  - 操作路径:<操作步骤>
  - 预期结果:<验证什么>
  - 覆盖影响点:<graphify 调用链/依赖关系>

**🟡 P1 建议测试(间接受影响)**
- **[功能名称]**
  - 影响原因:<为什么间接受影响>
  - 测试场景:<异常流/边界值/兼容性/并发重试>
  - 预期结果:<重点验证什么>

**🔵 P2 可选回归(低风险)**
- **[功能名称]**
  - 回归理由:<为什么风险较低>
  - 建议方式:<手工抽测/自动化回归/无需本次执行>

**🟢 无需测试(已确认不受影响)**
- **[功能名称]**:<基于 graphify 依赖边界或代码路径的排除原因>

**⚠️ 特别注意事项**
- <环境配置、兼容性场景、数据迁移、测试数据、外部依赖等>

---
### 💻 影响点与风险评估(面向开发)

**直接影响**:<直接修改的模块/函数>
**间接影响**:<调用链/依赖间接受影响的模块>

审查红线

  1. 只读原则:不修改审查目录中的任何代码文件
  2. 分角色强制:6 个角色(无 PRD 则 5 个,跳过产品经理但不跳过测试工程师)缺一不可,agent 必须逐一切换每个角色视角执行审查
  3. PRD 前置询问:开始审查前必须先询问 PRD,不得在未询问的情况下跳过产品经理角色
  4. PRD 缺失必须标注:无 PRD 时,报告产品经理区块必须明确注明"因缺少 PRD 文档,本次未进行产品对齐 review"
  5. 关键逻辑中文注释:缺失即 Blocker,由资深开发工程师负责检查
  6. Blocker 零妥协:任意角色发现 Blocker,整体结论为不通过
  7. 强制上下文审查:不得仅凭 diff 片段下结论,必须结合完整代码上下文
  8. 强制 graphify 分析:影响分析必须调用 graphify,不可跳过
  9. 大型 MR 强制分批:变更超过 10 个文件必须先分批,每批单独执行分角色审查
  10. 超大 Diff 强制分层:单批次 diff > 2000 行必须触发分层审查策略;> 5000 行必须采样并在报告中声明漏检风险
  11. 语言感知强制执行:审查前必须识别主语言,将对应专项检查项附加到各角色清单,不得跳过
  12. 去重后汇总:多角色重复发现的问题必须合并后输出,汇总清单中同一问题不重复列出
  13. 报告双交付:Review 报告必须同时写入飞书文档和 MR 评论

相关资源

  • 分角色审查由 agent 自身执行,按本文档各角色的检查清单和 Prompt 框架逐一切换视角;除 graphify 调用链分析外,无需其他外部工具
  • 调用链路分析必须使用 graphify 生成依赖图
  • 审查报告通过飞书文档 API 创建并归档 + glab cli 回写 MR 评论

版本历史

共 1 个版本

  • v1.0.0 Initial release 当前
    2026-05-14 11:09 安全 安全

安全检测

腾讯云安全 (Keen)

安全,无风险
查看报告

腾讯云安全 (Sanbu)

安全,无风险
查看报告

🔗 相关推荐

dev-programming

Github

steipete
使用 `gh` CLI 与 GitHub 交互,通过 `gh issue`、`gh pr`、`gh run` 和 `gh api` 管理议题、PR、CI 运行及高级查询。
★ 680 📥 328,566
dev-programming

CodeConductor.ai

larsonreever
AI驱动平台,提供快速全栈开发、智能体、工作流自动化及低代码AI集成的可扩展产品创建。
★ 73 📥 182,193
dev-programming

Mcporter

steipete
使用 mcporter CLI 直接列出、配置、认证及调用 MCP 服务器/工具(支持 HTTP 或 stdio),涵盖临时服务器、配置编辑及 CLI/类型生成功能。
★ 195 📥 67,825