@wbline/pi-lsp
On-demand LSP diagnostics and source fixes across 25+ languages, plus built-in CLI lint runners (ruff, biome, shellcheck) — aggregated into one check report for the Pi coding agent.
Package details
Install @wbline/pi-lsp from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@wbline/pi-lsp- Package
@wbline/pi-lsp- Version
1.3.1- Published
- Oct 16, 2026
- Downloads
- 692/mo · 692/wk
- Author
- wongbin
- License
- MIT
- Types
- extension
- Size
- 464.3 KB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@wbline/pi-lsp
Pi coding agent 的代码检查扩展: 按需的语言服务器(LSP)诊断与源码修复,覆盖 28 种语言服务器;外加内置 CLI lint runner(ruff / biome / shellcheck),一键聚合成统一报告。
无需任何配置文件——装上即用,缺失的服务器与 lint 工具会按内置配方自动安装。
安装
pi install npm:@wbline/pi-lsp # 从 npm 安装
工具
| 工具 | 说明 |
|---|---|
lsp_checks |
日常主力。一键聚合:LSP 通道 + 全部匹配的 CLI runner 并行执行,输出统一报告。改完代码跑一次即可 |
lsp_diagnostics |
只要 LSP 诊断时用(lsp_checks 的 LSP-only 子集),可指定单个/多个服务器 |
lsp_fix |
对一个或多个文件应用 LSP source action(默认 source.fixAll,如组织导入用 source.organizeImports)。多文件按服务器分组,每个服务器只启动一次 |
共享参数:
server接受单个名称或名称数组;lsp_checks另有对称的runners参数限制 runner 通道(如runners: ["ruff"])。未知名称报错并列出可用 idmaxDiagnostics(默认 200)封顶每条通道渲染的诊断数,超出截断并显示剩余数量,防止单次报告 token 失控autoInstall: false可在单次调用中关闭自动安装
支持的语言
28 个内置 LSP 服务器,按文件扩展名自动路由:
- Web:TypeScript/JS(tsserver + biome 双引擎)、Vue/JSX/TSX(biome)、PHP(intelephense)
- Python:ty(类型)+ ruff(lint)组合
- 系统:Rust(rust-analyzer)、C/C++(clangd)、Zig(zls)、Swift(sourcekit-lsp)
- JVM:Java(jdtls,含全自动安装器)、Kotlin(kotlin-lsp)
- 其他 :Go(gopls)、Ruby(rubocop)、Elixir、Lua、C#、F#、Prisma、Dart、OCaml、Bash、Terraform、LaTeX(texlab)、Gleam、Clojure、Nix、Typst(tinymist)、Haskell
CLI runner:ruff(Python lint)、biome(JS/TS lint + 格式)、shellcheck(Shell)。
自动安装
所有缺失的 LSP 服务器与 CLI 工具默认尽力自动安装(结果标注 [auto-installed]):
- CLI 工具按候选配方尝试系统包管理器:biome 走
npm i -g,shellcheck 走winget/scoop - Python 工具(ty、ruff,LSP 与 CLI 同渠道):统一走 uv——先检测/自动安装 uv 本体(官方独立安装脚本,不依赖系统 Python),再
uv tool install。uv 与工具 shim 都落在~/.local/bin,扩展自动搜索该目录(装完立即可见,无需重启 pi),无需手动配 PATH,也与系统 Python 形态(商店版 / user 安装 / venv)无关;pip/pipx 渠道已移除——pip 装进商店版 Python 后命令不在 PATH,正是 uv 通道要规避的问题 - 多数其他 LSP 服务器按配方走包管理器(bash-language-server、rust-analyzer、clangd、terraform-ls、tinymist 等)
- 装后校验:安装成功后用工具自身
--version探活,"装了但跑不起来"视为候选失败,继续下一个;探活与装后重解析前会自动重扫扩展的工具目录搜索路径(安装可能新建 bin 目录,如 winget 首装的WinGet\Links、首次npm i -g的%APPDATA%\npm、uv 的~/.local/bin),已运行进程读不到新 PATH 也不会误判 - 并发调用共享同一次安装,不会重复 spawn 安装进程
- jdtls(Java):无包管理器渠道,走专用下载安装器(仅 Windows)——自动下载 eclipse.jdt.ls + 托管 JDK 21 到
~/.pi/agent/lsp(隔离安装,不改 PATH、不动已有 JDK)。版本与下载地址运行时动态发现(官方源 + 中科大/清华镜像回退),官方发新版无需改代码;下载成功的压缩包保留在~/.pi/agent/lsp/archives/,换机时放回该目录即可完全离线安装;下载先写临时文件、成功后才落盘为种子,中断不会留下半个归档污染种子目录 - 无可靠安装渠道的服务器(如 ocaml-lsp、haskell-language-server)保持诚实跳过,明确提示安装方式,不冒充"干净"
Windows 兼容:.cmd/.bat 经 cmd /d /s /c 启动;无扩展名 shim(如 nvm)自动回退 .cmd/.exe。
设计取舍
- spawn-per-call 而非常驻 LSP 进程:每次调用冷启动服务器、跑完即关——零状态泄漏、无悬挂进程、单通道失败不拖垮其他通道;代价是重复调用的启动开销。批量接口(
lsp_fix的paths多文件、lsp_checks一次聚合)就是对此的补偿——按服务器/runner 分组,每条通道只 spawn 一次 - 文件收集默认全仓、上限 50 个文件:不传
paths时默认扫 workspace root,达到上限时报告头部明确提示,让模型知道结果是部分的。lsp_checks的一次遍历由所有 LSP 服务器与 runner 共享(全局上限);lsp_diagnostics按服务器各自的文件策略(扩展名 + 跳过目录)分别收集、相同策略共享一次遍历(各 50) - 诊断输出截断:
maxDiagnostics按通道封顶渲染条数,摘要计数始终展示真实总数 - 批量 fix 只返回摘要:多文件时每文件只返回状态与 action 计数;单文件调用保留修好后的全文预览。服务器跨文档/资源级变更(
documentChanges指向其他文件、create/rename/delete)不会被静默丢弃:单文件调用在末尾列出未应用的变更,批处理在行内标注 skipped 计数
致谢
设计借鉴:
- pi-lsp (narumiruna/pi-extensions)——轻量骨架:按扩展名路由、spawn-per-call、会话作用域、workspace 越界防护
- pi-lens——内置 runner 抽象、按优先级分发、诚实的结果分类(「查出了问题」是 completed check,不是 failed runner)、可用性探测 TTL 缓存
开发
npm install
npm run check # 源码 + 测试双 typecheck
npm test # vitest
npm run build # 输出 dist/(发布用;pi 加载源码无需构建)
License
MIT