@kienmatu/inkos 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.
Files changed (250) hide show
  1. package/LICENSE +661 -0
  2. package/dist/book-backup.d.ts +33 -0
  3. package/dist/book-backup.d.ts.map +1 -0
  4. package/dist/book-backup.js +74 -0
  5. package/dist/book-backup.js.map +1 -0
  6. package/dist/commands/agent.d.ts +3 -0
  7. package/dist/commands/agent.d.ts.map +1 -0
  8. package/dist/commands/agent.js +71 -0
  9. package/dist/commands/agent.js.map +1 -0
  10. package/dist/commands/analytics.d.ts +3 -0
  11. package/dist/commands/analytics.d.ts.map +1 -0
  12. package/dist/commands/analytics.js +74 -0
  13. package/dist/commands/analytics.js.map +1 -0
  14. package/dist/commands/audit.d.ts +3 -0
  15. package/dist/commands/audit.d.ts.map +1 -0
  16. package/dist/commands/audit.js +81 -0
  17. package/dist/commands/audit.js.map +1 -0
  18. package/dist/commands/auto.d.ts +3 -0
  19. package/dist/commands/auto.d.ts.map +1 -0
  20. package/dist/commands/auto.js +136 -0
  21. package/dist/commands/auto.js.map +1 -0
  22. package/dist/commands/book.d.ts +3 -0
  23. package/dist/commands/book.d.ts.map +1 -0
  24. package/dist/commands/book.js +324 -0
  25. package/dist/commands/book.js.map +1 -0
  26. package/dist/commands/chapter.d.ts +3 -0
  27. package/dist/commands/chapter.d.ts.map +1 -0
  28. package/dist/commands/chapter.js +103 -0
  29. package/dist/commands/chapter.js.map +1 -0
  30. package/dist/commands/compose.d.ts +3 -0
  31. package/dist/commands/compose.d.ts.map +1 -0
  32. package/dist/commands/compose.js +46 -0
  33. package/dist/commands/compose.js.map +1 -0
  34. package/dist/commands/config.d.ts +3 -0
  35. package/dist/commands/config.d.ts.map +1 -0
  36. package/dist/commands/config.js +321 -0
  37. package/dist/commands/config.js.map +1 -0
  38. package/dist/commands/consolidate.d.ts +3 -0
  39. package/dist/commands/consolidate.d.ts.map +1 -0
  40. package/dist/commands/consolidate.js +50 -0
  41. package/dist/commands/consolidate.js.map +1 -0
  42. package/dist/commands/daemon.d.ts +4 -0
  43. package/dist/commands/daemon.d.ts.map +1 -0
  44. package/dist/commands/daemon.js +118 -0
  45. package/dist/commands/daemon.js.map +1 -0
  46. package/dist/commands/detect.d.ts +3 -0
  47. package/dist/commands/detect.d.ts.map +1 -0
  48. package/dist/commands/detect.js +104 -0
  49. package/dist/commands/detect.js.map +1 -0
  50. package/dist/commands/doctor.d.ts +8 -0
  51. package/dist/commands/doctor.d.ts.map +1 -0
  52. package/dist/commands/doctor.js +356 -0
  53. package/dist/commands/doctor.js.map +1 -0
  54. package/dist/commands/draft.d.ts +3 -0
  55. package/dist/commands/draft.d.ts.map +1 -0
  56. package/dist/commands/draft.js +42 -0
  57. package/dist/commands/draft.js.map +1 -0
  58. package/dist/commands/eval.d.ts +3 -0
  59. package/dist/commands/eval.d.ts.map +1 -0
  60. package/dist/commands/eval.js +57 -0
  61. package/dist/commands/eval.js.map +1 -0
  62. package/dist/commands/export.d.ts +3 -0
  63. package/dist/commands/export.d.ts.map +1 -0
  64. package/dist/commands/export.js +46 -0
  65. package/dist/commands/export.js.map +1 -0
  66. package/dist/commands/fanfic.d.ts +3 -0
  67. package/dist/commands/fanfic.d.ts.map +1 -0
  68. package/dist/commands/fanfic.js +177 -0
  69. package/dist/commands/fanfic.js.map +1 -0
  70. package/dist/commands/forecast.d.ts +12 -0
  71. package/dist/commands/forecast.d.ts.map +1 -0
  72. package/dist/commands/forecast.js +156 -0
  73. package/dist/commands/forecast.js.map +1 -0
  74. package/dist/commands/genre.d.ts +11 -0
  75. package/dist/commands/genre.d.ts.map +1 -0
  76. package/dist/commands/genre.js +186 -0
  77. package/dist/commands/genre.js.map +1 -0
  78. package/dist/commands/import.d.ts +3 -0
  79. package/dist/commands/import.d.ts.map +1 -0
  80. package/dist/commands/import.js +110 -0
  81. package/dist/commands/import.js.map +1 -0
  82. package/dist/commands/init.d.ts +3 -0
  83. package/dist/commands/init.d.ts.map +1 -0
  84. package/dist/commands/init.js +63 -0
  85. package/dist/commands/init.js.map +1 -0
  86. package/dist/commands/interact.d.ts +6 -0
  87. package/dist/commands/interact.d.ts.map +1 -0
  88. package/dist/commands/interact.js +95 -0
  89. package/dist/commands/interact.js.map +1 -0
  90. package/dist/commands/plan.d.ts +3 -0
  91. package/dist/commands/plan.d.ts.map +1 -0
  92. package/dist/commands/plan.js +50 -0
  93. package/dist/commands/plan.js.map +1 -0
  94. package/dist/commands/radar.d.ts +3 -0
  95. package/dist/commands/radar.d.ts.map +1 -0
  96. package/dist/commands/radar.js +52 -0
  97. package/dist/commands/radar.js.map +1 -0
  98. package/dist/commands/review.d.ts +3 -0
  99. package/dist/commands/review.d.ts.map +1 -0
  100. package/dist/commands/review.js +229 -0
  101. package/dist/commands/review.js.map +1 -0
  102. package/dist/commands/revise.d.ts +3 -0
  103. package/dist/commands/revise.d.ts.map +1 -0
  104. package/dist/commands/revise.js +91 -0
  105. package/dist/commands/revise.js.map +1 -0
  106. package/dist/commands/short-fiction.d.ts +4 -0
  107. package/dist/commands/short-fiction.d.ts.map +1 -0
  108. package/dist/commands/short-fiction.js +220 -0
  109. package/dist/commands/short-fiction.js.map +1 -0
  110. package/dist/commands/status.d.ts +3 -0
  111. package/dist/commands/status.d.ts.map +1 -0
  112. package/dist/commands/status.js +123 -0
  113. package/dist/commands/status.js.map +1 -0
  114. package/dist/commands/studio.d.ts +21 -0
  115. package/dist/commands/studio.d.ts.map +1 -0
  116. package/dist/commands/studio.js +151 -0
  117. package/dist/commands/studio.js.map +1 -0
  118. package/dist/commands/style.d.ts +3 -0
  119. package/dist/commands/style.d.ts.map +1 -0
  120. package/dist/commands/style.js +95 -0
  121. package/dist/commands/style.js.map +1 -0
  122. package/dist/commands/translate.d.ts +3 -0
  123. package/dist/commands/translate.d.ts.map +1 -0
  124. package/dist/commands/translate.js +111 -0
  125. package/dist/commands/translate.js.map +1 -0
  126. package/dist/commands/tui.d.ts +6 -0
  127. package/dist/commands/tui.d.ts.map +1 -0
  128. package/dist/commands/tui.js +14 -0
  129. package/dist/commands/tui.js.map +1 -0
  130. package/dist/commands/update.d.ts +3 -0
  131. package/dist/commands/update.d.ts.map +1 -0
  132. package/dist/commands/update.js +40 -0
  133. package/dist/commands/update.js.map +1 -0
  134. package/dist/commands/write.d.ts +3 -0
  135. package/dist/commands/write.d.ts.map +1 -0
  136. package/dist/commands/write.js +371 -0
  137. package/dist/commands/write.js.map +1 -0
  138. package/dist/index.d.ts +3 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +4 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/localization.d.ts +103 -0
  143. package/dist/localization.d.ts.map +1 -0
  144. package/dist/localization.js +377 -0
  145. package/dist/localization.js.map +1 -0
  146. package/dist/notify-helper.d.ts +17 -0
  147. package/dist/notify-helper.d.ts.map +1 -0
  148. package/dist/notify-helper.js +27 -0
  149. package/dist/notify-helper.js.map +1 -0
  150. package/dist/program.d.ts +10 -0
  151. package/dist/program.d.ts.map +1 -0
  152. package/dist/program.js +97 -0
  153. package/dist/program.js.map +1 -0
  154. package/dist/progress-text.d.ts +26 -0
  155. package/dist/progress-text.d.ts.map +1 -0
  156. package/dist/progress-text.js +35 -0
  157. package/dist/progress-text.js.map +1 -0
  158. package/dist/project-bootstrap.d.ts +8 -0
  159. package/dist/project-bootstrap.d.ts.map +1 -0
  160. package/dist/project-bootstrap.js +139 -0
  161. package/dist/project-bootstrap.js.map +1 -0
  162. package/dist/runtime-requirements.d.ts +24 -0
  163. package/dist/runtime-requirements.d.ts.map +1 -0
  164. package/dist/runtime-requirements.js +89 -0
  165. package/dist/runtime-requirements.js.map +1 -0
  166. package/dist/tui/__tests__/markdown.test.d.ts +2 -0
  167. package/dist/tui/__tests__/markdown.test.d.ts.map +1 -0
  168. package/dist/tui/__tests__/markdown.test.js +58 -0
  169. package/dist/tui/__tests__/markdown.test.js.map +1 -0
  170. package/dist/tui/activity-state.d.ts +9 -0
  171. package/dist/tui/activity-state.d.ts.map +1 -0
  172. package/dist/tui/activity-state.js +6 -0
  173. package/dist/tui/activity-state.js.map +1 -0
  174. package/dist/tui/agent-input.d.ts +118 -0
  175. package/dist/tui/agent-input.d.ts.map +1 -0
  176. package/dist/tui/agent-input.js +255 -0
  177. package/dist/tui/agent-input.js.map +1 -0
  178. package/dist/tui/ansi.d.ts +40 -0
  179. package/dist/tui/ansi.d.ts.map +1 -0
  180. package/dist/tui/ansi.js +62 -0
  181. package/dist/tui/ansi.js.map +1 -0
  182. package/dist/tui/app.d.ts +13 -0
  183. package/dist/tui/app.d.ts.map +1 -0
  184. package/dist/tui/app.js +109 -0
  185. package/dist/tui/app.js.map +1 -0
  186. package/dist/tui/chat-depth.d.ts +9 -0
  187. package/dist/tui/chat-depth.d.ts.map +1 -0
  188. package/dist/tui/chat-depth.js +14 -0
  189. package/dist/tui/chat-depth.js.map +1 -0
  190. package/dist/tui/chat-draft.d.ts +4 -0
  191. package/dist/tui/chat-draft.d.ts.map +1 -0
  192. package/dist/tui/chat-draft.js +28 -0
  193. package/dist/tui/chat-draft.js.map +1 -0
  194. package/dist/tui/composer-caret.d.ts +10 -0
  195. package/dist/tui/composer-caret.d.ts.map +1 -0
  196. package/dist/tui/composer-caret.js +13 -0
  197. package/dist/tui/composer-caret.js.map +1 -0
  198. package/dist/tui/composer-display.d.ts +7 -0
  199. package/dist/tui/composer-display.d.ts.map +1 -0
  200. package/dist/tui/composer-display.js +17 -0
  201. package/dist/tui/composer-display.js.map +1 -0
  202. package/dist/tui/dashboard-model.d.ts +46 -0
  203. package/dist/tui/dashboard-model.d.ts.map +1 -0
  204. package/dist/tui/dashboard-model.js +105 -0
  205. package/dist/tui/dashboard-model.js.map +1 -0
  206. package/dist/tui/dashboard.d.ts +38 -0
  207. package/dist/tui/dashboard.d.ts.map +1 -0
  208. package/dist/tui/dashboard.js +357 -0
  209. package/dist/tui/dashboard.js.map +1 -0
  210. package/dist/tui/effects.d.ts +61 -0
  211. package/dist/tui/effects.d.ts.map +1 -0
  212. package/dist/tui/effects.js +451 -0
  213. package/dist/tui/effects.js.map +1 -0
  214. package/dist/tui/i18n.d.ts +63 -0
  215. package/dist/tui/i18n.d.ts.map +1 -0
  216. package/dist/tui/i18n.js +205 -0
  217. package/dist/tui/i18n.js.map +1 -0
  218. package/dist/tui/input-history.d.ts +12 -0
  219. package/dist/tui/input-history.d.ts.map +1 -0
  220. package/dist/tui/input-history.js +47 -0
  221. package/dist/tui/input-history.js.map +1 -0
  222. package/dist/tui/local-commands.d.ts +12 -0
  223. package/dist/tui/local-commands.d.ts.map +1 -0
  224. package/dist/tui/local-commands.js +50 -0
  225. package/dist/tui/local-commands.js.map +1 -0
  226. package/dist/tui/markdown.d.ts +2 -0
  227. package/dist/tui/markdown.d.ts.map +1 -0
  228. package/dist/tui/markdown.js +60 -0
  229. package/dist/tui/markdown.js.map +1 -0
  230. package/dist/tui/session-store.d.ts +2 -0
  231. package/dist/tui/session-store.d.ts.map +1 -0
  232. package/dist/tui/session-store.js +2 -0
  233. package/dist/tui/session-store.js.map +1 -0
  234. package/dist/tui/setup.d.ts +53 -0
  235. package/dist/tui/setup.d.ts.map +1 -0
  236. package/dist/tui/setup.js +313 -0
  237. package/dist/tui/setup.js.map +1 -0
  238. package/dist/tui/slash-autocomplete.d.ts +8 -0
  239. package/dist/tui/slash-autocomplete.d.ts.map +1 -0
  240. package/dist/tui/slash-autocomplete.js +48 -0
  241. package/dist/tui/slash-autocomplete.js.map +1 -0
  242. package/dist/tui/theme.d.ts +28 -0
  243. package/dist/tui/theme.d.ts.map +1 -0
  244. package/dist/tui/theme.js +53 -0
  245. package/dist/tui/theme.js.map +1 -0
  246. package/dist/utils.d.ts +32 -0
  247. package/dist/utils.d.ts.map +1 -0
  248. package/dist/utils.js +165 -0
  249. package/dist/utils.js.map +1 -0
  250. package/package.json +72 -0
@@ -0,0 +1,40 @@
1
+ import { Command } from "commander";
2
+ import { execSync } from "node:child_process";
3
+ import { log, logError } from "../utils.js";
4
+ export const updateCommand = new Command("update")
5
+ .description("Update InkOS to the latest version")
6
+ .action(async () => {
7
+ try {
8
+ const { createRequire } = await import("node:module");
9
+ const require = createRequire(import.meta.url);
10
+ const { version: currentVersion } = require("../../package.json");
11
+ log(`Current version: ${currentVersion}`);
12
+ log("Checking npm registry...");
13
+ const remoteVersion = execSync("npm view @kienmatu/inkos version", {
14
+ encoding: "utf-8",
15
+ }).trim();
16
+ if (currentVersion === remoteVersion) {
17
+ log(`Already up to date (${currentVersion}).`);
18
+ return;
19
+ }
20
+ // Don't downgrade development versions
21
+ const current = currentVersion.split(".").map(Number);
22
+ const remote = remoteVersion.split(".").map(Number);
23
+ const isNewer = current[0] > remote[0] ||
24
+ (current[0] === remote[0] && current[1] > remote[1]) ||
25
+ (current[0] === remote[0] && current[1] === remote[1] && current[2] > remote[2]);
26
+ if (isNewer) {
27
+ log(`You're running a newer development version (${currentVersion} > ${remoteVersion}). Skipping.`);
28
+ return;
29
+ }
30
+ log(`Updating: ${currentVersion} → ${remoteVersion}`);
31
+ execSync("npm install -g @kienmatu/inkos@latest", { stdio: "inherit" });
32
+ log(`Updated to ${remoteVersion}.`);
33
+ }
34
+ catch (e) {
35
+ logError(`Update failed: ${e}`);
36
+ log("You can also update manually: npm install -g @kienmatu/inkos@latest");
37
+ process.exit(1);
38
+ }
39
+ });
40
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;QAEzF,GAAG,CAAC,oBAAoB,cAAc,EAAE,CAAC,CAAC;QAC1C,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAEhC,MAAM,aAAa,GAAG,QAAQ,CAAC,kCAAkC,EAAE;YACjE,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;YACrC,GAAG,CAAC,uBAAuB,cAAc,IAAI,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,uCAAuC;QACvC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAE;YACtC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;YACtD,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC;QAErF,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,+CAA+C,cAAc,MAAM,aAAa,cAAc,CAAC,CAAC;YACpG,OAAO;QACT,CAAC;QAED,GAAG,CAAC,aAAa,cAAc,MAAM,aAAa,EAAE,CAAC,CAAC;QACtD,QAAQ,CAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACxE,GAAG,CAAC,cAAc,aAAa,GAAG,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAChC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const writeCommand: Command;
3
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,371 @@
1
+ import { Command } from "commander";
2
+ import { PipelineRunner, StateManager, resolveChapterReviewMode } from "@kienmatu/inkos-core";
3
+ import { readdir, stat, unlink } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { createInterface } from "node:readline";
6
+ import { loadConfig, buildPipelineConfig, findProjectRoot, getLegacyMigrationHint, resolveContext, resolveBookId, log, logError } from "../utils.js";
7
+ import { formatNotifyBatchWriteBody, formatNotifyCommandTitle, formatNotifyFailureBody, formatWriteNextComplete, formatWriteNextProgress, formatWriteNextResultLines, resolveCliLanguage, } from "../localization.js";
8
+ import { sendCommandNotification } from "../notify-helper.js";
9
+ export const writeCommand = new Command("write")
10
+ .description("Write chapters");
11
+ writeCommand
12
+ .command("next")
13
+ .description("Write the next chapter for a book")
14
+ .argument("[book-id]", "Book ID (auto-detected if only one book)")
15
+ .option("--count <n>", "Number of chapters to write", "1")
16
+ .option("--words <n>", "Words per chapter (overrides book config)")
17
+ .option("--context <text>", "Creative guidance (natural language)")
18
+ .option("--context-file <path>", "Read guidance from file")
19
+ .option("--json", "Output JSON")
20
+ .option("-q, --quiet", "Suppress console output")
21
+ .option("--notify", "Send a notification to configured notify channels when the command finishes")
22
+ .action(async (bookIdArg, opts) => {
23
+ let notifyLanguage = "zh";
24
+ let notifyBookName;
25
+ try {
26
+ const root = findProjectRoot();
27
+ const bookId = await resolveBookId(bookIdArg, root);
28
+ const context = await resolveContext(opts);
29
+ const state = new StateManager(root);
30
+ const book = await state.loadBookConfig(bookId);
31
+ const language = resolveCliLanguage(book.language);
32
+ notifyLanguage = language;
33
+ notifyBookName = book.title ?? bookId;
34
+ const migrationHint = await getLegacyMigrationHint(root, bookId);
35
+ if (migrationHint && !opts.json) {
36
+ log(`[migration] ${migrationHint}`);
37
+ }
38
+ const config = await loadConfig();
39
+ const pipeline = new PipelineRunner(buildPipelineConfig(config, root, {
40
+ externalContext: context,
41
+ quiet: opts.quiet,
42
+ chapterReviewMode: resolveChapterReviewMode(book, config.writing),
43
+ }));
44
+ const count = parseInt(opts.count, 10);
45
+ const wordCount = opts.words ? parseInt(opts.words, 10) : undefined;
46
+ const results = [];
47
+ for (let i = 0; i < count; i++) {
48
+ if (!opts.json)
49
+ log(formatWriteNextProgress(language, i + 1, count, bookId));
50
+ const result = await pipeline.writeNextChapter(bookId, wordCount);
51
+ results.push(result);
52
+ if (!opts.json) {
53
+ for (const line of formatWriteNextResultLines(language, {
54
+ chapterNumber: result.chapterNumber,
55
+ title: result.title,
56
+ wordCount: result.wordCount,
57
+ auditPassed: result.auditResult.passed,
58
+ revised: result.revised,
59
+ status: result.status,
60
+ issues: result.auditResult.issues,
61
+ })) {
62
+ log(line);
63
+ }
64
+ log("");
65
+ }
66
+ if (result.status === "state-degraded") {
67
+ if (!opts.json) {
68
+ log(language === "en"
69
+ ? "State repair required before continuing. Stopping batch."
70
+ : "需要先修复 state,已停止后续连写。");
71
+ }
72
+ break;
73
+ }
74
+ }
75
+ if (opts.json) {
76
+ log(JSON.stringify(results, null, 2));
77
+ }
78
+ else {
79
+ log(formatWriteNextComplete(language));
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
+ }
97
+ }
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
+ }
105
+ if (opts.json) {
106
+ log(JSON.stringify({ error: String(e) }));
107
+ }
108
+ else {
109
+ logError(`Failed to write chapter: ${e}`);
110
+ }
111
+ process.exit(1);
112
+ }
113
+ });
114
+ writeCommand
115
+ .command("rewrite")
116
+ .description("Re-generate a specific chapter: rewrite [book-id] <chapter>")
117
+ .argument("<args...>", "Book ID (optional) and chapter number")
118
+ .option("--force", "Skip confirmation prompt")
119
+ .option("--words <n>", "Words per chapter (overrides book config)")
120
+ .option("--brief <text>", "One-off creative guidance for this rewrite only")
121
+ .option("--json", "Output JSON")
122
+ .option("--notify", "Send a notification to configured notify channels when the command finishes")
123
+ .action(async (args, opts) => {
124
+ let notifyLanguage = "zh";
125
+ let notifyBookName;
126
+ try {
127
+ const root = findProjectRoot();
128
+ let bookId;
129
+ let chapter;
130
+ if (args.length === 1) {
131
+ chapter = parseInt(args[0], 10);
132
+ if (isNaN(chapter))
133
+ throw new Error(`Expected chapter number, got "${args[0]}"`);
134
+ bookId = await resolveBookId(undefined, root);
135
+ }
136
+ else if (args.length === 2) {
137
+ chapter = parseInt(args[1], 10);
138
+ if (isNaN(chapter))
139
+ throw new Error(`Expected chapter number, got "${args[1]}"`);
140
+ bookId = await resolveBookId(args[0], root);
141
+ }
142
+ else {
143
+ throw new Error("Usage: inkos write rewrite [book-id] <chapter>");
144
+ }
145
+ if (!opts.force) {
146
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
147
+ const answer = await new Promise((resolve) => {
148
+ rl.question(`Rewrite chapter ${chapter} of "${bookId}"? This will delete chapter ${chapter} and all later chapters. (y/N) `, resolve);
149
+ });
150
+ rl.close();
151
+ if (answer.toLowerCase() !== "y") {
152
+ log("Cancelled.");
153
+ return;
154
+ }
155
+ }
156
+ const state = new StateManager(root);
157
+ const book = await state.loadBookConfig(bookId);
158
+ notifyLanguage = resolveCliLanguage(book.language);
159
+ notifyBookName = book.title ?? bookId;
160
+ const bookDir = state.bookDir(bookId);
161
+ const chaptersDir = join(bookDir, "chapters");
162
+ const restoreFrom = chapter - 1;
163
+ const restoreSnapshotDir = join(bookDir, "story", "snapshots", String(restoreFrom));
164
+ await stat(restoreSnapshotDir).catch(() => {
165
+ throw new Error(`Cannot rewrite chapter ${chapter}: missing snapshot for chapter ${restoreFrom}`);
166
+ });
167
+ const migrationHint = await getLegacyMigrationHint(root, bookId);
168
+ if (migrationHint && !opts.json) {
169
+ log(`[migration] ${migrationHint}`);
170
+ }
171
+ // Remove existing chapter file
172
+ const files = await readdir(chaptersDir);
173
+ const paddedNum = String(chapter).padStart(4, "0");
174
+ const existing = files.filter((f) => f.startsWith(paddedNum) && f.endsWith(".md"));
175
+ for (const f of existing) {
176
+ await unlink(join(chaptersDir, f));
177
+ if (!opts.json)
178
+ log(`Removed: ${f}`);
179
+ }
180
+ // Remove from index (and all chapters after it)
181
+ const index = await state.loadChapterIndex(bookId);
182
+ const trimmed = index.filter((ch) => ch.number < chapter);
183
+ await state.saveChapterIndex(bookId, trimmed);
184
+ // Also remove later chapter files since state will be rolled back
185
+ const laterFiles = files.filter((f) => {
186
+ const num = parseInt(f.slice(0, 4), 10);
187
+ return num > chapter && f.endsWith(".md");
188
+ });
189
+ for (const f of laterFiles) {
190
+ await unlink(join(chaptersDir, f));
191
+ if (!opts.json)
192
+ log(`Removed later chapter: ${f}`);
193
+ }
194
+ // Restore state to previous chapter's end-state (chapter 1 uses snapshot-0 from initBook)
195
+ const restored = await state.restoreState(bookId, restoreFrom);
196
+ if (!restored) {
197
+ throw new Error(`Cannot rewrite chapter ${chapter}: failed to restore snapshot for chapter ${restoreFrom}`);
198
+ }
199
+ if (!opts.json)
200
+ log(`State restored from chapter ${restoreFrom} snapshot.`);
201
+ const nextChapter = await state.getNextChapterNumber(bookId);
202
+ if (nextChapter !== chapter) {
203
+ throw new Error(`Cannot rewrite chapter ${chapter}: expected next chapter to be ${chapter}, but resolved to ${nextChapter}`);
204
+ }
205
+ if (!opts.json)
206
+ log(`Regenerating chapter ${chapter}...`);
207
+ const wordCount = opts.words ? parseInt(opts.words, 10) : undefined;
208
+ const config = await loadConfig();
209
+ const pipeline = new PipelineRunner(buildPipelineConfig(config, root, {
210
+ externalContext: opts.brief,
211
+ chapterReviewMode: resolveChapterReviewMode(book, config.writing),
212
+ }));
213
+ const result = await pipeline.writeNextChapter(bookId, wordCount);
214
+ const language = resolveCliLanguage(book.language);
215
+ if (opts.json) {
216
+ log(JSON.stringify(result, null, 2));
217
+ }
218
+ else {
219
+ for (const line of formatWriteNextResultLines(language, {
220
+ chapterNumber: result.chapterNumber,
221
+ title: result.title,
222
+ wordCount: result.wordCount,
223
+ auditPassed: result.auditResult.passed,
224
+ revised: result.revised,
225
+ status: result.status,
226
+ issues: result.auditResult.issues,
227
+ })) {
228
+ log(line);
229
+ }
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.
235
+ }
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
+ }
243
+ if (opts.json) {
244
+ log(JSON.stringify({ error: String(e) }));
245
+ }
246
+ else {
247
+ logError(`Failed to rewrite chapter: ${e}`);
248
+ }
249
+ process.exit(1);
250
+ }
251
+ });
252
+ writeCommand
253
+ .command("sync")
254
+ .description("Rebuild truth files and SQLite indexes from the latest edited chapter body")
255
+ .argument("<args...>", "Book ID (optional) and chapter number")
256
+ .option("--brief <text>", "One-off guidance for how to interpret the edited chapter while syncing")
257
+ .option("--json", "Output JSON")
258
+ .action(async (args, opts) => {
259
+ try {
260
+ const root = findProjectRoot();
261
+ let bookId;
262
+ let chapter;
263
+ if (args.length === 1) {
264
+ chapter = parseInt(args[0], 10);
265
+ if (isNaN(chapter))
266
+ throw new Error(`Expected chapter number, got "${args[0]}"`);
267
+ bookId = await resolveBookId(undefined, root);
268
+ }
269
+ else if (args.length === 2) {
270
+ chapter = parseInt(args[1], 10);
271
+ if (isNaN(chapter))
272
+ throw new Error(`Expected chapter number, got "${args[1]}"`);
273
+ bookId = await resolveBookId(args[0], root);
274
+ }
275
+ else {
276
+ throw new Error("Usage: inkos write sync [book-id] <chapter>");
277
+ }
278
+ const state = new StateManager(root);
279
+ const book = await state.loadBookConfig(bookId);
280
+ const language = resolveCliLanguage(book.language);
281
+ const config = await loadConfig();
282
+ const pipeline = new PipelineRunner(buildPipelineConfig(config, root, {
283
+ externalContext: opts.brief,
284
+ }));
285
+ const result = await pipeline.resyncChapterArtifacts(bookId, chapter);
286
+ if (opts.json) {
287
+ log(JSON.stringify(result, null, 2));
288
+ }
289
+ else {
290
+ for (const line of formatWriteNextResultLines(language, {
291
+ chapterNumber: result.chapterNumber,
292
+ title: result.title,
293
+ wordCount: result.wordCount,
294
+ auditPassed: result.auditResult.passed,
295
+ revised: result.revised,
296
+ status: result.status,
297
+ issues: result.auditResult.issues,
298
+ })) {
299
+ log(line);
300
+ }
301
+ }
302
+ }
303
+ catch (e) {
304
+ if (opts.json) {
305
+ log(JSON.stringify({ error: String(e) }));
306
+ }
307
+ else {
308
+ logError(`Failed to sync chapter artifacts: ${e}`);
309
+ }
310
+ process.exit(1);
311
+ }
312
+ });
313
+ writeCommand
314
+ .command("repair-state")
315
+ .description("Rebuild truth files for a persisted state-degraded chapter without rewriting body text")
316
+ .argument("<args...>", "Book ID (optional) and chapter number")
317
+ .option("--json", "Output JSON")
318
+ .action(async (args, opts) => {
319
+ try {
320
+ const root = findProjectRoot();
321
+ let bookId;
322
+ let chapter;
323
+ if (args.length === 1) {
324
+ chapter = parseInt(args[0], 10);
325
+ if (isNaN(chapter))
326
+ throw new Error(`Expected chapter number, got "${args[0]}"`);
327
+ bookId = await resolveBookId(undefined, root);
328
+ }
329
+ else if (args.length === 2) {
330
+ chapter = parseInt(args[1], 10);
331
+ if (isNaN(chapter))
332
+ throw new Error(`Expected chapter number, got "${args[1]}"`);
333
+ bookId = await resolveBookId(args[0], root);
334
+ }
335
+ else {
336
+ throw new Error("Usage: inkos write repair-state [book-id] <chapter>");
337
+ }
338
+ const state = new StateManager(root);
339
+ const book = await state.loadBookConfig(bookId);
340
+ const language = resolveCliLanguage(book.language);
341
+ const config = await loadConfig();
342
+ const pipeline = new PipelineRunner(buildPipelineConfig(config, root));
343
+ const result = await pipeline.repairChapterState(bookId, chapter);
344
+ if (opts.json) {
345
+ log(JSON.stringify(result, null, 2));
346
+ }
347
+ else {
348
+ for (const line of formatWriteNextResultLines(language, {
349
+ chapterNumber: result.chapterNumber,
350
+ title: result.title,
351
+ wordCount: result.wordCount,
352
+ auditPassed: result.auditResult.passed,
353
+ revised: result.revised,
354
+ status: result.status,
355
+ issues: result.auditResult.issues,
356
+ })) {
357
+ log(line);
358
+ }
359
+ }
360
+ }
361
+ catch (e) {
362
+ if (opts.json) {
363
+ log(JSON.stringify({ error: String(e) }));
364
+ }
365
+ else {
366
+ logError(`Failed to repair chapter state: ${e}`);
367
+ }
368
+ process.exit(1);
369
+ }
370
+ });
371
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,eAAe,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACrJ,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,GAEnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,gBAAgB,CAAC,CAAC;AAEjC,YAAY;KACT,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mCAAmC,CAAC;KAChD,QAAQ,CAAC,WAAW,EAAE,0CAA0C,CAAC;KACjE,MAAM,CAAC,aAAa,EAAE,6BAA6B,EAAE,GAAG,CAAC;KACzD,MAAM,CAAC,aAAa,EAAE,2CAA2C,CAAC;KAClE,MAAM,CAAC,kBAAkB,EAAE,sCAAsC,CAAC;KAClE,MAAM,CAAC,uBAAuB,EAAE,yBAAyB,CAAC;KAC1D,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;KAC/B,MAAM,CAAC,aAAa,EAAE,yBAAyB,CAAC;KAChD,MAAM,CAAC,UAAU,EAAE,6EAA6E,CAAC;KACjG,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,IAAI,EAAE,EAAE;IACpD,IAAI,cAAc,GAAgB,IAAI,CAAC;IACvC,IAAI,cAAkC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,cAAc,GAAG,QAAQ,CAAC;QAC1B,cAAc,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;QACtC,MAAM,aAAa,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,GAAG,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAElC,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE;YACpE,eAAe,EAAE,OAAO;YACxB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,iBAAiB,EAAE,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;SAClE,CAAC,CAAC,CAAC;QAEJ,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpE,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,GAAG,CAAC,uBAAuB,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YAE7E,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAErB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,MAAM,IAAI,IAAI,0BAA0B,CAAC,QAAQ,EAAE;oBACtD,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;oBACtC,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;iBAClC,CAAC,EAAE,CAAC;oBACH,GAAG,CAAC,IAAI,CAAC,CAAC;gBACZ,CAAC;gBACD,GAAG,CAAC,EAAE,CAAC,CAAC;YACV,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACf,GAAG,CAAC,QAAQ,KAAK,IAAI;wBACnB,CAAC,CAAC,0DAA0D;wBAC5D,CAAC,CAAC,sBAAsB,CAAC,CAAC;gBAC9B,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,mEAAmE;QACnE,qEAAqE;QACrE,yEAAyE;QACzE,yEAAyE;QACzE,mCAAmC;QACnC,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,uBAAuB,CAAC;gBAC5B,KAAK,EAAE,wBAAwB,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,CAAC;gBAC7E,IAAI,EAAE,0BAA0B,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7D,aAAa,EAAE,CAAC,CAAC,aAAa;oBAC9B,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM;iBAClC,CAAC,CAAC,CAAC;aACL,EAAE,MAAM,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,uBAAuB,CAAC;gBAC5B,KAAK,EAAE,wBAAwB,CAAC,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,CAAC;gBACpF,IAAI,EAAE,uBAAuB,CAAC,cAAc,EAAE,CAAC,CAAC;aACjD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,YAAY;KACT,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,6DAA6D,CAAC;KAC1E,QAAQ,CAAC,WAAW,EAAE,uCAAuC,CAAC;KAC9D,MAAM,CAAC,SAAS,EAAE,0BAA0B,CAAC;KAC7C,MAAM,CAAC,aAAa,EAAE,2CAA2C,CAAC;KAClE,MAAM,CAAC,gBAAgB,EAAE,iDAAiD,CAAC;KAC3E,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;KAC/B,MAAM,CAAC,UAAU,EAAE,6EAA6E,CAAC;KACjG,MAAM,CAAC,KAAK,EAAE,IAA2B,EAAE,IAAI,EAAE,EAAE;IAClD,IAAI,cAAc,GAAgB,IAAI,CAAC;IACvC,IAAI,cAAkC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAE/B,IAAI,MAAc,CAAC;QACnB,IAAI,OAAe,CAAC;QACpB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjF,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjF,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;gBACnD,EAAE,CAAC,QAAQ,CAAC,mBAAmB,OAAO,QAAQ,MAAM,+BAA+B,OAAO,iCAAiC,EAAE,OAAO,CAAC,CAAC;YACxI,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;gBACjC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAClB,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChD,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,cAAc,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,CAAC;QAChC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QACpF,MAAM,IAAI,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,kCAAkC,WAAW,EAAE,CAAC,CAAC;QACpG,CAAC,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,GAAG,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,+BAA+B;QAC/B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACnF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;QAED,gDAAgD;QAChD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;QAC1D,MAAM,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE9C,kEAAkE;QAClE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,OAAO,GAAG,GAAG,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,0FAA0F;QAC1F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,4CAA4C,WAAW,EAAE,CAAC,CAAC;QAC9G,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,GAAG,CAAC,+BAA+B,WAAW,YAAY,CAAC,CAAC;QAE5E,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,iCAAiC,OAAO,qBAAqB,WAAW,EAAE,CAAC,CAAC;QAC/H,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,GAAG,CAAC,wBAAwB,OAAO,KAAK,CAAC,CAAC;QAE1D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpE,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE;YACpE,eAAe,EAAE,IAAI,CAAC,KAAK;YAC3B,iBAAiB,EAAE,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;SAClE,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,0BAA0B,CAAC,QAAQ,EAAE;gBACtD,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;gBACtC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;aAClC,CAAC,EAAE,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,CAAC;YACZ,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,yEAAyE;QACzE,yEAAyE;QACzE,uDAAuD;IACzD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,uBAAuB,CAAC;gBAC5B,KAAK,EAAE,wBAAwB,CAAC,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC;gBACvF,IAAI,EAAE,uBAAuB,CAAC,cAAc,EAAE,CAAC,CAAC;aACjD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,YAAY;KACT,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4EAA4E,CAAC;KACzF,QAAQ,CAAC,WAAW,EAAE,uCAAuC,CAAC;KAC9D,MAAM,CAAC,gBAAgB,EAAE,wEAAwE,CAAC;KAClG,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;KAC/B,MAAM,CAAC,KAAK,EAAE,IAA2B,EAAE,IAAI,EAAE,EAAE;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAE/B,IAAI,MAAc,CAAC;QACnB,IAAI,OAAe,CAAC;QACpB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjF,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjF,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE;YACpE,eAAe,EAAE,IAAI,CAAC,KAAK;SAC5B,CAAC,CAAC,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEtE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,0BAA0B,CAAC,QAAQ,EAAE;gBACtD,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;gBACtC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;aAClC,CAAC,EAAE,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,qCAAqC,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,YAAY;KACT,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,wFAAwF,CAAC;KACrG,QAAQ,CAAC,WAAW,EAAE,uCAAuC,CAAC;KAC9D,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;KAC/B,MAAM,CAAC,KAAK,EAAE,IAA2B,EAAE,IAAI,EAAE,EAAE;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAE/B,IAAI,MAAc,CAAC;QACnB,IAAI,OAAe,CAAC;QACpB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjF,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjF,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAElE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,0BAA0B,CAAC,QAAQ,EAAE;gBACtD,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;gBACtC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;aAClC,CAAC,EAAE,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { runProgram } from "./program.js";
3
+ await runProgram();
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,EAAE,CAAC"}
@@ -0,0 +1,103 @@
1
+ export type CliLanguage = "zh" | "en";
2
+ type WriteIssue = {
3
+ readonly severity: string;
4
+ readonly category: string;
5
+ readonly description: string;
6
+ };
7
+ type WriteResultShape = {
8
+ readonly chapterNumber: number;
9
+ readonly title: string;
10
+ readonly wordCount: number;
11
+ readonly status: string;
12
+ readonly revised: boolean;
13
+ readonly issues: ReadonlyArray<WriteIssue>;
14
+ readonly auditPassed?: boolean;
15
+ readonly passedAudit?: boolean;
16
+ };
17
+ type ImportResultShape = {
18
+ readonly importedCount: number;
19
+ readonly totalWords: number;
20
+ readonly nextChapter: number;
21
+ readonly continueBookId: string;
22
+ };
23
+ export declare function resolveCliLanguage(language?: string, env?: NodeJS.ProcessEnv): CliLanguage;
24
+ export declare function formatBookCreateCreating(language: CliLanguage, title: string, genre: string, platform: string): string;
25
+ export declare function formatBookCreateCreated(language: CliLanguage, bookId: string): string;
26
+ export declare function formatBookCreateLocation(language: CliLanguage, bookId: string): string;
27
+ export declare function formatBookCreateFoundationReady(language: CliLanguage): string;
28
+ export declare function formatBookCreateNextStep(language: CliLanguage, bookId: string): string;
29
+ export declare function formatWriteNextProgress(language: CliLanguage, current: number, total: number, bookId: string): string;
30
+ export declare function formatWriteNextResultLines(language: CliLanguage, result: WriteResultShape): string[];
31
+ export declare function formatWriteNextComplete(language: CliLanguage): string;
32
+ export declare function formatAutoWriteStart(language: CliLanguage, bookId: string, startChapter: number, targetChapter: number): string;
33
+ export declare function formatAutoWriteAlreadyComplete(language: CliLanguage, bookId: string, writtenChapters: number, targetChapter: number): string;
34
+ export type NotifyCommandAction = "write-next" | "write-rewrite" | "revise" | "audit" | "auto";
35
+ export declare function formatNotifyCommandTitle(language: CliLanguage, action: NotifyCommandAction, bookName: string | undefined, succeeded: boolean): string;
36
+ export declare function formatNotifyBatchWriteBody(language: CliLanguage, chapters: ReadonlyArray<{
37
+ readonly chapterNumber: number;
38
+ readonly title: string;
39
+ readonly wordCount: number;
40
+ readonly auditPassed: boolean;
41
+ }>): string;
42
+ export declare function formatNotifyAuditBody(language: CliLanguage, result: {
43
+ readonly chapterNumber: number;
44
+ readonly passed: boolean;
45
+ readonly issueCount: number;
46
+ readonly summary: string;
47
+ }): string;
48
+ export declare function formatNotifyReviseBody(language: CliLanguage, result: {
49
+ readonly chapterNumber: number;
50
+ readonly applied: boolean;
51
+ readonly wordCount: number;
52
+ readonly fixedCount: number;
53
+ readonly skippedReason?: string;
54
+ }): string;
55
+ export declare function formatNotifyFailureBody(language: CliLanguage, error: unknown): string;
56
+ export declare function formatImportChaptersDiscovery(language: CliLanguage, chapterCount: number, bookId: string): string;
57
+ export declare function formatImportChaptersResume(language: CliLanguage, resumeFrom: number): string;
58
+ export declare function formatImportChaptersComplete(language: CliLanguage, result: ImportResultShape): string[];
59
+ export declare function formatImportCanonStart(language: CliLanguage, parentBookId: string, targetBookId: string): string;
60
+ export declare function formatImportCanonComplete(language: CliLanguage): string[];
61
+ export declare function formatListModelsEmpty(language: CliLanguage, service: string): string;
62
+ export declare function formatListModelsHeader(language: CliLanguage, service: string, count: number): string;
63
+ export declare function formatDoctorHintQuota(language: CliLanguage): string;
64
+ export declare function formatDoctorHintOpenAiProbeExhausted(language: CliLanguage): string;
65
+ export declare function formatDoctorHintBaseUrl(language: CliLanguage): string;
66
+ export declare function formatDoctorHintStreamRequirement(language: CliLanguage): string;
67
+ export declare function formatDoctorHintModelName(language: CliLanguage): string;
68
+ export declare function formatDoctorHintInvalidApiKey(language: CliLanguage): string;
69
+ export declare function formatFanficInvalidModeError(mode: string): string;
70
+ export declare function formatFanficSourceTooShortError(length: number): string;
71
+ export declare function formatFanficCanonMissingError(): string;
72
+ export declare function formatFanficSourceDirEmptyError(sourcePath: string): string;
73
+ export declare function formatChapterSyncNoChanges(language: CliLanguage, checked: number): string;
74
+ export declare function formatChapterSyncChange(language: CliLanguage, change: {
75
+ number: number;
76
+ title: string;
77
+ previousWordCount: number;
78
+ wordCount: number;
79
+ }, countingMode: "zh_chars" | "en_words"): string;
80
+ export declare function formatChapterSyncSummary(language: CliLanguage, changed: number, checked: number): string;
81
+ export declare function formatChapterSyncMissingFiles(language: CliLanguage, numbers: ReadonlyArray<number>): string;
82
+ export declare function formatChapterDeleteConfirm(language: CliLanguage, params: {
83
+ bookTitle: string;
84
+ bookId: string;
85
+ number: number;
86
+ title: string;
87
+ }): string;
88
+ export declare function formatChapterDeleteCancelled(language: CliLanguage): string;
89
+ export declare function formatChapterDeleteDone(language: CliLanguage, params: {
90
+ number: number;
91
+ title: string;
92
+ trashedFiles: ReadonlyArray<string>;
93
+ rolledBackTo: number;
94
+ }): string;
95
+ export declare function formatBookBackupCreated(language: CliLanguage, bookId: string, backupId: string): string;
96
+ export declare function formatBookBackupListEmpty(language: CliLanguage, bookId: string): string;
97
+ export declare function formatBookRestoreDone(language: CliLanguage, params: {
98
+ bookId: string;
99
+ backupId: string;
100
+ preRestoreBackupId: string | null;
101
+ }): string;
102
+ export {};
103
+ //# sourceMappingURL=localization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localization.d.ts","sourceRoot":"","sources":["../src/localization.ts"],"names":[],"mappings":"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"}