2026-07-19 LSP Diagnostics Extension

LSP:给 Agent 一双「语言服务器」的眼睛

更关键的是 edit 之后自动看到 ERROR,不必靠模型记得再调诊断。

导语

@piex-dev/lsp 让 agent 能问 IDE 同一类问题;更关键的是 edit 之后自动看到 ERROR,不必靠模型记得再调诊断。

问题背景

没有 LSP 时,agent 只靠 read/grep 与脑补类型。改签名漏调用点、红线要等整次构建才知道。人编辑器交给语言服务器;agent 也该能问。

@piex-dev/lsp:导航、诊断、rename/code_actions,以及写后 ERROR 闭环。

技术原理

stdio JSON-RPC;rootMarkers 发现 server;publishDiagnostics 缓存。写路径 hook:sync(didOpen/didChange)→ 等诊断 → 仅 ERROR 裁剪后附在 tool 结果。

实现方案

兼容 initOptions/settings;多 server 聚合诊断、linter 不抢导航;rename 默认 preview;WorkspaceEdit 限 cwd。PI_LSP_DIAGNOSTICS_ON_EDIT=0 可关写后诊断。

闭环:hashline edit → 自动 ERROR → 需要时显式 lsp 导航/重构 → 运行时问题上 dap。

设计参考

项目机制piex 取舍
oh-my-pi lsp完整 LSP 客户端:多 server 路由、didChange、完整 action 面、诊断聚合采纳:JSON-RPC client、defaults.json 驱动、按需启动/会话复用、多 server 聚合。不采纳:Bun 运行时(改 Node)、大面铺满 action
OpenCode 写后诊断tool_result hook 拦 edit/write → 等 publishDiagnostics → 仅 ERROR、每文件 cap采纳整套模式:sync → wait → only ERROR → cap 20 → 干净文件不附加
VS Code LSPinitialize + settings/didChangeConfiguration + workspace/configuration借鉴:initOptions/settings 正确下发路径;full-text didChange;which 查 node_modules/.bin 和 .venv

核心取舍:优先写后 ERROR 闭环(学 OpenCode),诊断优于导航暴露;linter 不抢 primary server 的导航角色。

优化计划

已完成正确性、写后诊断、rename/code_actions。单测:bun test packages/lsp。下一步:项目级 .lsp.json、模块拆分、假 server 单测、indexing ready。暂缓 lspmux/自动下载/completion。