inkos-n 1.2.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/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +59 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/analytics.d.ts +3 -0
- package/dist/commands/analytics.d.ts.map +1 -0
- package/dist/commands/analytics.js +74 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +52 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/book.d.ts +3 -0
- package/dist/commands/book.d.ts.map +1 -0
- package/dist/commands/book.js +250 -0
- package/dist/commands/book.js.map +1 -0
- package/dist/commands/compose.d.ts +3 -0
- package/dist/commands/compose.d.ts.map +1 -0
- package/dist/commands/compose.js +47 -0
- package/dist/commands/compose.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +293 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/consolidate.d.ts +3 -0
- package/dist/commands/consolidate.d.ts.map +1 -0
- package/dist/commands/consolidate.js +50 -0
- package/dist/commands/consolidate.js.map +1 -0
- package/dist/commands/daemon.d.ts +4 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +118 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/detect.d.ts +3 -0
- package/dist/commands/detect.d.ts.map +1 -0
- package/dist/commands/detect.js +104 -0
- package/dist/commands/detect.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +233 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/draft.d.ts +3 -0
- package/dist/commands/draft.d.ts.map +1 -0
- package/dist/commands/draft.js +42 -0
- package/dist/commands/draft.js.map +1 -0
- package/dist/commands/eval.d.ts +3 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +168 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +115 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/fanfic.d.ts +3 -0
- package/dist/commands/fanfic.d.ts.map +1 -0
- package/dist/commands/fanfic.js +180 -0
- package/dist/commands/fanfic.js.map +1 -0
- package/dist/commands/genre.d.ts +3 -0
- package/dist/commands/genre.d.ts.map +1 -0
- package/dist/commands/genre.js +152 -0
- package/dist/commands/genre.js.map +1 -0
- package/dist/commands/import.d.ts +3 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +136 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +132 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/interact.d.ts +25 -0
- package/dist/commands/interact.d.ts.map +1 -0
- package/dist/commands/interact.js +73 -0
- package/dist/commands/interact.js.map +1 -0
- package/dist/commands/plan.d.ts +3 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +51 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/radar.d.ts +3 -0
- package/dist/commands/radar.d.ts.map +1 -0
- package/dist/commands/radar.js +52 -0
- package/dist/commands/radar.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +229 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/revise.d.ts +3 -0
- package/dist/commands/revise.d.ts.map +1 -0
- package/dist/commands/revise.js +60 -0
- package/dist/commands/revise.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +123 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/studio.d.ts +14 -0
- package/dist/commands/studio.d.ts.map +1 -0
- package/dist/commands/studio.js +120 -0
- package/dist/commands/studio.js.map +1 -0
- package/dist/commands/style.d.ts +3 -0
- package/dist/commands/style.d.ts.map +1 -0
- package/dist/commands/style.js +95 -0
- package/dist/commands/style.js.map +1 -0
- package/dist/commands/tui.d.ts +6 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +14 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +40 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/write.d.ts +3 -0
- package/dist/commands/write.d.ts.map +1 -0
- package/dist/commands/write.js +323 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/localization.d.ts +38 -0
- package/dist/localization.d.ts.map +1 -0
- package/dist/localization.js +144 -0
- package/dist/localization.js.map +1 -0
- package/dist/program.d.ts +10 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +85 -0
- package/dist/program.js.map +1 -0
- package/dist/progress-text.d.ts +26 -0
- package/dist/progress-text.d.ts.map +1 -0
- package/dist/progress-text.js +35 -0
- package/dist/progress-text.js.map +1 -0
- package/dist/runtime-requirements.d.ts +28 -0
- package/dist/runtime-requirements.d.ts.map +1 -0
- package/dist/runtime-requirements.js +99 -0
- package/dist/runtime-requirements.js.map +1 -0
- package/dist/tui/__tests__/markdown.test.d.ts +2 -0
- package/dist/tui/__tests__/markdown.test.d.ts.map +1 -0
- package/dist/tui/__tests__/markdown.test.js +58 -0
- package/dist/tui/__tests__/markdown.test.js.map +1 -0
- package/dist/tui/activity-state.d.ts +10 -0
- package/dist/tui/activity-state.d.ts.map +1 -0
- package/dist/tui/activity-state.js +27 -0
- package/dist/tui/activity-state.js.map +1 -0
- package/dist/tui/ansi.d.ts +40 -0
- package/dist/tui/ansi.d.ts.map +1 -0
- package/dist/tui/ansi.js +62 -0
- package/dist/tui/ansi.js.map +1 -0
- package/dist/tui/app.d.ts +103 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +151 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/chat-depth.d.ts +9 -0
- package/dist/tui/chat-depth.d.ts.map +1 -0
- package/dist/tui/chat-depth.js +14 -0
- package/dist/tui/chat-depth.js.map +1 -0
- package/dist/tui/chat-draft.d.ts +4 -0
- package/dist/tui/chat-draft.d.ts.map +1 -0
- package/dist/tui/chat-draft.js +28 -0
- package/dist/tui/chat-draft.js.map +1 -0
- package/dist/tui/composer-caret.d.ts +10 -0
- package/dist/tui/composer-caret.d.ts.map +1 -0
- package/dist/tui/composer-caret.js +13 -0
- package/dist/tui/composer-caret.js.map +1 -0
- package/dist/tui/composer-display.d.ts +7 -0
- package/dist/tui/composer-display.d.ts.map +1 -0
- package/dist/tui/composer-display.js +17 -0
- package/dist/tui/composer-display.js.map +1 -0
- package/dist/tui/dashboard-model.d.ts +46 -0
- package/dist/tui/dashboard-model.d.ts.map +1 -0
- package/dist/tui/dashboard-model.js +105 -0
- package/dist/tui/dashboard-model.js.map +1 -0
- package/dist/tui/dashboard.d.ts +39 -0
- package/dist/tui/dashboard.d.ts.map +1 -0
- package/dist/tui/dashboard.js +348 -0
- package/dist/tui/dashboard.js.map +1 -0
- package/dist/tui/effects.d.ts +61 -0
- package/dist/tui/effects.d.ts.map +1 -0
- package/dist/tui/effects.js +459 -0
- package/dist/tui/effects.js.map +1 -0
- package/dist/tui/i18n.d.ts +69 -0
- package/dist/tui/i18n.d.ts.map +1 -0
- package/dist/tui/i18n.js +239 -0
- package/dist/tui/i18n.js.map +1 -0
- package/dist/tui/input-history.d.ts +12 -0
- package/dist/tui/input-history.d.ts.map +1 -0
- package/dist/tui/input-history.js +47 -0
- package/dist/tui/input-history.js.map +1 -0
- package/dist/tui/local-commands.d.ts +5 -0
- package/dist/tui/local-commands.d.ts.map +1 -0
- package/dist/tui/local-commands.js +43 -0
- package/dist/tui/local-commands.js.map +1 -0
- package/dist/tui/markdown.d.ts +2 -0
- package/dist/tui/markdown.d.ts.map +1 -0
- package/dist/tui/markdown.js +60 -0
- package/dist/tui/markdown.js.map +1 -0
- package/dist/tui/output.d.ts +11 -0
- package/dist/tui/output.d.ts.map +1 -0
- package/dist/tui/output.js +24 -0
- package/dist/tui/output.js.map +1 -0
- package/dist/tui/session-store.d.ts +2 -0
- package/dist/tui/session-store.d.ts.map +1 -0
- package/dist/tui/session-store.js +2 -0
- package/dist/tui/session-store.js.map +1 -0
- package/dist/tui/setup.d.ts +49 -0
- package/dist/tui/setup.d.ts.map +1 -0
- package/dist/tui/setup.js +268 -0
- package/dist/tui/setup.js.map +1 -0
- package/dist/tui/slash-autocomplete.d.ts +6 -0
- package/dist/tui/slash-autocomplete.d.ts.map +1 -0
- package/dist/tui/slash-autocomplete.js +50 -0
- package/dist/tui/slash-autocomplete.js.map +1 -0
- package/dist/tui/theme.d.ts +13 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +15 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/tools.d.ts +15 -0
- package/dist/tui/tools.d.ts.map +1 -0
- package/dist/tui/tools.js +17 -0
- package/dist/tui/tools.js.map +1 -0
- package/dist/utils.d.ts +25 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +114 -0
- package/dist/utils.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { readFile, readdir, stat } from "node:fs/promises";
|
|
3
|
+
import { join, resolve, basename } from "node:path";
|
|
4
|
+
import { PipelineRunner } from "@actalk/inkos-core";
|
|
5
|
+
import { loadConfig, buildPipelineConfig, findProjectRoot, resolveBookId, log, logError } from "../utils.js";
|
|
6
|
+
export const fanficCommand = new Command("fanfic")
|
|
7
|
+
.description("Fan fiction writing tools (同人创作)");
|
|
8
|
+
fanficCommand
|
|
9
|
+
.command("init")
|
|
10
|
+
.description("Create a fanfic book from external source material")
|
|
11
|
+
.requiredOption("--title <title>", "Book title")
|
|
12
|
+
.requiredOption("--from <path>", "Source file or directory (novel text, wiki, character docs)")
|
|
13
|
+
.option("--mode <mode>", "Fanfic mode: canon|au|ooc|cp", "canon")
|
|
14
|
+
.option("--genre <genre>", "Genre", "other")
|
|
15
|
+
.option("--platform <platform>", "Target platform", "other")
|
|
16
|
+
.option("--target-chapters <n>", "Target chapter count", "100")
|
|
17
|
+
.option("--chapter-words <n>", "Words per chapter", "3000")
|
|
18
|
+
.option("--lang <language>", "Writing language: zh or en. Defaults from genre.")
|
|
19
|
+
.option("--json", "Output JSON")
|
|
20
|
+
.action(async (opts) => {
|
|
21
|
+
try {
|
|
22
|
+
const config = await loadConfig();
|
|
23
|
+
const root = findProjectRoot();
|
|
24
|
+
const mode = opts.mode;
|
|
25
|
+
if (!["canon", "au", "ooc", "cp"].includes(mode)) {
|
|
26
|
+
throw new Error(`无效的同人模式:"${mode}"。可选:canon, au, ooc, cp`);
|
|
27
|
+
}
|
|
28
|
+
// Read source material
|
|
29
|
+
const sourcePath = resolve(opts.from);
|
|
30
|
+
const sourceText = await readSourceMaterial(sourcePath);
|
|
31
|
+
const sourceName = basename(sourcePath);
|
|
32
|
+
if (!sourceText || sourceText.length < 100) {
|
|
33
|
+
throw new Error(`源素材文件内容过短(${sourceText.length} 字符)。请提供至少 100 字符的原作素材。`);
|
|
34
|
+
}
|
|
35
|
+
const bookId = opts.title
|
|
36
|
+
.toLowerCase()
|
|
37
|
+
.replace(/[^a-z0-9\u4e00-\u9fff]/g, "-")
|
|
38
|
+
.replace(/-+/g, "-")
|
|
39
|
+
.slice(0, 30);
|
|
40
|
+
const now = new Date().toISOString();
|
|
41
|
+
const book = {
|
|
42
|
+
id: bookId,
|
|
43
|
+
title: opts.title,
|
|
44
|
+
platform: opts.platform,
|
|
45
|
+
genre: opts.genre,
|
|
46
|
+
status: "outlining",
|
|
47
|
+
targetChapters: parseInt(opts.targetChapters, 10),
|
|
48
|
+
chapterWordCount: parseInt(opts.chapterWords, 10),
|
|
49
|
+
language: opts.lang ?? config.language,
|
|
50
|
+
createdAt: now,
|
|
51
|
+
updatedAt: now,
|
|
52
|
+
fanficMode: mode,
|
|
53
|
+
};
|
|
54
|
+
if (!opts.json)
|
|
55
|
+
log(`Creating fanfic "${book.title}" (${mode} mode, ${book.genre})...`);
|
|
56
|
+
if (!opts.json)
|
|
57
|
+
log(` Source: ${sourceName} (${sourceText.length} chars)`);
|
|
58
|
+
const pipeline = new PipelineRunner(buildPipelineConfig(config, root));
|
|
59
|
+
await pipeline.initFanficBook(book, sourceText, sourceName, mode);
|
|
60
|
+
if (opts.json) {
|
|
61
|
+
log(JSON.stringify({
|
|
62
|
+
bookId,
|
|
63
|
+
title: book.title,
|
|
64
|
+
genre: book.genre,
|
|
65
|
+
fanficMode: mode,
|
|
66
|
+
source: sourceName,
|
|
67
|
+
location: `books/${bookId}/`,
|
|
68
|
+
nextStep: `inkos write next ${bookId}`,
|
|
69
|
+
}, null, 2));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
log(`Fanfic created: ${bookId}`);
|
|
73
|
+
log(` Mode: ${mode}`);
|
|
74
|
+
log(` Location: books/${bookId}/`);
|
|
75
|
+
log(` fanfic_canon.md + foundation generated.`);
|
|
76
|
+
log("");
|
|
77
|
+
log(`Next: inkos write next ${bookId}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
if (opts.json) {
|
|
82
|
+
log(JSON.stringify({ error: String(e) }));
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
logError(`Failed to create fanfic: ${e}`);
|
|
86
|
+
}
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
fanficCommand
|
|
91
|
+
.command("show")
|
|
92
|
+
.description("Display parsed fanfic canon")
|
|
93
|
+
.argument("[book-id]", "Book ID (auto-detected if only one book)")
|
|
94
|
+
.option("--json", "Output JSON")
|
|
95
|
+
.action(async (bookIdArg, opts) => {
|
|
96
|
+
try {
|
|
97
|
+
await loadConfig();
|
|
98
|
+
const root = findProjectRoot();
|
|
99
|
+
const bookId = await resolveBookId(bookIdArg, root);
|
|
100
|
+
const { StateManager } = await import("@actalk/inkos-core");
|
|
101
|
+
const state = new StateManager(root);
|
|
102
|
+
const bookDir = state.bookDir(bookId);
|
|
103
|
+
let canon;
|
|
104
|
+
try {
|
|
105
|
+
canon = await readFile(join(bookDir, "story/fanfic_canon.md"), "utf-8");
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
throw new Error(`该书没有同人正典文件。用 inkos fanfic init 创建同人书。`);
|
|
109
|
+
}
|
|
110
|
+
if (opts.json) {
|
|
111
|
+
log(JSON.stringify({ bookId, fanficCanon: canon }, null, 2));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
log(`Fanfic Canon for "${bookId}":\n`);
|
|
115
|
+
log(canon);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
if (opts.json) {
|
|
120
|
+
log(JSON.stringify({ error: String(e) }));
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
logError(String(e));
|
|
124
|
+
}
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
fanficCommand
|
|
129
|
+
.command("refresh")
|
|
130
|
+
.description("Re-import source material and regenerate fanfic canon")
|
|
131
|
+
.argument("[book-id]", "Book ID (auto-detected if only one book)")
|
|
132
|
+
.requiredOption("--from <path>", "Source file or directory")
|
|
133
|
+
.option("--json", "Output JSON")
|
|
134
|
+
.action(async (bookIdArg, opts) => {
|
|
135
|
+
try {
|
|
136
|
+
const config = await loadConfig();
|
|
137
|
+
const root = findProjectRoot();
|
|
138
|
+
const bookId = await resolveBookId(bookIdArg, root);
|
|
139
|
+
const { StateManager } = await import("@actalk/inkos-core");
|
|
140
|
+
const state = new StateManager(root);
|
|
141
|
+
const book = await state.loadBookConfig(bookId);
|
|
142
|
+
const mode = (book.fanficMode ?? "canon");
|
|
143
|
+
const sourcePath = resolve(opts.from);
|
|
144
|
+
const sourceText = await readSourceMaterial(sourcePath);
|
|
145
|
+
const sourceName = basename(sourcePath);
|
|
146
|
+
if (!opts.json)
|
|
147
|
+
log(`Refreshing fanfic canon for "${bookId}" from ${sourceName}...`);
|
|
148
|
+
const pipeline = new PipelineRunner(buildPipelineConfig(config, root));
|
|
149
|
+
await pipeline.importFanficCanon(bookId, sourceText, sourceName, mode);
|
|
150
|
+
if (opts.json) {
|
|
151
|
+
log(JSON.stringify({ bookId, source: sourceName, refreshedAt: new Date().toISOString() }));
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
log(`Canon refreshed from "${sourceName}".`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
if (opts.json) {
|
|
159
|
+
log(JSON.stringify({ error: String(e) }));
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
logError(`Failed to refresh canon: ${e}`);
|
|
163
|
+
}
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
async function readSourceMaterial(sourcePath) {
|
|
168
|
+
const s = await stat(sourcePath);
|
|
169
|
+
if (s.isDirectory()) {
|
|
170
|
+
const files = await readdir(sourcePath);
|
|
171
|
+
const textFiles = files.filter((f) => f.endsWith(".txt") || f.endsWith(".md"));
|
|
172
|
+
if (textFiles.length === 0) {
|
|
173
|
+
throw new Error(`目录 ${sourcePath} 中没有 .txt 或 .md 文件。`);
|
|
174
|
+
}
|
|
175
|
+
const contents = await Promise.all(textFiles.sort().map((f) => readFile(join(sourcePath, f), "utf-8")));
|
|
176
|
+
return contents.join("\n\n---\n\n");
|
|
177
|
+
}
|
|
178
|
+
return readFile(sourcePath, "utf-8");
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=fanfic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fanfic.js","sourceRoot":"","sources":["../../src/commands/fanfic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genre.d.ts","sourceRoot":"","sources":["../../src/commands/genre.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,YAAY,SACc,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { writeFile, mkdir, readFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { listAvailableGenres, readGenreProfile, getBuiltinGenresDir } from "@actalk/inkos-core";
|
|
5
|
+
import { findProjectRoot, log, logError } from "../utils.js";
|
|
6
|
+
export const genreCommand = new Command("genre")
|
|
7
|
+
.description("Manage genre profiles");
|
|
8
|
+
genreCommand
|
|
9
|
+
.command("list")
|
|
10
|
+
.description("List all available genre profiles (built-in + project)")
|
|
11
|
+
.action(async () => {
|
|
12
|
+
try {
|
|
13
|
+
const root = findProjectRoot();
|
|
14
|
+
const genres = await listAvailableGenres(root);
|
|
15
|
+
if (genres.length === 0) {
|
|
16
|
+
log("No genre profiles found.");
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
log("Available genres:\n");
|
|
20
|
+
for (const g of genres) {
|
|
21
|
+
const tag = g.source === "project" ? "[project]" : "[builtin]";
|
|
22
|
+
log(` ${g.id.padEnd(12)} ${g.name.padEnd(8)} ${tag}`);
|
|
23
|
+
}
|
|
24
|
+
log(`\nTotal: ${genres.length} genre(s)`);
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
logError(`Failed to list genres: ${e}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
genreCommand
|
|
32
|
+
.command("show")
|
|
33
|
+
.description("Display a genre profile")
|
|
34
|
+
.argument("<id>", "Genre ID (e.g. xuanhuan, urban, horror)")
|
|
35
|
+
.action(async (id) => {
|
|
36
|
+
try {
|
|
37
|
+
const root = findProjectRoot();
|
|
38
|
+
const genres = await listAvailableGenres(root);
|
|
39
|
+
const exactMatch = genres.some(g => g.id === id);
|
|
40
|
+
if (!exactMatch) {
|
|
41
|
+
logError(`Genre "${id}" not found. Available: ${genres.map(g => g.id).join(", ")}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const { profile, body } = await readGenreProfile(root, id);
|
|
45
|
+
log(`Genre: ${profile.name} (${profile.id})\n`);
|
|
46
|
+
log(` Chapter types: ${profile.chapterTypes.join(", ")}`);
|
|
47
|
+
log(` Fatigue words: ${profile.fatigueWords.join(", ")}`);
|
|
48
|
+
log(` Numerical system: ${profile.numericalSystem}`);
|
|
49
|
+
log(` Power scaling: ${profile.powerScaling}`);
|
|
50
|
+
log(` Era research: ${profile.eraResearch}`);
|
|
51
|
+
log(` Pacing rule: ${profile.pacingRule}`);
|
|
52
|
+
log(` Satisfaction types: ${profile.satisfactionTypes.join(", ")}`);
|
|
53
|
+
log(` Audit dimensions: ${profile.auditDimensions.join(", ")}`);
|
|
54
|
+
if (body) {
|
|
55
|
+
log(`\n--- Body ---\n${body}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
logError(`Failed to show genre: ${e}`);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
genreCommand
|
|
64
|
+
.command("create")
|
|
65
|
+
.description("Scaffold a new genre profile in the project genres/ directory")
|
|
66
|
+
.argument("<id>", "Genre ID (e.g. scifi, wuxia, romance)")
|
|
67
|
+
.option("--name <name>", "Genre display name", "")
|
|
68
|
+
.option("--numerical", "Enable numerical system", false)
|
|
69
|
+
.option("--power", "Enable power scaling", false)
|
|
70
|
+
.option("--era", "Enable era research", false)
|
|
71
|
+
.action(async (id, opts) => {
|
|
72
|
+
try {
|
|
73
|
+
const root = findProjectRoot();
|
|
74
|
+
const genresDir = join(root, "genres");
|
|
75
|
+
const filePath = join(genresDir, `${id}.md`);
|
|
76
|
+
// Check if already exists
|
|
77
|
+
try {
|
|
78
|
+
await readFile(filePath, "utf-8");
|
|
79
|
+
logError(`Genre profile already exists: ${filePath}`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
catch { /* file doesn't exist, good */ }
|
|
83
|
+
await mkdir(genresDir, { recursive: true });
|
|
84
|
+
const name = opts.name || id;
|
|
85
|
+
const template = `---
|
|
86
|
+
name: ${name}
|
|
87
|
+
id: ${id}
|
|
88
|
+
chapterTypes: ["推进章", "布局章", "过渡章", "回收章"]
|
|
89
|
+
fatigueWords: ["震惊", "不可思议", "难以置信"]
|
|
90
|
+
numericalSystem: ${opts.numerical}
|
|
91
|
+
powerScaling: ${opts.power}
|
|
92
|
+
eraResearch: ${opts.era}
|
|
93
|
+
pacingRule: "每2-3章有一个明确的进展或反馈"
|
|
94
|
+
satisfactionTypes: ["目标达成", "困难克服", "真相揭示"]
|
|
95
|
+
auditDimensions: [1,2,3,6,7,8,9,10,13,14,15,16,17,18,19]
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 题材禁忌
|
|
99
|
+
|
|
100
|
+
- (根据题材添加禁忌)
|
|
101
|
+
|
|
102
|
+
## 叙事指导
|
|
103
|
+
|
|
104
|
+
(根据题材描述叙事重心和风格要求)
|
|
105
|
+
`;
|
|
106
|
+
await writeFile(filePath, template, "utf-8");
|
|
107
|
+
log(`Created genre profile: ${filePath}`);
|
|
108
|
+
log(`Edit the file to customize chapter types, fatigue words, rules, etc.`);
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
logError(`Failed to create genre: ${e}`);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
genreCommand
|
|
116
|
+
.command("copy")
|
|
117
|
+
.description("Copy a built-in genre profile to project for customization")
|
|
118
|
+
.argument("<id>", "Genre ID to copy (e.g. xuanhuan)")
|
|
119
|
+
.action(async (id) => {
|
|
120
|
+
try {
|
|
121
|
+
const root = findProjectRoot();
|
|
122
|
+
const builtinDir = getBuiltinGenresDir();
|
|
123
|
+
const srcPath = join(builtinDir, `${id}.md`);
|
|
124
|
+
const genresDir = join(root, "genres");
|
|
125
|
+
const destPath = join(genresDir, `${id}.md`);
|
|
126
|
+
// Check if project override already exists
|
|
127
|
+
try {
|
|
128
|
+
await readFile(destPath, "utf-8");
|
|
129
|
+
logError(`Project genre profile already exists: ${destPath}`);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
catch { /* doesn't exist, good */ }
|
|
133
|
+
let content;
|
|
134
|
+
try {
|
|
135
|
+
content = await readFile(srcPath, "utf-8");
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
logError(`Built-in genre "${id}" not found. Use 'inkos genre list' to see available genres.`);
|
|
139
|
+
process.exit(1);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
await mkdir(genresDir, { recursive: true });
|
|
143
|
+
await writeFile(destPath, content, "utf-8");
|
|
144
|
+
log(`Copied to: ${destPath}`);
|
|
145
|
+
log(`This project-level copy will override the built-in profile.`);
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
logError(`Failed to copy genre: ${e}`);
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=genre.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genre.js","sourceRoot":"","sources":["../../src/commands/genre.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,aAAa,SACwB,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { PipelineRunner, StateManager, splitChapters } from "@actalk/inkos-core";
|
|
3
|
+
import { readFile, readdir, stat } from "node:fs/promises";
|
|
4
|
+
import { join, resolve } from "node:path";
|
|
5
|
+
import { loadConfig, buildPipelineConfig, findProjectRoot, resolveBookId, log, logError } from "../utils.js";
|
|
6
|
+
import { formatImportCanonComplete, formatImportCanonStart, formatImportChaptersComplete, formatImportChaptersDiscovery, formatImportChaptersResume, resolveCliLanguage, } from "../localization.js";
|
|
7
|
+
export const importCommand = new Command("import")
|
|
8
|
+
.description("Import external data into a book");
|
|
9
|
+
importCommand
|
|
10
|
+
.command("canon")
|
|
11
|
+
.description("Import parent book's canon for spinoff writing")
|
|
12
|
+
.argument("[target-book-id]", "Target book ID (auto-detected if only one book)")
|
|
13
|
+
.requiredOption("--from <parent-book-id>", "Parent book ID to import canon from")
|
|
14
|
+
.option("--json", "Output JSON")
|
|
15
|
+
.action(async (targetBookIdArg, opts) => {
|
|
16
|
+
try {
|
|
17
|
+
const root = findProjectRoot();
|
|
18
|
+
const targetBookId = await resolveBookId(targetBookIdArg, root);
|
|
19
|
+
const config = await loadConfig();
|
|
20
|
+
const state = new StateManager(root);
|
|
21
|
+
const targetBook = await state.loadBookConfig(targetBookId);
|
|
22
|
+
const language = resolveCliLanguage(targetBook.language);
|
|
23
|
+
const pipeline = new PipelineRunner(buildPipelineConfig(config, root));
|
|
24
|
+
if (!opts.json)
|
|
25
|
+
log(formatImportCanonStart(language, opts.from, targetBookId));
|
|
26
|
+
await pipeline.importCanon(targetBookId, opts.from);
|
|
27
|
+
if (opts.json) {
|
|
28
|
+
log(JSON.stringify({
|
|
29
|
+
targetBookId,
|
|
30
|
+
parentBookId: opts.from,
|
|
31
|
+
output: "story/parent_canon.md",
|
|
32
|
+
}, null, 2));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
for (const line of formatImportCanonComplete(language)) {
|
|
36
|
+
log(line);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
if (opts.json) {
|
|
42
|
+
log(JSON.stringify({ error: String(e) }));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
logError(`Canon import failed: ${e}`);
|
|
46
|
+
}
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
importCommand
|
|
51
|
+
.command("chapters")
|
|
52
|
+
.description("Import existing chapters for continuation writing. Reverse-engineers all truth files.")
|
|
53
|
+
.argument("[book-id]", "Target book ID (auto-detected if only one book)")
|
|
54
|
+
.requiredOption("--from <path>", "Path to a text file (auto-split) or directory of .md/.txt files")
|
|
55
|
+
.option("--split <regex>", "Custom regex for chapter splitting (single-file mode)")
|
|
56
|
+
.option("--resume-from <n>", "Resume from chapter N (for interrupted imports)", parseInt)
|
|
57
|
+
.option("--series", "Treat as a new series (shared universe, independent story) instead of direct continuation")
|
|
58
|
+
.option("--json", "Output JSON")
|
|
59
|
+
.action(async (bookIdArg, opts) => {
|
|
60
|
+
try {
|
|
61
|
+
const root = findProjectRoot();
|
|
62
|
+
const bookId = await resolveBookId(bookIdArg, root);
|
|
63
|
+
const config = await loadConfig();
|
|
64
|
+
const state = new StateManager(root);
|
|
65
|
+
const book = await state.loadBookConfig(bookId);
|
|
66
|
+
const language = resolveCliLanguage(book.language);
|
|
67
|
+
const existingChapterCount = (await state.getNextChapterNumber(bookId)) - 1;
|
|
68
|
+
if (existingChapterCount > 0 && !opts.resumeFrom) {
|
|
69
|
+
throw new Error(`Book "${bookId}" already has ${existingChapterCount} chapter(s). ` +
|
|
70
|
+
`Use --resume-from <n> to append, or delete existing chapters first.`);
|
|
71
|
+
}
|
|
72
|
+
const fromPath = resolve(opts.from);
|
|
73
|
+
const fromStat = await stat(fromPath);
|
|
74
|
+
let chapters;
|
|
75
|
+
if (fromStat.isDirectory()) {
|
|
76
|
+
// Directory mode: read each .md/.txt file in sorted order
|
|
77
|
+
const entries = await readdir(fromPath);
|
|
78
|
+
const textFiles = entries
|
|
79
|
+
.filter((f) => f.endsWith(".md") || f.endsWith(".txt"))
|
|
80
|
+
.sort();
|
|
81
|
+
if (textFiles.length === 0) {
|
|
82
|
+
throw new Error(`No .md or .txt files found in ${fromPath}`);
|
|
83
|
+
}
|
|
84
|
+
chapters = await Promise.all(textFiles.map(async (f) => {
|
|
85
|
+
const content = await readFile(join(fromPath, f), "utf-8");
|
|
86
|
+
const title = f.replace(/\.(md|txt)$/, "").replace(/^\d+[_\-\s]*/, "");
|
|
87
|
+
return { title, content };
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Single file mode: split by chapter pattern
|
|
92
|
+
const text = await readFile(fromPath, "utf-8");
|
|
93
|
+
chapters = [...splitChapters(text, opts.split)];
|
|
94
|
+
if (chapters.length === 0) {
|
|
95
|
+
throw new Error(`No chapters found in ${fromPath}. ` +
|
|
96
|
+
`Default pattern matches "第X章" and "Chapter X". Use --split to provide a custom regex.`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (!opts.json) {
|
|
100
|
+
log(formatImportChaptersDiscovery(language, chapters.length, bookId));
|
|
101
|
+
if (opts.resumeFrom) {
|
|
102
|
+
log(formatImportChaptersResume(language, opts.resumeFrom));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const pipeline = new PipelineRunner(buildPipelineConfig(config, root));
|
|
106
|
+
const result = await pipeline.importChapters({
|
|
107
|
+
bookId,
|
|
108
|
+
chapters,
|
|
109
|
+
resumeFrom: opts.resumeFrom,
|
|
110
|
+
importMode: opts.series ? "series" : "continuation",
|
|
111
|
+
});
|
|
112
|
+
if (opts.json) {
|
|
113
|
+
log(JSON.stringify(result, null, 2));
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
for (const line of formatImportChaptersComplete(language, {
|
|
117
|
+
importedCount: result.importedCount,
|
|
118
|
+
totalWords: result.totalWords,
|
|
119
|
+
nextChapter: result.nextChapter,
|
|
120
|
+
continueBookId: bookId,
|
|
121
|
+
})) {
|
|
122
|
+
log(line);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
if (opts.json) {
|
|
128
|
+
log(JSON.stringify({ error: String(e) }));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
logError(`Chapter import failed: ${e}`);
|
|
132
|
+
}
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAcpC,eAAO,MAAM,WAAW,SAuIpB,CAAC"}
|