用途
copilot-review-loop 用于自动化一个由 GitHub Copilot 驱动的迭代审查循环:触发 Copilot 审查、逐条处理其反馈,然后再次触发 Copilot 审查。最多重复 2 个周期,直到所有关键问题解决。
这是一个会话内循环——一个长时间运行的智能体上下文在内部迭代。它不是 Ralph Wiggum 模式(后者是外部 shell 循环,每条评论都会启动一个新的智能体会话)。如需后者,请参见 ralph-wiggum-loop 技能。
典型调用方式
用户可通过如下提示触发该技能:
- "Request a Copilot review on this PR and address the feedback"
- "Trigger a GitHub Copilot review and fix the issues it finds"
- "Run copilot-review-loop on PR #42"
- "Use copilot-review-loop to get and address Copilot's review comments"
前置条件
- gh CLI(必需)
- gh-copilot-review 扩展(推荐——参见 references/gh-copilot-review-guide.md)
- 安装命令:
gh extension install ChrisCarini/gh-copilot-review - 未安装时的回退方案:
gh pr review --request copilot
- 安装命令:
- pr-review-loop 技能(可选——若已安装,内层循环委托给它)
- PR 分支必须在本地检出
流程
步骤 1 — 预检
检查项目中是否存在以下文件,以了解保障约定:CLAUDE.md、AGENTS.md、Makefile、.github/workflows/、README.md。
识别所有必需的保障措施(测试、编译、lint、格式化等)。运行全部保障措施。若有任何失败,立即停止并报告——不得继续。
步骤 2 — 外层循环(最多 2 次迭代)
最多重复 2 次:
2a. 请求 Copilot 审查
检查是否安装了 gh-copilot-review 扩展:gh extension list | grep copilot-review
若已安装(首选):gh copilot-review [<number> | <url>]
若未安装(回退):gh pr review --request copilot
2b. 等待 Copilot 完成
阅读 references/gh-copilot-review-guide.md 了解轮询方法。
在触发前记录当前未解决的 copilot[bot] 评论数量。每 30 秒轮询一次,直到出现新评论。若 10 分钟后仍无新评论,停止并报告超时——不得继续。
2c. 收集未解决的 Copilot 评论
获取所有由 copilot[bot] 撰写的未解决评论。忽略人类审查者的评论(那些由 pr-review-loop 技能处理)。
gh api repos/{owner}/{repo}/pulls/{pr}/comments \
--jq '.[] | select(.user.login == "copilot[bot]")'
获取所有 Copilot 评论。使用触发前记录的计数(步骤 2b)来识别哪些是新评论。
若没有未解决的 Copilot 评论,停止——无事可做。
2d. 处理评论——内层循环
若 pr-review-loop 技能可用:调用 pr-review-loop 技能,仅传入步骤 2c 收集的 Copilot 评论作为范围。它将处理分类、逐条修复和回复。
若 pr-review-loop 技能不可用:对每条评论逐一执行以下流程(先 MUST_FIX,后 SHOULD_FIX):
使用 references/triage-guide.md 中定义的五个类别进行分类(MUST_FIX、SHOULD_FIX、PARK、OUT_OF_SCOPE、NEEDS_CLARIFICATION)。分类前先阅读该文件。
对每条 MUST_FIX 和 SHOULD_FIX 评论:
- 评估复杂度:
- 简单(重命名、小修复):直接修复
- 非简单:先将计划写入 .pr-review/plan-<comment-id>.md
- 运行保障措施——在改动代码前必须全部通过
- 修复、搁置或请求澄清
- 照常修复或搁置。
- 若评估过程中意图确实模糊:发布一个聚焦的问题(见下方格式),不解决该线程,跳过步骤 4–8,继续处理下一条。
澄清问题格式:
cat > /tmp/pr-review-reply-{comment_id}.md <<'EOF'
Thanks for the feedback! Before I make a change, I want to make sure I understand what you're after:
<one specific, focused question>
EOF
jq -n --rawfile body /tmp/pr-review-reply-{comment_id}.md '{body:$body}' > /tmp/pr-review-reply-{comment_id}.json
gh api repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies \
--input /tmp/pr-review-reply-{comment_id}.json
只问一个问题。保持线程未解决,以便审查者的回答使其重新浮现。
- 再次运行保障措施——必须全部通过
- 提交并推送:
git add <changed files>
git commit -m "<conventional commit describing the fix>"
git push
- 回复评论——说明修复、推迟或拒绝
- 在 GitHub 上解决该评论
- 若创建了计划文件则删除:
rm .pr-review/plan-<comment-id>.md
2e. 检查停止条件
若出现以下任一情况则停止迭代:
- 本轮之后不再有 MUST_FIX 的 Copilot 评论
- 仅剩 OUT_OF_SCOPE 或 NEEDS_CLARIFICATION 的 Copilot 评论(等待审查者输入)
- 这是第 10 次迭代
否则继续下一轮迭代(回到步骤 2a)。
步骤 3 — 总结
在 PR 上发布最终评论:
## Copilot Review Loop — Summary
Completed N Copilot review cycle(s).
### Fixed
- [commit abc1234] <description> (Copilot comment #<id>)
- ...
### Parked
- <description> — deferred, tracked in #<issue>
- ...
### Rejected
- <description> — <reason>
- ...
### Awaiting Clarification
- Asked Copilot: "<question>" — thread left open (comment #<id>)
- ...
省略没有条目的部分。
可恢复性
该技能可在任意时刻被中断,并在全新上下文中重启。
重启时:
- 运行预检(步骤 1)
- 检查是否存在 .pr-review/plan-*.md——若找到,从步骤 2d 的修复中途继续
- 重新获取未解决的 Copilot 评论——已解决的不会出现
- 从当前状态继续外层循环
状态目录
.pr-review/ 位于仓库根目录(项目应将其加入 gitignore)。
- plan-<comment-id>.md——当前进行中评论的计划(解决后删除)
禁止事项
- 将所有 PR 反馈打包成一个大型提交
- 在单个提交中做多个不相关的改动
- 一次性推送所有改动而不做中间提交
- 处理完 Copilot 评论后仍让其处于未解决状态
- 在 MUST_FIX 项仍未解决时进入下一个 Copilot 审查周期