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.
- package/CHANGELOG.md +70 -0
- package/LICENSE +21 -0
- package/QUICKSTART.md +183 -0
- package/README.md +257 -0
- package/dist/ai/beat-generator.d.ts +79 -0
- package/dist/ai/beat-generator.d.ts.map +1 -0
- package/dist/ai/beat-generator.js +281 -0
- package/dist/ai/beat-generator.js.map +1 -0
- package/dist/ai/claude-client.d.ts +55 -0
- package/dist/ai/claude-client.d.ts.map +1 -0
- package/dist/ai/claude-client.js +78 -0
- package/dist/ai/claude-client.js.map +1 -0
- package/dist/ai/generation-manager.d.ts +216 -0
- package/dist/ai/generation-manager.d.ts.map +1 -0
- package/dist/ai/generation-manager.js +874 -0
- package/dist/ai/generation-manager.js.map +1 -0
- package/dist/analysis/copy-editor.d.ts +96 -0
- package/dist/analysis/copy-editor.d.ts.map +1 -0
- package/dist/analysis/copy-editor.js +335 -0
- package/dist/analysis/copy-editor.js.map +1 -0
- package/dist/analysis/developmental-analyzer.d.ts +83 -0
- package/dist/analysis/developmental-analyzer.d.ts.map +1 -0
- package/dist/analysis/developmental-analyzer.js +144 -0
- package/dist/analysis/developmental-analyzer.js.map +1 -0
- package/dist/analysis/draft-scanner.d.ts +49 -0
- package/dist/analysis/draft-scanner.d.ts.map +1 -0
- package/dist/analysis/draft-scanner.js +145 -0
- package/dist/analysis/draft-scanner.js.map +1 -0
- package/dist/analysis/pacing-analyzer.d.ts +55 -0
- package/dist/analysis/pacing-analyzer.d.ts.map +1 -0
- package/dist/analysis/pacing-analyzer.js +237 -0
- package/dist/analysis/pacing-analyzer.js.map +1 -0
- package/dist/analysis/prose-analyzer.d.ts +118 -0
- package/dist/analysis/prose-analyzer.d.ts.map +1 -0
- package/dist/analysis/prose-analyzer.js +600 -0
- package/dist/analysis/prose-analyzer.js.map +1 -0
- package/dist/analysis/read-aloud.d.ts +119 -0
- package/dist/analysis/read-aloud.d.ts.map +1 -0
- package/dist/analysis/read-aloud.js +248 -0
- package/dist/analysis/read-aloud.js.map +1 -0
- package/dist/bin.d.ts +12 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +29 -0
- package/dist/bin.js.map +1 -0
- package/dist/builders/chapter-builder.d.ts +77 -0
- package/dist/builders/chapter-builder.d.ts.map +1 -0
- package/dist/builders/chapter-builder.js +375 -0
- package/dist/builders/chapter-builder.js.map +1 -0
- package/dist/builders/character-builder.d.ts +57 -0
- package/dist/builders/character-builder.d.ts.map +1 -0
- package/dist/builders/character-builder.js +370 -0
- package/dist/builders/character-builder.js.map +1 -0
- package/dist/builders/idea-builder.d.ts +70 -0
- package/dist/builders/idea-builder.d.ts.map +1 -0
- package/dist/builders/idea-builder.js +144 -0
- package/dist/builders/idea-builder.js.map +1 -0
- package/dist/builders/location-builder.d.ts +48 -0
- package/dist/builders/location-builder.d.ts.map +1 -0
- package/dist/builders/location-builder.js +215 -0
- package/dist/builders/location-builder.js.map +1 -0
- package/dist/builders/manuscript-assembler.d.ts +119 -0
- package/dist/builders/manuscript-assembler.d.ts.map +1 -0
- package/dist/builders/manuscript-assembler.js +347 -0
- package/dist/builders/manuscript-assembler.js.map +1 -0
- package/dist/builders/plot-builder.d.ts +35 -0
- package/dist/builders/plot-builder.d.ts.map +1 -0
- package/dist/builders/plot-builder.js +138 -0
- package/dist/builders/plot-builder.js.map +1 -0
- package/dist/builders/plot-thread-builder.d.ts +76 -0
- package/dist/builders/plot-thread-builder.d.ts.map +1 -0
- package/dist/builders/plot-thread-builder.js +234 -0
- package/dist/builders/plot-thread-builder.js.map +1 -0
- package/dist/builders/scene-builder.d.ts +109 -0
- package/dist/builders/scene-builder.d.ts.map +1 -0
- package/dist/builders/scene-builder.js +388 -0
- package/dist/builders/scene-builder.js.map +1 -0
- package/dist/builders/timeline-builder.d.ts +94 -0
- package/dist/builders/timeline-builder.d.ts.map +1 -0
- package/dist/builders/timeline-builder.js +261 -0
- package/dist/builders/timeline-builder.js.map +1 -0
- package/dist/builders/world-rules-builder.d.ts +90 -0
- package/dist/builders/world-rules-builder.d.ts.map +1 -0
- package/dist/builders/world-rules-builder.js +257 -0
- package/dist/builders/world-rules-builder.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +8 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +191 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/beta.d.ts +8 -0
- package/dist/cli/commands/beta.d.ts.map +1 -0
- package/dist/cli/commands/beta.js +112 -0
- package/dist/cli/commands/beta.js.map +1 -0
- package/dist/cli/commands/canon.d.ts +6 -0
- package/dist/cli/commands/canon.d.ts.map +1 -0
- package/dist/cli/commands/canon.js +93 -0
- package/dist/cli/commands/canon.js.map +1 -0
- package/dist/cli/commands/chapter.d.ts +6 -0
- package/dist/cli/commands/chapter.d.ts.map +1 -0
- package/dist/cli/commands/chapter.js +104 -0
- package/dist/cli/commands/chapter.js.map +1 -0
- package/dist/cli/commands/character.d.ts +7 -0
- package/dist/cli/commands/character.d.ts.map +1 -0
- package/dist/cli/commands/character.js +147 -0
- package/dist/cli/commands/character.js.map +1 -0
- package/dist/cli/commands/check.d.ts +7 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +105 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/context.d.ts +6 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +73 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/create.d.ts +7 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +295 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/draft.d.ts +6 -0
- package/dist/cli/commands/draft.d.ts.map +1 -0
- package/dist/cli/commands/draft.js +43 -0
- package/dist/cli/commands/draft.js.map +1 -0
- package/dist/cli/commands/export.d.ts +6 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +117 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/foreshadow.d.ts +9 -0
- package/dist/cli/commands/foreshadow.d.ts.map +1 -0
- package/dist/cli/commands/foreshadow.js +78 -0
- package/dist/cli/commands/foreshadow.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +6 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +264 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +6 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +68 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/help.d.ts +6 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +16 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/idea.d.ts +6 -0
- package/dist/cli/commands/idea.d.ts.map +1 -0
- package/dist/cli/commands/idea.js +126 -0
- package/dist/cli/commands/idea.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +78 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/knowledge.d.ts +6 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.js +68 -0
- package/dist/cli/commands/knowledge.js.map +1 -0
- package/dist/cli/commands/list.d.ts +7 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +181 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/location.d.ts +7 -0
- package/dist/cli/commands/location.d.ts.map +1 -0
- package/dist/cli/commands/location.js +97 -0
- package/dist/cli/commands/location.js.map +1 -0
- package/dist/cli/commands/plot.d.ts +6 -0
- package/dist/cli/commands/plot.d.ts.map +1 -0
- package/dist/cli/commands/plot.js +132 -0
- package/dist/cli/commands/plot.js.map +1 -0
- package/dist/cli/commands/promise.d.ts +6 -0
- package/dist/cli/commands/promise.d.ts.map +1 -0
- package/dist/cli/commands/promise.js +100 -0
- package/dist/cli/commands/promise.js.map +1 -0
- package/dist/cli/commands/query.d.ts +8 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +108 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/research.d.ts +8 -0
- package/dist/cli/commands/research.d.ts.map +1 -0
- package/dist/cli/commands/research.js +105 -0
- package/dist/cli/commands/research.js.map +1 -0
- package/dist/cli/commands/revision.d.ts +7 -0
- package/dist/cli/commands/revision.d.ts.map +1 -0
- package/dist/cli/commands/revision.js +74 -0
- package/dist/cli/commands/revision.js.map +1 -0
- package/dist/cli/commands/scene.d.ts +7 -0
- package/dist/cli/commands/scene.d.ts.map +1 -0
- package/dist/cli/commands/scene.js +160 -0
- package/dist/cli/commands/scene.js.map +1 -0
- package/dist/cli/commands/series.d.ts +8 -0
- package/dist/cli/commands/series.d.ts.map +1 -0
- package/dist/cli/commands/series.js +130 -0
- package/dist/cli/commands/series.js.map +1 -0
- package/dist/cli/commands/session.d.ts +8 -0
- package/dist/cli/commands/session.d.ts.map +1 -0
- package/dist/cli/commands/session.js +129 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +7 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +87 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/timeline.d.ts +7 -0
- package/dist/cli/commands/timeline.d.ts.map +1 -0
- package/dist/cli/commands/timeline.js +219 -0
- package/dist/cli/commands/timeline.js.map +1 -0
- package/dist/cli/commands/world-rule.d.ts +6 -0
- package/dist/cli/commands/world-rule.d.ts.map +1 -0
- package/dist/cli/commands/world-rule.js +160 -0
- package/dist/cli/commands/world-rule.js.map +1 -0
- package/dist/cli/handlers/analyze-handler.d.ts +8 -0
- package/dist/cli/handlers/analyze-handler.d.ts.map +1 -0
- package/dist/cli/handlers/analyze-handler.js +754 -0
- package/dist/cli/handlers/analyze-handler.js.map +1 -0
- package/dist/cli/handlers/beta-handler.d.ts +13 -0
- package/dist/cli/handlers/beta-handler.d.ts.map +1 -0
- package/dist/cli/handlers/beta-handler.js +236 -0
- package/dist/cli/handlers/beta-handler.js.map +1 -0
- package/dist/cli/handlers/canon-handler.d.ts +16 -0
- package/dist/cli/handlers/canon-handler.d.ts.map +1 -0
- package/dist/cli/handlers/canon-handler.js +214 -0
- package/dist/cli/handlers/canon-handler.js.map +1 -0
- package/dist/cli/handlers/chapter-handler.d.ts +7 -0
- package/dist/cli/handlers/chapter-handler.d.ts.map +1 -0
- package/dist/cli/handlers/chapter-handler.js +280 -0
- package/dist/cli/handlers/chapter-handler.js.map +1 -0
- package/dist/cli/handlers/character-handler.d.ts +8 -0
- package/dist/cli/handlers/character-handler.d.ts.map +1 -0
- package/dist/cli/handlers/character-handler.js +604 -0
- package/dist/cli/handlers/character-handler.js.map +1 -0
- package/dist/cli/handlers/check-handler.d.ts +7 -0
- package/dist/cli/handlers/check-handler.d.ts.map +1 -0
- package/dist/cli/handlers/check-handler.js +416 -0
- package/dist/cli/handlers/check-handler.js.map +1 -0
- package/dist/cli/handlers/context-handler.d.ts +16 -0
- package/dist/cli/handlers/context-handler.d.ts.map +1 -0
- package/dist/cli/handlers/context-handler.js +122 -0
- package/dist/cli/handlers/context-handler.js.map +1 -0
- package/dist/cli/handlers/craft-handler.d.ts +22 -0
- package/dist/cli/handlers/craft-handler.d.ts.map +1 -0
- package/dist/cli/handlers/craft-handler.js +44 -0
- package/dist/cli/handlers/craft-handler.js.map +1 -0
- package/dist/cli/handlers/create-handler.d.ts +22 -0
- package/dist/cli/handlers/create-handler.d.ts.map +1 -0
- package/dist/cli/handlers/create-handler.js +386 -0
- package/dist/cli/handlers/create-handler.js.map +1 -0
- package/dist/cli/handlers/draft-handler.d.ts +17 -0
- package/dist/cli/handlers/draft-handler.d.ts.map +1 -0
- package/dist/cli/handlers/draft-handler.js +91 -0
- package/dist/cli/handlers/draft-handler.js.map +1 -0
- package/dist/cli/handlers/export-handler.d.ts +7 -0
- package/dist/cli/handlers/export-handler.d.ts.map +1 -0
- package/dist/cli/handlers/export-handler.js +179 -0
- package/dist/cli/handlers/export-handler.js.map +1 -0
- package/dist/cli/handlers/foreshadow-handler.d.ts +8 -0
- package/dist/cli/handlers/foreshadow-handler.d.ts.map +1 -0
- package/dist/cli/handlers/foreshadow-handler.js +132 -0
- package/dist/cli/handlers/foreshadow-handler.js.map +1 -0
- package/dist/cli/handlers/generate-handler.d.ts +7 -0
- package/dist/cli/handlers/generate-handler.d.ts.map +1 -0
- package/dist/cli/handlers/generate-handler.js +500 -0
- package/dist/cli/handlers/generate-handler.js.map +1 -0
- package/dist/cli/handlers/graph-handler.d.ts +16 -0
- package/dist/cli/handlers/graph-handler.d.ts.map +1 -0
- package/dist/cli/handlers/graph-handler.js +149 -0
- package/dist/cli/handlers/graph-handler.js.map +1 -0
- package/dist/cli/handlers/help-handler.d.ts +14 -0
- package/dist/cli/handlers/help-handler.d.ts.map +1 -0
- package/dist/cli/handlers/help-handler.js +59 -0
- package/dist/cli/handlers/help-handler.js.map +1 -0
- package/dist/cli/handlers/idea-handler.d.ts +16 -0
- package/dist/cli/handlers/idea-handler.d.ts.map +1 -0
- package/dist/cli/handlers/idea-handler.js +256 -0
- package/dist/cli/handlers/idea-handler.js.map +1 -0
- package/dist/cli/handlers/init-handler.d.ts +6 -0
- package/dist/cli/handlers/init-handler.d.ts.map +1 -0
- package/dist/cli/handlers/init-handler.js +228 -0
- package/dist/cli/handlers/init-handler.js.map +1 -0
- package/dist/cli/handlers/knowledge-handler.d.ts +16 -0
- package/dist/cli/handlers/knowledge-handler.d.ts.map +1 -0
- package/dist/cli/handlers/knowledge-handler.js +142 -0
- package/dist/cli/handlers/knowledge-handler.js.map +1 -0
- package/dist/cli/handlers/list-handler.d.ts +26 -0
- package/dist/cli/handlers/list-handler.d.ts.map +1 -0
- package/dist/cli/handlers/list-handler.js +381 -0
- package/dist/cli/handlers/list-handler.js.map +1 -0
- package/dist/cli/handlers/location-handler.d.ts +7 -0
- package/dist/cli/handlers/location-handler.d.ts.map +1 -0
- package/dist/cli/handlers/location-handler.js +392 -0
- package/dist/cli/handlers/location-handler.js.map +1 -0
- package/dist/cli/handlers/plot-handler.d.ts +8 -0
- package/dist/cli/handlers/plot-handler.d.ts.map +1 -0
- package/dist/cli/handlers/plot-handler.js +528 -0
- package/dist/cli/handlers/plot-handler.js.map +1 -0
- package/dist/cli/handlers/promise-handler.d.ts +16 -0
- package/dist/cli/handlers/promise-handler.d.ts.map +1 -0
- package/dist/cli/handlers/promise-handler.js +206 -0
- package/dist/cli/handlers/promise-handler.js.map +1 -0
- package/dist/cli/handlers/query-handler.d.ts +13 -0
- package/dist/cli/handlers/query-handler.d.ts.map +1 -0
- package/dist/cli/handlers/query-handler.js +245 -0
- package/dist/cli/handlers/query-handler.js.map +1 -0
- package/dist/cli/handlers/research-handler.d.ts +13 -0
- package/dist/cli/handlers/research-handler.d.ts.map +1 -0
- package/dist/cli/handlers/research-handler.js +216 -0
- package/dist/cli/handlers/research-handler.js.map +1 -0
- package/dist/cli/handlers/revision-handler.d.ts +14 -0
- package/dist/cli/handlers/revision-handler.d.ts.map +1 -0
- package/dist/cli/handlers/revision-handler.js +188 -0
- package/dist/cli/handlers/revision-handler.js.map +1 -0
- package/dist/cli/handlers/scene-handler.d.ts +7 -0
- package/dist/cli/handlers/scene-handler.d.ts.map +1 -0
- package/dist/cli/handlers/scene-handler.js +565 -0
- package/dist/cli/handlers/scene-handler.js.map +1 -0
- package/dist/cli/handlers/series-handler.d.ts +13 -0
- package/dist/cli/handlers/series-handler.d.ts.map +1 -0
- package/dist/cli/handlers/series-handler.js +322 -0
- package/dist/cli/handlers/series-handler.js.map +1 -0
- package/dist/cli/handlers/session-handler.d.ts +7 -0
- package/dist/cli/handlers/session-handler.d.ts.map +1 -0
- package/dist/cli/handlers/session-handler.js +400 -0
- package/dist/cli/handlers/session-handler.js.map +1 -0
- package/dist/cli/handlers/sync-handler.d.ts +41 -0
- package/dist/cli/handlers/sync-handler.d.ts.map +1 -0
- package/dist/cli/handlers/sync-handler.js +573 -0
- package/dist/cli/handlers/sync-handler.js.map +1 -0
- package/dist/cli/handlers/timeline-handler.d.ts +7 -0
- package/dist/cli/handlers/timeline-handler.d.ts.map +1 -0
- package/dist/cli/handlers/timeline-handler.js +364 -0
- package/dist/cli/handlers/timeline-handler.js.map +1 -0
- package/dist/cli/handlers/world-rule-handler.d.ts +8 -0
- package/dist/cli/handlers/world-rule-handler.d.ts.map +1 -0
- package/dist/cli/handlers/world-rule-handler.js +521 -0
- package/dist/cli/handlers/world-rule-handler.js.map +1 -0
- package/dist/cli/index.d.ts +55 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +253 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +72 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +134 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/parser.d.ts +57 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +333 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/registry.d.ts +40 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +196 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/types.d.ts +71 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +5 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +11 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/novel.d.ts +13 -0
- package/dist/commands/novel.d.ts.map +1 -0
- package/dist/commands/novel.js +17 -0
- package/dist/commands/novel.js.map +1 -0
- package/dist/consistency/checker.d.ts +80 -0
- package/dist/consistency/checker.d.ts.map +1 -0
- package/dist/consistency/checker.js +493 -0
- package/dist/consistency/checker.js.map +1 -0
- package/dist/context/contracts/continuity-check.contract.d.ts +3 -0
- package/dist/context/contracts/continuity-check.contract.d.ts.map +1 -0
- package/dist/context/contracts/continuity-check.contract.js +22 -0
- package/dist/context/contracts/continuity-check.contract.js.map +1 -0
- package/dist/context/contracts/developmental-edit.contract.d.ts +3 -0
- package/dist/context/contracts/developmental-edit.contract.d.ts.map +1 -0
- package/dist/context/contracts/developmental-edit.contract.js +22 -0
- package/dist/context/contracts/developmental-edit.contract.js.map +1 -0
- package/dist/context/contracts/scene-continuation.contract.d.ts +3 -0
- package/dist/context/contracts/scene-continuation.contract.d.ts.map +1 -0
- package/dist/context/contracts/scene-continuation.contract.js +22 -0
- package/dist/context/contracts/scene-continuation.contract.js.map +1 -0
- package/dist/context/fetchers/canon-fetcher.d.ts +21 -0
- package/dist/context/fetchers/canon-fetcher.d.ts.map +1 -0
- package/dist/context/fetchers/canon-fetcher.js +64 -0
- package/dist/context/fetchers/canon-fetcher.js.map +1 -0
- package/dist/context/fetchers/character-fetcher.d.ts +18 -0
- package/dist/context/fetchers/character-fetcher.d.ts.map +1 -0
- package/dist/context/fetchers/character-fetcher.js +62 -0
- package/dist/context/fetchers/character-fetcher.js.map +1 -0
- package/dist/context/fetchers/fetcher.d.ts +13 -0
- package/dist/context/fetchers/fetcher.d.ts.map +1 -0
- package/dist/context/fetchers/fetcher.js +2 -0
- package/dist/context/fetchers/fetcher.js.map +1 -0
- package/dist/context/fetchers/promise-fetcher.d.ts +19 -0
- package/dist/context/fetchers/promise-fetcher.d.ts.map +1 -0
- package/dist/context/fetchers/promise-fetcher.js +59 -0
- package/dist/context/fetchers/promise-fetcher.js.map +1 -0
- package/dist/context/fetchers/scene-fetcher.d.ts +19 -0
- package/dist/context/fetchers/scene-fetcher.d.ts.map +1 -0
- package/dist/context/fetchers/scene-fetcher.js +75 -0
- package/dist/context/fetchers/scene-fetcher.js.map +1 -0
- package/dist/context/fingerprint.d.ts +13 -0
- package/dist/context/fingerprint.d.ts.map +1 -0
- package/dist/context/fingerprint.js +21 -0
- package/dist/context/fingerprint.js.map +1 -0
- package/dist/context/ordering.d.ts +10 -0
- package/dist/context/ordering.d.ts.map +1 -0
- package/dist/context/ordering.js +42 -0
- package/dist/context/ordering.js.map +1 -0
- package/dist/context/scene-context.d.ts +83 -0
- package/dist/context/scene-context.d.ts.map +1 -0
- package/dist/context/scene-context.js +323 -0
- package/dist/context/scene-context.js.map +1 -0
- package/dist/context/scoring.d.ts +14 -0
- package/dist/context/scoring.d.ts.map +1 -0
- package/dist/context/scoring.js +30 -0
- package/dist/context/scoring.js.map +1 -0
- package/dist/context/token-budget.d.ts +27 -0
- package/dist/context/token-budget.d.ts.map +1 -0
- package/dist/context/token-budget.js +83 -0
- package/dist/context/token-budget.js.map +1 -0
- package/dist/core/database.d.ts +108 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/database.js +282 -0
- package/dist/core/database.js.map +1 -0
- package/dist/data/features.d.ts +14 -0
- package/dist/data/features.d.ts.map +1 -0
- package/dist/data/features.js +2 -0
- package/dist/data/features.js.map +1 -0
- package/dist/db/migrations.d.ts +21 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +397 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/repositories/canon-repository.d.ts +18 -0
- package/dist/db/repositories/canon-repository.d.ts.map +1 -0
- package/dist/db/repositories/canon-repository.js +158 -0
- package/dist/db/repositories/canon-repository.js.map +1 -0
- package/dist/db/repositories/graph-repository.d.ts +19 -0
- package/dist/db/repositories/graph-repository.d.ts.map +1 -0
- package/dist/db/repositories/graph-repository.js +128 -0
- package/dist/db/repositories/graph-repository.js.map +1 -0
- package/dist/db/repositories/knowledge-repository.d.ts +20 -0
- package/dist/db/repositories/knowledge-repository.d.ts.map +1 -0
- package/dist/db/repositories/knowledge-repository.js +177 -0
- package/dist/db/repositories/knowledge-repository.js.map +1 -0
- package/dist/db/repositories/promise-repository.d.ts +15 -0
- package/dist/db/repositories/promise-repository.d.ts.map +1 -0
- package/dist/db/repositories/promise-repository.js +140 -0
- package/dist/db/repositories/promise-repository.js.map +1 -0
- package/dist/db/repositories/research-repository.d.ts +40 -0
- package/dist/db/repositories/research-repository.d.ts.map +1 -0
- package/dist/db/repositories/research-repository.js +132 -0
- package/dist/db/repositories/research-repository.js.map +1 -0
- package/dist/db/repositories/sync-state-repository.d.ts +39 -0
- package/dist/db/repositories/sync-state-repository.d.ts.map +1 -0
- package/dist/db/repositories/sync-state-repository.js +71 -0
- package/dist/db/repositories/sync-state-repository.js.map +1 -0
- package/dist/index.d.ts +319 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +482 -0
- package/dist/index.js.map +1 -0
- package/dist/revision/snapshot-manager.d.ts +81 -0
- package/dist/revision/snapshot-manager.d.ts.map +1 -0
- package/dist/revision/snapshot-manager.js +267 -0
- package/dist/revision/snapshot-manager.js.map +1 -0
- package/dist/services/beta-reader-service.d.ts +64 -0
- package/dist/services/beta-reader-service.d.ts.map +1 -0
- package/dist/services/beta-reader-service.js +233 -0
- package/dist/services/beta-reader-service.js.map +1 -0
- package/dist/services/canon-service.d.ts +40 -0
- package/dist/services/canon-service.d.ts.map +1 -0
- package/dist/services/canon-service.js +126 -0
- package/dist/services/canon-service.js.map +1 -0
- package/dist/services/character-arc-service.d.ts +60 -0
- package/dist/services/character-arc-service.d.ts.map +1 -0
- package/dist/services/character-arc-service.js +161 -0
- package/dist/services/character-arc-service.js.map +1 -0
- package/dist/services/context-contract-service.d.ts +14 -0
- package/dist/services/context-contract-service.d.ts.map +1 -0
- package/dist/services/context-contract-service.js +57 -0
- package/dist/services/context-contract-service.js.map +1 -0
- package/dist/services/context-policy-engine.d.ts +27 -0
- package/dist/services/context-policy-engine.d.ts.map +1 -0
- package/dist/services/context-policy-engine.js +105 -0
- package/dist/services/context-policy-engine.js.map +1 -0
- package/dist/services/foreshadowing-service.d.ts +60 -0
- package/dist/services/foreshadowing-service.d.ts.map +1 -0
- package/dist/services/foreshadowing-service.js +136 -0
- package/dist/services/foreshadowing-service.js.map +1 -0
- package/dist/services/knowledge-service.d.ts +23 -0
- package/dist/services/knowledge-service.d.ts.map +1 -0
- package/dist/services/knowledge-service.js +97 -0
- package/dist/services/knowledge-service.js.map +1 -0
- package/dist/services/narrative-graph-service.d.ts +30 -0
- package/dist/services/narrative-graph-service.d.ts.map +1 -0
- package/dist/services/narrative-graph-service.js +125 -0
- package/dist/services/narrative-graph-service.js.map +1 -0
- package/dist/services/promise-service.d.ts +23 -0
- package/dist/services/promise-service.d.ts.map +1 -0
- package/dist/services/promise-service.js +140 -0
- package/dist/services/promise-service.js.map +1 -0
- package/dist/services/query-tracker-service.d.ts +96 -0
- package/dist/services/query-tracker-service.d.ts.map +1 -0
- package/dist/services/query-tracker-service.js +278 -0
- package/dist/services/query-tracker-service.js.map +1 -0
- package/dist/services/research-service.d.ts +63 -0
- package/dist/services/research-service.d.ts.map +1 -0
- package/dist/services/research-service.js +149 -0
- package/dist/services/research-service.js.map +1 -0
- package/dist/services/series-manager.d.ts +129 -0
- package/dist/services/series-manager.d.ts.map +1 -0
- package/dist/services/series-manager.js +250 -0
- package/dist/services/series-manager.js.map +1 -0
- package/dist/session/progress-dashboard.d.ts +78 -0
- package/dist/session/progress-dashboard.d.ts.map +1 -0
- package/dist/session/progress-dashboard.js +315 -0
- package/dist/session/progress-dashboard.js.map +1 -0
- package/dist/session/session-manager.d.ts +142 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +509 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/sync/chapter-sync.d.ts +60 -0
- package/dist/sync/chapter-sync.d.ts.map +1 -0
- package/dist/sync/chapter-sync.js +279 -0
- package/dist/sync/chapter-sync.js.map +1 -0
- package/dist/sync/character-sync.d.ts +67 -0
- package/dist/sync/character-sync.d.ts.map +1 -0
- package/dist/sync/character-sync.js +405 -0
- package/dist/sync/character-sync.js.map +1 -0
- package/dist/sync/idea-sync.d.ts +34 -0
- package/dist/sync/idea-sync.d.ts.map +1 -0
- package/dist/sync/idea-sync.js +101 -0
- package/dist/sync/idea-sync.js.map +1 -0
- package/dist/sync/location-sync.d.ts +44 -0
- package/dist/sync/location-sync.d.ts.map +1 -0
- package/dist/sync/location-sync.js +188 -0
- package/dist/sync/location-sync.js.map +1 -0
- package/dist/sync/plot-sync.d.ts +27 -0
- package/dist/sync/plot-sync.d.ts.map +1 -0
- package/dist/sync/plot-sync.js +171 -0
- package/dist/sync/plot-sync.js.map +1 -0
- package/dist/sync/plot-thread-sync.d.ts +90 -0
- package/dist/sync/plot-thread-sync.d.ts.map +1 -0
- package/dist/sync/plot-thread-sync.js +384 -0
- package/dist/sync/plot-thread-sync.js.map +1 -0
- package/dist/sync/scene-sync.d.ts +93 -0
- package/dist/sync/scene-sync.d.ts.map +1 -0
- package/dist/sync/scene-sync.js +353 -0
- package/dist/sync/scene-sync.js.map +1 -0
- package/dist/sync/timeline-sync.d.ts +48 -0
- package/dist/sync/timeline-sync.d.ts.map +1 -0
- package/dist/sync/timeline-sync.js +232 -0
- package/dist/sync/timeline-sync.js.map +1 -0
- package/dist/sync/world-rules-sync.d.ts +78 -0
- package/dist/sync/world-rules-sync.d.ts.map +1 -0
- package/dist/sync/world-rules-sync.js +318 -0
- package/dist/sync/world-rules-sync.js.map +1 -0
- package/dist/types/canon.d.ts +43 -0
- package/dist/types/canon.d.ts.map +1 -0
- package/dist/types/canon.js +2 -0
- package/dist/types/canon.js.map +1 -0
- package/dist/types/common.d.ts +11 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +2 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/context.d.ts +69 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +2 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/errors.d.ts +24 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +37 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/graph.d.ts +25 -0
- package/dist/types/graph.d.ts.map +1 -0
- package/dist/types/graph.js +2 -0
- package/dist/types/graph.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/knowledge.d.ts +20 -0
- package/dist/types/knowledge.d.ts.map +1 -0
- package/dist/types/knowledge.js +2 -0
- package/dist/types/knowledge.js.map +1 -0
- package/dist/types/novel.d.ts +477 -0
- package/dist/types/novel.d.ts.map +1 -0
- package/dist/types/novel.js +22 -0
- package/dist/types/novel.js.map +1 -0
- package/dist/types/promise.d.ts +42 -0
- package/dist/types/promise.d.ts.map +1 -0
- package/dist/types/promise.js +2 -0
- package/dist/types/promise.js.map +1 -0
- package/dist/types/story-location.d.ts +7 -0
- package/dist/types/story-location.d.ts.map +1 -0
- package/dist/types/story-location.js +2 -0
- package/dist/types/story-location.js.map +1 -0
- package/dist/utils/hash.d.ts +2 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +5 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/ids.d.ts +3 -0
- package/dist/utils/ids.d.ts.map +1 -0
- package/dist/utils/ids.js +8 -0
- package/dist/utils/ids.js.map +1 -0
- package/dist/utils/stable-json.d.ts +2 -0
- package/dist/utils/stable-json.d.ts.map +1 -0
- package/dist/utils/stable-json.js +12 -0
- package/dist/utils/stable-json.js.map +1 -0
- package/dist/utils/token-count.d.ts +2 -0
- package/dist/utils/token-count.d.ts.map +1 -0
- package/dist/utils/token-count.js +4 -0
- package/dist/utils/token-count.js.map +1 -0
- package/examples/character-template.yml +92 -0
- package/examples/interactive-builder-example.ts +134 -0
- package/examples/location-template.yml +39 -0
- package/examples/usage-example.ts +182 -0
- package/mcp-server/README.md +470 -0
- package/mcp-server/launch.js +69 -0
- package/mcp-server/novel-tools/README.md +242 -0
- package/mcp-server/novel-tools/dist/handlers.d.ts +42 -0
- package/mcp-server/novel-tools/dist/handlers.js +820 -0
- package/mcp-server/novel-tools/dist/index.d.ts +6 -0
- package/mcp-server/novel-tools/dist/index.js +124 -0
- package/mcp-server/novel-tools/dist/tools.d.ts +852 -0
- package/mcp-server/novel-tools/dist/tools.js +898 -0
- package/mcp-server/novel-tools/package.json +22 -0
- package/package.json +212 -0
- 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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"}
|