dsh-lsp-actions 0.5.19 → 0.5.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/LICENSE +0 -0
- package/PRIVACY.md +0 -0
- package/README.en.md +520 -0
- package/README.es.md +520 -0
- package/README.hi.md +520 -0
- package/README.md +313 -235
- package/README.pt.md +520 -0
- package/cordis.patch.yml +0 -0
- package/docs/assets/dsh-lsp-actions-demo.gif +0 -0
- package/docs/assets/dsh-lsp-actions-demo.png +0 -0
- package/docs/assets/dsh-lsp-actions-flow-dark.svg +35 -0
- package/docs/assets/dsh-lsp-actions-flow-light.svg +35 -0
- package/docs/assets/dsh-lsp-actions-flow-v5-dark.svg +136 -0
- package/docs/assets/dsh-lsp-actions-flow-v5-light.svg +136 -0
- package/docs/assets/dsh-lsp-actions-flow.svg +0 -0
- package/docs/assets/dsh-lsp-actions-hero-en-dark.webp +0 -0
- package/docs/assets/dsh-lsp-actions-hero-en-light.webp +0 -0
- package/docs/assets/dsh-lsp-actions-hero-zh-dark.webp +0 -0
- package/docs/assets/dsh-lsp-actions-hero-zh-light.webp +0 -0
- package/docs/assets/dsh-lsp-actions-hero.png +0 -0
- package/docs/editor-protocol.md +0 -0
- package/docs/editor-protocol.zh-CN.md +0 -0
- package/docs/seam-extension-notes.md +0 -0
- package/examples/vscode/README.md +0 -0
- package/examples/vscode/README.zh-CN.md +0 -0
- package/examples/vscode/backend/bin.mjs +0 -0
- package/examples/vscode/backend/cordis.yml +0 -0
- package/examples/vscode/backend/package.json +0 -0
- package/examples/vscode/extension/package.json +0 -0
- package/examples/vscode/extension/src/client.js +0 -0
- package/examples/vscode/extension/src/extension.js +0 -0
- package/examples/vscode/extension/src/views.js +0 -0
- package/icon.svg +0 -0
- package/lib/abort.d.ts +0 -0
- package/lib/abort.d.ts.map +0 -0
- package/lib/abort.js +0 -0
- package/lib/abort.js.map +0 -0
- package/lib/call-id.d.ts +0 -0
- package/lib/call-id.d.ts.map +0 -0
- package/lib/call-id.js +0 -0
- package/lib/call-id.js.map +0 -0
- package/lib/client.d.ts +0 -0
- package/lib/client.d.ts.map +0 -0
- package/lib/client.js +0 -0
- package/lib/client.js.map +0 -0
- package/lib/connection.d.ts +0 -0
- package/lib/connection.d.ts.map +0 -0
- package/lib/connection.js +0 -0
- package/lib/connection.js.map +0 -0
- package/lib/editor/actions.d.ts +0 -0
- package/lib/editor/actions.d.ts.map +0 -0
- package/lib/editor/actions.js +0 -0
- package/lib/editor/actions.js.map +0 -0
- package/lib/editor/cache.d.ts +0 -0
- package/lib/editor/cache.d.ts.map +0 -0
- package/lib/editor/cache.js +0 -0
- package/lib/editor/cache.js.map +0 -0
- package/lib/editor/server.d.ts +0 -0
- package/lib/editor/server.d.ts.map +0 -0
- package/lib/editor/server.js +0 -0
- package/lib/editor/server.js.map +0 -0
- package/lib/editor/service.d.ts +0 -0
- package/lib/editor/service.d.ts.map +0 -0
- package/lib/editor/service.js +0 -0
- package/lib/editor/service.js.map +0 -0
- package/lib/editor/transport.d.ts +0 -0
- package/lib/editor/transport.d.ts.map +0 -0
- package/lib/editor/transport.js +0 -0
- package/lib/editor/transport.js.map +0 -0
- package/lib/editor/types.d.ts +0 -0
- package/lib/editor/types.d.ts.map +0 -0
- package/lib/editor/types.js +0 -0
- package/lib/editor/types.js.map +0 -0
- package/lib/edits.d.ts +0 -0
- package/lib/edits.d.ts.map +0 -0
- package/lib/edits.js +0 -0
- package/lib/edits.js.map +0 -0
- package/lib/extension.d.ts +0 -0
- package/lib/extension.d.ts.map +0 -0
- package/lib/extension.js +0 -0
- package/lib/extension.js.map +0 -0
- package/lib/extra-tools.d.ts +0 -0
- package/lib/extra-tools.d.ts.map +0 -0
- package/lib/extra-tools.js +0 -0
- package/lib/extra-tools.js.map +0 -0
- package/lib/framing.d.ts +0 -0
- package/lib/framing.d.ts.map +0 -0
- package/lib/framing.js +0 -0
- package/lib/framing.js.map +0 -0
- package/lib/host.d.ts +0 -0
- package/lib/host.d.ts.map +0 -0
- package/lib/host.js +0 -0
- package/lib/host.js.map +0 -0
- package/lib/index.d.ts +0 -0
- package/lib/index.d.ts.map +0 -0
- package/lib/index.js +0 -0
- package/lib/index.js.map +0 -0
- package/lib/project.d.ts +0 -0
- package/lib/project.d.ts.map +0 -0
- package/lib/project.js +0 -0
- package/lib/project.js.map +0 -0
- package/lib/render.d.ts +0 -0
- package/lib/render.d.ts.map +0 -0
- package/lib/render.js +0 -0
- package/lib/render.js.map +0 -0
- package/lib/runner.d.ts +0 -0
- package/lib/runner.d.ts.map +0 -0
- package/lib/runner.js +0 -0
- package/lib/runner.js.map +0 -0
- package/lib/sandbox.d.ts +0 -0
- package/lib/sandbox.d.ts.map +0 -0
- package/lib/sandbox.js +0 -0
- package/lib/sandbox.js.map +0 -0
- package/lib/seam.d.ts +0 -0
- package/lib/seam.d.ts.map +0 -0
- package/lib/seam.js +0 -0
- package/lib/seam.js.map +0 -0
- package/lib/servers.d.ts +0 -0
- package/lib/servers.d.ts.map +0 -0
- package/lib/servers.js +0 -0
- package/lib/servers.js.map +0 -0
- package/lib/session-cwd.d.ts +0 -0
- package/lib/session-cwd.d.ts.map +0 -0
- package/lib/session-cwd.js +0 -0
- package/lib/session-cwd.js.map +0 -0
- package/lib/tools.d.ts +0 -0
- package/lib/tools.d.ts.map +0 -0
- package/lib/tools.js +0 -0
- package/lib/tools.js.map +0 -0
- package/lib/translate.d.ts +0 -0
- package/lib/translate.d.ts.map +0 -0
- package/lib/translate.js +0 -0
- package/lib/translate.js.map +0 -0
- package/lib/vocabulary.d.ts +0 -0
- package/lib/vocabulary.d.ts.map +0 -0
- package/lib/vocabulary.js +0 -0
- package/lib/vocabulary.js.map +0 -0
- package/package.json +35 -20
- package/README-es.md +0 -445
- package/README-hi.md +0 -445
- package/README-pt.md +0 -445
- package/README-zh.md +0 -445
package/README.es.md
ADDED
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-lsp-actions-hero-en-dark.webp">
|
|
5
|
+
<img src="docs/assets/dsh-lsp-actions-hero-en-light.webp" width="100%" alt="dsh-lsp-actions: ocho herramientas y el protocolo del editor comparten un único ActionRunner; cada acción corresponde a un método real del servidor de lenguaje, seis de solo lectura y dos que escriben">
|
|
6
|
+
</picture>
|
|
7
|
+
|
|
8
|
+
# dsh-lsp-actions
|
|
9
|
+
|
|
10
|
+
**Deja que tu agente escriba y corrija código contra servidores de lenguaje reales: diagnósticos, formato, autocompletado, acciones de código, símbolos, ayuda de firma, sugerencias en línea y renombrado en una sola superficie de acciones.**
|
|
11
|
+
|
|
12
|
+
La superficie de acciones LSP para DeepSeek Harness: el seam oficial `ctx.lsp` cubre la navegación, este plugin completa el bucle de acciones y el protocolo estable de acciones del editor (`lsp.actions.*`) permite que editores como VS Code lo usen como backend de IDE.
|
|
13
|
+
|
|
14
|
+
[Instalar](#instalación-en-tres-pasos) · [Configuración](#configuración) · [FAQ](#faq) · [简体中文](README.md) · [English](README.en.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
|
|
15
|
+
|
|
16
|
+
[](LICENSE)
|
|
17
|
+
[](#compatibilidad)
|
|
18
|
+
[](https://www.npmjs.com/package/dsh-lsp-actions)
|
|
19
|
+
[](https://github.com/PerryLink/dsh-lsp-actions/actions/workflows/ci.yml)
|
|
20
|
+
[](#compatibilidad)
|
|
21
|
+
|
|
22
|
+
[](https://github.com/PerryLink/dsh-lsp-actions/stargazers)
|
|
23
|
+
[](https://www.npmjs.com/package/dsh-lsp-actions)
|
|
24
|
+
[](https://dshfind.com/plugins/PerryLink/dsh-lsp-actions?ref=badge)
|
|
25
|
+
[](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-lsp-actions)
|
|
26
|
+
[](https://dsh.market/)
|
|
27
|
+
[](https://gitee.com/perrylink/dsh-lsp-actions)
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
dsh plugin --profile <name> add dsh-lsp-actions
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<sub>Plugin de la comunidad, no afiliado a DeepSeek. Repositorio canónico: <https://github.com/PerryLink/dsh-lsp-actions> (Gitee es un espejo).</sub>
|
|
36
|
+
|
|
37
|
+
## Qué es
|
|
38
|
+
|
|
39
|
+
`dsh-lsp-actions` conecta el bucle de retroalimentación que un agente necesita mientras escribe código con servidores de lenguaje reales: diagnósticos, formato, autocompletado, acciones de código, símbolos, ayuda de firma, sugerencias en línea y renombrado los responde el mismo servidor que usa tu IDE (`typescript-language-server`, gopls, pyright, rust-analyzer…). El seam oficial `ctx.lsp` cubre solo la navegación (ir a definición, referencias, implementación, hover); este plugin completa la superficie de acciones y la empaqueta como el protocolo estable de acciones del editor (`lsp.actions.*`), para que editores como VS Code consuman esas capacidades sin implementar LSP por su cuenta. Se monta como una única fila host (`id: lsp-actions`, `inject: [tools, fs, subprocess]`), lanza los procesos de servidor de forma perezosa y hace pasar cada escritura por el waterfall oficial `fs/write-intent` y por la aprobación del sandbox.
|
|
40
|
+
|
|
41
|
+
<picture>
|
|
42
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/dsh-lsp-actions-flow-v5-dark.svg">
|
|
43
|
+
<img src="docs/assets/dsh-lsp-actions-flow-v5-light.svg" width="100%" alt="Estructura de dsh-lsp-actions: ida y vuelta de petición y respuesta; las herramientas y el protocolo del editor alimentan ActionRunner, que prefiere el seam ctx.lsp y recurre a la ruta servers con el cliente stdio integrado; la respuesta se normaliza y se acota, y solo formato y renombrado pasan por la válvula de escritura">
|
|
44
|
+
</picture>
|
|
45
|
+
|
|
46
|
+
## Instalación en tres pasos
|
|
47
|
+
|
|
48
|
+
1. **Instalar** (elige un canal):
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
# canal git (main más reciente; el script prepare compila lib/ con tsc)
|
|
52
|
+
dsh plugin --profile web add github:PerryLink/dsh-lsp-actions
|
|
53
|
+
# canal npm (versiones publicadas)
|
|
54
|
+
dsh plugin --profile web add dsh-lsp-actions
|
|
55
|
+
# canal tarball: pnpm pack en este repositorio y luego
|
|
56
|
+
dsh plugin --profile web add ./dsh-lsp-actions-<version>.tgz
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
2. **Configuración mínima** (el valor por defecto `servers: {}` no activa ningún servidor; añade al menos una entrada):
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
- insert:
|
|
63
|
+
- id: lsp-actions
|
|
64
|
+
name: dsh-lsp-actions
|
|
65
|
+
config:
|
|
66
|
+
servers:
|
|
67
|
+
typescript:
|
|
68
|
+
command: typescript-language-server
|
|
69
|
+
args: ["--stdio"]
|
|
70
|
+
extensionToLanguage: { ".ts": typescript, ".tsx": typescriptreact }
|
|
71
|
+
projectMarkers: ["package.json", "tsconfig.json"]
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
3. **Comprobar que se monta**:
|
|
75
|
+
|
|
76
|
+
```sh
|
|
77
|
+
dsh --profile web --dump-config | grep -A3 'id: lsp-actions'
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
> lsp_diagnostics a.ts
|
|
82
|
+
a.ts:1:3 [Error] boom [ts 2304]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Desinstalar**: `dsh plugin --profile web remove dsh-lsp-actions` (o elimina la fila del patch del perfil).
|
|
86
|
+
|
|
87
|
+
<details>
|
|
88
|
+
<summary>Instalar desde el mercado de DSH Desktop</summary>
|
|
89
|
+
|
|
90
|
+
Todos los plugins de PerryLink aparecen en el mercado integrado de DSH Desktop: **Mercado → Fuentes → Añadir fuente → pega** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ selecciona**. La instalación sigue requiriendo la verificación de identidad npm del mercado y tu confirmación.
|
|
91
|
+
|
|
92
|
+
</details>
|
|
93
|
+
|
|
94
|
+
## Capacidades clave
|
|
95
|
+
|
|
96
|
+
Este plugin completa **solo la superficie de acciones**: la navegación sigue viniendo del seam oficial `ctx.lsp`, y las acciones caen al cliente stdio mínimo propio cuando el seam falta, es de una versión anterior o no tiene proveedor para ese archivo.
|
|
97
|
+
|
|
98
|
+
- **Ocho herramientas `lsp_*`** — diagnósticos, formato, autocompletado, acciones de código, símbolos, ayuda de firma, sugerencias en línea y renombrado, todos respondidos por servidores de lenguaje reales, no por mocks.
|
|
99
|
+
- **Protocolo de acciones del editor v1** — una superficie JSON-RPC estable (`lsp.actions.list` / `lsp.actions.run` / `lsp.events`) que permite a cualquier editor (VS Code primero) consumir esas capacidades directamente.
|
|
100
|
+
- **Verificación con servidor real** — la suite incluye una ejecución real de `typescript-language-server` y un e2e del protocolo del editor; la CI lo corre en Node 22/24 sobre Linux, Windows y macOS.
|
|
101
|
+
- **Las escrituras van por la vía oficial** — `lsp_format` / `lsp_rename` pasan por el waterfall `fs/write-intent` y por la política de sandbox de cada llamada; una sesión `read-only` se rechaza antes de cualquier ida y vuelta con el servidor.
|
|
102
|
+
- **Solo lectura por defecto** — seis de las ocho herramientas son de referencia; solo el formato y el renombrado modifican.
|
|
103
|
+
- **Acotado** — número de resultados, caracteres, bytes de documento y tiempo por llamada tienen límite; la caché de diagnósticos es una LRU acotada.
|
|
104
|
+
|
|
105
|
+
```text
|
|
106
|
+
lsp_diagnostics / lsp_format / lsp_completion / lsp_code_action /
|
|
107
|
+
lsp_symbols / lsp_signature / lsp_inlay_hints / lsp_rename
|
|
108
|
+
│
|
|
109
|
+
▼
|
|
110
|
+
ctx.lsp seam (extendido: diagnostics / formatDocument / completion)
|
|
111
|
+
│ ausente · versión antigua · sin proveedor para este archivo
|
|
112
|
+
▼
|
|
113
|
+
cliente stdio integrado ← tabla servers (ctx.subprocess.spawn + JSON-RPC)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Herramientas y superficies
|
|
117
|
+
|
|
118
|
+
| Superficie | Tipo | Notas |
|
|
119
|
+
|---|---|---|
|
|
120
|
+
| `lsp_diagnostics` | tool | `<file>` — errores, advertencias y pistas del compilador/analizador con severidad, rango, mensaje y servidor de origen (solo lectura) |
|
|
121
|
+
| `lsp_format` | tool | `<file> [range?]` — formatea un archivo o una selección con el servidor de lenguaje y la aplica, devolviendo el diff (escribe vía `fs/write-intent`) |
|
|
122
|
+
| `lsp_completion` | tool | `<file> <line> <character>` — sugerencias de autocompletado en una posición del cursor, incluido el texto de inserción (solo lectura) |
|
|
123
|
+
| `lsp_code_action` | tool | `<file> [range?] [only?]` — quickfixes y refactorizaciones verificados por el servidor con sus ediciones, para un rango o el primer diagnóstico (solo referencia) |
|
|
124
|
+
| `lsp_symbols` | tool | `<query?> <file_path?>` — búsqueda de símbolos por nombre en todo el workspace, o el esquema de un archivo (solo lectura) |
|
|
125
|
+
| `lsp_signature` | tool | `<file> <line> <character>` — ayuda de firma (parámetros y documentación) dentro de una llamada (solo lectura) |
|
|
126
|
+
| `lsp_inlay_hints` | tool | `<file> [range?]` — anotaciones de tipo y nombres de parámetro que entrega el servidor (solo lectura) |
|
|
127
|
+
| `lsp_rename` | tool | `<file> <line> <character> <new_name>` — renombrado verificado por el servidor, aplicado en todo el workspace con diffs por archivo (escribe vía `fs/write-intent`) |
|
|
128
|
+
| `lsp.actions.*` | protocol | Protocolo de acciones del editor v1: `lsp.actions.list` / `lsp.actions.run` / `lsp.events` sobre JSON-RPC |
|
|
129
|
+
| `examples/vscode/` | extension | Extensión de VS Code solo UI más la composición headless del backend a la que se conecta |
|
|
130
|
+
|
|
131
|
+
### Ejemplos
|
|
132
|
+
|
|
133
|
+
Estos son los puntos de entrada reales del plugin; instala una vez y llama a uno.
|
|
134
|
+
|
|
135
|
+
**Ejemplo detallado** — comando `lsp_diagnostics`, entrada:
|
|
136
|
+
|
|
137
|
+
```json
|
|
138
|
+
{
|
|
139
|
+
"file_path": "a.ts"
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Salida:
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
a.ts:1:3 [Error] boom [ts 2304]
|
|
147
|
+
a.ts:3:1 [Hint] hint
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
*Observed from `plugins/dsh-lsp-actions/tests/render.spec.ts:32-37 (exact toBe); tool-level no-result render at plugins/dsh-lsp-actions/tests/tools.spec.ts:150-156`*
|
|
151
|
+
|
|
152
|
+
**Rama de fallo** — entrada:
|
|
153
|
+
|
|
154
|
+
```text
|
|
155
|
+
{"action":"format","requestId":"f1","params":{"filePath":"a.ts","workspaceRoot":"<session-workspace>"}} under a read-only permission preset
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Salida:
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
{
|
|
162
|
+
"requestId": "f1",
|
|
163
|
+
"action": "format",
|
|
164
|
+
"status": "failed",
|
|
165
|
+
"error": {
|
|
166
|
+
"code": "LSP_ACTION_READ_ONLY",
|
|
167
|
+
"message": "[sandbox: file access denied under read-only mode]\n[sandbox: escalation available — retry this exact operation once with sandbox_permissions (the narrowest wider mode that suffices) + justification; the approval prompt asks the user]"
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
*Observed from `plugins/dsh-lsp-actions/src/tools.ts:213-223; plugins/dsh-lsp-actions/src/editor/actions.ts:320-330; plugins/dsh-lsp-actions/tests/editor-protocol.spec.ts:305-325`*
|
|
173
|
+
|
|
174
|
+
**Ejemplos breves**: `lsp_format` · `lsp_completion`
|
|
175
|
+
|
|
176
|
+
### Protocolo de acciones del editor v1
|
|
177
|
+
|
|
178
|
+
Con `editor.enabled: true` en una composición headless dedicada, `dsh-lsp-actions` sirve un protocolo de editor estable sobre JSON-RPC 2.0 delimitado por saltos de línea (el mismo framing que los transportes oficiales SDK/ACP):
|
|
179
|
+
|
|
180
|
+
| Método | Qué hace |
|
|
181
|
+
|---|---|
|
|
182
|
+
| `lsp.actions.list` | Devuelve la versión de protocolo `lsp-actions/v1`, el catálogo de acciones (`diagnostics.get`, `completion.get`, `quickfix.apply`, `format`, cada una marcada con `writes`) y las sesiones DSH direccionables |
|
|
183
|
+
| `lsp.actions.run` | Ejecuta una acción con un sobre estructurado `{ requestId, action, status, result \| error }`; los errores llevan los códigos estables `LSP_ACTION_*` |
|
|
184
|
+
| `lsp.events` | Se suscribe a las notificaciones `lsp.event` en streaming: `diagnostics.updated`, `action.status`, `file.changed`, `sessions.changed` |
|
|
185
|
+
|
|
186
|
+
Todas las acciones de escritura (`quickfix.apply`, `format`) pasan por los **presets de permisos y la aprobación oficiales**: una sesión `read-only` se rechaza con `LSP_ACTION_READ_ONLY` antes de cualquier ida y vuelta con el servidor, las ediciones viajan por el waterfall `fs/write-intent`, y el par de escalado `sandbox_permissions` + `justification` se resuelve mediante el ask oficial `approveEscalation` (fail-closed cuando ningún respondiente puede decidir). Especificación completa del protocolo, bilingüe: [`docs/editor-protocol.md`](docs/editor-protocol.md) · [`docs/editor-protocol.zh-CN.md`](docs/editor-protocol.zh-CN.md).
|
|
187
|
+
|
|
188
|
+
**Versionado y promesa de compatibilidad hacia atrás**
|
|
189
|
+
|
|
190
|
+
- El protocolo está versionado — `lsp.actions.list` devuelve `protocol: "lsp-actions/v1"`, `version: 1`. **v1 está congelado:** los nombres de campo, los ids de acción, los tipos de evento y los códigos de error permanecen estables para siempre.
|
|
191
|
+
- La evolución es **solo aditiva**: nuevas acciones, campos y tipos de evento llegan sin subir la versión; la semántica existente nunca cambia en su sitio; un cambio incompatible se publica bajo una nueva versión de `protocol`, que los servidores pueden servir en paralelo.
|
|
192
|
+
- Los clientes deben ignorar campos, tipos de evento y acciones desconocidos, y enrutar por el `code` estable del error, nunca por el texto del mensaje.
|
|
193
|
+
|
|
194
|
+
**Códigos de error**
|
|
195
|
+
|
|
196
|
+
Cada fallo lleva un `code` estable; los modelos y los llamadores enrutan por el código, nunca por el texto del mensaje.
|
|
197
|
+
|
|
198
|
+
| Código | Significado |
|
|
199
|
+
|---|---|
|
|
200
|
+
| `LSP_ACTION_UNAVAILABLE` | Ninguna entrada de servidor ni proveedor del seam maneja este archivo |
|
|
201
|
+
| `LSP_ACTION_UNSUPPORTED` | El servidor (o proveedor del seam) no anuncia la operación |
|
|
202
|
+
| `LSP_ACTION_SERVER_FAILED` | El servidor falló (con la cola de stderr); los fallos de arranque se reintentan una vez |
|
|
203
|
+
| `LSP_ACTION_MALFORMED_RESPONSE` | El servidor envió un payload estructuralmente inválido |
|
|
204
|
+
| `LSP_ACTION_CONFLICT` | El archivo cambió desde que se leyó, o las ediciones se solapan / salen de rango / salen del workspace |
|
|
205
|
+
| `LSP_ACTION_READ_ONLY` | El modo de sandbox de la sesión prohíbe la escritura de formato/renombrado |
|
|
206
|
+
| `LSP_ACTION_WORKSPACE_REQUIRED` | La sesión llamadora no tiene un cwd de workspace donde enraizar el servidor |
|
|
207
|
+
| `LSP_ACTION_NO_SYMBOL` | El servidor no encontró ningún símbolo renombrable en la posición del cursor |
|
|
208
|
+
| `LSP_ACTION_UNKNOWN` | Protocolo del editor: id de acción desconocido, o ninguna acción de código coincide con `title`/`index` |
|
|
209
|
+
| `LSP_ACTION_INVALID_ARGS` | Protocolo del editor: parámetros de acción malformados |
|
|
210
|
+
| `LSP_ACTION_APPROVAL_UNAVAILABLE` | Protocolo del editor: la vía de aprobación no pudo conceder un modo de sandbox más amplio (fail-closed) |
|
|
211
|
+
| `LSP_PROTOCOL_VERSION_UNSUPPORTED` | Protocolo del editor: la versión de protocolo declarada no está soportada |
|
|
212
|
+
|
|
213
|
+
### Extensión de VS Code
|
|
214
|
+
|
|
215
|
+
[`examples/vscode/`](examples/vscode/) incluye una extensión **solo UI** (barra lateral con las sesiones DSH, la lista de diagnósticos, aplicación de quickfix con un clic, apertura en el rango y formato) más la composición headless del backend (`backend/cordis.yml`) a la que se conecta por JSON-RPC estilo ACP. La extensión no implementa nada de LSP: cada capacidad y cada byte escrito pertenecen al plugin. Los pasos de instalación, los ajustes y el script de grabación del gif de demostración están en [`examples/vscode/README.md`](examples/vscode/README.md).
|
|
216
|
+
|
|
217
|
+
### Arquitectura
|
|
218
|
+
|
|
219
|
+
Las acciones van **primero al seam oficial** y caen al cliente stdio mínimo propio si no hay coincidencia. La extensión del seam está propuesta aguas arriba ([`upstream/lsp-action-seam.patch`](upstream/lsp-action-seam.patch), descripción del PR en [`upstream/PR-description.md`](upstream/PR-description.md)); cuando aterrice, el plugin seguirá funcionando sin cambios: el cliente integrado simplemente dejará de usarse. El cliente integrado se queda como respaldo independiente para la tabla `servers`. El **protocolo del editor** usa el mismo runner, la misma vía de escritura y la misma maquinaria de permisos.
|
|
220
|
+
|
|
221
|
+
El backend de acciones está detrás de una interfaz pública de proveedor — `ActionRunner` (exportada por el paquete) — implementada por el runner integrado y abierta a proveedores de terceros: las ocho herramientas consumen solo esa interfaz, nunca un cliente concreto. Notas completas de investigación y diseño: [`docs/seam-extension-notes.md`](docs/seam-extension-notes.md).
|
|
222
|
+
|
|
223
|
+
## Configuración
|
|
224
|
+
|
|
225
|
+
Todos los ajustes son campos Schemastery `Config` (modificables desde cordis.yml). Una sobrescritura dirigida por id reemplaza la fila entera: vuelve a declarar todas las claves que necesites. `cordis.patch.yml` documenta cada clave en línea.
|
|
226
|
+
|
|
227
|
+
Claves más usadas:
|
|
228
|
+
|
|
229
|
+
| Clave | Valor por defecto | Significado |
|
|
230
|
+
|---|---|---|
|
|
231
|
+
| `servers` | `{}` | Servidores de lenguaje con nombre; una tabla vacía no activa ninguno |
|
|
232
|
+
| `editor.enabled` | `false` | Sirve el protocolo de acciones del editor por JSON-RPC stdio (solo backend headless) |
|
|
233
|
+
| `maxDiagnostics` | `200` | Límite de diagnósticos por resultado |
|
|
234
|
+
| `maxResultChars` | `16000` | Límite del resultado renderizado (caracteres) |
|
|
235
|
+
| `maxDocumentBytes` | `4000000` | Límite de lectura de documento (bytes) |
|
|
236
|
+
| `timeoutMs` | `60000` | Tiempo máximo por llamada, aplicado por la política de timeout oficial |
|
|
237
|
+
|
|
238
|
+
<details>
|
|
239
|
+
<summary>Tabla de configuración completa (13 claves)</summary>
|
|
240
|
+
|
|
241
|
+
| Clave | Valor por defecto | Significado |
|
|
242
|
+
|---|---|---|
|
|
243
|
+
| `servers` | `{}` | Servidores de lenguaje con nombre; una tabla vacía no activa ninguno |
|
|
244
|
+
| `editor.enabled` | `false` | Sirve el protocolo de acciones del editor por JSON-RPC stdio (solo backend headless) |
|
|
245
|
+
| `editor.requestTimeoutMs` | `60000` | Presupuesto de timeout por ejecución (ms) del protocolo del editor |
|
|
246
|
+
| `editor.diagnosticsCacheMaxFiles` | `64` | Tamaño de la caché LRU de diagnósticos (archivos) |
|
|
247
|
+
| `maxDiagnostics` | `200` | Límite de diagnósticos por resultado |
|
|
248
|
+
| `maxCompletionItems` | `20` | Límite de elementos de autocompletado por resultado |
|
|
249
|
+
| `maxCodeActions` | `50` | Límite de acciones de código por resultado |
|
|
250
|
+
| `maxSymbols` | `100` | Límite de resultados de símbolos |
|
|
251
|
+
| `maxSignatures` | `10` | Límite de la ayuda de firma |
|
|
252
|
+
| `maxInlayHints` | `200` | Límite de sugerencias en línea |
|
|
253
|
+
| `maxResultChars` | `16000` | Límite del resultado renderizado (caracteres) |
|
|
254
|
+
| `maxDocumentBytes` | `4000000` | Límite de lectura de documento (bytes) |
|
|
255
|
+
| `timeoutMs` | `60000` | Tiempo máximo por llamada, aplicado por la política de timeout oficial |
|
|
256
|
+
|
|
257
|
+
</details>
|
|
258
|
+
|
|
259
|
+
Cada entrada de `servers` es un `LspServerEntry`: `command` (ejecutable resuelto en PATH al cargar) y `extensionToLanguage` (`".ts"` → `typescript`) son obligatorios; los opcionales `fileGlobs`, `projectMarkers`, `args`, `env`, `initializationOptions`, `configuration`, `formattingOptions`, `maxMessageBytes`, `maxStderrBytes`, `killGraceMs`, `shutdownTimeoutMs`, `diagnosticsSettleMs`, `diagnosticsDebounceMs` e `idleTimeoutMs` (`0` = mantener vivo el proceso del servidor, que es además el valor por defecto) ajustan el cliente stdio integrado.
|
|
260
|
+
|
|
261
|
+
El enrutado es determinista y guiado por la configuración. Cada archivo toma la primera coincidencia de: **(1)** una entrada de servidor cuyos `fileGlobs` coincidan con la ruta; **(2)** el directorio ancestro más cercano — subiendo hasta la raíz del workspace — que contenga un archivo de configuración de proyecto listado en los `projectMarkers` de alguna entrada, comparado solo contra las entradas que además mapean la extensión del archivo; **(3)** la entrada cuyo `extensionToLanguage` mapea la extensión del archivo, en orden de configuración. Un workspace con `apps/node-app/{package.json,tsconfig.json,src/main.ts}` y `apps/deno-app/{deno.json,src/main.ts}` sirve así cada `main.ts` desde el servidor de su propio proyecto, sin reglas de ruta que mantener y sin nada que cambiar cuando un proyecto se añade, renombra o mueve:
|
|
262
|
+
|
|
263
|
+
```yaml
|
|
264
|
+
servers:
|
|
265
|
+
typescript:
|
|
266
|
+
command: typescript-language-server
|
|
267
|
+
args: ["--stdio"]
|
|
268
|
+
extensionToLanguage: { ".ts": typescript, ".tsx": typescriptreact }
|
|
269
|
+
projectMarkers: ["package.json", "tsconfig.json"]
|
|
270
|
+
deno:
|
|
271
|
+
command: deno
|
|
272
|
+
args: ["lsp"]
|
|
273
|
+
extensionToLanguage: { ".ts": typescript, ".tsx": typescriptreact }
|
|
274
|
+
projectMarkers: ["deno.json", "deno.jsonc"]
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Un marcador de proyecto solo decide entre servidores que ya mapean la extensión del archivo (nunca amplía los tipos de archivo de una entrada); el recorrido nunca sale de la raíz del workspace, y la configuración de proyecto de un directorio nunca se aplica a un directorio hermano. El paso **(1)** tiene prioridad sobre el marcador de proyecto: una entrada cuyos `fileGlobs` coincidan con la ruta sigue ganando, así que elimina los globs de nivel de proyecto cuando adoptes `projectMarkers`; un `**/*.ts` residual seguirá reclamando esos archivos. Estas reglas gobiernan el cliente stdio integrado; un proveedor del seam `ctx.lsp` montado decide su propio enrutado.
|
|
278
|
+
|
|
279
|
+
## FAQ
|
|
280
|
+
|
|
281
|
+
<details>
|
|
282
|
+
<summary>¿Qué pasa con el valor por defecto <code>servers: {}</code>? ¿Falla en silencio?</summary>
|
|
283
|
+
|
|
284
|
+
Nada es silencioso. Las ocho herramientas siguen registradas, pero una llamada falla de forma ruidosa con `LSP_ACTION_UNAVAILABLE` cuando ni una entrada de servidor ni un proveedor del seam `ctx.lsp` manejan el archivo. El seam se resuelve en cada llamada, así que un seam montado después de este plugin se atiende sin recargar. Con `editor.enabled: false` (el valor por defecto) el protocolo del editor no arranca en absoluto.
|
|
285
|
+
|
|
286
|
+
</details>
|
|
287
|
+
|
|
288
|
+
<details>
|
|
289
|
+
<summary>¿Puede una escritura saltarse el sandbox y la aprobación?</summary>
|
|
290
|
+
|
|
291
|
+
No. Solo escriben `lsp_format` y `lsp_rename`, y lo hacen por la misma vía que las herramientas oficiales `write`/`edit`: el waterfall `fs/write-intent` (observación → escritura protegida → observación) y la política de sandbox de cada llamada. Una sesión `read-only` se rechaza con `LSP_ACTION_READ_ONLY` antes de cualquier ida y vuelta con el servidor; cuando hace falta un modo más amplio, el par de escalado `sandbox_permissions` + `justification` pasa por el ask oficial `approveEscalation` y falla cerrado como `LSP_ACTION_APPROVAL_UNAVAILABLE` si ningún respondiente puede decidir.
|
|
292
|
+
|
|
293
|
+
</details>
|
|
294
|
+
|
|
295
|
+
<details>
|
|
296
|
+
<summary>¿Compite con otros plugins por nombres de herramienta, eventos o slots?</summary>
|
|
297
|
+
|
|
298
|
+
No. Cada herramienta lleva espacio de nombres, no provee ninguna clave de servicio, no registra slots de cliente ni prefijos `webServer`, y no muta globales; el patch del bundle solo `insert`a su propia fila; el único evento compartido, `fs/write-intent`, siempre se delega por `next()` y nunca cortocircuita la cadena. El argumento punto por punto está en «Interoperabilidad con otros plugins DSH».
|
|
299
|
+
|
|
300
|
+
</details>
|
|
301
|
+
|
|
302
|
+
<details>
|
|
303
|
+
<summary>¿Y si el archivo cambia en disco después de leerlo?</summary>
|
|
304
|
+
|
|
305
|
+
Nunca se pisa. La acción falla con `LSP_ACTION_CONFLICT` cuando el archivo cambió desde que se leyó; las ediciones solapadas, fuera de rango o fuera del workspace conflictúan igual. `lsp_rename` comprueba cada archivo afectado antes de la primera escritura.
|
|
306
|
+
|
|
307
|
+
</details>
|
|
308
|
+
|
|
309
|
+
<details>
|
|
310
|
+
<summary>¿Cuánta sobrecarga de recursos hay?</summary>
|
|
311
|
+
|
|
312
|
+
Los procesos de servidor se lanzan de forma perezosa y cada instancia mantiene sus documentos residentes hasta que el proceso se reclama; `idleTimeoutMs` vale `0` por defecto (permanecer vivo), y un valor positivo reclama la instancia cuando está inactiva. El número de resultados, los caracteres, los bytes de documento y la duración total están acotados por llamada; la caché de diagnósticos del protocolo del editor es una LRU acotada (`editor.diagnosticsCacheMaxFiles`); el plugin no hace ninguna petición de red.
|
|
313
|
+
|
|
314
|
+
</details>
|
|
315
|
+
|
|
316
|
+
## Límites de seguridad
|
|
317
|
+
|
|
318
|
+
- **Solo lectura por defecto.** Seis de las ocho herramientas son de referencia; solo `lsp_format` y `lsp_rename` modifican, y lo hacen como mutaciones reales `write`/`edit`.
|
|
319
|
+
- **Seams oficiales, no reimplementados.** Cada byte pasa por el waterfall `fs/write-intent` (observación → escritura protegida → observación) y por la política de sandbox de cada llamada; el escalado coincide con las herramientas oficiales `write`/`edit`.
|
|
320
|
+
- **Fallo ruidoso, rápido y estructurado.** `servers` vacío + sin seam `ctx.lsp` → `LSP_ACTION_UNAVAILABLE`; sesiones de solo lectura → `LSP_ACTION_READ_ONLY` antes de cualquier ida y vuelta con el servidor; las formas de comando se informan y nunca se ejecutan.
|
|
321
|
+
- **Los conflictos nunca pisan.** Un archivo cambiado en disco después de leerse falla con `LSP_ACTION_CONFLICT`; `lsp_rename` comprueba cada archivo afectado antes de la primera escritura.
|
|
322
|
+
- **Trabajo acotado.** Los límites de resultados, de bytes y la política de timeout de la plataforma acotan cada llamada; la caché de diagnósticos es una LRU acotada.
|
|
323
|
+
- **Nada en caché en la ruta del modelo.** Los resultados de herramientas viven solo en el log de sesión; la caché de diagnósticos nunca persiste entre reinicios.
|
|
324
|
+
- **Los servidores malos fallan de forma ruidosa.** Un ejecutable ausente falla al cargar; un servidor que muere al arrancar falla la llamada con `LSP_ACTION_SERVER_FAILED` más la cola de su stderr (tras un reintento con proceso nuevo).
|
|
325
|
+
- **Higiene del prompt.** El plugin no inyecta persona ni prosa de prompt en el system prompt de la sesión: su superficie hacia el modelo son los ocho esquemas de herramienta.
|
|
326
|
+
|
|
327
|
+
## Permisos y datos
|
|
328
|
+
|
|
329
|
+
- **Permisos**: el formato y el renombrado usan los presets de permisos y la aprobación oficiales — el waterfall `fs/write-intent` y el par de escalado `sandbox_permissions` / `justification` resuelto por `ctx.approval`. El plugin declara `fs:read`, `fs:write`, `subprocess:spawn` y `network:none` en su manifest de workshop.
|
|
330
|
+
- **Datos**: no se guarda nada en disco; los resultados de herramientas viven solo en el log de sesión (sin persistencia entre sesiones). El protocolo del editor mantiene una única caché LRU de diagnósticos en memoria, acotada, con marca de frescura y nunca persistida entre reinicios. La nota de privacidad está en [`PRIVACY.md`](PRIVACY.md).
|
|
331
|
+
- **Sin red**: el plugin no hace peticiones de red; habla con los servidores de lenguaje por stdio de subproceso local.
|
|
332
|
+
|
|
333
|
+
## Limitaciones conocidas
|
|
334
|
+
|
|
335
|
+
- **Documentos residentes.** Cada documento se abre una vez y permanece abierto durante toda la vida de la instancia del servidor: una petición posterior con el fuente cambiado envía un `didChange` de documento completo, y el apagado del proceso cierra todos los documentos. Así, servidores basados en proyecto como tsls atienden `textDocument/signatureHelp` y `workspace/symbol` sin documento abierto en lugar de responder `null` sobre un documento recién cerrado. El conjunto residente está acotado por el workspace y se limpia con la instancia (desalojo por inactividad o disposición del plugin).
|
|
336
|
+
- **El formato de rango requiere el proveedor de rango del servidor.** Los servidores que solo anuncian formato de documento completo fallan las peticiones de rango con `LSP_ACTION_UNSUPPORTED`.
|
|
337
|
+
- **El renombrado solo aplica ediciones de texto.** Las operaciones de recurso (crear/borrar/renombrar archivos) en la respuesta de renombrado de un servidor se rechazan con `LSP_ACTION_UNSUPPORTED`, y las ediciones fuera del workspace fallan como `LSP_ACTION_CONFLICT` antes de escribir nada.
|
|
338
|
+
|
|
339
|
+
## Interoperabilidad con otros plugins DSH
|
|
340
|
+
|
|
341
|
+
Verificado contra **DSH `0.2.0-rc.2`** (el runtime para el que se publica este README) y el conjunto de plugins de muchas estrellas sondeado el 2026-10-05.
|
|
342
|
+
|
|
343
|
+
Este plugin **no interfiere** con otros plugins, incluidos los de muchas estrellas ampliamente instalados:
|
|
344
|
+
|
|
345
|
+
- **Sin colisión de nombres de herramienta.** Cada herramienta lleva espacio de nombres; no se registra ningún nombre desnudo que pertenezca a una herramienta incluida o a otro plugin.
|
|
346
|
+
- **Sin colisión de claves de servicio.** No provee ninguna clave de servicio, así que no puede colisionar en una.
|
|
347
|
+
- **Sin colisión de slots.** No registra ninguna clave de slot de cliente, así que no puede competir por un asiento de `shadows-shipped-ui`.
|
|
348
|
+
- **Sin colisión de rutas HTTP.** No registra ningún prefijo `webServer`.
|
|
349
|
+
- **Sin colisión de capa de patch.** El patch del bundle solo `insert`a su propia fila; nunca sobrescribe el `config` de una fila integrada.
|
|
350
|
+
- **Sin mutación global.** No parchea prototipos, no reescribe `process.env` ni reemplaza el dispatcher global de fetch.
|
|
351
|
+
|
|
352
|
+
**Los listeners de eventos compartidos no interfieren por construcción.** Observa el evento sensible al orden `fs/write-intent` con `ctx.on()` — el registro de broadcast de Cordis, donde cada listener se ejecuta y ninguno puede dejar sin turno a otro. **Cada listener de aquí delega por `next()`**, así que la cadena nunca se cortocircuita, y la mutación se aplica al valor que produjo `next()` en lugar de devolverse en su lugar.
|
|
353
|
+
|
|
354
|
+
Evidencia estática: `dsh-plugin-doctor` K10–K13 informan `pass` en todas las comprobaciones de este repositorio.
|
|
355
|
+
|
|
356
|
+
## Compatibilidad
|
|
357
|
+
|
|
358
|
+
| Superficie | Estado |
|
|
359
|
+
|---|---|
|
|
360
|
+
| Harness | DeepSeek Harness `dsh-v0.2.1-alpha.1` (`engines.dsh`: `>=0.2.1-0 <0.3.0 \|\| >=0.2.2-0 <0.3.0`); el plugin no escribe eventos de sesión por su cuenta: el host registra los eventos estándar tool/call + tool/result. El seam publicado aún solo lleva las cuatro operaciones legacy, así que el plugin conserva su propio cliente y registra esa vintage en la primera llamada de acción. Verificado el 2026-09-24 (reglas duales de typecheck + suite completa + puertas self-contained/artifacts). |
|
|
361
|
+
| Node | `^22.19.0 \|\| >=24.9.0` |
|
|
362
|
+
| Plataformas | Todas (host puro; subproceso + sistema de archivos, sin red) |
|
|
363
|
+
| Modelo | Cualquiera (las herramientas son agnósticas al modelo; el plugin nunca llama a un modelo) |
|
|
364
|
+
|
|
365
|
+
## Ecosistema y calidad
|
|
366
|
+
|
|
367
|
+
- [Espejo en Gitee](https://gitee.com/perrylink/dsh-lsp-actions) (espejo sincronizado; GitHub es la referencia)
|
|
368
|
+
- [Página del plugin en dshfind](https://dshfind.com/plugins/PerryLink/dsh-lsp-actions) (instalaciones y ranking)
|
|
369
|
+
- [Informe OpenSSF Scorecard](https://securityscorecards.dev/viewer/?uri=github.com/PerryLink/dsh-lsp-actions) (impulsado por [.github/workflows/scorecard.yml](.github/workflows/scorecard.yml))
|
|
370
|
+
- [Informe de verificación de dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章) (K10–K13 todos `pass`)
|
|
371
|
+
- [DSH Market](https://dsh.market/) (listado)
|
|
372
|
+
- **Canal de la tienda 1024**: `npm i -g dsh1024` una vez y luego `dsh1024 plugin --profile web add dsh-lsp-actions` (cuenta para el ranking de instalaciones de [deepseek1024.com](https://deepseek1024.com))
|
|
373
|
+
- [Base de conocimiento del ecosistema](https://perrylink.github.io/dsh-plugin-guide/): datos medidos, no marketing: guía de desarrollo de plugins · datos de selección de plugins · criterios de mantenimiento
|
|
374
|
+
|
|
375
|
+
## Desarrollo
|
|
376
|
+
|
|
377
|
+
```sh
|
|
378
|
+
pnpm install # node ^22.19 || >=24.9
|
|
379
|
+
pnpm run lint # oxlint sobre src/ y tests/
|
|
380
|
+
pnpm test # vitest: unidad + integración con servidor fixture + e2e del protocolo del editor + e2e real de tsls
|
|
381
|
+
pnpm run test:coverage # puerta de cobertura
|
|
382
|
+
pnpm build # tsc --noEmitOnError && node scripts/fix-dts.mjs → lib/
|
|
383
|
+
pnpm run prepare # build (se ejecuta al instalar)
|
|
384
|
+
pnpm run prepublishOnly # build (se ejecuta antes de publicar)
|
|
385
|
+
pnpm run check:readmes # puerta de consistencia de los README en cinco idiomas
|
|
386
|
+
pnpm run verify:self-contained # los specs de dependencias resuelven desde el registry
|
|
387
|
+
pnpm run verify:artifacts # archivos publicados presentes + artefactos importables
|
|
388
|
+
pnpm run check:lockfile # comprobación de deriva del lockfile
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
Estructura del repositorio:
|
|
392
|
+
|
|
393
|
+
```text
|
|
394
|
+
src/ cuerpo del plugin: servers / client / runner / tools / editor / seam
|
|
395
|
+
tests/ vitest: unidad + servidor fixture + e2e del protocolo del editor + e2e real de tsls
|
|
396
|
+
examples/vscode extensión de VS Code solo UI + el backend headless al que se conecta
|
|
397
|
+
docs/ protocolo del editor (bilingüe) + investigación del seam + assets/
|
|
398
|
+
scripts/ arreglos de artefactos y puertas mecánicas (readme sync / self-contained / artifacts)
|
|
399
|
+
upstream/ propuesta aguas arriba para la extensión del seam (patch + descripción del PR)
|
|
400
|
+
verify/ scripts de humo del backend del editor y composición scratch
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
Las imágenes del README las genera [`scripts/gen-readme-assets.py`](scripts/gen-readme-assets.py) de forma programática (Pillow genera el hero WebP de 1440×576 en cuatro variantes — claro/oscuro × zh/en — y un diagrama SVG de ida y vuelta de 1100×660 escrito a mano) y se pueden volver a ejecutar sin riesgo.
|
|
404
|
+
|
|
405
|
+
Topics: `dsh`, `dsh-plugin`, `deepseek-harness`, `lsp`, `language-server`, `diagnostics`, `formatting`, `completion`, `code-action`, `symbols`, `signature-help`, `inlay-hints`, `rename`, `refactor`, `ide`, `editor`, `vscode`, `acp`, `json-rpc`
|
|
406
|
+
|
|
407
|
+
## Familia y agradecimientos
|
|
408
|
+
|
|
409
|
+
Este proyecto forma parte de la familia de plugins de DeepSeek Harness de [PerryLink](https://github.com/PerryLink) (todos Apache-2.0). Si te resulta útil, **una estrella ayuda a que la siguiente persona lo encuentre**: no desbloquea ninguna función.
|
|
410
|
+
|
|
411
|
+
- [@PerryLink](https://github.com/PerryLink) — creador y mantenedor: el cliente de acciones LSP y el ciclo de vida de los servidores, las ocho herramientas, el protocolo de acciones del editor, los tests, la CI y la documentación en cinco idiomas.
|
|
412
|
+
|
|
413
|
+
<details>
|
|
414
|
+
<summary>Expandir todos los plugins</summary>
|
|
415
|
+
|
|
416
|
+
| Plugin | Estado |
|
|
417
|
+
|---|---|
|
|
418
|
+
| **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** | |
|
|
419
|
+
| **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** | |
|
|
420
|
+
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | |
|
|
421
|
+
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | 🧊 CONGELADO — ver el README del repo |
|
|
422
|
+
| **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** | |
|
|
423
|
+
| **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** | |
|
|
424
|
+
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | 🧊 CONGELADO — ver el README del repo |
|
|
425
|
+
| **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | |
|
|
426
|
+
| **[dsh-click](https://github.com/PerryLink/dsh-click)** | |
|
|
427
|
+
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | |
|
|
428
|
+
| **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** | |
|
|
429
|
+
| **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** | |
|
|
430
|
+
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | 🧊 CONGELADO — ver el README del repo |
|
|
431
|
+
| **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** | |
|
|
432
|
+
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | |
|
|
433
|
+
| **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** | |
|
|
434
|
+
| **[dsh-eia-guide-check](https://github.com/PerryLink/dsh-eia-guide-check)** | |
|
|
435
|
+
| **[dsh-emergency-plan](https://github.com/PerryLink/dsh-emergency-plan)** | |
|
|
436
|
+
| **[dsh-essay-rubric-check](https://github.com/PerryLink/dsh-essay-rubric-check)** | |
|
|
437
|
+
| **[dsh-evidence-check](https://github.com/PerryLink/dsh-evidence-check)** | |
|
|
438
|
+
| **[dsh-export-ctl-check](https://github.com/PerryLink/dsh-export-ctl-check)** | |
|
|
439
|
+
| **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | |
|
|
440
|
+
| **[dsh-fmea-table-check](https://github.com/PerryLink/dsh-fmea-table-check)** | |
|
|
441
|
+
| **[dsh-forecast-penalty](https://github.com/PerryLink/dsh-forecast-penalty)** | |
|
|
442
|
+
| **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | |
|
|
443
|
+
| **[dsh-github](https://github.com/PerryLink/dsh-github)** | |
|
|
444
|
+
| **[dsh-gongwen-flow-check](https://github.com/PerryLink/dsh-gongwen-flow-check)** | |
|
|
445
|
+
| **[dsh-gongwen-word-check](https://github.com/PerryLink/dsh-gongwen-word-check)** | |
|
|
446
|
+
| **[dsh-guard-plan-qc](https://github.com/PerryLink/dsh-guard-plan-qc)** | |
|
|
447
|
+
| **[dsh-hazchem-check](https://github.com/PerryLink/dsh-hazchem-check)** | |
|
|
448
|
+
| **[dsh-hazplan-check](https://github.com/PerryLink/dsh-hazplan-check)** | |
|
|
449
|
+
| **[dsh-hidden-risk-map](https://github.com/PerryLink/dsh-hidden-risk-map)** | |
|
|
450
|
+
| **[dsh-hs-classify](https://github.com/PerryLink/dsh-hs-classify)** | |
|
|
451
|
+
| **[dsh-icd-rule-check](https://github.com/PerryLink/dsh-icd-rule-check)** | |
|
|
452
|
+
| **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | |
|
|
453
|
+
| **[dsh-lawcite-adapter](https://github.com/PerryLink/dsh-lawcite-adapter)** | |
|
|
454
|
+
| **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | |
|
|
455
|
+
| **[dsh-lc-doc-check](https://github.com/PerryLink/dsh-lc-doc-check)** | |
|
|
456
|
+
| **[dsh-learning-gap-check](https://github.com/PerryLink/dsh-learning-gap-check)** | |
|
|
457
|
+
| **[dsh-library](https://github.com/PerryLink/dsh-library)** | |
|
|
458
|
+
| **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | |
|
|
459
|
+
| **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | |
|
|
460
|
+
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | |
|
|
461
|
+
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | |
|
|
462
|
+
| **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** | |
|
|
463
|
+
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | 🧊 CONGELADO — ver el README del repo |
|
|
464
|
+
| **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** | |
|
|
465
|
+
| **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** | |
|
|
466
|
+
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | |
|
|
467
|
+
| **[dsh-origin-rvc-check](https://github.com/PerryLink/dsh-origin-rvc-check)** | |
|
|
468
|
+
| **[dsh-ota-review-check](https://github.com/PerryLink/dsh-ota-review-check)** | |
|
|
469
|
+
| **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | |
|
|
470
|
+
| **[dsh-paper-doc-adapter](https://github.com/PerryLink/dsh-paper-doc-adapter)** | |
|
|
471
|
+
| **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | |
|
|
472
|
+
| **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** | |
|
|
473
|
+
| **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** | |
|
|
474
|
+
| **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** | |
|
|
475
|
+
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | 🚫 RETIRADO (repo archivado) |
|
|
476
|
+
| **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | |
|
|
477
|
+
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | 🚫 RETIRADO (repo archivado) |
|
|
478
|
+
| **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | 🚫 RETIRADO (repo archivado) |
|
|
479
|
+
| **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** | |
|
|
480
|
+
| **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** | |
|
|
481
|
+
| **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** | |
|
|
482
|
+
| **[dsh-ppap-check](https://github.com/PerryLink/dsh-ppap-check)** | |
|
|
483
|
+
| **[dsh-protest-deadline](https://github.com/PerryLink/dsh-protest-deadline)** | |
|
|
484
|
+
| **[dsh-railway-window](https://github.com/PerryLink/dsh-railway-window)** | |
|
|
485
|
+
| **[dsh-repair-order-qc](https://github.com/PerryLink/dsh-repair-order-qc)** | |
|
|
486
|
+
| **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | |
|
|
487
|
+
| **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** | |
|
|
488
|
+
| **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** | |
|
|
489
|
+
| **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** | |
|
|
490
|
+
| **[dsh-score](https://github.com/PerryLink/dsh-score)** | 🧊 CONGELADO — ver el README del repo |
|
|
491
|
+
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | |
|
|
492
|
+
| **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** | |
|
|
493
|
+
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | |
|
|
494
|
+
| **[dsh-soe-decision-check](https://github.com/PerryLink/dsh-soe-decision-check)** | |
|
|
495
|
+
| **[dsh-soilwater-check](https://github.com/PerryLink/dsh-soilwater-check)** | |
|
|
496
|
+
| **[dsh-sop-sync-check](https://github.com/PerryLink/dsh-sop-sync-check)** | |
|
|
497
|
+
| **[dsh-spc-gbt-adapter](https://github.com/PerryLink/dsh-spc-gbt-adapter)** | |
|
|
498
|
+
| **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | |
|
|
499
|
+
| **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** | |
|
|
500
|
+
| **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** | |
|
|
501
|
+
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | |
|
|
502
|
+
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | 🚫 RETIRADO (repo archivado) |
|
|
503
|
+
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | |
|
|
504
|
+
| **[dsh-warranty-calc](https://github.com/PerryLink/dsh-warranty-calc)** | |
|
|
505
|
+
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 CONGELADO — ver el README del repo |
|
|
506
|
+
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 CONGELADO — ver el README del repo |
|
|
507
|
+
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 CONGELADO — ver el README del repo |
|
|
508
|
+
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 CONGELADO — ver el README del repo |
|
|
509
|
+
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 CONGELADO — ver el README del repo |
|
|
510
|
+
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 RETIRADO (repo archivado) |
|
|
511
|
+
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 RETIRADO (repo archivado) |
|
|
512
|
+
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 RETIRADO (repo archivado) |
|
|
513
|
+
|
|
514
|
+
</details>
|
|
515
|
+
|
|
516
|
+
## Licencia
|
|
517
|
+
|
|
518
|
+
[LICENSE](LICENSE) (Apache License 2.0) © 2026 dsh-lsp-actions contributors
|
|
519
|
+
|
|
520
|
+
<p align="center"><sub>Apache-2.0 · Plugin de la comunidad, no afiliado a DeepSeek.</sub></p>
|