# バッチ設計書 9-doom install

## 概要

本ドキュメントは、Doom Emacsの初回インストールとセットアップを行うCLIコマンド`doom install`の設計仕様を定義するものである。

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

`doom install`は、Doom Emacsを新規にセットアップするためのインストールウィザードである。ユーザー設定ディレクトリの作成、テンプレートファイルのコピー、環境変数ファイルの生成、パッケージのインストール、プロファイルの初期化、Gitフックのデプロイを一括で行う。

**業務上の目的・背景**：Doom Emacsのインストールは、Gitクローン後に複数の手順が必要であり、手動で行うとエラーが発生しやすい。`doom install`は、これらの手順を自動化し、新規ユーザーでも簡単にDoom Emacsを使い始められるようにする。また、冪等性を持つため、既存のインストールに対して再実行しても安全である。

**バッチの実行タイミング**：以下の場合に実行される：
- Doom Emacsを新規インストールする時（git clone後）
- 既存インストールを修復/再初期化したい時

**主要な処理内容**：
1. $DOOMDIR（ユーザー設定ディレクトリ）の作成
2. init.el、config.el、packages.elのテンプレートをコピー
3. 環境変数ファイルの生成（オプション/プロンプト）
4. パッケージのインストール
5. プロファイルの初期化と同期
6. Gitフック（commit-msg、pre-push）のデプロイ
7. 完了メッセージとクイックスタートガイドの表示

**前後の処理との関連**：git clone直後に実行。完了後は`doom sync`で継続的にメンテナンス。

**影響範囲**：$DOOMDIR、$EMACSDIR/.local、プロファイルデータ、Gitフック。

## バッチ種別

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

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 通常1回（インストール時） |
| 実行時刻 | ユーザー任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Doom Emacs クローン済み | $EMACSDIR に Doom Emacs がクローンされていること |
| Git 利用可能 | パッケージリポジトリの管理に必要 |
| ネットワーク接続 | パッケージのダウンロードに必要 |

### 実行可否判定

1. Doom Emacsのコアファイルが存在すること
2. doom-packages-ensureが実行可能であること

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| --aot | フラグ | No | false | 事前ネイティブコンパイルを有効化 |
| --config | フラグ | No | :yes | $DOOMDIRとダミーファイルを作成 |
| --env | フラグ | No | プロンプト | 環境変数ファイルを生成 |
| --install | フラグ | No | :yes | パッケージを自動インストール |
| --hooks | フラグ | No | :yes | Gitフックをデプロイ |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| static/init.example.el | Emacs Lisp | init.elテンプレート |
| static/config.example.el | Emacs Lisp | config.elテンプレート |
| static/packages.example.el | Emacs Lisp | packages.elテンプレート |
| static/QUICKSTART_INTRO | テキスト | 完了後に表示されるガイド |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| $DOOMDIR/init.el | Emacs Lisp | ユーザーのモジュール設定 |
| $DOOMDIR/config.el | Emacs Lisp | ユーザーの設定ファイル |
| $DOOMDIR/packages.el | Emacs Lisp | ユーザーのパッケージ定義 |
| doom-env-file | Emacs Lisp | 環境変数ファイル（オプション） |
| .git/hooks/ | シェルスクリプト | Gitフック |
| 標準出力 | テキスト | インストール進捗とステータス |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | init.el, config.el, packages.el |
| 出力先 | $DOOMDIR（~/.config/doom または ~/.doom.d） |
| 文字コード | UTF-8 |
| 形式 | Emacs Lisp |

## 処理フロー

### 処理シーケンス

```
1. 設定ディレクトリの作成（--config != :no）
   └─ $DOOMDIRが存在しない場合作成
   └─ XDGディレクトリ内の場合は~/.config/doom
   └─ 既存の場合はスキップ

2. テンプレートファイルのコピー
   └─ init.el: static/init.example.el からコピー
   └─ config.el: static/config.example.el からコピー
   └─ packages.el: static/packages.example.el からコピー
   └─ 既存ファイルはスキップ

3. ユーザー設定の読み込み
   └─ $DOOMDIR/init.el を読み込み
   └─ $DOOMDIR/cli.el を読み込み（存在する場合）

4. 環境変数ファイル生成（--env != :no）
   └─ プロンプトまたは自動で doom env を呼び出し

5. パッケージインストール（--install != :no）
   └─ doom-packages-ensure を呼び出し

6. プロファイル初期化
   └─ プロファイルブートストラッパーの初期化
   └─ doom-profile-generate の呼び出し

7. Gitフックデプロイ（--hooks != :no）
   └─ doom ci deploy-hooks を呼び出し

8. 完了処理
   └─ ~/.emacs 警告（存在する場合）
   └─ 成功メッセージとQUICKSTART_INTROの表示
```

### フローチャート

```mermaid
flowchart TD
    A[doom install 開始] --> B{--config?}
    B -->|:no| C[設定作成スキップ]
    B -->|:yes| D{$DOOMDIR存在?}
    D -->|Yes| E[スキップ]
    D -->|No| F[$DOOMDIR作成]
    F --> G[テンプレートコピー]
    E --> G
    C --> H[ユーザー設定読み込み]
    G --> H
    H --> I{--env?}
    I -->|:no| J[env生成スキップ]
    I -->|:yes/プロンプト| K[doom env 実行]
    J --> L{--install?}
    K --> L
    L -->|:no| M[パッケージスキップ]
    L -->|:yes| N[doom-packages-ensure]
    M --> O[プロファイル初期化]
    N --> O
    O --> P[プロファイル生成]
    P --> Q{--hooks?}
    Q -->|:no| R[フックスキップ]
    Q -->|:yes| S[doom ci deploy-hooks]
    R --> T{~/.emacs存在?}
    S --> T
    T -->|Yes| U[警告表示]
    T -->|No| V[成功メッセージ]
    U --> V
    V --> W[QUICKSTART_INTRO表示]
    W --> X[終了]
```

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

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

本コマンドはデータベースを使用しない。

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| N/A | N/A | N/A | データベース操作なし |

### テーブル別操作詳細

データベース操作は行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 非ゼロ | ディレクトリ作成失敗 | パーミッション不足 | sudo または別の場所を指定 |
| 非ゼロ | パッケージ失敗 | ネットワーク問題/パッケージエラー | ネットワーク確認、doom doctor実行 |
| user-error | Gitフック失敗 | Gitフックデプロイ失敗 | 警告表示（継続） |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（手動再実行可能） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

1. 冪等性があるため、`doom install`を再実行可能
2. `doom doctor`で環境診断
3. `doom sync`でパッケージ状態を修復

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 各ステップは独立 |
| コミットタイミング | 各ステップ完了時 |
| ロールバック条件 | なし（冪等性で対応） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回/インストール |
| 目標処理時間 | 数分〜十数分（ネットワーク速度依存） |
| メモリ使用量上限 | Emacsプロセス + コンパイル処理分 |

## 排他制御

- 同時に複数の`doom install`を実行しないこと
- インストール中は他のDoomコマンドを実行しないこと

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | コマンド開始時 | "Installing Doom Emacs!" |
| 進捗ログ | 各ステップ | "Created $DOOMDIR", "Installing plugins" 等 |
| 警告ログ | ~/.emacs検出時 | "A ~/.emacs file was detected..." |
| 成功ログ | 完了時 | "Finished! Doom is ready to go!" |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| N/A | N/A | 監視対象外（インストール時のみ実行） |

## 備考

- 冪等性があるため、再実行しても既存ファイルを上書きしない
- `--doomdir`オプションで別の設定ディレクトリを指定可能
- XDGディレクトリ（~/.config/emacs）内の場合、$DOOMDIRは~/.config/doomに設定される
- ~/.emacsが存在する場合は警告が表示される（Doomと競合するため）
- Gitフックデプロイでエラーが発生しても、警告のみで継続（user-errorをキャッチ）
- 完了後にQUICKSTART_INTROが表示され、次のステップが案内される
