DeepSeek Harness Hub
← 返回列表

mook-wenyu/dsh-lsp

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

@echocore/dsh-lsp-client

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/30 · 已提供中文文档

DSH LSP 客户端插件:为 AI 代理提供 14 个 LSP 工具,自动路由 C# / TypeScript / JavaScript(Language Server Protocol for DeepSeek Harness agents)

综合分
28
GitHub 分
28
用户评分
★ Stars
0
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add mook-wenyu/dsh-lsp
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/19(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-llm@deepseek-ai/dsh-tools@deepseek-ai/schemastery
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

@echocore/dsh-lsp-client

DSH LSP 客户端插件:为 AI 代理提供语言服务器协议(LSP)能力——悬停、跳转定义、查找引用、编译诊断、文档符号、调用层级分析等 14 个工具,按文件语言自动路由(C# 与 TypeScript/JavaScript)。

特性

- 14 个 LSP 工具:覆盖符号级理解、编辑辅助、重构与诊断全链路
- 多语言注册表(LanguageServerRegistry):.cs → csharp-ls;.ts/.tsx/.js/.jsx → typescript-language-server(tsserver);同会话 monorepo 各语言独立实例互不干扰
- TS/JS 零安装:typescript-language-server + typescript 随插件分发(bundled),无需全局安装;项目自带 typescript 时自动优先使用工作区版本
- 提示词边界式条件注入:仅当会话 cwd 向上探测到项目文件标记时注入对应语言的 LSP 使用指引(C#:.slnx/.sln/.csproj;TS/JS:package.json/tsconfig.json/jsconfig.json),非项目会话零 token 占用;monorepo 多语言并行注入
- 多会话工作区隔离:LspWorkspacePool 按会话 × 语言 × 项目根维护独立语言服务器实例
- 懒启动:服务器在首次工具调用时拉起,start() 幂等
- 编辑后自动诊断:监听 tools/post-execute 事件,编辑 .cs/.ts/.tsx/.js/.jsx 文件后自动注入诊断摘要(内联附加 additionalContexts;TS/JS push-only 晚到补注 agent.inject)

与 DSH 自定义 Agent 的已知边界

lsp:tools 通过 systemPrompt.context(动态 runtime-context)注入。若自定义 Agent 未出现该段,且其会话 cwd 确实在受支持项目内,请检查自定义 Agent 是否设置了 complete 完整系统提示词或关闭了动态上下文——这属于 DSH 宿主侧配置,插件无法通过切换 section 通道绕过(2026-08-29 实测 section 方案无效后已回退 context)。

前置条件

- C#:.NET SDK 10+ 与全局 csharp-ls(dotnet tool install --global csharp-ls)
- TS/JS:无外部前置——服务器内置;工作区含 node_modules/typescript 时自动使用该版本,否则回退内置版本
- DSH web profile:已配置 Cordis 插件加载环境

安装

DSH web profile 以 git 依赖方式引用本包(已实证的流程):

1. 在 profile 的 package.json 中添加依赖:
"@echocore/dsh-lsp-client": "github:mook-wenyu/dsh-lsp"

2. 在 profile 目录重解析依赖到最新 commit:
cd ~/.dsh/profiles/web
pnpm update @echocore/dsh-lsp-client

3. 在 profile 的 pnpm-workspace.yaml 的 allowBuilds 中放行构建脚本
(安装时经 prepare 执行 tsc;键为 pnpm 报错时打印的精确形式,
本仓库 commit 前进后必须同步更新 hash,建议同时保留 git+ssh 与 https codeload 两种形态):
allowBuilds:
"@echocore/dsh-lsp-client@git+ssh://git@github.com/mook-wenyu/dsh-lsp.git#": true
"@echocore/dsh-lsp-client@https://codeload.github.com/mook-wenyu/dsh-lsp/tar.gz/": true

4. 重新安装并对账 bundles:
pnpm install --dir ~/.dsh/profiles/web
dsh plugin --profile web install

5. 重启 DSH 加载新构建(dsh plugin install 不热重载):
重启 web profile(会中断当前会话)
dsh web

⚠️ 不要仅执行裸 pnpm install 而不做 dsh plugin --profile web install 对账——
该场景曾导致插件 bundle 丢失。每次 commit 前进后按 2→5 步执行。

配置

方式一:settings.yaml 的 lsp 段

在 ~/.dsh/profiles/web/settings.yaml 中添加:

lsp:
enabled: true
serverCommand: csharp-ls          # 可选覆盖:对所有语言的服务器命令生效
serverArgs: []
workspaceRoot: /path/to/your/project
startupTimeoutMs: 30000
autoStart: false
logLevel: warn
diagnosticWaitMs: 5000          # 可选:push-only 服务器(TS/JS)诊断等待上限

方式二:cordis.patch.yml 配置覆盖

本插件通过 profile package.json 的 dsh.profile.bundles 自动加载(bundle 层),
通常不需要手动 insert。如需覆盖插件配置,在 ~/.dsh/profiles/web/cordis.patch.yml 中按 id 覆盖:

- id: lsp-client
config:
enabled: true
serverCommand: csharp-ls
workspaceRoot: /path/to/csharp/project
startupTimeoutMs: 30000
autoStart: false
logLevel: warn

配置参数

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| enabled | boolean | true | 是否启用 LSP 客户端 |
| serverCommand | string | 按语言 | 覆盖语言服务器命令(默认:csharp-ls / 内置 typescript-language-server) |
| serverArgs | string[] | [] | 传递给 LSP server 的额外参数(覆盖时生效) |
| workspaceRoot | string | - | 可选:固定 LSP 工作区根目录;未配置时按 file_path/session cwd 向上探测项目文件动态发现(推荐省略) |
| startupTimeoutMs | number | 30000 | initialize 握手超时(毫秒) |
| autoStart | boolean | false | 插件加载时自动启动服务器 |
| logLevel | string | 'warn' | 日志级别:off/error/warn/info/debug |
| diagnosticWaitMs | number | 5000 | push-only 服务器(TS/JS)诊断等待上限(毫秒) |

工具说明

插件注册 14 个 LSP 工具,供 AI 代理使用。所有工具按 file_path 扩展名自动路由语言服务器(.cs → csharp-ls;.ts/.tsx/.js/.jsx → typescript-language-server):

| 工具名 | LSP 方法 | 用途 | 参数 |
|--------|----------|------|------|
| lsp_hover | textDocument/hover | 获取类型签名和文档注释 | file_path, line, column |
| lsp_definition | textDocument/definition | 跳转到符号定义位置 | file_path, line, column |
| lsp_references | textDocument/references | 查找符号的所有引用位置(语义级全量,优于文本搜索) | file_path, line, column, include_declaration? |
| lsp_implement | textDocument/implementation | 查找接口/抽象成员的实现位置 | file_path, line, column |
| lsp_diagnostics | pull(C#)或 push 等待(TS/JS) | 获取文件的编译诊断信息 | file_path |
| lsp_document_symbols | textDocument/documentSymbol | 以层级树列出文件中的所有符号 | file_path |
| lsp_call_hierarchy | callHierarchy/prepare + incoming/outgoingCalls | 分析方法的调用层级 ⚠️ 两服务器均为能力边界:csharp-ls 0.26.0 不声明;ts-ls 5.x 声明但不注册处理器,当前返回服务器错误 | file_path, line, column |
| lsp_code_action | textDocument/codeAction | 获取诊断位置的快速修复建议 | file_path, line, column, end_line?, end_column?, diagnostic_code?, diagnostic_message? |
| lsp_completion | textDocument/completion | 光标处智能补全 | file_path, line, column |
| lsp_signature | textDocument/signatureHelp | 调用处的方法签名与活跃参数;需光标在参数括号内,构造函数调用可能无返回 | file_path, line, column |
| lsp_format | textDocument/formatting / rangeFormatting | 格式化全文或指定范围,返回待应用的编辑列表 | file_path, start_line?, end_line? |
| lsp_rename | textDocument/prepareRename + rename | 符号重命名,返回跨文件编辑计划(不落盘) | file_path, line, column, new_name |
| lsp_organize_imports | textDocument/codeAction(source) | 整理导入:TS/JS 会删除未使用 import(mode All);C# 不删未使用 using(csharp-ls 限制)——C# 清理走 diagnostics(CS8019) + code_action | file_path |
| lsp_workspace_diagnostics | 诊断缓存聚合(TS/JS 无 workspace pull,仅覆盖已探明文件) | 按文件分组汇总已探明文件(调用过 diagnostics 或收到推送)的最近诊断 | 无 |

注意:
- 所有行列号参数从 0 开始(0-indexed),文件路径必须是 绝对路径
- rename/organize_imports/format 返回编辑计划而非直接写盘,由调用方决定是否应用
- 工作区根目录未配置时按 file_path → session cwd 向上探测项目文件自动发现(C#:.slnx/.sln/.csproj;TS/JS:package.json/tsconfig.json/jsconfig.json)
- TS/JS 诊断为推送式(push-only):首次调用会自动等待服务器推送(默认 5s,diagnosticWaitMs 可调)

架构

┌─────────────────────────────────────────────────────────────┐
│                    DSH Web GUI (Cordis)                     │
├─────────────────────────────────────────────────────────────┤
│  dsh-lsp-client 插件                                        │
│  ┌─────────────────┐    ┌─────────────────────────────────┐ │
│  │   index.ts      │───▶│  LspWorkspacePool               │ │
│  │  (Cordis 入口)   │    │  会话 × 语言 × 项目根 实例池     │ │
│  └────────┬────────┘    └───────────┬─────────────────────┘ │
│           │                        │ 按文件语言路由          │
│           ▼                        ▼                        │
│  ┌─────────────────┐    ┌─────────────────────────────────┐ │
│  │  languages.ts   │───▶│  LspServerManager × N           │ │
│  │ (语言注册表)     │    │  - csharp-ls(外部).cs          │ │
│  │  - 扩展名路由    │    │  - typescript-language-server   │ │
│  │  - 项目标记      │    │    (内置 node  --stdio)    │ │
│  │  - 启动解析/env  │    │  - workspace/configuration 应答 │ │
│  │  - 提示词段      │    └──────────────┬──────────────────┘ │
│  └────────┬────────┘                   │                    │
│           ▼                            ▼                    │
│  ┌─────────────────┐    ┌─────────────────────────────────┐ │
│  │    tools.ts     │───▶│        LspClient                │ │
│  │ (14个工具定义)   │    │   - hover/definition/references  │ │
│  └─────────────────┘    │   - 诊断:pull 或 push 等待       │ │
│                         │   - WorkspaceEdit 双形态归一      │ │
│                         └─────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘

开发指南

本地开发

安装依赖
pnpm install

构建
pnpm build

类型检查
pnpm typecheck

运行测试
pnpm test

测试

运行所有单元测试(含生产契约防回归锁)
pnpm test

监听模式
pnpm test:watch

集成测试:启动真实 csharp-ls 进程,以 test-project/ 为工作区
pnpm test:integration

代码结构

src/
├── index.ts              # Cordis 插件入口,配置验证 + 工具注册 + 语言路由 + 编辑后诊断注入
├── languages.ts          # 语言注册表:扩展名路由/项目标记/启动解析/格式化默认/push 等待/提示词段
├── tools.ts              # 14 个 LSP 工具定义(defineTool 统一包装)
├── lsp-client.ts         # LSP 协议方法封装(诊断 pull/push-等待、WorkspaceEdit 双形态归一)
├── server-manager.ts     # LSP 服务器子进程生命周期管理(env/initOptions 按语言)
├── workspace-pool.ts     # 会话 × 语言 × 项目根 的实例池(多会话隔离与复用)
├── workspace-resolver.ts # 项目根发现(多语言联合探测,向上找项目标记)
├── prompt.ts             # 提示词边界式条件注入(systemPrompt.context 段,按语言分段)
└── types.ts              # 类型定义

故障排除

csharp-ls 未找到

错误:无法启动 LSP 服务器 'csharp-ls'

解决:
1. 确认 csharp-ls 已安装:csharp-ls --version
2. 确认 PATH 中可用:which csharp-ls(Linux/macOS)或 where csharp-ls(Windows)
3. 或指定完整路径:serverCommand: /full/path/to/csharp-ls

启动超时

错误:initialize 握手超时 (30000ms)

解决:
1. 增加 startupTimeoutMs 配置值(如 60000)
2. 检查 csharp-ls 启动是否正常:手动运行 csharp-ls 查看输出
3. 确认 workspaceRoot 包含有效的 .csproj 文件

.csproj 缺失

错误:csharp-ls 启动失败或无法加载项目

解决:
1. 确保 workspaceRoot 指向包含 .csproj 文件的目录
2. 或在 serverArgs 中指定项目文件:['--project', '/path/to/project.csproj']
3. 确保项目可正常编译:dotnet build

连接中断

错误:JSON-RPC 连接关闭或服务器崩溃

处理:
- 插件自动尝试重启(指数退避,最多 5 次连续失败)
- 检查 csharp-ls 日志(设置 logLevel: 'debug')
- 手动重启 DSH web profile

许可证

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群