@dayinxisheng/novel-tools 0.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.
Files changed (83) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +80 -0
  3. package/dist/commands/check.d.ts +6 -0
  4. package/dist/commands/check.d.ts.map +1 -0
  5. package/dist/commands/check.js +105 -0
  6. package/dist/commands/check.js.map +1 -0
  7. package/dist/commands/index.d.ts +4 -0
  8. package/dist/commands/index.d.ts.map +1 -0
  9. package/dist/commands/index.js +31 -0
  10. package/dist/commands/index.js.map +1 -0
  11. package/dist/commands/init.d.ts +6 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/init.js +52 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/query.d.ts +6 -0
  16. package/dist/commands/query.d.ts.map +1 -0
  17. package/dist/commands/query.js +169 -0
  18. package/dist/commands/query.js.map +1 -0
  19. package/dist/commands/shared.d.ts +51 -0
  20. package/dist/commands/shared.d.ts.map +1 -0
  21. package/dist/commands/shared.js +110 -0
  22. package/dist/commands/shared.js.map +1 -0
  23. package/dist/commands/snapshot.d.ts +6 -0
  24. package/dist/commands/snapshot.d.ts.map +1 -0
  25. package/dist/commands/snapshot.js +140 -0
  26. package/dist/commands/snapshot.js.map +1 -0
  27. package/dist/core/constants.d.ts +38 -0
  28. package/dist/core/constants.d.ts.map +1 -0
  29. package/dist/core/constants.js +88 -0
  30. package/dist/core/constants.js.map +1 -0
  31. package/dist/core/file.d.ts +55 -0
  32. package/dist/core/file.d.ts.map +1 -0
  33. package/dist/core/file.js +136 -0
  34. package/dist/core/file.js.map +1 -0
  35. package/dist/core/index.d.ts +5 -0
  36. package/dist/core/index.d.ts.map +1 -0
  37. package/dist/core/index.js +8 -0
  38. package/dist/core/index.js.map +1 -0
  39. package/dist/core/types.d.ts +145 -0
  40. package/dist/core/types.d.ts.map +1 -0
  41. package/dist/core/types.js +2 -0
  42. package/dist/core/types.js.map +1 -0
  43. package/dist/core/yaml.d.ts +43 -0
  44. package/dist/core/yaml.d.ts.map +1 -0
  45. package/dist/core/yaml.js +90 -0
  46. package/dist/core/yaml.js.map +1 -0
  47. package/dist/services/event.service.d.ts +35 -0
  48. package/dist/services/event.service.d.ts.map +1 -0
  49. package/dist/services/event.service.js +177 -0
  50. package/dist/services/event.service.js.map +1 -0
  51. package/dist/services/index.d.ts +6 -0
  52. package/dist/services/index.d.ts.map +1 -0
  53. package/dist/services/index.js +7 -0
  54. package/dist/services/index.js.map +1 -0
  55. package/dist/services/init.service.d.ts +51 -0
  56. package/dist/services/init.service.d.ts.map +1 -0
  57. package/dist/services/init.service.js +250 -0
  58. package/dist/services/init.service.js.map +1 -0
  59. package/dist/services/query.service.d.ts +43 -0
  60. package/dist/services/query.service.d.ts.map +1 -0
  61. package/dist/services/query.service.js +129 -0
  62. package/dist/services/query.service.js.map +1 -0
  63. package/dist/services/snapshot.service.d.ts +42 -0
  64. package/dist/services/snapshot.service.d.ts.map +1 -0
  65. package/dist/services/snapshot.service.js +234 -0
  66. package/dist/services/snapshot.service.js.map +1 -0
  67. package/dist/services/validate.service.d.ts +43 -0
  68. package/dist/services/validate.service.d.ts.map +1 -0
  69. package/dist/services/validate.service.js +278 -0
  70. package/dist/services/validate.service.js.map +1 -0
  71. package/dist/utils/index.d.ts +3 -0
  72. package/dist/utils/index.d.ts.map +1 -0
  73. package/dist/utils/index.js +4 -0
  74. package/dist/utils/index.js.map +1 -0
  75. package/dist/utils/output.d.ts +30 -0
  76. package/dist/utils/output.d.ts.map +1 -0
  77. package/dist/utils/output.js +112 -0
  78. package/dist/utils/output.js.map +1 -0
  79. package/dist/utils/validation.d.ts +59 -0
  80. package/dist/utils/validation.d.ts.map +1 -0
  81. package/dist/utils/validation.js +120 -0
  82. package/dist/utils/validation.js.map +1 -0
  83. package/package.json +62 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,45 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.1.0] - 2026-03-09
9
+
10
+ ### Added
11
+ - 初始发布
12
+ - 项目初始化功能 (init 命令)
13
+ - 查询功能 (query 命令)
14
+ - 查询静态设定
15
+ - 查询人物信息
16
+ - 查询人物关系
17
+ - 查询伏笔
18
+ - 查询状态快照
19
+ - 一致性检查功能 (check 命令)
20
+ - 检查大纲完整性
21
+ - 检查章节
22
+ - 检查剧情弧
23
+ - 检查卷
24
+ - 快照功能 (snapshot 命令)
25
+ - 生成快照
26
+ - 列出快照
27
+ - 查看快照
28
+ - 核心模块
29
+ - 文件 I/O 工具
30
+ - YAML 处理工具
31
+ - 类型定义
32
+ - 常量定义
33
+ - 服务层
34
+ - 查询服务
35
+ - 事件服务
36
+ - 快照服务
37
+ - 验证服务
38
+ - 初始化服务
39
+ - CLI 工具
40
+ - 彩色终端输出
41
+ - 友好的错误提示
42
+ - 交互式确认
43
+ - 测试
44
+ - 单元测试
45
+ - 集成测试
package/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # @dayinxisheng/novel-tools
2
+
3
+ 小说创作辅助工具集 - TypeScript 实现
4
+
5
+ ## 概述
6
+
7
+ 这是一套用于长篇小说创作的命令行工具,提供设定管理、状态查询、一致性检查等功能。原 Python 脚本的 TypeScript 移植版本。
8
+
9
+ ## 功能
10
+
11
+ - **项目初始化**:创建标准的小说项目目录结构
12
+ - **查询功能**:查询静态设定、人物信息、状态快照、人物关系、伏笔等
13
+ - **事件管理**:记录章节事件、生成章节摘要
14
+ - **快照生成**:生成卷级/弧级状态快照
15
+ - **一致性检查**:检查大纲、章节、弧、卷的一致性
16
+
17
+ ## 安装
18
+
19
+ ```bash
20
+ npm install -g @dayinxisheng/novel-tools
21
+ ```
22
+
23
+ 或作为项目依赖:
24
+
25
+ ```bash
26
+ npm install @dayinxisheng/novel-tools
27
+ ```
28
+
29
+ ## 使用
30
+
31
+ ### 初始化项目
32
+
33
+ ```bash
34
+ novel-tools init my-novel webnovel
35
+ ```
36
+
37
+ ### 查询设定
38
+
39
+ ```bash
40
+ novel-tools query world
41
+ novel-tools query character 张三
42
+ novel-tools query relationships 张三
43
+ novel-tools query foreshadows
44
+ ```
45
+
46
+ ### 一致性检查
47
+
48
+ ```bash
49
+ novel-tools check outline
50
+ novel-tools check chapter 5
51
+ novel-tools check arc "英雄之旅"
52
+ novel-tools check volume 1
53
+ ```
54
+
55
+ ### 生成快照
56
+
57
+ ```bash
58
+ novel-tools snapshot --volume 1
59
+ novel-tools snapshot --arc "英雄之旅"
60
+ ```
61
+
62
+ ## 开发
63
+
64
+ ```bash
65
+ # 安装依赖
66
+ npm install
67
+
68
+ # 构建
69
+ npm run build
70
+
71
+ # 运行测试
72
+ npm test
73
+
74
+ # 监听模式
75
+ npm run dev
76
+ ```
77
+
78
+ ## 许可证
79
+
80
+ MIT
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * 创建 check 命令
4
+ */
5
+ export declare function createCheckCommand(): Command;
6
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +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,CAiH5C"}
@@ -0,0 +1,105 @@
1
+ import { Command } from 'commander';
2
+ import { ValidateService } from '../services/validate.service.js';
3
+ import { CliUtils } from './shared.js';
4
+ /**
5
+ * 创建 check 命令
6
+ */
7
+ export function createCheckCommand() {
8
+ const cmd = new Command('check');
9
+ cmd.description('检查一致性和完整性');
10
+ // 检查大纲
11
+ cmd
12
+ .command('outline')
13
+ .option('-p, --path <path>', '项目路径')
14
+ .action(async (options) => {
15
+ try {
16
+ const projectPath = CliUtils.resolveProjectPath(options.path);
17
+ const validateService = new ValidateService();
18
+ CliUtils.title('检查大纲');
19
+ const result = await validateService.validateOutline(projectPath);
20
+ CliUtils.printValidationResult(result);
21
+ if (!result.passed) {
22
+ process.exit(1);
23
+ }
24
+ }
25
+ catch (error) {
26
+ CliUtils.error(error instanceof Error ? error.message : String(error));
27
+ process.exit(1);
28
+ }
29
+ });
30
+ // 检查章节
31
+ cmd
32
+ .command('chapter')
33
+ .argument('<number>', '章节号')
34
+ .option('-p, --path <path>', '项目路径')
35
+ .action(async (chapterStr, options) => {
36
+ try {
37
+ const projectPath = CliUtils.resolveProjectPath(options.path);
38
+ const validateService = new ValidateService();
39
+ const chapter = parseInt(chapterStr, 10);
40
+ if (isNaN(chapter) || chapter < 1) {
41
+ CliUtils.error('无效的章节号');
42
+ process.exit(1);
43
+ }
44
+ CliUtils.title(`检查第 ${chapter} 章`);
45
+ const result = await validateService.validateChapter(projectPath, chapter);
46
+ CliUtils.printValidationResult(result);
47
+ if (!result.passed) {
48
+ process.exit(1);
49
+ }
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('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
+ return cmd;
104
+ }
105
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ export declare const cli: Command;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,eAAO,MAAM,GAAG,SAAc,CAAC"}
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { createInitCommand } from './init.js';
4
+ import { createQueryCommand } from './query.js';
5
+ import { createCheckCommand } from './check.js';
6
+ import { createSnapshotCommand } from './snapshot.js';
7
+ import { CLI_NAME, CLI_VERSION, CLI_DESCRIPTION } from '../core/constants.js';
8
+ /**
9
+ * 主 CLI 程序
10
+ */
11
+ function createCli() {
12
+ const program = new Command();
13
+ program
14
+ .name(CLI_NAME)
15
+ .description(CLI_DESCRIPTION)
16
+ .version(CLI_VERSION);
17
+ // 添加子命令
18
+ program.addCommand(createInitCommand());
19
+ program.addCommand(createQueryCommand());
20
+ program.addCommand(createCheckCommand());
21
+ program.addCommand(createSnapshotCommand());
22
+ return program;
23
+ }
24
+ // 导出供测试使用
25
+ export const cli = createCli();
26
+ // 直接执行时运行 CLI
27
+ cli.parseAsync(process.argv).catch((error) => {
28
+ console.error('错误:', error.message);
29
+ process.exit(1);
30
+ });
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE9E;;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;IAE5C,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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * 创建 init 命令
4
+ */
5
+ export declare function createInitCommand(): Command;
6
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAkD3C"}
@@ -0,0 +1,52 @@
1
+ import { Command } from 'commander';
2
+ import { InitService } from '../services/init.service.js';
3
+ import { CliUtils } from './shared.js';
4
+ /**
5
+ * 创建 init 命令
6
+ */
7
+ export function createInitCommand() {
8
+ const cmd = new Command('init');
9
+ cmd
10
+ .description('初始化新小说项目')
11
+ .argument('<novel-name>', '小说名称')
12
+ .argument('<novel-type>', '小说类型 (webnovel|literary|fanfiction)')
13
+ .option('-w, --words <number>', '目标字数', '100000')
14
+ .option('-p, --path <path>', '项目路径(默认为当前目录)')
15
+ .action(async (novelName, novelType, options) => {
16
+ try {
17
+ // 验证小说类型
18
+ const validTypes = ['webnovel', 'literary', 'fanfiction'];
19
+ if (!validTypes.includes(novelType)) {
20
+ CliUtils.error(`无效的小说类型: ${novelType}`);
21
+ CliUtils.info(`支持的类型: ${validTypes.join(', ')}`);
22
+ process.exit(1);
23
+ }
24
+ // 准备初始化选项
25
+ const initOptions = {
26
+ novelName,
27
+ novelType: novelType,
28
+ targetWords: parseInt(options.words, 10)
29
+ };
30
+ // 解析项目路径
31
+ const basePath = options.path || process.cwd();
32
+ CliUtils.title('初始化小说项目');
33
+ CliUtils.printKeyValue('项目名称', novelName);
34
+ CliUtils.printKeyValue('项目类型', novelType);
35
+ CliUtils.printKeyValue('目标字数', options.words);
36
+ CliUtils.printKeyValue('项目路径', basePath);
37
+ CliUtils.separator();
38
+ // 初始化项目
39
+ const initService = new InitService();
40
+ const projectPath = await initService.initProject(initOptions, basePath);
41
+ CliUtils.success(`项目创建成功: ${projectPath}`);
42
+ CliUtils.info('使用以下命令进入项目:');
43
+ console.log(` cd ${novelName}`);
44
+ }
45
+ catch (error) {
46
+ CliUtils.error(error instanceof Error ? error.message : String(error));
47
+ process.exit(1);
48
+ }
49
+ });
50
+ return cmd;
51
+ }
52
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhC,GAAG;SACA,WAAW,CAAC,UAAU,CAAC;SACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;SAChC,QAAQ,CAAC,cAAc,EAAE,qCAAqC,CAAC;SAC/D,MAAM,CAAC,sBAAsB,EAAE,MAAM,EAAE,QAAQ,CAAC;SAChD,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,SAAiB,EAAE,OAAO,EAAE,EAAE;QAC9D,IAAI,CAAC;YACH,SAAS;YACT,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;YAC1D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,QAAQ,CAAC,KAAK,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,UAAU;YACV,MAAM,WAAW,GAAgB;gBAC/B,SAAS;gBACT,SAAS,EAAE,SAAgB;gBAC3B,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;aACzC,CAAC;YAEF,SAAS;YACT,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAE/C,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC1B,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC1C,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC1C,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9C,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACzC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAErB,QAAQ;YACR,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;YACtC,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAEzE,QAAQ,CAAC,OAAO,CAAC,WAAW,WAAW,EAAE,CAAC,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC;QACnC,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,6 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * 创建 query 命令
4
+ */
5
+ export declare function createQueryCommand(): Command;
6
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAuL5C"}
@@ -0,0 +1,169 @@
1
+ import { Command } from 'commander';
2
+ import { QueryService } from '../services/query.service.js';
3
+ import { CliUtils } from './shared.js';
4
+ import { FileUtils } from '../core/file.js';
5
+ /**
6
+ * 创建 query 命令
7
+ */
8
+ export function createQueryCommand() {
9
+ const cmd = new Command('query');
10
+ cmd.description('查询设定和状态');
11
+ // 查询静态设定
12
+ cmd
13
+ .command('setting')
14
+ .argument('<type>', '设定类型 (world|power_system|等级|世界观等)')
15
+ .option('-p, --path <path>', '项目路径')
16
+ .action(async (type, options) => {
17
+ try {
18
+ const projectPath = CliUtils.resolveProjectPath(options.path);
19
+ const queryService = new QueryService();
20
+ if (!await queryService.validateProjectPath(projectPath)) {
21
+ CliUtils.error('未找到小说项目配置文件 (project.json)');
22
+ process.exit(1);
23
+ }
24
+ const result = await queryService.queryStaticSetting(projectPath, type);
25
+ CliUtils.title(`查询设定: ${type}`);
26
+ console.log(JSON.stringify(result, null, 2));
27
+ }
28
+ catch (error) {
29
+ CliUtils.error(error instanceof Error ? error.message : String(error));
30
+ process.exit(1);
31
+ }
32
+ });
33
+ // 查询人物
34
+ cmd
35
+ .command('character')
36
+ .argument('<name>', '人物姓名')
37
+ .option('-p, --path <path>', '项目路径')
38
+ .action(async (name, options) => {
39
+ try {
40
+ const projectPath = CliUtils.resolveProjectPath(options.path);
41
+ const queryService = new QueryService();
42
+ if (!await queryService.validateProjectPath(projectPath)) {
43
+ CliUtils.error('未找到小说项目配置文件 (project.json)');
44
+ process.exit(1);
45
+ }
46
+ const result = await queryService.queryCharacter(projectPath, name);
47
+ if (result.found) {
48
+ CliUtils.title(`人物信息: ${name}`);
49
+ CliUtils.printKeyValue('卡片路径', result.card_path || '');
50
+ CliUtils.printKeyValue('身份', result.identity || '');
51
+ // 读取并显示卡片内容
52
+ const content = await FileUtils.readText(result.card_path || '');
53
+ if (content) {
54
+ console.log();
55
+ console.log(content);
56
+ }
57
+ }
58
+ else {
59
+ CliUtils.error(result.message || '人物未找到');
60
+ }
61
+ }
62
+ catch (error) {
63
+ CliUtils.error(error instanceof Error ? error.message : String(error));
64
+ process.exit(1);
65
+ }
66
+ });
67
+ // 查询关系
68
+ cmd
69
+ .command('relationships')
70
+ .argument('[name]', '人物姓名(可选)')
71
+ .option('-p, --path <path>', '项目路径')
72
+ .action(async (name, options) => {
73
+ try {
74
+ const projectPath = CliUtils.resolveProjectPath(options.path);
75
+ const queryService = new QueryService();
76
+ if (!await queryService.validateProjectPath(projectPath)) {
77
+ CliUtils.error('未找到小说项目配置文件 (project.json)');
78
+ process.exit(1);
79
+ }
80
+ const relationships = await queryService.queryRelationships(projectPath, name);
81
+ if (relationships.length === 0) {
82
+ CliUtils.info('未找到关系记录');
83
+ return;
84
+ }
85
+ CliUtils.title(name ? `${name} 的关系` : '人物关系');
86
+ for (const rel of relationships) {
87
+ console.log(`${rel.from} —${rel.relationship}→ ${rel.to}`);
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('foreshadows')
98
+ .option('-s, --status <status>', '伏笔状态 (planted|resolved|unresolved)', 'unresolved')
99
+ .option('-p, --path <path>', '项目路径')
100
+ .action(async (options) => {
101
+ try {
102
+ const projectPath = CliUtils.resolveProjectPath(options.path);
103
+ const queryService = new QueryService();
104
+ if (!await queryService.validateProjectPath(projectPath)) {
105
+ CliUtils.error('未找到小说项目配置文件 (project.json)');
106
+ process.exit(1);
107
+ }
108
+ const foreshadows = await queryService.queryForeshadows(projectPath, options.status);
109
+ if (foreshadows.length === 0) {
110
+ CliUtils.info('未找到伏笔记录');
111
+ return;
112
+ }
113
+ CliUtils.title(`伏笔列表 (${options.status})`);
114
+ for (const f of foreshadows) {
115
+ const chapter = f.chapter ? `第${f.chapter}章` : '未知章节';
116
+ console.log(`[${chapter}] ${f.description}`);
117
+ if (f.id) {
118
+ console.log(` ID: ${f.id}`);
119
+ }
120
+ }
121
+ }
122
+ catch (error) {
123
+ CliUtils.error(error instanceof Error ? error.message : String(error));
124
+ process.exit(1);
125
+ }
126
+ });
127
+ // 查询当前状态
128
+ cmd
129
+ .command('state')
130
+ .option('-v, --volume <number>', '指定卷号')
131
+ .option('-p, --path <path>', '项目路径')
132
+ .action(async (options) => {
133
+ try {
134
+ const projectPath = CliUtils.resolveProjectPath(options.path);
135
+ const queryService = new QueryService();
136
+ if (!await queryService.validateProjectPath(projectPath)) {
137
+ CliUtils.error('未找到小说项目配置文件 (project.json)');
138
+ process.exit(1);
139
+ }
140
+ let result;
141
+ if (options.volume) {
142
+ result = await queryService.queryStateAtVolume(projectPath, parseInt(options.volume, 10));
143
+ }
144
+ else {
145
+ result = await queryService.queryCurrentState(projectPath);
146
+ }
147
+ if (!result.found) {
148
+ CliUtils.error(result.message || '未找到状态快照');
149
+ return;
150
+ }
151
+ CliUtils.title('状态快照');
152
+ if (result.snapshot_info) {
153
+ console.log(JSON.stringify(result.snapshot_info, null, 2));
154
+ }
155
+ if (result.characters && result.characters.length > 0) {
156
+ console.log(`\n人物 (${result.characters.length}人):`);
157
+ for (const char of result.characters) {
158
+ console.log(` - ${char.name}: ${char.status}`);
159
+ }
160
+ }
161
+ }
162
+ catch (error) {
163
+ CliUtils.error(error instanceof Error ? error.message : String(error));
164
+ process.exit(1);
165
+ }
166
+ });
167
+ return cmd;
168
+ }
169
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { ValidationResult } from '../core/types.js';
2
+ /**
3
+ * CLI 共享工具类
4
+ */
5
+ export declare class CliUtils {
6
+ /**
7
+ * 打印成功消息
8
+ */
9
+ static success(message: string): void;
10
+ /**
11
+ * 打印错误消息
12
+ */
13
+ static error(message: string): void;
14
+ /**
15
+ * 打印警告消息
16
+ */
17
+ static warning(message: string): void;
18
+ /**
19
+ * 打印信息消息
20
+ */
21
+ static info(message: string): void;
22
+ /**
23
+ * 打印标题
24
+ */
25
+ static title(message: string): void;
26
+ /**
27
+ * 打印验证结果
28
+ */
29
+ static printValidationResult(result: ValidationResult): void;
30
+ /**
31
+ * 打印键值对
32
+ */
33
+ static printKeyValue(key: string, value: string | number): void;
34
+ /**
35
+ * 打印分隔线
36
+ */
37
+ static separator(): void;
38
+ /**
39
+ * 打印列表
40
+ */
41
+ static printList(items: string[], indent?: number): void;
42
+ /**
43
+ * 确认操作
44
+ */
45
+ static confirm(message: string): Promise<boolean>;
46
+ /**
47
+ * 获取项目路径
48
+ */
49
+ static resolveProjectPath(projectPath?: string): string;
50
+ }
51
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,qBAAa,QAAQ;IACnB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMnC;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAyB5D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI/D;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,IAAI;IAIxB;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,SAAI,GAAG,IAAI;IAOnD;;OAEG;WACU,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAevD;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM;CAMxD"}