WM-CODER/custom-first-control-prompt
dsh-custom-first-control-prompt
DeepSeek Harness plugin for insert custom prompt
Install
npx @deepseek-ai/dsh plugin --profile web add github:WM-CODER/custom-first-control-promptRestart `dsh web` after install. Bundle APIs can change during the developer preview.
README badge
[](https://dshhub.dev/plugins/custom-first-control-prompt)Paste this into your README. The star count updates with every catalog sync.
From the README
Excerpt from WM-CODER/custom-first-control-prompt, cleaned of badges and images.
@wm-coders/dsh-custom-first-control-prompt
English | 中文
Deployment-configured prompt prefix. Ordered system-prompt sections render ahead of the deployment persona, and configured reference user/assistant exchanges are injected into every ordinary conversation request — as real alternating messages prepended on the request path (llm/stream interception, zero session-log writes). Static content renders byte-identically on every request, preserving prefix-cache reuse.
Installation
# From GitHub (recommended — built artifacts committed, no build approval needed)
dsh plugin --profile web add github:WM-CODER/custom-first-control-prompt
# From npm
dsh plugin --profile web add @wm-coders/dsh-custom-first-control-prompt
# From local directory (development)
dsh plugin --profile web add ./path/to/custom-first-control-prompt
After installation, restart the web app (dsh --profile web or run restart-web.ps1 / restart-web.sh).
To uninstall:
dsh plugin --profile web remove @wm-coders/dsh-custom-first-control-prompt
Install / deployment / debugging obstacles and test methods: DEBUG-NOTES.zh.md (in Chinese; web fail-loud root causes, duplicate-id inserts, API verification chains — all paths scrubbed). One-command install: INSTALL.md. Full cross-machine walkthrough: INSTALL-FULL.zh.md (Chinese).
Configuration
- id: custom-first-control-prompt
name: '@wm-coders/dsh-custom-first-control-prompt'
config:
sections:
- name: house-rules
order: -50
text: |
…stable system text…
history:
- user: …
assistant: …
includeSubagents: false
| Key | Default | Meaning |
|---|---|---|
sections | — | Ordered system-prompt fragments; absent or empty registers nothing. |
sections[].name | required | Entry name; the registry sees custom-first-control-prompt:<name>. |
sections[].order | required | Render position among all sections. Factory convention: harness identity −100, persona 0, tool guidance 100–199; values below 0 prepend ahead of the persona. |
sections[].enabled | true | false keeps the entry in configuration without registering it. |
sections[].text | required | Static section text; keep it free of volatile values — any change breaks prefix reuse from the first changed token. |
history | — | Ordered user/assistant reference exchanges injected ahead of every ordinary conversation request; both texts must be non-empty and free of reserved tags (case-insensitive: <user>, <assistant>, <exchange>, <custom-history and all closing tags). Absent or empty injects nothing. |
includeSubagents | false | false skips sessions whose header meta marks subagent origin. |
Invalid configuration fails plugin load naming the offending entry: empty text, duplicate section names, or a non-finite order. Per-entry section problems (blank/duplicate name, bad order, empty text) and per-pair history problems (empty text, embedded reserved tags) degrade to skipping that entry with a warning instead of failing the plugin tree.
Injection mechanism
The reference exchanges are built once at plugin activation into alternating real Message objects (deep-frozen, shared by reference across requests), then prepended onto every ordinary conversation request by an llm/stream waterfall listener:
…

