dsh-novel-write-engine 0.2.0 → 0.2.2
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 +55 -1
- package/README.md +145 -75
- package/briefs/P6.md +1 -0
- package/briefs/P8.md +2 -0
- package/lib/client.js +304 -31
- package/lib/index.d.ts +471 -24
- package/lib/index.js +2730 -314
- package/lib/types/client/dto.d.ts +35 -3
- package/lib/types/client/panel.d.ts +1 -1
- package/lib/types/client/viewmodel.d.ts +36 -2
- package/lib/types/constants.d.ts +15 -2
- package/lib/types/types.d.ts +140 -3
- package/package.json +1 -1
- package/presets/novel-write-engine.patch.yml +1 -1
- package/skills/entry.md +12 -4
package/README.md
CHANGED
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
|
|
7
7
|
0.2.0 起,它同时管理**整本书**:书级蓝图 → 卷/章大纲 → 世界观设定集 → 单章 P1–P9 流水线 → 归档回写大纲 → 报告/体检/搜索/面板。大纲可以从 Markdown/YAML/JSON 导入,也可以由模型按章卡结构生成;严格模式下 P2/P3 会按章卡校验标题、场景、字数与 cast。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
0.2.2 把多项目选择从“进程最近一次工具调用”改为**会话级持久绑定**:显式 `project_root` 成功后会记住当前 DSH 会话;同一工作区的 A/B 会话不再串书。面板 v4 增加项目选择器与 choose/missing 状态,`/novel scan` 用于发现项目,`/novel resume` 与面板复制按钮共用同一份续写指令;项目被删除/移动/替换时 fail-closed,不静默换书。
|
|
10
|
+
|
|
11
|
+
> **当前版本:0.2.2** · 中文界面 · MIT
|
|
10
12
|
>
|
|
11
13
|
> **宿主范围**:DSH `>=0.2.1-rc.2 <0.3.0-0`;Node `>=24.9.0`。
|
|
12
14
|
|
|
@@ -49,7 +51,7 @@
|
|
|
49
51
|
```text
|
|
50
52
|
模型 / 用户
|
|
51
53
|
│
|
|
52
|
-
├──
|
|
54
|
+
├── 28 个 novel_* 工具
|
|
53
55
|
├── 5 条 /novel* 命令(含 outline/guide/report/doctor/search 子命令)
|
|
54
56
|
├── 只读侧边栏「网文工坊」
|
|
55
57
|
└── 7 份阶段任务书(briefs)
|
|
@@ -73,7 +75,7 @@
|
|
|
73
75
|
- 不是「装完就自动写完整本书」的生成器;它管流程、门禁和状态,正文仍由模型写。
|
|
74
76
|
- 不是独立 CLI;必须作为 DSH 插件安装到某个 profile 才能使用。
|
|
75
77
|
- 不提供云端同步、账号体系、在线书城或多人协作。
|
|
76
|
-
- 0.2.
|
|
78
|
+
- 0.2.x 仍是中文界面与中文任务书,没有 `locale/`,也不读取系统语言。
|
|
77
79
|
- 不提供云端同步、多人协作、RAG/向量库或富文本编辑器;整书规划与单章流水线都在本地 YAML/Markdown 上完成。
|
|
78
80
|
|
|
79
81
|
---
|
|
@@ -82,10 +84,10 @@
|
|
|
82
84
|
|
|
83
85
|
| 能力 | 说明 |
|
|
84
86
|
| ------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
85
|
-
|
|
|
87
|
+
| 28 个 `novel_*` 工具 | 书级蓝图/大纲/世界观 + 单章流水线 + 报告/体检/搜索/引导/重开/备份恢复 |
|
|
86
88
|
| 5 条 `/novel*` 命令 | 状态、下一步、统计、导出、隐藏操作;`/novel` 内含 outline/guide/report/doctor/search 子命令 |
|
|
87
89
|
| 1 个侧边栏面板「网文工坊」 | 只读;Hero、统计、全书规划、世界观、质量趋势、健康、最近活动、九阶段轨、章节卡、门控区 |
|
|
88
|
-
| 1 个内置 Agent 预设「网文工坊」 |
|
|
90
|
+
| 1 个内置 Agent 预设「网文工坊」 | 28 个工具全开,**不挂载 bash / 文件写入工具**;会话开始后不能切换 |
|
|
89
91
|
| 1 个入口技能 | 告诉模型什么时候该用引擎、哪些写入口是唯一的 |
|
|
90
92
|
| 13 条门控 | 任务书、阶段、字数、格式、摘要、场景类型、大纲对齐、评分、问题清零、阅读证明、一致性、轮次、归档原子性 |
|
|
91
93
|
| 15 维评分 | 满分 150,默认过关线 120;分数必须逐项可核对 |
|
|
@@ -93,9 +95,9 @@
|
|
|
93
95
|
| 规则包外置 | 词表、格式、标点、语义、跨章阈值都在 `rulepacks/default.yaml`,代码只执行 |
|
|
94
96
|
| 六种导出 | Markdown、纯文本、EPUB 3、大纲、世界观、书级提案;正文导出附 `cover.svg` 与 `blurb.txt` |
|
|
95
97
|
| 整书规划层 | 书级蓝图、卷结构、章卡(严格模式)、世界观设定集;支持 Markdown/YAML/JSON 导入 |
|
|
96
|
-
| 可观测性 | `novel_status` 书级摘要、`novel_report`、`novel_doctor`、`novel_search`、panel
|
|
97
|
-
| 多项目注册表 | `stateDir/projects.yaml`
|
|
98
|
-
| 运行期依赖极少 | 只有 `yaml`
|
|
98
|
+
| 可观测性 | `novel_status` 书级摘要、`novel_report`、`novel_doctor`、`novel_search`、panel v4、journal 活动 |
|
|
99
|
+
| 多项目注册表 | `stateDir/projects.yaml` 记录已知项目与面板默认 active;不影响项目目录 |
|
|
100
|
+
| 运行期依赖极少 | 只有 `yaml` 一个运行时依赖;Host 侧不访问外部网络、不调用外部 API、不读环境变量里的密钥 |
|
|
99
101
|
|
|
100
102
|
### 关键设计
|
|
101
103
|
|
|
@@ -171,8 +173,8 @@ P7/P8/P9 在 `novel_archive` 一次事务里完成。单章归档后状态是 `d
|
|
|
171
173
|
| pnpm | CLI 安装/卸载插件需要;建议 11.x(本仓库开发基线为 11.28.9) |
|
|
172
174
|
| 宿主形态 | Web(面板 + 预设)、Desktop(面板 + 预设,插件由桌面壳管理)、headless(只有工具/命令,无面板/预设) |
|
|
173
175
|
| 磁盘 | 项目根目录可写;默认 `stateDir` 可写 |
|
|
174
|
-
| 网络 | 安装时需要访问 npm / Git
|
|
175
|
-
| 语言 | 0.2.
|
|
176
|
+
| 网络 | 安装时需要访问 npm / Git 托管;运行期 Host 侧不访问外部网络,Web 客户端只向宿主面板发同源 GET |
|
|
177
|
+
| 语言 | 0.2.x 仅中文 |
|
|
176
178
|
|
|
177
179
|
检查命令:
|
|
178
180
|
|
|
@@ -276,7 +278,7 @@ dsh plugin --profile web add dsh-novel-write-engine
|
|
|
276
278
|
固定版本:
|
|
277
279
|
|
|
278
280
|
```bash
|
|
279
|
-
dsh plugin --profile web add dsh-novel-write-engine@0.2.
|
|
281
|
+
dsh plugin --profile web add dsh-novel-write-engine@0.2.2
|
|
280
282
|
```
|
|
281
283
|
|
|
282
284
|
`dsh` 不在 PATH 时,用 `npx @deepseek-ai/dsh` 代替命令开头的 `dsh`。
|
|
@@ -331,13 +333,13 @@ corepack pnpm pack
|
|
|
331
333
|
会得到类似:
|
|
332
334
|
|
|
333
335
|
```text
|
|
334
|
-
dsh-novel-write-engine-0.2.
|
|
336
|
+
dsh-novel-write-engine-0.2.2.tgz
|
|
335
337
|
```
|
|
336
338
|
|
|
337
339
|
把这个 tarball 复制到目标机器,放在一个**稳定、不会随手删除**的路径,然后:
|
|
338
340
|
|
|
339
341
|
```bash
|
|
340
|
-
dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.
|
|
342
|
+
dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.2.tgz
|
|
341
343
|
```
|
|
342
344
|
|
|
343
345
|
tarball 安装不会运行源码构建,也不会要求 `allowBuilds`;包内已经包含 `lib/`、`rulepacks/`、`briefs/`、`skills/`、`presets/` 和两层 patch。它是最接近「发布产物」的安装方式。
|
|
@@ -352,9 +354,9 @@ tarball 安装不会运行源码构建,也不会要求 `allowBuilds`;包内
|
|
|
352
354
|
2. 点 **添加插件**(或旁边的箭头 → **安装第三方插件**)。
|
|
353
355
|
3. 在包名字段填入以下任一形式:
|
|
354
356
|
- npm 包名:`dsh-novel-write-engine`
|
|
355
|
-
- 精确版本:`dsh-novel-write-engine@0.2.
|
|
357
|
+
- 精确版本:`dsh-novel-write-engine@0.2.2`
|
|
356
358
|
- 源码目录:`/absolute/path/to/dsh-novel-write-engine`
|
|
357
|
-
- tarball:`/absolute/path/to/dsh-novel-write-engine-0.2.
|
|
359
|
+
- tarball:`/absolute/path/to/dsh-novel-write-engine-0.2.2.tgz`
|
|
358
360
|
4. npm 包名从 npm 官方源安装;本地目录和 tarball 直接使用宿主路径。
|
|
359
361
|
5. 点 **安装**,等待完成。
|
|
360
362
|
6. 如果出现 **立即启用**,点它;否则安装后到「已安装插件」里把 **dsh-novel-write-engine** 打开。
|
|
@@ -404,7 +406,7 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
404
406
|
列出你当前可用的 novel_* 工具。
|
|
405
407
|
```
|
|
406
408
|
|
|
407
|
-
应能看到
|
|
409
|
+
应能看到 28 个(`toolsMode=core` 时只有 10 个,见[第八节](#八使用方式))。
|
|
408
410
|
|
|
409
411
|
---
|
|
410
412
|
|
|
@@ -414,7 +416,7 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
414
416
|
|
|
415
417
|
左侧栏 → 新建会话 → 预设选 **网文工坊**。
|
|
416
418
|
|
|
417
|
-
这个预设的工具是「小说专用」的:有
|
|
419
|
+
这个预设的工具是「小说专用」的:有 28 个 `novel_*` 工具、任务书、网页、待办、子智能体等,但**不挂载 bash / 文件写入工具**。正文只能经引擎写。
|
|
418
420
|
|
|
419
421
|
### 2. 直接说人话
|
|
420
422
|
|
|
@@ -426,7 +428,7 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
426
428
|
先做全书蓝图、第一卷大纲和世界观设定,再写第一章的世界观约束和章节计划。
|
|
427
429
|
```
|
|
428
430
|
|
|
429
|
-
模型会调用 `novel_init` 建项目,然后按 `novel_guide` 的提示做书级规划;也可以跳过蓝图直接写第一章,严格大纲是可选开关。0.2.
|
|
431
|
+
模型会调用 `novel_init` 建项目,然后按 `novel_guide` 的提示做书级规划;也可以跳过蓝图直接写第一章,严格大纲是可选开关。0.2.2 推荐顺序:
|
|
430
432
|
|
|
431
433
|
```text
|
|
432
434
|
novel_init
|
|
@@ -457,7 +459,7 @@ novel_init
|
|
|
457
459
|
|
|
458
460
|
`premise`、`logline`、`themes`、`tone`、`pov`、`audience`、`selling_points`、`ending` 与 `strict_outline` 都是可选的书级种子;不填也能开书,之后用 `novel_blueprint` 补。
|
|
459
461
|
|
|
460
|
-
`genre` 必须是 12 类之一,`platform` 必须是 `fanqie` / `qidian` / `qimao` / `jinjiang`
|
|
462
|
+
`genre` 必须是 12 类之一,`platform` 必须是 `fanqie` / `qidian` / `qimao` / `jinjiang` 之一。对 `novel_init`,省略 `project_root` 时只使用配置 `projectRoot`,**不读会话绑定、工作区或 active**;创建成功后才绑定当前会话。其他工具省略 `project_root` 时按 0.2.2 的四层顺序解析:**当前 DSH 会话绑定 → 会话 cwd 中唯一项目 → 唯一注册项目/配置 `projectRoot`**;有多个项目且无法唯一确定时返回 `ENGINE_PROJECT_AMBIGUOUS`,需要 `/novel use` 或显式 `project_root`。`active` 只影响面板默认,不再静默决定 Agent 的工具项目。
|
|
461
463
|
|
|
462
464
|
### 4. 一章的标准调用顺序
|
|
463
465
|
|
|
@@ -497,9 +499,9 @@ novel_init
|
|
|
497
499
|
|
|
498
500
|
- Hero:书名、类型、平台、当前章、阶段;
|
|
499
501
|
- 统计:已归档章节、总字数、平均分、待处理门控;
|
|
500
|
-
-
|
|
502
|
+
- 全书规划:蓝图/严格模式、章卡进度、**全部卷**(滚动列表)、世界观计数、质量趋势、健康度;
|
|
501
503
|
- 九阶段轨;
|
|
502
|
-
-
|
|
504
|
+
- 下一步卡与“复制续写指令”;
|
|
503
505
|
- 章节卡、门控区与最近活动。
|
|
504
506
|
|
|
505
507
|
面板每 15 秒静默同步一次,也可以点刷新;它**只读**,所有写操作仍在对话/工具里。
|
|
@@ -512,35 +514,35 @@ novel_init
|
|
|
512
514
|
|
|
513
515
|
| 形态 | 怎么进 | 工具 | 写文件能力 | 面板/预设 |
|
|
514
516
|
| -------------------- | ------------------------------ | --------------------- | ----------------------------------- | ------------------ |
|
|
515
|
-
| 内置预设「网文工坊」 | 新会话选预设 |
|
|
516
|
-
| 普通会话 | 任意标准会话 |
|
|
517
|
-
| headless / 自动化 | `dsh --profile headless "..."` |
|
|
517
|
+
| 内置预设「网文工坊」 | 新会话选预设 | 28 个全开 | 不挂 bash/fs 写入工具,正文只经引擎 | 有 |
|
|
518
|
+
| 普通会话 | 任意标准会话 | 28 个工具在根层注册 | 可能还有 bash/fs;引擎保证会被绕过 | 有面板,无专用预设 |
|
|
519
|
+
| headless / 自动化 | `dsh --profile headless "..."` | 28 个(或 core 10 个) | 取决于该 profile | 无面板、无预设 |
|
|
518
520
|
|
|
519
521
|
**要用「引擎保证」就用「网文工坊」预设。** 普通会话里,模型仍然可以用文件工具直接改 `state/` 或正文;那时你得到的是「引擎工具 + 人工操作」的混合状态,事务、门控、审计都不再完整。
|
|
520
522
|
|
|
521
523
|
预设是会话类型,**会话开始后不能切换**。要换形态就新开一个会话。
|
|
522
524
|
|
|
523
|
-
### 8.2
|
|
525
|
+
### 8.2 28 个工具
|
|
524
526
|
|
|
525
527
|
| 工具 | 阶段 | 做什么 | 写盘 |
|
|
526
528
|
| -------------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- |
|
|
527
529
|
| `novel_init` | — | 建项目:`novel.yaml` + `state/` + `outline/` + 目录 | 是 |
|
|
528
|
-
| `novel_status` | 任意 | 当前活跃章、阶段、轮次、阻塞项、`state_errors`、下一步;`chapter` 只用于字数查询 |
|
|
530
|
+
| `novel_status` | 任意 | 当前活跃章、阶段、轮次、阻塞项、`state_errors`、下一步;`chapter` 只用于字数查询 | 项目正文否;显式 root 写绑定 |
|
|
529
531
|
| `novel_brief` | P1–P6 / P8 | 领取当前活跃章的任务书,返回 `fields`、`context`;`context.world_plan` 与 `context.context_meta` 在 `context` 内,并记录 digest | 仅任务书签收 |
|
|
530
532
|
| `novel_plan_world` | P1 | 提交世界观约束;数组/对象形状在服务边界校验 | 是 |
|
|
531
533
|
| `novel_plan_chapter` | P2 | 提交章节计划;标题长度读 rulepack、5–8 个节拍、opening/ending 非空;可选 `cast` 1–8 人 | 是 |
|
|
532
534
|
| `novel_write_draft` | P3 | 提交初稿;格式/字数/摘要不过整体拒绝 | 是 |
|
|
533
535
|
| `novel_review` | P4 | 十五维评分、问题清单、三段阅读证明;issue 维度/段落和 blocker waived 会被拒绝 | 是 |
|
|
534
|
-
| `novel_revise` | P5/P6 |
|
|
535
|
-
| `novel_check` | P6 | 机检 + 五个语义一致性项;`
|
|
536
|
+
| `novel_revise` | P5/P6 | 提交修订;支持整章 `content` 或 `patch:{expected_hash,edits}`;blocker 必须有正文证据,不能降级或 waived | 是 |
|
|
537
|
+
| `novel_check` | P6 | 机检 + 五个语义一致性项;`advisories` 与 blocker 分开,可用 `acknowledge` 记录知悉;单 scope 不推进归档 | 是 |
|
|
536
538
|
| `novel_archive` | P7–P9 | 事务归档;必须带 `state_delta`;旧 review 无 digest 时拒绝 | 事务 |
|
|
537
539
|
| `novel_word_count` | 任意 | 按引擎唯一口径数字数 | 否 |
|
|
538
|
-
| `novel_state` | 任意 | 读账本、计划、评审、检查、handoff、outline/worldbook
|
|
540
|
+
| `novel_state` | 任意 | 读账本、计划、评审、检查、handoff、outline/worldbook、history/backups/briefs;chapters 默认紧凑,支持 `include_summary`/`chapter_range`;损坏 ledger 返回 raw | 否 |
|
|
539
541
|
| `novel_amend` | 任意 | 带原因修订 `novel.yaml`、八个 ledger 或 outline/worldbook,带不变量与单目标 repair | 是,入 journal |
|
|
540
542
|
| `novel_rollback` | 任意 | 只退回当前阶段或更早,保留正文供参考 | 是 |
|
|
541
543
|
| `novel_diff` | 任意 | 与上次归档备份或两段文本比较 | 否 |
|
|
542
544
|
| `novel_export` | 任意 | 导出 `md` / `txt` / `epub` / `outline` / `worldbook` / `proposal` | 导出目录 |
|
|
543
|
-
| `novel_audit` | 任意 | 读追加式 journal
|
|
545
|
+
| `novel_audit` | 任意 | 读追加式 journal 审计记录,含被拒 attempt;支持 chapter/op/status/since/until/cursor | 否 |
|
|
544
546
|
| `novel_pipeline` | 任意 | 「下一步该做什么」的建议 | 否 |
|
|
545
547
|
| `novel_blueprint` | 任意 | 写书级蓝图:梗概、主题、基调、视角、读者、卖点、结局、卷结构 | 是 |
|
|
546
548
|
| `novel_outline` | 任意 | 写卷/章卡;严格模式、归档卡保护、归档章自动回填 | 是 |
|
|
@@ -551,6 +553,7 @@ novel_init
|
|
|
551
553
|
| `novel_report` | 任意 | 全书报告:进度、大纲、世界观、质量、节奏、角色、伏笔、时间线、关系、活动 | 否 |
|
|
552
554
|
| `novel_guide` | 任意 | 上手引导:当前状态、已完成步骤、下一步工具、命令与提示;无项目也能用 | 否 |
|
|
553
555
|
| `novel_reopen` | 已归档章 | 从归档备份把紧邻的上一章重开到 P3;必须带非空 `reason`,活动章未开始、备份存在时才允许 | 是 |
|
|
556
|
+
| `novel_restore` | 活动章 | 从带 manifest 的 txid 备份恢复正文/计划/评审/校验;已归档章拒绝,先 `novel_reopen` | 是 |
|
|
554
557
|
|
|
555
558
|
工具失败时统一返回:
|
|
556
559
|
|
|
@@ -587,6 +590,12 @@ novel_init
|
|
|
587
590
|
/novel doctor
|
|
588
591
|
/novel search <关键词>
|
|
589
592
|
/novel export md|txt|epub|outline|worldbook|proposal
|
|
593
|
+
/novel projects
|
|
594
|
+
/novel current
|
|
595
|
+
/novel use <path|title|.>
|
|
596
|
+
/novel unbind
|
|
597
|
+
/novel scan [--register]
|
|
598
|
+
/novel resume
|
|
590
599
|
/novel admin
|
|
591
600
|
/novel admin novel_state {"kind":"pipeline"}
|
|
592
601
|
```
|
|
@@ -598,7 +607,7 @@ novel_init, novel_status, novel_guide, novel_brief, novel_outline,
|
|
|
598
607
|
novel_write_draft, novel_review, novel_revise, novel_check, novel_archive
|
|
599
608
|
```
|
|
600
609
|
|
|
601
|
-
其余
|
|
610
|
+
其余 18 个非 core 工具不消失,改走命令;`/novel admin` 可显式调用非 core 操作(core 里只有 `novel_outline` / `novel_guide` 也在 admin 表中):
|
|
602
611
|
|
|
603
612
|
```text
|
|
604
613
|
/novel admin novel_plan_world {...}
|
|
@@ -612,17 +621,16 @@ novel_write_draft, novel_review, novel_revise, novel_check, novel_archive
|
|
|
612
621
|
/novel admin novel_audit {"limit":20}
|
|
613
622
|
/novel admin novel_pipeline
|
|
614
623
|
/novel admin novel_blueprint {...}
|
|
615
|
-
/novel admin novel_outline {...}
|
|
616
624
|
/novel admin novel_outline_import {...}
|
|
617
625
|
/novel admin novel_worldbook {...}
|
|
618
626
|
/novel admin novel_search {"query":"..."}
|
|
619
627
|
/novel admin novel_doctor
|
|
620
628
|
/novel admin novel_report
|
|
621
|
-
/novel admin novel_guide
|
|
622
629
|
/novel admin novel_reopen {"chapter":2,"reason":"..."}
|
|
630
|
+
/novel admin novel_restore {"txid":"..."}
|
|
623
631
|
```
|
|
624
632
|
|
|
625
|
-
|
|
633
|
+
多项目注册表与设定包导入**不走工具 schema**;日常发现/切换用 `/novel scan`、`/novel use`,底层登记仍可用:
|
|
626
634
|
|
|
627
635
|
```text
|
|
628
636
|
/novel admin novel_registry_list
|
|
@@ -637,13 +645,15 @@ novel_write_draft, novel_review, novel_revise, novel_check, novel_archive
|
|
|
637
645
|
|
|
638
646
|
### 8.4 侧边栏「网文工坊」
|
|
639
647
|
|
|
640
|
-
- 只读 HTTP 路由:`GET/HEAD /api/novel-write-engine/panel
|
|
648
|
+
- 只读 HTTP 路由:`GET/HEAD /api/novel-write-engine/panel?root=<可选>`;
|
|
641
649
|
- 精确路由,复用 connection 的认证/Origin 闸门;未认证返回 401/403,连接层缺席返回 503;
|
|
642
650
|
- 返回 `schemaVersion`;版本不一致时面板提示刷新;
|
|
643
|
-
- 状态:loading(骨架)、empty(显示 `novel_init`)、error(重试)、outdated(刷新)、ready;
|
|
644
|
-
-
|
|
645
|
-
-
|
|
646
|
-
-
|
|
651
|
+
- 状态:loading(骨架)、choose(多项目先选)、missing(项目不在)、empty(显示 `novel_init`)、error(重试)、outdated(刷新)、ready;
|
|
652
|
+
- 顶部项目选择器(`aria-label="切换项目"`);选择只影响面板 GET 的 `?root=`,写入浏览器 `localStorage`,**不调用 activate、不写会话绑定**;
|
|
653
|
+
- 只接受注册表、active 或配置 `projectRoot` 的路径;未登记路径返回 `missing.reason="not_registered"`,不读取任意目录;
|
|
654
|
+
- 章节超过 30 章时只渲染最近 30 张,并显示总记录数;卷列表展示全部卷,长列表在滚动容器内;
|
|
655
|
+
- 下一步卡提供“复制续写指令”,文本与 `/novel resume` 同源,只写浏览器剪贴板;
|
|
656
|
+
- 窄屏纵向堆叠,支持减少动态效果。
|
|
647
657
|
|
|
648
658
|
面板不是第二个写入口。它没有改名、归档、回退按钮。
|
|
649
659
|
|
|
@@ -688,13 +698,33 @@ exports/
|
|
|
688
698
|
- EPUB:EPUB 3,自写 ZIP 容器,`mimetype` 首条且 store 方式;
|
|
689
699
|
- 封面是纯 SVG 字符串,不依赖 canvas;平台简介由模板生成,不调用模型。
|
|
690
700
|
|
|
691
|
-
### 8.6
|
|
701
|
+
### 8.6 多项目与会话绑定
|
|
702
|
+
|
|
703
|
+
四层选择模型:
|
|
692
704
|
|
|
693
|
-
|
|
694
|
-
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
705
|
+
1. 显式 `project_root`(成功后写入当前会话绑定);
|
|
706
|
+
2. `stateDir/session-bindings.yaml` 中当前 DSH `SessionId` 的绑定;
|
|
707
|
+
3. 会话 cwd 的有限工作区发现(`cwd`、`cwd/novel`、唯一直接子目录;多候选报歧义);
|
|
708
|
+
4. 唯一注册项目或配置 `projectRoot`;有多个项目时不猜 `active`。
|
|
709
|
+
|
|
710
|
+
```text
|
|
711
|
+
/novel projects 列出项目;* 当前会话,P 面板默认,! 目录缺失/待修复
|
|
712
|
+
/novel current 当前绑定或推导来源
|
|
713
|
+
/novel use /abs/book 切换当前会话;active 不变
|
|
714
|
+
/novel use . 按当前 cwd 的工作区规则选唯一项目
|
|
715
|
+
/novel use 书名 按注册表精确标题切换;重名要求用路径
|
|
716
|
+
/novel unbind 只清当前会话绑定,不删项目
|
|
717
|
+
/novel scan 只读扫描当前工作区候选
|
|
718
|
+
/novel scan --register 只登记健康项目;不改 active、不绑会话
|
|
719
|
+
/novel resume 输出可粘贴的续写指令;只读
|
|
720
|
+
```
|
|
721
|
+
|
|
722
|
+
- `projects.yaml` 仍是 v1,新增可选 `created_at`;`session-bindings.yaml` 只保存会话选择,删掉不会删书;
|
|
723
|
+
- `/novel use` 成功绑定后会 best-effort 把项目加入注册表,便于随后在 `/novel projects` 与面板看到;不改变 active。`novel.yaml` 损坏时不绑定、不登记,先用显式 `project_root` 修复;
|
|
724
|
+
- 无显式 `project_root` 时,注册/绑定文件损坏 fail-closed,不静默重建;显式 `project_root` 的读取仍可用(损坏的绑定不会被更新),写事务提交后元数据失败只回 warning;
|
|
725
|
+
- 项目目录被删除时保留登记与绑定,返回 `ENGINE_PROJECT_MISSING`,不自动回退、不自动重建;
|
|
726
|
+
- 原路径被另一本书占用时返回 `ENGINE_PROJECT_IDENTITY_MISMATCH`,必须显式重新 `/novel use`;
|
|
727
|
+
- `/novel admin novel_registry_activate` 只改面板默认,不切换当前会话;`forget` 不删绑定与项目。
|
|
698
728
|
|
|
699
729
|
### 8.7 整书规划、观测与修复
|
|
700
730
|
|
|
@@ -733,12 +763,12 @@ novel_reopen {chapter:3, reason:"结尾需要重写"}
|
|
|
733
763
|
|
|
734
764
|
| 键 | 默认 | 说明 |
|
|
735
765
|
| ----------------- | -------------------------------- | ------------------------------------------------------------------------- |
|
|
736
|
-
| `projectRoot` | `./novel` |
|
|
766
|
+
| `projectRoot` | `./novel` | 无会话绑定/工作区/唯一项目时的兜底根;相对路径相对于 DSH 进程工作目录 |
|
|
737
767
|
| `minScore` | `120` | PG-07 过关线,整数 0..150;唯一 owner |
|
|
738
|
-
| `toolsMode` | `all` | `all` 注册
|
|
768
|
+
| `toolsMode` | `all` | `all` 注册 28 个工具;`core` 只注册 10 个,其余走 `/novel admin` |
|
|
739
769
|
| `briefsOverrides` | 空 | 自定义任务书目录;某阶段文件缺失时回退包内 `briefs/<阶段>.md` |
|
|
740
770
|
| `backupRetention` | `5` | 保留的归档备份目录数;只清理引擎自己创建的 `backups/<txid>` |
|
|
741
|
-
| `stateDir` | 空 → `~/.dsh/novel-write-engine` |
|
|
771
|
+
| `stateDir` | 空 → `~/.dsh/novel-write-engine` | 多项目注册表与会话绑定位置;**不要放进项目目录** |
|
|
742
772
|
|
|
743
773
|
> `stateDir` 的默认值是代码按当前用户 home 拼出的 `~/.dsh/novel-write-engine`,不跟随 `DSH_HOME`。如果你改了 `DSH_HOME`,建议显式把它设成绝对路径。
|
|
744
774
|
>
|
|
@@ -811,7 +841,7 @@ P8.md
|
|
|
811
841
|
|
|
812
842
|
### 9.4 规则包不能运行期切换
|
|
813
843
|
|
|
814
|
-
`rulepacks/default.yaml` 是随包加载的:词表、格式、标点、语义、跨章阈值、平台默认值都在里面。0.2.
|
|
844
|
+
`rulepacks/default.yaml` 是随包加载的:词表、格式、标点、语义、跨章阈值、平台默认值都在里面。0.2.x **不接受**运行期外部规则包路径。
|
|
815
845
|
|
|
816
846
|
要改规则,只有两条路:
|
|
817
847
|
|
|
@@ -874,13 +904,13 @@ corepack pnpm test
|
|
|
874
904
|
~/.dsh/novel-write-engine/projects.yaml
|
|
875
905
|
```
|
|
876
906
|
|
|
877
|
-
|
|
907
|
+
`projects.yaml` 只记录项目路径、标题、可选 `created_at` 与 `active`;`session-bindings.yaml` 按 DSH `SessionId` 记录显式选择。两者都**不保存正文**,删掉不会删任何书。面板用 projects/active/配置找默认项目,不读会话绑定。
|
|
878
908
|
|
|
879
909
|
### 10.3 手工修改的边界
|
|
880
910
|
|
|
881
911
|
- 正文可以读,但不建议手改;正文一改,评审分数、check、content hash 都会失效。
|
|
882
912
|
- `state/` 不要手改;要改就用 `novel_amend`,它要求 `reason` 并写入 journal。
|
|
883
|
-
- 要回退阶段用 `novel_rollback
|
|
913
|
+
- 要回退阶段用 `novel_rollback`;它只允许退回当前阶段或更早,会保留正文为参考,清空轮次;任务书收据留在 state/briefs.yaml,digest 仍匹配时可复用。
|
|
884
914
|
- 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。
|
|
885
915
|
- 不要在引擎运行时删 `.engine.lock`;锁由引擎回收,手删可能让两个写者同时进入。
|
|
886
916
|
|
|
@@ -895,7 +925,37 @@ corepack pnpm test
|
|
|
895
925
|
|
|
896
926
|
## 十一、升级
|
|
897
927
|
|
|
898
|
-
### 11.0 从 0.1
|
|
928
|
+
### 11.0 从 0.2.1 升级到 0.2.2
|
|
929
|
+
|
|
930
|
+
0.2.2 不迁移项目数据,但改变多项目选择与面板契约:
|
|
931
|
+
|
|
932
|
+
1. **面板 payload v4**:旧标签页显示刷新;刷新后出现项目选择器、choose/missing 状态和复制续写按钮。
|
|
933
|
+
2. **`lastRoot` 删除**:工具不再跟随进程内“最近碰过谁”。A/B 会话分别绑定、重启后仍在;显式 `project_root` 成功后写入 `session-bindings.yaml`。
|
|
934
|
+
3. **`active` 降级**:只影响面板默认与无 Agent 调用;有 Agent 且多项目无上下文时返回歧义,不静默选 active。
|
|
935
|
+
4. **`novel_init` 省略 root**:只使用配置 `projectRoot`,不读会话绑定/工作区/active;创建成功后才绑定当前会话。
|
|
936
|
+
5. **项目删除/移动/替换 fail-closed**:返回 MISSING/IDENTITY_MISMATCH,不自动回退、不自动重建、不清登记与绑定。
|
|
937
|
+
6. **新增命令**:`/novel projects|current|use|unbind|scan|resume`;`scan`/`resume` 不是新工具,工具仍 28、操作仍 32。
|
|
938
|
+
7. **面板完整卷**:0.2.1 只显示前 8 卷的 UI 截断已修复;全部卷在滚动容器中展示。
|
|
939
|
+
|
|
940
|
+
回滚到 0.2.1 时,`session-bindings.yaml` 被旧版忽略;旧版恢复 `lastRoot` 行为。注册表新增的 `created_at` 对旧版可忽略。
|
|
941
|
+
|
|
942
|
+
### 11.0.1 从 0.2.0 升级到 0.2.1
|
|
943
|
+
|
|
944
|
+
0.2.1 不迁移项目数据,但改变几处契约:
|
|
945
|
+
|
|
946
|
+
1. **面板 payload v3**:旧标签页会显示刷新提示;刷新即可。面板根容器现在自己是滚动区,长内容不再被裁掉。
|
|
947
|
+
2. **P2 计划不可变**:`plans/chNNN.chapter.yaml` 不再写 `summary`;旧项目仍回退读它。新摘要/标题/场景/叙述者进入 `state/pipeline.yaml` 的 `draft`,`novel_write_draft`/`novel_revise` 后以它为准。
|
|
948
|
+
3. **评分与证据历史**:评审/校验/正文/废弃稿按 revision 写入 `history/`;`novel_report` 的维度样本会变多,`ChapterRecord` 保存 lifetime rounds(含 rollbacks)/final_check/archived_at,这是历史证据而不是统计错误。amend 不能改写这些字段。
|
|
949
|
+
4. **审计更完整**:通过参数形状校验、进入项目锁后被 gate/delta/state 拒绝的调用会出现在 `novel_audit`,状态为 `aborted`、`attempt:true` 并带 code;事务失败/崩溃恢复的 aborted 行也带 code;锁前纯参数错误不写 journal。
|
|
950
|
+
5. **检查文档分层**:advisory 进入 `machine.advisories`,不再混入 `violations`;用 `acknowledge` 记录知悉,blocker 不能 acknowledge。数字矛盾固定 advisory,数字事实只匹配相邻的“别名+数字+单位”。
|
|
951
|
+
6. **新工具 `novel_restore`**:从 `novel_state {kind:"backups"}` 列出的 txid 恢复活动章的正文/计划/世界观计划/评审/校验;P2/P4/P6 在第二次提交起会留下 pre-image。恢复本身再建备份且不 replay;已归档章先 `novel_reopen`。
|
|
952
|
+
7. **修订可 patch**:`novel_revise` 可传 `patch:{expected_hash,edits}` 代替整章;hash 不匹配、锚点不唯一或编辑重叠都会拒绝。
|
|
953
|
+
8. **字数有分解**:`total_word_count` 仍含标点;新字段 `punctuation_chars` 与 PG-03 分解让口径可见。
|
|
954
|
+
9. **大纲覆盖率改口径**:规划覆盖 = 章卡数 / 目标章数,归档覆盖 = 归档卡数 / 目标章数;`card_coverage` 是逐章“有 archived 卡”的比例;缺卡数单独输出。
|
|
955
|
+
10. **worldbook facts**:新增声明式数字事实,进入计数、brief 上下文、搜索与 P6 检查;`facts` 只做作者声明的 canon 对账,不等同外部史实库。
|
|
956
|
+
11. **伏笔 anchor**:可读 `title` 与逐字 `anchor` 分离,anchor 至少 8 个字符;单字子串不再能绕过校验。
|
|
957
|
+
|
|
958
|
+
### 11.0.2 从 0.1.3 升级到 0.2.0
|
|
899
959
|
|
|
900
960
|
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` 即可。
|
|
901
961
|
|
|
@@ -909,7 +969,7 @@ corepack pnpm test
|
|
|
909
969
|
6. **handoff 派生**:归档不再每章重算 `ceil(chapter/20)`;volume/volume_name 继承上一章,act/act_progress 从上一章推进,`handoff.act`/`act_progress` 可覆盖。
|
|
910
970
|
7. **panel 上限 30 行**:长书面板只送最近 30 章,统计仍用全书总数。
|
|
911
971
|
|
|
912
|
-
### 11.0.
|
|
972
|
+
### 11.0.2 从 0.1.1 升级到 0.1.2
|
|
913
973
|
|
|
914
974
|
0.1.2 不 bump schema,也不改工具名/参数;但它会主动让三类旧状态暴露出来:
|
|
915
975
|
|
|
@@ -935,7 +995,7 @@ dsh plugin --profile web add dsh-novel-write-engine@latest
|
|
|
935
995
|
也可以固定版本:
|
|
936
996
|
|
|
937
997
|
```bash
|
|
938
|
-
dsh plugin --profile web add dsh-novel-write-engine@0.2.
|
|
998
|
+
dsh plugin --profile web add dsh-novel-write-engine@0.2.2
|
|
939
999
|
```
|
|
940
1000
|
|
|
941
1001
|
升级后核对:
|
|
@@ -977,7 +1037,7 @@ corepack pnpm pack
|
|
|
977
1037
|
|
|
978
1038
|
```bash
|
|
979
1039
|
dsh plugin --profile web remove dsh-novel-write-engine
|
|
980
|
-
dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.
|
|
1040
|
+
dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.2.tgz
|
|
981
1041
|
```
|
|
982
1042
|
|
|
983
1043
|
### 11.5 在 Web / Desktop 里升级
|
|
@@ -1065,7 +1125,7 @@ dsh plugin --profile web remove dsh-novel-write-engine
|
|
|
1065
1125
|
卸载插件不会删书。确认不再需要后,再手动清理:
|
|
1066
1126
|
|
|
1067
1127
|
```bash
|
|
1068
|
-
#
|
|
1128
|
+
# 多项目注册表与会话绑定(只影响选择/查看,不影响书)
|
|
1069
1129
|
rm -rf "$HOME/.dsh/novel-write-engine"
|
|
1070
1130
|
|
|
1071
1131
|
# 某个项目(先确认路径!)
|
|
@@ -1107,8 +1167,11 @@ dsh --profile web --dump-config | grep dsh-novel-write-engine
|
|
|
1107
1167
|
| 会话里没有 `novel_*` 工具 | 插件未启用、旧会话未刷新、装错 profile | 新开会话;重启;`--dump-config` 核对 |
|
|
1108
1168
|
| `ENGINE_STAGE_ORDER` | 跳过了阶段或顺序不对 | `/novel` / `novel_status` 看下一步;按 `novel_brief` 领任务书 |
|
|
1109
1169
|
| `ENGINE_GATE_BLOCKED` | 门控未过 | 看 `blocking` 的 code/detail/hint;改正文或补证据;不要手改 state |
|
|
1110
|
-
| `ENGINE_PROJECT_NOT_FOUND` | 项目根不对/未初始化 | `novel_init`,或传正确的 `project_root`
|
|
1111
|
-
|
|
|
1170
|
+
| `ENGINE_PROJECT_NOT_FOUND` | 项目根不对/未初始化 | `/novel scan` 发现项目;`novel_init`,或传正确的 `project_root` |
|
|
1171
|
+
| `ENGINE_PROJECT_AMBIGUOUS` | 有多个项目,无法从会话/cwd 唯一确定 | `/novel use <path|title>` 或传 `project_root`;不会默认 active |
|
|
1172
|
+
| `ENGINE_PROJECT_MISSING` | 当前会话绑定的目录被删除/未挂载 | 恢复目录后重试;或显式 `/novel use <新路径>`;不会自动换书 |
|
|
1173
|
+
| `ENGINE_PROJECT_IDENTITY_MISMATCH`| 原路径已被另一本书占用,`created_at` 不同 | 确认后用 `/novel use` 重新绑定;旧绑定仍 fail-closed |
|
|
1174
|
+
| 面板空白/显示没有项目 | 当前没有项目,或 active 指向旧路径 | 先 `novel_init`;多项目时用面板选择器或 `/novel use` 选择 |
|
|
1112
1175
|
| 面板显示「需要刷新」 | 浏览器缓存了旧 client bundle | 刷新页面;重启 DSH |
|
|
1113
1176
|
| 升级后仍是旧行为 | 源码目录没 `corepack pnpm build`,或旧会话未换 | 重新构建;重启;新开会话 |
|
|
1114
1177
|
| 卸载后配置项还在 | profile 的 `cordis.patch.yml` 还留着覆盖 | 删除 `id: novel-write-engine` 的段落 |
|
|
@@ -1131,13 +1194,13 @@ dsh --profile web --dump-config | grep dsh-novel-write-engine
|
|
|
1131
1194
|
|
|
1132
1195
|
DSH bundle 的 Host 半边在 DSH 进程内执行,不受工作区沙箱限制。安装本插件等于允许它在 DSH 进程权限下读写你给它的项目目录和 `stateDir`。只从你信任的 npm 包、源码或 tarball 安装。
|
|
1133
1196
|
|
|
1134
|
-
### 14.2
|
|
1197
|
+
### 14.2 它不向外联网
|
|
1135
1198
|
|
|
1136
|
-
|
|
1199
|
+
Host 侧没有 `fetch`、HTTP 客户端或遥测;运行期依赖只有 `yaml`。它不读取环境变量里的 API Key,也不会把正文发到任何第三方服务。Web 客户端只会向宿主自己的只读面板路由发同源 `GET`,不访问外部地址;模型调用本身由 DSH 负责,与本插件无关。
|
|
1137
1200
|
|
|
1138
1201
|
### 14.3 面板是只读的
|
|
1139
1202
|
|
|
1140
|
-
`/api/novel-write-engine/panel` 只接受 `GET`/`HEAD`,并复用 DSH connection 的认证与 Origin
|
|
1203
|
+
`/api/novel-write-engine/panel` 只接受 `GET`/`HEAD`,并复用 DSH connection 的认证与 Origin 校验。项目选择器只改 `?root=` 与浏览器 `localStorage`,复制按钮只写剪贴板;它们不能改项目、注册表或会话绑定。所有写操作仍然要经过工具/命令。
|
|
1141
1204
|
|
|
1142
1205
|
### 14.4 状态文件不是「随便改的 YAML」
|
|
1143
1206
|
|
|
@@ -1158,12 +1221,13 @@ DSH bundle 的 Host 半边在 DSH 进程内执行,不受工作区沙箱限制
|
|
|
1158
1221
|
## 十五、已知限制
|
|
1159
1222
|
|
|
1160
1223
|
- **书级大纲是 0.2.0 的新数据源**:`outline/outline.yaml` 与 `outline/worldbook.yaml` 由引擎读写;有章卡时 P2/P3 受 PG-13 约束,严格模式还要求章卡存在。大纲是规划层,不替代 `state/` 台账。
|
|
1161
|
-
- **0.2.
|
|
1224
|
+
- **0.2.x 只有中文**:面板、命令、错误、任务书都是中文;没有 `locale/`,不跟随系统语言。
|
|
1162
1225
|
- **通过 npm 分发**:安装与升级统一使用 `dsh plugin add`;源码目录和 tarball 用于开发或离线环境。
|
|
1163
|
-
- **面板与预设只在 Web/Desktop**:headless / acp / sdk 没有 `agentPresets` 服务,也没有浏览器面板;
|
|
1226
|
+
- **面板与预设只在 Web/Desktop**:headless / acp / sdk 没有 `agentPresets` 服务,也没有浏览器面板;28 个工具仍可用。
|
|
1164
1227
|
- **规则包不可运行期替换**:要改词表/阈值,必须改源码、重新构建、重新安装。
|
|
1165
1228
|
- **普通会话可能绕过引擎**:只有「网文工坊」预设不挂 bash/fs 写工具;在普通会话里手动改文件,事务与门控保证不再完整。
|
|
1166
1229
|
- **预设会话开始后不能切换**。
|
|
1230
|
+
- **同一物理项目请固定一个路径**:注册表按规范化路径(`path.resolve`)去重;同一本书通过符号链接和真实路径分别登记会变成两个 root,可能显示两行或报歧义。请在 `/novel use`/`project_root` 中固定使用其中一个路径。
|
|
1167
1231
|
- **单章轮次上限 3**:超过需要 `novel_rollback`,不是无限重试。
|
|
1168
1232
|
- **面板只读**:没有在面板里直接改正文/归档的按钮。
|
|
1169
1233
|
- **DSH 仍是 developer preview**:`0.3.0` 之前可能有破坏性变更;升级 DSH 前先看插件 `engines.dsh`。
|
|
@@ -1205,19 +1269,19 @@ DSH_BUNDLE_ROOT=/path/to/deepseek-harness/packages/bundle/web-app corepack pnpm
|
|
|
1205
1269
|
|
|
1206
1270
|
`check:preset` 不伪造 bundle root;没有宿主 checkout 时它不会假装通过。
|
|
1207
1271
|
|
|
1208
|
-
`check:host` 使用临时 `DSH_HOME` 与临时 profile:`build → npm pack → dsh plugin add → --dump-config → 启动 Web → 面板 401/200 → 卸载 → 确认层消失`,并断言宿主声明全部
|
|
1272
|
+
`check:host` 使用临时 `DSH_HOME` 与临时 profile:`build → npm pack → dsh plugin add → --dump-config → 启动 Web → 面板 401/200 → 卸载 → 确认层消失`,并断言宿主声明全部 28 个工具。它需要 PATH 里有 `dsh`(或设置 `DSH_BIN`),不会碰你的真实 profile;没有 DSH 时以退出码 2 明确失败,不伪造通过。
|
|
1209
1273
|
|
|
1210
1274
|
### 16.3 发布前手动验证
|
|
1211
1275
|
|
|
1212
1276
|
1. `corepack pnpm build && corepack pnpm pack`;
|
|
1213
1277
|
2. 在临时 DSH home 里 `dsh plugin --profile web add <tarball>`;
|
|
1214
1278
|
3. `--dump-config` 确认插件层;
|
|
1215
|
-
4. 启动 Web,确认面板、预设、
|
|
1279
|
+
4. 启动 Web,确认面板、预设、28 个工具、`/novel`;
|
|
1216
1280
|
5. 跑一遍 `novel_init → P1 → … → archive → export`;
|
|
1217
1281
|
6. `dsh plugin remove`,确认层与面板消失;
|
|
1218
1282
|
7. 确认项目数据未被卸载动作删除。
|
|
1219
1283
|
|
|
1220
|
-
`pnpm check:host` 覆盖第 1–4 与第 6 步的自动断言(含
|
|
1284
|
+
`pnpm check:host` 覆盖第 1–4 与第 6 步的自动断言(含 28 个工具的宿主声明、面板 v4 字段与空态结构)。`/novel` 命令的 handler 与路由由 `tests/adapters`、`tests/smoke` 的假宿主覆盖,真实宿主命令路由仍属于第 4 步的人工确认;第 5 步也是人工全流程(需要可用模型)。
|
|
1221
1285
|
|
|
1222
1286
|
### 16.4 项目结构
|
|
1223
1287
|
|
|
@@ -1227,7 +1291,7 @@ src/
|
|
|
1227
1291
|
├── rules/ # 规则编译器、注册表、检测流水线
|
|
1228
1292
|
├── store/ # FsStore、事务、锁、journal、迁移、注册表
|
|
1229
1293
|
├── engine/ # EngineService、门控、任务书、投影
|
|
1230
|
-
├── tools/ #
|
|
1294
|
+
├── tools/ # 28 个工具适配器
|
|
1231
1295
|
├── commands/ # 5 条命令 + admin
|
|
1232
1296
|
├── client/ # 侧边栏面板
|
|
1233
1297
|
├── remote/ # 只读 panel 路由
|
|
@@ -1241,15 +1305,17 @@ tests/ # 单测、集成、falsify、e2e
|
|
|
1241
1305
|
|
|
1242
1306
|
### 16.5 当前验证基线
|
|
1243
1307
|
|
|
1244
|
-
0.2.
|
|
1308
|
+
0.2.2 在 Node 24.19 / DSH 0.2.1-rc.3 上完成过:
|
|
1245
1309
|
|
|
1246
|
-
- `
|
|
1247
|
-
-
|
|
1248
|
-
- `typecheck`、`lint`、`check:hygiene
|
|
1249
|
-
- `check:
|
|
1250
|
-
- `check:
|
|
1310
|
+
- `npm test` 全绿:**77 个测试文件 / 772 项**;
|
|
1311
|
+
- 覆盖率:**语句 93.87% / 分支 89.15% / 函数 97.89% / 行 93.87%**,高于 0.2.1 基线(93.86 / 89.04 / 97.81 / 93.86);`test:coverage` 与逐文件 domain/book/insight/viewmodel 门禁全过;
|
|
1312
|
+
- `typecheck`、`lint`、`check:hygiene`(138 files,0 v8 ignore)、`test:isolated`(58 源文件)、`build`、`validate:rulepack`、`check:pack`(25 files)、`check:artifacts`、`check:install`(26 packages)全绿;
|
|
1313
|
+
- `check:preset` 从真实 bundle 解析 13 个 packages;
|
|
1314
|
+
- `check:host` 在临时 DSH profile 中实测:面板未认证 401、认证后 200(payload v4)、预设可见、headless 真实触发 `novel_init` 并落盘、`remove` 后层消失;
|
|
1315
|
+
- `check:crash` 在真实子进程 SIGKILL 后恢复 pending journal:目标项目仍可读,无遗留 pending 事务;
|
|
1316
|
+
- `agnes-2.5-flash` 与 `agnes-3.0-flash` 在临时项目完成 P1→P8、归档、report/doctor/panel v4、history/backups、六种导出、`novel_reopen` 与重新归档;P1/P2/P3 为真实模型,P4/P6 为确定性夹具,详见 [0.2.2-real-model-evidence.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.2-real-model-evidence.md)。
|
|
1251
1317
|
|
|
1252
|
-
|
|
1318
|
+
具体数字会随代码变化;发布前请以重新跑出的结果为准,不要把上面的历史数字当保证。完整验收矩阵见 `docs/0.2.2-evidence.md`。
|
|
1253
1319
|
|
|
1254
1320
|
---
|
|
1255
1321
|
|
|
@@ -1260,10 +1326,14 @@ tests/ # 单测、集成、falsify、e2e
|
|
|
1260
1326
|
| [DESIGN.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/DESIGN.md) | 完整设计书:架构、数据模型、规则、门控、事务、面板、预设 |
|
|
1261
1327
|
| [PLAN.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/PLAN.md) | 0.1.0 实施计划(历史) |
|
|
1262
1328
|
| [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 整书生命周期:蓝图/大纲/世界观/章卡/观测 |
|
|
1329
|
+
| [docs/0.2.2-plan.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.2-plan.md) | 0.2.2 会话级项目选择、scan/resume、面板 v4 与完整卷 |
|
|
1330
|
+
| [docs/0.2.2-evidence.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.2-evidence.md) | 0.2.2 验收矩阵与质量门证据 |
|
|
1331
|
+
| [docs/0.2.2-real-model-evidence.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.2-real-model-evidence.md) | 0.2.2 两条真实模型 P1→P8 链路回执 |
|
|
1332
|
+
| [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 可信账本、历史、备份、计划分权与质量门禁 |
|
|
1263
1333
|
| [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) | 真实模型全链路验证回执 |
|
|
1264
1334
|
| [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 长书可运行性与证据闭环方案(历史) |
|
|
1265
1335
|
| [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 契约收口与证据加固方案(历史) |
|
|
1266
|
-
| [docs/tools.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/tools.md) |
|
|
1336
|
+
| [docs/tools.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/tools.md) | 28 个工具与命令面速查 |
|
|
1267
1337
|
| [docs/states.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/states.md) | 状态机、迁移表、轮次与回退 |
|
|
1268
1338
|
| [docs/rulepack.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/rulepack.md) | 规则包结构、编译器断言、改词表流程 |
|
|
1269
1339
|
| [CHANGELOG.md](CHANGELOG.md) | 版本变更 |
|
package/briefs/P6.md
CHANGED
package/briefs/P8.md
CHANGED
|
@@ -28,6 +28,8 @@
|
|
|
28
28
|
- `timeline` 的键是 `summary.events` 的下标(字符串)。
|
|
29
29
|
- `relationships` 的键是 `"甲|乙"`;每项至少 `{ "action": "created", "type": "关系类型", "description": "..." }`,缺 `type` 会被拒绝。
|
|
30
30
|
- `characters` 的键是人物名;`world` 的键是新地点/能力/物品名;`foreshadows` 的键是 summary 里的 planted key 或已分配的 `FS-xxx`。
|
|
31
|
+
- **伏笔的 title 是可读标签,anchor 才是校验证据**:`title` 可以写「船费债」这样的短语;要归档,请把正文原句放进 `anchor`(summary 的 planted 项或 delta 项都行,至少 8 个字符)。没有 `anchor` 时,`title` 必须逐字出现在正文里,否则 `ENGINE_DELTA_UNVERIFIED`。示例:`{"action":"created","title":"船费债","anchor":"三百蚊的船费先欠着","description":"欠船费三百蚊"}`。
|
|
32
|
+
- 归档失败的报错会指出字段、值和缺失的锚点;不要把 title 改成碎片来“凑命中”,补 `anchor` 即可。
|
|
31
33
|
- 第一人称的叙述者若在 `narrator` 里声明为 `陈默(第一人称「我」)`,正文用「我」也视为出现,但角色键仍写 `陈默`。
|
|
32
34
|
- 每个新实体至少写 `action: "created"`;已存在且没变化写 `action: "no_change", reason: "..."`。
|
|
33
35
|
- `world` 新实体还要写 `kind: "location"|"ability"|"artifact"` 和 `description`。
|