プルリクエストのタイトルと本文を用意し、上記 "既存PR" の有無に応じて新規作成または更新する。
既存PRの有無・同一性の判定は、Context の "既存PR" および "既存PRの同一性チェック" の値のみを正とする。 gh pr view(引数なし)や gh pr list(--state open を付けない形)などで既存PRを独自に探し直してはいけない。これらは close/merge 済みのPRまでカレントブランチから解決してしまい、ブランチ名を使い回したときに無関係な過去のPRを誤って掴む原因になる(実際にこの誤りでマージ済みPRのタイトル/本文を上書きする事故が起きた)。既存PRの番号・URL・現行タイトル/本文が必要な場合も、Context に出ている値をそのまま使う。
まず、PRに含めるコミット集合と diff をこの時点で取得し直す。<base> を Context の "PR base branch" の値として:
- コミット集合:
git log origin/<base>..HEAD --oneline 2>/dev/null || git log <base>..HEAD --oneline
- diff:
git diff origin/<base>..HEAD 2>/dev/null || git diff <base>..HEAD
なぜ取り直すのか: Context の "コミット集合 (base..HEAD)" や git status はスキル起動時点のスナップショットに過ぎず、手順2で /commit が新しく作ったコミットはまだ含まれていない。PRのタイトル/本文は「このPRが base に対して加える変更の全体」を表すものなので、/commit 後の最新状態を反映した base..HEAD を必ずここで取り直す必要がある。
タイトル/本文の唯一の入力は、ここで取得した base..HEAD のコミット集合と diff である。 Context の git status(=最後の未コミット変更だけ)や、既存PRの現行本文をタイトル/本文の入力にしてはいけない。これらは全体像の一部でしかなく、そこに引っ張られると先行コミットの内容が漏れる。
タイトル/本文の生成ルール(新規・更新で共通):
- タイトル: 上記で取得したコミット集合の内容全体を要約したConventional Commits形式(
type: subject)にする。
- 本文: 上記で取得したコミット集合と diff を参照して、全コミットの変更内容を漏れなくまとめる(箇条書き1〜3行程度)。本文は全体を再生成する(既存本文へのマージはしない)。
- 言語: PRタイトルおよび本文の言語は、PRに含まれるコミットメッセージの言語に揃える(未コミット変更があり
/commit スキルを呼び出した場合は、そのスキルが生成したコミットメッセージの言語を参照する)。
- セルフチェック: 提示・作成する前に、取得したコミット集合の件数を確認する。2件以上なら、タイトル/本文がその全件をカバーしているか(最後の1件だけの内容になっていないか)を必ず確かめる。カバーできていなければ書き直す。
既存PRがない場合("既存PR" が「なし」): gh pr create で新規作成する。--base には上記 "PR base branch" の値を使う。これは記録済みの分岐元を尊重するため、デフォルトブランチとは限らない(stacked PR に対応するため)。
既存PRがある場合("既存PR" に番号・URLが出ている): まず Context の「既存PRの同一性チェック」の結果を確認する。
- 警告(既存PRの先頭コミットがローカル履歴に存在しない)が出ている場合: そのPRはブランチ名が同じだけで、実際には無関係な別件PRである可能性が高い(例: 過去に使ったブランチ名を再利用し、リモートに残っていた別作業のPRを誤って掴んでいる)。この場合
gh pr edit によるタイトル/本文の上書きは行わない。手順3のpushはこの懸念と無関係なので通常通り進めてよい。push後、ユーザーに状況(PR番号・URL・現在のタイトル)を提示し、「push は完了しましたが、PR #<番号> は別件の可能性があるため更新していません。新規PRを作成しますか、それとも他の対応が必要ですか」と確認を取ってから次に進む(この提示は手順4完了前の確認であり、完了レポートではない)。
- OK(先頭コミットがローカル履歴に存在する=同一ブランチの正当な続き)の場合: 以下の通常フローに進む。
再生成したタイトル/本文を、"既存PR" に出ている現在の TITLE/BODY と比較する。この「再生成」の入力も上記のとおり base..HEAD の全コミット集合であって、既存PRの現行本文ではない(既存本文にマージするのではなく、全コミットからゼロベースで作り直す)。
- 両方とも実質的に同じなら更新せず、そのまま次へ進む(この場合は確認も不要)。
- 差があるフィールドがある場合は、
gh pr edit を実行する前に、更新するタイトル/本文をユーザーに提示して承認を取る。 承認を得てから、差があるフィールドのみ gh pr edit --title <...> / --body <...> で更新する(タイトルだけ違う場合は --title のみ、本文だけ違う場合は --body のみ)。承認されなければ更新しない。
- base は既存PRのものを尊重し、ここでは変更しない。
- よくある誤り: 先行コミットが既に push 済みで、今回は未コミット変更が1つだけ、という継続作業の状態でこのスキルを起動すると、Context の
git status には最後の変更しか映らない。それに引っ張られて「最後のコミットだけ」のタイトル/本文を作ってしまうのが典型的な失敗(PRの先行コミット内容が本文から丸ごと消える)。再生成の入力は必ず base..HEAD の全コミット集合であって、Context の status でも既存PR本文でもない。