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/CHANGELOG.md ADDED
@@ -0,0 +1,28 @@
1
+ # Changelog
2
+
3
+ ## 2.4.0 — 2026-07-31
4
+
5
+ First standalone CLI release.
6
+
7
+ ### Added
8
+
9
+ - Global `venice-video` command that runs without Cursor, Claude Code, OpenCode, MCP, or another agent host.
10
+ - `venice-video setup` for validated API-key and workspace configuration.
11
+ - `venice-video doctor` plus configuration inspection and cleanup commands.
12
+ - Film-first `venice-video new` wizard. Film projects may be any length.
13
+ - Explicit project workspaces instead of relying on the current directory.
14
+ - Resumable episode production with a standalone vision-QA approval gate.
15
+ - Importable TypeScript package surface for the Venice client, model registry, video generation, and series management.
16
+ - Packed-artifact tests covering setup, key masking, private file permissions, and Film creation.
17
+
18
+ ### Changed
19
+
20
+ - Video retrieval now uses the configured Venice client instead of reading the environment directly.
21
+ - Sharp updated to 0.35.3 to resolve inherited 2026 libvips vulnerabilities.
22
+ - npm artifacts are restricted to compiled output, documentation, and the license.
23
+
24
+ ### Compatibility
25
+
26
+ - Existing `video-harness` and `storyboard` executable aliases remain available.
27
+ - Repository `.env` and `VENICE_API_KEY` workflows remain supported.
28
+ - Agent orchestration files remain in the repository but are not included in the npm package.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jordan Urbs and Venice
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,598 @@
1
+ # Venice Video Harness
2
+
3
+ A standalone, Venice-optimized CLI for **consistency-first video creation** at any length.
4
+
5
+ Install it, enter a Venice API key, and create films directly from the terminal. No coding agent, IDE extension, or MCP host is required. The same repository also includes optional orchestration material for agent-driven workflows.
6
+
7
+ Use it for:
8
+
9
+ - **Character-consistent video projects** (any genre, any length)
10
+ - **Visual-style-locked series or campaigns**
11
+ - **Storyboard-to-video workflows**
12
+ - **Short-form and long-form narrative content** (mini-dramas, documentaries, explainers)
13
+ - **Branded cinematic sequences, trailers, and teasers**
14
+ - **Recurring-character social series**
15
+ - **Any multi-shot Venice workflow where continuity matters**
16
+ - **Text-first editing of existing footage** — transcribe sources with local whisper.cpp, read the 12KB pack, propose a cut, render with 30ms audio fades, then self-eval at every cut boundary. Inspired by [browser-use/video-use](https://github.com/browser-use/video-use).
17
+
18
+ ## What This Is
19
+
20
+ Most Venice integrations are thin wrappers around API calls. This package is the higher-level production layer:
21
+
22
+ - **Standalone `venice-video` CLI** with setup, diagnostics, project creation, generation, QA, assembly, and export commands
23
+ - **Direct Venice API client** with retries, rate limiting, deprecation warnings, and async media polling
24
+ - **Persistent project state** for characters, locations, episodes, references, recipes, and provenance
25
+ - **Comprehensive model registry** covering Venice video, image, audio, and music models
26
+ - **Optional agent orchestration** in `AGENTS.md` and `.claude/` for users who want natural-language operation
27
+
28
+ ## Supported Venice Models (April 2026)
29
+
30
+ ### Video Models
31
+
32
+ Live catalog as of **2026-05-20** (synced against `GET /api/v1/models?type=video` — 103 entries). Families the harness routes to today; private / `-video-to-video` / `-extend-video` variants exist in the live catalog but aren't surfaced here.
33
+
34
+ | Family | Image-to-Video | Text-to-Video | Max Duration | Audio | Special Features |
35
+ |--------|---------------|---------------|-------------|-------|-----------------|
36
+ | **Seedance 2.0** | i2v, R2V | t2v | 15s | Yes (stereo, lip-sync 8+ langs) | **#1 ranked.** R2V: flat `reference_image_urls`, `@Image` tags. Default routing target. |
37
+ | **Seedance 2.0 Fast** | i2v, R2V | t2v | 15s | Yes | Cheaper / faster Seedance 2.0 variant. Same 4-15s ladder, same provenance gate. |
38
+ | **Seedance 1.5 Pro** | i2v | t2v | 12s | Yes | Older Seedance line; kept for parity. |
39
+ | **HappyHorse 1.1** | i2v, R2V (up to 9 refs) | t2v | 15s | Yes (joint single-pass, 7-lang phoneme lip-sync) | **#1 blind-preference T2V + I2V** (Alibaba 15B). 3-15s, 720p/1080p, nine aspect ratios. Best for talking characters + multilingual localization; SFW/commercial-leaning. The `happyhorse` video-family now routes here. |
40
+ | **HappyHorse 1.0** | i2v, R2V | t2v | 15s | Yes | Prior line, kept for back-compat. Livelier hand-camera realism / cinematic grain vs Seedance. |
41
+ | **Wan 2.7** | i2v, R2V, V2V, Spicy | t2v | 15s | Wan i2v has no audio; lip-syncs via `audio_url` input | **Lip-sync flagship.** Only Venice model with proper `audio_url`-driven mouth motion. R2V exposes per-element `audio_url` for multi-speaker. Spicy = uncensored i2v variant. |
42
+ | **Wan 2.6** | Standard, Flash, R2V | Standard | 15s | Yes (i2v/t2v); R2V capped at 10s | Now has R2V variant with `audio_url` input. 1080p. |
43
+ | **Wan 2.5 Preview** | i2v | t2v | 10s | Yes | `audio_url` input. |
44
+ | **Wan 2.2 A14B** | — | t2v | 5s | No | Legacy text-to-video. |
45
+ | **Wan 2.1 Pro** | i2v | — | 6s | No | Legacy. |
46
+ | **Runway Gen-4.5** | Gen-4.5, Turbo, Aleph | Gen-4.5 Text | 10s | No (silent) | Strong motion physics; 7 aspect ratios. No R2V, no audio, no end-image. |
47
+ | **Sora 2** | Standard, Pro | Standard, Pro | Standard 12s / **Pro 20s** | Yes | Pro now reaches 20s + `true_1080p` resolution. |
48
+ | **Veo 3.1** | Fast, Full | Fast, Full | 8s | Yes | Up to 4K resolution. |
49
+ | **Veo 3** | Fast, Full | Fast, Full | 8s | Yes | |
50
+ | **Kling O3** | Pro, Standard, 4K + R2V variants | Pro, Standard, 4K | 15s | Yes | R2V: `elements`, `reference_image_urls`, `scene_image_urls`. 4K variants for delivery-grade output. |
51
+ | **Kling V3** | Pro, Standard, **4K R2V** | Pro, Standard, **4K** | 15s | Yes | 4K variants added 2026-05+. `end_image_url` on R2V. |
52
+ | **Kling 2.6 Pro** | i2v | t2v | 10s | Yes | `end_image_url`. |
53
+ | **Kling 2.5 Turbo Pro** | i2v | t2v | 10s | No | `end_image_url`. |
54
+ | **PixVerse C1** | i2v, R2V, Transition | t2v | **15s** | Yes | Replaces v5.6: same four resolutions but 15s ladder + new R2V variant. |
55
+ | **PixVerse v5.6** | Standard, Transition | Standard | 8s | Yes | Legacy; prefer C1 for new projects. |
56
+ | **Grok Imagine** | i2v, **R2V**, V2V | t2v | i2v/V2V/t2v 15s · R2V 5/8/10s | i2v/t2v: yes · R2V: no | R2V added 2026-05+ (no longer needs Kling fallback). 7 aspect ratios. |
57
+ | **LTX Video 2.0** | Fast, Full, v2.3, 19B + V2V/extend | Fast, Full, v2.3, 19B | 20s (Fast/v2.3) · 10s (Full) · 18s (19B) | Yes | Up to 4K, longest durations. |
58
+ | **Longcat** | Standard, Distilled | Standard, Distilled | **30s** | No | Longest single-shot for non-talking-head work. |
59
+ | **Vidu Q3** | i2v | t2v | 16s | Yes | `reference_image_urls`. |
60
+ | **OVI** | i2v | — | 5s | Yes | |
61
+
62
+ > **Seedance face rule (removed 2026-07):** Seedance 2.0 used to reject face-bearing input images that weren't produced by `seedream-v5-lite` / `seedream-v5-lite-edit`. Venice removed that restriction — any image family now works for face-bearing inputs, so the harness uses `nano-banana-2` for all panels. See [Image / Video Family Pairing](#image--video-family-pairing) below.
63
+
64
+ ### Image Models (28 entries, 2026-05-20 sync)
65
+
66
+ `nano-banana-pro`, `nano-banana-2`, `gpt-image-2` (high-quality alternative to `nano-banana-pro`), `gpt-image-1-5`, `flux-2-pro`, `flux-2-max`, `grok-imagine-image`, `grok-imagine-image-quality`, `hunyuan-image-v3`, `imagineart-1.5-pro`, `qwen-image-2`, `qwen-image-2-pro`, `recraft-v4`, `recraft-v4-pro`, `seedream-v4`, `seedream-v5-lite`, `chroma`, `hidream`, `venice-sd35`, `lustify-sdxl`, `lustify-v7`, `lustify-v8`, `wai-Illustrious`, `z-image-turbo`, `ernie-image`, `ernie-image-turbo`, `wan-2-7-text-to-image`, `wan-2-7-pro-text-to-image`, `bria-bg-remover`
67
+
68
+ New since the last sync: `grok-imagine-image`, `grok-imagine-image-quality`, `lustify-v8`, `ernie-image`, `ernie-image-turbo`, `wan-2-7-text-to-image`, `wan-2-7-pro-text-to-image`. Sunset: bare `qwen-image` (use `qwen-image-2`).
69
+
70
+ ### Multi-Edit Models
71
+
72
+ `qwen-edit`, `qwen-image-2-edit`, `qwen-image-2-pro-edit`, `flux-2-max-edit`, `gpt-image-2-edit` (high-quality alternative to `nano-banana-pro-edit`), `gpt-image-1-5-edit`, `grok-imagine-edit`, `nano-banana-2-edit`, `nano-banana-pro-edit`, `seedream-v4-edit`, `seedream-v5-lite-edit`
73
+
74
+ ### Audio / Music Models
75
+
76
+ - **TTS**: `tts-kokoro` (50+ voices), `tts-qwen3-0-6b`, `tts-qwen3-1-7b` (style-prompted voices)
77
+ - **Music**: `elevenlabs-music`, `minimax-music-v2`, `minimax-music-v25`, `minimax-music-v26`, `lyria-3-pro`, `ace-step-15`, `stable-audio-25`
78
+ - **Expressive speech / prompt-driven audio**: `seed-audio-1-0` (BytePlus Seed Audio 1.0 — 25 named voices, speed 0.5–2, up to a 2048-char prompt; premium prompt-directed narration/VO via the async audio queue). Use `generate-audio --prompt … [--voice … --speed …]`.
79
+ - **SFX**: `elevenlabs-sound-effects-v2`, `mmaudio-v2-text-to-audio`
80
+ - **TTS (ElevenLabs)**: `elevenlabs-tts-v3`, `elevenlabs-tts-multilingual-v2`
81
+
82
+ ## What Makes It Venice-Optimized
83
+
84
+ - Image prompts tuned for Venice image generation models
85
+ - Two-pass panel generation with Venice multi-edit refinement
86
+ - **Model-routing logic** for action, atmosphere, and character-consistency tiers
87
+ - Support for reference-aware video generation (`elements`, `reference_image_urls`, `scene_image_urls`)
88
+ - Environment-aware prompt adaptation (daytime vs night scenes)
89
+ - Venice-native audio generation paths for TTS, SFX, and music
90
+ - **Video quote endpoint** for cost estimation before generation
91
+ - Model-aware parameter building (auto-skips unsupported params per model)
92
+ - **Parallel editing pipeline** — transcribe existing footage locally, read a 12KB pack, render with 30ms audio fades, self-eval at every cut boundary
93
+
94
+ ## Project Structure
95
+
96
+ ```
97
+ AGENTS.md Agent orchestration hub
98
+ .claude/
99
+ commands/ 19 workflow playbooks (see below)
100
+ agents/ 6 specialized agent roles (see below)
101
+ skills/ 6 Venice and workflow knowledge packs (see below)
102
+ .cursor/rules/ IDE-level safety rules
103
+ src/
104
+ venice/ Venice API client layer
105
+ client.ts HTTP transport, retries, rate limiting
106
+ models.ts Complete model registry (50+ models)
107
+ video.ts Video queue/retrieve/quote/complete
108
+ generate.ts Image generation
109
+ multi-edit.ts Multi-image layered editing
110
+ edit.ts Upscale, background remove
111
+ audio.ts TTS, music, SFX, queued audio
112
+ voices.ts Voice catalog (Kokoro + Qwen3)
113
+ types.ts Full API type definitions
114
+ series/ Project state and character management
115
+ manager.ts Create/load/save series
116
+ types.ts Character, ShotScript, SeriesState types
117
+ mini-drama/ Reference narrative video implementation
118
+ cli.ts Commander CLI (25+ commands)
119
+ prompt-builder.ts Image + video prompt construction
120
+ video-generator.ts Video rendering with frame chaining
121
+ generation-planner.ts Single vs multi-shot planning
122
+ panel-fixer.ts Multi-edit character correction
123
+ subtitle-generator.ts SRT from script
124
+ assembler.ts Video assembly + audio mix
125
+ editing/ Parallel editing pipeline (inspired by browser-use/video-use)
126
+ types.ts WordTiming, Take, TakesPack, Edl, EditSession
127
+ packer.ts Collapse word streams -> takes_packed.md
128
+ aligner.ts Ground-truth script alignment for generated VO
129
+ providers/whisper-cpp.ts Local transcription provider
130
+ edl.ts EDL authoring + ffmpeg rendering
131
+ silence.ts silencedetect wrapper + filler-word detection
132
+ render.ts EDL -> final-edit.mp4 with 30ms audio fades
133
+ self-eval.ts Drive cut-qa agent, max 3 iterations
134
+ overlays.ts Overlay manifest types
135
+ storyboard/ Legacy screenplay storyboard pipeline
136
+ characters/ Character extraction and references
137
+ parsers/ Fountain + PDF screenplay parsing
138
+ assembly/ Remotion scaffold and manifest
139
+ scripts/ Utility scripts (.ts tracked, .mjs gitignored)
140
+ templates/ HTML storyboard viewer template
141
+ output/ Generated projects (gitignored)
142
+ ```
143
+
144
+ ## Getting Started
145
+
146
+ ### Requirements
147
+
148
+ - Node.js 20+
149
+ - `ffmpeg` and `ffprobe` on your PATH
150
+ - A Venice API key
151
+ - **Optional (editing pipeline):** `whisper-cpp` on PATH for local transcription
152
+
153
+ ### Standalone install
154
+
155
+ The CLI works directly against the Venice API. Cursor, Claude Code, OpenCode,
156
+ MCP, and other agent harnesses are optional integrations, not runtime requirements.
157
+
158
+ ```bash
159
+ npm install -g venice-video-harness
160
+ venice-video setup
161
+ venice-video doctor
162
+ venice-video new
163
+ ```
164
+
165
+ `venice-video setup` prompts for the API key without echoing it, validates it,
166
+ and stores it in the OS-appropriate user configuration directory with owner-only
167
+ permissions. It also records a default project workspace. Environment variables
168
+ still take precedence for CI or ephemeral use:
169
+
170
+ ```bash
171
+ export VENICE_API_KEY=your_key
172
+ export VENICE_VIDEO_WORKSPACE=~/VeniceVideos
173
+ ```
174
+
175
+ The `new` wizard starts with these production types:
176
+
177
+ 1. **Film** — a film of any length; there is no short-duration assumption
178
+ 2. Series
179
+ 3. Product video
180
+ 4. Music video
181
+ 5. Screenplay
182
+
183
+ A non-interactive Film can also be created explicitly:
184
+
185
+ ```bash
186
+ venice-video new \
187
+ --type film \
188
+ --name "Long Horizon" \
189
+ --concept "A feature-length journey across a flooded world" \
190
+ --genre adventure \
191
+ --audio-strategy native \
192
+ --video-family auto
193
+ ```
194
+
195
+ Useful standalone commands:
196
+
197
+ ```bash
198
+ venice-video config show
199
+ venice-video config set-workspace ~/VeniceVideos
200
+ venice-video config unset-api-key
201
+ venice-video list-series
202
+ venice-video --help
203
+ ```
204
+
205
+ For server environments, prefer `VENICE_API_KEY` instead of writing a user
206
+ configuration file. Credential precedence is environment variable, then stored
207
+ user configuration, then the repository `.env` compatibility path.
208
+
209
+ The setup command stores the key in a user-only configuration file, not the OS
210
+ keychain. On macOS and Linux the file mode is `0600`. Use an environment variable
211
+ or an external secrets manager where file-based storage is not appropriate.
212
+
213
+ ### Repository development
214
+
215
+ ```bash
216
+ npm install
217
+ npm run build
218
+ npm test
219
+ npm run test:legacy
220
+ npm run dev -- <command>
221
+ ```
222
+
223
+ The repository still includes agent orchestration in `AGENTS.md` and `.claude/`.
224
+ Those layers can operate the same execution engine, but the installed
225
+ `venice-video` command does not depend on them.
226
+
227
+ ### Programmatic Usage
228
+
229
+ ```typescript
230
+ import { VeniceClient, generateVideo, quoteVideo, listVideoModels } from 'venice-video-harness';
231
+
232
+ const client = new VeniceClient();
233
+
234
+ // Get a cost estimate
235
+ const quote = await quoteVideo(client, {
236
+ model: 'kling-v3-pro-image-to-video',
237
+ duration: '8s',
238
+ audio: true,
239
+ });
240
+ console.log(`Estimated cost: $${quote.quote}`);
241
+
242
+ // Generate a video
243
+ const result = await generateVideo(client, {
244
+ model: 'kling-v3-pro-image-to-video',
245
+ prompt: 'A slow dolly shot pushes forward...',
246
+ duration: '8s',
247
+ imageUrl: 'data:image/png;base64,...',
248
+ audio: true,
249
+ outputPath: 'output/shot-001.mp4',
250
+ });
251
+
252
+ // Query model capabilities
253
+ const longModels = listVideoModels({ minDurationSec: 20 });
254
+ const refModels = listVideoModels({ supportsElements: true });
255
+ ```
256
+
257
+ ## Video Model Routing
258
+
259
+ The harness defaults are opinionated because consistency is the point:
260
+
261
+ **Seedance 2.0 R2V Enhanced for ALL lanes (reference-first, 2026-07-30). Kling O3 R2V fallback only when characters overflow the 9-reference budget.**
262
+
263
+ Every shot renders in **pure reference mode** — no start image — from an ordered `@ImageN` reference stack of up to 9 images: one primary angle per character, the scene beat's composed **storyboard blocking plate** (where the characters stand in the location relative to each other), multiple location angles (wide/medium/detail), and second character angles. Overflow drops second character angles first, then extra location angles; blocking plates are protected. Voice-donor clips ride alongside as `reference_audio_urls` (`@AudioN`) so each character's voice stays right take to take.
264
+
265
+ | Role | Default Model | When Used |
266
+ |------|--------------|-----------|
267
+ | **Character shots (up to ~6 characters)** | `seedance-2-0-enhanced-reference-to-video` | Default R2V — up to 9 `reference_image_urls` with `@Image` tags (chars + blocking plate + location angles), 1080p, up to 15s, native stereo audio |
268
+ | **Character shots (budget overflow)** | `kling-o3-standard-reference-to-video` | Auto-fallback — structured `elements` for multi-character identity |
269
+ | **Establishing / mood / action** | `seedance-2-0-enhanced-reference-to-video` | Anchors to location reference angles via `@Image` tags |
270
+
271
+ These defaults are overridable per-project via `series.json` → `videoDefaults`. To target a non-Seedance family (e.g. for accounts that lack Seedance access, or projects that need a different look), set `videoDefaults` to `kling-o3-standard-reference-to-video` (character consistency) and `veo3.1-fast-image-to-video` (atmosphere). Image models default to `nano-banana-2` / `nano-banana-2-edit` for all panels regardless of video family.
272
+
273
+ ## Image / Video Family Pairing
274
+
275
+ **Venice removed the Seedance seedream-only face restriction (2026-07).** Seedance 2.0 previously rejected face-bearing input images that weren't produced by `seedream-v5-lite` / `seedream-v5-lite-edit`; it now accepts face-bearing images from **any** image family. The harness therefore uses a single high-quality default for every panel — character-bearing or faceless, generation or multi-edit:
276
+
277
+ | Image Role | Default | Why |
278
+ |------------|---------|-----|
279
+ | Character reference sheets | `nano-banana-2` | Any family works — no seedream requirement |
280
+ | Character-bearing panels | `nano-banana-2` | Any family works — no seedream requirement |
281
+ | Character fix via multi-edit | `nano-banana-2-edit` | Any family works |
282
+ | Atmosphere / establishing panels | `nano-banana-2` (configurable) | `gpt-image-2` / `nano-banana-pro` are high-quality alternatives |
283
+ | Style-match multi-edit (no characters) | `nano-banana-2-edit` (configurable) | `gpt-image-2-edit` is a high-quality alternative |
284
+
285
+ Defaults are configurable per-project under `series.json`:
286
+
287
+ ```json
288
+ {
289
+ "videoDefaults": {
290
+ "actionModel": "seedance-2-0-enhanced-reference-to-video",
291
+ "atmosphereModel": "seedance-2-0-enhanced-reference-to-video",
292
+ "characterConsistencyModel": "seedance-2-0-enhanced-reference-to-video",
293
+ "imageDefaults": {
294
+ "generationModel": "nano-banana-2",
295
+ "editModel": "nano-banana-2-edit"
296
+ }
297
+ }
298
+ }
299
+ ```
300
+
301
+ ### Seedance Pre-flight Gate (neutralized)
302
+
303
+ The former provenance-driven pre-flight gate is a **no-op** as of 2026-07. Because Seedance accepts any image family, there is nothing to validate, reroute, or launder before a Seedance call — `ensureSeedanceCompatibility()` always proceeds and `videoDefaults.seedanceCompatibility` is no longer auto-set (an explicit value is read but does nothing meaningful). Provenance sidecars (`shot-NNN.provenance.json`) are still written as metadata for other tooling but nothing gates on them. (The separate Seedance face **consent** attestation, HTTP 409 `needs_consent`, is unrelated and still handled at queue time.)
304
+
305
+ The sidecar shape:
306
+
307
+ ```json
308
+ {
309
+ "generationModel": "nano-banana-2",
310
+ "editModels": ["nano-banana-2-edit"],
311
+ "hasFace": true,
312
+ "createdAt": "...",
313
+ "updatedAt": "..."
314
+ }
315
+ ```
316
+
317
+ Provenance sidecars are written automatically by the storyboard assembler, panel-fixer, reference-manager, and the mini-drama panel generator. Images without a sidecar (e.g. files from before this change) are treated as "unknown" and will trigger the pre-flight gate. If you know an existing image has no face, hand-edit its sidecar to add `"hasFace": false` and the gate will pass.
318
+
319
+ If you want to skip the pre-flight entirely, target a non-Seedance video model (e.g. switch `videoDefaults` to Kling O3 + Veo).
320
+
321
+ ## Reference Implementation
322
+
323
+ The `src/mini-drama/` directory contains a full working implementation for narrative mini-drama production. Use it directly or adapt the patterns for your own format:
324
+
325
+ - Series/character/episode management
326
+ - Script workshopping via LLM
327
+ - Two-pass storyboard generation (generate + multi-edit refine)
328
+ - Vision-based QA
329
+ - Video generation with frame chaining
330
+ - Audio post-production with layered ambient beds
331
+ - Subtitle burn-in and final assembly
332
+
333
+ ## Editing Pipeline
334
+
335
+ Parallel to the generation pipeline. The generation side **synthesizes** new shots from prompts; the editing side **cuts** already-existing media (Venice-generated shots or real raw footage). They share ffmpeg and the burn-in-subtitles skill but are otherwise independent.
336
+
337
+ Inspired by [browser-use/video-use](https://github.com/browser-use/video-use), the pipeline is text-first: the LLM reads a compact `takes_packed.md` (~12KB per 40 min of audio) rather than frame-dumping video. Composite PNGs are only consulted at explicit decision points — comparing retakes, disambiguating a pause, verifying post-render QA.
338
+
339
+ ### When to reach for editing vs generation
340
+
341
+ | Task | Pipeline | Entry |
342
+ |------|----------|-------|
343
+ | Synthesize new shots from prompts | Generation | `/produce-episode`, `/generate-episode-videos` |
344
+ | Re-cut a generated episode for pacing | Editing | `/edit-footage` |
345
+ | Trim filler words from a VO take | Editing | `/edit-footage` |
346
+ | Edit raw user-supplied footage | Editing | `/edit-footage` |
347
+ | Rescue a truncated TTS VO (rule 26) | Editing | `/edit-footage` |
348
+ | Add branded lower-thirds / title cards | Editing | `overlay-designer` agent |
349
+ | Post-assembly QA on any rendered video | Editing | `cut-qa` agent |
350
+
351
+ ### The five steps
352
+
353
+ 1. **Transcribe** via local whisper.cpp → per-source `*.words.json` + `takes_packed.md`
354
+ 2. **Read pack** — LLM forms a cut strategy from text alone
355
+ 3. **Confirm** — propose strategy to user, wait for "yes / revise / cancel"
356
+ 4. **Render EDL** — JSON cut list → ffmpeg concat with 30ms audio fades (archive-first)
357
+ 5. **Self-eval** — `cut-qa` agent runs 6 programmatic checks at every cut boundary; max 3 fix iterations
358
+
359
+ ### Required tooling
360
+
361
+ - `whisper-cpp` on PATH (`brew install whisper-cpp`)
362
+ - A whisper.cpp model, e.g.:
363
+ ```bash
364
+ mkdir -p ~/.cache/whisper.cpp
365
+ curl -L -o ~/.cache/whisper.cpp/ggml-base.en.bin \
366
+ https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin
367
+ ```
368
+ - `sharp` npm dep (bundled) for the `timeline-view` composite
369
+ - `ffmpeg` + `ffprobe` (already required by the generation pipeline)
370
+
371
+ ### cut-qa checks
372
+
373
+ Runs automatically after every assembly or edit render. Each check produces zero or more `CutQaFinding` entries:
374
+
375
+ | Check | Kind | Typical severity |
376
+ |-------|------|------------------|
377
+ | Aspect regression vs `series.storyboardAspectRatio` | `aspect-regression` | `fail` |
378
+ | Frame-hash jump across a cut | `visual-jump` | `warn` (or `fail` if inside a word) |
379
+ | VO truncation vs ground-truth script | `vo-truncation` | `fail` |
380
+ | Mean-luma delta across a cut in the same location | `lighting-discontinuity` | `warn` |
381
+ | Audio peak > -6 dBFS within cut boundary | `audio-pop` | `fail` |
382
+ | Caption overlap with in-frame text | `subtitle-overlap` | `warn` |
383
+
384
+ Hard cap at 3 fix iterations before surfacing to the user with the persisting findings and the fixes that were attempted.
385
+
386
+ ### Overlay pipeline
387
+
388
+ Branded motion graphics (lower-thirds, title cards, chapter markers, logo bugs) are a post-process on top of the delivered cut — never baked into the EDL render. The `overlay-designer` agent plans the overlays, spawns Remotion / ffmpeg workers in parallel, and composites via `scripts/render-overlay.ts`.
389
+
390
+ Venice-logo safety rules (AGENTS.md rule 17, anti-pattern #11) are enforced at manifest validation time — manifests that contain "VVV" / "triple-V" or pass mostly-transparent PNGs are rejected before rendering.
391
+
392
+ ### Editing pipeline commands
393
+
394
+ ```bash
395
+ # Transcribe a folder of sources into a pack + per-source words.json
396
+ npx tsx scripts/transcribe-sources.ts \
397
+ --dir output/<project>/shots \
398
+ --out output/<project>/edit/takes_packed.md \
399
+ --model base.en
400
+
401
+ # Align against a ground-truth TTS script (detects VO truncation)
402
+ npx tsx scripts/transcribe-sources.ts \
403
+ --dir output/<project>/audio \
404
+ --out output/<project>/edit/takes_packed.md \
405
+ --aligned-from scripts/<project>/config.ts
406
+
407
+ # Inspect a specific time range as a composite PNG
408
+ npx tsx scripts/timeline-view.ts \
409
+ --video output/<project>/final.mp4 \
410
+ --start 12.3 --end 16.1 \
411
+ --words output/<project>/edit/final.words.json \
412
+ --out /tmp/tl.png
413
+
414
+ # Composite overlays onto a delivered cut
415
+ npx tsx scripts/render-overlay.ts \
416
+ --manifest output/<project>/overlays/manifest.json
417
+ ```
418
+
419
+ See [`.claude/skills/video-editing/SKILL.md`](.claude/skills/video-editing/SKILL.md) for the full philosophy, EDL format, and editing-specific anti-patterns.
420
+
421
+ ## Timeline Export (NLE round-trip)
422
+
423
+ After an episode is rendered, the harness can export the assembled timeline as an XML file that imports into your editor of choice. Every video segment, dialogue clip, SFX clip, and music cue lands on its own track so you can fine-tune cuts, audio balance, and color in the NLE instead of editing the assembler's ffmpeg filter graph.
424
+
425
+ ```bash
426
+ # Final Cut Pro X (FCPXML 1.10) — the original path
427
+ mini-drama export-timeline -p output/<project> -e 1 --format fcpxml
428
+
429
+ # Adobe Premiere Pro (Final Cut Pro 7 XML / xmeml v5)
430
+ mini-drama export-timeline -p output/<project> -e 1 --format premiere
431
+
432
+ # DaVinci Resolve (Resolve-tuned FCPXML 1.10)
433
+ mini-drama export-timeline -p output/<project> -e 1 --format davinci
434
+ ```
435
+
436
+ Output filename mirrors the format:
437
+
438
+ | Format | File | Import path |
439
+ |--------|------|-------------|
440
+ | `fcpxml` | `episode-NNN.fcpxml` | FCP X → File → Import → XML… |
441
+ | `premiere` | `episode-NNN.premiere.xml` | Premiere → File → Import… |
442
+ | `davinci` | `episode-NNN.resolve.fcpxml` | Resolve → File → Import → Timeline… |
443
+
444
+ Lane layout (same across formats):
445
+
446
+ - Primary video track — every rendered shot in spine order, segment audio muted (-96 dB)
447
+ - Lane −1 (dialogue) — one clip per shot from `audio/dialogue-shot-NNN.mp3`
448
+ - Lane −2 (SFX) — one clip per `audio/sfx/*.mp3` matched to its shot
449
+ - Lane −3 (music) — `audio/music.mp3` spanning the full sequence
450
+
451
+ The `export-fcpxml` command from is kept as a thin alias of `export-timeline --format fcpxml` for back-compat.
452
+
453
+ **NLE XML implementations vary by editor version.** If your editor refuses the import, or any clip lands on the wrong track or wrong timecode, please [open a GitHub Issue](https://github.com/jordanurbs/venice-video-harness/issues/new) with:
454
+
455
+ - editor name + exact version
456
+ - the format you exported (`fcpxml` / `premiere` / `davinci`)
457
+ - the generated XML file attached (or relevant snippet)
458
+ - what FCP X / Premiere / Resolve reported
459
+
460
+ Bug reports are how we'll catch the gaps — the test fixture confirms structure, but it can't substitute for real NLE import paths.
461
+
462
+ ## Commands, Agents, and Skills
463
+
464
+ ### Workflow Commands (`.claude/commands/`)
465
+
466
+ | Command | Purpose |
467
+ |---------|---------|
468
+ | `new-series` | Create a new series with locked aesthetics |
469
+ | `add-character` | Add a character with reference images |
470
+ | `lock-character` | Lock a character's voice (add `--voice-reference <file>` to import a voice-donor clip) |
471
+ | `lock-characters` | Batch voice locking |
472
+ | `generate-voice-reference` | Generate/import a character voice-donor clip (`reference_audio_urls` / @AudioN, Seedance & HappyHorse R2V) |
473
+ | `add-location` | Add a location with generated reference images (wide / medium / detail) |
474
+ | `generate-location-references` | Regenerate a location's reference images |
475
+ | `set-aesthetic` | Set or derive series aesthetic |
476
+ | `explore-aesthetic` | Generate aesthetic comparison samples |
477
+ | `workshop-episode` | Collaborative episode scripting |
478
+ | `storyboard-episode` | Storyboard one episode |
479
+ | `storyboard-scene` | Storyboard a single scene |
480
+ | `storyboard-all` | Storyboard all scenes |
481
+ | `fix-panel` | Fix a panel with multi-edit |
482
+ | `qa-storyboard` | Visual QA on panels |
483
+ | `generate-episode-videos` | Generate episode videos from panels |
484
+ | `generate-videos` | General video generation |
485
+ | `assemble-episode` | Final assembly with audio and subtitles |
486
+ | `produce-episode` | Full pipeline in one command |
487
+ | `audition-voices` | TTS voice auditions |
488
+ | `generate-trailer` | Full trailer pipeline |
489
+ | `ingest-screenplay` | Ingest Fountain/PDF screenplay |
490
+ | `edit-footage` | Text-first editing pipeline for existing media (cuts, trims, re-orders) |
491
+
492
+ ### Specialized Agents (`.claude/agents/`)
493
+
494
+ | Agent | Role |
495
+ |-------|------|
496
+ | `art-director` | Aesthetic decisions, palette, lighting, composition |
497
+ | `prompt-engineer` | Venice image prompts, character consistency |
498
+ | `screenplay-reader` | Fountain/PDF parsing and scene extraction |
499
+ | `storyboard-assembler` | HTML storyboard viewer assembly |
500
+ | `storyboard-qa` | Panel QA for continuity and character checks |
501
+ | `trailer-curator` | Trailer shot selection and anti-spoiler rules |
502
+ | `cut-qa` | Post-render quality gate — 6 checks at every cut boundary, max 3 fix iterations |
503
+ | `overlay-designer` | Plans branded motion graphics; spawns Remotion / ffmpeg overlay workers in parallel |
504
+ | `remotion-overlay` | Renders one animated overlay as transparent ProRes / WebM |
505
+ | `ffmpeg-overlay` | Emits drawtext specs for static overlays |
506
+
507
+ ### Production Skills (`.claude/skills/`)
508
+
509
+ | Skill | Purpose |
510
+ |-------|---------|
511
+ | `venice-api` | Venice REST API usage and defaults |
512
+ | `venice-video-model-routing` | R2V-first model routing, decision trees, scripts |
513
+ | `character-consistency` | Multi-shot character consistency guidance |
514
+ | `shot-composition` | Shot composition and camera guidance |
515
+ | `screenplay-parsing` | Screenplay parsing workflows |
516
+ | `venice-ui-production` | Manual Venice web UI prompt guides |
517
+ | `video-editing` | Text-first editing philosophy, EDL format, cut-qa loop (inspired by browser-use/video-use) |
518
+
519
+ ### Directing layer (optional): Seedance 2.0 Skill OS
520
+
521
+ The harness is the *production crew* — it locks identity, routes models, QA's panels, mixes audio, and assembles. It does not, by itself, make a shot feel **directed**. The [**Seedance 2.0 Skill OS**](https://github.com/emily2040/seedance-2.0) supplies that missing brain: pure directing/prompting knowledge (no execution code) built on one principle — **direct the scene, don't decorate it.** Read the beat's dramatic function, name one intention, and derive camera, light, blocking, performance, and sound from it instead of stacking "cinematic" adjectives; hold one directorial voice across the whole story. Venice ships **Seedance 2.0 (+ Fast)** as a video model family, so the directing knowledge applies almost verbatim.
522
+
523
+ This principle is already baked into the harness where it matters:
524
+
525
+ - The **workshop system prompt** (`src/mini-drama/cli.ts`) carries a "DIRECT THE SCENE, DON'T DECORATE IT" block, so both the CLI and the `venice-video-mcp` `episode.workshop` produce directed scripts.
526
+ - `.claude/agents/prompt-engineer.md`, `.claude/skills/shot-composition/SKILL.md`, and `.claude/commands/workshop-episode.md` open with the same directing preface for Claude-Code-in-repo sessions.
527
+ - The `buildVideoPrompt` builders document the principle so future prompt logic stays directed.
528
+
529
+ Install Seedance OS to unlock its full `directing-engine`, genre library, `retake-protocol`, `continuation-handoff`, `seedance-copyright`, `seedance-antislop`, and multilingual `vocab/*`:
530
+
531
+ ```bash
532
+ # Clone the repo (its root is shaped as the seedance-20 skill) into the skills dir:
533
+ git clone https://github.com/emily2040/seedance-2.0 .claude/skills/seedance-20
534
+ ```
535
+
536
+ **Division of labor to respect:** the harness owns identity (R2V refs + Seedance → Wan keyframe pass), durations (the pre-flight gate + 15s default), and model routing. So use Seedance OS for **intention/camera/light/blocking/performance/sound** only — do not hand-write identity locks, `[Image1]` reference tags, or surface-specific durations into prompts. Skip Seedance OS's `api-status.md` / `surface-prompt-profiles.md` / `api-workflow.md` / `model-name-map.md` (those describe non-Venice surfaces). The `venice-video-mcp` repo's `venice-mcp-directing` skill is the matching bridge for MCP-driven work.
537
+
538
+ ## Production Anti-Patterns
539
+
540
+ The harness documents 13 production anti-patterns learned from real shoots in `AGENTS.md`. These cover:
541
+
542
+ - Multi-shot grouping bugs (wrong character overlap checks)
543
+ - Character reference style drift across angles
544
+ - Duration validation failures per model
545
+ - R2V aspect ratio defaults causing portrait-mode bugs
546
+ - Multi-edit cropping foreheads on close-up panels
547
+ - Lighting inconsistency between consecutive shots
548
+ - Logo/sigil prompt mismatches
549
+ - Seedance 2.0's former seedream-only face-image restriction (removed by Venice 2026-07; gate now neutralized)
550
+ - And more
551
+
552
+ See `AGENTS.md` > "Learned Anti-Patterns" for the full list with root causes and fixes.
553
+
554
+ ## API Coverage
555
+
556
+ | Venice Endpoint | Status | Module |
557
+ |----------------|--------|--------|
558
+ | `POST /image/generate` | Full | `generate.ts` |
559
+ | `POST /image/multi-edit` | Full | `multi-edit.ts` |
560
+ | `POST /image/upscale` | Full | `edit.ts` |
561
+ | `POST /image/background-remove` | Full | `edit.ts` |
562
+ | `POST /video/queue` | Full | `video.ts` |
563
+ | `POST /video/retrieve` | Full | `video.ts` |
564
+ | `POST /video/quote` | Full | `video.ts` |
565
+ | `POST /video/complete` | Full | `video.ts` |
566
+ | `POST /audio/speech` | Full | `audio.ts` |
567
+ | `POST /audio/queue` | Full | `audio.ts` |
568
+ | `POST /audio/retrieve` | Full | `audio.ts` |
569
+ | `POST /audio/complete` | Full | `audio.ts` |
570
+ | `POST /chat/completions` | Partial | `client.ts` (vision) |
571
+ | `POST /images/edit` | Deprecated | `edit.ts` |
572
+
573
+ ## Credits and Acknowledgments
574
+
575
+ The editing pipeline (text-first transcripts, on-demand timeline composites, EDL + self-eval loop, parallel overlay sub-agents) is directly inspired by [**browser-use/video-use**](https://github.com/browser-use/video-use) — a 100% open source agentic video editor for Claude Code. Their core insight — *"the LLM never watches the video, it reads it"* via word-level transcripts plus on-demand filmstrip+waveform composites — is what makes agent-driven editing actually work instead of drowning in frame-dump tokens.
576
+
577
+ Key patterns borrowed and adapted for this harness:
578
+
579
+ - The `takes_packed.md` format and compact per-take phrase blocks
580
+ - The timeline-view composite (filmstrip + waveform + word labels + silence-gap markers)
581
+ - 30ms audio fades at every cut boundary to prevent pops
582
+ - Self-evaluating QA loop at cut boundaries, max 3 fix iterations
583
+ - Session persistence (`project.md` → our `session.json`) for cross-session memory
584
+ - Parallel sub-agent spawning for overlay / animation rendering
585
+ - The "ask → confirm strategy → execute → self-eval → persist" design principle
586
+
587
+ Differences in this port:
588
+
589
+ - Uses local **whisper.cpp** instead of ElevenLabs Scribe (no new API keys required; loses diarization out of the box — we inject speaker labels from the shot script for generated content instead)
590
+ - Ground-truth script alignment mode via LCS matching, with automatic VO-truncation detection (rule 26 rescue)
591
+ - Integrated with Venice's generation pipeline: shared provenance sidecars, shared ffmpeg primitives, shared burn-in-subtitles skill
592
+ - TypeScript (Node) rather than Python, to stay consistent with the rest of the harness
593
+
594
+ Go give [browser-use/video-use](https://github.com/browser-use/video-use) a star. It's a clean, opinionated reference for text-first video editing and it's the right shape for this kind of tool.
595
+
596
+ ## License
597
+
598
+ MIT
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Builds a shot manifest by scanning scene directories for MP4s,
3
+ * running ffprobe for timing data, and reading video.json for metadata.
4
+ */
5
+ import type { ShotManifest } from './types.js';
6
+ import type { ProjectState } from '../config.js';
7
+ export declare function buildManifest(project: ProjectState): Promise<ShotManifest>;
8
+ //# sourceMappingURL=manifest-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-builder.d.ts","sourceRoot":"","sources":["../../src/assembly/manifest-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAkHjD,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA6GhF"}