mcpField
C
create-pr

create-pr

github.com/tenfyzhong開発044 回インストール2 週間前に更新
リポジトリ

create-pr について

現在の作業から GitHub Pull Request を作成するスキルです。ブランチとコミットの準備、リモートの検出、PR 内容の生成を行い、フォークの運用やリポジトリの PR テンプレートにも対応します。

主な機能

  1. 01リポジトリのリモートとフォーク関係の検出
  2. 02必要に応じたフィーチャーブランチの作成
  3. 03対象変更のステージングとコミット
  4. 04上流のデフォルトブランチへのリベース
  5. 05変更に基づく PR タイトルと説明の生成
  6. 06変更のプッシュと PR の作成

活用シーン

  1. 01デフォルトブランチ上の未コミット作業からの PR 作成
  2. 02フォークの変更を上流リポジトリへ提出
  3. 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 login first."

ユーザーにブランチの切り替え、変更のコミット、変更のスタッシュを依頼したり、作業を中止したりしないでください。以下のワークフローで、現在のブランチと未コミットの変更を自動的に処理してください。

入力

ユーザーは、以下を任意で指定できます。

  • 対象のベースブランチ(デフォルトは 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)originorigin
フォーク:origin=フォーク、upstream=親upstreamorigin
フォーク: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 用の作業を準備します。

  1. git status --short、ステージ済みの変更、未ステージの変更、未追跡ファイル名を確認します。
  2. CURRENT_BRANCH が DEFAULT_BRANCH、main、または master の場合は、ユーザーのリクエストと変更内容から簡潔なブランチ名を生成します。リポジトリに命名規則があればそれに従い、ローカルおよびリモートのブランチとの重複を避けてブランチを作成し、CURRENT_BRANCH を更新します。
  3. 作業ツリーに変更がある場合は、現在の作業のうち意図したものをステージし、コミットします。リクエストと差分から簡潔なコミットメッセージを生成し、リポジトリのコミットスタイル、サインオフ、署名の要件に従います。
  4. ブランチの作成とコミットは、ユーザーにブランチ名の選択、ブランチの切り替え、コミットメッセージの提示、または変更のコミットを依頼せずに実行します。
# 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. コミットが 1 つの場合:コミットメッセージの件名行を使用します。
  2. コミットが複数の場合:変更全体を要約します。
  3. プロジェクトで使用されている場合は、Conventional Commits の形式に従います:<type>(<scope>): <description>
  4. 72 文字以内にします。

説明の生成:

PR テンプレートがある場合は、テンプレートのセクションを埋めます。

一般的なテンプレートのセクション記入方法
## Summary / ## Descriptionコミットと差分から変更内容を要約します
## Changes / ## What差分から主な変更点を列挙します
## Why / ## Motivationコミット本文から抽出するか、変更内容から推測します
## Testing変更されたテストファイルを列挙するか、手動テストを提案します
## ScreenshotsUI の変更が検出された場合は、プレースホルダーを残します
## 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)

重要な注意事項

  1. 安全第一:リベース後にプッシュする場合は、--force ではなく、必ず --force-with-lease を使用してください
  2. フォークへの対応:フォークを使用するワークフローを自動的に検出して処理します
  3. テンプレートの遵守:利用可能な場合は、必ず PR テンプレートを確認して使用してください
  4. Conventional Commits:プロジェクトで Conventional Commits を使用している場合は、その形式に従ってください
  5. イシューへのリンク:コミットメッセージに含まれるイシュー参照を保持してください
  6. 送信前の確認:PR を作成する前に、生成されたタイトルと説明を表示してユーザーの承認を得てください
  7. ブランチやコミットについて尋ねない:フィーチャーブランチを自動的に作成し、現在の作業をコミットしてください。ユーザーにこれらの操作を実行または確認するよう求めないでください

コメント