@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.
- package/CHANGELOG.md +45 -0
- package/README.md +80 -0
- package/dist/commands/check.d.ts +6 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +105 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/index.d.ts +4 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +31 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +52 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/query.d.ts +6 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +169 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/shared.d.ts +51 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +110 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/snapshot.d.ts +6 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +140 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/core/constants.d.ts +38 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +88 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/file.d.ts +55 -0
- package/dist/core/file.d.ts.map +1 -0
- package/dist/core/file.js +136 -0
- package/dist/core/file.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/types.d.ts +145 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/yaml.d.ts +43 -0
- package/dist/core/yaml.d.ts.map +1 -0
- package/dist/core/yaml.js +90 -0
- package/dist/core/yaml.js.map +1 -0
- package/dist/services/event.service.d.ts +35 -0
- package/dist/services/event.service.d.ts.map +1 -0
- package/dist/services/event.service.js +177 -0
- package/dist/services/event.service.js.map +1 -0
- package/dist/services/index.d.ts +6 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +7 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/init.service.d.ts +51 -0
- package/dist/services/init.service.d.ts.map +1 -0
- package/dist/services/init.service.js +250 -0
- package/dist/services/init.service.js.map +1 -0
- package/dist/services/query.service.d.ts +43 -0
- package/dist/services/query.service.d.ts.map +1 -0
- package/dist/services/query.service.js +129 -0
- package/dist/services/query.service.js.map +1 -0
- package/dist/services/snapshot.service.d.ts +42 -0
- package/dist/services/snapshot.service.d.ts.map +1 -0
- package/dist/services/snapshot.service.js +234 -0
- package/dist/services/snapshot.service.js.map +1 -0
- package/dist/services/validate.service.d.ts +43 -0
- package/dist/services/validate.service.d.ts.map +1 -0
- package/dist/services/validate.service.js +278 -0
- package/dist/services/validate.service.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/output.d.ts +30 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +112 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/validation.d.ts +59 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +120 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
/**
|
|
3
|
+
* CLI 共享工具类
|
|
4
|
+
*/
|
|
5
|
+
export class CliUtils {
|
|
6
|
+
/**
|
|
7
|
+
* 打印成功消息
|
|
8
|
+
*/
|
|
9
|
+
static success(message) {
|
|
10
|
+
console.log(chalk.green('✓'), message);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 打印错误消息
|
|
14
|
+
*/
|
|
15
|
+
static error(message) {
|
|
16
|
+
console.error(chalk.red('✗'), message);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 打印警告消息
|
|
20
|
+
*/
|
|
21
|
+
static warning(message) {
|
|
22
|
+
console.warn(chalk.yellow('⚠'), message);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 打印信息消息
|
|
26
|
+
*/
|
|
27
|
+
static info(message) {
|
|
28
|
+
console.log(chalk.blue('ℹ'), message);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 打印标题
|
|
32
|
+
*/
|
|
33
|
+
static title(message) {
|
|
34
|
+
console.log();
|
|
35
|
+
console.log(chalk.bold.cyan(message));
|
|
36
|
+
console.log(chalk.cyan('─'.repeat(message.length)));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 打印验证结果
|
|
40
|
+
*/
|
|
41
|
+
static printValidationResult(result) {
|
|
42
|
+
console.log();
|
|
43
|
+
if (result.passed) {
|
|
44
|
+
this.success('所有检查通过');
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
this.error('检查发现问题');
|
|
48
|
+
}
|
|
49
|
+
console.log();
|
|
50
|
+
for (const check of result.checks) {
|
|
51
|
+
if (check.passed) {
|
|
52
|
+
this.success(`${check.name}: 通过`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.error(`${check.name}: 失败`);
|
|
56
|
+
for (const issue of check.issues) {
|
|
57
|
+
console.log(chalk.red(` • ${issue}`));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
console.log();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 打印键值对
|
|
65
|
+
*/
|
|
66
|
+
static printKeyValue(key, value) {
|
|
67
|
+
console.log(`${chalk.cyan(key.padEnd(20))}: ${value}`);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 打印分隔线
|
|
71
|
+
*/
|
|
72
|
+
static separator() {
|
|
73
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 打印列表
|
|
77
|
+
*/
|
|
78
|
+
static printList(items, indent = 0) {
|
|
79
|
+
const prefix = ' '.repeat(indent);
|
|
80
|
+
for (const item of items) {
|
|
81
|
+
console.log(`${prefix}• ${item}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 确认操作
|
|
86
|
+
*/
|
|
87
|
+
static async confirm(message) {
|
|
88
|
+
const readline = await import('readline');
|
|
89
|
+
const rl = readline.createInterface({
|
|
90
|
+
input: process.stdin,
|
|
91
|
+
output: process.stdout
|
|
92
|
+
});
|
|
93
|
+
return new Promise((resolve) => {
|
|
94
|
+
rl.question(`${message} (y/N): `, (answer) => {
|
|
95
|
+
rl.close();
|
|
96
|
+
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 获取项目路径
|
|
102
|
+
*/
|
|
103
|
+
static resolveProjectPath(projectPath) {
|
|
104
|
+
if (projectPath) {
|
|
105
|
+
return projectPath;
|
|
106
|
+
}
|
|
107
|
+
return process.cwd();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA6H/C"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { SnapshotService } from '../services/snapshot.service.js';
|
|
3
|
+
import { CliUtils } from './shared.js';
|
|
4
|
+
import { FileUtils } from '../core/file.js';
|
|
5
|
+
import { YamlUtils } from '../core/yaml.js';
|
|
6
|
+
/**
|
|
7
|
+
* 创建 snapshot 命令
|
|
8
|
+
*/
|
|
9
|
+
export function createSnapshotCommand() {
|
|
10
|
+
const cmd = new Command('snapshot');
|
|
11
|
+
cmd.description('生成和管理状态快照');
|
|
12
|
+
// 生成快照
|
|
13
|
+
cmd
|
|
14
|
+
.command('generate')
|
|
15
|
+
.option('-v, --volume <number>', '卷号')
|
|
16
|
+
.option('-a, --arc <name>', '弧名称')
|
|
17
|
+
.option('-o, --output <path>', '输出文件路径')
|
|
18
|
+
.option('-p, --path <path>', '项目路径')
|
|
19
|
+
.action(async (options) => {
|
|
20
|
+
try {
|
|
21
|
+
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
22
|
+
const snapshotService = new SnapshotService();
|
|
23
|
+
CliUtils.title('生成状态快照');
|
|
24
|
+
const volume = options.volume ? parseInt(options.volume, 10) : undefined;
|
|
25
|
+
const arc = options.arc;
|
|
26
|
+
// 归档当前事件到卷目录
|
|
27
|
+
if (volume) {
|
|
28
|
+
await archiveEventsToVolume(projectPath, volume);
|
|
29
|
+
}
|
|
30
|
+
// 生成快照
|
|
31
|
+
const snapshot = await snapshotService.generateSnapshot(projectPath, volume, arc);
|
|
32
|
+
// 保存快照
|
|
33
|
+
const outputPath = options.output ||
|
|
34
|
+
await snapshotService.saveSnapshot(projectPath, snapshot, volume, arc);
|
|
35
|
+
CliUtils.success('快照生成成功');
|
|
36
|
+
CliUtils.printKeyValue('快照信息', `生成了 ${snapshot.snapshot_info.total_characters} 个人物,${snapshot.snapshot_info.total_events} 个事件`);
|
|
37
|
+
CliUtils.printKeyValue('保存路径', outputPath);
|
|
38
|
+
if (volume) {
|
|
39
|
+
// 更新 project.json 中的当前卷
|
|
40
|
+
const projectConfigPath = `${projectPath}/project.json`;
|
|
41
|
+
const config = await FileUtils.readJson(projectConfigPath);
|
|
42
|
+
if (config) {
|
|
43
|
+
config.current_volume = volume + 1;
|
|
44
|
+
await FileUtils.writeJson(projectConfigPath, config);
|
|
45
|
+
CliUtils.info(`当前卷已更新为第 ${volume + 1} 卷`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// 列出快照
|
|
55
|
+
cmd
|
|
56
|
+
.command('list')
|
|
57
|
+
.option('-p, --path <path>', '项目路径')
|
|
58
|
+
.action(async (options) => {
|
|
59
|
+
try {
|
|
60
|
+
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
61
|
+
const snapshotService = new SnapshotService();
|
|
62
|
+
const snapshots = await snapshotService.listSnapshots(projectPath);
|
|
63
|
+
if (snapshots.length === 0) {
|
|
64
|
+
CliUtils.info('暂无快照');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
CliUtils.title('状态快照列表');
|
|
68
|
+
for (const snap of snapshots) {
|
|
69
|
+
console.log(` • ${snap.name}`);
|
|
70
|
+
const snapData = await YamlUtils.parseFile(snap.path);
|
|
71
|
+
if (snapData?.snapshot_info) {
|
|
72
|
+
const info = snapData.snapshot_info;
|
|
73
|
+
console.log(` 时间: ${new Date(info.generated_at).toLocaleString('zh-CN')}`);
|
|
74
|
+
console.log(` 人物: ${info.total_characters} 人`);
|
|
75
|
+
console.log(` 事件: ${info.total_events} 条`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
// 查看快照
|
|
85
|
+
cmd
|
|
86
|
+
.command('show')
|
|
87
|
+
.argument('[name]', '快照名称')
|
|
88
|
+
.option('-p, --path <path>', '项目路径')
|
|
89
|
+
.action(async (name, options) => {
|
|
90
|
+
try {
|
|
91
|
+
const projectPath = CliUtils.resolveProjectPath(options.path);
|
|
92
|
+
const snapshotService = new SnapshotService();
|
|
93
|
+
let snapshot;
|
|
94
|
+
if (name) {
|
|
95
|
+
// 从名称解析卷号或弧名
|
|
96
|
+
const volMatch = name.match(/^vol(\d+)$/);
|
|
97
|
+
if (volMatch) {
|
|
98
|
+
snapshot = await snapshotService.loadSnapshot(projectPath, parseInt(volMatch[1], 10));
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
snapshot = await snapshotService.loadSnapshot(projectPath, undefined, name);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
snapshot = await snapshotService.loadSnapshot(projectPath);
|
|
106
|
+
}
|
|
107
|
+
if (!snapshot) {
|
|
108
|
+
CliUtils.error('未找到快照');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
CliUtils.title('状态快照详情');
|
|
112
|
+
console.log(JSON.stringify(snapshot, null, 2));
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
CliUtils.error(error instanceof Error ? error.message : String(error));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return cmd;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 归档事件到卷目录
|
|
123
|
+
*/
|
|
124
|
+
async function archiveEventsToVolume(projectPath, volume) {
|
|
125
|
+
// 加载当前事件
|
|
126
|
+
const currentEventsPath = `${projectPath}/settings/events/current/events.json`;
|
|
127
|
+
const currentData = await FileUtils.readJson(currentEventsPath);
|
|
128
|
+
if (!currentData?.events || currentData.events.length === 0) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
// 创建卷目录
|
|
132
|
+
const volEventsPath = `${projectPath}/settings/events/vol${volume}`;
|
|
133
|
+
await FileUtils.ensureDir(volEventsPath);
|
|
134
|
+
// 保存到卷目录
|
|
135
|
+
const volEventsFile = `${volEventsPath}/events.json`;
|
|
136
|
+
await FileUtils.writeJson(volEventsFile, currentData);
|
|
137
|
+
// 清空当前事件
|
|
138
|
+
await FileUtils.writeJson(currentEventsPath, { events: [] });
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { NovelTypeConfig } from './types.js';
|
|
2
|
+
export declare const NOVEL_TYPES: Record<string, NovelTypeConfig>;
|
|
3
|
+
export declare const STANDARD_DIRS: string[];
|
|
4
|
+
export declare const CHARACTER_SUBDIRS: string[];
|
|
5
|
+
export declare const TIME_WORDS: string[];
|
|
6
|
+
export declare const KEY_EVENT_TYPES: string[];
|
|
7
|
+
export declare const SETTING_FILE_MAP: Record<string, string>;
|
|
8
|
+
export declare const FORESHADOW_STATUS: {
|
|
9
|
+
readonly PLANTED: "planted";
|
|
10
|
+
readonly RESOLVED: "resolved";
|
|
11
|
+
readonly UNRESOLVED: "unresolved";
|
|
12
|
+
};
|
|
13
|
+
export declare const CHARACTER_IDENTITY: {
|
|
14
|
+
readonly MAIN: "main";
|
|
15
|
+
readonly SUPPORTING: "supporting";
|
|
16
|
+
readonly ANTAGONIST: "antagonists";
|
|
17
|
+
readonly PENDING: "pending";
|
|
18
|
+
};
|
|
19
|
+
export declare const CLI_NAME = "novel-tools";
|
|
20
|
+
export declare const CLI_VERSION = "0.1.0";
|
|
21
|
+
export declare const CLI_DESCRIPTION = "\u5C0F\u8BF4\u521B\u4F5C\u8F85\u52A9\u5DE5\u5177\u96C6";
|
|
22
|
+
export declare const ERROR_MESSAGES: {
|
|
23
|
+
readonly PROJECT_NOT_FOUND: "未找到小说项目配置文件 (project.json)";
|
|
24
|
+
readonly INVALID_NOVEL_TYPE: (type: string) => string;
|
|
25
|
+
readonly CHARACTER_NOT_FOUND: (name: string) => string;
|
|
26
|
+
readonly SETTING_NOT_FOUND: (type: string) => string;
|
|
27
|
+
readonly SNAPSHOT_NOT_FOUND: (volume?: number) => string;
|
|
28
|
+
readonly OUTLINE_NOT_FOUND: "未找到大纲文件";
|
|
29
|
+
readonly EVENTS_NOT_FOUND: "未找到事件记录";
|
|
30
|
+
};
|
|
31
|
+
export declare const SUCCESS_MESSAGES: {
|
|
32
|
+
readonly PROJECT_CREATED: (name: string) => string;
|
|
33
|
+
readonly SNAPSHOT_SAVED: (path: string) => string;
|
|
34
|
+
readonly EVENTS_ADDED: (chapter: number) => string;
|
|
35
|
+
readonly CHECK_PASSED: "所有检查通过";
|
|
36
|
+
readonly CHECK_FAILED: "检查发现问题,请查看详细报告";
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAiBvD,CAAC;AAGF,eAAO,MAAM,aAAa,UAgBzB,CAAC;AAGF,eAAO,MAAM,iBAAiB,UAAwC,CAAC;AAGvE,eAAO,MAAM,UAAU,UAAsD,CAAC;AAG9E,eAAO,MAAM,eAAe,UAA+B,CAAC;AAG5D,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOnD,CAAC;AAGF,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAC;AAGX,eAAO,MAAM,kBAAkB;;;;;CAKrB,CAAC;AAGX,eAAO,MAAM,QAAQ,gBAAgB,CAAC;AACtC,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,eAAe,2DAAc,CAAC;AAG3C,eAAO,MAAM,cAAc;;wCAEE,MAAM;yCACL,MAAM;uCACR,MAAM;2CACF,MAAM;;;CAG5B,CAAC;AAGX,eAAO,MAAM,gBAAgB;qCACH,MAAM;oCACP,MAAM;qCACL,MAAM;;;CAGtB,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// ==================== 小说类型配置 ====================
|
|
2
|
+
export const NOVEL_TYPES = {
|
|
3
|
+
webnovel: {
|
|
4
|
+
name: '网文',
|
|
5
|
+
staticFiles: ['world.yaml', 'power_system.yaml'],
|
|
6
|
+
description: '修仙/玄幻/都市异能等网文类型'
|
|
7
|
+
},
|
|
8
|
+
literary: {
|
|
9
|
+
name: '传统文学',
|
|
10
|
+
staticFiles: ['world.yaml', 'era_background.yaml'],
|
|
11
|
+
description: '现实主义/历史小说等传统文学类型'
|
|
12
|
+
},
|
|
13
|
+
fanfiction: {
|
|
14
|
+
name: '同人',
|
|
15
|
+
staticFiles: ['world.yaml'],
|
|
16
|
+
extraDirs: ['references/fanfiction'],
|
|
17
|
+
description: '基于原作的同人创作'
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
// ==================== 标准目录结构 ====================
|
|
21
|
+
export const STANDARD_DIRS = [
|
|
22
|
+
'settings/static',
|
|
23
|
+
'settings/state',
|
|
24
|
+
'settings/events/current',
|
|
25
|
+
'characters/cards/main',
|
|
26
|
+
'characters/cards/supporting',
|
|
27
|
+
'characters/cards/antagonists',
|
|
28
|
+
'characters/samples',
|
|
29
|
+
'characters/growth',
|
|
30
|
+
'outline',
|
|
31
|
+
'chapter_plans',
|
|
32
|
+
'drafts',
|
|
33
|
+
'temp_settings/pending_characters',
|
|
34
|
+
'temp_settings/pending_elements',
|
|
35
|
+
'references/core',
|
|
36
|
+
'references/auxiliary'
|
|
37
|
+
];
|
|
38
|
+
// ==================== 人物子目录 ====================
|
|
39
|
+
export const CHARACTER_SUBDIRS = ['main', 'supporting', 'antagonists'];
|
|
40
|
+
// ==================== 时间相关关键词 ====================
|
|
41
|
+
export const TIME_WORDS = ['今天', '昨天', '明天', '刚才', '之后', '之前', '三天后', '一个月后'];
|
|
42
|
+
// ==================== 关键事件类型 ====================
|
|
43
|
+
export const KEY_EVENT_TYPES = ['战斗', '重要决定', '死亡', '等级变化'];
|
|
44
|
+
// ==================== 设定类型映射 ====================
|
|
45
|
+
export const SETTING_FILE_MAP = {
|
|
46
|
+
'world': 'world.yaml',
|
|
47
|
+
'power_system': 'power_system.yaml',
|
|
48
|
+
'era_background': 'era_background.yaml',
|
|
49
|
+
'等级': 'power_system.yaml',
|
|
50
|
+
'世界观': 'world.yaml',
|
|
51
|
+
'时代': 'era_background.yaml'
|
|
52
|
+
};
|
|
53
|
+
// ==================== 伏笔状态 ====================
|
|
54
|
+
export const FORESHADOW_STATUS = {
|
|
55
|
+
PLANTED: 'planted',
|
|
56
|
+
RESOLVED: 'resolved',
|
|
57
|
+
UNRESOLVED: 'unresolved'
|
|
58
|
+
};
|
|
59
|
+
// ==================== 人物身份类型 ====================
|
|
60
|
+
export const CHARACTER_IDENTITY = {
|
|
61
|
+
MAIN: 'main',
|
|
62
|
+
SUPPORTING: 'supporting',
|
|
63
|
+
ANTAGONIST: 'antagonists',
|
|
64
|
+
PENDING: 'pending'
|
|
65
|
+
};
|
|
66
|
+
// ==================== CLI 相关常量 ====================
|
|
67
|
+
export const CLI_NAME = 'novel-tools';
|
|
68
|
+
export const CLI_VERSION = '0.1.0';
|
|
69
|
+
export const CLI_DESCRIPTION = '小说创作辅助工具集';
|
|
70
|
+
// ==================== 错误消息 ====================
|
|
71
|
+
export const ERROR_MESSAGES = {
|
|
72
|
+
PROJECT_NOT_FOUND: '未找到小说项目配置文件 (project.json)',
|
|
73
|
+
INVALID_NOVEL_TYPE: (type) => `无效的小说类型: ${type},支持的类型: webnovel, literary, fanfiction`,
|
|
74
|
+
CHARACTER_NOT_FOUND: (name) => `未找到人物: ${name}`,
|
|
75
|
+
SETTING_NOT_FOUND: (type) => `未找到设定: ${type}`,
|
|
76
|
+
SNAPSHOT_NOT_FOUND: (volume) => volume ? `未找到第${volume}卷的状态快照` : '暂无状态快照',
|
|
77
|
+
OUTLINE_NOT_FOUND: '未找到大纲文件',
|
|
78
|
+
EVENTS_NOT_FOUND: '未找到事件记录'
|
|
79
|
+
};
|
|
80
|
+
// ==================== 成功消息 ====================
|
|
81
|
+
export const SUCCESS_MESSAGES = {
|
|
82
|
+
PROJECT_CREATED: (name) => `小说项目 "${name}" 创建成功`,
|
|
83
|
+
SNAPSHOT_SAVED: (path) => `快照已保存至: ${path}`,
|
|
84
|
+
EVENTS_ADDED: (chapter) => `章节 ${chapter} 的事件已添加`,
|
|
85
|
+
CHECK_PASSED: '所有检查通过',
|
|
86
|
+
CHECK_FAILED: '检查发现问题,请查看详细报告'
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Stats } from 'fs';
|
|
2
|
+
/**
|
|
3
|
+
* 文件操作工具类
|
|
4
|
+
*/
|
|
5
|
+
export declare class FileUtils {
|
|
6
|
+
/**
|
|
7
|
+
* 读取 JSON 文件
|
|
8
|
+
*/
|
|
9
|
+
static readJson(filePath: string): Promise<any>;
|
|
10
|
+
/**
|
|
11
|
+
* 写入 JSON 文件
|
|
12
|
+
*/
|
|
13
|
+
static writeJson(filePath: string, data: any, indent?: number): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* 读取文件内容
|
|
16
|
+
*/
|
|
17
|
+
static readText(filePath: string): Promise<string>;
|
|
18
|
+
/**
|
|
19
|
+
* 写入文件内容
|
|
20
|
+
*/
|
|
21
|
+
static writeText(filePath: string, content: string): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* 确保目录存在
|
|
24
|
+
*/
|
|
25
|
+
static ensureDir(dirPath: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* 检查文件/目录是否存在
|
|
28
|
+
*/
|
|
29
|
+
static exists(filePath: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* 获取目录下所有匹配的文件
|
|
32
|
+
*/
|
|
33
|
+
static globFiles(dirPath: string, pattern: string): Promise<string[]>;
|
|
34
|
+
/**
|
|
35
|
+
* 递归复制目录
|
|
36
|
+
*/
|
|
37
|
+
static copyDir(src: string, dest: string): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* 删除文件或目录
|
|
40
|
+
*/
|
|
41
|
+
static remove(filePath: string): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* 获取文件统计信息
|
|
44
|
+
*/
|
|
45
|
+
static getStats(filePath: string): Promise<Stats | null>;
|
|
46
|
+
/**
|
|
47
|
+
* 列出目录内容
|
|
48
|
+
*/
|
|
49
|
+
static listDir(dirPath: string): Promise<string[]>;
|
|
50
|
+
/**
|
|
51
|
+
* 读取目录
|
|
52
|
+
*/
|
|
53
|
+
static readDir(dirPath: string): Promise<string[]>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/core/file.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,EAAE,MAAM,IAAI,CAAC;AAEvC;;GAEG;AACH,qBAAa,SAAS;IACpB;;OAEG;WACU,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQrD;;OAEG;WACU,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9E;;OAEG;WACU,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOxD;;OAEG;WACU,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxE;;OAEG;WACU,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;WACU,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAU3E;;OAEG;WACU,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9D;;OAEG;WACU,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAapD;;OAEG;WACU,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAQ9D;;OAEG;WACU,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQxD;;OAEG;WACU,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAUzD"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
/**
|
|
5
|
+
* 文件操作工具类
|
|
6
|
+
*/
|
|
7
|
+
export class FileUtils {
|
|
8
|
+
/**
|
|
9
|
+
* 读取 JSON 文件
|
|
10
|
+
*/
|
|
11
|
+
static async readJson(filePath) {
|
|
12
|
+
if (!existsSync(filePath)) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
16
|
+
return JSON.parse(content);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 写入 JSON 文件
|
|
20
|
+
*/
|
|
21
|
+
static async writeJson(filePath, data, indent = 2) {
|
|
22
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
23
|
+
await fs.writeFile(filePath, JSON.stringify(data, null, indent), 'utf-8');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 读取文件内容
|
|
27
|
+
*/
|
|
28
|
+
static async readText(filePath) {
|
|
29
|
+
if (!existsSync(filePath)) {
|
|
30
|
+
return '';
|
|
31
|
+
}
|
|
32
|
+
return await fs.readFile(filePath, 'utf-8');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 写入文件内容
|
|
36
|
+
*/
|
|
37
|
+
static async writeText(filePath, content) {
|
|
38
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
39
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 确保目录存在
|
|
43
|
+
*/
|
|
44
|
+
static async ensureDir(dirPath) {
|
|
45
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 检查文件/目录是否存在
|
|
49
|
+
*/
|
|
50
|
+
static exists(filePath) {
|
|
51
|
+
return existsSync(filePath);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 获取目录下所有匹配的文件
|
|
55
|
+
*/
|
|
56
|
+
static async globFiles(dirPath, pattern) {
|
|
57
|
+
const { glob } = await import('glob');
|
|
58
|
+
const results = await glob(pattern, {
|
|
59
|
+
cwd: dirPath,
|
|
60
|
+
absolute: true,
|
|
61
|
+
windowsPathsNoEscape: true
|
|
62
|
+
});
|
|
63
|
+
return results.sort();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 递归复制目录
|
|
67
|
+
*/
|
|
68
|
+
static async copyDir(src, dest) {
|
|
69
|
+
await fs.mkdir(dest, { recursive: true });
|
|
70
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
71
|
+
for (const entry of entries) {
|
|
72
|
+
const srcPath = path.join(src, entry.name);
|
|
73
|
+
const destPath = path.join(dest, entry.name);
|
|
74
|
+
if (entry.isDirectory()) {
|
|
75
|
+
await this.copyDir(srcPath, destPath);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
await fs.copyFile(srcPath, destPath);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 删除文件或目录
|
|
84
|
+
*/
|
|
85
|
+
static async remove(filePath) {
|
|
86
|
+
try {
|
|
87
|
+
const stat = await fs.stat(filePath);
|
|
88
|
+
if (stat.isDirectory()) {
|
|
89
|
+
await fs.rm(filePath, { recursive: true, force: true });
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
await fs.unlink(filePath);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// 文件不存在,忽略错误
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 获取文件统计信息
|
|
101
|
+
*/
|
|
102
|
+
static async getStats(filePath) {
|
|
103
|
+
try {
|
|
104
|
+
return await fs.stat(filePath);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 列出目录内容
|
|
112
|
+
*/
|
|
113
|
+
static async listDir(dirPath) {
|
|
114
|
+
try {
|
|
115
|
+
return await fs.readdir(dirPath);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 读取目录
|
|
123
|
+
*/
|
|
124
|
+
static async readDir(dirPath) {
|
|
125
|
+
try {
|
|
126
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
127
|
+
return entries
|
|
128
|
+
.filter(entry => !entry.name.startsWith('.'))
|
|
129
|
+
.map(entry => entry.name);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/core/file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAG3B,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,cAAc,YAAY,CAAC;AAE3B,SAAS;AACT,cAAc,gBAAgB,CAAC;AAE/B,QAAQ;AACR,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
|