@zb2947244682/supernovel 1.0.0 → 1.1.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/README.md +354 -79
- package/dist/adapters/storageAdapter.d.ts +28 -2
- package/dist/adapters/storageAdapter.d.ts.map +1 -1
- package/dist/adapters/storageAdapter.js +188 -10
- package/dist/adapters/storageAdapter.js.map +1 -1
- package/dist/bus/commands.d.ts +17 -5
- package/dist/bus/commands.d.ts.map +1 -1
- package/dist/bus/commands.js +10 -6
- package/dist/bus/commands.js.map +1 -1
- package/dist/bus/dispatcher.d.ts.map +1 -1
- package/dist/bus/dispatcher.js +392 -36
- package/dist/bus/dispatcher.js.map +1 -1
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/ports.d.ts +7 -2
- package/dist/core/ports.d.ts.map +1 -1
- package/dist/core/rag/consistency.d.ts +41 -0
- package/dist/core/rag/consistency.d.ts.map +1 -1
- package/dist/core/rag/consistency.js +565 -15
- package/dist/core/rag/consistency.js.map +1 -1
- package/dist/core/rag/contextAssembler.d.ts +2 -0
- package/dist/core/rag/contextAssembler.d.ts.map +1 -1
- package/dist/core/rag/contextAssembler.js +72 -61
- package/dist/core/rag/contextAssembler.js.map +1 -1
- package/dist/core/rag/fixApplier.d.ts +38 -0
- package/dist/core/rag/fixApplier.d.ts.map +1 -0
- package/dist/core/rag/fixApplier.js +154 -0
- package/dist/core/rag/fixApplier.js.map +1 -0
- package/dist/core/rag/index.d.ts +1 -0
- package/dist/core/rag/index.d.ts.map +1 -1
- package/dist/core/rag/index.js +1 -0
- package/dist/core/rag/index.js.map +1 -1
- package/dist/core/rag/types.d.ts +38 -0
- package/dist/core/rag/types.d.ts.map +1 -1
- package/dist/core/tokenBudget.d.ts +25 -0
- package/dist/core/tokenBudget.d.ts.map +1 -0
- package/dist/core/tokenBudget.js +89 -0
- package/dist/core/tokenBudget.js.map +1 -0
- package/dist/core/types.d.ts +102 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/usecases/analyzeImpact.d.ts +15 -0
- package/dist/core/usecases/analyzeImpact.d.ts.map +1 -0
- package/dist/core/usecases/analyzeImpact.js +61 -0
- package/dist/core/usecases/analyzeImpact.js.map +1 -0
- package/dist/core/usecases/generateArtifacts.d.ts +6 -0
- package/dist/core/usecases/generateArtifacts.d.ts.map +1 -0
- package/dist/core/usecases/generateArtifacts.js +67 -0
- package/dist/core/usecases/generateArtifacts.js.map +1 -0
- package/dist/core/usecases/generateChapter.d.ts +4 -0
- package/dist/core/usecases/generateChapter.d.ts.map +1 -1
- package/dist/core/usecases/generateChapter.js +5 -4
- package/dist/core/usecases/generateChapter.js.map +1 -1
- package/dist/core/usecases/generateChapterRAG.d.ts +4 -0
- package/dist/core/usecases/generateChapterRAG.d.ts.map +1 -1
- package/dist/core/usecases/generateChapterRAG.js +5 -5
- package/dist/core/usecases/generateChapterRAG.js.map +1 -1
- package/dist/core/usecases/orchestrateChapterGeneration.d.ts +119 -0
- package/dist/core/usecases/orchestrateChapterGeneration.d.ts.map +1 -0
- package/dist/core/usecases/orchestrateChapterGeneration.js +235 -0
- package/dist/core/usecases/orchestrateChapterGeneration.js.map +1 -0
- package/dist/core/usecases/parseRequirements.d.ts.map +1 -1
- package/dist/core/usecases/parseRequirements.js +6 -0
- package/dist/core/usecases/parseRequirements.js.map +1 -1
- package/dist/core/usecases/polishStyle.d.ts +20 -0
- package/dist/core/usecases/polishStyle.d.ts.map +1 -0
- package/dist/core/usecases/polishStyle.js +251 -0
- package/dist/core/usecases/polishStyle.js.map +1 -0
- package/dist/core/usecases/validateNovel.d.ts +37 -1
- package/dist/core/usecases/validateNovel.d.ts.map +1 -1
- package/dist/core/usecases/validateNovel.js +95 -23
- package/dist/core/usecases/validateNovel.js.map +1 -1
- package/dist/core/usecases/validateOutline.d.ts +11 -0
- package/dist/core/usecases/validateOutline.d.ts.map +1 -0
- package/dist/core/usecases/validateOutline.js +64 -0
- package/dist/core/usecases/validateOutline.js.map +1 -0
- package/dist/core/usecases/validateWorld.d.ts +11 -0
- package/dist/core/usecases/validateWorld.d.ts.map +1 -0
- package/dist/core/usecases/validateWorld.js +74 -0
- package/dist/core/usecases/validateWorld.js.map +1 -0
- package/dist/shell/cli.js +62 -118
- package/dist/shell/cli.js.map +1 -1
- package/dist/shell/index.js +3 -3
- package/dist/shell/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,122 +1,397 @@
|
|
|
1
|
-
# SuperNovel
|
|
1
|
+
# SuperNovel 📚
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
AI-powered novel generation system with Core-Shell architecture, RAG for long-form consistency, and **automatic error correction**.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
基于 Core-Shell 架构的 AI 长篇小说生成系统,支持 RAG 长文本一致性保障,**自动检测并修复世界观冲突**,确保交付完整无错误的小说。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
---
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
- **纯函数**:所有业务逻辑都是纯函数,无副作用
|
|
11
|
-
- **Effects 模式**:UseCase 返回 Effect 声明而非直接执行 I/O
|
|
12
|
-
- **类型安全**:完整的 TypeScript 类型定义
|
|
9
|
+
## ✨ 核心特性
|
|
13
10
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
| 特性 | 说明 |
|
|
12
|
+
|------|------|
|
|
13
|
+
| 🏗️ **Core-Shell 架构** | 纯函数 Core + Effect 模式 + Bus 协调,代码清晰可维护 |
|
|
14
|
+
| 🧠 **RAG 长文本一致性** | 向量存储 + 知识图谱 + 分层摘要,确保数百章长篇小说世界观一致 |
|
|
15
|
+
| 🔧 **强制自动修复** | 检测世界观违规 → 生成 TextEdit 修复 → 重新检查,直到无错误或抛出异常 |
|
|
16
|
+
| 📂 **分层存储** | project.json 轻量级元数据(<50KB)+ chapters/ 独立文件按需加载 |
|
|
17
|
+
| 🔄 **断点续传** | 支持中断后从上次位置继续生成 |
|
|
18
|
+
| 📊 **一致性检查** | 角色状态、世界观规则、时间线、情节连续性四重验证 |
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
- **TUI 界面**:基于 @inquirer/prompts 的交互式界面
|
|
21
|
-
- **CLI 支持**:命令行接口
|
|
22
|
-
- **配置管理**:用户配置和项目存储
|
|
20
|
+
---
|
|
23
21
|
|
|
24
|
-
|
|
25
|
-
- **AI 适配器**:支持 OpenAI、Anthropic、OpenRouter 等
|
|
26
|
-
- **存储适配器**:文件系统操作
|
|
27
|
-
- **校验适配器**:AI 辅助的内容校验
|
|
22
|
+
## 🚀 快速开始
|
|
28
23
|
|
|
29
|
-
|
|
24
|
+
### 环境要求
|
|
25
|
+
|
|
26
|
+
- **Node.js 20+**
|
|
27
|
+
- **AI API 密钥**(支持阿里云、OpenAI、OpenRouter 等)
|
|
28
|
+
|
|
29
|
+
### 安装与初始化
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
# 使用 npx 直接运行(无需安装)
|
|
33
|
+
npx @zb2947244682/supernovel init
|
|
34
|
+
|
|
35
|
+
# 或全局安装
|
|
36
|
+
npm install -g @zb2947244682/supernovel
|
|
37
|
+
supernovel init
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
初始化后编辑配置文件,添加你的 API 密钥:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Windows: C:\Users\你的用户名\.supernovel\config.json
|
|
44
|
+
# 或项目目录下的 config.json
|
|
45
|
+
{
|
|
46
|
+
"ai": {
|
|
47
|
+
"provider": "custom",
|
|
48
|
+
"baseURL": "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
|
49
|
+
"apiKey": "你的API密钥",
|
|
50
|
+
"model": "qwen3.5-flash",
|
|
51
|
+
"temperature": 0.7,
|
|
52
|
+
"maxTokens": 32000
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 生成小说
|
|
58
|
+
|
|
59
|
+
#### 方式一:TUI 交互界面(推荐)
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npx @zb2947244682/supernovel
|
|
34
63
|
```
|
|
35
64
|
|
|
36
|
-
|
|
65
|
+
按菜单提示:
|
|
66
|
+
1. 🏗️ 生成小说框架 → 输入创意描述
|
|
67
|
+
2. 📝 生成章节内容 → 选择项目开始生成
|
|
68
|
+
3. ✅ 系统自动检查并修复世界观冲突
|
|
37
69
|
|
|
38
|
-
|
|
70
|
+
#### 方式二:CLI 命令行
|
|
39
71
|
|
|
40
72
|
```bash
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
npx supernovel
|
|
73
|
+
# 1. 生成小说框架
|
|
74
|
+
cd D:\Novel
|
|
75
|
+
npx @zb2947244682/supernovel framework "一个程序员穿越到魔法世界的故事" --name my-novel
|
|
76
|
+
|
|
77
|
+
# 2. 生成所有章节(含自动一致性检查和修复)
|
|
78
|
+
npx @zb2947244682/supernovel chapters my-novel
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 📂 项目结构
|
|
84
|
+
|
|
85
|
+
### 分层存储架构
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
draft/my-novel/
|
|
89
|
+
├── project.json # 轻量级元数据 (~20KB)
|
|
90
|
+
│ ├── requirements # 需求设定
|
|
91
|
+
│ ├── worldState # 世界观、角色、规则
|
|
92
|
+
│ ├── outline # 大纲结构
|
|
93
|
+
│ └── chapterMeta[] # 章节元数据索引
|
|
94
|
+
├── chapters/ # 章节正文独立存储
|
|
95
|
+
│ ├── chapter-1-1.md
|
|
96
|
+
│ ├── chapter-1-2.md
|
|
97
|
+
│ └── ...
|
|
98
|
+
├── requirements.md # 需求文档(导出用)
|
|
99
|
+
├── world.md # 世界观文档(导出用)
|
|
100
|
+
└── outline.md # 大纲文档(导出用)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 章节文件格式
|
|
104
|
+
|
|
105
|
+
```markdown
|
|
106
|
+
---
|
|
107
|
+
id: ch_1_1
|
|
108
|
+
volume: 1
|
|
109
|
+
number: 1
|
|
110
|
+
wordCount: 3256
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
# 第一章标题
|
|
114
|
+
|
|
115
|
+
章节正文内容...
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 🔧 强制自动修复机制
|
|
121
|
+
|
|
122
|
+
SuperNovel 的核心目标是**交付完整无错误的小说**。为此,系统实现了强制自动修复机制:
|
|
123
|
+
|
|
124
|
+
### 修复流程
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
生成章节 → 一致性检查 → 发现问题?
|
|
128
|
+
↓
|
|
129
|
+
┌─────────────────┴─────────────────┐
|
|
130
|
+
↓ ↓
|
|
131
|
+
无问题 有问题
|
|
132
|
+
↓ ↓
|
|
133
|
+
保存章节 生成 TextEdit 修复
|
|
134
|
+
↓ ↓
|
|
135
|
+
应用修复
|
|
136
|
+
↓
|
|
137
|
+
重新检查(最多3轮)
|
|
138
|
+
↓
|
|
139
|
+
┌─────────────────┴─────────────────┐
|
|
140
|
+
↓ ↓
|
|
141
|
+
无问题 仍有问题
|
|
142
|
+
↓ ↓
|
|
143
|
+
保存章节 不可修复?→ 抛出异常
|
|
144
|
+
可修复?→ 继续修复
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 世界观规则冲突自动修复示例
|
|
148
|
+
|
|
149
|
+
**原始内容(违规):**
|
|
150
|
+
```
|
|
151
|
+
凯伦感觉魔力已经完全耗尽,却依然举起法杖,强行释放了一个火球术。
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**自动修复后:**
|
|
155
|
+
```
|
|
156
|
+
凯伦感觉魔力已经完全耗尽,试图释放火球术却失败了,只能咬牙冲上去近身肉搏。
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 修复策略
|
|
160
|
+
|
|
161
|
+
| 违规类型 | 修复策略 |
|
|
162
|
+
|----------|----------|
|
|
163
|
+
| 魔力/能量耗尽后施法 | 改为物理行动("只能咬牙冲上去近身肉搏") |
|
|
164
|
+
| 等级限制突破 | 弱化行为强度("强行"→"尝试","瞬间"→"艰难地") |
|
|
165
|
+
| 物理法则冲突(如无火药世界出现枪) | 替换为等价魔法元素("枪"→"弩箭","火药"→"炼金爆炸物") |
|
|
166
|
+
| 角色能力无解释 | 在章节开头添加能力获得的情节铺垫 |
|
|
167
|
+
|
|
168
|
+
### 严格保证
|
|
169
|
+
|
|
170
|
+
- ✅ 所有可修复问题自动修复
|
|
171
|
+
- ✅ 修复后重新检查确认无错误
|
|
172
|
+
- ✅ 不可修复的错误抛出异常,不会交付错误内容
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 🏗️ 系统架构
|
|
177
|
+
|
|
178
|
+
### Core-Shell 架构
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
┌─────────────────────────────────────────────────────────┐
|
|
182
|
+
│ Shell 层 (CLI / TUI) │
|
|
183
|
+
│ - 用户交互界面、命令解析 │
|
|
184
|
+
└─────────────────────────────────────────────────────────┘
|
|
185
|
+
↓
|
|
186
|
+
┌─────────────────────────────────────────────────────────┐
|
|
187
|
+
│ Bus 层 (Command Dispatcher / Effect Runner) │
|
|
188
|
+
│ - 命令分发、Effect 执行、工作流协调 │
|
|
189
|
+
│ - 强制修复循环实现 │
|
|
190
|
+
└─────────────────────────────────────────────────────────┘
|
|
191
|
+
↓
|
|
192
|
+
┌─────────────────────────────────────────────────────────┐
|
|
193
|
+
│ Core 层 (纯函数业务逻辑) │
|
|
194
|
+
│ - UseCases: parseRequirements, generateWorld, etc. │
|
|
195
|
+
│ - Effects: AI_CHAT, SAVE_FILE, VALIDATE_CHAPTER │
|
|
196
|
+
│ - RAG: VectorStore, KnowledgeGraph, ConsistencyChecker │
|
|
197
|
+
└─────────────────────────────────────────────────────────┘
|
|
198
|
+
↓
|
|
199
|
+
┌─────────────────────────────────────────────────────────┐
|
|
200
|
+
│ Adapters 层 (AI / Storage / Logger) │
|
|
201
|
+
│ - AI 适配器(支持多提供商) │
|
|
202
|
+
│ - 分层存储(project.json + chapters/) │
|
|
203
|
+
│ - 日志系统 │
|
|
204
|
+
└─────────────────────────────────────────────────────────┘
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### RAG 长文本一致性系统
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
┌─────────────────────────────────────────────────────────┐
|
|
211
|
+
│ RAG Layer │
|
|
212
|
+
├─────────────────────────────────────────────────────────┤
|
|
213
|
+
│ 1. 向量存储 (Vector Store) │
|
|
214
|
+
│ - 章节语义嵌入、相似度检索 │
|
|
215
|
+
│ - 支持上下文召回 │
|
|
216
|
+
├─────────────────────────────────────────────────────────┤
|
|
217
|
+
│ 2. 知识图谱 (Knowledge Graph) │
|
|
218
|
+
│ - 实体追踪(角色、地点、物品) │
|
|
219
|
+
│ - 关系网络、事件追踪 │
|
|
220
|
+
├─────────────────────────────────────────────────────────┤
|
|
221
|
+
│ 3. 分层摘要 (Hierarchical Summaries) │
|
|
222
|
+
│ - 全书摘要 → 卷摘要 → 章摘要 │
|
|
223
|
+
│ - 动态更新机制 │
|
|
224
|
+
├─────────────────────────────────────────────────────────┤
|
|
225
|
+
│ 4. 一致性检查器 (Consistency Checker) │
|
|
226
|
+
│ - 角色一致性:能力变化需有情节铺垫 │
|
|
227
|
+
│ - 世界观规则:强制修复所有冲突 │
|
|
228
|
+
│ - 时间线连续性:前置事件检查 │
|
|
229
|
+
│ - 情节连续性:伏笔回收、情节推进 │
|
|
230
|
+
└─────────────────────────────────────────────────────────┘
|
|
44
231
|
```
|
|
45
232
|
|
|
46
|
-
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## 📖 命令参考
|
|
47
236
|
|
|
48
237
|
```bash
|
|
238
|
+
# 初始化配置
|
|
239
|
+
supernovel init
|
|
240
|
+
|
|
241
|
+
# 测试 AI 连接
|
|
242
|
+
supernovel test
|
|
243
|
+
|
|
49
244
|
# 生成小说框架
|
|
50
|
-
|
|
245
|
+
supernovel framework "创意描述" --name <项目名称>
|
|
246
|
+
|
|
247
|
+
# 生成所有章节(含自动修复)
|
|
248
|
+
supernovel chapters <项目名称>
|
|
249
|
+
|
|
250
|
+
# 查看帮助
|
|
251
|
+
supernovel --help
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### 配置参数
|
|
255
|
+
|
|
256
|
+
| 参数 | 说明 | 推荐值 |
|
|
257
|
+
|------|------|--------|
|
|
258
|
+
| `provider` | AI 服务商 | `custom` / `openai` / `anthropic` / `openrouter` |
|
|
259
|
+
| `baseURL` | API 基础地址 | 根据服务商填写 |
|
|
260
|
+
| `apiKey` | API 密钥 | 从服务商获取 |
|
|
261
|
+
| `model` | 模型名称 | `qwen3.5-flash` / `gpt-4o-mini` / `gpt-4o` |
|
|
262
|
+
| `temperature` | 创造性 (0-2) | 0.7 |
|
|
263
|
+
| `maxTokens` | 最大输出 token | 32000(避免截断) |
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## 🧪 开发与测试
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
# 克隆项目
|
|
271
|
+
git clone https://github.com/username/supernovel.git
|
|
272
|
+
cd supernovel
|
|
273
|
+
|
|
274
|
+
# 安装依赖
|
|
275
|
+
npm install
|
|
276
|
+
|
|
277
|
+
# 构建
|
|
278
|
+
npm run build
|
|
279
|
+
|
|
280
|
+
# 开发模式
|
|
281
|
+
npm run dev
|
|
282
|
+
|
|
283
|
+
# 运行测试
|
|
284
|
+
npm test
|
|
51
285
|
|
|
52
|
-
#
|
|
53
|
-
|
|
286
|
+
# 运行核心测试
|
|
287
|
+
npm run test:core
|
|
54
288
|
|
|
55
|
-
#
|
|
56
|
-
|
|
289
|
+
# 运行端到端测试
|
|
290
|
+
npm run test:e2e
|
|
57
291
|
```
|
|
58
292
|
|
|
59
|
-
|
|
293
|
+
### 测试覆盖
|
|
60
294
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
295
|
+
- ✅ 分层存储(project.json + chapters/)
|
|
296
|
+
- ✅ 按需加载(loadChapters with limit/offset)
|
|
297
|
+
- ✅ TextEdit 修复应用
|
|
298
|
+
- ✅ 多轮修复循环
|
|
299
|
+
- ✅ 世界观规则冲突检测与修复
|
|
65
300
|
|
|
66
|
-
|
|
67
|
-
- 选择已创建的项目
|
|
68
|
-
- AI 自动按大纲生成章节
|
|
69
|
-
- 自动校验并保存
|
|
301
|
+
---
|
|
70
302
|
|
|
71
|
-
|
|
72
|
-
- 导出为 Markdown 格式
|
|
73
|
-
- 后续支持 EPUB 格式
|
|
303
|
+
## 🎯 创意描述技巧
|
|
74
304
|
|
|
75
|
-
|
|
305
|
+
### 好的示例
|
|
76
306
|
|
|
77
307
|
```
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
├── world.md # 世界观设定
|
|
83
|
-
├── outline.md # 小说大纲
|
|
84
|
-
└── chapters/ # 章节文件
|
|
85
|
-
├── chapter-1.md
|
|
86
|
-
├── chapter-2.md
|
|
87
|
-
└── ...
|
|
308
|
+
异世界治愈奇幻小说,讲述一位现代医生穿越到魔法世界,
|
|
309
|
+
用医学知识解决魔法无法治愈的疾病。
|
|
310
|
+
主题是治愈与救赎,风格温暖治愈,适合全年龄阅读。
|
|
311
|
+
世界观规则:魔力是有限的资源,耗尽后无法施法。
|
|
88
312
|
```
|
|
89
313
|
|
|
90
|
-
|
|
314
|
+
```
|
|
315
|
+
科幻悬疑小说,主角发现自己生活在一个虚拟现实中,
|
|
316
|
+
每次死亡都会回到起点,但保留记忆。
|
|
317
|
+
需要解开这个世界的真相才能逃脱。
|
|
318
|
+
禁止元素:超自然力量、系统外援助
|
|
319
|
+
```
|
|
91
320
|
|
|
92
|
-
|
|
321
|
+
### 避免的描述
|
|
93
322
|
|
|
94
323
|
```
|
|
95
|
-
|
|
324
|
+
写个小说 # 太简单
|
|
325
|
+
玄幻小说 # 太笼统
|
|
326
|
+
类似XX小说 # 涉及版权
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## 🔍 常见问题
|
|
332
|
+
|
|
333
|
+
### Q: 生成的 JSON 解析失败?
|
|
334
|
+
**解决**: 增加 `maxTokens` 到 32000,避免响应被截断
|
|
335
|
+
|
|
336
|
+
### Q: 世界观规则冲突是什么意思?
|
|
337
|
+
**解决**: 系统会自动检测并修复。例如规则设定"魔力耗尽后无法施法",如果AI生成了"魔力耗尽后依然施法",系统会自动修复为符合规则的描述。
|
|
338
|
+
|
|
339
|
+
### Q: 支持生成多少章?
|
|
340
|
+
**解决**: 理论上无限制。3章后自动启用 RAG(检索增强生成),确保长文本一致性。每5章自动保存进度元数据。
|
|
341
|
+
|
|
342
|
+
### Q: 如何修改已生成的大纲?
|
|
343
|
+
**解决**: 直接编辑 `outline.md` 文件,然后重新运行 `supernovel chapters <项目名>`
|
|
344
|
+
|
|
345
|
+
### Q: 如何中断后继续生成?
|
|
346
|
+
**解决**: 系统支持断点续传。直接重新运行章节生成命令,会从上次中断的章节继续。
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## 📄 导出格式
|
|
351
|
+
|
|
352
|
+
- **Markdown** (`.md`) - 默认格式,适合阅读和进一步编辑
|
|
353
|
+
- **项目 JSON** (`.json`) - 包含完整元数据
|
|
354
|
+
|
|
355
|
+
计划中:
|
|
356
|
+
- EPUB 电子书格式
|
|
357
|
+
- PDF 格式
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## 🤝 参与贡献
|
|
362
|
+
|
|
363
|
+
欢迎提交 Issue 和 PR!
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
# Fork 并克隆
|
|
367
|
+
git clone https://github.com/your-username/supernovel.git
|
|
368
|
+
cd supernovel
|
|
369
|
+
|
|
370
|
+
# 创建分支
|
|
371
|
+
git checkout -b feature/your-feature
|
|
372
|
+
|
|
373
|
+
# 提交更改
|
|
374
|
+
git commit -am "Add some feature"
|
|
375
|
+
|
|
376
|
+
# 推送
|
|
377
|
+
git push origin feature/your-feature
|
|
378
|
+
|
|
379
|
+
# 创建 Pull Request
|
|
96
380
|
```
|
|
97
381
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
- OpenRouter (多种模型)
|
|
102
|
-
- 自定义 API
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## 📜 许可证
|
|
103
385
|
|
|
104
|
-
|
|
386
|
+
MIT License
|
|
105
387
|
|
|
106
|
-
|
|
107
|
-
- 智能校验:字数、角色一致性、禁用元素等
|
|
108
|
-
- 两阶段生成:先框架后章节,确保质量
|
|
109
|
-
- 纯函数架构,易于测试和维护
|
|
110
|
-
- 模块化设计,易于扩展
|
|
388
|
+
---
|
|
111
389
|
|
|
112
|
-
##
|
|
390
|
+
## 🙏 致谢
|
|
113
391
|
|
|
114
|
-
-
|
|
115
|
-
-
|
|
116
|
-
- @inquirer/prompts (TUI)
|
|
117
|
-
- Commander.js (CLI)
|
|
118
|
-
- Vitest (测试)
|
|
392
|
+
- 阿里云灵积平台提供的模型支持
|
|
393
|
+
- 开源社区贡献者
|
|
119
394
|
|
|
120
|
-
|
|
395
|
+
---
|
|
121
396
|
|
|
122
|
-
|
|
397
|
+
**Happy Writing! 🎉**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { StoragePort, ProjectStoragePort } from '../core/ports.js';
|
|
2
|
-
import type { NovelProject } from '../core/types.js';
|
|
2
|
+
import type { NovelProject, GeneratedChapter, ChapterMeta, ChapterLoadOptions } from '../core/types.js';
|
|
3
3
|
export declare class StorageAdapter implements StoragePort {
|
|
4
4
|
writeFile(filePath: string, content: string): Promise<void>;
|
|
5
5
|
readFile(filePath: string): Promise<string>;
|
|
@@ -9,8 +9,34 @@ export declare class StorageAdapter implements StoragePort {
|
|
|
9
9
|
}
|
|
10
10
|
export declare class ProjectStorageAdapter implements ProjectStoragePort {
|
|
11
11
|
private storage;
|
|
12
|
+
/**
|
|
13
|
+
* 保存项目元数据(轻量级,不含章节正文)
|
|
14
|
+
*/
|
|
12
15
|
saveProject(project: NovelProject, basePath: string): Promise<void>;
|
|
13
|
-
|
|
16
|
+
/**
|
|
17
|
+
* 增量保存单个章节
|
|
18
|
+
*/
|
|
19
|
+
saveChapter(chapter: GeneratedChapter, basePath: string): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* 批量保存章节(用于首次生成)
|
|
22
|
+
*/
|
|
23
|
+
saveChapters(chapters: GeneratedChapter[], basePath: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* 加载项目元数据(不含章节内容)
|
|
26
|
+
*/
|
|
27
|
+
loadProject(basePath: string): Promise<NovelProject | null>;
|
|
28
|
+
/**
|
|
29
|
+
* 按需加载单个章节
|
|
30
|
+
*/
|
|
31
|
+
loadChapter(basePath: string, volume: number, number: number): Promise<GeneratedChapter | null>;
|
|
32
|
+
/**
|
|
33
|
+
* 按需加载多个章节
|
|
34
|
+
*/
|
|
35
|
+
loadChapters(basePath: string, options?: ChapterLoadOptions): Promise<GeneratedChapter[]>;
|
|
36
|
+
/**
|
|
37
|
+
* 从章节文件更新项目元数据
|
|
38
|
+
*/
|
|
39
|
+
syncChapterMeta(basePath: string): Promise<ChapterMeta[]>;
|
|
14
40
|
projectExists(projectId: string, basePath: string): Promise<boolean>;
|
|
15
41
|
listProjects(basePath: string): Promise<string[]>;
|
|
16
42
|
private generateRequirementsMarkdown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storageAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/storageAdapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"storageAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/storageAdapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAIxG,qBAAa,cAAe,YAAW,WAAW;IAC1C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS9C,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CASlE;AAiED,qBAAa,qBAAsB,YAAW,kBAAkB;IAC9D,OAAO,CAAC,OAAO,CAAwB;IAEvC;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBzE;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7E;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,gBAAgB,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjF;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAUjE;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAUrG;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA6D/F;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAsCzD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBvD,OAAO,CAAC,4BAA4B;IAkCpC,OAAO,CAAC,qBAAqB;IAwC7B,OAAO,CAAC,uBAAuB;CA8BhC"}
|