babysit について
コーディングエージェント向けの PR 追跡スキルです。チェック、レビューのフィードバック、スレッドを確認し、対応事項が解消されるまで追跡します。
主な機能
- 01PR の状態とチェックの監視
- 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 の場合は、前の endCursor を -f cursor="$cursor" で渡します。
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>
運用ルール
- 長時間かかるチェックが保留中の間は、監視を続けます。
- 生成ファイルが配布物に含まれる場合は、コメントを解決する前に、ソースと生成された成果物が一致していることを確認します。
- ボットが古いコードに対する問題を報告した場合、そのスレッドが古くなっているのか、最新のヘッドで対応済みなのかを確認します。
- 最終報告の前に、PRの状態、未解決のスレッド、最近のコメント、ローカルの
git statusを改めて一通り確認します。 - 具体的な根拠を報告します。最新のコミットSHA、チェック名と結果、未解決のスレッド数、実行したテスト、手を加えずに残した未コミットのローカルファイルを含めます。
コメント
Markdown 対応