From 8c16eb7b93032424f54ebfcc77e8536ccc1b8949 Mon Sep 17 00:00:00 2001 From: Yuto Igarashi <241888606+yutoigarashi-stack@users.noreply.github.com> Date: Tue, 3 Mar 2026 00:51:28 +0900 Subject: [PATCH] =?UTF-8?q?feat(claude):=20commit,=20publish-pr,=20squash-?= =?UTF-8?q?merge=20skills=20=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - commit: 日本語 Conventional Commits フォーマットでのコミット作成スキル - publish-pr: git log ベースの PR 説明再編集・publish スキル - squash-merge: コミット履歴要約による squash merge スキル --- claude/skills/commit/SKILL.md | 207 +++++++++++++++++++++ claude/skills/publish-pr/SKILL.md | 275 +++++++++++++++++++++++++++ claude/skills/squash-merge/SKILL.md | 277 ++++++++++++++++++++++++++++ 3 files changed, 759 insertions(+) create mode 100644 claude/skills/commit/SKILL.md create mode 100644 claude/skills/publish-pr/SKILL.md create mode 100644 claude/skills/squash-merge/SKILL.md diff --git a/claude/skills/commit/SKILL.md b/claude/skills/commit/SKILL.md new file mode 100644 index 0000000..186705d --- /dev/null +++ b/claude/skills/commit/SKILL.md @@ -0,0 +1,207 @@ +--- +name: commit +description: 変更内容を分析し、日本語のConventional Commitsフォーマットでコミットを作成するスキル。日本語の流暢性と文体の統一に注力する。「コミットして」「commitして」「変更をコミット」などの依頼時に使用。 +context: fork +--- + +# Commit + +変更内容を分析し、日本語の Conventional Commits フォーマットでコミットメッセージを生成するスキル。 + +## 概要 + +ステージング済みおよび未ステージングの変更を分析し、適切な type・scope を判定して、自然な日本語のコミットメッセージを生成する。文体は体言止め・動詞終止形で統一し、ですます調は使わない。 + +## ワークフロー + +### Step 1: 現状確認 + +```bash +# 変更状態を確認 +git status + +# ステージ済みの差分を確認 +git diff --staged + +# 未ステージの差分を確認 +git diff + +# 最近のコミットを確認(スタイルの参考に) +git log --oneline -10 +``` + +**確認事項:** + +- [ ] コミット対象の変更が存在する +- [ ] 機密情報(`.env`, `credentials.json` 等)が含まれていない + +### Step 2: 変更内容の分析 + +以下の観点で変更を分析: + +1. **変更の種類**: 新機能 / バグ修正 / リファクタリング / その他 +2. **影響範囲**: どのモジュール・機能に影響するか +3. **変更の目的**: なぜこの変更が必要か + +### Step 3: Type と Scope の決定 + +**Type の選択基準:** + +| 変更内容 | Type | +| ---------------------------- | ---------- | +| 新しい機能を追加 | `feat` | +| バグを修正 | `fix` | +| コードを整理(動作は不変) | `refactor` | +| パフォーマンスを改善 | `perf` | +| テストを追加・修正 | `test` | +| ドキュメントのみ変更 | `docs` | +| フォーマットのみ変更 | `style` | +| ビルド・設定変更 | `chore` | + +**Scope の決定基準:** + +- ファイルパスから判断: `src/auth/login.ts` → `auth` +- 機能から判断: ユーザー認証関連 → `auth` +- 複数スコープにまたがる場合は最も重要な部分を選択 +- 明確でない場合は省略可 + +### Step 4: コミットメッセージの生成 + +**フォーマット:** + +``` +{type}({scope}): {説明} + +[任意の本文] +``` + +**文体: 体言止め・動詞終止形(ですます調は使わない)** + +subject も body も、ですます調は使わず、体言止めまたは動詞の終止形で統一する。 + +``` +# 良い例 +feat(auth): ログイン機能を追加 +fix(api): ユーザー取得時の null エラーを修正 +refactor(utils): 日付処理関数を整理 +docs(readme): インストール手順を更新 + +# 悪い例(ですます調) +feat(auth): ログイン機能を追加しました +fix(api): ユーザー取得時の null エラーを修正しました +``` + +**本文が必要な場合:** + +複数の変更を含む場合は箇条書きで記述する。 + +``` +feat(auth): ユーザー認証機能を追加 + +- ログイン・ログアウト API を追加 +- JWT トークンによるセッション管理を実装 +- 認証ミドルウェアを追加 +``` + +**subject の制約:** + +- 50 文字以内を目安に +- 何を変更したかが一目でわかるように +- 「修正」「更新」だけの説明不足なメッセージは避ける + +### Step 5: 日本語の流暢性チェック + +メッセージ生成後、以下の観点で品質を確認: + +- [ ] 体言止めまたは動詞終止形で統一されているか(ですます調でないか) +- [ ] 主語と述語の対応が正しいか +- [ ] 助詞(は/が/を/に/で等)の使い方が適切か +- [ ] 冗長な表現がないか +- [ ] 技術用語と日本語の混在が自然か +- [ ] 日本語と半角英数字の間に半角スペースがあるか + +**よくある問題と修正例:** + +| 問題のある表現 | 修正後 | +| ---------------------------- | ---------------------- | +| 〜を追加しました | 〜を追加 | +| 〜を実装しています | 〜を実装 | +| 〜を行う | 〜する | +| 〜することが可能 | 〜できる | +| 〜についての | 〜の | +| 機能を追加を行った | 機能を追加 | +| ユーザーがログインをする | ユーザーがログインする | + +**悪い例と修正:** + +| 悪い例 | 問題点 | 良い例 | +| ------------------------------------------------ | ---------------- | --------------------------------------- | +| `fix: バグ修正` | 何を修正したか不明 | `fix(api): null ポインタ例外を修正` | +| `update` | type/scope がない | `feat(ui): ボタンのデザインを更新` | +| `feat: 機能を追加を行った` | 冗長、不自然 | `feat(auth): 2FA 機能を追加` | +| `fix(auth): ログインできないのを直した` | 口語的 | `fix(auth): ログイン失敗時のエラーを修正` | +| `feat(auth): ユーザーのログインの機能の追加を行った` | 冗長、の連続 | `feat(auth): ユーザーログイン機能を追加` | + +### Step 6: ステージングとコミット + +```bash +# 関連ファイルをステージング(git add -A は使わない) +git add + +# コミット(HEREDOC を使用) +git commit -m "$(cat <<'EOF' +{type}({scope}): {説明} + +- 変更点 1 +- 変更点 2 +EOF +)" +``` + +### Step 7: 確認 + +```bash +# コミット結果を確認 +git log -1 --stat +``` + +## 特殊なケース + +### Breaking Changes + +``` +feat(api)!: 認証 API の仕様を変更 + +BREAKING CHANGE: トークン形式を JWT に変更。 +既存のセッションベース認証は使用不可。 +``` + +### Issue/PR 参照 + +``` +fix(api): ユーザー削除時のエラーを修正 + +Closes #123 +``` + +## 日本語スペースルール + +日本語と半角英数字の間には必ず半角スペースを入れる: + +``` +# 良い例 +feat(auth): ユーザー認証 API の実装 +PR を作成した + +# 悪い例 +feat(auth): ユーザー認証APIの実装 +PRを作成した +``` + +## Git 安全プロトコル + +- コミット前に `git status` と `git diff` で変更を確認 +- 機密情報(`.env`, `credentials.json` 等)を含むファイルはコミットしない +- `git add -A` や `git add .` は使わず、ファイルを個別に指定する +- pre-commit フックが失敗した場合は修正して新規コミット(`--no-verify` は使用しない) +- `git commit --amend` は push 済みの場合は避ける diff --git a/claude/skills/publish-pr/SKILL.md b/claude/skills/publish-pr/SKILL.md new file mode 100644 index 0000000..7ff72e0 --- /dev/null +++ b/claude/skills/publish-pr/SKILL.md @@ -0,0 +1,275 @@ +--- +name: publish-pr +description: 現在のブランチに紐づいたPRを、git logのコミットメッセージを元に再編集してpublishするスキル。squash時に意味をなさないコミットメッセージを自動的に除外し、意味のあるコミットのみでPR説明を構成する。「PRをpublishして」「PRを公開して」「PRの説明を更新して」などの依頼時に使用。 +context: fork +--- + +# Publish PR + +git log のコミットメッセージを元に PR を再編集し、publish するためのスキル。 + +## 概要 + +作業ブランチのコミット履歴から、squash マージ時に意味をなすコミットメッセージのみを抽出し、PR の説明を再構成する。 + +## ワークフロー + +### Step 1: 現状確認 + +```bash +# 現在のブランチを確認 +git branch --show-current + +# 関連するPRを確認 +gh pr view --json number,title,body,state,isDraft + +# ベースブランチからの差分コミットを確認 +gh pr view --json baseRefName --jq '.baseRefName' | xargs -I {} git log {}..HEAD --oneline + +# リモートに未pushのコミットがあるか確認 +git status -sb +``` + +リモートに未 push のコミットがある場合は、先に push する: + +```bash +git push +``` + +### Step 2: コミット分類 + +コミットメッセージを以下のカテゴリに分類: + +**含めるべきコミット(意味のある変更):** + +- `feat:` - 新機能追加 +- `fix:` - バグ修正 +- `refactor:` - リファクタリング +- `perf:` - パフォーマンス改善 +- `docs:` - ドキュメント変更(重要なもの) + +**除外すべきコミット(作業過程でのみ意味があるもの):** + +- `WIP` / `wip` - 作業中 +- `fixup` / `squash` - squash 用マーカー +- `typo` / `lint` - 軽微な修正 +- `merge` - マージコミット +- `revert` + 同じブランチ内での再追加 +- コメント追加のみ +- import 整理のみ +- 連続する類似の修正コミット(最後のもの以外) + +### Step 3: PR 説明の構成 + +以下の構造で PR 説明を生成: + +```markdown +## Summary + + + +## Changes + + + +- 変更点1 +- 変更点2 +- ... + +## Test plan + + + +- [ ] テスト項目1 +- [ ] テスト項目2 +``` + +### Step 4: 日本語の流暢性チェック + +PR説明とsquashコミットメッセージを作成する前に、以下の観点で日本語の流暢性を確認する。 + +**文体: 体言止め・動詞終止形(ですます調は使わない)** + +PR 説明もコミットメッセージも、ですます調は使わず、体言止めまたは動詞の終止形(「〜した」「〜する」)で統一する。 + +``` +# 良い例 +feat(auth): ユーザーログイン機能を追加 +- ログイン・ログアウト API を追加 +- 認証ミドルウェアを実装 + +# 悪い例(ですます調) +feat(auth): ユーザーログイン機能を追加しました +- ログイン・ログアウト API を追加しました +- 認証ミドルウェアを実装しました +``` + +**チェック項目:** + +- [ ] 体言止めまたは動詞終止形で統一されているか(ですます調でないか) +- [ ] 主語と述語の対応が正しいか +- [ ] 助詞(は/が/を/に/で等)の使い方が適切か +- [ ] 冗長な表現がないか(「〜することができる」→「〜できる」) +- [ ] 技術用語と日本語の混在が自然か +- [ ] 一文が長すぎないか(目安: 60文字以内) + +**よくある問題と修正例:** + +| 問題のある表現 | 修正後 | +| ------------------------ | ------------------------ | +| 〜を追加しました | 〜を追加 | +| 〜を実装しています | 〜を実装 | +| 〜を行う | 〜する | +| 〜することが可能 | 〜できる | +| 〜についての | 〜の | +| 〜という | (削除可能な場合が多い) | +| 機能を追加を行った | 機能を追加 | +| ユーザーがログインをする | ユーザーがログインする | + +**コミットメッセージの流暢性:** + +``` +# 悪い例 +feat(auth): ユーザーのログインの機能の追加を行った + +# 良い例 +feat(auth): ユーザーログイン機能を追加 +``` + +**PR説明の流暢性:** + +``` +# 悪い例 +このPRは、ユーザーがログインすることができるようにするための機能についての実装を行うものです。 + +# 良い例 +ユーザーログイン機能を実装した。 +``` + +### Step 5: PR タイトルの生成 + +コミット履歴と変更内容から、Conventional Commits 形式の PR タイトルを生成する。 + +**フォーマット:** + +``` +{type}({scope}): {description} +``` + +- `type`: PR 全体の変更内容に最も適したタイプを選択 +- `scope`: 変更の主要な対象(省略可) +- `description`: 変更の要約を簡潔に記述(体言止めまたは動詞終止形) + +**タイプ判定:** + +| タイプ | 用途 | +| -------- | ---------------- | +| feat | 新機能追加 | +| fix | バグ修正 | +| refactor | リファクタリング | +| docs | ドキュメント | +| perf | パフォーマンス | +| test | テスト | +| chore | その他 | + +**例:** + +``` +feat(auth): ユーザー認証機能を実装 +fix(api): ユーザー取得時の null エラーを修正 +docs(skills): スキルの説明を更新 +``` + +### Step 6: PR 更新 + +```bash +# PR のタイトルと説明を更新 +gh pr edit --title "feat(auth): ユーザー認証機能を実装" --body "$(cat <<'EOF' +## Summary + +... + +## Changes + +... + +## Test plan + +... +EOF +)" + +# ドラフトの場合は publish +gh pr ready +``` + +### Step 7: 確認 + +```bash +# 更新後のPRを確認 +gh pr view +``` + +## コミット分類の詳細ガイドライン + +### 含める: 機能的な変更 + +``` +feat(auth): ログイン機能を追加 -> 含める +fix(api): nullエラーを修正 -> 含める +refactor(user): 認証処理を分離 -> 含める +perf(db): クエリを最適化 -> 含める +``` + +### 除外: 作業過程のコミット + +``` +WIP: 途中まで -> 除外 +fix: typo -> 除外 +fix: lint error -> 除外 +fix: 前のコミットの修正 -> 除外(前のコミットとマージして説明) +chore: import整理 -> 除外 +``` + +### 判断が必要なケース + +``` +docs: READMEを更新 -> 内容次第で判断 +test: テストを追加 -> 機能に関連するなら含める +style: フォーマット修正 -> 通常は除外 +``` + +## Squash コミットメッセージの構成 + +PR をマージする際の squash コミットメッセージも同様の原則で構成: + +``` +feat(scope): 主要な変更の説明 + +- 変更点1 +- 変更点2 +- 変更点3 +``` + +## 注意事項 + +- コミットの意図を理解するために、diff の内容も確認すること +- 連続する修正コミットは、最終的な変更のみを説明に含める +- バグ修正の場合は、何を修正したかを明確に記述 +- 機能追加の場合は、ユーザーにとっての価値を記述 + +## 関連コマンド + +```bash +# コミット履歴を詳細に確認 +git log --oneline --no-merges main..HEAD + +# 特定コミットの詳細を確認 +git show + +# PR の現在の状態を確認 +gh pr view --json number,title,body,state,isDraft,baseRefName + +# PR をドラフトに戻す +gh pr ready --undo +``` diff --git a/claude/skills/squash-merge/SKILL.md b/claude/skills/squash-merge/SKILL.md new file mode 100644 index 0000000..bc65ff7 --- /dev/null +++ b/claude/skills/squash-merge/SKILL.md @@ -0,0 +1,277 @@ +--- +name: squash-merge +description: PRのコミット履歴をClaudeが要約した簡潔なメッセージでsquash mergeするスキル。「squash mergeして」「squash マージして」など、squash mergeが明示的に指定された場合のみ使用。単に「マージして」「PRをマージして」と言われた場合はこのスキルを使わないこと。 +context: fork +--- + +# Squash Merge + +PR のコミット履歴から自動生成した簡潔なメッセージで squash merge するスキル。 + +## 引数 + +なし + +## 概要 + +作業ブランチのコミット履歴を分析し、意味のあるコミットのみを抽出して Conventional Commits 形式の squash コミットメッセージを生成。生成したメッセージをユーザーに確認した上で squash merge を実行します。 + +マージコマンドには `--auto` フラグを使用するため、CI チェックやレビュー承認などのマージ要件が満たされるまで自動的に待機してからマージが実行されます。 + +## ワークフロー + +### Step 1: 現状確認 + +```bash +# 現在のブランチと PR 情報を確認 +git branch --show-current + +# PR の詳細を取得 +gh pr view --json number,title,body,state,isDraft,baseRefName,headRefName +``` + +```bash +# リモートに未pushのコミットがあるか確認 +git status -sb +``` + +リモートに未 push のコミットがある場合は、先に push する: + +```bash +git push +``` + +**確認事項:** + +- [ ] 現在のブランチに紐づく PR が存在する +- [ ] PR がドラフト状態でない(ドラフトの場合はユーザーに報告) +- [ ] リモートに未 push のコミットがない(ある場合は push してから進める) + +### Step 2: コミット履歴の取得と分類 + +```bash +# ベースブランチからの差分コミットを取得 +gh pr view --json baseRefName --jq '.baseRefName' | xargs -I {} git log {}..HEAD --oneline --no-merges +``` + +コミットメッセージを以下のカテゴリに分類: + +**含めるべきコミット(意味のある変更):** + +- `feat:` - 新機能追加 +- `fix:` - バグ修正 +- `refactor:` - リファクタリング +- `perf:` - パフォーマンス改善 +- `docs:` - ドキュメント変更(重要なもの) + +**除外すべきコミット(作業過程でのみ意味があるもの):** + +- `WIP` / `wip` - 作業中 +- `fixup` / `squash` - squash 用マーカー +- `typo` / `lint` - 軽微な修正 +- `merge` - マージコミット +- `revert` + 同じブランチ内での再追加 +- コメント追加のみ +- import 整理のみ +- 連続する類似の修正コミット(最後のもの以外) + +### Step 3: Squash コミットメッセージの生成 + +意味のあるコミットから、Conventional Commits 形式のメッセージを生成する。 + +**文体: 体言止め・動詞終止形(ですます調は使わない)** + +subject も body も、一般的なコミットメッセージのスタイルで記述する。ですます調は使わず、体言止めまたは動詞の終止形(「〜した」「〜する」)で統一する。 + +``` +# 良い例 +feat(auth): ユーザー認証機能を追加 +- ログイン・ログアウト API を追加 +- JWT トークンによるセッション管理を実装 + +# 悪い例(ですます調) +feat(auth): ユーザー認証機能を追加しました +- ログイン・ログアウト API を追加しました +- JWT トークンによるセッション管理を実装しました +``` + +**subject 行:** + +``` +{type}({scope}): {説明} (#{PR番号}) +``` + +- `type`: PR 全体の変更内容に最も適したタイプを選択 +- `scope`: 変更の主要な対象(省略可) +- `説明`: 変更の要約を簡潔に記述(体言止めまたは動詞終止形) +- `PR番号`: Step 1 で取得した PR の番号 + +**body:** + +意味のあるコミットから抽出した変更点を箇条書き(3-5 行程度) + +``` +feat(auth): ユーザー認証機能を実装 (#12) + +- ログイン・ログアウト API を追加 +- JWT トークンによるセッション管理を実装 +- 認証ミドルウェアを追加 +``` + +**日本語の流暢性チェック:** + +メッセージ生成時に以下を確認: + +- [ ] 体言止めまたは動詞終止形で統一されているか(ですます調でないか) +- [ ] 主語と述語の対応が正しいか +- [ ] 助詞の使い方が適切か +- [ ] 冗長な表現がないか(「〜することができる」→「〜できる」) +- [ ] 技術用語と日本語の混在が自然か +- [ ] 一文が長すぎないか(目安: 60 文字以内) + +| 問題のある表現 | 修正後 | +| ---------------------------- | ------------------------ | +| 〜を追加しました | 〜を追加 | +| 〜を実装しています | 〜を実装 | +| 〜を行う | 〜する | +| 〜することが可能 | 〜できる | +| 〜についての | 〜の | +| 機能を追加を行った | 機能を追加 | + +### Step 4: ユーザー確認 + +生成したコミットメッセージをユーザーに提示して承認を得る。 + +**提示フォーマット:** + +``` +以下の内容で squash merge を実行します。 + +Subject: feat(auth): ユーザー認証機能を実装 (#12) + +Body: +- ログイン・ログアウト API を追加 +- JWT トークンによるセッション管理を実装 +- 認証ミドルウェアを追加 + +このメッセージで squash merge してよいですか? +``` + +ユーザーが修正を求めた場合は、修正して再度確認する。 + +### Step 5: Squash Merge 実行 + +コマンドの構造: + +| 部分 | 値 | +|------|-----| +| 固定 | `gh pr merge --auto --squash` | +| 可変 | `--subject "{Step 3 で生成した subject}"` | +| 可変 | `--body "{Step 3 で生成した body}"` | + +実行例: + +```bash +gh pr merge --auto --squash --subject "feat(auth): ユーザー認証機能を実装 (#12)" --body "$(cat <<'EOF' +- ログイン・ログアウト API を追加 +- JWT トークンによるセッション管理を実装 +- 認証ミドルウェアを追加 +EOF +)" +``` + +**動作:** + +`--auto` フラグにより、以下のように動作する: + +- **マージ要件が満たされている場合**: 即座にマージを実行 +- **CI チェックが pending の場合**: CI 完了まで自動的に待機してからマージ +- **マージ不可能な場合**: GitHub からのエラーメッセージを表示 + +**エラー報告例:** + +``` +マージに失敗しました。 + +GitHub からのエラー: +Pull request is not mergeable + +レビュー承認やブランチ保護ルールの要件を確認してください。 +``` + +### Step 6: 完了確認とブランチ削除 + +マージ完了後、結果を表示: + +```bash +# マージ結果を確認 +gh pr view --json state,mergedAt,mergeCommit +``` + +ローカルブランチの削除をユーザーに確認する(毎回確認): + +``` +PR のマージが完了しました。 + +ローカルブランチ `feature/auth` を削除しますか? +``` + +**削除する場合:** + +```bash +# メインブランチに切り替えて最新化し、ローカルブランチを削除 +git switch main && git pull && git branch -d feature/auth +``` + +**削除しない場合:** + +何もせず終了。 + +## コミット分類の詳細ガイドライン + +### 含める: 機能的な変更 + +``` +feat(auth): ログイン機能を追加 -> 含める +fix(api): null エラーを修正 -> 含める +refactor(user): 認証処理を分離 -> 含める +perf(db): クエリを最適化 -> 含める +``` + +### 除外: 作業過程のコミット + +``` +WIP: 途中まで -> 除外 +fix: typo -> 除外 +fix: lint error -> 除外 +fix: 前のコミットの修正 -> 除外(前のコミットとマージして説明) +chore: import 整理 -> 除外 +``` + +### 判断が必要なケース + +``` +docs: README を更新 -> 内容次第で判断 +test: テストを追加 -> 機能に関連するなら含める +style: フォーマット修正 -> 通常は除外 +``` + +## 注意事項 + +- コミットの意図を理解するために、必要に応じて diff の内容も確認すること +- 連続する修正コミットは、最終的な変更のみを説明に含める +- バグ修正の場合は、何を修正したかを明確に記述 +- 機能追加の場合は、ユーザーにとっての価値を記述 + +## 関連コマンド + +```bash +# コミット履歴を詳細に確認 +git log --oneline --no-merges main..HEAD + +# 特定コミットの詳細を確認 +git show + +# PR の現在の状態を確認 +gh pr view --json number,title,body,state,isDraft,baseRefName +```