dotfiles/claude/skills/ba2-review-pr/SKILL.md
Pull Request を Claude がレビューするスキル。レビュー対象はローカルのクローン位置に依存せず、git / gh のコンテキストから解決する(引数なしなら現在ブランチの PR、BAX-XXXX / PR番号 / URL を渡せばその PR を直接取得)。差分を読み、観点に沿った日本語レビューを生成し、結果を ba2-workspace の docs/{苗字}/レビュー/ に自動保存して commit & push する。任意で gh pr comment / inline review として PR にも投稿できる。「PRをレビューして」「このPRレビュー」「BAX-12345をレビュー」「/ba2-review-pr」などのリクエストで使用。
npx skillsauth add octkp/base ba2-review-prInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Pull Request を Claude がレビューする。create-pr と対になるスキルで、レビュー対象はローカルのクローン位置(絶対パス)に一切依存しない。gh CLI が「いまいるリポジトリの GitHub remote」または「渡された PR 参照」から対象を解決するため、メンバーごとにクローン場所がバラバラでも追加設定は不要。
なぜパス指定が不要か:
ghは GitHub 上の論理的な PR を対象にする。ba2-skill-installerのようにファイルを物理コピーする配布系スキルとは異なり、レビューはローカルの絶対パスを必要としない。BA2_WORKSPACE等のパス設定はこのスキルに持ち込まない。
/ba2-review-pr # カレントリポジトリの「現在ブランチの PR」を自動特定してレビュー
/ba2-review-pr BAX-12345 # ブランチ名 BAX-12345 の PR をレビュー
/ba2-review-pr 123 # PR 番号 #123 をレビュー
/ba2-review-pr <PR の URL> # 任意リポジトリの PR を URL 指定でレビュー(クローン不要)
引数の有無で対象解決の方法を切り替える(後述の Step 1)。
gh auth status で認証状態を確認。未認証ならエラー終了:
gh auth login を実行してください。」レビュー結果を保存する ba2-workspace のパス(BA2_ROOT)を解決する(後述 Step 5 で使う)。レビュー対象の解決とは別物であることに注意。レビュー対象は gh(GitHub 上の論理 PR)で解く一方、保存先はローカルの ba2-workspace クローンを指す必要があるため、ba2-skill-installer / ba2-skills-readme と同じ優先順位で解決する:
# 保存先 ba2-workspace の解決(レビュー対象リポの中で実行されている可能性があるため git 一発では決められない)
BA2_ROOT="${BA2_WORKSPACE:-}"
if [ -z "$BA2_ROOT" ]; then
GIT_TOP=$(git rev-parse --show-toplevel 2>/dev/null)
if [ -n "$GIT_TOP" ] && [ "$(basename "$GIT_TOP")" = "ba2-workspace" ]; then
BA2_ROOT="$GIT_TOP"
fi
fi
: "${BA2_ROOT:=$HOME/ghq/github.com/kokopelli-inc/ba2-workspace}"
if [ ! -d "$BA2_ROOT/docs" ]; then
echo "WARN: ba2-workspace が $BA2_ROOT に見つかりません。BA2_WORKSPACE 環境変数で指定してください。レビューは続行し、保存だけスキップします。" >&2
fi
# 苗字(docs/{苗字}/ のフォルダ名): whoami の末尾 _◯ を除く
USER_NAME=$(whoami | sed 's/_[^_]*$//'); [ -z "$USER_NAME" ] && USER_NAME=$(whoami)
ghq を使っていないメンバーは BA2_WORKSPACE を環境変数で指定する。$BA2_ROOT/docs が見つからない場合は、レビュー自体は続行し保存だけスキップする(対象解決はパス非依存なのでレビューは常に可能)。引数を $ARG(無ければ空)として、以下の優先順で PR を一意に特定する。
ここで決めた識別子を、以降のコマンドの <PR> に使う(番号 / URL / --head ブランチ名 のいずれか)。
gh pr view --json number,url,title,headRefName,baseRefName,state
gh pr view "<URL>" --json number,url,title,headRefName,baseRefName,state
gh pr view <番号> --json number,url,title,headRefName,baseRefName,state
--repo owner/name を併用する。gh pr list --head "<ブランチ名>" --json number,url,title,headRefName,baseRefName,state --jq '.[0]'
<ブランチ名> の PR が見つかりません」と表示して終了。判定の目安:
https?://を含む → B、全部数字 → C、それ以外で引数あり → D、引数なし → A。
特定した <PR> に対して:
gh pr view <PR> --json title,body,headRefName,baseRefName,additions,deletions,changedFiles,files,headRepository
gh pr diff <PR> # 差分本体
headRepository.name から取得する(URL 指定時は URL 中の <repo> でも可)。gh pr diff <PR> -- <path> に分割して読む。https://kokopelli-inc.atlassian.net/browse/BAX-XXXX)が PR 本文にあれば、変更意図の確認に使う。差分を読み、以下の観点で日本語のレビューを構成する。指摘は「ファイル:行」を添えて具体的に、根拠とともに書く。
指摘は重要度で整理する:
レビュー結果をチャットに表示する。この時点では GitHub には何も書かない。
レビュー結果を ba2-workspace の docs/{苗字}/レビュー/ 配下に Markdown として必ず保存する(ba2-ticket-knowledge-logger が docs にナレッジを残すのと同じ思想。docs/ 配下は main 直プッシュが許可されている運用なので、保存後の commit & push まで自動で行う)。
このスキルは CLAUDE.md の「
docs/{苗字}/...への書き込み」許可主体にba2-ticket-knowledge-loggerと並んで明記された例外である(docs/{苗字}/レビュー/のみ)。それ以外の docs サブディレクトリには書き込まない。
保存先は 1 レビュー = 1 ディレクトリとし、その中に REVIEW.md を置く。ディレクトリ名は {JIRAチケット番号}_{リポジトリ名}_{PR番号} 形式。
# BA2_ROOT / USER_NAME は Step 0 で解決済み
# JIRA チケット番号: head ブランチ名から [A-Z]+-[0-9]+ を抽出(例: BAX-11452)
JIRA=$(echo "<headRefName>" | grep -oE '[A-Z]+-[0-9]+' | head -1)
# 取れなければ PR 本文中の JIRA URL から抽出、それも無ければ NOJIRA
[ -z "$JIRA" ] && JIRA=$(echo "<PR body>" | grep -oE 'browse/[A-Z]+-[0-9]+' | grep -oE '[A-Z]+-[0-9]+' | head -1)
[ -z "$JIRA" ] && JIRA="NOJIRA"
# リポジトリ名: gh pr view <PR> --json headRepository --jq '.headRepository.name'
# (URL https://github.com/<owner>/<repo>/pull/<n> の <repo> でも可)
REPO="<リポジトリ名>" # 例: bigadvance
PRNUM="<PR番号>" # 例: 2127
REVIEW_DIR="$BA2_ROOT/docs/$USER_NAME/レビュー/${JIRA}_${REPO}_${PRNUM}"
mkdir -p "$REVIEW_DIR"
FILE="$REVIEW_DIR/REVIEW.md" # 例: docs/takano/レビュー/BAX-11452_bigadvance_2127/REVIEW.md
$BA2_ROOT/docs が無い(Step 0 で WARN)場合は保存をスキップし、その旨をチャットで伝える(レビュー結果自体は Step 4 で提示済み)。REVIEW.md が既にある場合は全文を上書きせず、本文末尾に再レビューのセクション(## 再レビュー {YYYY-MM-DD HH:MM})を足す形で更新する。/ 等)が含まれる場合は _ に置換する。# レビュー: <PR タイトル>
- **対象 PR**: <url>(#<番号>, head: <headRefName> → base: <baseRefName>)
- **規模**: <changedFiles> files, +<additions> -<deletions>
- **関連 JIRA**: https://kokopelli-inc.atlassian.net/browse/BAX-XXXX(PR 本文にあれば)
- **レビュー日時**: <YYYY-MM-DD HH:MM>(`date "+%Y-%m-%d %H:%M"`)
- **レビュアー**: <USER_NAME>(Claude Code / ba2-review-pr スキル)
## 🔴 must
...
## 🟡 should
...
## 🟢 nits
...
## 総評
(任意。全体所感)
docs/ 配下は main 直プッシュ可の運用なので、当該ファイルだけを add してコミット・プッシュする(ユーザー確認不要)。
cd "$BA2_ROOT" && \
git add "docs/$USER_NAME/レビュー/${JIRA}_${REPO}_${PRNUM}/" && \
git commit -m "review: ${JIRA} ${REPO}#${PRNUM} のレビューを記録
Co-Authored-By: Claude Opus 4.8 <[email protected]>" && \
git push origin main
nothing to commit)場合はスキップしてよい。REVIEW.md の GitHub リンクをチャットに提示する:
https://github.com/kokopelli-inc/ba2-workspace/blob/main/docs/<USER_NAME>/レビュー/${JIRA}_${REPO}_${PRNUM}/REVIEW.mddocs への保存とは別に、PR そのものへコメントするかは確認制。末尾に「このレビューを PR(#<番号>) にもコメント投稿しますか?」と確認し、希望した場合のみ実行する。
PR 全体への要約コメント:
gh pr comment <PR> --body "$(cat <<'EOF'
## 🔍 Claude レビュー
{要約と must/should/nits の整理}
EOF
)"
行に紐づくインラインレビューを希望する場合は gh pr review を使う:
gh pr review <PR> --comment --body "{総評}"
投稿は外部に公開される操作なので、必ずユーザーの明示的な確認を取ってから実行する。承認(approve)や変更要求(request-changes)は人間の判断に委ねる(Claude が
--approveを勝手に付けない)。
## 🔍 レビュー: BAX-12345 チャットメンバー表示の不整合を修正
対象: #123 (head: BAX-12345 → base: develop) / 7 files, +210 -45
### 🔴 must
- `src/foo/Bar.java:88` — グループ削除後も room_member が残るため…(根拠)
### 🟡 should
- `src/foo/Baz.java:42` — このメソッドは…(提案)
### 🟢 nits
- 命名 `tmp` → `targetRoomId` の方が意図が伝わる
| 状況 | 対応 |
|------|------|
| gh CLI 未認証 | エラー表示して終了 |
| 引数なし・現在ブランチに PR なし | PR 番号 / URL / ブランチ名の指定を促して終了 |
| ブランチ名指定で PR が見つからない | その旨を表示して終了 |
| 差分が巨大 | ファイル単位に分割して読む。重要ファイルを優先 |
| 別リポの PR 番号 | --repo owner/name の併用を案内 |
| ba2-workspace の docs が見つからない | レビューは続行し、docs 保存だけスキップ。BA2_WORKSPACE 指定を案内 |
| docs の push 失敗 | エラー表示。ローカル保存は完了とみなし、後で人手 push を案内 |
BA2_WORKSPACE は「レビュー結果の保存先 ba2-workspace」を指すためだけに使い、レビュー対象の特定には使わない)。docs/{苗字}/レビュー/ 以外の docs サブディレクトリへの書き込み(レビュー以外のナレッジは ba2-ticket-knowledge-logger の責務)。documentation
base リポジトリ(~/base)の主要ディレクトリ(dotfiles / home / local / scripts / docs)の README.md と、リポジトリ直下の README.md を、実際のファイル構成に合わせて更新・新規作成するスキル。各ディレクトリの中身を実際に走査して内容を導出するので、設定追加・ディレクトリ移動のあとに走らせると README が現状と一致する。「READMEを更新して」「READMEを作り直して」「base のドキュメントを整える」「/base-readme」などのリクエストで使用。
development
旧 badev-knowledge-base リポの docs/{苗字}/ 配下を、許可リストの現役メンバー 4 人 (takano / tokita / yukioka / ushiroyama) に絞って ba2-workspace/docs/ に同期するスキル。旧リポを source of truth として、衝突時は新リポ側を旧リポで上書きする。コミット・プッシュは行わず、git add までで停止する。「badev-knowledge-base から同期して」「旧リポのナレッジを取り込んで」「badev-knowledge-sync を走らせて」「旧 docs を同期」などのリクエストでトリガー。
documentation
チケット番号(BAX-XXXX)を伝えるだけで、ba2-ticket-knowledge-logger が記録したナレッジドキュメント(README.md / LOG.md / PLAN.md)を全ユーザー・全カテゴリ横断で自動検索して読み込み、要約して提示するスキル。別セッションで過去の調査・実装内容を読み直したいときに使う。「BAX-10987」「BAX-10325のナレッジ読んで」「前に調べたBAX-XXXXの記録」「BAX-XXXXの続きをやりたい」「BAX-XXXX読み直して」などのリクエストでトリガー。
tools
チケット番号(BAX-XXXX)とカテゴリ(調査/実装/その他)を指定して、会話ログとまとめファイルを記録し、JIRAチケットにもコメントとしてナレッジを投稿するスキル。「BAX-10325の調査を記録」「実装にチケット作成」「会話ログを保存」などのリクエストで使用。