novel-writer-cli 0.0.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/LICENSE +21 -0
- package/README.md +103 -0
- package/agents/chapter-writer.md +142 -0
- package/agents/character-weaver.md +117 -0
- package/agents/consistency-auditor.md +85 -0
- package/agents/plot-architect.md +128 -0
- package/agents/quality-judge.md +232 -0
- package/agents/style-analyzer.md +109 -0
- package/agents/style-refiner.md +97 -0
- package/agents/summarizer.md +128 -0
- package/agents/world-builder.md +161 -0
- package/dist/__tests__/character-voice.test.js +445 -0
- package/dist/__tests__/commit-prototype-pollution.test.js +45 -0
- package/dist/__tests__/engagement.test.js +382 -0
- package/dist/__tests__/foreshadow-visibility.test.js +131 -0
- package/dist/__tests__/hook-ledger.test.js +1028 -0
- package/dist/__tests__/naming-lint.test.js +132 -0
- package/dist/__tests__/narrative-health-injection.test.js +359 -0
- package/dist/__tests__/next-step-prejudge-guardrails.test.js +325 -0
- package/dist/__tests__/next-step-title-fix.test.js +153 -0
- package/dist/__tests__/platform-profile.test.js +274 -0
- package/dist/__tests__/promise-ledger.test.js +189 -0
- package/dist/__tests__/readability-lint.test.js +209 -0
- package/dist/__tests__/text-utils.test.js +39 -0
- package/dist/__tests__/title-policy.test.js +147 -0
- package/dist/advance.js +75 -0
- package/dist/character-voice.js +805 -0
- package/dist/checkpoint.js +126 -0
- package/dist/cli.js +563 -0
- package/dist/cliche-lint.js +515 -0
- package/dist/commit.js +1460 -0
- package/dist/consistency-auditor.js +684 -0
- package/dist/engagement.js +687 -0
- package/dist/errors.js +7 -0
- package/dist/fingerprint.js +16 -0
- package/dist/foreshadow-visibility.js +214 -0
- package/dist/fs-utils.js +68 -0
- package/dist/hook-ledger.js +721 -0
- package/dist/hook-policy.js +107 -0
- package/dist/instruction-gates.js +51 -0
- package/dist/instructions.js +406 -0
- package/dist/latest-summary-loader.js +29 -0
- package/dist/lock.js +121 -0
- package/dist/naming-lint.js +531 -0
- package/dist/ner.js +73 -0
- package/dist/next-step.js +408 -0
- package/dist/novel-ask.js +270 -0
- package/dist/output.js +9 -0
- package/dist/platform-constraints.js +518 -0
- package/dist/platform-profile.js +325 -0
- package/dist/prejudge-guardrails.js +370 -0
- package/dist/project.js +40 -0
- package/dist/promise-ledger.js +723 -0
- package/dist/readability-lint.js +555 -0
- package/dist/safe-parse.js +36 -0
- package/dist/safe-path.js +29 -0
- package/dist/scoring-weights.js +290 -0
- package/dist/steps.js +60 -0
- package/dist/text-utils.js +18 -0
- package/dist/title-policy.js +251 -0
- package/dist/type-guards.js +6 -0
- package/dist/validate.js +131 -0
- package/docs/user/README.md +17 -0
- package/docs/user/guardrails.md +179 -0
- package/docs/user/interactive-gates.md +124 -0
- package/docs/user/novel-cli.md +289 -0
- package/docs/user/ops.md +123 -0
- package/docs/user/quick-start.md +97 -0
- package/docs/user/spec-system.md +166 -0
- package/docs/user/storylines.md +144 -0
- package/package.json +48 -0
- package/schemas/README.md +18 -0
- package/schemas/character-voice-drift.schema.json +135 -0
- package/schemas/character-voice-profiles.schema.json +141 -0
- package/schemas/engagement-metrics.schema.json +38 -0
- package/schemas/hook-ledger.schema.json +108 -0
- package/schemas/platform-profile.schema.json +235 -0
- package/schemas/promise-ledger.schema.json +97 -0
- package/scripts/calibrate-quality-judge.sh +91 -0
- package/scripts/compare-regression-runs.sh +86 -0
- package/scripts/lib/_common.py +131 -0
- package/scripts/lib/calibrate_quality_judge.py +312 -0
- package/scripts/lib/compare_regression_runs.py +142 -0
- package/scripts/lib/run_regression.py +621 -0
- package/scripts/lint-blacklist.sh +201 -0
- package/scripts/lint-cliche.sh +370 -0
- package/scripts/lint-readability.sh +404 -0
- package/scripts/query-foreshadow.sh +252 -0
- package/scripts/run-ner.sh +669 -0
- package/scripts/run-regression.sh +122 -0
- package/skills/cli-step/SKILL.md +158 -0
- package/skills/continue/SKILL.md +348 -0
- package/skills/continue/references/context-contracts.md +169 -0
- package/skills/continue/references/continuity-checks.md +187 -0
- package/skills/continue/references/file-protocols.md +64 -0
- package/skills/continue/references/foreshadowing.md +130 -0
- package/skills/continue/references/gate-decision.md +53 -0
- package/skills/continue/references/periodic-maintenance.md +46 -0
- package/skills/novel-writing/SKILL.md +77 -0
- package/skills/novel-writing/references/quality-rubric.md +140 -0
- package/skills/novel-writing/references/style-guide.md +145 -0
- package/skills/start/SKILL.md +458 -0
- package/skills/start/references/quality-review.md +86 -0
- package/skills/start/references/setting-update.md +44 -0
- package/skills/start/references/vol-planning.md +61 -0
- package/skills/start/references/vol-review.md +58 -0
- package/skills/status/SKILL.md +116 -0
- package/skills/status/references/sample-output.md +60 -0
- package/templates/ai-blacklist.json +79 -0
- package/templates/brief-template.md +46 -0
- package/templates/genre-weight-profiles.json +90 -0
- package/templates/novel-ask/example.answer.json +12 -0
- package/templates/novel-ask/example.question.json +51 -0
- package/templates/platform-profile.json +148 -0
- package/templates/style-profile-template.json +58 -0
- package/templates/web-novel-cliche-lint.json +41 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
# `novel` CLI(确定性编排核心)
|
|
2
|
+
|
|
3
|
+
`novel` CLI **不调用任何 LLM API**。它只负责:
|
|
4
|
+
|
|
5
|
+
- 读取 `.checkpoint.json` 和 `staging/**` 计算确定性的下一步(可中断/可恢复)
|
|
6
|
+
- 生成 instruction packet(JSON),作为“编排 → 执行器(Claude Code / Codex)”的稳定边界
|
|
7
|
+
- 校验 `staging/**` 产物(validate)并推进 checkpoint(advance)
|
|
8
|
+
- 将 `staging/**` 事务提交到正式目录(commit),并更新 `state/` 与 `foreshadowing/`
|
|
9
|
+
|
|
10
|
+
## 全局选项
|
|
11
|
+
|
|
12
|
+
- `--project <dir>`:指定小说项目根目录(默认从当前目录向上查找 `.checkpoint.json`)
|
|
13
|
+
- `--json`:输出单个 JSON 对象(便于执行器/脚本消费);不加时为人类可读输出
|
|
14
|
+
|
|
15
|
+
## 命令速览
|
|
16
|
+
|
|
17
|
+
| 命令 | 用途 |
|
|
18
|
+
|------|------|
|
|
19
|
+
| `novel status` | 查看 checkpoint / lock / next(只读) |
|
|
20
|
+
| `novel next` | 计算确定性的下一步 step id |
|
|
21
|
+
| `novel instructions <step>` | 输出 instruction packet(JSON) |
|
|
22
|
+
| `novel validate <step>` | 校验 step 产物是否齐全/合规 |
|
|
23
|
+
| `novel advance <step>` | 校验通过后推进 checkpoint |
|
|
24
|
+
| `novel commit --chapter N` | 提交 staging 事务到正式目录(写入) |
|
|
25
|
+
| `novel lock status/clear` | 查看/清理写入锁(解决中断导致的 stale lock) |
|
|
26
|
+
| `novel promises init/report` | 承诺台账:初始化与窗口报告 |
|
|
27
|
+
| `novel engagement report` | 参与度密度:窗口报告 |
|
|
28
|
+
| `novel voice init/check` | 角色语气画像 + 漂移检测 |
|
|
29
|
+
|
|
30
|
+
## 安装(npm)
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm i -g novel-writer-cli
|
|
34
|
+
novel --help
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
或一次性运行:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npx novel-writer-cli --help
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 开发态运行(本仓库)
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# 帮助
|
|
47
|
+
npm run dev -- --help
|
|
48
|
+
|
|
49
|
+
# 或构建后运行
|
|
50
|
+
npm run build
|
|
51
|
+
node dist/cli.js --help
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 最短路径:跑通“一章的确定性编排”
|
|
55
|
+
|
|
56
|
+
以下示例假设你已在**小说项目根目录**(含 `.checkpoint.json`),或使用 `--project <dir>` 指定根目录。
|
|
57
|
+
|
|
58
|
+
### 1) 计算下一步
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
novel next
|
|
62
|
+
# 或:novel next --json
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
输出类似:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
chapter:003:draft
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 2) 获取 instruction packet
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
novel instructions "chapter:003:draft" --json
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
可选:落盘到 `staging/manifests/`(便于审计/回放):
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
novel instructions "chapter:003:draft" --json --write-manifest
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
可选:为执行器提供少量内嵌内容(当前仅支持 `brief` 模式,注入 `brief.md` 的前 2000 字预览)。使用该选项后 `packet.manifest.mode` 会变为 `paths+embed`,并携带 `packet.manifest.embed.brief_preview`:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
novel instructions "chapter:003:draft" --json --write-manifest --embed brief
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 3) 用执行器跑这一步(Claude Code / Codex)
|
|
90
|
+
|
|
91
|
+
执行器读取 instruction packet:
|
|
92
|
+
|
|
93
|
+
- `packet.agent.name`:要运行的 subagent(如 `chapter-writer`)
|
|
94
|
+
- `packet.manifest`:context manifest(以路径为主)
|
|
95
|
+
- `packet.expected_outputs[]`:该步必须写入的 `staging/**` 目标文件
|
|
96
|
+
|
|
97
|
+
可选:若 packet 同时包含 `novel_ask` + `answer_path`,则该 step 在执行 agent 之前存在一个**交互式 gate**:
|
|
98
|
+
|
|
99
|
+
- 执行器必须先采集答案并写入 AnswerSpec JSON 到 `answer_path`(并通过校验),才允许继续执行 agent
|
|
100
|
+
- 若 `answer_path` 已存在且校验通过,则直接跳过提问(可恢复/可审计)
|
|
101
|
+
|
|
102
|
+
详见 [交互式门控(NOVEL_ASK)](interactive-gates.md)。
|
|
103
|
+
|
|
104
|
+
执行器跑完后应回到终端断点(不要自动 commit)。
|
|
105
|
+
|
|
106
|
+
### 4) 校验并推进 checkpoint
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
novel validate "chapter:003:draft"
|
|
110
|
+
novel advance "chapter:003:draft"
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
然后再次运行:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
novel next
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
它会基于 `.checkpoint.json.pipeline_stage` + `inflight_chapter` + `staging/**` 的存在性,返回确定性的下一步(例如 `chapter:003:summarize`)。
|
|
120
|
+
|
|
121
|
+
### 5) 提交事务(commit)
|
|
122
|
+
|
|
123
|
+
当 `novel next` 返回 `chapter:003:commit` 时:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
novel commit --chapter 3
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
可先看计划但不落盘:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
novel commit --chapter 3 --dry-run
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
commit 会执行(见 PRD §10.4):
|
|
136
|
+
|
|
137
|
+
- 移动 staging 产物到正式目录:`chapters/`、`summaries/`、`evaluations/`、`storylines/`、`state/`
|
|
138
|
+
- 合并 `staging/state/chapter-XXX-delta.json` → `state/current-state.json`(并 append `state/changelog.jsonl`)
|
|
139
|
+
- 从 delta 的 `foreshadow` ops 更新 `foreshadowing/global.json`
|
|
140
|
+
- 更新 `.checkpoint.json`:`last_completed_chapter`、`pipeline_stage="committed"`、`inflight_chapter=null`
|
|
141
|
+
|
|
142
|
+
## `status`:快速查看项目状态(只读)
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
novel status
|
|
146
|
+
# 或:novel status --json
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
输出包含:checkpoint 摘要、lock 状态、以及当前 `novel next` 会返回的下一步。
|
|
150
|
+
|
|
151
|
+
## `lock`:写入锁(解决并发与中断残留)
|
|
152
|
+
|
|
153
|
+
`novel` 在需要写入项目文件时会使用项目根目录下的 `.novel.lock/` 目录作为写入锁(防止多个会话同时写导致状态损坏)。
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
# 查看锁状态
|
|
157
|
+
novel lock status
|
|
158
|
+
|
|
159
|
+
# 清理 stale lock(默认 >30min 视为 stale;活跃锁会拒绝清理)
|
|
160
|
+
novel lock clear
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
> 常见场景:执行器在写入阶段中断(断电/kill/异常退出),留下 stale lock;此时可先 `novel lock status` 确认,再执行 `novel lock clear`。
|
|
164
|
+
|
|
165
|
+
## 角色语气漂移(M7H.3,可选)
|
|
166
|
+
|
|
167
|
+
角色语气漂移用于:为关键角色建立“台词基线画像”,并在后续章节检测偏移,生成纠偏指令 `character-voice-drift.json`,直到恢复为止(自动清除)。
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# 初始化基线画像(建议在 quick-start 章节后)
|
|
171
|
+
novel voice init --protagonist <character_id> --core-cast a,b,c --apply
|
|
172
|
+
|
|
173
|
+
# 若 character-voice-profiles.json 已存在:用 --force --apply 覆盖(--force 仅在 --apply 时生效)
|
|
174
|
+
novel voice init --protagonist <character_id> --core-cast a,b,c --force --apply
|
|
175
|
+
|
|
176
|
+
# 手动检测/更新漂移文件(预览:不写文件;加 --apply 则写/清理)
|
|
177
|
+
novel voice check --apply
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
一旦存在 `character-voice-drift.json`,后续 `chapter:*:draft` / `chapter:*:refine` 的 instruction packet 会自动注入纠偏指令(`packet.manifest.inline.character_voice_drift` + `packet.manifest.paths.character_voice_drift`)。
|
|
181
|
+
|
|
182
|
+
## 长周期承诺台账(M7H.1,可选)
|
|
183
|
+
|
|
184
|
+
承诺台账用于跟踪跨章/跨卷的“卖点/谜团/机制/关系弧”等长周期承诺,避免长时间不触碰导致读者遗忘。
|
|
185
|
+
|
|
186
|
+
- 台账文件:`promise-ledger.json`(schema:`schemas/promise-ledger.schema.json`)
|
|
187
|
+
- 窗口报告:`logs/promises/latest.json`(可选 history:`logs/promises/promise-ledger-report-vol-{V:02d}-ch{start:03d}-ch{end:03d}.json`)
|
|
188
|
+
|
|
189
|
+
常用命令:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# 预览 seed(不写文件;用 --json 查看)
|
|
193
|
+
novel promises init --json
|
|
194
|
+
|
|
195
|
+
# 写入 promise-ledger.json(可选 --max-recent-summaries <n> 控制参考摘要数量)
|
|
196
|
+
novel promises init --apply
|
|
197
|
+
|
|
198
|
+
# 生成窗口报告(默认 scope=最近 10 章,展示 top 5 条待唤醒承诺;加 --history 同时写入 history 文件)
|
|
199
|
+
# 前提:需先执行 novel promises init --apply 生成台账
|
|
200
|
+
novel promises report --history
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
> `promise-ledger.json` 是用户可维护的台账;窗口报告是基于台账计算得到的“可执行建议”,用于规划/写作时参考(默认仅提示 / 不参与 blocking 判定)。
|
|
204
|
+
|
|
205
|
+
## 参与度密度指标(M7H.2,可选)
|
|
206
|
+
|
|
207
|
+
参与度密度用于对“推进/冲突/奖励/信息投放”的节奏做可度量的窗口化检查,避免连续多章低密度导致掉线。
|
|
208
|
+
|
|
209
|
+
- 指标流:`engagement-metrics.jsonl`(由 `novel commit` 每章自动 append 一条记录;schema:`schemas/engagement-metrics.schema.json`)
|
|
210
|
+
- 窗口报告:`logs/engagement/latest.json`(可选 history:`logs/engagement/engagement-report-vol-{V:02d}-ch{start:03d}-ch{end:03d}.json`)
|
|
211
|
+
|
|
212
|
+
常用命令:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
# 生成窗口报告(若 engagement-metrics.jsonl 缺失会给出 WARN,并写入一个空指标报告)
|
|
216
|
+
# 指标流由 novel commit 自动填充,首次 commit 后即可使用
|
|
217
|
+
novel engagement report --history
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## 审计节奏与“非阻断”语义(M7H.4,可选)
|
|
221
|
+
|
|
222
|
+
默认情况下,叙事健康相关输出都是 **best-effort**:
|
|
223
|
+
|
|
224
|
+
- `novel commit` 每章都会 append `engagement-metrics.jsonl`(如可计算)
|
|
225
|
+
- `logs/engagement/latest.json` 与 `logs/promises/latest.json` 默认按**周期性审计**维护(每 10 章 + 卷末),并且不会因为这些审计维护失败而阻断 `novel commit`(失败时只产生 WARN)
|
|
226
|
+
|
|
227
|
+
在 `chapter:*:draft` / `chapter:*:refine` 的 instruction packet 中,上述报告在可用时会以 `engagement_report_summary` / `promise_ledger_report_summary`(以及 `*_degraded`)的形式被裁剪注入,供写作/润色参考。
|
|
228
|
+
|
|
229
|
+
> 因此注入到 instruction packet 的 `*_report_summary` 在非审计章之间可能会滞后;把它视为“近期窗口提示”,而不是每章实时信号。
|
|
230
|
+
|
|
231
|
+
## Engagement/Promises:advisory warnings vs Guardrails blocking(默认仅提示)
|
|
232
|
+
|
|
233
|
+
Engagement/Promises 报告的 `issues[]` 目前仅用于节奏提示(`issues[].severity` 仅为 `warn`),不会影响 `novel next` 的 step 选择,也不会让 `novel commit` 因此失败。
|
|
234
|
+
|
|
235
|
+
会触发 `...:title-fix` / `...:review` 等人工步骤的是 Guardrails 的 blocking 判定(见 [Guardrails(留存 / 可读性 / 命名)](guardrails.md));`...:hook-fix` 来自 `platform-profile.json.hook_policy`(见 [规范体系](spec-system.md))。
|
|
236
|
+
|
|
237
|
+
## 中断恢复示例
|
|
238
|
+
|
|
239
|
+
场景:你在 `chapter:048:draft` 后中断了执行器。
|
|
240
|
+
|
|
241
|
+
1) 重新进入项目目录后直接运行:
|
|
242
|
+
```bash
|
|
243
|
+
novel next
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
2) 若 `staging/chapters/chapter-048.md` 不存在,会回到:
|
|
247
|
+
```
|
|
248
|
+
chapter:048:draft
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
3) 若章节已写到 staging,但 summary/delta/crossref 不完整,会返回:
|
|
252
|
+
```
|
|
253
|
+
chapter:048:summarize
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
4) 若已 refined 但 eval 缺失,通常会返回:
|
|
257
|
+
```
|
|
258
|
+
chapter:048:judge
|
|
259
|
+
```
|
|
260
|
+
(若启用 `platform-profile.json.retention.title_policy.enabled=true`:当 `auto_fix=true` 时可能先返回 `chapter:048:title-fix`;当 `auto_fix=false` 且存在 hard 违规则可能返回 `chapter:048:review`。)
|
|
261
|
+
|
|
262
|
+
5) 若 eval 已存在,通常会返回:
|
|
263
|
+
```
|
|
264
|
+
chapter:048:commit
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
但当启用 `platform-profile.json.retention.title_policy.enabled=true` 且 `platform-profile.json.retention.title_policy.auto_fix=true` 且标题缺失/不合规时,可能改为返回:
|
|
268
|
+
```
|
|
269
|
+
chapter:048:title-fix
|
|
270
|
+
```
|
|
271
|
+
(自动一次:只允许修改**标题行**,正文必须 byte-identical;若仍不满足则返回 `chapter:048:review` 进入人工处理)。
|
|
272
|
+
|
|
273
|
+
当启用 `platform-profile.json.hook_policy.required=true` 且章末钩子缺失/偏弱时,可能改为返回:
|
|
274
|
+
```
|
|
275
|
+
chapter:048:hook-fix
|
|
276
|
+
```
|
|
277
|
+
(自动一次,且只允许修改最后 1–2 段),若仍不满足 hook 门槛则返回:
|
|
278
|
+
```
|
|
279
|
+
chapter:048:review
|
|
280
|
+
```
|
|
281
|
+
(人工处理后再重新 judge/commit)。
|
|
282
|
+
|
|
283
|
+
> 这使得你可以在任何时刻中断并恢复:只要 `.checkpoint.json` 和 `staging/**` 未被破坏,`novel next` 就能给出确定性的下一步。
|
|
284
|
+
|
|
285
|
+
## 平台画像与动态评分(M6)
|
|
286
|
+
|
|
287
|
+
- `platform-profile.json`:平台画像/约束配置(字数/合规/信息负载/钩子策略/评分策略)。`platform` 与 `scoring.genre_drive_type` 一旦写入视为该项目的不可变绑定;若要更换平台/驱动类型,建议新建项目目录重新初始化。
|
|
288
|
+
- `genre-weight-profiles.json`:质量评分动态权重库;QualityJudge 的权重以 instruction packet JSON 的 `manifest.inline.scoring_weights` 为准(由 `platform-profile.json.scoring` + `genre-weight-profiles.json` 计算得到;commit 后也会写入 `evaluations/*-eval.json.scoring_weights`)。
|
|
289
|
+
- 当 `platform-profile.json.hook_policy.required=true` 时,QualityJudge 会额外输出 `hook_strength`(章末钩子强度),并且 `novel next` 在必要时会插入 `hook-fix` 微步骤来补强章末钩子。
|
package/docs/user/ops.md
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# 常用操作
|
|
2
|
+
|
|
3
|
+
项目创建后的日常操作指南。
|
|
4
|
+
|
|
5
|
+
> 本文描述的是 Claude Code Skill 入口(`/novel:*`)。这些入口会在底层调用 `novel` CLI,并通过执行器运行各 subagent。纯 CLI 编排参考见 [`novel` CLI](novel-cli.md)。
|
|
6
|
+
|
|
7
|
+
## 续写下一章
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
/novel:continue
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
默认续写 1 章。每章经过完整流水线:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
ChapterWriter(初稿)→ Summarizer(摘要)→ StyleRefiner(润色)→ QualityJudge(评分)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
评分 ≥4.0 自动通过;3.5-3.9 二次润色;3.0-3.4 自动修订(最多 2 次);2.0-2.9 暂停人工审核;<2.0 强制重写。
|
|
20
|
+
|
|
21
|
+
批量续写多章:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
/novel:continue 3
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
建议单次不超过 5 章。
|
|
28
|
+
|
|
29
|
+
## 查看项目状态
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
/novel:status
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
输出当前进度、评分趋势、伏笔追踪、故事线节奏、成本统计。纯只读,不修改任何文件。
|
|
36
|
+
|
|
37
|
+
## 规划新卷
|
|
38
|
+
|
|
39
|
+
当一卷写完(或首次进入卷规划)时,运行:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
/novel:start
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
系统检测到 `VOL_PLANNING` 状态后,自动推荐「规划本卷」。PlotArchitect 会生成:
|
|
46
|
+
|
|
47
|
+
- 本卷大纲(每章关键事件 + 故事线分配)
|
|
48
|
+
- 故事线调度(主线/副线/调味线的出场安排)
|
|
49
|
+
- 章节契约(每章的前置/后置条件)
|
|
50
|
+
- 伏笔计划(本卷要埋设和回收的伏笔)
|
|
51
|
+
|
|
52
|
+
生成后系统会让你审核,确认后进入写作循环。
|
|
53
|
+
|
|
54
|
+
## 卷末回顾
|
|
55
|
+
|
|
56
|
+
一卷写完后,运行 `/novel:start` 并选择「卷末回顾」:
|
|
57
|
+
|
|
58
|
+
- 全卷质量趋势(均分、低分章节)
|
|
59
|
+
- NER 一致性报告(人名/地名/时间线矛盾)
|
|
60
|
+
- 伏笔完成度(计划 vs 实际、超期短伏笔)
|
|
61
|
+
- 故事线节奏(出场频率、休眠线提醒)
|
|
62
|
+
- 桥梁检查(跨故事线的伏笔是否断链)
|
|
63
|
+
|
|
64
|
+
回顾完成后自动进入下卷规划。
|
|
65
|
+
|
|
66
|
+
## 质量回顾
|
|
67
|
+
|
|
68
|
+
随时可以查看近期写作质量:
|
|
69
|
+
|
|
70
|
+
运行 `/novel:start` 并选择「质量回顾」:
|
|
71
|
+
|
|
72
|
+
- 近 10 章评分趋势
|
|
73
|
+
- 低分章节列表
|
|
74
|
+
- 修订率统计
|
|
75
|
+
- 风格漂移检测
|
|
76
|
+
- AI 黑名单命中率
|
|
77
|
+
|
|
78
|
+
## 更新设定
|
|
79
|
+
|
|
80
|
+
写作中途需要修改世界观或角色时:
|
|
81
|
+
|
|
82
|
+
运行 `/novel:start` 并选择「更新设定」:
|
|
83
|
+
|
|
84
|
+
- 选择更新类型(世界观 / 角色 / 关系)
|
|
85
|
+
- 系统自动做变更前快照
|
|
86
|
+
- WorldBuilder 或 CharacterWeaver 执行增量更新
|
|
87
|
+
- 输出变更传播摘要(哪些契约受影响)
|
|
88
|
+
|
|
89
|
+
> 角色退场有三重保护检查,不会意外删除仍在活跃的角色。
|
|
90
|
+
>
|
|
91
|
+
> **注意**:更新设定不会修改 `platform-profile.json`(`platform` 与 `scoring.genre_drive_type` 为不可变绑定)。如需更换平台或驱动类型,建议新建项目目录重新初始化。
|
|
92
|
+
|
|
93
|
+
## 导入研究资料
|
|
94
|
+
|
|
95
|
+
如果你用 doc-workflow 做过背景研究,可以导入:
|
|
96
|
+
|
|
97
|
+
运行 `/novel:start` 并选择「导入研究资料」:
|
|
98
|
+
|
|
99
|
+
- 系统扫描 `docs/dr-workflow/` 目录
|
|
100
|
+
- 展示可导入的研究成果列表
|
|
101
|
+
- 选择后复制到 `research/` 目录
|
|
102
|
+
- 下次 WorldBuilder/CharacterWeaver 执行时自动引用
|
|
103
|
+
|
|
104
|
+
也可以手动将 `.md` 文件放入 `research/` 目录。
|
|
105
|
+
|
|
106
|
+
## 断点续写
|
|
107
|
+
|
|
108
|
+
如果写作中途断开:
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
/novel:start
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
系统自动检测中断状态,推荐恢复操作。中断恢复是幂等的——不会重复生成已完成的内容。
|
|
115
|
+
|
|
116
|
+
## 命令速查
|
|
117
|
+
|
|
118
|
+
| 命令 | 作用 |
|
|
119
|
+
|------|------|
|
|
120
|
+
| `/novel:start` | 主入口:创建项目 / 规划卷 / 回顾 / 更新设定 |
|
|
121
|
+
| `/novel:continue` | 续写下一章 |
|
|
122
|
+
| `/novel:continue N` | 批量续写 N 章 |
|
|
123
|
+
| `/novel:status` | 查看项目状态(只读) |
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# 快速起步指南
|
|
2
|
+
|
|
3
|
+
30 分钟内创建项目并试写 3 章。
|
|
4
|
+
|
|
5
|
+
> 本指南以 Claude Code 的 Skill 入口(`/novel:start` 等)为主;底层会调用 `novel` CLI 并运行各 subagent。若你只想手动跑 CLI 编排,见 [`novel` CLI](novel-cli.md)。
|
|
6
|
+
|
|
7
|
+
## 准备
|
|
8
|
+
|
|
9
|
+
- 安装 Claude Code CLI
|
|
10
|
+
- 安装 `novel` CLI:`npm i -g novel-writer-cli`(或使用开发态 `node dist/cli.js`)
|
|
11
|
+
- 准备一个空目录作为项目根目录
|
|
12
|
+
- (可选)准备 1-3 章自己写的文字作为风格样本
|
|
13
|
+
|
|
14
|
+
## Step 1: 创建项目
|
|
15
|
+
|
|
16
|
+
在空目录下运行:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
/novel:start
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
系统检测到空目录后,提示「创建新项目」。选择后进入信息收集:
|
|
23
|
+
|
|
24
|
+
1. **题材**:玄幻 / 都市 / 科幻 / 历史 / 悬疑 等
|
|
25
|
+
2. **主角概念**:一句话描述——谁 + 起始处境
|
|
26
|
+
3. **核心冲突**:一句话描述——主角要克服什么
|
|
27
|
+
4. **平台画像**:确认发布平台与叙事驱动类型(`genre_drive_type`),用于生成 `platform-profile.json` + `genre-weight-profiles.json`
|
|
28
|
+
|
|
29
|
+
> 第 1-3 项在同一轮交互中完成;平台画像(平台 + `genre_drive_type`)会在后续 gate 中确认,写入 `platform-profile.json` 后不会重复追问/覆盖。
|
|
30
|
+
>
|
|
31
|
+
> `platform-profile.json.platform` 与 `platform-profile.json.scoring.genre_drive_type` 一旦写入视为该项目的不可变绑定;若要更换平台/驱动类型,建议新建项目目录重新初始化。
|
|
32
|
+
|
|
33
|
+
## Step 2: 选择风格来源
|
|
34
|
+
|
|
35
|
+
系统会问你风格从哪来,4 个选项:
|
|
36
|
+
|
|
37
|
+
| 选项 | 适用场景 |
|
|
38
|
+
|------|----------|
|
|
39
|
+
| 提供原创样本 | 你有自己写过的章节(推荐) |
|
|
40
|
+
| 指定参考作者 | 想模仿某位网文作者的风格 |
|
|
41
|
+
| 使用预置模板 | 没有样本,先选一个通用模板 |
|
|
42
|
+
| 先写后提 | 什么都没有,让系统先写 3 章再回提风格 |
|
|
43
|
+
|
|
44
|
+
选「提供原创样本」效果最好——粘贴 1-3 章即可。没有样本也没关系,选后两个选项系统会自动降级处理。
|
|
45
|
+
|
|
46
|
+
## Step 3: 等待初始化
|
|
47
|
+
|
|
48
|
+
系统自动完成以下步骤(无需你操作):
|
|
49
|
+
|
|
50
|
+
1. WorldBuilder 生成精简世界观设定(≤3 条核心规则)
|
|
51
|
+
2. CharacterWeaver 创建主角和核心配角
|
|
52
|
+
3. 初始化 1 条主线故事线
|
|
53
|
+
4. StyleAnalyzer 提取风格指纹(若提供了样本)
|
|
54
|
+
|
|
55
|
+
## Step 4: 试写 3 章
|
|
56
|
+
|
|
57
|
+
系统自动执行 3 轮写作流水线:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
ChapterWriter → Summarizer → StyleRefiner → QualityJudge
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
每章完成后你能看到:章节标题、字数、质量评分。
|
|
64
|
+
|
|
65
|
+
## Step 5: 确认下一步
|
|
66
|
+
|
|
67
|
+
试写完成后,系统给出 3 个选项:
|
|
68
|
+
|
|
69
|
+
1. **进入卷规划**(推荐)— 规划第 1 卷大纲,正式开始
|
|
70
|
+
2. **调整风格设定** — 重新提供样本或修改参数
|
|
71
|
+
3. **重新试写** — 清除结果重来
|
|
72
|
+
|
|
73
|
+
选「进入卷规划」后,项目进入正式创作流程。
|
|
74
|
+
|
|
75
|
+
## 中断恢复
|
|
76
|
+
|
|
77
|
+
如果中途断开(网络问题、关闭终端等),重新运行:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
/novel:start
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
系统会自动检测到未完成的快速起步,从中断的步骤继续。不会丢失已生成的内容。
|
|
84
|
+
|
|
85
|
+
## 常见问题
|
|
86
|
+
|
|
87
|
+
**Q: 试写 3 章的评分很低怎么办?**
|
|
88
|
+
A: 选「调整风格设定」补充更好的样本,或选「重新试写」。试写阶段不影响正式创作。
|
|
89
|
+
|
|
90
|
+
**Q: 可以跳过试写直接开始吗?**
|
|
91
|
+
A: 不建议。试写 3 章是为了验证设定和风格是否合理,也为后续写作积累 context。
|
|
92
|
+
|
|
93
|
+
**Q: 创建项目后怎么继续写?**
|
|
94
|
+
A: 完成卷规划后,用 `/novel:continue` 逐章续写。详见 [常用操作](ops.md)。
|
|
95
|
+
|
|
96
|
+
**Q: 项目目录里生成了哪些文件?**
|
|
97
|
+
A: 核心文件包括 `brief.md`(创作纲领)、`world/`(世界观)、`characters/`(角色)、`style-profile.json`(风格指纹)、`chapters/`(章节正文)。详见 [规范体系](spec-system.md)。
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# 规范体系
|
|
2
|
+
|
|
3
|
+
本系统用 4 层规范驱动写作,确保长篇小说在数百章后仍保持一致性。
|
|
4
|
+
|
|
5
|
+
## 四层规范概览
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
L1 世界规则 → 硬约束,不可违反(类似编译错误)
|
|
9
|
+
L2 角色契约 → 能力/行为边界,变更需走协议
|
|
10
|
+
L3 章节契约 → 每章的前置/后置条件(类似函数签名)
|
|
11
|
+
LS 故事线规范 → 多线叙事约束(防串线、控节奏)
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## L1 世界规则
|
|
15
|
+
|
|
16
|
+
**文件**:`world/rules.json`
|
|
17
|
+
**生成者**:WorldBuilder
|
|
18
|
+
|
|
19
|
+
每条规则标注 `hard`(不可违反)或 `soft`(可有例外但需说明理由):
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"id": "W-001",
|
|
24
|
+
"category": "magic_system",
|
|
25
|
+
"rule": "修炼者突破金丹期必须经历雷劫",
|
|
26
|
+
"constraint_type": "hard",
|
|
27
|
+
"exceptions": []
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
快速起步阶段只生成 ≤3 条核心 hard 规则,后续卷规划时按需扩展。
|
|
32
|
+
|
|
33
|
+
ChapterWriter 收到 hard 规则时会以禁止项注入:违反即自动拒绝。
|
|
34
|
+
|
|
35
|
+
## L2 角色契约
|
|
36
|
+
|
|
37
|
+
**文件**:`characters/active/*.json`
|
|
38
|
+
**生成者**:CharacterWeaver
|
|
39
|
+
|
|
40
|
+
定义每个角色的能力边界和行为模式:
|
|
41
|
+
|
|
42
|
+
- 能力上限(不能做什么)
|
|
43
|
+
- 性格底线(绝不会做的事)
|
|
44
|
+
- 关系约束(敌友关系不可突变)
|
|
45
|
+
- 成长轨迹(从 A 到 B 需要什么条件)
|
|
46
|
+
|
|
47
|
+
角色退场有三重保护:活跃伏笔检查 → 故事线依赖检查 → 用户确认。
|
|
48
|
+
|
|
49
|
+
## L3 章节契约
|
|
50
|
+
|
|
51
|
+
**文件**:`volumes/vol-XX/chapter-contracts/chapter-XXX.json`
|
|
52
|
+
**生成者**:PlotArchitect(卷规划阶段)
|
|
53
|
+
|
|
54
|
+
每章的前置条件(写之前必须满足什么)和后置条件(写完后必须达成什么):
|
|
55
|
+
|
|
56
|
+
- 继承哪条故事线
|
|
57
|
+
- 必须推进的情节点
|
|
58
|
+
- 必须出场的角色
|
|
59
|
+
- 伏笔埋设/回收要求
|
|
60
|
+
- 状态变更预期
|
|
61
|
+
|
|
62
|
+
QualityJudge 验收时逐条检查章节契约的达成情况。
|
|
63
|
+
|
|
64
|
+
## LS 故事线规范
|
|
65
|
+
|
|
66
|
+
**文件**:`storylines/storyline-spec.json`
|
|
67
|
+
**规则编号**:LS-001 ~ LS-005
|
|
68
|
+
|
|
69
|
+
5 条核心故事线规则:
|
|
70
|
+
|
|
71
|
+
| 规则 | 说明 |
|
|
72
|
+
|------|------|
|
|
73
|
+
| LS-001 | 故事线 ID 一经定义不可重命名 |
|
|
74
|
+
| LS-002 | 同时活跃故事线 ≤4 条 |
|
|
75
|
+
| LS-003 | 交汇事件必须按 schedule 在指定范围内完成 |
|
|
76
|
+
| LS-004 | 副线最小出场频率(如每 8 章至少 1 次) |
|
|
77
|
+
| LS-005 | 跨线实体不可泄漏(A 线的秘密不能无故出现在 B 线) |
|
|
78
|
+
|
|
79
|
+
详见 [多线叙事指南](storylines.md)。
|
|
80
|
+
|
|
81
|
+
## 质量门控
|
|
82
|
+
|
|
83
|
+
QualityJudge 采用双轨验收:
|
|
84
|
+
|
|
85
|
+
1. **合规检查**(硬门槛):L1/L2/L3/LS 逐条校验,有 high-confidence 违规即强制修订
|
|
86
|
+
2. **质量评分**(软评估):8 维度加权评分
|
|
87
|
+
|
|
88
|
+
> **注意(动态权重)**:实际评分权重以 `platform-profile.json.scoring` + `genre-weight-profiles.json` 计算得到的 instruction packet JSON 的 `manifest.inline.scoring_weights` 为准(commit 后也会写入 `evaluations/*-eval.json.scoring_weights`);下表仅为 **legacy fallback 默认值**(当未提供 `scoring_weights` 时使用)。
|
|
89
|
+
>
|
|
90
|
+
> 当 `platform-profile.json.hook_policy.required=true` 时,会额外启用 **章末钩子强度**(`hook_strength`,1–5 分)维度;若低于 `hook_policy.min_strength`,`novel next` 可能返回 `chapter:NNN:hook-fix`(只改章末 1–2 段;最多一次)或 `...:review`。未启用时该维度权重为 0,不影响综合分。
|
|
91
|
+
>
|
|
92
|
+
> 若项目存在 `platform-profile.json.scoring`,但缺失 `genre-weight-profiles.json`,则质量评估/commit 会报错并提示你从 `templates/genre-weight-profiles.json` 恢复(这是动态权重的必需输入)。
|
|
93
|
+
|
|
94
|
+
| 维度 | 权重 |
|
|
95
|
+
|------|------|
|
|
96
|
+
| 情节逻辑 | 18% |
|
|
97
|
+
| 角色塑造 | 18% |
|
|
98
|
+
| 沉浸感 | 15% |
|
|
99
|
+
| 风格自然度 | 15% |
|
|
100
|
+
| 伏笔处理 | 10% |
|
|
101
|
+
| 节奏 | 8% |
|
|
102
|
+
| 情感冲击 | 8% |
|
|
103
|
+
| 故事线连贯 | 8% |
|
|
104
|
+
|
|
105
|
+
评分阈值:≥4.0 通过,3.5-3.9 二次润色,3.0-3.4 自动修订,2.0-2.9 人工审核,<2.0 强制重写。
|
|
106
|
+
|
|
107
|
+
## 文件结构
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
project/
|
|
111
|
+
├── brief.md 创作纲领
|
|
112
|
+
├── .checkpoint.json 进度快照
|
|
113
|
+
├── style-profile.json 风格指纹
|
|
114
|
+
├── ai-blacklist.json AI 用语黑名单
|
|
115
|
+
├── platform-profile.json 平台画像/约束配置(平台绑定不可变)
|
|
116
|
+
├── genre-weight-profiles.json QualityJudge 动态权重配置
|
|
117
|
+
├── web-novel-cliche-lint.json (可选)网文套路词 / 模板腔 lint 词库
|
|
118
|
+
├── world/
|
|
119
|
+
│ ├── geography.md 地理设定
|
|
120
|
+
│ ├── history.md 历史背景
|
|
121
|
+
│ ├── rules.md 规则叙述
|
|
122
|
+
│ ├── rules.json L1 结构化规则
|
|
123
|
+
│ └── changelog.md 变更记录
|
|
124
|
+
├── characters/
|
|
125
|
+
│ └── active/ 活跃角色档案 + L2 契约
|
|
126
|
+
├── storylines/
|
|
127
|
+
│ ├── storylines.json 故事线定义
|
|
128
|
+
│ ├── storyline-spec.json LS 规范
|
|
129
|
+
│ └── {id}/memory.md 各线记忆文件
|
|
130
|
+
├── volumes/vol-XX/
|
|
131
|
+
│ ├── outline.md 卷大纲
|
|
132
|
+
│ ├── storyline-schedule.json 故事线调度
|
|
133
|
+
│ ├── foreshadowing.json 伏笔计划
|
|
134
|
+
│ └── chapter-contracts/ L3 章节契约
|
|
135
|
+
├── chapters/ 章节正文
|
|
136
|
+
├── summaries/ 章节摘要
|
|
137
|
+
├── evaluations/ 质量评估
|
|
138
|
+
├── foreshadowing/global.json 伏笔全局索引
|
|
139
|
+
├── state/current-state.json 世界状态快照
|
|
140
|
+
└── logs/ 流水线日志
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 平台画像与不可变绑定
|
|
144
|
+
|
|
145
|
+
`platform-profile.json` 在项目初始化时生成,用于约束字数/信息负载/合规策略/章末钩子策略,并提供 QualityJudge 的动态权重输入(`scoring`)。
|
|
146
|
+
其中 `platform-profile.json.platform`(以及对应的叙事驱动类型 `scoring.genre_drive_type`)一旦写入,系统视为该项目的**不可变绑定**:后续不会被“更新设定”等操作改写。若要更换平台/驱动类型,建议新建项目目录重新初始化。
|
|
147
|
+
|
|
148
|
+
`web-novel-cliche-lint.json` 为可选文件:缺失时 cliché lint 会降级跳过(不阻断流水线)。启用后三级 severity 行为如下:
|
|
149
|
+
|
|
150
|
+
| severity | 行为 |
|
|
151
|
+
|----------|------|
|
|
152
|
+
| `warn` | 仅在日志中提示,不影响评分或流水线 |
|
|
153
|
+
| `soft` | 作为评分信号降低 `style_naturalness` 维度得分,不阻断 commit |
|
|
154
|
+
| `hard` | 阻断 `novel commit`,必须修改后重新提交 |
|
|
155
|
+
|
|
156
|
+
需要启用时可从 `templates/web-novel-cliche-lint.json` 复制到项目根目录并按需微调。当前 cliché lint 由 `scripts/lint-cliche.sh` 脚本执行(通过 `platform-profile.json.compliance.script_paths.lint_cliche` 配置),尚未作为 Agent context manifest 的内联输入注入。
|
|
157
|
+
|
|
158
|
+
### Guardrails(留存 / 可读性 / 命名)
|
|
159
|
+
|
|
160
|
+
`platform-profile.json` 还包含一组可选的 Guardrails 配置(可逐项启用/关闭),并在 `novel next`/`novel commit` 阶段产出可审计报告:
|
|
161
|
+
|
|
162
|
+
- Retention:`retention.title_policy`、`retention.hook_ledger` → `logs/retention/*`
|
|
163
|
+
- Readability:`readability.mobile` → `logs/readability/*`
|
|
164
|
+
- Naming:`naming` → `logs/naming/*`
|
|
165
|
+
|
|
166
|
+
如何配置这些字段、以及如何解读上述日志,见 [Guardrails 文档](guardrails.md)。
|