关于 babysit
面向编码 Agent 的 PR 跟进技能,持续检查状态、审查反馈和讨论线程,直到可处理的问题解决且 PR 状态清晰。
主要功能
- 01监控 PR 状态与检查
- 02查看评论和审查线程
- 03对照代码核实问题
- 04修复问题并重新测试
- 05确认最终状态干净
适用场景
- 01跟进尚未完成的检查
- 02在多轮修订中处理审查反馈
- 03最终汇报前核验 PR
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ thedotmack/ claude-mem --skill babysit安装后在 Claude Code 中输入/babysit确认已加载。
详细介绍
跟进 PR
持续跟进 PR,直到它确实没有问题。如果评论或评审讨论串仍未解决,不要在检查一轮后就停止。
工作流
- 确认 PR 编号、分支和基分支。
- 确认 PR 不是草稿,并检查合并状态、检查项、评审决定、评论和评审讨论串。
- 等待待处理的检查项完成。以合适的间隔轮询,通常为 30-60 秒,除非用户要求采用其他频率。
- 阅读新评论和未解决的评审讨论串。将机器人摘要视为有用信息,但要对照代码核实其中需要采取行动的问题。
- 在专注的提交中修复实际问题,运行相关测试和构建,推送,然后返回第 2 步。
- 只有在确认代码或生成的产物已解决评论后,才解决过时的评审讨论串。
- 只有在检查项全部通过或被有意跳过、评审决定可接受、没有需要处理的评论且没有未解决的评审讨论串时,才停止。
GitHub CLI 检查
使用 gh pr view 查看总体状态:
gh pr view <number> --json \
number,state,isDraft,mergeable,mergeStateStatus,reviewDecision,headRefOid,statusCheckRollup,url
使用 GraphQL 前,先确定仓库所有者和名称:
repo_json=$(gh repo view --json owner,name)
owner=$(jq -r '.owner.login // .owner.name' <<<"$repo_json")
repo=$(jq -r '.name' <<<"$repo_json")
使用 GraphQL 查询未解决的评审讨论串。包含 pageInfo;第一页省略 cursor,之后在 hasNextPage 为 true 时,通过 -f cursor="$cursor" 传入前一页的 endCursor。
gh api graphql \
-f query='query($owner:String!,$repo:String!,$number:Int!,$cursor:String){repository(owner:$owner,name:$repo){pullRequest(number:$number){reviewThreads(first:100,after:$cursor){pageInfo{hasNextPage endCursor}nodes{id,isResolved,isOutdated,path,line,comments(last:1){nodes{author{login},body,createdAt,url}}}}}}}' \
-f owner="$owner" -f repo="$repo" -F number=<number>
PR 可能包含许多评审讨论串时,使用此循环:
thread_query='query($owner:String!,$repo:String!,$number:Int!,$cursor:String){repository(owner:$owner,name:$repo){pullRequest(number:$number){reviewThreads(first:100,after:$cursor){pageInfo{hasNextPage endCursor}nodes{id,isResolved,isOutdated,path,line,comments(last:1){nodes{author{login},body,createdAt,url}}}}}}}'
cursor_args=()
while :; do
page=$(gh api graphql -f query="$thread_query" -f owner="$owner" -f repo="$repo" -F number=<number> "${cursor_args[@]}")
printf '%s\n' "$page" | jq -r '.data.repository.pullRequest.reviewThreads.nodes[]
| select(.isResolved==false)
| [.id,.path,(.line//""),(.isOutdated|tostring),(.comments.nodes[-1].author.login//""),(.comments.nodes[-1].body|gsub("\n";" ")|.[0:240])]
| @tsv'
jq -e '.data.repository.pullRequest.reviewThreads.pageInfo.hasNextPage' >/dev/null <<<"$page" || break
cursor=$(jq -r '.data.repository.pullRequest.reviewThreads.pageInfo.endCursor' <<<"$page")
cursor_args=(-f cursor="$cursor")
done
使用 jq 筛选未解决的讨论串:
jq -r '.data.repository.pullRequest.reviewThreads.nodes[]
| select(.isResolved==false)
| [.id,.path,(.line//""),(.isOutdated|tostring),(.comments.nodes[-1].author.login//""),(.comments.nodes[-1].body|gsub("\n";" ")|.[0:240])]
| @tsv'
只有在确认修复有效后,才解决过时的讨论串:
gh api graphql \
-f query='mutation($threadId:ID!){resolveReviewThread(input:{threadId:$threadId}){thread{id,isResolved}}}' \
-f threadId=<thread-id>
操作规则
- 长时间检查仍在等待时,保持监视进程运行。
- 如果生成的文件属于分发内容,在解决评论前,确认源文件和生成的产物一致。
- 如果机器人针对过时的代码报告问题,确认该讨论串是否已过时,或是否已在最新的 head 中解决。
- 最终报告前,重新检查一次 PR 状态、未解决的讨论串、近期评论和本地
git status。 - 提供具体证据:最新提交 SHA、检查项名称及结果、未解决讨论串数量、运行的测试,以及未作处理的本地脏文件。
评论
支持 Markdown