venice-video-harness 2.4.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 (264) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/LICENSE +21 -0
  3. package/README.md +598 -0
  4. package/dist/assembly/manifest-builder.d.ts +8 -0
  5. package/dist/assembly/manifest-builder.d.ts.map +1 -0
  6. package/dist/assembly/manifest-builder.js +196 -0
  7. package/dist/assembly/manifest-builder.js.map +1 -0
  8. package/dist/assembly/remotion-scaffold.d.ts +14 -0
  9. package/dist/assembly/remotion-scaffold.d.ts.map +1 -0
  10. package/dist/assembly/remotion-scaffold.js +292 -0
  11. package/dist/assembly/remotion-scaffold.js.map +1 -0
  12. package/dist/assembly/types.d.ts +67 -0
  13. package/dist/assembly/types.d.ts.map +1 -0
  14. package/dist/assembly/types.js +5 -0
  15. package/dist/assembly/types.js.map +1 -0
  16. package/dist/characters/describer.d.ts +32 -0
  17. package/dist/characters/describer.d.ts.map +1 -0
  18. package/dist/characters/describer.js +309 -0
  19. package/dist/characters/describer.js.map +1 -0
  20. package/dist/characters/extractor.d.ts +27 -0
  21. package/dist/characters/extractor.d.ts.map +1 -0
  22. package/dist/characters/extractor.js +274 -0
  23. package/dist/characters/extractor.js.map +1 -0
  24. package/dist/characters/reference-manager.d.ts +95 -0
  25. package/dist/characters/reference-manager.d.ts.map +1 -0
  26. package/dist/characters/reference-manager.js +346 -0
  27. package/dist/characters/reference-manager.js.map +1 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +310 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/config.d.ts +22 -0
  33. package/dist/config.d.ts.map +1 -0
  34. package/dist/config.js +66 -0
  35. package/dist/config.js.map +1 -0
  36. package/dist/editing/aligner.d.ts +44 -0
  37. package/dist/editing/aligner.d.ts.map +1 -0
  38. package/dist/editing/aligner.js +201 -0
  39. package/dist/editing/aligner.js.map +1 -0
  40. package/dist/editing/edl.d.ts +45 -0
  41. package/dist/editing/edl.d.ts.map +1 -0
  42. package/dist/editing/edl.js +133 -0
  43. package/dist/editing/edl.js.map +1 -0
  44. package/dist/editing/overlays.d.ts +97 -0
  45. package/dist/editing/overlays.d.ts.map +1 -0
  46. package/dist/editing/overlays.js +41 -0
  47. package/dist/editing/overlays.js.map +1 -0
  48. package/dist/editing/packer.d.ts +52 -0
  49. package/dist/editing/packer.d.ts.map +1 -0
  50. package/dist/editing/packer.js +170 -0
  51. package/dist/editing/packer.js.map +1 -0
  52. package/dist/editing/providers/whisper-cpp.d.ts +32 -0
  53. package/dist/editing/providers/whisper-cpp.d.ts.map +1 -0
  54. package/dist/editing/providers/whisper-cpp.js +239 -0
  55. package/dist/editing/providers/whisper-cpp.js.map +1 -0
  56. package/dist/editing/render.d.ts +36 -0
  57. package/dist/editing/render.d.ts.map +1 -0
  58. package/dist/editing/render.js +227 -0
  59. package/dist/editing/render.js.map +1 -0
  60. package/dist/editing/self-eval.d.ts +48 -0
  61. package/dist/editing/self-eval.d.ts.map +1 -0
  62. package/dist/editing/self-eval.js +293 -0
  63. package/dist/editing/self-eval.js.map +1 -0
  64. package/dist/editing/silence.d.ts +76 -0
  65. package/dist/editing/silence.d.ts.map +1 -0
  66. package/dist/editing/silence.js +189 -0
  67. package/dist/editing/silence.js.map +1 -0
  68. package/dist/editing/types.d.ts +178 -0
  69. package/dist/editing/types.d.ts.map +1 -0
  70. package/dist/editing/types.js +13 -0
  71. package/dist/editing/types.js.map +1 -0
  72. package/dist/index.d.ts +6 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +5 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/interactive.d.ts +12 -0
  77. package/dist/interactive.d.ts.map +1 -0
  78. package/dist/interactive.js +78 -0
  79. package/dist/interactive.js.map +1 -0
  80. package/dist/mini-drama/assembler.d.ts +61 -0
  81. package/dist/mini-drama/assembler.d.ts.map +1 -0
  82. package/dist/mini-drama/assembler.js +466 -0
  83. package/dist/mini-drama/assembler.js.map +1 -0
  84. package/dist/mini-drama/audio-mix.d.ts +65 -0
  85. package/dist/mini-drama/audio-mix.d.ts.map +1 -0
  86. package/dist/mini-drama/audio-mix.js +118 -0
  87. package/dist/mini-drama/audio-mix.js.map +1 -0
  88. package/dist/mini-drama/cli.d.ts +3 -0
  89. package/dist/mini-drama/cli.d.ts.map +1 -0
  90. package/dist/mini-drama/cli.js +2869 -0
  91. package/dist/mini-drama/cli.js.map +1 -0
  92. package/dist/mini-drama/fcpxml-export.d.ts +2 -0
  93. package/dist/mini-drama/fcpxml-export.d.ts.map +1 -0
  94. package/dist/mini-drama/fcpxml-export.js +5 -0
  95. package/dist/mini-drama/fcpxml-export.js.map +1 -0
  96. package/dist/mini-drama/generation-planner.d.ts +24 -0
  97. package/dist/mini-drama/generation-planner.d.ts.map +1 -0
  98. package/dist/mini-drama/generation-planner.js +304 -0
  99. package/dist/mini-drama/generation-planner.js.map +1 -0
  100. package/dist/mini-drama/location-generator.d.ts +23 -0
  101. package/dist/mini-drama/location-generator.d.ts.map +1 -0
  102. package/dist/mini-drama/location-generator.js +144 -0
  103. package/dist/mini-drama/location-generator.js.map +1 -0
  104. package/dist/mini-drama/music-cues.d.ts +96 -0
  105. package/dist/mini-drama/music-cues.d.ts.map +1 -0
  106. package/dist/mini-drama/music-cues.js +332 -0
  107. package/dist/mini-drama/music-cues.js.map +1 -0
  108. package/dist/mini-drama/panel-fixer.d.ts +12 -0
  109. package/dist/mini-drama/panel-fixer.d.ts.map +1 -0
  110. package/dist/mini-drama/panel-fixer.js +319 -0
  111. package/dist/mini-drama/panel-fixer.js.map +1 -0
  112. package/dist/mini-drama/prompt-builder.d.ts +149 -0
  113. package/dist/mini-drama/prompt-builder.d.ts.map +1 -0
  114. package/dist/mini-drama/prompt-builder.js +722 -0
  115. package/dist/mini-drama/prompt-builder.js.map +1 -0
  116. package/dist/mini-drama/reference-slots.d.ts +31 -0
  117. package/dist/mini-drama/reference-slots.d.ts.map +1 -0
  118. package/dist/mini-drama/reference-slots.js +161 -0
  119. package/dist/mini-drama/reference-slots.js.map +1 -0
  120. package/dist/mini-drama/shot-paths.d.ts +77 -0
  121. package/dist/mini-drama/shot-paths.d.ts.map +1 -0
  122. package/dist/mini-drama/shot-paths.js +101 -0
  123. package/dist/mini-drama/shot-paths.js.map +1 -0
  124. package/dist/mini-drama/storyboard-reference-generator.d.ts +47 -0
  125. package/dist/mini-drama/storyboard-reference-generator.d.ts.map +1 -0
  126. package/dist/mini-drama/storyboard-reference-generator.js +293 -0
  127. package/dist/mini-drama/storyboard-reference-generator.js.map +1 -0
  128. package/dist/mini-drama/subtitle-generator.d.ts +12 -0
  129. package/dist/mini-drama/subtitle-generator.d.ts.map +1 -0
  130. package/dist/mini-drama/subtitle-generator.js +139 -0
  131. package/dist/mini-drama/subtitle-generator.js.map +1 -0
  132. package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts +3 -0
  133. package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts.map +1 -0
  134. package/dist/mini-drama/timeline-export/davinci-fcpxml.js +150 -0
  135. package/dist/mini-drama/timeline-export/davinci-fcpxml.js.map +1 -0
  136. package/dist/mini-drama/timeline-export/fcpxml.d.ts +11 -0
  137. package/dist/mini-drama/timeline-export/fcpxml.d.ts.map +1 -0
  138. package/dist/mini-drama/timeline-export/fcpxml.js +140 -0
  139. package/dist/mini-drama/timeline-export/fcpxml.js.map +1 -0
  140. package/dist/mini-drama/timeline-export/index.d.ts +13 -0
  141. package/dist/mini-drama/timeline-export/index.d.ts.map +1 -0
  142. package/dist/mini-drama/timeline-export/index.js +26 -0
  143. package/dist/mini-drama/timeline-export/index.js.map +1 -0
  144. package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts +3 -0
  145. package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts.map +1 -0
  146. package/dist/mini-drama/timeline-export/premiere-xmeml.js +211 -0
  147. package/dist/mini-drama/timeline-export/premiere-xmeml.js.map +1 -0
  148. package/dist/mini-drama/timeline-export/probe.d.ts +53 -0
  149. package/dist/mini-drama/timeline-export/probe.d.ts.map +1 -0
  150. package/dist/mini-drama/timeline-export/probe.js +89 -0
  151. package/dist/mini-drama/timeline-export/probe.js.map +1 -0
  152. package/dist/mini-drama/timeline-export/types.d.ts +57 -0
  153. package/dist/mini-drama/timeline-export/types.d.ts.map +1 -0
  154. package/dist/mini-drama/timeline-export/types.js +14 -0
  155. package/dist/mini-drama/timeline-export/types.js.map +1 -0
  156. package/dist/mini-drama/video-generator.d.ts +22 -0
  157. package/dist/mini-drama/video-generator.d.ts.map +1 -0
  158. package/dist/mini-drama/video-generator.js +1305 -0
  159. package/dist/mini-drama/video-generator.js.map +1 -0
  160. package/dist/mini-drama/voice-reference.d.ts +42 -0
  161. package/dist/mini-drama/voice-reference.d.ts.map +1 -0
  162. package/dist/mini-drama/voice-reference.js +170 -0
  163. package/dist/mini-drama/voice-reference.js.map +1 -0
  164. package/dist/output/html-renderer.d.ts +2 -0
  165. package/dist/output/html-renderer.d.ts.map +1 -0
  166. package/dist/output/html-renderer.js +37 -0
  167. package/dist/output/html-renderer.js.map +1 -0
  168. package/dist/parsers/fountain-parser.d.ts +34 -0
  169. package/dist/parsers/fountain-parser.d.ts.map +1 -0
  170. package/dist/parsers/fountain-parser.js +71 -0
  171. package/dist/parsers/fountain-parser.js.map +1 -0
  172. package/dist/parsers/pdf-parser.d.ts +24 -0
  173. package/dist/parsers/pdf-parser.d.ts.map +1 -0
  174. package/dist/parsers/pdf-parser.js +237 -0
  175. package/dist/parsers/pdf-parser.js.map +1 -0
  176. package/dist/parsers/scene-extractor.d.ts +41 -0
  177. package/dist/parsers/scene-extractor.d.ts.map +1 -0
  178. package/dist/parsers/scene-extractor.js +400 -0
  179. package/dist/parsers/scene-extractor.js.map +1 -0
  180. package/dist/series/manager.d.ts +64 -0
  181. package/dist/series/manager.d.ts.map +1 -0
  182. package/dist/series/manager.js +282 -0
  183. package/dist/series/manager.js.map +1 -0
  184. package/dist/series/types.d.ts +641 -0
  185. package/dist/series/types.d.ts.map +1 -0
  186. package/dist/series/types.js +304 -0
  187. package/dist/series/types.js.map +1 -0
  188. package/dist/storyboard/assembler.d.ts +134 -0
  189. package/dist/storyboard/assembler.d.ts.map +1 -0
  190. package/dist/storyboard/assembler.js +319 -0
  191. package/dist/storyboard/assembler.js.map +1 -0
  192. package/dist/storyboard/prompt-builder.d.ts +113 -0
  193. package/dist/storyboard/prompt-builder.d.ts.map +1 -0
  194. package/dist/storyboard/prompt-builder.js +578 -0
  195. package/dist/storyboard/prompt-builder.js.map +1 -0
  196. package/dist/storyboard/shot-planner.d.ts +34 -0
  197. package/dist/storyboard/shot-planner.d.ts.map +1 -0
  198. package/dist/storyboard/shot-planner.js +446 -0
  199. package/dist/storyboard/shot-planner.js.map +1 -0
  200. package/dist/user-config.d.ts +15 -0
  201. package/dist/user-config.d.ts.map +1 -0
  202. package/dist/user-config.js +103 -0
  203. package/dist/user-config.js.map +1 -0
  204. package/dist/venice/audio-preflight.d.ts +80 -0
  205. package/dist/venice/audio-preflight.d.ts.map +1 -0
  206. package/dist/venice/audio-preflight.js +142 -0
  207. package/dist/venice/audio-preflight.js.map +1 -0
  208. package/dist/venice/audio.d.ts +88 -0
  209. package/dist/venice/audio.d.ts.map +1 -0
  210. package/dist/venice/audio.js +234 -0
  211. package/dist/venice/audio.js.map +1 -0
  212. package/dist/venice/client.d.ts +86 -0
  213. package/dist/venice/client.d.ts.map +1 -0
  214. package/dist/venice/client.js +375 -0
  215. package/dist/venice/client.js.map +1 -0
  216. package/dist/venice/edit.d.ts +57 -0
  217. package/dist/venice/edit.d.ts.map +1 -0
  218. package/dist/venice/edit.js +100 -0
  219. package/dist/venice/edit.js.map +1 -0
  220. package/dist/venice/generate.d.ts +47 -0
  221. package/dist/venice/generate.d.ts.map +1 -0
  222. package/dist/venice/generate.js +150 -0
  223. package/dist/venice/generate.js.map +1 -0
  224. package/dist/venice/image-bytes.d.ts +26 -0
  225. package/dist/venice/image-bytes.d.ts.map +1 -0
  226. package/dist/venice/image-bytes.js +101 -0
  227. package/dist/venice/image-bytes.js.map +1 -0
  228. package/dist/venice/models.d.ts +143 -0
  229. package/dist/venice/models.d.ts.map +1 -0
  230. package/dist/venice/models.js +984 -0
  231. package/dist/venice/models.js.map +1 -0
  232. package/dist/venice/multi-edit.d.ts +40 -0
  233. package/dist/venice/multi-edit.d.ts.map +1 -0
  234. package/dist/venice/multi-edit.js +97 -0
  235. package/dist/venice/multi-edit.js.map +1 -0
  236. package/dist/venice/provenance.d.ts +66 -0
  237. package/dist/venice/provenance.d.ts.map +1 -0
  238. package/dist/venice/provenance.js +151 -0
  239. package/dist/venice/provenance.js.map +1 -0
  240. package/dist/venice/recipe.d.ts +69 -0
  241. package/dist/venice/recipe.d.ts.map +1 -0
  242. package/dist/venice/recipe.js +103 -0
  243. package/dist/venice/recipe.js.map +1 -0
  244. package/dist/venice/rejection.d.ts +63 -0
  245. package/dist/venice/rejection.d.ts.map +1 -0
  246. package/dist/venice/rejection.js +111 -0
  247. package/dist/venice/rejection.js.map +1 -0
  248. package/dist/venice/seedance-preflight.d.ts +38 -0
  249. package/dist/venice/seedance-preflight.d.ts.map +1 -0
  250. package/dist/venice/seedance-preflight.js +29 -0
  251. package/dist/venice/seedance-preflight.js.map +1 -0
  252. package/dist/venice/types.d.ts +212 -0
  253. package/dist/venice/types.d.ts.map +1 -0
  254. package/dist/venice/types.js +9 -0
  255. package/dist/venice/types.js.map +1 -0
  256. package/dist/venice/video.d.ts +77 -0
  257. package/dist/venice/video.d.ts.map +1 -0
  258. package/dist/venice/video.js +163 -0
  259. package/dist/venice/video.js.map +1 -0
  260. package/dist/venice/voices.d.ts +40 -0
  261. package/dist/venice/voices.d.ts.map +1 -0
  262. package/dist/venice/voices.js +194 -0
  263. package/dist/venice/voices.js.map +1 -0
  264. package/package.json +79 -0
package/dist/cli.js ADDED
@@ -0,0 +1,310 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ import { Command } from 'commander';
4
+ import { resolve, basename, extname } from 'node:path';
5
+ import { existsSync } from 'node:fs';
6
+ import { parseFountain } from './parsers/fountain-parser.js';
7
+ import { parsePdfToTokens } from './parsers/pdf-parser.js';
8
+ import { extractScenes, extractAllCharacters } from './parsers/scene-extractor.js';
9
+ import { extractCharacterProfiles } from './characters/extractor.js';
10
+ import { buildCharacterDescriptions } from './characters/describer.js';
11
+ import { ReferenceManager } from './characters/reference-manager.js';
12
+ import { planShots } from './storyboard/shot-planner.js';
13
+ import { buildPrompt, buildVideoPrompt } from './storyboard/prompt-builder.js';
14
+ import { StoryboardAssembler } from './storyboard/assembler.js';
15
+ import { saveStoryboardHtml } from './output/html-renderer.js';
16
+ import { VeniceClient } from './venice/client.js';
17
+ import { createProject, saveProject, loadProject, getVeniceApiKey, createDefaultAesthetic, } from './config.js';
18
+ import { buildManifest } from './assembly/manifest-builder.js';
19
+ import { scaffoldRemotionProject } from './assembly/remotion-scaffold.js';
20
+ const OUTPUT_BASE = resolve('output');
21
+ const program = new Command();
22
+ program
23
+ .name('storyboard')
24
+ .description('Screenplay-to-Storyboard generator using Venice AI')
25
+ .version('0.1.0');
26
+ // ── ingest-screenplay ──────────────────────────────────────────────
27
+ program
28
+ .command('ingest')
29
+ .description('Parse a screenplay file and extract scenes + characters')
30
+ .argument('<path>', 'Path to .fountain or .pdf screenplay file')
31
+ .option('-n, --name <name>', 'Project name (defaults to filename)')
32
+ .action(async (filePath, opts) => {
33
+ const absPath = resolve(filePath);
34
+ if (!existsSync(absPath)) {
35
+ console.error(`File not found: ${absPath}`);
36
+ process.exit(1);
37
+ }
38
+ const ext = extname(absPath).toLowerCase();
39
+ const projectName = opts.name || basename(absPath, ext);
40
+ console.log(`Ingesting screenplay: ${absPath}`);
41
+ // Parse based on file type
42
+ let parsed;
43
+ if (ext === '.fountain') {
44
+ parsed = await parseFountain(absPath);
45
+ }
46
+ else if (ext === '.pdf') {
47
+ parsed = await parsePdfToTokens(absPath);
48
+ }
49
+ else {
50
+ console.error(`Unsupported file type: ${ext}. Use .fountain or .pdf`);
51
+ process.exit(1);
52
+ }
53
+ console.log(`Title: ${parsed.title || 'Untitled'}`);
54
+ console.log(`Tokens parsed: ${parsed.tokens.length}`);
55
+ // Extract scenes
56
+ const scenes = extractScenes(parsed);
57
+ console.log(`Scenes extracted: ${scenes.length}`);
58
+ // Extract characters
59
+ const allCharacters = extractAllCharacters(scenes);
60
+ console.log(`Characters found: ${allCharacters.length}`);
61
+ allCharacters.forEach(c => console.log(` - ${c}`));
62
+ // Extract character profiles
63
+ const profiles = extractCharacterProfiles(scenes);
64
+ const descriptions = buildCharacterDescriptions(profiles);
65
+ // Create project state
66
+ const project = createProject(projectName, absPath, OUTPUT_BASE);
67
+ project.scenes = scenes;
68
+ project.characters = descriptions;
69
+ await saveProject(project);
70
+ console.log(`\nProject saved to: ${project.outputDir}`);
71
+ console.log(`Run 'storyboard lock-characters --project ${project.outputDir}' to generate character references.`);
72
+ });
73
+ // ── lock-characters ────────────────────────────────────────────────
74
+ program
75
+ .command('lock-characters')
76
+ .description('Generate reference images for character consistency')
77
+ .requiredOption('-p, --project <dir>', 'Project output directory')
78
+ .option('-c, --character <name>', 'Lock a specific character (default: all)')
79
+ .action(async (opts) => {
80
+ const project = await loadProject(resolve(opts.project));
81
+ if (!project) {
82
+ console.error('Project not found. Run ingest first.');
83
+ process.exit(1);
84
+ }
85
+ const apiKey = await getVeniceApiKey();
86
+ const client = new VeniceClient(apiKey);
87
+ const refManager = new ReferenceManager(project.outputDir);
88
+ const toProcess = opts.character
89
+ ? project.characters.filter(c => c.name === opts.character?.toUpperCase())
90
+ : project.characters;
91
+ if (toProcess.length === 0) {
92
+ console.error('No matching characters found.');
93
+ process.exit(1);
94
+ }
95
+ console.log(`Generating reference images for ${toProcess.length} character(s)...`);
96
+ for (const desc of toProcess) {
97
+ // Skip characters that are already locked on disk.
98
+ const existing = await refManager.loadReferences(desc.name);
99
+ if (existing) {
100
+ console.log(`\nSkipping ${desc.name} (already locked, seed: ${existing.seed})`);
101
+ if (!project.characterLocks.find(l => l.name === desc.name)) {
102
+ project.characterLocks.push(existing);
103
+ }
104
+ continue;
105
+ }
106
+ console.log(`\nGenerating references for ${desc.name}...`);
107
+ console.log(` Description: ${desc.shortDescription}`);
108
+ const lock = await refManager.generateReferences(client, desc, project.aesthetic);
109
+ project.characterLocks.push(lock);
110
+ await refManager.saveReferences(lock);
111
+ console.log(` Locked: ${desc.name} (seed: ${lock.seed})`);
112
+ }
113
+ await saveProject(project);
114
+ console.log(`\nCharacter locks saved. Run 'storyboard set-aesthetic --project ${project.outputDir}' next.`);
115
+ });
116
+ // ── set-aesthetic ──────────────────────────────────────────────────
117
+ program
118
+ .command('set-aesthetic')
119
+ .description('Set the visual style for the storyboard')
120
+ .requiredOption('-p, --project <dir>', 'Project output directory')
121
+ .option('--style <style>', 'Visual style', 'Cinematic photography')
122
+ .option('--palette <palette>', 'Color palette', 'warm natural palette')
123
+ .option('--lighting <lighting>', 'Lighting style', 'natural lighting with subtle film grain')
124
+ .option('--lens <lens>', 'Lens characteristics', 'anamorphic lens characteristics, shallow depth of field')
125
+ .option('--film <film>', 'Film stock', '35mm Kodak Vision3 500T')
126
+ .action(async (opts) => {
127
+ const project = await loadProject(resolve(opts.project));
128
+ if (!project) {
129
+ console.error('Project not found.');
130
+ process.exit(1);
131
+ }
132
+ const aesthetic = {
133
+ style: opts.style,
134
+ palette: opts.palette,
135
+ lighting: opts.lighting,
136
+ lensCharacteristics: opts.lens,
137
+ filmStock: opts.film,
138
+ };
139
+ project.aesthetic = aesthetic;
140
+ await saveProject(project);
141
+ console.log('Aesthetic profile set:');
142
+ Object.entries(aesthetic).forEach(([k, v]) => console.log(` ${k}: ${v}`));
143
+ console.log(`\nRun 'storyboard generate-scene --project ${project.outputDir} --scene 1' to test.`);
144
+ });
145
+ // ── generate-scene ─────────────────────────────────────────────────
146
+ program
147
+ .command('generate-scene')
148
+ .description('Generate storyboard for a single scene')
149
+ .requiredOption('-p, --project <dir>', 'Project output directory')
150
+ .requiredOption('-s, --scene <number>', 'Scene number', parseInt)
151
+ .action(async (opts) => {
152
+ const project = await loadProject(resolve(opts.project));
153
+ if (!project) {
154
+ console.error('Project not found.');
155
+ process.exit(1);
156
+ }
157
+ const scene = project.scenes.find(s => s.number === opts.scene);
158
+ if (!scene) {
159
+ console.error(`Scene ${opts.scene} not found. Available: ${project.scenes.map(s => s.number).join(', ')}`);
160
+ process.exit(1);
161
+ }
162
+ const aesthetic = project.aesthetic || createDefaultAesthetic();
163
+ const apiKey = await getVeniceApiKey();
164
+ const client = new VeniceClient(apiKey);
165
+ console.log(`\nGenerating storyboard for Scene ${scene.number}: ${scene.heading}`);
166
+ console.log(`Characters: ${scene.characters.join(', ')}`);
167
+ // Plan shots
168
+ const shots = planShots(scene);
169
+ console.log(`Planned ${shots.length} shots`);
170
+ // Build character maps
171
+ const descMap = new Map(project.characters.map(c => [c.name, c]));
172
+ // Load full character locks from disk (with reference images)
173
+ const refManager = new ReferenceManager(project.outputDir);
174
+ const lockMap = new Map();
175
+ for (const cl of project.characterLocks) {
176
+ const full = await refManager.loadReferences(cl.name);
177
+ if (full) {
178
+ lockMap.set(cl.name, full);
179
+ }
180
+ }
181
+ // Build prompts (image + video)
182
+ const promptResults = shots.map(shot => buildPrompt(shot, scene, aesthetic, descMap, lockMap));
183
+ const videoPrompts = shots.map(shot => buildVideoPrompt(shot, scene, aesthetic));
184
+ // Generate images (with video prompt metadata)
185
+ const assembler = new StoryboardAssembler(project.outputDir);
186
+ const panels = await assembler.generateScene(scene.number, scene, shots, promptResults, client, videoPrompts);
187
+ console.log(`Generated ${panels.length} panels for Scene ${scene.number}`);
188
+ // Compile and save HTML (use full locks with reference images)
189
+ const storyboard = await assembler.compileStoryboard(project.name, new Map([[scene.number, panels]]), [scene], Array.from(lockMap.values()), aesthetic);
190
+ const htmlPath = await saveStoryboardHtml(storyboard, resolve(project.outputDir, `scene-${scene.number}-storyboard.html`));
191
+ console.log(`Storyboard HTML saved to: ${htmlPath}`);
192
+ project.completedScenes.push(scene.number);
193
+ await saveProject(project);
194
+ });
195
+ // ── generate-all ───────────────────────────────────────────────────
196
+ program
197
+ .command('generate-all')
198
+ .description('Generate storyboard for all scenes')
199
+ .requiredOption('-p, --project <dir>', 'Project output directory')
200
+ .option('--skip-completed', 'Skip already completed scenes', false)
201
+ .action(async (opts) => {
202
+ const project = await loadProject(resolve(opts.project));
203
+ if (!project) {
204
+ console.error('Project not found.');
205
+ process.exit(1);
206
+ }
207
+ const aesthetic = project.aesthetic || createDefaultAesthetic();
208
+ const apiKey = await getVeniceApiKey();
209
+ const client = new VeniceClient(apiKey);
210
+ const assembler = new StoryboardAssembler(project.outputDir);
211
+ const descMap = new Map(project.characters.map(c => [c.name, c]));
212
+ // Load full character locks from disk (with reference images)
213
+ const refManager = new ReferenceManager(project.outputDir);
214
+ const lockMap = new Map();
215
+ for (const cl of project.characterLocks) {
216
+ const full = await refManager.loadReferences(cl.name);
217
+ if (full) {
218
+ lockMap.set(cl.name, full);
219
+ }
220
+ }
221
+ console.log(`Loaded ${lockMap.size} character locks with reference images`);
222
+ const scenesToProcess = opts.skipCompleted
223
+ ? project.scenes.filter(s => !project.completedScenes.includes(s.number))
224
+ : project.scenes;
225
+ console.log(`Generating storyboard for ${scenesToProcess.length} scenes...`);
226
+ const allPanels = new Map();
227
+ for (const scene of scenesToProcess) {
228
+ console.log(`\n── Scene ${scene.number}: ${scene.heading} ──`);
229
+ const shots = planShots(scene);
230
+ console.log(` ${shots.length} shots planned`);
231
+ const promptResults = shots.map(shot => buildPrompt(shot, scene, aesthetic, descMap, lockMap));
232
+ const videoPrompts = shots.map(shot => buildVideoPrompt(shot, scene, aesthetic));
233
+ const panels = await assembler.generateScene(scene.number, scene, shots, promptResults, client, videoPrompts);
234
+ allPanels.set(scene.number, panels);
235
+ project.completedScenes.push(scene.number);
236
+ console.log(` ${panels.length} panels generated`);
237
+ }
238
+ // Compile full storyboard (use full locks with reference images)
239
+ const storyboard = await assembler.compileStoryboard(project.name, allPanels, project.scenes, Array.from(lockMap.values()), aesthetic);
240
+ const htmlPath = await saveStoryboardHtml(storyboard, resolve(project.outputDir, 'storyboard-full.html'));
241
+ console.log(`\nFull storyboard saved to: ${htmlPath}`);
242
+ await saveProject(project);
243
+ });
244
+ // ── assemble ──────────────────────────────────────────────────────
245
+ program
246
+ .command('assemble')
247
+ .description('Build a Remotion project from generated video clips and render the final film')
248
+ .requiredOption('-p, --project <dir>', 'Project output directory')
249
+ .option('--scaffold-only', 'Only scaffold the Remotion project, skip rendering', false)
250
+ .option('--render-scene <number>', 'Render a single scene instead of the full film', parseInt)
251
+ .action(async (opts) => {
252
+ const project = await loadProject(resolve(opts.project));
253
+ if (!project) {
254
+ console.error('Project not found. Run ingest first.');
255
+ process.exit(1);
256
+ }
257
+ // Step 1: Build manifest from MP4s + video.json + ffprobe
258
+ console.log('Building shot manifest...');
259
+ const manifest = await buildManifest(project);
260
+ if (manifest.totalShots === 0) {
261
+ console.error('No video clips found. Generate videos first.');
262
+ process.exit(1);
263
+ }
264
+ // Step 2: Scaffold the Remotion project
265
+ const { remotionDir, manifestPath, publicDir } = await scaffoldRemotionProject(project.outputDir, manifest);
266
+ // Step 3: Install dependencies
267
+ console.log('\nInstalling Remotion dependencies...');
268
+ const { execSync } = await import('node:child_process');
269
+ try {
270
+ execSync('npm install', {
271
+ cwd: remotionDir,
272
+ stdio: 'inherit',
273
+ timeout: 120000,
274
+ });
275
+ }
276
+ catch (err) {
277
+ console.error('Failed to install dependencies. You can install manually:');
278
+ console.error(` cd ${remotionDir} && npm install`);
279
+ process.exit(1);
280
+ }
281
+ if (opts.scaffoldOnly) {
282
+ console.log(`\nRemotion project scaffolded at: ${remotionDir}`);
283
+ console.log(`Preview: cd ${remotionDir} && npx remotion preview src/index.ts --public-dir="${publicDir}"`);
284
+ console.log(`Render: cd ${remotionDir} && npx remotion render src/index.ts Film --codec=h264 --crf=18 --public-dir="${publicDir}"`);
285
+ return;
286
+ }
287
+ // Step 4: Render
288
+ const compositionId = opts.renderScene
289
+ ? `Scene${opts.renderScene}`
290
+ : 'Film';
291
+ const outputFile = opts.renderScene
292
+ ? resolve(project.outputDir, `scene-${opts.renderScene}-assembled.mp4`)
293
+ : resolve(project.outputDir, `${project.name}-final.mp4`);
294
+ console.log(`\nRendering ${compositionId} to ${outputFile}...`);
295
+ try {
296
+ execSync(`npx remotion render src/index.ts ${compositionId} "${outputFile}" --codec=h264 --crf=18 --public-dir="${publicDir}"`, {
297
+ cwd: remotionDir,
298
+ stdio: 'inherit',
299
+ timeout: 600000, // 10 min max
300
+ });
301
+ console.log(`\nRendered: ${outputFile}`);
302
+ }
303
+ catch (err) {
304
+ console.error('Render failed. You can retry manually:');
305
+ console.error(` cd ${remotionDir} && npx remotion render src/index.ts ${compositionId} "${outputFile}" --codec=h264 --crf=18 --public-dir="${publicDir}"`);
306
+ process.exit(1);
307
+ }
308
+ });
309
+ program.parse();
310
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Scene } from './parsers/scene-extractor.js';
2
+ import type { CharacterDescription } from './characters/describer.js';
3
+ import type { CharacterLock } from './characters/reference-manager.js';
4
+ import type { AestheticProfile } from './storyboard/prompt-builder.js';
5
+ export interface ProjectState {
6
+ name: string;
7
+ screenplayPath: string;
8
+ outputDir: string;
9
+ scenes: Scene[];
10
+ characters: CharacterDescription[];
11
+ characterLocks: CharacterLock[];
12
+ aesthetic: AestheticProfile | null;
13
+ completedScenes: number[];
14
+ createdAt: string;
15
+ updatedAt: string;
16
+ }
17
+ export declare function createDefaultAesthetic(): AestheticProfile;
18
+ export declare function createProject(name: string, screenplayPath: string, outputBase: string): ProjectState;
19
+ export declare function saveProject(state: ProjectState): Promise<void>;
20
+ export declare function loadProject(outputDir: string): Promise<ProjectState | null>;
21
+ export declare function getVeniceApiKey(): Promise<string>;
22
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGvE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAepG;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBpE;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAKjF;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAOvD"}
package/dist/config.js ADDED
@@ -0,0 +1,66 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { existsSync } from 'node:fs';
4
+ import { hydrateEnvironmentFromUserConfig } from './user-config.js';
5
+ const DEFAULT_AESTHETIC = {
6
+ style: 'Cinematic photography',
7
+ palette: 'warm natural palette',
8
+ lighting: 'natural lighting with subtle film grain',
9
+ lensCharacteristics: 'anamorphic lens characteristics, shallow depth of field',
10
+ filmStock: '35mm Kodak Vision3 500T',
11
+ };
12
+ export function createDefaultAesthetic() {
13
+ return { ...DEFAULT_AESTHETIC };
14
+ }
15
+ export function createProject(name, screenplayPath, outputBase) {
16
+ const outputDir = join(outputBase, name.replace(/[^a-zA-Z0-9_-]/g, '_'));
17
+ const now = new Date().toISOString();
18
+ return {
19
+ name,
20
+ screenplayPath,
21
+ outputDir,
22
+ scenes: [],
23
+ characters: [],
24
+ characterLocks: [],
25
+ aesthetic: null,
26
+ completedScenes: [],
27
+ createdAt: now,
28
+ updatedAt: now,
29
+ };
30
+ }
31
+ export async function saveProject(state) {
32
+ if (!existsSync(state.outputDir)) {
33
+ await mkdir(state.outputDir, { recursive: true });
34
+ }
35
+ state.updatedAt = new Date().toISOString();
36
+ // Save state without base64 image data (those are stored as files)
37
+ const serializable = {
38
+ ...state,
39
+ characterLocks: state.characterLocks.map(lock => ({
40
+ ...lock,
41
+ referenceImages: {
42
+ front: '[saved to disk]',
43
+ threeQuarter: '[saved to disk]',
44
+ profile: '[saved to disk]',
45
+ fullBody: '[saved to disk]',
46
+ },
47
+ })),
48
+ };
49
+ await writeFile(join(state.outputDir, 'project.json'), JSON.stringify(serializable, null, 2));
50
+ }
51
+ export async function loadProject(outputDir) {
52
+ const projectFile = join(outputDir, 'project.json');
53
+ if (!existsSync(projectFile))
54
+ return null;
55
+ const data = await readFile(projectFile, 'utf-8');
56
+ return JSON.parse(data);
57
+ }
58
+ export async function getVeniceApiKey() {
59
+ await hydrateEnvironmentFromUserConfig();
60
+ const key = process.env.VENICE_API_KEY;
61
+ if (!key) {
62
+ throw new Error('Venice API key is required. Run `venice-video setup` or set VENICE_API_KEY.');
63
+ }
64
+ return key;
65
+ }
66
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAKrC,OAAO,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAC;AAepE,MAAM,iBAAiB,GAAqB;IAC1C,KAAK,EAAE,uBAAuB;IAC9B,OAAO,EAAE,sBAAsB;IAC/B,QAAQ,EAAE,yCAAyC;IACnD,mBAAmB,EAAE,yDAAyD;IAC9E,SAAS,EAAE,yBAAyB;CACrC,CAAC;AAEF,MAAM,UAAU,sBAAsB;IACpC,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,cAAsB,EAAE,UAAkB;IACpF,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,IAAI;QACJ,cAAc;QACd,SAAS;QACT,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,EAAE;QACd,cAAc,EAAE,EAAE;QAClB,SAAS,EAAE,IAAI;QACf,eAAe,EAAE,EAAE;QACnB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAmB;IACnD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,mEAAmE;IACnE,MAAM,YAAY,GAAG;QACnB,GAAG,KAAK;QACR,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChD,GAAG,IAAI;YACP,eAAe,EAAE;gBACf,KAAK,EAAE,iBAAiB;gBACxB,YAAY,EAAE,iBAAiB;gBAC/B,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,iBAAiB;aAC5B;SACF,CAAC,CAAC;KACJ,CAAC;IACF,MAAM,SAAS,CACb,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,EACrC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CACtC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,gCAAgC,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACvC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Ground-truth script alignment for Venice-generated content.
3
+ *
4
+ * When we already know the exact spoken text (from `ShotScript.vo` or a
5
+ * TTS script), we can produce more accurate word timings than pure ASR by
6
+ * mapping the script's canonical words onto whisper.cpp's detected word
7
+ * timings via longest-common-subsequence alignment.
8
+ *
9
+ * The output is still a `WordTiming[]`, but the `word` field is the
10
+ * script's canonical word (with correct capitalization / punctuation)
11
+ * rather than whisper's best guess. Unmatched script words are linearly
12
+ * interpolated between their neighbors.
13
+ *
14
+ * This matters in practice because TTS voices often produce subtle
15
+ * mispronunciations or swallowed words that whisper transcribes as
16
+ * homophones ("their" vs "there", "a" vs "uh"). For editing purposes
17
+ * we want the script's words — that's what the captions, shot manifest,
18
+ * and VO_TEXT array refer to.
19
+ */
20
+ import type { WordTiming } from './types.js';
21
+ export interface AlignOptions {
22
+ /**
23
+ * How to treat script words that whisper didn't emit at all. With
24
+ * `interpolate` (default), unmatched words are given proportional
25
+ * timings between their aligned neighbors. With `drop`, they're
26
+ * omitted entirely (useful for truncation detection).
27
+ */
28
+ onMissing?: 'interpolate' | 'drop';
29
+ }
30
+ /**
31
+ * Align a ground-truth script against whisper word timings.
32
+ */
33
+ export declare function alignScriptToWords(script: string, asrWords: WordTiming[], options?: AlignOptions): WordTiming[];
34
+ /**
35
+ * Detect VO truncation: returns the portion of the script (if any) that
36
+ * could not be aligned to ASR words because the audio ended before it.
37
+ * Useful as a VO-truncation check (AGENTS.md anti-pattern, rule 26).
38
+ */
39
+ export declare function detectTruncation(script: string, asrWords: WordTiming[]): {
40
+ truncated: boolean;
41
+ lostWords: string[];
42
+ lastAlignedSec: number;
43
+ };
44
+ //# sourceMappingURL=aligner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aligner.d.ts","sourceRoot":"","sources":["../../src/editing/aligner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;CACpC;AA2DD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,GAAE,YAAiB,GACzB,UAAU,EAAE,CAiGd;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,UAAU,EAAE,GACrB;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAwBrE"}