面向 Codex 与 Obsidian 的中文小说创作底座。当前版本在长篇、短篇、37 个题材模板、授权稿件导入、六阶段确认和长期记忆闭环之上,提供 accepted 事实提交、连续性状态、写前上下文、Markdown 投影、SQLite 索引、可恢复章节结算、审校报告、两轮修订门禁、confirmed 作者偏好记忆,以及番茄小说人工投稿包导出。
AI Novels 旨在把 AI 辅助创作、作者确认和长篇连贯性管理组合成一套本地优先、可审计、可恢复的中文小说工作流。Codex Skills 负责选题、规划、写作与审校等创造性协作;TypeScript 控制层负责配置、路径、Schema、审批、提交、状态投影和索引等确定性工作。作品正文保存在作者明确授权的 Obsidian Vault 中,运行时事实、审批记录和检索数据保存在独立的本地目录中。
项目按四个阶段推进:
- Phase 1:创作底座(已完成)——支持长篇/短篇初始化、37 个题材模板、授权稿件导入、六阶段审批和 Markdown 草稿生成。
- Phase 2:连贯性与长期记忆(已完成)——章节合同、不可变章节提交、当前故事状态投影、SQLite 检索、写前上下文编译、可恢复沉淀事务、doctor 工具和 500 章规模门禁已实现。
- Phase 3:质量与审校(已完成)——提供确定性连续性检查、中文网文文本检查、长短篇/题材规则包、审校报告、最多两轮自动修订和 confirmed 作者反馈记忆。
- Phase 4:投稿包导出(已完成)——生成供作者人工上传的番茄小说投稿包,包含纯正文、书名/简介/标签、封面文件或封面简报、来源与合规报告、平台规则快照和可复验 manifest;不自动登录、上传或发布。
核心设计原则:作者保留最终决定权;已接受事实不可原地覆盖;Markdown 面向人类阅读,JSON 作为事实来源,SQLite 仅作为可重建检索层;所有真实 Vault 写入都必须经过明确配置与阶段确认。
- 写入真实 Vault 前必须创建并检查一份作者明确配置的
config/library.yaml。示例文件只说明字段,不代表对其中路径的写入授权。 vault_root是 Obsidian Vault 根目录;library_root固定为 Vault 内的小说创作;runtime_root是本机保存审批、事实和索引的目录。作品正文与运行时数据不得共用根目录。- 外部正文只有在作者明确确认自己有权使用后才能导入。竞品正文、授权不明文本和仅供研究的文本不得导入。
- 本项目最终只生成投稿包,供作者人工登录上传;不可自动投稿,也不保存平台账号或会话。
- 番茄导出命令只读取官方规则快照、accepted 事实链、审校报告、来源台账、投稿元数据和封面文件;不得接收账号、密码、Cookie、验证码、浏览器登录态,也不得自动上传、自动发布或定时发布。
需要 Node.js 24 或更高版本。先安装依赖,再复制示例:
npm install
cp config/library.example.yaml config/library.yaml打开 config/library.yaml,逐项确认并修改 vault_root、library_root、runtime_root。特别是 vault_root 必须是你明确允许写入的真实 Vault;不要未经检查直接使用示例路径。然后验证配置:
node scripts/novel.ts config check --config config/library.yaml命令输出解析后的 JSON 配置。只有路径与预期完全一致时才继续。
初始化长篇:
node scripts/novel.ts book init --config config/library.yaml --key 示例长篇 --title 示例长篇 --form long-serial初始化短篇:
node scripts/novel.ts book init --config config/library.yaml --key 示例短篇 --title 示例短篇 --form short-story命令会输出 bookId、contentRoot 和 runtimeRoot,并把新作品注册回配置。初始化只创建骨架,不代表选题已批准。
从固定的 37 个模板中选择一个主题材,也可增加一个副题材。双题材默认权重为 7:3:
node scripts/novel.ts genre select --primary 都市脑洞 --secondary 悬疑脑洞命令只输出选中的题材 profile 和权重,不会替作者批准选题。把确认后的选择、读者承诺、冲突、节奏和禁忌写入作品的 00-项目/题材配置.md。
只有对指定文件明确确认有权使用时,才可执行:
node scripts/novel.ts book import --config config/library.yaml --book-id book-0001 --source /绝对路径/我的稿件.md --rights-confirmed导入内容仍是 pending-confirmation 候选,不会生成 accepted 事实提交。缺少 --rights-confirmed 时命令以退出码 2 拒绝导入。
阶段固定为:topic → master_outline → volume_or_short_structure → chapter_outline → chapter_draft → finalization。每次批准都记录文件 checksum;批准后的文件被修改时,该阶段及下游批准自动失效。
以下示例使用初始化输出中的 book-0001。长篇依次批准前四阶段:
node scripts/novel.ts approval approve --config config/library.yaml --book-id book-0001 --stage topic --artifact '00-项目/题材配置.md' --version v1 --author-comment '作者确认选题'
node scripts/novel.ts approval approve --config config/library.yaml --book-id book-0001 --stage master_outline --artifact '20-规划/故事总纲.md' --version v1 --author-comment '作者确认总纲'
node scripts/novel.ts approval approve --config config/library.yaml --book-id book-0001 --stage volume_or_short_structure --artifact '20-规划/卷纲/第01卷-卷纲.md' --version v1 --author-comment '作者确认卷纲'
node scripts/novel.ts approval approve --config config/library.yaml --book-id book-0001 --stage chapter_outline --artifact '20-规划/章纲/第0001章-章纲.md' --version v1 --author-comment '作者确认章纲'短篇第三阶段改用短篇结构文件:
node scripts/novel.ts approval approve --config config/library.yaml --book-id book-0001 --stage volume_or_short_structure --artifact '20-规划/情节弧线/短篇结构.md' --version v1 --author-comment '作者确认短篇结构'任一阶段都可以核验当前审批链:
node scripts/novel.ts approval assert --config config/library.yaml --book-id book-0001 --stage chapter_outline没有有效章纲批准时不能创建正文;--number 必须与已批准章纲的固定四位章节号同编号。章纲有效后创建空白 Markdown 草稿:
node scripts/novel.ts chapter draft --config config/library.yaml --book-id book-0001 --number 1 --title 雾中来信 --volume 1作者审阅正文和定稿后,再依次记录最后两个确认点。下面的文件名必须替换为上一条命令实际输出的草稿路径对应文件名:
node scripts/novel.ts approval approve --config config/library.yaml --book-id book-0001 --stage chapter_draft --artifact '30-正文/第01卷/第0001章-雾中来信.md' --version v1 --author-comment '作者确认正文'
node scripts/novel.ts approval approve --config config/library.yaml --book-id book-0001 --stage finalization --artifact '30-正文/第01卷/第0001章-雾中来信.md' --version v1 --author-comment '作者确认定稿'定稿批准只记录作者确认;长期记忆必须再经过章节结算,才能发布不可变的 accepted JSON 事实,并据此派生事件、状态、摘要、Markdown 视图和 SQLite 索引。历史事实修正通过新的 correction commit 追踪,不覆盖既有 accepted 文件。
doctor 默认只读检查事实链、结算 journal 与派生物,不修改正文、合同、审批或 accepted commits:
node scripts/novel.ts doctor --config config/library.yaml --book-id book-0001只有在报告没有事实 blocker 或未完成 journal 时,才可显式请求修复派生物:
node scripts/novel.ts doctor --config config/library.yaml --book-id book-0001 --repair-derived
node scripts/novel.ts index rebuild --config config/library.yaml --book-id book-0001修复只重建事件、状态、摘要、Markdown 投影或 SQLite 索引,不会选择新的事实 head、覆盖 accepted JSON,也不会投稿。
Phase 3 在定稿确认前生成可审计的审校包和报告。确定性检查覆盖章节合同、连续性、时间线、伏笔、中文网文文本问题、长短篇形态和 1–2 个题材规则。blocker 不能被评分抵消;自动修订只允许 round 1 和 round 2,第三轮必须人工决策。
审校报告位置:
- JSON:
runtime/{bookId}/logs/review/{chapterId}/review-r{n}.json - Markdown:
60-审校/章节报告/第{章节号}章-审校报告.md
作者反馈先进入候选记忆;只有作者明确标记永久,或同类意见累计三次,才晋升为 confirmed。写前上下文只注入 confirmed 偏好,候选或已撤销偏好不会进入正文生成上下文。偏好文件位置:
- JSON:
runtime/{bookId}/feedback/author-preferences.json - Markdown 投影:
00-项目/作者意图.md的受控区域
番茄导出只面向人工上传。ready 包写入 Obsidian 作品目录:
70-投稿/番茄/{export_version}/
blocked 包只写入本机运行时日志:
runtime/{bookId}/logs/export/{export_version}/
规则快照保存在 policies/fanqie/。刷新时只浏览番茄官方公开页面,记录 URL、抓取日期、页面标题和 checksum;不确定或后台实时变化的字段进入人工复核项。官方页面不可访问或规则矛盾时停止,由作者人工核实。
当前快照:
policies/fanqie/rules-2026-07-17.json快照超过 30 天会被视为 expired。可以刷新快照,或由作者明确接受过期状态并在导出命令中加入:
--acknowledge-expired-rules投稿元数据 JSON 需包含:
{
"title": "书名",
"synopsis": "简介",
"tags": ["悬疑脑洞"],
"audience": ["目标读者"]
}来源台账 JSON 需声明每个 accepted 章节 checksum 的来源,类型为 original、authorized、public-domain 或 public-metadata。正文来源不能只依赖公开元数据;授权文本必须记录授权声明和 checksum。
node scripts/novel.ts export fanqie --config config/library.yaml --book-id book-0001 --metadata /绝对路径/投稿元数据.json --rules policies/fanqie/rules-2026-07-17.json --source-ledger /绝对路径/source-ledger.json --cover /绝对路径/cover.png --acknowledge-expired-rules --export-version fanqie-v1ready 包包含:
章节/*.txt:清理后的纯正文。全文.md:按章节顺序合并。书名候选.md、简介候选.md、标签建议.md、作者的话.md。封面/cover.*或 blocked 包中的封面待提供.md,以及封面简报.md。内容合规检查.md、连续性检查.md、相似性与来源说明.md。投稿清单.md、平台规则快照.json、manifest.json。
以下情况会阻断 ready:审校未通过、定稿未批准、accepted checksum 与正文漂移、规则过期未确认、来源 blocker、授权声明缺失、章节大段重复、正文残留内部 Markdown/机器 ID、元数据越界、绝对宣传语命中或缺少已确认版权来源的封面。
导出完成后,作者人工登录番茄作家后台,按 投稿清单.md 和 章节/ 目录逐章上传。Codex 到生成投稿包为止,不接管浏览器后台,不保存会话,不执行上传或发布。
如果写作、审校、结算或导出中断,先运行 doctor:
node scripts/novel.ts doctor --config config/library.yaml --book-id book-0001 --format json如果仅派生层漂移且没有事实 blocker 或 unfinished journal,可明确授权修复派生层:
node scripts/novel.ts doctor --config config/library.yaml --book-id book-0001 --repair-derived --format markdown如果投稿包构建失败,查看 runtime/{bookId}/logs/export/{export_version}/投稿清单.md 和各检查报告;修复 blocker 后重新运行导出。SQLite 可删除后通过 accepted 当前链和 Markdown 正文重建,不作为权威事实来源。
运行阶段验收、500 章规模门禁和全仓检查:
npm run test:phase1
npm run test:phase2
npm run test:phase3
npm run test:phase4
npm run test:e2e
npm run test:scale
npm run check测试全部使用临时 vault_root、runtime_root 和配置文件,不应写入真实 Obsidian Vault。