@dayinxisheng/novel-tools 0.1.0 → 0.2.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 +92 -0
- package/README.md +78 -1
- package/dist/commands/event.d.ts +6 -0
- package/dist/commands/event.d.ts.map +1 -0
- package/dist/commands/event.js +107 -0
- package/dist/commands/event.js.map +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +6 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/style.d.ts +6 -0
- package/dist/commands/style.d.ts.map +1 -0
- package/dist/commands/style.js +75 -0
- package/dist/commands/style.js.map +1 -0
- package/dist/commands/temp-setting.d.ts +6 -0
- package/dist/commands/temp-setting.d.ts.map +1 -0
- package/dist/commands/temp-setting.js +154 -0
- package/dist/commands/temp-setting.js.map +1 -0
- package/dist/core/types.d.ts +31 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/services/event-command.service.d.ts +38 -0
- package/dist/services/event-command.service.d.ts.map +1 -0
- package/dist/services/event-command.service.js +267 -0
- package/dist/services/event-command.service.js.map +1 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/style-command.service.d.ts +54 -0
- package/dist/services/style-command.service.d.ts.map +1 -0
- package/dist/services/style-command.service.js +113 -0
- package/dist/services/style-command.service.js.map +1 -0
- package/dist/services/temp-setting.service.d.ts +69 -0
- package/dist/services/temp-setting.service.d.ts.map +1 -0
- package/dist/services/temp-setting.service.js +314 -0
- package/dist/services/temp-setting.service.js.map +1 -0
- package/package.json +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,98 @@ 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.2.1] - 2026-03-10
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
#### style 命令
|
|
13
|
+
- `style extract` - 从 JSONL 文件提取章节内容
|
|
14
|
+
- 支持指定提取章节数量(-n, --count)
|
|
15
|
+
- 支持指定起始章节号(-s, --start)
|
|
16
|
+
- 支持随机选择章节(--random)
|
|
17
|
+
- 支持多种输出格式:text、markdown
|
|
18
|
+
- 支持输出到文件或 stdout
|
|
19
|
+
- `style info` - 显示 JSONL 文件信息
|
|
20
|
+
- 显示总章节数、总字数
|
|
21
|
+
- 显示平均章节字数
|
|
22
|
+
- 显示最短/最长章节
|
|
23
|
+
|
|
24
|
+
#### 新增服务
|
|
25
|
+
- `StyleCommandService` - 风格命令服务
|
|
26
|
+
- JSONL 文件解析
|
|
27
|
+
- 章节内容提取
|
|
28
|
+
- 文件信息统计
|
|
29
|
+
- 随机章节选择
|
|
30
|
+
|
|
31
|
+
#### 新增类型定义
|
|
32
|
+
- `ChapterData` - 章节数据接口
|
|
33
|
+
- `ExtractOptions` - 提取选项接口
|
|
34
|
+
- `ExtractResult` - 提取结果接口
|
|
35
|
+
- `JsonlInfo` - 文件信息接口
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
- 更新 `commands/index.ts` 注册 style 命令
|
|
39
|
+
|
|
40
|
+
## [0.2.0] - 2026-03-09
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
|
|
44
|
+
#### event 命令
|
|
45
|
+
- `event append` - 追加章节事件
|
|
46
|
+
- 支持 JSON 字符串输入
|
|
47
|
+
- 支持从文件读取事件
|
|
48
|
+
- 支持交互式输入模式
|
|
49
|
+
- 支持覆盖已存在的事件(--replace)
|
|
50
|
+
- `event summary` - 生成章节摘要
|
|
51
|
+
- 支持多种输出格式:table、json、markdown
|
|
52
|
+
- 显示关键事件、人物动向、关系变化、新元素、伏笔等
|
|
53
|
+
- `event list` - 列出事件
|
|
54
|
+
- 支持按章节过滤
|
|
55
|
+
- 支持按类型过滤
|
|
56
|
+
|
|
57
|
+
#### temp-setting 命令
|
|
58
|
+
- `temp-setting add` - 添加临时设定
|
|
59
|
+
- 支持多种类型:character、location、item、skill、other
|
|
60
|
+
- 自动生成临时设定文件模板
|
|
61
|
+
- 自动更新审核队列
|
|
62
|
+
- `temp-setting list` - 列出待审核项
|
|
63
|
+
- 支持按类型过滤
|
|
64
|
+
- 显示待审核状态
|
|
65
|
+
- `temp-setting review` - 审核设定
|
|
66
|
+
- 支持交互式审核流程
|
|
67
|
+
- 支持批准并迁移
|
|
68
|
+
- 支持拒绝并删除
|
|
69
|
+
- `temp-setting migrate` - 迁移设定
|
|
70
|
+
- 支持迁移为正式人物卡片
|
|
71
|
+
- 支持迁移为正式设定元素
|
|
72
|
+
- 支持自定义目标路径
|
|
73
|
+
|
|
74
|
+
#### 新增服务
|
|
75
|
+
- `EventCommandService` - 事件命令服务
|
|
76
|
+
- 交互式追加事件
|
|
77
|
+
- 从文件追加事件
|
|
78
|
+
- 格式化摘要输出
|
|
79
|
+
- `TempSettingService` - 临时设定服务
|
|
80
|
+
- 临时设定管理
|
|
81
|
+
- 审核队列管理
|
|
82
|
+
- 设定迁移功能
|
|
83
|
+
|
|
84
|
+
#### 新增类型定义
|
|
85
|
+
- `AddTempSettingOptions` - 临时设定选项
|
|
86
|
+
- `PendingItem` - 待审核项
|
|
87
|
+
- `ReviewQueue` - 审核队列
|
|
88
|
+
- `MigrateOptions` - 迁移选项
|
|
89
|
+
- `TempSettingItem` - 临时设定项
|
|
90
|
+
|
|
91
|
+
#### 测试
|
|
92
|
+
- 新增 `event-command.service.test.ts`
|
|
93
|
+
- 新增 `temp-setting.service.test.ts`
|
|
94
|
+
|
|
95
|
+
### Changed
|
|
96
|
+
- 扩展 `types.ts` 添加新类型定义
|
|
97
|
+
- 更新 `services/index.ts` 导出新服务
|
|
98
|
+
- 更新 `commands/index.ts` 注册新命令
|
|
99
|
+
|
|
8
100
|
## [0.1.0] - 2026-03-09
|
|
9
101
|
|
|
10
102
|
### Added
|
package/README.md
CHANGED
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
- **项目初始化**:创建标准的小说项目目录结构
|
|
12
12
|
- **查询功能**:查询静态设定、人物信息、状态快照、人物关系、伏笔等
|
|
13
|
-
-
|
|
13
|
+
- **事件管理**:追加事件、生成章节摘要、列出事件
|
|
14
|
+
- **临时设定**:添加临时设定、审核队列、迁移到正式设定
|
|
14
15
|
- **快照生成**:生成卷级/弧级状态快照
|
|
15
16
|
- **一致性检查**:检查大纲、章节、弧、卷的一致性
|
|
16
17
|
|
|
@@ -43,6 +44,82 @@ novel-tools query relationships 张三
|
|
|
43
44
|
novel-tools query foreshadows
|
|
44
45
|
```
|
|
45
46
|
|
|
47
|
+
### 事件管理
|
|
48
|
+
|
|
49
|
+
#### 追加事件
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# JSON 字符串
|
|
53
|
+
novel-tools event append --chapter 1 --events '[{"type":"出场","character":"林风"}]'
|
|
54
|
+
|
|
55
|
+
# 从文件
|
|
56
|
+
novel-tools event append --chapter 1 --file events.json
|
|
57
|
+
|
|
58
|
+
# 交互式
|
|
59
|
+
novel-tools event append --chapter 1 --interactive
|
|
60
|
+
|
|
61
|
+
# 覆盖已存在的事件
|
|
62
|
+
novel-tools event append --chapter 1 --events '[...]' --replace
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
#### 章节摘要
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
novel-tools event summary --chapter 1 --output table
|
|
69
|
+
novel-tools event summary --chapter 1 --output json
|
|
70
|
+
novel-tools event summary --chapter 1 --output markdown
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
#### 列出事件
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
novel-tools event list
|
|
77
|
+
novel-tools event list --chapter 1
|
|
78
|
+
novel-tools event list --type 出场
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 临时设定管理
|
|
82
|
+
|
|
83
|
+
#### 添加临时设定
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# 添加人物
|
|
87
|
+
novel-tools temp-setting add --type character --name 林风 --chapter 5 --description "主要角色"
|
|
88
|
+
|
|
89
|
+
# 添加物品
|
|
90
|
+
novel-tools temp-setting add --type item --name 神秘令牌 --chapter 6 --description "一枚刻有古老符文的令牌"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
#### 列出待审核项
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
novel-tools temp-setting list
|
|
97
|
+
novel-tools temp-setting list --type character
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
#### 审核设定
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# 交互式审核
|
|
104
|
+
novel-tools temp-setting review --interactive
|
|
105
|
+
|
|
106
|
+
# 列出所有待审核项
|
|
107
|
+
novel-tools temp-setting review
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
#### 迁移设定
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# 迁移为正式人物卡片
|
|
114
|
+
novel-tools temp-setting migrate 林风 --to-character
|
|
115
|
+
|
|
116
|
+
# 迁移为正式设定元素
|
|
117
|
+
novel-tools temp-setting migrate 神秘令牌 --to-element
|
|
118
|
+
|
|
119
|
+
# 自定义目标路径
|
|
120
|
+
novel-tools temp-setting migrate 林风 --location characters/cards/supporting/林风.md
|
|
121
|
+
```
|
|
122
|
+
|
|
46
123
|
### 一致性检查
|
|
47
124
|
|
|
48
125
|
```bash
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/commands/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAkH5C"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { EventCommandService } from '../services/event-command.service.js';
|
|
3
|
+
import { CliUtils } from './shared.js';
|
|
4
|
+
/**
|
|
5
|
+
* 创建 event 命令
|
|
6
|
+
*/
|
|
7
|
+
export function createEventCommand() {
|
|
8
|
+
const cmd = new Command('event');
|
|
9
|
+
cmd.description('事件管理相关操作');
|
|
10
|
+
// event append — 追加事件
|
|
11
|
+
cmd
|
|
12
|
+
.command('append')
|
|
13
|
+
.argument('<chapter>', '章节号')
|
|
14
|
+
.option('-e, --events <json>', '事件 JSON 字符串')
|
|
15
|
+
.option('-f, --file <path>', '从文件读取事件 JSON')
|
|
16
|
+
.option('-i, --interactive', '交互式输入模式')
|
|
17
|
+
.option('--replace', '覆盖已存在的事件')
|
|
18
|
+
.option('-p, --path <path>', '项目路径')
|
|
19
|
+
.action(async (chapter, options) => {
|
|
20
|
+
try {
|
|
21
|
+
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
22
|
+
const chapterNum = parseInt(chapter, 10);
|
|
23
|
+
if (isNaN(chapterNum) || chapterNum < 1) {
|
|
24
|
+
CliUtils.error('章节号必须是正整数');
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
const service = new EventCommandService();
|
|
28
|
+
// 判断输入模式
|
|
29
|
+
if (options.interactive || (!options.events && !options.file)) {
|
|
30
|
+
// 交互式模式
|
|
31
|
+
await service.appendEventsInteractive(projectPath, chapterNum);
|
|
32
|
+
}
|
|
33
|
+
else if (options.file) {
|
|
34
|
+
// 从文件读取
|
|
35
|
+
await service.appendEventsFromFile(projectPath, chapterNum, options.file);
|
|
36
|
+
}
|
|
37
|
+
else if (options.events) {
|
|
38
|
+
// 从 JSON 字符串
|
|
39
|
+
await service.appendEventsFromJson(projectPath, chapterNum, options.events, options.replace);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
// event summary — 章节摘要
|
|
48
|
+
cmd
|
|
49
|
+
.command('summary')
|
|
50
|
+
.argument('<chapter>', '章节号')
|
|
51
|
+
.option('-o, --output <format>', '输出格式: table | json | markdown', 'table')
|
|
52
|
+
.option('-p, --path <path>', '项目路径')
|
|
53
|
+
.action(async (chapter, options) => {
|
|
54
|
+
try {
|
|
55
|
+
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
56
|
+
const chapterNum = parseInt(chapter, 10);
|
|
57
|
+
if (isNaN(chapterNum) || chapterNum < 1) {
|
|
58
|
+
CliUtils.error('章节号必须是正整数');
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
// 验证输出格式
|
|
62
|
+
const validFormats = ['table', 'json', 'markdown'];
|
|
63
|
+
if (!validFormats.includes(options.output)) {
|
|
64
|
+
CliUtils.error(`无效的输出格式: ${options.output}`);
|
|
65
|
+
CliUtils.info(`支持的格式: ${validFormats.join(', ')}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
const service = new EventCommandService();
|
|
69
|
+
const { EventService } = await import('../services/event.service.js');
|
|
70
|
+
const eventService = new EventService();
|
|
71
|
+
const summary = await eventService.generateChapterSummary(projectPath, chapterNum);
|
|
72
|
+
const output = service.formatSummary(summary, options.output);
|
|
73
|
+
console.log(output);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// event list — 列出事件
|
|
81
|
+
cmd
|
|
82
|
+
.command('list')
|
|
83
|
+
.option('-c, --chapter <number>', '只显示指定章节')
|
|
84
|
+
.option('-t, --type <type>', '过滤事件类型')
|
|
85
|
+
.option('-p, --path <path>', '项目路径')
|
|
86
|
+
.action(async (options) => {
|
|
87
|
+
try {
|
|
88
|
+
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
89
|
+
const service = new EventCommandService();
|
|
90
|
+
let chapter;
|
|
91
|
+
if (options.chapter) {
|
|
92
|
+
chapter = parseInt(options.chapter, 10);
|
|
93
|
+
if (isNaN(chapter) || chapter < 1) {
|
|
94
|
+
CliUtils.error('章节号必须是正整数');
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
await service.listEvents(projectPath, chapter, options.type);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
return cmd;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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;AAkCpC,eAAO,MAAM,GAAG,SAAc,CAAC"}
|
package/dist/commands/index.js
CHANGED
|
@@ -4,6 +4,9 @@ import { createInitCommand } from './init.js';
|
|
|
4
4
|
import { createQueryCommand } from './query.js';
|
|
5
5
|
import { createCheckCommand } from './check.js';
|
|
6
6
|
import { createSnapshotCommand } from './snapshot.js';
|
|
7
|
+
import { createEventCommand } from './event.js';
|
|
8
|
+
import { createTempSettingCommand } from './temp-setting.js';
|
|
9
|
+
import { createStyleCommand } from './style.js';
|
|
7
10
|
import { CLI_NAME, CLI_VERSION, CLI_DESCRIPTION } from '../core/constants.js';
|
|
8
11
|
/**
|
|
9
12
|
* 主 CLI 程序
|
|
@@ -19,6 +22,9 @@ function createCli() {
|
|
|
19
22
|
program.addCommand(createQueryCommand());
|
|
20
23
|
program.addCommand(createCheckCommand());
|
|
21
24
|
program.addCommand(createSnapshotCommand());
|
|
25
|
+
program.addCommand(createEventCommand());
|
|
26
|
+
program.addCommand(createTempSettingCommand());
|
|
27
|
+
program.addCommand(createStyleCommand());
|
|
22
28
|
return program;
|
|
23
29
|
}
|
|
24
30
|
// 导出供测试使用
|
|
@@ -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,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;
|
|
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,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;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;IAEzC,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 @@
|
|
|
1
|
+
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/commands/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAyE5C"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { StyleCommandService } from '../services/style-command.service.js';
|
|
3
|
+
import { CliUtils } from './shared.js';
|
|
4
|
+
/**
|
|
5
|
+
* 创建 style 命令 - 用于从 JSONL 文件提取章节内容供风格分析
|
|
6
|
+
*/
|
|
7
|
+
export function createStyleCommand() {
|
|
8
|
+
const cmd = new Command('style');
|
|
9
|
+
cmd.description('从 JSONL 文件提取章节内容,用于写作风格分析');
|
|
10
|
+
// style extract — 提取章节内容
|
|
11
|
+
cmd
|
|
12
|
+
.command('extract')
|
|
13
|
+
.argument('<jsonlFile>', 'JSONL 文件路径')
|
|
14
|
+
.option('-o, --output <path>', '输出文件路径(默认输出到 stdout)')
|
|
15
|
+
.option('-n, --count <number>', '提取章节数量', '10')
|
|
16
|
+
.option('-s, --start <number>', '起始章节号', '1')
|
|
17
|
+
.option('--random', '随机选择章节')
|
|
18
|
+
.option('--format <format>', '输出格式: text | markdown', 'markdown')
|
|
19
|
+
.action(async (jsonlFile, options) => {
|
|
20
|
+
try {
|
|
21
|
+
const service = new StyleCommandService();
|
|
22
|
+
const count = parseInt(options.count, 10);
|
|
23
|
+
if (isNaN(count) || count < 1) {
|
|
24
|
+
CliUtils.error('章节数量必须是正整数');
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
const start = parseInt(options.start, 10);
|
|
28
|
+
if (isNaN(start) || start < 1) {
|
|
29
|
+
CliUtils.error('起始章节号必须是正整数');
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const result = await service.extractFromJsonl(jsonlFile, {
|
|
33
|
+
count,
|
|
34
|
+
start,
|
|
35
|
+
random: options.random || false,
|
|
36
|
+
format: options.format,
|
|
37
|
+
});
|
|
38
|
+
if (options.output) {
|
|
39
|
+
await service.writeToFile(result, options.output);
|
|
40
|
+
CliUtils.success(`已提取 ${result.chapterCount} 章,保存到: ${options.output}`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.log(result.content);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
// style info — 显示 JSONL 文件信息
|
|
52
|
+
cmd
|
|
53
|
+
.command('info')
|
|
54
|
+
.argument('<jsonlFile>', 'JSONL 文件路径')
|
|
55
|
+
.action(async (jsonlFile) => {
|
|
56
|
+
try {
|
|
57
|
+
const service = new StyleCommandService();
|
|
58
|
+
const info = await service.getJsonlInfo(jsonlFile);
|
|
59
|
+
console.log('\n📊 JSONL 文件信息\n');
|
|
60
|
+
console.log(`文件路径: ${jsonlFile}`);
|
|
61
|
+
console.log(`总章节数: ${info.totalChapters}`);
|
|
62
|
+
console.log(`总字数: ${info.totalWords.toLocaleString()}`);
|
|
63
|
+
console.log(`平均章节字数: ${info.avgWordsPerChapter.toLocaleString()}`);
|
|
64
|
+
console.log(`最短章节: 第 ${info.minChapter.chapter_id} 章 (${info.minChapter.chapter_length} 字)`);
|
|
65
|
+
console.log(`最长章节: 第 ${info.maxChapter.chapter_id} 章 (${info.maxChapter.chapter_length} 字)`);
|
|
66
|
+
console.log('');
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
return cmd;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/commands/style.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temp-setting.d.ts","sourceRoot":"","sources":["../../src/commands/temp-setting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAmKlD"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { TempSettingService } from '../services/temp-setting.service.js';
|
|
3
|
+
import { CliUtils } from './shared.js';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
/**
|
|
6
|
+
* 创建 temp-setting 命令
|
|
7
|
+
*/
|
|
8
|
+
export function createTempSettingCommand() {
|
|
9
|
+
const cmd = new Command('temp-setting');
|
|
10
|
+
cmd.description('临时设定管理相关操作');
|
|
11
|
+
// temp-setting add — 添加临时设定
|
|
12
|
+
cmd
|
|
13
|
+
.command('add')
|
|
14
|
+
.requiredOption('-t, --type <type>', '设定类型: character | location | item | skill | other')
|
|
15
|
+
.requiredOption('-n, --name <name>', '名称')
|
|
16
|
+
.requiredOption('-c, --chapter <number>', '首次出现章节')
|
|
17
|
+
.option('-d, --description <desc>', '描述内容')
|
|
18
|
+
.option('-p, --path <path>', '项目路径')
|
|
19
|
+
.action(async (options) => {
|
|
20
|
+
try {
|
|
21
|
+
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
22
|
+
// 验证类型
|
|
23
|
+
const validTypes = ['character', 'location', 'item', 'skill', 'other'];
|
|
24
|
+
if (!validTypes.includes(options.type)) {
|
|
25
|
+
CliUtils.error(`无效的设定类型: ${options.type}`);
|
|
26
|
+
CliUtils.info(`支持的类型: ${validTypes.join(', ')}`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
// 验证章节号
|
|
30
|
+
const chapter = parseInt(options.chapter, 10);
|
|
31
|
+
if (isNaN(chapter) || chapter < 1) {
|
|
32
|
+
CliUtils.error('章节号必须是正整数');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const service = new TempSettingService();
|
|
36
|
+
const filePath = await service.addTempSetting(projectPath, {
|
|
37
|
+
type: options.type,
|
|
38
|
+
name: options.name,
|
|
39
|
+
description: options.description,
|
|
40
|
+
chapter
|
|
41
|
+
});
|
|
42
|
+
CliUtils.success(`已添加临时设定: ${options.name}`);
|
|
43
|
+
CliUtils.info(`文件位置: ${filePath}`);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
// temp-setting list — 列出待审核项
|
|
51
|
+
cmd
|
|
52
|
+
.command('list')
|
|
53
|
+
.option('-t, --type <type>', '过滤类型')
|
|
54
|
+
.option('--pending', '只显示待审核状态', true)
|
|
55
|
+
.option('-P, --path <path>', '项目路径')
|
|
56
|
+
.action(async (options) => {
|
|
57
|
+
try {
|
|
58
|
+
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
59
|
+
const service = new TempSettingService();
|
|
60
|
+
const items = await service.listPending(projectPath, options.type);
|
|
61
|
+
if (items.length === 0) {
|
|
62
|
+
console.log('没有待审核的设定');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
console.log(`\n待审核设定 (${items.length} 项)\n`);
|
|
66
|
+
// 按类型分组
|
|
67
|
+
const characters = items.filter(item => item.type === 'character');
|
|
68
|
+
const others = items.filter(item => item.type !== 'character');
|
|
69
|
+
if (characters.length > 0) {
|
|
70
|
+
console.log(chalk.bold('人物:'));
|
|
71
|
+
for (const item of characters) {
|
|
72
|
+
const status = item.status === 'pending' ? chalk.yellow('待审核') : item.status;
|
|
73
|
+
console.log(` • ${item.name} (第${item.first_appear_chapter}章) - ${status}`);
|
|
74
|
+
}
|
|
75
|
+
console.log('');
|
|
76
|
+
}
|
|
77
|
+
if (others.length > 0) {
|
|
78
|
+
console.log(chalk.bold('其他:'));
|
|
79
|
+
for (const item of others) {
|
|
80
|
+
const status = item.status === 'pending' ? chalk.yellow('待审核') : item.status;
|
|
81
|
+
console.log(` • ${item.name} (第${item.first_appear_chapter}章) - ${item.type} - ${status}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
// temp-setting review — 审核设定
|
|
91
|
+
cmd
|
|
92
|
+
.command('review')
|
|
93
|
+
.option('-a, --all', '审核所有待审核项(默认)')
|
|
94
|
+
.option('-i, --interactive', '交互式审核')
|
|
95
|
+
.option('-p, --path <path>', '项目路径')
|
|
96
|
+
.action(async (options) => {
|
|
97
|
+
try {
|
|
98
|
+
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
99
|
+
const service = new TempSettingService();
|
|
100
|
+
if (options.interactive) {
|
|
101
|
+
await service.reviewInteractive(projectPath);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// 显示待审核列表
|
|
105
|
+
const items = await service.listPending(projectPath);
|
|
106
|
+
if (items.length === 0) {
|
|
107
|
+
console.log('没有待审核的设定');
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
console.log(`\n待审核设定 (${items.length} 项)`);
|
|
111
|
+
console.log('使用 --interactive 选项进行交互式审核\n');
|
|
112
|
+
for (const item of items) {
|
|
113
|
+
const typeLabel = item.type === 'character' ? '人物' : item.type;
|
|
114
|
+
console.log(` • ${item.name} (${typeLabel}, 第${item.first_appear_chapter}章)`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
// temp-setting migrate — 迁移设定
|
|
124
|
+
cmd
|
|
125
|
+
.command('migrate')
|
|
126
|
+
.argument('<name>', '待迁移的设定名称')
|
|
127
|
+
.option('--to-character', '迁移为正式人物卡片')
|
|
128
|
+
.option('--to-element', '迁移为正式设定元素')
|
|
129
|
+
.option('-l, --location <path>', '自定义目标路径')
|
|
130
|
+
.option('-p, --path <path>', '项目路径')
|
|
131
|
+
.action(async (name, options) => {
|
|
132
|
+
try {
|
|
133
|
+
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
134
|
+
// 验证选项
|
|
135
|
+
if (!options.toCharacter && !options.toElement && !options.location) {
|
|
136
|
+
CliUtils.error('必须指定迁移目标: --to-character, --to-element, 或 --location');
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
const service = new TempSettingService();
|
|
140
|
+
await service.approveAndMigrate(projectPath, name, {
|
|
141
|
+
toCharacter: options.toCharacter,
|
|
142
|
+
toElement: options.toElement,
|
|
143
|
+
customPath: options.location
|
|
144
|
+
});
|
|
145
|
+
CliUtils.success(`已迁移设定: ${name}`);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
return cmd;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=temp-setting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temp-setting.js","sourceRoot":"","sources":["../../src/commands/temp-setting.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -142,4 +142,35 @@ export interface StateQueryResult {
|
|
|
142
142
|
foreshadows?: ForeshadowState;
|
|
143
143
|
message?: string;
|
|
144
144
|
}
|
|
145
|
+
export interface AddTempSettingOptions {
|
|
146
|
+
type: 'character' | 'location' | 'item' | 'skill' | 'other';
|
|
147
|
+
name: string;
|
|
148
|
+
description?: string;
|
|
149
|
+
chapter: number;
|
|
150
|
+
}
|
|
151
|
+
export interface PendingItem {
|
|
152
|
+
name: string;
|
|
153
|
+
type: string;
|
|
154
|
+
file: string;
|
|
155
|
+
first_appear_chapter: number;
|
|
156
|
+
added_at: string;
|
|
157
|
+
status: 'pending' | 'approved' | 'rejected';
|
|
158
|
+
}
|
|
159
|
+
export interface ReviewQueue {
|
|
160
|
+
pending_characters: PendingItem[];
|
|
161
|
+
pending_elements: PendingItem[];
|
|
162
|
+
last_review: string | null;
|
|
163
|
+
}
|
|
164
|
+
export interface MigrateOptions {
|
|
165
|
+
toCharacter?: boolean;
|
|
166
|
+
toElement?: boolean;
|
|
167
|
+
customPath?: string;
|
|
168
|
+
}
|
|
169
|
+
export interface TempSettingItem {
|
|
170
|
+
type: string;
|
|
171
|
+
name: string;
|
|
172
|
+
description: string;
|
|
173
|
+
chapter: number;
|
|
174
|
+
addedAt: string;
|
|
175
|
+
}
|
|
145
176
|
//# sourceMappingURL=types.d.ts.map
|