pr-review 是一个用于审查开放 PR 的技能,通过 ${var} 参数选择分支并确定作用范围。所有运行共享一段前置流程:读取 memory/MEMORY.md 获取高层上下文,扫描最近约 3 天的 memory/logs/ 以避免重复报告同一信号,并按空白拆分 ${var} 来解析分支。
一、默认模式:逐 PR 深度审查
当 ${var} 中不含 --survey 或 survey 时进入此分支。${var} 为空时审查 memory/watched-repos.md 中列出的所有仓库;${var}=owner/repo 时只审查该仓库;${var}=owner/repo#N 时只审查该确切 PR。
该分支优化目标是控制噪音:每一条发现项都必须带严重程度标签、指向具体行,并用一句话说明「为何重要」。
审查前会先列出开放 PR(gh pr list),并应用跳过规则:草稿、标题匹配 WIP/Draft、带有 no-review/do-not-merge/wip/blocked 标签、作者为机器人或 aeonframework、该账号已在当前 headRefOid 提交过带 receipt 的审查、或机器人审查者在最近 30 分钟内已审查过。
对每个待审查 PR,会抓取上下文(标题、正文、headRefOid、baseRefName、文件列表、增删行数),若正文含 Fixes #N 或 Closes #N 则抓取关联 issue,再抓取 diff。当增删行数合计超过 3000 时,只审查改动量最大的前 5 个文件;gh pr diff 失败时回退到逐文件 patch;diff 为空(如 rebase 中)则以 empty-diff 跳过。仅文档、仅锁文件或仅测试的 PR 走一行确认的快速通道。
发现项使用三种标签之一:[CRITICAL](正确性破坏、安全漏洞、数据丢失、API 破坏、回归)、[ISSUE](可能的 bug、缺失边界情况、现实输入下的错误行为)、[NIT](命名、风格、次要清理,默认丢弃)。每个 PR 最多 5 条发现项,先丢 NIT 再丢影响最小的 ISSUE;除非没有任何 CRITICAL/ISSUE 且某 NIT 确实有用,否则丢弃全部 NIT。每条发现项必须指明 path/to/file:LINE 并附一句「为何重要」。不写赞美、不复述 diff、不写「本 PR 添加了 X」式摘要。
结论分三种:approve-ready(无 CRITICAL 无 ISSUE)、blocked: <一句话原因>(至少一个 CRITICAL)、discussion-needed(有 ISSUE 但无 CRITICAL)。
发布审查时同时发送合并摘要评论和行内评论:行内评论通过 gh api 提交,包含严重程度、文件路径、commit_id 与行号;合并摘要以 review 形式发布,包含结论与所有行内发现项的文字列表,方便下游解析。无 CRITICAL/ISSUE 时跳过行内评论,只发布 approve-ready 行和 receipt(形如 <!-- aeon-review:{...} --> 的 JSON 注释,含 target、sha、verdict、critical、issues 计数)。每次完成的审查都使用恰好一个 receipt,包括快速通道的琐碎 PR。若行内评论创建失败,则把所有发现项合并进 review 正文,保留严重程度标签和文件行号引用,不静默丢弃。
最后发送通知并记录日志:每次运行发送一条合并消息(Reviewed N, skipped K 及各 PR 结论),若运行范围是单一仓库则额外发送 Telegram 摘要;若所有 PR 都被跳过则不通知,只记录日志。日志写入 memory/logs/${today}.md 的 ### pr-review 标题下,含模式判别。
二、--survey 模式:风险分级分诊摘要
此分支为原 pr-merge 技能并入,用于巡检开放 PR 队列并按影响范围分桶;它不合并任何内容,实际合并由 auto-merge 负责。
该分支读取仓库、PR 列表、每个 PR 的改动文件、每个改动 SKILL.md 的正文,并运行本地的 scripts/skill-scan.sh(与 install-skill 使用同一扫描器),输出一份结构化的 Telegram 摘要,含四个风险桶并按 PR 年龄排序。
输入包括:gh api 的开放 PR 列表(作者、草稿状态、base ref、年龄、mergeable 状态、head SHA、状态检查汇总、标签)、每个 PR 的改动文件路径与状态、每个改动 SKILL.md 的正文,以及本地 skill-scan.sh 和 memory/watched-repos.md 中的 ## Trusted Authors 一节。
输出写入 output/articles/pr-merge-${today}.md(完整摘要,每个开放 PR 一行)、memory/topics/pr-merge-state.json(上次运行快照,含每个 PR 的 bucket、first_seen、last_head_sha,用于按 head SHA 抑制重复通知)、memory/logs/${today}.md,并按条件通过 ./notify 发送通知。
步骤包括:
- 引导:创建目录与状态文件,若 JSON 损坏则备份为 .bak、重置为空模板并标记 STATE_CORRUPT。
- 解析参数:识别 dry-run(跳过通知,文章和状态仍写入)与 owner/repo 覆盖目标仓库,未知 token 记 PR_MERGE_QUEUE_BAD_VAR 并退出。
- 拉取开放 PR 列表;API 失败则记录并发送一行通知后退出;列表为空则写文章和状态、记 PR_MERGE_QUEUE_EMPTY、跳过通知。同时构建受信作者集合,来自 watched-repos.md 的 ## Trusted Authors 加上 dependabot[bot]、renovate[bot]、github-actions[bot]、aeonframework、aeonfun,这些作者的 PR 归入 TRUSTED_AUTHOR 并跳过文件分桶逻辑。
- 对每个非草稿、非受信作者的 PR 抓取改动文件列表。
需要说明的是,所提供的资料在步骤 3 的 per-PR 文件抓取命令处即结束,后续步骤(分桶、扫描、摘要生成、通知门控等完整流程)的内容暂未提供。
适用场景与限制
pr-review 适用于需要批量或按需审查开放 PR、以及在早晨快速判断哪些 PR 可一键合并、哪些需要认真审查的场景。该技能本身不执行合并操作;--survey 分支的调查对象为开放 PR 队列,默认目标仓库为 aeonfun/aeon。安装方式、收费与价格信息在资料中暂未提供。