# バッチ設計書 4-lua-language-server

## 概要

本ドキュメントは、lua-language-serverの起動スクリプト「lua-language-server」の設計仕様を定義するものである。

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

lua-language-serverは、Luaで記述された起動スクリプトであり、beeランタイム（Lua実行環境）を介してmain.luaを実行する。このスクリプトは、コマンドライン引数を受け取り、言語サーバーのメインエントリポイントに渡す役割を担う。

**業務上の目的・背景**：lua-language-serverはLSP（Language Server Protocol）を実装したLua言語サーバーである。VSCode、Neovim、Emacs等のエディタからLSPクライアントを通じて呼び出され、Luaコードの補完、診断、定義ジャンプ等の機能を提供する。この起動スクリプトは、ビルド済みのバイナリを適切に起動するためのラッパーとして機能する。

**バッチの実行タイミング**：エディタのLSPクライアントから自動的に起動される。または、手動でコマンドラインから実行してCLIモードで使用する。

**主要な処理内容**：
1. 現在のスクリプトパスから実行ディレクトリを取得
2. beeランタイムとmain.luaのパスを構築
3. コマンドライン引数をエスケープして転送
4. os.executeでメインプロセスを起動
5. 終了コードに基づいてプロセスを終了

**前後の処理との関連**：このスクリプトはエントリポイントとしてエディタから呼び出される。実際の処理はmain.luaに委譲される。

**影響範囲**：言語サーバープロセスの起動制御。エディタとの通信確立に影響する。

## バッチ種別

起動処理

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（エディタ起動時） |
| 実行時刻 | エディタ使用時 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | エディタのLSPクライアント / 手動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| ビルド完了 | lua-language-serverがビルド済みであること |
| beeランタイム | beeコマンドがPATH上または同一ディレクトリに存在すること |
| main.lua | 同一ディレクトリにmain.luaが存在すること |

### 実行可否判定

スクリプトファイルが存在し、実行権限があること。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| arg | string[] | No | 空配列 | コマンドライン引数（main.luaに転送される） |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| コマンドライン引数 | 文字列配列 | CLIオプション（--check、--version等） |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | main.luaからの出力 |
| 標準エラー | テキスト | エラーメッセージ |
| 終了コード | 整数 | 0:成功、1:失敗 |

### 出力ファイル仕様

本スクリプト自体はファイル出力を行わない（main.luaに委譲）。

## 処理フロー

### 処理シーケンス

```
1. スクリプトパス取得
   └─ debug.getinfo(1).sourceからパスを抽出
2. 引数配列構築
   └─ 'bee'、main.luaパス、コマンドライン引数を配列に格納
3. 引数エスケープ
   └─ %q形式で各引数をクォート
4. コマンド実行
   └─ os.executeでコマンドを実行
5. 終了コード処理
   └─ Lua 5.1/5.2の互換性を考慮して終了コードを取得
6. プロセス終了
   └─ 失敗時はos.exit(1)を呼び出し
```

### フローチャート

```mermaid
flowchart TD
    A[スクリプト開始] --> B[スクリプトパス取得]
    B --> C[main.luaパス構築]
    C --> D[引数配列構築]
    D --> E[引数をクォート処理]
    E --> F[os.execute実行]
    F --> G{戻り値の型は?}
    G -->|number| H[ret = isok]
    G -->|other| I[ret = 第3戻り値]
    H --> J{ret != 0?}
    I --> J
    J -->|Yes| K[os.exit 1]
    J -->|No| L[正常終了]
```

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | 実行失敗 | beeコマンドが見つからない | ビルドを再実行 |
| 1 | main.lua不在 | main.luaが見つからない | ビルドを再実行 |
| 1 | サブプロセス失敗 | main.luaの実行エラー | ログを確認 |

### リトライ仕様

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

### 障害時対応

LSPクライアント側でエラーメッセージが表示される。ログファイルを確認して原因を特定する。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1プロセス起動 |
| 目標処理時間 | 即時（起動処理のみ） |
| メモリ使用量上限 | main.lua依存 |

## 排他制御

複数のエディタから同時起動可能。各インスタンスは独立して動作する。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 該当なし | このスクリプトではログ出力なし | main.luaに委譲 |

## 監視・アラート

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

## 備考

- Lua 5.1とLua 5.2以降でos.executeの戻り値形式が異なるため、互換性処理を実装している
- 引数は%qフォーマットでエスケープされ、シェルインジェクションを防止している
- このスクリプトはShebang（#!/usr/bin/env lua）を使用してLuaインタープリタで実行される
