# バッチ設計書 5-main.lua

## 概要

本ドキュメントは、lua-language-serverのメインエントリポイント「main.lua」の設計仕様を定義するものである。

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

main.luaは、lua-language-serverの初期化と起動を担当するメインエントリポイントである。コマンドライン引数の解析、ログシステムの初期化、設定の読み込み、デバッガ接続、CLIコマンドの処理、そしてLSPサービスの起動を行う。

**業務上の目的・背景**：lua-language-serverは複雑な初期化プロセスを必要とする。環境変数やコマンドライン引数からの設定読み込み、ログファイルの準備、メモリ管理の設定、各種モジュールのロードなど、サービス起動前に多くの準備が必要である。main.luaはこれらの初期化処理を一元管理し、正しい順序で実行することを保証する。

**バッチの実行タイミング**：lua-language-serverスクリプトから呼び出される。エディタのLSPクライアントが言語サーバーを起動するたびに実行される。

**主要な処理内容**：
1. コマンドライン引数の解析（--loglevel、--logpath、--metapath等）
2. ROOTパス、LOGPATH、METAPATHのグローバル変数設定
3. ユーティリティ関数の有効化（closeFunction、formatString）
4. ガベージコレクションパラメータの設定
5. ログシステムの初期化
6. トレーシング（tracy）モジュールのロード
7. デバッガ接続の試行
8. CLIコマンドの処理
9. LSPサービスの起動

**前後の処理との関連**：lua-language-serverスクリプトから呼び出され、cli.luaでCLIコマンドを処理後、service.luaでLSPサービスを起動する。

**影響範囲**：言語サーバー全体の初期化に影響。ログ出力先、メタデータ保存先、ガベージコレクション動作すべてがここで設定される。

## バッチ種別

起動処理・初期化処理

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（サーバー起動時） |
| 実行時刻 | エディタ使用時 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | lua-language-serverスクリプト |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| beeランタイム | bee.filesystemモジュールが利用可能であること |
| scriptディレクトリ | script/配下にLuaモジュールが存在すること |
| 書き込み権限 | LOGPATHディレクトリへの書き込み権限があること |

### 実行可否判定

必須モジュール（bee.filesystem、utility、version等）がロード可能であること。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| --loglevel | string | No | nil | ログレベル（trace/debug/info/warn/error） |
| --logpath | string | No | ROOT/log | ログファイル出力先 |
| --metapath | string | No | ROOT/meta | メタデータ保存先 |
| その他 | various | No | - | CLIコマンド用引数（--check、--version等） |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| コマンドライン引数 | キーバリュー | --key=value または --key value形式 |
| config/env.lua | Lua | 環境設定ファイル |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| LOGPATH/service.log | テキスト | サービスログファイル |
| 標準出力 | テキスト | CLIコマンド出力 |
| 標準エラー | テキスト | エラーメッセージ |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | service.log |
| 出力先 | LOGPATH（デフォルト: ROOT/log） |
| 文字コード | UTF-8 |
| 区切り文字 | 改行 |

## 処理フロー

### 処理シーケンス

```
1. config.env読み込み
   └─ 環境設定の初期化
2. コマンドライン引数解析
   └─ --key=value形式と--key value形式をサポート
   └─ true/false/数値/文字列を自動変換
   └─ キー名を大文字化してグローバル変数に設定
3. パス設定
   └─ ROOT: スクリプトのディレクトリ
   └─ LOGPATH: ログ出力先
   └─ METAPATH: メタデータ保存先
4. ユーティリティ有効化
   └─ closeFunction、formatStringを有効化
5. ガベージコレクション設定
   └─ minormul=10、minormajor=50
6. ログ初期化
   └─ log.init(ROOT, LOGPATH/service.log)
   └─ ログレベル設定（LOGLEVELが指定された場合）
7. 起動情報ログ出力
   └─ ROOT、LOGPATH、METAPATH、VERSIONをログ
8. tracyモジュールロード
   └─ プロファイリング用
9. デバッガ接続試行
   └─ debugger.luaを安全に実行
10. CLIコマンド処理
    └─ cli.luaを読み込み
11. サービス起動
    └─ service.luaを読み込み、service.start()を呼び出し
```

### フローチャート

```mermaid
flowchart TD
    A[main.lua開始] --> B[config.env読み込み]
    B --> C[コマンドライン引数解析]
    C --> D[パス設定 ROOT/LOGPATH/METAPATH]
    D --> E[ユーティリティ有効化]
    E --> F[GC設定 minormul=10, minormajor=50]
    F --> G[ログ初期化]
    G --> H{LOGLEVELあり?}
    H -->|Yes| I[ログレベル設定]
    H -->|No| J[起動情報ログ出力]
    I --> J
    J --> K[tracyモジュールロード]
    K --> L[デバッガ接続試行]
    L --> M[cli.lua読み込み]
    M --> N[service.lua読み込み]
    N --> O[service.start]
    O --> P[完了]
```

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

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

本バッチはデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | モジュールロード失敗 | 必須モジュールが見つからない | ビルドを再実行 |
| - | ログ初期化失敗 | LOGPATHに書き込み権限がない | 権限を確認・修正 |
| - | サービス起動失敗 | service.luaのエラー | ログを確認 |

### リトライ仕様

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

### 障害時対応

デバッガ接続はxpcallで保護されており、失敗してもサービスは起動する。service.require呼び出しもxpcallで保護されている。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回の初期化 |
| 目標処理時間 | 1秒以内 |
| メモリ使用量上限 | GC設定依存 |

## 排他制御

各インスタンスは独立して動作。グローバル変数はインスタンス内でのみ有効。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| info | 起動時 | "Lua Lsp startup, root: ROOT" |
| info | 起動時 | "ROOT: (パス)" |
| info | 起動時 | "LOGPATH: (パス)" |
| info | 起動時 | "METAPATH: (パス)" |
| info | 起動時 | "VERSION: (バージョン)" |

## 監視・アラート

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

## 備考

- ガベージコレクションはインクリメンタルモード（Lua 5.4以降）で動作
- collectgarbage('param', 'minormul', 10)とcollectgarbage('param', 'minormajor', 50)で設定
- コメントアウトされた旧GC設定（generational/incremental）も存在
- 引数のキー名はハイフンをアンダースコアに変換して大文字化される（例: --log-level → LOG_LEVEL）
