dsh-output-styles 0.6.16 → 0.6.19

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 CHANGED
@@ -4,6 +4,61 @@ All notable changes to this project are documented in this file. The format
4
4
  follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the
5
5
  project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.6.19] - 2026-09-23
8
+
9
+ ### Changed
10
+
11
+ - The `@deepseek-ai/dsh-*` dev/test pins move from `0.1.7-alpha.1` to `0.1.7-alpha.2` (23 keys), so the suite executes the host packages this release targets. `pnpm-lock.yaml` re-resolved and carries no `0.1.7-alpha.1` reference. No test expectation had to change: the bump turned nothing red.
12
+ - Every declared host range gains the trailing clause `|| >=0.1.7-0 <0.2.0`: `engines.dsh` and the 14 three-segment `@deepseek-ai/dsh-*` peers, plus the optional peer `@deepseek-ai/dsh-compaction-image-offload`, whose one-segment form is widened the same way. This is a correctness fix, not a tightening: under semver's prerelease rule a comparator set whose only prerelease comparators sit on earlier version tuples cannot admit a later alpha, so the previous bands excluded `0.1.7-alpha.2`, the very host this release targets. No existing segment was removed, reordered or narrowed.
13
+ - `dshWorkshop.compatibility.dshVersions` records `0.1.7-alpha.2` alongside `0.1.2-rc.1` and `0.1.5-rc.2`.
14
+ - `@deepseek-ai/cordis` moves to `^4.0.4` in both `peerDependencies` (which had declared the union `^4.0.2 || ^4.0.3`) and `devDependencies` (which had declared `^4.0.3`). Declaration alignment only: the published 4.0.3 and 4.0.4 tarballs are byte-identical in all 31 code and `.d.ts` files, `package.json` being the only difference.
15
+ - Two resolutions refresh inside the already-declared caret ranges: `@deepseek-ai/schemastery` 3.18.3 to 3.18.4 and `@deepseek-ai/cosmokit` 1.8.4 to 1.8.5 in the lockfile. Without them `typecheck` and `typecheck:ci` failed with `TS2883` ("The inferred type of 'Config' cannot be named without a reference to 'Schema' ..."): the alpha.2 host graph pulls schemastery 3.18.4 / cosmokit 1.8.5 while this lockfile still held the alpha.1-era 3.18.3 / 1.8.4, so the exported `Config` schema's type straddled two type identities of the schemastery/cosmokit pair and declaration emit could not name the result. No source, test or assertion changed.
16
+ - The Harness row of all five READMEs names `dsh-v0.1.7-alpha.2`; the dated verification narration beside it is left as written.
17
+ - The monthly Compat workflow installs and profile-adds the `0.1.7-alpha.2` host (`@deepseek-ai/dsh`, `@deepseek-ai/dsh-base`, `@deepseek-ai/dsh-headless`) on both host-line points, so the CLI and the bundle come from the same line. It had kept proving compatibility with a superseded line, silently: the job runs on a schedule, so nothing failed and nothing warned.
18
+
19
+ ### Fixed
20
+
21
+ - The optional peer `@deepseek-ai/dsh-compaction-image-offload` admitted no `0.1.7` host. It had been left at `>=0.1.6-alpha.1 <0.2.0` when the other ranges were widened, because it uses a different shape from the family's three-segment baseline — but it is a live install-time constraint, and the `0.1.7-alpha.2` host ships `@deepseek-ai/dsh-compaction-image-offload@0.1.7-alpha.2`. It now reads `>=0.1.6-alpha.1 <0.2.0 || >=0.1.7-0 <0.2.0`.
22
+
23
+ ## [0.6.18] - 2026-09-22
24
+
25
+ ### Changed
26
+
27
+ - Rename the session-export command from `/export` to `/transcript`. The `export` name collided with the official `session-log-export` command — on hosts that ship it, the duplicate registration failed with `already registered` and the plugin half-mounted. The command now registers as `/transcript` (usage: `/transcript [markdown|html] [--renderer=<id>] [--save <path>]`); every user-facing reference (five READMEs, docs, error strings) follows the new name. There is no transitional dual registration — `/export` is gone as soon as this version loads. The internal `src/export.ts` module keeps its name; only the registered command changed.
28
+
29
+ - **Adapt to DeepSeek Harness `dsh-v0.1.7-alpha.1`.** The host deleted the settings API this plugin was built on (`@deepseek-ai/dsh-settings-file` is gone; `@deepseek-ai/dsh-settings` is now `SettingsForms`, and `SettingsProvider` / `SettingsSection` / `settings.register(ns, schema, { base, validate })` / `settings/updated` / `SettingsNamespace` / `SettingsScope` no longer exist anywhere in the host). Both of this plugin's own settings sections are therefore gone, and the two user-configurable values moved onto the plugin's own `Config` schema:
30
+
31
+ | Before (settings section) | After (Config field) |
32
+ |---|---|
33
+ | `output-style.style` | `defaultStyle` |
34
+ | `output-style-rules.rules` | `rules` |
35
+
36
+ Both fields are declared `volatile()` and are **now editable from the Web Plugins page** — this is a user-visible change: the plugin opts out of the auto-generated settings card (`settings.configure({ auto: false })`) exactly as first-party plugins do, and a committed value is adopted through `loader/volatile-update` without a remount. Every other `Config` field stays composition-only. A committed `defaultStyle` that names no style in the live library is refused (logged and ignored) instead of resolving to a dangling directive. If you had values in either removed section, move them into the matching `Config` field in your profile patch (`cordis.yml`). Per-session `/style` choices are unaffected — they live in the `output_style` storage domain.
37
+
38
+ - The durable provenance marker is now `{ kind: 'dsh-output-styles' }`. The host removed the shared catch-all `kind: 'plugin'` message source (`MessageSourceMap` is now `user | model | tool | 'system-prompt'`), and the session-format admission gate refuses `kind: 'plugin'` outright. The package declares its own producer-owned source through a `MessageSourceMap` merge instead. The domain record's legacy `plugin` field is still accepted on read (`source.plugin` is optional now) so records written by earlier versions keep validating.
39
+
40
+ - The check that a rule names a valid kebab-case renderer id / tool is unchanged in effect but no longer runs at settings-write time (there is no settings write path any more). It runs in `resolveConfig`, which the plugin calls at load and on every volatile commit, so an invalid value still fails loudly. The cookbook's suggested `Schema.check()` is **not** usable: it does not exist in any published `@deepseek-ai/schemastery` (verified against 3.18.2 and 3.18.3), and a `transform` cannot express the check either because the transform callback receives the schema's *input* (plain values) while `Config` is its *output* (`Volatile` references).
41
+
42
+ - `@deepseek-ai/schemastery` moves to `^3.18.3` and `@deepseek-ai/cordis` to `^4.0.3`. `volatile()` and the `Volatile<T>` type this adapter depends on were added in exactly those releases: schemastery 3.18.2 has neither, and cordis 4.0.2 does not export `Volatile`. The cordis *peer* range is widened (`^4.0.2 || ^4.0.3`), not narrowed, and `@deepseek-ai/cosmokit` (`^1.8.4`) is added as a peer because the emitted `.d.ts` references its `Volatile` type. No supported host line is dropped.
43
+
44
+ - The `@deepseek-ai/dsh-*` dev/test pins move from `0.1.5-rc.2` to `0.1.7-alpha.1`, matching the host this adapter targets. The `0.1.5-rc.3` line was considered and rejected: it still ships the *old* settings contract and the old `kind: 'plugin'` message source, so every adaptation here would fail to typecheck against it. This is a deliberate deviation from the family's `0.1.5-rc.3` dev pin, recorded here for that reason.
45
+
46
+ - `@deepseek-ai/cordis-plugin-loader` moves to `^1.0.4`. Its `loader/volatile-update` event declaration (the hook the live settings commit rides) was added in 1.0.4; 1.0.3 has no such event type.
47
+
48
+ ### Fixed
49
+
50
+ - The session-export surface fold resolves the `image/offload` message projection from the location the 0.1.7 generation actually publishes it, `@deepseek-ai/dsh-compaction-image-offload/projection`. The package root stopped exporting `imageOffloadProjection` (it now exports only `name`/`inject`/`apply`), so the previous root-only dynamic import silently resolved to an empty projection list and an offload-bearing transcript threw `requires a message projection`. The root specifier is kept as a fallback for older generations. `tests/export-surface.spec.ts` carries a structurally valid offload fixture so the counter-lock assertion is load-bearing.
51
+
52
+ - `scripts/loader-runner.mjs` now recovers the reason a Loader row failed and rethrows it. Under `cordis-plugin-loader` 1.0.4 an invalid config no longer rejects `loader.await()`: the row's `_init()` reports through `ctx.logger.error` and returns, so the row silently never mounts. The runner attaches no log exporter, so that message went nowhere and the negative regression reported only the downstream symptom (`/style command is missing`) — the `/expected boolean/` assertion in `tests/composition.spec.ts` was vacuous. The runner now walks the entry tree (including Include subtrees) for a `FiberState.FAILED` row and throws its `_error`, restoring the real reason: `Loader composition: entry failed to load: … $.watchStyles expected boolean but got yes (at watchStyles)`. Verified in both directions — the invalid config now exits 1 with that text, and a valid config still exits 0 with `DSH_LOADER_RESULT`.
53
+
54
+ - The session-export surface fold now supplies the message projection for plugin-owned surface events (`image/offload`, owned by `@deepseek-ai/dsh-compaction-image-offload`, added as an optional peer). The projection is loaded through a conditional dynamic import with a failure-tolerant fallback, so a host that predates the projection contract keeps working, while a new-generation host folds offload-bearing logs instead of throwing. A counter-lock test asserts that a bare fold without projections fails loudly on projection-requiring logs whenever the host fold implements the contract.
55
+
56
+ - The three `@deepseek-ai/dsh-storage*` packages moved from `dependencies` to optional peer dependencies. The plugin previously carried its own pinned `0.1.5-rc.2` copies in `node_modules`, which shadowed the host's newer storage generation — the plugin silently ran against the old storage stack. With the move, `require.resolve` lands on the host's copy, and a missing storage stack fails at composition time instead of silently degrading.
57
+
58
+ ### Added
59
+
60
+ - `dsh.manifestVersion: 1` and the canonical three-clause `engines.dsh` range, matching the 0.1.6 family contract.
61
+
7
62
  ## [0.6.16] - 2026-09-12
8
63
 
9
64
  ### Changed
package/README-es.md CHANGED
@@ -8,13 +8,16 @@
8
8
  *`/style concise` — y a partir de ahora toda respuesta es concisa. `/style off` — de vuelta al valor por defecto del proyecto.*
9
9
 
10
10
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
11
+ [![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-output-styles)
11
12
  [![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
12
13
  [![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-output-styles.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
14
+ [![DSH Market](https://raw.githubusercontent.com/2BingLing/dsh-market/master/assets/readme/badge-listed-en.svg)](https://dsh.market/)
13
15
  [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
14
16
  [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-output-styles/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-output-styles/actions)
15
17
  [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-output-styles?label=version)](https://github.com/PerryLink/dsh-output-styles/releases)
16
18
  [![npm version](https://img.shields.io/npm/v/dsh-output-styles)](https://www.npmjs.com/package/dsh-output-styles)
17
19
  [![npm downloads](https://img.shields.io/npm/dm/dsh-output-styles)](https://www.npmjs.com/package/dsh-output-styles)
20
+ [![dshfind](https://dshfind.com/api/badge/PerryLink/dsh-output-styles?metric=downloads&lang=es)](https://dshfind.com/es/plugins/PerryLink/dsh-output-styles?ref=badge)
18
21
 
19
22
  [English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
20
23
 
@@ -26,7 +29,7 @@
26
29
 
27
30
  | Surface | Status |
28
31
  |---|---|
29
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (adaptado el 2026-09-09): el sobre de sesión conserva su campo ignorable solo para compatibilidad de lectura de logs almacenados - Session.append aún no puede estamparlo, por lo que el comportamiento de la puerta no cambia. Verificado el 2026-09-11 contra el checkout master dsh-v0.1.5-rc.2 (cadena de puertas completa + smoke de instalación del perfil). |
32
+ | Harness | DeepSeek Harness `dsh-v0.1.7-alpha.2` (adaptado el 2026-09-09): el sobre de sesión conserva su campo ignorable solo para compatibilidad de lectura de logs almacenados - Session.append aún no puede estamparlo, por lo que el comportamiento de la puerta no cambia. Verificado el 2026-09-11 contra el checkout master dsh-v0.1.7-alpha.1 (cadena de puertas completa + smoke de instalación del perfil). |
30
33
  | Node | `^22.19.0 || >=24.0.0` |
31
34
  | Platforms | Todas (host + cliente web) |
32
35
  | Model | Cualquiera (inyección en el prompt del sistema) |
@@ -39,10 +42,10 @@
39
42
  - **Comando `/style`** — sin argumento lista los estilos (con descripciones) más la selección actual; `/style <name>` cambia; `/style off` restaura el valor por defecto del proyecto.
40
43
  - **Persistencia por sesión** — la elección vive en el dominio de almacenamiento `output_style`, indexada por sessionId, y sobrevive a los reinicios.
41
44
  - **Inyección en el prompt del sistema** — una contribución `systemPrompt.section()` (orden `sectionOrder`) inyecta el cuerpo del estilo actual en cada ensamblado, truncado a un presupuesto configurable.
42
- - **Paridad Claude Code** — `keep-coding-instructions`, `force-for-plugin` (alias `force`), compatibilidad JSON `outputStyles`, directorios `stylesDir` por capas, recarga en caliente y fallback del proyecto sobre la costura de settings de DSH.
45
+ - **Paridad Claude Code** — `keep-coding-instructions`, `force-for-plugin` (alias `force`), compatibilidad JSON `outputStyles`, directorios `stylesDir` por capas, recarga en caliente y un fallback del proyecto editable en vivo desde la página **Plugins** de la Web.
43
46
  - **Registro de renderers (`output.render.*`)** — `ctx.outputRenderers` permite a cualquier plugin registrar un presenter puro, aplicado a través de la cascada `output.render/before`; renderers integrados `concise` y `step-by-step`.
44
- - **Reglas por sesión/por herramienta** — `rules: [{ match: { tool: 'bash' }, style: 'concise' }]` nombran el renderer para solicitudes coincidentes; editables mediante la sección de settings `output-style-rules`.
45
- - **`/export`** — renderiza la sesión actual a Markdown o HTML saneado a través de la tubería de render; `--save <path>` escribe el documento saneado en esa ruta de workspace tras la aprobación del usuario. Cada render conserva el texto original junto al renderizado.
47
+ - **Reglas por sesión/por herramienta** — `rules: [{ match: { tool: 'bash' }, style: 'concise' }]` nombran el renderer para solicitudes coincidentes; editables en vivo desde la página **Plugins** de la Web.
48
+ - **`/transcript`** — renderiza la sesión actual a Markdown o HTML saneado a través de la tubería de render; `--save <path>` escribe el documento saneado en esa ruta de workspace tras la aprobación del usuario. Cada render conserva el texto original junto al renderizado.
46
49
 
47
50
  ## Quick start
48
51
 
@@ -89,7 +92,7 @@ flowchart LR
89
92
  M -->|full system prompt| H[system/message logged]
90
93
  ```
91
94
 
92
- Todo lo que el modelo ve es reconstruible desde el registro de sesión — sin un nuevo tipo de evento de sesión, sin cambios en el agent-loop. El nombre del estilo viene de `command/run`, el texto exacto inyectado de `system/message`, y el marcador de procedencia `{ kind: 'plugin', plugin: 'dsh-output-styles' }` viaja en el registro del dominio. Los estilos se aplican solo a la conversación principal; las sesiones de subagente conservan sus propios prompts (igual que Claude Code).
95
+ Todo lo que el modelo ve es reconstruible desde el registro de sesión — sin un nuevo tipo de evento de sesión, sin cambios en el agent-loop. El nombre del estilo viene de `command/run`, el texto exacto inyectado de `system/message`, y el marcador de procedencia `{ kind: 'dsh-output-styles' }` viaja en el registro del dominio. Los estilos se aplican solo a la conversación principal; las sesiones de subagente conservan sus propios prompts (igual que Claude Code).
93
96
 
94
97
  ## Install & uninstall
95
98
 
@@ -102,26 +105,30 @@ Todo lo que el modelo ve es reconstruible desde el registro de sesión — sin u
102
105
 
103
106
  Todos los parámetros son campos Schemastery `Config` (modificables desde cordis.yml). Los valores inválidos fallan la carga.
104
107
 
105
- | Key | Default | Meaning |
106
- |---|---|---|
107
- | `stylesDir` | `[]` | Directorios de la librería, resueltos contra cwd; las entradas posteriores sobrescriben las anteriores. `[]` = solo los `styles/` integrados |
108
- | `maxStyleChars` | `4000` | Presupuesto del cuerpo del estilo (≥ 1); los cuerpos más largos se truncan con un marcador |
109
- | `defaultStyle` | `''` | Estilo para sesiones que nunca eligieron uno (y sin valor por defecto en settings); `''` = sin estilo |
110
- | `compatJson` | `true` | Cargar entradas JSON `outputStyles` de Claude Code (objetos sueltos o arrays) |
111
- | `sectionOrder` | `90` | Orden de la sección inyectada (0 = persona, 100–199 = guía de herramientas) |
112
- | `truncationMarker` | `"\n\n[style truncated]"` | Marcador añadido en el punto de truncado |
113
- | `includeBuiltins` | `true` | Incluir los `styles/` del paquete como capa de menor prioridad |
114
- | `watchStyles` | `true` | Recargar la librería cuando un archivo de estilo cambia en disco |
115
- | `rules` | `[]` | Reglas de render por sesión/herramienta: `[{ match: { tool?, contentType?, session? }, style, priority? }]` |
116
- | `enableExport` | `true` | Registrar el comando `/export` (exportación de sesión Markdown/HTML, consciente del renderer; `--save` escribe con aprobación) |
117
- | `respectCoreOutputStyles` | `true` | Al detectar un servicio core `outputStyles`, omitir la inyección de prompt de este plugin (mantener hot-switch / rules / export) |
108
+ `defaultStyle` y `rules` están declarados `volatile()`, así que en un host que compone la costura de formularios de settings son **campos vivos, editables en la Web**: edítalos en **Plugins → dsh-output-styles** de la interfaz Web y el plugin en ejecución adopta el nuevo valor sin remontarse. Todos los demás campos siguen siendo solo de composición y requieren una recarga. Un valor confirmado se valida antes de aplicarse — si es inválido se rechaza y los valores en ejecución no cambian.
109
+
110
+ | Key | Default | Editable en Web | Meaning |
111
+ |---|---|---|---|
112
+ | `stylesDir` | `[]` | No | Directorios de la librería, resueltos contra cwd; las entradas posteriores sobrescriben las anteriores. `[]` = solo los `styles/` integrados |
113
+ | `maxStyleChars` | `4000` | No | Presupuesto del cuerpo del estilo (≥ 1); los cuerpos más largos se truncan con un marcador |
114
+ | `defaultStyle` | `''` | **Sí** | Estilo para sesiones que nunca eligieron uno; `''` = sin estilo. Un nombre que no está en la librería viva se rechaza en lugar de inyectarse |
115
+ | `compatJson` | `true` | No | Cargar entradas JSON `outputStyles` de Claude Code (objetos sueltos o arrays) |
116
+ | `sectionOrder` | `90` | No | Orden de la sección inyectada (0 = persona, 100–199 = guía de herramientas) |
117
+ | `truncationMarker` | `"\n\n[style truncated]"` | No | Marcador añadido en el punto de truncado |
118
+ | `includeBuiltins` | `true` | No | Incluir los `styles/` del paquete como capa de menor prioridad |
119
+ | `watchStyles` | `true` | No | Recargar la librería cuando un archivo de estilo cambia en disco |
120
+ | `rules` | `[]` | **Sí** | Reglas de render por sesión/herramienta: `[{ match: { tool?, contentType?, session? }, style, priority? }]` |
121
+ | `enableExport` | `true` | No | Registrar el comando `/transcript` (exportación de sesión Markdown/HTML, consciente del renderer; `--save` escribe con aprobación) |
122
+ | `respectCoreOutputStyles` | `true` | No | Al detectar un servicio core `outputStyles`, omitir la inyección de prompt de este plugin (mantener hot-switch / rules / export) |
123
+
124
+ **Migración desde 0.1.6 o anterior.** Esas versiones mantenían dos secciones de settings propias del plugin, `output-style` (`style`) y `output-style-rules` (`rules`). El host 0.1.7 eliminó la API sobre la que se construyeron, así que ambas secciones ya no existen. Mueve cualquier valor que tuvieras ahí al campo `Config` correspondiente — `output-style.style` → `defaultStyle`, `output-style-rules.rules` → `rules` — en el patch de tu perfil (`cordis.yml`), o defínelo en la página Plugins. Las elecciones por sesión hechas con `/style` no se ven afectadas: viven en el dominio de almacenamiento `output_style`.
118
125
 
119
126
  ## Tools & surfaces
120
127
 
121
128
  | Surface | Kind | Notes |
122
129
  |---|---|---|
123
130
  | `/style` | command | Lista estilos, cambia o restaura el valor por defecto del proyecto |
124
- | `/export` | command | Renderiza la sesión actual a Markdown o HTML saneado; `--save` escribe con aprobación |
131
+ | `/transcript` | command | Renderiza la sesión actual a Markdown o HTML saneado; `--save` escribe con aprobación |
125
132
  | `output_style` | storage domain | Elección de estilo por sesión, indexada por sessionId |
126
133
  | `systemPrompt.section()` | contribution | Inyecta el cuerpo del estilo actual en cada ensamblado |
127
134
  | `output.render.*` | renderer registry | `ctx.outputRenderers` + la cascada `output.render/before` |
@@ -137,11 +144,11 @@ Todos los parámetros son campos Schemastery `Config` (modificables desde cordis
137
144
  | `/style Diagrams first` | Los nombres de varias palabras son el resto completo |
138
145
  | `/style off` | Restaura el valor por defecto del proyecto (default de settings, luego `defaultStyle`) |
139
146
  | `/style nope` | `error: unknown output style "nope" (available: …)` |
140
- | `/export` | Renderiza la sesión actual a Markdown a través de la pipeline de render |
141
- | `/export md` | Renderiza a Markdown (`md` es la forma abreviada de `markdown`) |
142
- | `/export html` | Renderiza a HTML saneado |
143
- | `/export --renderer=concise` | Renderiza forzando un renderer (reglas omitidas) |
144
- | `/export md --save report.md` | Renderiza y luego escribe el documento saneado en `report.md` tras la aprobación |
147
+ | `/transcript` | Renderiza la sesión actual a Markdown a través de la pipeline de render |
148
+ | `/transcript md` | Renderiza a Markdown (`md` es la forma abreviada de `markdown`) |
149
+ | `/transcript html` | Renderiza a HTML saneado |
150
+ | `/transcript --renderer=concise` | Renderiza forzando un renderer (reglas omitidas) |
151
+ | `/transcript md --save report.md` | Renderiza y luego escribe el documento saneado en `report.md` tras la aprobación |
145
152
 
146
153
  ## Style library
147
154
 
@@ -179,7 +186,7 @@ La entrada `dsh.client` decora la invocación desnuda del comando `/style` con u
179
186
  | JSON heredado | array `outputStyles` en `settings.json` | Cargado textualmente (`compatJson: true`) |
180
187
  | Cuándo entra en vigor | Después de `/clear` o una sesión nueva | Inmediatamente — el prompt del sistema se reensambla por solicitud |
181
188
  | Subagentes | Los estilos no se aplican | Igual — las sesiones de subagente conservan sus propios prompts |
182
- | Cambio | menú `/config` o ajuste `outputStyle` (el comando `/output-style` se eliminó en v2.1.91) | comando `/style` + Web picker + settings `output-style.style` |
189
+ | Cambio | menú `/config` o ajuste `outputStyle` (el comando `/output-style` se eliminó en v2.1.91) | comando `/style` + Web picker + campo `defaultStyle` en la página Plugins de la Web |
183
190
 
184
191
  ## Conflict check
185
192
 
@@ -189,14 +196,14 @@ Filtrado contra el ecosistema DSH antes del desarrollo (instantánea 2026-08): n
189
196
 
190
197
  - **Permissions**: el manifiesto de workshop declara `fs:read`, `fs:write`, `fs:watch`, `storage:read`, `storage:write` y `settings:read`.
191
198
  - **Data**: la elección de estilo vive en el dominio de almacenamiento `output_style` (indexada por sessionId); no se persiste otro estado, sin solicitudes de red.
192
- - **Session log**: el nombre del estilo viene de `command/run`, el texto exacto inyectado de `system/message`; el marcador de procedencia `{ kind: 'plugin', plugin: 'dsh-output-styles' }` viaja en el registro del dominio.
199
+ - **Session log**: el nombre del estilo viene de `command/run`, el texto exacto inyectado de `system/message`; el marcador de procedencia `{ kind: 'dsh-output-styles' }` viaja en el registro del dominio.
193
200
 
194
201
  ## Security boundaries
195
202
 
196
203
  - **Solo servicios públicos.** Contribuye `systemPrompt`, comandos, almacenamiento y settings; sin cambios en engine / agent-loop / apiproxy / UI oficial.
197
204
  - **Visible para el modelo ⟺ registrado.** Todo lo que el modelo ve es reconstruible desde el registro de sesión — sin un nuevo tipo de evento de sesión, sin cambios en el agent-loop.
198
- - **Original siempre conservado.** Cada render (y `/export`) conserva el texto original junto al renderizado; para la exportación HTML se usa HTML saneado.
199
- - **Escrituras en disco controladas.** `/export --save` escribe solo después de que el servicio de aprobación lo conceda, y el contenido escrito pasa primero por la función pura `sanitizeText`; sin un servicio de aprobación o fs no escribe nada (fail-closed).
205
+ - **Original siempre conservado.** Cada render (y `/transcript`) conserva el texto original junto al renderizado; para la exportación HTML se usa HTML saneado.
206
+ - **Escrituras en disco controladas.** `/transcript --save` escribe solo después de que el servicio de aprobación lo conceda, y el contenido escrito pasa primero por la función pura `sanitizeText`; sin un servicio de aprobación o fs no escribe nada (fail-closed).
200
207
 
201
208
  ## Known limitations
202
209
 
@@ -227,46 +234,56 @@ Lanzamientos: empujar una etiqueta `v*` cuyo sufijo coincide con la versión de
227
234
 
228
235
  ## PerryLink DSH Plugin Family
229
236
 
230
- Este proyecto es uno de los [37 complementos de DeepSeek Harness](https://github.com/PerryLink) mantenidos por [PerryLink](https://github.com/PerryLink). Si este te ayuda, probablemente los demás también:
237
+ This project is one of the **45 DeepSeek Harness plugins** maintained by [PerryLink](https://github.com/PerryLink). If this one helps you, the others likely will too:
231
238
 
232
239
  | Plugin | One-liner |
233
240
  |---|---|
234
- | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | Auto-revisión de segundo modelo en la cadena de aprobación, con cierre en fallo por defecto | |
235
- | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | Agentes hijos en segundo plano durables con barra lateral de UI web, mensajería e interrupción | |
236
- | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | Gobernanza de costes para DeepSeek Harness: presupuestos, carbono y latencia en un panel. | |
237
- | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Equivalente a /rewind de Claude Code: instantáneas, bifurcaciones de sesión, restauración de un solo uso | |
238
- | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migra sesiones, memoria, habilidades y CLAUDE.md de Claude Code a DSH | |
239
- | **[dsh-click](https://github.com/PerryLink/dsh-click)** | Control de escritorio nativo multiplataforma para DeepSeek Harness — Windows primero. | |
240
- | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | Historial de entrada estilo terminal para el compositor web: flechas, búsqueda Ctrl+R | |
241
- | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | Comprobaciones de calidad de datasets y verificación de citas (el puente numérico opcional consumido aquí) | |
242
- | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | Defensa contra inyección de prompts, jailbreak y fuga de secretos para DeepSeek Harness. | |
243
- | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Guardián de disciplina de ingeniería: interrogatorio de requisitos, puertas de pruebas, revisión adversaria | |
244
- | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | Enrutamiento unificado de generación de imágenes estáticas para DeepSeek Harness. | |
245
- | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | Diagnóstico de rendimiento de solo lectura para DeepSeek Harness. | |
246
- | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | Informes de investigación deterministas para fondos mutuos públicos chinos | |
247
- | **[dsh-github](https://github.com/PerryLink/dsh-github)** | Integración de PR/issues de GitHub para DSH, cada escritura controlada por aprobación | |
248
- | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | Orquestación de investigación sectorial que sella sus entregables mediante el `ctx.researchReport.assemble` de este plugin | |
249
- | **[dsh-library](https://github.com/PerryLink/dsh-library)** | Base de conocimiento documental local para DeepSeek Harness. | |
250
- | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | Integración de modelos locales (Ollama) para DeepSeek Harness. | |
251
- | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | Diagnósticos, formato, autocompletado, acciones de código y renombrado LSP sobre servidores de lenguaje | |
252
- | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | Middleware de enmascaramiento de PII: anonimiza en el límite del modelo, restaura en la capa de visualización | |
253
- | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | Panel de tiempo de ejecución MCP de solo lectura: comando /mcp + pestaña Settings con estado, herramientas y errores | |
254
- | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | Memoria entre sesiones controlada por aprobación: costura ctx.memory + SQLite + herramienta de memoria | |
255
- | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | Exportador de observabilidad OpenTelemetry y Langfuse para DeepSeek Harness. | |
256
- | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Reglas de permisos declarativas allow/deny/ask estilo Claude Code con auditoría | |
257
- | **[dsh-personal-directive](https://github.com/PerryLink/dsh-personal-directive)** | Inyector de directivas personales con interruptor en la barra superior (edición framework) |
258
- | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Base de conocimiento de desarrollo de plugins como habilidad de agente bajo demanda | |
259
- | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | Puente multicanal de aprobación/preguntas: WeChat/Telegram/Feishu, consola de sesión |
260
- | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Motor de informes de investigación verificables con evidencia direccionada por contenido | |
261
- | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Puntuación de calidad multidimensional para plugins de DeepSeek Harness. | |
262
- | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Fija sesiones en la barra lateral web con orden durable | |
263
- | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | Sincronización de sesiones entre dispositivos para DeepSeek Harness — un espejo git dedicado de tu almacén de sesiones. | |
264
- | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | Paquete de habilidades de auditoría de seguridad: escaneo de secretos, revisión de dependencias y cadena de suministro | |
265
- | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | Bucle de sesión con voz para DeepSeek Harness: háblale y escucha su respuesta. | |
266
- | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Pruebas de instalación y humo aisladas para plugins de DeepSeek Harness. | |
267
- | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | Puente de tareas TickTick/Dida365: panel de cabecera de sesión + 11 herramientas |
268
- | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Traducción de parámetros entre proveedores y reparación determinista de JSON para DeepSeek Harness. | |
269
- | **[dsh-wechat](https://github.com/PerryLink/dsh-wechat)** | Puente WeChat ↔ DSH (bot Tencent iLink): texto/imagen/archivo/voz, aprobaciones en el chat |
241
+ | **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** | Second-model auto-review on the approval chain, fail-closed by default | |
242
+ | **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** | Automatic strong/cheap model-tier routing with deterministic risk guards and a `/tier` command | |
243
+ | **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | Durable background child agents with a Web UI sidebar, messaging and interrupt | |
244
+ | **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | Cost governance for DeepSeek Harness: budgets, carbon, and latency in one panel. | |
245
+ | **[dsh-catalog](https://github.com/PerryLink/dsh-catalog)** | DSH Desktop Market standard catalog source for the PerryLink family | |
246
+ | **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** | Read-only MCP server exposing the certification registry: grades, snapshots and five-dimension evidence | |
247
+ | **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore | |
248
+ | **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH | |
249
+ | **[dsh-click](https://github.com/PerryLink/dsh-click)** | Cross-platform native desktop control for DeepSeek Harness — Windows first. | |
250
+ | **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** | Terminal-style input history for the web composer: arrows, Ctrl+R search | |
251
+ | **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** | Dataset quality checks and citation cross-checks (the optional numeric bridge consumed here) | |
252
+ | **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | Prompt-injection, jailbreak, and secret-leak defense for DeepSeek Harness. | |
253
+ | **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** | Engineering-discipline guard: requirements grill, test gates, adversary review | |
254
+ | **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | Unified static-image generation routing for DeepSeek Harness. | |
255
+ | **[dsh-fast](https://github.com/PerryLink/dsh-fast)** | Read-only performance diagnostics for DeepSeek Harness. | |
256
+ | **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** | Deterministic research reports for Chinese public mutual funds | |
257
+ | **[dsh-github](https://github.com/PerryLink/dsh-github)** | GitHub PR/issues integration for DSH, every write gated by approval | |
258
+ | **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** | Industry research orchestration that seals its deliverables through this plugin's `ctx.researchReport.assemble` | |
259
+ | **[dsh-laya](https://github.com/PerryLink/dsh-laya)** | Laya typed decisions (`noul`/`choice`/`score`) as a first-class Cordis service and model-visible tools | |
260
+ | **[dsh-library](https://github.com/PerryLink/dsh-library)** | Local document knowledge base for DeepSeek Harness. | |
261
+ | **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** | Local-model (Ollama) integration for DeepSeek Harness. | |
262
+ | **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** | LSP diagnostics, formatting, completion, code actions and rename over language servers | |
263
+ | **[dsh-mask](https://github.com/PerryLink/dsh-mask)** | PII masking middleware: anonymize at the model boundary, restore at the display layer | |
264
+ | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors | |
265
+ | **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool | |
266
+ | **[dsh-observe](https://github.com/PerryLink/dsh-observe)** | OpenTelemetry and Langfuse observability exporter for DeepSeek Harness. | |
267
+ | **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles-equivalent runtime style switching | |
268
+ | **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** | Claude Code-style declarative allow/deny/ask permission rules with audit | |
269
+ | **[dsh-plugin-certification](https://github.com/PerryLink/dsh-plugin-certification)** | Community certification registry with repro-checkable grades and badges | |
270
+ | **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** | Zero-dependency static + sandbox smoke detector for DSH plugins | |
271
+ | **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** | Plugin-development knowledge base as an on-demand agent skill | |
272
+ | **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** | Shared zero-runtime-dependency toolkit for the PerryLink DSH plugins | |
273
+ | **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** | One-package, one-corridor-index plugin upgrade skill: routes a repository to the matching closed corridor card | |
274
+ | **[dsh-plugin-upgrade-015](https://github.com/PerryLink/dsh-plugin-upgrade-015)** | Merged `0.1.3-alpha.1` → `0.1.5-rc.1` upgrade corridor card plus a zero-dependency seam scanner | |
275
+ | **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | Multi-channel approval/question bridge: WeChat/Telegram/Feishu, session console | |
276
+ | **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** | Verifiable research-report engine: content-addressed evidence ledger and sealed versions | |
277
+ | **[dsh-score](https://github.com/PerryLink/dsh-score)** | Multi-dimensional quality scoring for DeepSeek Harness plugins. | |
278
+ | **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | Pin sessions in the Web sidebar with durable ordering | |
279
+ | **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** | Cross-device session sync for DeepSeek Harness — a dedicated git mirror of your session store. | |
280
+ | **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** | Security-audit skill pack: secret scan, dependency and supply-chain review | |
281
+ | **[dsh-talk](https://github.com/PerryLink/dsh-talk)** | Voice-first session loop for DeepSeek Harness: talk to it, hear it answer. | |
282
+ | **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | Cross-session team rooms: shared message bus, task board and timeline | |
283
+ | **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** | Isolated install-and-smoke test drives for DeepSeek Harness plugins. | |
284
+ | **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** | TickTick/Dida365 task bridge: session-header panel + 11 tools | |
285
+ | **[dsh-translate](https://github.com/PerryLink/dsh-translate)** | Vendor parameter translation and deterministic JSON repair for DeepSeek Harness. | |
286
+
270
287
 
271
288
  ## License
272
289