关于 reply
reply 是用于处理当前分支 PR 审查评论的技能,只针对与当前对话相关且尚未解决的线程发布回复。它要求先检查 PR 和评论状态,并禁止修改文件或解决线程。
主要功能
- 01检查当前分支的 PR
- 02筛选未解决的审查线程
- 03按对话上下文判断相关性
- 04仅发布线程回复
- 05不修改文件或解决线程
适用场景
- 01回复当前工作相关的 PR 审查意见
- 02跳过已解决或无关的评论
- 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 中未解决且与我们在本次对话中讨论内容相关的审查评论。跳过其他所有评论。
前置检查
- 如果上方的 PR 上下文为
NO_PR,请停止并告知用户此分支没有 PR。不要执行其他操作。 - 切勿回复已解决的评论。
- 切勿回复与当前对话内容无关的评论。
- 切勿解决任何讨论串。切勿修改任何文件。此技能仅用于发布回复。
确定仓库坐标
获取以下 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。
根据对话上下文进行匹配
对于每个未解决的讨论串:
- 阅读讨论串中的每条评论。
- 如果讨论串的最后一条评论由
CURRENT_USER发布,则跳过该讨论串。只有其他人发布了最新评论时,才需要回复。 - 判断该主题是否与本次对话相关——我们编辑过的文件、讨论过的决定、排查过的错误,以及共同编写过的代码。
- 如果讨论串无关,则跳过。不要回复。
- 如果相关,请根据对话中实际确定的内容拟定回复。例如:
- “已在
<commit-sha>中完成。” - “已改为
<approach>,因为<reason discussed>。” - “提醒得好——由于
<reason>,保留了原有行为。”
- “已在
- 如果无法确定是否相关,则跳过。误报比漏掉更糟。
发布回复
对于每个匹配的讨论串,针对该讨论串的第一条评论发布线程回复:
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