# バッチ設計書 7-verify-commit.js

## 概要

本ドキュメントは、Vue.jsプロジェクトのGitコミットメッセージ検証スクリプト `scripts/verify-commit.js` の設計仕様を定義するバッチ設計書である。

### 本バッチの処理概要

本バッチは、Gitコミットメッセージが Conventional Commits 規約に準拠しているかを正規表現で検証し、不正な場合はエラーメッセージを表示してプロセスを終了するスクリプトである。

**業務上の目的・背景**：Vue.jsプロジェクトでは、自動化されたChangelog生成のためにConventional Commits形式のコミットメッセージが必須である。統一されたコミットメッセージ形式を強制することで、変更履歴の自動生成、セマンティックバージョニングの判定、PRレビューの効率化を実現する。本バッチは `simple-git-hooks` の `commit-msg` フックとして設定され、コミット時に自動的に実行される。

**バッチの実行タイミング**：Gitの `commit-msg` フックとして、コミット作成時に自動的に実行される。

**主要な処理内容**：
1. `.git/COMMIT_EDITMSG` ファイルからコミットメッセージを読み込み
2. 正規表現によるConventional Commits形式の検証
3. 検証失敗時のエラーメッセージ表示と終了コード1でのプロセス終了

**前後の処理との関連**：本バッチは `simple-git-hooks` パッケージにより `commit-msg` フックとして登録される。リリースプロセス（`scripts/release.js`）で作成されるコミットメッセージ `release: v{version}` も本バッチの検証対象となる。

**影響範囲**：コミット操作の成否に直接影響する。検証に失敗した場合、コミットが拒否される（exit code 1）。ファイルシステムへの変更は行わない。

## バッチ種別

検証処理（Gitフック）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | コミット作成時（イベント駆動） |
| 実行時刻 | - |
| 実行曜日 | - |
| 実行日 | - |
| トリガー | Gitのcommit-msgフック（simple-git-hooks） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Gitリポジトリ | `.git/` ディレクトリが存在すること |
| COMMIT_EDITMSG | `.git/COMMIT_EDITMSG` ファイルが存在すること（Git が自動生成） |
| simple-git-hooks | commit-msgフックとして登録済みであること |

### 実行可否判定

`.git/COMMIT_EDITMSG` ファイルが存在し読み取り可能であれば実行される。特別な判定ロジックはない。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| - | - | - | - | コマンドライン引数なし |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| .git/COMMIT_EDITMSG | テキスト | Gitが生成するコミットメッセージファイル |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準エラー出力 | テキスト | 検証失敗時のエラーメッセージ（色付き） |
| プロセス終了コード | 数値 | 成功時: 0（暗黙）、失敗時: 1 |

### 出力ファイル仕様

本バッチはファイル出力を行わない。

## 処理フロー

### 処理シーケンス

```
1. コミットメッセージの読み込み
   └─ .git/COMMIT_EDITMSG ファイルを読み込み、trim()で前後の空白を除去
2. 正規表現による検証
   └─ パターン: /^(revert: )?(feat|fix|docs|dx|style|refactor|perf|test|workflow|build|ci|chore|types|wip|release)(\(.+\))?: .{1,50}/
   └─ 許可されるプレフィックス: feat, fix, docs, dx, style, refactor, perf, test, workflow, build, ci, chore, types, wip, release
   └─ revert: プレフィックスのオプション対応
   └─ スコープ指定のオプション対応（例: feat(compiler)）
   └─ タイトル部分は1〜50文字
3. 検証結果の処理
   └─ 一致: 正常終了（exit code 0）
   └─ 不一致: エラーメッセージ表示 → exit(1)
```

### フローチャート

```mermaid
flowchart TD
    A[commit-msgフック実行] --> B[.git/COMMIT_EDITMSG読み込み]
    B --> C{正規表現に一致?}
    C -->|Yes| D[正常終了 exit 0]
    C -->|No| E[エラーメッセージ表示]
    E --> F[異常終了 exit 1]
```

## データベース操作仕様

### 操作別データベース影響一覧

本バッチはデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| exit(1) | コミットメッセージ形式エラー | コミットメッセージがConventional Commits形式に準拠していない | .github/commit-convention.mdを参照し、正しい形式でコミットメッセージを記述 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | リトライ機構なし（コミットメッセージ修正後に再コミット） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

### 障害時対応

コミットメッセージの形式エラーの場合、エラーメッセージに正しい形式の例が表示される。ユーザーはコミットメッセージを修正して再度コミットを実行する。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | - |
| コミットタイミング | - |
| ロールバック条件 | 検証失敗時はGitがコミットを自動的に中止する |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1コミットメッセージ |
| 目標処理時間 | ミリ秒単位（ファイル読み込みと正規表現マッチのみ） |
| メモリ使用量上限 | 明示的な制限なし |

## 排他制御

Gitの仕組みにより、同時に複数のコミットが実行されることは通常ない。排他制御は不要。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| エラーログ | 検証失敗時 | 「ERROR invalid commit message format.」メッセージと正しい形式の例 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| - | - | Git commit-msgフックとして機能するため個別の監視は不要 |

## 備考

- 許可されるコミットタイプ一覧：feat, fix, docs, dx, style, refactor, perf, test, workflow, build, ci, chore, types, wip, release
- `revert:` プレフィックスはオプションで付与可能
- スコープ部分 `(\(.+\))` はオプションで、括弧内に任意の文字列を記述可能
- タイトル（コロン後のメッセージ）は1〜50文字の制限あり
- エラーメッセージに含まれる例：
  - `feat(compiler): add 'comments' option`
  - `fix(v-model): handle events on blur (close #28)`
- 詳細な規約は `.github/commit-convention.md` に記載されている
- picocolorsライブラリを使用してエラーメッセージをカラー表示する
