@actalk/inkos 1.6.3 → 1.7.0-canary.53.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/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +30 -1
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/auto.d.ts +3 -0
- package/dist/commands/auto.d.ts.map +1 -0
- package/dist/commands/auto.js +136 -0
- package/dist/commands/auto.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +5 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +11 -7
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/fanfic.d.ts.map +1 -1
- package/dist/commands/fanfic.js +6 -5
- package/dist/commands/fanfic.js.map +1 -1
- package/dist/commands/genre.d.ts +8 -0
- package/dist/commands/genre.d.ts.map +1 -1
- package/dist/commands/genre.js +55 -21
- package/dist/commands/genre.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +10 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/revise.d.ts.map +1 -1
- package/dist/commands/revise.js +32 -1
- package/dist/commands/revise.js.map +1 -1
- package/dist/commands/short-fiction.js +1 -1
- package/dist/commands/short-fiction.js.map +1 -1
- package/dist/commands/translate.d.ts +3 -0
- package/dist/commands/translate.d.ts.map +1 -0
- package/dist/commands/translate.js +107 -0
- package/dist/commands/translate.js.map +1 -0
- package/dist/commands/write.d.ts.map +1 -1
- package/dist/commands/write.js +52 -4
- package/dist/commands/write.js.map +1 -1
- package/dist/localization.d.ts +37 -1
- package/dist/localization.d.ts.map +1 -1
- package/dist/localization.js +159 -2
- package/dist/localization.js.map +1 -1
- package/dist/notify-helper.d.ts +17 -0
- package/dist/notify-helper.d.ts.map +1 -0
- package/dist/notify-helper.js +27 -0
- package/dist/notify-helper.js.map +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +4 -0
- package/dist/program.js.map +1 -1
- package/dist/project-bootstrap.js +1 -1
- package/dist/project-bootstrap.js.map +1 -1
- package/dist/tui/slash-autocomplete.d.ts +3 -1
- package/dist/tui/slash-autocomplete.d.ts.map +1 -1
- package/dist/tui/slash-autocomplete.js +20 -16
- package/dist/tui/slash-autocomplete.js.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +2 -0
- package/dist/utils.js.map +1 -1
- package/package.json +4 -4
package/dist/commands/genre.js
CHANGED
|
@@ -3,6 +3,53 @@ import { writeFile, mkdir, readFile } from "node:fs/promises";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { listAvailableGenres, readGenreProfile, getBuiltinGenresDir } from "@actalk/inkos-core";
|
|
5
5
|
import { findProjectRoot, log, logError } from "../utils.js";
|
|
6
|
+
import { resolveCliLanguage } from "../localization.js";
|
|
7
|
+
export function buildGenreTemplate(params, language = "zh") {
|
|
8
|
+
if (language === "en") {
|
|
9
|
+
return `---
|
|
10
|
+
name: ${params.name}
|
|
11
|
+
id: ${params.id}
|
|
12
|
+
chapterTypes: ["progression", "setup", "transition", "payoff"]
|
|
13
|
+
fatigueWords: ["shocked", "unbelievable", "incredible"]
|
|
14
|
+
numericalSystem: ${params.numerical}
|
|
15
|
+
powerScaling: ${params.power}
|
|
16
|
+
eraResearch: ${params.era}
|
|
17
|
+
pacingRule: "A clear advance or payoff every 2-3 chapters"
|
|
18
|
+
satisfactionTypes: ["goal achieved", "obstacle overcome", "truth revealed"]
|
|
19
|
+
auditDimensions: [1,2,3,6,7,8,9,10,13,14,15,16,17,18,19]
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Genre Taboos
|
|
23
|
+
|
|
24
|
+
- (add taboos for this genre)
|
|
25
|
+
|
|
26
|
+
## Narrative Guidance
|
|
27
|
+
|
|
28
|
+
(describe the narrative focus and style requirements for this genre)
|
|
29
|
+
`;
|
|
30
|
+
}
|
|
31
|
+
return `---
|
|
32
|
+
name: ${params.name}
|
|
33
|
+
id: ${params.id}
|
|
34
|
+
chapterTypes: ["推进章", "布局章", "过渡章", "回收章"]
|
|
35
|
+
fatigueWords: ["震惊", "不可思议", "难以置信"]
|
|
36
|
+
numericalSystem: ${params.numerical}
|
|
37
|
+
powerScaling: ${params.power}
|
|
38
|
+
eraResearch: ${params.era}
|
|
39
|
+
pacingRule: "每2-3章有一个明确的进展或反馈"
|
|
40
|
+
satisfactionTypes: ["目标达成", "困难克服", "真相揭示"]
|
|
41
|
+
auditDimensions: [1,2,3,6,7,8,9,10,13,14,15,16,17,18,19]
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 题材禁忌
|
|
45
|
+
|
|
46
|
+
- (根据题材添加禁忌)
|
|
47
|
+
|
|
48
|
+
## 叙事指导
|
|
49
|
+
|
|
50
|
+
(根据题材描述叙事重心和风格要求)
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
6
53
|
export const genreCommand = new Command("genre")
|
|
7
54
|
.description("Manage genre profiles");
|
|
8
55
|
genreCommand
|
|
@@ -68,6 +115,7 @@ genreCommand
|
|
|
68
115
|
.option("--numerical", "Enable numerical system", false)
|
|
69
116
|
.option("--power", "Enable power scaling", false)
|
|
70
117
|
.option("--era", "Enable era research", false)
|
|
118
|
+
.option("--lang <language>", "Template language: zh or en (defaults to INKOS_LOCALE/LANG, then zh)")
|
|
71
119
|
.action(async (id, opts) => {
|
|
72
120
|
try {
|
|
73
121
|
const root = findProjectRoot();
|
|
@@ -82,27 +130,13 @@ genreCommand
|
|
|
82
130
|
catch { /* file doesn't exist, good */ }
|
|
83
131
|
await mkdir(genresDir, { recursive: true });
|
|
84
132
|
const name = opts.name || id;
|
|
85
|
-
const template =
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
`;
|
|
133
|
+
const template = buildGenreTemplate({
|
|
134
|
+
id,
|
|
135
|
+
name,
|
|
136
|
+
numerical: opts.numerical,
|
|
137
|
+
power: opts.power,
|
|
138
|
+
era: opts.era,
|
|
139
|
+
}, resolveCliLanguage(opts.lang));
|
|
106
140
|
await writeFile(filePath, template, "utf-8");
|
|
107
141
|
log(`Created genre profile: ${filePath}`);
|
|
108
142
|
log(`Edit the file to customize chapter types, fatigue words, rules, etc.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"genre.js","sourceRoot":"","sources":["../../src/commands/genre.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"genre.js","sourceRoot":"","sources":["../../src/commands/genre.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,WAAW,SA2CpB,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -18,16 +18,20 @@ export const initCommand = new Command("init")
|
|
|
18
18
|
log(`Project initialized at ${projectDir}`);
|
|
19
19
|
log("");
|
|
20
20
|
const isEnglish = (opts.lang ?? "zh") === "en";
|
|
21
|
-
const
|
|
22
|
-
? " inkos book create --title 'My Novel' --genre progression --platform royalroad --lang en"
|
|
23
|
-
:
|
|
21
|
+
const exampleCreateLines = isEnglish
|
|
22
|
+
? [" inkos book create --title 'My Novel' --genre progression --platform royalroad --lang en"]
|
|
23
|
+
: [
|
|
24
|
+
" inkos book create --title '我的小说' --genre xuanhuan --platform tomato",
|
|
25
|
+
" # English project? Re-run with: inkos init --lang en",
|
|
26
|
+
];
|
|
24
27
|
if (global) {
|
|
25
28
|
log("Global LLM config detected. Ready to go!");
|
|
26
29
|
log("");
|
|
27
30
|
log("Next steps:");
|
|
28
31
|
if (name)
|
|
29
32
|
log(` cd ${name}`);
|
|
30
|
-
|
|
33
|
+
for (const line of exampleCreateLines)
|
|
34
|
+
log(line);
|
|
31
35
|
}
|
|
32
36
|
else {
|
|
33
37
|
log("Next steps:");
|
|
@@ -37,7 +41,8 @@ export const initCommand = new Command("init")
|
|
|
37
41
|
log(" inkos config set-global --provider openai --base-url <your-api-url> --api-key <your-key> --model <your-model>");
|
|
38
42
|
log(" # Option 2: Edit .env for this project only");
|
|
39
43
|
log("");
|
|
40
|
-
|
|
44
|
+
for (const line of exampleCreateLines)
|
|
45
|
+
log(line);
|
|
41
46
|
}
|
|
42
47
|
log(" inkos write next <book-id>");
|
|
43
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,4DAA4D,CAAC;KACzE,QAAQ,CAAC,QAAQ,EAAE,sEAAsE,CAAC;KAC1F,MAAM,CAAC,mBAAmB,EAAE,wDAAwD,EAAE,IAAI,CAAC;KAC3F,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,IAAuB,EAAE,EAAE;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEvE,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,0BAA0B,CAAC,UAAU,EAAE;YAC3C,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5C,qBAAqB,EAAE,IAAI;SAC5B,CAAC,CAAC;QAEH,GAAG,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;QAC5C,GAAG,CAAC,EAAE,CAAC,CAAC;QACR,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;QAC/C,MAAM,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,4DAA4D,CAAC;KACzE,QAAQ,CAAC,QAAQ,EAAE,sEAAsE,CAAC;KAC1F,MAAM,CAAC,mBAAmB,EAAE,wDAAwD,EAAE,IAAI,CAAC;KAC3F,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,IAAuB,EAAE,EAAE;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEvE,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,0BAA0B,CAAC,UAAU,EAAE;YAC3C,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5C,qBAAqB,EAAE,IAAI;SAC5B,CAAC,CAAC;QAEH,GAAG,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;QAC5C,GAAG,CAAC,EAAE,CAAC,CAAC;QACR,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;QAC/C,MAAM,kBAAkB,GAAG,SAAS;YAClC,CAAC,CAAC,CAAC,2FAA2F,CAAC;YAC/F,CAAC,CAAC;gBACA,uEAAuE;gBACvE,wDAAwD;aACzD,CAAC;QACJ,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,0CAA0C,CAAC,CAAC;YAChD,GAAG,CAAC,EAAE,CAAC,CAAC;YACR,GAAG,CAAC,aAAa,CAAC,CAAC;YACnB,IAAI,IAAI;gBAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,kBAAkB;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,aAAa,CAAC,CAAC;YACnB,IAAI,IAAI;gBAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YAC9B,GAAG,CAAC,0DAA0D,CAAC,CAAC;YAChE,GAAG,CAAC,iHAAiH,CAAC,CAAC;YACvH,GAAG,CAAC,+CAA+C,CAAC,CAAC;YACrD,GAAG,CAAC,EAAE,CAAC,CAAC;YACR,KAAK,MAAM,IAAI,IAAI,kBAAkB;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,GAAG,CAAC,8BAA8B,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,QAAQ,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revise.d.ts","sourceRoot":"","sources":["../../src/commands/revise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"revise.d.ts","sourceRoot":"","sources":["../../src/commands/revise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,aAAa,SAmFtB,CAAC"}
|
package/dist/commands/revise.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import { DEFAULT_REVISE_MODE, PipelineRunner } from "@actalk/inkos-core";
|
|
2
|
+
import { DEFAULT_REVISE_MODE, PipelineRunner, StateManager, resolveRevisionGate } from "@actalk/inkos-core";
|
|
3
3
|
import { loadConfig, buildPipelineConfig, findProjectRoot, resolveBookId, log, logError } from "../utils.js";
|
|
4
|
+
import { formatNotifyCommandTitle, formatNotifyFailureBody, formatNotifyReviseBody, resolveCliLanguage, } from "../localization.js";
|
|
5
|
+
import { sendCommandNotification } from "../notify-helper.js";
|
|
4
6
|
export const reviseCommand = new Command("revise")
|
|
5
7
|
.description("Revise a chapter based on audit issues")
|
|
6
8
|
.argument("[book-id]", "Book ID (auto-detected if only one book)")
|
|
@@ -8,7 +10,10 @@ export const reviseCommand = new Command("revise")
|
|
|
8
10
|
.option("--mode <mode>", "Revise mode: spot-fix, polish, rewrite, rework, anti-detect", DEFAULT_REVISE_MODE)
|
|
9
11
|
.option("--brief <text>", "One-off creative guidance for this revise/rewrite only")
|
|
10
12
|
.option("--json", "Output JSON")
|
|
13
|
+
.option("--notify", "Send a notification to configured notify channels when the command finishes")
|
|
11
14
|
.action(async (bookIdArg, chapterStr, opts) => {
|
|
15
|
+
let notifyLanguage = "zh";
|
|
16
|
+
let notifyBookName;
|
|
12
17
|
try {
|
|
13
18
|
const config = await loadConfig();
|
|
14
19
|
const root = findProjectRoot();
|
|
@@ -22,8 +27,14 @@ export const reviseCommand = new Command("revise")
|
|
|
22
27
|
bookId = await resolveBookId(bookIdArg, root);
|
|
23
28
|
chapterNumber = chapterStr ? parseInt(chapterStr, 10) : undefined;
|
|
24
29
|
}
|
|
30
|
+
const state = new StateManager(root);
|
|
31
|
+
const book = await state.loadBookConfig(bookId);
|
|
32
|
+
const language = resolveCliLanguage(book.language);
|
|
33
|
+
notifyLanguage = language;
|
|
34
|
+
notifyBookName = book.title ?? bookId;
|
|
25
35
|
const pipeline = new PipelineRunner(buildPipelineConfig(config, root, {
|
|
26
36
|
externalContext: opts.brief,
|
|
37
|
+
revisionGate: resolveRevisionGate(book, config.writing),
|
|
27
38
|
}));
|
|
28
39
|
const mode = opts.mode;
|
|
29
40
|
if (!opts.json)
|
|
@@ -46,8 +57,28 @@ export const reviseCommand = new Command("revise")
|
|
|
46
57
|
log(` - ${fix}`);
|
|
47
58
|
}
|
|
48
59
|
}
|
|
60
|
+
// Unlike write commands, the pipeline sends no notification for
|
|
61
|
+
// reviseDraft, so --notify always sends the completion notification here.
|
|
62
|
+
if (opts.notify) {
|
|
63
|
+
await sendCommandNotification({
|
|
64
|
+
title: formatNotifyCommandTitle(language, "revise", notifyBookName, true),
|
|
65
|
+
body: formatNotifyReviseBody(language, {
|
|
66
|
+
chapterNumber: result.chapterNumber,
|
|
67
|
+
applied: result.applied,
|
|
68
|
+
wordCount: result.wordCount,
|
|
69
|
+
fixedCount: result.fixedIssues.length,
|
|
70
|
+
skippedReason: result.skippedReason,
|
|
71
|
+
}),
|
|
72
|
+
}, config);
|
|
73
|
+
}
|
|
49
74
|
}
|
|
50
75
|
catch (e) {
|
|
76
|
+
if (opts.notify) {
|
|
77
|
+
await sendCommandNotification({
|
|
78
|
+
title: formatNotifyCommandTitle(notifyLanguage, "revise", notifyBookName, false),
|
|
79
|
+
body: formatNotifyFailureBody(notifyLanguage, e),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
51
82
|
if (opts.json) {
|
|
52
83
|
log(JSON.stringify({ error: String(e) }));
|
|
53
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revise.js","sourceRoot":"","sources":["../../src/commands/revise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAmB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"revise.js","sourceRoot":"","sources":["../../src/commands/revise.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ export const shortCommand = new Command("short")
|
|
|
9
9
|
shortCommand
|
|
10
10
|
.command("run")
|
|
11
11
|
.description("Run a short fiction chain from a direction")
|
|
12
|
-
.requiredOption("--direction <text>", "Story direction, e.g. 女频短篇 婚姻背叛
|
|
12
|
+
.requiredOption("--direction <text>", "Story direction, e.g. \"女频短篇 婚姻背叛 证据反杀\" or \"female-lead short: marriage betrayal, evidence payback\"")
|
|
13
13
|
.option("--reference <path>", "Optional reference notes/text")
|
|
14
14
|
.option("--story-id <id>", "Output story id under shorts/")
|
|
15
15
|
.option("--out-dir <path>", "Output directory", "shorts")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"short-fiction.js","sourceRoot":"","sources":["../../src/commands/short-fiction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,uCAAuC,EACvC,0BAA0B,EAC1B,mCAAmC,EACnC,0BAA0B,EAC1B,mCAAmC,EACnC,eAAe,EACf,yBAAyB,GAK1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE9F,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAErF,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,mCAAmC,CAAC,CAAC;AAEpD,YAAY;KACT,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,4CAA4C,CAAC;KACzD,cAAc,CAAC,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"short-fiction.js","sourceRoot":"","sources":["../../src/commands/short-fiction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../../src/commands/translate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,gBAAgB,SAC2C,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { createLLMTranslationModel, createTranslationProjectFromFile, runTranslationProject, writeTranslationExport, } from "@actalk/inkos-core";
|
|
3
|
+
import { createClient, findProjectRoot, loadConfig, log, logError } from "../utils.js";
|
|
4
|
+
export const translateCommand = new Command("translate")
|
|
5
|
+
.description("Translate and localize novels/scripts across languages");
|
|
6
|
+
translateCommand
|
|
7
|
+
.command("init")
|
|
8
|
+
.description("Create a translation project from EPUB/PDF/TXT/Markdown")
|
|
9
|
+
.requiredOption("--from <path>", "Source file path")
|
|
10
|
+
.requiredOption("--source <language>", "Source language, e.g. ja, en, zh, ko, auto")
|
|
11
|
+
.requiredOption("--target <language>", "Target language, e.g. zh, en, ja")
|
|
12
|
+
.option("--title <title>", "Override translation title")
|
|
13
|
+
.option("--segment-max-chars <n>", "Max chars per segment before splitting long paragraphs", parseInt)
|
|
14
|
+
.option("--json", "Output JSON")
|
|
15
|
+
.action(async (opts) => {
|
|
16
|
+
try {
|
|
17
|
+
const root = findProjectRoot();
|
|
18
|
+
const result = await createTranslationProjectFromFile(root, {
|
|
19
|
+
filePath: opts.from,
|
|
20
|
+
sourceLanguage: opts.source,
|
|
21
|
+
targetLanguage: opts.target,
|
|
22
|
+
title: opts.title,
|
|
23
|
+
segmentMaxChars: opts.segmentMaxChars,
|
|
24
|
+
});
|
|
25
|
+
if (opts.json) {
|
|
26
|
+
log(JSON.stringify(result, null, 2));
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
log(`Translation project created: ${result.manifest.id}`);
|
|
30
|
+
log(`Title: ${result.manifest.title}`);
|
|
31
|
+
log(`Chapters: ${result.manifest.chapters.length}`);
|
|
32
|
+
log(`Manifest: ${result.manifestPath}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
fail("Failed to create translation project", error, opts.json);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
translateCommand
|
|
40
|
+
.command("run")
|
|
41
|
+
.description("Translate pending segments and write a review report")
|
|
42
|
+
.argument("<project-id>", "Translation project ID under translations/")
|
|
43
|
+
.option("--batch-size <n>", "Segments per model call", parseInt)
|
|
44
|
+
.option("--max-tokens <n>", "Max output tokens per translation batch", parseInt)
|
|
45
|
+
.option("--json", "Output JSON")
|
|
46
|
+
.action(async (projectId, opts) => {
|
|
47
|
+
try {
|
|
48
|
+
const root = findProjectRoot();
|
|
49
|
+
const config = await loadConfig({ requireApiKey: true, projectRoot: root });
|
|
50
|
+
const model = createLLMTranslationModel({
|
|
51
|
+
client: createClient(config),
|
|
52
|
+
model: config.llm.model,
|
|
53
|
+
maxTokens: opts.maxTokens,
|
|
54
|
+
});
|
|
55
|
+
const result = await runTranslationProject(root, projectId, {
|
|
56
|
+
model,
|
|
57
|
+
batchSize: opts.batchSize,
|
|
58
|
+
});
|
|
59
|
+
if (opts.json) {
|
|
60
|
+
log(JSON.stringify(result, null, 2));
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
log(`Translated segments: ${result.translatedSegments}`);
|
|
64
|
+
log(`Reviewed chapters: ${result.reviewedChapters}`);
|
|
65
|
+
log(`Report: ${result.reportPath}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
fail("Translation run failed", error, opts.json);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
translateCommand
|
|
73
|
+
.command("export")
|
|
74
|
+
.description("Export translated text to Markdown/TXT/EPUB")
|
|
75
|
+
.argument("<project-id>", "Translation project ID under translations/")
|
|
76
|
+
.option("--format <format>", "Output format: md, txt, epub", "md")
|
|
77
|
+
.option("--output <path>", "Output file path")
|
|
78
|
+
.option("--json", "Output JSON")
|
|
79
|
+
.action(async (projectId, opts) => {
|
|
80
|
+
try {
|
|
81
|
+
const root = findProjectRoot();
|
|
82
|
+
const result = await writeTranslationExport(root, projectId, {
|
|
83
|
+
format: opts.format,
|
|
84
|
+
outputPath: opts.output,
|
|
85
|
+
});
|
|
86
|
+
if (opts.json) {
|
|
87
|
+
log(JSON.stringify(result, null, 2));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
log(`Exported ${result.chaptersExported} chapter(s)`);
|
|
91
|
+
log(`Output: ${result.outputPath}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
fail("Translation export failed", error, opts.json);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
function fail(prefix, error, json) {
|
|
99
|
+
if (json) {
|
|
100
|
+
log(JSON.stringify({ error: String(error) }));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
logError(`${prefix}: ${error}`);
|
|
104
|
+
}
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=translate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.js","sourceRoot":"","sources":["../../src/commands/translate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,eAAO,MAAM,YAAY,SACO,CAAC"}
|
package/dist/commands/write.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import { PipelineRunner, StateManager } from "@actalk/inkos-core";
|
|
2
|
+
import { PipelineRunner, StateManager, resolveChapterReviewMode } from "@actalk/inkos-core";
|
|
3
3
|
import { readdir, stat, unlink } from "node:fs/promises";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { createInterface } from "node:readline";
|
|
6
6
|
import { loadConfig, buildPipelineConfig, findProjectRoot, getLegacyMigrationHint, resolveContext, resolveBookId, log, logError } from "../utils.js";
|
|
7
|
-
import { formatWriteNextComplete, formatWriteNextProgress, formatWriteNextResultLines, resolveCliLanguage } from "../localization.js";
|
|
7
|
+
import { formatNotifyBatchWriteBody, formatNotifyCommandTitle, formatNotifyFailureBody, formatWriteNextComplete, formatWriteNextProgress, formatWriteNextResultLines, resolveCliLanguage, } from "../localization.js";
|
|
8
|
+
import { sendCommandNotification } from "../notify-helper.js";
|
|
8
9
|
export const writeCommand = new Command("write")
|
|
9
10
|
.description("Write chapters");
|
|
10
11
|
writeCommand
|
|
@@ -17,7 +18,10 @@ writeCommand
|
|
|
17
18
|
.option("--context-file <path>", "Read guidance from file")
|
|
18
19
|
.option("--json", "Output JSON")
|
|
19
20
|
.option("-q, --quiet", "Suppress console output")
|
|
21
|
+
.option("--notify", "Send a notification to configured notify channels when the command finishes")
|
|
20
22
|
.action(async (bookIdArg, opts) => {
|
|
23
|
+
let notifyLanguage = "zh";
|
|
24
|
+
let notifyBookName;
|
|
21
25
|
try {
|
|
22
26
|
const root = findProjectRoot();
|
|
23
27
|
const bookId = await resolveBookId(bookIdArg, root);
|
|
@@ -25,12 +29,18 @@ writeCommand
|
|
|
25
29
|
const state = new StateManager(root);
|
|
26
30
|
const book = await state.loadBookConfig(bookId);
|
|
27
31
|
const language = resolveCliLanguage(book.language);
|
|
32
|
+
notifyLanguage = language;
|
|
33
|
+
notifyBookName = book.title ?? bookId;
|
|
28
34
|
const migrationHint = await getLegacyMigrationHint(root, bookId);
|
|
29
35
|
if (migrationHint && !opts.json) {
|
|
30
36
|
log(`[migration] ${migrationHint}`);
|
|
31
37
|
}
|
|
32
38
|
const config = await loadConfig();
|
|
33
|
-
const pipeline = new PipelineRunner(buildPipelineConfig(config, root, {
|
|
39
|
+
const pipeline = new PipelineRunner(buildPipelineConfig(config, root, {
|
|
40
|
+
externalContext: context,
|
|
41
|
+
quiet: opts.quiet,
|
|
42
|
+
chapterReviewMode: resolveChapterReviewMode(book, config.writing),
|
|
43
|
+
}));
|
|
34
44
|
const count = parseInt(opts.count, 10);
|
|
35
45
|
const wordCount = opts.words ? parseInt(opts.words, 10) : undefined;
|
|
36
46
|
const results = [];
|
|
@@ -68,8 +78,30 @@ writeCommand
|
|
|
68
78
|
else {
|
|
69
79
|
log(formatWriteNextComplete(language));
|
|
70
80
|
}
|
|
81
|
+
// The pipeline itself already sends one notification per completed
|
|
82
|
+
// chapter whenever notify channels are configured (runner.ts, end of
|
|
83
|
+
// writeNextChapter). A single-chapter run would therefore duplicate that
|
|
84
|
+
// exact notification — only send a command-level batch summary when this
|
|
85
|
+
// run wrote more than one chapter.
|
|
86
|
+
if (opts.notify && results.length > 1) {
|
|
87
|
+
await sendCommandNotification({
|
|
88
|
+
title: formatNotifyCommandTitle(language, "write-next", notifyBookName, true),
|
|
89
|
+
body: formatNotifyBatchWriteBody(language, results.map((r) => ({
|
|
90
|
+
chapterNumber: r.chapterNumber,
|
|
91
|
+
title: r.title,
|
|
92
|
+
wordCount: r.wordCount,
|
|
93
|
+
auditPassed: r.auditResult.passed,
|
|
94
|
+
}))),
|
|
95
|
+
}, config);
|
|
96
|
+
}
|
|
71
97
|
}
|
|
72
98
|
catch (e) {
|
|
99
|
+
if (opts.notify) {
|
|
100
|
+
await sendCommandNotification({
|
|
101
|
+
title: formatNotifyCommandTitle(notifyLanguage, "write-next", notifyBookName, false),
|
|
102
|
+
body: formatNotifyFailureBody(notifyLanguage, e),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
73
105
|
if (opts.json) {
|
|
74
106
|
log(JSON.stringify({ error: String(e) }));
|
|
75
107
|
}
|
|
@@ -87,7 +119,10 @@ writeCommand
|
|
|
87
119
|
.option("--words <n>", "Words per chapter (overrides book config)")
|
|
88
120
|
.option("--brief <text>", "One-off creative guidance for this rewrite only")
|
|
89
121
|
.option("--json", "Output JSON")
|
|
122
|
+
.option("--notify", "Send a notification to configured notify channels when the command finishes")
|
|
90
123
|
.action(async (args, opts) => {
|
|
124
|
+
let notifyLanguage = "zh";
|
|
125
|
+
let notifyBookName;
|
|
91
126
|
try {
|
|
92
127
|
const root = findProjectRoot();
|
|
93
128
|
let bookId;
|
|
@@ -119,6 +154,9 @@ writeCommand
|
|
|
119
154
|
}
|
|
120
155
|
}
|
|
121
156
|
const state = new StateManager(root);
|
|
157
|
+
const book = await state.loadBookConfig(bookId);
|
|
158
|
+
notifyLanguage = resolveCliLanguage(book.language);
|
|
159
|
+
notifyBookName = book.title ?? bookId;
|
|
122
160
|
const bookDir = state.bookDir(bookId);
|
|
123
161
|
const chaptersDir = join(bookDir, "chapters");
|
|
124
162
|
const restoreFrom = chapter - 1;
|
|
@@ -170,9 +208,9 @@ writeCommand
|
|
|
170
208
|
const config = await loadConfig();
|
|
171
209
|
const pipeline = new PipelineRunner(buildPipelineConfig(config, root, {
|
|
172
210
|
externalContext: opts.brief,
|
|
211
|
+
chapterReviewMode: resolveChapterReviewMode(book, config.writing),
|
|
173
212
|
}));
|
|
174
213
|
const result = await pipeline.writeNextChapter(bookId, wordCount);
|
|
175
|
-
const book = await state.loadBookConfig(bookId);
|
|
176
214
|
const language = resolveCliLanguage(book.language);
|
|
177
215
|
if (opts.json) {
|
|
178
216
|
log(JSON.stringify(result, null, 2));
|
|
@@ -190,8 +228,18 @@ writeCommand
|
|
|
190
228
|
log(line);
|
|
191
229
|
}
|
|
192
230
|
}
|
|
231
|
+
// Success notification intentionally skipped: the pipeline already sent
|
|
232
|
+
// the per-chapter notification for this exact chapter (runner.ts, end of
|
|
233
|
+
// writeNextChapter) — a command-level one would be a duplicate. --notify
|
|
234
|
+
// only adds the failure notification for this command.
|
|
193
235
|
}
|
|
194
236
|
catch (e) {
|
|
237
|
+
if (opts.notify) {
|
|
238
|
+
await sendCommandNotification({
|
|
239
|
+
title: formatNotifyCommandTitle(notifyLanguage, "write-rewrite", notifyBookName, false),
|
|
240
|
+
body: formatNotifyFailureBody(notifyLanguage, e),
|
|
241
|
+
});
|
|
242
|
+
}
|
|
195
243
|
if (opts.json) {
|
|
196
244
|
log(JSON.stringify({ error: String(e) }));
|
|
197
245
|
}
|