mcpField
F
forge-address-pr-feedback

forge-address-pr-feedback

github.com/mgratzer测试与质量8354 次安装3 天前更新
代码仓库

关于 forge-address-pr-feedback

用于系统处理 Pull Request 中尚未解决的评审意见的开发 skill。它逐条判断意见类型、按需修改代码并运行检查,再回复评审者;未决策的讨论会保留给人工处理。

主要功能

  1. 01通过 GraphQL 获取未解决线程
  2. 02分类处理评审意见
  3. 03逐条修改、检查并提交
  4. 04回复并按结果解决线程
  5. 05将延期事项创建为 Issue

适用场景

  1. 01处理 PR 中待修复的代码意见
  2. 02回应评审者的问题或讨论
  3. 03将暂缓处理的反馈转为 Issue
  4. 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 步:逐一处理并回复

先处理每个讨论串并回复,再继续下一个,这样每条回复都能引用解决该问题的提交。

对于每个讨论串:

  1. 进行修改(如果可执行)
  2. 运行 lint、格式化和检查
  3. 提交:git commit -m "fix: address PR feedback, <brief description>"
  4. 回复,并在结果明确时标记为已解决——适用于可执行、已处理或延后。问题、讨论和不予修改的讨论串应保持未解决,让审查者看到理由。一次变更即可同时完成回复和解决(对于保持未解决的讨论串,省略 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

评论

支持 Markdown