# バッチ設計書 3-doom.ps1

## 概要

本ドキュメントは、Windows PowerShell環境向けのDoom CLIラッパーである`doom.ps1`の設計仕様を定義するものである。

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

`doom.ps1`は、Windows環境でDoom Emacsのコマンドラインインターフェースを使用するためのPowerShellスクリプトである。Unix系の`doom`スクリプトと同等の機能を提供し、Windows環境特有の設定や終了処理を行う。

**業務上の目的・背景**：Doom Emacsは主にUnix系環境（Linux、macOS）向けに設計されているが、Windows上でEmacsを使用するユーザーも存在する。`doom.ps1`は、Windowsユーザーがネイティブなコマンドライン環境（PowerShell）からDoom Emacsを管理できるようにするために提供される。

**バッチの実行タイミング**：ユーザーが手動でコマンドを実行する随時実行型。Windows環境でのDoom Emacs管理に使用される。

**主要な処理内容**：
1. Emacs実行可能ファイルの検索と確認
2. PowerShell環境変数の設定（EMACSDIR, __DOOMSH等）
3. ターミナルサイズ情報の取得と設定
4. Emacsをバッチモードで起動し`doom`スクリプトを実行
5. 終了コード254の場合、生成された終了スクリプトを実行
6. 環境変数のクリーンアップ

**前後の処理との関連**：`bin/doom`スクリプトを呼び出し、実際のCLI処理を委譲する。

**影響範囲**：Doom Emacsの全設定ファイル、パッケージディレクトリ、プロファイルデータに影響を与える可能性がある。

## バッチ種別

CLIラッパー / Windows互換レイヤー

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | ユーザー任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動（ユーザーコマンド実行） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| PowerShell | Windows PowerShell または PowerShell Core が利用可能 |
| Emacs インストール | emacs.exe が $env:EMACS または PATH に存在 |
| Doom インストール | スクリプトの親ディレクトリに doom ファイルが存在 |

### 実行可否判定

1. `emacs.exe`がPATH内に存在するか、`$env:EMACS`で指定されていること
2. `pwsh.exe`または`powershell.exe`が利用可能であること
3. スクリプトと同じディレクトリに`doom`ファイルが存在すること

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| $args | 配列 | No | なし | doom コマンドに渡す引数 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| コマンドライン引数 | テキスト | doom コマンドへ透過的に渡される |
| $env:EMACS | 環境変数 | Emacs実行ファイルのパス |
| $env:EMACSDIR | 環境変数 | Doom Emacsインストールディレクトリ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | doom コマンドの出力 |
| 標準エラー出力 | テキスト | エラーメッセージ |
| $env:temp/doom.*.ps1 | PowerShellスクリプト | 終了スクリプト（終了コード254の場合） |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | doom.${__DOOMPID}.${__DOOMSTEP}.ps1 |
| 出力先 | $env:temp |
| 文字コード | UTF-8 |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. 実行可能ファイルの検索
   └─ Executable-Find 関数で emacs.exe を検索
   └─ pwsh.exe または powershell.exe を検索

2. 環境変数の設定
   └─ $env:EMACSDIR をスクリプトの親ディレクトリに設定
   └─ $env:__DOOMSH を "ps1" に設定
   └─ $env:__DOOMPID をプロセスIDに設定
   └─ $env:__DOOMSTEP を 0 に設定
   └─ $env:__DOOMGEOM をターミナルサイズに設定

3. Emacs バッチモード実行
   └─ emacs -q --no-site-file --batch --load doom -- --no-color $args

4. 終了スクリプト処理（終了コード254の場合）
   └─ $env:temp/doom.*.ps1 を実行

5. クリーンアップ（finally ブロック）
   └─ トップレベルの場合のみ環境変数を削除
```

### フローチャート

```mermaid
flowchart TD
    A[doom.ps1 開始] --> B[Emacs実行可能ファイル検索]
    B --> C{Emacs存在確認}
    C -->|なし| D[エラー終了]
    C -->|あり| E[環境変数設定]
    E --> F[Emacsバッチモード実行]
    F --> G{終了コード確認}
    G -->|254| H[終了スクリプト実行]
    G -->|その他| I[終了処理]
    H --> I
    I --> J{__DOOMSTEPが0か}
    J -->|Yes| K[環境変数クリーンアップ]
    J -->|No| L[終了]
    K --> L
```

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

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

本スクリプト自体はデータベースを使用しない。

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 例外 | コマンド未発見 | emacs.exe が見つからない | Emacsをインストールしてパスを通す |
| 例外 | コマンド未発見 | PowerShell が見つからない | PowerShellをインストール |
| doom由来 | 各種 | doom コマンドからのエラー | doom のエラー処理を参照 |

### リトライ仕様

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

### 障害時対応

1. Emacs が PATH に存在するか確認
2. PowerShell のバージョンを確認
3. 環境変数 `$env:EMACS` を明示的に設定して再試行

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A |
| コミットタイミング | N/A |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回/実行 |
| 目標処理時間 | doom コマンドに依存 |
| メモリ使用量上限 | PowerShell + Emacs プロセス分 |

## 排他制御

`doom`スクリプトの排他制御に従う。本スクリプト固有の排他制御はない。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| N/A | N/A | 本スクリプト自体はログを出力しない |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| N/A | N/A | doom スクリプトの監視に従う |

## 備考

- `--no-color` フラグを自動的に追加（Windows ターミナルとの互換性のため）
- `Executable-Find` 関数で実行可能ファイルを検索
- `try-finally` ブロックで環境変数の確実なクリーンアップを保証
- トップレベル実行（`__DOOMSTEP` が 0）の場合のみ環境変数を削除
- TODO コメントとして「magic shebang (polyglot)の使用」が検討されている
