# バッチ設計書 24-toolkit setup-git-hooks

## 概要

本ドキュメントは、Nushellプロジェクトにおけるtoolkit setup-git-hooksコマンドの設計仕様を定義したものである。このバッチはローカルのGit hooksを設定し、コミット時とプッシュ時に自動的にコード品質チェックを実行するようにする。

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

toolkit setup-git-hooksは、Nushellプロジェクトのローカルリポジトリに対してGit hooksを設定するツールである。設定後、git commit時にはフォーマットチェック（toolkit fmt --check --verbose）が、git push時にはフォーマットチェックとClippyチェック（toolkit clippy --verbose）が自動的に実行される。

**業務上の目的・背景**：コードレビューの前段階で、フォーマットやコード品質の問題を自動検出することにより、レビュー効率を向上させる。開発者が手動でチェックコマンドを実行し忘れることを防止し、一貫した品質のコードのみがリポジトリにコミット・プッシュされるようにする。これにより、CIでの失敗を減らし、開発サイクルを短縮できる。

**バッチの実行タイミング**：開発環境のセットアップ時に一度だけ実行される。リポジトリをクローンした後、または新しい開発者がプロジェクトに参加した際に実行される。

**主要な処理内容**：
1. ユーザーに確認メッセージを表示（ローカルGit設定の変更を警告）
2. ユーザーが"y"を入力した場合のみ処理を続行
3. git config --local core.hooksPath .githooksを実行
4. .githooksディレクトリ内のpre-commitとpre-pushスクリプトが有効化される

**前後の処理との関連**：設定完了後、git commitおよびgit push時に.githooks配下のスクリプトが自動実行される。toolkit fmtおよびtoolkit clippyコマンドが内部で呼び出される。

**影響範囲**：ローカルリポジトリのGit設定（core.hooksPath）が変更される。以降のgit commit/push操作に影響を与える。

## バッチ種別

開発環境セットアップ / Git hooks設定

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 一度のみ（環境セットアップ時） |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Git環境 | Gitがインストールされ、リポジトリ内で実行されること |
| Nushell環境 | Nushellがインストールされ、toolkitモジュールが利用可能であること |
| .githooksディレクトリ | プロジェクトルートに.githooksディレクトリが存在すること |

### 実行可否判定

Gitリポジトリ内で実行され、.githooksディレクトリが存在する場合に実行可能。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | パラメータは受け付けない |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| ユーザー入力 | テキスト | 確認プロンプトへの応答（"y"で続行） |
| .githooks/pre-commit | シェルスクリプト | コミット時に実行されるスクリプト |
| .githooks/pre-push | シェルスクリプト | プッシュ時に実行されるスクリプト |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | 確認メッセージと処理結果 |
| .git/config | Git設定 | core.hooksPath = .githooks が追加される |

### 出力ファイル仕様

ファイル出力なし。ローカルGit設定が変更される。

## 処理フロー

### 処理シーケンス

```
1. 確認メッセージの表示
   └─ "This command will change your local git configuration and hence modify your development workflow. Are you sure you want to continue? [y]"
2. ユーザー入力の待機
   └─ inputコマンドでユーザー入力を受け付け
3. 入力判定
   └─ 入力が"y"の場合のみ続行、それ以外は中止
4. hooksPathの設定（"y"の場合）
   └─ git config --local core.hooksPath .githooks を実行
5. 結果の表示
   └─ 成功時: "running 'toolkit setup-git-hooks'"（pretty-format-commandで整形）
   └─ 中止時: "aborting 'toolkit setup-git-hooks'"
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[確認メッセージ表示]
    B --> C[ユーザー入力待機]
    C --> D{入力 == "y"?}
    D -->|Yes| E[git config実行]
    E --> F[成功メッセージ表示]
    D -->|No| G[中止メッセージ表示]
    F --> H[バッチ終了]
    G --> H
```

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

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

データベース操作なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Git設定失敗 | Gitリポジトリ外で実行 | リポジトリルートで実行 |
| - | ユーザーキャンセル | "y"以外を入力 | 必要に応じて再実行 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

設定を元に戻すには `git config --local --unset core.hooksPath` を実行する。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回 |
| 目標処理時間 | 即時（数秒以内） |
| メモリ使用量上限 | 無視可能 |

## 排他制御

排他制御なし。複数回実行しても同じ結果となる（冪等性あり）。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 確認ログ | 処理開始時 | 確認メッセージ |
| 結果ログ | 処理完了時 | "running 'toolkit setup-git-hooks'" または "aborting 'toolkit setup-git-hooks'" |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 該当なし | - | - |

## 備考

- 設定されるGit hooks:
  - **pre-commit**: `toolkit fmt --check --verbose`を実行。フォーマットエラーがあるとコミットが拒否される
  - **pre-push**: `toolkit fmt --check --verbose`および`toolkit clippy --verbose`を実行。エラーがあるとプッシュが拒否される
- 設定の解除: `git config --local --unset core.hooksPath`
- hooks内のスクリプトはNushellで記述されているため、Nushellがシステムにインストールされている必要がある
- このコマンドはユーザーの確認なしには設定変更を行わない（安全設計）
