dsh-novel-write-engine 0.2.1 → 0.2.3
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 +60 -1
- package/README.md +124 -57
- package/briefs/P5.md +22 -1
- package/briefs/P8.md +67 -1
- package/lib/client.js +591 -55
- package/lib/index.d.ts +393 -37
- package/lib/index.js +4039 -1997
- package/lib/types/client/dto.d.ts +45 -4
- package/lib/types/client/panel.d.ts +1 -1
- package/lib/types/client/viewmodel.d.ts +50 -3
- package/lib/types/constants.d.ts +4 -1
- package/lib/types/types.d.ts +37 -2
- package/package.json +1 -1
- package/rulepacks/default.yaml +4 -2
- package/skills/entry.md +7 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,64 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.3
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- **报表账本**:`novel_report.effort` 对旧章按 committed journal 回填 `submitReview`/`submitRevision`/`runCheck`/`rollback` 与 `archived_at`,旧 `final_check` 从 check 文档补读;`quality` 改为每章一份最终评审,新增 `samples`(章数)、`attempts`(committed 评审轮次,含历史)与 `trend_basis`,样本不足时 `trend` 为 `null` 而不是伪造 0。
|
|
8
|
+
- **简报按章隔离**:`state/briefs.yaml` 仍是全书 append-only 审计,但 `pipeline.briefs` 与 `getBrief` 只取当前章收据;重复领取同一章同一阶段直接 replay,不写 journal、不升 revision;仍取项目写锁做 journal 一致性检查,避免误恢复其他写者的 pending 事务。
|
|
9
|
+
- **角色与伏笔**:旧 `extra` 角色可从 worldbook/P1 或叙述者修正;伏笔 `resolved` 同步写 `advance_log`,记录章节、note 与 new_info。
|
|
10
|
+
- **归档失败可直接修订**:`ready_to_archive` 增加 `submitRevision` 回 P4,不必先 `novel_rollback`;P5 任务书与所有 brief 暴露 `manuscript_hash`/patch 示例。
|
|
11
|
+
- **P8 契约**:brief 带最小 `state_delta` schema、每段示例和 `worldbook_facts_empty`;delta 错误回显 expected 形态;`ENGINE_ISSUE_IMMUTABLE` 区分“格式错”和“评审归属不可改”。
|
|
12
|
+
- **提示降噪**:advisory 按 code 每章一条并合并去重后的证据;`LOCKED_DETAIL_DRIFT` 带 expected/actual 片段,重复段带阈值;`RESOURCE_MISMATCH` 只在正文明确写反向符号时报,不再把中文省略符号当矛盾。strict 模式下 `facts` 为空时 doctor 提醒;同段“数量×单价/人数×单价”算式不一致会报 advisory;中文句密度上限校准为 10/100 字。
|
|
13
|
+
- **失败重试**:有 key 的写操作在 journal 记录 `retry_key`/`retry_context`;与上次被拒尝试内容、brief、stage、revision 完全相同时返回 `ENGINE_RETRY_UNCHANGED`,防止原样重试浪费事务;换 brief 或改内容后放行。
|
|
14
|
+
- **默认规则包 1.0.1**:`period_density.max` 8→10(中文短句校准),并加入同段乘式/人数×单价算式 advisory。
|
|
15
|
+
- **面板 v5**:紧凑顶栏、首屏“当前章/下一步”、双栏工作台、统计条;项目选择器按写作/待修复/失效分组,失效默认折叠、可搜索、同名用父目录区分;advisories 与 legacy 独立展示;payload v5,旧标签页刷新。
|
|
16
|
+
- **项目卫生**:`check:host` 同时隔离 `HOME`/`DSH_HOME`,用临时注册表正控证明 `novel_init` 确实写入了隔离行,并回查真实 `projects.yaml` 未新增 Host Smoke;新增 `/novel projects --prune [--yes]`,默认只列失效登记,`--yes` 才删登记行,不删项目目录。
|
|
17
|
+
- **升级审计**:doctor 新增 `legacy-data`,只读标出旧 check、缺 rounds/archived_at、extra 角色、pre-0.2.3 无 anchor 伏笔、stale `pipeline.briefs`;`state/briefs.yaml` 的跨章历史收据是正常 append-only 审计,不误报;不自动改历史。新伏笔用 `format_version:1` 区分合法 anchorless 条目。
|
|
18
|
+
- **发布前复核**:`ready_to_archive` 的可修订归档阻断改推荐 P5→revise;锁定细节、资源归属、千分位/枚举算式、重复段证据定位修正;quality `attempts` 补齐 journal 缺口;`check:host` 在创建临时 home 前验 DSH、保留隔离正控;`check:artifacts` 校验 `dsh.client` 清单。
|
|
19
|
+
|
|
20
|
+
### Tests
|
|
21
|
+
|
|
22
|
+
- 新增 0.2.3 报表回填、quality 样本/attempts、briefs 按章、brief replay、ready_to_archive 直接修订、P5 hash、doctor legacy、面板分组/advisory/legacy、`projects --prune` 与 advisory 去重测试。
|
|
23
|
+
- 质量:78 个测试文件 / 836 项测试全绿;覆盖率 94.12 / 89.28 / 97.96 / 94.12,逐文件门禁通过;typecheck、lint、build、pack、artifacts、install、preset、host、crash、hygiene、isolated、rulepack 全过。
|
|
24
|
+
- 真实模型:`agnes-2.5-flash`(275 字 / 6 段)与 `agnes-3.0-flash`(373 字 / 8 段)在临时项目完成 P1→P8、归档、report/doctor/panel v5、六种导出、reopen 与重新归档;P1/P2/P3 真实,P4/P6 确定性夹具,详见 [0.2.3 真实模型证据](docs/0.2.3-real-model-evidence.md)。
|
|
25
|
+
- 版本升 0.2.3;`REMOTE_VERSION` 4 → 5;工具 28、服务操作 32、核心工具 10、门控 13、语义项 5、导出 6 均不变。
|
|
26
|
+
|
|
27
|
+
## 0.2.2
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- **会话级项目选择**:删除 `EngineService.lastRoot`;显式 `project_root` 成功加载后写入 `stateDir/session-bindings.yaml`,按 DSH `SessionId` 持久化,DSH 重启后仍在。A/B 会话不再因为“最近一次工具调用”互相串书。
|
|
32
|
+
- **四层解析**:显式参数 → 会话绑定 → 会话 cwd 的有限工作区发现(`cwd`、`cwd/novel`、唯一直接子目录)→ 唯一注册项目/配置 `projectRoot`。有 Agent 且多项目无上下文时返回 `ENGINE_PROJECT_AMBIGUOUS`,不再用 `active` 静默兜底。
|
|
33
|
+
- **删除/移动/替换 fail-closed**:绑定目录消失返回 `ENGINE_PROJECT_MISSING`;同路径换成另一本 `created_at` 不同(或新项目没有 `created_at`)的书返回 `ENGINE_PROJECT_IDENTITY_MISMATCH`;不自动回退、不自动重建、不自动清登记/绑定。移动后若注册表有同 `created_at` 的其他 root,错误提示候选但不会自动跳转。
|
|
34
|
+
- **注册表增强**:`projects.yaml` 保持 v1,新增可选 `created_at`;注册按规范化 root upsert,同一路径始终一行;重复注册幂等,显式 `register` 在路径被替换时返回 `replaced:true`;`active` 降级为面板默认与无 Agent 默认。
|
|
35
|
+
- **`novel_init` 的 root 规则**:省略 `project_root` 时只使用配置 `projectRoot`,不读会话绑定/工作区/active;创建成功后才绑定当前会话并登记。
|
|
36
|
+
- **工具 schema**:`novel_init` 使用独立的 `project_root` 说明;其他工具说明四层顺序;`novel_status` 新增 root/source 文本与 JSON `selection`。
|
|
37
|
+
- **面板 v4**:新增项目选择器、choose/missing 状态、`summary.root`、`projects[]`、`selection`、`resume`、`missing`;选择只改 GET `?root=` 与浏览器 `localStorage`,不写会话绑定;加入请求竞态/Abort、未登记偏好回退、损坏项目提示、移动端选择器布局。面板读取使用 `loadAt`,不会因查看项目而登记或绑定。
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- **新增命令**:`/novel projects|current|use <path|title|.>|unbind|scan [--register]|resume`。`scan` 只扫有限工作区、最多 50 个候选、不递归/不跟随符号链接;普通 scan 不写,`--register` 只登记健康项目且不改 active/绑定,单条登记失败不中断整批。`resume` 与面板复制共用 `formatResumePrompt`,只读,不写绑定/注册表/项目;scan/resume 不是新工具(工具仍 28、操作仍 32)。
|
|
42
|
+
- **复制续写指令**:下一步卡新增只写浏览器剪贴板的按钮,文本与 `/novel resume` 同源;剪贴板失败时展示可手动选中的只读文本。
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
|
|
46
|
+
- **完整卷视图**:修复 0.2.1 只显示前 8 卷的 UI 截断,全部卷在滚动容器中展示并高亮当前卷;不新增 DTO 字段或接口。
|
|
47
|
+
- **删除项目的写入与事务**:写操作在取项目锁前确认 novel/state 证据,`FileLock` 不再把已删除目录重新 mkdir;事务在每次 rename 前与提交后检查 root,root 在 rename 之间消失时 abort、跳过补偿且不补写 journal,避免被后续 mkdir 从空目录重建。
|
|
48
|
+
- **扫描批次与只读**:`scanWorkspace` 在第一个超过 50 的候选处停止检查;`scan --register` 的登记写入失败按候选记录为 skipped,不中断后续候选;`resume` 和面板查看不再通过 `load()` 自动登记/绑定。
|
|
49
|
+
- **面板/初始化旧口径**:修正面板教程中“跟随最近工具调用/activate 切换”的旧说法,README 的初始化 root、旧面板版本号、注册表提示和工具写入说明。
|
|
50
|
+
- **第二轮全量 review 补强**:`novel_amend` 保留已解析 Selection,绑定路径被替换时不再绕过 `created_at` 身份检查,workspace amend 不再产生持久绑定;绑定有身份而磁盘项目失去 `created_at` 时 fail-closed;写工具/amend 在项目锁前返回 `ENGINE_PROJECT_MISSING`,doctor/guide 不再把丢失绑定伪装成“还没有项目”。
|
|
51
|
+
- **元数据与扫描**:重复显式读取不再抢 metadata 写锁;`SessionBindings.bind` 不因 source 变化重写文件;scan 不为已登记候选构建完整 Snapshot,新增候选快照 damaged 时不写占位登记;相对 `project_root` 按会话 cwd 解析,与 `/novel use` 一致。
|
|
52
|
+
- **读取容错与纯文本 diff**:显式 `project_root` 的读取不再因绑定/登记元数据损坏或不可写而失败,无 root 解析仍 fail-closed;`novel_diff` 的 `before`+`after` 纯文本模式不再读取项目,`chapter` 缺省返回 0。
|
|
53
|
+
- **事务根身份**:staging 期间根目录被删除或替换时 fail-closed,不重建、不写入替换目录;`FsStore.writeText/writeBytes/appendText` 不再用 recursive mkdir 重建缺失根。
|
|
54
|
+
- **面板与契约**:切换项目时显示骨架并隐藏旧书数据/复制按钮;`AbortSignal.any` 缺失时保留 10s 超时;missing 提示中文化并区分 `unreadable`,`/novel current` 显示失效绑定状态;`novel_word_count` 纯文本与 `novel_diff` 纯文本模式明确不读项目、不绑定会话;`check:host` 从构建产物派生 28 个工具名并校验 v4 字段。
|
|
55
|
+
|
|
56
|
+
### Tests
|
|
57
|
+
|
|
58
|
+
- 新增会话绑定、选择矩阵、并发绑定、扫描封顶、扫描单条写失败、命令、面板 v4、只读 resume/panel、damaged 绑定、符号链接根、工作区优先级、可见加载竞态、事务 root 删除、完整卷与剪贴板测试;README/DESIGN/docs/tools/面板教程与错误码同步。
|
|
59
|
+
- 版本升 0.2.2;`REMOTE_VERSION` 3 → 4;工具 28、服务操作 32、核心工具 10、门控 13、语义项 5、导出 6 均不变。
|
|
60
|
+
- 质量:77 个测试文件 / 772 项测试全绿;覆盖率 93.87 / 89.15 / 97.89 / 93.87,高于 0.2.1 基线;typecheck、lint、isolated、build、pack、artifacts、install、preset、host、crash、hygiene 全过。真实模型两条 P1→P8 链路通过,见 [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)。
|
|
61
|
+
|
|
3
62
|
## 0.2.1
|
|
4
63
|
|
|
5
64
|
- **面板可滚动**:`nwe-root` 改为 `height:100%; overflow-y:auto; overscroll-behavior:contain`,宿主 `overflow:hidden` 不再裁掉下方内容;教程弹框保持 fixed,Esc/遮罩/焦点返回不回归。教程弹框新增「续写下一章」可直接复制给 Agent 的话术:先 `novel_pipeline` 确认状态,缺章卡用全量 `novel_outline`,目标章数满了用 `novel_amend`,再按 P1→P8 推进并在归档前确认 `state_delta`。
|
|
@@ -119,6 +178,6 @@
|
|
|
119
178
|
- 面板 exact route 复用 connection 的 Host/Origin/认证闸门;没有阻塞的阶段显示下一步工具与原因。
|
|
120
179
|
- `FsStore` 对读、写、事务目标拒绝项目内 symlink 重定向。
|
|
121
180
|
- `/novel admin` 增加 `novel_registry_list/register/activate/forget` 与 `novel_import`,让多项目注册表和设定包导入有显式命令入口。
|
|
122
|
-
- 第四轮加固:跨进程归档幂等 replay、原子锁回收、持久化 staging pre-image
|
|
181
|
+
- 第四轮加固:跨进程归档幂等 replay、原子锁回收、持久化 staging pre-image、活跃项目解析(0.2.2 已由会话绑定取代)、修订不再重写评审 `content_hash`、低分评审可进入 P5、短对话不触发重复段阻塞、嵌套 schema 校验与稳定快照读取。
|
|
123
182
|
- 面板 UI/UX 改造:Hero + 四项统计、九阶段完成态、下一步中文动作、章节卡与评分进度、门控可视化、loading/empty/error/outdated 状态、响应式布局、键盘焦点与每 15 秒自动同步。
|
|
124
183
|
- 第五轮发布前加固:归档前逐文档 `narrow` 校验(非法 delta/handoff 不再写坏项目)、锁回收行不再遮蔽 pending 事务、修订 issue 状态校验、初始化不覆盖失落的 `novel.yaml` 状态、失败 root 不污染面板、长事务锁只按存活进程回收、draft/revision 备份使 `novel_diff` 有基线、journal 对全部历史 state 哈希对账、check 文档嵌套校验、面板单章完成态与全书完成态区分、工具警告回传、preset 补回 subagent 控制工具。
|
package/README.md
CHANGED
|
@@ -6,7 +6,11 @@
|
|
|
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.3 把“账本说真话”补到旧项目:`report` 从 journal 回填旧章 effort,quality 每章只算最终评审并区分 `samples`/`attempts`;briefs 按当前章隔离;归档失败可直接修订;advisory 按章去重并带证据;面板 v5 改为书桌式工作台,项目选择器分离写作/待修复/失效;`check:host` 不再污染真实注册表。
|
|
12
|
+
|
|
13
|
+
> **当前版本:0.2.3** · 中文界面 · MIT
|
|
10
14
|
>
|
|
11
15
|
> **宿主范围**:DSH `>=0.2.1-rc.2 <0.3.0-0`;Node `>=24.9.0`。
|
|
12
16
|
|
|
@@ -84,7 +88,7 @@
|
|
|
84
88
|
| ------------------------------- | -------------------------------------------------------------------------------------------- |
|
|
85
89
|
| 28 个 `novel_*` 工具 | 书级蓝图/大纲/世界观 + 单章流水线 + 报告/体检/搜索/引导/重开/备份恢复 |
|
|
86
90
|
| 5 条 `/novel*` 命令 | 状态、下一步、统计、导出、隐藏操作;`/novel` 内含 outline/guide/report/doctor/search 子命令 |
|
|
87
|
-
| 1 个侧边栏面板「网文工坊」 |
|
|
91
|
+
| 1 个侧边栏面板「网文工坊」 | 只读;当前章/下一步、统计、全书规划、世界观、质量趋势、健康、最近活动、九阶段轨、章节卡、门控区 |
|
|
88
92
|
| 1 个内置 Agent 预设「网文工坊」 | 28 个工具全开,**不挂载 bash / 文件写入工具**;会话开始后不能切换 |
|
|
89
93
|
| 1 个入口技能 | 告诉模型什么时候该用引擎、哪些写入口是唯一的 |
|
|
90
94
|
| 13 条门控 | 任务书、阶段、字数、格式、摘要、场景类型、大纲对齐、评分、问题清零、阅读证明、一致性、轮次、归档原子性 |
|
|
@@ -93,9 +97,9 @@
|
|
|
93
97
|
| 规则包外置 | 词表、格式、标点、语义、跨章阈值都在 `rulepacks/default.yaml`,代码只执行 |
|
|
94
98
|
| 六种导出 | Markdown、纯文本、EPUB 3、大纲、世界观、书级提案;正文导出附 `cover.svg` 与 `blurb.txt` |
|
|
95
99
|
| 整书规划层 | 书级蓝图、卷结构、章卡(严格模式)、世界观设定集;支持 Markdown/YAML/JSON 导入 |
|
|
96
|
-
| 可观测性 | `novel_status` 书级摘要、`novel_report`、`novel_doctor`、`novel_search`、panel
|
|
97
|
-
| 多项目注册表 | `stateDir/projects.yaml`
|
|
98
|
-
| 运行期依赖极少 | 只有 `yaml`
|
|
100
|
+
| 可观测性 | `novel_status` 书级摘要、`novel_report`、`novel_doctor`、`novel_search`、panel v5、journal 活动 |
|
|
101
|
+
| 多项目注册表 | `stateDir/projects.yaml` 记录已知项目与面板默认 active;不影响项目目录 |
|
|
102
|
+
| 运行期依赖极少 | 只有 `yaml` 一个运行时依赖;Host 侧不访问外部网络、不调用外部 API、不读环境变量里的密钥 |
|
|
99
103
|
|
|
100
104
|
### 关键设计
|
|
101
105
|
|
|
@@ -171,7 +175,7 @@ P7/P8/P9 在 `novel_archive` 一次事务里完成。单章归档后状态是 `d
|
|
|
171
175
|
| pnpm | CLI 安装/卸载插件需要;建议 11.x(本仓库开发基线为 11.28.9) |
|
|
172
176
|
| 宿主形态 | Web(面板 + 预设)、Desktop(面板 + 预设,插件由桌面壳管理)、headless(只有工具/命令,无面板/预设) |
|
|
173
177
|
| 磁盘 | 项目根目录可写;默认 `stateDir` 可写 |
|
|
174
|
-
| 网络 | 安装时需要访问 npm / Git
|
|
178
|
+
| 网络 | 安装时需要访问 npm / Git 托管;运行期 Host 侧不访问外部网络,Web 客户端只向宿主面板发同源 GET |
|
|
175
179
|
| 语言 | 0.2.x 仅中文 |
|
|
176
180
|
|
|
177
181
|
检查命令:
|
|
@@ -276,7 +280,7 @@ dsh plugin --profile web add dsh-novel-write-engine
|
|
|
276
280
|
固定版本:
|
|
277
281
|
|
|
278
282
|
```bash
|
|
279
|
-
dsh plugin --profile web add dsh-novel-write-engine@0.2.
|
|
283
|
+
dsh plugin --profile web add dsh-novel-write-engine@0.2.3
|
|
280
284
|
```
|
|
281
285
|
|
|
282
286
|
`dsh` 不在 PATH 时,用 `npx @deepseek-ai/dsh` 代替命令开头的 `dsh`。
|
|
@@ -331,13 +335,13 @@ corepack pnpm pack
|
|
|
331
335
|
会得到类似:
|
|
332
336
|
|
|
333
337
|
```text
|
|
334
|
-
dsh-novel-write-engine-0.2.
|
|
338
|
+
dsh-novel-write-engine-0.2.3.tgz
|
|
335
339
|
```
|
|
336
340
|
|
|
337
341
|
把这个 tarball 复制到目标机器,放在一个**稳定、不会随手删除**的路径,然后:
|
|
338
342
|
|
|
339
343
|
```bash
|
|
340
|
-
dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.
|
|
344
|
+
dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.3.tgz
|
|
341
345
|
```
|
|
342
346
|
|
|
343
347
|
tarball 安装不会运行源码构建,也不会要求 `allowBuilds`;包内已经包含 `lib/`、`rulepacks/`、`briefs/`、`skills/`、`presets/` 和两层 patch。它是最接近「发布产物」的安装方式。
|
|
@@ -352,9 +356,9 @@ tarball 安装不会运行源码构建,也不会要求 `allowBuilds`;包内
|
|
|
352
356
|
2. 点 **添加插件**(或旁边的箭头 → **安装第三方插件**)。
|
|
353
357
|
3. 在包名字段填入以下任一形式:
|
|
354
358
|
- npm 包名:`dsh-novel-write-engine`
|
|
355
|
-
- 精确版本:`dsh-novel-write-engine@0.2.
|
|
359
|
+
- 精确版本:`dsh-novel-write-engine@0.2.3`
|
|
356
360
|
- 源码目录:`/absolute/path/to/dsh-novel-write-engine`
|
|
357
|
-
- tarball:`/absolute/path/to/dsh-novel-write-engine-0.2.
|
|
361
|
+
- tarball:`/absolute/path/to/dsh-novel-write-engine-0.2.3.tgz`
|
|
358
362
|
4. npm 包名从 npm 官方源安装;本地目录和 tarball 直接使用宿主路径。
|
|
359
363
|
5. 点 **安装**,等待完成。
|
|
360
364
|
6. 如果出现 **立即启用**,点它;否则安装后到「已安装插件」里把 **dsh-novel-write-engine** 打开。
|
|
@@ -426,7 +430,7 @@ dsh --profile web --dump-config | grep -A8 '# == dsh-novel-write-engine'
|
|
|
426
430
|
先做全书蓝图、第一卷大纲和世界观设定,再写第一章的世界观约束和章节计划。
|
|
427
431
|
```
|
|
428
432
|
|
|
429
|
-
模型会调用 `novel_init` 建项目,然后按 `novel_guide` 的提示做书级规划;也可以跳过蓝图直接写第一章,严格大纲是可选开关。0.2.
|
|
433
|
+
模型会调用 `novel_init` 建项目,然后按 `novel_guide` 的提示做书级规划;也可以跳过蓝图直接写第一章,严格大纲是可选开关。0.2.3 推荐顺序:
|
|
430
434
|
|
|
431
435
|
```text
|
|
432
436
|
novel_init
|
|
@@ -457,7 +461,7 @@ novel_init
|
|
|
457
461
|
|
|
458
462
|
`premise`、`logline`、`themes`、`tone`、`pov`、`audience`、`selling_points`、`ending` 与 `strict_outline` 都是可选的书级种子;不填也能开书,之后用 `novel_blueprint` 补。
|
|
459
463
|
|
|
460
|
-
`genre` 必须是 12 类之一,`platform` 必须是 `fanqie` / `qidian` / `qimao` / `jinjiang`
|
|
464
|
+
`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
465
|
|
|
462
466
|
### 4. 一章的标准调用顺序
|
|
463
467
|
|
|
@@ -495,12 +499,11 @@ novel_init
|
|
|
495
499
|
|
|
496
500
|
归档后打开左侧 **网文工坊**:
|
|
497
501
|
|
|
498
|
-
-
|
|
499
|
-
-
|
|
500
|
-
-
|
|
501
|
-
-
|
|
502
|
-
-
|
|
503
|
-
- 章节卡、门控区与最近活动。
|
|
502
|
+
- 紧凑顶栏:书名、类型、平台、当前章、阶段;
|
|
503
|
+
- 首屏“当前章 / 下一步”卡与“复制续写指令”;
|
|
504
|
+
- 统计条:已归档章节、总字数、平均分、待处理门控;
|
|
505
|
+
- 双栏工作台:左侧阶段轨、门控、提示、旧数据;右侧全书规划(蓝图/严格模式、章卡进度、**全部卷**、世界观计数、质量趋势、健康度)与最近活动;
|
|
506
|
+
- 底部章节卡。
|
|
504
507
|
|
|
505
508
|
面板每 15 秒静默同步一次,也可以点刷新;它**只读**,所有写操作仍在对话/工具里。
|
|
506
509
|
|
|
@@ -525,13 +528,13 @@ novel_init
|
|
|
525
528
|
| 工具 | 阶段 | 做什么 | 写盘 |
|
|
526
529
|
| -------------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- |
|
|
527
530
|
| `novel_init` | — | 建项目:`novel.yaml` + `state/` + `outline/` + 目录 | 是 |
|
|
528
|
-
| `novel_status` | 任意 | 当前活跃章、阶段、轮次、阻塞项、`state_errors`、下一步;`chapter` 只用于字数查询
|
|
531
|
+
| `novel_status` | 任意 | 当前活跃章、阶段、轮次、阻塞项、`state_errors`、`manuscript_hash`、下一步;`chapter` 只用于字数查询 | 项目正文否;显式 root 写绑定 |
|
|
529
532
|
| `novel_brief` | P1–P6 / P8 | 领取当前活跃章的任务书,返回 `fields`、`context`;`context.world_plan` 与 `context.context_meta` 在 `context` 内,并记录 digest | 仅任务书签收 |
|
|
530
533
|
| `novel_plan_world` | P1 | 提交世界观约束;数组/对象形状在服务边界校验 | 是 |
|
|
531
534
|
| `novel_plan_chapter` | P2 | 提交章节计划;标题长度读 rulepack、5–8 个节拍、opening/ending 非空;可选 `cast` 1–8 人 | 是 |
|
|
532
535
|
| `novel_write_draft` | P3 | 提交初稿;格式/字数/摘要不过整体拒绝 | 是 |
|
|
533
536
|
| `novel_review` | P4 | 十五维评分、问题清单、三段阅读证明;issue 维度/段落和 blocker waived 会被拒绝 | 是 |
|
|
534
|
-
| `novel_revise` | P5/P6
|
|
537
|
+
| `novel_revise` | P5/P6/待归档 | 提交修订;支持整章 `content` 或 `patch:{expected_hash,edits}`;`ready_to_archive` 可直接修订并回 P4;blocker 必须有正文证据,不能降级或 waived | 是 |
|
|
535
538
|
| `novel_check` | P6 | 机检 + 五个语义一致性项;`advisories` 与 blocker 分开,可用 `acknowledge` 记录知悉;单 scope 不推进归档 | 是 |
|
|
536
539
|
| `novel_archive` | P7–P9 | 事务归档;必须带 `state_delta`;旧 review 无 digest 时拒绝 | 事务 |
|
|
537
540
|
| `novel_word_count` | 任意 | 按引擎唯一口径数字数 | 否 |
|
|
@@ -547,7 +550,7 @@ novel_init
|
|
|
547
550
|
| `novel_outline_import` | 任意 | 从 Markdown / YAML / JSON 导入大纲;`dry_run` 先预览 | 可选 |
|
|
548
551
|
| `novel_worldbook` | 任意 | 增量更新世界观设定集(设定/规则/势力/地点/角色/术语/前史) | 是 |
|
|
549
552
|
| `novel_search` | 任意 | 跨正文、摘要、大纲、世界观、台账搜索,带章号/段落号/片段 | 否 |
|
|
550
|
-
| `novel_doctor` | 任意 | 项目体检:项目/流水线/状态、journal、正文 hash
|
|
553
|
+
| `novel_doctor` | 任意 | 项目体检:项目/流水线/状态、journal、正文 hash、孤立正文、大纲覆盖与漂移、旧数据审计(legacy-data)、数值事实、当前阶段产物、锁、备份、目标进度、下一步 | 否 |
|
|
551
554
|
| `novel_report` | 任意 | 全书报告:进度、大纲、世界观、质量、节奏、角色、伏笔、时间线、关系、活动 | 否 |
|
|
552
555
|
| `novel_guide` | 任意 | 上手引导:当前状态、已完成步骤、下一步工具、命令与提示;无项目也能用 | 否 |
|
|
553
556
|
| `novel_reopen` | 已归档章 | 从归档备份把紧邻的上一章重开到 P3;必须带非空 `reason`,活动章未开始、备份存在时才允许 | 是 |
|
|
@@ -561,7 +564,7 @@ novel_init
|
|
|
561
564
|
|
|
562
565
|
三类错误:
|
|
563
566
|
|
|
564
|
-
- **改参数**:`ENGINE_SCHEMA_INVALID`、`ENGINE_STAGE_ORDER`、`ENGINE_PROJECT_NOT_FOUND`、`ENGINE_PROJECT_EXISTS`;
|
|
567
|
+
- **改参数**:`ENGINE_SCHEMA_INVALID`、`ENGINE_STAGE_ORDER`、`ENGINE_PROJECT_NOT_FOUND`、`ENGINE_PROJECT_EXISTS`;修订改了评审归属字段时是 `ENGINE_ISSUE_IMMUTABLE`;同内容同上下文重试是 `ENGINE_RETRY_UNCHANGED`;
|
|
565
568
|
- **改正文**:`ENGINE_GATE_BLOCKED`、`ENGINE_SCORE_MISMATCH`、`ENGINE_READING_PROOF_INVALID`、`ENGINE_DELTA_UNVERIFIED`;
|
|
566
569
|
- **查环境**:`ENGINE_SCHEMA_TOO_NEW`、`ENGINE_PATH_ESCAPE`、`ENGINE_LOCK_TIMEOUT`、`ENGINE_TXN_ABORTED`、`ENGINE_RULEPACK_INVALID`。
|
|
567
570
|
|
|
@@ -588,6 +591,13 @@ novel_init
|
|
|
588
591
|
/novel doctor
|
|
589
592
|
/novel search <关键词>
|
|
590
593
|
/novel export md|txt|epub|outline|worldbook|proposal
|
|
594
|
+
/novel projects
|
|
595
|
+
/novel projects --prune [--yes]
|
|
596
|
+
/novel current
|
|
597
|
+
/novel use <path|title|.>
|
|
598
|
+
/novel unbind
|
|
599
|
+
/novel scan [--register]
|
|
600
|
+
/novel resume
|
|
591
601
|
/novel admin
|
|
592
602
|
/novel admin novel_state {"kind":"pipeline"}
|
|
593
603
|
```
|
|
@@ -622,7 +632,7 @@ novel_write_draft, novel_review, novel_revise, novel_check, novel_archive
|
|
|
622
632
|
/novel admin novel_restore {"txid":"..."}
|
|
623
633
|
```
|
|
624
634
|
|
|
625
|
-
|
|
635
|
+
多项目注册表与设定包导入**不走工具 schema**;日常发现/切换用 `/novel scan`、`/novel use`,底层登记仍可用:
|
|
626
636
|
|
|
627
637
|
```text
|
|
628
638
|
/novel admin novel_registry_list
|
|
@@ -637,13 +647,15 @@ novel_write_draft, novel_review, novel_revise, novel_check, novel_archive
|
|
|
637
647
|
|
|
638
648
|
### 8.4 侧边栏「网文工坊」
|
|
639
649
|
|
|
640
|
-
- 只读 HTTP 路由:`GET/HEAD /api/novel-write-engine/panel
|
|
650
|
+
- 只读 HTTP 路由:`GET/HEAD /api/novel-write-engine/panel?root=<可选>`;
|
|
641
651
|
- 精确路由,复用 connection 的认证/Origin 闸门;未认证返回 401/403,连接层缺席返回 503;
|
|
642
652
|
- 返回 `schemaVersion`;版本不一致时面板提示刷新;
|
|
643
|
-
- 状态:loading(骨架)、empty(显示 `novel_init`)、error(重试)、outdated(刷新)、ready;
|
|
644
|
-
-
|
|
645
|
-
-
|
|
646
|
-
-
|
|
653
|
+
- 状态:loading(骨架)、choose(多项目先选)、missing(项目不在)、empty(显示 `novel_init`)、error(重试)、outdated(刷新)、ready;
|
|
654
|
+
- 顶部项目选择器(`aria-label="切换项目"`);选择只影响面板 GET 的 `?root=`,写入浏览器 `localStorage`,**不调用 activate、不写会话绑定**;
|
|
655
|
+
- 只接受注册表、active 或配置 `projectRoot` 的路径;未登记路径返回 `missing.reason="not_registered"`,不读取任意目录;
|
|
656
|
+
- 章节超过 30 章时只渲染最近 30 张,并显示总记录数;卷列表展示全部卷,长列表在滚动容器内;
|
|
657
|
+
- 下一步卡提供“复制续写指令”,文本与 `/novel resume` 同源,只写浏览器剪贴板;
|
|
658
|
+
- 窄屏纵向堆叠,支持减少动态效果。
|
|
647
659
|
|
|
648
660
|
面板不是第二个写入口。它没有改名、归档、回退按钮。
|
|
649
661
|
|
|
@@ -688,13 +700,33 @@ exports/
|
|
|
688
700
|
- EPUB:EPUB 3,自写 ZIP 容器,`mimetype` 首条且 store 方式;
|
|
689
701
|
- 封面是纯 SVG 字符串,不依赖 canvas;平台简介由模板生成,不调用模型。
|
|
690
702
|
|
|
691
|
-
### 8.6
|
|
703
|
+
### 8.6 多项目与会话绑定
|
|
704
|
+
|
|
705
|
+
四层选择模型:
|
|
706
|
+
|
|
707
|
+
1. 显式 `project_root`(成功后写入当前会话绑定);
|
|
708
|
+
2. `stateDir/session-bindings.yaml` 中当前 DSH `SessionId` 的绑定;
|
|
709
|
+
3. 会话 cwd 的有限工作区发现(`cwd`、`cwd/novel`、唯一直接子目录;多候选报歧义);
|
|
710
|
+
4. 唯一注册项目或配置 `projectRoot`;有多个项目时不猜 `active`。
|
|
711
|
+
|
|
712
|
+
```text
|
|
713
|
+
/novel projects 列出项目;* 当前会话,P 面板默认,! 目录缺失/待修复
|
|
714
|
+
/novel current 当前绑定或推导来源
|
|
715
|
+
/novel use /abs/book 切换当前会话;active 不变
|
|
716
|
+
/novel use . 按当前 cwd 的工作区规则选唯一项目
|
|
717
|
+
/novel use 书名 按注册表精确标题切换;重名要求用路径
|
|
718
|
+
/novel unbind 只清当前会话绑定,不删项目
|
|
719
|
+
/novel scan 只读扫描当前工作区候选
|
|
720
|
+
/novel scan --register 只登记健康项目;不改 active、不绑会话
|
|
721
|
+
/novel resume 输出可粘贴的续写指令;只读
|
|
722
|
+
```
|
|
692
723
|
|
|
693
|
-
- `
|
|
694
|
-
-
|
|
695
|
-
-
|
|
696
|
-
-
|
|
697
|
-
-
|
|
724
|
+
- `projects.yaml` 仍是 v1,新增可选 `created_at`;`session-bindings.yaml` 只保存会话选择,删掉不会删书;
|
|
725
|
+
- `/novel use` 成功绑定后会 best-effort 把项目加入注册表,便于随后在 `/novel projects` 与面板看到;不改变 active。`novel.yaml` 损坏时不绑定、不登记,先用显式 `project_root` 修复;
|
|
726
|
+
- 无显式 `project_root` 时,注册/绑定文件损坏 fail-closed,不静默重建;显式 `project_root` 的读取仍可用(损坏的绑定不会被更新),写事务提交后元数据失败只回 warning;
|
|
727
|
+
- 项目目录被删除时保留登记与绑定,返回 `ENGINE_PROJECT_MISSING`,不自动回退、不自动重建;
|
|
728
|
+
- 原路径被另一本书占用时返回 `ENGINE_PROJECT_IDENTITY_MISMATCH`,必须显式重新 `/novel use`;
|
|
729
|
+
- `/novel admin novel_registry_activate` 只改面板默认,不切换当前会话;`forget` 不删绑定与项目。
|
|
698
730
|
|
|
699
731
|
### 8.7 整书规划、观测与修复
|
|
700
732
|
|
|
@@ -733,12 +765,12 @@ novel_reopen {chapter:3, reason:"结尾需要重写"}
|
|
|
733
765
|
|
|
734
766
|
| 键 | 默认 | 说明 |
|
|
735
767
|
| ----------------- | -------------------------------- | ------------------------------------------------------------------------- |
|
|
736
|
-
| `projectRoot` | `./novel` |
|
|
768
|
+
| `projectRoot` | `./novel` | 无会话绑定/工作区/唯一项目时的兜底根;相对路径相对于 DSH 进程工作目录 |
|
|
737
769
|
| `minScore` | `120` | PG-07 过关线,整数 0..150;唯一 owner |
|
|
738
770
|
| `toolsMode` | `all` | `all` 注册 28 个工具;`core` 只注册 10 个,其余走 `/novel admin` |
|
|
739
771
|
| `briefsOverrides` | 空 | 自定义任务书目录;某阶段文件缺失时回退包内 `briefs/<阶段>.md` |
|
|
740
772
|
| `backupRetention` | `5` | 保留的归档备份目录数;只清理引擎自己创建的 `backups/<txid>` |
|
|
741
|
-
| `stateDir` | 空 → `~/.dsh/novel-write-engine` |
|
|
773
|
+
| `stateDir` | 空 → `~/.dsh/novel-write-engine` | 多项目注册表与会话绑定位置;**不要放进项目目录** |
|
|
742
774
|
|
|
743
775
|
> `stateDir` 的默认值是代码按当前用户 home 拼出的 `~/.dsh/novel-write-engine`,不跟随 `DSH_HOME`。如果你改了 `DSH_HOME`,建议显式把它设成绝对路径。
|
|
744
776
|
>
|
|
@@ -874,7 +906,7 @@ corepack pnpm test
|
|
|
874
906
|
~/.dsh/novel-write-engine/projects.yaml
|
|
875
907
|
```
|
|
876
908
|
|
|
877
|
-
|
|
909
|
+
`projects.yaml` 只记录项目路径、标题、可选 `created_at` 与 `active`;`session-bindings.yaml` 按 DSH `SessionId` 记录显式选择。两者都**不保存正文**,删掉不会删任何书。面板用 projects/active/配置找默认项目,不读会话绑定。
|
|
878
910
|
|
|
879
911
|
### 10.3 手工修改的边界
|
|
880
912
|
|
|
@@ -895,7 +927,32 @@ corepack pnpm test
|
|
|
895
927
|
|
|
896
928
|
## 十一、升级
|
|
897
929
|
|
|
898
|
-
### 11.0 从 0.2.
|
|
930
|
+
### 11.0 从 0.2.2 升级到 0.2.3
|
|
931
|
+
|
|
932
|
+
0.2.3 不迁移项目数据,只改变读模型、面板 wire 版本与项目卫生:
|
|
933
|
+
|
|
934
|
+
1. **面板 payload v5**:旧标签页显示刷新;刷新后是书桌式布局、分组项目选择器和独立的提示/旧数据区。
|
|
935
|
+
2. **report 口径**:旧章 effort 从 journal 回填,quality 每章只算最终评审;`samples` 是章数,`attempts` 是 committed 评审轮次(含历史),样本不足时 `trend` 为 `null`。
|
|
936
|
+
3. **briefs 按章**:`pipeline.briefs` 只显示当前章;`novel_state {kind:"briefs"}` 仍保留全书收据。
|
|
937
|
+
4. **归档失败**:`ready_to_archive` 可以直接 `novel_revise` 回 P4,不需要先 rollback。
|
|
938
|
+
5. **advisory**:同章同 code 只显示一条并合并证据;`RESOURCE_MISMATCH` 不再因中文省略符号误报。
|
|
939
|
+
6. **项目卫生**:`/novel projects --prune` 默认只列失效登记,`--yes` 才删登记行;`check:host` 不再写真实注册表。
|
|
940
|
+
|
|
941
|
+
### 11.0.1 从 0.2.1 升级到 0.2.2
|
|
942
|
+
|
|
943
|
+
0.2.2 不迁移项目数据,但改变多项目选择与面板契约:
|
|
944
|
+
|
|
945
|
+
1. **面板 payload v4**:旧标签页显示刷新;刷新后出现项目选择器、choose/missing 状态和复制续写按钮。
|
|
946
|
+
2. **`lastRoot` 删除**:工具不再跟随进程内“最近碰过谁”。A/B 会话分别绑定、重启后仍在;显式 `project_root` 成功后写入 `session-bindings.yaml`。
|
|
947
|
+
3. **`active` 降级**:只影响面板默认与无 Agent 调用;有 Agent 且多项目无上下文时返回歧义,不静默选 active。
|
|
948
|
+
4. **`novel_init` 省略 root**:只使用配置 `projectRoot`,不读会话绑定/工作区/active;创建成功后才绑定当前会话。
|
|
949
|
+
5. **项目删除/移动/替换 fail-closed**:返回 MISSING/IDENTITY_MISMATCH,不自动回退、不自动重建、不清登记与绑定。
|
|
950
|
+
6. **新增命令**:`/novel projects|current|use|unbind|scan|resume`;`scan`/`resume` 不是新工具,工具仍 28、操作仍 32。
|
|
951
|
+
7. **面板完整卷**:0.2.1 只显示前 8 卷的 UI 截断已修复;全部卷在滚动容器中展示。
|
|
952
|
+
|
|
953
|
+
回滚到 0.2.1 时,`session-bindings.yaml` 被旧版忽略;旧版恢复 `lastRoot` 行为。注册表新增的 `created_at` 对旧版可忽略。
|
|
954
|
+
|
|
955
|
+
### 11.0.1 从 0.2.0 升级到 0.2.1
|
|
899
956
|
|
|
900
957
|
0.2.1 不迁移项目数据,但改变几处契约:
|
|
901
958
|
|
|
@@ -911,7 +968,7 @@ corepack pnpm test
|
|
|
911
968
|
10. **worldbook facts**:新增声明式数字事实,进入计数、brief 上下文、搜索与 P6 检查;`facts` 只做作者声明的 canon 对账,不等同外部史实库。
|
|
912
969
|
11. **伏笔 anchor**:可读 `title` 与逐字 `anchor` 分离,anchor 至少 8 个字符;单字子串不再能绕过校验。
|
|
913
970
|
|
|
914
|
-
### 11.0.
|
|
971
|
+
### 11.0.2 从 0.1.3 升级到 0.2.0
|
|
915
972
|
|
|
916
973
|
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` 即可。
|
|
917
974
|
|
|
@@ -951,7 +1008,7 @@ dsh plugin --profile web add dsh-novel-write-engine@latest
|
|
|
951
1008
|
也可以固定版本:
|
|
952
1009
|
|
|
953
1010
|
```bash
|
|
954
|
-
dsh plugin --profile web add dsh-novel-write-engine@0.2.
|
|
1011
|
+
dsh plugin --profile web add dsh-novel-write-engine@0.2.3
|
|
955
1012
|
```
|
|
956
1013
|
|
|
957
1014
|
升级后核对:
|
|
@@ -993,7 +1050,7 @@ corepack pnpm pack
|
|
|
993
1050
|
|
|
994
1051
|
```bash
|
|
995
1052
|
dsh plugin --profile web remove dsh-novel-write-engine
|
|
996
|
-
dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.
|
|
1053
|
+
dsh plugin --profile web add /absolute/path/to/dsh-novel-write-engine-0.2.3.tgz
|
|
997
1054
|
```
|
|
998
1055
|
|
|
999
1056
|
### 11.5 在 Web / Desktop 里升级
|
|
@@ -1081,7 +1138,7 @@ dsh plugin --profile web remove dsh-novel-write-engine
|
|
|
1081
1138
|
卸载插件不会删书。确认不再需要后,再手动清理:
|
|
1082
1139
|
|
|
1083
1140
|
```bash
|
|
1084
|
-
#
|
|
1141
|
+
# 多项目注册表与会话绑定(只影响选择/查看,不影响书)
|
|
1085
1142
|
rm -rf "$HOME/.dsh/novel-write-engine"
|
|
1086
1143
|
|
|
1087
1144
|
# 某个项目(先确认路径!)
|
|
@@ -1123,8 +1180,11 @@ dsh --profile web --dump-config | grep dsh-novel-write-engine
|
|
|
1123
1180
|
| 会话里没有 `novel_*` 工具 | 插件未启用、旧会话未刷新、装错 profile | 新开会话;重启;`--dump-config` 核对 |
|
|
1124
1181
|
| `ENGINE_STAGE_ORDER` | 跳过了阶段或顺序不对 | `/novel` / `novel_status` 看下一步;按 `novel_brief` 领任务书 |
|
|
1125
1182
|
| `ENGINE_GATE_BLOCKED` | 门控未过 | 看 `blocking` 的 code/detail/hint;改正文或补证据;不要手改 state |
|
|
1126
|
-
| `ENGINE_PROJECT_NOT_FOUND` | 项目根不对/未初始化 | `novel_init`,或传正确的 `project_root`
|
|
1127
|
-
|
|
|
1183
|
+
| `ENGINE_PROJECT_NOT_FOUND` | 项目根不对/未初始化 | `/novel scan` 发现项目;`novel_init`,或传正确的 `project_root` |
|
|
1184
|
+
| `ENGINE_PROJECT_AMBIGUOUS` | 有多个项目,无法从会话/cwd 唯一确定 | `/novel use <path|title>` 或传 `project_root`;不会默认 active |
|
|
1185
|
+
| `ENGINE_PROJECT_MISSING` | 当前会话绑定的目录被删除/未挂载 | 恢复目录后重试;或显式 `/novel use <新路径>`;不会自动换书 |
|
|
1186
|
+
| `ENGINE_PROJECT_IDENTITY_MISMATCH`| 原路径已被另一本书占用,`created_at` 不同 | 确认后用 `/novel use` 重新绑定;旧绑定仍 fail-closed |
|
|
1187
|
+
| 面板空白/显示没有项目 | 当前没有项目,或 active 指向旧路径 | 先 `novel_init`;多项目时用面板选择器或 `/novel use` 选择 |
|
|
1128
1188
|
| 面板显示「需要刷新」 | 浏览器缓存了旧 client bundle | 刷新页面;重启 DSH |
|
|
1129
1189
|
| 升级后仍是旧行为 | 源码目录没 `corepack pnpm build`,或旧会话未换 | 重新构建;重启;新开会话 |
|
|
1130
1190
|
| 卸载后配置项还在 | profile 的 `cordis.patch.yml` 还留着覆盖 | 删除 `id: novel-write-engine` 的段落 |
|
|
@@ -1147,13 +1207,13 @@ dsh --profile web --dump-config | grep dsh-novel-write-engine
|
|
|
1147
1207
|
|
|
1148
1208
|
DSH bundle 的 Host 半边在 DSH 进程内执行,不受工作区沙箱限制。安装本插件等于允许它在 DSH 进程权限下读写你给它的项目目录和 `stateDir`。只从你信任的 npm 包、源码或 tarball 安装。
|
|
1149
1209
|
|
|
1150
|
-
### 14.2
|
|
1210
|
+
### 14.2 它不向外联网
|
|
1151
1211
|
|
|
1152
|
-
|
|
1212
|
+
Host 侧没有 `fetch`、HTTP 客户端或遥测;运行期依赖只有 `yaml`。它不读取环境变量里的 API Key,也不会把正文发到任何第三方服务。Web 客户端只会向宿主自己的只读面板路由发同源 `GET`,不访问外部地址;模型调用本身由 DSH 负责,与本插件无关。
|
|
1153
1213
|
|
|
1154
1214
|
### 14.3 面板是只读的
|
|
1155
1215
|
|
|
1156
|
-
`/api/novel-write-engine/panel` 只接受 `GET`/`HEAD`,并复用 DSH connection 的认证与 Origin
|
|
1216
|
+
`/api/novel-write-engine/panel` 只接受 `GET`/`HEAD`,并复用 DSH connection 的认证与 Origin 校验。项目选择器只改 `?root=` 与浏览器 `localStorage`,复制按钮只写剪贴板;它们不能改项目、注册表或会话绑定。所有写操作仍然要经过工具/命令。
|
|
1157
1217
|
|
|
1158
1218
|
### 14.4 状态文件不是「随便改的 YAML」
|
|
1159
1219
|
|
|
@@ -1180,6 +1240,7 @@ DSH bundle 的 Host 半边在 DSH 进程内执行,不受工作区沙箱限制
|
|
|
1180
1240
|
- **规则包不可运行期替换**:要改词表/阈值,必须改源码、重新构建、重新安装。
|
|
1181
1241
|
- **普通会话可能绕过引擎**:只有「网文工坊」预设不挂 bash/fs 写工具;在普通会话里手动改文件,事务与门控保证不再完整。
|
|
1182
1242
|
- **预设会话开始后不能切换**。
|
|
1243
|
+
- **同一物理项目请固定一个路径**:注册表按规范化路径(`path.resolve`)去重;同一本书通过符号链接和真实路径分别登记会变成两个 root,可能显示两行或报歧义。请在 `/novel use`/`project_root` 中固定使用其中一个路径。
|
|
1183
1244
|
- **单章轮次上限 3**:超过需要 `novel_rollback`,不是无限重试。
|
|
1184
1245
|
- **面板只读**:没有在面板里直接改正文/归档的按钮。
|
|
1185
1246
|
- **DSH 仍是 developer preview**:`0.3.0` 之前可能有破坏性变更;升级 DSH 前先看插件 `engines.dsh`。
|
|
@@ -1233,7 +1294,7 @@ DSH_BUNDLE_ROOT=/path/to/deepseek-harness/packages/bundle/web-app corepack pnpm
|
|
|
1233
1294
|
6. `dsh plugin remove`,确认层与面板消失;
|
|
1234
1295
|
7. 确认项目数据未被卸载动作删除。
|
|
1235
1296
|
|
|
1236
|
-
`pnpm check:host` 覆盖第 1–4 与第 6 步的自动断言(含 28
|
|
1297
|
+
`pnpm check:host` 覆盖第 1–4 与第 6 步的自动断言(含 28 个工具的宿主声明、面板 v5 字段与空态结构)。`/novel` 命令的 handler 与路由由 `tests/adapters`、`tests/smoke` 的假宿主覆盖,真实宿主命令路由仍属于第 4 步的人工确认;第 5 步也是人工全流程(需要可用模型)。
|
|
1237
1298
|
|
|
1238
1299
|
### 16.4 项目结构
|
|
1239
1300
|
|
|
@@ -1257,16 +1318,17 @@ tests/ # 单测、集成、falsify、e2e
|
|
|
1257
1318
|
|
|
1258
1319
|
### 16.5 当前验证基线
|
|
1259
1320
|
|
|
1260
|
-
0.2.
|
|
1321
|
+
0.2.3 在 Node 24.19 / DSH 0.2.1-rc.3 上完成:
|
|
1261
1322
|
|
|
1262
|
-
- `
|
|
1263
|
-
-
|
|
1264
|
-
- `typecheck`、`lint`、`check:hygiene
|
|
1265
|
-
-
|
|
1266
|
-
- `check:
|
|
1267
|
-
- `
|
|
1323
|
+
- `npm test` 全绿:**78 个测试文件 / 836 项**;
|
|
1324
|
+
- 覆盖率:**语句 94.12% / 分支 89.28% / 函数 97.96% / 行 94.12%**;`test:coverage` 与逐文件 domain/book/insight/viewmodel 门禁全过;
|
|
1325
|
+
- `typecheck`、`lint`、`check:hygiene`(139 files,0 v8 ignore)、`test:isolated`(58 源文件)、`build`、`validate:rulepack`、`check:pack`(25 files)、`check:artifacts`、`check:install`(26 packages)全绿;`check:preset` 在 `DSH_BUNDLE_ROOT=/home/tianhao/deepseek-harness/packages/bundle/web-app` 下解析 13 个包;`check:crash` SIGKILL 恢复通过;
|
|
1326
|
+
- 0.2.2 的历史基线保留在 `docs/0.2.2-evidence.md`:77 files / 772 tests,覆盖率 93.87 / 89.15 / 97.89 / 93.87。
|
|
1327
|
+
- `check:host` 在临时 DSH profile 中实测:面板未认证 401、认证后 200(payload v5)、预设可见、headless 真实触发 `novel_init` 并落盘、`remove` 后层消失;临时 `HOME`/`DSH_HOME` 隔离后真实注册表没有新增 Host Smoke。
|
|
1328
|
+
- 真实 `1971` 项目只读回归:effort 8/6/8/4;quality samples=2、attempts=8、trend=null;第 3 章 briefs 为空;cast 陈嘉树=protagonist;panel legacy 4 类可见(doctor 另含 LEGACY_CHECK_FORMAT,共 5 类)。详见 [0.2.3 验收](docs/0.2.3-acceptance.md)。
|
|
1329
|
+
- 0.2.3 真实模型链路:`agnes-2.5-flash` 与 `agnes-3.0-flash` 在临时项目完成 P1→P8、归档、report/doctor/panel v5、六种导出、`novel_reopen` 与重新归档;P1/P2/P3 为真实模型输出,P4/P6 为确定性夹具。详见 [0.2.3-real-model-evidence.md](docs/0.2.3-real-model-evidence.md)。
|
|
1268
1330
|
|
|
1269
|
-
|
|
1331
|
+
具体数字会随代码变化;发布前请以重新跑出的结果为准,不要把上面的历史数字当保证。完整验收矩阵见 [docs/0.2.3-acceptance.md](docs/0.2.3-acceptance.md)。
|
|
1270
1332
|
|
|
1271
1333
|
---
|
|
1272
1334
|
|
|
@@ -1277,6 +1339,11 @@ tests/ # 单测、集成、falsify、e2e
|
|
|
1277
1339
|
| [DESIGN.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/DESIGN.md) | 完整设计书:架构、数据模型、规则、门控、事务、面板、预设 |
|
|
1278
1340
|
| [PLAN.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/PLAN.md) | 0.1.0 实施计划(历史) |
|
|
1279
1341
|
| [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 整书生命周期:蓝图/大纲/世界观/章卡/观测 |
|
|
1342
|
+
| [docs/0.2.3-plan.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.3-plan.md) | 0.2.3 可信账本、工作流、advisory、面板 v5 与项目卫生 |
|
|
1343
|
+
| [docs/0.2.3-acceptance.md](https://github.com/ThzxxArt/dsh-novel-write-engine/blob/main/docs/0.2.3-acceptance.md) | 0.2.3 验收矩阵、真实项目回归与质量门证据 |
|
|
1344
|
+
| [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 与完整卷 |
|
|
1345
|
+
| [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 验收矩阵与质量门证据 |
|
|
1346
|
+
| [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 链路回执 |
|
|
1280
1347
|
| [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
1348
|
| [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
1349
|
| [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 长书可运行性与证据闭环方案(历史) |
|
package/briefs/P5.md
CHANGED
|
@@ -12,12 +12,33 @@
|
|
|
12
12
|
|
|
13
13
|
## 提交
|
|
14
14
|
|
|
15
|
-
调用 `novel_revise
|
|
15
|
+
调用 `novel_revise`,二选一:
|
|
16
|
+
|
|
17
|
+
**推荐:patch 模式**(只传改动,省 token):
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"chapter": 3,
|
|
22
|
+
"patch": {
|
|
23
|
+
"expected_hash": "任务书 fields.manuscript_hash 的值",
|
|
24
|
+
"edits": [{ "old_text": "原文里的唯一片段", "new_text": "替换后的片段" }]
|
|
25
|
+
},
|
|
26
|
+
"proof": { "opening": {}, "middle": {}, "ending": {} }
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
- `expected_hash` 必须是当前正文的 SHA-256;`fields.manuscript_hash` 就是它。
|
|
31
|
+
- `old_text` 默认必须在当前正文中唯一;重复出现时用 `occurrence` 指定第几次。
|
|
32
|
+
- 多处编辑不能重叠;hash 不匹配、锚点不唯一都会零写入拒绝。
|
|
33
|
+
|
|
34
|
+
**整章模式**:
|
|
16
35
|
|
|
17
36
|
- `content`:修订后的完整正文(不是 diff)。
|
|
18
37
|
- `summary`:如果事件、伏笔、资源有变化,同步更新;没变化可省略。**如果改动前两段/opening,必须同时提交新的 summary**,否则引擎会拒绝。
|
|
19
38
|
- `proof`:修订后正文的三个逐字引用(opening/middle/ending),每段至少 12 字;PG-09 会逐条回查,开头/结尾按实际段落判定,不能改写、编造或靠提交段落号挪动边界。
|
|
20
39
|
|
|
40
|
+
`ready_to_archive` 阶段也允许直接 `novel_revise`:正文会退回 P4 重新评审,不需要先 `novel_rollback`,也不会多写一份废稿快照。
|
|
41
|
+
|
|
21
42
|
## 常见返工原因
|
|
22
43
|
|
|
23
44
|
- 只改了措辞,没解决 issue 指出的信息缺口。
|