# バッチ設計書 21-doom info

## 概要

本ドキュメントは、Doom EmacsのCLIコマンド `doom info` の設計仕様を記述したバッチ設計書です。

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

`doom info` コマンドは、バグレポート用に現在のDoom Emacs環境の詳細な設定情報を収集・出力するCLIコマンドです。システム情報、Emacsバージョン、Doomバージョン、有効なモジュール、インストール済みパッケージなど、問題診断に必要な情報を網羅的に取得します。

**業務上の目的・背景**：Doom Emacsの利用者がバグや問題に遭遇した際、開発者やコミュニティに対して正確な環境情報を共有する必要があります。手動で情報を収集することは困難であり、情報の欠落や誤りが発生しやすいため、自動的に環境情報を収集・整形するコマンドが必要となりました。このコマンドにより、バグレポートの品質が向上し、問題解決の効率化が図られます。

**バッチの実行タイミング**：手動実行。ユーザーがバグレポートを作成する際、問題が発生した際のトラブルシューティング時、またはシステム状態の確認が必要な際に随時実行されます。

**主要な処理内容**：
1. システム情報の収集（OS、ディストリビューション、カーネルバージョン、ウィンドウシステム）
2. Emacs情報の収集（バージョン、リポジトリブランチ、コミットハッシュ、インストールパス）
3. Doom情報の収集（バージョン、プロファイル、Gitログ、ユーザーディレクトリ）
4. シェル情報の収集
5. システム機能フラグの収集（`system-configuration-features`）
6. 実行環境特性の収集（GUI/TTY、デーモン、サーバー状態など）
7. カスタマイズ変数の収集
8. 有効なモジュール一覧の収集
9. ユーザー定義パッケージの収集
10. unpinされたパッケージの収集
11. ELPAパッケージの収集
12. 指定形式（テキスト/JSON/Lisp）での出力整形

**前後の処理との関連**：このコマンドは独立して実行され、他のバッチ処理との依存関係はありません。ただし、`doom doctor` コマンドと併用されることが多く、問題診断フローの一部として使用されます。

**影響範囲**：読み取り専用の情報収集コマンドであり、システムやデータに対する変更は行いません。出力は標準出力に送信されるか、インタラクティブモードではクリップボードにコピーされます。

## バッチ種別

情報収集 / レポート生成

## 実行スケジュール

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

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Doom Emacsがインストール済み | `doom-emacs-dir` が正しく設定されていること |
| Emacsが利用可能 | `emacs` コマンドが実行可能であること |
| 必要なライブラリが存在 | `doom-lib/profiles`, `doom-lib/modules`, `doom-lib/packages` が読み込み可能 |

### 実行可否判定

特別な判定ロジックはありません。コマンドは常に実行可能です。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| `--json` | flag | No | なし | JSON形式で出力 |
| `--lisp` | flag | No | なし | Lisp形式（S式）で出力 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Emacs変数群 | Emacs Lisp変数 | `emacs-version`, `doom-version`, `doom-emacs-dir` 等 |
| `doom-user-dir/packages.el` | Emacs Lisp | ユーザー定義パッケージ情報 |
| `custom-file` | Emacs Lisp | カスタマイズ変数 |
| システムコマンド | シェル | `uname -msr`, `git log` 等 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト/JSON/Lisp | 環境情報の整形済み出力 |
| クリップボード（インタラクティブ時） | テキスト | `doom/info` 関数実行時 |

### 出力ファイル仕様

ファイル出力は行いません。標準出力のみです。

### 出力データ構造

| キー | 説明 |
|-----|------|
| `generated` | 情報生成日時 |
| `system` | OS情報（ディストリビューション、カーネル、ウィンドウシステム） |
| `emacs` | Emacsバージョン、リポジトリ情報、パス |
| `doom` | Doomバージョン、プロファイル、Gitコミット情報、ユーザーディレクトリ |
| `shell` | シェルパス |
| `features` | Emacsのコンパイル時機能フラグ |
| `traits` | 実行環境特性（batch/gui/tty、daemon、server等） |
| `custom` | カスタマイズされた変数リスト |
| `modules` | 有効なDoomモジュールリスト |
| `packages` | ユーザー定義パッケージリスト |
| `unpin` | unpinされたパッケージリスト |
| `elpa` | ELPAパッケージリスト |

## 処理フロー

### 処理シーケンス

```
1. コマンドライン引数の解析
   └─ --json または --lisp フラグの確認

2. 必要ライブラリの読み込み
   └─ vc-git, doom-lib/profiles, doom-lib/modules, doom-lib/packages

3. システム情報の収集
   └─ doom-system-distro-version, uname -msr, window-system

4. Emacs情報の収集
   └─ emacs-version, リポジトリ情報, インストールパス

5. Doom情報の収集
   └─ doom-version, プロファイル, git log, doom-user-dir

6. シェル情報の収集
   └─ shell-file-name

7. 機能フラグの収集
   └─ system-configuration-features

8. 実行環境特性の収集
   └─ batch/gui/tty, daemon, server, 各種設定状態

9. カスタマイズ変数の収集
   └─ custom-file から theme-settings を抽出

10. モジュール情報の収集
    └─ doom-module-list からカテゴリ・モジュール・フラグを取得

11. パッケージ情報の収集
    └─ packages.el から package! 定義を抽出

12. unpin情報の収集
    └─ packages.el から unpin! 定義を抽出

13. ELPAパッケージの収集
    └─ package-alist から名前を抽出

14. 出力形式に応じた整形
    └─ JSON: json-encode + json-pretty-print-buffer
    └─ Lisp: pp関数
    └─ テキスト: doom-info-string（整形・インデント処理）

15. 結果の出力
    └─ print! で標準出力に出力
```

### フローチャート

```mermaid
flowchart TD
    A[doom info 開始] --> B{フォーマット指定?}
    B -->|--json| C[JSON形式で出力準備]
    B -->|--lisp| D[Lisp形式で出力準備]
    B -->|なし| E[テキスト形式で出力準備]

    C --> F[doom-info 関数呼び出し]
    D --> F
    E --> F

    F --> G[システム情報収集]
    G --> H[Emacs情報収集]
    H --> I[Doom情報収集]
    I --> J[モジュール情報収集]
    J --> K[パッケージ情報収集]
    K --> L[情報リスト構築完了]

    L --> M{出力形式}
    M -->|JSON| N[json-encode + pretty-print]
    M -->|Lisp| O[pp関数で整形]
    M -->|テキスト| P[doom-info-string で整形]

    N --> Q[print! で出力]
    O --> Q
    P --> Q

    Q --> R[doom info 終了]
```

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | パッケージ読み取りエラー | packages.el の解析失敗 | エラー内容を `<error>` 形式で出力し、処理を継続 |
| - | ELPA初期化エラー | package-initialize 失敗 | エラー内容を `<error>` 形式で出力し、処理を継続 |

### リトライ仕様

リトライは行いません。エラーが発生した場合は、該当セクションをエラー情報に置き換えて処理を継続します。

### 障害時対応

情報収集の一部が失敗しても、他の情報は正常に収集・出力されます。エラーが発生したセクションは `<エラー内容>` 形式で出力されます。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回の実行で全情報を収集 |
| 目標処理時間 | 数秒以内 |
| メモリ使用量上限 | 特に制限なし |

## 排他制御

同時実行の制限はありません。読み取り専用の処理であるため、排他制御は不要です。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 標準出力 | 処理完了時 | 収集した環境情報 |

専用のログファイルへの出力は行いません。

## 監視・アラート

監視・アラートは設定されていません。手動実行のユーティリティコマンドであるため、監視対象外です。

## 備考

- インタラクティブモード（`M-x doom/info`）で実行した場合は、結果がクリップボードにコピーされ、pastebin.comを開くかどうかの確認が行われます。
- 出力幅は、パイプ出力時は72文字、それ以外はターミナル幅に自動調整されます。
- ユーザー名などの個人情報は `$USER` に置き換えられてプライバシーが保護されます。
- シンボリックリンクのパスは、リンク元とリンク先の両方が表示されます。
