Files
2025-11-29 18:23:35 +08:00

307 lines
9.9 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# GitHub PR 自動修正コマンド
PRのレビューコメント(🚀リアクション付き)とCIエラーを自動的に修正します。
## 使用方法
```bash
/pr-fix [pr番号]
```
PR番号が指定されない場合は、現在のブランチのPRを使用します。
**重要**: 修正したいレビューコメントに🚀リアクションを追加してから実行してください。🚀リアクションがついたコメントのみが修正対象になります。
## 処理手順
1. PRとレビューコメント(🚀リアクション付き)を取得
2. CIの失敗状況を確認
3. レビューコメントの修正を適用
4. CIエラーを修正
5. テストとリンティングを実行して検証
6. コミットせずに変更内容の概要を表示
## 実装
### ステップ1: PR情報の取得
```bash
# PR番号の取得または指定
if [ -z "$1" ]; then
# 現在のブランチのPRを取得
CURRENT_BRANCH=$(git branch --show-current)
echo "🌿 現在のブランチ: $CURRENT_BRANCH"
PR_INFO=$(gh pr list --head "$CURRENT_BRANCH" --json number 2>/dev/null)
if [ -z "$PR_INFO" ] || [ "$PR_INFO" = "[]" ]; then
echo "❌ 現在のブランチにPRが見つかりません"
echo "💡 /pr-create でPRを作成するか、PR番号を指定してください: /pr-fix <PR番号>"
exit 1
fi
PR_NUMBER=$(echo "$PR_INFO" | jq -r '.[0].number')
else
PR_NUMBER=$1
fi
echo "📋 PR #$PR_NUMBER を修正します"
echo ""
```
### ステップ2: レビューコメント(🚀リアクション付き)の取得
```bash
echo "🚀 🚀リアクション付きレビューコメントを取得中..."
# PRのレビューコメントを取得
COMMENTS=$(gh api "repos/:owner/:repo/pulls/$PR_NUMBER/comments" 2>/dev/null || echo "")
if [ -z "$COMMENTS" ] || [ "$COMMENTS" = "[]" ]; then
echo " レビューコメントが見つかりません"
REVIEW_COMMENTS=""
else
# 🚀リアクション(rocket)がついたコメントのみを抽出
REVIEW_COMMENTS=$(echo "$COMMENTS" | jq -r '.[] | select(.reactions.rocket > 0) | {path: .path, line: .position, body: .body, id: .id} | @json')
if [ -z "$REVIEW_COMMENTS" ]; then
echo " 🚀リアクションがついたレビューコメントが見つかりません"
echo "💡 修正したいコメントに🚀リアクションを追加してから再実行してください"
else
COMMENT_COUNT=$(echo "$REVIEW_COMMENTS" | wc -l | tr -d ' ')
echo "📋 🚀リアクション付きコメント: ${COMMENT_COUNT}"
echo ""
echo "$REVIEW_COMMENTS" | jq -r '. | "- \(.path):\(.line) - \(.body)"'
echo ""
fi
fi
```
### ステップ3: CIエラーの確認
```bash
echo "🔍 CIエラーを確認中..."
# PRのチェック状態を取得
CHECK_RUNS=$(gh pr checks "$PR_NUMBER" 2>/dev/null || echo "")
if [ -n "$CHECK_RUNS" ]; then
FAILED_CHECKS=$(echo "$CHECK_RUNS" | grep -E "(fail|error|✗)" || echo "")
if [ -n "$FAILED_CHECKS" ]; then
echo "❌ CIエラーが見つかりました:"
echo "$FAILED_CHECKS"
echo ""
else
echo "✅ CIエラーはありません"
FAILED_CHECKS=""
fi
else
echo " CI情報を取得できませんでした"
FAILED_CHECKS=""
fi
# 修正対象が何もない場合は終了
if [ -z "$REVIEW_COMMENTS" ] && [ -z "$FAILED_CHECKS" ]; then
echo "✅ 修正対象が見つかりませんでした"
exit 0
fi
echo "🔧 修正を開始します..."
echo ""
```
### ステップ4: レビューコメントの修正適用
レビューコメントの種類に応じて適切な修正を実行:
1. **コードの提案**: 提案されたコード変更を直接適用
2. **スタイル/フォーマット**: リンターやフォーマッターを実行
3. **ロジックの問題**: 要求されたロジック変更を実装
4. **ドキュメント**: コメント、README、ドキュメントを更新
5. **テスト**: テストを追加または修正
6. **セキュリティ**: セキュリティ関連の修正を実施
```bash
if [ -n "$REVIEW_COMMENTS" ]; then
echo "📝 レビューコメントの修正を適用中..."
echo ""
echo "以下のレビューコメントを修正してください:"
echo "$REVIEW_COMMENTS" | jq -r '. | "\(.path):\(.line) - \(.body)"'
echo ""
echo "⚠️ 重要な制約:"
echo " - コードの品質を保ちながら修正すること"
echo " - 既存のコードスタイルに従うこと"
echo " - テストが通ることを確認すること"
echo ""
fi
```
### ステップ5: CIエラーの修正
CIエラーの種類に応じて自動修正を実行:
#### リンティングエラーの修正
```bash
if echo "$FAILED_CHECKS" | grep -qi "lint"; then
echo "📝 リンティングエラーを修正中..."
if [ -f "package.json" ]; then
echo "🔧 npm run lint --fix を実行中..."
npm run lint --fix 2>/dev/null || npm run lint:fix 2>/dev/null || echo "lintコマンドが見つかりません"
fi
if command -v ruff >/dev/null 2>&1; then
echo "🔧 ruff check --fix を実行中..."
ruff check --fix .
fi
if command -v golangci-lint >/dev/null 2>&1; then
echo "🔧 golangci-lint を実行中..."
golangci-lint run --fix
fi
echo "✅ リンティング修正完了"
echo ""
fi
```
#### 型エラーの修正
```bash
if echo "$FAILED_CHECKS" | grep -qi "type\|typescript"; then
echo "🏷️ 型エラーを分析中..."
if [ -f "tsconfig.json" ]; then
echo "🔧 TypeScript型チェックを実行中..."
npx tsc --noEmit 2>&1 | head -30
echo ""
echo "💡 上記の型エラーを修正してください"
echo ""
fi
fi
```
#### テスト失敗の修正
```bash
if echo "$FAILED_CHECKS" | grep -qi "test"; then
echo "🧪 テスト失敗を分析中..."
if [ -f "package.json" ]; then
echo "🔧 npm test を実行中..."
npm test 2>&1 | tail -30
elif [ -f "pytest.ini" ] || [ -f "pyproject.toml" ]; then
echo "🔧 pytest を実行中..."
python -m pytest -v --tb=short 2>&1 | tail -30
elif [ -f "go.mod" ]; then
echo "🔧 go test を実行中..."
go test ./... -v 2>&1 | tail -30
fi
echo ""
echo "💡 テスト失敗の詳細を確認して修正してください"
echo ""
fi
```
#### ビルドエラーの修正
```bash
if echo "$FAILED_CHECKS" | grep -qi "build"; then
echo "🏗️ ビルドエラーを修正中..."
if [ -f "package.json" ]; then
echo "📦 依存関係を更新中..."
npm install
echo "🔧 ビルドを試行中..."
npm run build 2>&1 | tail -30
fi
if [ -f "requirements.txt" ]; then
echo "📦 Python依存関係を更新中..."
pip install -r requirements.txt
fi
if [ -f "go.mod" ]; then
echo "📦 Go依存関係を更新中..."
go mod tidy
go build ./...
fi
echo ""
fi
```
### ステップ6: 修正の検証
```bash
echo "🧪 修正の検証中..."
echo ""
# リンティングチェック
echo "🔍 リンティングチェックを実行中..."
if [ -f "package.json" ]; then
npm run lint 2>/dev/null || echo "lintコマンドをスキップ"
fi
# テスト実行
echo "🧪 テストを実行中..."
if [ -f "package.json" ]; then
npm test 2>/dev/null && echo "✅ テスト成功" || echo "⚠️ テストで問題が残っています"
elif [ -f "pytest.ini" ] || [ -f "pyproject.toml" ]; then
python -m pytest 2>/dev/null && echo "✅ テスト成功" || echo "⚠️ テストで問題が残っています"
fi
echo ""
```
### ステップ7: 修正結果の表示
```bash
# 変更内容の確認
echo "📝 修正内容の確認:"
git status --porcelain
if [ -n "$(git status --porcelain)" ]; then
echo ""
echo "📋 修正されたファイル:"
git diff --name-only
echo ""
echo "📊 変更統計:"
git diff --stat
echo ""
echo "✅ 修正が適用されました!"
echo ""
echo "🔄 次のステップ:"
echo "1. 'git diff' で変更内容を詳細確認"
echo "2. 必要に応じて追加の修正を実施"
echo "3. /commit でコミット作成"
echo "4. /push-current でリモートにpush"
echo "5. 数分後に /ci-check で状態を確認"
else
echo ""
echo " 自動修正可能な変更が見つかりませんでした"
echo "💡 以下の対応が必要です:"
if [ -n "$REVIEW_COMMENTS" ]; then
echo " - レビューコメントの手動修正"
fi
if [ -n "$FAILED_CHECKS" ]; then
echo " - CIエラーの手動修正"
fi
fi
```
## 修正対象のまとめ
### レビューコメント修正
- 🚀リアクションがついたコメントのみを対象
- コードの提案を直接適用
- スタイル、ロジック、ドキュメント、テストの修正
### CIエラー修正
1. **リンティングエラー**: 自動修正ツールを実行
2. **型エラー**: TypeScript等の型チェックと分析
3. **テスト失敗**: テストを実行して失敗箇所を特定
4. **ビルドエラー**: 依存関係の更新とビルド実行
## エラーハンドリング
- PRが存在しない場合は適切なメッセージを表示
- GitHub CLIの権限エラー時は対処法を案内
- レビューコメントが不明確な場合はTODOコメントを追加
- 自動修正が不可能な場合は手動修正の必要性を通知
## 注意事項
- **🚀リアクション必須**: 修正したいコメントに🚀リアクションを追加してください
- すべてのエラーが自動修正できるわけではありません
- 複雑なロジックエラーは手動での修正が必要です
- 修正後は必ずローカルでテストを実行して検証してください
- コミットとプッシュは手動で実行してください