# バッチ設計書 13-doom ci deploy-hooks

## 概要

本ドキュメントは、Doom Emacsのgitフックデプロイコマンド「doom ci deploy-hooks」のバッチ設計書です。commit-msgおよびpre-pushのGitフックをリポジトリにインストールし、コミットメッセージの自動検証とプッシュ前チェックを有効化します。

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

doom ci deploy-hooksは、Doom Emacsプロジェクトの品質管理を自動化するためのGitフックをローカルリポジトリにデプロイするコマンドです。

**業務上の目的・背景**：コミットメッセージの品質はプロジェクトの履歴可読性と保守性に直結します。本コマンドにより、コミット時に自動的にメッセージ形式が検証され、プッシュ前にWIPコミットやfixup/squashコミットの混入が防止されます。これにより、メインブランチの品質が保たれ、コントリビューターは即座にフィードバックを受けることができます。

**バッチの実行タイミング**：手動実行（随時）。リポジトリのクローン後、または開発環境のセットアップ時に一度実行します。

**主要な処理内容**：
1. Gitリポジトリのルートディレクトリを検出
2. 既存のcore.hooksPath設定を確認
3. .git/hooksディレクトリの作成（必要に応じて）
4. commit-msgフックスクリプトの生成と配置
5. pre-pushフックスクリプトの生成と配置
6. フックスクリプトへの実行権限付与（chmod 700）

**前後の処理との関連**：デプロイ後は、git commit実行時にdoom ci hook commit-msg（No.15）が、git push実行時にdoom ci hook pre-push（No.16）が自動的に呼び出されます。

**影響範囲**：Gitリポジトリの.git/hooksディレクトリにフックスクリプトを作成します。既存のフックがある場合は上書きされます。

## バッチ種別

インストール / セットアップ

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（通常は初回のみ） |
| 実行時刻 | N/A |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | 手動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Gitリポジトリ内 | カレントディレクトリがGitリポジトリ内であること |
| Doomインストール済み | bin/doomが存在すること |
| 書き込み権限 | .git/hooksディレクトリへの書き込み権限があること |

### 実行可否判定

git rev-parse --show-toplevelでGitリポジトリのルートを検出できない場合はエラー終了します。core.hooksPathが設定されている場合は、ユーザーに確認を求めます（--forceで強制実行可能）。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| --force | Boolean | No | false | 既存のhooksPath設定を無視して強制インストール |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Gitリポジトリ | ディレクトリ | 現在の作業ディレクトリのGitリポジトリ |
| Git設定 | gitconfig | core.hooksPathの値 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| .git/hooks/commit-msg | シェルスクリプト | コミットメッセージ検証フック |
| .git/hooks/pre-push | シェルスクリプト | プッシュ前検証フック |
| 標準出力 | テキスト | 作成/上書きの成功メッセージ |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | commit-msg, pre-push |
| 出力先 | .git/hooks/ |
| 文字コード | UTF-8 |
| ファイル権限 | 700（実行可能） |

**生成されるフックスクリプトの形式：**
```sh
#!/usr/bin/env sh
{doom-emacs-dir}/bin/doom --no-color ci hook {hook-name} "$@"
```

## 処理フロー

### 処理シーケンス

```
1. Gitリポジトリルートの検出
   └─ git rev-parse --show-toplevel
2. サブモジュール判定
   └─ git rev-parse show-superproject-working-tree
3. core.hooksPath設定の確認
   └─ git config core.hooksPath
4. 既存設定がある場合の確認
   └─ --forceフラグまたはy-or-n-p確認
5. hooksディレクトリの作成
   └─ make-directory hooks-path 'parents
6. 各フックスクリプトの生成
   └─ commit-msg, pre-pushの作成
7. 実行権限の付与
   └─ set-file-modes hook #o700
8. 結果の表示
   └─ 作成/上書きの成功メッセージ
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[Gitリポジトリルート検出]
    B --> C{リポジトリ検出成功?}
    C -->|No| D[エラー終了]
    C -->|Yes| E[core.hooksPath確認]
    E --> F{hooksPath設定あり?}
    F -->|No| G[hooksディレクトリ作成]
    F -->|Yes| H{--force指定?}
    H -->|Yes| G
    H -->|No| I[ユーザー確認]
    I --> J{続行?}
    J -->|No| K[中断終了]
    J -->|Yes| G
    G --> L[commit-msgフック生成]
    L --> M[pre-pushフック生成]
    M --> N[実行権限付与]
    N --> O[成功メッセージ出力]
    O --> P[バッチ終了]
```

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

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

データベース操作は行いません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | user-error | Gitリポジトリ外で実行 | Gitリポジトリ内で実行する |
| - | user-error | ユーザーが確認で中断 | --forceを使用するか確認に同意 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | N/A |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

フックの作成に失敗した場合は、.git/hooksディレクトリの権限を確認し、手動でフックスクリプトを作成してください。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（ファイルシステム操作） |
| コミットタイミング | 即座 |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 2ファイル |
| 目標処理時間 | 1秒未満 |
| メモリ使用量上限 | 最小限 |

## 排他制御

排他制御は不要です。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 成功ログ | 各フック作成後 | "Created/Overwrote {hook-path}" |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| N/A | N/A | N/A |

## 備考

- 将来的には`doom install --git-hooks`に移行予定（TODOコメントあり）
- 生成されるフックは`--no-color`オプションを使用してDoom CLIを呼び出します
- サブモジュール内での実行も考慮されていますが、特別な処理は行われません
