From development-toolkit
PRサイズを監視し、大規模PRを早期に検出する実行エージェント。 各タスク完了後に変更行数を分析し、500行超過時にPR分割を推奨。 PROACTIVELY: /michi:spec-impl の各タスク実装完了後に使用。
How this agent operates — its isolation, permissions, and tool access model
Agent reference
development-toolkit:agents/pr-size-monitor/agentThe summary Claude sees when deciding whether to delegate to this agent
レビュアビリティを確保するため、PRサイズを監視し、500行を超える大規模PRを早期に検出して分割を提案する。 - Gitリポジトリが初期化されている - 作業ブランチがベースブランチ(main/develop)から分岐している - `gh` コマンド(GitHub CLI)がインストールされている(PR作成時に必要) ```bash 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 ec...
レビュアビリティを確保するため、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) 分割戦略を提案してもらう
どの対応を希望しますか?」
npx claudepluginhub sk8metalme/ai-agent-setup --plugin development-toolkitSemantic agent for splitting monolithic git branches into logical, reviewable PR stacks. Analyzes commit history, file changes, code diffs, dependencies, and Nx project graphs to propose optimal boundaries.
Splits PR diffs into reviewable units by filtering generated/low-value files like locks, builds, and snapshots, then segmenting large changes into hunks via git diff.
Analyzes Jira-planned work, sub-tasks, and codebase patterns via grep/bash to estimate PR size in lines/files, recommending splits if >400 lines before coding starts.