AgentSkillsCN

draft-pr

采用 fixup 提交方式,将多个提交合并为一个,并创建 Draft PR 的工作流程。可根据差异自动生成提交信息。

SKILL.md
--- frontmatter
name: draft-pr
description: コミットをfixupして1つに集約し、Draft PRを作成するワークフロー。差分からコミットメッセージを自動生成します。
allowed-tools: Bash(git:*), Bash(gh:*), Bash(jq:*), Bash(echo:*), Bash(task -t ~/.claude/skills/usadamasa-draft-pr/Taskfile.yml:*)

draft-pr

このskillは、現在のブランチの複数のコミットを1つに集約し、Draft PRを作成するワークフローを実行します。

概要

  1. 分岐元ブランチをgitの追跡情報から自動検出 1.5. 分岐元ブランチの最新情報をfetch
  2. 分岐元からのコミット状況を確認し、適切な方法でコミットを準備
    • 差分コミットがある場合: git rebase で1つに集約(fixup)
    • 差分コミットがないが未コミット変更がある場合: 新規コミットを作成
  3. 差分を分析してコミットメッセージを自動生成
  4. git push --force-with-lease でプッシュ
  5. PRテンプレートを自動検出(存在する場合)
  6. PRが存在しなければ gh pr create --draft で新規作成(テンプレートがあれば使用)
  7. 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フロー)

  1. 未コミット変更がある場合は先にコミット

    bash
    git add -A
    git commit -m "WIP"
    
  2. 非対話的rebaseでfixup

    bash
    task -t ~/.claude/skills/usadamasa-draft-pr/Taskfile.yml rebase-fixup -- $BASE
    
  3. 差分からコミットメッセージを自動生成 rebase完了後、差分を分析してコミットメッセージを生成する:

    bash
    # 差分を取得
    git diff origin/$BASE..HEAD
    

    差分の内容を分析し、以下のガイドラインに従ってコミットメッセージを生成:

    • 適切なプレフィックスを付与 (feat:, fix:, refactor:, docs:, chore:, test: など)
    • 変更の要点を簡潔に1行で表現 (Conventional Commits 形式)
    • 必要に応じて本文で詳細を記載

    生成したメッセージでコミットを上書き:

    bash
    git commit --amend -m "生成したメッセージ"
    
  4. 生成したコミットメッセージをユーザーに提示

    • 生成されたメッセージを表示して確認
    • 修正が必要な場合のみ 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の作成または更新

  1. 既存PRの確認

    bash
    gh pr view --json number 2>/dev/null
    
  2. 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"
      
    • テンプレートが見つからない場合(デフォルト構造を使用):
      1. まず差分を確認: git diff origin/$BASE..HEAD
      2. 差分の内容を読み取り、変更の要約(Summary)を生成
      3. 以下の構造でPR bodyを作成:
      bash
      TITLE=$(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 を直接使用する