From create-pr
カレントブランチをもとに Conventional Commits 形式のドラフト PR を作成する。ユーザーが「PR を作って」「draft PR」「PR 作成して」と依頼したら起動。引数 [base-branch] でベースブランチを指定可能。確認なしで実行する。
How this skill is triggered — by the user, by Claude, or both
Slash command
/create-pr:create-prThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
カレントブランチをもとに、Conventional Commits形式のタイトルと、リポジトリに存在する PR テンプレート(ステップ 0 で動的検索)に従った説明を持つドラフトPRを作成してください。
カレントブランチをもとに、Conventional Commits形式のタイトルと、リポジトリに存在する PR テンプレート(ステップ 0 で動的検索)に従った説明を持つドラフトPRを作成してください。
重要: ユーザーへの確認は一切行わず、分析完了後は直接PR作成を実行すること。
$ARGUMENTS: ベースブランチ名(省略可)
前準備
0a. PR テンプレートの検索 カレントブランチが属するリポジトリのテンプレートを動的に検索する(固定パス禁止)。
git rev-parse --show-toplevel でリポジトリルート <repo> を取得<repo>/.github/PULL_REQUEST_TEMPLATE/engineer.md<repo>/.github/PULL_REQUEST_TEMPLATE/default.md<repo>/.github/PULL_REQUEST_TEMPLATE/ 配下の最初の *.md(アルファベット順)<repo>/.github/PULL_REQUEST_TEMPLATE.md<repo>/.github/pull_request_template.md<repo>/docs/PULL_REQUEST_TEMPLATE.md<repo>/PULL_REQUEST_TEMPLATE.mdRead してセクション構成を把握## やったこと / ## なぜやるのか / ## 動作確認結果)を使用0b. ベースブランチの確定
[base-branch] が指定されていればそれを使用gh repo view --json defaultBranchRef --jq .defaultBranchRef.name(主手段)git symbolic-ref refs/remotes/origin/HEAD --short | sed 's@^origin/@@' にフォールバックmain を使用(最小フォールバック)[base-branch] と記載されている箇所は、ここで確定した値に置換して実行情報収集(並列実行) 以下のコマンドをすべて並列で実行:
git status(未コミットファイルの確認)git branch --show-current(カレントブランチ名)git log [base-branch]..HEAD --oneline(コミット一覧)git diff [base-branch]...HEAD --stat(差分の概要)1.5. カレントブランチの妥当性検証(必須・コミット前に実行)
ステップ 1 で取得したカレントブランチ名を、以下の判定基準で検証する。いずれかに該当する場合は新ブランチに切替必須:
[base-branch] と同一(例: develop チェックアウト中で base が develop)feature/ / feat/fix/refactor/docs/chore/test/perf/style/ci/build/omo/gtr-2, wip-test, tmp, worktree ディレクトリ名そのまま等は 規約違反として扱う.github/CLAUDE.md / <repo>/CLAUDE.md / <repo>/.claude/rules/git-branch*.md にブランチ命名規約が明記されている場合、それに従わないブランチ名は規約違反として扱う(前準備として該当ファイルを Read で確認)
feature/機能名, ^(feat|fix|refactor)/.+)develop」)は 命名規約ではないため、本判定では対象外該当時の自動切替手順:
git diff [base-branch]...HEAD --stat と git status の出力から 変更ドメイン を推定
git diff [base-branch]...HEAD --stat が空を返すため、git diff --stat(unstaged)と git diff --cached --stat(staged)の 合算 で最大 dir / module 名を採用order / license / auth)mailer / flipper / middleware は scope にしない)type / scope 決定ロジックを前借りして branch 名を組み立てる:
<type>/<scope>-<short-desc-kebab-case>
<type>: ステップ 5 の type 優先順位(feat > fix > ...)から仮選定<scope>: 上で推定した変更ドメイン<short-desc-kebab-case>: 変更の主目的を英小文字 kebab-case で 2〜4 単語feature/order-notification-mailerfix/auth-token-rotationrefactor/rubocop-cleanupgit switch -c <new-branch-name> を実行git branch --show-current を再取得(以降のステップで使う)該当しない場合: そのまま続行(既に feature/order-notification 等で正しいブランチ名を持っている場合は no-op)
重要事項:
git switch -c で切替できる前提として、ステップ 1 の git status で worktree が clean か uncommitted のみであることを確認しておく(merge / rebase の最中などで状態が複雑な場合はユーザに状況確認を促す)未コミットファイルのコミット(必要な場合のみ) ステップ1で未コミットファイルがあれば、以下のルールに従ってコミットを作成:
原則: 1コミット = 1〜3ファイル
<type>(<scope>): <日本語の要約>
git diffで変更内容を確認(並列実行可)git add → git commitリモートへのプッシュ
git push -u origin <current-branch>コンテキスト収集(以下のサブステップを順に実施)
4a. 差分の詳細分析(必要な場合のみ)
git diff [base-branch]...HEADで詳細確認4b. 既存パターンとの比較(設計判断が必要な変更の場合)
4c. セッションコンテキストからのプラン情報の取得
~/.claude/plans/ 等)の走査は不要。plan → 実装は同一セッションで完結する前提PRタイトルの生成
<type>(<scope>): <description>contract, user, payment)。モデル名・コントローラ名の prefix を流用するのが基本auth)。領域が均等に跨ぎ中心価値を 1 つに絞れない場合のみ scope を省略し <type>: <description> にするdocs(readme): のような細分化はしない)feat > fix > refactor > perf > test > chore > docs > style > ci > buildfeat / fix。純粋な依存削除・責務移動のみなら refactor。compose / README のみなら chore / docs。複数機能が組み合わさって 1 つの価値を生むなら featPR説明の作成
Read で読み込み、そのセクション構成に従う◆◆ 文体原則(最優先・他のすべてのルールに優先する)◆◆
PR description はレビュアーが最初の3秒で「読む気が起きるか」を判定する場所。 斜め読み(各セクション1行目だけ)で PR 意図が掴めない description は、その後のコードレビュー解像度を下げる(「整理せず投げる人」バイアスがかかる)。
鉄則(この6つだけを守る)
NG表現(出たら書き直し)
〜のために動作するのような名詞用法は対象外)**強調**: 形式の太字bullet は1セクション最大2つまでNG / OK 対比例(実 PR ベース)
NG(PR #486 のオリジナル / bullet 羅列、ファイル名・技術ディテール羅列):
## やったこと
- `proxy.ts`: `/auth` を常に taimei-auth へ redirect する分岐を追加 (cookie 検証スキップ)。`signUpUrl` パラメータを追加し sign-up 完了時に `/auth/after-signup` に着地させる。`redirectToAuth` helper で URL 組み立ての重複を排除
- `proxy.ts` + `package.json` + `bun.lockb`: `better-auth` 依存を削除。`getSessionCookie` を Next.js 標準 cookie API + cookie 名 hardcoded (auth-guard.ts と同じ pattern) で置き換え
OK(bullet 列挙せず 1 行で意図のみ):
## やったこと
/auth 入口を常に taimei-auth へ委譲し、better-auth 依存と auth compose を taimei から剥がした。
差分:
auth-guard.ts と同じ pattern 等)は「設計判断」セクションへ詳細に退避、無ければ捨てるセクション分量対比表
| タイプ | 分量目安 | 該当セクションの判定 | 空欄許容 |
|---|---|---|---|
| 簡潔 | 全項目 1 行で完結させる(bullet を並べない)。「やったこと」「なぜやるのか」「レビューしてほしい観点」「動作確認結果」いずれも 1 文・1 段落で言い切る。コードから読める事実(変更ファイル名・関数名・パラメータ追加・import 追加など)は書かない。複数項目を列挙する見出し(複合 Issue / Design Doc リスト等)でのみ bullet を使用 | ステータス報告系(関連 Issue / やったこと / なぜやるのか / レビューしてほしい観点 / 動作確認結果 等) | 原則不可(必ず埋める)。ただし trivial change 例外: 変更が typo / コメント / 文言修正のみで実行検証や追加レビュー観点が自明に存在しない場合に限り、「動作確認結果」「レビューしてほしい観点」は (a) 1 行固定 fallback(動作確認結果: 目視確認のみ / レビューしてほしい観点: 自明な観点なし)、または (b) 詳細セクション同様 見出しのみ残し空欄、のいずれかを許容。「やったこと」「なぜやるのか」は trivial であっても必ず 1 行で埋める(変更意図と動機はコードから読めないため省略不可) |
| 詳細 | 「設計判断」「やらなかったこと」の 2 セクションだけ必ず詳細に書く(コードから読めない情報を持つため)。理由・代替案・トレードオフ・スコープ外の判断根拠を散文で展開。その他の詳細セクション(背景 / 影響範囲 等)は該当時のみ散文中心、太字bullet は 1セクション最大2つまで | 説明・議論系(設計判断 / やらなかったこと(コードから読めない・該当事実があれば詳細記述必須)/ 背景 / 影響範囲 等) | 「設計判断」「やらなかったこと」も該当事実が無ければ見出しのみ残して空欄可。「特になし」と書かない |
| 定型 | テンプレ準拠 | Revert 手順 / セルフレビューチェックリスト 等、テンプレに箇条書き・チェックリストが埋め込まれている見出し | 不可 |
テンプレートに無い見出しは追加しない。テンプレートに有る見出しは削除せず、空欄の場合も残す。
◆ テンプレート内 HTML コメント (<!-- ... -->) の扱い
<!-- ... --> コメントは 原文をそのまま残す(説明・プレースホルダ・サンプルが含まれており、削除すると後続レビュアーへの注意書きが失われる)。<!--命名が適切かなど…--> / <!--db:migrate db:migrate:down…--> / <!--以下, ロールバックが必要な場合は…--> / <!--リリースレベルに応じて…--><!-- ... --> ブロックは削除しない(テンプレ構造の一部として保持)。◆ テンプレートに無い見出しに相当する議論の反映先
税率を Decimal で保持する判断が妥当か)以下の見出し別ルールは、検出したテンプレートにその見出しが存在する場合のみ適用する。存在しない見出しについてのルールは無視する。
◆ 簡潔セクション(斜め読みできる構造で書く)
各セクションの役割(混同しない):
| 見出し | 答えるべきこと(役割) | NG(混同例) |
|---|---|---|
| 関連 Issue, Design Doc | 紐付くチケット・先行PR・DDのリンク | 内容を要約して書かない |
| やったこと | 変更の事実(何を変えたか) | 動機・採用パターン・代替案を書かない |
| なぜやるのか | ユースケース・利用者目線の動機(誰がなぜ困っていたか / 何を可能にしたいか) | 「やったこと」を別表現で繰り返さない |
| レビューしてほしい観点 | 不安なポイント・判断を仰ぎたい箇所 | 自明な「テストOK」等を書かない |
| 動作確認結果 | 確認手段と結果の事実 | ケース列挙で水増ししない |
「やったこと」のセクション構造(必須):
...と同じ pattern)、比較対象(auth-guard.ts と同様)、hardcoded 等の理由語、(cookie 検証スキップ) のような括弧補足README のセットアップ手順の表記 typo を修正した。OrderService の責務記述コメントを実装と一致するよう更新した。エラー画面のメッセージを「サーバーエラー」から「処理に失敗しました。時間をおいて再度お試しください」に置換した。「なぜやるのか」のセクション構造(必須):
「動作確認結果」のセクション構造(必須):
1 行で「手段 → 結果」を言い切る(例: curl で cookie 有/無 5 ケース全て期待通り / Chrome MCP で landing → ログイン → /setting/profile 着地まで通過)
ケース列挙の bullet は書かない。N 件あるなら「全 N 件期待通り」で潰す
diff から自明な事実は書かない: 「spec を追加した」「テストファイルを書いた」など diff を見れば分かる事実は「動作確認結果」に書かない。書くのは実行検証の手段(コマンド / ブラウザ操作 / CI run)と結果(pass / fail / 着地確認)だけ
「レビューしてほしい観点」も同様に 1 行で書く
判断マトリクス: change 規模 × context に検証情報があるかで以下のように決める
| change 規模 | context に検証情報あり | context に検証情報なし |
|---|---|---|
| trivial (typo / コメント / 文言修正) | 1 行で「手段 → 結果」 | 目視確認のみ の固定 fallback または見出しのみ残し空欄 |
| 非 trivial | 1 行で「手段 → 結果」 | ローカルで <変更箇所> を手動確認 のような 1 行宣言(捏造的な spec / CI 言及はせず手動チェック範囲を率直に書く) |
自明な「テスト OK」「特になし」を捻り出して埋めるくらいなら fallback / 空欄 / 1 行宣言を選ぶ
記載例:
related #1234。推測不能なら related -一覧表示が遅く既存ユーザの体感に影響していたためeager_loadの選択が適切かRSpec 追加済み + 主要フロー手動確認済み記載例(複合見出しの場合、例: ## 関連 Issue, Design Doc):
箇条書きで複数項目を列挙する。各項目は1行に収める。
- XPROJ-444
- depends on #1234 (UserModel)
- DD: https://docs.google.com/document/d/xxxxx
単一項目しかない場合は箇条書きにせず1行で書いてよい(例: related #1234)。
◆ 詳細セクション(「設計判断」「やらなかったこと」だけはコードから読めない情報なので詳細に書く)
設計判断(コードから読めない情報・該当事実があれば詳細記述必須): 次のいずれかに該当するときは本文を必ず詳細に書く。コードを読んでも「なぜそう実装したのか」「なぜ他の案を採らなかったのか」は判別できないため、ここがレビュアーに残す唯一の手がかりになる。該当事実が一切無いなら見出しだけ残し本文空欄。
書き方: 散文で詳細に書く。他の簡潔セクションが 1 行に絞られているぶん、ここではレビュアーが PR の判断根拠を追えるだけの情報を残す。優先順位は次のとおり:
段落構成は次の順:1段落目で選択した結果、2段落目以降で理由・代替案・トレードオフを 1 つずつ丁寧に展開する。
「〜のため」の使用制限(同一段落内で2回以上の「文末/節末理由節」用法を禁止):
〜のため。 〜のため、〜 のように、句点直前または読点直前で理由を表す節末として使われた場合〜のために動作する 〜のため**だ** その**ため**の対策 のように後続が助詞・助動詞・名詞として続く形)やらなかったこと(コードから読めない情報・該当事実があれば詳細記述必須): 次のいずれかに該当するときは本文を必ず詳細に書く。コードには「やったこと」しか現れず、「触ろうと思えば触れたが意図的に触らなかった範囲」はレビュアーが推測するしかなくなる。ここを明示することでレビュー範囲の合意とフォローアップの追跡を可能にする。該当事実が一切無いなら見出しだけ残し本文空欄(推測で埋めない)。
書き方: 散文で詳細に書く。1 項目につき以下 3 点をセットで展開する:
未定 の明示)複数項目があれば項目ごとに段落を分けて書く。1 段落で済ませようとして情報を圧縮しない。
例: 本 PR では require_token? の重複解消には踏み込まない。重複の解消は auth middleware 全体のリファクタとセットで行うべきで、本 PR のスコープ(proxy 経路の一本化)を超えるため。後続 XPROJ-474 で別途対応する。
◆ 定型セクション
~/.claude/skills-config/environments.md の rollback_targets から取得(無ければ production / sandbox / staging のみで構成)。
各環境にアクセスして以下を実行してください
- production
- sandbox
- staging
- <~/.claude/skills-config/environments.md の integration_envs を1行ずつ列挙、無ければ省略>
# 1. 現在の状態確認
bundle exec rails db:migrate:status
# 2. ロールバック実行(新しいものから順に)
bundle exec rails db:migrate:down VERSION=<実際のmigration VERSION>
(複数ある場合は全て列挙)
# 3. 結果確認
bundle exec rails db:migrate:status
◆ 空欄セクションの書式
「詳細セクション」で本文を書かないと判定した場合、見出し行だけ残し、直下に空行を 1 行置く(プレースホルダやコメント等は追加しない)。
空行 1 行の理由: ## 見出し\n\n## 次の見出し の形でレンダリング崩れを避けるため。
日本語で記述
ラベルの付与
ラベル定義は ~/.claude/skills-config/release-labels.md を Read で取得して使用する。同ファイルには以下のキーが定義されている前提:
productivity_labels: 開発生産性カテゴリのラベル一覧と判定基準ai_contribution_labels: AI貢献度のラベル一覧(4段階推奨)と判定基準release_level_labels: リリースレベルのラベル一覧(4段階推奨)と判定基準core_features: プロジェクトの根幹機能リスト(ReleaseLevel 高レベル判定に使用)~/.claude/skills-config/release-labels.md が見つからない場合のフォールバック: bash scripts/setup.sh の実行をユーザーに促し、ラベル付与をスキップしてドラフトPRを作成。
a. Productivityラベル(1つ選択):
release-labels.md の productivity_labels から1つ選択。判定基準は同ファイルに従う。一般的な判定優先順位は以下(実環境のラベル名は release-labels.md を参照):
b. AI Contributionラベル(1つ選択):
release-labels.md の ai_contribution_labels から1つ選択。判定フローチャート(上から順に適用、最初にマッチしたもの採用):
c. Release Levelラベル(1つ選択):
release-labels.md の release_level_labels から1つ選択。判定ショートカット(上から順に適用、最初にマッチしたもの採用):
db/migrate/ 配下の差分がある → 最高レベル(スキーマ変更は常に最高、不可逆扱い)プロジェクトの根幹機能の判定:
release-labels.md の core_features リストに挙がっているドメインに触れるなら「根幹機能への影響あり」と判断core_features が空の場合は対象リポジトリの CLAUDE.md / README.md 冒頭の「主要機能」「プロジェクト概要」記述から推定マイルストーンの設定
Untrackedを設定gh api repos/{owner}/{repo}/milestones --jq '.[].title' で Untracked マイルストーンの存在を確認し、無ければ --milestone オプション自体を省略する(存在しない値を指定すると gh pr create が失敗するため)PR本文の最終チェック(投稿前必須) ステップ6で生成したPR本文を、投稿前に以下の観点で自己点検する。1つでも該当があれば修正してから次に進む。
[A] 斜め読みテスト(最重要・最初に実施)
[B] コードから読める情報の混入検出
[C] 重複・冗長検出
[D] AI臭検出
**強調**: 形式の太字bullet が1セクションに3つ以上並んでいないか該当があれば修正。ここをスキップすると冗長な description が残ってレビュアーの読む気を削ぐ。
ドラフトPRの作成
gh pr createコマンドを使用--draftオプションでドラフトとして作成--titleでタイトル設定--bodyで説明設定(ステップ9でチェック済みの本文)。巨大本文で --body-file を選ぶ場合は、必ず後述「作成後に PR description を更新する場合」の mktemp 規約に従う(固定パス /tmp/pr-body.md は過去セッション残骸混入の事故源)--labelで全てのラベル設定--milestoneでマイルストーン設定# developブランチに対してPRを作成
gh pr create --draft \
--title "feat(order): 注文確定後の通知機能を追加" \
--body "..." \
--label "1.Feature development,ai-contribution-level:2,ReleaseLevel-2" \
--base develop
gh pr edit --body は Projects Classic deprecation エラーで失敗するため 使わない。代わりに GitHub REST API を直接叩く。
⚠️ 前提: 固定パス (/tmp/pr-body.md 等) を使わない
過去セッションが同一パスに残した body 内容 (stale content) が残置ファイルとして残り、Write の「File has not been read yet」エラーを軽視して読み込まずに gh api -F body=@<file> や gh pr create --body-file <file> で渡すと、無関係な PR 内容が投入される事故が発生する。body をヒアドキュメントで一時ファイル化する場合は、固定パスではなく mktemp でユニークパスを生成し、終了時に削除する。ランダム名のため衝突せず、rm し損ねても他セッションには影響しない。
# 1. body を一時ファイルに書き出す(mktemp でユニークパス生成)
PR_BODY_FILE=$(mktemp --suffix=.md)
cat <<'EOF' > "$PR_BODY_FILE"
## やったこと
...
EOF
# 2. gh api PATCH で body を更新
REPO=$(gh repo view --json nameWithOwner --jq .nameWithOwner)
PR_NUMBER=<作成した PR 番号>
gh api "repos/${REPO}/pulls/${PR_NUMBER}" --method PATCH -F "body=@${PR_BODY_FILE}"
# 3. 一時ファイル削除
rm "$PR_BODY_FILE"
-F "body=@<path>" はファイル内容をリクエストボディの文字列値として送信する gh CLI の機能。--field の @ プレフィックスと同じgh pr edit --title / gh pr edit --add-label で動作するので、description 更新時のみこの回避策を使うmktemp 規約は Step 10 (gh pr create) で --body ではなく --body-file を選ぶ場合にも適用する/polish-before-commit — コミット前にプロジェクト規約・パターン一貫性を仕上げてから本 skill を起動する/finalize-plan — プランを実装可能形式に変換し、その流れで本 skill を呼ぶProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub yasuakiomokawa/skills --plugin create-pr