From one idea to a finished, consistency-checked novel — a deterministic writing engine that runs the stages for you, so you never babysit a prompt.
「一个想法到一本校验通过的小说:确定性写作引擎替你跑完全部阶段,你不用再伺候提示词。」
中文 · License: MIT · Market entry
Most "writing assistants" are a prompt pack: you paste instructions, the model might follow them, and you re-check every chapter by hand. 小说工作台 is an engine, not a prompt. A real JavaScript state machine owns the stage order, the gates, the retries and the checkpoints. The model is a worker the engine calls at specific stages — it never decides whether a chapter passed. The whole product is one sidebar entry「小说」and one panel「小说工作台」; there is no mode to switch and no prompt to paste.
| Prompt pack | 小说工作台 engine |
|---|---|
| A paragraph telling the model "act as a finite state machine" | An actual STAGE_GRAPH transition table in lib/orchestrator.js; illegal transitions are rejected |
| Quality decided by the model's opinion | PowerShell validators decide (validate-chapter.ps1: 13 hard checks); a gate cannot be flipped by model text |
| Progress lost when the session ends | Versioned atomic checkpoint under .dsh/state/; resume at the exact stage after a restart |
| "PASS" from a subagent is trusted | Code adjudication: evidence precedence, a PASS with no evidence is NOT_COVERED, a disproved CRITICAL is dismissed |
| Errors, script names, stderr in your chat | Only generic localized status tokens — never internals |
- Open the 小说 sidebar entry → the 小说工作台 panel. That is the entire UI.
- Bind a novel-project directory once in the panel; start a run, choose how to
begin, and drive stages from the panel buttons. The panel and the agent tool
call the SAME Host
drive()function through/novel/api. - The engine runs a 7-stage DAG (constitution → outline → design → write →
validate → batch → export) plus three bootstrap branches (guided constitution,
disassemble/reskin, import an existing manuscript).
BATCHis a nested, strictly serial 15-step per-chapter sub-FSM. - Code-enforced gates: entry guards check artifacts; exit gates run the
validation scripts with
pwsh -NoProfile -File … -Chapter <int>; a failed gate pauses the run with a bounded, classified retry policy — the engine never advances on unresolved errors and never "带病放行". - Checkpoint & resume: interrupt at chapter 47 of 100 and continue exactly there; idempotent re-runs; corruption-tolerant (bad checkpoint is backed up, not silently dropped).
- Adjudicated workers: 9 isolated subagent roles with typed, minimal arguments; the dispatcher literally cannot emit a file list or plot hint; the engine resolves their findings against the truth files.
- Silent & safe: no prompt text shown, no errors leaked, zero bundled credentials, no effect on sessions in other projects.
Honest asset line, verified against the shipped tree: 21 skills · 18+ PowerShell/Python validators · 9 subagent roles · 7 Markdown templates + 1 state.yaml skeleton · 2 rule sets · 2 credential-free templates.
dsh plugin --profile <profile> add https://github.com/github-yousen/dsh-novel-mode
# or, from a local checkout, via the Harness plugin manager:
# plugin_manager install_bundle with target = absolute path to this directoryThen restart DeepSeek Harness (a fresh dsh.client manifest needs a Host
restart). The sidebar gains a「小说」entry; open the 小说工作台 panel, bind a
novel-project directory, and start a run from the panel buttons. No mode
dropdown, no slash command, no prompt to paste.
Open 小说 entry → 小说工作台 panel
Bind project dir → click Start → choose「从零搭建」→ the panel drives the engine
You see: 阶段:准备开始 · 请选择开始方式 → 阶段:撰写正文 · 第 1 章 · 进行中
Behind that one-line status the engine has already picked the branch, checked entry artifacts, run the design/chapter validators, adjudicated the review worker and written a versioned checkpoint. Kill the session at chapter 47 of 100 and it resumes at 47 — no prompt to re-paste, no state to reconstruct by hand.
Requirements: DeepSeek Harness 0.2.x (Web profile), PowerShell 7 (pwsh),
Python 3.7+. If pwsh is absent the gate records a DEGRADED verdict and the
run pauses — it never silently passes and never crashes.
小说 sidebar entry ──▶ 小说工作台 panel (Client, main keyed slot)
│ POST /novel/api {project, args}
▼
index.js drive(args, project) ◀── novel_orchestrate agent tool
│ (same function, two callers)
lib/orchestrator.js ← pure, importable, unit-tested
STAGE_GRAPH / BATCH_SUBSTEPS / advance() / gate() / adjudicate()
loadState() / saveState() → .dsh/state/novel-mode.checkpoint.json
│
workers: 21 model-only skills (from package assets/.dsh/skills/)
validators: pwsh scripts in project .dsh/scripts/ (quality authority)
│
structured status only — no prose, no errors, no prompts
Full details: docs/ARCHITECTURE.md · docs/PM-PRD.md (acceptance criteria) · test/ (multi-angle test suite).
No credentials are bundled. Optional Fanqie integrations ship empty
*.json.template files; copy them to the real filenames and fill in your own
values locally (those names are git-ignored). publish_result.json, lockfiles,
bytecode caches and the large reverse-engineering artifacts are excluded. All
script invocations use explicit, integer-bounded arguments — never -Command,
never string-concatenated user input.
- Open-source repo: https://github.com/github-yousen/dsh-novel-mode (Public,
main, MIT, topicdsh-plugin). - Market submission: awesome-dsh-plugin PR #13689.
MIT. Bundled Humanizer-zh carries its own license.
