Loading...
Loading...
Performs comprehensive PR code review from 5 perspectives (quality/performance/tests/docs/security) in parallel, providing Blockers/Suggestions/Nice-to-have and merge decision. Args: /review [owner/repo] [pr-number] [--focus all|security|perf|qa|docs|types] Activates when user mentions "review", "PR確認", "コードレビュー", "マージ判定".
npx skill4agent add yusuketsunoda/ppt-trans review/review [owner/repo] [pr-number] [--focus <aspect>]
/review --local [--focus <aspect>]| 引数 | 必須 | 説明 |
|---|---|---|
| Yes* | GitHubリポジトリ(例: |
| Yes* | PRの番号 |
| No | ローカルの差分をレビュー(PR作成前のセルフレビュー用) |
| No | 実行するレビュー観点を限定(デフォルト: |
--localowner/repopr-number| 値 | 実行されるエージェント | ユースケース |
|---|---|---|
| 全5エージェント | 通常のPRレビュー(デフォルト) |
| security-code-reviewer | 認証/認可/Stripe変更時 |
| performance-reviewer | N+1/キャッシュ/PPTX処理変更時 |
| test-coverage-reviewer | テストファイル変更時 |
| documentation-accuracy-reviewer | env/README/CLAUDE.md変更時 |
| code-quality-reviewer | 型定義/API変更時 |
/review --local [--focus <aspect>]--focusgit symbolic-ref refs/remotes/origin/HEADmainmainmastermasterdevelopdevelopgit merge-base HEAD <candidate># 全観点レビュー(デフォルト)
/review my-org/ppt-trans 123
# セキュリティのみ
/review my-org/ppt-trans 123 --focus security
# パフォーマンスのみ
/review my-org/ppt-trans 123 --focus perf
# ローカル差分の全観点レビュー
/review --local
# ローカル差分のセキュリティレビューのみ
/review --local --focus security### Checklist Coverage (must-check v1.0)
| Domain | Status |
|--------|--------|
| Supabase | ✅ OK / ⚠️ 要確認 / ❌ NG / N/A |
| Pipeline | ✅ / ⚠️ / ❌ / N/A |
| Env/Secrets | ✅ / ⚠️ / ❌ / N/A |
| Tests | ✅ / ⚠️ / ❌ / N/A |
| Stripe | ✅ / ⚠️ / ❌ / N/A |- [confidence=85] RLS policy が無い (supabase/migrations/xxx.sql:15)
Evidence: `grep -n "CREATE POLICY" supabase/migrations/xxx.sql` → 結果なしCLAUDE.md.claude/review-checklists/README.md.claude/review-checklists/must-check.mdv1.0# 0) 事前 fetch(失敗しても続行)
git fetch origin --prune --tags >/dev/null 2>&1 || true
# ベースブランチ自動検出(ループ式で安全に)
BASE=""
# 1) origin/HEAD から default branch を取得
if git symbolic-ref -q refs/remotes/origin/HEAD >/dev/null 2>&1; then
BASE="$(git symbolic-ref refs/remotes/origin/HEAD | sed 's|refs/remotes/origin/||')"
fi
# 2) fallback candidates(main → master → develop)
if [ -z "$BASE" ]; then
for b in main master develop; do
if git show-ref -q "refs/remotes/origin/$b"; then
BASE="$b"
break
fi
done
fi
# 3) last resort
[ -z "$BASE" ] && BASE="main"
echo "Base branch: $BASE"
# 4) 対象ファイル列を先に確定(レビュー負荷軽減)
CHANGED_FILES=$(git diff --name-only "origin/$BASE...HEAD")
echo "Changed files:"
echo "$CHANGED_FILES"
# 5) 領域判定(docs/ だけなら security/perf を N/A に寄せる等)
if echo "$CHANGED_FILES" | grep -qv '^docs/'; then
# コード変更あり → 全観点レビュー
git diff "origin/$BASE...HEAD"
else
# docs/ のみ → documentation 観点のみ
echo "Docs-only change detected, focusing on documentation review"
figh pr view <PR_NUMBER> --repo <REPO> --json title,body,author,labels,files,additions,deletions,url
gh pr diff <PR_NUMBER> --repo <REPO>| --focus | 実行エージェント |
|---|---|
| 全5エージェント並列 |
| security-code-reviewer のみ |
| performance-reviewer のみ |
| test-coverage-reviewer のみ |
| documentation-accuracy-reviewer のみ |
| code-quality-reviewer のみ |
| エージェント | subagent_type | 責務 |
|---|---|---|
| code-quality-reviewer | code-quality-reviewer | コード品質・設計・型安全 |
| performance-reviewer | performance-reviewer | パフォーマンス・N+1・キャッシュ |
| security-code-reviewer | security-code-reviewer | RLS・Webhook・IDOR・XSS |
| test-coverage-reviewer | test-coverage-reviewer | Playwright決定論・モック・カバレッジ |
| documentation-accuracy-reviewer | documentation-accuracy-reviewer | env・手順・文言の整合性 |
--focus all--focus <aspect>## コンテキスト
- スタック: Next.js 16 + React 19 + TypeScript + Supabase + Stripe + Playwright
- プロジェクトルール: [CLAUDE.md要約]
- PR要約: [Phase 0の要約]
- 変更ファイル: [ファイル一覧]
## 重点チェック(ppt-trans固有)
- Next.js 16: params: Promise<T> の正しい実装
- Server Actions vs API Routes の使い分け
- Schema-First開発(openapi.yaml先行)
- Supabase RLS、snake_case型、型再生成
- E2E: UNIFIED_TEST_CONFIG参照、ハードコード禁止npm run type-check # 型チェック
npm run lint # リント
npm run test # 影響範囲のテスト# PR差分のAPI Routeファイルで performSecurityChecks を呼んでいないものを検出
# allowlist: webhook(自前署名検証), health, test endpoints
for f in $(git diff --name-only "origin/$BASE...HEAD" | grep 'src/app/api/.*/route\.ts'); do
if ! grep -q "performSecurityChecks" "$f"; then
basename_dir=$(dirname "$f" | sed 's|src/app/api/||')
# allowlist check
case "$basename_dir" in
stripe/webhook|health|test/*) continue ;;
*) echo "MISSING performSecurityChecks: $f" ;;
esac
fi
done# PR差分のマイグレーションで CREATE TABLE があるのに CREATE POLICY がないものを検出
for f in $(git diff --name-only "origin/$BASE...HEAD" | grep 'supabase/migrations/.*\.sql'); do
tables=$(grep -oP 'CREATE TABLE (?:IF NOT EXISTS )?(?:public\.)?\K\w+' "$f" 2>/dev/null)
for t in $tables; do
if ! grep -q "CREATE POLICY.*ON.*$t" "$f"; then
echo "MISSING RLS: table=$t in $f"
fi
done
done# PR差分でセキュリティ関連コードパス(reject/error/401/403)があるのにlogEventがないファイルを検出
for f in $(git diff --name-only "origin/$BASE...HEAD" | grep -E '\.(ts|tsx)$'); do
# セキュリティ判定コード(403/401返却, reject, unauthorized)を含むか
if grep -qE '(status.*40[13]|"unauthorized"|"forbidden"|rejectWith|createErrorResponse.*40)' "$f"; then
if ! grep -q "logEvent\|SecurityMonitor" "$f"; then
echo "MISSING SecurityMonitor: $f"
fi
fi
done.claude/agents/review-aggregator.md[confidence=XX].claude/docs/reviewer-output-format.mdgh pr comment <PR_NUMBER> --repo <REPO> --body "$(cat <<'EOF'
## Code Review Summary
### Summary
[2-4行の要約]
### Checklist Coverage (must-check v1.0)
| Domain | Status |
|--------|--------|
| Supabase | ✅ / ⚠️ / ❌ / N/A |
| Pipeline | ✅ / ⚠️ / ❌ / N/A |
| Env/Secrets | ✅ / ⚠️ / ❌ / N/A |
| Tests | ✅ / ⚠️ / ❌ / N/A |
| Stripe | ✅ / ⚠️ / ❌ / N/A |
### 🔴 Blockers
- [なければ「なし」]
### 🟡 Suggestions
- [confidence>=75 には Evidence 必須]
### 🟢 Nice-to-have
- [箇条書き]
### Automated Checks
- Type check: [✅/❌/⏭️]
- Lint: [✅/❌/⏭️]
- Tests: [✅/❌/⏭️]
### Merge Decision
[✅/⚠️/❌ + 理由]
---
🤖 Reviewed by Claude Code (5-domain parallel review)
EOF
)"review_meta:
checklist_version: "v1.0"
domains_ran: ["code-quality","security","performance","test-coverage","documentation"]
blockers_count: 0
important_count: 2
suggestions_count: 5
confidence_max: 85
merge_decision: "merge" # merge | merge_with_followups | needs_changes🤖 Reviewed by Claude Code (ppt-trans 5-domain review)review_output.mdこのPRのコード品質をレビューしてください。
Context:
- Stack: Next.js 16 + React 19 + TypeScript + Supabase + Stripe + Playwright
- Rules: [CLAUDE.md summary]
- PR Map: [short PR map]
- Files: [changed file list]
ppt-trans固有のチェック:
- Next.js 16: params: Promise<T> → await params
- Server Actions優先(API RoutesはWebhook/SSE/バイナリのみ)
- Schema-First開発(openapi.yaml → generate:types → 実装)
- any禁止、!禁止、@/*エイリアス必須
Output format:
Summary / Blockers / Suggestions / Nice-to-haveこのPRのパフォーマンスリスクをレビューしてください。
Context:
- Stack: Next.js 16 + React 19 + TypeScript + Supabase + Stripe + Playwright
- Rules: [CLAUDE.md summary]
- PR Map: [short PR map]
- Files: [changed file list]
ppt-trans固有のチェック:
- N+1クエリ、不要なSELECT
- PPTX処理の同期ブロック、プレビューキャッシュ
- Python subprocess呼び出しの効率
Output format:
Summary / Hotspots / RecommendationsこのPRのセキュリティ問題をレビューしてください。
Context:
- Stack: Next.js 16 + React 19 + TypeScript + Supabase + Stripe + Playwright
- Rules: [CLAUDE.md summary]
- PR Map: [short PR map]
- Files: [changed file list]
ppt-trans固有のチェック:
- Supabase RLS有効確認、Service Role Key漏えい
- Stripe Webhook署名検証、冪等性(stripe_events)
- Rate Limiting: 認証10/15min、翻訳50/hour、アップロード20/hour
Output format:
Summary / Blockers / Findings / Follow-upsこのPRのテスト(unit/E2E)をレビューしてください。
Context:
- Stack: Next.js 16 + React 19 + TypeScript + Supabase + Stripe + Playwright
- Rules: [CLAUDE.md summary]
- PR Map: [short PR map]
- Files: [changed file list]
ppt-trans固有のチェック:
- UNIFIED_TEST_CONFIG参照必須(ハードコード禁止)
- 認証状態パス: .auth/user.json
- /api/auth/loginは存在しない(ナビゲーション待機を使用)
Output format:
Summary / Flaky risks / Missing scenarios / ImprovementsこのPRのドキュメント整合性をレビューしてください。
Context:
- Stack: Next.js 16 + React 19 + TypeScript + Supabase + Stripe + Playwright
- Rules: [CLAUDE.md summary]
- PR Map: [short PR map]
- Files: [changed file list]
ppt-trans固有のチェック:
- .env.example / READMEのenv一覧が最新か
- Schema-First: openapi.yaml更新、generate:types実行
- CLAUDE.md / .claude/rules/ との整合
Output format:
Summary / Docs to update / Inconsistencies / Proposed editsgh