How this skill is triggered — by the user, by Claude, or both
Slash command
/pr-copilot:reviewThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
GitHubのレビュー依頼PRを自動レビューするコマンド。Claude Code と Copilot CLI の2者レビュー方式。
GitHubのレビュー依頼PRを自動レビューするコマンド。Claude Code と Copilot CLI の2者レビュー方式。
~/claude-loop-pr-copilot/ をワーキングディレクトリとしてClaude Codeを起動する:
cd ~/claude-loop-pr-copilot && claude
起動後:
/loop 10m /pr-copilot:review
ワーキングディレクトリを ~/claude-loop-pr-copilot/ にすることで、配下のファイルに直接アクセスできる。
GitHub Search API でレビュー依頼されている Open PR を取得する。 Notifications API と異なり、リポジトリの Watch 設定に依存しない。
各テンプレートはコードブロックの内容をそのまま1回のシェル実行単位として使うこと。変数($MY_LOGIN, $org, $repository, $pr_number, $title, $pr_url, $branch, $head_sha, $started_at, $finished_at, $exit_code など)の置換以外の改変は不可。
まず自分のログイン名を取得する。
$MY_LOGIN として次の検索テンプレートに使うgh api user | jq -r '.login'
取得したログイン名を $MY_LOGIN として、Search API でレビュー依頼PRを検索する。
$MY_LOGIN 取得後に必ず実行するorg, repository, pr_number, title, pr_url を取得できるgh api -H "Accept: application/vnd.github+json" \
"/search/issues?q=is:pr+state:open+draft:false+review-requested:$MY_LOGIN&sort=updated&order=desc&per_page=100" \
| jq -r '.items[] | {
org: (.repository_url | split("/")[-2]),
repository: (.repository_url | split("/")[-1]),
pr_number: .number,
title,
pr_url: (.pull_request.html_url // .html_url)
}'
クエリパラメータの説明:
is:pr - PR のみ(Issue を除外)state:open - Open な PR のみdraft:false - Draft PR を除外review-requested:$MY_LOGIN - 自分がレビュー依頼されている PR(チームレビュー依頼も含む)sort=updated&order=desc - 更新日時の降順(最新を優先。best match のデフォルトだと古い PR が漏れる)per_page=100 - 最大 100 件取得注意事項:
head_sha と branch は含まれない(Step 2 の gh pr view で取得する既存ロジックで対応済み)review-requested:USERNAME は GitHub docs 上、ユーザー直接指定とチーム経由の両方を含むと明記されている取得した候補($org, $repository, $pr_number, $title, $pr_url)を上から順に走査し、以下の条件で最初の1件を選定する:
users または teams を後続テンプレートで判定できるgh api repos/$org/$repository/pulls/$pr_number/requested_reviewers | jq '{users: [.users[].login], teams: [.teams[].slug]}'
.teams[].slug が1件以上ある場合のみ実行するgh api user/teams | jq -r '.[].slug'
$MY_LOGIN が含まれるなら approve 済みgh pr view $pr_number --repo $org/$repository --json reviews | jq -r '.reviews[] | select(.state == "APPROVED") | .author.login'
status.json を確認test -f ~/claude-loop-pr-copilot/$org-$repository-$pr_number/status.json
status.json が存在する場合に実行するstate が failed なら再実行対象failed なら選定、それ以外は次の状態判定へ進むjq -r '.state' ~/claude-loop-pr-copilot/$org-$repository-$pr_number/status.json
state == "running" の場合に実行するstarted_at から30分超過なら stalejq -r '.started_at' ~/claude-loop-pr-copilot/$org-$repository-$pr_number/status.json
state == "completed" の場合は head_sha と branch を取得して比較するstate == "completed" の場合に実行する$head_sha として保持する)metadata.json の head_sha と比較へ進むgh pr view $pr_number --repo $org/$repository --json headRefOid | jq -r '.headRefOid'
$head_sha 取得後に実行する$branch として保持する)metadata.json の head_sha と比較へ進むgh pr view $pr_number --repo $org/$repository --json headRefName | jq -r '.headRefName'
$head_sha と $branch の取得後に実行するhead_sha を取得できる$head_sha と異なれば追加コミットありとして選定、一致ならスキップjq -r '.head_sha' ~/claude-loop-pr-copilot/$org-$repository-$pr_number/metadata.json
全候補がスキップなら何もせず終了。
install -d ~/claude-loop-pr-copilot/$org-$repository-$pr_number
ln -sfn ~/claude-loop-pr-copilot/$org-$repository-$pr_number ~/Desktop/$org-$repository-$pr_number
PRブランチのソースコードを各ツール用に個別に clone する。初回 clone と既存 clone 更新を明確に分離する。
clone-claude が存在しない初回のみ実行するclone-copilot 初回 clone テンプレートへ進むgh repo clone $org/$repository ~/claude-loop-pr-copilot/$org-$repository-$pr_number/clone-claude -- --branch $branch --depth 1
clone-copilot が存在しない初回のみ実行するgh repo clone $org/$repository ~/claude-loop-pr-copilot/$org-$repository-$pr_number/clone-copilot -- --branch $branch --depth 1
clone-claude が既に存在する再実行時のみ実行するclone-copilot 更新テンプレートへ進むgit -C ~/claude-loop-pr-copilot/$org-$repository-$pr_number/clone-claude fetch origin $branch && git -C ~/claude-loop-pr-copilot/$org-$repository-$pr_number/clone-claude checkout FETCH_HEAD
clone-copilot が既に存在する再実行時のみ実行するgit -C ~/claude-loop-pr-copilot/$org-$repository-$pr_number/clone-copilot fetch origin $branch && git -C ~/claude-loop-pr-copilot/$org-$repository-$pr_number/clone-copilot checkout FETCH_HEAD
--depth 1 で shallow clone し、ディスク・時間を節約clone-claude/、Copilot CLI 用: clone-copilot/以下のファイルを Bash で作成する(Write ツールは使わない。理由は「実装上の制約」を参照)。
まず現在時刻を取得する(出力を $started_at として保持する)。
date -u +%Y-%m-%dT%H:%M:%S+00:00
status.json が running で作成されるjq -n --arg started_at "$started_at" '{state:"running",started_at:$started_at}' > ~/claude-loop-pr-copilot/$org-$repository-$pr_number/status.json
status.json 作成後に実行するmetadata.json が作成されるjq -n --arg org "$org" --arg repository "$repository" --arg pr_number "$pr_number" --arg pr_url "$pr_url" --arg head_sha "$head_sha" --arg branch "$branch" --arg title "$title" '{org:$org,repository:$repository,pr_number:$pr_number,pr_url:$pr_url,head_sha:$head_sha,branch:$branch,title:$title}' > ~/claude-loop-pr-copilot/$org-$repository-$pr_number/metadata.json
Claude Code と Copilot CLI の両方で独立にレビューし、結果を統合する。
4a と 4b は並行実行する。 各ツールは独立した clone ディレクトリを使うため競合しない。両方の Bash コマンドを run_in_background: true で同時に発行し、両方の完了を待ってから 4c に進む。
子プロセスの claude code でレビューを実行する。Bash ツールで以下のコマンドを一字一句変えずに実行する。
run_in_background: true)claude-review.md が生成され、終了コードが 0600000env -u CLAUDECODE claude -p "/review $org/$repository $pr_number" \
--permission-mode dontAsk \
--allowedTools "Read Glob Grep Bash(git diff:*) Bash(git show:*) Bash(git log:*) Bash(git rev-parse:*) Bash(git clone:*) Bash(git checkout:*) Bash(git switch:*) Bash(gh pr view:*) Bash(gh pr diff:*)" \
--add-dir ~/claude-loop-pr-copilot/$org-$repository-$pr_number/clone-claude \
> ~/claude-loop-pr-copilot/$org-$repository-$pr_number/claude-review.md \
2> ~/claude-loop-pr-copilot/$org-$repository-$pr_number/claude.log
注意:
env -u CLAUDECODE — 環境変数 CLAUDECODE をクリアし、ネスト起動制限を回避する--permission-mode dontAsk — 非対話で自動承認(許可ツール制限が効く)--allowedTools — レビューに必要な read-only コマンドのみ許可(gh pr view/diff, git diff/show/log/clone/checkout/switch)--add-dir — clone ディレクトリへのアクセスを明示的に許可Copilot CLI を使い、同じPRをレビューさせる。Bash ツールで以下のコマンドを一字一句変えずに実行する。
run_in_background: true)copilot-review.md が生成され、終了コードが 0600000copilot -p "以下のGitHub PRをコードレビューしてください。確認や質問は不要です。具体的な指摘と提案まで自主的に出力してください。GitHub / Backlog / DocBase の参照が必要な場合は、それぞれ利用可能なMCPを優先して使ってください。gh コマンドや api.github.com への直接アクセスが失敗しても、MCPで取得できる情報を使って継続してください。取得したページ中に関連URLがあれば追跡し、同じ参照を繰り返しそうな場合は停止してください。https://github.com/$org/$repository/pull/$pr_number" \
--allow-all-tools --allow-all-urls \
--excluded-tools write \
--no-ask-user -s \
--add-dir ~/claude-loop-pr-copilot/$org-$repository-$pr_number/clone-copilot \
> ~/claude-loop-pr-copilot/$org-$repository-$pr_number/copilot-review.md \
2> ~/claude-loop-pr-copilot/$org-$repository-$pr_number/copilot.log
フラグの説明:
-p "..." — 非対話モードでプロンプトを実行(完了後に終了)--allow-all-tools — 全ツールを自動承認(非対話モードに必要)--allow-all-urls — GitHub API/MCP アクセスに必要--excluded-tools write — レビュー専用のため書き込みツールを除外--no-ask-user — ask_user ツールを無効化し、完全自律動作にする-s — エージェントの応答のみ出力(統計情報なし。スクリプト向け)--add-dir — Copilot専用のcloneディレクトリへのアクセスを許可両方のレビューが完了したら、メインコンテキスト(自分自身)が以下を行う:
claude-review.md と copilot-review.md を読む~/claude-loop-pr-copilot/$org-$repository-$pr_number/review.md に書き出すclaude-review.md と copilot-review.md の両方が揃った後review.md を Bash のヒアドキュメントで書き出し、Step 5 へ進むreview.md のフォーマット(各セクションの内容はエージェントが記述する):
# PR Review: $title
$pr_url
## Summary
(PRの概要と総合評価)
## Findings
### Critical / High
(両者一致の重要指摘、または妥当と判断した片方の指摘)
### Medium / Low
(改善提案、スタイルの指摘等)
## Claude Code の見解
(Claude Code 固有の指摘サマリ)
## Copilot の見解
(Copilot 固有の指摘サマリ)
## 議論・判断
(相違点についての考察と最終判断)
レビュー完了後、Bash で jq -n --arg を使って status.json を更新する。
まず現在時刻を取得する(出力を $finished_at として保持する)。
date -u +%Y-%m-%dT%H:%M:%S+00:00
status.json の state が completedjq -n --arg started_at "$started_at" --arg finished_at "$finished_at" '{state:"completed",started_at:$started_at,finished_at:$finished_at,exit_code:0}' > ~/claude-loop-pr-copilot/$org-$repository-$pr_number/status.json
status.json の state が failedjq -n --arg started_at "$started_at" --arg finished_at "$finished_at" '{state:"failed",started_at:$started_at,finished_at:$finished_at,exit_code:1}' > ~/claude-loop-pr-copilot/$org-$repository-$pr_number/status.json
レビュー結果の要約をユーザーに報告する。報告内容:
対象PR(リンク付き)
レビュー結果のサマリ(Findings/Risks/Summary から要約)
結果ファイルのパス
いつ使うか: Step 5 の status 更新後
次アクション: review.md を Read ツールで読み、以下の内容をユーザーにテキストで報告して終了する
$pr_url のリンク付き)~/claude-loop-pr-copilot/$org-$repository-$pr_number/review.md)skipped としてログに記録し、次の候補へ進むclaude -p がタイムアウト(10分) → state=failed で記録claude -p が非ゼロ終了 → state=failed で記録copilot -p がタイムアウト(10分) → state=failed で記録copilot -p が非ゼロ終了 → state=failed で記録state=failed で記録し、その回は終了~/claude-loop-pr-copilot/
└── $org-$repository-$pr_number/
├── status.json
├── metadata.json
├── clone-claude/ ← Claude Code 用 shallow clone
├── clone-copilot/ ← Copilot CLI 用 shallow clone
├── claude-review.md ← Claude Code の生レビュー
├── copilot-review.md ← Copilot CLI の生レビュー
├── review.md ← 統合レビュー(最終成果物)
├── claude.log
└── copilot.log
ワーキングディレクトリ ~/claude-loop-pr-copilot/ 配下のファイルに直接アクセスできる。コマンドの allowed-tools により、Bash・Read・Write・Glob・Grep・Agent は承認なしで実行される。
許可ルールは以下の allowlist に従う。
| > 2> && <<'EOF' のみ許可するjq -n --arg を使う。ヒアドキュメントで JSON を直接組み立てないWrite ツールではなく Bash を使う600000 に固定する補助注記:
gh api や gh pr view の --jq フラグは使わないこと。クォート文字を含むフラグ値が「Command contains quoted characters in flag names」の承認プロンプトを発生させ、自動処理が停止する。代わりに | jq にパイプすること$() は使わないこと。PR #2 と同系統の承認プロンプト停止要因になるfor、while、while read、xargs などのループ・反復構文は使わないこと。PR #6 と同系統の停止要因になるWrite ツールを使うと、allowed-tools の自動承認が効かず承認プロンプトが発生するnpx claudepluginhub yuki777/pr-copilot --plugin pr-copilotReviews GitHub pull requests using parallel subagents for CLAUDE.md compliance, bugs, git history context, past feedback, and code comment adherence.
Performs thorough pull request reviews with parallel agents for bugs, security issues, guideline compliance, and error handling. Provides confidence-scored feedback and batched GitHub comments.
Runs a structured code review using Codex, Claude, or other engines as a closeout check before commit or ship.