DSH Plugin Store
Back to home

PerryLink

dsh-output-styles

Claude Code outputStyles for DeepSeek Harness - session-scoped, durable, runtime-switchable model output styles (/style command, output_style storage domain, systemPrompt injection)

Stars
1
Language
TypeScript
Created
Aug 13, 2026
Updated
Aug 14, 2026
Runtime
GitHub repo

Introduction

🎨 dsh-output-styles

Claude Code outputStyles for DeepSeek Harness — switch the model's output style at runtime, per session, durably.

License CI Node DSH TypeScript

🌐 English · 中文 · 日本語 · 한국어 · Español


/style concise — and every reply from now on is terse. /style step-by-step — and the model narrates numbered steps. /style off — back to the project default. One command per session, persisted across restarts, zero changes to the agent loop.

✨ Features

🗂️ Style libraryOne Markdown file per style (styles/*.md); frontmatter for metadata, body = the model directive. name defaults to the file name and may contain spaces (Diagrams first).
⌨️ /style commandNo argument lists styles (with descriptions) + current selection; /style <name> switches; /style off restores the project default. The whole remainder after /style is the style name.
💾 Session-scoped persistenceThe choice lives in the output_style storage domain, keyed by sessionId — two sessions never interfere, and the choice survives restarts.
🧩 System-prompt injectionA systemPrompt.section() contribution (order 90) injects the current session's style body at every assembly; bodies are truncated at a configurable budget.
🎭 Claude Code keep-coding-instructionsStyles with keep-coding-instructions: false (the default, like Claude Code) replace the whole system prompt — for styles that leave software engineering behind.
📌 Forced stylesforce: true applies a style unconditionally, overriding any session selection; two forced styles fail the load.
🔁 Claude Code compatibilityLoads outputStyles JSON collections ({ name, description, prompt }), single entries or settings.json-style arrays; unparseable entries are skipped with a warning.
📚 Layered directoriesstylesDir is a list; later directories override earlier ones (bundled styles/ is the lowest layer, disable with includeBuiltins: false).
🔄 Hot reloadStyle-file changes are picked up without restarting (watchStyles: false to opt out).
⚙️ Project default over settingsSessions that never selected one fall back to output-style.style from the DSH settings seam, then to defaultStyle.
🖱️ Web pickerA dsh.client entry (dsh-output-styles/client) decorates the host /style command with a projection-backed popup picker.
📊 Session projectionA style projection ({ options, currentValue }) for the Web UI, folded from settled commands in the session log.
🧯 Fail loud, skip cleanlyMisconfiguration throws at load; a bad style file is skipped with a warning and never breaks the profile.
🌐 Five-language docsEN · 中文 · 日本語 · 한국어 · Español.

🚀 Quick start

# 1. Install — the package is a bundle layer, so one command composes
#    storage + storage-json + storage-domain + the plugin row:
dsh plugin --profile <name> add dsh-output-styles

# 2. Boot and switch
dsh --profile <name>
/style               # → output style off, then one line per style
/style concise       # → switched to concise
/style Diagrams first  # → names with spaces work too
/style off           # → back to the project default

The layer is idempotent over web profiles (insert-by-id replaces same-id rows), which compose storage in box. For the Web picker, add the client row to the profile:

- id: output-styles-client
  name: 'dsh-output-styles/client'

🎬 Demo

You > /style
      output style off
      concise — Terse, direct answers — minimal prose, no preamble. (Daily coding work, tool-heavy sessions, or when prompt length matters.)
      explanatory — Educational answers with short "Insights" that teach as you work. (Learning a codebase, onboarding, …)
      formal — Formal, precise prose with complete sentences and defined terms. (Reports, documentation, release notes, …)
      step-by-step — Numbered reasoning steps with explicit intermediate results. (Debugging, design decisions, …)

You > /style concise
      switched to concise

You > 请只用一句话介绍你自己。
AI  > 我是运行在 DeepSeek Harness 插件化平台上、基于 deepseek-v4-pro 模型的 AI 编码代理。

🧠 How it works

flowchart LR
    U[You type /style concise] --> C[command registry]
    C -->|command/run logged| L[(session log)]
    C -->|put {style, source}| D[(output_style domain)]
    D --> R[OutputStyleRuntime]
    R -->|body at every assembly| S[systemPrompt section order 90]
    S --> M[Model request]
    M -->|full system prompt| H[request/header logged]

Everything the model sees is reconstructable from the session log — no new session event type, no agent-loop changes. The style name comes from command/run, the exact injected text from request/header, and the provenance marker { kind: 'plugin', plugin: 'dsh-output-styles' } rides in the domain record. Styles apply to the main conversation only; subagent sessions keep their own prompts (matching Claude Code).

⚙️ Configuration

Every tunable is a validated Schemastery Config field (invalid values fail the load):

FieldDefaultMeaning
stylesDir[]Style-library directories, resolved against cwd; later entries override earlier ones. [] = the bundled styles/ only. A bare string is a single-directory list.
maxStyleChars4000Style-body budget (code points, ≥ 1); longer bodies are truncated with a marker.
defaultStyle''Style for sessions that never selected one (and no settings default exists); '' = no style.
compatJsontrueLoad Claude Code outputStyles JSON entries (single objects or arrays).
sectionOrder90Order of the injected section (0 = persona, 100–199 = tool guidance).
truncationMarker"\n\n[style truncated]"Marker appended at the truncation point.
includeBuiltinstrueInclude the package's bundled styles/ as the lowest-priority layer.
watchStylestrueReload the library when a style file changes on disk.

📚 Style library

styles/concise.md
---
name: concise
description: Terse, direct answers — minimal prose, no preamble.
whenToUse: Daily coding work, tool-heavy sessions, or when prompt length matters.
keep-coding-instructions: true
---

You are in the concise output style for this conversation.
- Lead with the direct answer; skip preamble, restatements, and filler.
- 回答语言跟随用户语言:中文提问用中文回答,英文提问用英文回答。

Frontmatter fields:

FieldDefaultMeaning
namefile nameSwitch target; letters, digits, spaces, and hyphens (no leading/trailing space; off is reserved).
description— (required)One sentence shown in listings and the picker.
whenToUseOptional guidance appended to listings.
keep-coding-instructionsfalseKeep the harness prompt (identity, persona, tool guidance) when true; replace it entirely when false (Claude Code semantics).
forcefalseApply unconditionally, overriding any session selection; at most one style may set it.
Claude Code outputStyles JSON (compatJson: true)
{ "name": "explain", "description": "Explain like a teacher.", "prompt": "Teach in small steps." }

Legacy settings.json arrays ([{ … }, { … }]) load as-is; bad entries are skipped with a warning.

⌨️ Command reference

InputOutcome
/styleList current selection + one line per style (name — description)
/style conciseSwitch (durable write), switched to concise
/style Diagrams firstMulti-word names are the whole remainder
/style offRestore the project default (settings default, then defaultStyle)
/style nopeerror: unknown output style "nope" (available: …)

🖱️ Web picker

The dsh.client entry decorates the host /style command's bare invocation with a popup picker: an "off" row plus one row per library style (description · whenToUse), the active row marked. Picking submits /style <name> through the command Remote, so every switch keeps the host's durable command lifecycle and the style projection stays the single displayed fact.

🔍 Conflict check

Screened against the DSH ecosystem before development (2026-08 snapshot): no style/output-style repository under topic:dsh-plugin, no output-style category in the four major awesome lists, and no entry in the dsh-hub catalog. The closest neighbors — dsh-soul-md (persona) and dsh-claude-marketplace (output styles explicitly deferred to v0.2+) — are adjacent, not conflicting.

🆚 Differences from Claude Code

Claude Codedsh-output-styles
Style files.claude/output-styles at user/project/managed levelsstylesDir directories + bundled styles/, later directory wins
Custom stylesMarkdown, frontmatter name/description/keep-coding-instructions/force-for-pluginSame fields (force = force-for-plugin) + whenToUse
Legacy JSONoutputStyles array in settings.jsonLoaded verbatim (compatJson: true)
Taking effectAfter /clear or a new sessionImmediately — the system prompt re-assembles per request
SubagentsStyles do not applySame — subagent sessions keep their own prompts
Switching/config menu or outputStyle setting (the /output-style command was removed in v2.1.91)/style command + Web picker + settings output-style.style

🧪 Development

pnpm install
pnpm run typecheck   # both tsc projects
pnpm test            # vitest — 87 tests
pnpm run build       # lib/ artifacts (host + client bundles)
pnpm pack            # tarball for dsh plugin add

Structure follows the omdsh-dev/plugin-template: src/index.ts (plugin metadata), src/config.ts (schema), src/runtime.ts (runtime service + activation), src/invariant.ts (invariants), src/client/ (Web picker), styles/ (built-ins).

📄 License

Apache-2.0 © 2026 dsh-output-styles contributors


Topics: dsh · dsh-plugin · deepseek-harness · output-styles · claude-code