| name | commit-push |
| description | リポジトリ内の未プッシュの変更をすべて確認し、適切なコミットに分割してコミット&プッシュする |
| user-invocable | true |
| model | sonnet |
未プッシュ変更の一括コミット&プッシュ
カレントディレクトリのGitリポジトリにある未プッシュの変更(unstaged、staged、untracked)をすべて確認し、論理的に適切な単位でコミットを分割してからプッシュします。
前提条件
- カレントディレクトリがGitリポジトリであること
- リモート(origin)が設定されていること
実行手順
Step 1: リポジトリの状態を確認
git status
git log --oneline origin/$(git branch --show-current)..HEAD 2>/dev/null
以下の3種類の変更を把握する:
- 未コミットの変更: unstaged(変更済み)、staged(ステージ済み)、untracked(新規ファイル)
- 未プッシュのコミット: ローカルにあってリモートにまだプッシュされていないコミット
未コミットの変更がない場合は Step 2・3 をスキップして Step 4 へ進む。
未コミットの変更も未プッシュのコミットもない場合は「プッシュする変更はありません」と伝えて終了する。
Step 2: 変更内容を分析してコミット分割案を作成
まず変更規模だけを確認する(生 diff を親コンテキストに取り込まない):
git diff --stat
git diff --cached --stat
git ls-files --others --exclude-standard
規模で処理を分岐する(重要:Prompt is too long 対策)
git diff --stat の合計行数 / ファイル数で処理方針を変える:
- 小規模: 合計 500行未満 かつ ファイル数 20未満 → 親エージェントで処理。必要なら個別に
git diff -- <path> で本文確認
- 大規模: 上記を超える場合 → Agent ツール(subagent_type=general-purpose)に分割判定を委譲
大規模時のサブエージェント委譲プロンプトは自己完結で書く(親コンテキストを参照させない):
- リポジトリの絶対パス
- 「
git status と git diff / git diff --cached を自分で実行して読み、下記の基準で論理単位のコミットに分割する計画を立ててほしい」
- 下記の分割基準を再掲
- 戻り値フォーマット:
[{"message": "1行日本語メッセージ", "files": ["path1", "path2"]}, ...] の JSON のみ(diff本文は返さない)
親はサブエージェントが返した JSON だけを受け取り、Step 3 以降の git add / git commit は親が実行する。これにより親のコンテキストに生 diff が流入せず Prompt is too long を回避できる。
分割基準
- 同じ機能・目的に関する変更はまとめる(例: 特定の機能追加に関するソース+テスト+設定)
- 異なる目的の変更は分ける(例: バグ修正とリファクタリングは別コミット)
- 設定ファイルの変更(.gitignore、package.json等)は関連する変更と一緒にするか、独立させる
- ドキュメントの変更は内容に応じて関連コミットに含めるか独立させる
- 判断に迷う場合は少なめに分割する(1つにまとめてOK)
Step 3: 分割案に従ってコミット
分析結果に基づき、各コミットを順番に自動実行する。
git add <ファイル群>
git commit -m "コミットメッセージ"
git add <ファイル群>
git commit -m "コミットメッセージ"
- コミットメッセージは1行の日本語でシンプルに書く
- ユーザーがコミットメッセージを指定した場合はそれを優先する
Step 4: プッシュ
すべてのコミットが完了したら(または既存の未プッシュコミットのみの場合)プッシュする。
git push
- 上流ブランチが未設定の場合は
git push -u origin $(git branch --show-current) を使う
- プッシュ失敗時はエラー内容をユーザーに伝え、対処法を提案する
Step 5: 結果の確認
git log --oneline -5
プッシュされたコミットの一覧を表示して完了を報告する。
注意事項
- 分割案の承認は不要。自動で分割・コミット・プッシュまで一気に実行する
--force push は絶対にしない
- マージコンフリクトが検出された場合はユーザーに報告して判断を仰ぐ