关于 forge-address-pr-feedback
用于系统处理 Pull Request 中尚未解决的评审意见的开发 skill。它逐条判断意见类型、按需修改代码并运行检查,再回复评审者;未决策的讨论会保留给人工处理。
主要功能
- 01通过 GraphQL 获取未解决线程
- 02分类处理评审意见
- 03逐条修改、检查并提交
- 04回复并按结果解决线程
- 05将延期事项创建为 Issue
适用场景
- 01处理 PR 中待修复的代码意见
- 02回应评审者的问题或讨论
- 03将暂缓处理的反馈转为 Issue
- 04无人值守模式下处理评审轮次
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mgratzer/ forge --skill forge-address-pr-feedback安装后在 Claude Code 中输入/forge-address-pr-feedback确认已加载。
详细介绍
处理 PR 反馈
系统地处理拉取请求中尚未解决的审查反馈。
输入
PR 编号或 URL($ARGUMENTS;若省略,则从当前分支自动检测)。可选:-- <additional context>,用于提供优先级指导。
无人值守模式:--unattended 不会提问;第 2–3 步会说明相应处理方式。
流程
第 1 步:获取尚未处理的讨论串
使用 GraphQL——REST API 不会公开审查讨论串的 isResolved 状态。最后一条评论由我们发表的讨论串正在等待审查者回复,因此所有模式下都会将其过滤掉。由 forge-guard 组合调用时,重用其 $PR 和 $ME,而不是重新推导它们。
# Derive owner/repo from the checkout; PR_ARG is the number or URL from $ARGUMENTS, empty when omitted
PR_ARG=""
OWNER=$(gh repo view --json owner --jq .owner.login)
REPO=$(gh repo view --json name --jq .name)
PR_NUMBER=$(gh pr view $PR_ARG --json number --jq .number) # empty PR_ARG → PR for the current branch
ME=$(gh api user --jq .login)
gh api graphql -F owner="$OWNER" -F repo="$REPO" -F pr="$PR_NUMBER" -f query='
query($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
reviewThreads(first: 100) {
nodes {
isResolved
isOutdated
path
line
id
comments(last: 20) {
nodes { id body author { login } url }
}
}
}
}
}
}' --jq ".data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false and .comments.nodes[-1].author.login != \"$ME\")"
第 2 步:处理每个讨论串
对于每个尚未处理的讨论串,阅读文件及其上下文,然后分类:
- 可执行——需要修改代码
- 问题——回复并说明
- 讨论——评估修改是否能改进代码
- 已处理——讨论串尚未解决,但已做出修改
- 不予修改——当前方案更合适
- 延后——有效但不在当前范围内——作为延后事项处理(创建新 Issue)
对于讨论类讨论串,如果确实需要由用户决定,请使用 AskUserQuestion 提问,不要自行假设。**无人值守模式下:**如果代码或项目惯例足以作出判断,则据此决定,并说明依据。若两者都无法确定,则回复“需要您决定:<选项 A> 还是 <选项 B>。<各自的代价>”,保留讨论串为未解决状态,并在摘要中列入需要人工决定——绝不要将其标记为已解决,也不要把它隐藏在 Issue 中。
第 3 步:逐一处理并回复
先处理每个讨论串并回复,再继续下一个,这样每条回复都能引用解决该问题的提交。
对于每个讨论串:
- 进行修改(如果可执行)
- 运行 lint、格式化和检查
- 提交:
git commit -m "fix: address PR feedback, <brief description>" - 回复,并在结果明确时标记为已解决——适用于可执行、已处理或延后。问题、讨论和不予修改的讨论串应保持未解决,让审查者看到理由。一次变更即可同时完成回复和解决(对于保持未解决的讨论串,省略
resolveReviewThread);通过 stdin 将回复作为 GraphQL 变量传入——将其插入查询会导致引号和换行符处理出错:
gh api graphql -f threadId="<THREAD_ID>" -F body=@- -f query='
mutation($threadId: ID!, $body: String!) {
addPullRequestReviewThreadReply(input: {pullRequestReviewThreadId: $threadId, body: $body}) {
comment { id }
}
resolveReviewThread(input: {threadId: $threadId}) {
thread { isResolved }
}
}' <<'REPLY_EOF'
<response>
REPLY_EOF
按类别回复:
- 可执行:“已在
<sha>中修复。<修改内容>” - 问题:“<附带代码引用的答复>”
- 讨论:“<决定和理由>”
- 已处理:“已在
<sha>中处理。” - 不予修改:“保留当前方案,因为 <理由>。”
- 延后:“已创建 # 跟踪此事项。”
第 4 步:为延后事项创建 Issue
对于每个延后事项,在项目的 Issue 跟踪器中创建 Issue(参见 issue-operations)。附上 PR 上下文:审查者的评论、PR 编号和建议的解决方案。
第 5 步:推送并总结
git push
报告:已处理的讨论串、创建的提交、创建的延后事项,以及需要人工决定的讨论串。
指南
- 使用 GraphQL 进行发现——REST API 不会显示解决状态
- 处理、回复,然后继续——不要批量处理
- 具体说明——引用提交、行号和代码
- 测试修改——提交前运行检查
相关技能
**如果反馈要求进行大量修改:**在重新请求审查前,使用 forge-reflect 再进行一次自我审查。
组合调用方:forge-guard 会在无人值守模式下针对每轮反馈运行此流程。
使用示例
/forge-address-pr-feedback 123
/forge-address-pr-feedback 123 -- prioritize security comments
/forge-address-pr-feedback --unattended 123
/forge-address-pr-feedback