DeepSeek Harness 的通用 LSP 工具面,提供语言服务器诊断、格式化、重命名、代码动作与符号导航。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-tool-lsp
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:Jaylor-Wang/dsh-tool-lsp
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
English | 中文
给 DeepSeek Harness 用的 LSP 工具面:把真实语言服务器 的诊断、格式化、重命名、代码动作和符号导航,变成模型可直接调用的 5 个工具。
工具
| 工具 | 作用 | 会写盘 |
|---|---|---|
lsp_diagnostics |
文件诊断(合并 pull 与 push 两条通道) | 否 |
lsp_format |
整文件 / 范围格式化 | 是 |
lsp_rename |
语义级重命名,可跨文件 | 是 |
lsp_code_action |
语言服务器给出的修复建议 | 是(应用所选动作时) |
lsp_symbols |
文件大纲 / 工作区符号搜索 | 否 |
写盘走 Harness 的文件系统观测策略:文件在本次读取之后被外部改过,会以
LSP_WRITE_CONFLICT 失败,而不是静默覆盖。
安装
dsh plugin --profile web add dsh-tool-lsp
装完在 dshmarket 里启用。插件默认关闭——用时点一下开关,即时生效,不需要重启。开关不跨重启保留:重启后回到关闭。
配置
语言服务器表写在用户 profile 的补丁层($DSH_HOME/profiles/<name>/cordis.patch.yml),
不能写在插件包内:包内的 cordis.patch.yml 必须保持纯 insert 行,否则 dshmarket
无法热挂载/卸载本插件。
- id: lsp
config:
servers:
vtsls:
command: vtsls
args: ["--stdio"]
extensionToLanguage:
".ts": typescript
".tsx": typescriptreact
".js": javascript
".jsx": javascriptreact
projectMarkers: ["package.json", "tsconfig.json"]
configuration: # workspace/configuration 的应答
typescript:
preferences:
includePackageJsonAutoImports: "on"
rust:
command: rust-analyzer
extensionToLanguage:
".rs": rust
projectMarkers: ["Cargo.toml"]
biome:
command: biome
args: ["lsp-proxy"]
extensionToLanguage:
".json": json
".css": css
projectMarkers: ["biome.json"]
# 开关必须另起一行:同 id 的多行会按键合并,但合成一行会被市场开关破坏
- id: lsp
disabled: true
服务器条目字段
| 字段 | 必填 | 默认 | 说明 |
|---|---|---|---|
command |
✅ | — | 可执行文件名,挂载时按 PATH 解析;写错会当场报错 |
extensionToLanguage |
✅ | — | 扩展名 → LSP languageId |
fileGlobs |
[] |
路径 glob,优先级最高 | |
projectMarkers |
[] |
项目标记文件名,用于同扩展名多服务器分流 | |
args |
[] |
启动参数 | |
env |
{} |
追加的环境变量 | |
initializationOptions |
null |
initialize 的 initializationOptions |
|
configuration |
null |
workspace/configuration 的应答,按 section 分段返回 |
|
formattingOptions |
null |
覆盖全局格式化选项(tabSize / insertSpaces) |
分流规则
按顺序匹配,命中即停:
fileGlobsprojectMarkers—— 文件最近祖先目录中的标记文件;只在已映射该扩展名的条目间挑选extensionToLanguage—— 按配置顺序取第一个
顶层选项
maxDiagnostics(200)、maxSymbols(100)、maxCodeActions(50)、
maxResultChars(16000)、maxDiffLines(60)、maxDocumentBytes(8 MiB)、
timeoutMs(60000)。
位置约定
工具参数里的 line / character 是 1-based UTF-16,与编辑器一致。
与服务器之间的 0-based 及 utf-8 / utf-32 编码转换由插件内部完成,模型不需要关心。
前置条件
语言服务器本身要装在 PATH 上,插件不代为安装:
vtsls、biome、rust-analyzer、ty、ruff 等,或任何实现了 LSP 的服务器。
已知限制
biome与ruff不实现textDocument/documentSymbol,对它们调用lsp_symbols会返回LSP_UNSUPPORTED。它们只服务诊断与格式化。- 冷启动的服务器(如
rust-analyzer)首次拉取诊断可能为空(索引未完成), 插件会退避重试;超过上限就返回已拿到的结果。
开发
npm test # 121 项单元测试,含假服务器协议覆盖
npm run verify:servers # 用真实语言服务器跑通补丁层里配置的每一台
verify:servers 会读取 profile 补丁层里的 servers: 表,逐个启动真实服务器并
按其自报能力发一次真实请求。用法:node test/verify-servers.mjs [profileDir]。
改完插件源码要重启一次进程:市场开关能即时改变「是否挂载」,但不会把磁盘上的 新代码装进已运行的进程(ESM 模块缓存,实测确认)。
License
MIT
链接
同类插件
DayuanJiang/next-ai-draw-io#dsh-plugin★ 36548
dsh 的 draw.io 绘图插件:通过 next-ai-drawio MCP 服务器作图,点回复里的链接在右侧栏打开实时预览,可以手动修改图,AI 的每次修改都是可以恢复的版本。需 Node.js 18+,首次使用由 npx 下载 MCP 服务器。
Tencent/WeKnora#dsh-weknora★ 36201
把 WeKnora 知识库接入 dsh 的四个只读工具:列出知识库、混合检索原文片段、按顺序还原单篇文档,以及直接取用 WeKnora 自己带引用的 RAG 或 ReAct agent 回答(含可续聊的 session id)。
superdesigndev/treg★ 6962
给 Agent 的工具目录:按「要做的事」检索约 2,600 个外部接口(SEO 与 SERP、外链、社交、人物与公司信息补全、广告库、抓取),查看参数与单次调用价格后直接调用,凭据由服务端注入。附带技能,MCP 行在未设置 TREG_TOKEN 前保持禁用。
T-Auto/dsh-ops★ 5011
为 Windows 的 DSH 提供 bash、PowerShell 7 及 Rust 高性能工具,减少 token 消耗。
sixtysevenlf/dsh-blender-plugin★ 1536
让 DSH agent 通过直连 TCP 通道驱动本地 Blender,提供 15 个工具:视口帧、自定义视角渲染、Python 执行、无头与作业卸载、事务回滚,以及 34 个 family / 228 个 op 的规划层。
TencentCloudBase/CloudBase-AI-Toolkit#dsh-plugin★ 1153
把腾讯云 CloudBase 后端接入 DeepSeek Harness——在对话里搭好并部署全栈应用,查询结果渲染为表格卡片(分页、排序、导出 CSV),部署后可预览真实域名,并提供 CloudBase MCP 工具集(`mcp__cloudbase__*`),登录走 device-code 流程。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。