create-pr について
現在の作業から GitHub Pull Request を作成するスキルです。ブランチとコミットの準備、リモートの検出、PR 内容の生成を行い、フォークの運用やリポジトリの PR テンプレートにも対応します。
主な機能
- 01リポジトリのリモートとフォーク関係の検出
- 02必要に応じたフィーチャーブランチの作成
- 03対象変更のステージングとコミット
- 04上流のデフォルトブランチへのリベース
- 05変更に基づく PR タイトルと説明の生成
- 06変更のプッシュと PR の作成
活用シーン
- 01デフォルトブランチ上の未コミット作業からの PR 作成
- 02フォークの変更を上流リポジトリへ提出
- 03リポジトリのテンプレートに沿った PR 説明の作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tenfyzhong/ skills-hub --skill create-prインストール後、Claude Code で/create-prを入力して読み込まれたか確認します。
詳細
PR 作成スキル
現在の作業から、ブランチの自動作成、コミットの作成、インテリジェントなリモート検出、PR コンテンツの生成を行って、プルリクエストを作成します。
前提条件の確認(最初に必ず検証)
作業を進める前に、以下を検証してください。
# 1. Check if in a git repository
git rev-parse --is-inside-work-tree
# 2. Check if gh CLI is available and authenticated
gh auth status
# 3. Record the current working tree state
git status --porcelain
チェックに失敗した場合は、作業を中止してユーザーに伝えてください。
- git リポジトリではない → "This skill requires a git repository. Please navigate to a git project."
- gh が認証されていない → "Please run
gh auth loginfirst."
ユーザーにブランチの切り替え、変更のコミット、変更のスタッシュを依頼したり、作業を中止したりしないでください。以下のワークフローで、現在のブランチと未コミットの変更を自動的に処理してください。
入力
ユーザーは、以下を任意で指定できます。
- 対象のベースブランチ(デフォルトは main/master)
- ドラフトモードフラグ
- 指定レビュアー
ワークフロー
ステップ 1:リポジトリ設定を検出する
# Get all remotes
git remote -v
# Get current branch name
CURRENT_BRANCH=$(git branch --show-current)
# Detect default branch (main or master)
DEFAULT_BRANCH=$(gh repo view --json defaultBranchRef -q '.defaultBranchRef.name')
# Get repository info
gh repo view --json owner,name,isFork,parent
ステップ 2:上流リモートとフォークリモートを特定する
リモート設定を判定します。
# List all remotes with their URLs
git remote -v
# Check if this repo is a fork
IS_FORK=$(gh repo view --json isFork -q '.isFork')
# If it's a fork, get parent info
if [ "$IS_FORK" = "true" ]; then
PARENT_OWNER=$(gh repo view --json parent -q '.parent.owner.login')
PARENT_NAME=$(gh repo view --json parent -q '.parent.name')
fi
リモートの分類ロジック:
| シナリオ | 上流リモート | プッシュ先リモート |
|---|---|---|
| リモートが 1 つ(origin) | origin | origin |
| フォーク:origin=フォーク、upstream=親 | upstream | origin |
| フォーク:origin=親、フォークリモートが存在 | origin | フォークリモート |
| 複数のリモートがあり、そのうち 1 つがフォーク | フォーク以外のリモート | フォークリモート |
検出アルゴリズム:
# Get current user's GitHub username
CURRENT_USER=$(gh api user -q '.login')
# For each remote, check if it belongs to current user
for remote in $(git remote); do
REMOTE_URL=$(git remote get-url $remote)
# Extract owner from URL (handles both HTTPS and SSH)
REMOTE_OWNER=$(echo "$REMOTE_URL" | sed -E 's/.*[:/]([^/]+)\/[^/]+\.git$/\1/' | sed 's/\.git$//')
if [ "$REMOTE_OWNER" = "$CURRENT_USER" ]; then
FORK_REMOTE=$remote
else
UPSTREAM_REMOTE=$remote
fi
done
# Default fallback
UPSTREAM_REMOTE=${UPSTREAM_REMOTE:-origin}
FORK_REMOTE=${FORK_REMOTE:-origin}
ステップ 3:フィーチャーブランチを作成して変更をコミットする
リベースまたはプッシュの前に、PR 用の作業を準備します。
git status --short、ステージ済みの変更、未ステージの変更、未追跡ファイル名を確認します。CURRENT_BRANCHがDEFAULT_BRANCH、main、またはmasterの場合は、ユーザーのリクエストと変更内容から簡潔なブランチ名を生成します。リポジトリに命名規則があればそれに従い、ローカルおよびリモートのブランチとの重複を避けてブランチを作成し、CURRENT_BRANCHを更新します。- 作業ツリーに変更がある場合は、現在の作業のうち意図したものをステージし、コミットします。リクエストと差分から簡潔なコミットメッセージを生成し、リポジトリのコミットスタイル、サインオフ、署名の要件に従います。
- ブランチの作成とコミットは、ユーザーにブランチ名の選択、ブランチの切り替え、コミットメッセージの提示、または変更のコミットを依頼せずに実行します。
# Create a feature branch automatically when currently on the base branch.
if [ "$CURRENT_BRANCH" = "$DEFAULT_BRANCH" ] || \
[ "$CURRENT_BRANCH" = "main" ] || \
[ "$CURRENT_BRANCH" = "master" ]; then
# Derive NEW_BRANCH from the request and diff, for example feat/add-export.
# Add a short numeric suffix if the name already exists locally or remotely.
git switch -c "$NEW_BRANCH"
CURRENT_BRANCH=$NEW_BRANCH
fi
# Commit all intended current work when the tree is dirty.
if [ -n "$(git status --porcelain)" ]; then
git status --short
git diff
git diff --cached
git add -A
git diff --cached
# Derive COMMIT_MESSAGE from the request and staged diff. Add flags such as
# -s or -S when required by repository instructions.
git commit -m "$COMMIT_MESSAGE"
fi
エディターの生成物、生成されたシークレット、認証情報、無関係なファイルをコミットに含めないでください。リポジトリの指示でコミット前のテストが必要な場合は実行し、その結果を PR の説明に含めます。
ステップ 4:上流のデフォルトブランチに同期してリベースする
# Fetch latest from upstream
git fetch "$UPSTREAM_REMOTE" "$DEFAULT_BRANCH"
# Rebase current branch onto latest default branch
git rebase "$UPSTREAM_REMOTE/$DEFAULT_BRANCH"
# If rebase fails, inform user
if [ $? -ne 0 ]; then
echo "Rebase failed. Please resolve conflicts manually."
git rebase --abort
exit 1
fi
ステップ 5:ブランチをリモートにプッシュする
リモートにブランチが存在するか確認してからプッシュします。
# Check if branch exists on the push remote
REMOTE_BRANCH_EXISTS=$(git ls-remote --heads $FORK_REMOTE $CURRENT_BRANCH | wc -l)
if [ "$REMOTE_BRANCH_EXISTS" -eq 0 ]; then
# Branch doesn't exist, push with upstream tracking
git push -u $FORK_REMOTE $CURRENT_BRANCH
else
# Branch exists, force push (after rebase) with lease for safety
git push --force-with-lease $FORK_REMOTE $CURRENT_BRANCH
fi
重要:安全のため、--force ではなく常に --force-with-lease を使用してください。
ステップ 6:PR コンテンツに必要な情報を収集する
# Get all commits between default branch and current branch
git log $UPSTREAM_REMOTE/$DEFAULT_BRANCH..HEAD --pretty=format:"%h %s%n%b" --no-merges
# Get the diff summary
git diff --stat $UPSTREAM_REMOTE/$DEFAULT_BRANCH..HEAD
# Get the full diff for analysis
git diff $UPSTREAM_REMOTE/$DEFAULT_BRANCH..HEAD
# Get list of changed files
git diff --name-only $UPSTREAM_REMOTE/$DEFAULT_BRANCH..HEAD
ステップ 7:PR テンプレートを確認する
# Check for PR template in common locations
PR_TEMPLATE=""
for template_path in \
".github/pull_request_template.md" \
".github/PULL_REQUEST_TEMPLATE.md" \
"docs/pull_request_template.md" \
"PULL_REQUEST_TEMPLATE.md"; do
if [ -f "$template_path" ]; then
PR_TEMPLATE="$template_path"
break
fi
done
# Also check for template directory
if [ -z "$PR_TEMPLATE" ] && [ -d ".github/PULL_REQUEST_TEMPLATE" ]; then
# Use default template if exists
if [ -f ".github/PULL_REQUEST_TEMPLATE/default.md" ]; then
PR_TEMPLATE=".github/PULL_REQUEST_TEMPLATE/default.md"
fi
fi
# Read template content if found
if [ -n "$PR_TEMPLATE" ]; then
cat "$PR_TEMPLATE"
fi
ステップ 8:PR のタイトルと説明を生成する
タイトルの生成ルール:
- コミットが 1 つの場合:コミットメッセージの件名行を使用します。
- コミットが複数の場合:変更全体を要約します。
- プロジェクトで使用されている場合は、Conventional Commits の形式に従います:
<type>(<scope>): <description> - 72 文字以内にします。
説明の生成:
PR テンプレートがある場合は、テンプレートのセクションを埋めます。
| 一般的なテンプレートのセクション | 記入方法 |
|---|---|
## Summary / ## Description | コミットと差分から変更内容を要約します |
## Changes / ## What | 差分から主な変更点を列挙します |
## Why / ## Motivation | コミット本文から抽出するか、変更内容から推測します |
## Testing | 変更されたテストファイルを列挙するか、手動テストを提案します |
## Screenshots | UI の変更が検出された場合は、プレースホルダーを残します |
## Checklist | ユーザーが記入できるよう、チェックボックスを残します |
Fixes # / Closes # | コミットから issue 参照を抽出します |
テンプレートがない場合は、以下の構成で説明を生成します。
## Summary
[2-3 sentences summarizing what this PR does]
## Changes
- [Key change 1]
- [Key change 2]
- [Key change 3]
## Testing
[How the changes were tested or should be tested]
---
[Any issue references found in commits]
ステップ 9:プルリクエストを作成する
# Determine the base repository for the PR
if [ "$IS_FORK" = "true" ]; then
# For forks, create PR against parent repo
BASE_REPO="$PARENT_OWNER/$PARENT_NAME"
gh pr create \
--repo "$BASE_REPO" \
--base "$DEFAULT_BRANCH" \
--head "$CURRENT_USER:$CURRENT_BRANCH" \
--title "$PR_TITLE" \
--body "$PR_BODY"
else
# For non-forks, create PR in same repo
gh pr create \
--base "$DEFAULT_BRANCH" \
--head "$CURRENT_BRANCH" \
--title "$PR_TITLE" \
--body "$PR_BODY"
fi
書式を保持するため、本文には HEREDOC を使用します:
gh pr create --title "$PR_TITLE" --body "$(cat <<'EOF'
## Summary
[Generated summary here]
## Changes
- Change 1
- Change 2
EOF
)"
ステップ 10:結果を報告する
PR 作成後、以下を提示します。
# Get PR URL and details
gh pr view --json url,number,title,state
出力形式
PR が正常に作成されました
PR: #[NUMBER] - [TITLE]
URL: [PR_URL]
ベース: [BASE_BRANCH] ← ヘッド: [HEAD_BRANCH]
リモート: [FORK_REMOTE] にプッシュしました
概要
[PR に含まれる内容の簡単な説明]
変更したファイル
| ファイル | 変更内容 |
|---|---|
path/to/file.ts | +[追加行数] -[削除行数] |
次の手順
- PR の説明を確認し、必要に応じて編集する
- 必要に応じてレビュアーを追加する
- CI チェックが完了するまで待つ
- レビューコメントに対応する
エラー処理
| 状況 | 対応 |
|---|---|
| ベースより先のコミットがない | 「PR を作成する変更はありません。ブランチは [base] と同期しています。」 |
| ブランチ名がすでに存在する | 短い数値の接尾辞を付けた、別の意味のある名前を生成して続行します。 |
| コミットに失敗 | ユーザーの作業ツリーとステージ済みの変更を保持したまま、正確な失敗内容を報告します。 |
| リベースの競合 | 「競合が原因でリベースに失敗しました。手動で解決してから再実行してください。」 |
| プッシュが拒否された | 「プッシュに失敗しました。リモートへの書き込み権限があるか確認してください。」 |
| PR がすでに存在する | 「このブランチの PR はすでに存在します:[URL]。既存の PR を開きます。」 |
| リモートにアクセスできない | 「リモートにアクセスできません。gh auth status で認証状態を確認してください。」 |
| フォークの検出に失敗 | 「フォーク関係を特定できませんでした。対象リポジトリを指定してください。」 |
詳細オプション
ドラフト PR
gh pr create --draft --title "$PR_TITLE" --body "$PR_BODY"
レビュアーの追加
gh pr create --reviewer "user1,user2" --title "$PR_TITLE" --body "$PR_BODY"
ラベルの追加
gh pr create --label "enhancement,needs-review" --title "$PR_TITLE" --body "$PR_BODY"
イシューへのリンク
コミットがイシューを参照している場合(例:「Fixes #123」)、PR の本文に自動で追加します。
# Extract issue references from commits
ISSUES=$(git log $UPSTREAM_REMOTE/$DEFAULT_BRANCH..HEAD --pretty=format:"%B" | grep -oE "(Fixes|Closes|Resolves) #[0-9]+" | sort -u)
重要な注意事項
- 安全第一:リベース後にプッシュする場合は、
--forceではなく、必ず--force-with-leaseを使用してください - フォークへの対応:フォークを使用するワークフローを自動的に検出して処理します
- テンプレートの遵守:利用可能な場合は、必ず PR テンプレートを確認して使用してください
- Conventional Commits:プロジェクトで Conventional Commits を使用している場合は、その形式に従ってください
- イシューへのリンク:コミットメッセージに含まれるイシュー参照を保持してください
- 送信前の確認:PR を作成する前に、生成されたタイトルと説明を表示してユーザーの承認を得てください
- ブランチやコミットについて尋ねない:フィーチャーブランチを自動的に作成し、現在の作業をコミットしてください。ユーザーにこれらの操作を実行または確認するよう求めないでください