mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-15 12:55:51 +00:00
* docs: 修复文档巡检发现的 4 处错误 - daemon.md: 反映实际实现状态(supervisor/worker 已实现而非 stub) - bridge-mode.md: API 操作数量从 7 修正为 9 - web-search-tool.md: 文件路径从 src/tools/ 修正为 packages/builtin-tools/src/tools/ - remote-control-self-hosting.md: 补充缺失的 RCS_WS_IDLE_TIMEOUT 和 RCS_WS_KEEPALIVE_INTERVAL 配置项 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 Safety 和 Context 文档中的代码引用和类型错误 - permission-model: 修正规则来源从"五层"到八层,优先级顺序对齐代码 - permission-model: PermissionUpdate 类型改为实际的 addRules/replaceRules 等 - permission-model: 补充 acceptEdits 和 dontAsk 两种权限模式 - permission-model: DENIAL_LIMITS 字段名对齐实际代码 - plan-mode: 工具路径从 src/tools/ 改为 packages/builtin-tools/src/tools/ - compaction: 修正 COMPACTABLE_TOOLS 和 POST_COMPACT_* 的行号 - project-memory: 修正 ENTRYPOINT_NAME 常量的行号 - system-prompt: 修正 SystemPrompt 类型定义文件路径和多个行号引用 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修复 introduction 文档中的错误路径和行号引用 - why-this-whitepaper.mdx: BashTool 路径从 src/tools/ 修正为 packages/builtin-tools/src/tools/ - what-is-claude-code.mdx: 移除不存在的 Azure provider,改为实际的 7 种 provider - architecture-overview.mdx: State 类型行号从 204 修正为 207 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修复 conversation/features 文档中的错误 - streaming.mdx: queryStreamRaw → queryModelWithStreaming 函数名修正 - streaming.mdx: Azure 提供商不存在,替换为实际 7 个提供商 - debug-mode.mdx: --inspect-wait 描述错误,实际使用 BUN_INSPECT 环境变量 - buddy.mdx: 补充缺失的 companionReact.ts、CompanionCard.tsx、index.ts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修复文档巡检中的源码引用错误 - feature-flags.mdx: 修正 feature() 兜底描述,实际从 bun:bundle 导入而非 cli.tsx:3 内联 - feature-flags.mdx: 修正工具 require 路径为 @claude-code-best/builtin-tools 包路径 - ant-only-world.mdx: 修正 tools.ts 中 require 路径为包路径 - ant-only-world.mdx: 修正 INTERNAL_ONLY_COMMANDS 行号 (267-295) 和数量 (24+) - skills.mdx: 修正 COMMANDS memoize 行号 258 → 299 - mcp-protocol.mdx: 修正 fetchToolsForClient LRU 缓存上限 20 → 100 - streaming.mdx: 修正流式事件引用 - file-operations.mdx: 修正工具路径引用 - search-and-navigation.mdx: 修正搜索工具引用 - shell-execution.mdx: 修正 shell 工具引用 - buddy.mdx: 补充缺失的 frontmatter 字段 - debug-mode.mdx: 修正调试模式描述 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 tools/agent 文档中的文件路径和行号引用 - 修正 TodoWriteTool、AgentTool、ToolSearchTool 等工具路径 src/tools/ → packages/builtin-tools/src/tools/ - 更新 Tool.ts、tools.ts、BashTool.tsx 中过时的行号引用 - 修正 WebSearchTool/WebFetchTool/EnterWorktreeTool/ExitWorktreeTool 路径 - 修正 AgentTool.tsx 中多行行号引用 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 feature 文档中的文件路径和行号引用 - ultraplan.md: 更新文件行数(525/349/127) - fork-subagent.md: 路径迁移 src/tools/ → packages/builtin-tools/ - mcp-skills.md: 修正 getMcpSkillCommands 行号 547→604,client.ts 行号 117→129 - kairos.md: 修正 getBriefSection/getProactiveSection 行号 - proactive.md: 修正 getProactiveSection 行号 860→864 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正顶层文档中的路径迁移和行号引用 - auto-updater.md: config.ts 行号 1735→1737,标注未接入启动流程的函数 - external-dependencies.md: WebSearchTool/WebFetchTool 路径迁移到 builtin-tools 包,Vertex 行号修正 - lsp-integration.md: LSPTool 路径从 src/tools/ 迁移到 packages/builtin-tools/ - stub-recovery-design-1-4.md: 修正 Windows 绝对路径链接为标准代码引用 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 task 文档中的文件扩展名和路径引用 - task-004: AssistantSessionChooser.ts → .tsx, assistant.ts → .tsx - task-003: cli.tsx 行号 249→272, markdownConfigLoader.ts 行号 29→35 - lan-pipes: SendMessageTool 路径迁移到 packages/builtin-tools/ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 补充 computer-use-tools-reference 缺失的 Windows 工具 添加遗漏的 open_terminal 和 activate_window 两个 Windows 专属工具, 修正工具总数 37→39,Windows 工具数 10→12。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 audit/bash-classifier/token-budget/tree-sitter 文档 - feature-flags-audit: ScheduleCronTool 路径迁移、DAEMON 状态更新为 COMPLETE、assistant 文件标记已补全、UDS 标记已实现 - bash-classifier: BashPermissionRequest 文件路径修正、withRetry 行号移除 - token-budget: attachments.ts 行号范围修正 - tree-sitter-bash: bashPermissions.ts 路径迁移到 packages/builtin-tools Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 langfuse-monitoring AgentTool 路径迁移 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 bridgeApi 行号和 Tool.ts 行号引用 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 Safety/Extensibility 文档中的工具路径迁移和行号引用 - sandbox.mdx: shouldUseSandbox.ts 和 bashPermissions.ts 路径迁移至 packages/builtin-tools - why-safety-matters.mdx: bashPermissions.ts 路径迁移(3 处) - plan-mode.mdx: EnterPlanModeTool/prompt.ts 路径迁移 - auto-mode.mdx: Auto mode 指令行号 3464→3481 - hooks.mdx: AgentTool/runAgent.ts 路径迁移 - skills.mdx: SkillTool.ts 路径迁移 - custom-agents.mdx: Agent built-in 目录和 exploreAgent.ts 路径迁移 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 internals 文档引用计数和路径 - ant-only-world: USER_TYPE 引用计数 465→410+,工具路径迁移到 builtin-tools - growthbook-ab-testing: growthbook.ts 行数 1156→1258 - hidden-features: 语音模式状态更新(audio-napi 已恢复) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正工具文档中的行号引用 - sub-agents: AgentTool.call 入口行号 340→387 - shell-execution: ShellCommand onTimeout 行号 129→144 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 feature 文档中的状态、路径和计数 - all-features-guide: 修正 feature flag 启用范围(dev only vs dev+build) - tier3-stubs: 大量状态修正(stub→已实现),缩减过时条目 - workflow-scripts: 路径迁移到 builtin-tools,状态更新 - web-browser-tool: 工具状态缺失→已实现,路径迁移 - context-collapse: CtxInspectTool 状态缺失→已实现 - computer-use: 行号引用更新,平台分发描述修正 - computer-use-tools-reference: 工具数 39→38 - voice-mode: voiceModeEnabled 行数 55→54 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 更新 the-loop 查询循环行号引用 query.ts 代码变更后终止原因行号整体偏移约 40 行 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 补充 feature-flags-audit 完整 build 默认 feature 列表 添加 ULTRATHINK/LODESTONE/ACP/DAEMON 等 19 个缺失的 build 默认 feature, 修正 dev-only 特征标注(UDS_INBOX/LAN_PIPES/BG_SESSIONS/TEMPLATES) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 feature-flags-audit ConfigTool 路径迁移 ConfigTool 路径从 src/tools/ 迁移到 packages/builtin-tools/src/tools/ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 feature-flags-audit BashTool 路径迁移 BashTool 路径从 src/tools/ 迁移到 packages/builtin-tools/src/tools/ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 修正 feature-flags-audit SkillTool 路径迁移 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: 更新 feature-flags-audit WorkflowTool 状态为已实现 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
265 lines
12 KiB
Markdown
265 lines
12 KiB
Markdown
# LSP Integration
|
||
|
||
Claude Code 内置了 Language Server Protocol (LSP) 集成,提供代码智能功能(跳转定义、查找引用、悬停信息、文档符号等)和被动的诊断反馈。
|
||
|
||
## 快速开始
|
||
|
||
### 1. 安装 LSP 插件
|
||
|
||
在 Claude Code REPL 中使用 `/plugin` 命令搜索并安装 LSP 插件:
|
||
|
||
```
|
||
/plugin
|
||
```
|
||
|
||
搜索 `lsp`,找到对应语言的插件(如 `typescript-lsp`),选择安装。
|
||
|
||
安装后运行 `/reload-plugins` 使插件生效。
|
||
|
||
LSP 插件安装后,后台的 LSP Server Manager 会自动加载并启动对应的语言服务器,无需手动配置。
|
||
|
||
### 2. 启用 LSP Tool
|
||
|
||
LSP Tool 需要通过环境变量显式启用,Claude 才能主动发起代码智能查询:
|
||
|
||
```bash
|
||
ENABLE_LSP_TOOL=1 bun run dev
|
||
```
|
||
|
||
不启用时,LSP 服务器仍然在后台运行并推送被动的诊断反馈(类型错误等)。
|
||
|
||
## 自动推荐
|
||
|
||
除了手动 `/plugin` 搜索安装外,Claude Code 会在编辑文件时自动检测:
|
||
|
||
1. 监听 `fileHistory.trackedFiles`,发现有新文件被编辑
|
||
2. 扫描已安装的 marketplace,找到声明支持该文件扩展名的 LSP 插件
|
||
3. 检查系统上是否已安装对应的 LSP 二进制(如 `typescript-language-server`)
|
||
4. 满足条件时弹出推荐对话框,可选择安装
|
||
|
||
```
|
||
┌───── LSP Plugin Recommendation ─────────────┐
|
||
│ │
|
||
│ LSP provides code intelligence like │
|
||
│ go-to-definition and error checking │
|
||
│ │
|
||
│ Plugin: typescript-lsp │
|
||
│ Triggered by: .ts files │
|
||
│ │
|
||
│ Would you like to install this LSP plugin? │
|
||
│ │
|
||
│ > Yes, install typescript-lsp │
|
||
│ No, not now │
|
||
│ Never for typescript-lsp │
|
||
│ Disable all LSP recommendations │
|
||
└───────────────────────────────────────────────┘
|
||
```
|
||
|
||
- 30 秒不操作自动关闭(算作 "No")
|
||
- 选 "Never" 不再推荐该插件
|
||
- 选 "Disable" 关闭所有 LSP 推荐
|
||
- 连续忽略 5 次后自动禁用推荐
|
||
|
||
## 架构概览
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────┐
|
||
│ LSP Tool │
|
||
│ packages/builtin-tools/src/tools/LSPTool/LSPTool.ts│
|
||
│ (Claude 可调用的工具,9 种操作) │
|
||
└──────────────────────┬──────────────────────────────┘
|
||
│
|
||
┌──────────────────────▼──────────────────────────────┐
|
||
│ LSP Server Manager (Singleton) │
|
||
│ src/services/lsp/manager.ts │
|
||
│ - initializeLspServerManager() │
|
||
│ - reinitializeLspServerManager() │
|
||
│ - shutdownLspServerManager() │
|
||
└──────────────────────┬──────────────────────────────┘
|
||
│
|
||
┌──────────────────────▼──────────────────────────────┐
|
||
│ LSP Server Manager (实例) │
|
||
│ src/services/lsp/LSPServerManager.ts │
|
||
│ - 管理多个 LSPServerInstance │
|
||
│ - 按文件扩展名路由请求 │
|
||
│ - 文件同步 (didOpen/didChange/didSave/didClose) │
|
||
└──────────────────────┬──────────────────────────────┘
|
||
│
|
||
┌─────────────┼─────────────┐
|
||
▼ ▼ ▼
|
||
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
||
│ LSPServer │ │ LSPServer │ │ LSPServer │
|
||
│ Instance │ │ Instance │ │ Instance │
|
||
│ (typescript) │ │ (python) │ │ (rust...) │
|
||
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
|
||
│ │ │
|
||
┌──────▼───────┐ ┌──────▼───────┐ ┌──────▼───────┐
|
||
│ LSPClient │ │ LSPClient │ │ LSPClient │
|
||
│ (JSON-RPC) │ │ (JSON-RPC) │ │ (JSON-RPC) │
|
||
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
|
||
│ │ │
|
||
子进程 (stdio) 子进程 (stdio) 子进程 (stdio)
|
||
```
|
||
|
||
### 被动诊断反馈
|
||
|
||
```
|
||
LSP Server ──publishDiagnostics──▶ passiveFeedback.ts
|
||
│
|
||
▼
|
||
LSPDiagnosticRegistry
|
||
(去重、容量限制)
|
||
│
|
||
▼
|
||
Attachment System
|
||
(异步注入到对话)
|
||
```
|
||
|
||
LSP 服务器会异步推送 `textDocument/publishDiagnostics` 通知,经去重和容量限制后作为 attachment 注入到 Claude 的对话上下文中。
|
||
|
||
## 核心模块
|
||
|
||
| 文件 | 职责 |
|
||
|------|------|
|
||
| `src/services/lsp/manager.ts` | 全局单例,初始化/重初始化/关闭生命周期管理 |
|
||
| `src/services/lsp/LSPServerManager.ts` | 多服务器管理,按文件扩展名路由,文件同步 |
|
||
| `src/services/lsp/LSPServerInstance.ts` | 单个 LSP 服务器实例生命周期(启动/停止/重启/健康检查) |
|
||
| `src/services/lsp/LSPClient.ts` | JSON-RPC 通信层(基于 `vscode-jsonrpc`),子进程管理 |
|
||
| `src/services/lsp/config.ts` | 从插件加载 LSP 服务器配置 |
|
||
| `src/services/lsp/LSPDiagnosticRegistry.ts` | 诊断信息注册、去重、容量限制 |
|
||
| `src/services/lsp/passiveFeedback.ts` | 注册 `publishDiagnostics` 通知处理器 |
|
||
| `packages/builtin-tools/src/tools/LSPTool/LSPTool.ts` | LSP Tool 实现(暴露给 Claude) |
|
||
| `packages/builtin-tools/src/tools/LSPTool/schemas.ts` | 输入 schema(9 种操作的 discriminated union) |
|
||
| `packages/builtin-tools/src/tools/LSPTool/formatters.ts` | 各操作结果的格式化 |
|
||
| `packages/builtin-tools/src/tools/LSPTool/prompt.ts` | Tool 描述文本 |
|
||
| `src/utils/plugins/lspPluginIntegration.ts` | 从插件加载、验证、环境变量解析、作用域管理 |
|
||
|
||
## LSP Tool 支持的操作
|
||
|
||
| 操作 | LSP Method | 说明 |
|
||
|------|-----------|------|
|
||
| `goToDefinition` | `textDocument/definition` | 跳转到符号定义 |
|
||
| `findReferences` | `textDocument/references` | 查找所有引用 |
|
||
| `hover` | `textDocument/hover` | 获取悬停信息(文档、类型) |
|
||
| `documentSymbol` | `textDocument/documentSymbol` | 获取文档内所有符号 |
|
||
| `workspaceSymbol` | `workspace/symbol` | 全工作区符号搜索 |
|
||
| `goToImplementation` | `textDocument/implementation` | 查找接口/抽象方法的实现 |
|
||
| `prepareCallHierarchy` | `textDocument/prepareCallHierarchy` | 获取位置处的调用层级项 |
|
||
| `incomingCalls` | `callHierarchy/incomingCalls` | 查找调用此函数的所有函数 |
|
||
| `outgoingCalls` | `callHierarchy/outgoingCalls` | 查找此函数调用的所有函数 |
|
||
|
||
所有操作需要 `filePath`、`line`(1-based)和 `character`(1-based)参数。
|
||
|
||
## 插件开发:LSP 服务器配置
|
||
|
||
LSP 服务器通过插件提供。插件的 `manifest.json` 中可以声明 LSP 服务器,支持三种格式:
|
||
|
||
**1. 内联配置(在 manifest 中直接定义)**
|
||
|
||
```json
|
||
{
|
||
"lspServers": {
|
||
"typescript": {
|
||
"command": "typescript-language-server",
|
||
"args": ["--stdio"],
|
||
"extensionToLanguage": {
|
||
".ts": "typescript",
|
||
".tsx": "typescriptreact"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**2. 引用外部 .lsp.json 文件**
|
||
|
||
```json
|
||
{
|
||
"lspServers": "path/to/.lsp.json"
|
||
}
|
||
```
|
||
|
||
**3. 数组混合格式**
|
||
|
||
```json
|
||
{
|
||
"lspServers": [
|
||
"path/to/.lsp.json",
|
||
{
|
||
"another-server": { "command": "...", "extensionToLanguage": { "...": "..." } }
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
也可以在插件目录下直接放置 `.lsp.json` 文件,无需在 manifest 中声明。
|
||
|
||
### LSP 服务器配置 Schema
|
||
|
||
| 字段 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| `command` | string | 是 | LSP 服务器可执行命令(不含空格) |
|
||
| `args` | string[] | 否 | 命令行参数 |
|
||
| `extensionToLanguage` | Record<string, string> | 是 | 文件扩展名到语言 ID 的映射(至少一个) |
|
||
| `transport` | `"stdio"` \| `"socket"` | 否 | 通信方式,默认 `stdio` |
|
||
| `env` | Record<string, string> | 否 | 启动服务器时设置的环境变量 |
|
||
| `initializationOptions` | unknown | 否 | 传给服务器的初始化选项 |
|
||
| `settings` | unknown | 否 | 通过 `workspace/didChangeConfiguration` 传递的设置 |
|
||
| `workspaceFolder` | string | 否 | 工作区目录路径 |
|
||
| `startupTimeout` | number | 否 | 启动超时时间(毫秒) |
|
||
| `maxRestarts` | number | 否 | 最大重启次数(默认 3) |
|
||
|
||
### 环境变量替换
|
||
|
||
配置中的 `command`、`args`、`env`、`workspaceFolder` 支持:
|
||
|
||
- `${CLAUDE_PLUGIN_ROOT}` — 插件根目录
|
||
- `${CLAUDE_PLUGIN_DATA}` — 插件数据目录
|
||
- `${user_config.KEY}` — 用户在插件启用时配置的值
|
||
- `${VAR}` — 系统环境变量
|
||
|
||
## 生命周期管理
|
||
|
||
### 服务器状态机
|
||
|
||
```
|
||
stopped → starting → running
|
||
running → stopping → stopped
|
||
any → error (失败时)
|
||
error → starting (重试时)
|
||
```
|
||
|
||
### 崩溃恢复
|
||
|
||
- LSP 服务器崩溃时状态设为 `error`
|
||
- 下次请求时自动尝试重启(通过 `ensureServerStarted`)
|
||
- 超过 `maxRestarts`(默认 3)次后放弃
|
||
|
||
### 瞬态错误重试
|
||
|
||
- `ContentModified` 错误(LSP 错误码 -32801)会自动重试,最多 3 次
|
||
- 使用指数退避:500ms → 1000ms → 2000ms
|
||
- 常见于 rust-analyzer 等仍在索引项目的服务器
|
||
|
||
### 诊断信息容量限制
|
||
|
||
- 每个文件最多 10 条诊断
|
||
- 总计最多 30 条诊断
|
||
- 超出部分按严重性排序后截断(Error > Warning > Info > Hint)
|
||
- 跨 turn 去重:已发送过的相同诊断不会重复发送
|
||
- 文件编辑后清除该文件的已发送记录,允许新诊断通过
|
||
|
||
### 插件刷新
|
||
|
||
安装/卸载插件后使用 `/reload-plugins`,会调用 `reinitializeLspServerManager()`:
|
||
1. 异步关闭旧服务器实例
|
||
2. 重置状态为 `not-started`
|
||
3. 调用 `initializeLspServerManager()` 重新加载插件配置
|
||
|
||
## 依赖
|
||
|
||
- `vscode-jsonrpc` — JSON-RPC 通信(懒加载,仅在实际创建服务器实例时才 require)
|
||
- `vscode-languageserver-protocol` — LSP 协议类型
|
||
- `vscode-languageserver-types` — LSP 类型定义
|
||
- `lru-cache` — 诊断去重缓存
|