@dayinxisheng/novel-tools 0.2.2 → 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 +70 -0
- package/README.md +88 -12
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +2 -49
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/config.d.ts +6 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +164 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/event.js +3 -3
- package/dist/commands/event.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +11 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/query.js +5 -5
- package/dist/commands/query.js.map +1 -1
- package/dist/commands/shared.d.ts +8 -3
- package/dist/commands/shared.d.ts.map +1 -1
- package/dist/commands/shared.js +17 -2
- package/dist/commands/shared.js.map +1 -1
- package/dist/commands/snapshot.js +3 -3
- package/dist/commands/snapshot.js.map +1 -1
- package/dist/commands/temp-setting.js +4 -4
- package/dist/commands/temp-setting.js.map +1 -1
- package/dist/core/constants.d.ts +0 -1
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +0 -1
- package/dist/core/constants.js.map +1 -1
- package/dist/core/git.d.ts +28 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +71 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/types.d.ts +10 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/services/config.service.d.ts +78 -0
- package/dist/services/config.service.d.ts.map +1 -0
- package/dist/services/config.service.js +178 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -0
- package/dist/services/index.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,76 @@ 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
|
+
|
|
18
|
+
## [0.3.0] - 2026-03-11
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
#### config 命令 - 全局配置管理
|
|
23
|
+
- `config set <path>` - 为当前项目设置小说路径
|
|
24
|
+
- 自动检测 git 仓库根目录
|
|
25
|
+
- 支持相对路径和绝对路径
|
|
26
|
+
- 验证小说项目有效性
|
|
27
|
+
- `config get` - 查看当前项目配置
|
|
28
|
+
- 显示项目根目录
|
|
29
|
+
- 显示小说路径
|
|
30
|
+
- `config list` - 列出所有已配置的项目
|
|
31
|
+
- 显示所有项目映射
|
|
32
|
+
- 按项目根目录排序
|
|
33
|
+
- `config unset` - 删除当前项目配置
|
|
34
|
+
- 支持强制删除(--force)
|
|
35
|
+
- 支持交互式确认
|
|
36
|
+
|
|
37
|
+
#### Git 工具类
|
|
38
|
+
- `GitUtils.findRepositoryRoot()` - 查找 git 仓库根目录
|
|
39
|
+
- 从当前目录向上查找 .git 目录
|
|
40
|
+
- 支持文件和目录形式的 .git
|
|
41
|
+
- `GitUtils.normalizePath()` - 规范化路径
|
|
42
|
+
- 解析符号链接
|
|
43
|
+
- 去除末尾斜杠
|
|
44
|
+
- `GitUtils.isInGitRepository()` - 检查是否在 git 仓库中
|
|
45
|
+
|
|
46
|
+
#### 配置服务
|
|
47
|
+
- `ConfigService` - 全局配置管理服务
|
|
48
|
+
- 配置文件位置: `~/.novel-tools/config.json`
|
|
49
|
+
- 支持多项目配置
|
|
50
|
+
- 自动创建配置目录
|
|
51
|
+
- 路径规范化处理
|
|
52
|
+
|
|
53
|
+
#### 自动路径解析
|
|
54
|
+
- 所有命令支持自动路径解析
|
|
55
|
+
- 优先级: `-p` 参数 > 全局配置 > 当前目录
|
|
56
|
+
- 在项目任何子目录执行命令时自动找到配置
|
|
57
|
+
- 不同项目有各自配置,互不干扰
|
|
58
|
+
|
|
59
|
+
#### 配置类型定义
|
|
60
|
+
- `NovelToolsConfig` - 全局配置接口
|
|
61
|
+
- `ProjectMapping` - 项目映射接口
|
|
62
|
+
- `ConfigOptions` - 配置选项接口
|
|
63
|
+
|
|
64
|
+
### Changed
|
|
65
|
+
|
|
66
|
+
#### CliUtils.resolveProjectPath()
|
|
67
|
+
- 从同步方法改为异步方法
|
|
68
|
+
- 支持从全局配置查找小说路径
|
|
69
|
+
- 所有命令的 `resolveProjectPath` 调用更新为 `await`
|
|
70
|
+
|
|
71
|
+
#### 核心模块导出
|
|
72
|
+
- `core/index.ts` - 新增 GitUtils 导出
|
|
73
|
+
|
|
74
|
+
### Breaking Changes
|
|
75
|
+
- `CliUtils.resolveProjectPath()` 现在是异步方法
|
|
76
|
+
- 所有直接调用此方法的代码需要使用 `await`
|
|
77
|
+
|
|
8
78
|
## [0.2.2] - 2026-03-10
|
|
9
79
|
|
|
10
80
|
### Added
|
package/README.md
CHANGED
|
@@ -8,12 +8,14 @@
|
|
|
8
8
|
|
|
9
9
|
## 功能
|
|
10
10
|
|
|
11
|
+
- **全局配置**:管理项目路径配置,支持自动路径解析
|
|
11
12
|
- **项目初始化**:创建标准的小说项目目录结构
|
|
12
13
|
- **查询功能**:查询静态设定、人物信息、状态快照、人物关系、伏笔等
|
|
13
14
|
- **事件管理**:追加事件、生成章节摘要、列出事件
|
|
14
15
|
- **临时设定**:添加临时设定、审核队列、迁移到正式设定
|
|
15
|
-
-
|
|
16
|
+
- **快照管理**:生成、列出、查看卷级/弧级状态快照
|
|
16
17
|
- **一致性检查**:检查大纲、章节、弧、卷的一致性
|
|
18
|
+
- **风格分析**:从 JSONL 文件提取章节内容用于写作风格分析
|
|
17
19
|
|
|
18
20
|
## 安装
|
|
19
21
|
|
|
@@ -29,6 +31,24 @@ npm install @dayinxisheng/novel-tools
|
|
|
29
31
|
|
|
30
32
|
## 使用
|
|
31
33
|
|
|
34
|
+
### 全局配置管理
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# 设置当前项目的小说路径
|
|
38
|
+
novel-tools config set my-novel
|
|
39
|
+
|
|
40
|
+
# 查看当前项目配置
|
|
41
|
+
novel-tools config get
|
|
42
|
+
|
|
43
|
+
# 列出所有已配置的项目
|
|
44
|
+
novel-tools config list
|
|
45
|
+
|
|
46
|
+
# 删除当前项目配置
|
|
47
|
+
novel-tools config unset
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
配置后,在项目的任何子目录执行命令都会自动使用配置的小说路径,无需每次指定 `-p` 参数。
|
|
51
|
+
|
|
32
52
|
### 初始化项目
|
|
33
53
|
|
|
34
54
|
```bash
|
|
@@ -38,10 +58,34 @@ novel-tools init my-novel webnovel
|
|
|
38
58
|
### 查询设定
|
|
39
59
|
|
|
40
60
|
```bash
|
|
41
|
-
|
|
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
|
+
# 查询人物信息
|
|
42
72
|
novel-tools query character 张三
|
|
73
|
+
|
|
74
|
+
# 查询人物关系
|
|
43
75
|
novel-tools query relationships 张三
|
|
76
|
+
novel-tools query relationships
|
|
77
|
+
|
|
78
|
+
# 查询伏笔(默认显示未解决)
|
|
44
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
|
|
45
89
|
```
|
|
46
90
|
|
|
47
91
|
### 事件管理
|
|
@@ -50,24 +94,24 @@ novel-tools query foreshadows
|
|
|
50
94
|
|
|
51
95
|
```bash
|
|
52
96
|
# JSON 字符串
|
|
53
|
-
novel-tools event append
|
|
97
|
+
novel-tools event append 1 --events '[{"type":"出场","character":"林风"}]'
|
|
54
98
|
|
|
55
99
|
# 从文件
|
|
56
|
-
novel-tools event append
|
|
100
|
+
novel-tools event append 1 --file events.json
|
|
57
101
|
|
|
58
102
|
# 交互式
|
|
59
|
-
novel-tools event append
|
|
103
|
+
novel-tools event append 1 --interactive
|
|
60
104
|
|
|
61
105
|
# 覆盖已存在的事件
|
|
62
|
-
novel-tools event append
|
|
106
|
+
novel-tools event append 1 --events '[...]' --replace
|
|
63
107
|
```
|
|
64
108
|
|
|
65
109
|
#### 章节摘要
|
|
66
110
|
|
|
67
111
|
```bash
|
|
68
|
-
novel-tools event summary
|
|
69
|
-
novel-tools event summary
|
|
70
|
-
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
|
|
71
115
|
```
|
|
72
116
|
|
|
73
117
|
#### 列出事件
|
|
@@ -83,7 +127,7 @@ novel-tools event list --type 出场
|
|
|
83
127
|
#### 添加临时设定
|
|
84
128
|
|
|
85
129
|
```bash
|
|
86
|
-
#
|
|
130
|
+
# 添加人物(--type、--name、--chapter 为必需参数)
|
|
87
131
|
novel-tools temp-setting add --type character --name 林风 --chapter 5 --description "主要角色"
|
|
88
132
|
|
|
89
133
|
# 添加物品
|
|
@@ -132,8 +176,40 @@ novel-tools check volume 1
|
|
|
132
176
|
### 生成快照
|
|
133
177
|
|
|
134
178
|
```bash
|
|
135
|
-
|
|
136
|
-
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
|
|
137
213
|
```
|
|
138
214
|
|
|
139
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
|
@@ -13,7 +13,7 @@ export function createCheckCommand() {
|
|
|
13
13
|
.option('-p, --path <path>', '项目路径')
|
|
14
14
|
.action(async (options) => {
|
|
15
15
|
try {
|
|
16
|
-
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
16
|
+
const projectPath = await CliUtils.resolveProjectPath(options.path);
|
|
17
17
|
const validateService = new ValidateService();
|
|
18
18
|
CliUtils.title('检查大纲');
|
|
19
19
|
const result = await validateService.validateOutline(projectPath);
|
|
@@ -34,7 +34,7 @@ export function createCheckCommand() {
|
|
|
34
34
|
.option('-p, --path <path>', '项目路径')
|
|
35
35
|
.action(async (chapterStr, options) => {
|
|
36
36
|
try {
|
|
37
|
-
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
37
|
+
const projectPath = await CliUtils.resolveProjectPath(options.path);
|
|
38
38
|
const validateService = new ValidateService();
|
|
39
39
|
const chapter = parseInt(chapterStr, 10);
|
|
40
40
|
if (isNaN(chapter) || chapter < 1) {
|
|
@@ -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 = 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 = 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,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAsK7C"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { ConfigService } from '../services/config.service.js';
|
|
4
|
+
import { GitUtils } from '../core/git.js';
|
|
5
|
+
import { CliUtils } from './shared.js';
|
|
6
|
+
import { FileUtils } from '../core/file.js';
|
|
7
|
+
/**
|
|
8
|
+
* 创建 config 命令
|
|
9
|
+
*/
|
|
10
|
+
export function createConfigCommand() {
|
|
11
|
+
const cmd = new Command('config');
|
|
12
|
+
cmd.description('管理 novel-tools 全局配置');
|
|
13
|
+
// 设置当前项目的小说路径
|
|
14
|
+
cmd
|
|
15
|
+
.command('set')
|
|
16
|
+
.argument('<path>', '小说项目路径(相对或绝对)')
|
|
17
|
+
.option('-r, --root <path>', '项目根目录(默认为当前 git 仓库根目录)')
|
|
18
|
+
.action(async (novelPath, options) => {
|
|
19
|
+
try {
|
|
20
|
+
const configService = new ConfigService();
|
|
21
|
+
// 确定项目根目录
|
|
22
|
+
let projectRoot;
|
|
23
|
+
if (options.root) {
|
|
24
|
+
projectRoot = await GitUtils.normalizePath(options.root);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
const root = await GitUtils.findRepositoryRoot(process.cwd());
|
|
28
|
+
if (!root) {
|
|
29
|
+
CliUtils.error('当前目录不在 git 仓库中,请使用 --root 参数指定项目根目录');
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
projectRoot = await GitUtils.normalizePath(root);
|
|
33
|
+
}
|
|
34
|
+
// 验证小说路径是否存在
|
|
35
|
+
const resolvedPath = configService.resolveNovelPath(projectRoot, novelPath);
|
|
36
|
+
const projectJsonPath = path.join(resolvedPath, 'project.json');
|
|
37
|
+
if (!FileUtils.exists(projectJsonPath)) {
|
|
38
|
+
CliUtils.warning(`警告: ${resolvedPath} 中未找到 project.json 文件`);
|
|
39
|
+
const confirmed = await CliUtils.confirm('是否继续保存配置?');
|
|
40
|
+
if (!confirmed) {
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// 保存配置
|
|
45
|
+
await configService.addProject(projectRoot, novelPath);
|
|
46
|
+
CliUtils.success('配置已保存');
|
|
47
|
+
CliUtils.printKeyValue('项目根目录', projectRoot);
|
|
48
|
+
CliUtils.printKeyValue('小说路径', novelPath);
|
|
49
|
+
CliUtils.printKeyValue('实际路径', resolvedPath);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
// 显示当前项目配置
|
|
57
|
+
cmd
|
|
58
|
+
.command('get')
|
|
59
|
+
.option('-r, --root <path>', '项目根目录')
|
|
60
|
+
.action(async (options) => {
|
|
61
|
+
try {
|
|
62
|
+
const configService = new ConfigService();
|
|
63
|
+
// 确定项目根目录
|
|
64
|
+
let projectRoot;
|
|
65
|
+
if (options.root) {
|
|
66
|
+
projectRoot = await GitUtils.normalizePath(options.root);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const root = await GitUtils.findRepositoryRoot(process.cwd());
|
|
70
|
+
if (!root) {
|
|
71
|
+
CliUtils.info('当前目录不在 git 仓库中');
|
|
72
|
+
CliUtils.info('使用 --root 参数指定项目根目录可查看配置');
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
projectRoot = await GitUtils.normalizePath(root);
|
|
76
|
+
}
|
|
77
|
+
// 查询配置
|
|
78
|
+
const hasConfig = await configService.hasProjectConfig(projectRoot);
|
|
79
|
+
if (!hasConfig) {
|
|
80
|
+
CliUtils.info('当前项目没有配置');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const projectConfig = await configService.getCurrentProjectConfig(projectRoot);
|
|
84
|
+
if (projectConfig) {
|
|
85
|
+
CliUtils.title('当前项目配置');
|
|
86
|
+
CliUtils.printKeyValue('项目根目录', projectConfig.root);
|
|
87
|
+
CliUtils.printKeyValue('小说路径', projectConfig.novelPath);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// 列出所有项目配置
|
|
96
|
+
cmd
|
|
97
|
+
.command('list')
|
|
98
|
+
.action(async () => {
|
|
99
|
+
try {
|
|
100
|
+
const configService = new ConfigService();
|
|
101
|
+
const projects = await configService.listProjects();
|
|
102
|
+
CliUtils.title(`已配置项目 (${projects.length})`);
|
|
103
|
+
if (projects.length === 0) {
|
|
104
|
+
CliUtils.info('暂无配置');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
for (const project of projects) {
|
|
108
|
+
console.log();
|
|
109
|
+
CliUtils.printKeyValue('项目根目录', project.root);
|
|
110
|
+
CliUtils.printKeyValue('小说路径', project.novelPath);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
// 删除当前项目配置
|
|
119
|
+
cmd
|
|
120
|
+
.command('unset')
|
|
121
|
+
.option('-r, --root <path>', '项目根目录')
|
|
122
|
+
.option('-f, --force', '强制删除,无需确认')
|
|
123
|
+
.action(async (options) => {
|
|
124
|
+
try {
|
|
125
|
+
const configService = new ConfigService();
|
|
126
|
+
// 确定项目根目录
|
|
127
|
+
let projectRoot;
|
|
128
|
+
if (options.root) {
|
|
129
|
+
projectRoot = await GitUtils.normalizePath(options.root);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
const root = await GitUtils.findRepositoryRoot(process.cwd());
|
|
133
|
+
if (!root) {
|
|
134
|
+
CliUtils.error('当前目录不在 git 仓库中,请使用 --root 参数指定项目根目录');
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
projectRoot = await GitUtils.normalizePath(root);
|
|
138
|
+
}
|
|
139
|
+
// 检查是否存在配置
|
|
140
|
+
const hasConfig = await configService.hasProjectConfig(projectRoot);
|
|
141
|
+
if (!hasConfig) {
|
|
142
|
+
CliUtils.info('当前项目没有配置');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// 确认删除
|
|
146
|
+
if (!options.force) {
|
|
147
|
+
const confirmed = await CliUtils.confirm(`确定要删除项目 ${projectRoot} 的配置吗?`);
|
|
148
|
+
if (!confirmed) {
|
|
149
|
+
CliUtils.info('操作已取消');
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// 删除配置
|
|
154
|
+
await configService.removeProject(projectRoot);
|
|
155
|
+
CliUtils.success('配置已删除');
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
return cmd;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/event.js
CHANGED
|
@@ -18,7 +18,7 @@ export function createEventCommand() {
|
|
|
18
18
|
.option('-p, --path <path>', '项目路径')
|
|
19
19
|
.action(async (chapter, options) => {
|
|
20
20
|
try {
|
|
21
|
-
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
21
|
+
const projectPath = await CliUtils.resolveProjectPath(options.path);
|
|
22
22
|
const chapterNum = parseInt(chapter, 10);
|
|
23
23
|
if (isNaN(chapterNum) || chapterNum < 1) {
|
|
24
24
|
CliUtils.error('章节号必须是正整数');
|
|
@@ -52,7 +52,7 @@ export function createEventCommand() {
|
|
|
52
52
|
.option('-p, --path <path>', '项目路径')
|
|
53
53
|
.action(async (chapter, options) => {
|
|
54
54
|
try {
|
|
55
|
-
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
55
|
+
const projectPath = await CliUtils.resolveProjectPath(options.path);
|
|
56
56
|
const chapterNum = parseInt(chapter, 10);
|
|
57
57
|
if (isNaN(chapterNum) || chapterNum < 1) {
|
|
58
58
|
CliUtils.error('章节号必须是正整数');
|
|
@@ -85,7 +85,7 @@ export function createEventCommand() {
|
|
|
85
85
|
.option('-p, --path <path>', '项目路径')
|
|
86
86
|
.action(async (options) => {
|
|
87
87
|
try {
|
|
88
|
-
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
88
|
+
const projectPath = await CliUtils.resolveProjectPath(options.path);
|
|
89
89
|
const service = new EventCommandService();
|
|
90
90
|
let chapter;
|
|
91
91
|
if (options.chapter) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/commands/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,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,UAAU,CAAC,CAAC;IAE5B,sBAAsB;IACtB,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC;SAC5B,MAAM,CAAC,qBAAqB,EAAE,aAAa,CAAC;SAC5C,MAAM,CAAC,mBAAmB,EAAE,cAAc,CAAC;SAC3C,MAAM,CAAC,mBAAmB,EAAE,SAAS,CAAC;SACtC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC;SAC/B,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAAO,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/commands/event.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6CpC,eAAO,MAAM,GAAG,SAAc,CAAC"}
|
package/dist/commands/index.js
CHANGED
|
@@ -7,7 +7,16 @@ import { createSnapshotCommand } from './snapshot.js';
|
|
|
7
7
|
import { createEventCommand } from './event.js';
|
|
8
8
|
import { createTempSettingCommand } from './temp-setting.js';
|
|
9
9
|
import { createStyleCommand } from './style.js';
|
|
10
|
-
import {
|
|
10
|
+
import { createConfigCommand } from './config.js';
|
|
11
|
+
import { CLI_NAME, CLI_DESCRIPTION } from '../core/constants.js';
|
|
12
|
+
import { readFileSync } from 'fs';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
import { dirname, join } from 'path';
|
|
15
|
+
// 从 package.json 读取版本号
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
const packageJson = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));
|
|
19
|
+
const CLI_VERSION = packageJson.version;
|
|
11
20
|
/**
|
|
12
21
|
* 主 CLI 程序
|
|
13
22
|
*/
|
|
@@ -25,6 +34,7 @@ function createCli() {
|
|
|
25
34
|
program.addCommand(createEventCommand());
|
|
26
35
|
program.addCommand(createTempSettingCommand());
|
|
27
36
|
program.addCommand(createStyleCommand());
|
|
37
|
+
program.addCommand(createConfigCommand());
|
|
28
38
|
return program;
|
|
29
39
|
}
|
|
30
40
|
// 导出供测试使用
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,uBAAuB;AACvB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7F,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC;AAExC;;GAEG;AACH,SAAS,SAAS;IAChB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,eAAe,CAAC;SAC5B,OAAO,CAAC,WAAW,CAAC,CAAC;IAExB,QAAQ;IACR,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAExC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,UAAU;AACV,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;AAE/B,cAAc;AACd,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC3C,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/commands/query.js
CHANGED
|
@@ -17,7 +17,7 @@ export function createQueryCommand() {
|
|
|
17
17
|
.option('-s, --section <title>', '提取指定大章节内容')
|
|
18
18
|
.action(async (type, options) => {
|
|
19
19
|
try {
|
|
20
|
-
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
20
|
+
const projectPath = await CliUtils.resolveProjectPath(options.path);
|
|
21
21
|
const queryService = new QueryService();
|
|
22
22
|
if (!await queryService.validateProjectPath(projectPath)) {
|
|
23
23
|
CliUtils.error('未找到小说项目配置文件 (project.json)');
|
|
@@ -64,7 +64,7 @@ export function createQueryCommand() {
|
|
|
64
64
|
.option('-p, --path <path>', '项目路径')
|
|
65
65
|
.action(async (name, options) => {
|
|
66
66
|
try {
|
|
67
|
-
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
67
|
+
const projectPath = await CliUtils.resolveProjectPath(options.path);
|
|
68
68
|
const queryService = new QueryService();
|
|
69
69
|
if (!await queryService.validateProjectPath(projectPath)) {
|
|
70
70
|
CliUtils.error('未找到小说项目配置文件 (project.json)');
|
|
@@ -98,7 +98,7 @@ export function createQueryCommand() {
|
|
|
98
98
|
.option('-p, --path <path>', '项目路径')
|
|
99
99
|
.action(async (name, options) => {
|
|
100
100
|
try {
|
|
101
|
-
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
101
|
+
const projectPath = await CliUtils.resolveProjectPath(options.path);
|
|
102
102
|
const queryService = new QueryService();
|
|
103
103
|
if (!await queryService.validateProjectPath(projectPath)) {
|
|
104
104
|
CliUtils.error('未找到小说项目配置文件 (project.json)');
|
|
@@ -126,7 +126,7 @@ export function createQueryCommand() {
|
|
|
126
126
|
.option('-p, --path <path>', '项目路径')
|
|
127
127
|
.action(async (options) => {
|
|
128
128
|
try {
|
|
129
|
-
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
129
|
+
const projectPath = await CliUtils.resolveProjectPath(options.path);
|
|
130
130
|
const queryService = new QueryService();
|
|
131
131
|
if (!await queryService.validateProjectPath(projectPath)) {
|
|
132
132
|
CliUtils.error('未找到小说项目配置文件 (project.json)');
|
|
@@ -158,7 +158,7 @@ export function createQueryCommand() {
|
|
|
158
158
|
.option('-p, --path <path>', '项目路径')
|
|
159
159
|
.action(async (options) => {
|
|
160
160
|
try {
|
|
161
|
-
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
161
|
+
const projectPath = await CliUtils.resolveProjectPath(options.path);
|
|
162
162
|
const queryService = new QueryService();
|
|
163
163
|
if (!await queryService.validateProjectPath(projectPath)) {
|
|
164
164
|
CliUtils.error('未找到小说项目配置文件 (project.json)');
|