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-pt.md
DELETED
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
|
|
3
|
-
# 🛰️ dsh-lsp-actions
|
|
4
|
-
|
|
5
|
-
<img src="icon.svg" width="72" height="72" alt="dsh-lsp-actions icon">
|
|
6
|
-
- **Canal 1024 store**: `npm i -g dsh1024` uma vez, depois `dsh1024 plugin --profile web add dsh-lsp-actions` (conta para o ranking de instalações do [deepseek1024.com](https://deepseek1024.com)).
|
|
7
|
-
|
|
8
|
-
**A superfície de ação LSP para o DeepSeek Harness — servidores de linguagem reais, feedback real e o backend de integração IDE para editores.**
|
|
9
|
-
|
|
10
|
-
*Diagnósticos, formatação, autocompletar, ações de código, símbolos, ajuda de assinatura, dicas embutidas e renomeação para o loop do editor do seu agente — mais o protocolo estável de ações para editores (`lsp.actions.*`) que permite a qualquer editor consumi-los diretamente.*
|
|
11
|
-
|
|
12
|
-
[](LICENSE)
|
|
13
|
-
[](https://gitee.com/perrylink/dsh-lsp-actions)
|
|
14
|
-
[](https://github.com/topics/dsh-plugin)
|
|
15
|
-
[](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
|
|
16
|
-
[](https://dsh.market/)
|
|
17
|
-
[](#)
|
|
18
|
-
[](https://github.com/PerryLink/dsh-lsp-actions/actions)
|
|
19
|
-
[](https://github.com/PerryLink/dsh-lsp-actions/releases)
|
|
20
|
-
[](https://www.npmjs.com/package/dsh-lsp-actions)
|
|
21
|
-
[](https://www.npmjs.com/package/dsh-lsp-actions)
|
|
22
|
-
[](https://dshfind.com/pt/plugins/PerryLink/dsh-lsp-actions?ref=badge)
|
|
23
|
-
|
|
24
|
-
[English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
|
|
25
|
-
|
|
26
|
-
```sh
|
|
27
|
-
dsh plugin --profile <name> add dsh-lsp-actions
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
</div>
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
**📖 Base de conhecimento do ecossistema** — dados medidos, não marketing: [guia de desenvolvimento · dados de seleção · critérios de manutenção](https://perrylink.github.io/dsh-plugin-guide/).
|
|
36
|
-
|
|
37
|
-
<!-- star-cta -->
|
|
38
|
-
## Install & uninstall
|
|
39
|
-
|
|
40
|
-
- **git channel** (`main` mais recente): `dsh plugin --profile web add github:PerryLink/dsh-lsp-actions` — o script `prepare` compila (`tsc --noEmitOnError`).
|
|
41
|
-
- **npm channel** (versões publicadas): `dsh plugin --profile web add dsh-lsp-actions`.
|
|
42
|
-
- **tarball channel**: execute `pnpm pack` neste repo e depois `dsh plugin --profile web add ./dsh-lsp-actions-<version>.tgz`.
|
|
43
|
-
- **uninstall**: `dsh plugin --profile web remove dsh-lsp-actions` (ou remova a linha do patch do perfil).
|
|
44
|
-
|
|
45
|
-
## ⭐ 如果它帮到了你
|
|
46
|
-
|
|
47
|
-
Este plugin faz parte da [família de plugins DSH](https://github.com/PerryLink) (mais de 40, todos Apache-2.0). Se for útil, **deixe uma estrela**: não desbloqueia nada, mas ajuda a próxima pessoa a encontrá-lo.
|
|
48
|
-
|
|
49
|
-
*English:* part of a 95 plugin family for DeepSeek Harness. If it is useful, **a star helps the next person find it** — nothing is gated behind it.
|
|
50
|
-
|
|
51
|
-
## What is dsh-lsp-actions?
|
|
52
|
-
|
|
53
|
-
A superfície de ação LSP para o DeepSeek Harness — servidores de linguagem reais, feedback real e o backend de integração IDE para editores.
|
|
54
|
-
|
|
55
|
-
Diagnósticos, formatação, autocompletar, ações de código, símbolos, ajuda de assinatura, dicas embutidas e renomeação para o loop do editor do seu agente — mais o protocolo estável de ações para editores (`lsp.actions.*`) que permite a qualquer editor consumi-los diretamente.
|
|
56
|
-
|
|
57
|
-

|
|
58
|
-
|
|
59
|
-
*Visão geral do fluxo: chamada → plugin → resultado. Os exemplos abaixo usam a superfície real de comandos.*
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
*A mesma execução, animada.*
|
|
63
|
-
|
|
64
|
-
## Compatibility
|
|
65
|
-
|
|
66
|
-
| Surface | Status |
|
|
67
|
-
|---|---|
|
|
68
|
-
| Harness | DeepSeek Harness `dsh-v0.2.1-alpha.1` (compatibilidade declarada para `>=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0 \|\| >=0.1.6-0 <0.2.0 \|\| >=0.1.7-0 <0.2.0`); o plugin não grava eventos de sessão próprios - o host registra os eventos padrão tool/call + tool/result. O seam publicado ainda tem apenas as quatro operações legacy, então o plugin mantém o próprio cliente e registra esse vintage na primeira chamada de ação. Verificado em 2026-09-24 (typecheck duplo + suíte completa + portas self-contained/artifacts). |
|
|
69
|
-
| Node | `^22.19.0 \|\| >=24.0.0` |
|
|
70
|
-
| Platforms | Todas (host puro; subprocessos + sistema de arquivos, sem rede) |
|
|
71
|
-
| Model | Qualquer (as ferramentas são independentes do modelo; o plugin nunca chama um modelo) |
|
|
72
|
-
|
|
73
|
-
## What you get
|
|
74
|
-
|
|
75
|
-
O `dsh-lsp-actions` é montado como uma única linha de host (`id: lsp-actions`, `name: dsh-lsp-actions`, `inject: [tools, fs, subprocess]`). O seam oficial `ctx.lsp` do DeepSeek Harness cobre a **navegação** (ir para definição, referências, implementação, hover); este plugin completa a **superfície de ação** — o loop de feedback que um agente precisa enquanto escreve e corrige código:
|
|
76
|
-
|
|
77
|
-
1. **Oito ferramentas `lsp_*`** — diagnósticos, formatação, autocompletar, ações de código, símbolos, ajuda de assinatura, dicas embutidas e renomeação, todas servidas pelos mesmos servidores de linguagem que o seu IDE usa.
|
|
78
|
-
2. **Protocolo de ações para editores v1** — uma superfície JSON-RPC estável (`lsp.actions.list` / `lsp.actions.run` / `lsp.events`) que permite a qualquer editor (VS Code primeiro) consumir essas capacidades diretamente.
|
|
79
|
-
3. **Verificação com servidor real** — uma execução real do `typescript-language-server` faz parte da suíte de testes (autocontida, CI em Node 22/24 no Linux, Windows e macOS), não apenas mocks.
|
|
80
|
-
|
|
81
|
-
## Quick start
|
|
82
|
-
|
|
83
|
-
```sh
|
|
84
|
-
dsh plugin --profile web add github:PerryLink/dsh-lsp-actions
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
```sh
|
|
88
|
-
# 1. install the bundle into your profile
|
|
89
|
-
dsh plugin --profile web add github:PerryLink/dsh-lsp-actions
|
|
90
|
-
|
|
91
|
-
# or from npm (published releases)
|
|
92
|
-
dsh plugin --profile web add dsh-lsp-actions
|
|
93
|
-
|
|
94
|
-
# 2. restart and verify the row
|
|
95
|
-
dsh --profile web --dump-config | grep -A3 'id: lsp-actions'
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Exemplos
|
|
99
|
-
|
|
100
|
-
São os pontos de entrada reais; instale e chame um.
|
|
101
|
-
|
|
102
|
-
#### Exemplo detalhado
|
|
103
|
-
|
|
104
|
-
**Comando**
|
|
105
|
-
|
|
106
|
-
~~~sh
|
|
107
|
-
lsp_diagnostics
|
|
108
|
-
~~~
|
|
109
|
-
|
|
110
|
-
**Entrada**
|
|
111
|
-
|
|
112
|
-
~~~json
|
|
113
|
-
{
|
|
114
|
-
"file_path": "a.ts"
|
|
115
|
-
}
|
|
116
|
-
~~~
|
|
117
|
-
|
|
118
|
-
**Saída**
|
|
119
|
-
|
|
120
|
-
~~~text
|
|
121
|
-
a.ts:1:3 [Error] boom [ts 2304]
|
|
122
|
-
a.ts:3:1 [Hint] hint
|
|
123
|
-
~~~
|
|
124
|
-
|
|
125
|
-
*Observado em `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`*
|
|
126
|
-
|
|
127
|
-
#### Ramo de falha
|
|
128
|
-
|
|
129
|
-
**Entrada**
|
|
130
|
-
|
|
131
|
-
~~~text
|
|
132
|
-
{"action":"format","requestId":"f1","params":{"filePath":"a.ts","workspaceRoot":"<session-workspace>"}} under a read-only permission preset
|
|
133
|
-
~~~
|
|
134
|
-
|
|
135
|
-
**Saída**
|
|
136
|
-
|
|
137
|
-
~~~text
|
|
138
|
-
{
|
|
139
|
-
"requestId": "f1",
|
|
140
|
-
"action": "format",
|
|
141
|
-
"status": "failed",
|
|
142
|
-
"error": {
|
|
143
|
-
"code": "LSP_ACTION_READ_ONLY",
|
|
144
|
-
"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]"
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
~~~
|
|
148
|
-
|
|
149
|
-
*Observado em `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`*
|
|
150
|
-
|
|
151
|
-
#### Exemplos breves
|
|
152
|
-
|
|
153
|
-
- `lsp_format`
|
|
154
|
-
- `lsp_completion`
|
|
155
|
-
|
|
156
|
-
## Configuration
|
|
157
|
-
|
|
158
|
-
Todos os ajustes são campos Schemastery `Config` (alteráveis pelo cordis.yml). Uma sobrescrita direcionada por id substitui a linha inteira — repita cada chave de que precisar. O `cordis.patch.yml` documenta cada chave em linha.
|
|
159
|
-
|
|
160
|
-
| Key | Default | Meaning |
|
|
161
|
-
|---|---|---|
|
|
162
|
-
| `servers` | `{}` | Servidores de linguagem nomeados; uma tabela vazia não ativa nenhum servidor |
|
|
163
|
-
| `editor.enabled` | `false` | Serve o protocolo de ações para editores por JSON-RPC stdio (somente backend headless) |
|
|
164
|
-
| `editor.requestTimeoutMs` | `60000` | Orçamento de timeout por execução (ms) do protocolo de editor |
|
|
165
|
-
| `editor.diagnosticsCacheMaxFiles` | `64` | Tamanho da cache LRU de diagnósticos (em arquivos) |
|
|
166
|
-
| `maxDiagnostics` | `200` | Teto de diagnósticos por resultado |
|
|
167
|
-
| `maxCompletionItems` | `20` | Teto de itens de autocompletar por resultado |
|
|
168
|
-
| `maxCodeActions` | `50` | Teto de ações de código por resultado |
|
|
169
|
-
| `maxSymbols` | `100` | Teto de resultados de símbolos |
|
|
170
|
-
| `maxSignatures` | `10` | Teto de ajuda de assinatura |
|
|
171
|
-
| `maxInlayHints` | `200` | Teto de dicas embutidas |
|
|
172
|
-
| `maxResultChars` | `16000` | Teto do resultado renderizado (caracteres) |
|
|
173
|
-
| `maxDocumentBytes` | `4000000` | Teto de leitura de documento (bytes) |
|
|
174
|
-
| `timeoutMs` | `60000` | Timeout por chamada, aplicado pela política oficial de timeout |
|
|
175
|
-
|
|
176
|
-
Cada entrada de `servers` é um `LspServerEntry`: `command` (executável resolvido no PATH no carregamento) e `extensionToLanguage` (`".ts"` → `typescript`) são obrigatórios; os opcionais `fileGlobs`, `projectMarkers`, `args`, `env`, `initializationOptions`, `configuration`, `formattingOptions`, `maxMessageBytes`, `maxStderrBytes`, `killGraceMs`, `shutdownTimeoutMs`, `diagnosticsSettleMs`, `diagnosticsDebounceMs` e `idleTimeoutMs` (`0` = manter vivo o processo do servidor) ajustam o cliente stdio integrado.
|
|
177
|
-
|
|
178
|
-
O roteamento é determinístico e guiado pela configuração. Cada arquivo usa a primeira correspondência de: **(1)** uma entrada de `servers` cujos `fileGlobs` correspondam ao caminho; **(2)** o diretório ancestral mais próximo — subindo até a raiz do workspace — que contenha um arquivo de configuração de projeto declarado nos `projectMarkers` de alguma entrada, avaliado apenas entre as entradas que também mapeiam a extensão do arquivo; **(3)** a entrada cujo `extensionToLanguage` mapeia a extensão do arquivo, na ordem de configuração. Assim, um workspace com `apps/node-app/{package.json,tsconfig.json,src/main.ts}` e `apps/deno-app/{deno.json,src/main.ts}` serve cada `main.ts` com o servidor do seu próprio projeto: sem regras de caminho para manter e sem mudanças ao adicionar, renomear ou mover um projeto:
|
|
179
|
-
|
|
180
|
-
```yaml
|
|
181
|
-
servers:
|
|
182
|
-
typescript:
|
|
183
|
-
command: typescript-language-server
|
|
184
|
-
args: ["--stdio"]
|
|
185
|
-
extensionToLanguage: { ".ts": typescript, ".tsx": typescriptreact }
|
|
186
|
-
projectMarkers: ["package.json", "tsconfig.json"]
|
|
187
|
-
deno:
|
|
188
|
-
command: deno
|
|
189
|
-
args: ["lsp"]
|
|
190
|
-
extensionToLanguage: { ".ts": typescript, ".tsx": typescriptreact }
|
|
191
|
-
projectMarkers: ["deno.json", "deno.jsonc"]
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
Um marcador de projeto só decide entre servidores que já mapeiam a extensão do arquivo (nunca amplia os tipos de arquivo de uma entrada); a busca nunca sai da raiz do workspace, e a configuração de projeto de um diretório nunca se aplica a um diretório irmão. O passo **(1)** tem prioridade sobre um marcador de projeto: se os `fileGlobs` de uma entrada correspondem ao caminho, ela continua vencendo, então remova os globs de nível de projeto ao adotar `projectMarkers`; um glob `**/*.ts` remanescente continuará reivindicando esses arquivos. Estas regras regem o cliente stdio integrado; um provider do seam `ctx.lsp` montado decide seu próprio roteamento.
|
|
195
|
-
|
|
196
|
-
## Tools & surfaces
|
|
197
|
-
|
|
198
|
-
| Surface | Kind | Notes |
|
|
199
|
-
|---|---|---|
|
|
200
|
-
| `lsp_diagnostics` | tool | `<file>` — erros, avisos e dicas do compilador/analisador com severidade, intervalo, mensagem e servidor de origem (somente leitura) |
|
|
201
|
-
| `lsp_format` | tool | `<file> [range?]` — formata um arquivo/seleção pelo servidor de linguagem e o aplica, devolvendo o diff (grava via `fs/write-intent`) |
|
|
202
|
-
| `lsp_completion` | tool | `<file> <line> <character>` — sugestões de autocompletar em uma posição do cursor, incluindo o texto de inserção (somente leitura) |
|
|
203
|
-
| `lsp_code_action` | tool | `<file> [range?] [only?]` — correções/refatorações verificadas pelo servidor com suas edições, para um intervalo ou o primeiro diagnóstico (somente referência) |
|
|
204
|
-
| `lsp_symbols` | tool | `<query?> <file_path?>` — busca de símbolos por nome em todo o workspace, ou o esboço de um arquivo (somente leitura) |
|
|
205
|
-
| `lsp_signature` | tool | `<file> <line> <character>` — ajuda de assinatura (parâmetros e documentação) dentro de uma chamada (somente leitura) |
|
|
206
|
-
| `lsp_inlay_hints` | tool | `<file> [range?]` — anotações de tipo e dicas de nomes de parâmetros do servidor (somente leitura) |
|
|
207
|
-
| `lsp_rename` | tool | `<file> <line> <character> <new_name>` — renomeação verificada pelo servidor, aplicada em todo o workspace com diffs por arquivo (grava via `fs/write-intent`) |
|
|
208
|
-
| `lsp.actions.*` | protocol | Protocolo de ações para editores v1: `lsp.actions.list` / `lsp.actions.run` / `lsp.events` por JSON-RPC |
|
|
209
|
-
| `examples/vscode/` | extension | Extensão VS Code somente-UI mais a composição de backend headless à qual se conecta |
|
|
210
|
-
|
|
211
|
-
## Editor action protocol v1
|
|
212
|
-
|
|
213
|
-
Quando `editor.enabled: true` é definido em uma composição headless dedicada, o `dsh-lsp-actions` serve um protocolo de editor estável por JSON-RPC 2.0 delimitado por quebras de linha (o mesmo enquadramento de wire dos transportes oficiais SDK/ACP):
|
|
214
|
-
|
|
215
|
-
| Method | What it does |
|
|
216
|
-
|---|---|
|
|
217
|
-
| `lsp.actions.list` | Devolve a versão de protocolo `lsp-actions/v1`, o catálogo de ações (`diagnostics.get`, `completion.get`, `quickfix.apply`, `format` — cada uma marcada `writes`) e as sessões DSH endereçáveis |
|
|
218
|
-
| `lsp.actions.run` | Executa uma ação com um envelope estruturado `{ requestId, action, status, result \| error }`; os erros carregam os códigos estáveis `LSP_ACTION_*` |
|
|
219
|
-
| `lsp.events` | Assina as notificações `lsp.event` transmitidas: `diagnostics.updated`, `action.status`, `file.changed`, `sessions.changed` |
|
|
220
|
-
|
|
221
|
-
Todas as ações de escrita (`quickfix.apply`, `format`) passam pelos **presets de permissão oficiais e pela aprovação**: uma sessão `read-only` é recusada com `LSP_ACTION_READ_ONLY` antes de qualquer ida e volta com o servidor, as edições viajam pelo waterfall `fs/write-intent` e o par de escalada `sandbox_permissions` + `justification` se resolve pelo `approveEscalation` oficial (fail-closed quando ninguém pode decidir). Especificação de wire completa, bilíngue: [`docs/editor-protocol.md`](docs/editor-protocol.md) · [`docs/editor-protocol.zh-CN.md`](docs/editor-protocol.zh-CN.md).
|
|
222
|
-
|
|
223
|
-
**Versionamento e a promessa de compatibilidade retroativa**
|
|
224
|
-
|
|
225
|
-
- O protocolo é versionado — `lsp.actions.list` devolve `protocol: "lsp-actions/v1"`, `version: 1`. **O v1 está congelado:** nomes de campos, ids de ação, tipos de evento e códigos de erro permanecem estáveis para sempre.
|
|
226
|
-
- A evolução é **apenas aditiva**: novas ações, campos e tipos de evento chegam sem subir a versão; a semântica existente nunca muda no lugar; uma mudança que quebra compatibilidade é publicada sob uma nova versão de `protocol`, que os servidores podem servir lado a lado.
|
|
227
|
-
- Os clientes devem ignorar campos, tipos de evento e ações desconhecidos, e rotear pelo `code` de erro estável, nunca pelo texto da mensagem.
|
|
228
|
-
|
|
229
|
-
**Códigos de erro**
|
|
230
|
-
|
|
231
|
-
Cada falha carrega um `code` estável; modelos e chamadores roteiam pelo código, nunca pelo texto da mensagem.
|
|
232
|
-
|
|
233
|
-
| Code | Meaning |
|
|
234
|
-
|---|---|
|
|
235
|
-
| `LSP_ACTION_UNAVAILABLE` | Nenhuma entrada de servidor nem provider do seam trata este arquivo |
|
|
236
|
-
| `LSP_ACTION_UNSUPPORTED` | O servidor (ou o provider do seam) não anuncia a operação |
|
|
237
|
-
| `LSP_ACTION_SERVER_FAILED` | O servidor falhou (com o final do seu stderr); falhas de inicialização tentam de novo uma vez |
|
|
238
|
-
| `LSP_ACTION_MALFORMED_RESPONSE` | O servidor enviou uma carga estruturalmente inválida |
|
|
239
|
-
| `LSP_ACTION_CONFLICT` | O arquivo mudou desde que foi lido, ou as edições se sobrepõem / saem dos limites / saem do workspace |
|
|
240
|
-
| `LSP_ACTION_READ_ONLY` | O modo sandbox da sessão proíbe a escrita da formatação/renomeação |
|
|
241
|
-
| `LSP_ACTION_WORKSPACE_REQUIRED` | A sessão chamadora não tem um cwd de workspace para enraizar o servidor |
|
|
242
|
-
| `LSP_ACTION_NO_SYMBOL` | O servidor não encontrou um símbolo renomeável na posição do cursor |
|
|
243
|
-
| `LSP_ACTION_UNKNOWN` | Protocolo de editor: id de ação desconhecido, ou nenhuma ação de código coincidiu com `title`/`index` |
|
|
244
|
-
| `LSP_ACTION_INVALID_ARGS` | Protocolo de editor: parâmetros de ação mal formados |
|
|
245
|
-
| `LSP_ACTION_APPROVAL_UNAVAILABLE` | Protocolo de editor: a rota de aprovação não pôde conceder um modo sandbox mais amplo (fail-closed) |
|
|
246
|
-
| `LSP_PROTOCOL_VERSION_UNSUPPORTED` | Protocolo de editor: a versão de protocolo declarada não é suportada |
|
|
247
|
-
|
|
248
|
-
## VS Code extension
|
|
249
|
-
|
|
250
|
-
[`examples/vscode/`](examples/vscode/) inclui uma extensão **somente-UI** (barra lateral com as sessões DSH, a lista de diagnósticos, aplicar quickfix com um clique, abrir no intervalo e formatar) mais a composição de backend headless (`backend/cordis.yml`) à qual se conecta por JSON-RPC estilo ACP. A extensão implementa zero lógica LSP — cada capacidade e cada byte escrito pertencem ao plugin. Os passos de instalação, ajustes e o script de gravação do gif de demonstração estão em [`examples/vscode/README.md`](examples/vscode/README.md).
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
## Permissions & data
|
|
254
|
-
|
|
255
|
-
- **Permissões**: a formatação e a renomeação viajam pelos presets de permissão oficiais e pela aprovação — o waterfall `fs/write-intent` e o par de escalada `sandbox_permissions` / `justification` resolvido por `ctx.approval`. O plugin declara `fs:read`, `fs:write`, `subprocess:spawn` e `network:none` em seu manifesto de workshop.
|
|
256
|
-
- **Dados**: nada é armazenado em disco; os resultados das ferramentas vivem apenas no log da sessão (sem persistência entre sessões). O protocolo de editor mantém uma única cache LRU de diagnósticos em memória, limitada, com selo de frescor e nunca persistida entre reinícios.
|
|
257
|
-
- **Sem rede**: o plugin não faz requisições de rede; ele fala com os servidores de linguagem por stdio de subprocessos locais.
|
|
258
|
-
|
|
259
|
-
## Security boundaries
|
|
260
|
-
|
|
261
|
-
- **Somente leitura por padrão.** Seis das oito ferramentas são apenas de referência; somente `lsp_format` e `lsp_rename` mutam, e o fazem como mutações reais de `write`/`edit`.
|
|
262
|
-
- **Seams oficiais, não reimplementados.** Cada byte passa pelo waterfall `fs/write-intent` (observação → escrita protegida → observação) e pela política sandbox de cada chamada; a escalada acompanha as ferramentas oficiais `write`/`edit`.
|
|
263
|
-
- **Falha em alto e bom som, rápido e estruturado.** `servers` vazio + sem seam `ctx.lsp` → `LSP_ACTION_UNAVAILABLE`; sessões somente leitura → `LSP_ACTION_READ_ONLY` antes de qualquer ida e volta com o servidor; formas de comando são reportadas e nunca executadas.
|
|
264
|
-
- **Conflitos nunca sobrescrevem.** Um arquivo mudado em disco após a leitura falha com `LSP_ACTION_CONFLICT`; o `lsp_rename` faz o pré-voo de cada arquivo editado antes da primeira escrita.
|
|
265
|
-
- **Trabalho limitado.** Os tetos de resultados, os tetos de bytes e a política de timeout da plataforma limitam cada chamada; a cache de diagnósticos é uma LRU limitada.
|
|
266
|
-
- **Nada é cacheado no caminho do modelo.** Os resultados das ferramentas vivem apenas no log da sessão; a cache de diagnósticos nunca persiste entre reinícios.
|
|
267
|
-
- **Servidores ruins falham em alto e bom som.** Um executável inexistente falha no carregamento; um servidor que morre na inicialização falha a chamada com `LSP_ACTION_SERVER_FAILED` mais o final do seu stderr (após uma nova tentativa com processo novo).
|
|
268
|
-
- **Higiene do prompt.** O plugin não injeta persona nem prosa de prompt no system prompt da sessão — sua superfície de cara ao modelo são os oito esquemas de ferramentas.
|
|
269
|
-
|
|
270
|
-
## Architecture
|
|
271
|
-
|
|
272
|
-
As ações vão **primeiro pelo seam oficial** e caem para o cliente stdio mínimo do próprio plugin:
|
|
273
|
-
|
|
274
|
-
```text
|
|
275
|
-
lsp_diagnostics / lsp_format / lsp_completion / lsp_code_action /
|
|
276
|
-
lsp_symbols / lsp_signature / lsp_inlay_hints / lsp_rename
|
|
277
|
-
│
|
|
278
|
-
▼
|
|
279
|
-
ctx.lsp seam (estendido: diagnostics / formatDocument / completion)
|
|
280
|
-
│ ausente · legado · sem provider para este arquivo
|
|
281
|
-
▼
|
|
282
|
-
cliente stdio integrado ← tabela servers (ctx.subprocess.spawn + JSON-RPC)
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
A extensão do seam está proposta upstream (`upstream/lsp-action-seam.patch`, descrição do PR em `upstream/PR-description.md`). Quando for integrada, o plugin continua funcionando sem mudanças — o cliente integrado simplesmente deixa de ser usado. O cliente integrado permanece como fallback independente para a tabela `servers`. O **protocolo de editor** usa o mesmo runner, o mesmo caminho de escrita e a mesma maquinaria de permissões. Notas completas de pesquisa e design: [`docs/seam-extension-notes.md`](docs/seam-extension-notes.md).
|
|
286
|
-
|
|
287
|
-
## Known limitations
|
|
288
|
-
|
|
289
|
-
- **Documentos transitórios.** Cada ação abre o arquivo, executa uma requisição e o fecha de novo (igual ao host stdio oficial). Servidores baseados em projeto que exigem um arquivo aberto residente para requisições sem documento (o tsls recusa `workspace/symbol` sem um) são atendidos passando `file_path` para `lsp_symbols`. O tsls também responde `textDocument/signatureHelp` com `null` sob esse ciclo de vida; outros servidores (gopls, pyright, rust-analyzer) o atendem normalmente.
|
|
290
|
-
- **A formatação de intervalo exige o provider de intervalo do servidor.** Servidores que só anunciam formatação de documento completo falham requisições de intervalo com `LSP_ACTION_UNSUPPORTED`.
|
|
291
|
-
- **A renomeação aplica apenas edições de texto.** Operações de recursos (criar/excluir/renomear arquivos) na resposta de renomeação do servidor são recusadas com `LSP_ACTION_UNSUPPORTED`, e edições fora do workspace falham como `LSP_ACTION_CONFLICT` antes de qualquer escrita.
|
|
292
|
-
|
|
293
|
-
## Development
|
|
294
|
-
|
|
295
|
-
```sh
|
|
296
|
-
pnpm install # node ^22.19 || >=24
|
|
297
|
-
pnpm run lint # oxlint over src/ and tests/
|
|
298
|
-
pnpm test # vitest: unit + fixture-server integration + editor-protocol e2e + real tsls e2e
|
|
299
|
-
pnpm run test:coverage # coverage gate
|
|
300
|
-
pnpm build # tsc --noEmitOnError → lib/
|
|
301
|
-
pnpm run prepare # tsc --noEmitOnError (runs on install)
|
|
302
|
-
pnpm run prepublishOnly # tsc --noEmitOnError (runs before publish)
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
## Interoperability with other DSH plugins
|
|
306
|
-
|
|
307
|
-
Verificado contra **DSH `0.2.0-rc.2`** (o runtime para o qual este README é publicado) e o conjunto de plugins com mais estrelas pesquisado em 2026-10-05.
|
|
308
|
-
|
|
309
|
-
Este plugin **não interfere** em outros plugins, incluindo os de mais estrelas:
|
|
310
|
-
|
|
311
|
-
- **Sem colisão de nome de ferramenta.** Todas as ferramentas têm namespace; nenhuma ocupa um nome puro já pertencente a uma ferramenta embutida ou a outro plugin.
|
|
312
|
-
- **Sem colisão de chave de serviço.** Não fornece nenhuma chave de serviço, portanto não pode colidir em uma.
|
|
313
|
-
- **Sem colisão de slot.** Não registra nenhuma chave de slot de cliente, então não disputa um assento `shadows-shipped-ui`.
|
|
314
|
-
- **Sem colisão de rota HTTP.** Não registra nenhum prefixo `webServer`.
|
|
315
|
-
- **Sem colisão na camada de patch.** O patch do bundle apenas faz `insert` da própria linha; nunca sobrescreve o `config` de uma linha embutida.
|
|
316
|
-
- **Sem mutação global.** Não altera protótipos, não reescreve `process.env` nem substitui o dispatcher global de fetch.
|
|
317
|
-
|
|
318
|
-
**Listeners de eventos compartilhados não interferem por construção.** Observa os eventos sensíveis à ordem `fs/write-intent` com `ctx.on()` — o registro de difusão do Cordis, onde cada listener executa e nenhum pode privar outro do turno. **Todos os listeners aqui delegam via `next()`**, então a cadeia nunca é curto-circuitada:
|
|
319
|
-
|
|
320
|
-
Evidência estática: `dsh-plugin-doctor` K10–K13 retornam `pass` em todas as verificações deste repositório.
|
|
321
|
-
|
|
322
|
-
## Topics
|
|
323
|
-
|
|
324
|
-
`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`
|
|
325
|
-
|
|
326
|
-
## Contributors
|
|
327
|
-
|
|
328
|
-
- [@PerryLink](https://github.com/PerryLink) — criador e mantenedor: o cliente de ações LSP e o ciclo de vida do servidor, as oito ferramentas, o protocolo de ações para editores, os testes, a CI e a documentação em cinco idiomas.
|
|
329
|
-
|
|
330
|
-
## PerryLink DSH Plugin Family
|
|
331
|
-
|
|
332
|
-
Este projeto faz parte da família de plugins do DeepSeek Harness da [PerryLink](https://github.com/PerryLink). O registro fica recolhido abaixo para que cada README mantenha uma primeira tela curta; expanda para ver cada linha e seu status.
|
|
333
|
-
|
|
334
|
-
<details>
|
|
335
|
-
<summary>Expandir todos os plugins</summary>
|
|
336
|
-
|
|
337
|
-
| Plugin | Status |
|
|
338
|
-
|---|---|
|
|
339
|
-
| **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** | |
|
|
340
|
-
| **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** | |
|
|
341
|
-
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | |
|
|
342
|
-
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | |
|
|
343
|
-
| **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** | |
|
|
344
|
-
| **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** | |
|
|
345
|
-
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | |
|
|
346
|
-
| **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | |
|
|
347
|
-
| **[dsh-click](https://github.com/PerryLink/dsh-click)** | |
|
|
348
|
-
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | |
|
|
349
|
-
| **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** | |
|
|
350
|
-
| **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** | |
|
|
351
|
-
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | |
|
|
352
|
-
| **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** | |
|
|
353
|
-
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | |
|
|
354
|
-
| **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** | |
|
|
355
|
-
| **[dsh-eia-guide-check](https://github.com/PerryLink/dsh-eia-guide-check)** | |
|
|
356
|
-
| **[dsh-emergency-plan](https://github.com/PerryLink/dsh-emergency-plan)** | |
|
|
357
|
-
| **[dsh-essay-rubric-check](https://github.com/PerryLink/dsh-essay-rubric-check)** | |
|
|
358
|
-
| **[dsh-evidence-check](https://github.com/PerryLink/dsh-evidence-check)** | |
|
|
359
|
-
| **[dsh-export-ctl-check](https://github.com/PerryLink/dsh-export-ctl-check)** | |
|
|
360
|
-
| **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | |
|
|
361
|
-
| **[dsh-fmea-table-check](https://github.com/PerryLink/dsh-fmea-table-check)** | |
|
|
362
|
-
| **[dsh-forecast-penalty](https://github.com/PerryLink/dsh-forecast-penalty)** | |
|
|
363
|
-
| **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | |
|
|
364
|
-
| **[dsh-github](https://github.com/PerryLink/dsh-github)** | |
|
|
365
|
-
| **[dsh-gongwen-flow-check](https://github.com/PerryLink/dsh-gongwen-flow-check)** | |
|
|
366
|
-
| **[dsh-gongwen-word-check](https://github.com/PerryLink/dsh-gongwen-word-check)** | |
|
|
367
|
-
| **[dsh-guard-plan-qc](https://github.com/PerryLink/dsh-guard-plan-qc)** | |
|
|
368
|
-
| **[dsh-hazchem-check](https://github.com/PerryLink/dsh-hazchem-check)** | |
|
|
369
|
-
| **[dsh-hazplan-check](https://github.com/PerryLink/dsh-hazplan-check)** | |
|
|
370
|
-
| **[dsh-hidden-risk-map](https://github.com/PerryLink/dsh-hidden-risk-map)** | |
|
|
371
|
-
| **[dsh-hs-classify](https://github.com/PerryLink/dsh-hs-classify)** | |
|
|
372
|
-
| **[dsh-icd-rule-check](https://github.com/PerryLink/dsh-icd-rule-check)** | |
|
|
373
|
-
| **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | |
|
|
374
|
-
| **[dsh-lawcite-adapter](https://github.com/PerryLink/dsh-lawcite-adapter)** | |
|
|
375
|
-
| **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | |
|
|
376
|
-
| **[dsh-lc-doc-check](https://github.com/PerryLink/dsh-lc-doc-check)** | |
|
|
377
|
-
| **[dsh-learning-gap-check](https://github.com/PerryLink/dsh-learning-gap-check)** | |
|
|
378
|
-
| **[dsh-library](https://github.com/PerryLink/dsh-library)** | |
|
|
379
|
-
| **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | |
|
|
380
|
-
| **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | |
|
|
381
|
-
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | |
|
|
382
|
-
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | |
|
|
383
|
-
| **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** | |
|
|
384
|
-
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | |
|
|
385
|
-
| **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** | |
|
|
386
|
-
| **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** | |
|
|
387
|
-
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | |
|
|
388
|
-
| **[dsh-origin-rvc-check](https://github.com/PerryLink/dsh-origin-rvc-check)** | |
|
|
389
|
-
| **[dsh-ota-review-check](https://github.com/PerryLink/dsh-ota-review-check)** | |
|
|
390
|
-
| **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | |
|
|
391
|
-
| **[dsh-paper-doc-adapter](https://github.com/PerryLink/dsh-paper-doc-adapter)** | |
|
|
392
|
-
| **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | |
|
|
393
|
-
| **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** | |
|
|
394
|
-
| **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** | |
|
|
395
|
-
| **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** | |
|
|
396
|
-
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | |
|
|
397
|
-
| **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | |
|
|
398
|
-
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | |
|
|
399
|
-
| **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | |
|
|
400
|
-
| **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** | |
|
|
401
|
-
| **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** | |
|
|
402
|
-
| **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** | |
|
|
403
|
-
| **[dsh-ppap-check](https://github.com/PerryLink/dsh-ppap-check)** | |
|
|
404
|
-
| **[dsh-protest-deadline](https://github.com/PerryLink/dsh-protest-deadline)** | |
|
|
405
|
-
| **[dsh-railway-window](https://github.com/PerryLink/dsh-railway-window)** | |
|
|
406
|
-
| **[dsh-repair-order-qc](https://github.com/PerryLink/dsh-repair-order-qc)** | |
|
|
407
|
-
| **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | |
|
|
408
|
-
| **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** | |
|
|
409
|
-
| **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** | |
|
|
410
|
-
| **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** | |
|
|
411
|
-
| **[dsh-score](https://github.com/PerryLink/dsh-score)** | |
|
|
412
|
-
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | |
|
|
413
|
-
| **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** | |
|
|
414
|
-
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | |
|
|
415
|
-
| **[dsh-soe-decision-check](https://github.com/PerryLink/dsh-soe-decision-check)** | |
|
|
416
|
-
| **[dsh-soilwater-check](https://github.com/PerryLink/dsh-soilwater-check)** | |
|
|
417
|
-
| **[dsh-sop-sync-check](https://github.com/PerryLink/dsh-sop-sync-check)** | |
|
|
418
|
-
| **[dsh-spc-gbt-adapter](https://github.com/PerryLink/dsh-spc-gbt-adapter)** | |
|
|
419
|
-
| **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | |
|
|
420
|
-
| **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** | |
|
|
421
|
-
| **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** | |
|
|
422
|
-
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | |
|
|
423
|
-
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | |
|
|
424
|
-
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | |
|
|
425
|
-
| **[dsh-warranty-calc](https://github.com/PerryLink/dsh-warranty-calc)** | |
|
|
426
|
-
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 CONGELADO — ver o README do repositório |
|
|
427
|
-
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 CONGELADO — ver o README do repositório |
|
|
428
|
-
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 CONGELADO — ver o README do repositório |
|
|
429
|
-
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 CONGELADO — ver o README do repositório |
|
|
430
|
-
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 CONGELADO — ver o README do repositório |
|
|
431
|
-
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 RETIRADO — ver o README do repositório |
|
|
432
|
-
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 RETIRADO — ver o README do repositório |
|
|
433
|
-
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 RETIRADO — ver o README do repositório |
|
|
434
|
-
|
|
435
|
-
</details>
|
|
436
|
-
|
|
437
|
-
- [Privacidade](PRIVACY.md)
|
|
438
|
-
|
|
439
|
-
## License
|
|
440
|
-
|
|
441
|
-
[Apache License 2.0](LICENSE) © 2026 dsh-lsp-actions contributors
|
|
442
|
-
|
|
443
|
-
### Instalar a partir do mercado do DSH Desktop
|
|
444
|
-
|
|
445
|
-
Todos os plugins PerryLink podem ser explorados no mercado integrado do DSH Desktop: **Market → Sources → add source → colar** `https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json` **→ selecionar**. A instalação continua passando pela verificação de identidade npm do mercado e pela sua confirmação.
|