mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-01-09 02:19:12 +00:00
6.8 KiB
6.8 KiB
Qwen Code CLI LSP 集成实现方案分析
1. 项目概述
本方案旨在将 LSP(Language Server Protocol)能力原生集成到 Qwen Code CLI 中,使 AI 代理能够利用代码导航、定义查找、引用查找等功能。LSP 将作为与 MCP 并行的一级扩展机制实现。
2. 技术方案对比
2.1 Piebald-AI/claude-code-lsps 方案
- 架构: 客户端直接与每个 LSP 通信,通过
.lsp.json配置文件声明服务器命令/参数、stdio 传输和文件扩展名路由 - 用户配置: 低摩擦,只需放置
.lsp.json配置并确保 LSP 二进制文件已安装 - 安全: LSP 子进程以用户权限运行,无内置信任门控
- 功能覆盖: 可以暴露完整的 LSP 表面(hover、诊断、代码操作、重命名等)
2.2 原生 LSP 客户端方案(推荐方案)
- 架构: Qwen Code CLI 直接作为 LSP 客户端,与语言服务器建立 JSON-RPC 连接
- 用户配置: 支持内置预设 + 用户自定义
.lsp.json配置 - 安全: 与 MCP 共享相同的安全控制(信任工作区、允许/拒绝列表、确认提示)
- 功能覆盖: 暴露完整的 LSP 功能(流式诊断、代码操作、重命名、语义标记等)
2.3 cclsp + MCP 方案(备选)
- 架构: 通过 MCP 协议调用 cclsp 作为 LSP 桥接
- 用户配置: 需要 MCP 配置
- 安全: 通过 MCP 安全控制
- 功能覆盖: 依赖于 cclsp 映射的 MCP 工具
3. 原生 LSP 集成详细计划
3.1 方案选择
- 推荐方案: 原生 LSP 客户端作为主要路径,因为它提供完整 LSP 功能、更低延迟和更好的用户体验
- 兼容层: 保留 cclsp+MCP 作为现有 MCP 工作流的兼容桥接
- 并行架构: LSP 和 MCP 作为独立的扩展机制共存,共享安全策略
3.2 实现步骤
3.2.1 创建原生 LSP 服务
在 packages/cli/src/services/lsp/ 目录下创建 NativeLspService 类,处理:
- 工作区语言检测
- 自动发现和启动语言服务器
- 与现有文档/编辑模型同步
- LSP 能力直接暴露给代理
3.2.2 配置支持
- 支持内置预设配置(常见语言服务器)
- 支持用户自定义
.lsp.json配置文件 - 与 MCP 配置共存,共享信任控制
3.2.3 集成启动流程
- 在
packages/cli/src/config/config.ts中的loadCliConfig函数内集成 - 确保 LSP 服务与 MCP 服务共享相同的安全控制机制
- 处理沙箱预检和主运行的重复调用问题
3.2.4 功能标志配置
- 在
packages/cli/src/config/settingsSchema.ts中添加新的设置项 - 提供全局开关(如
lsp.enabled=false)允许用户禁用 LSP 功能 - 尊重
mcp.allowed/mcp.excluded和文件夹信任设置
3.2.5 安全控制
- 与 MCP 共享相同的安全控制机制
- 在信任工作区中自动启用,在非信任工作区中提示用户
- 实现路径允许列表和进程启动确认
3.2.6 错误处理与用户通知
- 检测缺失的语言服务器并提供安装命令
- 通过现有 MCP 状态 UI 显示错误信息
- 实现重试/退避机制,检测沙箱环境并抑制自动启动
3.3 需要确认的不确定项
-
启动集成点:在
loadCliConfig中集成原生 LSP 服务,需确保与 MCP 服务的协调 -
配置优先级:如果用户已有 cclsp MCP 配置,应保持并存还是优先使用原生 LSP
-
功能开关设计:开关应该是全局级别的,LSP 和 MCP 可独立启用/禁用
-
共享安全模型:如何在代码中复用 MCP 的信任/安全控制逻辑
-
语言服务器管理:如何管理 LSP 服务器生命周期并与文档编辑模型同步
-
依赖检测机制:检测 LSP 服务器可用性,失败时提供降级选项
-
测试策略:需要测试 LSP 与 MCP 的并行运行,以及共享安全控制
3.4 安全考虑
- 与 MCP 共享相同的安全控制模型
- 仅在受信任工作区中启用自动 LSP 功能
- 提供用户确认机制用于启动新的 LSP 服务器
- 防止路径劫持,使用安全的路径解析
3.5 高级 LSP 功能支持
- 完整 LSP 功能: 支持流式诊断、代码操作、重命名、语义高亮、工作区编辑等
- 兼容 Claude 配置: 支持导入 Claude Code 风格的
.lsp.json配置 - 性能优化: 优化 LSP 服务器启动时间和内存使用
3.6 用户体验
- 提供安装提示而非自动安装
- 在统一的状态界面显示 LSP 和 MCP 服务器状态
- 提供独立开关让用户控制 LSP 和 MCP 功能
- 为只读/沙箱环境提供安全的配置处理和清晰的错误消息
4. 实施总结
4.1 已完成的工作
- NativeLspService 类:创建了核心服务类,包含语言检测、配置合并、LSP 连接管理等功能
- LSP 连接工厂:实现了基于 stdio 的 LSP 连接创建和管理
- 语言检测机制:实现了基于文件扩展名和项目配置文件的语言自动检测
- 配置系统:实现了内置预设、用户配置和 Claude 兼容配置的合并
- 安全控制:实现了与 MCP 共享的安全控制机制,包括信任检查、用户确认、路径安全验证
- CLI 集成:在
loadCliConfig函数中集成了 LSP 服务初始化点
4.2 关键组件
4.2.1 LspConnectionFactory
- 使用
vscode-jsonrpc和vscode-languageserver-protocol实现 LSP 连接 - 支持 stdio 传输方式,可以扩展支持 TCP 传输
- 提供连接创建、初始化和关闭的完整生命周期管理
4.2.2 NativeLspService
- 语言检测:扫描项目文件和配置文件来识别编程语言
- 配置合并:按优先级合并内置预设、用户配置和兼容层配置
- LSP 服务器管理:启动、停止和状态管理
- 安全控制:与 MCP 共享的信任和确认机制
4.2.3 配置架构
- 内置预设:为常见语言提供默认 LSP 服务器配置
- 用户配置:支持
.lsp.json文件格式 - Claude 兼容:可导入 Claude Code 的 LSP 配置
4.3 依赖管理
- 使用
vscode-languageserver-protocol进行 LSP 协议通信 - 使用
vscode-jsonrpc进行 JSON-RPC 消息传递 - 使用
vscode-languageserver-textdocument管理文档版本
4.4 安全特性
- 工作区信任检查
- 用户确认机制(对于非信任工作区)
- 命令存在性验证
- 路径安全性检查
5. 总结
原生 LSP 客户端是当前最符合 Qwen Code 架构的选择,它提供了完整的 LSP 功能、更低的延迟和更好的用户体验。LSP 作为与 MCP 并行的一级扩展机制,将与 MCP 共享安全控制策略,但提供更丰富的代码智能功能。cclsp+MCP 可作为兼容层保留,以支持现有的 MCP 工作流。
该实现方案将使 Qwen Code CLI 具备完整的 LSP 功能,包括代码跳转、引用查找、自动补全、代码诊断等,为 AI 代理提供更丰富的代码理解能力。