draft-pr
このskillは、現在のブランチの複数のコミットを1つに集約し、Draft PRを作成するワークフローを実行します。
概要
- •分岐元ブランチをgitの追跡情報から自動検出 1.5. 分岐元ブランチの最新情報をfetch
- •分岐元からのコミット状況を確認し、適切な方法でコミットを準備
- •差分コミットがある場合:
git rebaseで1つに集約(fixup) - •差分コミットがないが未コミット変更がある場合: 新規コミットを作成
- •差分コミットがある場合:
- •差分を分析してコミットメッセージを自動生成
- •
git push --force-with-leaseでプッシュ - •PRテンプレートを自動検出(存在する場合)
- •PRが存在しなければ
gh pr create --draftで新規作成(テンプレートがあれば使用) - •PRが存在すれば
gh pr editでタイトル/内容を更新
Context
- •Current branch: !
git branch --show-current - •Git status: !
git status --short - •Recent commits: !
git log --oneline -5
Your Task
以下の手順を実行してください:
1. 分岐元ブランチの自動検出
GitHub CLIでリポジトリのデフォルトブランチを取得:
bash
BASE=$(task -t ~/.claude/skills/usadamasa-draft-pr/Taskfile.yml get-base)
1.5. 分岐元ブランチの最新化
ブランチを切り替えずにローカルの分岐元ブランチを更新:
bash
git fetch origin $BASE
これにより、リモート追跡ブランチ origin/$BASE が最新化され、正確な比較が可能になります。
2. 前提条件の確認
- •現在のブランチが分岐元ブランチと異なることを確認
- •同じ場合: ユーザーに新しいブランチ名を確認し、新規ブランチを作成
bash
git checkout -b <new-branch-name>
- •同じ場合: ユーザーに新しいブランチ名を確認し、新規ブランチを作成
- •分岐元ブランチが存在することを確認
- •分岐元からのコミット数を確認:
git rev-list --count origin/$BASE..HEAD- •コミットが1つ以上ある場合 → 通常のfixupフローへ進む(ケースA)
- •コミットがない場合 →
git status --porcelainを確認- •未コミット変更がある → 新規コミット作成フローへ進む(ケースB)
- •変更もない → エラー: 変更がないためPR作成不可
3. コミット準備
ケースA: 差分コミットがある場合(rebase fixupフロー)
- •
未コミット変更がある場合は先にコミット
bashgit add -A git commit -m "WIP"
- •
非対話的rebaseでfixup
bashtask -t ~/.claude/skills/usadamasa-draft-pr/Taskfile.yml rebase-fixup -- $BASE
- •
差分からコミットメッセージを自動生成 rebase完了後、差分を分析してコミットメッセージを生成する:
bash# 差分を取得 git diff origin/$BASE..HEAD
差分の内容を分析し、以下のガイドラインに従ってコミットメッセージを生成:
- •適切なプレフィックスを付与 (feat:, fix:, refactor:, docs:, chore:, test: など)
- •変更の要点を簡潔に1行で表現 (Conventional Commits 形式)
- •必要に応じて本文で詳細を記載
生成したメッセージでコミットを上書き:
bashgit commit --amend -m "生成したメッセージ"
- •
生成したコミットメッセージをユーザーに提示
- •生成されたメッセージを表示して確認
- •修正が必要な場合のみ
git commit --amendで修正を促す
ケースB: 差分コミットがない場合(新規コミットフロー)
- •全変更をステージング:
git add -A - •差分を確認:
git diff --cached - •差分を分析してコミットメッセージを生成(ケースAと同じガイドライン)
- •生成したメッセージで新規コミットを作成
4. Force Push(安全版)
- •
git push --force-with-lease origin <current-branch>でプッシュ - •push に失敗した場合はエラーメッセージを表示
5. PRテンプレートの検出
GitHub CLIでリポジトリのPRテンプレートを自動検出:
bash
# テンプレート情報を取得(ファイル名と内容が含まれる) TEMPLATES_JSON=$(task -t ~/.claude/skills/usadamasa-draft-pr/Taskfile.yml get-pr-template) TEMPLATE_COUNT=$(echo "$TEMPLATES_JSON" | jq 'length')
テンプレートが1つの場合:
- •そのテンプレートの内容を使用
複数テンプレートがある場合:
- •テンプレート一覧を表示してユーザーに選択を促す
bash
if [[ "$TEMPLATE_COUNT" -eq 1 ]]; then TEMPLATE_BODY=$(echo "$TEMPLATES_JSON" | jq -r '.[0].body') elif [[ "$TEMPLATE_COUNT" -gt 1 ]]; then echo "複数のPRテンプレートが見つかりました:" echo "$TEMPLATES_JSON" | jq -r 'to_entries[] | "\(.key + 1). \(.value.filename)"' # ユーザーに選択を促す(AskUserQuestionツールで実装) fi
テンプレートがない場合:
- •テンプレートなしで従来通り作成
6. PRの作成または更新
- •
既存PRの確認
bashgh pr view --json number 2>/dev/null
- •
PRが存在しない場合: 新規作成
- •コミットメッセージをタイトルに使用
- •テンプレートが見つかった場合:
bash
TITLE=$(task -t ~/.claude/skills/usadamasa-draft-pr/Taskfile.yml get-commit-title) BODY=$(echo "$TEMPLATES_JSON" | jq -r '.[0].body') task -t ~/.claude/skills/usadamasa-draft-pr/Taskfile.yml create-pr BASE="$BASE" TITLE="$TITLE" BODY="$BODY"
- •テンプレートが見つからない場合(デフォルト構造を使用):
- •まず差分を確認:
git diff origin/$BASE..HEAD - •差分の内容を読み取り、変更の要約(Summary)を生成
- •以下の構造でPR bodyを作成:
bashTITLE=$(task -t ~/.claude/skills/usadamasa-draft-pr/Taskfile.yml get-commit-title) CHANGED_FILES=$(git diff --name-only origin/$BASE..HEAD | sed 's/^/- /') # デフォルトのPR body構造 BODY="## Summary
- •まず差分を確認:
<差分から読み取った変更内容の要約を記載>
Changes
${CHANGED_FILES}"
code
task -t ~/.claude/skills/usadamasa-draft-pr/Taskfile.yml create-pr BASE="$BASE" TITLE="$TITLE" BODY="$BODY" ``` ※ 非対話モードでは `--title` と `--body` の両方が必須 ※ Summaryはコミットメッセージの本文があればそれを使用、なければ差分を読んで生成
3. PRが存在する場合: 更新
- •タスクを使用してタイトルと内容を更新:
bash
task -t ~/.claude/skills/usadamasa-draft-pr/Taskfile.yml update-pr TITLE="$TITLE" BODY="$BODY"
- •force pushは既に完了しているのでコミットは反映済み
考慮事項
- •分岐元自動検出:
gh repo viewでリポジトリのデフォルトブランチを取得 - •リモート追跡ブランチの同期:
git fetch origin $BASEによりリモート追跡ブランチorigin/$BASEを更新(worktree環境でも動作) - •非対話的rebase: Taskfile の
rebase-fixupタスクを使用し、GIT_SEQUENCE_EDITORで対話的なエディタを回避して自動的にfixupを実行 - •--force-with-lease: 他のユーザーの変更を検出する安全な force push
- •PRのベースブランチ: 検出した分岐元を
--baseオプションで指定 - •既存PR対応: PRが存在すれば
gh pr editでタイトル/内容を更新 - •差分コミットなしのケース: 新規ブランチで作業開始直後など、まだコミットがない状態でもPRを作成可能
- •未コミット変更の扱い:
- •差分コミットがある場合: 先にWIPコミットしてからrebaseでfixup
- •差分コミットがない場合: 変更をそのまま新規コミットとして作成
- •コミットメッセージの自動生成: rebase後に差分を分析し、Conventional Commits形式でメッセージを生成
- •適切なプレフィックス: feat:, fix:, refactor:, docs:, chore:, test: など
- •変更内容を簡潔に表現した1行目
- •必要に応じて本文で詳細を記載
- •変更なしエラー: 差分コミットも未コミット変更もない場合はPR作成の意味がないためエラーとする
- •rebase失敗時: コンフリクトが発生した場合は
git rebase --abortで中止し、ユーザーに手動解決を促す - •デフォルトブランチでの実行: HEADがデフォルトブランチの場合は、ユーザーに新しいブランチ名を確認して作成してから作業を継続
- •PRテンプレートの扱い:
--templateオプションは対話モードになるため使用せず、テンプレート内容を読み込んで--bodyで指定 - •複数テンプレート対応: 複数テンプレートがある場合はユーザーに選択を促す
- •テンプレートがない場合: テンプレートが存在しないリポジトリでは従来通りの動作を維持(後方互換性)
- •gh pr create の非対話モード: 非対話モードでは
--titleと--bodyの両方が必須 - •デフォルトPR body構造: テンプレートがない場合でも「Summary」と「Changes」セクションを含む最低限の構造を自動生成
- •Summary生成: コミットメッセージに本文があればそれを使用。なければ差分(
git diff)を読み取って変更内容の要約を生成 - •Worktree対応: git worktree 環境でも正常に動作。Taskfile の各タスクは
USER_WORKING_DIR(コマンド実行元ディレクトリ)で実行されるため、worktree 内でも正しいリポジトリコンテキストで動作する - •Taskfile経由のBODY制限: Taskfile の
create-pr/update-prタスク経由で BODY を渡す場合、以下の制限がある:- •バッククォート(
`)はシェルのコマンド置換として解釈されるため、``` でエスケープが必要 - •
{{...}}は go-task のテンプレート変数として展開される - •これらの問題を回避するには、
gh pr create/gh pr editを直接使用する
- •バッククォート(