claude-novel-writer 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 (620) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/LICENSE +21 -0
  3. package/QUICKSTART.md +183 -0
  4. package/README.md +257 -0
  5. package/dist/ai/beat-generator.d.ts +79 -0
  6. package/dist/ai/beat-generator.d.ts.map +1 -0
  7. package/dist/ai/beat-generator.js +281 -0
  8. package/dist/ai/beat-generator.js.map +1 -0
  9. package/dist/ai/claude-client.d.ts +55 -0
  10. package/dist/ai/claude-client.d.ts.map +1 -0
  11. package/dist/ai/claude-client.js +78 -0
  12. package/dist/ai/claude-client.js.map +1 -0
  13. package/dist/ai/generation-manager.d.ts +216 -0
  14. package/dist/ai/generation-manager.d.ts.map +1 -0
  15. package/dist/ai/generation-manager.js +874 -0
  16. package/dist/ai/generation-manager.js.map +1 -0
  17. package/dist/analysis/copy-editor.d.ts +96 -0
  18. package/dist/analysis/copy-editor.d.ts.map +1 -0
  19. package/dist/analysis/copy-editor.js +335 -0
  20. package/dist/analysis/copy-editor.js.map +1 -0
  21. package/dist/analysis/developmental-analyzer.d.ts +83 -0
  22. package/dist/analysis/developmental-analyzer.d.ts.map +1 -0
  23. package/dist/analysis/developmental-analyzer.js +144 -0
  24. package/dist/analysis/developmental-analyzer.js.map +1 -0
  25. package/dist/analysis/draft-scanner.d.ts +49 -0
  26. package/dist/analysis/draft-scanner.d.ts.map +1 -0
  27. package/dist/analysis/draft-scanner.js +145 -0
  28. package/dist/analysis/draft-scanner.js.map +1 -0
  29. package/dist/analysis/pacing-analyzer.d.ts +55 -0
  30. package/dist/analysis/pacing-analyzer.d.ts.map +1 -0
  31. package/dist/analysis/pacing-analyzer.js +237 -0
  32. package/dist/analysis/pacing-analyzer.js.map +1 -0
  33. package/dist/analysis/prose-analyzer.d.ts +118 -0
  34. package/dist/analysis/prose-analyzer.d.ts.map +1 -0
  35. package/dist/analysis/prose-analyzer.js +600 -0
  36. package/dist/analysis/prose-analyzer.js.map +1 -0
  37. package/dist/analysis/read-aloud.d.ts +119 -0
  38. package/dist/analysis/read-aloud.d.ts.map +1 -0
  39. package/dist/analysis/read-aloud.js +248 -0
  40. package/dist/analysis/read-aloud.js.map +1 -0
  41. package/dist/bin.d.ts +12 -0
  42. package/dist/bin.d.ts.map +1 -0
  43. package/dist/bin.js +29 -0
  44. package/dist/bin.js.map +1 -0
  45. package/dist/builders/chapter-builder.d.ts +77 -0
  46. package/dist/builders/chapter-builder.d.ts.map +1 -0
  47. package/dist/builders/chapter-builder.js +375 -0
  48. package/dist/builders/chapter-builder.js.map +1 -0
  49. package/dist/builders/character-builder.d.ts +57 -0
  50. package/dist/builders/character-builder.d.ts.map +1 -0
  51. package/dist/builders/character-builder.js +370 -0
  52. package/dist/builders/character-builder.js.map +1 -0
  53. package/dist/builders/idea-builder.d.ts +70 -0
  54. package/dist/builders/idea-builder.d.ts.map +1 -0
  55. package/dist/builders/idea-builder.js +144 -0
  56. package/dist/builders/idea-builder.js.map +1 -0
  57. package/dist/builders/location-builder.d.ts +48 -0
  58. package/dist/builders/location-builder.d.ts.map +1 -0
  59. package/dist/builders/location-builder.js +215 -0
  60. package/dist/builders/location-builder.js.map +1 -0
  61. package/dist/builders/manuscript-assembler.d.ts +119 -0
  62. package/dist/builders/manuscript-assembler.d.ts.map +1 -0
  63. package/dist/builders/manuscript-assembler.js +347 -0
  64. package/dist/builders/manuscript-assembler.js.map +1 -0
  65. package/dist/builders/plot-builder.d.ts +35 -0
  66. package/dist/builders/plot-builder.d.ts.map +1 -0
  67. package/dist/builders/plot-builder.js +138 -0
  68. package/dist/builders/plot-builder.js.map +1 -0
  69. package/dist/builders/plot-thread-builder.d.ts +76 -0
  70. package/dist/builders/plot-thread-builder.d.ts.map +1 -0
  71. package/dist/builders/plot-thread-builder.js +234 -0
  72. package/dist/builders/plot-thread-builder.js.map +1 -0
  73. package/dist/builders/scene-builder.d.ts +109 -0
  74. package/dist/builders/scene-builder.d.ts.map +1 -0
  75. package/dist/builders/scene-builder.js +388 -0
  76. package/dist/builders/scene-builder.js.map +1 -0
  77. package/dist/builders/timeline-builder.d.ts +94 -0
  78. package/dist/builders/timeline-builder.d.ts.map +1 -0
  79. package/dist/builders/timeline-builder.js +261 -0
  80. package/dist/builders/timeline-builder.js.map +1 -0
  81. package/dist/builders/world-rules-builder.d.ts +90 -0
  82. package/dist/builders/world-rules-builder.d.ts.map +1 -0
  83. package/dist/builders/world-rules-builder.js +257 -0
  84. package/dist/builders/world-rules-builder.js.map +1 -0
  85. package/dist/cli/commands/analyze.d.ts +8 -0
  86. package/dist/cli/commands/analyze.d.ts.map +1 -0
  87. package/dist/cli/commands/analyze.js +191 -0
  88. package/dist/cli/commands/analyze.js.map +1 -0
  89. package/dist/cli/commands/beta.d.ts +8 -0
  90. package/dist/cli/commands/beta.d.ts.map +1 -0
  91. package/dist/cli/commands/beta.js +112 -0
  92. package/dist/cli/commands/beta.js.map +1 -0
  93. package/dist/cli/commands/canon.d.ts +6 -0
  94. package/dist/cli/commands/canon.d.ts.map +1 -0
  95. package/dist/cli/commands/canon.js +93 -0
  96. package/dist/cli/commands/canon.js.map +1 -0
  97. package/dist/cli/commands/chapter.d.ts +6 -0
  98. package/dist/cli/commands/chapter.d.ts.map +1 -0
  99. package/dist/cli/commands/chapter.js +104 -0
  100. package/dist/cli/commands/chapter.js.map +1 -0
  101. package/dist/cli/commands/character.d.ts +7 -0
  102. package/dist/cli/commands/character.d.ts.map +1 -0
  103. package/dist/cli/commands/character.js +147 -0
  104. package/dist/cli/commands/character.js.map +1 -0
  105. package/dist/cli/commands/check.d.ts +7 -0
  106. package/dist/cli/commands/check.d.ts.map +1 -0
  107. package/dist/cli/commands/check.js +105 -0
  108. package/dist/cli/commands/check.js.map +1 -0
  109. package/dist/cli/commands/context.d.ts +6 -0
  110. package/dist/cli/commands/context.d.ts.map +1 -0
  111. package/dist/cli/commands/context.js +73 -0
  112. package/dist/cli/commands/context.js.map +1 -0
  113. package/dist/cli/commands/create.d.ts +7 -0
  114. package/dist/cli/commands/create.d.ts.map +1 -0
  115. package/dist/cli/commands/create.js +295 -0
  116. package/dist/cli/commands/create.js.map +1 -0
  117. package/dist/cli/commands/draft.d.ts +6 -0
  118. package/dist/cli/commands/draft.d.ts.map +1 -0
  119. package/dist/cli/commands/draft.js +43 -0
  120. package/dist/cli/commands/draft.js.map +1 -0
  121. package/dist/cli/commands/export.d.ts +6 -0
  122. package/dist/cli/commands/export.d.ts.map +1 -0
  123. package/dist/cli/commands/export.js +117 -0
  124. package/dist/cli/commands/export.js.map +1 -0
  125. package/dist/cli/commands/foreshadow.d.ts +9 -0
  126. package/dist/cli/commands/foreshadow.d.ts.map +1 -0
  127. package/dist/cli/commands/foreshadow.js +78 -0
  128. package/dist/cli/commands/foreshadow.js.map +1 -0
  129. package/dist/cli/commands/generate.d.ts +6 -0
  130. package/dist/cli/commands/generate.d.ts.map +1 -0
  131. package/dist/cli/commands/generate.js +264 -0
  132. package/dist/cli/commands/generate.js.map +1 -0
  133. package/dist/cli/commands/graph.d.ts +6 -0
  134. package/dist/cli/commands/graph.d.ts.map +1 -0
  135. package/dist/cli/commands/graph.js +68 -0
  136. package/dist/cli/commands/graph.js.map +1 -0
  137. package/dist/cli/commands/help.d.ts +6 -0
  138. package/dist/cli/commands/help.d.ts.map +1 -0
  139. package/dist/cli/commands/help.js +16 -0
  140. package/dist/cli/commands/help.js.map +1 -0
  141. package/dist/cli/commands/idea.d.ts +6 -0
  142. package/dist/cli/commands/idea.d.ts.map +1 -0
  143. package/dist/cli/commands/idea.js +126 -0
  144. package/dist/cli/commands/idea.js.map +1 -0
  145. package/dist/cli/commands/init.d.ts +7 -0
  146. package/dist/cli/commands/init.d.ts.map +1 -0
  147. package/dist/cli/commands/init.js +78 -0
  148. package/dist/cli/commands/init.js.map +1 -0
  149. package/dist/cli/commands/knowledge.d.ts +6 -0
  150. package/dist/cli/commands/knowledge.d.ts.map +1 -0
  151. package/dist/cli/commands/knowledge.js +68 -0
  152. package/dist/cli/commands/knowledge.js.map +1 -0
  153. package/dist/cli/commands/list.d.ts +7 -0
  154. package/dist/cli/commands/list.d.ts.map +1 -0
  155. package/dist/cli/commands/list.js +181 -0
  156. package/dist/cli/commands/list.js.map +1 -0
  157. package/dist/cli/commands/location.d.ts +7 -0
  158. package/dist/cli/commands/location.d.ts.map +1 -0
  159. package/dist/cli/commands/location.js +97 -0
  160. package/dist/cli/commands/location.js.map +1 -0
  161. package/dist/cli/commands/plot.d.ts +6 -0
  162. package/dist/cli/commands/plot.d.ts.map +1 -0
  163. package/dist/cli/commands/plot.js +132 -0
  164. package/dist/cli/commands/plot.js.map +1 -0
  165. package/dist/cli/commands/promise.d.ts +6 -0
  166. package/dist/cli/commands/promise.d.ts.map +1 -0
  167. package/dist/cli/commands/promise.js +100 -0
  168. package/dist/cli/commands/promise.js.map +1 -0
  169. package/dist/cli/commands/query.d.ts +8 -0
  170. package/dist/cli/commands/query.d.ts.map +1 -0
  171. package/dist/cli/commands/query.js +108 -0
  172. package/dist/cli/commands/query.js.map +1 -0
  173. package/dist/cli/commands/research.d.ts +8 -0
  174. package/dist/cli/commands/research.d.ts.map +1 -0
  175. package/dist/cli/commands/research.js +105 -0
  176. package/dist/cli/commands/research.js.map +1 -0
  177. package/dist/cli/commands/revision.d.ts +7 -0
  178. package/dist/cli/commands/revision.d.ts.map +1 -0
  179. package/dist/cli/commands/revision.js +74 -0
  180. package/dist/cli/commands/revision.js.map +1 -0
  181. package/dist/cli/commands/scene.d.ts +7 -0
  182. package/dist/cli/commands/scene.d.ts.map +1 -0
  183. package/dist/cli/commands/scene.js +160 -0
  184. package/dist/cli/commands/scene.js.map +1 -0
  185. package/dist/cli/commands/series.d.ts +8 -0
  186. package/dist/cli/commands/series.d.ts.map +1 -0
  187. package/dist/cli/commands/series.js +130 -0
  188. package/dist/cli/commands/series.js.map +1 -0
  189. package/dist/cli/commands/session.d.ts +8 -0
  190. package/dist/cli/commands/session.d.ts.map +1 -0
  191. package/dist/cli/commands/session.js +129 -0
  192. package/dist/cli/commands/session.js.map +1 -0
  193. package/dist/cli/commands/sync.d.ts +7 -0
  194. package/dist/cli/commands/sync.d.ts.map +1 -0
  195. package/dist/cli/commands/sync.js +87 -0
  196. package/dist/cli/commands/sync.js.map +1 -0
  197. package/dist/cli/commands/timeline.d.ts +7 -0
  198. package/dist/cli/commands/timeline.d.ts.map +1 -0
  199. package/dist/cli/commands/timeline.js +219 -0
  200. package/dist/cli/commands/timeline.js.map +1 -0
  201. package/dist/cli/commands/world-rule.d.ts +6 -0
  202. package/dist/cli/commands/world-rule.d.ts.map +1 -0
  203. package/dist/cli/commands/world-rule.js +160 -0
  204. package/dist/cli/commands/world-rule.js.map +1 -0
  205. package/dist/cli/handlers/analyze-handler.d.ts +8 -0
  206. package/dist/cli/handlers/analyze-handler.d.ts.map +1 -0
  207. package/dist/cli/handlers/analyze-handler.js +754 -0
  208. package/dist/cli/handlers/analyze-handler.js.map +1 -0
  209. package/dist/cli/handlers/beta-handler.d.ts +13 -0
  210. package/dist/cli/handlers/beta-handler.d.ts.map +1 -0
  211. package/dist/cli/handlers/beta-handler.js +236 -0
  212. package/dist/cli/handlers/beta-handler.js.map +1 -0
  213. package/dist/cli/handlers/canon-handler.d.ts +16 -0
  214. package/dist/cli/handlers/canon-handler.d.ts.map +1 -0
  215. package/dist/cli/handlers/canon-handler.js +214 -0
  216. package/dist/cli/handlers/canon-handler.js.map +1 -0
  217. package/dist/cli/handlers/chapter-handler.d.ts +7 -0
  218. package/dist/cli/handlers/chapter-handler.d.ts.map +1 -0
  219. package/dist/cli/handlers/chapter-handler.js +280 -0
  220. package/dist/cli/handlers/chapter-handler.js.map +1 -0
  221. package/dist/cli/handlers/character-handler.d.ts +8 -0
  222. package/dist/cli/handlers/character-handler.d.ts.map +1 -0
  223. package/dist/cli/handlers/character-handler.js +604 -0
  224. package/dist/cli/handlers/character-handler.js.map +1 -0
  225. package/dist/cli/handlers/check-handler.d.ts +7 -0
  226. package/dist/cli/handlers/check-handler.d.ts.map +1 -0
  227. package/dist/cli/handlers/check-handler.js +416 -0
  228. package/dist/cli/handlers/check-handler.js.map +1 -0
  229. package/dist/cli/handlers/context-handler.d.ts +16 -0
  230. package/dist/cli/handlers/context-handler.d.ts.map +1 -0
  231. package/dist/cli/handlers/context-handler.js +122 -0
  232. package/dist/cli/handlers/context-handler.js.map +1 -0
  233. package/dist/cli/handlers/craft-handler.d.ts +22 -0
  234. package/dist/cli/handlers/craft-handler.d.ts.map +1 -0
  235. package/dist/cli/handlers/craft-handler.js +44 -0
  236. package/dist/cli/handlers/craft-handler.js.map +1 -0
  237. package/dist/cli/handlers/create-handler.d.ts +22 -0
  238. package/dist/cli/handlers/create-handler.d.ts.map +1 -0
  239. package/dist/cli/handlers/create-handler.js +386 -0
  240. package/dist/cli/handlers/create-handler.js.map +1 -0
  241. package/dist/cli/handlers/draft-handler.d.ts +17 -0
  242. package/dist/cli/handlers/draft-handler.d.ts.map +1 -0
  243. package/dist/cli/handlers/draft-handler.js +91 -0
  244. package/dist/cli/handlers/draft-handler.js.map +1 -0
  245. package/dist/cli/handlers/export-handler.d.ts +7 -0
  246. package/dist/cli/handlers/export-handler.d.ts.map +1 -0
  247. package/dist/cli/handlers/export-handler.js +179 -0
  248. package/dist/cli/handlers/export-handler.js.map +1 -0
  249. package/dist/cli/handlers/foreshadow-handler.d.ts +8 -0
  250. package/dist/cli/handlers/foreshadow-handler.d.ts.map +1 -0
  251. package/dist/cli/handlers/foreshadow-handler.js +132 -0
  252. package/dist/cli/handlers/foreshadow-handler.js.map +1 -0
  253. package/dist/cli/handlers/generate-handler.d.ts +7 -0
  254. package/dist/cli/handlers/generate-handler.d.ts.map +1 -0
  255. package/dist/cli/handlers/generate-handler.js +500 -0
  256. package/dist/cli/handlers/generate-handler.js.map +1 -0
  257. package/dist/cli/handlers/graph-handler.d.ts +16 -0
  258. package/dist/cli/handlers/graph-handler.d.ts.map +1 -0
  259. package/dist/cli/handlers/graph-handler.js +149 -0
  260. package/dist/cli/handlers/graph-handler.js.map +1 -0
  261. package/dist/cli/handlers/help-handler.d.ts +14 -0
  262. package/dist/cli/handlers/help-handler.d.ts.map +1 -0
  263. package/dist/cli/handlers/help-handler.js +59 -0
  264. package/dist/cli/handlers/help-handler.js.map +1 -0
  265. package/dist/cli/handlers/idea-handler.d.ts +16 -0
  266. package/dist/cli/handlers/idea-handler.d.ts.map +1 -0
  267. package/dist/cli/handlers/idea-handler.js +256 -0
  268. package/dist/cli/handlers/idea-handler.js.map +1 -0
  269. package/dist/cli/handlers/init-handler.d.ts +6 -0
  270. package/dist/cli/handlers/init-handler.d.ts.map +1 -0
  271. package/dist/cli/handlers/init-handler.js +228 -0
  272. package/dist/cli/handlers/init-handler.js.map +1 -0
  273. package/dist/cli/handlers/knowledge-handler.d.ts +16 -0
  274. package/dist/cli/handlers/knowledge-handler.d.ts.map +1 -0
  275. package/dist/cli/handlers/knowledge-handler.js +142 -0
  276. package/dist/cli/handlers/knowledge-handler.js.map +1 -0
  277. package/dist/cli/handlers/list-handler.d.ts +26 -0
  278. package/dist/cli/handlers/list-handler.d.ts.map +1 -0
  279. package/dist/cli/handlers/list-handler.js +381 -0
  280. package/dist/cli/handlers/list-handler.js.map +1 -0
  281. package/dist/cli/handlers/location-handler.d.ts +7 -0
  282. package/dist/cli/handlers/location-handler.d.ts.map +1 -0
  283. package/dist/cli/handlers/location-handler.js +392 -0
  284. package/dist/cli/handlers/location-handler.js.map +1 -0
  285. package/dist/cli/handlers/plot-handler.d.ts +8 -0
  286. package/dist/cli/handlers/plot-handler.d.ts.map +1 -0
  287. package/dist/cli/handlers/plot-handler.js +528 -0
  288. package/dist/cli/handlers/plot-handler.js.map +1 -0
  289. package/dist/cli/handlers/promise-handler.d.ts +16 -0
  290. package/dist/cli/handlers/promise-handler.d.ts.map +1 -0
  291. package/dist/cli/handlers/promise-handler.js +206 -0
  292. package/dist/cli/handlers/promise-handler.js.map +1 -0
  293. package/dist/cli/handlers/query-handler.d.ts +13 -0
  294. package/dist/cli/handlers/query-handler.d.ts.map +1 -0
  295. package/dist/cli/handlers/query-handler.js +245 -0
  296. package/dist/cli/handlers/query-handler.js.map +1 -0
  297. package/dist/cli/handlers/research-handler.d.ts +13 -0
  298. package/dist/cli/handlers/research-handler.d.ts.map +1 -0
  299. package/dist/cli/handlers/research-handler.js +216 -0
  300. package/dist/cli/handlers/research-handler.js.map +1 -0
  301. package/dist/cli/handlers/revision-handler.d.ts +14 -0
  302. package/dist/cli/handlers/revision-handler.d.ts.map +1 -0
  303. package/dist/cli/handlers/revision-handler.js +188 -0
  304. package/dist/cli/handlers/revision-handler.js.map +1 -0
  305. package/dist/cli/handlers/scene-handler.d.ts +7 -0
  306. package/dist/cli/handlers/scene-handler.d.ts.map +1 -0
  307. package/dist/cli/handlers/scene-handler.js +565 -0
  308. package/dist/cli/handlers/scene-handler.js.map +1 -0
  309. package/dist/cli/handlers/series-handler.d.ts +13 -0
  310. package/dist/cli/handlers/series-handler.d.ts.map +1 -0
  311. package/dist/cli/handlers/series-handler.js +322 -0
  312. package/dist/cli/handlers/series-handler.js.map +1 -0
  313. package/dist/cli/handlers/session-handler.d.ts +7 -0
  314. package/dist/cli/handlers/session-handler.d.ts.map +1 -0
  315. package/dist/cli/handlers/session-handler.js +400 -0
  316. package/dist/cli/handlers/session-handler.js.map +1 -0
  317. package/dist/cli/handlers/sync-handler.d.ts +41 -0
  318. package/dist/cli/handlers/sync-handler.d.ts.map +1 -0
  319. package/dist/cli/handlers/sync-handler.js +573 -0
  320. package/dist/cli/handlers/sync-handler.js.map +1 -0
  321. package/dist/cli/handlers/timeline-handler.d.ts +7 -0
  322. package/dist/cli/handlers/timeline-handler.d.ts.map +1 -0
  323. package/dist/cli/handlers/timeline-handler.js +364 -0
  324. package/dist/cli/handlers/timeline-handler.js.map +1 -0
  325. package/dist/cli/handlers/world-rule-handler.d.ts +8 -0
  326. package/dist/cli/handlers/world-rule-handler.d.ts.map +1 -0
  327. package/dist/cli/handlers/world-rule-handler.js +521 -0
  328. package/dist/cli/handlers/world-rule-handler.js.map +1 -0
  329. package/dist/cli/index.d.ts +55 -0
  330. package/dist/cli/index.d.ts.map +1 -0
  331. package/dist/cli/index.js +253 -0
  332. package/dist/cli/index.js.map +1 -0
  333. package/dist/cli/output.d.ts +72 -0
  334. package/dist/cli/output.d.ts.map +1 -0
  335. package/dist/cli/output.js +134 -0
  336. package/dist/cli/output.js.map +1 -0
  337. package/dist/cli/parser.d.ts +57 -0
  338. package/dist/cli/parser.d.ts.map +1 -0
  339. package/dist/cli/parser.js +333 -0
  340. package/dist/cli/parser.js.map +1 -0
  341. package/dist/cli/registry.d.ts +40 -0
  342. package/dist/cli/registry.d.ts.map +1 -0
  343. package/dist/cli/registry.js +196 -0
  344. package/dist/cli/registry.js.map +1 -0
  345. package/dist/cli/types.d.ts +71 -0
  346. package/dist/cli/types.d.ts.map +1 -0
  347. package/dist/cli/types.js +5 -0
  348. package/dist/cli/types.js.map +1 -0
  349. package/dist/commands/index.d.ts +6 -0
  350. package/dist/commands/index.d.ts.map +1 -0
  351. package/dist/commands/index.js +11 -0
  352. package/dist/commands/index.js.map +1 -0
  353. package/dist/commands/novel.d.ts +13 -0
  354. package/dist/commands/novel.d.ts.map +1 -0
  355. package/dist/commands/novel.js +17 -0
  356. package/dist/commands/novel.js.map +1 -0
  357. package/dist/consistency/checker.d.ts +80 -0
  358. package/dist/consistency/checker.d.ts.map +1 -0
  359. package/dist/consistency/checker.js +493 -0
  360. package/dist/consistency/checker.js.map +1 -0
  361. package/dist/context/contracts/continuity-check.contract.d.ts +3 -0
  362. package/dist/context/contracts/continuity-check.contract.d.ts.map +1 -0
  363. package/dist/context/contracts/continuity-check.contract.js +22 -0
  364. package/dist/context/contracts/continuity-check.contract.js.map +1 -0
  365. package/dist/context/contracts/developmental-edit.contract.d.ts +3 -0
  366. package/dist/context/contracts/developmental-edit.contract.d.ts.map +1 -0
  367. package/dist/context/contracts/developmental-edit.contract.js +22 -0
  368. package/dist/context/contracts/developmental-edit.contract.js.map +1 -0
  369. package/dist/context/contracts/scene-continuation.contract.d.ts +3 -0
  370. package/dist/context/contracts/scene-continuation.contract.d.ts.map +1 -0
  371. package/dist/context/contracts/scene-continuation.contract.js +22 -0
  372. package/dist/context/contracts/scene-continuation.contract.js.map +1 -0
  373. package/dist/context/fetchers/canon-fetcher.d.ts +21 -0
  374. package/dist/context/fetchers/canon-fetcher.d.ts.map +1 -0
  375. package/dist/context/fetchers/canon-fetcher.js +64 -0
  376. package/dist/context/fetchers/canon-fetcher.js.map +1 -0
  377. package/dist/context/fetchers/character-fetcher.d.ts +18 -0
  378. package/dist/context/fetchers/character-fetcher.d.ts.map +1 -0
  379. package/dist/context/fetchers/character-fetcher.js +62 -0
  380. package/dist/context/fetchers/character-fetcher.js.map +1 -0
  381. package/dist/context/fetchers/fetcher.d.ts +13 -0
  382. package/dist/context/fetchers/fetcher.d.ts.map +1 -0
  383. package/dist/context/fetchers/fetcher.js +2 -0
  384. package/dist/context/fetchers/fetcher.js.map +1 -0
  385. package/dist/context/fetchers/promise-fetcher.d.ts +19 -0
  386. package/dist/context/fetchers/promise-fetcher.d.ts.map +1 -0
  387. package/dist/context/fetchers/promise-fetcher.js +59 -0
  388. package/dist/context/fetchers/promise-fetcher.js.map +1 -0
  389. package/dist/context/fetchers/scene-fetcher.d.ts +19 -0
  390. package/dist/context/fetchers/scene-fetcher.d.ts.map +1 -0
  391. package/dist/context/fetchers/scene-fetcher.js +75 -0
  392. package/dist/context/fetchers/scene-fetcher.js.map +1 -0
  393. package/dist/context/fingerprint.d.ts +13 -0
  394. package/dist/context/fingerprint.d.ts.map +1 -0
  395. package/dist/context/fingerprint.js +21 -0
  396. package/dist/context/fingerprint.js.map +1 -0
  397. package/dist/context/ordering.d.ts +10 -0
  398. package/dist/context/ordering.d.ts.map +1 -0
  399. package/dist/context/ordering.js +42 -0
  400. package/dist/context/ordering.js.map +1 -0
  401. package/dist/context/scene-context.d.ts +83 -0
  402. package/dist/context/scene-context.d.ts.map +1 -0
  403. package/dist/context/scene-context.js +323 -0
  404. package/dist/context/scene-context.js.map +1 -0
  405. package/dist/context/scoring.d.ts +14 -0
  406. package/dist/context/scoring.d.ts.map +1 -0
  407. package/dist/context/scoring.js +30 -0
  408. package/dist/context/scoring.js.map +1 -0
  409. package/dist/context/token-budget.d.ts +27 -0
  410. package/dist/context/token-budget.d.ts.map +1 -0
  411. package/dist/context/token-budget.js +83 -0
  412. package/dist/context/token-budget.js.map +1 -0
  413. package/dist/core/database.d.ts +108 -0
  414. package/dist/core/database.d.ts.map +1 -0
  415. package/dist/core/database.js +282 -0
  416. package/dist/core/database.js.map +1 -0
  417. package/dist/data/features.d.ts +14 -0
  418. package/dist/data/features.d.ts.map +1 -0
  419. package/dist/data/features.js +2 -0
  420. package/dist/data/features.js.map +1 -0
  421. package/dist/db/migrations.d.ts +21 -0
  422. package/dist/db/migrations.d.ts.map +1 -0
  423. package/dist/db/migrations.js +397 -0
  424. package/dist/db/migrations.js.map +1 -0
  425. package/dist/db/repositories/canon-repository.d.ts +18 -0
  426. package/dist/db/repositories/canon-repository.d.ts.map +1 -0
  427. package/dist/db/repositories/canon-repository.js +158 -0
  428. package/dist/db/repositories/canon-repository.js.map +1 -0
  429. package/dist/db/repositories/graph-repository.d.ts +19 -0
  430. package/dist/db/repositories/graph-repository.d.ts.map +1 -0
  431. package/dist/db/repositories/graph-repository.js +128 -0
  432. package/dist/db/repositories/graph-repository.js.map +1 -0
  433. package/dist/db/repositories/knowledge-repository.d.ts +20 -0
  434. package/dist/db/repositories/knowledge-repository.d.ts.map +1 -0
  435. package/dist/db/repositories/knowledge-repository.js +177 -0
  436. package/dist/db/repositories/knowledge-repository.js.map +1 -0
  437. package/dist/db/repositories/promise-repository.d.ts +15 -0
  438. package/dist/db/repositories/promise-repository.d.ts.map +1 -0
  439. package/dist/db/repositories/promise-repository.js +140 -0
  440. package/dist/db/repositories/promise-repository.js.map +1 -0
  441. package/dist/db/repositories/research-repository.d.ts +40 -0
  442. package/dist/db/repositories/research-repository.d.ts.map +1 -0
  443. package/dist/db/repositories/research-repository.js +132 -0
  444. package/dist/db/repositories/research-repository.js.map +1 -0
  445. package/dist/db/repositories/sync-state-repository.d.ts +39 -0
  446. package/dist/db/repositories/sync-state-repository.d.ts.map +1 -0
  447. package/dist/db/repositories/sync-state-repository.js +71 -0
  448. package/dist/db/repositories/sync-state-repository.js.map +1 -0
  449. package/dist/index.d.ts +319 -0
  450. package/dist/index.d.ts.map +1 -0
  451. package/dist/index.js +482 -0
  452. package/dist/index.js.map +1 -0
  453. package/dist/revision/snapshot-manager.d.ts +81 -0
  454. package/dist/revision/snapshot-manager.d.ts.map +1 -0
  455. package/dist/revision/snapshot-manager.js +267 -0
  456. package/dist/revision/snapshot-manager.js.map +1 -0
  457. package/dist/services/beta-reader-service.d.ts +64 -0
  458. package/dist/services/beta-reader-service.d.ts.map +1 -0
  459. package/dist/services/beta-reader-service.js +233 -0
  460. package/dist/services/beta-reader-service.js.map +1 -0
  461. package/dist/services/canon-service.d.ts +40 -0
  462. package/dist/services/canon-service.d.ts.map +1 -0
  463. package/dist/services/canon-service.js +126 -0
  464. package/dist/services/canon-service.js.map +1 -0
  465. package/dist/services/character-arc-service.d.ts +60 -0
  466. package/dist/services/character-arc-service.d.ts.map +1 -0
  467. package/dist/services/character-arc-service.js +161 -0
  468. package/dist/services/character-arc-service.js.map +1 -0
  469. package/dist/services/context-contract-service.d.ts +14 -0
  470. package/dist/services/context-contract-service.d.ts.map +1 -0
  471. package/dist/services/context-contract-service.js +57 -0
  472. package/dist/services/context-contract-service.js.map +1 -0
  473. package/dist/services/context-policy-engine.d.ts +27 -0
  474. package/dist/services/context-policy-engine.d.ts.map +1 -0
  475. package/dist/services/context-policy-engine.js +105 -0
  476. package/dist/services/context-policy-engine.js.map +1 -0
  477. package/dist/services/foreshadowing-service.d.ts +60 -0
  478. package/dist/services/foreshadowing-service.d.ts.map +1 -0
  479. package/dist/services/foreshadowing-service.js +136 -0
  480. package/dist/services/foreshadowing-service.js.map +1 -0
  481. package/dist/services/knowledge-service.d.ts +23 -0
  482. package/dist/services/knowledge-service.d.ts.map +1 -0
  483. package/dist/services/knowledge-service.js +97 -0
  484. package/dist/services/knowledge-service.js.map +1 -0
  485. package/dist/services/narrative-graph-service.d.ts +30 -0
  486. package/dist/services/narrative-graph-service.d.ts.map +1 -0
  487. package/dist/services/narrative-graph-service.js +125 -0
  488. package/dist/services/narrative-graph-service.js.map +1 -0
  489. package/dist/services/promise-service.d.ts +23 -0
  490. package/dist/services/promise-service.d.ts.map +1 -0
  491. package/dist/services/promise-service.js +140 -0
  492. package/dist/services/promise-service.js.map +1 -0
  493. package/dist/services/query-tracker-service.d.ts +96 -0
  494. package/dist/services/query-tracker-service.d.ts.map +1 -0
  495. package/dist/services/query-tracker-service.js +278 -0
  496. package/dist/services/query-tracker-service.js.map +1 -0
  497. package/dist/services/research-service.d.ts +63 -0
  498. package/dist/services/research-service.d.ts.map +1 -0
  499. package/dist/services/research-service.js +149 -0
  500. package/dist/services/research-service.js.map +1 -0
  501. package/dist/services/series-manager.d.ts +129 -0
  502. package/dist/services/series-manager.d.ts.map +1 -0
  503. package/dist/services/series-manager.js +250 -0
  504. package/dist/services/series-manager.js.map +1 -0
  505. package/dist/session/progress-dashboard.d.ts +78 -0
  506. package/dist/session/progress-dashboard.d.ts.map +1 -0
  507. package/dist/session/progress-dashboard.js +315 -0
  508. package/dist/session/progress-dashboard.js.map +1 -0
  509. package/dist/session/session-manager.d.ts +142 -0
  510. package/dist/session/session-manager.d.ts.map +1 -0
  511. package/dist/session/session-manager.js +509 -0
  512. package/dist/session/session-manager.js.map +1 -0
  513. package/dist/sync/chapter-sync.d.ts +60 -0
  514. package/dist/sync/chapter-sync.d.ts.map +1 -0
  515. package/dist/sync/chapter-sync.js +279 -0
  516. package/dist/sync/chapter-sync.js.map +1 -0
  517. package/dist/sync/character-sync.d.ts +67 -0
  518. package/dist/sync/character-sync.d.ts.map +1 -0
  519. package/dist/sync/character-sync.js +405 -0
  520. package/dist/sync/character-sync.js.map +1 -0
  521. package/dist/sync/idea-sync.d.ts +34 -0
  522. package/dist/sync/idea-sync.d.ts.map +1 -0
  523. package/dist/sync/idea-sync.js +101 -0
  524. package/dist/sync/idea-sync.js.map +1 -0
  525. package/dist/sync/location-sync.d.ts +44 -0
  526. package/dist/sync/location-sync.d.ts.map +1 -0
  527. package/dist/sync/location-sync.js +188 -0
  528. package/dist/sync/location-sync.js.map +1 -0
  529. package/dist/sync/plot-sync.d.ts +27 -0
  530. package/dist/sync/plot-sync.d.ts.map +1 -0
  531. package/dist/sync/plot-sync.js +171 -0
  532. package/dist/sync/plot-sync.js.map +1 -0
  533. package/dist/sync/plot-thread-sync.d.ts +90 -0
  534. package/dist/sync/plot-thread-sync.d.ts.map +1 -0
  535. package/dist/sync/plot-thread-sync.js +384 -0
  536. package/dist/sync/plot-thread-sync.js.map +1 -0
  537. package/dist/sync/scene-sync.d.ts +93 -0
  538. package/dist/sync/scene-sync.d.ts.map +1 -0
  539. package/dist/sync/scene-sync.js +353 -0
  540. package/dist/sync/scene-sync.js.map +1 -0
  541. package/dist/sync/timeline-sync.d.ts +48 -0
  542. package/dist/sync/timeline-sync.d.ts.map +1 -0
  543. package/dist/sync/timeline-sync.js +232 -0
  544. package/dist/sync/timeline-sync.js.map +1 -0
  545. package/dist/sync/world-rules-sync.d.ts +78 -0
  546. package/dist/sync/world-rules-sync.d.ts.map +1 -0
  547. package/dist/sync/world-rules-sync.js +318 -0
  548. package/dist/sync/world-rules-sync.js.map +1 -0
  549. package/dist/types/canon.d.ts +43 -0
  550. package/dist/types/canon.d.ts.map +1 -0
  551. package/dist/types/canon.js +2 -0
  552. package/dist/types/canon.js.map +1 -0
  553. package/dist/types/common.d.ts +11 -0
  554. package/dist/types/common.d.ts.map +1 -0
  555. package/dist/types/common.js +2 -0
  556. package/dist/types/common.js.map +1 -0
  557. package/dist/types/context.d.ts +69 -0
  558. package/dist/types/context.d.ts.map +1 -0
  559. package/dist/types/context.js +2 -0
  560. package/dist/types/context.js.map +1 -0
  561. package/dist/types/errors.d.ts +24 -0
  562. package/dist/types/errors.d.ts.map +1 -0
  563. package/dist/types/errors.js +37 -0
  564. package/dist/types/errors.js.map +1 -0
  565. package/dist/types/graph.d.ts +25 -0
  566. package/dist/types/graph.d.ts.map +1 -0
  567. package/dist/types/graph.js +2 -0
  568. package/dist/types/graph.js.map +1 -0
  569. package/dist/types/index.d.ts +9 -0
  570. package/dist/types/index.d.ts.map +1 -0
  571. package/dist/types/index.js +9 -0
  572. package/dist/types/index.js.map +1 -0
  573. package/dist/types/knowledge.d.ts +20 -0
  574. package/dist/types/knowledge.d.ts.map +1 -0
  575. package/dist/types/knowledge.js +2 -0
  576. package/dist/types/knowledge.js.map +1 -0
  577. package/dist/types/novel.d.ts +477 -0
  578. package/dist/types/novel.d.ts.map +1 -0
  579. package/dist/types/novel.js +22 -0
  580. package/dist/types/novel.js.map +1 -0
  581. package/dist/types/promise.d.ts +42 -0
  582. package/dist/types/promise.d.ts.map +1 -0
  583. package/dist/types/promise.js +2 -0
  584. package/dist/types/promise.js.map +1 -0
  585. package/dist/types/story-location.d.ts +7 -0
  586. package/dist/types/story-location.d.ts.map +1 -0
  587. package/dist/types/story-location.js +2 -0
  588. package/dist/types/story-location.js.map +1 -0
  589. package/dist/utils/hash.d.ts +2 -0
  590. package/dist/utils/hash.d.ts.map +1 -0
  591. package/dist/utils/hash.js +5 -0
  592. package/dist/utils/hash.js.map +1 -0
  593. package/dist/utils/ids.d.ts +3 -0
  594. package/dist/utils/ids.d.ts.map +1 -0
  595. package/dist/utils/ids.js +8 -0
  596. package/dist/utils/ids.js.map +1 -0
  597. package/dist/utils/stable-json.d.ts +2 -0
  598. package/dist/utils/stable-json.d.ts.map +1 -0
  599. package/dist/utils/stable-json.js +12 -0
  600. package/dist/utils/stable-json.js.map +1 -0
  601. package/dist/utils/token-count.d.ts +2 -0
  602. package/dist/utils/token-count.d.ts.map +1 -0
  603. package/dist/utils/token-count.js +4 -0
  604. package/dist/utils/token-count.js.map +1 -0
  605. package/examples/character-template.yml +92 -0
  606. package/examples/interactive-builder-example.ts +134 -0
  607. package/examples/location-template.yml +39 -0
  608. package/examples/usage-example.ts +182 -0
  609. package/mcp-server/README.md +470 -0
  610. package/mcp-server/launch.js +69 -0
  611. package/mcp-server/novel-tools/README.md +242 -0
  612. package/mcp-server/novel-tools/dist/handlers.d.ts +42 -0
  613. package/mcp-server/novel-tools/dist/handlers.js +820 -0
  614. package/mcp-server/novel-tools/dist/index.d.ts +6 -0
  615. package/mcp-server/novel-tools/dist/index.js +124 -0
  616. package/mcp-server/novel-tools/dist/tools.d.ts +852 -0
  617. package/mcp-server/novel-tools/dist/tools.js +898 -0
  618. package/mcp-server/novel-tools/package.json +22 -0
  619. package/package.json +212 -0
  620. package/schema.sql +567 -0
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Scene Beat Generator
3
+ *
4
+ * Assembles scene context from the database and calls Claude to generate
5
+ * free-form narrative beats for a scene — the micro-structure of what happens
6
+ * beat by beat within a single scene.
7
+ *
8
+ * Philosophy: beats are planning scaffolding, not prose. They help the author
9
+ * see the shape of the scene before writing it. "Suggest, don't dictate."
10
+ */
11
+ import { ClaudeClient, PassthroughClaudeClient } from './claude-client.js';
12
+ export class BeatGenerator {
13
+ mcpClient;
14
+ projectId;
15
+ claude;
16
+ constructor(mcpClient, projectId) {
17
+ this.mcpClient = mcpClient;
18
+ this.projectId = projectId;
19
+ this.claude = ClaudeClient.isConfigured()
20
+ ? new ClaudeClient()
21
+ : new PassthroughClaudeClient();
22
+ }
23
+ /**
24
+ * Build the beat-generation prompt without calling the API.
25
+ * Useful for surfacing context to the active Claude Code session.
26
+ */
27
+ async buildBeatPrompt(sceneMetadata, chapterNumber, count = 5) {
28
+ const ctx = await this.assembleContext(sceneMetadata, chapterNumber);
29
+ return this.buildPrompt(ctx, count);
30
+ }
31
+ /**
32
+ * Generate beats for a scene from its metadata and DB context.
33
+ * Does not require the scene to have prose — works from planning data alone.
34
+ *
35
+ * Returns an empty array when running in passthrough mode (no standalone API
36
+ * key). The caller should display the assembled prompt so the active Claude
37
+ * Code session can generate beats and write them back.
38
+ */
39
+ async generateBeats(sceneMetadata, chapterNumber, options = {}) {
40
+ const count = options.count ?? 5;
41
+ const ctx = await this.assembleContext(sceneMetadata, chapterNumber);
42
+ const prompt = this.buildPrompt(ctx, count);
43
+ const response = await this.claude.generateStructured(prompt, {
44
+ temperature: 0.8,
45
+ maxTokens: 1024,
46
+ systemPrompt: 'You are a story structure assistant helping a novelist plan scene beats. ' +
47
+ 'Write concise, concrete, specific beats — not vague summaries. ' +
48
+ 'Each beat is one focused narrative unit: an action, a revelation, a decision, or a shift in understanding. ' +
49
+ 'Return ONLY the numbered list, nothing else.',
50
+ });
51
+ // Passthrough mode: no standalone API key configured — the prompt has been
52
+ // emitted to stdout for the active Claude Code session to handle. Return a
53
+ // sentinel so the CLI handler can print the context and wait for the agent
54
+ // to supply beats rather than trying to parse the raw prompt text as beats.
55
+ if (response.passthrough) {
56
+ return [];
57
+ }
58
+ return this.parseBeats(response.content);
59
+ }
60
+ // ============================================================
61
+ // CONTEXT ASSEMBLY
62
+ // ============================================================
63
+ async assembleContext(scene, chapterNumber) {
64
+ const [project, chapterRow, threads, rules, previousSceneBeat] = await Promise.all([
65
+ this.loadProject(),
66
+ this.loadChapter(chapterNumber),
67
+ this.loadActivePlotThreads(),
68
+ this.loadHardWorldRules(),
69
+ this.loadPreviousSceneLastBeat(chapterNumber, scene.sceneNumber),
70
+ ]);
71
+ const povCharacter = scene.pov
72
+ ? await this.loadCharacter(scene.pov)
73
+ : undefined;
74
+ return {
75
+ projectTitle: project?.title ?? 'Untitled',
76
+ projectGenre: project?.genre,
77
+ chapterNumber,
78
+ chapterTitle: chapterRow?.title,
79
+ chapterSummary: chapterRow?.summary,
80
+ scene,
81
+ povCharacter,
82
+ activePlotThreads: threads,
83
+ hardWorldRules: rules,
84
+ previousSceneLastBeat: previousSceneBeat,
85
+ };
86
+ }
87
+ async loadProject() {
88
+ try {
89
+ const rows = await this.mcpClient.readQuery('SELECT title, genre FROM projects WHERE id = ? LIMIT 1', [this.projectId]);
90
+ return rows[0];
91
+ }
92
+ catch {
93
+ return undefined;
94
+ }
95
+ }
96
+ async loadChapter(chapterNumber) {
97
+ try {
98
+ const rows = await this.mcpClient.readQuery('SELECT title, summary FROM chapters WHERE project_id = ? AND chapter_number = ? LIMIT 1', [this.projectId, chapterNumber]);
99
+ return rows[0];
100
+ }
101
+ catch {
102
+ return undefined;
103
+ }
104
+ }
105
+ async loadCharacter(name) {
106
+ try {
107
+ const rows = await this.mcpClient.readQuery(`SELECT name, role, summary,
108
+ GROUP_CONCAT(CASE WHEN ca.attribute_name = 'personality' THEN ca.attribute_value END) AS personality,
109
+ GROUP_CONCAT(CASE WHEN ca.attribute_name = 'arc' THEN ca.attribute_value END) AS arc
110
+ FROM characters c
111
+ LEFT JOIN character_attributes ca ON ca.character_id = c.id
112
+ WHERE c.project_id = ? AND c.name = ?
113
+ GROUP BY c.id
114
+ LIMIT 1`, [this.projectId, name]);
115
+ if (!rows[0])
116
+ return undefined;
117
+ const r = rows[0];
118
+ return {
119
+ name: r.name,
120
+ role: r.role,
121
+ summary: r.summary,
122
+ personality: r.personality,
123
+ arc: r.arc,
124
+ };
125
+ }
126
+ catch {
127
+ return undefined;
128
+ }
129
+ }
130
+ async loadActivePlotThreads() {
131
+ try {
132
+ const rows = await this.mcpClient.readQuery(`SELECT thread_name AS name, description, priority
133
+ FROM plot_threads
134
+ WHERE project_id = ? AND status = 'active'
135
+ ORDER BY priority DESC
136
+ LIMIT 5`, [this.projectId]);
137
+ return rows.map((r) => ({
138
+ name: r.name,
139
+ description: r.description ?? '',
140
+ priority: r.priority ?? 5,
141
+ }));
142
+ }
143
+ catch {
144
+ return [];
145
+ }
146
+ }
147
+ async loadHardWorldRules() {
148
+ try {
149
+ const rows = await this.mcpClient.readQuery(`SELECT rule_name AS name, description
150
+ FROM world_rules
151
+ WHERE project_id = ? AND is_hard_rule = 1
152
+ LIMIT 6`, [this.projectId]);
153
+ return rows.map((r) => ({
154
+ name: r.name,
155
+ description: r.description ?? '',
156
+ }));
157
+ }
158
+ catch {
159
+ return [];
160
+ }
161
+ }
162
+ /**
163
+ * Load the last beat from the previous scene in the same chapter (for continuity).
164
+ * Returns undefined if this is scene 1 or no beats exist.
165
+ */
166
+ async loadPreviousSceneLastBeat(chapterNumber, sceneNumber) {
167
+ if (sceneNumber <= 1)
168
+ return undefined;
169
+ try {
170
+ const rows = await this.mcpClient.readQuery(`SELECT sb.description
171
+ FROM scene_beats sb
172
+ JOIN scenes s ON sb.scene_id = s.id
173
+ JOIN chapters c ON s.chapter_id = c.id
174
+ WHERE c.project_id = ?
175
+ AND c.chapter_number = ?
176
+ AND s.scene_number = ?
177
+ ORDER BY sb.beat_number DESC
178
+ LIMIT 1`, [this.projectId, chapterNumber, sceneNumber - 1]);
179
+ return rows[0]
180
+ ? rows[0].description
181
+ : undefined;
182
+ }
183
+ catch {
184
+ return undefined;
185
+ }
186
+ }
187
+ // ============================================================
188
+ // PROMPT BUILDING
189
+ // ============================================================
190
+ buildPrompt(ctx, count) {
191
+ const lines = [];
192
+ lines.push(`PROJECT: ${ctx.projectTitle}${ctx.projectGenre ? ` (${ctx.projectGenre})` : ''}`, `CHAPTER ${ctx.chapterNumber}${ctx.chapterTitle ? `: ${ctx.chapterTitle}` : ''}`);
193
+ if (ctx.chapterSummary) {
194
+ lines.push(`Chapter summary: ${ctx.chapterSummary.trim()}`);
195
+ }
196
+ lines.push('');
197
+ lines.push(`SCENE ${ctx.scene.sceneNumber}${ctx.scene.title ? `: ${ctx.scene.title}` : ''}`);
198
+ if (ctx.scene.purpose)
199
+ lines.push(`Purpose: ${ctx.scene.purpose}`);
200
+ if (ctx.scene.emotionalTone)
201
+ lines.push(`Tone: ${ctx.scene.emotionalTone}`);
202
+ if (ctx.scene.tensionLevel != null)
203
+ lines.push(`Tension level: ${ctx.scene.tensionLevel}/10`);
204
+ if (ctx.scene.timeOfDay)
205
+ lines.push(`Time: ${ctx.scene.timeOfDay}`);
206
+ if (ctx.scene.location)
207
+ lines.push(`Location: ${ctx.scene.location}`);
208
+ if (ctx.scene.pov)
209
+ lines.push(`POV: ${ctx.scene.pov}`);
210
+ if (ctx.povCharacter) {
211
+ lines.push('');
212
+ lines.push(`POV CHARACTER — ${ctx.povCharacter.name}:`);
213
+ if (ctx.povCharacter.role)
214
+ lines.push(` Role: ${ctx.povCharacter.role}`);
215
+ if (ctx.povCharacter.summary)
216
+ lines.push(` ${ctx.povCharacter.summary.trim().slice(0, 400)}`);
217
+ if (ctx.povCharacter.personality)
218
+ lines.push(` Personality: ${ctx.povCharacter.personality}`);
219
+ if (ctx.povCharacter.arc)
220
+ lines.push(` Arc: ${ctx.povCharacter.arc}`);
221
+ }
222
+ if (ctx.activePlotThreads.length > 0) {
223
+ lines.push('');
224
+ lines.push('ACTIVE PLOT THREADS:');
225
+ for (const t of ctx.activePlotThreads) {
226
+ lines.push(` • ${t.name} (priority ${t.priority}): ${t.description.slice(0, 200)}`);
227
+ }
228
+ }
229
+ if (ctx.hardWorldRules.length > 0) {
230
+ lines.push('');
231
+ lines.push('HARD WORLD RULES (must not be violated):');
232
+ for (const r of ctx.hardWorldRules) {
233
+ lines.push(` • ${r.name}: ${r.description.slice(0, 150)}`);
234
+ }
235
+ }
236
+ if (ctx.previousSceneLastBeat) {
237
+ lines.push('');
238
+ lines.push(`PREVIOUS SCENE ENDS WITH:`);
239
+ lines.push(` ${ctx.previousSceneLastBeat}`);
240
+ }
241
+ lines.push('');
242
+ lines.push(`Generate exactly ${count} beats for this scene. A beat is one focused narrative unit — ` +
243
+ `an action, a reaction, a moment of realisation, a decision, a shift. ` +
244
+ `Each beat should be one or two sentences, specific and concrete. ` +
245
+ `Do not use labels or categories. Write only what happens.`);
246
+ lines.push('');
247
+ lines.push('Format — return only this, nothing else:');
248
+ lines.push('1. [description]');
249
+ lines.push('2. [description]');
250
+ lines.push('...');
251
+ return lines.join('\n');
252
+ }
253
+ // ============================================================
254
+ // RESPONSE PARSING
255
+ // ============================================================
256
+ /**
257
+ * Parse Claude's numbered list response into SceneBeat[].
258
+ * Tolerates minor formatting variation (periods, parentheses, extra whitespace).
259
+ */
260
+ parseBeats(raw) {
261
+ const beats = [];
262
+ const lines = raw.split('\n');
263
+ for (const line of lines) {
264
+ const trimmed = line.trim();
265
+ if (!trimmed)
266
+ continue;
267
+ // Match "1. description", "1) description", "1: description"
268
+ const match = trimmed.match(/^(\d+)[.):\s]\s*(.+)$/);
269
+ if (match) {
270
+ const beatNumber = parseInt(match[1], 10);
271
+ const description = match[2].trim();
272
+ if (description) {
273
+ beats.push({ beatNumber, description });
274
+ }
275
+ }
276
+ }
277
+ // Re-number sequentially in case Claude skipped numbers
278
+ return beats.map((b, i) => ({ ...b, beatNumber: i + 1 }));
279
+ }
280
+ }
281
+ //# sourceMappingURL=beat-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beat-generator.js","sourceRoot":"","sources":["../../src/ai/beat-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Claude API Client
3
+ * Wrapper for Anthropic SDK
4
+ */
5
+ export interface ClaudeOptions {
6
+ model?: string;
7
+ maxTokens?: number;
8
+ temperature?: number;
9
+ systemPrompt?: string;
10
+ }
11
+ export interface ClaudeResponse {
12
+ content: string;
13
+ stopReason?: string;
14
+ /** True when this is a context-prompt passthrough, not an API-generated response. */
15
+ passthrough?: boolean;
16
+ usage?: {
17
+ inputTokens: number;
18
+ outputTokens: number;
19
+ };
20
+ }
21
+ /**
22
+ * Shared interface implemented by both ClaudeClient and PassthroughClaudeClient.
23
+ * GenerationManager depends on this interface, not on the concrete class.
24
+ */
25
+ export interface IClaudeClient {
26
+ generate(prompt: string, options?: ClaudeOptions): Promise<ClaudeResponse>;
27
+ generateStructured(prompt: string, options?: ClaudeOptions): Promise<ClaudeResponse>;
28
+ generateCreative(prompt: string, options?: ClaudeOptions): Promise<ClaudeResponse>;
29
+ }
30
+ /**
31
+ * Live API client — calls the Anthropic API.
32
+ * Requires ANTHROPIC_API_KEY in the environment.
33
+ */
34
+ export declare class ClaudeClient implements IClaudeClient {
35
+ private anthropic;
36
+ private defaultModel;
37
+ constructor(apiKey?: string);
38
+ generate(prompt: string, options?: ClaudeOptions): Promise<ClaudeResponse>;
39
+ generateStructured(prompt: string, options?: ClaudeOptions): Promise<ClaudeResponse>;
40
+ generateCreative(prompt: string, options?: ClaudeOptions): Promise<ClaudeResponse>;
41
+ static isConfigured(): boolean;
42
+ }
43
+ /**
44
+ * Passthrough client used when ANTHROPIC_API_KEY is absent.
45
+ *
46
+ * Returns the assembled prompt verbatim instead of calling the API.
47
+ * Claude Code's active session sees the command output and generates the content
48
+ * directly — no separate API key required for the plugin to function.
49
+ */
50
+ export declare class PassthroughClaudeClient implements IClaudeClient {
51
+ generate(prompt: string): Promise<ClaudeResponse>;
52
+ generateStructured(prompt: string): Promise<ClaudeResponse>;
53
+ generateCreative(prompt: string): Promise<ClaudeResponse>;
54
+ }
55
+ //# sourceMappingURL=claude-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-client.d.ts","sourceRoot":"","sources":["../../src/ai/claude-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3E,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACrF,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACpF;AAED;;;GAGG;AACH,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,YAAY,CAA+B;gBAEvC,MAAM,CAAC,EAAE,MAAM;IAUrB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IAsC9E,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IAIxF,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IAI5F,MAAM,CAAC,YAAY,IAAI,OAAO;CAG/B;AAED;;;;;;GAMG;AACH,qBAAa,uBAAwB,YAAW,aAAa;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAGjD,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAG3D,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAGhE"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Claude API Client
3
+ * Wrapper for Anthropic SDK
4
+ */
5
+ import Anthropic from '@anthropic-ai/sdk';
6
+ /**
7
+ * Live API client — calls the Anthropic API.
8
+ * Requires ANTHROPIC_API_KEY in the environment.
9
+ */
10
+ export class ClaudeClient {
11
+ anthropic;
12
+ defaultModel = 'claude-sonnet-4-6';
13
+ constructor(apiKey) {
14
+ const key = apiKey || process.env.ANTHROPIC_API_KEY;
15
+ if (!key) {
16
+ throw new Error('Anthropic API key not found. Set ANTHROPIC_API_KEY environment variable or pass to constructor.');
17
+ }
18
+ this.anthropic = new Anthropic({ apiKey: key });
19
+ }
20
+ async generate(prompt, options = {}) {
21
+ const { model = this.defaultModel, maxTokens = 2048, temperature = 0.7, systemPrompt, } = options;
22
+ try {
23
+ const message = await this.anthropic.messages.create({
24
+ model,
25
+ max_tokens: maxTokens,
26
+ temperature,
27
+ system: systemPrompt,
28
+ messages: [{ role: 'user', content: prompt }],
29
+ });
30
+ const content = message.content
31
+ .filter((block) => block.type === 'text')
32
+ .map((block) => block.text)
33
+ .join('\n');
34
+ return {
35
+ content,
36
+ stopReason: message.stop_reason || undefined,
37
+ usage: {
38
+ inputTokens: message.usage.input_tokens,
39
+ outputTokens: message.usage.output_tokens,
40
+ },
41
+ };
42
+ }
43
+ catch (error) {
44
+ if (error instanceof Anthropic.APIError) {
45
+ throw new Error(`Claude API Error: ${error.message}`);
46
+ }
47
+ throw error;
48
+ }
49
+ }
50
+ async generateStructured(prompt, options = {}) {
51
+ return this.generate(prompt, { ...options, temperature: options.temperature ?? 0.5 });
52
+ }
53
+ async generateCreative(prompt, options = {}) {
54
+ return this.generate(prompt, { ...options, temperature: options.temperature ?? 0.9 });
55
+ }
56
+ static isConfigured() {
57
+ return !!process.env.ANTHROPIC_API_KEY;
58
+ }
59
+ }
60
+ /**
61
+ * Passthrough client used when ANTHROPIC_API_KEY is absent.
62
+ *
63
+ * Returns the assembled prompt verbatim instead of calling the API.
64
+ * Claude Code's active session sees the command output and generates the content
65
+ * directly — no separate API key required for the plugin to function.
66
+ */
67
+ export class PassthroughClaudeClient {
68
+ async generate(prompt) {
69
+ return { content: prompt, stopReason: 'passthrough', passthrough: true };
70
+ }
71
+ async generateStructured(prompt) {
72
+ return { content: prompt, stopReason: 'passthrough', passthrough: true };
73
+ }
74
+ async generateCreative(prompt) {
75
+ return { content: prompt, stopReason: 'passthrough', passthrough: true };
76
+ }
77
+ }
78
+ //# sourceMappingURL=claude-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-client.js","sourceRoot":"","sources":["../../src/ai/claude-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * AI Generation Manager
3
+ * Coordinates AI-assisted content generation with proper context
4
+ *
5
+ * Philosophy: Suggest, don't dictate. Support the author's voice.
6
+ */
7
+ import type { MCPClient } from '../core/database.js';
8
+ import type { SynopsisContext, SynopsisLength } from '../types/novel.js';
9
+ export interface CharacterProfileRow {
10
+ name: string;
11
+ role?: string;
12
+ summary?: string;
13
+ [key: string]: unknown;
14
+ }
15
+ export interface WorldRuleRow {
16
+ rule_name: string;
17
+ description?: string;
18
+ [key: string]: unknown;
19
+ }
20
+ export interface GenerationContext {
21
+ projectId: number;
22
+ genre?: string;
23
+ tone?: string;
24
+ currentChapter?: number;
25
+ currentScene?: number;
26
+ recentText?: string;
27
+ characterProfiles?: CharacterProfileRow[];
28
+ locationDetails?: Record<string, unknown>[];
29
+ worldRules?: WorldRuleRow[];
30
+ plotThreads?: Record<string, unknown>[];
31
+ }
32
+ export interface GenerationOptions {
33
+ temperature?: number;
34
+ maxLength?: number;
35
+ style?: 'descriptive' | 'action' | 'dialogue' | 'introspective';
36
+ pov?: string;
37
+ includeContext?: boolean;
38
+ count?: number;
39
+ }
40
+ export interface GenerationResult {
41
+ content: string;
42
+ alternatives: string[];
43
+ reasoning?: string;
44
+ warnings?: string[];
45
+ }
46
+ /**
47
+ * Manages AI-assisted generation
48
+ */
49
+ export declare class GenerationManager {
50
+ private mcpClient;
51
+ private projectId;
52
+ private claude;
53
+ private contextAssembler;
54
+ constructor(mcpClient: MCPClient, projectId: number);
55
+ /**
56
+ * Generate character profile from description.
57
+ * When options.count > 1, instructs Claude to return that many distinct profile options,
58
+ * numbered, and parses them into alternatives[].
59
+ *
60
+ * Based on NOVEL_CRAFT_PRINCIPLES: believable characters with flaws.
61
+ */
62
+ generateCharacter(description: string, options?: GenerationOptions): Promise<GenerationResult>;
63
+ /**
64
+ * Generate location/world-building details
65
+ */
66
+ generateLocation(description: string, options?: GenerationOptions): Promise<GenerationResult>;
67
+ /**
68
+ * Suggest scene continuation.
69
+ * Defaults to 3 alternatives. Respects options.count (max 3).
70
+ * Based on principle: "Follow the headlights" - discovery writing.
71
+ */
72
+ suggestSceneContinuation(currentText: string, sceneId: number, options?: GenerationOptions): Promise<GenerationResult>;
73
+ /**
74
+ * Enhance dialogue for character voice.
75
+ * When options.count > 1, requests that many dialogue variations.
76
+ * Based on principle: Give each character a voice.
77
+ */
78
+ enhanceDialogue(dialogue: string, characterName: string, options?: GenerationOptions): Promise<GenerationResult>;
79
+ /**
80
+ * Expand description with sensory details.
81
+ * When options.count > 1, requests distinct sensory approaches
82
+ * (e.g. visual-first, sound-first, emotional-first).
83
+ */
84
+ expandDescription(text: string, pov?: string, options?: GenerationOptions): Promise<GenerationResult>;
85
+ /**
86
+ * Suggest plot development.
87
+ * Defaults to 3 alternatives. Respects options.count (max 3).
88
+ */
89
+ suggestPlotDevelopment(threadName: string, currentStatus: string, options?: GenerationOptions): Promise<GenerationResult>;
90
+ private buildCharacterPrompt;
91
+ private buildLocationPrompt;
92
+ private buildContinuationPrompt;
93
+ private buildDialoguePrompt;
94
+ private buildDescriptionPrompt;
95
+ private buildPlotPrompt;
96
+ private assembleProjectContext;
97
+ private assembleSceneContext;
98
+ private getCharacterProfile;
99
+ private getPlotThread;
100
+ /**
101
+ * Load a character's voice, personality, and mannerisms from the database.
102
+ * Returns null if the character is not found or an error occurs.
103
+ *
104
+ * @param projectId - The project to search within
105
+ * @param name - The character's name
106
+ */
107
+ private loadCharacterVoice;
108
+ /**
109
+ * Build the POV anchor block to prepend to a prompt when options.pov is set.
110
+ * Returns an empty string if the character voice cannot be loaded.
111
+ *
112
+ * @param options - Generation options that may include a pov character name
113
+ */
114
+ private buildPovBlock;
115
+ /**
116
+ * Generate one true sentence to break through writer's block.
117
+ * Loads the last 500 words of the scene's content from the database and asks
118
+ * Claude to write a single, precise sentence that continues the story naturally.
119
+ *
120
+ * @param projectId - (unused; class already scoped to projectId)
121
+ * @param sceneId - The scene to continue
122
+ * @param options - Optional generation configuration
123
+ */
124
+ generateNextSentence(projectId: string, sceneId: number, options?: GenerationOptions): Promise<GenerationResult>;
125
+ /**
126
+ * Assemble all project data needed to generate synopsis, pitch,
127
+ * query-letter, or comp-title content.
128
+ *
129
+ * Queries: projects, characters (protagonist + antagonist),
130
+ * chapters (summaries), world_rules, narrative_promises.
131
+ *
132
+ * @param projectId - Project identifier (string form accepted by callers)
133
+ */
134
+ assembleSynopsisContext(projectId: string): Promise<SynopsisContext>;
135
+ /**
136
+ * Generate a synopsis of the specified length.
137
+ *
138
+ * @param projectId - Project identifier
139
+ * @param length - 'short' (~150w), 'medium' (~400w), or 'long' (~800w)
140
+ */
141
+ generateSynopsis(projectId: string, length: SynopsisLength): Promise<GenerationResult>;
142
+ /**
143
+ * Generate a 25-word elevator pitch using the "When…must…before" template.
144
+ *
145
+ * @param projectId - Project identifier
146
+ */
147
+ generatePitch(projectId: string): Promise<GenerationResult>;
148
+ /**
149
+ * Generate a professional query letter ready for literary agent submission.
150
+ *
151
+ * @param projectId - Project identifier
152
+ * @param compTitles - Optional list of comp titles provided by the author
153
+ */
154
+ generateQueryLetter(projectId: string, compTitles?: string[]): Promise<GenerationResult>;
155
+ /**
156
+ * Suggest 5 comparative titles published 2020–2025 for the novel.
157
+ *
158
+ * @param projectId - Project identifier
159
+ */
160
+ generateComps(projectId: string): Promise<GenerationResult>;
161
+ /**
162
+ * Workshop opening lines for the novel.
163
+ * Loads project context (title, genre, protagonist, core conflict) via
164
+ * `assembleSynopsisContext` when available, then asks Claude to generate
165
+ * `count` distinct opening-line options.
166
+ *
167
+ * Each option:
168
+ * - hooks the reader immediately
169
+ * - establishes voice and tone
170
+ * - hints at the central tension
171
+ * - stands alone as a complete sentence
172
+ *
173
+ * @param projectId - Project identifier
174
+ * @param count - Number of options to generate (default 5, max 10)
175
+ */
176
+ workshopOpeningLines(projectId: string, count?: number): Promise<GenerationResult>;
177
+ /**
178
+ * Generate creative brainstorm ideas from an author prompt.
179
+ * Returns 5 distinct, numbered ideas grounded in the project genre.
180
+ *
181
+ * @param prompt - The brainstorm prompt from the author
182
+ * @param options - Optional generation configuration
183
+ */
184
+ generateBrainstorm(prompt: string, options?: GenerationOptions): Promise<GenerationResult>;
185
+ /**
186
+ * Generate character name options with cultural context and meaning.
187
+ *
188
+ * @param opts - Options controlling culture, gender, count, and name type
189
+ */
190
+ generateName(opts: {
191
+ culture?: string;
192
+ gender?: 'male' | 'female' | 'neutral';
193
+ count?: number;
194
+ type?: 'first' | 'last' | 'full';
195
+ }): Promise<GenerationResult>;
196
+ /**
197
+ * Workshop a partial premise through structured development questions.
198
+ * Guides the author through conflict, protagonist, stakes, story question, and uniqueness.
199
+ *
200
+ * @param projectId - Project identifier (unused in prompt but kept for API consistency)
201
+ * @param partialPremise - The author's initial premise idea
202
+ */
203
+ workshopPremise(projectId: string, partialPremise: string): Promise<GenerationResult>;
204
+ /**
205
+ * Generate a quick character sketch to capture an early idea.
206
+ * Lightweight — name options, core trait, flaw, hidden depth, voice note, and story role.
207
+ *
208
+ * @param opts - Optional role, genre, and freeform notes
209
+ */
210
+ generateCharacterSketch(opts?: {
211
+ role?: string;
212
+ genre?: string;
213
+ notes?: string;
214
+ }): Promise<GenerationResult>;
215
+ }
216
+ //# sourceMappingURL=generation-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation-manager.d.ts","sourceRoot":"","sources":["../../src/ai/generation-manager.ts"],"names":[],"mappings":"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"}