AI

GitHubのPRのレビューコメントをAIに渡すために取得する

最近実行しているコマンドランキング、2位がclaude、1位がccusageになって参りました。

開発時にGitHubにレビューコメントをもらい、それを対応するというのはエンジニアにとって朝飯前であり夕食後ではあります。今までは私がどれを対応するか選択してClaudeに投げていましたが、簡単な修正を3,4個ぐらいもらったときはClaudにまとめて対応してもらったほうが当然楽だなと思いました。なので、PRのレビューコメントを確認し、なんらかのCoding Agentにわかりやすい形で投げたいなと思いました。

GitHubにはCLIがあり、様々な情報が取得できます。
gh pr viewというコマンドがあり、Referenceを確認すると comments というオプションがあるのでそれで良さそうじゃん。……とはいきません。

gh pr viewコマンドの問題

手元にいい感じのPRがなかったので、RenovateのPRにこんな感じでレビューコメントを投げてみました。

GitHub上でレビューコメントを投稿している。特定の行に対して「コメントのテスト」とコメントしている。また、その返信として「返信のテスト」と記載されている。

https://github.com/sa2taka/next-blog/pull/1153#pullrequestreview-3014989872

ここで gh pr view --comments コマンドを実行するとこうなります。

$ gh pr view --comments 1153 Update dependency glob to v11.0.3 sa2taka/next-blog#1153 Open • renovate wants to merge 1 commit into main from renovate/glob-11.x-lockfile • about 1 month ago +52 -35 • ✓ Checks passing Reviewers: sa2taka (Commented) Labels: dependencies, patch, renovate This PR contains the following updates: ...PRのdescriptionが記載される View this pull request on GitHub: https://github.com/sa2taka/next-blog/pull/1153

先程のコメントが登場しません。

jsonで取得する機能もあるのでそちらを利用してみましょう。

$ gh pr view --json comments 1153 { "comments": [] }

そう、gh pr viewコマンドでは、コードに記載したコメントは取得できません。

解決策

GitHub CLIには最強のサブコマンドapiが存在します。名前の通りGitHubのAPIを叩いてくれます。これを利用しましょう。

レビューコメントは /repos/{owner}/{repo}/pulls/{pull_number}/comments にて取得可能です。

$ gh api "repos/:owner/:repo/pulls/1153/comments" | jq '.[].body' "コメントのテストです" "返信のテストです"

どのような応答があるはリファレンスに記載されています。

現在のPRのコメントをいい感じに取得するスクリプト

Claudeに投げるには流石にJSONだと無駄情報がありすぎるので、いい感じのスクリプトを作ってもらいました。

#!/bin/bash # PRコメントをスレッドごとにまとめて表示するツール set -euo pipefail # jqクエリ: スレッドごとにコメントをグループ化し、ファイルと行数を提示 JQ_QUERY=' # まずコメントをスレッドIDでグループ化(in_reply_to_idがnullのものは自分のIDをキーにする) def thread_id: if .in_reply_to_id then .in_reply_to_id else .id end; # スレッドごとにグループ化 group_by(thread_id) | map({ thread_id: .[0] | thread_id, file: .[0].path, line: .[0].line, position: .[0].position, comments: map({ id: .id, user: .user.login, body: .body, created_at: .created_at, is_reply: (.in_reply_to_id != null) }) | sort_by(.created_at) }) | sort_by(.file, .line) ' # PRコメントを取得してjqで整形 gh api "repos/:owner/:repo/pulls/$(gh pr view --json number -q .number)/comments" | jq -r "$JQ_QUERY" | jq -r ' .[] | "📁 \(.file):\(.line) (position: \(.position))", "🧵 スレッドID: \(.thread_id)", (.comments[] | if .is_reply then " └─ 💬 \(.user): \(.body)" else " 🟢 \(.user): \(.body)" end ), "" '

実行結果が下記です。

$ pr-comments 📁 yarn.lock:2338 (position: 19) 🧵 スレッドID: 2203992995 🟢 sa2taka: コメントのテストです └─ 💬 sa2taka: 返信のテストです

jqとawkは、結局細かい記法を理解しないままAIに書かせるツールになりそうですね。

P.S.

書いた後に、そういやGitHub MCP Serverがあったなと思いました。get_pull_request_reviews 使えば良さそうですね。そっち使いましょう。