# 小说工坊 · 功能总览 > 版本 **v2.18.0** · MIT 协议 · 零依赖 > 仓库:https://github.com/ShanJun-pro-max/dsh-novel-studio --- ## 这个插件解决什么问题 写长篇最难受的不是写不出来,是**写着写着人物崩了、伏笔丢了、前文忘了**。 普通 AI 写作工具的做法是把大纲和人物设定一股脑塞给模型。但写到 50 章时,光是前 50 章的总结就有几万字——**塞得进去,模型也读不完**。真正的问题是注意力稀释,不是上下文不够。 这个插件的思路是:**不给你更多材料,给你刚好的材料。** --- ## 六个功能页 | 页面 | 干什么 | | --- | --- | | 📖 章节 | 全书进度、编辑正文、一键生成剧情总结 | | ✍️ 候选稿 | 开新章 → 写多篇候选 → 逐段标好/勾选 → 合稿定稿 | | 🗑 回收站 | 章节 / 候选稿 / 类型三分区,能看能恢复 | | 📈 情节 | 张力曲线、伏笔欠账、一致性检查、别称识别 | | 📋 偏好档案 | 提炼写作规律 + 从成品小说学习 | | 📁 设定 | 文件清单、编辑、新建、归档、识别 | | ⚙️ 设置 | 目录、字号、界面缩放 | --- ## 核心功能详解 ### 一、开新章:按需取材 这是插件的核心。点「开新章」时,它会自动组装一份**写作包**: ``` ① 本章任务 你写的「这一章要干什么」,永远第一位 ② 作者偏好档案 从标注和成品小说里提炼的写作规律 ③ 上一章结尾 只取最后 1400 字,用于接话 ④ 前情提要 见下方取材策略 ⑤ 本章人物 名字或别称出现才读,不是全书角色都塞 ⑥ 道具与台账 相关的钱、物、账目 ⑦ 情节节点 本章前后各 1 章给全字段 ⑧ 未兑现的伏笔 只放和本章人物相关的、或欠了 10 章以上的 ⑨ 禁 AI 腔清单 「嘴角勾起」「不是…而是…」这类套话黑名单 ⑩ 本章写作要求 字数、视角、收尾规则 ⑪ 还没建卡的角色 提醒模型别自己编设定 ⑫ 本书节奏现状 前几章太平就直接告诉它「该炸一下了」 ``` **取材策略**(第 ④ 项展开): ``` 最近 10 章总结 全文,一条不删 10 章之前 每章只给一句话 例外 本章要出场的配角在前文出现过 → 把那几章升级成全文 ``` 举例:写到第 50 章,某个配角在第 8 章出现过。插件会把第 8 章的总结升级成全文,因为它知道「这个人又要出场了,得回去看看他上次干了什么」。 **主角不算回查信号**——他每章都在,拿他判断会把所有旧章都升级成全文,越写越贵。 ### 二、候选稿:抽卡式写作 ``` ① 写本章设定 目标 / 禁止发生 / 出场人物 / 要求 ② 模型给方向 3–16 个写法方向,勾选要写的 ③ 逐篇写候选 一次一篇,看得见进度,可随时停 ④ 逐段处理 每段两个独立操作: ☐ 勾选 → 决定进不进合稿 👍👎 → 决定喂不喂偏好档案 ⑤ 合稿定稿 把勾选的段落拼起来,写进正文 ``` **关键设计**:「这句写得好」和「这段我要用」是两件事。一句漂亮话可能来自一个你根本不选它做本章的候选稿——所以标注和取材分开了。 左侧竖条颜色区分:**蓝** = 已勾进合稿,**绿** = 标了好,**红** = 标了不好。 ### 三、剧情总结:带结构化索引头 ```markdown --- chapter: 11 characters: [陆铮, 萧烬, 闫振军, 柯朗] location: [城东老院子] planted: [萧烬体质收不住, 闫振军单独留话] paid: [] --- # 第11章 剧情总结 ## 核心剧情点 - ...(正文照旧,怎么写都行) ``` **头上 6 行给机器查,下面照旧给你写。** 有了 `characters` 字段,才能回答「李满在第几章退场」这种问题——以前得翻 5 章正文。 **`characters` 用规则提取**:扫正文里出现了哪些已知角色名(含别称),不调模型。比模型准,而且免费。 ### 四、角色索引与别称识别 ``` 萧烬 11次 第1-11章 [1,2,3,4,5,6,7,8,9,10,11] 陆铮 11次 第1-11章 [1,2,3,4,5,6,7,8,9,10,11] 柯朗 10次 第1-11章 [1,2,3,4,5,6,8,9,10,11] ← 第7章没出场 李满 5次 第1-5章 [1,2,3,4,5] ← 第5章后退场 ``` **别称识别**:小说里没人一直叫全名。插件会扫出「李哥」「萧先生」这类称呼,并且: - **共现分析**:抓每次出现的前后 50 字,看窗口里还出现了谁 ``` 「萧总」出现 3 次 第4章 "小程。""萧总。""我给他那张卡" 附近:萧烬 第4章 "稍等。""萧总,没有记录。" 附近:萧烬 → 推测:萧烬 ``` - **同姓不排除**:「萧先生」可能指萧烬也可能指萧宗平,两个都列出来 - **你拍板**:机器只给依据,标 `✓ 建议选它` / `⚠ 说不准是谁` 采纳后写进角色卡 `"别称": ["李哥"]`,索引、一致性检查、写作包选人三处都认。 ### 五、没卡的角色:一键建卡 一致性检查会告诉你哪些人在总结里反复出现却没有角色卡: ``` ℹ 无卡角色 这些人在剧情总结里反复出现,但没有角色卡:小程、小叶、赵琪琪 [✚ 小程] [✚ 小叶] [✚ 赵琪琪] ``` 点进去两种填法: - **✨ 分析前文生成** —— 模型读他出场过的所有段落 + 大纲里提到他的行 + 同书其他卡的字段名 - **手动填** **字段不写死**——兽人小说可能要「兽族」,仙侠要「境界」,都市可能要「职业」「年龄」。模型按书的类型自己定。 **每个字段还能单独猜**:不知道「职业」填什么,点字段旁的 ✨,模型给个「老师」「保安」,不满意就改。 ### 六、情节体检 | 检查 | 说明 | | --- | --- | | 张力曲线 | 按正文冲突信号估分(1–4),标出「中段塌陷」「全程平缓」 | | 伏笔欠账 | 大纲里「埋 / 收」配对,找出该收没收的 | | **一致性检查** | **纯规则,不花钱**:总结漏记人、有卡没出场、总结缺索引头 | 张力分数会**写进写作包**: ``` ## ⑫ 本书节奏现状 - 全书还没有一章张力到 4(最高 3 分)。读者容易觉得「一直在铺垫」, 这一章挑最该爆的那个点明显加码。 - 最近章节张力:第6章 2分,第7章 2分,第8章 2分,第9章 2分, 第10章 3分,第11章 2分 ``` ### 七、偏好档案:两条路合并 **路线 A:从你自己的标注提炼** ``` 全书 127 条标注(👍 127 · 👎 0)→ [✨ 提炼规律] ``` 模型把标过的段落压成「喜欢什么 / 避免什么」两类规律,每条带证据(点开看来自哪几段)。 **路线 B:从成品小说学习** ``` 上传 .txt / .md / .docx / .epub ↓ 自动切块(按章节标题,切不出按 8000 字硬切) ① 粗扫 —— 每块只给首尾 300 字,模型判断值不值得精读 ↓ 只挑 10–25% 的块 ② 精读 —— 重要块全文喂进去,提炼这一段的写作手法 ↓ ③ 汇总 —— 归纳成「风格 / 水准 / 可复用规律 / 避坑」 ↓ [📥 追加到档案] ``` **为什么分两阶段**:20 万字一次塞给模型,它只记得开头和结尾。粗扫一次只花 300 字/块,但决定了哪些块值得花大价钱精读。 **报告长这样**: ``` ## 风格 - 句子短促,单句成段频繁,一段只承载一个动作或一个念头,节奏碎而快。 - 对话密集,提示语极简("她说""他说"),大量对话不带引号直接嵌入叙述。 - 情绪不靠形容词,靠身体反应落地:冷汗、手抖、胃里翻、眼泪掉在手背上。 ## 可复用规律 - 情绪先写身体:先给生理反应(额头冒冷汗、头晕、胃里翻、手被攥住), 再写试探动作,最后才写心理判断,心理句能删则删。 ## 避坑 - 连续用"愣了愣""怔了怔""顿了顿"标记反应,超过三次就钝,应换具体身体动作。 ``` ### 八、设定文件管理 一份清单列出这本书该有哪些文件,缺的标红: ``` ✓ 大纲 ✓ 立项 ✓ 世界观 ✓ 人物设定 ✓ 写作口径 ✓ 道具与台账 ✓ 项目说明 ✓ 原始设定案 ✓ 角色卡(31) ✓ 剧情总结(11) ``` 三个按钮: | 按钮 | 作用 | | --- | --- | | + 新建 | 手动建文件 | | 🪄 归档 | 粘贴内容,模型判断该放进哪个文件(确认后才写) | | 🔍 识别 | 扫描文件夹,模型认领现有文件属于哪一类 | **识别是幂等的**:认领过的文件记在 `文件归属.json`,下次不再问。硬链接、目录链接、多文件类目录都会自动跳过。 --- ## 数据都在哪 **全部是普通文件**,随时能用编辑器打开、能用 Git 管理。 ``` 你的小说/ ├─ 大纲.md ├─ 正文/第001章-标题.txt ├─ 剧情/第1章 剧情总结.md ├─ 人物/陆铮.json ├─ 设定/世界观.md、_口径.md … └─ .dsh-novel-studio/ ├─ 候选稿/第12章/ ├─ 备份/ ← 改文件前自动备份 ├─ 回收站/ ├─ 文件归属.json ├─ 作者偏好档案.md └─ marks.json / picks.json ``` 偏好档案类型库在 `~/.dsh/novel-studio-types/`,跨书共用。 --- ## 安全设计 | 机制 | 说明 | | --- | --- | | 删除 | 一律先进回收站,可恢复;回收站里再删才真删 | | 覆盖 | 改正文 / 总结 / 设定前**自动备份**到 `.dsh-novel-studio/备份/` | | 未保存 | 改正文没保存就切页面会弹确认 | | 路径 | 只能读写作品目录内,越界拒绝 | | 接口 | 只接受本机回环请求 | --- ## 技术实现 ``` lib/ ├─ index.js 159 行 插件入口,注册单端点 RPC ├─ client.js 4622 行 前端(宿主只加载这一个文件) ├─ server/ │ ├─ api.js 3445 行 73 个业务接口 │ ├─ novel-import.js 258 行 txt/docx/epub 解析(零依赖) │ ├─ novel-learn.js 322 行 两阶段提炼提示词与解析 │ ├─ context.js 路径约定、项目识别、缓存 │ ├─ summary.js 总结提示词与头部解析 │ └─ pack-assemble.js 写作包取材策略 └─ core/ 纯逻辑(读文件、合稿、分章、情节分析) ``` - **零依赖**:`dependencies` 为空。`.docx` / `.epub` 用 Node 内置 `zlib` 解 zip,编码检测用 `TextDecoder`。 - **单端点 RPC**:`POST /novel-studio/api/` + `{ a: '模块.动作' }`,73 个方法 - **约 15,000 行代码** ### 73 个接口分布 ``` state(1) summary(6) people(6) distill(3) setup(2) pack(1) newchapter(3) chapter(3) drafts(2) draft(5) trash(5) profile(4) types(9) files(4) dir(3) file(5) book(1) learn(7) config(1) consistency(1) plot(1) ``` --- ## 已知限制 | 限制 | 说明 | | --- | --- | | 前端不能拆 | DSH 的客户端插件必须是单文件,`client.js` 拆不了 | | 识别靠模型猜 | 猜完给你看,你不点「认领」就不生效 | | 语义去重有边界 | 「对话不单独成行」和「对话要独立成段」字面判重抓不到 | | 张力是估算 | 按正文冲突信号估分,不代表作者的真实判断 | --- ## 版本历史(近期) | 版本 | 内容 | | --- | --- | | 2.18.0 | 修正立项绑定、硬链接去重、多文件类标记 | | 2.17.2 | 识别不再把人物/剧情目录当候选 | | 2.17.1 | 档案编辑区加常驻保存按钮 | | 2.17.0 | 追加到档案改为后端落盘(修复内容被覆盖) | | 2.16.3 | txt 自动检测 GBK 编码 | | 2.16.0 | 任务行「打开」改成开关 | | 2.15.0 | 档案保存时自动合并重复条目 | | 2.14.0 | 从成品小说学习(两阶段提炼) | | 2.13.0 | 写作包带上节奏简报 | | 2.12.0 | 人物卡每个字段可单独让模型猜 | | 2.9.0 | 合稿勾选与偏好标注拆开 | | 2.8.0 | 写作包真正走按需取材 | 完整记录见 [CHANGELOG.md](./CHANGELOG.md)。