dsh-plugin-upgrade 0.1.3 → 2.0.1

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/README-pt.md ADDED
@@ -0,0 +1,241 @@
1
+ <div align="center">
2
+
3
+ # ⬆️ dsh-plugin-upgrade
4
+ - **Canal da loja 1024**: rode `npm i -g dsh1024` uma vez e depois `dsh1024 plugin --profile web add dsh-plugin-upgrade` (conta para o ranking de instalações do [deepseek1024.com](https://deepseek1024.com)).
5
+ [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-plugin-upgrade)
6
+
7
+ **Habilidade de atualização de plugins para o DeepSeek Harness, com versão travada e fundida — `0.1.3-alpha.1` → `0.1.5-rc.1`, carregada em duas pernas fechadas.**
8
+
9
+ *Perna A `0.1.3-alpha.1` → `0.1.5-alpha.1`, perna B `0.1.5-alpha.1` → `0.1.5-rc.1`: um cartão de corredor mais um scanner de costuras sem dependências sobre o catálogo fundido de 20 costuras, para que uma metade de cliente que parou de montar em silêncio nunca seja confundida com «typecheck verde».*
10
+
11
+ > **Repositório oficial.** Este é o único repositório oficial de dsh-plugin-upgrade, mantido pela PerryLink. Ele substitui os dois pacotes com versão travada `dsh-plugin-upgrade` (perna A) e `dsh-plugin-upgrade-rc1` (perna B). Repositórios com o mesmo nome em outras contas não são afiliados.
12
+
13
+ [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
14
+ [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
15
+ [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-plugin-upgrade.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
16
+ [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
17
+ [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-plugin-upgrade/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-plugin-upgrade/actions)
18
+ [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-plugin-upgrade?label=version)](https://github.com/PerryLink/dsh-plugin-upgrade/releases)
19
+ [![npm version](https://img.shields.io/npm/v/dsh-plugin-upgrade)](https://www.npmjs.com/package/dsh-plugin-upgrade)
20
+ [![npm downloads](https://img.shields.io/npm/dm/dsh-plugin-upgrade)](https://www.npmjs.com/package/dsh-plugin-upgrade)
21
+
22
+ [English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
23
+
24
+ </div>
25
+
26
+ ---
27
+
28
+ ## Compatibilidade
29
+
30
+ | Superfície | Estado |
31
+ |---|---|
32
+ | Harness | DeepSeek Harness `0.1.5-rc.1` (tag `dsh-v0.1.5-rc.1` = `183f08e9c6dd`; passagem da perna A→B `dsh-v0.1.5-alpha.1` = `5dda764ed3aa`; início do corredor `0.1.3-alpha.1`). Faixa de peers `@deepseek-ai/dsh-skill >=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0`, `@deepseek-ai/cordis ^4.0.2`, `@deepseek-ai/schemastery ^3.18.2`. |
33
+ | Node | `^22.19.0 \|\| >=24.0.0` |
34
+ | Plataformas | Onde o Node rodar; o scanner só usa o sistema de arquivos e é neutro em relação à plataforma |
35
+ | Modelo | Modelos somente texto totalmente suportados; a habilidade é um Markdown, sem exigência de ferramentas ou visão |
36
+ | Escopo | **Duas pernas fechadas, um único intervalo**: perna A `0.1.3-alpha.1` → `0.1.5-alpha.1` mais perna B `0.1.5-alpha.1` → `0.1.5-rc.1`. Um corredor nunca se alarga: um salto depois de `0.1.5-rc.1` é um novo pacote. |
37
+ | Pernas | As duas pernas vivem neste pacote: a perna A mantém as costuras `S1`–`S10` + `M1`, a perna B mantém `C1`, `C2`, `C4`, `C5`, `H1`–`H4`, `P1` — cada uma com suas próprias evidências, seção de cartão, fixtures e caminho de rollback. Não há pacote irmão a instalar. |
38
+ | `C3` | Aposentada: o cartão da perna B chamava de `C3` o verde falso da linha de tipos desatualizada, que é o mesmo defeito da `M1` da perna A. A fusão está registrada no cartão; `--seams C3` não corresponde a nada. |
39
+ | Pacote anterior | Não monte o retirado `dsh-plugin-upgrade` no mesmo perfil: os dois registram a skill `plugin-upgrade`, então a segunda montagem colide nesse nome. Aquele pacote está obsoleto no npm e seu repositório foi retirado; este pacote substitui as suas duas pernas. |
40
+
41
+ ## O que você recebe
42
+
43
+ Duas metades, um único catálogo de costuras:
44
+
45
+ - **Uma habilidade de agente empacotada (`plugin-upgrade`)** — o cartão do corredor fundido e um ciclo de corrigir-e-verificar. O corpo primeiro encaminha quem chama para a perna que corresponde à sua faixa de peers; o modelo só a carrega quando uma tarefa realmente precisa dela, e o pacote não contribui com nenhum parágrafo de prompt de sistema nem com nenhuma ferramenta.
46
+ - **Uma CLI sem dependências (`dsh-plugin-upgrade-scan`)** — reporta fatos `file:line` das vinte costuras fundidas (`S3`, `S8`, `S9`, `M1`, `S4`, `S5`, `S6`, `S7`, `S2`, `S1`, `S10`, `C1`, `C2`, `P1`, `C4`, `C5`, `H1`, `H2`, `H4`, `H3`) relidas dos intervalos de tags do harness em 2026-09-09 (perna A) e 2026-09-10 (perna B). Sai com `1` em qualquer achado de severidade error, então entra direto no CI.
47
+
48
+ O objetivo é o modo de falha que este corredor existe para matar: **a quebra deste intervalo é em grande parte silenciosa, pelas duas pontas.** A linha de tipos pode estar desatualizada, então o repositório compila contra o **catálogo antigo** (costura `M1`), e o slot de cliente puro `conversation` foi removido sem alias enquanto `ctx.slots.inject()` só executa o callback quando a declaração existe — então uma metade de cliente que ainda aponta para ele para de montar sem erro, sem linha de log e sem build quebrado (costura `C1`). Três classes de quebra sobrevivem a `typecheck` + `test`:
49
+
50
+ 1. o portão local compila uma linha de tipos desatualizada — alias `paths` antigo, ou tipos de dev/test fixados em `0.1.5-alpha.*` (costura `M1`);
51
+ 2. um escritor de log omite o campo `stream` exigido pelo V3, então a sessão é importada e depois se recusa a retomar (costura `S3`);
52
+ 3. os testes são simulados contra a forma antiga, então passam enquanto o host descarta a contribuição (costura `C1`).
53
+
54
+ Medição honesta: a varredura do workspace da perna B encontrou que as metades de cliente da família usam apenas **8** chaves de slot, e todas as 8 sobrevivem no rc.1 — para elas a quebra do rc.1 é **latente, não real**. Os plugins de cliente de terceiros que apontavam para a chave pura `conversation` são os que quebram, e quebram em silêncio. A varredura da perna A encontrou a textura oposta: 40 repositórios, 11 deles atingidos por `M1`, e corrigir o caminho desatualizado expôs erros reais de TypeScript em 3 repositórios que antes estavam «verdes».
55
+
56
+ ## Início rápido
57
+
58
+ ```sh
59
+ # 1. instale o bundle no seu perfil
60
+ dsh plugin --profile web add dsh-plugin-upgrade
61
+
62
+ # 2. confirme que a linha montou
63
+ dsh --profile web --dump-config | grep -A3 'id: dsh-plugin-upgrade'
64
+
65
+ # 3. escaneie o plugin que você vai atualizar
66
+ npx dsh-plugin-upgrade-scan --repo ../my-plugin
67
+ ```
68
+
69
+ Depois peça ao agente para usar a habilidade `plugin-upgrade`, ou conduza o ciclo você mesmo com o cartão em
70
+ `skills/plugin-upgrade/references/v0.1.3-alpha.1-to-v0.1.5-rc.1.md` (a perna A é a §1, a perna B é a §2, o índice fundido de costuras é a §3).
71
+
72
+ ## Instalação e desinstalação
73
+
74
+ ```sh
75
+ dsh plugin --profile web add dsh-plugin-upgrade # do npm
76
+ dsh plugin --profile web add "github:PerryLink/dsh-plugin-upgrade#main" # do código-fonte
77
+ dsh plugin --profile web remove dsh-plugin-upgrade # desinstalar (reversível)
78
+ ```
79
+
80
+ Instalar o bundle apenas registra uma habilidade; remover a linha remove a habilidade. A CLI é um alvo `npx` normal e não precisa de perfil algum.
81
+
82
+ ## Configuração
83
+
84
+ Toda chave é opcional e fica no patch do perfil:
85
+
86
+ | Chave | Padrão | Significado |
87
+ |---|---|---|
88
+ | `enabled` | `true` | Registra a habilidade empacotada. Use `false` para manter a dependência montada porém silenciosa. |
89
+ | `skillName` | `plugin-upgrade` | Diretório sob `skillsRoot` a registrar, e o nome exibido no catálogo. |
90
+ | `skillsRoot` | o `./skills` do próprio pacote | Onde vive `<skillName>/SKILL.md`. Aponte para o seu próprio cartão para reutilizar a infraestrutura. |
91
+ | `userInvocable` | `true` | Se uma pessoa pode invocar a habilidade pelo nome além do modelo. |
92
+
93
+ ```yaml
94
+ - insert:
95
+ - id: dsh-plugin-upgrade
96
+ name: dsh-plugin-upgrade
97
+ config:
98
+ skillName: plugin-upgrade
99
+ ```
100
+
101
+ O plugin monta de forma ruidosa: um `SKILL.md` ausente, um corpo vazio ou um frontmatter sem `name` fazem a montagem falhar em vez de registrar uma habilidade vazia.
102
+
103
+ ## Superfícies
104
+
105
+ **Habilidade** — `plugin-upgrade` (invocável pelo modelo e por pessoas por padrão). Corpo: tabela de encaminhamento por perna, as 8 regras rígidas e o ciclo de 6 passos. Referências: o cartão do corredor fundido. Scripts: o detector, enviado dentro do diretório da habilidade para que os caminhos relativos resolvam.
106
+
107
+ **CLI** — `dsh-plugin-upgrade-scan`:
108
+
109
+ ```sh
110
+ dsh-plugin-upgrade-scan [--repo <path>] [--json <out.json>] [--seams S3,C1,P1] [--quiet]
111
+ ```
112
+
113
+ | Flag | Significado |
114
+ |---|---|
115
+ | `--repo <path>` | Repositório a escanear (padrão: diretório atual). |
116
+ | `--json <out.json>` | Também grava o relatório legível por máquina (`repo`, `scannedAt`, `files`, `hits[]`, `bySeam`). |
117
+ | `--seams S3,C1,P1` | Restringe a costuras específicas do catálogo fundido. |
118
+ | `--quiet` | Suprime a renderização humana (combine com `--json`). |
119
+
120
+ Códigos de saída: `0` nenhum achado de severidade error · `1` ao menos um achado de severidade error · `2` uso ou falha do escaneamento. Um escaneamento limpo é necessário mas não suficiente — o critério de saída é um smoke real no host, mais uma ida-e-volta de retomada para escritores de log (perna A) e uma asserção em navegador real para a metade de cliente (perna B).
121
+
122
+ ## As vinte costuras
123
+
124
+ A ordem segue o catálogo em `lib/scan.mjs` (perna A primeiro, depois perna B), que também é a ordem à qual `test/card.test.mjs` fixa o cartão.
125
+
126
+ | Id | Severidade | O que mudou no caminho até `0.1.5-rc.1` |
127
+ |---|---|---|
128
+ | `S3` | error | `assistant/message` ganhou um campo `stream` obrigatório (formato de sessão V3): um log escrito sem ele é importado com sucesso e depois se recusa a retomar (`Session.fromRestore` lança `invalid settlement fields`). |
129
+ | `S8` | error | `SessionHandle.read()` retorna `SessionHandleReadResult` (`{ eventState, events }`) em vez do array de eventos; operações de array precisam desembrulhar `.events`. |
130
+ | `S9` | error | A configuração de `SystemPrompt` renomeou `persona` → `personaPrefix` / `personaSuffix`. Substituir por `includeHarnessIdentity: false` **não** é equivalente — isso apaga o bloco de identidade do harness. |
131
+ | `M1` | error | O portão local compila uma linha de tipos desatualizada: tipos de dev/test fixados em `0.1.5-alpha.*`, ou um alias `paths` do `tsconfig` resolvendo para um diretório de checkout inexistente, fazem o TypeScript cair em silêncio nos tipos publicados. Portão verde, régua errada. |
132
+ | `S4` | error | `tool/code-dispatch` foi renomeado para `tool/ptc-dispatch`; o rótulo antigo não é mais reconhecido em sessões V3. |
133
+ | `S5` | error | `ctx.agent` foi removido: quem chama deve passar o Agent explicitamente (por exemplo, o segundo parâmetro de `setup(agentCtx, agent)`). |
134
+ | `S6` | error | `Inbox` é uma interface de tipo, não uma classe construível; as fixtures usam a forma oficial não suportada e o código de runtime lê `agent.inbox`. |
135
+ | `S7` | warn | `SubprocessHandle.pid` foi removido (só resta `SubprocessTerminalHandle.pid`); remova o campo das fixtures de teste. |
136
+ | `S2` | warn | `EpochHeader.system` foi removido: o prompt de sistema agora é o `system/message` do nó de superfície 0. |
137
+ | `S1` | warn | Formato de sessão V3 e nomes de log com sufixo de geração — a geração atual é `session.v3.jsonl.zstd`, então scripts que fixam `session.jsonl.zstd` falham em silêncio. |
138
+ | `S10` | warn | Eventos de sessão escritos por plugins precisam passar pelo portão de adaptação fail-closed do host: `Session.append` não tem canal de escrita `ignorable`, então um append incondicional pode tornar uma sessão ilegível. |
139
+ | `C1` | error | O slot de cliente puro `conversation` foi removido e substituído por `main` + `main.conversation`, **sem alias**. `ctx.slots.inject()` só dispara quando a declaração existe, então um plugin que aponta para ele para de montar **em silêncio**. |
140
+ | `C2` | error | `@deepseek-ai/dsh-client-ui-sidebar-textpreview` virou `…-sidebar-documentpreview`; o nome antigo sumiu e não há pacote shim. |
141
+ | `P1` | error | A faixa de peers deve manter o segundo segmento: `>=0.1.2-rc.1 <0.2.0` sozinho **rejeita** `0.1.5-rc.1` pela regra prerelease-tuple do npm semver (medido `false` no semver 7.8.5). |
142
+ | `C4` | warn | O rc.1 adicionou um modelo de painel principal global (`main`, `sidebar.panellist`, `ctx.layout.selectPanel(MainPanelId \| null)`) e acrescentou a prop padrão `usePanelInfo` a quase todos os slots. |
143
+ | `C5` | warn | A pré-visualização de documentos migrou para o slot com chave `sidebar.right.tab.document` (`DocumentContent`); `sidebar.right.pane.tab` sobrevive, mas sua entrada pai passou a ser `rightbar.session`. |
144
+ | `H1` | warn | `KNOWN_SESSION_EVENT_TYPES` ganhou `deliverables/presented` e `subagent/catalog`: o vocabulário fail-closed cresceu. |
145
+ | `H2` | warn | A linha da nova ferramenta `present` ocupa a chave `'present'` de `tool.call.toolview`, que no alpha.1 estava livre. |
146
+ | `H4` | info | O catálogo consultivo padrão do adaptador DeepSeek agora começa com `deepseek-flash` (DeepSeek-V41-Flash). |
147
+ | `H3` | info | Novas capacidades opcionais: `ctx.sessionFeedback`, `ctx.layout.beginNavigation()`, `ctx.workspaces.openSession()` / `openWorkspace()` / `forkSession()`. Listadas no cartão; deliberadamente sem detecção automática. |
148
+
149
+ `S7`, `S2`, `S1`, `S10`, `C4`, `C5`, `H1`, `H2` e `H4` são deliberadamente consultivas: têm correspondências legítimas (um repositório que já usa a API nova, um snapshot de documentação, a tabela de ids de modelo de um plugin, um `ChildProcess.pid` do Node), então o scanner as reporta como pistas para revisão manual, não como falhas. `M1` e `P1` são verificações **estruturadas** — resolvem `package.json` e `tsconfig*.json` em vez de casar texto — e `H3` é **somente-cartão**: documentada, com paridade de id verificada e deliberadamente sem detector (`CARD_ONLY = ['H3']`).
150
+
151
+ ## O que isto não cobre
152
+
153
+ - **Um salto depois de `0.1.5-rc.1`.** O intervalo fundido termina no rc.1 por construção: o salto do harness `0.1.5-rc.1` → `0.1.5-rc.2` não acrescentou nenhuma costura voltada a plugins (o pin de dev/test deste próprio pacote e a sonda de CI rodam na linha `0.1.5-rc.2`, para que o catálogo seja verificado contra os tipos publicados mais recentes). Qualquer coisa que acrescente uma costura depois é um **novo pacote** — um cartão que deriva é pior do que nenhum cartão.
154
+ - **O salto `0.1.1` → `0.1.2`.** Use a habilidade de convergência da comunidade.
155
+ - **Repetir costuras entre pernas.** A perna A é dona das costuras do formato de sessão (`assistant/message.stream`, `SessionHandleReadResult`, `EpochHeader.system`, `ctx.agent`, `Inbox`, `SystemPrompt.persona`, a geração de log V3) e a perna B não as repete — todo o diff de `packages/core/session/src` no intervalo da perna B são dois literais de tipo de evento acrescentados e uma linha de comentário. A seção de cartão de cada perna mantém sua própria declaração de escopo.
156
+ - **O caminho de atualização do usuário do DSH.** Este pacote atualiza *código-fonte de plugins*, não a instalação do harness de um usuário.
157
+ - **Tokens de tema.** `docs/web-styling.md` não tem nenhuma mudança no intervalo da perna B.
158
+ - **Prova.** Um escaneamento limpo é uma hipótese. O critério de saída é um smoke real no host (`DSH_HOME` temporário, CLI alvo, `plugin add <tarball>`, `--dump-config`) mais uma ida-e-volta de retomada para escritores de log de sessão (perna A) e uma asserção em navegador real para cada achado do lado cliente (perna B).
159
+
160
+ ## Limites de segurança
161
+
162
+ - **Escaneamento somente leitura.** A CLI nunca escreve dentro do repositório escaneado; `--json` grava apenas no caminho que você indicar.
163
+ - **Sem rede, sem shell.** O scanner não importa nada além da biblioteca padrão do Node e nunca inicia um processo.
164
+ - **Sem segredos.** Nada no pacote lê credenciais, tokens de ambiente ou dados de sessão.
165
+ - **Receita de smoke em sandbox.** A verificação de host real do cartão usa um `DSH_HOME` de `mkdtemp`; nunca toca o seu `~/.dsh` real.
166
+
167
+ ## Desenvolvimento
168
+
169
+ ```sh
170
+ npm install # ou: pnpm install (o repositório inclui pnpm-lock.yaml)
171
+ npm test # node --test: scanner, paridade cartão<->catálogo, Cordis + SkillRegistry reais
172
+ npm run verify:self-contained # todo import resolve dentro do pacote
173
+ npm run verify:artifacts # o tarball leva a habilidade, a CLI e o patch, e exclui os testes
174
+ npm run check:readmes # consistência dos READMEs em cinco idiomas
175
+ npm pack
176
+ ```
177
+
178
+ O scanner tem um par de fixtures sintéticas **por perna**: `fixtures/leg-a-bad-repo` (as costuras de sessão/config da perna A, com toda costura de erro presente de propósito) com `fixtures/leg-a-good-repo` (adaptado), e `fixtures/bad-repo` (as costuras de slot de cliente da perna B) com `fixtures/good-repo` (adaptado) — além de um negativo ao vivo em um repositório da família já fixado no `0.1.5-rc.1`, de modo que uma regressão no catálogo falha nesta suíte e não em um usuário a jusante. `test/card.test.mjs` afirma que o índice do cartão fundido e `lib/scan.mjs` nomeiam **exatamente** os mesmos vinte ids de costura com as mesmas severidades, e que `CARD_ONLY` é exatamente `['H3']` — a regra de vinculação de evidência como portão de máquina.
179
+
180
+ ## Tópicos
181
+
182
+ `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `plugin-upgrade`, `migration`, `skill`, `version-card`, `scanner`, `client-slots` (espelham as `keywords` do `package.json`; `dsh-plugin` é o canal de visibilidade do ecossistema).
183
+
184
+ ## Família de plugins DSH da PerryLink
185
+
186
+ Este projeto é um dos [40 plugins de DeepSeek Harness](https://github.com/PerryLink) mantidos por [PerryLink](https://github.com/PerryLink). Se este ajuda você, os outros provavelmente também:
187
+
188
+ | Plugin | One-liner |
189
+ |---|---|
190
+ | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | Second-model auto-review on the approval chain, fail-closed by default | |
191
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
192
+ | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | Durable background child agents with a Web UI sidebar, messaging and interrupt | |
193
+ | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. | |
194
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
195
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
196
+ | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Unified session + workspace + config checkpoints with one-shot `/rewind` | |
197
+ | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migrate Claude Code, Codex, OpenCode and Hermes sessions, memories and skills into DSH | |
198
+ | **[dsh-click](https://github.com/PerryLink/dsh-click)** | Cross-platform native desktop control for DeepSeek Harness — Windows first. | |
199
+ | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | Terminal-style input history for the web composer: arrows, Ctrl+R search | |
200
+ | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | Deterministic dataset profiling, cleaning and citation verification | |
201
+ | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness. | |
202
+ | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Engineering-discipline guard: requirements grill, test gates, adversary review | |
203
+ | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | Unified static-image generation routing for DeepSeek Harness. | |
204
+ | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | Read-only performance diagnostics: load, spill, compaction and cache hit rate | |
205
+ | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | Chinese mutual-fund research with sealed, traceable source snapshots | |
206
+ | **[dsh-github](https://github.com/PerryLink/dsh-github)** | GitHub PR/issue/CI integration with every write approval-gated | |
207
+ | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | Industry and company research pack: chain map, policy timeline, company cards | |
208
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
209
+ | **[dsh-library](https://github.com/PerryLink/dsh-library)** | Local document knowledge base with hybrid search and citation-aware injection | |
210
+ | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | Local Ollama model discovery and task-based routing with cloud fallback | |
211
+ | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | LSP diagnostics, formatting, completion, code actions, symbols and rename | |
212
+ | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII masking at the model boundary with a host-side restore table | |
213
+ | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | MCP management console: `/mcp` command, Settings tab and trial calls | |
214
+ | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | Approval-gated cross-session memory protocol (`ctx.memory` + SQLite) | |
215
+ | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | OpenTelemetry and Langfuse telemetry export from the session event stream | |
216
+ | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Runtime-switchable model output styles | |
217
+ | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Declarative allow/deny/ask rules plus a process-level network policy | |
218
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
219
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
220
+ | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-dev knowledge base, agent skill and the `dsh-plugin-dev` CLI toolchain | |
221
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
222
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
223
+ | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | Multi-channel approval/question bridge: WeChat, Telegram, Feishu + a session console | |
224
+ | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Verifiable research reports: evidence ledger, manifest seal, per-claim verdicts | |
225
+ | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Multi-dimensional plugin quality scoring with an evidence-backed leaderboard | |
226
+ | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Pin sessions and workspaces in the Web sidebar with per-pin colors | |
227
+ | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | Git-backed cross-device session synchronization with keep-both merges | |
228
+ | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | Security-audit skill pack plus the `plugin_vet` supply-chain gate | |
229
+ | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | Voice-first session loop: speech-to-text input and text-to-speech replies | |
230
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
231
+ | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Isolated install-and-smoke test drives with a pass/fail matrix | |
232
+ | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel plus eleven agent tools | |
233
+ | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Vendor parameter translation and deterministic JSON repair | |
234
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | WeChat ↔ DSH bridge (Tencent iLink bot) developed with [pan17](https://github.com/pan17/dsh-wechat), who hosts the repo | |
235
+ | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | Personal directive injector with a top-bar toggle (fork of liucai2026/dsh-personal-directive) | |
236
+
237
+ Parte da família de plugins DSH da PerryLink — mais de 40 repositórios cobrindo sessões, memória, permissões, entrega, observabilidade e ferramentas de desenvolvimento. Explore o catálogo em [perrylink-dsh-catalog.perrylink.workers.dev](https://perrylink-dsh-catalog.perrylink.workers.dev) ou no [tópico `dsh-plugin`](https://github.com/topics/dsh-plugin).
238
+
239
+ ## Licença
240
+
241
+ Apache-2.0 — veja [LICENSE](LICENSE). As dependências de instalação e suas licenças estão em [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md); nada é empacotado.
package/README-zh.md ADDED
@@ -0,0 +1,241 @@
1
+ <div align="center">
2
+
3
+ # ⬆️ dsh-plugin-upgrade
4
+ - **1024 商店通道**:先 `npm i -g dsh1024`,再执行 `dsh1024 plugin --profile web add dsh-plugin-upgrade`(计入 [deepseek1024.com](https://deepseek1024.com) 安装排行)。
5
+ [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-plugin-upgrade)
6
+
7
+ **DeepSeek Harness 插件升级技能(已合并、版本锁定)——`0.1.3-alpha.1` → `0.1.5-rc.1`,由两条闭合的 leg 承载。**
8
+
9
+ *leg A `0.1.3-alpha.1` → `0.1.5-alpha.1`,leg B `0.1.5-alpha.1` → `0.1.5-rc.1`:一张走廊卡加一个零依赖接缝扫描器,覆盖合并后的 20 条接缝目录,让「静默不挂载的 client 半边」不再被误当成「typecheck 绿了」。*
10
+
11
+ > **官方仓库。** 这是 dsh-plugin-upgrade 唯一的官方仓库,由 PerryLink 维护。它取代两个版本锁定的包 `dsh-plugin-upgrade`(leg A)与 `dsh-plugin-upgrade-rc1`(leg B)。其他账号下的同名仓库与本项目无关。
12
+
13
+ [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
14
+ [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
15
+ [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-plugin-upgrade.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
16
+ [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
17
+ [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-plugin-upgrade/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-plugin-upgrade/actions)
18
+ [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-plugin-upgrade?label=version)](https://github.com/PerryLink/dsh-plugin-upgrade/releases)
19
+ [![npm version](https://img.shields.io/npm/v/dsh-plugin-upgrade)](https://www.npmjs.com/package/dsh-plugin-upgrade)
20
+ [![npm downloads](https://img.shields.io/npm/dm/dsh-plugin-upgrade)](https://www.npmjs.com/package/dsh-plugin-upgrade)
21
+
22
+ [English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
23
+
24
+ </div>
25
+
26
+ ---
27
+
28
+ ## 兼容性
29
+
30
+ | 面 | 状态 |
31
+ |---|---|
32
+ | 宿主 | DeepSeek Harness `0.1.5-rc.1`(tag `dsh-v0.1.5-rc.1` = `183f08e9c6dd`;leg A→B 交接点 `dsh-v0.1.5-alpha.1` = `5dda764ed3aa`;走廊起点 `0.1.3-alpha.1`)。peer 区间 `@deepseek-ai/dsh-skill >=0.1.2-rc.1 <0.2.0 \|\| >=0.1.5-alpha.1 <0.2.0`、`@deepseek-ai/cordis ^4.0.2`、`@deepseek-ai/schemastery ^3.18.2`。 |
33
+ | Node | `^22.19.0 \|\| >=24.0.0` |
34
+ | 平台 | 有 Node 即可;扫描器只读文件系统,与平台无关 |
35
+ | 模型 | 纯文本模型完全支持;技能就是一段 Markdown,不要求工具或视觉能力 |
36
+ | 范围 | **两条闭合的 leg,一个跨度**:leg A `0.1.3-alpha.1` → `0.1.5-alpha.1`,加上 leg B `0.1.5-alpha.1` → `0.1.5-rc.1`。走廊永不加宽:`0.1.5-rc.1` 之后的一跳就是一个新包。 |
37
+ | Legs | 两条 leg 都在本包内:leg A 保留 `S1`–`S10` + `M1` 接缝,leg B 保留 `C1`、`C2`、`C4`、`C5`、`H1`–`H4`、`P1`——各自带有自己的证据、卡片章节、夹具与回滚路径。没有需要另装的姊妹包。 |
38
+ | `C3` | 已弃用:leg B 的卡把「类型线陈旧导致的假绿」写作 `C3`,而这与 leg A 的 `M1` 是同一个缺陷。合并一事记录在卡上;`--seams C3` 匹配不到任何东西。 |
39
+ | 前身包 | 请勿在同一个 profile 中同时挂载已退役的 `dsh-plugin-upgrade`:两者都会注册 agent skill `plugin-upgrade`,第二次挂载会因 skill 名冲突而失败。该包在 npm 上已标记 deprecated、其仓库已退役;本包已取代它的两条腿。 |
40
+
41
+ ## 你得到什么
42
+
43
+ 两半,一套接缝目录:
44
+
45
+ - **一个随包发布的 agent 技能(`plugin-upgrade`)** —— 合并后的走廊卡,以及「修-验」循环。正文先把调用者路由到与它 peer 区间相符的那条 leg;只有任务真正需要时模型才会加载它,本包不贡献任何系统提示词段落,也不注册工具。
46
+ - **一个零依赖 CLI(`dsh-plugin-upgrade-scan`)** —— 按 `file:line` 报告合并后二十条接缝(`S3`、`S8`、`S9`、`M1`、`S4`、`S5`、`S6`、`S7`、`S2`、`S1`、`S10`、`C1`、`C2`、`P1`、`C4`、`C5`、`H1`、`H2`、`H4`、`H3`)的事实,全部于 2026-09-09(leg A)与 2026-09-10(leg B)从 harness 的 tag 区间重新读取。命中 error 级即退出码 `1`,可直接接进 CI。
47
+
48
+ 它要消灭的失效模式是:**这一跨度的破坏大多是静默的,而且两端都静默。** 类型线可能陈旧,于是仓库是对着**旧目录**编译的(接缝 `M1`);而裸 `conversation` client slot 被删除且没有别名,`ctx.slots.inject()` 又只在 declaration 存在时才执行回调——于是仍然指向它的 client 半边停止挂载,没有报错、没有日志、构建也不会失败(接缝 `C1`)。有三类破坏能穿过 `typecheck` + `test`:
49
+
50
+ 1. 本地门禁编译了一条陈旧的类型线——旧的 `paths` 别名,或钉在 `0.1.5-alpha.*` 的 dev/test 类型(接缝 `M1`);
51
+ 2. 日志写入器漏掉了 V3 必需的 `stream` 字段,于是会话能导入、却拒绝恢复(接缝 `S3`);
52
+ 3. 测试是对着旧形状 mock 的,于是它们通过,而宿主丢掉了你的贡献(接缝 `C1`)。
53
+
54
+ 诚实的量级说明:leg B 的工作区扫描发现,家族 client 半边一共只用了 **8** 个 slot key,且这 8 个在 rc.1 全部存活——对它们而言,rc.1 的破坏是**潜在破坏(latent),不是实际破坏**。真正会坏的是指向裸 `conversation` key 的第三方 client 插件,而且它们坏得悄无声息。leg A 的扫描发现的纹理正好相反:40 个仓,其中 11 个命中了 `M1`,而修好陈旧路径后,有 3 个此前「绿着」的仓暴露出真实的 TypeScript 错误。
55
+
56
+ ## 快速开始
57
+
58
+ ```sh
59
+ # 1. 把 bundle 装进你的 profile
60
+ dsh plugin --profile web add dsh-plugin-upgrade
61
+
62
+ # 2. 确认插件行已挂载
63
+ dsh --profile web --dump-config | grep -A3 'id: dsh-plugin-upgrade'
64
+
65
+ # 3. 扫描你要升级的插件
66
+ npx dsh-plugin-upgrade-scan --repo ../my-plugin
67
+ ```
68
+
69
+ 然后让 agent 使用 `plugin-upgrade` 技能,或自己按卡驱动循环:
70
+ `skills/plugin-upgrade/references/v0.1.3-alpha.1-to-v0.1.5-rc.1.md`(leg A 是 §1,leg B 是 §2,合并后的接缝索引是 §3)。
71
+
72
+ ## 安装与卸载
73
+
74
+ ```sh
75
+ dsh plugin --profile web add dsh-plugin-upgrade # 从 npm
76
+ dsh plugin --profile web add "github:PerryLink/dsh-plugin-upgrade#main" # 从源码
77
+ dsh plugin --profile web remove dsh-plugin-upgrade # 卸载(可逆)
78
+ ```
79
+
80
+ 安装 bundle 只注册一个技能;移除插件行即移除技能。CLI 是普通 `npx` 目标,完全不需要 profile。
81
+
82
+ ## 配置
83
+
84
+ 每个键都可选,写在 profile patch 里:
85
+
86
+ | 键 | 默认 | 含义 |
87
+ |---|---|---|
88
+ | `enabled` | `true` | 是否注册随包技能。设为 `false` 可保留依赖但保持沉默。 |
89
+ | `skillName` | `plugin-upgrade` | 要注册的 `skillsRoot` 子目录名,也是目录里显示的名字。 |
90
+ | `skillsRoot` | 本包自己的 `./skills` | `<skillName>/SKILL.md` 所在处。指向你自己的卡即可复用这套管线。 |
91
+ | `userInvocable` | `true` | 除了模型,人是否也能按名字调用该技能。 |
92
+
93
+ ```yaml
94
+ - insert:
95
+ - id: dsh-plugin-upgrade
96
+ name: dsh-plugin-upgrade
97
+ config:
98
+ skillName: plugin-upgrade
99
+ ```
100
+
101
+ 插件**挂载必须大声**:`SKILL.md` 缺失、正文为空、frontmatter 没有 `name`,都会直接让挂载失败,而不是注册一个空技能。
102
+
103
+ ## 暴露面
104
+
105
+ **技能** —— `plugin-upgrade`(默认模型与人都可调用)。正文:leg 路由表、8 条硬规则与 6 步循环。引用:合并后的走廊卡。脚本:检测器,放在技能目录内,保证相对路径可解析。
106
+
107
+ **CLI** —— `dsh-plugin-upgrade-scan`:
108
+
109
+ ```sh
110
+ dsh-plugin-upgrade-scan [--repo <path>] [--json <out.json>] [--seams S3,C1,P1] [--quiet]
111
+ ```
112
+
113
+ | 参数 | 含义 |
114
+ |---|---|
115
+ | `--repo <path>` | 要扫描的仓库(默认当前目录)。 |
116
+ | `--json <out.json>` | 同时写出机器可读报告(`repo`、`scannedAt`、`files`、`hits[]`、`bySeam`)。 |
117
+ | `--seams S3,C1,P1` | 只跑合并目录中的指定接缝。 |
118
+ | `--quiet` | 不打印人类可读渲染(与 `--json` 搭配)。 |
119
+
120
+ 退出码:`0` 无 error 级命中 · `1` 至少一个 error 级命中 · `2` 用法或扫描失败。扫描干净是**必要非充分**条件——出口标准是真实宿主冒烟,**加上**日志写入器(leg A)的恢复往返,以及 client 半边(leg B)的真实浏览器断言。
121
+
122
+ ## 二十条接缝
123
+
124
+ 顺序遵循 `lib/scan.mjs` 中的目录(先 leg A,后 leg B),这也是 `test/card.test.mjs` 把卡钉住的顺序。
125
+
126
+ | Id | 级别 | 通往 `0.1.5-rc.1` 的路上变了什么 |
127
+ |---|---|---|
128
+ | `S3` | error | `assistant/message` 新增了必需的 `stream` 字段(会话格式 V3):漏写它的日志能成功导入,却拒绝恢复(`Session.fromRestore` 抛 `invalid settlement fields`)。 |
129
+ | `S8` | error | `SessionHandle.read()` 返回 `SessionHandleReadResult`(`{ eventState, events }`)而不是事件数组;数组操作必须先解包 `.events`。 |
130
+ | `S9` | error | `SystemPrompt` 的配置项由 `persona` 改名为 `personaPrefix` / `personaSuffix`。用 `includeHarnessIdentity: false` 顶替**并不等价**——那会删掉 harness 身份块。 |
131
+ | `M1` | error | 本地门禁编译了一条陈旧的类型线:dev/test 类型钉在 `0.1.5-alpha.*`,或 `tsconfig` 的 `paths` 别名指向不存在的 checkout 目录,都会让 TypeScript 静默回退到已发布的类型。门禁是绿的,尺子是错的。 |
132
+ | `S4` | error | `tool/code-dispatch` 改名为 `tool/ptc-dispatch`;旧标签在 V3 会话里不再被识别。 |
133
+ | `S5` | error | `ctx.agent` 被移除:调用方必须显式传入 Agent(例如 `setup(agentCtx, agent)` 的第二个参数)。 |
134
+ | `S6` | error | `Inbox` 是类型接口,不是可构造的类;夹具使用官方的不支持形状,运行时代码读 `agent.inbox`。 |
135
+ | `S7` | warn | `SubprocessHandle.pid` 被移除(只剩 `SubprocessTerminalHandle.pid`);把该字段从测试夹具里删掉。 |
136
+ | `S2` | warn | `EpochHeader.system` 被移除:系统提示词现在是界面节点 0 的 `system/message`。 |
137
+ | `S1` | warn | 会话格式 V3 与带 generation 后缀的日志名——当前 generation 是 `session.v3.jsonl.zstd`,所以硬编码 `session.jsonl.zstd` 的脚本会静默失败。 |
138
+ | `S10` | warn | 插件自己写入的会话事件必须经过宿主的 fail-closed 适配闸门:`Session.append` 没有 `ignorable` 写入通道,所以一次无条件 append 就可能让会话变得不可读。 |
139
+ | `C1` | error | 裸 client slot `conversation` 被删除,替换为 `main` + `main.conversation`,**无别名**。`ctx.slots.inject()` 只在 declaration 存在时才触发,所以指向它的插件会**静默**停止挂载。 |
140
+ | `C2` | error | `@deepseek-ai/dsh-client-ui-sidebar-textpreview` 改名为 `…-sidebar-documentpreview`;旧名消失且没有 shim 包。 |
141
+ | `P1` | error | peer 区间必须保留第二段:`>=0.1.2-rc.1 <0.2.0` 单段在 npm semver 的 prerelease-tuple 规则下**拒绝** `0.1.5-rc.1`(semver 7.8.5 实测 `false`)。 |
142
+ | `C4` | warn | rc.1 新增了全局主面板模型(`main`、`sidebar.panellist`、`ctx.layout.selectPanel(MainPanelId \| null)`),并给几乎每个 slot 追加了 `usePanelInfo` 标准 prop。 |
143
+ | `C5` | warn | 文档预览迁到 keyed slot `sidebar.right.tab.document`(`DocumentContent`);`sidebar.right.pane.tab` 仍在,但父入口变成 `rightbar.session`。 |
144
+ | `H1` | warn | `KNOWN_SESSION_EVENT_TYPES` 新增 `deliverables/presented` 与 `subagent/catalog`——fail-closed 词表变长。 |
145
+ | `H2` | warn | 新工具 `present` 的行占用了 `tool.call.toolview` 的 key `'present'`,而该 key 在 alpha.1 是空闲的。 |
146
+ | `H4` | info | DeepSeek 适配器的默认咨询模型目录改以 `deepseek-flash`(DeepSeek-V41-Flash)打头。 |
147
+ | `H3` | info | 新增可选能力:`ctx.sessionFeedback`、`ctx.layout.beginNavigation()`、`ctx.workspaces.openSession()` / `openWorkspace()` / `forkSession()`。只在卡上列出,**刻意不做自动检测**。 |
148
+
149
+ `S7`、`S2`、`S1`、`S10`、`C4`、`C5`、`H1`、`H2` 与 `H4` 刻意保持提示级:它们都有合法命中(已经用了新 API 的仓、一份文档快照、插件自己的模型 id 表、Node 的 `ChildProcess.pid`),所以扫描器把它们作为人工复核线索,而不是失败。`M1` 与 `P1` 是**结构化**检查——它们解析 `package.json` 与 `tsconfig*.json`,而不是匹配文本——而 `H3` 是**仅卡片(card-only)**:有文档、参与 id 一致性校验,且刻意没有检测器(`CARD_ONLY = ['H3']`)。
150
+
151
+ ## 本包不覆盖什么
152
+
153
+ - **`0.1.5-rc.1` 之后的一跳。** 合并跨度按构造终止于 rc.1:harness 从 `0.1.5-rc.1` 到 `0.1.5-rc.2` 的一跳没有新增任何面向插件的接缝(本包自己的 dev/test 钉版与 CI 探针跑在 `0.1.5-rc.2` 线上,因此目录是对着最新已发布类型校验的)。之后任何新增接缝的东西都是**一个新包**——一张会漂移的卡比没有卡更糟。
154
+ - **`0.1.1` → `0.1.2` 这一跳。** 请使用社区收敛技能。
155
+ - **跨 leg 重述。** leg A 拥有会话格式接缝(`assistant/message.stream`、`SessionHandleReadResult`、`EpochHeader.system`、`ctx.agent`、`Inbox`、`SystemPrompt.persona`、V3 日志 generation),leg B 不重述它们——leg B 区间内 `packages/core/session/src` 的全部 diff 只有两个新增的事件类型字面量与一行注释。每条 leg 的卡片章节保留自己的范围声明。
156
+ - **DSH 面向用户的升级路径。** 本包升级的是**插件源码**,不是用户的 harness 安装。
157
+ - **主题 token。** `docs/web-styling.md` 在 leg B 区间零变更。
158
+ - **证明。** 扫描干净只是假设。出口标准是真实宿主冒烟(临时 `DSH_HOME`、目标 CLI、`plugin add <tarball>`、`--dump-config`),**加上**会话日志写入器(leg A)的恢复往返,以及每个 client 侧命中项(leg B)的真实浏览器断言。
159
+
160
+ ## 安全边界
161
+
162
+ - **只读扫描。** CLI 绝不在被扫仓库内写入;`--json` 只写你指定的路径。
163
+ - **无网络、无 shell。** 扫描器只 import Node 标准库,从不启动子进程。
164
+ - **无凭据。** 本包不读取任何凭据、环境令牌或会话数据。
165
+ - **沙箱化冒烟配方。** 卡里的真实宿主检查使用 `mkdtemp` 的 `DSH_HOME`,绝不碰你真实的 `~/.dsh`。
166
+
167
+ ## 开发
168
+
169
+ ```sh
170
+ npm install # 或者:pnpm install(仓库带 pnpm-lock.yaml)
171
+ npm test # node --test:扫描器、卡↔目录一致性、真实 Cordis + SkillRegistry
172
+ npm run verify:self-contained # 每个 import 都在包内解析
173
+ npm run verify:artifacts # 打出来的 tarball 带技能/CLI/patch,且不含测试
174
+ npm run check:readmes # 五语 README 一致性
175
+ npm pack
176
+ ```
177
+
178
+ 扫描器**每条 leg 各有一对**合成夹具:`fixtures/leg-a-bad-repo`(leg A 的会话/配置接缝,故意包含全部 error 级接缝)配 `fixtures/leg-a-good-repo`(已适配),以及 `fixtures/bad-repo`(leg B 的 client slot 接缝)配 `fixtures/good-repo`(已适配)——再外加拿一个已钉 `0.1.5-rc.1` 的家族仓做 live negative,所以目录里的回归会在这个测试套件里失败,而不是在下游用户那里。`test/card.test.mjs` 断言合并后的卡片索引与 `lib/scan.mjs` 命名的**正好**是同样二十个接缝 id、同样的级别,并且 `CARD_ONLY` 正好是 `['H3']`——把「证据绑定」规则变成机器门禁。
179
+
180
+ ## 主题标签
181
+
182
+ `dsh`、`dsh-plugin`、`deepseek-harness`、`deepseek`、`cordis`、`plugin-upgrade`、`migration`、`skill`、`version-card`、`scanner`、`client-slots`(与 `package.json` keywords 一致;`dsh-plugin` 是生态的可见性通道)。
183
+
184
+ ## PerryLink DSH 插件家族
185
+
186
+ 这是 [PerryLink](https://github.com/PerryLink) 维护的 [40 个 DeepSeek Harness 插件](https://github.com/PerryLink) 之一。如果它能帮到你,其他的也会:
187
+
188
+ | Plugin | One-liner |
189
+ |---|---|
190
+ | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | Second-model auto-review on the approval chain, fail-closed by default | |
191
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
192
+ | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | Durable background child agents with a Web UI sidebar, messaging and interrupt | |
193
+ | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. | |
194
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
195
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
196
+ | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Unified session + workspace + config checkpoints with one-shot `/rewind` | |
197
+ | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migrate Claude Code, Codex, OpenCode and Hermes sessions, memories and skills into DSH | |
198
+ | **[dsh-click](https://github.com/PerryLink/dsh-click)** | Cross-platform native desktop control for DeepSeek Harness — Windows first. | |
199
+ | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | Terminal-style input history for the web composer: arrows, Ctrl+R search | |
200
+ | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | Deterministic dataset profiling, cleaning and citation verification | |
201
+ | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness. | |
202
+ | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Engineering-discipline guard: requirements grill, test gates, adversary review | |
203
+ | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | Unified static-image generation routing for DeepSeek Harness. | |
204
+ | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | Read-only performance diagnostics: load, spill, compaction and cache hit rate | |
205
+ | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | Chinese mutual-fund research with sealed, traceable source snapshots | |
206
+ | **[dsh-github](https://github.com/PerryLink/dsh-github)** | GitHub PR/issue/CI integration with every write approval-gated | |
207
+ | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | Industry and company research pack: chain map, policy timeline, company cards | |
208
+ | **[dsh-kit](https://github.com/PerryLink/dsh-kit)** | One-command starter pack that installs the core family | |
209
+ | **[dsh-library](https://github.com/PerryLink/dsh-library)** | Local document knowledge base with hybrid search and citation-aware injection | |
210
+ | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | Local Ollama model discovery and task-based routing with cloud fallback | |
211
+ | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | LSP diagnostics, formatting, completion, code actions, symbols and rename | |
212
+ | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII masking at the model boundary with a host-side restore table | |
213
+ | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | MCP management console: `/mcp` command, Settings tab and trial calls | |
214
+ | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | Approval-gated cross-session memory protocol (`ctx.memory` + SQLite) | |
215
+ | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | OpenTelemetry and Langfuse telemetry export from the session event stream | |
216
+ | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Runtime-switchable model output styles | |
217
+ | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Declarative allow/deny/ask rules plus a process-level network policy | |
218
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
219
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
220
+ | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-dev knowledge base, agent skill and the `dsh-plugin-dev` CLI toolchain | |
221
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
222
+ | **[dsh-plugin-portal](https://github.com/PerryLink/dsh-plugin-portal)** | Zero-dependency static portal rendering the whole plugin family as one page | |
223
+ | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | Multi-channel approval/question bridge: WeChat, Telegram, Feishu + a session console | |
224
+ | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Verifiable research reports: evidence ledger, manifest seal, per-claim verdicts | |
225
+ | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Multi-dimensional plugin quality scoring with an evidence-backed leaderboard | |
226
+ | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Pin sessions and workspaces in the Web sidebar with per-pin colors | |
227
+ | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | Git-backed cross-device session synchronization with keep-both merges | |
228
+ | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | Security-audit skill pack plus the `plugin_vet` supply-chain gate | |
229
+ | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | Voice-first session loop: speech-to-text input and text-to-speech replies | |
230
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
231
+ | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Isolated install-and-smoke test drives with a pass/fail matrix | |
232
+ | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel plus eleven agent tools | |
233
+ | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Vendor parameter translation and deterministic JSON repair | |
234
+ | **[dsh-wechat](https://github.com/pan17/dsh-wechat)** | WeChat ↔ DSH bridge (Tencent iLink bot) developed with [pan17](https://github.com/pan17/dsh-wechat), who hosts the repo | |
235
+ | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | Personal directive injector with a top-bar toggle (fork of liucai2026/dsh-personal-directive) | |
236
+
237
+ 属于 PerryLink DSH 插件家族——40+ 个仓库,覆盖会话、记忆、权限、交付、可观测性与开发者工具。目录见 [perrylink-dsh-catalog.perrylink.workers.dev](https://perrylink-dsh-catalog.perrylink.workers.dev) 或 [`dsh-plugin` 主题](https://github.com/topics/dsh-plugin)。
238
+
239
+ ## 许可证
240
+
241
+ Apache-2.0 —— 见 [LICENSE](LICENSE)。安装期依赖及其许可证列在 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md);本包不打包任何第三方代码。