@changw98ic/cli 1.0.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 (163) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +57 -0
  3. package/dist/commands/adapt.d.ts +8 -0
  4. package/dist/commands/adapt.d.ts.map +1 -0
  5. package/dist/commands/adapt.js +108 -0
  6. package/dist/commands/adapt.js.map +1 -0
  7. package/dist/commands/archive.d.ts +6 -0
  8. package/dist/commands/archive.d.ts.map +1 -0
  9. package/dist/commands/archive.js +66 -0
  10. package/dist/commands/archive.js.map +1 -0
  11. package/dist/commands/backup.d.ts +6 -0
  12. package/dist/commands/backup.d.ts.map +1 -0
  13. package/dist/commands/backup.js +151 -0
  14. package/dist/commands/backup.js.map +1 -0
  15. package/dist/commands/context.d.ts +9 -0
  16. package/dist/commands/context.d.ts.map +1 -0
  17. package/dist/commands/context.js +203 -0
  18. package/dist/commands/context.js.map +1 -0
  19. package/dist/commands/dashboard.d.ts +6 -0
  20. package/dist/commands/dashboard.d.ts.map +1 -0
  21. package/dist/commands/dashboard.js +27 -0
  22. package/dist/commands/dashboard.js.map +1 -0
  23. package/dist/commands/entity.d.ts +6 -0
  24. package/dist/commands/entity.d.ts.map +1 -0
  25. package/dist/commands/entity.js +173 -0
  26. package/dist/commands/entity.js.map +1 -0
  27. package/dist/commands/extract-context.d.ts +9 -0
  28. package/dist/commands/extract-context.d.ts.map +1 -0
  29. package/dist/commands/extract-context.js +135 -0
  30. package/dist/commands/extract-context.js.map +1 -0
  31. package/dist/commands/index.d.ts +6 -0
  32. package/dist/commands/index.d.ts.map +1 -0
  33. package/dist/commands/index.js +69 -0
  34. package/dist/commands/index.js.map +1 -0
  35. package/dist/commands/init.d.ts +8 -0
  36. package/dist/commands/init.d.ts.map +1 -0
  37. package/dist/commands/init.js +37 -0
  38. package/dist/commands/init.js.map +1 -0
  39. package/dist/commands/migrate.d.ts +6 -0
  40. package/dist/commands/migrate.d.ts.map +1 -0
  41. package/dist/commands/migrate.js +67 -0
  42. package/dist/commands/migrate.js.map +1 -0
  43. package/dist/commands/plan.d.ts +6 -0
  44. package/dist/commands/plan.d.ts.map +1 -0
  45. package/dist/commands/plan.js +35 -0
  46. package/dist/commands/plan.js.map +1 -0
  47. package/dist/commands/preflight.d.ts +6 -0
  48. package/dist/commands/preflight.d.ts.map +1 -0
  49. package/dist/commands/preflight.js +80 -0
  50. package/dist/commands/preflight.js.map +1 -0
  51. package/dist/commands/query.d.ts +6 -0
  52. package/dist/commands/query.d.ts.map +1 -0
  53. package/dist/commands/query.js +82 -0
  54. package/dist/commands/query.js.map +1 -0
  55. package/dist/commands/rag.d.ts +6 -0
  56. package/dist/commands/rag.d.ts.map +1 -0
  57. package/dist/commands/rag.js +113 -0
  58. package/dist/commands/rag.js.map +1 -0
  59. package/dist/commands/review.d.ts +6 -0
  60. package/dist/commands/review.d.ts.map +1 -0
  61. package/dist/commands/review.js +38 -0
  62. package/dist/commands/review.js.map +1 -0
  63. package/dist/commands/state.d.ts +6 -0
  64. package/dist/commands/state.d.ts.map +1 -0
  65. package/dist/commands/state.js +64 -0
  66. package/dist/commands/state.js.map +1 -0
  67. package/dist/commands/status.d.ts +6 -0
  68. package/dist/commands/status.d.ts.map +1 -0
  69. package/dist/commands/status.js +49 -0
  70. package/dist/commands/status.js.map +1 -0
  71. package/dist/commands/style.d.ts +9 -0
  72. package/dist/commands/style.d.ts.map +1 -0
  73. package/dist/commands/style.js +120 -0
  74. package/dist/commands/style.js.map +1 -0
  75. package/dist/commands/update-state.d.ts +6 -0
  76. package/dist/commands/update-state.d.ts.map +1 -0
  77. package/dist/commands/update-state.js +92 -0
  78. package/dist/commands/update-state.js.map +1 -0
  79. package/dist/commands/use.d.ts +5 -0
  80. package/dist/commands/use.d.ts.map +1 -0
  81. package/dist/commands/use.js +33 -0
  82. package/dist/commands/use.js.map +1 -0
  83. package/dist/commands/where.d.ts +2 -0
  84. package/dist/commands/where.d.ts.map +1 -0
  85. package/dist/commands/where.js +13 -0
  86. package/dist/commands/where.js.map +1 -0
  87. package/dist/commands/workflow.d.ts +6 -0
  88. package/dist/commands/workflow.d.ts.map +1 -0
  89. package/dist/commands/workflow.js +155 -0
  90. package/dist/commands/workflow.js.map +1 -0
  91. package/dist/commands/write.d.ts +7 -0
  92. package/dist/commands/write.d.ts.map +1 -0
  93. package/dist/commands/write.js +33 -0
  94. package/dist/commands/write.js.map +1 -0
  95. package/dist/index.d.ts +5 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +123 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/utils/api-client.d.ts +61 -0
  100. package/dist/utils/api-client.d.ts.map +1 -0
  101. package/dist/utils/api-client.js +390 -0
  102. package/dist/utils/api-client.js.map +1 -0
  103. package/dist/utils/api-client.types.d.ts +42 -0
  104. package/dist/utils/api-client.types.d.ts.map +1 -0
  105. package/dist/utils/api-client.types.js +5 -0
  106. package/dist/utils/api-client.types.js.map +1 -0
  107. package/dist/utils/archive-manager.d.ts +72 -0
  108. package/dist/utils/archive-manager.d.ts.map +1 -0
  109. package/dist/utils/archive-manager.js +449 -0
  110. package/dist/utils/archive-manager.js.map +1 -0
  111. package/dist/utils/backup-manager.d.ts +65 -0
  112. package/dist/utils/backup-manager.d.ts.map +1 -0
  113. package/dist/utils/backup-manager.js +266 -0
  114. package/dist/utils/backup-manager.js.map +1 -0
  115. package/dist/utils/chapter-context.d.ts +77 -0
  116. package/dist/utils/chapter-context.d.ts.map +1 -0
  117. package/dist/utils/chapter-context.js +280 -0
  118. package/dist/utils/chapter-context.js.map +1 -0
  119. package/dist/utils/entity-linker.d.ts +74 -0
  120. package/dist/utils/entity-linker.d.ts.map +1 -0
  121. package/dist/utils/entity-linker.js +208 -0
  122. package/dist/utils/entity-linker.js.map +1 -0
  123. package/dist/utils/index.d.ts +19 -0
  124. package/dist/utils/index.d.ts.map +1 -0
  125. package/dist/utils/index.js +22 -0
  126. package/dist/utils/index.js.map +1 -0
  127. package/dist/utils/observability.d.ts +145 -0
  128. package/dist/utils/observability.d.ts.map +1 -0
  129. package/dist/utils/observability.js +298 -0
  130. package/dist/utils/observability.js.map +1 -0
  131. package/dist/utils/output.d.ts +45 -0
  132. package/dist/utils/output.d.ts.map +1 -0
  133. package/dist/utils/output.js +60 -0
  134. package/dist/utils/output.js.map +1 -0
  135. package/dist/utils/path-compat.d.ts +63 -0
  136. package/dist/utils/path-compat.d.ts.map +1 -0
  137. package/dist/utils/path-compat.js +128 -0
  138. package/dist/utils/path-compat.js.map +1 -0
  139. package/dist/utils/project-locator.d.ts +47 -0
  140. package/dist/utils/project-locator.d.ts.map +1 -0
  141. package/dist/utils/project-locator.js +372 -0
  142. package/dist/utils/project-locator.js.map +1 -0
  143. package/dist/utils/runtime-compat.d.ts +39 -0
  144. package/dist/utils/runtime-compat.d.ts.map +1 -0
  145. package/dist/utils/runtime-compat.js +113 -0
  146. package/dist/utils/runtime-compat.js.map +1 -0
  147. package/dist/utils/security.d.ts +74 -0
  148. package/dist/utils/security.d.ts.map +1 -0
  149. package/dist/utils/security.js +291 -0
  150. package/dist/utils/security.js.map +1 -0
  151. package/dist/utils/status-reporter.d.ts +66 -0
  152. package/dist/utils/status-reporter.d.ts.map +1 -0
  153. package/dist/utils/status-reporter.js +309 -0
  154. package/dist/utils/status-reporter.js.map +1 -0
  155. package/dist/utils/style-sampler.d.ts +69 -0
  156. package/dist/utils/style-sampler.d.ts.map +1 -0
  157. package/dist/utils/style-sampler.js +206 -0
  158. package/dist/utils/style-sampler.js.map +1 -0
  159. package/dist/utils/workflow-manager.d.ts +104 -0
  160. package/dist/utils/workflow-manager.d.ts.map +1 -0
  161. package/dist/utils/workflow-manager.js +462 -0
  162. package/dist/utils/workflow-manager.js.map +1 -0
  163. package/package.json +66 -0
package/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # @changw98ic/cli
2
+
3
+ 命令行工具 - `webnovel` 命令。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install -g @changw98ic/cli
9
+ ```
10
+
11
+ ## 使用
12
+
13
+ ```bash
14
+ # 初始化新项目
15
+ webnovel init "我的小说"
16
+
17
+ # 规划章节
18
+ webnovel plan 1
19
+
20
+ # 写作章节
21
+ webnovel write 1
22
+
23
+ # 审查章节
24
+ webnovel review 1-5
25
+
26
+ # 查询实体
27
+ webnovel query 主角
28
+
29
+ # 启动可视化面板
30
+ webnovel dashboard
31
+ ```
32
+
33
+ ## 命令列表
34
+
35
+ | 命令 | 说明 |
36
+ |------|------|
37
+ | `init <title>` | 初始化新小说项目 |
38
+ | `plan <chapter>` | 规划章节大纲 |
39
+ | `write <chapter>` | 写作章节 |
40
+ | `review <range>` | 审查章节质量 |
41
+ | `query <keyword>` | 查询项目状态 |
42
+ | `dashboard` | 启动可视化面板 |
43
+ | `status` | 生成项目健康报告 |
44
+ | `where` | 显示当前项目路径 |
45
+ | `preflight` | 校验运行环境 |
46
+
47
+ ## 文档
48
+
49
+ 详见 [项目主页](https://github.com/changw98ic/webnovel-writer-skill#readme)
50
+
51
+ ## 致谢
52
+
53
+ 本项目基于 [lingfengQAQ/webnovel-writer-skill](https://github.com/lingfengQAQ/webnovel-writer-skill) 开发。
54
+
55
+ ## License
56
+
57
+ MIT
@@ -0,0 +1,8 @@
1
+ import { Platform } from '@changw98ic/adapters';
2
+ interface AdaptOptions {
3
+ platform: Platform;
4
+ output: string;
5
+ }
6
+ export declare function adaptCommand(options: AdaptOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=adapt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapt.d.ts","sourceRoot":"","sources":["../../src/commands/adapt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAS,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKvD,UAAU,YAAY;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAsED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,iBAyCvD"}
@@ -0,0 +1,108 @@
1
+ import ora from 'ora';
2
+ import chalk from 'chalk';
3
+ import { adapt } from '@changw98ic/adapters';
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ // 内置 Skills(简化版)
7
+ const builtinSkills = [
8
+ {
9
+ name: 'webnovel-init',
10
+ version: '1.0.0',
11
+ description: '深度初始化网文项目',
12
+ license: 'GPL-3.0',
13
+ triggers: ['/webnovel-init', '/init'],
14
+ tools: [
15
+ { name: 'Read', type: 'read', description: '读取文件', required: true },
16
+ { name: 'Write', type: 'write', description: '写入文件', required: true },
17
+ { name: 'Bash', type: 'bash', description: '执行命令', required: false },
18
+ { name: 'AskUserQuestion', type: 'ask', description: '用户交互', required: false },
19
+ ],
20
+ prompts: [
21
+ { role: 'system', content: '你是一个专业的网文创作助手...' },
22
+ ],
23
+ workflow: [
24
+ { step: 'Step 0', action: '预检与环境设置', tools: ['Bash'], optional: false, onFailure: 'abort' },
25
+ { step: 'Step 1', action: '故事核与商业定位', tools: ['Read', 'Write', 'AskUserQuestion'], optional: false, onFailure: 'abort' },
26
+ ],
27
+ },
28
+ {
29
+ name: 'webnovel-plan',
30
+ version: '1.0.0',
31
+ description: '规划章节大纲',
32
+ license: 'GPL-3.0',
33
+ triggers: ['/webnovel-plan', '/plan'],
34
+ tools: [
35
+ { name: 'Read', type: 'read', required: true },
36
+ { name: 'Write', type: 'write', required: true },
37
+ { name: 'Grep', type: 'grep', required: false },
38
+ ],
39
+ prompts: [
40
+ { role: 'system', content: '你是一个专业的网文创作助手...' },
41
+ ],
42
+ workflow: [
43
+ { step: 'Step 1', action: '读取总纲与设定', tools: ['Read'], optional: false, onFailure: 'abort' },
44
+ { step: 'Step 2', action: '生成章节大纲', tools: ['Write'], optional: false, onFailure: 'abort' },
45
+ ],
46
+ },
47
+ {
48
+ name: 'webnovel-write',
49
+ version: '1.0.0',
50
+ description: '写作章节',
51
+ license: 'GPL-3.0',
52
+ triggers: ['/webnovel-write', '/write'],
53
+ tools: [
54
+ { name: 'Read', type: 'read', required: true },
55
+ { name: 'Write', type: 'write', required: true },
56
+ { name: 'Edit', type: 'edit', required: false },
57
+ { name: 'Bash', type: 'bash', required: false },
58
+ { name: 'Task', type: 'task', required: false },
59
+ ],
60
+ prompts: [
61
+ { role: 'system', content: '你是一个专业的网文创作助手...' },
62
+ ],
63
+ workflow: [
64
+ { step: 'Step 0', action: '预检与上下文加载', tools: ['Bash'], optional: false, onFailure: 'abort' },
65
+ { step: 'Step 1', action: 'Context Agent', tools: ['Task'], optional: false, onFailure: 'abort' },
66
+ { step: 'Step 2', action: '起草正文', tools: ['Write'], optional: false, onFailure: 'abort' },
67
+ { step: 'Step 3', action: '审查', tools: ['Task'], optional: true, onFailure: 'continue' },
68
+ { step: 'Step 4', action: '润色', tools: ['Edit'], optional: true, onFailure: 'continue' },
69
+ { step: 'Step 5', action: 'Data Agent', tools: ['Task'], optional: false, onFailure: 'skip' },
70
+ ],
71
+ },
72
+ ];
73
+ export async function adaptCommand(options) {
74
+ const spinner = ora(`生成 ${options.platform} 适配文件...`).start();
75
+ try {
76
+ // 确保输出目录存在
77
+ if (!fs.existsSync(options.output)) {
78
+ fs.mkdirSync(options.output, { recursive: true });
79
+ }
80
+ // 生成适配文件
81
+ const result = adapt({
82
+ platform: options.platform,
83
+ outputDir: options.output,
84
+ skills: builtinSkills,
85
+ });
86
+ // 写入文件
87
+ for (const file of result.files) {
88
+ const filePath = path.join(options.output, file.path);
89
+ const dir = path.dirname(filePath);
90
+ if (!fs.existsSync(dir)) {
91
+ fs.mkdirSync(dir, { recursive: true });
92
+ }
93
+ fs.writeFileSync(filePath, file.content, 'utf-8');
94
+ console.log(chalk.green(` ✓ ${file.path}`));
95
+ }
96
+ spinner.succeed('适配文件生成完成');
97
+ console.log('');
98
+ console.log(chalk.dim(`输出目录: ${options.output}`));
99
+ console.log(chalk.dim(`平台: ${options.platform}`));
100
+ console.log(chalk.dim(`Skills: ${builtinSkills.length} 个`));
101
+ }
102
+ catch (error) {
103
+ spinner.fail('生成失败');
104
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
105
+ process.exit(1);
106
+ }
107
+ }
108
+ //# sourceMappingURL=adapt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapt.js","sourceRoot":"","sources":["../../src/commands/adapt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Archive command - 数据归档管理
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const archiveCommand: Command;
6
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,cAAc,SAEoB,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Archive command - 数据归档管理
3
+ */
4
+ import { Command } from 'commander';
5
+ import { resolveProjectRoot } from '../utils/project-locator.js';
6
+ import { ArchiveManager } from '../utils/archive-manager.js';
7
+ export const archiveCommand = new Command('archive')
8
+ .description('数据归档管理')
9
+ .option('-p, --project-root <path>', '项目根目录');
10
+ // Auto-check subcommand
11
+ archiveCommand
12
+ .command('auto')
13
+ .description('自动归档检查')
14
+ .option('-p, --project-root <path>', '项目根目录')
15
+ .option('--force', '强制归档(忽略触发条件)')
16
+ .option('--dry-run', '仅显示将被归档的数据')
17
+ .action(async (options) => {
18
+ try {
19
+ const projectRoot = resolveProjectRoot(options.projectRoot ?? process.cwd());
20
+ console.log(`🔍 归档检查...`);
21
+ console.log(` 项目路径: ${projectRoot}\n`);
22
+ const manager = new ArchiveManager(projectRoot);
23
+ manager.runAutoCheck(options.force ?? false, options.dryRun ?? false);
24
+ }
25
+ catch (error) {
26
+ console.error('❌ 归档失败:', error instanceof Error ? error.message : error);
27
+ process.exit(1);
28
+ }
29
+ });
30
+ // Stats subcommand
31
+ archiveCommand
32
+ .command('stats')
33
+ .description('显示归档统计')
34
+ .option('-p, --project-root <path>', '项目根目录')
35
+ .action(async (options) => {
36
+ try {
37
+ const projectRoot = resolveProjectRoot(options.projectRoot ?? process.cwd());
38
+ const manager = new ArchiveManager(projectRoot);
39
+ manager.showStats();
40
+ }
41
+ catch (error) {
42
+ console.error('❌ 获取统计失败:', error instanceof Error ? error.message : error);
43
+ process.exit(1);
44
+ }
45
+ });
46
+ // Restore subcommand
47
+ archiveCommand
48
+ .command('restore <name>')
49
+ .description('恢复归档的角色')
50
+ .option('-p, --project-root <path>', '项目根目录')
51
+ .action(async (name, options) => {
52
+ try {
53
+ const projectRoot = resolveProjectRoot(options.projectRoot ?? process.cwd());
54
+ console.log(`📤 恢复角色: ${name}...`);
55
+ const manager = new ArchiveManager(projectRoot);
56
+ const success = manager.restoreCharacter(name);
57
+ if (!success) {
58
+ process.exit(1);
59
+ }
60
+ }
61
+ catch (error) {
62
+ console.error('❌ 恢复失败:', error instanceof Error ? error.message : error);
63
+ process.exit(1);
64
+ }
65
+ });
66
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Backup command - Git 版本控制
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const backupCommand: Command;
6
+ //# sourceMappingURL=backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SAoCtB,CAAC"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Backup command - Git 版本控制
3
+ */
4
+ import { Command } from 'commander';
5
+ import { resolveProjectRoot } from '../utils/project-locator.js';
6
+ import { BackupManager } from '../utils/backup-manager.js';
7
+ export const backupCommand = new Command('backup')
8
+ .description('Git 版本控制操作')
9
+ .option('-p, --project-root <path>', '项目根目录')
10
+ .command('create <chapter>')
11
+ .description('创建章节备份')
12
+ .option('-m, --message <message>', '备份消息')
13
+ .action(async (chapterStr, options) => {
14
+ try {
15
+ const projectRoot = resolveProjectRoot(options.projectRoot ?? process.cwd());
16
+ const chapter = parseInt(chapterStr, 10);
17
+ if (isNaN(chapter) || chapter < 1) {
18
+ console.error('❌ 章节号必须是正整数');
19
+ process.exit(1);
20
+ }
21
+ const manager = new BackupManager(projectRoot);
22
+ if (!manager.isAvailable()) {
23
+ console.error('❌ Git 不可用,请确保已安装 Git 且项目已初始化');
24
+ process.exit(1);
25
+ }
26
+ console.log(`📦 创建备份: 第 ${chapter} 章...`);
27
+ const success = manager.createBackup(chapter, options.message);
28
+ if (success) {
29
+ console.log(`✅ 备份已创建`);
30
+ }
31
+ else {
32
+ console.log(`⚠️ 备份创建失败`);
33
+ process.exit(1);
34
+ }
35
+ }
36
+ catch (error) {
37
+ console.error('❌ 创建备份失败:', error instanceof Error ? error.message : error);
38
+ process.exit(1);
39
+ }
40
+ });
41
+ // List backups subcommand
42
+ backupCommand
43
+ .command('list')
44
+ .description('列出所有备份')
45
+ .option('-p, --project-root <path>', '项目根目录')
46
+ .option('-l, --limit <number>', '限制数量', '20')
47
+ .action(async (options) => {
48
+ try {
49
+ const projectRoot = resolveProjectRoot(options.projectRoot ?? process.cwd());
50
+ const limit = parseInt(options.limit, 10) || 20;
51
+ const manager = new BackupManager(projectRoot);
52
+ if (!manager.isAvailable()) {
53
+ console.error('❌ Git 不可用');
54
+ process.exit(1);
55
+ }
56
+ const backups = manager.listBackups().slice(0, limit);
57
+ if (backups.length === 0) {
58
+ console.log('📭 暂无备份');
59
+ return;
60
+ }
61
+ console.log(`📋 备份列表 (共 ${backups.length} 个):\n`);
62
+ for (const backup of backups) {
63
+ const chapter = backup.chapter ?? '?';
64
+ const date = new Date(backup.timestamp).toLocaleString('zh-CN');
65
+ console.log(` 第 ${chapter} 章 | ${backup.tag} | ${date}`);
66
+ console.log(` ${backup.message}`);
67
+ console.log('');
68
+ }
69
+ const current = manager.getCurrentVersion();
70
+ if (current) {
71
+ console.log(`📌 当前版本: ${current}`);
72
+ }
73
+ }
74
+ catch (error) {
75
+ console.error('❌ 列出备份失败:', error instanceof Error ? error.message : error);
76
+ process.exit(1);
77
+ }
78
+ });
79
+ // Rollback subcommand
80
+ backupCommand
81
+ .command('rollback <chapter>')
82
+ .description('回滚到指定章节')
83
+ .option('-p, --project-root <path>', '项目根目录')
84
+ .option('--force', '强制回滚(丢弃未提交的更改)')
85
+ .action(async (chapterStr, options) => {
86
+ try {
87
+ const projectRoot = resolveProjectRoot(options.projectRoot ?? process.cwd());
88
+ const chapter = parseInt(chapterStr, 10);
89
+ if (isNaN(chapter) || chapter < 1) {
90
+ console.error('❌ 章节号必须是正整数');
91
+ process.exit(1);
92
+ }
93
+ const manager = new BackupManager(projectRoot);
94
+ if (!manager.isAvailable()) {
95
+ console.error('❌ Git 不可用');
96
+ process.exit(1);
97
+ }
98
+ // Check for uncommitted changes
99
+ if (manager.hasUncommittedChanges() && !options.force) {
100
+ console.error('⚠️ 存在未提交的更改,请先提交或使用 --force 强制回滚');
101
+ process.exit(1);
102
+ }
103
+ console.log(`⏪ 回滚到第 ${chapter} 章...`);
104
+ const success = manager.rollback(chapter);
105
+ if (success) {
106
+ console.log(`✅ 已回滚到第 ${chapter} 章`);
107
+ }
108
+ else {
109
+ console.log(`❌ 回滚失败`);
110
+ process.exit(1);
111
+ }
112
+ }
113
+ catch (error) {
114
+ console.error('❌ 回滚失败:', error instanceof Error ? error.message : error);
115
+ process.exit(1);
116
+ }
117
+ });
118
+ // Diff subcommand
119
+ backupCommand
120
+ .command('diff <from> <to>')
121
+ .description('比较两个版本之间的差异')
122
+ .option('-p, --project-root <path>', '项目根目录')
123
+ .action(async (fromStr, toStr, options) => {
124
+ try {
125
+ const projectRoot = resolveProjectRoot(options.projectRoot ?? process.cwd());
126
+ const fromChapter = parseInt(fromStr, 10);
127
+ const toChapter = parseInt(toStr, 10);
128
+ if (isNaN(fromChapter) || isNaN(toChapter)) {
129
+ console.error('❌ 章节号必须是整数');
130
+ process.exit(1);
131
+ }
132
+ const manager = new BackupManager(projectRoot);
133
+ if (!manager.isAvailable()) {
134
+ console.error('❌ Git 不可用');
135
+ process.exit(1);
136
+ }
137
+ console.log(`🔍 比较第 ${fromChapter} 章与第 ${toChapter} 章...\n`);
138
+ const result = manager.diff(fromChapter, toChapter);
139
+ if (result) {
140
+ console.log(result.summary);
141
+ }
142
+ else {
143
+ console.log('❌ 无法获取差异');
144
+ }
145
+ }
146
+ catch (error) {
147
+ console.error('❌ 获取差异失败:', error instanceof Error ? error.message : error);
148
+ process.exit(1);
149
+ }
150
+ });
151
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Context command - 上下文管理
3
+ *
4
+ * 注意:ContextExtractor 尚未在 @changw98ic/data 中实现
5
+ * 当前为占位实现
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare const contextCommand: Command;
9
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,cAAc,SACJ,CAAC"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Context command - 上下文管理
3
+ *
4
+ * 注意:ContextExtractor 尚未在 @changw98ic/data 中实现
5
+ * 当前为占位实现
6
+ */
7
+ import { Command } from 'commander';
8
+ import { resolveProjectRoot } from '../utils/project-locator.js';
9
+ import { StateManager, IndexManager } from '@changw98ic/data';
10
+ export const contextCommand = new Command('context')
11
+ .description('上下文管理');
12
+ // Build subcommand
13
+ contextCommand
14
+ .command('build <chapter>')
15
+ .description('构建章节上下文')
16
+ .option('-p, --project-root <path>', '项目根目录')
17
+ .option('-o, --output <file>', '输出文件路径')
18
+ .option('--format <format>', '输出格式 (text|json|markdown)', 'text')
19
+ .action(async (chapterStr, options) => {
20
+ try {
21
+ const projectRoot = resolveProjectRoot(options.projectRoot ?? process.cwd());
22
+ const chapter = parseInt(chapterStr, 10);
23
+ if (isNaN(chapter) || chapter < 1) {
24
+ console.error('❌ 章节号必须是正整数');
25
+ process.exit(1);
26
+ }
27
+ console.log(`🔨 构建第 ${chapter} 章上下文...`);
28
+ console.log(` 项目路径: ${projectRoot}`);
29
+ // 使用现有的 StateManager 和 IndexManager 构建简化上下文
30
+ const stateManager = new StateManager({ projectRoot });
31
+ const indexManager = new IndexManager({ projectRoot });
32
+ const state = await stateManager.loadState();
33
+ const entities = indexManager.getCoreEntities();
34
+ const context = {
35
+ chapter,
36
+ progress: state.progress,
37
+ coreEntities: entities.map(e => ({
38
+ id: e.id,
39
+ name: e.canonical_name,
40
+ type: e.type,
41
+ tier: e.tier,
42
+ })),
43
+ activeForeshadowing: state.plot_threads?.foreshadowing ?? [],
44
+ };
45
+ indexManager.close();
46
+ let output;
47
+ switch (options.format) {
48
+ case 'json':
49
+ output = JSON.stringify(context, null, 2);
50
+ break;
51
+ case 'markdown':
52
+ output = formatAsMarkdown(context);
53
+ break;
54
+ default:
55
+ output = formatAsText(context);
56
+ }
57
+ if (options.output) {
58
+ const fs = await import('fs/promises');
59
+ await fs.writeFile(options.output, output, 'utf-8');
60
+ console.log(`\n✅ 已保存到: ${options.output}`);
61
+ }
62
+ else {
63
+ console.log('\n' + output);
64
+ }
65
+ }
66
+ catch (error) {
67
+ console.error('❌ 构建失败:', error instanceof Error ? error.message : error);
68
+ process.exit(1);
69
+ }
70
+ });
71
+ // Stats subcommand
72
+ contextCommand
73
+ .command('stats')
74
+ .description('显示上下文统计')
75
+ .option('-p, --project-root <path>', '项目根目录')
76
+ .option('--json', 'JSON 格式输出')
77
+ .action(async (options) => {
78
+ try {
79
+ const projectRoot = resolveProjectRoot(options.projectRoot ?? process.cwd());
80
+ const stateManager = new StateManager({ projectRoot });
81
+ const indexManager = new IndexManager({ projectRoot });
82
+ const state = await stateManager.loadState();
83
+ const entityStats = indexManager.getStats();
84
+ const stats = {
85
+ currentChapter: state.progress?.current_chapter ?? 1,
86
+ totalEntities: entityStats.totalEntities,
87
+ entityByType: entityStats.byType,
88
+ foreshadowingCount: state.plot_threads?.foreshadowing?.length ?? 0,
89
+ };
90
+ indexManager.close();
91
+ if (options.json) {
92
+ console.log(JSON.stringify(stats, null, 2));
93
+ }
94
+ else {
95
+ console.log('📊 上下文统计:\n');
96
+ console.log(` 当前章节: ${stats.currentChapter}`);
97
+ console.log(` 实体总数: ${stats.totalEntities}`);
98
+ console.log(` 活跃伏笔: ${stats.foreshadowingCount}`);
99
+ }
100
+ }
101
+ catch (error) {
102
+ console.error('❌ 获取统计失败:', error instanceof Error ? error.message : error);
103
+ process.exit(1);
104
+ }
105
+ });
106
+ // Extract subcommand (alias for build)
107
+ contextCommand
108
+ .command('extract <chapter>')
109
+ .description('提取章节上下文(build 的别名)')
110
+ .option('-p, --project-root <path>', '项目根目录')
111
+ .option('-o, --output <file>', '输出文件路径')
112
+ .option('--format <format>', '输出格式 (text|json|markdown)', 'text')
113
+ .action(async (chapterStr, options) => {
114
+ try {
115
+ const projectRoot = resolveProjectRoot(options.projectRoot ?? process.cwd());
116
+ const chapter = parseInt(chapterStr, 10);
117
+ if (isNaN(chapter) || chapter < 1) {
118
+ console.error('❌ 章节号必须是正整数');
119
+ process.exit(1);
120
+ }
121
+ const stateManager = new StateManager({ projectRoot });
122
+ const indexManager = new IndexManager({ projectRoot });
123
+ const state = await stateManager.loadState();
124
+ const entities = indexManager.getCoreEntities();
125
+ const context = {
126
+ chapter,
127
+ progress: state.progress,
128
+ coreEntities: entities.map(e => ({
129
+ id: e.id,
130
+ name: e.canonical_name,
131
+ type: e.type,
132
+ tier: e.tier,
133
+ })),
134
+ activeForeshadowing: state.plot_threads?.foreshadowing ?? [],
135
+ };
136
+ indexManager.close();
137
+ let output;
138
+ switch (options.format) {
139
+ case 'json':
140
+ output = JSON.stringify(context, null, 2);
141
+ break;
142
+ case 'markdown':
143
+ output = formatAsMarkdown(context);
144
+ break;
145
+ default:
146
+ output = formatAsText(context);
147
+ }
148
+ if (options.output) {
149
+ const fs = await import('fs/promises');
150
+ await fs.writeFile(options.output, output, 'utf-8');
151
+ console.log(`✅ 已保存到: ${options.output}`);
152
+ }
153
+ else {
154
+ console.log(output);
155
+ }
156
+ }
157
+ catch (error) {
158
+ console.error('❌ 提取失败:', error instanceof Error ? error.message : error);
159
+ process.exit(1);
160
+ }
161
+ });
162
+ // Helper functions
163
+ function formatAsText(context) {
164
+ const lines = [];
165
+ if (context.coreEntities) {
166
+ lines.push('【核心实体】');
167
+ for (const entity of context.coreEntities) {
168
+ lines.push(`- [${entity.type}] ${entity.name} (${entity.tier})`);
169
+ }
170
+ lines.push('');
171
+ }
172
+ if (context.activeForeshadowing) {
173
+ const foreshadowing = context.activeForeshadowing;
174
+ if (foreshadowing.length > 0) {
175
+ lines.push('【活跃伏笔】');
176
+ for (const fs of foreshadowing) {
177
+ lines.push(`- ${fs.name || fs.id}: ${fs.description || ''}`);
178
+ }
179
+ lines.push('');
180
+ }
181
+ }
182
+ return lines.join('\n');
183
+ }
184
+ function formatAsMarkdown(context) {
185
+ const lines = ['# 章节上下文'];
186
+ if (context.coreEntities) {
187
+ lines.push('\n## 核心实体');
188
+ for (const entity of context.coreEntities) {
189
+ lines.push(`- **${entity.name}** [${entity.type}] (${entity.tier})`);
190
+ }
191
+ }
192
+ if (context.activeForeshadowing) {
193
+ const foreshadowing = context.activeForeshadowing;
194
+ if (foreshadowing.length > 0) {
195
+ lines.push('\n## 活跃伏笔');
196
+ for (const fs of foreshadowing) {
197
+ lines.push(`- **${fs.name || fs.id}**: ${fs.description || ''}`);
198
+ }
199
+ }
200
+ }
201
+ return lines.join('\n');
202
+ }
203
+ //# sourceMappingURL=context.js.map