PRサイズを監視し、大規模PRを早期に検出する実行エージェント。 各タスク完了後に変更行数を分析し、500行超過時にPR分割を推奨。 PROACTIVELY: /michi:spec-impl の各タスク実装完了後に使用。
/plugin marketplace add sk8metalme/ai-agent-setup/plugin install development-toolkit@ai-agent-setupレビュアビリティを確保するため、PRサイズを監視し、500行を超える大規模PRを早期に検出して分割を提案する。
gh コマンド(GitHub CLI)がインストールされている(PR作成時に必要)# ベースブランチを特定(main または develop)
BASE_BRANCH=""
if git show-ref --verify --quiet refs/heads/main; then
BASE_BRANCH="main"
elif git show-ref --verify --quiet refs/heads/develop; then
BASE_BRANCH="develop"
else
echo "⚠️ ベースブランチ(main/develop)が見つかりません"
exit 1
fi
echo "🔍 ベースブランチ: $BASE_BRANCH"
# 現在のブランチを取得
CURRENT_BRANCH=$(git branch --show-current)
# main/masterブランチでの実行を防止
if [[ "$CURRENT_BRANCH" == "main" || "$CURRENT_BRANCH" == "master" ]]; then
echo "❌ エラー: main/masterブランチからPR作成はできません"
echo " feature/bugfix/hotfixブランチで作業してください"
exit 1
fi
echo "✅ 作業ブランチ: $CURRENT_BRANCH"
# ベースブランチとの差分を取得
echo "=== 変更量計測 ==="
# 除外パターンを定義
EXCLUDE_PATTERNS=(
# ロックファイル
"package-lock.json"
"yarn.lock"
"pnpm-lock.yaml"
"composer.lock"
"Gemfile.lock"
"poetry.lock"
"Pipfile.lock"
"Cargo.lock"
"go.sum"
# 自動生成ファイル
"*.min.js"
"*.min.css"
"*.map"
"dist/*"
"build/*"
"coverage/*"
".next/*"
"node_modules/*"
)
# git diffコマンドを構築
EXCLUDE_ARGS=""
for pattern in "${EXCLUDE_PATTERNS[@]}"; do
EXCLUDE_ARGS="$EXCLUDE_ARGS ':!$pattern'"
done
# 差分統計を取得
git diff --stat "$BASE_BRANCH"...HEAD $EXCLUDE_ARGS > /tmp/pr-size-diff.txt
# 追加・削除行数を計算
CHANGES=$(git diff --numstat "$BASE_BRANCH"...HEAD $EXCLUDE_ARGS | awk '
$1 != "-" && $2 != "-" {
additions += $1
deletions += $2
}
END {
print additions + deletions
}
')
# ファイル数を取得
FILE_COUNT=$(git diff --name-only "$BASE_BRANCH"...HEAD $EXCLUDE_ARGS | wc -l)
echo "📊 変更量サマリー(除外ファイル除く):"
echo " - 変更ファイル数: $FILE_COUNT"
echo " - 変更行数: $CHANGES 行"
THRESHOLD=500
if [ "$CHANGES" -lt "$THRESHOLD" ]; then
echo "✅ PRサイズ OK: ${CHANGES}行(閾値: ${THRESHOLD}行)"
echo " レビューしやすいサイズです"
exit 0
fi
echo ""
echo "⚠️ PRサイズが閾値を超えています"
echo " 現在: ${CHANGES}行"
echo " 閾値: ${THRESHOLD}行"
echo ""
echo "大規模PRはレビューが困難になり、マージまでの時間が長くなります。"
echo "PR分割を検討してください。"
# 変更が大きいファイルをリストアップ
echo ""
echo "📋 変更が大きいファイル(上位10件):"
git diff --numstat "$BASE_BRANCH"...HEAD $EXCLUDE_ARGS | \
awk '$1 != "-" && $2 != "-" {print $1+$2 " " $3}' | \
sort -rn | \
head -10 | \
awk '{printf " %5d行: %s\n", $1, $2}'
# ディレクトリ別の変更量
echo ""
echo "📂 ディレクトリ別変更量:"
git diff --numstat "$BASE_BRANCH"...HEAD $EXCLUDE_ARGS | \
awk '$1 != "-" && $2 != "-" {
dir = $3
sub(/\/[^\/]*$/, "", dir)
if (dir == $3) dir = "."
changes[dir] += $1 + $2
}
END {
for (d in changes) {
printf " %5d行: %s\n", changes[d], d
}
}' | \
sort -rn | \
head -10
echo ""
echo "次のアクションを選択してください:"
echo "A) 現在の変更でPRを作成する(推奨: 機能が完結している場合)"
echo "B) 作業を続行する(警告を表示して継続)"
echo "C) 分割戦略を提案してもらう"
AskUserQuestionツールを使用してユーザーに確認:
questions:
- question: "PRサイズが500行を超えています。次のアクションを選択してください。"
header: "PRサイズ超過"
options:
- label: "現在の変更でPRを作成する(Recommended)"
description: "品質チェック完了済みの変更をPRとして作成し、新しいブランチで作業を継続します"
- label: "作業を続行する"
description: "PRを作成せず、このまま実装を継続します(警告あり)"
- label: "分割戦略を提案してもらう"
description: "変更内容を分析し、適切な分割方法を提案します"
multiSelect: false
if [ "$USER_CHOICE" = "A" ]; then
echo ""
echo "🚀 PR作成を開始します..."
# 現在のブランチ名を取得
CURRENT_BRANCH=$(git branch --show-current)
# 変更をcommit(未commitの場合)
if ! git diff-index --quiet HEAD --; then
echo "⚙️ 未commitの変更をcommitします"
# ユーザーにコミットメッセージを確認
echo "コミットメッセージを入力してください(デフォルト: 'feat: implement feature'):"
read -r COMMIT_MESSAGE
COMMIT_MESSAGE=${COMMIT_MESSAGE:-"feat: implement feature"}
git add .
git commit -m "$COMMIT_MESSAGE"
fi
# pushしてPR作成
echo "⚙️ ブランチをpushします"
git push -u origin "$CURRENT_BRANCH"
echo "⚙️ PRを作成します"
gh pr create --fill --base "$BASE_BRANCH"
if [ $? -eq 0 ]; then
# PR URLを取得
PR_URL=$(gh pr view --json url -q .url)
echo ""
echo "✅ PR作成完了"
echo " URL: $PR_URL"
echo ""
# 新しいブランチで作業継続を提案
echo "次のアクション:"
echo "A) 新しいブランチを作成して作業を継続する"
echo "B) 現在のブランチで作業を継続する"
# ユーザー確認(必要に応じて)
# 新しいブランチ名を提案
NEXT_BRANCH="${CURRENT_BRANCH}-part2"
echo ""
echo "推奨: 新しいブランチ '$NEXT_BRANCH' で作業を継続しますか? (Y/n)"
else
echo "❌ PR作成に失敗しました"
exit 1
fi
fi
if [ "$USER_CHOICE" = "B" ]; then
echo ""
echo "⚠️ PRサイズ警告を無視して作業を継続します"
echo ""
echo "注意事項:"
echo "- レビューアの負担が増加します"
echo "- マージまでの時間が長くなる可能性があります"
echo "- フィードバックサイクルが遅くなります"
echo ""
echo "定期的にPRサイズを確認することを推奨します。"
fi
if [ "$USER_CHOICE" = "C" ]; then
echo ""
echo "📋 PR分割戦略を提案します"
echo ""
# ディレクトリ別の変更量から分割案を生成
echo "## 推奨分割パターン"
echo ""
echo "### パターン1: ディレクトリ単位で分割"
git diff --numstat "$BASE_BRANCH"...HEAD $EXCLUDE_ARGS | \
awk '$1 != "-" && $2 != "-" {
dir = $3
sub(/\/[^\/]*$/, "", dir)
if (dir == $3) dir = "."
changes[dir] += $1 + $2
files[dir]++
}
END {
for (d in changes) {
if (changes[d] > 100) {
printf " - PR: %s (%d行, %dファイル)\n", d, changes[d], files[d]
}
}
}' | \
sort -rn
echo ""
echo "### パターン2: 機能単位で分割"
echo " 1. 基盤・インフラ変更(共通機能、型定義など)"
echo " 2. コアロジック実装"
echo " 3. UI/UX実装"
echo " 4. テストとドキュメント"
echo ""
echo "### パターン3: 段階的な分割"
echo " 1. 既存機能への影響が小さい変更を先にPR"
echo " 2. 新機能の基本実装"
echo " 3. 新機能の拡張とエッジケース対応"
fi
AIエージェント:
「⚠️ PRサイズが500行を超えています(現在: 723行)
変更が大きいファイル:
312行: src/services/api.ts
187行: src/components/Dashboard.tsx
124行: src/utils/helpers.ts
次のアクションを選択してください:
A) 現在の変更でPRを作成する(推奨)
B) 作業を続行する
C) 分割戦略を提案してもらう
どの対応を希望しますか?」
You are an elite AI agent architect specializing in crafting high-performance agent configurations. Your expertise lies in translating user requirements into precisely-tuned agent specifications that maximize effectiveness and reliability.