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 LSP | initialize + 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。
源稿 Markdown: docs/notes/lsp.md