---
name: moqada-commit
description: リポジトリのコミットスタイルを自動検出してコミットを作成。「コミットして」「commit this」「変更をコミット」等のリクエストや、一連の作業の締めくくりとしてコミットが必要な場面で使用する。
allowed-tools: ["Bash", "Read"]
---

# 手順

1. **コミットスタイルの決定**: 以下のソースから情報を集め、コミットスタイル（形式・言語）を決定する:
   a. CLAUDE.md にコミット規約の記載があれば採用する
   b. オーバーレイルール（後述）があればマージする（後から読んだものが優先）
   c. 上記で**スタイル形式（Conventional Commits 等）と言語の両方**が確定していれば、`git log` の探索は省略する
   d. 未確定の要素がある場合のみ `git log` で補完する: `git config user.email` でユーザーを取得し、`git log --author=<email> -20 --format="--- commit ---%nsubject: %s%nbody: %b"` で過去のコミットを分析する
2. `git status` と `git diff` で変更内容を確認（ステップ1と並行実行可能）
3. 決定したスタイルに従ってコミットメッセージを作成
4. ステージングしてコミット実行

## スタイル自動検出（ステップ1dの場合）

過去のコミットメッセージを分析してスタイルを判定:
- `type(scope):` や `type:` 形式が多ければ → Conventional Commit スタイル
- それ以外 → リポジトリ固有のスタイル（過去のコミットに合わせる）
- subject の言語（日本語/英語）と body の言語を個別に判定する

## コミット分割

- 複数の独立した変更がある場合はコードに対する変更の論理的な単位で分割してコミットする
- 同じタスクに含まれる変更でも、コードの変更単位が異なれば別コミットにする
- 独立性が明確な場合は確認せず自動で分割、関連性が曖昧な場合は確認する
- **コミット順序**: 基盤の変更（型定義、ユーティリティ、共通ロジック）を先にコミットし、利用側の変更を後にする。レビュアーが diff を順番に読んだとき、前提知識なしに理解できる順序にする

# オーバーレイルール

以下のファイルが存在すれば**順番に読み込み**、追加のコミットルールとして適用する。後から読み込んだルールが矛盾する場合は後者を優先する:

1. `~/.claude/commit-rules.md`（ユーザーレベル）
2. `<project>/.claude/commit-rules.md`（プロジェクトレベル）

オーバーレイが存在しない場合は、以降のセクションのみで動作する。

# スタイル別ガイドライン

## Conventional Commit スタイルの場合

過去のコミットで使われている type と scope の粒度をそのまま踏襲する。過去のコミットから判断できない場合は Angular convention をデフォルトとする。

### revert について

`revert` type を手動で使わない。コミットを取り消す場合は `git revert <hash>` コマンドを使う。
Git が Angular convention に沿った subject (`Revert "<元のsubject>"`) と body (`This reverts commit <hash>.`) を自動生成する。
一部の変更を元に戻すだけでコミット全体の取り消しではない場合は、`chore` や `fix` 等の適切な type を使う。

## リポジトリ固有スタイルの場合

過去の自分のコミットメッセージのパターンを分析し、以下を踏襲する:
- 文体（体言止め、動詞終わり、敬体など）
- プレフィックスの有無と形式
- 括弧や記号の使い方
- 言語（日本語/英語）

# 共通ルール

## subject
- 移行・置き換えは変更前後を明示する
- 削除は理由を含める
- 英語の場合: 先頭大文字、命令形（imperative mood）、末尾ピリオドなし

## body
必要な場合のみ記述。以下の構造で:

1. 主要な理由（技術的根拠や仕様上の理由）
2. 副次的な理由（実用的な影響）
3. 参照資料（RFC等はURLを含める）

引数が指定された場合は、その内容をスコープまたは説明に含める: $ARGUMENTS
