* 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>
12 KiB
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 才能主动发起代码智能查询:
ENABLE_LSP_TOOL=1 bun run dev
不启用时,LSP 服务器仍然在后台运行并推送被动的诊断反馈(类型错误等)。
自动推荐
除了手动 /plugin 搜索安装外,Claude Code 会在编辑文件时自动检测:
- 监听
fileHistory.trackedFiles,发现有新文件被编辑 - 扫描已安装的 marketplace,找到声明支持该文件扩展名的 LSP 插件
- 检查系统上是否已安装对应的 LSP 二进制(如
typescript-language-server) - 满足条件时弹出推荐对话框,可选择安装
┌───── 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 中直接定义)
{
"lspServers": {
"typescript": {
"command": "typescript-language-server",
"args": ["--stdio"],
"extensionToLanguage": {
".ts": "typescript",
".tsx": "typescriptreact"
}
}
}
}
2. 引用外部 .lsp.json 文件
{
"lspServers": "path/to/.lsp.json"
}
3. 数组混合格式
{
"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():
- 异步关闭旧服务器实例
- 重置状态为
not-started - 调用
initializeLspServerManager()重新加载插件配置
依赖
vscode-jsonrpc— JSON-RPC 通信(懒加载,仅在实际创建服务器实例时才 require)vscode-languageserver-protocol— LSP 协议类型vscode-languageserver-types— LSP 类型定义lru-cache— 诊断去重缓存