novelws 3.0.0 → 3.1.0
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 +57 -0
- package/README.md +49 -19
- package/dist/core/errors.d.ts +16 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +26 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/utils/diagnostics.d.ts +64 -0
- package/dist/utils/diagnostics.d.ts.map +1 -0
- package/dist/utils/diagnostics.js +226 -0
- package/dist/utils/diagnostics.js.map +1 -0
- package/package.json +1 -1
- package/templates/commands/analyze.md +21 -104
- package/templates/commands/character.md +22 -170
- package/templates/commands/guide.md +110 -0
- package/templates/commands/help-me.md +221 -0
- package/templates/commands/plan.md +1 -0
- package/templates/commands/revise.md +1 -0
- package/templates/commands/search.md +1 -0
- package/templates/commands/track.md +162 -537
- package/templates/commands/write.md +23 -0
- package/templates/knowledge-base/genres/horror.md +211 -0
- package/templates/knowledge-base/genres/military.md +209 -0
- package/templates/knowledge-base/genres/sports.md +216 -0
- package/templates/knowledge-base/genres/workplace.md +214 -0
- package/templates/knowledge-base/genres/youth.md +219 -0
- package/templates/knowledge-base/requirements/{anti-ai-v4.md → anti-ai-v4-deprecated.md} +13 -1
- package/templates/knowledge-base/requirements/anti-ai-v5-balanced.md +203 -0
- package/templates/scripts/bash/check-analyze-stage.sh +108 -0
- package/templates/scripts/bash/migrate-tracking.sh +183 -0
- package/templates/skills/writing-techniques/writing-balance/.gitkeep +0 -0
- package/templates/skills/writing-techniques/writing-balance/SKILL.md +460 -0
- package/templates/skills/writing-techniques/writing-techniques/SKILL.md +727 -0
- package/templates/scripts/powershell/check-writing-state.ps1.backup +0 -135
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,63 @@ 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
|
+
## [3.1.0] - 2026-02-15
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
#### Phase 1: 创作质量核心 - AI 去味智能化
|
|
13
|
+
|
|
14
|
+
- **writing-balance Skill** - 6 维度写作平衡评分系统
|
|
15
|
+
- 句长分布、词汇丰富度、描写层次、成语使用、句式变化、自然度
|
|
16
|
+
- 从"禁止列表"转向"智能平衡",保留创作自由度
|
|
17
|
+
- 量化评分 + 改进建议,替代一刀切禁用
|
|
18
|
+
- **writing-techniques Skill** - 8 模块写作技巧教学
|
|
19
|
+
- 标点艺术、句式变化、描写手法、对话真实化、节奏控制、留白艺术、词汇丰富化、AI 模式规避
|
|
20
|
+
- **anti-ai-v5-balanced 规则** - 平衡版去 AI 规范,替代旧版 anti-ai-v4
|
|
21
|
+
- **`/write` 命令集成** - 写作时自动调用 writing-balance 评分
|
|
22
|
+
|
|
23
|
+
#### Phase 2: 用户体验提升
|
|
24
|
+
|
|
25
|
+
- **`/help-me` 命令** - 自然语言命令发现
|
|
26
|
+
- 50+ 场景映射,用自然语言描述需求即可找到最佳命令
|
|
27
|
+
- 支持模糊匹配和多关键词组合
|
|
28
|
+
- **`/guide` 命令增强** - 上下文感知推荐引擎
|
|
29
|
+
- 基于项目当前状态智能推荐,提升推荐精准度
|
|
30
|
+
- **统一错误处理框架** - 4 个新错误类
|
|
31
|
+
- `CommandNotFoundError`、`InvalidArgumentError`、`ProjectStateError`、`TrackingDataError`
|
|
32
|
+
- 每个错误附带修复建议和相关命令提示
|
|
33
|
+
- **诊断系统** - `ProjectDiagnostics` 类
|
|
34
|
+
- 5 项自动检查:项目结构、tracking 文件、项目模式、MCP 状态、文件完整性
|
|
35
|
+
- 自动生成修复命令建议
|
|
36
|
+
|
|
37
|
+
#### Phase 3: 功能扩展与优化
|
|
38
|
+
|
|
39
|
+
- **5 个新 genre 知识库**
|
|
40
|
+
- `horror.md` - 恐怖(氛围营造、恐惧递进、心理恐怖)
|
|
41
|
+
- `youth.md` - 青春(校园、成长、青涩情感)
|
|
42
|
+
- `military.md` - 军事(战争、军旅、战术谋略)
|
|
43
|
+
- `sports.md` - 竞技(体育、比赛、热血成长)
|
|
44
|
+
- `workplace.md` - 职场(商战、职场博弈、行业深耕)
|
|
45
|
+
- **AI 模型智能选择** - 8 个命令模板添加 `recommended-model` 字段
|
|
46
|
+
- opus:深度分析任务(analyze --type=framework、plan、revise)
|
|
47
|
+
- sonnet:平衡任务(write、track --check、character)
|
|
48
|
+
- haiku:速度优先(track --sync、search、help-me)
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
|
|
52
|
+
- **anti-ai 规则升级** - v4 禁止列表 → v5 智能平衡评分
|
|
53
|
+
- **`/track` 命令 Token 优化** - 1,080 行 → 704 行(精简 35%),保留所有核心功能
|
|
54
|
+
|
|
55
|
+
### Technical
|
|
56
|
+
|
|
57
|
+
- **测试增长** - 275 → 312 个测试(+37 个)
|
|
58
|
+
- **测试结果** - 312 个测试全部通过,21 个 test suites,零回归
|
|
59
|
+
- **新增 Skills** - writing-balance、writing-techniques(共 2 个)
|
|
60
|
+
- **新增命令** - `/help-me`(共 1 个)
|
|
61
|
+
- **新增 genre** - horror、youth、military、sports、workplace(共 5 个)
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
8
65
|
## [3.0.0] - 2026-02-14
|
|
9
66
|
|
|
10
67
|
### Added
|
package/README.md
CHANGED
|
@@ -10,18 +10,28 @@
|
|
|
10
10
|
|
|
11
11
|
## 核心特性
|
|
12
12
|
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
15
|
-
-
|
|
13
|
+
- **18 个 Slash Commands** - 七步方法论 + 角色管理 + 智能引导 + 命令发现 + 追踪验证
|
|
14
|
+
- **39 个 Agent Skills** - AI 自动激活的知识库、写作技巧、质量检查和专项分析
|
|
15
|
+
- **AI 去味智能化(NEW v3.1)** - 从"禁止列表"转向"智能平衡"
|
|
16
|
+
- **writing-balance Skill**:6 维度评分系统(句长分布、词汇丰富度、描写层次、成语使用、句式变化、自然度)
|
|
17
|
+
- **writing-techniques Skill**:8 模块写作技巧教学
|
|
18
|
+
- **anti-ai-v5-balanced**:平衡版去 AI 规则,替代旧版禁止列表
|
|
19
|
+
- **用户体验提升(NEW v3.1)**
|
|
20
|
+
- **`/help-me` 命令**:自然语言命令发现(50+ 场景映射)
|
|
21
|
+
- **`/guide` 增强**:上下文感知推荐引擎
|
|
22
|
+
- **统一错误框架**:4 种错误类型 + 修复建议
|
|
23
|
+
- **诊断系统**:5 项自动检查 + 修复命令生成
|
|
24
|
+
- **AI 模型智能选择(NEW v3.1)** - 每个命令标注推荐模型(opus/sonnet/haiku)
|
|
25
|
+
- **超长篇小说支持(v3.0)** - 支持 300+ 章节超长篇创作
|
|
16
26
|
- **三层数据架构**:MCP 服务器 + 分片 JSON + 单文件模式
|
|
17
27
|
- **性能提升 100x-600x**:查询速度从秒级降至毫秒级
|
|
18
28
|
- **智能分层**:根据项目规模自动选择最佳模式
|
|
19
29
|
- **全文搜索**:FTS5 索引,500x 搜索加速
|
|
20
30
|
- **卷级操作**:`/volume-summary`、`--volume vol-XX` 参数
|
|
21
31
|
- **连贯性守护**:long-series-continuity Skill 自动监控
|
|
22
|
-
- **
|
|
23
|
-
- **网文深度优化** -
|
|
24
|
-
- **Token 优化** - 三大核心命令精简 77%,典型会话 token 消耗降低 76%
|
|
32
|
+
- **16 大类型知识库** - 言情、悬疑、玄幻、都市、游戏文、重生、武侠、历史、科幻、惊悚、恐怖、青春、军事、竞技、职场等
|
|
33
|
+
- **网文深度优化** - 爽点管理、钩子设计、节奏控制、智能 AI 去味
|
|
34
|
+
- **Token 优化** - 三大核心命令精简 77%,track 命令精简 35%,典型会话 token 消耗降低 76%
|
|
25
35
|
- **智能资源加载** - 三层架构(推断 + 配置 + 关键词触发),按需加载
|
|
26
36
|
- **批量操作** - 多章节分析、多卷规划、批量同步追踪数据
|
|
27
37
|
- **命令链式提示** - 每个命令执行后自动推荐下一步操作
|
|
@@ -93,7 +103,8 @@ novelws init my-novel --plugins authentic-voice
|
|
|
93
103
|
| 命令 | 功能 | 说明 |
|
|
94
104
|
|------|------|------|
|
|
95
105
|
| `/character` | 统一角色管理 | create / list / show / update / relate / voice / timeline |
|
|
96
|
-
| `/guide` | 智能引导 | 三层优先级推荐引擎(P0/P1/P2
|
|
106
|
+
| `/guide` | 智能引导 | 三层优先级推荐引擎(P0/P1/P2),上下文感知推荐,自动推荐唯一最佳下一步 + 备选操作 |
|
|
107
|
+
| `/help-me` | 命令发现(NEW v3.1)| 自然语言描述需求,智能匹配最佳命令(50+ 场景映射) |
|
|
97
108
|
|
|
98
109
|
### 追踪与验证
|
|
99
110
|
|
|
@@ -150,7 +161,12 @@ novelws init my-novel --plugins authentic-voice
|
|
|
150
161
|
| **Wuxia** | 武侠(江湖、武功、侠义) |
|
|
151
162
|
| **Historical** | 历史(朝代、宫廷、考据) |
|
|
152
163
|
| **Sci-fi** | 科幻(太空、未来、星际) |
|
|
153
|
-
| **Thriller** |
|
|
164
|
+
| **Thriller** | 惊悚(悬念、紧张、心理博弈) |
|
|
165
|
+
| **Horror** | 恐怖(氛围营造、恐惧递进、心理恐怖)(NEW v3.1) |
|
|
166
|
+
| **Youth** | 青春(校园、成长、青涩情感)(NEW v3.1) |
|
|
167
|
+
| **Military** | 军事(战争、军旅、战术谋略)(NEW v3.1) |
|
|
168
|
+
| **Sports** | 竞技(体育、比赛、热血成长)(NEW v3.1) |
|
|
169
|
+
| **Workplace** | 职场(商战、职场博弈、行业深耕)(NEW v3.1) |
|
|
154
170
|
|
|
155
171
|
### 写作技巧(Writing Techniques)
|
|
156
172
|
|
|
@@ -162,6 +178,8 @@ novelws init my-novel --plugins authentic-voice
|
|
|
162
178
|
| **Pacing Control** | 章内节奏检测、多章单调预警、满足间隔追踪 |
|
|
163
179
|
| **Reader Expectation** | 期待自动识别、满足/颠覆节奏规划、情绪预测曲线 |
|
|
164
180
|
| **Multi-Thread Narrative** | 多线叙事管理(视角切换、信息差追踪、叙事线交汇设计) |
|
|
181
|
+
| **Writing Balance(NEW v3.1)** | 6 维度写作平衡评分(句长分布、词汇丰富度、描写层次、成语使用、句式变化、自然度) |
|
|
182
|
+
| **Writing Techniques(NEW v3.1)** | 8 模块写作技巧教学(标点艺术、句式变化、描写手法、对话真实化、节奏控制、留白艺术、词汇丰富化、AI模式规避) |
|
|
165
183
|
|
|
166
184
|
### 写作工艺知识库(Craft Knowledge)
|
|
167
185
|
|
|
@@ -171,7 +189,7 @@ novelws init my-novel --plugins authentic-voice
|
|
|
171
189
|
| **Power System** | 力量体系设计框架、战斗标准化、升级节奏 |
|
|
172
190
|
| **Tension Management** | 紧张感管理(信息差、时间压力、两难抉择) |
|
|
173
191
|
| **Story Structures** | 4 种网文结构模板(升级流/副本流/任务流/日常流) |
|
|
174
|
-
| **Anti-AI
|
|
192
|
+
| **Anti-AI v5 Balanced(v3.1)** | 智能平衡版去 AI 规则,6 维度评分替代简单禁止列表 |
|
|
175
193
|
| **Concretization** | 具象化写作检查清单、四维对照表、示例对比 |
|
|
176
194
|
|
|
177
195
|
### 智能检查(Quality Assurance)
|
|
@@ -292,10 +310,11 @@ AI: 🔍 检测到关键词触发:
|
|
|
292
310
|
- **多章单调预警** - 检测连续章节的节奏模式是否重复
|
|
293
311
|
- **节奏健康报告** - `/track --check` 生成节奏多样性、情绪曲线等指标
|
|
294
312
|
|
|
295
|
-
###
|
|
313
|
+
### 智能 AI 去味(v3.1 升级)
|
|
296
314
|
|
|
297
|
-
- **
|
|
298
|
-
-
|
|
315
|
+
- **6 维度写作平衡评分** - 句长分布、词汇丰富度、描写层次、成语使用、句式变化、自然度
|
|
316
|
+
- **智能平衡替代禁止列表** - 从"一刀切禁用"转向"评分引导",保留创作自由度
|
|
317
|
+
- **8 模块写作技巧教学** - 标点艺术、句式变化、描写手法、对话真实化等
|
|
299
318
|
- **自然化写作原则** - 历史白描法、口语化处理、短句节奏、克制描写
|
|
300
319
|
|
|
301
320
|
### 网文结构模板
|
|
@@ -311,13 +330,14 @@ AI: 🔍 检测到关键词触发:
|
|
|
311
330
|
|
|
312
331
|
## Token 优化
|
|
313
332
|
|
|
314
|
-
v2.1.0 对三大核心命令进行了深度 token
|
|
333
|
+
v2.1.0 对三大核心命令进行了深度 token 优化,v3.1.0 进一步优化 track 命令:
|
|
315
334
|
|
|
316
335
|
| 命令 | 精简前 | 精简后 | 精简率 |
|
|
317
336
|
|------|--------|--------|--------|
|
|
318
337
|
| `/write` | 1,617 行 | 438 行 | 72.8% |
|
|
319
338
|
| `/analyze` | 2,071 行 | 329 行 | 84.1% |
|
|
320
339
|
| `/plan` | 1,286 行 | 380 行 | 70.5% |
|
|
340
|
+
| `/track`(v3.1) | 1,080 行 | 704 行 | 35% |
|
|
321
341
|
|
|
322
342
|
**典型会话**(`/write` ×5 + `/plan` ×1 + `/analyze` ×1):~110,000 tokens → ~26,000 tokens(**节省 76%**)
|
|
323
343
|
|
|
@@ -328,6 +348,16 @@ v2.1.0 对三大核心命令进行了深度 token 优化,大幅降低长篇写
|
|
|
328
348
|
- **会话级复用**:已加载的资源在同一对话中复用,不重复读取
|
|
329
349
|
- **前文智能裁剪**:上一章 >1500 字时只保留最后 1000 字,配合 tracking 数据补充上下文
|
|
330
350
|
|
|
351
|
+
## AI 模型智能选择(NEW in v3.1)
|
|
352
|
+
|
|
353
|
+
v3.1.0 为每个命令标注了推荐模型,根据任务复杂度自动匹配最佳性价比:
|
|
354
|
+
|
|
355
|
+
| 级别 | 模型 | 适用命令 |
|
|
356
|
+
|------|------|---------|
|
|
357
|
+
| **深度分析** | opus | `/analyze --type=framework`、`/plan`、`/revise` |
|
|
358
|
+
| **平衡任务** | sonnet | `/write`、`/track --check`、`/character` |
|
|
359
|
+
| **速度优先** | haiku | `/track --sync`、`/search`、`/help-me` |
|
|
360
|
+
|
|
331
361
|
## 命令链式提示
|
|
332
362
|
|
|
333
363
|
每个命令执行完成后,自动推荐下一步操作:
|
|
@@ -341,7 +371,7 @@ v2.1.0 对三大核心命令进行了深度 token 优化,大幅降低长篇写
|
|
|
341
371
|
3️⃣ /recap --brief — 快速回顾上下文(如需刷新记忆)
|
|
342
372
|
```
|
|
343
373
|
|
|
344
|
-
所有
|
|
374
|
+
所有 18 个命令均支持链式提示,形成完整的创作工作流图。
|
|
345
375
|
|
|
346
376
|
## 插件系统
|
|
347
377
|
|
|
@@ -369,8 +399,8 @@ novelws plugin:remove authentic-voice
|
|
|
369
399
|
my-novel/
|
|
370
400
|
├── .claude/
|
|
371
401
|
│ ├── CLAUDE.md # 共享核心规范(自动缓存)
|
|
372
|
-
│ ├── commands/ # Slash Commands (
|
|
373
|
-
│ └── skills/ # Agent Skills (
|
|
402
|
+
│ ├── commands/ # Slash Commands (18 个)
|
|
403
|
+
│ └── skills/ # Agent Skills (39 个)
|
|
374
404
|
│
|
|
375
405
|
├── .specify/ # Spec Kit 配置
|
|
376
406
|
│ ├── memory/
|
|
@@ -427,10 +457,10 @@ my-novel/
|
|
|
427
457
|
|------|-------------|-------------------|
|
|
428
458
|
| **支持平台** | 13个AI工具(Claude、Cursor、Gemini等) | Claude Code 专用 |
|
|
429
459
|
| **核心方法论** | 七步方法论 | 七步方法论 |
|
|
430
|
-
| **Slash Commands** | 7 个跨平台命令 |
|
|
431
|
-
| **Agent Skills** | 不支持 |
|
|
460
|
+
| **Slash Commands** | 7 个跨平台命令 | 18 个 Claude 优化命令 |
|
|
461
|
+
| **Agent Skills** | 不支持 | 39 个深度集成 |
|
|
432
462
|
| **智能检查** | 手动执行 | 自动监控 |
|
|
433
|
-
| **类型知识库** | 需手动查阅 |
|
|
463
|
+
| **类型知识库** | 需手动查阅 | 15 种类型自动激活 |
|
|
434
464
|
| **网文优化** | 基础支持 | 深度优化(爽点/钩子/节奏/反AI) |
|
|
435
465
|
| **批量操作** | 不支持 | 多章分析/多卷规划/批量同步 |
|
|
436
466
|
| **适用场景** | 需要跨平台支持 | 追求最佳体验(Claude Code) |
|
package/dist/core/errors.d.ts
CHANGED
|
@@ -51,6 +51,22 @@ export declare class ConfigError extends NovelWriterError {
|
|
|
51
51
|
export declare class PluginAlreadyInstalledError extends NovelWriterError {
|
|
52
52
|
constructor(name: string);
|
|
53
53
|
}
|
|
54
|
+
/** 文件缺失错误(带修复建议) */
|
|
55
|
+
export declare class MissingFileError extends NovelWriterError {
|
|
56
|
+
constructor(filePath: string, suggestion: string);
|
|
57
|
+
}
|
|
58
|
+
/** 模式不匹配错误 */
|
|
59
|
+
export declare class ModeMismatchError extends NovelWriterError {
|
|
60
|
+
constructor(expectedMode: string, actualMode: string, action: string);
|
|
61
|
+
}
|
|
62
|
+
/** 数据完整性错误 */
|
|
63
|
+
export declare class DataIntegrityError extends NovelWriterError {
|
|
64
|
+
constructor(issue: string, autoFixed: boolean);
|
|
65
|
+
}
|
|
66
|
+
/** 依赖缺失错误 */
|
|
67
|
+
export declare class DependencyMissingError extends NovelWriterError {
|
|
68
|
+
constructor(dependency: string, installCmd: string);
|
|
69
|
+
}
|
|
54
70
|
/**
|
|
55
71
|
* CLI 全局错误处理
|
|
56
72
|
* 将 NovelWriterError 格式化为用户友好的输出,非预期错误输出堆栈
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU;CAMhE;AAED,cAAc;AACd,qBAAa,oBAAqB,SAAQ,gBAAgB;gBAC5C,GAAG,CAAC,EAAE,MAAM;CAMzB;AAED,YAAY;AACZ,qBAAa,kBAAmB,SAAQ,gBAAgB;gBAC1C,IAAI,EAAE,MAAM;CAGzB;AAED,YAAY;AACZ,qBAAa,mBAAoB,SAAQ,gBAAgB;gBAC3C,IAAI,EAAE,MAAM;CAGzB;AAED,aAAa;AACb,qBAAa,qBAAsB,SAAQ,gBAAgB;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAEhB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAE,MAAM,EAAO;CAKpE;AAED,aAAa;AACb,qBAAa,kBAAmB,SAAQ,gBAAgB;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAO1D;AAED,aAAa;AACb,qBAAa,YAAa,SAAQ,gBAAgB;IAChD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAEjB,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAU9D;AAED,YAAY;AACZ,qBAAa,aAAc,SAAQ,gBAAgB;gBACrC,OAAO,EAAE,MAAM;CAG5B;AAED,gBAAgB;AAChB,qBAAa,WAAY,SAAQ,gBAAgB;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAOhD;AAED,YAAY;AACZ,qBAAa,2BAA4B,SAAQ,gBAAgB;gBACnD,IAAI,EAAE,MAAM;CAGzB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAyBjD"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU;CAMhE;AAED,cAAc;AACd,qBAAa,oBAAqB,SAAQ,gBAAgB;gBAC5C,GAAG,CAAC,EAAE,MAAM;CAMzB;AAED,YAAY;AACZ,qBAAa,kBAAmB,SAAQ,gBAAgB;gBAC1C,IAAI,EAAE,MAAM;CAGzB;AAED,YAAY;AACZ,qBAAa,mBAAoB,SAAQ,gBAAgB;gBAC3C,IAAI,EAAE,MAAM;CAGzB;AAED,aAAa;AACb,qBAAa,qBAAsB,SAAQ,gBAAgB;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAEhB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAE,MAAM,EAAO;CAKpE;AAED,aAAa;AACb,qBAAa,kBAAmB,SAAQ,gBAAgB;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAO1D;AAED,aAAa;AACb,qBAAa,YAAa,SAAQ,gBAAgB;IAChD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAEjB,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAU9D;AAED,YAAY;AACZ,qBAAa,aAAc,SAAQ,gBAAgB;gBACrC,OAAO,EAAE,MAAM;CAG5B;AAED,gBAAgB;AAChB,qBAAa,WAAY,SAAQ,gBAAgB;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAOhD;AAED,YAAY;AACZ,qBAAa,2BAA4B,SAAQ,gBAAgB;gBACnD,IAAI,EAAE,MAAM;CAGzB;AAED,oBAAoB;AACpB,qBAAa,gBAAiB,SAAQ,gBAAgB;gBACxC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAMjD;AAED,cAAc;AACd,qBAAa,iBAAkB,SAAQ,gBAAgB;gBACzC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAOrE;AAED,cAAc;AACd,qBAAa,kBAAmB,SAAQ,gBAAgB;gBAC1C,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO;CAO9C;AAED,aAAa;AACb,qBAAa,sBAAuB,SAAQ,gBAAgB;gBAC9C,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAMnD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAyBjD"}
|
package/dist/core/errors.js
CHANGED
|
@@ -94,6 +94,32 @@ export class PluginAlreadyInstalledError extends NovelWriterError {
|
|
|
94
94
|
super(`插件 "${name}" 已安装。如需更新请使用 plugin:update`, 'PLUGIN_ALREADY_INSTALLED');
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
+
/** 文件缺失错误(带修复建议) */
|
|
98
|
+
export class MissingFileError extends NovelWriterError {
|
|
99
|
+
constructor(filePath, suggestion) {
|
|
100
|
+
super(`文件不存在: ${filePath}\n\n💡 修复建议: ${suggestion}`, 'MISSING_FILE');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** 模式不匹配错误 */
|
|
104
|
+
export class ModeMismatchError extends NovelWriterError {
|
|
105
|
+
constructor(expectedMode, actualMode, action) {
|
|
106
|
+
super(`模式不匹配: 当前项目使用 ${actualMode} 模式,但 ${action} 需要 ${expectedMode} 模式\n\n` +
|
|
107
|
+
`💡 修复建议: 运行 /track --migrate --target ${expectedMode}`, 'MODE_MISMATCH');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** 数据完整性错误 */
|
|
111
|
+
export class DataIntegrityError extends NovelWriterError {
|
|
112
|
+
constructor(issue, autoFixed) {
|
|
113
|
+
super(`数据完整性问题: ${issue}\n\n` +
|
|
114
|
+
(autoFixed ? '✅ 已自动修复' : '⚠️ 需要手动检查'), 'DATA_INTEGRITY');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** 依赖缺失错误 */
|
|
118
|
+
export class DependencyMissingError extends NovelWriterError {
|
|
119
|
+
constructor(dependency, installCmd) {
|
|
120
|
+
super(`缺少依赖: ${dependency}\n\n💡 安装方法: ${installCmd}`, 'DEPENDENCY_MISSING');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
97
123
|
/**
|
|
98
124
|
* CLI 全局错误处理
|
|
99
125
|
* 将 NovelWriterError 格式化为用户友好的输出,非预期错误输出堆栈
|
package/dist/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 项目诊断系统
|
|
3
|
+
*
|
|
4
|
+
* 命令失败时自动诊断并给出修复步骤。
|
|
5
|
+
* 5 项检查:项目结构、JSON 格式、项目模式、依赖状态、修复建议。
|
|
6
|
+
*/
|
|
7
|
+
/** 单项检查结果 */
|
|
8
|
+
export interface CheckResult {
|
|
9
|
+
name: string;
|
|
10
|
+
passed: boolean;
|
|
11
|
+
message: string;
|
|
12
|
+
fix?: string;
|
|
13
|
+
}
|
|
14
|
+
/** 诊断报告 */
|
|
15
|
+
export interface DiagnosticReport {
|
|
16
|
+
error: string;
|
|
17
|
+
checks: CheckResult[];
|
|
18
|
+
fixes: string[];
|
|
19
|
+
summary: string;
|
|
20
|
+
}
|
|
21
|
+
/** 命令上下文 */
|
|
22
|
+
export interface CommandContext {
|
|
23
|
+
command: string;
|
|
24
|
+
projectRoot: string;
|
|
25
|
+
args?: string[];
|
|
26
|
+
}
|
|
27
|
+
/** 项目模式 */
|
|
28
|
+
export type ProjectMode = 'single-file' | 'sharded' | 'mcp' | 'unknown';
|
|
29
|
+
export declare class ProjectDiagnostics {
|
|
30
|
+
/**
|
|
31
|
+
* 对错误进行诊断,返回诊断报告
|
|
32
|
+
*/
|
|
33
|
+
diagnoseError(error: Error, context: CommandContext): Promise<DiagnosticReport>;
|
|
34
|
+
/**
|
|
35
|
+
* 检查 1: 项目结构是否完整
|
|
36
|
+
*/
|
|
37
|
+
checkProjectStructure(projectRoot: string): Promise<CheckResult>;
|
|
38
|
+
/**
|
|
39
|
+
* 检查 2: tracking 文件是否存在
|
|
40
|
+
*/
|
|
41
|
+
checkTrackingFiles(projectRoot: string): Promise<CheckResult>;
|
|
42
|
+
/**
|
|
43
|
+
* 检查 3: 项目模式是否匹配
|
|
44
|
+
*/
|
|
45
|
+
checkProjectMode(projectRoot: string): Promise<CheckResult>;
|
|
46
|
+
/**
|
|
47
|
+
* 检查 4: MCP 服务器状态
|
|
48
|
+
*/
|
|
49
|
+
checkMCPStatus(projectRoot: string): Promise<CheckResult>;
|
|
50
|
+
/**
|
|
51
|
+
* 检查 5: JSON 文件完整性
|
|
52
|
+
*/
|
|
53
|
+
checkFileIntegrity(projectRoot: string): Promise<CheckResult>;
|
|
54
|
+
/**
|
|
55
|
+
* 检测项目模式
|
|
56
|
+
*/
|
|
57
|
+
detectProjectMode(projectRoot: string): Promise<ProjectMode>;
|
|
58
|
+
/**
|
|
59
|
+
* 格式化诊断报告为用户友好的字符串
|
|
60
|
+
*/
|
|
61
|
+
formatReport(report: DiagnosticReport): string;
|
|
62
|
+
private generateSummary;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/utils/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,aAAa;AACb,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,WAAW;AACX,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,YAAY;AACZ,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,WAAW;AACX,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC;AAExE,qBAAa,kBAAkB;IAC7B;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqBrF;;OAEG;IACG,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA2BtE;;OAEG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsCnE;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAmBjE;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA2B/D;;OAEG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuCnE;;OAEG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsBlE;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;IAuB9C,OAAO,CAAC,eAAe;CAWxB"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 项目诊断系统
|
|
3
|
+
*
|
|
4
|
+
* 命令失败时自动诊断并给出修复步骤。
|
|
5
|
+
* 5 项检查:项目结构、JSON 格式、项目模式、依赖状态、修复建议。
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'fs-extra';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import { getProjectPaths } from '../core/config.js';
|
|
10
|
+
export class ProjectDiagnostics {
|
|
11
|
+
/**
|
|
12
|
+
* 对错误进行诊断,返回诊断报告
|
|
13
|
+
*/
|
|
14
|
+
async diagnoseError(error, context) {
|
|
15
|
+
const checks = await Promise.all([
|
|
16
|
+
this.checkProjectStructure(context.projectRoot),
|
|
17
|
+
this.checkTrackingFiles(context.projectRoot),
|
|
18
|
+
this.checkProjectMode(context.projectRoot),
|
|
19
|
+
this.checkMCPStatus(context.projectRoot),
|
|
20
|
+
this.checkFileIntegrity(context.projectRoot),
|
|
21
|
+
]);
|
|
22
|
+
const fixes = checks
|
|
23
|
+
.filter(c => !c.passed && c.fix)
|
|
24
|
+
.map(c => c.fix);
|
|
25
|
+
return {
|
|
26
|
+
error: error.message,
|
|
27
|
+
checks,
|
|
28
|
+
fixes,
|
|
29
|
+
summary: this.generateSummary(checks),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 检查 1: 项目结构是否完整
|
|
34
|
+
*/
|
|
35
|
+
async checkProjectStructure(projectRoot) {
|
|
36
|
+
const paths = getProjectPaths(projectRoot);
|
|
37
|
+
const requiredDirs = [
|
|
38
|
+
{ path: paths.specify, label: '.specify' },
|
|
39
|
+
{ path: paths.claude, label: '.claude' },
|
|
40
|
+
{ path: paths.commands, label: '.claude/commands' },
|
|
41
|
+
];
|
|
42
|
+
const missing = [];
|
|
43
|
+
for (const dir of requiredDirs) {
|
|
44
|
+
if (!await fs.pathExists(dir.path)) {
|
|
45
|
+
missing.push(dir.label);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (missing.length === 0) {
|
|
49
|
+
return { name: '项目结构', passed: true, message: '项目结构正常' };
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
name: '项目结构',
|
|
53
|
+
passed: false,
|
|
54
|
+
message: `缺少目录: ${missing.join(', ')}`,
|
|
55
|
+
fix: 'novelws init',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 检查 2: tracking 文件是否存在
|
|
60
|
+
*/
|
|
61
|
+
async checkTrackingFiles(projectRoot) {
|
|
62
|
+
const trackingDir = getProjectPaths(projectRoot).tracking;
|
|
63
|
+
if (!await fs.pathExists(trackingDir)) {
|
|
64
|
+
return {
|
|
65
|
+
name: 'Tracking 文件',
|
|
66
|
+
passed: false,
|
|
67
|
+
message: 'spec/tracking 目录不存在',
|
|
68
|
+
fix: '/track --sync',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const expectedFiles = [
|
|
72
|
+
'character-state.json',
|
|
73
|
+
'plot-tracker.json',
|
|
74
|
+
'timeline.json',
|
|
75
|
+
'relationships.json',
|
|
76
|
+
];
|
|
77
|
+
const missing = [];
|
|
78
|
+
for (const file of expectedFiles) {
|
|
79
|
+
if (!await fs.pathExists(path.join(trackingDir, file))) {
|
|
80
|
+
missing.push(file);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (missing.length === 0) {
|
|
84
|
+
return { name: 'Tracking 文件', passed: true, message: 'tracking 文件存在' };
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
name: 'Tracking 文件',
|
|
88
|
+
passed: false,
|
|
89
|
+
message: `缺少 tracking 文件: ${missing.join(', ')}`,
|
|
90
|
+
fix: '/track --sync',
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 检查 3: 项目模式是否匹配
|
|
95
|
+
*/
|
|
96
|
+
async checkProjectMode(projectRoot) {
|
|
97
|
+
const mode = await this.detectProjectMode(projectRoot);
|
|
98
|
+
if (mode === 'unknown') {
|
|
99
|
+
return {
|
|
100
|
+
name: '项目模式',
|
|
101
|
+
passed: false,
|
|
102
|
+
message: '无法检测项目模式',
|
|
103
|
+
fix: '/track --sync',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
name: '项目模式',
|
|
108
|
+
passed: true,
|
|
109
|
+
message: `当前模式: ${mode}`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 检查 4: MCP 服务器状态
|
|
114
|
+
*/
|
|
115
|
+
async checkMCPStatus(projectRoot) {
|
|
116
|
+
const dbPath = path.join(projectRoot, 'novel-tracking.db');
|
|
117
|
+
const mcpConfigPath = path.join(projectRoot, '.claude', 'mcp.json');
|
|
118
|
+
const hasDb = await fs.pathExists(dbPath);
|
|
119
|
+
const hasMcpConfig = await fs.pathExists(mcpConfigPath);
|
|
120
|
+
if (!hasMcpConfig) {
|
|
121
|
+
return {
|
|
122
|
+
name: 'MCP 状态',
|
|
123
|
+
passed: true,
|
|
124
|
+
message: '未配置 MCP(使用 JSON 模式)',
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (hasMcpConfig && !hasDb) {
|
|
128
|
+
return {
|
|
129
|
+
name: 'MCP 状态',
|
|
130
|
+
passed: false,
|
|
131
|
+
message: 'MCP 已配置但数据库不存在',
|
|
132
|
+
fix: '/track --migrate --target mcp',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return { name: 'MCP 状态', passed: true, message: 'MCP 服务正常' };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* 检查 5: JSON 文件完整性
|
|
139
|
+
*/
|
|
140
|
+
async checkFileIntegrity(projectRoot) {
|
|
141
|
+
const trackingDir = getProjectPaths(projectRoot).tracking;
|
|
142
|
+
if (!await fs.pathExists(trackingDir)) {
|
|
143
|
+
return { name: '文件完整性', passed: true, message: '无 tracking 文件需要验证' };
|
|
144
|
+
}
|
|
145
|
+
const jsonFiles = [
|
|
146
|
+
'character-state.json',
|
|
147
|
+
'plot-tracker.json',
|
|
148
|
+
'timeline.json',
|
|
149
|
+
'relationships.json',
|
|
150
|
+
];
|
|
151
|
+
const corrupted = [];
|
|
152
|
+
for (const file of jsonFiles) {
|
|
153
|
+
const filePath = path.join(trackingDir, file);
|
|
154
|
+
if (await fs.pathExists(filePath)) {
|
|
155
|
+
try {
|
|
156
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
157
|
+
JSON.parse(content);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
corrupted.push(file);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (corrupted.length === 0) {
|
|
165
|
+
return { name: '文件完整性', passed: true, message: 'JSON 文件格式正确' };
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
name: '文件完整性',
|
|
169
|
+
passed: false,
|
|
170
|
+
message: `JSON 格式损坏: ${corrupted.join(', ')}`,
|
|
171
|
+
fix: '/track --fix',
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 检测项目模式
|
|
176
|
+
*/
|
|
177
|
+
async detectProjectMode(projectRoot) {
|
|
178
|
+
const paths = getProjectPaths(projectRoot);
|
|
179
|
+
const dbPath = path.join(projectRoot, 'novel-tracking.db');
|
|
180
|
+
if (await fs.pathExists(dbPath)) {
|
|
181
|
+
return 'mcp';
|
|
182
|
+
}
|
|
183
|
+
if (await fs.pathExists(paths.trackingVolumes)) {
|
|
184
|
+
const entries = await fs.readdir(paths.trackingVolumes).catch(() => []);
|
|
185
|
+
if (entries.length > 0) {
|
|
186
|
+
return 'sharded';
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (await fs.pathExists(paths.tracking)) {
|
|
190
|
+
return 'single-file';
|
|
191
|
+
}
|
|
192
|
+
return 'unknown';
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* 格式化诊断报告为用户友好的字符串
|
|
196
|
+
*/
|
|
197
|
+
formatReport(report) {
|
|
198
|
+
const lines = [
|
|
199
|
+
`❌ 错误: ${report.error}`,
|
|
200
|
+
'',
|
|
201
|
+
'🔍 诊断结果:',
|
|
202
|
+
];
|
|
203
|
+
for (const check of report.checks) {
|
|
204
|
+
const icon = check.passed ? '✅' : '❌';
|
|
205
|
+
lines.push(` ${icon} ${check.name}: ${check.message}`);
|
|
206
|
+
}
|
|
207
|
+
if (report.fixes.length > 0) {
|
|
208
|
+
lines.push('');
|
|
209
|
+
lines.push('💡 修复步骤:');
|
|
210
|
+
report.fixes.forEach((fix, i) => {
|
|
211
|
+
lines.push(` ${i + 1}. 运行: ${fix}`);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return lines.join('\n');
|
|
215
|
+
}
|
|
216
|
+
generateSummary(checks) {
|
|
217
|
+
const passed = checks.filter(c => c.passed).length;
|
|
218
|
+
const total = checks.length;
|
|
219
|
+
if (passed === total) {
|
|
220
|
+
return '所有检查通过,问题可能来自其他原因';
|
|
221
|
+
}
|
|
222
|
+
const failed = checks.filter(c => !c.passed).map(c => c.name);
|
|
223
|
+
return `${passed}/${total} 项检查通过,问题: ${failed.join(', ')}`;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/utils/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAQ,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA4B1D,MAAM,OAAO,kBAAkB;IAC7B;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,KAAY,EAAE,OAAuB;QACvD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC/B,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,WAAW,CAAC;YAC/C,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC;YAC5C,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC;YAC1C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC;YACxC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC;SAC7C,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM;aACjB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAI,CAAC,CAAC;QAEpB,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,OAAO;YACpB,MAAM;YACN,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;SACtC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CAAC,WAAmB;QAC7C,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG;YACnB,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE;YAC1C,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE;YACxC,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE;SACpD,CAAC;QAEF,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC3D,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtC,GAAG,EAAE,cAAc;SACpB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,WAAmB;QAC1C,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC;QAE1D,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACtC,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,qBAAqB;gBAC9B,GAAG,EAAE,eAAe;aACrB,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG;YACpB,sBAAsB;YACtB,mBAAmB;YACnB,eAAe;YACf,oBAAoB;SACrB,CAAC;QAEF,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;QACzE,CAAC;QAED,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,mBAAmB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAChD,GAAG,EAAE,eAAe;SACrB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,WAAmB;QACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAEvD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,UAAU;gBACnB,GAAG,EAAE,eAAe;aACrB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,SAAS,IAAI,EAAE;SACzB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,WAAmB;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAExD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,qBAAqB;aAC/B,CAAC;QACJ,CAAC;QAED,IAAI,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,gBAAgB;gBACzB,GAAG,EAAE,+BAA+B;aACrC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,WAAmB;QAC1C,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC;QAE1D,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;QACvE,CAAC;QAED,MAAM,SAAS,GAAG;YAChB,sBAAsB;YACtB,mBAAmB;YACnB,eAAe;YACf,oBAAoB;SACrB,CAAC;QAEF,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC9C,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QACjE,CAAC;QAED,OAAO;YACL,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,cAAc,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7C,GAAG,EAAE,cAAc;SACpB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QACzC,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAE3D,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACxE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAwB;QACnC,MAAM,KAAK,GAAa;YACtB,SAAS,MAAM,CAAC,KAAK,EAAE;YACvB,EAAE;YACF,UAAU;SACX,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;gBAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,eAAe,CAAC,MAAqB;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QAE5B,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,OAAO,mBAAmB,CAAC;QAC7B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9D,OAAO,GAAG,MAAM,IAAI,KAAK,cAAc,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7D,CAAC;CACF"}
|