163 lines
7.5 KiB
Markdown
163 lines
7.5 KiB
Markdown
# GitHub PR レビューコメント修正コマンド
|
||
|
||
PRのレビューコメントを自動的にチェックして、要求された修正を適用します。
|
||
|
||
## 使用方法
|
||
```bash
|
||
/review-fix [pr番号]
|
||
```
|
||
|
||
PR番号が指定されない場合は、現在のブランチのPRを使用します。
|
||
|
||
**重要**: 修正したいレビューコメントに👍リアクションを追加してから実行してください。👍リアクションがついたコメントのみが修正対象になります。
|
||
|
||
## 処理手順
|
||
1. GitHub CLIを使ってPRとレビューコメントを取得
|
||
2. 各レビューコメントを分析して実行可能なフィードバックを特定
|
||
3. 可能な限り要求された変更を自動適用
|
||
4. テストとリンティングを実行して修正を検証
|
||
5. コミットせずに変更内容の概要を表示
|
||
|
||
## 実装
|
||
PRの情報とレビューコメントの取得から開始します。
|
||
|
||
### ステップ1: PR情報の取得
|
||
```bash
|
||
# GitHub CLIの認証とスコープを最初にチェック
|
||
echo "🔍 GitHub CLIの設定を確認中..."
|
||
gh auth status
|
||
|
||
# PR番号が指定されていない場合は現在のブランチのPRを取得(フォールバック処理付き)
|
||
PR_INFO=$(gh pr view --json number,reviews,url 2>/dev/null || echo "")
|
||
if [ -z "$PR_INFO" ]; then
|
||
echo "❌ PR情報を取得できません。考えられる原因:"
|
||
echo " - 現在のブランチにPRが存在しない"
|
||
echo " - GitHub CLIに追加のスコープが必要 (read:org, read:discussion)"
|
||
echo " - 認証の問題"
|
||
echo ""
|
||
echo "💡 GitHub CLIのスコープを修正するには:"
|
||
echo " 1. https://github.com/settings/tokens にアクセス"
|
||
echo " 2. トークンに'read:org'と'read:discussion'スコープを追加"
|
||
echo " 3. 実行: gh auth login --with-token < your_token_file"
|
||
echo ""
|
||
echo "🔄 代替方法: PR番号を手動で指定 /review-fix <pr番号>"
|
||
exit 1
|
||
fi
|
||
|
||
# 後続のコマンドで使用するためにPR番号を抽出
|
||
PR_NUMBER=$(echo "$PR_INFO" | jq -r '.number')
|
||
echo "📋 PR #$PR_NUMBER を発見"
|
||
```
|
||
|
||
### ステップ2: レビューコメントの取得
|
||
```bash
|
||
# 包括的なエラーハンドリングでレビューコメントを取得
|
||
echo "📥 PR #$PR_NUMBER のレビューコメントを取得中..."
|
||
|
||
# レビューデータを取得する複数の方法を試行
|
||
REVIEWS=$(gh pr view $PR_NUMBER --json reviews 2>/dev/null || echo "")
|
||
COMMENTS=$(gh api "repos/:owner/:repo/pulls/$PR_NUMBER/comments" 2>/dev/null || echo "")
|
||
|
||
if [ -z "$REVIEWS" ] && [ -z "$COMMENTS" ]; then
|
||
echo "❌ レビューコメントを取得できません。GitHub CLIの権限を確認してください。"
|
||
echo "💡 必要なスコープ: repo, read:org, read:discussion"
|
||
exit 1
|
||
fi
|
||
|
||
# レビューサマリーを解析して表示
|
||
echo "📊 レビューサマリー:"
|
||
if [ -n "$REVIEWS" ]; then
|
||
echo "$REVIEWS" | jq -r '.reviews[] | "- \(.state) by \(.user.login): \(.body // "コメントなし")"'
|
||
fi
|
||
|
||
if [ -n "$COMMENTS" ]; then
|
||
echo "💬 行コメント:"
|
||
echo "$COMMENTS" | jq -r '.[] | "- \(.path):\(.line) - \(.body)"'
|
||
fi
|
||
```
|
||
|
||
### ステップ3: 修正対象コメントの特定
|
||
```bash
|
||
# 👍リアクションがついたコメントを修正対象として特定
|
||
echo "🔍 修正対象のレビューコメントを特定中..."
|
||
|
||
# 👍リアクションがついているコメントのみを抽出
|
||
TARGET_COMMENTS=$(echo "$COMMENTS" | jq -r '.[] | select(.reactions."+1" > 0) | {path: .path, line: .line, body: .body}')
|
||
|
||
if [ -z "$TARGET_COMMENTS" ] || [ "$TARGET_COMMENTS" = "null" ]; then
|
||
echo "ℹ️ 👍リアクションがついたレビューコメントが見つかりません"
|
||
echo "💡 修正したいコメントに👍リアクションを追加してから再実行してください"
|
||
exit 0
|
||
fi
|
||
|
||
echo "📋 修正対象のコメント:"
|
||
echo "$TARGET_COMMENTS" | jq -r '"- \(.path):\(.line) - \(.body)"'
|
||
```
|
||
|
||
### ステップ4: コメントの解析と分類
|
||
👍リアクションがついた各レビューコメントについて:
|
||
1. **コードの提案**: 提案されたコード変更を直接適用
|
||
2. **スタイル/フォーマット**: 適切なリンターやフォーマッターを実行
|
||
3. **ロジックの問題**: 要求されたロジック変更を分析して実装
|
||
4. **ドキュメント**: 要求に応じてコメント、README、ドキュメントを更新
|
||
5. **テスト**: 提案に従ってテストを追加または修正
|
||
6. **セキュリティ懸念**: セキュリティ関連のフィードバックに対処
|
||
|
||
### ステップ5: 修正の体系的適用
|
||
- レビューコメントのファイルパスと行番号を使用して、必要な変更箇所を正確に特定
|
||
- コードの提案については、提案されたdiffを直接適用
|
||
- より幅広いフィードバックについては、包括的な修正を実装
|
||
- 各修正が既存の機能を破損しないことを検証
|
||
|
||
### ステップ6: 変更の検証
|
||
```bash
|
||
# 修正を検証するためにテストを実行(利用可能な場合)
|
||
echo "🧪 修正を検証するためにテストを実行中..."
|
||
npm test || python -m pytest || go test || cargo test || echo "テストコマンドが見つかりません"
|
||
|
||
# コードスタイルをチェックするためにリンティングを実行
|
||
echo "🔍 リンティングチェックを実行中..."
|
||
npm run lint || ruff check || golangci-lint run || echo "リントコマンドが見つかりません"
|
||
|
||
# 行われた変更を表示するためにgit statusを表示
|
||
echo "📝 行われた変更の概要:"
|
||
git status --porcelain
|
||
echo ""
|
||
echo "📋 詳細diff:"
|
||
git diff --stat
|
||
echo ""
|
||
echo "✅ レビュー修正が正常に適用されました!"
|
||
echo "💡 準備ができたら /commit-create を使用してこれらの変更をコミットしてください"
|
||
```
|
||
|
||
### ステップ7: サマリーレポート
|
||
```bash
|
||
# 適用された修正のサマリーを生成
|
||
echo "🤖 レビュー修正サマリー:"
|
||
echo "- PRレビューコメントの問題を修正"
|
||
echo "- 可能な限りコードの提案を適用"
|
||
echo "- スタイル/フォーマットの問題を解決"
|
||
echo "- 要求に応じてドキュメントを更新"
|
||
echo ""
|
||
echo "📊 変更されたファイル数: $(git diff --name-only | wc -l)"
|
||
echo "📈 変更された行数: +$(git diff --numstat | awk '{add+=$1} END {print add}') -$(git diff --numstat | awk '{del+=$2} END {print del}')"
|
||
echo ""
|
||
echo "🔄 次のステップ:"
|
||
echo "1. 'git diff' で変更内容を確認"
|
||
echo "2. 必要に応じて追加のテストを実行"
|
||
echo "3. 満足したら /commit-create を使用してコミット"
|
||
```
|
||
|
||
## エラーハンドリング
|
||
- レビューコメントが不明確な場合は、手動レビュー用のTODOコメントを表示
|
||
- 自動修正が不可能な場合は、コード内にTODOコメントを作成
|
||
- 修正後にテストが失敗した場合は、失敗詳細を表示してガイダンスを求める
|
||
- マージコンフリクトを適切に処理し、発見されたコンフリクトを報告
|
||
|
||
## 注意事項
|
||
- **👍リアクション必須**: 修正したいコメントに👍リアクションを追加してください
|
||
- 明確に要求され、安全な変更のみを適用
|
||
- 複雑なロジック変更については、保守的に実装し確認を求める
|
||
- 既存のコードスタイルとパターンを保持
|
||
- 修正を検証するために必ずテストを実行するが、自動的にはコミットしない
|
||
- レビュー後に変更をコミットするには /commit-create コマンドを使用 |