pr-change-analysis

star 28.5k

手动触发的 FastGPT PR 或本地分支变更梳理技能。仅当用户显式调用 $pr-change-analysis 时使用;用于 reviewer 分析一个 GitHub PR 或当前本地分支相对 upstream/main 的需求变更、影响范围、代码质量与代码风格,不用于自动审查触发。

labring By labring schedule Updated 6/17/2026

name: pr-change-analysis description: 手动触发的 FastGPT PR 或本地分支变更梳理技能。仅当用户显式调用 $pr-change-analysis 时使用;用于 reviewer 分析一个 GitHub PR 或当前本地分支相对 upstream/main 的需求变更、影响范围、代码质量与代码风格,不用于自动审查触发。

PR / 分支变更梳理

面向代码 reviewer,先从真实 diff 还原需求与实现边界,再判断是否有超出需求的改动、过度复杂的整理、测试与模块化风险、以及与相近代码不一致的风格。

基本原则

  • 默认输出中文。
  • 以 checked-out 代码和 diff 为准,不只复述 PR 标题或描述。
  • 优先回答“这次到底改了什么、为什么有用、影响到哪里、哪里不像同一个需求应该带上的改动”。
  • 不默认提交 review、批准、请求修改或推送代码;用户明确要求后才执行 GitHub 写操作。
  • 不修改工作区代码;如为了 review 需要切分实验或临时命令,只做只读检查。
  • 保留用户已有改动。切换 PR 前必须检查 git status --short,遇到未提交改动时先说明风险并让用户决定,不要自行 stash、reset 或 checkout 覆盖。

入口判断

  1. 如果用户给了 PR URL 或编号:
    • gh pr view <pr> 获取 number,title,body,author,headRefName,baseRefName,files,additions,deletions,commits
    • 按用户要求用 gh pr checkout <pr> 切到该 PR 分支。
    • git fetch upstream main,默认用 upstream/main...HEAD 做审查基准。
    • 如果 PR 的 baseRefName 不是 main,在报告里明确说明,并根据上下文决定是否同时补充 upstream/<baseRefName>...HEAD 的对比。
  2. 如果用户没有给 PR,只说当前分支:
    • 确认当前分支名:git branch --show-current
    • git fetch upstream main
    • 使用 git diff upstream/main...HEAD 和相关统计作为审查基准。
  3. 如果当前分支就是 main 或 diff 为空:
    • 明确说明没有可分析的分支差异,必要时检查是否需要比较其他 base。

信息收集

优先用这些命令建立全局视角:

git status --short
git branch --show-current
git fetch upstream main
git diff --stat upstream/main...HEAD
git diff --name-status upstream/main...HEAD
git log --oneline --decorate upstream/main..HEAD

再按文件类型深入:

git diff upstream/main...HEAD -- <path>
git diff --word-diff=color upstream/main...HEAD -- <path>
rg -n "关键函数|关键类型|关键字段" <相关目录>

检查需求来源时优先读取:

  • PR 标题、正文、commit message。
  • 新增或修改的 API schema、数据库 schema、工作流节点定义、配置默认值、权限判断。
  • 与变更文件相邻的旧实现或同类功能实现。
  • 测试文件与缺失测试的高风险路径。

审查维度

1. 需求变更说明

需要用 reviewer 能快速理解的方式说明:

  • 本次变更解决什么问题,给用户、管理员、开发者或系统运行带来什么作用。
  • 核心行为从什么变成什么。
  • 对外接口、数据结构、配置、权限、计费、工作流运行时、前端交互是否变化。
  • 关键实现路径:入口在哪里,主要处理逻辑在哪里,最终落到哪些模块。

不要只列文件名。每个关键文件都要说明它承担的行为变化。

2. 是否超出需求影响范围

重点找这些信号:

  • 与需求无关的格式化、重命名、移动文件、依赖升级、批量整理。
  • 修改共享类型、全局工具、公共组件、运行时核心逻辑,但需求只需要局部修复。
  • 同一个分支混入多个独立需求或历史清理。
  • 行为改动被伪装成重构,导致旧路径兼容性、默认值、继承语义或保存边界改变。
  • 删除兼容逻辑、改变错误处理、日志、权限、缓存、并发策略,但 PR 描述未解释。

结论要区分:

  • 合理扩散:为了实现需求必须改的上下游。
  • 可疑越界:看起来和需求无关,需要作者拆分或解释。
  • 高风险越界:可能导致回归,应要求拆出或补测试。

3. 代码质量

检查是否:

  • 存在重复逻辑、临时硬编码、过长函数、混合多层职责。
  • 可以被独立模块化测试,但实际写在 UI、API route 或分支逻辑里导致难测。
  • 缺少边界条件、异常路径、空值、旧数据兼容、并发或幂等处理。
  • 没有把契约放在正确边界,例如 FastGPT API 入参应使用 parseApiInput,共享 schema 应放在 packages/global/openapi 或相应共享层。
  • 测试只覆盖 happy path,或者新增核心逻辑没有对应单测。

评价质量时给出具体文件和函数,不要泛泛说“需要优化”。

4. 代码风格与相近功能一致性

对比相邻实现,而不是只按个人偏好判断:

  • API route、service、schema、hook、组件、i18n、错误处理、日志、权限判断是否沿用附近模式。
  • i18n 调用必须使用可被清理脚本静态识别的 key:不要写 t(`ns:key_${value}`)t(prefix + value)t(variableKey)t(condition ? 'ns:a' : 'ns:b') 这类动态/表达式 key;有限枚举应拆成显式分支或静态映射,并在最终调用处保留 t('ns:literal_key') 形式。改动后要检查对应语言包 key 是否齐全,避免清理脚本误删或运行时裸显 key。
  • 前端交互、Chakra UI 组件组织、状态命名、弹窗/表单/列表布局是否与同模块一致。
  • 后端命名、目录分层、模型访问、事务/队列/缓存写法是否与同类代码一致。
  • 注释是否解释设计原因,尤其是导出函数、核心业务函数、复杂 helper;避免无意义逐行注释。
  • 是否引入与项目习惯不一致的新抽象、新工具或新依赖。

深挖方法

对每个核心改动至少做一次“调用链闭环”:

  1. 从入口找触发点:页面、API route、worker、workflow dispatcher、service 方法或配置加载。
  2. 追到状态/数据落点:数据库、缓存、请求体、响应体、运行时变量、前端 store。
  3. 找相近功能:同目录同类 route、同类组件、同类工作流节点、同类模型配置。
  4. 对比旧行为:用 git show upstream/main:<path>git diff 确认不是误读。
  5. 判断测试:现有测试是否覆盖这条路径;没有测试时说明缺口与风险。

如果发现大规模重构,先识别“纯移动/纯重命名/格式化”和“真实行为改动”,避免把噪音当成需求。

输出格式

最终报告优先用以下结构,按风险高低组织,不要写冗长总结报告:

## 需求变更

- ...

## 关键实现路径

- `path/to/file.ts`: ...

## 影响范围与越界判断

- 合理扩散: ...
- 可疑越界: ...
- 高风险越界: ...

## 代码质量

- [风险等级] `path/to/file.ts`: 问题、原因、建议。

## 代码风格一致性

- ...

## 测试与验证缺口

- ...

## 需要作者确认的问题

- ...

问题项必须尽量带文件路径和行号。没有发现问题时也要明确写“未发现明显越界/质量/风格问题”,并列出仍未覆盖的验证盲区。

Install via CLI
npx skills add https://github.com/labring/FastGPT --skill pr-change-analysis
Repository Details
star Stars 28,459
call_split Forks 7,155
navigation Branch main
article Path SKILL.md
More from Creator