--- name: pr-creator description: | 現在のブランチからGitHub PRを作成するスキル。PR説明文の生成は pr-description スキルに委譲し、 タイトル選定・ブランチpush・gh pr createによるPR作成・ラベル/レビュアー設定までを一気通貫で行う。 ドラフトPR作成にも対応。 以下の状況で必ず使用すること: (1) ユーザーが「PRを作成して」「PR作って」「pull request作って」「PRを出して」と依頼した時 (2) ユーザーが「このブランチでPR作成して」「PRを開いて」と依頼した時 (3) ユーザーが明示的に「pr-creator スキル」の実行を指示された時 (4) ユーザーが「PR作ってpushして」「PRを出しておいて」と依頼した時 (5) ユーザーが「ドラフトPR作って」「draft PRを出して」と依頼した時 (6) ユーザーが「PRを作成してレビュアーを設定して」と依頼した時 (7) ユーザーが「実装が終わったのでPRにしたい」「PRにまとめて」と依頼した時 別スキルを優先するケース: - PR説明文だけ欲しい(PR作成不要) → pr-description - PRのレビューをしたい → pr-reviewer - 既存PRのCI失敗・レビュー指摘を修正したい → local-autofix-pr - コミットだけしたい → commiter argument-hint: "[--base ブランチ] [--draft] [--reviewer ユーザー] [--label ラベル] [--template テンプレートパス]" --- # pr-creator 現在のブランチの変更からGitHub PRを作成する。 PR説明文の生成は `pr-description` スキルに委譲し、その出力をPR本文として使用する。 **ユーザーとのやり取りはすべて日本語で行う。** ## スコープの境界 - PR説明文の**生成ロジック**はこのスキルに含まない。`pr-description` スキルを呼び出して委譲する - PRの**作成**(`gh pr create`)、ブランチの**push**、メタデータ(ラベル・レビュアー)の**設定**がこのスキルの責務 - PR作成後のレビュー・CI修正は対象外(pr-reviewer / local-autofix-pr の領域) ## Degrees of Freedom - **PR説明文: No freedom** — `pr-description` スキルの出力をそのまま使用する - **タイトル選定: Low freedom** — `pr-description` が提示するタイトル候補から選択。ユーザーが別案を指定した場合はそれに従う - **ブランチ操作: Low freedom** — push先・ベースブランチの判断。必ずユーザーに確認 - **メタデータ設定: Medium freedom** — ラベル・レビュアーの提案。引数で指定されたものは必ず設定、追加提案はユーザー確認 ## 引数 `pr-creator` スキル(`--base <ブランチ>` `--draft` `--reviewer <ユーザー,...>` `--label <ラベル,...>` `--template <テンプレートパス>` `--format <フォーマット指示>` の各オプション指定可) - `--base <ブランチ>` (任意): マージ先のベースブランチ。省略時は main → master の順で自動検出 - `--draft` (任意): ドラフトPRとして作成 - `--reviewer <ユーザー,...>` (任意): レビュアーをカンマ区切りで指定 - `--label <ラベル,...>` (任意): ラベルをカンマ区切りで指定 - `--template <パス>` (任意): PR説明文テンプレートのパス(`pr-description` に渡す) - `--format <指示>` (任意): PR説明文のフォーマット指示(`pr-description` に渡す) ## 実行フロー ### Step 1: 前提条件の確認 以下を順に確認し、一つでも失敗したら作業に入らずユーザーに通知する。 1. **gitリポジトリ内** — `git rev-parse --is-inside-work-tree` 2. **gh CLIで認証済み** — `gh auth status` 3. **現ブランチがmain/masterではない** — main/masterから直接PRを作ろうとしている場合は警告し、ブランチ作成を提案 4. **コミット済みの変更がある** — ベースブランチとの差分が存在すること(`git log ..HEAD --oneline` が空でないこと) 5. **同一ブランチの既存PRがない** — `gh pr view --json number,state,url` で確認。既にOpen PRがあれば、そのURLを提示して「既存PRを更新しますか? 新規PRを作りますか?」と確認 ### Step 2: 未コミット変更の確認 `git status --porcelain` で未コミット・未追跡ファイルを確認する。 - **未コミット変更がある場合**: 変更内容を一覧表示し、推奨案を含む複数の選択肢を提示してユーザーに確認: - **コミットしてからPR作成**: `commiter` スキルに委譲してコミットし、その後Step 3に進む - **現状のコミット済み内容でPR作成**: 未コミット変更は無視してPR作成を進める - **中止**: PR作成を取りやめ - **クリーンな場合**: そのままStep 3に進む ### Step 3: ベースブランチの決定 `--base` 引数が指定されている場合はそれを使用。未指定の場合: 1. リモートに `main` が存在するか確認: `git ls-remote --heads origin main` 2. 存在しなければ `master` を確認: `git ls-remote --heads origin master` 3. どちらもなければユーザーにベースブランチを確認 ### Step 4: リモートへのpush 現ブランチがリモートに追跡ブランチを持つか確認し、pushする。 1. `git rev-parse --abbrev-ref --symbolic-full-name @{u}` でリモート追跡ブランチを確認 2. 追跡ブランチが**ない**場合: `git push -u origin ` で初回push 3. 追跡ブランチが**ある**場合: ローカルがリモートより先行しているか確認し、先行分があれば `git push` 4. push失敗時はエラー内容をそのまま報告し、ユーザーに対応を委ねる ### Step 5: PR説明文の生成 `pr-description` スキルを呼び出してPR説明文を生成する。 呼び出し時の引数構成(Skillツールの `args` に渡す文字列): ``` /tmp/pr-body-.md --base <ベースブランチ> [--template <パス>] [--format <指示>] ``` - 先頭の positional argument(出力先パス)は必須。必ず `/tmp/pr-body-.md` を渡す - `--base`: Step 3で決定したベースブランチ - `--template`: 引数で指定されていれば転送 - `--format`: 引数で指定されていれば転送 `pr-description` の出力からPRタイトル候補も得られるので、以降のStep 6で使用する。 **⚠️ フロー継続の注意**: `pr-description` の出力(ファイル生成 + タイトル候補提示)が完了したら、ユーザーの追加入力を待たず、**同一ターン内で即座に Step 6 に進む**こと。`pr-description` の出力はこのスキルの中間成果物であり、ユーザーへの最終報告ではない。 ### Step 6: PRタイトルの選定 `pr-description` スキルが提示するPRタイトル候補(Conventional Commits形式・72文字以内)をユーザーに提示し、推奨案を含む複数の選択肢を提示してユーザーに選定してもらう。 選択肢: - 推奨案(第1候補) - 第2候補 - 第3候補 - 自由入力(ユーザーが独自のタイトルを指定) ### Step 7: PR作成前の最終確認 以下の情報をまとめて提示し、「作成」「修正」「中止」の選択肢を提示してユーザーに確認する。 ``` ## PR作成確認 - タイトル: <選択されたタイトル> - ベースブランチ: ← - ドラフト: はい / いいえ - レビュアー: <指定されていれば表示> - ラベル: <指定されていれば表示> - 説明文: ``` 「修正」が選択された場合、修正したい箇所をユーザーから受け取り該当Stepに戻る。 ### Step 8: PRの作成 `gh pr create` でPRを作成する。 ```bash gh pr create \ --title "<タイトル>" \ --body-file /tmp/pr-body-.md \ --base <ベースブランチ> \ [--draft] \ [--reviewer <ユーザー>] \ [--label <ラベル>] ``` 引数の構成: - `--title`: Step 6で選定したタイトル - `--body-file`: Step 5で生成したPR説明文ファイル - `--base`: Step 3で決定したベースブランチ - `--draft`: `--draft` 引数が指定されている場合のみ付与 - `--reviewer`: `--reviewer` 引数が指定されている場合のみ付与(カンマ区切りの場合は複数回 `--reviewer` を指定) - `--label`: `--label` 引数が指定されている場合のみ付与 ### Step 9: 完了報告 PR作成成功後、以下を報告する。 ``` ## PR作成完了 **URL**: **タイトル**: <タイトル> **ベースブランチ**: ← **状態**: Open / Draft ### 次のアクション - CIの実行結果を確認 - レビュアーへの依頼(未設定の場合) ``` 一時ファイル `/tmp/pr-body-.md` はPR作成後も残す(ユーザーが参照・再利用できるように)。 ## エラーハンドリング ### gh CLI 未認証 `gh auth status` 失敗時は `gh auth login` を案内。 ### リモートリポジトリなし `git remote -v` が空の場合、リモート設定を案内。 ### push権限なし `git push` が `403` や `denied` で失敗した場合、フォークリポジトリの可能性を確認し、ユーザーに対応方法を提示。 ### PR作成失敗 `gh pr create` がエラーの場合、エラーメッセージをそのまま報告。よくある原因: - リポジトリの権限不足 → コラボレータ追加 or フォークPRを案内 - ベースブランチが存在しない → 正しいブランチ名を確認 - 同名PRが既に存在 → 既存PRのURLを提示 ### pr-description スキルの呼び出し失敗 PR説明文の生成に失敗した場合、手動でのPR説明文入力へのフォールバックは行わず、エラー内容を報告して原因の解消を促す。 ## ガイドライン - **すべてのやり取りは日本語**(コード・コマンド・タイトルは原語のまま) - **push前にユーザー確認を省略しない** — 特にmain/masterへの直接pushは追加警告 - **PR説明文の生成は必ず `pr-description` スキルに委譲** — このスキル内で独自にPR説明文を組み立てない - **一時ファイルのパスは固定パターン** — `/tmp/pr-body-.md` で予測可能にする - **PRタイトルはConventional Commits形式** — `pr-description` スキルの出力を尊重 - **既存PRの検出を怠らない** — 重複PR作成を防ぐ