# 機能設計書 87-サーバー情報

## 概要

本ドキュメントは、clojure-lspのサーバー情報取得機能の設計書である。LSPサーバーの詳細情報（バージョン、設定、解析状態など）を取得する開発者向け機能である。

### 本機能の処理概要

この機能は、LSPプロトコルのカスタム拡張として、clojure-lspサーバーの内部状態と設定情報を取得する。デバッグやトラブルシューティングに有用な情報を提供する。

**業務上の目的・背景**：clojure-lspの動作に問題が発生した場合、サーバーの内部状態を確認することがトラブルシューティングの第一歩となる。本機能により、サーバーのバージョン、設定、クラスパス、解析状態などの詳細情報を取得し、問題の診断を支援する。

**機能の利用シーン**：
- clojure-lspの動作問題のデバッグ
- 設定が正しく適用されているかの確認
- バージョン情報の確認
- クラスパスと解析状態の確認
- サポート依頼時の情報収集

**主要な処理内容**：
1. LSPリクエストの受信
2. サーバー内部状態の収集
3. 情報のフォーマット
4. クライアントへの応答

**関連システム・外部連携**：
- LSPクライアント: 情報表示
- clj-kondo: バージョン情報

**権限による制御**：権限による制御は行わない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 該当なし | 該当なし | 該当なし | エディタのコマンドパレットから実行（LSP拡張機能） |

## 機能種別

情報取得 / カスタムLSP拡張

## 入力仕様

### 入力パラメータ

入力パラメータは不要。

### 入力データソース

- サーバー内部状態（db）
- clojure-lspバージョン情報
- clj-kondoバージョン情報

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| project-root-uri | String | プロジェクトルートのURI |
| server-version | String | clojure-lspのバージョン |
| clj-kondo-version | String | clj-kondoのバージョン |
| log-path | String | ログファイルのパス |
| project-settings | Map | プロジェクト設定 |
| classpath-settings | Map | クラスパス設定 |
| client-settings | Map | クライアント設定 |
| final-settings | Map | 最終的な統合設定 |
| classpath | Vector | クラスパスのリスト |
| cljfmt-raw | String | cljfmt設定（メタデータ付き） |
| analysis-summary | Map | 解析サマリー |
| port | Integer/String | nREPLポート（利用可能な場合） |

### 出力形式

2つの出力形式が提供される:
1. **raw**: JSONレスポンスとして構造化データを返却
2. **log**: メッセージウィンドウにpretty-print形式で表示

### 出力先

- **raw**: LSPレスポンス（JSON形式）
- **log**: クライアントのメッセージウィンドウ（window/showMessage）

## 処理フロー

### 処理シーケンス

```
1. リクエスト受信
   └─ clojure/serverInfo/raw または clojure/serverInfo/log

2. サーバー情報収集
   └─ db から各種情報を取得

3. 情報フォーマット
   └─ raw: JSON形式、log: pprint形式

4. レスポンス返却
   └─ raw: 構造化データ、log: showMessage通知
```

### フローチャート

```mermaid
flowchart TD
    A[リクエスト受信] --> B{リクエストタイプ}
    B -->|serverInfo/raw| C[server-info 関数呼び出し]
    B -->|serverInfo/log| D[server-info 関数呼び出し]
    C --> E[サーバー情報収集]
    D --> E
    E --> F{出力タイプ}
    F -->|raw| G[preserve-kebab-case 変換]
    F -->|log| H[pprint 形式に変換]
    G --> I[JSONレスポンス返却]
    H --> J[showMessage 通知]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-87-1 | nREPLポート | デバッグプロファイルでのみ利用可能 | :port がある場合 |
| BR-87-2 | cljfmt-raw | メタデータ付きで出力 | *print-meta* を true に設定 |
| BR-87-3 | kebab-case保持 | rawモードではキー名をkebab-caseで保持 | raw リクエスト時 |

### 計算ロジック

analysis-summary の構成:
- q/analysis-summary 関数で解析データのサマリーを生成
- 各バケットのアイテム数などを含む

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

該当なし（ファイルシステムのみ操作）

## エラー処理

### エラーケース一覧

特別なエラーケースは存在しない。常に利用可能な情報を返却する。

### リトライ仕様

リトライは不要。

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

該当なし（読み取り専用処理）

## パフォーマンス要件

- 即座に応答可能（ミリ秒単位）
- 解析データへの参照のみで、追加の計算は最小限

## セキュリティ考慮事項

- 読み取り専用操作のためセキュリティリスクは低い
- プロジェクトの設定情報やパス情報が外部に露出する可能性がある

## 備考

- この機能はLSPの実験的（experimental）機能として提供される
- server-info コマンドとしてエディタから呼び出し可能

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | server-info 出力 | `lib/src/clojure_lsp/feature/development_info.clj` | 出力データの構造 |

**読解のコツ**: server-info 関数が返すマップの各キーが出力項目に対応

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | server.clj | `cli/src/clojure_lsp/server.clj` | LSPリクエストハンドラの登録 |

**主要処理フロー**:
1. **211-214行目**: `clojure/serverInfo/raw` メソッドの登録
2. **216-222行目**: `clojure/serverInfo/log` メソッドの登録

#### Step 3: ハンドラ層を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | handlers.clj | `lib/src/clojure_lsp/handlers.clj` | server-info-log, server-info-raw 関数 |

**主要処理フロー**:
- **347-350行目**: `server-info-log` 関数
- **352-355行目**: `server-info-raw` 関数

#### Step 4: 機能実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | development_info.clj | `lib/src/clojure_lsp/feature/development_info.clj` | server-info の詳細実装 |

**主要処理フロー**:
- **14-28行目**: `server-info` 関数 - サーバー情報の収集
- **30-36行目**: `server-info-log` - pprint形式での出力
- **38-39行目**: `server-info-raw` - 構造化データの返却

### プログラム呼び出し階層図

```
jsonrpc.server/receive-request "clojure/serverInfo/raw"
    │
    └─ handler/server-info-raw
           │
           └─ f.development-info/server-info-raw
                  │
                  └─ server-info
                         │
                         ├─ shared/clojure-lsp-version
                         ├─ lsp.kondo/clj-kondo-version
                         ├─ f.format/resolve-user-cljfmt-config
                         ├─ q/analysis-summary
                         └─ settings/all

jsonrpc.server/receive-notification "clojure/serverInfo/log"
    │
    └─ handler/server-info-log
           │
           └─ f.development-info/server-info-log
                  │
                  ├─ server-info
                  │
                  └─ producer/show-message (pprint)
```

### データフロー図

```
[入力]                      [処理]                           [出力]

(なし) ──────────▶ server-info 関数 ────────▶ 情報マップ
                          │
                          ├─ :project-root-uri   <- db
                          ├─ :server-version     <- shared/clojure-lsp-version
                          ├─ :clj-kondo-version  <- lsp.kondo/clj-kondo-version
                          ├─ :log-path           <- db
                          ├─ :project-settings   <- db
                          ├─ :classpath-settings <- db
                          ├─ :client-settings    <- db
                          ├─ :final-settings     <- settings/all
                          ├─ :classpath          <- db
                          ├─ :cljfmt-raw         <- f.format (with *print-meta*)
                          ├─ :analysis-summary   <- q/analysis-summary
                          └─ :port               <- db
                          │
                          ▼
                    raw/log 分岐 ──────────▶ JSONレスポンス / showMessage
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| development_info.clj | `lib/src/clojure_lsp/feature/development_info.clj` | ソース | サーバー情報収集 |
| handlers.clj | `lib/src/clojure_lsp/handlers.clj` | ソース | LSPハンドラー |
| server.clj | `cli/src/clojure_lsp/server.clj` | ソース | LSPサーバー |
| queries.clj | `lib/src/clojure_lsp/queries.clj` | ソース | analysis-summary |
| settings.clj | `lib/src/clojure_lsp/settings.clj` | ソース | 設定管理 |
