@dayinxisheng/novel-tools 0.3.0 → 0.3.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/CHANGELOG.md +10 -0
- package/README.md +69 -12
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +0 -47
- package/dist/commands/check.js.map +1 -1
- package/dist/services/init.service.d.ts.map +1 -1
- package/dist/services/init.service.js +12 -13
- package/dist/services/init.service.js.map +1 -1
- package/dist/services/validate.service.d.ts +8 -16
- package/dist/services/validate.service.d.ts.map +1 -1
- package/dist/services/validate.service.js +26 -173
- package/dist/services/validate.service.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.3.1] - 2026-03-11
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- `check outline` 命令现在只检查主大纲,移除了卷级大纲和弧列表的检查
|
|
12
|
+
- `init` 命令生成的 `arc_list.yaml` 模板格式更新为 `volumes → arcs` 嵌套结构
|
|
13
|
+
|
|
14
|
+
### Removed
|
|
15
|
+
- `check arc` 子命令
|
|
16
|
+
- `check volume` 子命令
|
|
17
|
+
|
|
8
18
|
## [0.3.0] - 2026-03-11
|
|
9
19
|
|
|
10
20
|
### Added
|
package/README.md
CHANGED
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
- **查询功能**:查询静态设定、人物信息、状态快照、人物关系、伏笔等
|
|
14
14
|
- **事件管理**:追加事件、生成章节摘要、列出事件
|
|
15
15
|
- **临时设定**:添加临时设定、审核队列、迁移到正式设定
|
|
16
|
-
-
|
|
16
|
+
- **快照管理**:生成、列出、查看卷级/弧级状态快照
|
|
17
17
|
- **一致性检查**:检查大纲、章节、弧、卷的一致性
|
|
18
|
+
- **风格分析**:从 JSONL 文件提取章节内容用于写作风格分析
|
|
18
19
|
|
|
19
20
|
## 安装
|
|
20
21
|
|
|
@@ -57,10 +58,34 @@ novel-tools init my-novel webnovel
|
|
|
57
58
|
### 查询设定
|
|
58
59
|
|
|
59
60
|
```bash
|
|
60
|
-
|
|
61
|
+
# 查询静态设定
|
|
62
|
+
novel-tools query setting world
|
|
63
|
+
novel-tools query setting power_system
|
|
64
|
+
|
|
65
|
+
# 查询设定大纲(大章节列表目录)
|
|
66
|
+
novel-tools query setting world --outline
|
|
67
|
+
|
|
68
|
+
# 提取指定大章节内容
|
|
69
|
+
novel-tools query setting world --section "第一章"
|
|
70
|
+
|
|
71
|
+
# 查询人物信息
|
|
61
72
|
novel-tools query character 张三
|
|
73
|
+
|
|
74
|
+
# 查询人物关系
|
|
62
75
|
novel-tools query relationships 张三
|
|
76
|
+
novel-tools query relationships
|
|
77
|
+
|
|
78
|
+
# 查询伏笔(默认显示未解决)
|
|
63
79
|
novel-tools query foreshadows
|
|
80
|
+
|
|
81
|
+
# 查询特定状态的伏笔
|
|
82
|
+
novel-tools query foreshadows --status resolved
|
|
83
|
+
|
|
84
|
+
# 查询当前状态快照
|
|
85
|
+
novel-tools query state
|
|
86
|
+
|
|
87
|
+
# 查询指定卷的状态快照
|
|
88
|
+
novel-tools query state --volume 1
|
|
64
89
|
```
|
|
65
90
|
|
|
66
91
|
### 事件管理
|
|
@@ -69,24 +94,24 @@ novel-tools query foreshadows
|
|
|
69
94
|
|
|
70
95
|
```bash
|
|
71
96
|
# JSON 字符串
|
|
72
|
-
novel-tools event append
|
|
97
|
+
novel-tools event append 1 --events '[{"type":"出场","character":"林风"}]'
|
|
73
98
|
|
|
74
99
|
# 从文件
|
|
75
|
-
novel-tools event append
|
|
100
|
+
novel-tools event append 1 --file events.json
|
|
76
101
|
|
|
77
102
|
# 交互式
|
|
78
|
-
novel-tools event append
|
|
103
|
+
novel-tools event append 1 --interactive
|
|
79
104
|
|
|
80
105
|
# 覆盖已存在的事件
|
|
81
|
-
novel-tools event append
|
|
106
|
+
novel-tools event append 1 --events '[...]' --replace
|
|
82
107
|
```
|
|
83
108
|
|
|
84
109
|
#### 章节摘要
|
|
85
110
|
|
|
86
111
|
```bash
|
|
87
|
-
novel-tools event summary
|
|
88
|
-
novel-tools event summary
|
|
89
|
-
novel-tools event summary
|
|
112
|
+
novel-tools event summary 1 --output table
|
|
113
|
+
novel-tools event summary 1 --output json
|
|
114
|
+
novel-tools event summary 1 --output markdown
|
|
90
115
|
```
|
|
91
116
|
|
|
92
117
|
#### 列出事件
|
|
@@ -102,7 +127,7 @@ novel-tools event list --type 出场
|
|
|
102
127
|
#### 添加临时设定
|
|
103
128
|
|
|
104
129
|
```bash
|
|
105
|
-
#
|
|
130
|
+
# 添加人物(--type、--name、--chapter 为必需参数)
|
|
106
131
|
novel-tools temp-setting add --type character --name 林风 --chapter 5 --description "主要角色"
|
|
107
132
|
|
|
108
133
|
# 添加物品
|
|
@@ -151,8 +176,40 @@ novel-tools check volume 1
|
|
|
151
176
|
### 生成快照
|
|
152
177
|
|
|
153
178
|
```bash
|
|
154
|
-
|
|
155
|
-
novel-tools snapshot --
|
|
179
|
+
# 生成卷级快照
|
|
180
|
+
novel-tools snapshot generate --volume 1
|
|
181
|
+
|
|
182
|
+
# 生成弧级快照
|
|
183
|
+
novel-tools snapshot generate --arc "英雄之旅"
|
|
184
|
+
|
|
185
|
+
# 列出所有快照
|
|
186
|
+
novel-tools snapshot list
|
|
187
|
+
|
|
188
|
+
# 查看快照详情
|
|
189
|
+
novel-tools snapshot show vol1
|
|
190
|
+
novel-tools snapshot show "英雄之旅"
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### 写作风格分析
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
# 显示 JSONL 文件信息
|
|
197
|
+
novel-tools style info chapters.jsonl
|
|
198
|
+
|
|
199
|
+
# 提取章节内容用于风格分析
|
|
200
|
+
novel-tools style extract chapters.jsonl --output sample.md
|
|
201
|
+
|
|
202
|
+
# 提取指定数量章节
|
|
203
|
+
novel-tools style extract chapters.jsonl --count 20 --output sample.md
|
|
204
|
+
|
|
205
|
+
# 从指定章节开始提取
|
|
206
|
+
novel-tools style extract chapters.jsonl --start 10 --count 5
|
|
207
|
+
|
|
208
|
+
# 随机选择章节
|
|
209
|
+
novel-tools style extract chapters.jsonl --count 10 --random
|
|
210
|
+
|
|
211
|
+
# 输出纯文本格式
|
|
212
|
+
novel-tools style extract chapters.jsonl --format text
|
|
156
213
|
```
|
|
157
214
|
|
|
158
215
|
## 开发
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CA2D5C"}
|
package/dist/commands/check.js
CHANGED
|
@@ -53,53 +53,6 @@ export function createCheckCommand() {
|
|
|
53
53
|
process.exit(1);
|
|
54
54
|
}
|
|
55
55
|
});
|
|
56
|
-
// 检查剧情弧
|
|
57
|
-
cmd
|
|
58
|
-
.command('arc')
|
|
59
|
-
.argument('<name>', '弧名称')
|
|
60
|
-
.option('-p, --path <path>', '项目路径')
|
|
61
|
-
.action(async (arcName, options) => {
|
|
62
|
-
try {
|
|
63
|
-
const projectPath = await CliUtils.resolveProjectPath(options.path);
|
|
64
|
-
const validateService = new ValidateService();
|
|
65
|
-
CliUtils.title(`检查剧情弧: ${arcName}`);
|
|
66
|
-
const result = await validateService.validateArc(projectPath, arcName);
|
|
67
|
-
CliUtils.printValidationResult(result);
|
|
68
|
-
if (!result.passed) {
|
|
69
|
-
process.exit(1);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
74
|
-
process.exit(1);
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
// 检查卷
|
|
78
|
-
cmd
|
|
79
|
-
.command('volume')
|
|
80
|
-
.argument('<number>', '卷号')
|
|
81
|
-
.option('-p, --path <path>', '项目路径')
|
|
82
|
-
.action(async (volumeStr, options) => {
|
|
83
|
-
try {
|
|
84
|
-
const projectPath = await CliUtils.resolveProjectPath(options.path);
|
|
85
|
-
const validateService = new ValidateService();
|
|
86
|
-
const volume = parseInt(volumeStr, 10);
|
|
87
|
-
if (isNaN(volume) || volume < 1) {
|
|
88
|
-
CliUtils.error('无效的卷号');
|
|
89
|
-
process.exit(1);
|
|
90
|
-
}
|
|
91
|
-
CliUtils.title(`检查第 ${volume} 卷`);
|
|
92
|
-
const result = await validateService.validateVolume(projectPath, volume);
|
|
93
|
-
CliUtils.printValidationResult(result);
|
|
94
|
-
if (!result.passed) {
|
|
95
|
-
process.exit(1);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
catch (error) {
|
|
99
|
-
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
100
|
-
process.exit(1);
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
56
|
return cmd;
|
|
104
57
|
}
|
|
105
58
|
//# sourceMappingURL=check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAE7B,OAAO;IACP,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;YAE9C,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEvB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YAClE,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAEvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;IACP,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;SAC3B,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,OAAO,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAEzC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,QAAQ,CAAC,KAAK,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC;YAEnC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC3E,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAEvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAE7B,OAAO;IACP,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;YAE9C,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEvB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YAClE,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAEvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;IACP,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;SAC3B,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,OAAO,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAEzC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,QAAQ,CAAC,KAAK,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC;YAEnC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC3E,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAEvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.service.d.ts","sourceRoot":"","sources":["../../src/services/init.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.service.d.ts","sourceRoot":"","sources":["../../src/services/init.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGzE;;GAEG;AACH,qBAAa,WAAW;IACtB;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiC1E;;OAEG;YACW,wBAAwB;IAWtC;;OAEG;YACW,mBAAmB;IAoBjC;;OAEG;YACW,4BAA4B;IAiB1C;;OAEG;YACW,mBAAmB;IA0CjC;;OAEG;YACW,yBAAyB;IAsCvC;;OAEG;YACW,2BAA2B;IA4BzC;;OAEG;YACW,yBAAyB;IA+CvC;;OAEG;YACW,qBAAqB;IAgBnC;;OAEG;YACW,gBAAgB;IAU9B;;OAEG;YACW,mBAAmB;CA6ClC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { FileUtils } from '../core/file.js';
|
|
2
|
-
import { YamlUtils } from '../core/yaml.js';
|
|
3
2
|
import { STANDARD_DIRS, NOVEL_TYPES } from '../core/constants.js';
|
|
4
3
|
import * as path from 'path';
|
|
5
4
|
/**
|
|
@@ -239,18 +238,18 @@ export class InitService {
|
|
|
239
238
|
* 创建弧列表模板
|
|
240
239
|
*/
|
|
241
240
|
async createArcListTemplate(projectPath) {
|
|
242
|
-
const arcListTemplate =
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
await
|
|
241
|
+
const arcListTemplate = `# 弧列表
|
|
242
|
+
|
|
243
|
+
volumes:
|
|
244
|
+
- volume: 1
|
|
245
|
+
name: "第一卷名称"
|
|
246
|
+
arcs:
|
|
247
|
+
- arc: 1
|
|
248
|
+
name: "开篇"
|
|
249
|
+
chapters: "1-20"
|
|
250
|
+
summary: "引入主角,建立世界观,开启主线剧情"
|
|
251
|
+
`;
|
|
252
|
+
await FileUtils.writeText(path.join(projectPath, 'outline', 'arc_list.yaml'), arcListTemplate);
|
|
254
253
|
}
|
|
255
254
|
/**
|
|
256
255
|
* 创建事件记录文件
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.service.js","sourceRoot":"","sources":["../../src/services/init.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"init.service.js","sourceRoot":"","sources":["../../src/services/init.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,33 +4,25 @@ import { ValidationResult } from '../core/types.js';
|
|
|
4
4
|
*/
|
|
5
5
|
export declare class ValidateService {
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* 查找章纲文件(递归搜索所有卷目录)
|
|
8
8
|
*/
|
|
9
|
-
|
|
9
|
+
private findChapterPlan;
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* 查找草稿文件(递归搜索所有卷目录)
|
|
12
12
|
*/
|
|
13
|
-
|
|
13
|
+
private findChapterDraft;
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* 验证大纲完整性
|
|
16
16
|
*/
|
|
17
|
-
|
|
17
|
+
validateOutline(projectPath: string): Promise<ValidationResult>;
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
19
|
+
* 验证章节
|
|
20
20
|
*/
|
|
21
|
-
|
|
21
|
+
validateChapter(projectPath: string, chapter: number): Promise<ValidationResult>;
|
|
22
22
|
/**
|
|
23
23
|
* 检查大纲文件
|
|
24
24
|
*/
|
|
25
25
|
private checkOutlineFile;
|
|
26
|
-
/**
|
|
27
|
-
* 检查卷级大纲文件
|
|
28
|
-
*/
|
|
29
|
-
private checkVolumeFiles;
|
|
30
|
-
/**
|
|
31
|
-
* 检查弧列表
|
|
32
|
-
*/
|
|
33
|
-
private checkArcList;
|
|
34
26
|
/**
|
|
35
27
|
* 检查章节规划
|
|
36
28
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.service.d.ts","sourceRoot":"","sources":["../../src/services/validate.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.service.d.ts","sourceRoot":"","sources":["../../src/services/validate.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAe,MAAM,kBAAkB,CAAC;AAGjE;;GAEG;AACH,qBAAa,eAAe;IAC1B;;OAEG;YACW,eAAe;IAM7B;;OAEG;YACW,gBAAgB;IAK9B;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAarE;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmCtF;;OAEG;YACW,gBAAgB;IAyB9B;;OAEG;YACW,gBAAgB;IAwB9B;;OAEG;YACW,iBAAiB;CAuBhC"}
|
|
@@ -1,10 +1,25 @@
|
|
|
1
1
|
import { FileUtils } from '../core/file.js';
|
|
2
|
-
import { YamlUtils } from '../core/yaml.js';
|
|
3
2
|
import * as path from 'path';
|
|
4
3
|
/**
|
|
5
4
|
* 验证服务类
|
|
6
5
|
*/
|
|
7
6
|
export class ValidateService {
|
|
7
|
+
/**
|
|
8
|
+
* 查找章纲文件(递归搜索所有卷目录)
|
|
9
|
+
*/
|
|
10
|
+
async findChapterPlan(projectPath, chapter) {
|
|
11
|
+
const pattern = `**/ch${String(chapter).padStart(3, '0')}.md`;
|
|
12
|
+
const files = await FileUtils.globFiles(path.join(projectPath, 'chapter_plans'), pattern);
|
|
13
|
+
return files.length > 0 ? files[0] : null;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 查找草稿文件(递归搜索所有卷目录)
|
|
17
|
+
*/
|
|
18
|
+
async findChapterDraft(projectPath, chapter) {
|
|
19
|
+
const pattern = `**/ch${String(chapter).padStart(3, '0')}.md`;
|
|
20
|
+
const files = await FileUtils.globFiles(path.join(projectPath, 'drafts'), pattern);
|
|
21
|
+
return files.length > 0 ? files[0] : null;
|
|
22
|
+
}
|
|
8
23
|
/**
|
|
9
24
|
* 验证大纲完整性
|
|
10
25
|
*/
|
|
@@ -14,11 +29,6 @@ export class ValidateService {
|
|
|
14
29
|
// 检查主大纲
|
|
15
30
|
const mainOutline = path.join(outlineDir, 'main_outline.md');
|
|
16
31
|
result.checks.push(await this.checkOutlineFile(mainOutline, '主大纲'));
|
|
17
|
-
// 检查卷级大纲
|
|
18
|
-
result.checks.push(await this.checkVolumeFiles(outlineDir));
|
|
19
|
-
// 检查弧列表
|
|
20
|
-
const arcPath = path.join(outlineDir, 'arc_list.yaml');
|
|
21
|
-
result.checks.push(await this.checkArcList(arcPath));
|
|
22
32
|
result.passed = result.checks.every(c => c.passed);
|
|
23
33
|
return result;
|
|
24
34
|
}
|
|
@@ -27,11 +37,11 @@ export class ValidateService {
|
|
|
27
37
|
*/
|
|
28
38
|
async validateChapter(projectPath, chapter) {
|
|
29
39
|
const result = { passed: true, checks: [] };
|
|
30
|
-
//
|
|
31
|
-
const planPath =
|
|
40
|
+
// 查找并检查章纲
|
|
41
|
+
const planPath = await this.findChapterPlan(projectPath, chapter);
|
|
32
42
|
result.checks.push(await this.checkChapterPlan(planPath, chapter));
|
|
33
|
-
//
|
|
34
|
-
const draftPath =
|
|
43
|
+
// 查找并检查草稿
|
|
44
|
+
const draftPath = await this.findChapterDraft(projectPath, chapter);
|
|
35
45
|
result.checks.push(await this.checkChapterDraft(draftPath, chapter));
|
|
36
46
|
// 检查事件记录
|
|
37
47
|
const { EventService } = await import('./event.service.js');
|
|
@@ -54,116 +64,6 @@ export class ValidateService {
|
|
|
54
64
|
result.passed = result.checks.every(c => c.passed);
|
|
55
65
|
return result;
|
|
56
66
|
}
|
|
57
|
-
/**
|
|
58
|
-
* 验证剧情弧
|
|
59
|
-
*/
|
|
60
|
-
async validateArc(projectPath, arcName) {
|
|
61
|
-
const result = { passed: true, checks: [] };
|
|
62
|
-
// 检查弧大纲
|
|
63
|
-
const arcOutlinePath = path.join(projectPath, 'outline', `arc_${arcName}.md`);
|
|
64
|
-
if (!FileUtils.exists(arcOutlinePath)) {
|
|
65
|
-
result.checks.push({
|
|
66
|
-
name: '弧大纲',
|
|
67
|
-
passed: false,
|
|
68
|
-
issues: [`未找到弧大纲: ${arcOutlinePath}`]
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
result.checks.push({
|
|
73
|
-
name: '弧大纲',
|
|
74
|
-
passed: true,
|
|
75
|
-
issues: []
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
// 检查弧内的章节
|
|
79
|
-
const arcConfigPath = path.join(projectPath, 'outline', 'arc_list.yaml');
|
|
80
|
-
const arcConfig = await YamlUtils.parseFile(arcConfigPath);
|
|
81
|
-
if (arcConfig && arcConfig.arcs) {
|
|
82
|
-
const arc = arcConfig.arcs.find((a) => a.name === arcName);
|
|
83
|
-
if (arc) {
|
|
84
|
-
const { startChapter, endChapter } = arc;
|
|
85
|
-
const missingChapters = [];
|
|
86
|
-
for (let ch = startChapter; ch <= endChapter; ch++) {
|
|
87
|
-
const planPath = path.join(projectPath, 'chapter_plans', `chapter_${ch}.md`);
|
|
88
|
-
if (!FileUtils.exists(planPath)) {
|
|
89
|
-
missingChapters.push(ch);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
if (missingChapters.length > 0) {
|
|
93
|
-
result.checks.push({
|
|
94
|
-
name: '章节完整性',
|
|
95
|
-
passed: false,
|
|
96
|
-
issues: [`缺少章纲: ${missingChapters.join(', ')}`]
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
result.checks.push({
|
|
101
|
-
name: '章节完整性',
|
|
102
|
-
passed: true,
|
|
103
|
-
issues: []
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
result.passed = result.checks.every(c => c.passed);
|
|
109
|
-
return result;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* 验证卷
|
|
113
|
-
*/
|
|
114
|
-
async validateVolume(projectPath, volume) {
|
|
115
|
-
const result = { passed: true, checks: [] };
|
|
116
|
-
// 检查卷大纲
|
|
117
|
-
const volumeOutlinePath = path.join(projectPath, 'outline', `vol${volume}.md`);
|
|
118
|
-
if (!FileUtils.exists(volumeOutlinePath)) {
|
|
119
|
-
result.checks.push({
|
|
120
|
-
name: '卷大纲',
|
|
121
|
-
passed: false,
|
|
122
|
-
issues: [`未找到卷大纲: ${volumeOutlinePath}`]
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
result.checks.push({
|
|
127
|
-
name: '卷大纲',
|
|
128
|
-
passed: true,
|
|
129
|
-
issues: []
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
// 检查卷快照
|
|
133
|
-
const snapshotPath = path.join(projectPath, 'settings', 'state', `vol${volume}_snapshot.yaml`);
|
|
134
|
-
if (!FileUtils.exists(snapshotPath)) {
|
|
135
|
-
result.checks.push({
|
|
136
|
-
name: '卷快照',
|
|
137
|
-
passed: false,
|
|
138
|
-
issues: [`未找到第 ${volume} 卷的状态快照`]
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
result.checks.push({
|
|
143
|
-
name: '卷快照',
|
|
144
|
-
passed: true,
|
|
145
|
-
issues: []
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
// 检查卷事件归档
|
|
149
|
-
const volEventsPath = path.join(projectPath, 'settings', 'events', `vol${volume}`, 'events.json');
|
|
150
|
-
if (!FileUtils.exists(volEventsPath)) {
|
|
151
|
-
result.checks.push({
|
|
152
|
-
name: '卷事件归档',
|
|
153
|
-
passed: false,
|
|
154
|
-
issues: [`未找到第 ${volume} 卷的事件归档`]
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
result.checks.push({
|
|
159
|
-
name: '卷事件归档',
|
|
160
|
-
passed: true,
|
|
161
|
-
issues: []
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
result.passed = result.checks.every(c => c.passed);
|
|
165
|
-
return result;
|
|
166
|
-
}
|
|
167
67
|
/**
|
|
168
68
|
* 检查大纲文件
|
|
169
69
|
*/
|
|
@@ -186,64 +86,14 @@ export class ValidateService {
|
|
|
186
86
|
}
|
|
187
87
|
return { name, passed: issues.length === 0, issues };
|
|
188
88
|
}
|
|
189
|
-
/**
|
|
190
|
-
* 检查卷级大纲文件
|
|
191
|
-
*/
|
|
192
|
-
async checkVolumeFiles(outlineDir) {
|
|
193
|
-
const issues = [];
|
|
194
|
-
const volumeFiles = await FileUtils.globFiles(outlineDir, 'vol*.md');
|
|
195
|
-
volumeFiles.push(...await FileUtils.globFiles(outlineDir, '第*卷*.md'));
|
|
196
|
-
if (volumeFiles.length === 0) {
|
|
197
|
-
return { name: '卷级大纲', passed: false, issues: ['未找到卷级大纲文件'] };
|
|
198
|
-
}
|
|
199
|
-
for (const volFile of volumeFiles) {
|
|
200
|
-
const content = await FileUtils.readText(volFile);
|
|
201
|
-
if (!content.includes('主题') && !content.includes('本卷定位')) {
|
|
202
|
-
issues.push(`${path.basename(volFile)}: 缺少主题说明`);
|
|
203
|
-
}
|
|
204
|
-
if (!content.includes('弧') && !content.includes('章节')) {
|
|
205
|
-
issues.push(`${path.basename(volFile)}: 缺少剧情弧或章节划分`);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
return { name: '卷级大纲', passed: issues.length === 0, issues };
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* 检查弧列表
|
|
212
|
-
*/
|
|
213
|
-
async checkArcList(arcPath) {
|
|
214
|
-
const issues = [];
|
|
215
|
-
if (!FileUtils.exists(arcPath)) {
|
|
216
|
-
return { name: '弧列表', passed: false, issues: [`弧列表文件不存在: ${arcPath}`] };
|
|
217
|
-
}
|
|
218
|
-
const arcData = await YamlUtils.parseFile(arcPath);
|
|
219
|
-
if (!arcData || !arcData.arcs || !Array.isArray(arcData.arcs)) {
|
|
220
|
-
issues.push('弧列表格式不正确,缺少 arcs 数组');
|
|
221
|
-
}
|
|
222
|
-
else if (arcData.arcs.length === 0) {
|
|
223
|
-
issues.push('弧列表为空');
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
// 检查每个弧的结构
|
|
227
|
-
for (let i = 0; i < arcData.arcs.length; i++) {
|
|
228
|
-
const arc = arcData.arcs[i];
|
|
229
|
-
if (!arc.name) {
|
|
230
|
-
issues.push(`弧 #${i + 1}: 缺少名称`);
|
|
231
|
-
}
|
|
232
|
-
if (arc.startChapter === undefined || arc.endChapter === undefined) {
|
|
233
|
-
issues.push(`弧 #${i + 1}: 缺少章节范围`);
|
|
234
|
-
}
|
|
235
|
-
if (arc.startChapter > arc.endChapter) {
|
|
236
|
-
issues.push(`弧 #${i + 1}: 起始章节大于结束章节`);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
return { name: '弧列表', passed: issues.length === 0, issues };
|
|
241
|
-
}
|
|
242
89
|
/**
|
|
243
90
|
* 检查章节规划
|
|
244
91
|
*/
|
|
245
92
|
async checkChapterPlan(planPath, chapter) {
|
|
246
93
|
const issues = [];
|
|
94
|
+
if (!planPath) {
|
|
95
|
+
return { name: '章纲', passed: false, issues: [`第 ${chapter} 章章纲不存在`] };
|
|
96
|
+
}
|
|
247
97
|
if (!FileUtils.exists(planPath)) {
|
|
248
98
|
return { name: '章纲', passed: false, issues: [`第 ${chapter} 章章纲不存在: ${planPath}`] };
|
|
249
99
|
}
|
|
@@ -261,6 +111,9 @@ export class ValidateService {
|
|
|
261
111
|
*/
|
|
262
112
|
async checkChapterDraft(draftPath, chapter) {
|
|
263
113
|
const issues = [];
|
|
114
|
+
if (!draftPath) {
|
|
115
|
+
return { name: '草稿', passed: false, issues: [`第 ${chapter} 章草稿不存在`] };
|
|
116
|
+
}
|
|
264
117
|
if (!FileUtils.exists(draftPath)) {
|
|
265
118
|
return {
|
|
266
119
|
name: '草稿',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.service.js","sourceRoot":"","sources":["../../src/services/validate.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.service.js","sourceRoot":"","sources":["../../src/services/validate.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;GAEG;AACH,MAAM,OAAO,eAAe;IAC1B;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,OAAe;QAChE,MAAM,OAAO,GAAG,QAAQ,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1F,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,OAAe;QACjE,MAAM,OAAO,GAAG,QAAQ,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IACD;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,WAAmB;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACrD,MAAM,MAAM,GAAqB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAE9D,QAAQ;QACR,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAEnD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,OAAe;QACxD,MAAM,MAAM,GAAqB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAE9D,UAAU;QACV,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAEnE,UAAU;QACV,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QAErE,SAAS;QACT,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,oBAAoB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAE7E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,CAAC,KAAK,OAAO,UAAU,CAAC;aACjC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,EAAE;aACX,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAEnD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,IAAY;QAC9D,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,YAAY,WAAW,EAAE,CAAC,EAAE,CAAC;QACtE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAEtD,MAAM,gBAAgB,GAA4B;YAChD,CAAC,QAAQ,EAAE,IAAI,CAAC;YAChB,CAAC,WAAW,EAAE,MAAM,CAAC;YACrB,CAAC,SAAS,EAAE,MAAM,CAAC;YACnB,CAAC,QAAQ,EAAE,MAAM,CAAC;SACnB,CAAC;QAEF,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACtD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,WAAW,WAAW,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACvD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,QAAuB,EAAE,OAAe;QACrE,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,SAAS,CAAC,EAAE,CAAC;QACxE,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,YAAY,QAAQ,EAAE,CAAC,EAAE,CAAC;QACrF,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEnD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClF,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAAC,SAAwB,EAAE,OAAe;QACvE,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,SAAS,CAAC,EAAE,CAAC;QACxE,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,CAAC,KAAK,OAAO,YAAY,SAAS,EAAE,CAAC;aAC9C,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEpD,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7D,CAAC;CACF"}
|