# API設計書

## 概要

本ドキュメントは、clojure-lspプロジェクトが提供するAPIの設計書です。clojure-lspは、Clojure/ClojureScript向けのLanguage Server Protocol (LSP) 実装であり、以下の2種類のAPIを提供しています:

1. **LSP API** - JSON-RPCベースのLanguage Server Protocol準拠のAPI
2. **Clojure API** - プログラマティックに利用可能なClojure関数API（CLI/REPL/Babashka Pod経由）

## 共通仕様

### プロトコル

| API種別 | プロトコル | 通信方式 |
| --- | --- | --- |
| LSP API | JSON-RPC 2.0 over stdio | 標準入出力 |
| Clojure API | Clojure関数呼び出し | 直接呼び出し / Babashka Pod |

### 認証方式

本プロジェクトはローカルで動作するLanguage Serverであり、認証は不要です。

### 共通エラーレスポンス（LSP API）

| エラーコード | 説明 |
| --- | --- |
| -32700 | Parse error - JSON解析エラー |
| -32600 | Invalid Request - 無効なリクエスト |
| -32601 | Method not found - メソッドが見つからない |
| -32602 | Invalid params - 無効なパラメータ |
| -32603 | Internal error - 内部エラー |
| -32800 | Request Cancelled - リクエストがキャンセルされた |
| -32801 | Content Modified - コンテンツが変更された |
| -32802 | Request Failed - リクエスト失敗 |

### 共通エラーレスポンス（Clojure API）

| フィールド | 型 | 説明 |
| --- | --- | --- |
| `:result-code` | integer | 0=成功、1=エラー、2=警告あり、3=エラーあり |
| `:message-fn` | function | 結果メッセージを生成する関数 |

## API一覧

### LSP標準API

| カテゴリ | メソッド | 説明 |
| --- | --- | --- |
| Lifecycle | initialize | サーバー初期化 |
| Lifecycle | initialized | 初期化完了通知 |
| Lifecycle | shutdown | サーバーシャットダウン |
| Lifecycle | exit | サーバー終了 |
| Document Sync | textDocument/didOpen | ドキュメントを開く |
| Document Sync | textDocument/didChange | ドキュメント変更 |
| Document Sync | textDocument/didSave | ドキュメント保存 |
| Document Sync | textDocument/didClose | ドキュメントを閉じる |
| Language Features | textDocument/completion | 補完候補取得 |
| Language Features | completionItem/resolve | 補完アイテム詳細取得 |
| Language Features | textDocument/hover | ホバー情報取得 |
| Language Features | textDocument/signatureHelp | シグネチャヘルプ取得 |
| Language Features | textDocument/definition | 定義へジャンプ |
| Language Features | textDocument/declaration | 宣言へジャンプ |
| Language Features | textDocument/implementation | 実装へジャンプ |
| Language Features | textDocument/references | 参照一覧取得 |
| Language Features | textDocument/documentHighlight | ドキュメントハイライト |
| Language Features | textDocument/documentSymbol | ドキュメントシンボル一覧 |
| Language Features | textDocument/codeAction | コードアクション取得 |
| Language Features | textDocument/codeLens | コードレンズ取得 |
| Language Features | codeLens/resolve | コードレンズ詳細取得 |
| Language Features | textDocument/formatting | ドキュメントフォーマット |
| Language Features | textDocument/rangeFormatting | 範囲フォーマット |
| Language Features | textDocument/rename | リネーム |
| Language Features | textDocument/prepareRename | リネーム準備 |
| Language Features | textDocument/foldingRange | 折りたたみ範囲 |
| Language Features | textDocument/selectionRange | 選択範囲 |
| Language Features | textDocument/linkedEditingRange | 連動編集範囲 |
| Language Features | textDocument/semanticTokens/full | セマンティックトークン（全体） |
| Language Features | textDocument/semanticTokens/range | セマンティックトークン（範囲） |
| Call Hierarchy | textDocument/prepareCallHierarchy | コール階層準備 |
| Call Hierarchy | callHierarchy/incomingCalls | 呼び出し元一覧 |
| Call Hierarchy | callHierarchy/outgoingCalls | 呼び出し先一覧 |
| Workspace | workspace/symbol | ワークスペースシンボル検索 |
| Workspace | workspace/executeCommand | コマンド実行 |
| Workspace | workspace/didChangeConfiguration | 設定変更通知 |
| Workspace | workspace/didChangeWatchedFiles | ファイル監視変更通知 |
| Workspace | workspace/willRenameFiles | ファイルリネーム前処理 |
| Workspace | workspace/didRenameFiles | ファイルリネーム後処理 |

### Clojure拡張API（LSP）

| メソッド | 説明 |
| --- | --- |
| clojure/dependencyContents | 依存関係のコンテンツ取得 |
| clojure/serverInfo/raw | サーバー情報取得 |
| clojure/serverInfo/log | サーバー情報ログ出力 |
| clojure/cursorInfo/raw | カーソル情報取得 |
| clojure/cursorInfo/log | カーソル情報ログ出力 |
| clojure/clojuredocs/raw | ClojureDocs情報取得 |
| clojure/workspace/projectTree/nodes | プロジェクトツリー取得 |
| clojure/textDocument/testTree | テストツリー取得（通知） |

### Clojure Programmatic API

| 関数 | 説明 |
| --- | --- |
| clojure-lsp.api/analyze-project-and-deps! | プロジェクトと依存関係を解析 |
| clojure-lsp.api/analyze-project-only! | プロジェクトのみ解析 |
| clojure-lsp.api/clean-ns! | ns形式を整理 |
| clojure-lsp.api/diagnostics | 診断情報取得 |
| clojure-lsp.api/format! | コードフォーマット |
| clojure-lsp.api/rename! | シンボルリネーム |
| clojure-lsp.api/references | 参照検索 |
| clojure-lsp.api/dump | プロジェクトデータダンプ |

## 各APIエンドポイント定義

### Lifecycle

#### 1. initialize

サーバーの初期化を行います。クライアントの機能やプロジェクトルートの情報を受け取ります。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `initialize` |
| 種別 | Request |
| 方向 | Client -> Server |

**リクエストパラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| processId | integer / null | - | クライアントのプロセスID |
| rootUri | string | - | プロジェクトルートURI |
| capabilities | object | ○ | クライアントの機能 |
| initializationOptions | object | - | 初期化オプション（設定） |
| clientInfo | object | - | クライアント情報 |
| workDoneToken | string | - | 進捗トークン |
| trace | string | - | トレースレベル（off/messages/verbose） |

**レスポンス（成功時）**

```json
{
  "capabilities": {
    "textDocumentSync": 1,
    "completionProvider": {
      "resolveProvider": true,
      "triggerCharacters": [":", "/"]
    },
    "hoverProvider": true,
    "definitionProvider": true,
    "declarationProvider": true,
    "implementationProvider": true,
    "referencesProvider": true,
    "documentHighlightProvider": true,
    "documentSymbolProvider": true,
    "workspaceSymbolProvider": true,
    "codeActionProvider": ["quickfix", "refactor", "refactor.extract", "refactor.inline", "refactor.rewrite", "source", "source.organizeImports"],
    "codeLensProvider": true,
    "documentFormattingProvider": true,
    "documentRangeFormattingProvider": true,
    "renameProvider": true,
    "foldingRangeProvider": true,
    "selectionRangeProvider": true,
    "linkedEditingRangeProvider": true,
    "callHierarchyProvider": true,
    "semanticTokensProvider": {
      "full": true,
      "range": true
    },
    "signatureHelpProvider": [],
    "executeCommandProvider": ["..."],
    "experimental": {
      "testTree": true,
      "projectTree": true,
      "cursorInfo": true,
      "serverInfo": true,
      "clojuredocs": true
    }
  }
}
```

#### 2. shutdown

サーバーのシャットダウンを要求します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `shutdown` |
| 種別 | Request |
| 方向 | Client -> Server |

**レスポンス**

`null`

#### 3. exit

サーバーを終了します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `exit` |
| 種別 | Notification |
| 方向 | Client -> Server |

### Document Sync

#### 4. textDocument/didOpen

ドキュメントを開いたことを通知します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/didOpen` |
| 種別 | Notification |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントURI |
| textDocument.languageId | string | ○ | 言語ID |
| textDocument.version | integer | ○ | ドキュメントバージョン |
| textDocument.text | string | ○ | ドキュメント内容 |

#### 5. textDocument/didChange

ドキュメントの変更を通知します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/didChange` |
| 種別 | Notification |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントURI |
| textDocument.version | integer | ○ | ドキュメントバージョン |
| contentChanges | array | ○ | 変更内容 |

#### 6. textDocument/didSave

ドキュメントの保存を通知します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/didSave` |
| 種別 | Notification |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントURI |

#### 7. textDocument/didClose

ドキュメントを閉じたことを通知します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/didClose` |
| 種別 | Notification |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントURI |

### Language Features

#### 8. textDocument/completion

カーソル位置での補完候補を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/completion` |
| 種別 | Request |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントURI |
| position.line | integer | ○ | 行番号（0-indexed） |
| position.character | integer | ○ | 文字位置（0-indexed） |

**レスポンス**

```json
[
  {
    "label": "defn",
    "kind": 3,
    "detail": "clojure.core/defn",
    "documentation": "Defines a function",
    "insertText": "defn"
  }
]
```

#### 9. textDocument/hover

カーソル位置のホバー情報を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/hover` |
| 種別 | Request |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントURI |
| position.line | integer | ○ | 行番号 |
| position.character | integer | ○ | 文字位置 |

**レスポンス**

```json
{
  "contents": {
    "kind": "markdown",
    "value": "```clojure\n(defn my-fn [x])\n```\n\nDocumentation here"
  },
  "range": {
    "start": {"line": 0, "character": 0},
    "end": {"line": 0, "character": 5}
  }
}
```

#### 10. textDocument/definition

シンボルの定義位置へジャンプします。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/definition` |
| 種別 | Request |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントURI |
| position.line | integer | ○ | 行番号 |
| position.character | integer | ○ | 文字位置 |

**レスポンス**

```json
{
  "uri": "file:///path/to/file.clj",
  "range": {
    "start": {"line": 10, "character": 0},
    "end": {"line": 10, "character": 15}
  }
}
```

#### 11. textDocument/references

シンボルの参照一覧を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/references` |
| 種別 | Request |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントURI |
| position.line | integer | ○ | 行番号 |
| position.character | integer | ○ | 文字位置 |
| context.includeDeclaration | boolean | - | 宣言を含めるか |

**レスポンス**

```json
[
  {
    "uri": "file:///path/to/file.clj",
    "range": {
      "start": {"line": 5, "character": 0},
      "end": {"line": 5, "character": 10}
    }
  }
]
```

#### 12. textDocument/rename

シンボルをリネームします。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/rename` |
| 種別 | Request |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントURI |
| position.line | integer | ○ | 行番号 |
| position.character | integer | ○ | 文字位置 |
| newName | string | ○ | 新しい名前 |

**レスポンス**

```json
{
  "documentChanges": [
    {
      "textDocument": {"uri": "file:///path/to/file.clj", "version": 1},
      "edits": [
        {
          "range": {
            "start": {"line": 5, "character": 0},
            "end": {"line": 5, "character": 10}
          },
          "newText": "new-name"
        }
      ]
    }
  ]
}
```

#### 13. textDocument/formatting

ドキュメント全体をフォーマットします。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/formatting` |
| 種別 | Request |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントURI |
| options.tabSize | integer | - | タブサイズ |
| options.insertSpaces | boolean | - | スペースを使用するか |

**レスポンス**

```json
[
  {
    "range": {
      "start": {"line": 0, "character": 0},
      "end": {"line": 100, "character": 0}
    },
    "newText": "(formatted code)"
  }
]
```

#### 14. textDocument/codeAction

コードアクションを取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `textDocument/codeAction` |
| 種別 | Request |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントURI |
| range | object | ○ | 範囲 |
| context.diagnostics | array | - | 診断情報 |

**レスポンス**

```json
[
  {
    "title": "Clean namespace",
    "kind": "source.organizeImports",
    "command": {
      "title": "Clean namespace",
      "command": "clean-ns",
      "arguments": ["file:///path/to/file.clj", 0, 0]
    }
  }
]
```

### workspace/executeCommand

コマンドを実行します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `workspace/executeCommand` |
| 種別 | Request |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| command | string | ○ | コマンド名 |
| arguments | array | - | コマンド引数 |

**利用可能なコマンド一覧**

| コマンド名 | 説明 |
| --- | --- |
| add-import-to-namespace | インポート追加（非推奨） |
| add-missing-import | 不足インポート追加 |
| add-missing-libspec | 不足libspec追加 |
| add-require-suggestion | require提案追加 |
| clean-ns | 名前空間を整理 |
| cycle-coll | コレクション型を切り替え |
| change-coll | コレクション型を変更 |
| cycle-privacy | public/privateを切り替え |
| destructure-keys | キーを分解 |
| restructure-keys | キーを再構成 |
| promote-fn | 関数を昇格 |
| demote-fn | 関数を降格 |
| expand-let | letを展開 |
| drag-backward | 要素を前に移動 |
| drag-forward | 要素を後ろに移動 |
| drag-param-backward | パラメータを前に移動 |
| drag-param-forward | パラメータを後ろに移動 |
| extract-function | 関数を抽出 |
| extract-to-def | defに抽出 |
| get-in-more | get-inを追加 |
| get-in-all | 全てget-inに変換 |
| get-in-less | get-inを減らす |
| get-in-none | get-inを削除 |
| inline-symbol | シンボルをインライン化 |
| introduce-let | letを導入 |
| move-to-let | letに移動 |
| thread-first | thread-firstに変換 |
| thread-first-all | 全てthread-firstに変換 |
| thread-last | thread-lastに変換 |
| thread-last-all | 全てthread-lastに変換 |
| unwind-all | 全てアンワインド |
| unwind-thread | スレッドをアンワインド |
| resolve-macro-as | マクロを解決 |
| sort-clauses | 句をソート |
| suppress-diagnostic | 診断を抑制 |
| create-function | 関数を作成 |
| if->cond-refactor | ifをcondに変換 |
| cond->if-refactor | condをifに変換 |
| create-test | テストを作成 |
| move-form | フォームを移動 |
| cycle-keyword-auto-resolve | キーワード自動解決を切り替え |
| replace-refer-all-with-refer | refer :allをreferに置換 |
| replace-refer-all-with-alias | refer :allをaliasに置換 |
| forward-slurp | 前方スラープ |
| forward-barf | 前方バーフ |
| backward-slurp | 後方スラープ |
| backward-barf | 後方バーフ |
| raise-sexp | S式を引き上げ |
| kill-sexp | S式を削除 |
| forward | 前方移動 |
| forward-select | 前方選択 |
| backward | 後方移動 |
| backward-select | 後方選択 |
| server-info | サーバー情報出力 |
| cursor-info | カーソル情報出力 |

### Clojure拡張API

#### clojure/dependencyContents

依存関係ファイルのコンテンツを取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `clojure/dependencyContents` |
| 種別 | Request |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| uri | string | ○ | 依存関係ファイルのURI |

**レスポンス**

ファイルコンテンツ（文字列）

#### clojure/serverInfo/raw

サーバー情報を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `clojure/serverInfo/raw` |
| 種別 | Request |
| 方向 | Client -> Server |

**レスポンス**

```json
{
  "version": "2024.01.01",
  "clj-kondo-version": "2024.01.01",
  "project-root": "/path/to/project"
}
```

#### clojure/cursorInfo/raw

カーソル位置の詳細情報を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `clojure/cursorInfo/raw` |
| 種別 | Request |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| textDocument.uri | string | ○ | ドキュメントURI |
| position.line | integer | ○ | 行番号 |
| position.character | integer | ○ | 文字位置 |

#### clojure/clojuredocs/raw

ClojureDocsからドキュメント情報を取得します。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| メソッド | `clojure/clojuredocs/raw` |
| 種別 | Request |
| 方向 | Client -> Server |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| sym-name | string | ○ | シンボル名 |
| sym-ns | string | ○ | 名前空間 |

### Clojure Programmatic API

#### clojure-lsp.api/analyze-project-and-deps!

プロジェクト全体と外部依存関係を解析し、将来のAPI呼び出しのために解析結果をキャッシュします。

**関数シグネチャ**

```clojure
(analyze-project-and-deps! options)
```

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| :project-root | java.io.File | - | プロジェクトルート |
| :settings | map | - | 設定マップ |

**使用例**

```clojure
(require '[clojure-lsp.api :as api])
(require '[clojure.java.io :as io])

(api/analyze-project-and-deps!
  {:project-root (io/file ".")
   :settings {:classpath-config-paths ["other-company/other-project"]}})
```

#### clojure-lsp.api/analyze-project-only!

プロジェクトのみを解析し、外部依存関係は解析しません。

**関数シグネチャ**

```clojure
(analyze-project-only! options)
```

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| :project-root | java.io.File | - | プロジェクトルート |
| :settings | map | - | 設定マップ |

#### clojure-lsp.api/clean-ns!

名前空間フォームを整理し、未使用のrequire/refer/importを削除してアルファベット順にソートします。

**関数シグネチャ**

```clojure
(clean-ns! options)
```

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| :project-root | java.io.File | - | プロジェクトルート |
| :namespace | coll | - | 対象名前空間（シンボルのコレクション） |
| :filenames | coll | - | 対象ファイル |
| :ns-exclude-regex | Pattern | - | 除外パターン |
| :dry? | boolean | - | ドライラン（変更なし） |
| :settings | map | - | 設定マップ |

**使用例**

```clojure
(api/clean-ns! {:namespace '[my-project.foo my-project.bar]})
```

**レスポンス**

| フィールド | 型 | 説明 |
| --- | --- | --- |
| :result-code | integer | 結果コード（0=成功、1=変更あり/エラー） |
| :message-fn | function | メッセージ関数 |
| :edits | coll | 編集内容 |

#### clojure-lsp.api/diagnostics

プロジェクト内のすべての診断情報（警告、エラー、情報）を取得します。

**関数シグネチャ**

```clojure
(diagnostics options)
```

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| :project-root | java.io.File | - | プロジェクトルート |
| :namespace | coll | - | 対象名前空間 |
| :filenames | coll | - | 対象ファイル |
| :ns-exclude-regex | Pattern | - | 除外パターン |
| :output | map | - | 出力オプション |
| :output :canonical-paths | boolean | - | 絶対パスを使用 |
| :settings | map | - | 設定マップ |

**使用例**

```clojure
(api/diagnostics {:namespace '[my-project.foo my-project.bar]
                  :output {:canonical-paths true}})
```

**レスポンス**

| フィールド | 型 | 説明 |
| --- | --- | --- |
| :result-code | integer | 0=診断なし、2=警告あり、3=エラーあり |
| :message-fn | function | メッセージ関数 |
| :diagnostics | map | URI -> 診断リストのマップ |

#### clojure-lsp.api/format!

cljfmtを使用してコードをフォーマットします。

**関数シグネチャ**

```clojure
(format! options)
```

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| :project-root | java.io.File | - | プロジェクトルート |
| :namespace | coll | - | 対象名前空間 |
| :filenames | coll | - | 対象ファイル |
| :ns-exclude-regex | Pattern | - | 除外パターン |
| :dry? | boolean | - | ドライラン |
| :settings | map | - | 設定マップ |

**使用例**

```clojure
(api/format! {:namespace '[my-project.foo my-project.bar]})
```

#### clojure-lsp.api/rename!

シンボルとその定義をプロジェクト全体でリネームします。

**関数シグネチャ**

```clojure
(rename! options)
```

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| :project-root | java.io.File | - | プロジェクトルート |
| :from | symbol | ○ | 元のシンボル名（完全修飾または名前空間のみ） |
| :to | symbol | ○ | 新しいシンボル名 |
| :dry? | boolean | - | ドライラン |
| :settings | map | - | 設定マップ |

**使用例**

```clojure
(api/rename! {:from 'my-project.some/foo
              :to 'my-project.some/bar})
```

#### clojure-lsp.api/references

プロジェクトおよび依存関係全体でシンボルのすべての参照を検索します。

**関数シグネチャ**

```clojure
(references options)
```

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| :project-root | java.io.File | - | プロジェクトルート |
| :from | symbol | ○ | 検索対象シンボル（完全修飾） |
| :analysis | map | - | 解析オプション |
| :analysis :type | keyword | - | project-only / project-and-shallow-analysis / project-and-full-dependencies |
| :settings | map | - | 設定マップ |

**使用例**

```clojure
(api/references {:from 'my-project.some/foo})
;; => {:result {:references [{:name ... :uri ...}]}
;;     :result-code 0}
```

**レスポンス**

| フィールド | 型 | 説明 |
| --- | --- | --- |
| :result-code | integer | 結果コード |
| :message-fn | function | メッセージ関数 |
| :result :references | coll | 参照要素のコレクション |

#### clojure-lsp.api/dump

プロジェクトの既知データ（classpath、source-paths、dep-graph、clj-kondo解析データ）をすべてダンプします。

**関数シグネチャ**

```clojure
(dump options)
```

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| :project-root | java.io.File | - | プロジェクトルート |
| :analysis | map | - | 解析オプション |
| :analysis :type | keyword | - | 解析タイプ（デフォルト: project-only） |
| :output | map | - | 出力オプション |
| :output :format | keyword | - | 出力形式（:edn / :json） |
| :output :filter-keys | coll | - | フィルタするキーのリスト |
| :settings | map | - | 設定マップ |

**使用例**

```clojure
(api/dump {:output {:format :edn
                    :filter-keys [:source-paths :analysis]}})
;; => {:result {:source-paths [...]
;;              :analysis {...}}
;;     :result-code 0}
```

**レスポンス**

| フィールド | 型 | 説明 |
| --- | --- | --- |
| :result-code | integer | 結果コード |
| :message-fn | function | メッセージ関数 |
| :result :project-root | string | プロジェクトルートパス |
| :result :source-paths | coll | ソースパスリスト |
| :result :classpath | coll | クラスパスリスト |
| :result :analysis | map | clj-kondo解析結果 |
| :result :dep-graph | map | 依存関係グラフ |
| :result :diagnostics | map | 診断情報 |
| :result :settings | map | 使用された設定 |
| :result :clj-kondo-settings | map | clj-kondo設定 |

## CLIコマンド

clojure-lspはCLIからも利用可能です。

**使用方法**

```bash
clojure-lsp <command> [<options>]
```

**利用可能なコマンド**

| コマンド | 説明 |
| --- | --- |
| listen (またはなし) | LSPサーバーとして起動 |
| clean-ns | 名前空間を整理 |
| diagnostics | 診断を取得 |
| format | コードをフォーマット |
| rename | シンボルをリネーム |
| references | 参照を検索 |
| dump | プロジェクトデータをダンプ |

**主要オプション**

| オプション | 説明 |
| --- | --- |
| --help, -h | ヘルプを表示 |
| --version | バージョンを表示 |
| --project-root, -p PATH | プロジェクトルートを指定 |
| --namespace, -n NS | 対象名前空間 |
| --filenames FILENAMES | 対象ファイル |
| --settings, -s EDN | 設定（EDN形式） |
| --dry | ドライラン |
| --raw | 必要なデータのみ出力 |
| --from FQNS | 元のシンボル（rename/references用） |
| --to FQNS | 新しいシンボル（rename用） |
| --output, -o EDN | 出力オプション |
| --log-path PATH | ログファイルパス |
| --trace-level LEVEL | トレースレベル（off/messages/verbose） |

## 備考

- clojure-lspは内部でclj-kondoを使用してコード解析を行います。
- 設定の詳細については https://clojure-lsp.io/settings/ を参照してください。
- Babashka Podとしても利用可能です（BABASHKA_POD=true環境変数を設定）。
- 対応するファイル拡張子: `.clj`, `.cljs`, `.cljc`, `.cljd`, `.edn`, `.bb`, `.clj_kondo`
