dsh-output-styles 0.3.2 → 0.4.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/CHANGELOG.md +21 -0
- package/README.es.md +168 -124
- package/README.hi.md +246 -0
- package/README.md +151 -107
- package/README.pt.md +246 -0
- package/README.zh.md +168 -124
- package/docs/renderer-protocol.md +134 -0
- package/docs/renderer-protocol.zh.md +125 -0
- package/lib/index.js +437 -5
- package/lib/types/client/index.d.ts +1 -1
- package/lib/types/config.d.ts +32 -0
- package/lib/types/config.d.ts.map +1 -1
- package/lib/types/export.d.ts +76 -0
- package/lib/types/export.d.ts.map +1 -0
- package/lib/types/index.d.ts +12 -12
- package/lib/types/renderers.d.ts +119 -0
- package/lib/types/renderers.d.ts.map +1 -0
- package/lib/types/runtime.d.ts +14 -3
- package/lib/types/runtime.d.ts.map +1 -1
- package/lib/types/types.d.ts +32 -0
- package/lib/types/types.d.ts.map +1 -1
- package/package.json +15 -7
- package/src/config.ts +49 -0
- package/src/export.ts +199 -0
- package/src/renderers.ts +264 -0
- package/src/runtime.ts +115 -2
- package/src/types.ts +28 -0
- package/README.ja.md +0 -202
- package/README.ko.md +0 -202
package/README.pt.md
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# 🎨 dsh-output-styles
|
|
4
|
+
|
|
5
|
+
**O `outputStyles` do Claude Code para o DeepSeek Harness**: alterne o estilo de saída do modelo em tempo de execução, por sessão, de forma durável.
|
|
6
|
+
|
|
7
|
+
*`/style concise` — e a partir de agora toda resposta é concisa. `/style off` — de volta ao padrão do projeto.*
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](https://github.com/topics/dsh-plugin)
|
|
11
|
+
[](#)
|
|
12
|
+
[](https://github.com/PerryLink/dsh-output-styles/actions)
|
|
13
|
+
[](https://github.com/PerryLink/dsh-output-styles/releases)
|
|
14
|
+
[](https://www.npmjs.com/package/dsh-output-styles)
|
|
15
|
+
[](https://www.npmjs.com/package/dsh-output-styles)
|
|
16
|
+
|
|
17
|
+
[English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
|
|
18
|
+
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Compatibility
|
|
24
|
+
|
|
25
|
+
| Surface | Status |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Harness | DeepSeek Harness `0.1.0-rc.6` |
|
|
28
|
+
| Node | `^22.19.0 || >=24.0.0` |
|
|
29
|
+
| Platforms | Todas (host + cliente web) |
|
|
30
|
+
| Model | Qualquer (injeção no prompt do sistema) |
|
|
31
|
+
|
|
32
|
+
## What you get
|
|
33
|
+
|
|
34
|
+
O `dsh-output-styles` é o equivalente do `outputStyles` do Claude Code para o DeepSeek Harness: um comando `/style` que alterna o estilo de saída do modelo em tempo de execução, persistido por sessão e injetado a cada montagem do prompt.
|
|
35
|
+
|
|
36
|
+
- **Biblioteca de estilos** — um arquivo Markdown por estilo (`styles/*.md`); frontmatter para metadados, corpo = a diretiva do modelo. Seis estilos integrados (`concise`, `explanatory`, `formal`, `learning`, `proactive`, `step-by-step`), incluindo `proactive` e `learning` com paridade Claude Code.
|
|
37
|
+
- **Comando `/style`** — sem argumento lista os estilos (com descrições) e a seleção atual; `/style <name>` alterna; `/style off` restaura o padrão do projeto.
|
|
38
|
+
- **Persistência por sessão** — a escolha vive no domínio de armazenamento `output_style`, indexada por sessionId, e sobrevive a reinícios.
|
|
39
|
+
- **Injeção no prompt do sistema** — uma contribuição `systemPrompt.section()` (ordem `sectionOrder`) injeta o corpo do estilo atual a cada montagem, truncado em um orçamento configurável.
|
|
40
|
+
- **Paridade Claude Code** — `keep-coding-instructions`, `force-for-plugin` (alias `force`), compatibilidade JSON `outputStyles`, diretórios `stylesDir` em camadas, recarga a quente e fallback do projeto sobre a costura de settings do DSH.
|
|
41
|
+
- **Registro de renderers (`output.render.*`)** — `ctx.outputRenderers` permite a qualquer plugin registrar um presenter puro, aplicado pela cascata `output.render/before`; renderers integrados `concise` e `step-by-step`.
|
|
42
|
+
- **Regras por sessão/por ferramenta** — `rules: [{ match: { tool: 'bash' }, style: 'concise' }]` nomeiam o renderer para solicitações coincidentes; editáveis pela seção de settings `output-style-rules`.
|
|
43
|
+
- **`/export`** — renderiza a sessão atual para Markdown ou HTML saneado pela pipeline de render; cada render mantém o texto original ao lado do renderizado.
|
|
44
|
+
|
|
45
|
+
## Quick start
|
|
46
|
+
|
|
47
|
+
```sh
|
|
48
|
+
# 1. install the bundle into your profile
|
|
49
|
+
dsh plugin --profile web add "github:PerryLink/dsh-output-styles#main"
|
|
50
|
+
|
|
51
|
+
# or from npm (published releases)
|
|
52
|
+
dsh plugin --profile web add dsh-output-styles
|
|
53
|
+
|
|
54
|
+
# 2. restart and verify the row
|
|
55
|
+
dsh --profile web --dump-config | grep -A3 'id: output-styles'
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Demo
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
You > /style
|
|
62
|
+
output style off
|
|
63
|
+
concise — Terse, direct answers — minimal prose, no preamble. (Daily coding work, tool-heavy sessions, or when prompt length matters.)
|
|
64
|
+
explanatory — Educational answers with short "Insights" that teach as you work. (Learning a codebase, onboarding, …)
|
|
65
|
+
formal — Formal, precise prose with complete sentences and defined terms. (Reports, documentation, release notes, …)
|
|
66
|
+
learning — Collaborative learn-by-doing mode with short "Insights" and small hands-on steps for the user. (Pairing, onboarding, …)
|
|
67
|
+
proactive — Execute immediately, assume reasonable defaults, and prefer action over planning. (Routine multi-step work, …)
|
|
68
|
+
step-by-step — Numbered reasoning steps with explicit intermediate results. (Debugging, design decisions, …)
|
|
69
|
+
|
|
70
|
+
You > /style concise
|
|
71
|
+
switched to concise
|
|
72
|
+
|
|
73
|
+
You > 请只用一句话介绍你自己。
|
|
74
|
+
AI > 我是运行在 DeepSeek Harness 插件化平台上、基于 deepseek-v4-pro 模型的 AI 编码代理。
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## How it works
|
|
78
|
+
|
|
79
|
+
```mermaid
|
|
80
|
+
flowchart LR
|
|
81
|
+
U[You type /style concise] --> C[command registry]
|
|
82
|
+
C -->|command/run logged| L[(session log)]
|
|
83
|
+
C -->|put {style, source}| D[(output_style domain)]
|
|
84
|
+
D --> R[OutputStyleRuntime]
|
|
85
|
+
R -->|body at every assembly| S[systemPrompt section order 90]
|
|
86
|
+
S --> M[Model request]
|
|
87
|
+
M -->|full system prompt| H[request/header logged]
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Tudo o que o modelo vê é reconstruível a partir do log de sessão — sem novo tipo de evento de sessão, sem alterações no agent-loop. O nome do estilo vem de `command/run`, o texto exato injetado de `request/header`, e o marcador de procedência `{ kind: 'plugin', plugin: 'dsh-output-styles' }` viaja no registro do domínio. Os estilos se aplicam apenas à conversa principal; sessões de subagente mantêm seus próprios prompts (como no Claude Code).
|
|
91
|
+
|
|
92
|
+
## Install & uninstall
|
|
93
|
+
|
|
94
|
+
- **canal git** (último `main`): `dsh plugin --profile web add "github:PerryLink/dsh-output-styles#main"` — o script `prepare` compila apenas com dependências de produção.
|
|
95
|
+
- **canal npm** (versões publicadas): `dsh plugin --profile web add dsh-output-styles`.
|
|
96
|
+
- **canal tarball**: `pnpm pack` neste repo, depois `dsh plugin --profile web add ./dsh-output-styles-<version>.tgz`.
|
|
97
|
+
- **desinstalar**: `dsh plugin --profile web remove dsh-output-styles`.
|
|
98
|
+
|
|
99
|
+
## Configuration
|
|
100
|
+
|
|
101
|
+
Todos os parâmetros são campos Schemastery `Config` (alteráveis pelo cordis.yml). Valores inválidos falham a carga.
|
|
102
|
+
|
|
103
|
+
| Key | Default | Meaning |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| `stylesDir` | `[]` | Diretórios da biblioteca, resolvidos contra o cwd; entradas posteriores sobrescrevem as anteriores. `[]` = somente os `styles/` integrados |
|
|
106
|
+
| `maxStyleChars` | `4000` | Orçamento do corpo do estilo (≥ 1); corpos mais longos são truncados com um marcador |
|
|
107
|
+
| `defaultStyle` | `''` | Estilo para sessões que nunca escolheram um (e sem padrão em settings); `''` = sem estilo |
|
|
108
|
+
| `compatJson` | `true` | Carregar entradas JSON `outputStyles` do Claude Code (objetos avulsos ou arrays) |
|
|
109
|
+
| `sectionOrder` | `90` | Ordem da seção injetada (0 = persona, 100–199 = guia de ferramentas) |
|
|
110
|
+
| `truncationMarker` | `"\n\n[style truncated]"` | Marcador anexado no ponto de truncamento |
|
|
111
|
+
| `includeBuiltins` | `true` | Incluir os `styles/` do pacote como camada de menor prioridade |
|
|
112
|
+
| `watchStyles` | `true` | Recarregar a biblioteca quando um arquivo de estilo muda em disco |
|
|
113
|
+
| `rules` | `[]` | Regras de render por sessão/ferramenta: `[{ match: { tool?, contentType?, session? }, style, priority? }]` |
|
|
114
|
+
| `enableExport` | `true` | Registrar o comando `/export` (exportação de sessão Markdown/HTML, ciente do renderer) |
|
|
115
|
+
|
|
116
|
+
## Tools & surfaces
|
|
117
|
+
|
|
118
|
+
| Surface | Kind | Notes |
|
|
119
|
+
|---|---|---|
|
|
120
|
+
| `/style` | command | Lista estilos, alterna ou restaura o padrão do projeto |
|
|
121
|
+
| `/export` | command | Renderiza a sessão atual para Markdown ou HTML saneado |
|
|
122
|
+
| `output_style` | storage domain | Escolha de estilo por sessão, indexada por sessionId |
|
|
123
|
+
| `systemPrompt.section()` | contribution | Injeta o corpo do estilo atual a cada montagem |
|
|
124
|
+
| `output.render.*` | renderer registry | `ctx.outputRenderers` + a cascata `output.render/before` |
|
|
125
|
+
| `style` | projection | `{ options, currentValue }` dobrado a partir de comandos assentados |
|
|
126
|
+
| Web picker | client entry | `dsh-output-styles/client` decora `/style` com um seletor pop-up |
|
|
127
|
+
|
|
128
|
+
## Command reference
|
|
129
|
+
|
|
130
|
+
| Input | Outcome |
|
|
131
|
+
|---|---|
|
|
132
|
+
| `/style` | Lista a seleção atual + uma linha por estilo (nome — descrição) |
|
|
133
|
+
| `/style concise` | Alterna (escrita durável), `switched to concise` |
|
|
134
|
+
| `/style Diagrams first` | Nomes com várias palavras são o restante inteiro |
|
|
135
|
+
| `/style off` | Restaura o padrão do projeto (default de settings, depois `defaultStyle`) |
|
|
136
|
+
| `/style nope` | `error: unknown output style "nope" (available: …)` |
|
|
137
|
+
| `/export` | Renderiza a sessão atual para Markdown pela pipeline de render |
|
|
138
|
+
| `/export html` | Renderiza para HTML saneado |
|
|
139
|
+
| `/export --renderer=concise` | Renderiza forçando um renderer (regras ignoradas) |
|
|
140
|
+
|
|
141
|
+
## Style library
|
|
142
|
+
|
|
143
|
+
Um arquivo Markdown por estilo; frontmatter para metadados, corpo = a diretiva do modelo. `name` toma por padrão o nome do arquivo e pode conter espaços (`Diagrams first`).
|
|
144
|
+
|
|
145
|
+
| Field | Default | Meaning |
|
|
146
|
+
|---|---|---|
|
|
147
|
+
| `name` | nome do arquivo | Alvo da alternância; letras, dígitos, espaços e hífens (`off` é reservado) |
|
|
148
|
+
| `description` | — (obrigatório) | Uma frase exibida nas listagens e no seletor |
|
|
149
|
+
| `whenToUse` | — | Orientação opcional anexada às listagens |
|
|
150
|
+
| `keep-coding-instructions` | `false` | Manter o prompt do harness quando `true`; substituí-lo quando `false` (semântica Claude Code) |
|
|
151
|
+
| `force-for-plugin` | `false` | Aplicar incondicionalmente, sobrescrevendo qualquer seleção de sessão; `force` é um alias, no máximo um estilo pode defini-lo |
|
|
152
|
+
|
|
153
|
+
Com `compatJson: true`, entradas JSON `outputStyles` do Claude Code (`{ name, description, prompt }`) carregam ao lado dos estilos Markdown; entradas não analisáveis são omitidas com um aviso.
|
|
154
|
+
|
|
155
|
+
## Renderer protocol
|
|
156
|
+
|
|
157
|
+
O protocolo `output.render.*` transforma a apresentação em um ponto de extensão. Um renderer é um **presenter puro** — `presenter(text, context)` mapeia argumentos para dados de exibição, nunca toca o DOM — emparelhado por nome de ferramenta e tipo de conteúdo, ordenado por prioridade.
|
|
158
|
+
|
|
159
|
+
- **Waterfall primeiro**: toda solicitação de render passa por `output.render/before` (`{ text, context }`); os listeners devem chamar `next()`.
|
|
160
|
+
- **Rules**: `rules: [{ match: { tool: 'bash' }, style: 'concise' }]` nomeia o renderer para solicitações coincidentes; empates se resolvem por `priority` e depois pela ordem da regra.
|
|
161
|
+
- **Built-ins**: `concise` (compactação de espaços + truncamento por orçamento) e `step-by-step` (numeração de passos consistente).
|
|
162
|
+
- **Auditabilidade**: cada resultado de render carrega `{ original, rendered, rendererId, changed }`; o texto renderizado é o que aparece, o original permanece reconstruível a partir do log de sessão.
|
|
163
|
+
|
|
164
|
+
## Web picker
|
|
165
|
+
|
|
166
|
+
A entrada `dsh.client` decora a invocação nua do comando `/style` com um seletor pop-up: uma linha "off" mais uma linha por estilo da biblioteca (`description · whenToUse`), com a linha ativa marcada. Escolher envia `/style <name>` pelo Remote de comandos, de modo que cada alternância mantém o ciclo de vida durável do comando host. O seletor segue o par de idiomas `zh`/`en` da Web UI.
|
|
167
|
+
|
|
168
|
+
## Differences from Claude Code
|
|
169
|
+
|
|
170
|
+
| | Claude Code | dsh-output-styles |
|
|
171
|
+
|---|---|---|
|
|
172
|
+
| Arquivos de estilo | `.claude/output-styles` em níveis usuário/projeto/gerenciado | diretórios `stylesDir` + `styles/` integrados, vence o diretório posterior |
|
|
173
|
+
| Estilos personalizados | Markdown, frontmatter `name`/`description`/`keep-coding-instructions`/`force-for-plugin` | Mesmos campos (`force-for-plugin` aceito textualmente, `force` como alias) + `whenToUse` |
|
|
174
|
+
| JSON legado | array `outputStyles` em `settings.json` | Carregado textualmente (`compatJson: true`) |
|
|
175
|
+
| Quando entra em vigor | Após `/clear` ou uma sessão nova | Imediatamente — o prompt do sistema se remonta por solicitação |
|
|
176
|
+
| Subagentes | Estilos não se aplicam | Igual — sessões de subagente mantêm seus próprios prompts |
|
|
177
|
+
| Alternância | menu `/config` ou ajuste `outputStyle` (o comando `/output-style` foi removido na v2.1.91) | comando `/style` + Web picker + settings `output-style.style` |
|
|
178
|
+
|
|
179
|
+
## Conflict check
|
|
180
|
+
|
|
181
|
+
Filtrado contra o ecossistema DSH antes do desenvolvimento (instantânea 2026-08): nenhum repositório `style`/`output-style` sob [topic:dsh-plugin](https://github.com/topics/dsh-plugin), nenhuma categoria de output-style nas quatro principais [awesome lists](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin), e nenhuma entrada no [catálogo dsh-hub](https://github.com/omdsh-dev/dsh-hub-workshop). Os vizinhos mais próximos — [dsh-soul-md](https://github.com/Scorp1o117/dsh-soul-md) (persona) e [dsh-claude-marketplace](https://github.com/ben7am1n/dsh-claude-marketplace) (estilos de saída diferidos explicitamente para v0.2+) — são adjacentes, não conflitantes.
|
|
182
|
+
|
|
183
|
+
## Permissions & data
|
|
184
|
+
|
|
185
|
+
- **Permissions**: o manifesto de workshop declara `fs:read`, `fs:watch`, `storage:read`, `storage:write` e `settings:read`.
|
|
186
|
+
- **Data**: a escolha de estilo vive no domínio de armazenamento `output_style` (indexada por sessionId); nenhum outro estado é persistido, sem solicitações de rede.
|
|
187
|
+
- **Session log**: o nome do estilo vem de `command/run`, o texto exato injetado de `request/header`; o marcador de procedência `{ kind: 'plugin', plugin: 'dsh-output-styles' }` viaja no registro do domínio.
|
|
188
|
+
|
|
189
|
+
## Security boundaries
|
|
190
|
+
|
|
191
|
+
- **Somente serviços públicos.** Contribui `systemPrompt`, comandos, armazenamento e settings; sem alterações em engine / agent-loop / apiproxy / UI oficial.
|
|
192
|
+
- **Visível para o modelo ⟺ registrado.** Tudo o que o modelo vê é reconstruível a partir do log de sessão — sem novo tipo de evento de sessão, sem alterações no agent-loop.
|
|
193
|
+
- **Original sempre conservado.** Cada render (e `/export`) mantém o texto original ao lado do renderizado; a exportação HTML usa HTML saneado.
|
|
194
|
+
|
|
195
|
+
## Known limitations
|
|
196
|
+
|
|
197
|
+
- **Somente conversa principal.** Os estilos se aplicam à conversa principal; sessões de subagente mantêm seus próprios prompts (como no Claude Code).
|
|
198
|
+
- **Truncamento.** Corpos de estilo mais longos que `maxStyleChars` são truncados com um marcador.
|
|
199
|
+
- **Arquivos omitidos.** Um arquivo de estilo defeituoso é omitido com um aviso e nunca quebra o profile.
|
|
200
|
+
|
|
201
|
+
## Development
|
|
202
|
+
|
|
203
|
+
```sh
|
|
204
|
+
pnpm install
|
|
205
|
+
pnpm run typecheck # ambos os projetos tsc
|
|
206
|
+
pnpm test # vitest — 107 tests
|
|
207
|
+
pnpm run verify # typecheck + tests + self-contained (a porta de prepublishOnly)
|
|
208
|
+
pnpm run build # artefatos lib/ (bundles host + client)
|
|
209
|
+
pnpm pack # tarball para dsh plugin add
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Lançamentos: empurrar uma etiqueta `v*` cujo sufixo coincide com a versão de `package.json` dispara o workflow Publish — verificação completa e depois publicação no npm com procedência.
|
|
213
|
+
|
|
214
|
+
## Topics
|
|
215
|
+
|
|
216
|
+
`deepseek-harness`, `dsh`, `dsh-plugin`, `output-style`, `output-styles`, `claude-code`
|
|
217
|
+
|
|
218
|
+
## Contributors
|
|
219
|
+
|
|
220
|
+
- [@PerryLink](https://github.com/PerryLink) — autor e mantenedor: arquitetura do plugin, biblioteca de estilos, instalação de bundle, Web picker, documentação em cinco idiomas e ferramentas de CI/lançamento.
|
|
221
|
+
|
|
222
|
+
## PerryLink DSH Plugin Family
|
|
223
|
+
|
|
224
|
+
Este projeto é um dos [15 plugins do DeepSeek Harness](https://github.com/PerryLink) mantidos por [PerryLink](https://github.com/PerryLink). Se este te ajuda, os demais provavelmente também:
|
|
225
|
+
|
|
226
|
+
| Plugin | One-liner |
|
|
227
|
+
|---|---|
|
|
228
|
+
| [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors |
|
|
229
|
+
| [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | Engineering-discipline guard: requirements grill, test gates, adversary review |
|
|
230
|
+
| [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Durable background child agents with a Web UI sidebar, messaging and interrupt |
|
|
231
|
+
| [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | LSP diagnostics, formatting, completion, code actions and rename over language servers |
|
|
232
|
+
| **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles-equivalent runtime style switching |
|
|
233
|
+
| [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore |
|
|
234
|
+
| [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Claude Code-style declarative allow/deny/ask permission rules with audit |
|
|
235
|
+
| [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Second-model auto-review on the approval chain, fail-closed by default |
|
|
236
|
+
| [dsh-memento](https://github.com/PerryLink/dsh-memento) | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool |
|
|
237
|
+
| [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Security-audit skill pack: secret scan, dependency and supply-chain review |
|
|
238
|
+
| [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Pin sessions in the Web sidebar with durable ordering |
|
|
239
|
+
| [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Terminal-style input history for the web composer: arrows, Ctrl+R search |
|
|
240
|
+
| [dsh-github](https://github.com/PerryLink/dsh-github) | GitHub PR/issues integration for DSH, every write gated by approval |
|
|
241
|
+
| [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Plugin-development knowledge base as an on-demand agent skill |
|
|
242
|
+
| [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH |
|
|
243
|
+
|
|
244
|
+
## License
|
|
245
|
+
|
|
246
|
+
[Apache License 2.0](LICENSE) © 2026 dsh-output-styles contributors
|
package/README.zh.md
CHANGED
|
@@ -2,64 +2,60 @@
|
|
|
2
2
|
|
|
3
3
|
# 🎨 dsh-output-styles
|
|
4
4
|
|
|
5
|
-
**DeepSeek Harness
|
|
5
|
+
**DeepSeek Harness 的 Claude Code `outputStyles` 等价实现** —— 在运行时、按会话、持久地切换模型输出风格。
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
*`/style concise` —— 从此每条回复都简洁。`/style off` —— 回到项目默认。*
|
|
8
|
+
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](https://github.com/topics/dsh-plugin)
|
|
9
11
|
[](#)
|
|
10
|
-
[](https://github.com/PerryLink/dsh-output-styles/actions)
|
|
13
|
+
[](https://github.com/PerryLink/dsh-output-styles/releases)
|
|
14
|
+
[](https://www.npmjs.com/package/dsh-output-styles)
|
|
15
|
+
[](https://www.npmjs.com/package/dsh-output-styles)
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
[English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
|
|
14
18
|
|
|
15
19
|
</div>
|
|
16
20
|
|
|
17
21
|
---
|
|
18
22
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
## ✨ 特性
|
|
23
|
+
## Compatibility
|
|
22
24
|
|
|
23
|
-
| | |
|
|
25
|
+
| Surface | Status |
|
|
24
26
|
|---|---|
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
27
|
+
| Harness | DeepSeek Harness `0.1.0-rc.6` |
|
|
28
|
+
| Node | `^22.19.0 || >=24.0.0` |
|
|
29
|
+
| Platforms | 全部(host + Web 客户端) |
|
|
30
|
+
| Model | 任意(系统提示注入) |
|
|
31
|
+
|
|
32
|
+
## What you get
|
|
33
|
+
|
|
34
|
+
`dsh-output-styles` 是 DeepSeek Harness 的 Claude Code `outputStyles` 等价实现:一个 `/style` 命令,在运行时切换模型输出风格,按会话持久化,并在每次提示组装时注入。
|
|
35
|
+
|
|
36
|
+
- **风格库** —— 每种风格一个 Markdown 文件(`styles/*.md`);frontmatter 存元数据,正文即模型指令。内置六种(`concise`、`explanatory`、`formal`、`learning`、`proactive`、`step-by-step`),含与 Claude Code 对齐的 `proactive` 与 `learning`。
|
|
37
|
+
- **`/style` 命令** —— 无参数时列出风格(含描述)与当前选择;`/style <name>` 切换;`/style off` 恢复项目默认。
|
|
38
|
+
- **会话级持久化** —— 选择存于 `output_style` 存储域,按 sessionId 隔离,重启后仍保留。
|
|
39
|
+
- **系统提示注入** —— `systemPrompt.section()` 贡献(顺序 `sectionOrder`)在每次组装时注入当前会话的风格正文,按可配置预算截断。
|
|
40
|
+
- **Claude Code 对齐** —— `keep-coding-instructions`、`force-for-plugin`(别名 `force`)、`outputStyles` JSON 兼容、分层 `stylesDir` 目录、热重载,以及通过 DSH settings 接缝的项目默认回退。
|
|
41
|
+
- **渲染器注册表(`output.render.*`)** —— `ctx.outputRenderers` 允许任意插件注册纯 presenter,经 `output.render/before` waterfall 应用;内置渲染器 `concise` 与 `step-by-step`。
|
|
42
|
+
- **按会话/按工具规则** —— `rules: [{ match: { tool: 'bash' }, style: 'concise' }]` 为匹配请求指定渲染器;可通过 `output-style-rules` 设置区编辑。
|
|
43
|
+
- **`/export`** —— 经渲染管线把当前会话导出为 Markdown 或净化 HTML;每次渲染都保留原文与渲染结果并列。
|
|
44
|
+
|
|
45
|
+
## Quick start
|
|
41
46
|
|
|
42
47
|
```sh
|
|
43
|
-
# 1.
|
|
44
|
-
|
|
45
|
-
dsh plugin --profile <name> add dsh-output-styles
|
|
46
|
-
|
|
47
|
-
# 2. 启动并切换
|
|
48
|
-
dsh --profile <name>
|
|
49
|
-
/style # → 当前状态 + 每风格一行
|
|
50
|
-
/style concise # → switched to concise
|
|
51
|
-
/style Diagrams first # → 含空格的名字同样可用
|
|
52
|
-
/style off # → 回到项目默认
|
|
53
|
-
```
|
|
48
|
+
# 1. install the bundle into your profile
|
|
49
|
+
dsh plugin --profile web add "github:PerryLink/dsh-output-styles#main"
|
|
54
50
|
|
|
55
|
-
|
|
51
|
+
# or from npm (published releases)
|
|
52
|
+
dsh plugin --profile web add dsh-output-styles
|
|
56
53
|
|
|
57
|
-
|
|
58
|
-
- id: output-styles
|
|
59
|
-
name: 'dsh-output-styles/client'
|
|
54
|
+
# 2. restart and verify the row
|
|
55
|
+
dsh --profile web --dump-config | grep -A3 'id: output-styles'
|
|
60
56
|
```
|
|
61
57
|
|
|
62
|
-
##
|
|
58
|
+
## Demo
|
|
63
59
|
|
|
64
60
|
```
|
|
65
61
|
You > /style
|
|
@@ -78,125 +74,173 @@ You > 请只用一句话介绍你自己。
|
|
|
78
74
|
AI > 我是运行在 DeepSeek Harness 插件化平台上、基于 deepseek-v4-pro 模型的 AI 编码代理。
|
|
79
75
|
```
|
|
80
76
|
|
|
81
|
-
##
|
|
77
|
+
## How it works
|
|
82
78
|
|
|
83
79
|
```mermaid
|
|
84
80
|
flowchart LR
|
|
85
|
-
U[
|
|
86
|
-
C
|
|
87
|
-
C
|
|
81
|
+
U[You type /style concise] --> C[command registry]
|
|
82
|
+
C -->|command/run logged| L[(session log)]
|
|
83
|
+
C -->|put {style, source}| D[(output_style domain)]
|
|
88
84
|
D --> R[OutputStyleRuntime]
|
|
89
|
-
R
|
|
90
|
-
S --> M[
|
|
91
|
-
M
|
|
85
|
+
R -->|body at every assembly| S[systemPrompt section order 90]
|
|
86
|
+
S --> M[Model request]
|
|
87
|
+
M -->|full system prompt| H[request/header logged]
|
|
92
88
|
```
|
|
93
89
|
|
|
94
|
-
|
|
90
|
+
模型所见的一切都能从会话日志重建 —— 无新增会话事件类型、无 agent-loop 改动。风格名来自 `command/run`,精确注入文本来自 `request/header`,来源标记 `{ kind: 'plugin', plugin: 'dsh-output-styles' }` 随域记录携带。风格只作用于主会话;子代理会话保留各自提示(与 Claude Code 一致)。
|
|
95
91
|
|
|
96
|
-
##
|
|
92
|
+
## Install & uninstall
|
|
97
93
|
|
|
98
|
-
|
|
94
|
+
- **git channel**(最新 `main`):`dsh plugin --profile web add "github:PerryLink/dsh-output-styles#main"` —— `prepare` 脚本仅用生产依赖构建。
|
|
95
|
+
- **npm channel**(发布版本):`dsh plugin --profile web add dsh-output-styles`。
|
|
96
|
+
- **tarball channel**:在本仓库执行 `pnpm pack`,然后 `dsh plugin --profile web add ./dsh-output-styles-<version>.tgz`。
|
|
97
|
+
- **uninstall**:`dsh plugin --profile web remove dsh-output-styles`。
|
|
99
98
|
|
|
100
|
-
|
|
101
|
-
|---|---|---|
|
|
102
|
-
| `stylesDir` | `[]` | 风格库目录列表,相对 cwd 解析;后者覆盖前者。`[]` = 仅内置 `styles/`。裸字符串视为单目录列表。 |
|
|
103
|
-
| `maxStyleChars` | `4000` | 风格正文预算(码点,≥ 1);超长正文截断并加标记。 |
|
|
104
|
-
| `defaultStyle` | `''` | 从未选择过的会话(且无 settings 默认)使用的风格;`''` = 不注入。 |
|
|
105
|
-
| `compatJson` | `true` | 加载 Claude Code `outputStyles` JSON 条目(单对象或数组)。 |
|
|
106
|
-
| `sectionOrder` | `90` | 注入节顺序(0 = persona,100–199 = 工具指引)。 |
|
|
107
|
-
| `truncationMarker` | `"\n\n[style truncated]"` | 截断点追加的标记。 |
|
|
108
|
-
| `includeBuiltins` | `true` | 将包内置 `styles/` 作为最低优先级层纳入。 |
|
|
109
|
-
| `watchStyles` | `true` | 风格文件在磁盘上变化时重载风格库。 |
|
|
99
|
+
## Configuration
|
|
110
100
|
|
|
111
|
-
|
|
101
|
+
所有可调项均为 Schemastery `Config` 字段(可在 cordis.yml 中修改)。非法值在加载期失败。
|
|
112
102
|
|
|
113
|
-
|
|
114
|
-
|
|
103
|
+
| Key | Default | Meaning |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| `stylesDir` | `[]` | 风格库目录,相对 cwd 解析;后者覆盖前者。`[]` = 仅内置 `styles/` |
|
|
106
|
+
| `maxStyleChars` | `4000` | 风格正文预算(≥ 1);超长正文带标记截断 |
|
|
107
|
+
| `defaultStyle` | `''` | 从未选择过风格的会话所用风格(且无 settings 默认);`''` = 无风格 |
|
|
108
|
+
| `compatJson` | `true` | 加载 Claude Code `outputStyles` JSON 条目(单对象或数组) |
|
|
109
|
+
| `sectionOrder` | `90` | 注入段的顺序(0 = persona,100–199 = 工具指引) |
|
|
110
|
+
| `truncationMarker` | `"\n\n[style truncated]"` | 追加在截断点的标记 |
|
|
111
|
+
| `includeBuiltins` | `true` | 将包内置 `styles/` 作为最低优先级层 |
|
|
112
|
+
| `watchStyles` | `true` | 风格文件在磁盘上变化时重载库 |
|
|
113
|
+
| `rules` | `[]` | 按会话/按工具渲染规则:`[{ match: { tool?, contentType?, session? }, style, priority? }]` |
|
|
114
|
+
| `enableExport` | `true` | 注册 `/export` 命令(Markdown/HTML 会话导出,感知渲染器) |
|
|
115
|
+
|
|
116
|
+
## Tools & surfaces
|
|
117
|
+
|
|
118
|
+
| Surface | Kind | Notes |
|
|
119
|
+
|---|---|---|
|
|
120
|
+
| `/style` | command | 列出风格、切换或恢复项目默认 |
|
|
121
|
+
| `/export` | command | 把当前会话渲染为 Markdown 或净化 HTML |
|
|
122
|
+
| `output_style` | storage domain | 按 sessionId 隔离的会话级风格选择 |
|
|
123
|
+
| `systemPrompt.section()` | contribution | 在每次组装时注入当前风格正文 |
|
|
124
|
+
| `output.render.*` | renderer registry | `ctx.outputRenderers` + `output.render/before` waterfall |
|
|
125
|
+
| `style` | projection | 从已落定命令折叠出的 `{ options, currentValue }` |
|
|
126
|
+
| Web picker | client entry | `dsh-output-styles/client` 用弹出选择器装饰 `/style` |
|
|
115
127
|
|
|
116
|
-
|
|
117
|
-
---
|
|
118
|
-
name: concise
|
|
119
|
-
description: Terse, direct answers — minimal prose, no preamble.
|
|
120
|
-
whenToUse: Daily coding work, tool-heavy sessions, or when prompt length matters.
|
|
121
|
-
keep-coding-instructions: true
|
|
122
|
-
---
|
|
128
|
+
## Command reference
|
|
123
129
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
130
|
+
| Input | Outcome |
|
|
131
|
+
|---|---|
|
|
132
|
+
| `/style` | 列出当前选择 + 每个风格一行(名称 — 描述) |
|
|
133
|
+
| `/style concise` | 切换(持久写入),`switched to concise` |
|
|
134
|
+
| `/style Diagrams first` | 多词名称取整个余下部分 |
|
|
135
|
+
| `/style off` | 恢复项目默认(settings 默认,其次 `defaultStyle`) |
|
|
136
|
+
| `/style nope` | `error: unknown output style "nope" (available: …)` |
|
|
137
|
+
| `/export` | 经渲染管线把当前会话渲染为 Markdown |
|
|
138
|
+
| `/export html` | 渲染为净化 HTML |
|
|
139
|
+
| `/export --renderer=concise` | 强制指定一个渲染器渲染(跳过规则) |
|
|
128
140
|
|
|
129
|
-
|
|
141
|
+
## Style library
|
|
130
142
|
|
|
131
|
-
frontmatter
|
|
143
|
+
每种风格一个 Markdown 文件;frontmatter 存元数据,正文即模型指令。`name` 默认取文件名,可含空格(`Diagrams first`)。
|
|
132
144
|
|
|
133
|
-
|
|
|
145
|
+
| Field | Default | Meaning |
|
|
134
146
|
|---|---|---|
|
|
135
|
-
| `name` | 文件名 |
|
|
136
|
-
| `description` |
|
|
137
|
-
| `whenToUse` |
|
|
138
|
-
| `keep-coding-instructions` | `false` | `true`
|
|
139
|
-
| `force-for-plugin` | `false` |
|
|
147
|
+
| `name` | 文件名 | 切换目标;字母、数字、空格与连字符(`off` 为保留字) |
|
|
148
|
+
| `description` | —(必填) | 列表与选择器中显示的一句话 |
|
|
149
|
+
| `whenToUse` | — | 追加到列表的可选指引 |
|
|
150
|
+
| `keep-coding-instructions` | `false` | 为 `true` 时保留 harness 提示;为 `false` 时整体替换(Claude Code 语义) |
|
|
151
|
+
| `force-for-plugin` | `false` | 无条件应用,覆盖任何会话选择;`force` 为别名,至多一种风格可设置 |
|
|
140
152
|
|
|
141
|
-
|
|
142
|
-
<summary>Claude Code <code>outputStyles</code> JSON(<code>compatJson: true</code>)</summary>
|
|
153
|
+
启用 `compatJson: true` 后,Claude Code `outputStyles` JSON 条目(`{ name, description, prompt }`)与 Markdown 风格并列加载;无法解析的条目带警告跳过。
|
|
143
154
|
|
|
144
|
-
|
|
145
|
-
{ "name": "explain", "description": "Explain like a teacher.", "prompt": "Teach in small steps." }
|
|
146
|
-
```
|
|
155
|
+
## Renderer protocol
|
|
147
156
|
|
|
148
|
-
|
|
157
|
+
`output.render.*` 协议把呈现层变为扩展点。渲染器是**纯 presenter** —— `presenter(text, context)` 把参数映射为展示数据、绝不触碰 DOM —— 按工具名与内容类型匹配,按优先级排序。
|
|
149
158
|
|
|
150
|
-
|
|
159
|
+
- **Waterfall first**:每个渲染请求先经 `output.render/before`(`{ text, context }`);监听器必须调用 `next()`。
|
|
160
|
+
- **Rules**:`rules: [{ match: { tool: 'bash' }, style: 'concise' }]` 为匹配请求指定渲染器;冲突按 `priority` 再按规则顺序裁决。
|
|
161
|
+
- **Built-ins**:`concise`(空白压缩 + 预算截断)与 `step-by-step`(一致的步骤编号)。
|
|
162
|
+
- **Auditability**:每次渲染结果携带 `{ original, rendered, rendererId, changed }`;渲染文本是展示内容,原文始终可从会话日志重建。
|
|
151
163
|
|
|
152
|
-
##
|
|
164
|
+
## Web picker
|
|
153
165
|
|
|
154
|
-
|
|
155
|
-
|---|---|
|
|
156
|
-
| `/style` | 列出当前选择 + 每风格一行(名称 — 描述) |
|
|
157
|
-
| `/style concise` | 切换(持久写入),`switched to concise` |
|
|
158
|
-
| `/style Diagrams first` | 含空格的风格名 = `/style` 后的整段文本 |
|
|
159
|
-
| `/style off` | 恢复项目默认(先 settings 默认,后 `defaultStyle`) |
|
|
160
|
-
| `/style nope` | `error: unknown output style "nope" (available: …)` |
|
|
166
|
+
`dsh.client` 条目装饰 host `/style` 命令的裸调用,弹出一个选择器:一个 "off" 行 + 每个库风格一行(`description · whenToUse`),当前行高亮。选择通过命令 Remote 提交 `/style <name>`,因此每次切换都保留 host 的持久命令生命周期。选择器跟随 Web UI 自带的 `zh`/`en` 语言对。
|
|
161
167
|
|
|
162
|
-
##
|
|
168
|
+
## Differences from Claude Code
|
|
163
169
|
|
|
164
|
-
|
|
170
|
+
| | Claude Code | dsh-output-styles |
|
|
171
|
+
|---|---|---|
|
|
172
|
+
| 风格文件 | 用户/项目/受管层的 `.claude/output-styles` | `stylesDir` 目录 + 内置 `styles/`,后者目录优先 |
|
|
173
|
+
| 自定义风格 | Markdown,frontmatter `name`/`description`/`keep-coding-instructions`/`force-for-plugin` | 相同字段(`force-for-plugin` 原样接受,`force` 为别名)+ `whenToUse` |
|
|
174
|
+
| 旧版 JSON | `settings.json` 中的 `outputStyles` 数组 | 原样加载(`compatJson: true`) |
|
|
175
|
+
| 生效时机 | `/clear` 之后或新会话 | 立即——系统提示按请求重新组装 |
|
|
176
|
+
| 子代理 | 风格不适用 | 相同——子代理会话保留各自提示 |
|
|
177
|
+
| 切换 | `/config` 菜单或 `outputStyle` 设置(`/output-style` 命令已在 v2.1.91 移除) | `/style` 命令 + Web picker + settings `output-style.style` |
|
|
165
178
|
|
|
166
|
-
##
|
|
179
|
+
## Conflict check
|
|
167
180
|
|
|
168
|
-
|
|
181
|
+
开发前已对照 DSH 生态排查(2026-08 快照):[topic:dsh-plugin](https://github.com/topics/dsh-plugin) 下无 `style`/`output-style` 仓库,四个主要 [awesome lists](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin) 中无 output-style 分类,[dsh-hub catalog](https://github.com/omdsh-dev/dsh-hub-workshop) 中无条目。最接近的邻居——[dsh-soul-md](https://github.com/Scorp1o117/dsh-soul-md)(persona)与 [dsh-claude-marketplace](https://github.com/ben7am1n/dsh-claude-marketplace)(输出风格明确推迟到 v0.2+)——是相邻而非冲突。
|
|
169
182
|
|
|
170
|
-
##
|
|
183
|
+
## Permissions & data
|
|
171
184
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
| 自定义风格 | Markdown,frontmatter `name`/`description`/`keep-coding-instructions`/`force-for-plugin` | 同字段(`force-for-plugin` 原样接受,`force` 为别名)+ `whenToUse` |
|
|
176
|
-
| 旧版 JSON | `settings.json` 里的 `outputStyles` 数组 | 原样加载(`compatJson: true`) |
|
|
177
|
-
| 生效时机 | `/clear` 或新会话后 | 立即生效——系统提示每次请求重组 |
|
|
178
|
-
| 子代理 | 风格不适用 | 一致——子代理会话保持各自提示 |
|
|
179
|
-
| 切换方式 | `/config` 菜单或 `outputStyle` 设置(`/output-style` 命令已在 v2.1.91 移除) | `/style` 命令 + Web 选择器 + settings `output-style.style` |
|
|
185
|
+
- **Permissions**:workshop 清单声明 `fs:read`、`fs:watch`、`storage:read`、`storage:write` 与 `settings:read`。
|
|
186
|
+
- **Data**:风格选择存于 `output_style` 存储域(按 sessionId 隔离);不持久化其他状态,无网络请求。
|
|
187
|
+
- **Session log**:风格名来自 `command/run`,精确注入文本来自 `request/header`;来源标记 `{ kind: 'plugin', plugin: 'dsh-output-styles' }` 随域记录携带。
|
|
180
188
|
|
|
181
|
-
##
|
|
189
|
+
## Security boundaries
|
|
190
|
+
|
|
191
|
+
- **仅公开服务。** 贡献 `systemPrompt`、命令、存储与 settings;不改 engine / agent-loop / apiproxy / 官方 UI。
|
|
192
|
+
- **模型可见 ⟺ 已记录。** 模型所见的一切都能从会话日志重建 —— 无新增会话事件类型、无 agent-loop 改动。
|
|
193
|
+
- **始终保留原文。** 每次渲染(含 `/export`)都保留原文与渲染结果并列;HTML 导出使用净化 HTML。
|
|
194
|
+
|
|
195
|
+
## Known limitations
|
|
196
|
+
|
|
197
|
+
- **仅主会话。** 风格只作用于主会话;子代理会话保留各自提示(与 Claude Code 一致)。
|
|
198
|
+
- **截断。** 超过 `maxStyleChars` 的风格正文带标记截断。
|
|
199
|
+
- **跳过坏文件。** 损坏的风格文件带警告跳过,绝不破坏 profile。
|
|
200
|
+
|
|
201
|
+
## Development
|
|
182
202
|
|
|
183
203
|
```sh
|
|
184
204
|
pnpm install
|
|
185
|
-
pnpm run typecheck # 两个 tsc
|
|
186
|
-
pnpm test # vitest ——
|
|
187
|
-
pnpm run verify # typecheck +
|
|
188
|
-
pnpm run build # lib/
|
|
189
|
-
pnpm pack # 供 dsh plugin add
|
|
205
|
+
pnpm run typecheck # 两个 tsc 项目
|
|
206
|
+
pnpm test # vitest —— 107 个测试
|
|
207
|
+
pnpm run verify # typecheck + tests + self-contained(prepublishOnly 门禁)
|
|
208
|
+
pnpm run build # lib/ 产物(host + client 包)
|
|
209
|
+
pnpm pack # 供 dsh plugin add 的 tarball
|
|
190
210
|
```
|
|
191
211
|
|
|
192
|
-
发布:推送后缀与 `package.json` 版本一致的 `v*`
|
|
212
|
+
发布:推送后缀与 `package.json` 版本一致的 `v*` 标签会触发 Publish workflow —— 完整验证后带 provenance 发布到 npm。
|
|
193
213
|
|
|
194
|
-
|
|
214
|
+
## Topics
|
|
195
215
|
|
|
196
|
-
|
|
216
|
+
`deepseek-harness`, `dsh`, `dsh-plugin`, `output-style`, `output-styles`, `claude-code`
|
|
197
217
|
|
|
198
|
-
|
|
218
|
+
## Contributors
|
|
199
219
|
|
|
200
|
-
|
|
220
|
+
- [@PerryLink](https://github.com/PerryLink) —— 作者与维护者:插件架构、风格库、bundle 安装、Web picker、五语文档与 CI/发布工具链。
|
|
221
|
+
|
|
222
|
+
## PerryLink DSH Plugin Family
|
|
201
223
|
|
|
202
|
-
|
|
224
|
+
本项目是 [PerryLink](https://github.com/PerryLink) 维护的 [15 个 DeepSeek Harness 插件](https://github.com/PerryLink) 之一。如果这个对你有用,其他插件多半也有用:
|
|
225
|
+
|
|
226
|
+
| Plugin | One-liner |
|
|
227
|
+
|---|---|
|
|
228
|
+
| [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors |
|
|
229
|
+
| [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | Engineering-discipline guard: requirements grill, test gates, adversary review |
|
|
230
|
+
| [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Durable background child agents with a Web UI sidebar, messaging and interrupt |
|
|
231
|
+
| [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | LSP diagnostics, formatting, completion, code actions and rename over language servers |
|
|
232
|
+
| **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** | Claude Code outputStyles-equivalent runtime style switching |
|
|
233
|
+
| [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore |
|
|
234
|
+
| [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Claude Code-style declarative allow/deny/ask permission rules with audit |
|
|
235
|
+
| [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Second-model auto-review on the approval chain, fail-closed by default |
|
|
236
|
+
| [dsh-memento](https://github.com/PerryLink/dsh-memento) | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool |
|
|
237
|
+
| [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Security-audit skill pack: secret scan, dependency and supply-chain review |
|
|
238
|
+
| [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Pin sessions in the Web sidebar with durable ordering |
|
|
239
|
+
| [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Terminal-style input history for the web composer: arrows, Ctrl+R search |
|
|
240
|
+
| [dsh-github](https://github.com/PerryLink/dsh-github) | GitHub PR/issues integration for DSH, every write gated by approval |
|
|
241
|
+
| [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Plugin-development knowledge base as an on-demand agent skill |
|
|
242
|
+
| [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH |
|
|
243
|
+
|
|
244
|
+
## License
|
|
245
|
+
|
|
246
|
+
[Apache License 2.0](LICENSE) © 2026 dsh-output-styles contributors
|