GitHub · AI/ML 项目

用语言服务器为GitHub Copilot CLI赋予真实代码智能

Give GitHub Copilot CLI real code intelligence with language servers

二〇二六年六月十日 · 英文原文

GitHub Copilot CLI 引入LSP Setup技能,通过语言服务器协议(LSP)为agent提供精确的代码语义分析,替代此前基于文本搜索和二进制提取的启发式方法。该技能在Markdown文件中定义,包含七步工作流程:语言选择、操作系统检测、LSP服务器查找、配置范围选择、安装、配置写入与合并、验证。支持14种语言,配置格式使用lspServers对象,可设用户级或仓库级。安装后agent能解析类型、跳转定义、查找引用,减少工具调用时间。该技能为Awesome Copilot开源项目的一部分。

你是否见过 GitHub Copilot CLI 将 JAR 文件解压到临时目录,在 .class 文件中 grep,然后从原始字节码中拼凑出 API 签名?这个 agent 很有办法,但如果没有语言服务器,它也只能做到这样了。语言服务器协议(LSP)是驱动 VS Code 等编辑器中“转到定义”、“查找引用”和“类型解析”的标准。它在终端中同样有效。LSP Setup 技能(skill)可以自动为 Copilot CLI 安装和配置 LSP 服务器,让 agent 获得关于你代码的精确、结构化答案,而不是依赖文本搜索启发式方法。在这篇文章中,你将了解该技能的内部工作原理,看到它生成的配置格式,并为你当前支持的 14 种语言中的任何一种进行设置。

问题:启发式代码理解

如果没有 LSP 服务器,GitHub Copilot CLI 中的 agent 会通过文本搜索和二进制提取来逆向工程 API 信息。对于一个 Java 项目,可能看起来像这样:

# 查找依赖的 JAR
find ~/.m2/repository -name "*httpclient*.jar"
# 将其解压到临时目录
mkdir /tmp/httpclient && cd /tmp/httpclient
jar xf ~/.m2/repository/org/apache/httpcomponents/httpclient/4.5.14/httpclient-4.5.14.jar
# 在提取的 class 文件中搜索方法
grep -r "execute" --include="*.class" .

对于 Python,agent 可能会 cat site-packages 内的文件。对于 TypeScript,它会遍历 node_modules。这些基于文本的方法在简单情况下有效,但它们是在原始文本上进行模式匹配,而不是真正的语义分析,因此会遗漏泛型、重载和传递类型,并且完全无法查看编译后的字节码。这正是语言服务器所弥补的差距。

LSP 服务器从结构上解决了这个问题。当 agent 为一个符号发送 textDocument/definition 请求时,语言服务器会返回精确的源位置、完全解析的类型和签名。

什么是 agent 技能?

Agent 技能是一组可重用的指令集,用于扩展 AI 编码 agent 的能力。技能在带有 YAML 前置元数据的 Markdown 文件中定义,并遵循标准结构:触发描述、逐步工作流程、参考数据和行为约束。LSP Setup 技能使用这种结构来引导 agent 完成多步安装过程:检测操作系统、选择合适的包管理器、编写有效配置以及验证结果。

LSP Setup 技能的工作原理

当被触发时,该技能会执行一个七步工作流程:

  1. 语言选择:agent 使用 ask_user 并提供一组选项来确定用户需要哪种语言的 LSP 支持。这驱动了所有后续步骤。
  2. 操作系统检测:agent 运行 uname -s(或在 Windows 上检查 $env:OS / %OS%)来确定目标平台。安装命令因操作系统而异。例如,在 macOS 上是 brew install jdtls,而在 Linux 上是从 eclipse.org 下载。
  3. LSP 服务器查找:该技能包含一个参考文件(references/lsp-servers.md),其中包含 14 种语言的精选数据:每个操作系统的安装命令、二进制名称和即用型配置片段。agent 读取此文件并选择匹配的条目。
  4. 配置范围:agent 询问配置应该是:
    • 用户级~/.copilot/lsp-config.json — 适用于所有仓库
    • 仓库级:仓库根目录下的 lsp.json.github/lsp.json — 限定于单个项目 当两者都存在时,仓库级配置优先。
  5. 安装:agent 运行适当的安装命令。例如:
    # 任何操作系统上的 TypeScript
    npm install -g typescript typescript-language-server
    # macOS 上的 Java
    brew install jdtls
    # 任何操作系统上的 Rust
    rustup component add rust-analyzer
    
  6. 配置:agent 将条目写入或合并到选定的配置文件中。格式使用一个 lspServers 对象,其中每个键是一个服务器标识符:
    {
      "lspServers": {
        "java": {
          "command": "jdtls",
          "args": [],
          "fileExtensions": {
            ".java": "java"
          }
        }
      }
    }
    
    该技能强制执行的关键规则:
    • command 必须在 $PATH 中或是绝对路径
    • args 通常包含 "--stdio" 用于标准 I/O 传输(某些服务器如 jdtls 在内部处理此问题)
    • fileExtensions 将每个扩展名(带前导点)映射到语言标识符
    • 配置文件中的现有条目会被保留 — agent 会合并,从不覆盖
  7. 验证:agent 运行 which(或在 Windows 上运行 where.exe)来确认服务器可访问,然后验证配置文件是否为格式良好的 JSON。

支持的语言

该技能附带了一组针对多种编程语言的预定义语言服务器。如果编码 agent 遇到尚未映射的语言,它将搜索合适的服务器并引导你完成手动配置。

设置后的变化

一旦配置了 LSP 服务器,CLI agent 就可以:

这意味着 agent 花在工具调用上的时间更少,并且首次就能生成更准确的代码。对你来说,这意味着更少的时间等待 agent 反编译 JAR 文件或 grep node_modules 来回答你的 IDE 已经知道的问题,以及更少的基于错误读取签名而导致的错误转向。agent 会像你在编辑器中“转到定义”那样,以结构化的理解来推理你的代码,因此你可以将更大、更棘手的任务交给它,并信任其结果。

开始使用

  1. 下载技能:访问 Awesome Copilot LSP Setup 技能页面 并点击 Download 按钮获取 ZIP 文件。
  2. 解压 ZIP 到 ~/.copilot/skills/:运行以下命令:
    unzip lsp-setup.zip -d ~/.copilot/skills/
    
  3. 重启 GitHub Copilot CLI:如果 Copilot CLI 已在运行,先输入 /exit。然后重新启动 copilot,以便它加载新技能。
  4. 让 agent 设置语言服务器:例如,“set up LSP for Java”或“enable code intelligence for Python”。
  5. 验证:技能安装并配置 LSP 服务器后,再次重启 Copilot CLI(/exit,然后重新启动),运行 /lsp 检查服务器状态,并尝试对你某个依赖项中的符号执行“转到定义”。

该技能是 Awesome Copilot 项目的一部分。它是开源的,欢迎贡献和反馈!


原文《Give GitHub Copilot CLI real code intelligence with language servers》首发于 The GitHub Blog

译自 GitHub · AI/ML 项目 · 录于 二〇二六年六月十日