mcpField
R
reply

reply

github.com/derogab开发4186 次安装3 天前更新
代码仓库

关于 reply

reply 是用于处理当前分支 PR 审查评论的技能,只针对与当前对话相关且尚未解决的线程发布回复。它要求先检查 PR 和评论状态,并禁止修改文件或解决线程。

主要功能

  1. 01检查当前分支的 PR
  2. 02筛选未解决的审查线程
  3. 03按对话上下文判断相关性
  4. 04仅发布线程回复
  5. 05不修改文件或解决线程

适用场景

  1. 01回复当前工作相关的 PR 审查意见
  2. 02跳过已解决或无关的评论
  3. 03确认没有 PR 时停止操作

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/derogab/agent-kit --skill reply

安装后在 Claude Code 中输入/reply确认已加载。

附带文件agents/openai.yaml

详细介绍

上下文

  • 当前分支:!git branch --show-current
  • 此分支的 PR:!gh pr view --json number,url 2>/dev/null || echo "NO_PR"

你的任务

回复当前 PR 中未解决且与我们在本次对话中讨论内容相关的审查评论。跳过其他所有评论。

前置检查
  1. 如果上方的 PR 上下文为 NO_PR,请停止并告知用户此分支没有 PR。不要执行其他操作。
  2. 切勿回复已解决的评论。
  3. 切勿回复与当前对话内容无关的评论。
  4. 切勿解决任何讨论串。切勿修改任何文件。此技能仅用于发布回复。
确定仓库坐标

获取以下 API 调用所需的 owner、repo 和 PR 编号:

OWNER=$(gh repo view --json owner -q .owner.login)
REPO=$(gh repo view --json name -q .name)
PR=$(gh pr view --json number -q .number)
CURRENT_USER=$(gh api user -q .login)
获取未解决的审查讨论串

使用 GraphQL API 列出 PR 中所有页面的审查讨论串,并获取其解决状态及其中的评论。首次请求时使用 -F threadsCursor=null:

gh api graphql \
  -F owner="$OWNER" \
  -F repo="$REPO" \
  -F pr="$PR" \
  -F threadsCursor=null \
  -f query='
query($owner: String!, $repo: String!, $pr: Int!, $threadsCursor: String) {
  repository(owner: $owner, name: $repo) {
    pullRequest(number: $pr) {
      reviewThreads(first: 100, after: $threadsCursor) {
        pageInfo {
          hasNextPage
          endCursor
        }
        nodes {
          id
          isResolved
          comments(first: 100) {
            pageInfo {
              hasNextPage
              endCursor
            }
            nodes {
              databaseId
              author { login }
              body
              path
              line
              url
              createdAt
            }
          }
        }
      }
    }
  }
}'

如果 reviewThreads.pageInfo.hasNextPage 为 true,则使用 -F threadsCursor="<endCursor>" 重新运行相同查询,直到 hasNextPage 为 false。在筛选前合并所有返回的讨论串节点。

如果任何未解决讨论串的 comments.pageInfo.hasNextPage 为 true,请先获取剩余评论,再决定是否回复:

gh api graphql \
  -F thread="$THREAD_ID" \
  -F commentsCursor="<endCursor>" \
  -f query='
query($thread: ID!, $commentsCursor: String) {
  node(id: $thread) {
    ... on PullRequestReviewThread {
      comments(first: 100, after: $commentsCursor) {
        pageInfo {
          hasNextPage
          endCursor
        }
        nodes {
          databaseId
          author { login }
          body
          path
          line
          url
          createdAt
        }
      }
    }
  }
}'

重复评论分页,直到 hasNextPage 为 false。

将合并后的结果筛选为 isResolved 为 false 的讨论串。对于每个未解决的讨论串,回复时应使用第一条评论的 databaseId。

根据对话上下文进行匹配

对于每个未解决的讨论串:

  1. 阅读讨论串中的每条评论。
  2. 如果讨论串的最后一条评论由 CURRENT_USER 发布,则跳过该讨论串。只有其他人发布了最新评论时,才需要回复。
  3. 判断该主题是否与本次对话相关——我们编辑过的文件、讨论过的决定、排查过的错误,以及共同编写过的代码。
  4. 如果讨论串无关,则跳过。不要回复。
  5. 如果相关,请根据对话中实际确定的内容拟定回复。例如:
    • “已在 <commit-sha> 中完成。”
    • “已改为 <approach>,因为 <reason discussed>。”
    • “提醒得好——由于 <reason>,保留了原有行为。”
  6. 如果无法确定是否相关,则跳过。误报比漏掉更糟。
发布回复

对于每个匹配的讨论串,针对该讨论串的第一条评论发布线程回复:

gh api repos/$OWNER/$REPO/pulls/$PR/comments/<first_comment_databaseId>/replies \
  -X POST \
  -f body="$(cat <<'EOF'
<your reply here>
EOF
)"
规则
  • 仅考虑 isResolved 为 false 的讨论串。
  • 仅回复明确与当前对话内容相关的讨论串。
  • 跳过最后一条评论由 CURRENT_USER 发布的讨论串。
  • 回复应简洁且基于事实。不要编造上下文。
  • 同一次运行中,不要对同一讨论串回复两次。
  • 不要解决讨论串。不要编辑代码。不要推送提交。只发布回复。
  • 发布后,向用户简要总结回复了哪些讨论串,以及跳过了哪些讨论串(每个跳过项用一行说明原因)。

评论

支持 Markdown