dsh-novel-write-engine 0.1.3 → 0.2.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 +45 -0
- package/README.md +172 -74
- package/briefs/P1.md +1 -0
- package/briefs/P2.md +4 -0
- package/briefs/P3.md +1 -1
- package/briefs/P4.md +1 -1
- package/briefs/P6.md +5 -2
- package/briefs/P8.md +2 -0
- package/lib/client.js +514 -17
- package/lib/index.d.ts +775 -12
- package/lib/index.js +5369 -390
- package/lib/types/client/dto.d.ts +51 -0
- package/lib/types/client/viewmodel.d.ts +46 -1
- package/lib/types/constants.d.ts +23 -3
- package/lib/types/next-reasons.d.ts +6 -0
- package/lib/types/types.d.ts +417 -6
- package/package.json +1 -1
- package/presets/novel-write-engine.patch.yml +1 -1
- package/skills/entry.md +22 -8
package/README.md
CHANGED
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
它不是一个提示词合集,也不是独立的写作软件。它把「这一章处于什么阶段、下一步只能做什么、正文是否达标、归档要核销哪些实体」变成可执行、可回滚、可审计的引擎;模型负责写,引擎负责裁决和记账。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
0.2.0 起,它同时管理**整本书**:书级蓝图 → 卷/章大纲 → 世界观设定集 → 单章 P1–P9 流水线 → 归档回写大纲 → 报告/体检/搜索/面板。大纲可以从 Markdown/YAML/JSON 导入,也可以由模型按章卡结构生成;严格模式下 P2/P3 会按章卡校验标题、场景、字数与 cast。
|
|
8
|
+
|
|
9
|
+
> **当前版本:0.2.1** · 中文界面 · MIT
|
|
8
10
|
>
|
|
9
11
|
> **宿主范围**:DSH `>=0.2.1-rc.2 <0.3.0-0`;Node `>=24.9.0`。
|
|
10
12
|
|
|
@@ -47,17 +49,18 @@
|
|
|
47
49
|
```text
|
|
48
50
|
模型 / 用户
|
|
49
51
|
│
|
|
50
|
-
├──
|
|
51
|
-
├── 5 条 /novel*
|
|
52
|
+
├── 28 个 novel_* 工具
|
|
53
|
+
├── 5 条 /novel* 命令(含 outline/guide/report/doctor/search 子命令)
|
|
52
54
|
├── 只读侧边栏「网文工坊」
|
|
53
55
|
└── 7 份阶段任务书(briefs)
|
|
54
56
|
│
|
|
55
57
|
▼
|
|
56
58
|
EngineService(唯一写入口)
|
|
57
59
|
│
|
|
58
|
-
├──
|
|
60
|
+
├── 13 条门控 PG-01 ~ PG-13
|
|
59
61
|
├── 15 维评分 / 满分 150
|
|
60
62
|
├── 规则包 rulepacks/default.yaml
|
|
63
|
+
├── 书级蓝图/大纲/世界观(outline/)
|
|
61
64
|
├── 事务化归档 + journal 审计
|
|
62
65
|
└── chapters/ 正文 + state/ 影子账本
|
|
63
66
|
```
|
|
@@ -70,7 +73,8 @@
|
|
|
70
73
|
- 不是「装完就自动写完整本书」的生成器;它管流程、门禁和状态,正文仍由模型写。
|
|
71
74
|
- 不是独立 CLI;必须作为 DSH 插件安装到某个 profile 才能使用。
|
|
72
75
|
- 不提供云端同步、账号体系、在线书城或多人协作。
|
|
73
|
-
- 0.
|
|
76
|
+
- 0.2.x 仍是中文界面与中文任务书,没有 `locale/`,也不读取系统语言。
|
|
77
|
+
- 不提供云端同步、多人协作、RAG/向量库或富文本编辑器;整书规划与单章流水线都在本地 YAML/Markdown 上完成。
|
|
74
78
|
|
|
75
79
|
---
|
|
76
80
|
|
|
@@ -78,16 +82,18 @@
|
|
|
78
82
|
|
|
79
83
|
| 能力 | 说明 |
|
|
80
84
|
| ------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
81
|
-
|
|
|
82
|
-
| 5 条 `/novel*` 命令 |
|
|
83
|
-
| 1 个侧边栏面板「网文工坊」 | 只读;Hero
|
|
84
|
-
| 1 个内置 Agent 预设「网文工坊」 |
|
|
85
|
+
| 28 个 `novel_*` 工具 | 书级蓝图/大纲/世界观 + 单章流水线 + 报告/体检/搜索/引导/重开/备份恢复 |
|
|
86
|
+
| 5 条 `/novel*` 命令 | 状态、下一步、统计、导出、隐藏操作;`/novel` 内含 outline/guide/report/doctor/search 子命令 |
|
|
87
|
+
| 1 个侧边栏面板「网文工坊」 | 只读;Hero、统计、全书规划、世界观、质量趋势、健康、最近活动、九阶段轨、章节卡、门控区 |
|
|
88
|
+
| 1 个内置 Agent 预设「网文工坊」 | 28 个工具全开,**不挂载 bash / 文件写入工具**;会话开始后不能切换 |
|
|
85
89
|
| 1 个入口技能 | 告诉模型什么时候该用引擎、哪些写入口是唯一的 |
|
|
86
|
-
|
|
|
90
|
+
| 13 条门控 | 任务书、阶段、字数、格式、摘要、场景类型、大纲对齐、评分、问题清零、阅读证明、一致性、轮次、归档原子性 |
|
|
87
91
|
| 15 维评分 | 满分 150,默认过关线 120;分数必须逐项可核对 |
|
|
88
92
|
| 事务化归档 | staging → 校验 → 备份 → pending journal → rename → 读回 → committed journal |
|
|
89
93
|
| 规则包外置 | 词表、格式、标点、语义、跨章阈值都在 `rulepacks/default.yaml`,代码只执行 |
|
|
90
|
-
|
|
|
94
|
+
| 六种导出 | Markdown、纯文本、EPUB 3、大纲、世界观、书级提案;正文导出附 `cover.svg` 与 `blurb.txt` |
|
|
95
|
+
| 整书规划层 | 书级蓝图、卷结构、章卡(严格模式)、世界观设定集;支持 Markdown/YAML/JSON 导入 |
|
|
96
|
+
| 可观测性 | `novel_status` 书级摘要、`novel_report`、`novel_doctor`、`novel_search`、panel v3、journal 活动 |
|
|
91
97
|
| 多项目注册表 | `stateDir/projects.yaml` 记录已知项目与当前项目;不影响项目目录 |
|
|
92
98
|
| 运行期依赖极少 | 只有 `yaml` 一个运行时依赖;不联网、不调用外部 API、不读环境变量里的密钥 |
|
|
93
99
|
|
|
@@ -117,7 +123,7 @@
|
|
|
117
123
|
|
|
118
124
|
P7/P8/P9 在 `novel_archive` 一次事务里完成。单章归档后状态是 `done`;下一章仍从 P1 开始。只有项目配置的 `total_chapters` 全部归档,面板才显示「全书完成」。
|
|
119
125
|
|
|
120
|
-
###
|
|
126
|
+
### 十三道门控
|
|
121
127
|
|
|
122
128
|
| 编号 | 名称 | 管什么 |
|
|
123
129
|
| ----- | ---------------- | --------------------------------------------------------- |
|
|
@@ -127,6 +133,7 @@ P7/P8/P9 在 `novel_archive` 一次事务里完成。单章归档后状态是 `d
|
|
|
127
133
|
| PG-04 | `FORMAT` | 段落、标点、Markdown、标题等格式 blocker 为零 |
|
|
128
134
|
| PG-05 | `SUMMARY_SCHEMA` | 十章摘要的十个字段齐全且类型正确 |
|
|
129
135
|
| PG-06 | `SCENE_TYPE` | 场景类型合法,节奏约束满足 |
|
|
136
|
+
| PG-13 | `OUTLINE_ALIGNMENT` | 有章卡时标题/场景/目标字数/cast 必须一致;严格模式无卡也拒绝;归档卡不可改 |
|
|
130
137
|
| PG-07 | `SCORE` | 十五维齐全、算术闭合、总分达到 `minScore` |
|
|
131
138
|
| PG-08 | `ISSUES_CLEARED` | 所有 blocker issue 已修复并带正文证据 |
|
|
132
139
|
| PG-09 | `READING_PROOF` | 三段逐字引用能在正文对应位置找到;开头/结尾按实际段落判定 |
|
|
@@ -165,7 +172,7 @@ P7/P8/P9 在 `novel_archive` 一次事务里完成。单章归档后状态是 `d
|
|
|
165
172
|
| 宿主形态 | Web(面板 + 预设)、Desktop(面板 + 预设,插件由桌面壳管理)、headless(只有工具/命令,无面板/预设) |
|
|
166
173
|
| 磁盘 | 项目根目录可写;默认 `stateDir` 可写 |
|
|
167
174
|
| 网络 | 安装时需要访问 npm / Git 托管;运行插件本身不联网 |
|
|
168
|
-
| 语言 | 0.
|
|
175
|
+
| 语言 | 0.2.x 仅中文 |
|
|
169
176
|
|
|
170
177
|
检查命令:
|
|
171
178
|
|
|
@@ -269,7 +276,7 @@ dsh plugin --profile web add dsh-novel-write-engine
|
|
|
269
276
|
固定版本:
|
|
270
277
|
|
|
271
278
|
```bash
|
|
272
|
-
dsh plugin --profile web add dsh-novel-write-engine@0.1
|
|
279
|
+
dsh plugin --profile web add dsh-novel-write-engine@0.2.1
|
|
273
280
|
```
|
|
274
281
|
|
|
275
282
|
`dsh` 不在 PATH 时,用 `npx @deepseek-ai/dsh` 代替命令开头的 `dsh`。
|
|
@@ -324,13 +331,13 @@ corepack pnpm pack
|
|
|
324
331
|
会得到类似:
|
|
325
332
|
|
|
326
333
|
```text
|
|
327
|
-
dsh-novel-write-engine-0.1.
|
|
334
|
+
dsh-novel-write-engine-0.2.1.tgz
|
|
328
335
|
```
|
|
329
336
|
|
|
330
337
|
把这个 tarball 复制到目标机器,放在一个**稳定、不会随手删除**的路径,然后:
|
|
331
338
|
|
|
332
339
|
```bash
|
|
333
|
-
dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.1.
|
|
340
|
+
dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.1.tgz
|
|
334
341
|
```
|
|
335
342
|
|
|
336
343
|
tarball 安装不会运行源码构建,也不会要求 `allowBuilds`;包内已经包含 `lib/`、`rulepacks/`、`briefs/`、`skills/`、`presets/` 和两层 patch。它是最接近「发布产物」的安装方式。
|
|
@@ -345,9 +352,9 @@ tarball 安装不会运行源码构建,也不会要求 `allowBuilds`;包内
|
|
|
345
352
|
2. 点 **添加插件**(或旁边的箭头 → **安装第三方插件**)。
|
|
346
353
|
3. 在包名字段填入以下任一形式:
|
|
347
354
|
- npm 包名:`dsh-novel-write-engine`
|
|
348
|
-
- 精确版本:`dsh-novel-write-engine@0.1
|
|
355
|
+
- 精确版本:`dsh-novel-write-engine@0.2.1`
|
|
349
356
|
- 源码目录:`/absolute/path/to/dsh-novel-write-engine`
|
|
350
|
-
- tarball:`/absolute/path/to/dsh-novel-write-engine-0.1.
|
|
357
|
+
- tarball:`/absolute/path/to/dsh-novel-write-engine-0.2.1.tgz`
|
|
351
358
|
4. npm 包名从 npm 官方源安装;本地目录和 tarball 直接使用宿主路径。
|
|
352
359
|
5. 点 **安装**,等待完成。
|
|
353
360
|
6. 如果出现 **立即启用**,点它;否则安装后到「已安装插件」里把 **dsh-novel-write-engine** 打开。
|
|
@@ -397,7 +404,7 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
397
404
|
列出你当前可用的 novel_* 工具。
|
|
398
405
|
```
|
|
399
406
|
|
|
400
|
-
应能看到
|
|
407
|
+
应能看到 28 个(`toolsMode=core` 时只有 10 个,见[第八节](#八使用方式))。
|
|
401
408
|
|
|
402
409
|
---
|
|
403
410
|
|
|
@@ -407,7 +414,7 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
407
414
|
|
|
408
415
|
左侧栏 → 新建会话 → 预设选 **网文工坊**。
|
|
409
416
|
|
|
410
|
-
这个预设的工具是「小说专用」的:有
|
|
417
|
+
这个预设的工具是「小说专用」的:有 28 个 `novel_*` 工具、任务书、网页、待办、子智能体等,但**不挂载 bash / 文件写入工具**。正文只能经引擎写。
|
|
411
418
|
|
|
412
419
|
### 2. 直接说人话
|
|
413
420
|
|
|
@@ -416,10 +423,18 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
416
423
|
```text
|
|
417
424
|
在 /home/me/novels/星海 开一本都市现代、番茄平台的书,
|
|
418
425
|
书名《星海旧梦》,作者是我,每章 2200–2800 字,共 120 章。
|
|
419
|
-
|
|
426
|
+
先做全书蓝图、第一卷大纲和世界观设定,再写第一章的世界观约束和章节计划。
|
|
420
427
|
```
|
|
421
428
|
|
|
422
|
-
模型会调用 `novel_init`
|
|
429
|
+
模型会调用 `novel_init` 建项目,然后按 `novel_guide` 的提示做书级规划;也可以跳过蓝图直接写第一章,严格大纲是可选开关。0.2.1 推荐顺序:
|
|
430
|
+
|
|
431
|
+
```text
|
|
432
|
+
novel_init
|
|
433
|
+
→ novel_blueprint(梗概/主题/基调/视角/卷结构)
|
|
434
|
+
→ novel_outline(章卡)或 novel_outline_import(Markdown/YAML/JSON)
|
|
435
|
+
→ novel_worldbook(设定/规则/势力/地点/角色/术语/前史)
|
|
436
|
+
→ novel_brief P1 …
|
|
437
|
+
```
|
|
423
438
|
|
|
424
439
|
### 3. 等价的 `novel_init` 参数
|
|
425
440
|
|
|
@@ -434,16 +449,21 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
434
449
|
"description": "一句话简介",
|
|
435
450
|
"words_per_chapter": [2200, 2800],
|
|
436
451
|
"total_chapters": 120,
|
|
452
|
+
"premise": "旧案重启,档案员被迫入局。",
|
|
453
|
+
"strict_outline": true,
|
|
437
454
|
"project_root": "/home/me/novels/星海"
|
|
438
455
|
}
|
|
439
456
|
```
|
|
440
457
|
|
|
458
|
+
`premise`、`logline`、`themes`、`tone`、`pov`、`audience`、`selling_points`、`ending` 与 `strict_outline` 都是可选的书级种子;不填也能开书,之后用 `novel_blueprint` 补。
|
|
459
|
+
|
|
441
460
|
`genre` 必须是 12 类之一,`platform` 必须是 `fanqie` / `qidian` / `qimao` / `jinjiang` 之一。`project_root` 省略时按「最近活跃项目 → 注册表 active → 配置里的 `projectRoot`(默认 `./novel`,相对于 DSH 进程工作目录)」解析;有多个项目时请显式传 `project_root`,避免写错书。
|
|
442
461
|
|
|
443
462
|
### 4. 一章的标准调用顺序
|
|
444
463
|
|
|
445
464
|
| 步骤 | 调用 | 说明 |
|
|
446
465
|
| ---- | --------------------------------------------- | -------------------------------------- |
|
|
466
|
+
| 0 | `novel_blueprint` / `novel_outline` | 书级蓝图与当前章卡(严格模式必须) |
|
|
447
467
|
| 1 | `novel_brief P1` | 领取 P1 世界观任务书,签收 digest |
|
|
448
468
|
| 2 | `novel_plan_world` | 提交世界观约束 |
|
|
449
469
|
| 3 | `novel_brief P2` | 领取 P2 章节计划任务书 |
|
|
@@ -453,21 +473,21 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
453
473
|
| 7 | `novel_brief P4` | 领取 P4 评审任务书 |
|
|
454
474
|
| 8 | `novel_review` | 十五维评分 + 三段阅读证明 |
|
|
455
475
|
| 9 | 有 blocker:`novel_brief P5` → `novel_revise` | 修订后回到 P4 重评 |
|
|
456
|
-
| 10 | 无 blocker:`novel_brief P6` → `novel_check` | 机检 +
|
|
476
|
+
| 10 | 无 blocker:`novel_brief P6` → `novel_check` | 机检 + 五个语义项(含 POV) |
|
|
457
477
|
| 11 | `novel_brief P8` | 领取终审任务书 |
|
|
458
478
|
| 12 | `novel_archive` | 必须带 `state_delta`,一次事务归档 |
|
|
459
|
-
| 13 | `novel_export md` | 或 `txt` / `epub`
|
|
479
|
+
| 13 | `novel_export md` | 或 `txt` / `epub` / `outline` / `worldbook` / `proposal` |
|
|
460
480
|
|
|
461
481
|
关键点:
|
|
462
482
|
|
|
463
483
|
- **每一步提交前都要先领任务书**,PG-01 会检查 digest。`novel_status` / `novel_pipeline` 在任务书缺失或过期时会先返回 `novel_brief`,不会让你直接撞 PG-01。
|
|
464
|
-
- **坏状态不是死锁**:plan/review/check/worldPlan
|
|
484
|
+
- **坏状态不是死锁**:plan/review/check/worldPlan、八个 ledger 与 outline/worldbook 损坏时,status 返回 `state_errors` 与 `STATE_UNREADABLE`;plan/review/check 走 rollback/阶段重建,ledger/project/规划文档则 `novel_state` 返回 `raw`、`next` 指向 `novel_amend`。`novel_amend` 会为当前所有不可读状态文档豁免 journal 的既有 hash,并在同一事务里写目标文档与 `state/pipeline.yaml`(不是只写一个文件);其他可读文件的外部改动仍拒绝。P6 的 check 损坏优先于旧 revision 阻塞;归档前 `review_digest` 缺失/不匹配会回退 P4。损坏或丢失的 `novel.yaml` 也走同一条 `PROJECT_UNREADABLE` 修复路径。
|
|
465
485
|
- **计划先校验再落盘**:P1 的 `constraints`/`characters`/`locations`/`continuity_notes` 有形状校验;P2 的标题长度读 rulepack、5–8 个非空节拍、narrator、opening/ending 都会在服务边界拒绝。P2 可选 `cast`(1–8 人),名字必须来自 P1 世界计划或角色台账。
|
|
466
486
|
- **上下文有预算且不裁主角团**:每个 brief 的 `context.context_meta` 给出 `budget`/`used`/`truncated`/`omitted`;P1 `world_plan` 的目标/约束/连续性说明、P3/P4/P5 的本章活跃角色完整卡、P6 的 `active_cast` 与正文/当前 plan/review/check/摘要受保护;`world_plan.characters/locations` 是可裁剪的候选名单,`other_characters` 只放压缩索引。裁剪会参与 digest,升级后旧 brief 需要重新领取。
|
|
467
487
|
- **长书读口**:`novel_state {kind:"chapters"}` 默认返回紧凑索引,`include_summary`/`chapter_range` 按需取;panel 只送最近 30 行。归档继承上一章 handoff 的 volume/volume_name;act/act_progress 从上一章推进,`handoff.act`/`act_progress` 可覆盖。
|
|
468
488
|
- `ready_to_archive` 在 P8 任务书当前后,`next.tool` 才返回 `novel_archive`;P5/P6 有阻塞时返回 `novel_revise`。
|
|
469
489
|
- `novel_review` 的 `total` 是必填的,必须等于 `150 - Σdelta`;三段阅读证明必须逐字来自正文,开头/结尾按**实际段落**判定;issue 的 `dimension` 必须是当前十五维之一,`location` 必须是本章实际段落。
|
|
470
|
-
- `novel_check` 的 `semantic`
|
|
490
|
+
- `novel_check` 的 `semantic` 恰好五个语义项(`L2-SCENE-ANCHOR` / `L2-CHARACTER-STATE` / `L2-CAUSALITY` / `L2-VOICE` / `L2-POV`),每项带至少 8 字、五条互不相同且来自不同句子的正文引用;`scope` 默认 `content + integrity`,只跑一类时另一类不参与本次 check,且通过后仍停留 P6(`CHECK_SCOPE_PARTIAL`),不能归档。
|
|
471
491
|
- `novel_archive` 的 `state_delta` 要逐实体核销角色、伏笔、时间线、世界、关系;新伏笔标题必须出现在正文,`no_change` 也要写原因;review 存在但 `review_digest` 缺失时拒绝归档,需重新 `novel_review`。
|
|
472
492
|
- 正文改动后,旧的评审分数和 check 会失效;不要试图手工改 `state/` 绕过。
|
|
473
493
|
|
|
@@ -477,9 +497,10 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
477
497
|
|
|
478
498
|
- Hero:书名、类型、平台、当前章、阶段;
|
|
479
499
|
- 统计:已归档章节、总字数、平均分、待处理门控;
|
|
500
|
+
- 全书规划:蓝图/严格模式、章卡进度、卷列表、世界观计数、质量趋势、健康度;
|
|
480
501
|
- 九阶段轨;
|
|
481
502
|
- 下一步卡;
|
|
482
|
-
-
|
|
503
|
+
- 章节卡、门控区与最近活动。
|
|
483
504
|
|
|
484
505
|
面板每 15 秒静默同步一次,也可以点刷新;它**只读**,所有写操作仍在对话/工具里。
|
|
485
506
|
|
|
@@ -491,36 +512,46 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
491
512
|
|
|
492
513
|
| 形态 | 怎么进 | 工具 | 写文件能力 | 面板/预设 |
|
|
493
514
|
| -------------------- | ------------------------------ | --------------------- | ----------------------------------- | ------------------ |
|
|
494
|
-
| 内置预设「网文工坊」 | 新会话选预设 |
|
|
495
|
-
| 普通会话 | 任意标准会话 |
|
|
496
|
-
| headless / 自动化 | `dsh --profile headless "..."` |
|
|
515
|
+
| 内置预设「网文工坊」 | 新会话选预设 | 28 个全开 | 不挂 bash/fs 写入工具,正文只经引擎 | 有 |
|
|
516
|
+
| 普通会话 | 任意标准会话 | 28 个工具在根层注册 | 可能还有 bash/fs;引擎保证会被绕过 | 有面板,无专用预设 |
|
|
517
|
+
| headless / 自动化 | `dsh --profile headless "..."` | 28 个(或 core 10 个) | 取决于该 profile | 无面板、无预设 |
|
|
497
518
|
|
|
498
519
|
**要用「引擎保证」就用「网文工坊」预设。** 普通会话里,模型仍然可以用文件工具直接改 `state/` 或正文;那时你得到的是「引擎工具 + 人工操作」的混合状态,事务、门控、审计都不再完整。
|
|
499
520
|
|
|
500
521
|
预设是会话类型,**会话开始后不能切换**。要换形态就新开一个会话。
|
|
501
522
|
|
|
502
|
-
### 8.2
|
|
523
|
+
### 8.2 28 个工具
|
|
503
524
|
|
|
504
525
|
| 工具 | 阶段 | 做什么 | 写盘 |
|
|
505
526
|
| -------------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- |
|
|
506
|
-
| `novel_init` | — | 建项目:`novel.yaml` + `state/` + 目录
|
|
527
|
+
| `novel_init` | — | 建项目:`novel.yaml` + `state/` + `outline/` + 目录 | 是 |
|
|
507
528
|
| `novel_status` | 任意 | 当前活跃章、阶段、轮次、阻塞项、`state_errors`、下一步;`chapter` 只用于字数查询 | 否 |
|
|
508
529
|
| `novel_brief` | P1–P6 / P8 | 领取当前活跃章的任务书,返回 `fields`、`context`;`context.world_plan` 与 `context.context_meta` 在 `context` 内,并记录 digest | 仅任务书签收 |
|
|
509
530
|
| `novel_plan_world` | P1 | 提交世界观约束;数组/对象形状在服务边界校验 | 是 |
|
|
510
531
|
| `novel_plan_chapter` | P2 | 提交章节计划;标题长度读 rulepack、5–8 个节拍、opening/ending 非空;可选 `cast` 1–8 人 | 是 |
|
|
511
532
|
| `novel_write_draft` | P3 | 提交初稿;格式/字数/摘要不过整体拒绝 | 是 |
|
|
512
533
|
| `novel_review` | P4 | 十五维评分、问题清单、三段阅读证明;issue 维度/段落和 blocker waived 会被拒绝 | 是 |
|
|
513
|
-
| `novel_revise` | P5/P6 |
|
|
514
|
-
| `novel_check` | P6 | 机检 +
|
|
534
|
+
| `novel_revise` | P5/P6 | 提交修订;支持整章 `content` 或 `patch:{expected_hash,edits}`;blocker 必须有正文证据,不能降级或 waived | 是 |
|
|
535
|
+
| `novel_check` | P6 | 机检 + 五个语义一致性项;`advisories` 与 blocker 分开,可用 `acknowledge` 记录知悉;单 scope 不推进归档 | 是 |
|
|
515
536
|
| `novel_archive` | P7–P9 | 事务归档;必须带 `state_delta`;旧 review 无 digest 时拒绝 | 事务 |
|
|
516
537
|
| `novel_word_count` | 任意 | 按引擎唯一口径数字数 | 否 |
|
|
517
|
-
| `novel_state` | 任意 | 读账本、计划、评审、检查、handoff
|
|
518
|
-
| `novel_amend` | 任意 | 带原因修订 `novel.yaml
|
|
538
|
+
| `novel_state` | 任意 | 读账本、计划、评审、检查、handoff、outline/worldbook、history/backups/briefs;chapters 默认紧凑,支持 `include_summary`/`chapter_range`;损坏 ledger 返回 raw | 否 |
|
|
539
|
+
| `novel_amend` | 任意 | 带原因修订 `novel.yaml`、八个 ledger 或 outline/worldbook,带不变量与单目标 repair | 是,入 journal |
|
|
519
540
|
| `novel_rollback` | 任意 | 只退回当前阶段或更早,保留正文供参考 | 是 |
|
|
520
541
|
| `novel_diff` | 任意 | 与上次归档备份或两段文本比较 | 否 |
|
|
521
|
-
| `novel_export` | 任意 | 导出 `md` / `txt` / `epub`
|
|
522
|
-
| `novel_audit` | 任意 | 读追加式 journal
|
|
542
|
+
| `novel_export` | 任意 | 导出 `md` / `txt` / `epub` / `outline` / `worldbook` / `proposal` | 导出目录 |
|
|
543
|
+
| `novel_audit` | 任意 | 读追加式 journal 审计记录,含被拒 attempt;支持 chapter/op/status/since/until/cursor | 否 |
|
|
523
544
|
| `novel_pipeline` | 任意 | 「下一步该做什么」的建议 | 否 |
|
|
545
|
+
| `novel_blueprint` | 任意 | 写书级蓝图:梗概、主题、基调、视角、读者、卖点、结局、卷结构 | 是 |
|
|
546
|
+
| `novel_outline` | 任意 | 写卷/章卡;严格模式、归档卡保护、归档章自动回填 | 是 |
|
|
547
|
+
| `novel_outline_import` | 任意 | 从 Markdown / YAML / JSON 导入大纲;`dry_run` 先预览 | 可选 |
|
|
548
|
+
| `novel_worldbook` | 任意 | 增量更新世界观设定集(设定/规则/势力/地点/角色/术语/前史) | 是 |
|
|
549
|
+
| `novel_search` | 任意 | 跨正文、摘要、大纲、世界观、台账搜索,带章号/段落号/片段 | 否 |
|
|
550
|
+
| `novel_doctor` | 任意 | 项目体检:项目/流水线/状态、journal、正文 hash、孤立正文、大纲覆盖与漂移、当前阶段产物、锁、备份、目标进度、下一步 | 否 |
|
|
551
|
+
| `novel_report` | 任意 | 全书报告:进度、大纲、世界观、质量、节奏、角色、伏笔、时间线、关系、活动 | 否 |
|
|
552
|
+
| `novel_guide` | 任意 | 上手引导:当前状态、已完成步骤、下一步工具、命令与提示;无项目也能用 | 否 |
|
|
553
|
+
| `novel_reopen` | 已归档章 | 从归档备份把紧邻的上一章重开到 P3;必须带非空 `reason`,活动章未开始、备份存在时才允许 | 是 |
|
|
554
|
+
| `novel_restore` | 活动章 | 从带 manifest 的 txid 备份恢复正文/计划/评审/校验;已归档章拒绝,先 `novel_reopen` | 是 |
|
|
524
555
|
|
|
525
556
|
工具失败时统一返回:
|
|
526
557
|
|
|
@@ -543,7 +574,7 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
543
574
|
| `/novel` | 不带参数 = 状态;`/novel status` 同义 |
|
|
544
575
|
| `/novel-next` | 下一步工具与理由 |
|
|
545
576
|
| `/novel-stats` | 章节数、总字数、平均分、未回收伏笔、规则包版本 |
|
|
546
|
-
| `/novel-export` | 导出 `md` / `txt` / `epub
|
|
577
|
+
| `/novel-export` | 导出 `md` / `txt` / `epub` / `outline` / `worldbook` / `proposal` |
|
|
547
578
|
| `/novel-admin` | `/novel-admin <op> <json>` 执行隐藏/运维操作 |
|
|
548
579
|
|
|
549
580
|
`/novel` 还有子命令:
|
|
@@ -551,19 +582,24 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
551
582
|
```text
|
|
552
583
|
/novel next
|
|
553
584
|
/novel stats
|
|
554
|
-
/novel
|
|
585
|
+
/novel outline
|
|
586
|
+
/novel guide
|
|
587
|
+
/novel report
|
|
588
|
+
/novel doctor
|
|
589
|
+
/novel search <关键词>
|
|
590
|
+
/novel export md|txt|epub|outline|worldbook|proposal
|
|
555
591
|
/novel admin
|
|
556
592
|
/novel admin novel_state {"kind":"pipeline"}
|
|
557
593
|
```
|
|
558
594
|
|
|
559
|
-
**`toolsMode=core` 时**只注册
|
|
595
|
+
**`toolsMode=core` 时**只注册 10 个高频工具:
|
|
560
596
|
|
|
561
597
|
```text
|
|
562
|
-
novel_init, novel_status, novel_brief,
|
|
563
|
-
novel_review, novel_revise, novel_check, novel_archive
|
|
598
|
+
novel_init, novel_status, novel_guide, novel_brief, novel_outline,
|
|
599
|
+
novel_write_draft, novel_review, novel_revise, novel_check, novel_archive
|
|
564
600
|
```
|
|
565
601
|
|
|
566
|
-
其余
|
|
602
|
+
其余 18 个非 core 工具不消失,改走命令;`/novel admin` 可显式调用非 core 操作(core 里只有 `novel_outline` / `novel_guide` 也在 admin 表中):
|
|
567
603
|
|
|
568
604
|
```text
|
|
569
605
|
/novel admin novel_plan_world {...}
|
|
@@ -576,6 +612,14 @@ novel_review, novel_revise, novel_check, novel_archive
|
|
|
576
612
|
/novel admin novel_export {"kind":"md"}
|
|
577
613
|
/novel admin novel_audit {"limit":20}
|
|
578
614
|
/novel admin novel_pipeline
|
|
615
|
+
/novel admin novel_blueprint {...}
|
|
616
|
+
/novel admin novel_outline_import {...}
|
|
617
|
+
/novel admin novel_worldbook {...}
|
|
618
|
+
/novel admin novel_search {"query":"..."}
|
|
619
|
+
/novel admin novel_doctor
|
|
620
|
+
/novel admin novel_report
|
|
621
|
+
/novel admin novel_reopen {"chapter":2,"reason":"..."}
|
|
622
|
+
/novel admin novel_restore {"txid":"..."}
|
|
579
623
|
```
|
|
580
624
|
|
|
581
625
|
多项目注册表与设定包导入**只有命令入口**:
|
|
@@ -620,6 +664,9 @@ novel_review, novel_revise, novel_check, novel_archive
|
|
|
620
664
|
/novel export md
|
|
621
665
|
/novel export txt
|
|
622
666
|
/novel export epub
|
|
667
|
+
/novel export outline
|
|
668
|
+
/novel export worldbook
|
|
669
|
+
/novel export proposal
|
|
623
670
|
/novel-export epub
|
|
624
671
|
```
|
|
625
672
|
|
|
@@ -629,6 +676,9 @@ novel_review, novel_revise, novel_check, novel_archive
|
|
|
629
676
|
exports/
|
|
630
677
|
├── book.md / book.txt / book.epub # 全书
|
|
631
678
|
├── book-ch001.md / .txt / .epub # 单章
|
|
679
|
+
├── outline.md # 大纲(与导入模板同形)
|
|
680
|
+
├── worldbook.md # 世界观设定集
|
|
681
|
+
├── proposal.md # 书级提案
|
|
632
682
|
├── cover.svg
|
|
633
683
|
└── blurb.txt
|
|
634
684
|
```
|
|
@@ -646,6 +696,35 @@ exports/
|
|
|
646
696
|
- 切换 active:`/novel admin novel_registry_activate {"root":"/abs/book"}`;
|
|
647
697
|
- 删除注册行:`/novel admin novel_registry_forget {"root":"/abs/book"}`;项目文件不动。
|
|
648
698
|
|
|
699
|
+
### 8.7 整书规划、观测与修复
|
|
700
|
+
|
|
701
|
+
```text
|
|
702
|
+
# 1. 书级蓝图与卷
|
|
703
|
+
novel_blueprint {premise, logline, themes, tone, pov, audience,
|
|
704
|
+
selling_points, ending, strict, volumes}
|
|
705
|
+
|
|
706
|
+
# 2. 章卡;或从 Markdown/YAML/JSON 导入
|
|
707
|
+
novel_outline {chapters}
|
|
708
|
+
novel_outline_import {format:"markdown", content:"...", dry_run:true}
|
|
709
|
+
|
|
710
|
+
# 3. 世界观设定集(按段替换)
|
|
711
|
+
novel_worldbook {setting, rules, factions, locations, characters, glossary, backstory}
|
|
712
|
+
|
|
713
|
+
# 4. 每次写章前看 guide;写完随时看 report/doctor/search
|
|
714
|
+
novel_guide
|
|
715
|
+
novel_report
|
|
716
|
+
novel_doctor
|
|
717
|
+
novel_search {query:"蜡印", scope:"all"}
|
|
718
|
+
|
|
719
|
+
# 5. 已归档章要改:先重开紧邻的上一章,再走 P3→P9
|
|
720
|
+
novel_reopen {chapter:3, reason:"结尾需要重写"}
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
- 严格大纲:`book.strict=true` 时 P2/P3 必须要有章卡;只要章卡存在,标题/场景/目标字数/cast 在任何模式下都受 PG-13 约束。要关闭严格缺卡检查用 `novel_blueprint {strict:false}`。
|
|
724
|
+
- 归档卡不可直接改;`novel_reopen` 需要非空 `reason`,会从该章归档事务的备份恢复索引/台账/handoff/正文。
|
|
725
|
+
- `novel_doctor` 只读;`novel_amend` 才是修复写入口。
|
|
726
|
+
- 报告/体检/搜索结果都带章号与可定位片段,不是笼统摘要。
|
|
727
|
+
|
|
649
728
|
---
|
|
650
729
|
|
|
651
730
|
## 九、配置
|
|
@@ -656,7 +735,7 @@ exports/
|
|
|
656
735
|
| ----------------- | -------------------------------- | ------------------------------------------------------------------------- |
|
|
657
736
|
| `projectRoot` | `./novel` | 默认项目根;相对路径相对于 DSH 进程工作目录。工具可用 `project_root` 覆盖 |
|
|
658
737
|
| `minScore` | `120` | PG-07 过关线,整数 0..150;唯一 owner |
|
|
659
|
-
| `toolsMode` | `all` | `all` 注册
|
|
738
|
+
| `toolsMode` | `all` | `all` 注册 28 个工具;`core` 只注册 10 个,其余走 `/novel admin` |
|
|
660
739
|
| `briefsOverrides` | 空 | 自定义任务书目录;某阶段文件缺失时回退包内 `briefs/<阶段>.md` |
|
|
661
740
|
| `backupRetention` | `5` | 保留的归档备份目录数;只清理引擎自己创建的 `backups/<txid>` |
|
|
662
741
|
| `stateDir` | 空 → `~/.dsh/novel-write-engine` | 多项目注册表位置;**不要放进项目目录** |
|
|
@@ -732,7 +811,7 @@ P8.md
|
|
|
732
811
|
|
|
733
812
|
### 9.4 规则包不能运行期切换
|
|
734
813
|
|
|
735
|
-
`rulepacks/default.yaml` 是随包加载的:词表、格式、标点、语义、跨章阈值、平台默认值都在里面。0.
|
|
814
|
+
`rulepacks/default.yaml` 是随包加载的:词表、格式、标点、语义、跨章阈值、平台默认值都在里面。0.2.x **不接受**运行期外部规则包路径。
|
|
736
815
|
|
|
737
816
|
要改规则,只有两条路:
|
|
738
817
|
|
|
@@ -801,8 +880,8 @@ corepack pnpm test
|
|
|
801
880
|
|
|
802
881
|
- 正文可以读,但不建议手改;正文一改,评审分数、check、content hash 都会失效。
|
|
803
882
|
- `state/` 不要手改;要改就用 `novel_amend`,它要求 `reason` 并写入 journal。
|
|
804
|
-
- 要回退阶段用 `novel_rollback
|
|
805
|
-
- plan/review/check 损坏时,status 的 `state_errors` 会指出文件;不要手改。当前阶段晚于重建点时先 `novel_rollback`;已经处在 P2/P4/P6 时直接重新取 brief,再用对应阶段工具重建。八个 ledger
|
|
883
|
+
- 要回退阶段用 `novel_rollback`;它只允许退回当前阶段或更早,会保留正文为参考,清空轮次;任务书收据留在 state/briefs.yaml,digest 仍匹配时可复用。
|
|
884
|
+
- plan/review/check 损坏时,status 的 `state_errors` 会指出文件;不要手改。当前阶段晚于重建点时先 `novel_rollback`;已经处在 P2/P4/P6 时直接重新取 brief,再用对应阶段工具重建。八个 ledger、`novel.yaml` 或 outline/worldbook 损坏时,`novel_state` 返回 raw,按 `next` 调 `novel_amend` 修复;当前所有不可读状态文档的 journal hash 会被豁免,其他可读文件的外部改动仍 fail-closed。
|
|
806
885
|
- 不要在引擎运行时删 `.engine.lock`;锁由引擎回收,手删可能让两个写者同时进入。
|
|
807
886
|
|
|
808
887
|
### 10.4 备份与恢复
|
|
@@ -816,13 +895,29 @@ corepack pnpm test
|
|
|
816
895
|
|
|
817
896
|
## 十一、升级
|
|
818
897
|
|
|
819
|
-
### 11.0 从 0.
|
|
898
|
+
### 11.0 从 0.2.0 升级到 0.2.1
|
|
899
|
+
|
|
900
|
+
0.2.1 不迁移项目数据,但改变几处契约:
|
|
901
|
+
|
|
902
|
+
1. **面板 payload v3**:旧标签页会显示刷新提示;刷新即可。面板根容器现在自己是滚动区,长内容不再被裁掉。
|
|
903
|
+
2. **P2 计划不可变**:`plans/chNNN.chapter.yaml` 不再写 `summary`;旧项目仍回退读它。新摘要/标题/场景/叙述者进入 `state/pipeline.yaml` 的 `draft`,`novel_write_draft`/`novel_revise` 后以它为准。
|
|
904
|
+
3. **评分与证据历史**:评审/校验/正文/废弃稿按 revision 写入 `history/`;`novel_report` 的维度样本会变多,`ChapterRecord` 保存 lifetime rounds(含 rollbacks)/final_check/archived_at,这是历史证据而不是统计错误。amend 不能改写这些字段。
|
|
905
|
+
4. **审计更完整**:通过参数形状校验、进入项目锁后被 gate/delta/state 拒绝的调用会出现在 `novel_audit`,状态为 `aborted`、`attempt:true` 并带 code;事务失败/崩溃恢复的 aborted 行也带 code;锁前纯参数错误不写 journal。
|
|
906
|
+
5. **检查文档分层**:advisory 进入 `machine.advisories`,不再混入 `violations`;用 `acknowledge` 记录知悉,blocker 不能 acknowledge。数字矛盾固定 advisory,数字事实只匹配相邻的“别名+数字+单位”。
|
|
907
|
+
6. **新工具 `novel_restore`**:从 `novel_state {kind:"backups"}` 列出的 txid 恢复活动章的正文/计划/世界观计划/评审/校验;P2/P4/P6 在第二次提交起会留下 pre-image。恢复本身再建备份且不 replay;已归档章先 `novel_reopen`。
|
|
908
|
+
7. **修订可 patch**:`novel_revise` 可传 `patch:{expected_hash,edits}` 代替整章;hash 不匹配、锚点不唯一或编辑重叠都会拒绝。
|
|
909
|
+
8. **字数有分解**:`total_word_count` 仍含标点;新字段 `punctuation_chars` 与 PG-03 分解让口径可见。
|
|
910
|
+
9. **大纲覆盖率改口径**:规划覆盖 = 章卡数 / 目标章数,归档覆盖 = 归档卡数 / 目标章数;`card_coverage` 是逐章“有 archived 卡”的比例;缺卡数单独输出。
|
|
911
|
+
10. **worldbook facts**:新增声明式数字事实,进入计数、brief 上下文、搜索与 P6 检查;`facts` 只做作者声明的 canon 对账,不等同外部史实库。
|
|
912
|
+
11. **伏笔 anchor**:可读 `title` 与逐字 `anchor` 分离,anchor 至少 8 个字符;单字子串不再能绕过校验。
|
|
913
|
+
|
|
914
|
+
### 11.0.1 从 0.1.3 升级到 0.2.0
|
|
820
915
|
|
|
821
|
-
0.
|
|
916
|
+
0.2.0 新增 `outline/outline.yaml` 与 `outline/worldbook.yaml`,新增 9 个工具与 PG-13;旧项目缺少两份规划文档时按空规划读取,不会报错。新项目默认写入两份空文档;严格大纲默认关闭,`novel_outline` 首次提交才开启。P6 语义项从 4 条变 5 条(新增 `L2-POV`),旧的 4 条 check 需要重跑。面板 payload v1 → v2,旧标签页显示刷新。所有升级后第一次取 brief 会因上下文新增 `book_plan`/`outline_card`/`worldbook` 而失效,重新 `novel_brief` 即可。
|
|
822
917
|
|
|
823
918
|
需要知道的行为变化:
|
|
824
919
|
|
|
825
|
-
1. **损坏台账可修**:八个 ledger 损坏时 status/panel 仍可读;`novel_state` 返回 `raw`,用 `novel_amend` 修复。amend 会为当前所有不可读状态文档豁免 journal 的既有 hash;真正可读文件的外部改动仍 fail-closed。
|
|
920
|
+
1. **损坏台账可修**:八个 ledger 或 outline/worldbook 损坏时 status/panel 仍可读;`novel_state` 返回 `raw`,用 `novel_amend` 修复。amend 会为当前所有不可读状态文档豁免 journal 的既有 hash;真正可读文件的外部改动仍 fail-closed。
|
|
826
921
|
2. **chapters 不变量**:amend 不能删已归档章、不能改 `content_hash`/`archive_digest`;有章节文件时还会核对 hash。
|
|
827
922
|
3. **P2 cast 可选**:旧 plan 没有 `cast` 仍可读;新 plan 可传 1–8 人,P3 会把这些人物的完整卡放进上下文。
|
|
828
923
|
4. **chapters 查询变紧凑**:`novel_state {kind:"chapters"}` 默认不再带 summary;需要完整摘要加 `include_summary:true` 或 `chapter_range`。
|
|
@@ -830,7 +925,7 @@ corepack pnpm test
|
|
|
830
925
|
6. **handoff 派生**:归档不再每章重算 `ceil(chapter/20)`;volume/volume_name 继承上一章,act/act_progress 从上一章推进,`handoff.act`/`act_progress` 可覆盖。
|
|
831
926
|
7. **panel 上限 30 行**:长书面板只送最近 30 章,统计仍用全书总数。
|
|
832
927
|
|
|
833
|
-
### 11.0.
|
|
928
|
+
### 11.0.2 从 0.1.1 升级到 0.1.2
|
|
834
929
|
|
|
835
930
|
0.1.2 不 bump schema,也不改工具名/参数;但它会主动让三类旧状态暴露出来:
|
|
836
931
|
|
|
@@ -856,7 +951,7 @@ dsh plugin --profile web add dsh-novel-write-engine@latest
|
|
|
856
951
|
也可以固定版本:
|
|
857
952
|
|
|
858
953
|
```bash
|
|
859
|
-
dsh plugin --profile web add dsh-novel-write-engine@0.1
|
|
954
|
+
dsh plugin --profile web add dsh-novel-write-engine@0.2.1
|
|
860
955
|
```
|
|
861
956
|
|
|
862
957
|
升级后核对:
|
|
@@ -898,7 +993,7 @@ corepack pnpm pack
|
|
|
898
993
|
|
|
899
994
|
```bash
|
|
900
995
|
dsh plugin --profile web remove dsh-novel-write-engine
|
|
901
|
-
dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.1.
|
|
996
|
+
dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.1.tgz
|
|
902
997
|
```
|
|
903
998
|
|
|
904
999
|
### 11.5 在 Web / Desktop 里升级
|
|
@@ -1078,10 +1173,10 @@ DSH bundle 的 Host 半边在 DSH 进程内执行,不受工作区沙箱限制
|
|
|
1078
1173
|
|
|
1079
1174
|
## 十五、已知限制
|
|
1080
1175
|
|
|
1081
|
-
-
|
|
1082
|
-
- **0.
|
|
1176
|
+
- **书级大纲是 0.2.0 的新数据源**:`outline/outline.yaml` 与 `outline/worldbook.yaml` 由引擎读写;有章卡时 P2/P3 受 PG-13 约束,严格模式还要求章卡存在。大纲是规划层,不替代 `state/` 台账。
|
|
1177
|
+
- **0.2.x 只有中文**:面板、命令、错误、任务书都是中文;没有 `locale/`,不跟随系统语言。
|
|
1083
1178
|
- **通过 npm 分发**:安装与升级统一使用 `dsh plugin add`;源码目录和 tarball 用于开发或离线环境。
|
|
1084
|
-
- **面板与预设只在 Web/Desktop**:headless / acp / sdk 没有 `agentPresets` 服务,也没有浏览器面板;
|
|
1179
|
+
- **面板与预设只在 Web/Desktop**:headless / acp / sdk 没有 `agentPresets` 服务,也没有浏览器面板;28 个工具仍可用。
|
|
1085
1180
|
- **规则包不可运行期替换**:要改词表/阈值,必须改源码、重新构建、重新安装。
|
|
1086
1181
|
- **普通会话可能绕过引擎**:只有「网文工坊」预设不挂 bash/fs 写工具;在普通会话里手动改文件,事务与门控保证不再完整。
|
|
1087
1182
|
- **预设会话开始后不能切换**。
|
|
@@ -1126,19 +1221,19 @@ DSH_BUNDLE_ROOT=/path/to/deepseek-harness/packages/bundle/web-app corepack pnpm
|
|
|
1126
1221
|
|
|
1127
1222
|
`check:preset` 不伪造 bundle root;没有宿主 checkout 时它不会假装通过。
|
|
1128
1223
|
|
|
1129
|
-
`check:host` 使用临时 `DSH_HOME` 与临时 profile:`npm pack → dsh plugin add → --dump-config → 启动 Web → 面板 401/200 → 卸载 →
|
|
1224
|
+
`check:host` 使用临时 `DSH_HOME` 与临时 profile:`build → npm pack → dsh plugin add → --dump-config → 启动 Web → 面板 401/200 → 卸载 → 确认层消失`,并断言宿主声明全部 28 个工具。它需要 PATH 里有 `dsh`(或设置 `DSH_BIN`),不会碰你的真实 profile;没有 DSH 时以退出码 2 明确失败,不伪造通过。
|
|
1130
1225
|
|
|
1131
1226
|
### 16.3 发布前手动验证
|
|
1132
1227
|
|
|
1133
1228
|
1. `corepack pnpm build && corepack pnpm pack`;
|
|
1134
1229
|
2. 在临时 DSH home 里 `dsh plugin --profile web add <tarball>`;
|
|
1135
1230
|
3. `--dump-config` 确认插件层;
|
|
1136
|
-
4. 启动 Web,确认面板、预设、
|
|
1231
|
+
4. 启动 Web,确认面板、预设、28 个工具、`/novel`;
|
|
1137
1232
|
5. 跑一遍 `novel_init → P1 → … → archive → export`;
|
|
1138
1233
|
6. `dsh plugin remove`,确认层与面板消失;
|
|
1139
1234
|
7. 确认项目数据未被卸载动作删除。
|
|
1140
1235
|
|
|
1141
|
-
`pnpm check:host` 覆盖第 1–4 与第 6
|
|
1236
|
+
`pnpm check:host` 覆盖第 1–4 与第 6 步的自动断言(含 28 个工具的宿主声明与面板结构);`/novel` 命令的注册与路由由 `tests/adapters` 覆盖;第 5 步仍是人工全流程(需要可用模型)。
|
|
1142
1237
|
|
|
1143
1238
|
### 16.4 项目结构
|
|
1144
1239
|
|
|
@@ -1148,7 +1243,7 @@ src/
|
|
|
1148
1243
|
├── rules/ # 规则编译器、注册表、检测流水线
|
|
1149
1244
|
├── store/ # FsStore、事务、锁、journal、迁移、注册表
|
|
1150
1245
|
├── engine/ # EngineService、门控、任务书、投影
|
|
1151
|
-
├── tools/ #
|
|
1246
|
+
├── tools/ # 28 个工具适配器
|
|
1152
1247
|
├── commands/ # 5 条命令 + admin
|
|
1153
1248
|
├── client/ # 侧边栏面板
|
|
1154
1249
|
├── remote/ # 只读 panel 路由
|
|
@@ -1162,13 +1257,14 @@ tests/ # 单测、集成、falsify、e2e
|
|
|
1162
1257
|
|
|
1163
1258
|
### 16.5 当前验证基线
|
|
1164
1259
|
|
|
1165
|
-
0.1
|
|
1260
|
+
0.2.1 在 Node 24.19 / DSH 0.2.1-rc.3 上完成过:
|
|
1166
1261
|
|
|
1167
|
-
- `corepack pnpm test` 全绿(当前树
|
|
1168
|
-
- 最近一次覆盖率语句 93.
|
|
1262
|
+
- `corepack pnpm test` 全绿(当前树 667 项,72 个测试文件);
|
|
1263
|
+
- 最近一次覆盖率语句 93.86% / 分支 89.04% / 函数 97.81% / 行 93.86%(V8 分支/行计数会有 ±0.01 波动,门禁按单次真实结果判定),`test:coverage` 与逐文件 domain/book/insight 门禁全过;
|
|
1169
1264
|
- `typecheck`、`lint`、`check:hygiene`、`test:isolated`、`build`、`validate:rulepack`、`check:pack`、`check:artifacts`、`check:install` 全绿;
|
|
1170
1265
|
- `check:host` 在临时 DSH profile 中实测:插件层出现、预设可见、面板未认证 401、认证后 200、headless 真实触发 `novel_init` 工具并落盘、`remove` 后层消失;`check:preset` 从真实 bundle 解析 13 个包;
|
|
1171
1266
|
- `check:crash` 在真实子进程 SIGKILL 后恢复 pending journal:目标项目仍可读,无遗留 pending 事务。
|
|
1267
|
+
- `agnes-2.5-flash` / `agnes-3.0-flash` 在临时项目完成 P1→P8、归档、六种导出、`novel_reopen` 与重新归档;详见 `docs/0.2.1-real-model-evidence.md`。
|
|
1172
1268
|
|
|
1173
1269
|
具体数字会随代码变化;发布前请以重新跑出的结果为准,不要把上面的历史数字当保证。
|
|
1174
1270
|
|
|
@@ -1178,16 +1274,18 @@ tests/ # 单测、集成、falsify、e2e
|
|
|
1178
1274
|
|
|
1179
1275
|
| 文档 | 内容 |
|
|
1180
1276
|
| ---------------------------------------- | --------------------------------------------------------- |
|
|
1181
|
-
| [DESIGN.md](DESIGN.md)
|
|
1182
|
-
| [PLAN.md](PLAN.md)
|
|
1183
|
-
| [docs/0.
|
|
1184
|
-
| [docs/0.1
|
|
1185
|
-
| [docs/0.
|
|
1186
|
-
| [docs/
|
|
1187
|
-
| [docs/
|
|
1188
|
-
| [docs/
|
|
1189
|
-
| [
|
|
1190
|
-
| [
|
|
1277
|
+
| [DESIGN.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/DESIGN.md) | 完整设计书:架构、数据模型、规则、门控、事务、面板、预设 |
|
|
1278
|
+
| [PLAN.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/PLAN.md) | 0.1.0 实施计划(历史) |
|
|
1279
|
+
| [docs/0.2.0-plan.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.0-plan.md) | 0.2.0 整书生命周期:蓝图/大纲/世界观/章卡/观测 |
|
|
1280
|
+
| [docs/0.2.1-plan.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.1-plan.md) | 0.2.1 可信账本、历史、备份、计划分权与质量门禁 |
|
|
1281
|
+
| [docs/0.2.0-real-model-evidence.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.0-real-model-evidence.md) | 真实模型全链路验证回执 |
|
|
1282
|
+
| [docs/0.1.2-plan.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.1.2-plan.md) | 0.1.2 长书可运行性与证据闭环方案(历史) |
|
|
1283
|
+
| [docs/0.1.1-plan.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.1.1-plan.md) | 0.1.1 契约收口与证据加固方案(历史) |
|
|
1284
|
+
| [docs/tools.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/tools.md) | 28 个工具与命令面速查 |
|
|
1285
|
+
| [docs/states.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/states.md) | 状态机、迁移表、轮次与回退 |
|
|
1286
|
+
| [docs/rulepack.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/rulepack.md) | 规则包结构、编译器断言、改词表流程 |
|
|
1287
|
+
| [CHANGELOG.md](CHANGELOG.md) | 版本变更 |
|
|
1288
|
+
| [LICENSE](LICENSE) | MIT |
|
|
1191
1289
|
|
|
1192
1290
|
### 反馈
|
|
1193
1291
|
|
package/briefs/P1.md
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
- 《{{title}}》,类型 {{genre}},平台 {{platform}}。
|
|
8
8
|
- 先调 `novel_state` 读 `characters`、`world`、`locks`、`foreshadows`,确认人物状态与已锁定设定。
|
|
9
9
|
- 再调 `novel_status` 看当前章与阻塞项。
|
|
10
|
+
- 本阶段 brief 的 `context.book_plan` 是书级蓝图、当前卷目标与当前章卡;`context.worldbook` 是世界观设定集中与本章最相关的条目。章卡里的 cast 必须在本阶段 `characters` 中登记,否则 P2 无法把它写进计划。
|
|
10
11
|
|
|
11
12
|
## 产出
|
|
12
13
|
|
package/briefs/P2.md
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
- P1 的世界观计划:`novel_state {"kind":"planWorld","chapter":{{chapter}}}`(对应 `plans/ch{{chapter_pad}}.world.yaml`)。
|
|
8
8
|
- 上一章结尾(`state/handoff.yaml` 的 `last_summary`)。
|
|
9
9
|
- 未回收伏笔:`novel_state foreshadows`。
|
|
10
|
+
- 当前章卡:`novel_state {"kind":"outline"}`(`context.outline_card` 已带入 brief)。只要存在章卡,标题、场景类型、目标字数区间与 cast 就必须一致,否则 PG-13 会拒绝;严格模式还要求章卡必须存在。
|
|
11
|
+
- 世界观相关条目:`context.worldbook`。
|
|
10
12
|
|
|
11
13
|
## 产出
|
|
12
14
|
|
|
@@ -25,6 +27,8 @@
|
|
|
25
27
|
|
|
26
28
|
`cast` 不是出场名单的重复:它告诉 P3 这一章谁在舞台上、各自带着什么目标与信息差。没有 cast 时,引擎会从计划正文与人物台账推断;新计划建议显式给出,避免 120 个角色里裁掉真正上场的人。
|
|
27
29
|
|
|
30
|
+
章卡有 cast 时,P2 的 cast 必须覆盖章卡里的每一个名字;章卡没有 cast 时不强制。
|
|
31
|
+
|
|
28
32
|
## 场景类型纪律
|
|
29
33
|
|
|
30
34
|
- 不许连续三章同型;战斗章不许连排两章。
|