PerryLink/dsh-lsp-actions ↗★ 19
dsh-lsp-actions
LSP action surface for DeepSeek Harness: diagnostics, formatting, completion, code actions, symbols, signature help, inlay hints, and rename tools over language servers, plus the editor action protocol (lsp.actions.*) that makes the plugin the IDE integration backend
AI Analysis
适合需要代码诊断、格式化、自动补全等IDE辅助功能的开发者。
Install
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:PerryLink/dsh-lsp-actionsREADME
Read the full README ↗Configuration
All tunables are Schemastery Config fields (changeable from cordis.yml). An id-targeted override replaces the whole row — restate every key you need. cordis.patch.yml documents each key inline.
| Key | Default | Meaning |
|---|---|---|
servers | {} | Named language servers; an empty table activates no servers |
editor.enabled | false | Serve the editor action protocol over JSON-RPC stdio (headless backend only) |
editor.requestTimeoutMs | 60000 | Per-run timeout budget (ms) for the editor protocol |
editor.diagnosticsCacheMaxFiles | 64 | Bounded LRU diagnostics-cache size (files) |
maxDiagnostics | 200 | Diagnostics cap per result |
maxCompletionItems | 20 | Completion-items cap per result |
maxCodeActions | 50 | Code-actions cap per result |
maxSymbols | 100 | Symbol-results cap |
maxSignatures | 10 | Signature-help cap |
maxInlayHints | 200 | Inlay-hints cap |
maxResultChars | 16000 | Rendered-result cap (chars) |
maxDocumentBytes | 4000000 | Document-read cap (bytes) |
timeoutMs | 60000 | Per-call timeout, enforced by the official timeout policy |
Each servers entry is an LspServerEntry: command (executable resolved on PATH at load) and extensionToLanguage (".ts" → typescript) are required; optional fileGlobs, projectMarkers, args, env, initializationOptions, configuration, formattingOptions, maxMessageBytes, maxStderrBytes, killGraceMs, shutdownTimeoutMs, diagnosticsSettleMs, diagnosticsDebounceMs, and idleTimeoutMs (0 = keep the server process alive) tune the built-in stdio client.
Routing is deterministic and configuration-driven. Every file takes the first match from: (1) a server entry whose fileGlobs match the path; (2) the nearest ancestor directory — walking up to the workspace root — that holds a project config file listed in some entry's projectMarkers, matched against the entries that also map the file's extension; (3) the entry whose extensionToLanguage maps the file's extension, in config order. A workspace holding apps/node-app/{package.json,tsconfig.json,src/main.ts} and apps/deno-app/{deno.json,src/main.ts} therefore serves each main.ts from its own project's server, with no path rule to maintain and nothing to change when a project is added, renamed, or moved:
servers:
typescript:
command: typescript-language-server
args: ["--stdio"]
extensionToLanguage: { ".ts": typescript, ".tsx": typescriptreact }
projectMarkers: ["package.json", "tsconfig.json"]
deno:
command: deno
args: ["lsp"]
extensionToLanguage: { ".ts": typescript, ".tsx": typescriptreact }
projectMarkers: ["deno.json", "deno.jsonc"]
A project marker only decides among servers that already map the file's extension (it never widens an entry's file types); the walk never leaves the workspace root, and a project config in one directory never applies to a sibling directory. Step (1) outranks a project marker: an entry whose fileGlobs match the path still wins, so drop project-level globs when you adopt projectMarkers — a lingering **/*.ts glob keeps claiming those files. These rules govern the built-in stdio client — a mounted ctx.lsp seam provider decides its own routing.