dsh-plugin-upgrade 0.1.3 → 2.0.0

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/types.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ // SPDX-License-Identifier: Apache-2.0
1
2
  /**
2
3
  * Public type surface for dsh-plugin-upgrade.
3
4
  * @module dsh-plugin-upgrade
@@ -7,7 +8,7 @@
7
8
  export interface Config {
8
9
  /** Register the packaged skill (default true). */
9
10
  enabled?: boolean
10
- /** Skill name published to the model catalog (default 'plugin-upgrade-015'). */
11
+ /** Skill name published to the model catalog (default 'plugin-upgrade'). */
11
12
  skillName?: string
12
13
  /** Skill root inside the package; must contain `<skillName>/SKILL.md`. */
13
14
  skillsRoot?: string
@@ -15,19 +16,28 @@ export interface Config {
15
16
  userInvocable?: boolean
16
17
  }
17
18
 
19
+ /**
20
+ * The merged seam-id union: leg A `S1`–`S10` + `M1`, leg B `C1`, `C2`, `C4`,
21
+ * `C5`, `H1`–`H4`, `P1`. Leg B's former `C3` is leg A's `M1` and is **not** a
22
+ * member: the scanner, `--seams` and the card index all reject it.
23
+ */
24
+ export type SeamId =
25
+ | 'S3' | 'S8' | 'S9' | 'M1' | 'S4' | 'S5' | 'S6' | 'S7' | 'S2' | 'S1' | 'S10'
26
+ | 'C1' | 'C2' | 'P1' | 'C4' | 'C5' | 'H1' | 'H2' | 'H4' | 'H3'
27
+
18
28
  /** One seam hit produced by the scanner. */
19
29
  export interface SeamHit {
20
- /** Seam id: S1..S10 or M1. */
21
- seam: string
22
- /** 'error' fails the scan; 'warn' is a manual-review lead. */
23
- severity: 'error' | 'warn'
30
+ /** Seam id, one of the merged 20 (`S3`, `S8`, `S9`, `M1`, `S4`, `S5`, `S6`, `S7`, `S2`, `S1`, `S10`, `C1`, `C2`, `P1`, `C4`, `C5`, `H1`, `H2`, `H4`, `H3`). */
31
+ seam: SeamId
32
+ /** 'error' fails the scan; 'warn' and 'info' are manual-review leads. */
33
+ severity: 'error' | 'warn' | 'info'
24
34
  /** Absolute path of the file carrying the hit. */
25
35
  file: string
26
36
  /** 1-based line number. */
27
37
  line: number
28
38
  /** Trimmed source line (truncated to 200 characters). */
29
39
  snippet: string
30
- /** Human-readable explanation, including the suggested action for M1. */
40
+ /** Human-readable explanation, including the suggested action. */
31
41
  detail: string
32
42
  }
33
43
 
@@ -40,7 +50,20 @@ export interface ScanReport {
40
50
  bySeam: Record<string, number>
41
51
  }
42
52
 
43
- /** Scan a repository directory for the 0.1.3-alpha.1 -> 0.1.5-alpha.1 seams. */
53
+ /**
54
+ * One entry of the seam catalog shared by the card, the CLI and the plugin.
55
+ * `test` is null for a card-only seam (`H3`) and for the two structured seams
56
+ * (`M1`, `P1`), which run dedicated file-level detectors instead of a regex.
57
+ */
58
+ export interface Seam {
59
+ id: SeamId
60
+ title: string
61
+ severity: 'error' | 'warn' | 'info'
62
+ action: string
63
+ test: RegExp | null
64
+ }
65
+
66
+ /** Scan a repository directory for the merged 0.1.3-alpha.1 -> 0.1.5-rc.1 seams. */
44
67
  export declare function scanRepo(repoDir: string, options?: { seams?: string[] }): ScanReport
45
68
 
46
69
  /** Render a report for a terminal. */
@@ -49,6 +72,15 @@ export declare function render(report: ScanReport): string
49
72
  /** CLI entry point; returns the process exit code. */
50
73
  export declare function main(argv: string[]): number
51
74
 
75
+ /** The seam catalog. The version card must name exactly these ids. */
76
+ export declare const SEAMS: Seam[]
77
+
78
+ /** Seam ids in card order; `test/card.test.mjs` pins the card to this list. */
79
+ export declare const SEAM_IDS: SeamId[]
80
+
81
+ /** Seams documented on the card with no automatic detection (`H3`). */
82
+ export declare const CARD_ONLY: SeamId[]
83
+
52
84
  /** Split a SKILL.md frontmatter block into its routing fields and body. */
53
85
  export declare function splitFrontmatter(text: string): { description?: string, whenToUse?: string, body: string }
54
86
 
package/README.es.md DELETED
@@ -1,172 +0,0 @@
1
- <div align="center">
2
-
3
- # ⬆️ dsh-plugin-upgrade
4
- - **Canal de la tienda 1024**: ejecuta `npm i -g dsh1024` una vez y luego `dsh1024 plugin --profile web add dsh-plugin-upgrade` (cuenta para el ranking de instalaciones de [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
- **Habilidad de actualización de plugins con versión fijada para DeepSeek Harness — `0.1.3-alpha.1` → `0.1.5-alpha.1`.**
8
-
9
- *Una tarjeta de versión más un escáner de costuras sin dependencias, para que «typecheck está en verde» nunca se confunda con «el plugin sigue funcionando».*
10
-
11
- > **Repositorio oficial.** Este es el único repositorio oficial de dsh-plugin-upgrade, mantenido por PerryLink. Los repositorios con el mismo nombre en otras cuentas no están 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
- ## Compatibilidad
29
-
30
- | Superficie | Estado |
31
- |---|---|
32
- | Harness | DeepSeek Harness `0.1.5-rc.1` (checkout `2efea31131`, tag `dsh-v0.1.5-rc.1` = `183f08e9c6dd`). Banda 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 | Donde corra Node; el escáner solo lee el sistema de archivos y es neutral respecto a la plataforma |
35
- | Modelo | Modelos solo de texto totalmente soportados; la habilidad es un cuerpo Markdown, sin requisitos de herramientas ni visión |
36
- | Alcance | **Un solo corredor**: `0.1.3-alpha.1` → `0.1.5-alpha.1`. No es un marco de migración general. |
37
-
38
- ## Lo que obtienes
39
-
40
- Dos mitades y un único catálogo de costuras:
41
-
42
- - **Una habilidad de agente incluida (`plugin-upgrade-015`)**: una tarjeta de versión y un bucle de corregir-y-verificar. El modelo solo la carga cuando la tarea realmente la necesita; el paquete no aporta ningún párrafo al prompt del sistema ni registra herramientas.
43
- - **Una CLI sin dependencias (`dsh-plugin-upgrade-scan`)**: informa hechos `archivo:línea` para diez costuras medidas sobre 40 repositorios de plugins reales durante la ola de adaptación del 2026-09-09. Sale con `1` ante cualquier hallazgo de severidad error, así que entra directo en CI.
44
-
45
- El objetivo es el modo de fallo que la tarjeta existe para eliminar: **una puerta local en verde no es prueba de adaptación.** Dos clases de rotura sobreviven a `typecheck` + `test`:
46
-
47
- 1. la línea de tipos publicada oculta la costura y el repositorio compila contra tipos obsoletos (costura `M1`);
48
- 2. las pruebas están simuladas contra la forma antigua, así que pasan mientras el host rechaza la nueva.
49
-
50
- Cuatro de las diez costuras — `S3`, `S8`, `S9`, `M1` — seguían sin cobertura por ningún PR comunitario de actualización cuando se escribió este paquete; las otras seis están contrastadas con la evidencia de la ola.
51
-
52
- ## Inicio rápido
53
-
54
- ```sh
55
- # 1. instala el bundle en tu perfil
56
- dsh plugin --profile web add dsh-plugin-upgrade
57
-
58
- # 2. verifica que la fila se montó
59
- dsh --profile web --dump-config | grep -A3 'id: dsh-plugin-upgrade'
60
-
61
- # 3. escanea el plugin que estás actualizando
62
- npx dsh-plugin-upgrade-scan --repo ../my-plugin
63
- ```
64
-
65
- Después pide al agente que use la habilidad `plugin-upgrade-015`, o guía el bucle tú mismo con la tarjeta en
66
- `skills/plugin-upgrade-015/references/v0.1.3-alpha.1-to-v0.1.5-alpha.1.md`.
67
-
68
- ## Instalación y desinstalación
69
-
70
- ```sh
71
- dsh plugin --profile web add dsh-plugin-upgrade # desde npm
72
- dsh plugin --profile web add "github:PerryLink/dsh-plugin-upgrade#main" # desde el código
73
- dsh plugin --profile web remove dsh-plugin-upgrade # desinstalar (reversible)
74
- ```
75
-
76
- Instalar el bundle solo registra una habilidad; quitar la fila la elimina. La CLI es un destino `npx` normal y no necesita ningún perfil.
77
-
78
- ## Configuración
79
-
80
- Cada clave es opcional y vive en el patch del perfil:
81
-
82
- | Clave | Predeterminado | Significado |
83
- |---|---|---|
84
- | `enabled` | `true` | Registra la habilidad incluida. `false` mantiene la dependencia montada pero silenciosa. |
85
- | `skillName` | `plugin-upgrade-015` | Directorio bajo `skillsRoot` que se registra, y nombre mostrado en el catálogo. |
86
- | `skillsRoot` | el `./skills` del propio paquete | Dónde vive `<skillName>/SKILL.md`. Apúntalo a tu propia tarjeta para reutilizar la infraestructura. |
87
- | `userInvocable` | `true` | Si una persona puede invocar la habilidad por nombre además del modelo. |
88
-
89
- ```yaml
90
- - insert:
91
- - id: dsh-plugin-upgrade
92
- name: dsh-plugin-upgrade
93
- config:
94
- skillName: plugin-upgrade-015
95
- ```
96
-
97
- El montaje falla en voz alta: un `SKILL.md` ausente, un cuerpo vacío o un frontmatter sin `name` abortan el montaje en lugar de registrar una habilidad vacía.
98
-
99
- ## Superficies
100
-
101
- **Habilidad** — `plugin-upgrade-015` (invocable por el modelo y por la persona por defecto). Cuerpo: el bucle de 6 pasos. Referencias: la tarjeta de versión. Scripts: el detector, incluido dentro del directorio de la habilidad para que las rutas relativas resuelvan.
102
-
103
- **CLI** — `dsh-plugin-upgrade-scan`:
104
-
105
- ```sh
106
- dsh-plugin-upgrade-scan [--repo <path>] [--json <out.json>] [--seams S3,S8,M1] [--quiet]
107
- ```
108
-
109
- | Bandera | Significado |
110
- |---|---|
111
- | `--repo <path>` | Repositorio a escanear (predeterminado: cwd). |
112
- | `--json <out.json>` | Escribe además el informe legible por máquina (`repo`, `scannedAt`, `files`, `hits[]`, `bySeam`). |
113
- | `--seams S3,S8,M1` | Restringe a costuras concretas. |
114
- | `--quiet` | Silencia la salida humana (combínala con `--json`). |
115
-
116
- Códigos de salida: `0` sin hallazgos de severidad error · `1` al menos uno · `2` uso o fallo de escaneo. Un escaneo limpio es necesario pero no suficiente: el criterio de salida de la tarjeta es una prueba real en un `DSH_HOME` temporal.
117
-
118
- ## Las diez costuras
119
-
120
- | Id | Severidad | Qué cambió en la línea `0.1.5-alpha.1` |
121
- |---|---|---|
122
- | `S1` | warn | El formato de sesión es V3; el archivo de log lleva generación (`session.v3.jsonl.zstd`). Las rutas fijas a `session.jsonl.zstd` dejan de funcionar en silencio. |
123
- | `S2` | warn | `EpochHeader.system` desapareció; el prompt del sistema es `system/message` en el nodo 0 de la superficie. Los lectores necesitan un respaldo estructural. |
124
- | `S3` | error | `assistant/message` requiere `stream`; sin él la sesión se importa pero no se puede reanudar (`Session.fromRestore` rechaza campos de settlement inválidos). |
125
- | `S4` | error | `tool/code-dispatch` pasó a llamarse `tool/ptc-dispatch`. |
126
- | `S5` | error | `ctx.agent` se eliminó; los llamadores reciben el `Agent` explícitamente. |
127
- | `S6` | error | `Inbox` pasó a ser una interfaz de tipo: ya no se puede construir; usa `agent.inbox` y la forma oficial del fixture. |
128
- | `S7` | warn | `SubprocessHandle.pid` se eliminó (solo `SubprocessTerminalHandle` conserva `pid`). |
129
- | `S8` | error | `SessionHandle.read()` ahora devuelve `SessionHandleReadResult`: desenvuelve `.events`. |
130
- | `S9` | error | La configuración `persona` de `SystemPrompt` pasó a `personaPrefix` / `personaSuffix`. |
131
- | `M1` | error | Un alias `paths` de `tsconfig` que apunta a un directorio inexistente hace que TypeScript vuelva en silencio a los tipos publicados: la puerta local se vuelve **falsamente verde**. |
132
-
133
- `S7`, `S1`, `S2` y `S10` son deliberadamente informativos: tienen coincidencias legítimas (el `pid` de Node, lectores de generaciones antiguas, la propia puerta de eventos adaptativa de un plugin), así que el escáner los reporta como pistas para revisión manual y no como fallos.
134
-
135
- ## Lo que esto no cubre
136
-
137
- - **Otros corredores.** `0.1.1` → `0.1.2` y líneas futuras quedan fuera; la tarjeta está fijada a propósito, porque una tarjeta que se desvía es peor que ninguna.
138
- - **La ruta de actualización de DSH para usuarios.** Este paquete actualiza el **código fuente del plugin**, no la instalación del harness de un usuario.
139
- - **Comportamiento de cliente/navegador.** El escáner es estático; una mitad cliente aún necesita una aserción real en el navegador.
140
- - **Prueba.** Un escaneo limpio es una hipótesis. El criterio de salida es una prueba real en el host (`DSH_HOME` temporal, CLI objetivo, `plugin add <tarball>`, `--dump-config`, más una ida y vuelta de resume para quien escribe logs de sesión).
141
-
142
- ## Límites de seguridad
143
-
144
- - **Escaneo de solo lectura.** La CLI nunca escribe dentro del repositorio escaneado; `--json` escribe solo en la ruta que le indiques.
145
- - **Sin red ni shell.** El escáner no importa nada fuera de la biblioteca estándar de Node y nunca lanza procesos.
146
- - **Sin secretos.** Nada en el paquete lee credenciales, tokens de entorno ni datos de sesión.
147
- - **Receta de prueba en sandbox.** La comprobación real de la tarjeta usa un `DSH_HOME` creado con `mkdtemp`; nunca toca tu `~/.dsh` real.
148
-
149
- ## Desarrollo
150
-
151
- ```sh
152
- pnpm install
153
- pnpm test # node --test (Cordis real + SkillRegistry real)
154
- pnpm run verify:self-contained # cada import resuelve dentro del paquete
155
- pnpm run verify:artifacts # el tarball incluye la habilidad, la CLI y el patch
156
- pnpm run check:readmes # consistencia de los README en cinco idiomas
157
- pnpm pack
158
- ```
159
-
160
- El escáner trae sus propios `fixtures/bad-repo` y `fixtures/good-repo` sintéticos, más un negativo en vivo sobre un repositorio ya adaptado por la ola, de modo que una regresión en el catálogo falla la suite en lugar de llegar a un usuario.
161
-
162
- ## Temas
163
-
164
- `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `plugin-upgrade`, `migration`, `skill`, `version-card`, `scanner` (reflejan las keywords de `package.json`; `dsh-plugin` es el canal de visibilidad del ecosistema).
165
-
166
- ## Familia de plugins DSH de PerryLink
167
-
168
- Parte de la familia de plugins DSH de PerryLink: 40 repositorios que cubren sesiones, memoria, permisos, entrega, observabilidad y herramientas para desarrolladores. Explora el catálogo en [perrylink-dsh-catalog.perrylink.workers.dev](https://perrylink-dsh-catalog.perrylink.workers.dev) o el [tema `dsh-plugin`](https://github.com/topics/dsh-plugin).
169
-
170
- ## Licencia
171
-
172
- Apache-2.0 — consulta [LICENSE](LICENSE). Las dependencias de instalación y sus licencias figuran en [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md); no se empaqueta nada de terceros.
package/README.hi.md DELETED
@@ -1,172 +0,0 @@
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-alpha.1`।**
8
-
9
- *एक संस्करण कार्ड और एक शून्य-निर्भरता सीम-स्कैनर, ताकि «typecheck हरा है» को कभी «प्लगइन अब भी चलता है» न समझा जाए।*
10
-
11
- > **आधिकारिक रिपॉज़िटरी।** यह dsh-plugin-upgrade की एकमात्र आधिकारिक रिपॉज़िटरी है, जिसे PerryLink अनुरक्षित करता है। अन्य खातों की समान-नाम वाली रिपॉज़िटरी इससे संबद्ध नहीं हैं।
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` (checkout `2efea31131`, tag `dsh-v0.1.5-rc.1` = `183f08e9c6dd`)। पीयर बैंड `@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
- | दायरा | **केवल एक कॉरिडोर**: `0.1.3-alpha.1` → `0.1.5-alpha.1`। यह सामान्य माइग्रेशन फ़्रेमवर्क नहीं है। |
37
-
38
- ## आपको क्या मिलता है
39
-
40
- दो हिस्से, एक ही सीम-कैटलॉग:
41
-
42
- - **एक बंडल एजेंट स्किल (`plugin-upgrade-015`)** — एक संस्करण कार्ड और «ठीक करो-सत्यापित करो» चक्र। मॉडल इसे तभी लोड करता है जब कार्य को वास्तव में ज़रूरत हो; यह पैकेज सिस्टम प्रॉम्प्ट में कोई पैराग्राफ़ नहीं जोड़ता और कोई टूल पंजीकृत नहीं करता।
43
- - **एक शून्य-निर्भरता CLI (`dsh-plugin-upgrade-scan`)** — 2026-09-09 की अडैप्टेशन लहर में 40 वास्तविक प्लगइन रिपॉज़िटरी पर मापी गई दस सीमों के लिए `file:line` तथ्य देता है। कोई भी error-स्तर का हिट मिलने पर एग्ज़िट `1`, इसलिए यह सीधे CI में लगता है।
44
-
45
- कार्ड जिस विफलता-विधा को ख़त्म करने के लिए है वह यह है: **स्थानीय गेट का हरा होना अडैप्टेशन का प्रमाण नहीं है।** दो तरह की टूटन `typecheck` + `test` को पार कर जाती हैं:
46
-
47
- 1. प्रकाशित टाइप लाइन सीम को छिपा देती है और रिपॉज़िटरी पुराने टाइप के विरुद्ध कंपाइल हो जाती है (सीम `M1`);
48
- 2. टेस्ट पुरानी शक्ल पर मॉक किए गए हैं, इसलिए वे पास हो जाते हैं जबकि होस्ट नई शक्ल अस्वीकार करता है।
49
-
50
- दस सीमों में से चार — `S3`, `S8`, `S9`, `M1` — जब यह पैकेज लिखा गया तब तक किसी सामुदायिक अपग्रेड PR में शामिल नहीं थीं; बाक़ी छह को उस लहर के प्रमाण से मिलाया गया है।
51
-
52
- ## त्वरित शुरुआत
53
-
54
- ```sh
55
- # 1. बंडल को अपने प्रोफ़ाइल में इंस्टॉल करें
56
- dsh plugin --profile web add dsh-plugin-upgrade
57
-
58
- # 2. पुष्टि करें कि पंक्ति माउंट हुई
59
- dsh --profile web --dump-config | grep -A3 'id: dsh-plugin-upgrade'
60
-
61
- # 3. जिस प्लगइन को अपग्रेड कर रहे हैं उसे स्कैन करें
62
- npx dsh-plugin-upgrade-scan --repo ../my-plugin
63
- ```
64
-
65
- फिर एजेंट से `plugin-upgrade-015` स्किल इस्तेमाल करने को कहें, या यहाँ रखे कार्ड के साथ चक्र ख़ुद चलाएँ:
66
- `skills/plugin-upgrade-015/references/v0.1.3-alpha.1-to-v0.1.5-alpha.1.md`।
67
-
68
- ## इंस्टॉल और अनइंस्टॉल
69
-
70
- ```sh
71
- dsh plugin --profile web add dsh-plugin-upgrade # npm से
72
- dsh plugin --profile web add "github:PerryLink/dsh-plugin-upgrade#main" # सोर्स से
73
- dsh plugin --profile web remove dsh-plugin-upgrade # अनइंस्टॉल (प्रतिवर्ती)
74
- ```
75
-
76
- बंडल इंस्टॉल करने से केवल एक स्किल पंजीकृत होती है; पंक्ति हटाने से स्किल हट जाती है। CLI एक सामान्य `npx` लक्ष्य है और इसके लिए किसी प्रोफ़ाइल की ज़रूरत नहीं।
77
-
78
- ## कॉन्फ़िगरेशन
79
-
80
- हर कुंजी वैकल्पिक है और प्रोफ़ाइल पैच में रहती है:
81
-
82
- | कुंजी | डिफ़ॉल्ट | अर्थ |
83
- |---|---|---|
84
- | `enabled` | `true` | बंडल स्किल पंजीकृत करें। `false` रखने पर निर्भरता माउंट रहती है पर चुप रहती है। |
85
- | `skillName` | `plugin-upgrade-015` | `skillsRoot` के अंदर पंजीकृत होने वाली डायरेक्टरी, और कैटलॉग में दिखने वाला नाम। |
86
- | `skillsRoot` | पैकेज का अपना `./skills` | जहाँ `<skillName>/SKILL.md` है। अपना कार्ड लगाने के लिए इसे उस ओर इंगित करें। |
87
- | `userInvocable` | `true` | मॉडल के अलावा इंसान भी नाम से स्किल बुला सके या नहीं। |
88
-
89
- ```yaml
90
- - insert:
91
- - id: dsh-plugin-upgrade
92
- name: dsh-plugin-upgrade
93
- config:
94
- skillName: plugin-upgrade-015
95
- ```
96
-
97
- माउंट ज़ोर से विफल होता है: `SKILL.md` गुम, बॉडी ख़ाली, या frontmatter में `name` न हो — तो माउंट रुक जाता है, ख़ाली स्किल पंजीकृत नहीं होती।
98
-
99
- ## सतहें
100
-
101
- **स्किल** — `plugin-upgrade-015` (डिफ़ॉल्ट रूप से मॉडल और इंसान दोनों बुला सकते हैं)। बॉडी: 6-चरणीय चक्र। संदर्भ: संस्करण कार्ड। स्क्रिप्ट: डिटेक्टर, स्किल डायरेक्टरी के अंदर ही, ताकि सापेक्ष पथ हल हों।
102
-
103
- **CLI** — `dsh-plugin-upgrade-scan`:
104
-
105
- ```sh
106
- dsh-plugin-upgrade-scan [--repo <path>] [--json <out.json>] [--seams S3,S8,M1] [--quiet]
107
- ```
108
-
109
- | फ़्लैग | अर्थ |
110
- |---|---|
111
- | `--repo <path>` | स्कैन करने वाली रिपॉज़िटरी (डिफ़ॉल्ट: cwd)। |
112
- | `--json <out.json>` | मशीन-पठनीय रिपोर्ट भी लिखें (`repo`, `scannedAt`, `files`, `hits[]`, `bySeam`)। |
113
- | `--seams S3,S8,M1` | केवल दिए गए सीमों तक सीमित करें। |
114
- | `--quiet` | मानव-पठनीय आउटपुट बंद करें (`--json` के साथ)। |
115
-
116
- एग्ज़िट कोड: `0` कोई error-स्तर हिट नहीं · `1` कम से कम एक · `2` उपयोग या स्कैन विफलता। साफ़ स्कैन आवश्यक है पर पर्याप्त नहीं — कार्ड की निकास कसौटी अस्थायी `DSH_HOME` पर वास्तविक-होस्ट स्मोक है।
117
-
118
- ## दस सीमें
119
-
120
- | Id | स्तर | `0.1.5-alpha.1` लाइन में क्या बदला |
121
- |---|---|---|
122
- | `S1` | warn | सेशन फ़ॉर्मैट V3 है; लॉग फ़ाइल पीढ़ी-सहित है (`session.v3.jsonl.zstd`)। कठोर कोडित `session.jsonl.zstd` चुपचाप बेकार हो जाता है। |
123
- | `S2` | warn | `EpochHeader.system` हट गया; सिस्टम प्रॉम्प्ट सरफ़ेस नोड 0 पर `system/message` है। पढ़ने वालों को संरचनात्मक फ़ॉलबैक चाहिए। |
124
- | `S3` | error | `assistant/message` में `stream` अनिवार्य है; बिना उसके सेशन इम्पोर्ट होता है पर रिज़्यूम नहीं होता (`Session.fromRestore` अमान्य settlement फ़ील्ड अस्वीकार करता है)। |
125
- | `S4` | error | `tool/code-dispatch` का नाम `tool/ptc-dispatch` हो गया। |
126
- | `S5` | error | `ctx.agent` हट गया; कॉलर को `Agent` स्पष्ट रूप से मिलता है। |
127
- | `S6` | error | `Inbox` अब टाइप इंटरफ़ेस है — बनाया नहीं जा सकता; `agent.inbox` और आधिकारिक फ़िक्स्चर शक्ल इस्तेमाल करें। |
128
- | `S7` | warn | `SubprocessHandle.pid` हट गया (केवल `SubprocessTerminalHandle` में `pid` बचा है)। |
129
- | `S8` | error | `SessionHandle.read()` अब `SessionHandleReadResult` लौटाता है — `.events` खोलें। |
130
- | `S9` | error | `SystemPrompt` का कॉन्फ़िग `persona` अब `personaPrefix` / `personaSuffix` है। |
131
- | `M1` | error | `tsconfig` का `paths` ऐसी डायरेक्टरी ओर इंगित हो जो मौजूद नहीं, तो TypeScript चुपचाप प्रकाशित टाइप पर लौट जाता है — स्थानीय गेट **झूठा हरा** बन जाता है। |
132
-
133
- `S7`, `S1`, `S2` और `S10` जान-बूझकर सूचनात्मक हैं: इनके वैध मेल भी होते हैं (Node का अपना `pid`, पुरानी पीढ़ी के रीडर, प्लगइन का अपना अडैप्टिव इवेंट गेट), इसलिए स्कैनर इन्हें मैनुअल समीक्षा के सुराग़ बतौर दिखाता है, विफलता नहीं।
134
-
135
- ## यह क्या कवर नहीं करता
136
-
137
- - **अन्य कॉरिडोर।** `0.1.1` → `0.1.2` और आगे की लाइनें दायरे से बाहर; कार्ड जान-बूझकर लॉक है, क्योंकि बहकने वाला कार्ड न होने से बुरा है।
138
- - **DSH का उपयोगकर्ता-मुखी अपग्रेड पथ।** यह पैकेज **प्लगइन सोर्स कोड** अपग्रेड करता है, उपयोगकर्ता की harness इंस्टॉलेशन नहीं।
139
- - **क्लाइंट/ब्राउज़र व्यवहार।** स्कैनर स्थिर है; क्लाइंट आधे हिस्से के लिए असली ब्राउज़र जाँच चाहिए।
140
- - **प्रमाण।** साफ़ स्कैन एक परिकल्पना है। निकास कसौटी वास्तविक-होस्ट स्मोक है (अस्थायी `DSH_HOME`, लक्ष्य CLI, `plugin add <tarball>`, `--dump-config`, और सेशन-लॉग लिखने वालों के लिए एक resume राउंड-ट्रिप)।
141
-
142
- ## सुरक्षा सीमाएँ
143
-
144
- - **केवल-पठन स्कैन।** CLI स्कैन की गई रिपॉज़िटरी के अंदर कभी नहीं लिखता; `--json` केवल आपके दिए पथ पर लिखता है।
145
- - **कोई नेटवर्क, कोई शेल नहीं।** स्कैनर Node की मानक लाइब्रेरी के अलावा कुछ आयात नहीं करता और कभी प्रोसेस नहीं बनाता।
146
- - **कोई रहस्य नहीं।** पैकेज में कुछ भी क्रेडेंशियल, एनवायरनमेंट टोकन या सेशन डेटा नहीं पढ़ता।
147
- - **सैंडबॉक्स स्मोक नुस्ख़ा।** कार्ड की असली-होस्ट जाँच `mkdtemp` वाले `DSH_HOME` का उपयोग करती है; आपके असली `~/.dsh` को कभी नहीं छूती।
148
-
149
- ## विकास
150
-
151
- ```sh
152
- pnpm install
153
- pnpm test # node --test (असली Cordis + असली SkillRegistry)
154
- pnpm run verify:self-contained # हर import पैकेज के भीतर हल होता है
155
- pnpm run verify:artifacts # tarball में स्किल, CLI और patch मौजूद
156
- pnpm run check:readmes # पाँच-भाषा README एकरूपता
157
- pnpm pack
158
- ```
159
-
160
- स्कैनर के साथ संश्लेषित `fixtures/bad-repo` और `fixtures/good-repo` हैं, और लहर से पहले ही अडैप्ट हो चुकी रिपॉज़िटरी पर एक live negative भी — इसलिए कैटलॉग में रिग्रेशन टेस्ट सूट को गिराता है, उपयोगकर्ता तक नहीं पहुँचता।
161
-
162
- ## विषय टैग
163
-
164
- `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `plugin-upgrade`, `migration`, `skill`, `version-card`, `scanner` (`package.json` की keywords के अनुरूप; `dsh-plugin` पारिस्थितिकी का दृश्यता चैनल है)।
165
-
166
- ## PerryLink DSH प्लगइन परिवार
167
-
168
- यह PerryLink DSH प्लगइन परिवार का हिस्सा है — 40 रिपॉज़िटरी, जो सेशन, मेमोरी, अनुमतियाँ, डिलीवरी, ऑब्ज़र्वेबिलिटी और डेवलपर टूलिंग कवर करती हैं। कैटलॉग देखें [perrylink-dsh-catalog.perrylink.workers.dev](https://perrylink-dsh-catalog.perrylink.workers.dev) पर या [`dsh-plugin` टॉपिक](https://github.com/topics/dsh-plugin) पर।
169
-
170
- ## लाइसेंस
171
-
172
- Apache-2.0 — देखें [LICENSE](LICENSE)। इंस्टॉल-समय की निर्भरताएँ और उनके लाइसेंस [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) में सूचीबद्ध हैं; कुछ भी बंडल नहीं किया गया।
package/README.pt.md DELETED
@@ -1,172 +0,0 @@
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
- **Skill de upgrade de plugins com versão fixada para o DeepSeek Harness — `0.1.3-alpha.1` → `0.1.5-alpha.1`.**
8
-
9
- *Um cartão de versão mais um scanner de costuras sem dependências, para que «typecheck está verde» nunca seja confundido com «o plugin ainda funciona».*
10
-
11
- > **Repositório oficial.** Este é o único repositório oficial do dsh-plugin-upgrade, mantido pela PerryLink. 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 | Status |
31
- |---|---|
32
- | Harness | DeepSeek Harness `0.1.5-rc.1` (checkout `2efea31131`, tag `dsh-v0.1.5-rc.1` = `183f08e9c6dd`). 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ó lê o sistema de arquivos e é neutro de plataforma |
35
- | Modelo | Modelos somente texto são totalmente suportados; a skill é um corpo Markdown, sem exigência de ferramentas ou visão |
36
- | Escopo | **Um único corredor**: `0.1.3-alpha.1` → `0.1.5-alpha.1`. Não é um framework de migração geral. |
37
-
38
- ## O que você recebe
39
-
40
- Duas metades e um único catálogo de costuras:
41
-
42
- - **Uma skill de agente incluída (`plugin-upgrade-015`)** — um cartão de versão e um ciclo de corrigir-e-verificar. O modelo só a carrega quando a tarefa realmente precisa; o pacote não contribui com nenhum parágrafo do prompt de sistema nem registra ferramentas.
43
- - **Uma CLI sem dependências (`dsh-plugin-upgrade-scan`)** — reporta fatos `arquivo:linha` para dez costuras medidas em 40 repositórios reais de plugins durante a onda de adaptação de 2026-09-09. Sai com `1` a qualquer achado de severidade erro, então entra direto no CI.
44
-
45
- O objetivo é o modo de falha que o cartão existe para eliminar: **um portão local verde não é prova de adaptação.** Duas classes de quebra sobrevivem a `typecheck` + `test`:
46
-
47
- 1. a linha de tipos publicada esconde a costura e o repositório compila contra tipos obsoletos (costura `M1`);
48
- 2. os testes são mockados na forma antiga, então passam enquanto o host rejeita a nova.
49
-
50
- Quatro das dez costuras — `S3`, `S8`, `S9`, `M1` — ainda não eram cobertas por nenhum PR comunitário de upgrade quando este pacote foi escrito; as outras seis foram cruzadas com a evidência da onda.
51
-
52
- ## Início rápido
53
-
54
- ```sh
55
- # 1. instale o bundle no seu perfil
56
- dsh plugin --profile web add dsh-plugin-upgrade
57
-
58
- # 2. confirme que a linha montou
59
- dsh --profile web --dump-config | grep -A3 'id: dsh-plugin-upgrade'
60
-
61
- # 3. escaneie o plugin que você está atualizando
62
- npx dsh-plugin-upgrade-scan --repo ../my-plugin
63
- ```
64
-
65
- Depois peça ao agente para usar a skill `plugin-upgrade-015`, ou conduza o ciclo você mesmo com o cartão em
66
- `skills/plugin-upgrade-015/references/v0.1.3-alpha.1-to-v0.1.5-alpha.1.md`.
67
-
68
- ## Instalação e desinstalação
69
-
70
- ```sh
71
- dsh plugin --profile web add dsh-plugin-upgrade # do npm
72
- dsh plugin --profile web add "github:PerryLink/dsh-plugin-upgrade#main" # do código-fonte
73
- dsh plugin --profile web remove dsh-plugin-upgrade # desinstalar (reversível)
74
- ```
75
-
76
- Instalar o bundle apenas registra uma skill; remover a linha a remove. A CLI é um alvo `npx` normal e não precisa de perfil algum.
77
-
78
- ## Configuração
79
-
80
- Toda chave é opcional e vive no patch do perfil:
81
-
82
- | Chave | Padrão | Significado |
83
- |---|---|---|
84
- | `enabled` | `true` | Registra a skill incluída. `false` mantém a dependência montada mas silenciosa. |
85
- | `skillName` | `plugin-upgrade-015` | Diretório sob `skillsRoot` a registrar, e o nome exibido no catálogo. |
86
- | `skillsRoot` | o `./skills` do próprio pacote | Onde fica `<skillName>/SKILL.md`. Aponte para o seu próprio cartão para reutilizar a infraestrutura. |
87
- | `userInvocable` | `true` | Se uma pessoa pode invocar a skill pelo nome além do modelo. |
88
-
89
- ```yaml
90
- - insert:
91
- - id: dsh-plugin-upgrade
92
- name: dsh-plugin-upgrade
93
- config:
94
- skillName: plugin-upgrade-015
95
- ```
96
-
97
- A montagem falha alto: um `SKILL.md` ausente, um corpo vazio ou um frontmatter sem `name` abortam a montagem em vez de registrar uma skill vazia.
98
-
99
- ## Superfícies
100
-
101
- **Skill** — `plugin-upgrade-015` (invocável pelo modelo e pela pessoa por padrão). Corpo: o ciclo de 6 passos. Referências: o cartão de versão. Scripts: o detector, incluído dentro do diretório da skill para que caminhos relativos resolvam.
102
-
103
- **CLI** — `dsh-plugin-upgrade-scan`:
104
-
105
- ```sh
106
- dsh-plugin-upgrade-scan [--repo <path>] [--json <out.json>] [--seams S3,S8,M1] [--quiet]
107
- ```
108
-
109
- | Flag | Significado |
110
- |---|---|
111
- | `--repo <path>` | Repositório a escanear (padrão: cwd). |
112
- | `--json <out.json>` | Também grava o relatório legível por máquina (`repo`, `scannedAt`, `files`, `hits[]`, `bySeam`). |
113
- | `--seams S3,S8,M1` | Restringe a costuras específicas. |
114
- | `--quiet` | Silencia a saída humana (combine com `--json`). |
115
-
116
- Códigos de saída: `0` nenhum achado de severidade erro · `1` pelo menos um · `2` uso ou falha de varredura. Uma varredura limpa é necessária mas não suficiente — o critério de saída do cartão é um smoke real em um `DSH_HOME` temporário.
117
-
118
- ## As dez costuras
119
-
120
- | Id | Severidade | O que mudou na linha `0.1.5-alpha.1` |
121
- |---|---|---|
122
- | `S1` | warn | O formato de sessão é V3; o arquivo de log carrega geração (`session.v3.jsonl.zstd`). Caminhos fixos em `session.jsonl.zstd` param de funcionar em silêncio. |
123
- | `S2` | warn | `EpochHeader.system` desapareceu; o prompt de sistema é `system/message` no nó 0 da superfície. Leitores precisam de um fallback estrutural. |
124
- | `S3` | error | `assistant/message` exige `stream`; sem ele a sessão importa mas não pode ser retomada (`Session.fromRestore` rejeita campos de settlement inválidos). |
125
- | `S4` | error | `tool/code-dispatch` virou `tool/ptc-dispatch`. |
126
- | `S5` | error | `ctx.agent` foi removido; os chamadores recebem o `Agent` explicitamente. |
127
- | `S6` | error | `Inbox` virou uma interface de tipo — não pode mais ser construída; use `agent.inbox` e a forma oficial do fixture. |
128
- | `S7` | warn | `SubprocessHandle.pid` foi removido (só `SubprocessTerminalHandle` mantém `pid`). |
129
- | `S8` | error | `SessionHandle.read()` agora retorna `SessionHandleReadResult` — desembrulhe `.events`. |
130
- | `S9` | error | A configuração `persona` do `SystemPrompt` virou `personaPrefix` / `personaSuffix`. |
131
- | `M1` | error | Um alias `paths` do `tsconfig` apontando para um diretório inexistente faz o TypeScript cair em silêncio nos tipos publicados — o portão local fica **falsamente verde**. |
132
-
133
- `S7`, `S1`, `S2` e `S10` são deliberadamente informativos: têm correspondências legítimas (o `pid` do Node, leitores de gerações antigas, o próprio portão adaptativo de eventos de um plugin), então o scanner os reporta como pistas para revisão manual e não como falhas.
134
-
135
- ## O que isto não cobre
136
-
137
- - **Outros corredores.** `0.1.1` → `0.1.2` e linhas futuras ficam fora; o cartão é fixado de propósito, porque um cartão que desvia é pior que nenhum.
138
- - **O caminho de upgrade do DSH para usuários.** Este pacote atualiza o **código-fonte do plugin**, não a instalação do harness de um usuário.
139
- - **Comportamento de cliente/navegador.** O scanner é estático; uma metade cliente ainda precisa de asserção real no navegador.
140
- - **Prova.** Uma varredura limpa é 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 resume para quem escreve logs de sessão).
141
-
142
- ## Limites de segurança
143
-
144
- - **Varredura somente leitura.** A CLI nunca escreve dentro do repositório varrido; `--json` grava apenas no caminho informado.
145
- - **Sem rede nem shell.** O scanner não importa nada além da biblioteca padrão do Node e nunca cria processos.
146
- - **Sem segredos.** Nada no pacote lê credenciais, tokens de ambiente ou dados de sessão.
147
- - **Receita de smoke em sandbox.** A checagem real do cartão usa um `DSH_HOME` criado com `mkdtemp`; nunca toca seu `~/.dsh` real.
148
-
149
- ## Desenvolvimento
150
-
151
- ```sh
152
- pnpm install
153
- pnpm test # node --test (Cordis real + SkillRegistry real)
154
- pnpm run verify:self-contained # todo import resolve dentro do pacote
155
- pnpm run verify:artifacts # o tarball leva a skill, a CLI e o patch
156
- pnpm run check:readmes # consistência dos README em cinco idiomas
157
- pnpm pack
158
- ```
159
-
160
- O scanner traz seus próprios `fixtures/bad-repo` e `fixtures/good-repo` sintéticos, mais um negativo ao vivo em um repositório já adaptado pela onda, de modo que uma regressão no catálogo quebra a suíte em vez de chegar a um usuário.
161
-
162
- ## Tópicos
163
-
164
- `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `plugin-upgrade`, `migration`, `skill`, `version-card`, `scanner` (espelham as keywords do `package.json`; `dsh-plugin` é o canal de visibilidade do ecossistema).
165
-
166
- ## Família de plugins DSH da PerryLink
167
-
168
- Parte da família de plugins DSH da PerryLink — 40 repositórios cobrindo sessões, memória, permissões, entrega, observabilidade e ferramentas de desenvolvedor. 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).
169
-
170
- ## Licença
171
-
172
- 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 de terceiros é empacotado.