videoclaw 3.0.0-alpha.1

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 (1452) hide show
  1. package/AGENTS.md +165 -0
  2. package/CLAUDE.md +232 -0
  3. package/LICENSE +36 -0
  4. package/README.md +737 -0
  5. package/dist/cli/args.d.ts +59 -0
  6. package/dist/cli/args.d.ts.map +1 -0
  7. package/dist/cli/args.js +279 -0
  8. package/dist/cli/args.js.map +1 -0
  9. package/dist/cli/handlers/analysis.d.ts +3 -0
  10. package/dist/cli/handlers/analysis.d.ts.map +1 -0
  11. package/dist/cli/handlers/analysis.js +111 -0
  12. package/dist/cli/handlers/analysis.js.map +1 -0
  13. package/dist/cli/handlers/audio.d.ts +25 -0
  14. package/dist/cli/handlers/audio.d.ts.map +1 -0
  15. package/dist/cli/handlers/audio.js +321 -0
  16. package/dist/cli/handlers/audio.js.map +1 -0
  17. package/dist/cli/handlers/batch.d.ts +4 -0
  18. package/dist/cli/handlers/batch.d.ts.map +1 -0
  19. package/dist/cli/handlers/batch.js +424 -0
  20. package/dist/cli/handlers/batch.js.map +1 -0
  21. package/dist/cli/handlers/candidates.d.ts +10 -0
  22. package/dist/cli/handlers/candidates.d.ts.map +1 -0
  23. package/dist/cli/handlers/candidates.js +389 -0
  24. package/dist/cli/handlers/candidates.js.map +1 -0
  25. package/dist/cli/handlers/character.d.ts +8 -0
  26. package/dist/cli/handlers/character.d.ts.map +1 -0
  27. package/dist/cli/handlers/character.js +202 -0
  28. package/dist/cli/handlers/character.js.map +1 -0
  29. package/dist/cli/handlers/clone.d.ts +5 -0
  30. package/dist/cli/handlers/clone.d.ts.map +1 -0
  31. package/dist/cli/handlers/clone.js +303 -0
  32. package/dist/cli/handlers/clone.js.map +1 -0
  33. package/dist/cli/handlers/create.d.ts +5 -0
  34. package/dist/cli/handlers/create.d.ts.map +1 -0
  35. package/dist/cli/handlers/create.js +635 -0
  36. package/dist/cli/handlers/create.js.map +1 -0
  37. package/dist/cli/handlers/execution.d.ts +5 -0
  38. package/dist/cli/handlers/execution.d.ts.map +1 -0
  39. package/dist/cli/handlers/execution.js +132 -0
  40. package/dist/cli/handlers/execution.js.map +1 -0
  41. package/dist/cli/handlers/library.d.ts +8 -0
  42. package/dist/cli/handlers/library.d.ts.map +1 -0
  43. package/dist/cli/handlers/library.js +77 -0
  44. package/dist/cli/handlers/library.js.map +1 -0
  45. package/dist/cli/handlers/media-ops.d.ts +7 -0
  46. package/dist/cli/handlers/media-ops.d.ts.map +1 -0
  47. package/dist/cli/handlers/media-ops.js +120 -0
  48. package/dist/cli/handlers/media-ops.js.map +1 -0
  49. package/dist/cli/handlers/media-production.d.ts +56 -0
  50. package/dist/cli/handlers/media-production.d.ts.map +1 -0
  51. package/dist/cli/handlers/media-production.js +673 -0
  52. package/dist/cli/handlers/media-production.js.map +1 -0
  53. package/dist/cli/handlers/motion-overlay.d.ts +10 -0
  54. package/dist/cli/handlers/motion-overlay.d.ts.map +1 -0
  55. package/dist/cli/handlers/motion-overlay.js +651 -0
  56. package/dist/cli/handlers/motion-overlay.js.map +1 -0
  57. package/dist/cli/handlers/multi-shot.d.ts +2 -0
  58. package/dist/cli/handlers/multi-shot.d.ts.map +1 -0
  59. package/dist/cli/handlers/multi-shot.js +424 -0
  60. package/dist/cli/handlers/multi-shot.js.map +1 -0
  61. package/dist/cli/handlers/project-ops.d.ts +14 -0
  62. package/dist/cli/handlers/project-ops.d.ts.map +1 -0
  63. package/dist/cli/handlers/project-ops.js +241 -0
  64. package/dist/cli/handlers/project-ops.js.map +1 -0
  65. package/dist/cli/handlers/prompt-craft.d.ts +8 -0
  66. package/dist/cli/handlers/prompt-craft.d.ts.map +1 -0
  67. package/dist/cli/handlers/prompt-craft.js +397 -0
  68. package/dist/cli/handlers/prompt-craft.js.map +1 -0
  69. package/dist/cli/handlers/provider-registration.d.ts +29 -0
  70. package/dist/cli/handlers/provider-registration.d.ts.map +1 -0
  71. package/dist/cli/handlers/provider-registration.js +225 -0
  72. package/dist/cli/handlers/provider-registration.js.map +1 -0
  73. package/dist/cli/handlers/reference-sheets.d.ts +6 -0
  74. package/dist/cli/handlers/reference-sheets.d.ts.map +1 -0
  75. package/dist/cli/handlers/reference-sheets.js +181 -0
  76. package/dist/cli/handlers/reference-sheets.js.map +1 -0
  77. package/dist/cli/handlers/reporting.d.ts +18 -0
  78. package/dist/cli/handlers/reporting.d.ts.map +1 -0
  79. package/dist/cli/handlers/reporting.js +155 -0
  80. package/dist/cli/handlers/reporting.js.map +1 -0
  81. package/dist/cli/handlers/review-portal.d.ts +8 -0
  82. package/dist/cli/handlers/review-portal.d.ts.map +1 -0
  83. package/dist/cli/handlers/review-portal.js +276 -0
  84. package/dist/cli/handlers/review-portal.js.map +1 -0
  85. package/dist/cli/handlers/show.d.ts +11 -0
  86. package/dist/cli/handlers/show.d.ts.map +1 -0
  87. package/dist/cli/handlers/show.js +136 -0
  88. package/dist/cli/handlers/show.js.map +1 -0
  89. package/dist/cli/handlers/stages.d.ts +6 -0
  90. package/dist/cli/handlers/stages.d.ts.map +1 -0
  91. package/dist/cli/handlers/stages.js +333 -0
  92. package/dist/cli/handlers/stages.js.map +1 -0
  93. package/dist/cli/handlers/studio.d.ts +2 -0
  94. package/dist/cli/handlers/studio.d.ts.map +1 -0
  95. package/dist/cli/handlers/studio.js +159 -0
  96. package/dist/cli/handlers/studio.js.map +1 -0
  97. package/dist/cli/handlers/templates.d.ts +7 -0
  98. package/dist/cli/handlers/templates.d.ts.map +1 -0
  99. package/dist/cli/handlers/templates.js +61 -0
  100. package/dist/cli/handlers/templates.js.map +1 -0
  101. package/dist/cli/provider-adapter.d.ts +3 -0
  102. package/dist/cli/provider-adapter.d.ts.map +1 -0
  103. package/dist/cli/provider-adapter.js +96 -0
  104. package/dist/cli/provider-adapter.js.map +1 -0
  105. package/dist/cli/vclaw.d.ts +15 -0
  106. package/dist/cli/vclaw.d.ts.map +1 -0
  107. package/dist/cli/vclaw.js +318 -0
  108. package/dist/cli/vclaw.js.map +1 -0
  109. package/dist/index.d.ts +79 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +68 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/mcp/index.d.ts +3 -0
  114. package/dist/mcp/index.d.ts.map +1 -0
  115. package/dist/mcp/index.js +3 -0
  116. package/dist/mcp/index.js.map +1 -0
  117. package/dist/mcp/server.d.ts +27 -0
  118. package/dist/mcp/server.d.ts.map +1 -0
  119. package/dist/mcp/server.js +168 -0
  120. package/dist/mcp/server.js.map +1 -0
  121. package/dist/mcp/tools.d.ts +55 -0
  122. package/dist/mcp/tools.d.ts.map +1 -0
  123. package/dist/mcp/tools.js +80 -0
  124. package/dist/mcp/tools.js.map +1 -0
  125. package/dist/video/analyze-output.d.ts +5 -0
  126. package/dist/video/analyze-output.d.ts.map +1 -0
  127. package/dist/video/analyze-output.js +7 -0
  128. package/dist/video/analyze-output.js.map +1 -0
  129. package/dist/video/archive-project.d.ts +14 -0
  130. package/dist/video/archive-project.d.ts.map +1 -0
  131. package/dist/video/archive-project.js +41 -0
  132. package/dist/video/archive-project.js.map +1 -0
  133. package/dist/video/artifact-history.d.ts +8 -0
  134. package/dist/video/artifact-history.d.ts.map +1 -0
  135. package/dist/video/artifact-history.js +12 -0
  136. package/dist/video/artifact-history.js.map +1 -0
  137. package/dist/video/artifact-store.d.ts +8 -0
  138. package/dist/video/artifact-store.d.ts.map +1 -0
  139. package/dist/video/artifact-store.js +37 -0
  140. package/dist/video/artifact-store.js.map +1 -0
  141. package/dist/video/artifact-validation.d.ts +15 -0
  142. package/dist/video/artifact-validation.d.ts.map +1 -0
  143. package/dist/video/artifact-validation.js +287 -0
  144. package/dist/video/artifact-validation.js.map +1 -0
  145. package/dist/video/artifacts.d.ts +112 -0
  146. package/dist/video/artifacts.d.ts.map +1 -0
  147. package/dist/video/artifacts.js +31 -0
  148. package/dist/video/artifacts.js.map +1 -0
  149. package/dist/video/assemble/animate-slides.d.ts +108 -0
  150. package/dist/video/assemble/animate-slides.d.ts.map +1 -0
  151. package/dist/video/assemble/animate-slides.js +152 -0
  152. package/dist/video/assemble/animate-slides.js.map +1 -0
  153. package/dist/video/assemble/animation-styles.d.ts +21 -0
  154. package/dist/video/assemble/animation-styles.d.ts.map +1 -0
  155. package/dist/video/assemble/animation-styles.js +32 -0
  156. package/dist/video/assemble/animation-styles.js.map +1 -0
  157. package/dist/video/assemble/animation-styles.json +97 -0
  158. package/dist/video/assemble/assemble.d.ts +24 -0
  159. package/dist/video/assemble/assemble.d.ts.map +1 -0
  160. package/dist/video/assemble/assemble.js +457 -0
  161. package/dist/video/assemble/assemble.js.map +1 -0
  162. package/dist/video/assemble/audio-concat.d.ts +61 -0
  163. package/dist/video/assemble/audio-concat.d.ts.map +1 -0
  164. package/dist/video/assemble/audio-concat.js +108 -0
  165. package/dist/video/assemble/audio-concat.js.map +1 -0
  166. package/dist/video/assemble/audio-mix-plan.d.ts +84 -0
  167. package/dist/video/assemble/audio-mix-plan.d.ts.map +1 -0
  168. package/dist/video/assemble/audio-mix-plan.js +74 -0
  169. package/dist/video/assemble/audio-mix-plan.js.map +1 -0
  170. package/dist/video/assemble/audio-utils.d.ts +32 -0
  171. package/dist/video/assemble/audio-utils.d.ts.map +1 -0
  172. package/dist/video/assemble/audio-utils.js +91 -0
  173. package/dist/video/assemble/audio-utils.js.map +1 -0
  174. package/dist/video/assemble/cut-segment.d.ts +40 -0
  175. package/dist/video/assemble/cut-segment.d.ts.map +1 -0
  176. package/dist/video/assemble/cut-segment.js +77 -0
  177. package/dist/video/assemble/cut-segment.js.map +1 -0
  178. package/dist/video/assemble/ffmpeg.d.ts +91 -0
  179. package/dist/video/assemble/ffmpeg.d.ts.map +1 -0
  180. package/dist/video/assemble/ffmpeg.js +251 -0
  181. package/dist/video/assemble/ffmpeg.js.map +1 -0
  182. package/dist/video/assemble/gemini-vision-classify.d.ts +37 -0
  183. package/dist/video/assemble/gemini-vision-classify.d.ts.map +1 -0
  184. package/dist/video/assemble/gemini-vision-classify.js +123 -0
  185. package/dist/video/assemble/gemini-vision-classify.js.map +1 -0
  186. package/dist/video/assemble/index.d.ts +47 -0
  187. package/dist/video/assemble/index.d.ts.map +1 -0
  188. package/dist/video/assemble/index.js +40 -0
  189. package/dist/video/assemble/index.js.map +1 -0
  190. package/dist/video/assemble/media-qc.d.ts +44 -0
  191. package/dist/video/assemble/media-qc.d.ts.map +1 -0
  192. package/dist/video/assemble/media-qc.js +181 -0
  193. package/dist/video/assemble/media-qc.js.map +1 -0
  194. package/dist/video/assemble/music.d.ts +51 -0
  195. package/dist/video/assemble/music.d.ts.map +1 -0
  196. package/dist/video/assemble/music.js +171 -0
  197. package/dist/video/assemble/music.js.map +1 -0
  198. package/dist/video/assemble/narration-fit.d.ts +32 -0
  199. package/dist/video/assemble/narration-fit.d.ts.map +1 -0
  200. package/dist/video/assemble/narration-fit.js +59 -0
  201. package/dist/video/assemble/narration-fit.js.map +1 -0
  202. package/dist/video/assemble/overlay.d.ts +81 -0
  203. package/dist/video/assemble/overlay.d.ts.map +1 -0
  204. package/dist/video/assemble/overlay.js +141 -0
  205. package/dist/video/assemble/overlay.js.map +1 -0
  206. package/dist/video/assemble/pdf.d.ts +46 -0
  207. package/dist/video/assemble/pdf.d.ts.map +1 -0
  208. package/dist/video/assemble/pdf.js +111 -0
  209. package/dist/video/assemble/pdf.js.map +1 -0
  210. package/dist/video/assemble/qa-dialogue-lint.d.ts +56 -0
  211. package/dist/video/assemble/qa-dialogue-lint.d.ts.map +1 -0
  212. package/dist/video/assemble/qa-dialogue-lint.js +85 -0
  213. package/dist/video/assemble/qa-dialogue-lint.js.map +1 -0
  214. package/dist/video/assemble/qa-image-filter.d.ts +52 -0
  215. package/dist/video/assemble/qa-image-filter.d.ts.map +1 -0
  216. package/dist/video/assemble/qa-image-filter.js +102 -0
  217. package/dist/video/assemble/qa-image-filter.js.map +1 -0
  218. package/dist/video/assemble/qa-image-vision.d.ts +57 -0
  219. package/dist/video/assemble/qa-image-vision.d.ts.map +1 -0
  220. package/dist/video/assemble/qa-image-vision.js +96 -0
  221. package/dist/video/assemble/qa-image-vision.js.map +1 -0
  222. package/dist/video/assemble/qa-narration-vision.d.ts +53 -0
  223. package/dist/video/assemble/qa-narration-vision.d.ts.map +1 -0
  224. package/dist/video/assemble/qa-narration-vision.js +87 -0
  225. package/dist/video/assemble/qa-narration-vision.js.map +1 -0
  226. package/dist/video/assemble/qa-narration.d.ts +53 -0
  227. package/dist/video/assemble/qa-narration.d.ts.map +1 -0
  228. package/dist/video/assemble/qa-narration.js +85 -0
  229. package/dist/video/assemble/qa-narration.js.map +1 -0
  230. package/dist/video/assemble/stitch-ad.d.ts +88 -0
  231. package/dist/video/assemble/stitch-ad.d.ts.map +1 -0
  232. package/dist/video/assemble/stitch-ad.js +161 -0
  233. package/dist/video/assemble/stitch-ad.js.map +1 -0
  234. package/dist/video/assemble/stitch.d.ts +341 -0
  235. package/dist/video/assemble/stitch.d.ts.map +1 -0
  236. package/dist/video/assemble/stitch.js +607 -0
  237. package/dist/video/assemble/stitch.js.map +1 -0
  238. package/dist/video/assemble/text-card.d.ts +78 -0
  239. package/dist/video/assemble/text-card.d.ts.map +1 -0
  240. package/dist/video/assemble/text-card.js +210 -0
  241. package/dist/video/assemble/text-card.js.map +1 -0
  242. package/dist/video/assemble/title-card.d.ts +39 -0
  243. package/dist/video/assemble/title-card.d.ts.map +1 -0
  244. package/dist/video/assemble/title-card.js +127 -0
  245. package/dist/video/assemble/title-card.js.map +1 -0
  246. package/dist/video/assemble/transcript.d.ts +66 -0
  247. package/dist/video/assemble/transcript.d.ts.map +1 -0
  248. package/dist/video/assemble/transcript.js +200 -0
  249. package/dist/video/assemble/transcript.js.map +1 -0
  250. package/dist/video/assemble/tts-elevenlabs.d.ts +52 -0
  251. package/dist/video/assemble/tts-elevenlabs.d.ts.map +1 -0
  252. package/dist/video/assemble/tts-elevenlabs.js +118 -0
  253. package/dist/video/assemble/tts-elevenlabs.js.map +1 -0
  254. package/dist/video/assemble/tts.d.ts +79 -0
  255. package/dist/video/assemble/tts.d.ts.map +1 -0
  256. package/dist/video/assemble/tts.js +131 -0
  257. package/dist/video/assemble/tts.js.map +1 -0
  258. package/dist/video/assemble/types.d.ts +43 -0
  259. package/dist/video/assemble/types.d.ts.map +1 -0
  260. package/dist/video/assemble/types.js +2 -0
  261. package/dist/video/assemble/types.js.map +1 -0
  262. package/dist/video/assemble/upscale.d.ts +43 -0
  263. package/dist/video/assemble/upscale.d.ts.map +1 -0
  264. package/dist/video/assemble/upscale.js +52 -0
  265. package/dist/video/assemble/upscale.js.map +1 -0
  266. package/dist/video/asset-spec.d.ts +15 -0
  267. package/dist/video/asset-spec.d.ts.map +1 -0
  268. package/dist/video/asset-spec.js +43 -0
  269. package/dist/video/asset-spec.js.map +1 -0
  270. package/dist/video/asset-tag-lookup.d.ts +31 -0
  271. package/dist/video/asset-tag-lookup.d.ts.map +1 -0
  272. package/dist/video/asset-tag-lookup.js +45 -0
  273. package/dist/video/asset-tag-lookup.js.map +1 -0
  274. package/dist/video/atomic-write.d.ts +2 -0
  275. package/dist/video/atomic-write.d.ts.map +1 -0
  276. package/dist/video/atomic-write.js +7 -0
  277. package/dist/video/atomic-write.js.map +1 -0
  278. package/dist/video/audio-platform/native-elevenlabs-sfx.d.ts +29 -0
  279. package/dist/video/audio-platform/native-elevenlabs-sfx.d.ts.map +1 -0
  280. package/dist/video/audio-platform/native-elevenlabs-sfx.js +95 -0
  281. package/dist/video/audio-platform/native-elevenlabs-sfx.js.map +1 -0
  282. package/dist/video/audio-platform/native-elevenlabs-tts.d.ts +30 -0
  283. package/dist/video/audio-platform/native-elevenlabs-tts.d.ts.map +1 -0
  284. package/dist/video/audio-platform/native-elevenlabs-tts.js +95 -0
  285. package/dist/video/audio-platform/native-elevenlabs-tts.js.map +1 -0
  286. package/dist/video/audio-platform/native-flowmusic.d.ts +21 -0
  287. package/dist/video/audio-platform/native-flowmusic.d.ts.map +1 -0
  288. package/dist/video/audio-platform/native-flowmusic.js +137 -0
  289. package/dist/video/audio-platform/native-flowmusic.js.map +1 -0
  290. package/dist/video/audio-platform/native-gemini-tts.d.ts +26 -0
  291. package/dist/video/audio-platform/native-gemini-tts.d.ts.map +1 -0
  292. package/dist/video/audio-platform/native-gemini-tts.js +202 -0
  293. package/dist/video/audio-platform/native-gemini-tts.js.map +1 -0
  294. package/dist/video/audio-platform/native-lyria.d.ts +35 -0
  295. package/dist/video/audio-platform/native-lyria.d.ts.map +1 -0
  296. package/dist/video/audio-platform/native-lyria.js +189 -0
  297. package/dist/video/audio-platform/native-lyria.js.map +1 -0
  298. package/dist/video/audio-platform/native-lyria3.d.ts +36 -0
  299. package/dist/video/audio-platform/native-lyria3.d.ts.map +1 -0
  300. package/dist/video/audio-platform/native-lyria3.js +210 -0
  301. package/dist/video/audio-platform/native-lyria3.js.map +1 -0
  302. package/dist/video/audio-platform/registry.d.ts +82 -0
  303. package/dist/video/audio-platform/registry.d.ts.map +1 -0
  304. package/dist/video/audio-platform/registry.js +189 -0
  305. package/dist/video/audio-platform/registry.js.map +1 -0
  306. package/dist/video/audio-platform/suno-backend.d.ts +11 -0
  307. package/dist/video/audio-platform/suno-backend.d.ts.map +1 -0
  308. package/dist/video/audio-platform/suno-backend.js +33 -0
  309. package/dist/video/audio-platform/suno-backend.js.map +1 -0
  310. package/dist/video/audio-platform/types.d.ts +128 -0
  311. package/dist/video/audio-platform/types.d.ts.map +1 -0
  312. package/dist/video/audio-platform/types.js +9 -0
  313. package/dist/video/audio-platform/types.js.map +1 -0
  314. package/dist/video/batch-queue.d.ts +276 -0
  315. package/dist/video/batch-queue.d.ts.map +1 -0
  316. package/dist/video/batch-queue.js +519 -0
  317. package/dist/video/batch-queue.js.map +1 -0
  318. package/dist/video/blueprint-prompt.d.ts +37 -0
  319. package/dist/video/blueprint-prompt.d.ts.map +1 -0
  320. package/dist/video/blueprint-prompt.js +107 -0
  321. package/dist/video/blueprint-prompt.js.map +1 -0
  322. package/dist/video/brand-definition.d.ts +97 -0
  323. package/dist/video/brand-definition.d.ts.map +1 -0
  324. package/dist/video/brand-definition.js +206 -0
  325. package/dist/video/brand-definition.js.map +1 -0
  326. package/dist/video/brand-dna.d.ts +101 -0
  327. package/dist/video/brand-dna.d.ts.map +1 -0
  328. package/dist/video/brand-dna.js +370 -0
  329. package/dist/video/brand-dna.js.map +1 -0
  330. package/dist/video/brand-prompt.d.ts +13 -0
  331. package/dist/video/brand-prompt.d.ts.map +1 -0
  332. package/dist/video/brand-prompt.js +26 -0
  333. package/dist/video/brand-prompt.js.map +1 -0
  334. package/dist/video/candidate-migrate.d.ts +27 -0
  335. package/dist/video/candidate-migrate.d.ts.map +1 -0
  336. package/dist/video/candidate-migrate.js +119 -0
  337. package/dist/video/candidate-migrate.js.map +1 -0
  338. package/dist/video/category-registry.d.ts +38 -0
  339. package/dist/video/category-registry.d.ts.map +1 -0
  340. package/dist/video/category-registry.js +188 -0
  341. package/dist/video/category-registry.js.map +1 -0
  342. package/dist/video/chain-fallback.d.ts +39 -0
  343. package/dist/video/chain-fallback.d.ts.map +1 -0
  344. package/dist/video/chain-fallback.js +43 -0
  345. package/dist/video/chain-fallback.js.map +1 -0
  346. package/dist/video/character-auto-create.d.ts +72 -0
  347. package/dist/video/character-auto-create.d.ts.map +1 -0
  348. package/dist/video/character-auto-create.js +392 -0
  349. package/dist/video/character-auto-create.js.map +1 -0
  350. package/dist/video/character-consistency.d.ts +3 -0
  351. package/dist/video/character-consistency.d.ts.map +1 -0
  352. package/dist/video/character-consistency.js +69 -0
  353. package/dist/video/character-consistency.js.map +1 -0
  354. package/dist/video/characters.d.ts +44 -0
  355. package/dist/video/characters.d.ts.map +1 -0
  356. package/dist/video/characters.js +96 -0
  357. package/dist/video/characters.js.map +1 -0
  358. package/dist/video/checkpoints.d.ts +16 -0
  359. package/dist/video/checkpoints.d.ts.map +1 -0
  360. package/dist/video/checkpoints.js +29 -0
  361. package/dist/video/checkpoints.js.map +1 -0
  362. package/dist/video/cinema-profile.d.ts +57 -0
  363. package/dist/video/cinema-profile.d.ts.map +1 -0
  364. package/dist/video/cinema-profile.js +89 -0
  365. package/dist/video/cinema-profile.js.map +1 -0
  366. package/dist/video/cinematography.d.ts +299 -0
  367. package/dist/video/cinematography.d.ts.map +1 -0
  368. package/dist/video/cinematography.js +914 -0
  369. package/dist/video/cinematography.js.map +1 -0
  370. package/dist/video/cli-output.d.ts +52 -0
  371. package/dist/video/cli-output.d.ts.map +1 -0
  372. package/dist/video/cli-output.js +81 -0
  373. package/dist/video/cli-output.js.map +1 -0
  374. package/dist/video/cli-schema.d.ts +40 -0
  375. package/dist/video/cli-schema.d.ts.map +1 -0
  376. package/dist/video/cli-schema.js +447 -0
  377. package/dist/video/cli-schema.js.map +1 -0
  378. package/dist/video/cost-estimate.d.ts +37 -0
  379. package/dist/video/cost-estimate.d.ts.map +1 -0
  380. package/dist/video/cost-estimate.js +103 -0
  381. package/dist/video/cost-estimate.js.map +1 -0
  382. package/dist/video/csv-export.d.ts +8 -0
  383. package/dist/video/csv-export.d.ts.map +1 -0
  384. package/dist/video/csv-export.js +133 -0
  385. package/dist/video/csv-export.js.map +1 -0
  386. package/dist/video/dependencies.d.ts +23 -0
  387. package/dist/video/dependencies.d.ts.map +1 -0
  388. package/dist/video/dependencies.js +36 -0
  389. package/dist/video/dependencies.js.map +1 -0
  390. package/dist/video/dialogue-fit.d.ts +23 -0
  391. package/dist/video/dialogue-fit.d.ts.map +1 -0
  392. package/dist/video/dialogue-fit.js +38 -0
  393. package/dist/video/dialogue-fit.js.map +1 -0
  394. package/dist/video/dialogue.d.ts +77 -0
  395. package/dist/video/dialogue.d.ts.map +1 -0
  396. package/dist/video/dialogue.js +143 -0
  397. package/dist/video/dialogue.js.map +1 -0
  398. package/dist/video/director-defaults.d.ts +37 -0
  399. package/dist/video/director-defaults.d.ts.map +1 -0
  400. package/dist/video/director-defaults.js +383 -0
  401. package/dist/video/director-defaults.js.map +1 -0
  402. package/dist/video/director-preflight.d.ts +53 -0
  403. package/dist/video/director-preflight.d.ts.map +1 -0
  404. package/dist/video/director-preflight.js +462 -0
  405. package/dist/video/director-preflight.js.map +1 -0
  406. package/dist/video/doctor-portfolio.d.ts +43 -0
  407. package/dist/video/doctor-portfolio.d.ts.map +1 -0
  408. package/dist/video/doctor-portfolio.js +137 -0
  409. package/dist/video/doctor-portfolio.js.map +1 -0
  410. package/dist/video/doctor.d.ts +13 -0
  411. package/dist/video/doctor.d.ts.map +1 -0
  412. package/dist/video/doctor.js +449 -0
  413. package/dist/video/doctor.js.map +1 -0
  414. package/dist/video/emotion-cues.d.ts +15 -0
  415. package/dist/video/emotion-cues.d.ts.map +1 -0
  416. package/dist/video/emotion-cues.js +37 -0
  417. package/dist/video/emotion-cues.js.map +1 -0
  418. package/dist/video/environment-assets.d.ts +28 -0
  419. package/dist/video/environment-assets.d.ts.map +1 -0
  420. package/dist/video/environment-assets.js +43 -0
  421. package/dist/video/environment-assets.js.map +1 -0
  422. package/dist/video/environment-auto-create.d.ts +20 -0
  423. package/dist/video/environment-auto-create.d.ts.map +1 -0
  424. package/dist/video/environment-auto-create.js +88 -0
  425. package/dist/video/environment-auto-create.js.map +1 -0
  426. package/dist/video/errors.d.ts +35 -0
  427. package/dist/video/errors.d.ts.map +1 -0
  428. package/dist/video/errors.js +117 -0
  429. package/dist/video/errors.js.map +1 -0
  430. package/dist/video/events.d.ts +11 -0
  431. package/dist/video/events.d.ts.map +1 -0
  432. package/dist/video/events.js +32 -0
  433. package/dist/video/events.js.map +1 -0
  434. package/dist/video/execute-autochain.d.ts +65 -0
  435. package/dist/video/execute-autochain.d.ts.map +1 -0
  436. package/dist/video/execute-autochain.js +165 -0
  437. package/dist/video/execute-autochain.js.map +1 -0
  438. package/dist/video/execute.d.ts +27 -0
  439. package/dist/video/execute.d.ts.map +1 -0
  440. package/dist/video/execute.js +477 -0
  441. package/dist/video/execute.js.map +1 -0
  442. package/dist/video/execution-cancel.d.ts +11 -0
  443. package/dist/video/execution-cancel.d.ts.map +1 -0
  444. package/dist/video/execution-cancel.js +85 -0
  445. package/dist/video/execution-cancel.js.map +1 -0
  446. package/dist/video/execution-plan.d.ts +5 -0
  447. package/dist/video/execution-plan.d.ts.map +1 -0
  448. package/dist/video/execution-plan.js +145 -0
  449. package/dist/video/execution-plan.js.map +1 -0
  450. package/dist/video/execution-profile.d.ts +25 -0
  451. package/dist/video/execution-profile.d.ts.map +1 -0
  452. package/dist/video/execution-profile.js +124 -0
  453. package/dist/video/execution-profile.js.map +1 -0
  454. package/dist/video/execution-runtime.d.ts +104 -0
  455. package/dist/video/execution-runtime.d.ts.map +1 -0
  456. package/dist/video/execution-runtime.js +750 -0
  457. package/dist/video/execution-runtime.js.map +1 -0
  458. package/dist/video/execution-seed.d.ts +14 -0
  459. package/dist/video/execution-seed.d.ts.map +1 -0
  460. package/dist/video/execution-seed.js +29 -0
  461. package/dist/video/execution-seed.js.map +1 -0
  462. package/dist/video/execution-status.d.ts +12 -0
  463. package/dist/video/execution-status.d.ts.map +1 -0
  464. package/dist/video/execution-status.js +666 -0
  465. package/dist/video/execution-status.js.map +1 -0
  466. package/dist/video/filmmaking-prompts.d.ts +356 -0
  467. package/dist/video/filmmaking-prompts.d.ts.map +1 -0
  468. package/dist/video/filmmaking-prompts.js +1212 -0
  469. package/dist/video/filmmaking-prompts.js.map +1 -0
  470. package/dist/video/final-media.d.ts +17 -0
  471. package/dist/video/final-media.d.ts.map +1 -0
  472. package/dist/video/final-media.js +78 -0
  473. package/dist/video/final-media.js.map +1 -0
  474. package/dist/video/finish.d.ts +99 -0
  475. package/dist/video/finish.d.ts.map +1 -0
  476. package/dist/video/finish.js +159 -0
  477. package/dist/video/finish.js.map +1 -0
  478. package/dist/video/flow-character-library.d.ts +143 -0
  479. package/dist/video/flow-character-library.d.ts.map +1 -0
  480. package/dist/video/flow-character-library.js +211 -0
  481. package/dist/video/flow-character-library.js.map +1 -0
  482. package/dist/video/flow-markers.d.ts +107 -0
  483. package/dist/video/flow-markers.d.ts.map +1 -0
  484. package/dist/video/flow-markers.js +278 -0
  485. package/dist/video/flow-markers.js.map +1 -0
  486. package/dist/video/gemini-analyze.d.ts +44 -0
  487. package/dist/video/gemini-analyze.d.ts.map +1 -0
  488. package/dist/video/gemini-analyze.js +323 -0
  489. package/dist/video/gemini-analyze.js.map +1 -0
  490. package/dist/video/gemini-continuity.d.ts +40 -0
  491. package/dist/video/gemini-continuity.d.ts.map +1 -0
  492. package/dist/video/gemini-continuity.js +145 -0
  493. package/dist/video/gemini-continuity.js.map +1 -0
  494. package/dist/video/gemini-judge.d.ts +33 -0
  495. package/dist/video/gemini-judge.d.ts.map +1 -0
  496. package/dist/video/gemini-judge.js +218 -0
  497. package/dist/video/gemini-judge.js.map +1 -0
  498. package/dist/video/gemini-key-pool.d.ts +23 -0
  499. package/dist/video/gemini-key-pool.d.ts.map +1 -0
  500. package/dist/video/gemini-key-pool.js +107 -0
  501. package/dist/video/gemini-key-pool.js.map +1 -0
  502. package/dist/video/gen-image-flow.d.ts +187 -0
  503. package/dist/video/gen-image-flow.d.ts.map +1 -0
  504. package/dist/video/gen-image-flow.js +331 -0
  505. package/dist/video/gen-image-flow.js.map +1 -0
  506. package/dist/video/gen-image.d.ts +153 -0
  507. package/dist/video/gen-image.d.ts.map +1 -0
  508. package/dist/video/gen-image.js +263 -0
  509. package/dist/video/gen-image.js.map +1 -0
  510. package/dist/video/generation-telemetry.d.ts +60 -0
  511. package/dist/video/generation-telemetry.d.ts.map +1 -0
  512. package/dist/video/generation-telemetry.js +214 -0
  513. package/dist/video/generation-telemetry.js.map +1 -0
  514. package/dist/video/http-error-safety.d.ts +9 -0
  515. package/dist/video/http-error-safety.d.ts.map +1 -0
  516. package/dist/video/http-error-safety.js +14 -0
  517. package/dist/video/http-error-safety.js.map +1 -0
  518. package/dist/video/image-dimensions.d.ts +7 -0
  519. package/dist/video/image-dimensions.d.ts.map +1 -0
  520. package/dist/video/image-dimensions.js +54 -0
  521. package/dist/video/image-dimensions.js.map +1 -0
  522. package/dist/video/legacy-import.d.ts +11 -0
  523. package/dist/video/legacy-import.d.ts.map +1 -0
  524. package/dist/video/legacy-import.js +181 -0
  525. package/dist/video/legacy-import.js.map +1 -0
  526. package/dist/video/library-clean.d.ts +34 -0
  527. package/dist/video/library-clean.d.ts.map +1 -0
  528. package/dist/video/library-clean.js +340 -0
  529. package/dist/video/library-clean.js.map +1 -0
  530. package/dist/video/lipsync.d.ts +72 -0
  531. package/dist/video/lipsync.d.ts.map +1 -0
  532. package/dist/video/lipsync.js +136 -0
  533. package/dist/video/lipsync.js.map +1 -0
  534. package/dist/video/media-host.d.ts +41 -0
  535. package/dist/video/media-host.d.ts.map +1 -0
  536. package/dist/video/media-host.js +106 -0
  537. package/dist/video/media-host.js.map +1 -0
  538. package/dist/video/metrics.d.ts +30 -0
  539. package/dist/video/metrics.d.ts.map +1 -0
  540. package/dist/video/metrics.js +81 -0
  541. package/dist/video/metrics.js.map +1 -0
  542. package/dist/video/motion-overlay/analyze-reel.d.ts +38 -0
  543. package/dist/video/motion-overlay/analyze-reel.d.ts.map +1 -0
  544. package/dist/video/motion-overlay/analyze-reel.js +185 -0
  545. package/dist/video/motion-overlay/analyze-reel.js.map +1 -0
  546. package/dist/video/motion-overlay/animate-render.d.ts +63 -0
  547. package/dist/video/motion-overlay/animate-render.d.ts.map +1 -0
  548. package/dist/video/motion-overlay/animate-render.js +128 -0
  549. package/dist/video/motion-overlay/animate-render.js.map +1 -0
  550. package/dist/video/motion-overlay/animate.d.ts +37 -0
  551. package/dist/video/motion-overlay/animate.d.ts.map +1 -0
  552. package/dist/video/motion-overlay/animate.js +97 -0
  553. package/dist/video/motion-overlay/animate.js.map +1 -0
  554. package/dist/video/motion-overlay/avatar-host-transport.d.ts +161 -0
  555. package/dist/video/motion-overlay/avatar-host-transport.d.ts.map +1 -0
  556. package/dist/video/motion-overlay/avatar-host-transport.js +325 -0
  557. package/dist/video/motion-overlay/avatar-host-transport.js.map +1 -0
  558. package/dist/video/motion-overlay/avatar-host.d.ts +131 -0
  559. package/dist/video/motion-overlay/avatar-host.d.ts.map +1 -0
  560. package/dist/video/motion-overlay/avatar-host.js +131 -0
  561. package/dist/video/motion-overlay/avatar-host.js.map +1 -0
  562. package/dist/video/motion-overlay/compose-prompt.d.ts +48 -0
  563. package/dist/video/motion-overlay/compose-prompt.d.ts.map +1 -0
  564. package/dist/video/motion-overlay/compose-prompt.js +217 -0
  565. package/dist/video/motion-overlay/compose-prompt.js.map +1 -0
  566. package/dist/video/motion-overlay/execute.d.ts +190 -0
  567. package/dist/video/motion-overlay/execute.d.ts.map +1 -0
  568. package/dist/video/motion-overlay/execute.js +205 -0
  569. package/dist/video/motion-overlay/execute.js.map +1 -0
  570. package/dist/video/motion-overlay/flow-pack.d.ts +65 -0
  571. package/dist/video/motion-overlay/flow-pack.d.ts.map +1 -0
  572. package/dist/video/motion-overlay/flow-pack.js +178 -0
  573. package/dist/video/motion-overlay/flow-pack.js.map +1 -0
  574. package/dist/video/motion-overlay/ingest.d.ts +74 -0
  575. package/dist/video/motion-overlay/ingest.d.ts.map +1 -0
  576. package/dist/video/motion-overlay/ingest.js +172 -0
  577. package/dist/video/motion-overlay/ingest.js.map +1 -0
  578. package/dist/video/motion-overlay/motifs.d.ts +63 -0
  579. package/dist/video/motion-overlay/motifs.d.ts.map +1 -0
  580. package/dist/video/motion-overlay/motifs.js +192 -0
  581. package/dist/video/motion-overlay/motifs.js.map +1 -0
  582. package/dist/video/motion-overlay/motion-style.d.ts +56 -0
  583. package/dist/video/motion-overlay/motion-style.d.ts.map +1 -0
  584. package/dist/video/motion-overlay/motion-style.js +130 -0
  585. package/dist/video/motion-overlay/motion-style.js.map +1 -0
  586. package/dist/video/motion-overlay/plan.d.ts +49 -0
  587. package/dist/video/motion-overlay/plan.d.ts.map +1 -0
  588. package/dist/video/motion-overlay/plan.js +79 -0
  589. package/dist/video/motion-overlay/plan.js.map +1 -0
  590. package/dist/video/motion-overlay/preview.d.ts +36 -0
  591. package/dist/video/motion-overlay/preview.d.ts.map +1 -0
  592. package/dist/video/motion-overlay/preview.js +169 -0
  593. package/dist/video/motion-overlay/preview.js.map +1 -0
  594. package/dist/video/motion-overlay/render-local.d.ts +118 -0
  595. package/dist/video/motion-overlay/render-local.d.ts.map +1 -0
  596. package/dist/video/motion-overlay/render-local.js +298 -0
  597. package/dist/video/motion-overlay/render-local.js.map +1 -0
  598. package/dist/video/motion-overlay/run.d.ts +58 -0
  599. package/dist/video/motion-overlay/run.d.ts.map +1 -0
  600. package/dist/video/motion-overlay/run.js +147 -0
  601. package/dist/video/motion-overlay/run.js.map +1 -0
  602. package/dist/video/motion-overlay/slice.d.ts +29 -0
  603. package/dist/video/motion-overlay/slice.d.ts.map +1 -0
  604. package/dist/video/motion-overlay/slice.js +88 -0
  605. package/dist/video/motion-overlay/slice.js.map +1 -0
  606. package/dist/video/motion-overlay/transcribe.d.ts +49 -0
  607. package/dist/video/motion-overlay/transcribe.d.ts.map +1 -0
  608. package/dist/video/motion-overlay/transcribe.js +180 -0
  609. package/dist/video/motion-overlay/transcribe.js.map +1 -0
  610. package/dist/video/motion-overlay/types.d.ts +82 -0
  611. package/dist/video/motion-overlay/types.d.ts.map +1 -0
  612. package/dist/video/motion-overlay/types.js +12 -0
  613. package/dist/video/motion-overlay/types.js.map +1 -0
  614. package/dist/video/motion-overlay/v2v-transport.d.ts +37 -0
  615. package/dist/video/motion-overlay/v2v-transport.d.ts.map +1 -0
  616. package/dist/video/motion-overlay/v2v-transport.js +178 -0
  617. package/dist/video/motion-overlay/v2v-transport.js.map +1 -0
  618. package/dist/video/motion-overlay/write.d.ts +40 -0
  619. package/dist/video/motion-overlay/write.d.ts.map +1 -0
  620. package/dist/video/motion-overlay/write.js +113 -0
  621. package/dist/video/motion-overlay/write.js.map +1 -0
  622. package/dist/video/multi-shot-artifact.d.ts +19 -0
  623. package/dist/video/multi-shot-artifact.d.ts.map +1 -0
  624. package/dist/video/multi-shot-artifact.js +44 -0
  625. package/dist/video/multi-shot-artifact.js.map +1 -0
  626. package/dist/video/multi-shot-prompt.d.ts +99 -0
  627. package/dist/video/multi-shot-prompt.d.ts.map +1 -0
  628. package/dist/video/multi-shot-prompt.js +466 -0
  629. package/dist/video/multi-shot-prompt.js.map +1 -0
  630. package/dist/video/music-video.d.ts +110 -0
  631. package/dist/video/music-video.d.ts.map +1 -0
  632. package/dist/video/music-video.js +190 -0
  633. package/dist/video/music-video.js.map +1 -0
  634. package/dist/video/narrate.d.ts +58 -0
  635. package/dist/video/narrate.d.ts.map +1 -0
  636. package/dist/video/narrate.js +145 -0
  637. package/dist/video/narrate.js.map +1 -0
  638. package/dist/video/native-dreamina.d.ts +35 -0
  639. package/dist/video/native-dreamina.d.ts.map +1 -0
  640. package/dist/video/native-dreamina.js +532 -0
  641. package/dist/video/native-dreamina.js.map +1 -0
  642. package/dist/video/native-flow-r2v.d.ts +113 -0
  643. package/dist/video/native-flow-r2v.d.ts.map +1 -0
  644. package/dist/video/native-flow-r2v.js +223 -0
  645. package/dist/video/native-flow-r2v.js.map +1 -0
  646. package/dist/video/native-runway.d.ts +41 -0
  647. package/dist/video/native-runway.d.ts.map +1 -0
  648. package/dist/video/native-runway.js +523 -0
  649. package/dist/video/native-runway.js.map +1 -0
  650. package/dist/video/native-seedance.d.ts +74 -0
  651. package/dist/video/native-seedance.d.ts.map +1 -0
  652. package/dist/video/native-seedance.js +461 -0
  653. package/dist/video/native-seedance.js.map +1 -0
  654. package/dist/video/native-veo.d.ts +20 -0
  655. package/dist/video/native-veo.d.ts.map +1 -0
  656. package/dist/video/native-veo.js +390 -0
  657. package/dist/video/native-veo.js.map +1 -0
  658. package/dist/video/next-actions.d.ts +27 -0
  659. package/dist/video/next-actions.d.ts.map +1 -0
  660. package/dist/video/next-actions.js +201 -0
  661. package/dist/video/next-actions.js.map +1 -0
  662. package/dist/video/obsidian-export.d.ts +12 -0
  663. package/dist/video/obsidian-export.d.ts.map +1 -0
  664. package/dist/video/obsidian-export.js +285 -0
  665. package/dist/video/obsidian-export.js.map +1 -0
  666. package/dist/video/obsidian-sync.d.ts +13 -0
  667. package/dist/video/obsidian-sync.d.ts.map +1 -0
  668. package/dist/video/obsidian-sync.js +479 -0
  669. package/dist/video/obsidian-sync.js.map +1 -0
  670. package/dist/video/obsidian-vault.d.ts +8 -0
  671. package/dist/video/obsidian-vault.d.ts.map +1 -0
  672. package/dist/video/obsidian-vault.js +81 -0
  673. package/dist/video/obsidian-vault.js.map +1 -0
  674. package/dist/video/outfit-prompts.d.ts +10 -0
  675. package/dist/video/outfit-prompts.d.ts.map +1 -0
  676. package/dist/video/outfit-prompts.js +14 -0
  677. package/dist/video/outfit-prompts.js.map +1 -0
  678. package/dist/video/outpaint-keyframe.d.ts +95 -0
  679. package/dist/video/outpaint-keyframe.d.ts.map +1 -0
  680. package/dist/video/outpaint-keyframe.js +244 -0
  681. package/dist/video/outpaint-keyframe.js.map +1 -0
  682. package/dist/video/pipeline-manifest.d.ts +4 -0
  683. package/dist/video/pipeline-manifest.d.ts.map +1 -0
  684. package/dist/video/pipeline-manifest.js +13 -0
  685. package/dist/video/pipeline-manifest.js.map +1 -0
  686. package/dist/video/pipeline-manifests/director.json +46 -0
  687. package/dist/video/pipeline-manifests/storyboard.json +46 -0
  688. package/dist/video/platform-specs.d.ts +26 -0
  689. package/dist/video/platform-specs.d.ts.map +1 -0
  690. package/dist/video/platform-specs.js +34 -0
  691. package/dist/video/platform-specs.js.map +1 -0
  692. package/dist/video/playbooks.d.ts +11 -0
  693. package/dist/video/playbooks.d.ts.map +1 -0
  694. package/dist/video/playbooks.js +22 -0
  695. package/dist/video/playbooks.js.map +1 -0
  696. package/dist/video/post-production.d.ts +57 -0
  697. package/dist/video/post-production.d.ts.map +1 -0
  698. package/dist/video/post-production.js +210 -0
  699. package/dist/video/post-production.js.map +1 -0
  700. package/dist/video/preview-portal/audit.d.ts +4 -0
  701. package/dist/video/preview-portal/audit.d.ts.map +1 -0
  702. package/dist/video/preview-portal/audit.js +16 -0
  703. package/dist/video/preview-portal/audit.js.map +1 -0
  704. package/dist/video/preview-portal/discovery.d.ts +23 -0
  705. package/dist/video/preview-portal/discovery.d.ts.map +1 -0
  706. package/dist/video/preview-portal/discovery.js +733 -0
  707. package/dist/video/preview-portal/discovery.js.map +1 -0
  708. package/dist/video/preview-portal/generate.d.ts +42 -0
  709. package/dist/video/preview-portal/generate.d.ts.map +1 -0
  710. package/dist/video/preview-portal/generate.js +101 -0
  711. package/dist/video/preview-portal/generate.js.map +1 -0
  712. package/dist/video/preview-portal/index.d.ts +12 -0
  713. package/dist/video/preview-portal/index.d.ts.map +1 -0
  714. package/dist/video/preview-portal/index.js +8 -0
  715. package/dist/video/preview-portal/index.js.map +1 -0
  716. package/dist/video/preview-portal/publish.d.ts +48 -0
  717. package/dist/video/preview-portal/publish.d.ts.map +1 -0
  718. package/dist/video/preview-portal/publish.js +169 -0
  719. package/dist/video/preview-portal/publish.js.map +1 -0
  720. package/dist/video/preview-portal/render.d.ts +4 -0
  721. package/dist/video/preview-portal/render.d.ts.map +1 -0
  722. package/dist/video/preview-portal/render.js +822 -0
  723. package/dist/video/preview-portal/render.js.map +1 -0
  724. package/dist/video/preview-portal/shared-assets.d.ts +6 -0
  725. package/dist/video/preview-portal/shared-assets.d.ts.map +1 -0
  726. package/dist/video/preview-portal/shared-assets.js +452 -0
  727. package/dist/video/preview-portal/shared-assets.js.map +1 -0
  728. package/dist/video/preview-portal/templates.d.ts +4 -0
  729. package/dist/video/preview-portal/templates.d.ts.map +1 -0
  730. package/dist/video/preview-portal/templates.js +109 -0
  731. package/dist/video/preview-portal/templates.js.map +1 -0
  732. package/dist/video/preview-portal/types.d.ts +246 -0
  733. package/dist/video/preview-portal/types.d.ts.map +1 -0
  734. package/dist/video/preview-portal/types.js +28 -0
  735. package/dist/video/preview-portal/types.js.map +1 -0
  736. package/dist/video/product-references.d.ts +21 -0
  737. package/dist/video/product-references.d.ts.map +1 -0
  738. package/dist/video/product-references.js +25 -0
  739. package/dist/video/product-references.js.map +1 -0
  740. package/dist/video/project-blueprint.d.ts +178 -0
  741. package/dist/video/project-blueprint.d.ts.map +1 -0
  742. package/dist/video/project-blueprint.js +286 -0
  743. package/dist/video/project-blueprint.js.map +1 -0
  744. package/dist/video/project-index.d.ts +82 -0
  745. package/dist/video/project-index.d.ts.map +1 -0
  746. package/dist/video/project-index.js +89 -0
  747. package/dist/video/project-index.js.map +1 -0
  748. package/dist/video/projects.d.ts +3 -0
  749. package/dist/video/projects.d.ts.map +1 -0
  750. package/dist/video/projects.js +18 -0
  751. package/dist/video/projects.js.map +1 -0
  752. package/dist/video/prompt-guidance.d.ts +14 -0
  753. package/dist/video/prompt-guidance.d.ts.map +1 -0
  754. package/dist/video/prompt-guidance.js +44 -0
  755. package/dist/video/prompt-guidance.js.map +1 -0
  756. package/dist/video/prompt-library.d.ts +11 -0
  757. package/dist/video/prompt-library.d.ts.map +1 -0
  758. package/dist/video/prompt-library.js +85 -0
  759. package/dist/video/prompt-library.js.map +1 -0
  760. package/dist/video/prompt-lint.d.ts +146 -0
  761. package/dist/video/prompt-lint.d.ts.map +1 -0
  762. package/dist/video/prompt-lint.js +433 -0
  763. package/dist/video/prompt-lint.js.map +1 -0
  764. package/dist/video/prompt-quality.d.ts +29 -0
  765. package/dist/video/prompt-quality.d.ts.map +1 -0
  766. package/dist/video/prompt-quality.js +532 -0
  767. package/dist/video/prompt-quality.js.map +1 -0
  768. package/dist/video/prompt-rules.d.ts +94 -0
  769. package/dist/video/prompt-rules.d.ts.map +1 -0
  770. package/dist/video/prompt-rules.js +169 -0
  771. package/dist/video/prompt-rules.js.map +1 -0
  772. package/dist/video/provider-adapter-runner.d.ts +5 -0
  773. package/dist/video/provider-adapter-runner.d.ts.map +1 -0
  774. package/dist/video/provider-adapter-runner.js +92 -0
  775. package/dist/video/provider-adapter-runner.js.map +1 -0
  776. package/dist/video/provider-platform/index.d.ts +6 -0
  777. package/dist/video/provider-platform/index.d.ts.map +1 -0
  778. package/dist/video/provider-platform/index.js +6 -0
  779. package/dist/video/provider-platform/index.js.map +1 -0
  780. package/dist/video/provider-platform/registry.d.ts +5 -0
  781. package/dist/video/provider-platform/registry.d.ts.map +1 -0
  782. package/dist/video/provider-platform/registry.js +279 -0
  783. package/dist/video/provider-platform/registry.js.map +1 -0
  784. package/dist/video/provider-platform/route-capabilities.d.ts +133 -0
  785. package/dist/video/provider-platform/route-capabilities.d.ts.map +1 -0
  786. package/dist/video/provider-platform/route-capabilities.js +192 -0
  787. package/dist/video/provider-platform/route-capabilities.js.map +1 -0
  788. package/dist/video/provider-platform/router.d.ts +7 -0
  789. package/dist/video/provider-platform/router.d.ts.map +1 -0
  790. package/dist/video/provider-platform/router.js +150 -0
  791. package/dist/video/provider-platform/router.js.map +1 -0
  792. package/dist/video/provider-platform/security.d.ts +8 -0
  793. package/dist/video/provider-platform/security.d.ts.map +1 -0
  794. package/dist/video/provider-platform/security.js +21 -0
  795. package/dist/video/provider-platform/security.js.map +1 -0
  796. package/dist/video/provider-platform/telemetry.d.ts +24 -0
  797. package/dist/video/provider-platform/telemetry.d.ts.map +1 -0
  798. package/dist/video/provider-platform/telemetry.js +88 -0
  799. package/dist/video/provider-platform/telemetry.js.map +1 -0
  800. package/dist/video/provider-platform/types.d.ts +139 -0
  801. package/dist/video/provider-platform/types.d.ts.map +1 -0
  802. package/dist/video/provider-platform/types.js +17 -0
  803. package/dist/video/provider-platform/types.js.map +1 -0
  804. package/dist/video/provider-status.d.ts +12 -0
  805. package/dist/video/provider-status.d.ts.map +1 -0
  806. package/dist/video/provider-status.js +169 -0
  807. package/dist/video/provider-status.js.map +1 -0
  808. package/dist/video/providers/dreamina-useapi.d.ts +170 -0
  809. package/dist/video/providers/dreamina-useapi.d.ts.map +1 -0
  810. package/dist/video/providers/dreamina-useapi.js +176 -0
  811. package/dist/video/providers/dreamina-useapi.js.map +1 -0
  812. package/dist/video/providers/flowmusic-useapi.d.ts +114 -0
  813. package/dist/video/providers/flowmusic-useapi.d.ts.map +1 -0
  814. package/dist/video/providers/flowmusic-useapi.js +159 -0
  815. package/dist/video/providers/flowmusic-useapi.js.map +1 -0
  816. package/dist/video/providers/google-flow.d.ts +57 -0
  817. package/dist/video/providers/google-flow.d.ts.map +1 -0
  818. package/dist/video/providers/google-flow.js +63 -0
  819. package/dist/video/providers/google-flow.js.map +1 -0
  820. package/dist/video/providers/public-host.d.ts +40 -0
  821. package/dist/video/providers/public-host.d.ts.map +1 -0
  822. package/dist/video/providers/public-host.js +91 -0
  823. package/dist/video/providers/public-host.js.map +1 -0
  824. package/dist/video/providers/runway-useapi.d.ts +159 -0
  825. package/dist/video/providers/runway-useapi.d.ts.map +1 -0
  826. package/dist/video/providers/runway-useapi.js +200 -0
  827. package/dist/video/providers/runway-useapi.js.map +1 -0
  828. package/dist/video/providers/xskill.d.ts +108 -0
  829. package/dist/video/providers/xskill.d.ts.map +1 -0
  830. package/dist/video/providers/xskill.js +233 -0
  831. package/dist/video/providers/xskill.js.map +1 -0
  832. package/dist/video/readiness.d.ts +18 -0
  833. package/dist/video/readiness.d.ts.map +1 -0
  834. package/dist/video/readiness.js +221 -0
  835. package/dist/video/readiness.js.map +1 -0
  836. package/dist/video/reference-sheet-store.d.ts +5 -0
  837. package/dist/video/reference-sheet-store.d.ts.map +1 -0
  838. package/dist/video/reference-sheet-store.js +28 -0
  839. package/dist/video/reference-sheet-store.js.map +1 -0
  840. package/dist/video/reference-sheets.d.ts +40 -0
  841. package/dist/video/reference-sheets.d.ts.map +1 -0
  842. package/dist/video/reference-sheets.js +160 -0
  843. package/dist/video/reference-sheets.js.map +1 -0
  844. package/dist/video/remix-narrated.d.ts +12 -0
  845. package/dist/video/remix-narrated.d.ts.map +1 -0
  846. package/dist/video/remix-narrated.js +73 -0
  847. package/dist/video/remix-narrated.js.map +1 -0
  848. package/dist/video/report-diff.d.ts +89 -0
  849. package/dist/video/report-diff.d.ts.map +1 -0
  850. package/dist/video/report-diff.js +176 -0
  851. package/dist/video/report-diff.js.map +1 -0
  852. package/dist/video/report-history.d.ts +40 -0
  853. package/dist/video/report-history.d.ts.map +1 -0
  854. package/dist/video/report-history.js +74 -0
  855. package/dist/video/report-history.js.map +1 -0
  856. package/dist/video/report.d.ts +15 -0
  857. package/dist/video/report.d.ts.map +1 -0
  858. package/dist/video/report.js +21 -0
  859. package/dist/video/report.js.map +1 -0
  860. package/dist/video/review-ui.d.ts +180 -0
  861. package/dist/video/review-ui.d.ts.map +1 -0
  862. package/dist/video/review-ui.js +2008 -0
  863. package/dist/video/review-ui.js.map +1 -0
  864. package/dist/video/scene-candidate-store.d.ts +12 -0
  865. package/dist/video/scene-candidate-store.d.ts.map +1 -0
  866. package/dist/video/scene-candidate-store.js +134 -0
  867. package/dist/video/scene-candidate-store.js.map +1 -0
  868. package/dist/video/scene-candidates.d.ts +57 -0
  869. package/dist/video/scene-candidates.d.ts.map +1 -0
  870. package/dist/video/scene-candidates.js +149 -0
  871. package/dist/video/scene-candidates.js.map +1 -0
  872. package/dist/video/scene-selection-store.d.ts +5 -0
  873. package/dist/video/scene-selection-store.d.ts.map +1 -0
  874. package/dist/video/scene-selection-store.js +22 -0
  875. package/dist/video/scene-selection-store.js.map +1 -0
  876. package/dist/video/scene-selection.d.ts +83 -0
  877. package/dist/video/scene-selection.d.ts.map +1 -0
  878. package/dist/video/scene-selection.js +225 -0
  879. package/dist/video/scene-selection.js.map +1 -0
  880. package/dist/video/scheduling.d.ts +3 -0
  881. package/dist/video/scheduling.d.ts.map +1 -0
  882. package/dist/video/scheduling.js +16 -0
  883. package/dist/video/scheduling.js.map +1 -0
  884. package/dist/video/scorecard.d.ts +12 -0
  885. package/dist/video/scorecard.d.ts.map +1 -0
  886. package/dist/video/scorecard.js +68 -0
  887. package/dist/video/scorecard.js.map +1 -0
  888. package/dist/video/seedance-asset-library.d.ts +82 -0
  889. package/dist/video/seedance-asset-library.d.ts.map +1 -0
  890. package/dist/video/seedance-asset-library.js +146 -0
  891. package/dist/video/seedance-asset-library.js.map +1 -0
  892. package/dist/video/seedance-blocks.d.ts +56 -0
  893. package/dist/video/seedance-blocks.d.ts.map +1 -0
  894. package/dist/video/seedance-blocks.js +97 -0
  895. package/dist/video/seedance-blocks.js.map +1 -0
  896. package/dist/video/seedance-chain-host.d.ts +42 -0
  897. package/dist/video/seedance-chain-host.d.ts.map +1 -0
  898. package/dist/video/seedance-chain-host.js +128 -0
  899. package/dist/video/seedance-chain-host.js.map +1 -0
  900. package/dist/video/seedance-content-filter.d.ts +80 -0
  901. package/dist/video/seedance-content-filter.d.ts.map +1 -0
  902. package/dist/video/seedance-content-filter.js +293 -0
  903. package/dist/video/seedance-content-filter.js.map +1 -0
  904. package/dist/video/seedance-skill-loader.d.ts +40 -0
  905. package/dist/video/seedance-skill-loader.d.ts.map +1 -0
  906. package/dist/video/seedance-skill-loader.js +53 -0
  907. package/dist/video/seedance-skill-loader.js.map +1 -0
  908. package/dist/video/sfx.d.ts +49 -0
  909. package/dist/video/sfx.d.ts.map +1 -0
  910. package/dist/video/sfx.js +104 -0
  911. package/dist/video/sfx.js.map +1 -0
  912. package/dist/video/shot-grammar.d.ts +103 -0
  913. package/dist/video/shot-grammar.d.ts.map +1 -0
  914. package/dist/video/shot-grammar.js +286 -0
  915. package/dist/video/shot-grammar.js.map +1 -0
  916. package/dist/video/show-bible.d.ts +113 -0
  917. package/dist/video/show-bible.d.ts.map +1 -0
  918. package/dist/video/show-bible.js +140 -0
  919. package/dist/video/show-bible.js.map +1 -0
  920. package/dist/video/soundtrack.d.ts +72 -0
  921. package/dist/video/soundtrack.d.ts.map +1 -0
  922. package/dist/video/soundtrack.js +171 -0
  923. package/dist/video/soundtrack.js.map +1 -0
  924. package/dist/video/stage-guards.d.ts +4 -0
  925. package/dist/video/stage-guards.d.ts.map +1 -0
  926. package/dist/video/stage-guards.js +94 -0
  927. package/dist/video/stage-guards.js.map +1 -0
  928. package/dist/video/status.d.ts +69 -0
  929. package/dist/video/status.d.ts.map +1 -0
  930. package/dist/video/status.js +245 -0
  931. package/dist/video/status.js.map +1 -0
  932. package/dist/video/story-bible.d.ts +70 -0
  933. package/dist/video/story-bible.d.ts.map +1 -0
  934. package/dist/video/story-bible.js +181 -0
  935. package/dist/video/story-bible.js.map +1 -0
  936. package/dist/video/storyboard-grid.d.ts +28 -0
  937. package/dist/video/storyboard-grid.d.ts.map +1 -0
  938. package/dist/video/storyboard-grid.js +231 -0
  939. package/dist/video/storyboard-grid.js.map +1 -0
  940. package/dist/video/storyboard-markdown.d.ts +62 -0
  941. package/dist/video/storyboard-markdown.d.ts.map +1 -0
  942. package/dist/video/storyboard-markdown.js +332 -0
  943. package/dist/video/storyboard-markdown.js.map +1 -0
  944. package/dist/video/storyboard-still-candidates.d.ts +31 -0
  945. package/dist/video/storyboard-still-candidates.d.ts.map +1 -0
  946. package/dist/video/storyboard-still-candidates.js +57 -0
  947. package/dist/video/storyboard-still-candidates.js.map +1 -0
  948. package/dist/video/storyboard-templates.d.ts +28 -0
  949. package/dist/video/storyboard-templates.d.ts.map +1 -0
  950. package/dist/video/storyboard-templates.js +215 -0
  951. package/dist/video/storyboard-templates.js.map +1 -0
  952. package/dist/video/studio/execute.d.ts +142 -0
  953. package/dist/video/studio/execute.d.ts.map +1 -0
  954. package/dist/video/studio/execute.js +270 -0
  955. package/dist/video/studio/execute.js.map +1 -0
  956. package/dist/video/studio/planner.d.ts +3 -0
  957. package/dist/video/studio/planner.d.ts.map +1 -0
  958. package/dist/video/studio/planner.js +110 -0
  959. package/dist/video/studio/planner.js.map +1 -0
  960. package/dist/video/studio/project-context.d.ts +4 -0
  961. package/dist/video/studio/project-context.d.ts.map +1 -0
  962. package/dist/video/studio/project-context.js +20 -0
  963. package/dist/video/studio/project-context.js.map +1 -0
  964. package/dist/video/studio/recipes.d.ts +4 -0
  965. package/dist/video/studio/recipes.d.ts.map +1 -0
  966. package/dist/video/studio/recipes.js +343 -0
  967. package/dist/video/studio/recipes.js.map +1 -0
  968. package/dist/video/studio/session.d.ts +8 -0
  969. package/dist/video/studio/session.d.ts.map +1 -0
  970. package/dist/video/studio/session.js +17 -0
  971. package/dist/video/studio/session.js.map +1 -0
  972. package/dist/video/studio/types.d.ts +59 -0
  973. package/dist/video/studio/types.d.ts.map +1 -0
  974. package/dist/video/studio/types.js +2 -0
  975. package/dist/video/studio/types.js.map +1 -0
  976. package/dist/video/template-store.d.ts +65 -0
  977. package/dist/video/template-store.d.ts.map +1 -0
  978. package/dist/video/template-store.js +168 -0
  979. package/dist/video/template-store.js.map +1 -0
  980. package/dist/video/timeline.d.ts +8 -0
  981. package/dist/video/timeline.d.ts.map +1 -0
  982. package/dist/video/timeline.js +21 -0
  983. package/dist/video/timeline.js.map +1 -0
  984. package/dist/video/title-overlay.d.ts +85 -0
  985. package/dist/video/title-overlay.d.ts.map +1 -0
  986. package/dist/video/title-overlay.js +163 -0
  987. package/dist/video/title-overlay.js.map +1 -0
  988. package/dist/video/types.d.ts +403 -0
  989. package/dist/video/types.d.ts.map +1 -0
  990. package/dist/video/types.js +2 -0
  991. package/dist/video/types.js.map +1 -0
  992. package/dist/video/veo-subprocess.d.ts +27 -0
  993. package/dist/video/veo-subprocess.d.ts.map +1 -0
  994. package/dist/video/veo-subprocess.js +52 -0
  995. package/dist/video/veo-subprocess.js.map +1 -0
  996. package/dist/video/verify-env.d.ts +43 -0
  997. package/dist/video/verify-env.d.ts.map +1 -0
  998. package/dist/video/verify-env.js +156 -0
  999. package/dist/video/verify-env.js.map +1 -0
  1000. package/dist/video/verify-final.d.ts +20 -0
  1001. package/dist/video/verify-final.d.ts.map +1 -0
  1002. package/dist/video/verify-final.js +39 -0
  1003. package/dist/video/verify-final.js.map +1 -0
  1004. package/dist/video/video-context.d.ts +10 -0
  1005. package/dist/video/video-context.d.ts.map +1 -0
  1006. package/dist/video/video-context.js +74 -0
  1007. package/dist/video/video-context.js.map +1 -0
  1008. package/dist/video/vocal-map.d.ts +55 -0
  1009. package/dist/video/vocal-map.d.ts.map +1 -0
  1010. package/dist/video/vocal-map.js +107 -0
  1011. package/dist/video/vocal-map.js.map +1 -0
  1012. package/dist/video/vocal-sync-plan.d.ts +76 -0
  1013. package/dist/video/vocal-sync-plan.d.ts.map +1 -0
  1014. package/dist/video/vocal-sync-plan.js +166 -0
  1015. package/dist/video/vocal-sync-plan.js.map +1 -0
  1016. package/dist/video/voice-clone.d.ts +152 -0
  1017. package/dist/video/voice-clone.d.ts.map +1 -0
  1018. package/dist/video/voice-clone.js +267 -0
  1019. package/dist/video/voice-clone.js.map +1 -0
  1020. package/dist/video/with-retry.d.ts +67 -0
  1021. package/dist/video/with-retry.d.ts.map +1 -0
  1022. package/dist/video/with-retry.js +105 -0
  1023. package/dist/video/with-retry.js.map +1 -0
  1024. package/dist/video/workload.d.ts +20 -0
  1025. package/dist/video/workload.d.ts.map +1 -0
  1026. package/dist/video/workload.js +55 -0
  1027. package/dist/video/workload.js.map +1 -0
  1028. package/dist/video/workspace.d.ts +109 -0
  1029. package/dist/video/workspace.d.ts.map +1 -0
  1030. package/dist/video/workspace.js +132 -0
  1031. package/dist/video/workspace.js.map +1 -0
  1032. package/docs/AGENT_INTEGRATION_RESEARCH.md +123 -0
  1033. package/docs/AI_FILMMAKING_PROMPTS.md +195 -0
  1034. package/docs/ARCHITECTURE.md +257 -0
  1035. package/docs/ASSEMBLE.md +376 -0
  1036. package/docs/BRAND_AGENCY.md +63 -0
  1037. package/docs/CLAWBOT_COVERAGE_PROMPT.md +78 -0
  1038. package/docs/CLI_REFERENCE.md +2638 -0
  1039. package/docs/CONCIERGE_PROMPT.md +139 -0
  1040. package/docs/Claude Code + Higgsfield MCP = FULL Creative Agency.md +179 -0
  1041. package/docs/DEMO_RECORDING.md +61 -0
  1042. package/docs/DEPRECATION.md +79 -0
  1043. package/docs/DIAGRAMS_SOURCE.md +347 -0
  1044. package/docs/DIRECTOR_BLUEPRINT.md +94 -0
  1045. package/docs/GENERATION_TELEMETRY.md +81 -0
  1046. package/docs/IMPROVE_PROMPT.md +76 -0
  1047. package/docs/INFOGRAPHICS_PROMPT.md +83 -0
  1048. package/docs/MASTER_PLAN_ALIGNMENT.md +563 -0
  1049. package/docs/MIGRATION.md +213 -0
  1050. package/docs/MOTION_OVERLAY.md +355 -0
  1051. package/docs/OBSIDIAN.md +300 -0
  1052. package/docs/OPERATIONS.md +142 -0
  1053. package/docs/OPERATOR_HANDOFF.md +108 -0
  1054. package/docs/PRODUCTION_WORKFLOW.md +148 -0
  1055. package/docs/PROJECT_LAYOUT.md +262 -0
  1056. package/docs/PROMPT_QUALITY.md +214 -0
  1057. package/docs/PROVIDER_PLATFORM.md +195 -0
  1058. package/docs/PUBLISHING.md +175 -0
  1059. package/docs/PYTHON_PIPELINE.md +139 -0
  1060. package/docs/REFERENCE_SHEETS.md +469 -0
  1061. package/docs/REFERENCE_VIDEO_SEEDANCE_MOTION_DESIGN_WORKFLOW.md +465 -0
  1062. package/docs/RELEASE_READINESS.md +573 -0
  1063. package/docs/REVIEW_UI_STORYBOARD_WORKFLOW.md +200 -0
  1064. package/docs/SCENE_CANDIDATES.md +518 -0
  1065. package/docs/SKILLS.md +477 -0
  1066. package/docs/SKILL_COHESION_PROMPT.md +88 -0
  1067. package/docs/STORY_BIBLE.md +288 -0
  1068. package/docs/STUDIO.md +96 -0
  1069. package/docs/TEMPLATES.md +143 -0
  1070. package/docs/UNIFICATION_AUDIT.md +321 -0
  1071. package/docs/UPDATE_DOCS_PROMPT.md +78 -0
  1072. package/docs/assets/demo-quickstart.cast +13 -0
  1073. package/docs/assets/demo-quickstart.gif +0 -0
  1074. package/docs/assets/diagram-architecture.jpg +0 -0
  1075. package/docs/assets/diagram-assemble.jpg +0 -0
  1076. package/docs/assets/diagram-lifecycle.jpg +0 -0
  1077. package/docs/assets/diagram-obsidian-loop.jpg +0 -0
  1078. package/docs/assets/diagram-obsidian-vault.jpg +0 -0
  1079. package/docs/assets/diagram-routing.jpg +0 -0
  1080. package/docs/assets/diagram-skills-ecosystem.jpg +0 -0
  1081. package/docs/assets/diagram-story-bible.jpg +0 -0
  1082. package/docs/assets/diagram-studio-goals.jpg +0 -0
  1083. package/docs/assets/docsite-preview.png +0 -0
  1084. package/docs/assets/logo.jpg +0 -0
  1085. package/docs/assets/logo.png +0 -0
  1086. package/docs/preview-portal-audit.md +151 -0
  1087. package/package.json +119 -0
  1088. package/playbooks/seedance-ugc.json +32 -0
  1089. package/playbooks/veo-generic.json +26 -0
  1090. package/references/video/.fixtures/multi-shot-runway-10s.txt +9 -0
  1091. package/references/video/.fixtures/multi-shot-seedance-10s.txt +9 -0
  1092. package/references/video/.fixtures/multi-shot-valid.txt +13 -0
  1093. package/references/video/.fixtures/multi-shot-veo-8s.txt +9 -0
  1094. package/references/video/ai-director-blueprint.md +614 -0
  1095. package/references/video/camera-bible.md +294 -0
  1096. package/references/video/character-reference-sheet.md +14 -0
  1097. package/references/video/checkpoint-protocol.md +26 -0
  1098. package/references/video/clone-ad-template-workflow.md +14 -0
  1099. package/references/video/dialogue-duration-preflight.md +17 -0
  1100. package/references/video/generation-telemetry.md +18 -0
  1101. package/references/video/multi-shot-framework.md +455 -0
  1102. package/references/video/seedance-skills/01-cinematic.md +1329 -0
  1103. package/references/video/seedance-skills/02-3d-cgi.md +884 -0
  1104. package/references/video/seedance-skills/03-cartoon.md +1668 -0
  1105. package/references/video/seedance-skills/04-comic-to-video.md +1810 -0
  1106. package/references/video/seedance-skills/05-fight-scenes.md +741 -0
  1107. package/references/video/seedance-skills/06-motion-design-ad.md +1145 -0
  1108. package/references/video/seedance-skills/07-ecommerce-ad.md +928 -0
  1109. package/references/video/seedance-skills/08-anime-action.md +1145 -0
  1110. package/references/video/seedance-skills/09-product-360.md +988 -0
  1111. package/references/video/seedance-skills/10-music-video.md +1662 -0
  1112. package/references/video/seedance-skills/11-social-hook.md +1874 -0
  1113. package/references/video/seedance-skills/12-brand-story.md +1151 -0
  1114. package/references/video/seedance-skills/13-fashion-lookbook.md +1236 -0
  1115. package/references/video/seedance-skills/14-food-beverage.md +1110 -0
  1116. package/references/video/seedance-skills/15-real-estate.md +2344 -0
  1117. package/references/video/seedance-transport-payloads.md +144 -0
  1118. package/references/video/seedance-ugc-formulas.md +104 -0
  1119. package/references/video/stage-directors.md +47 -0
  1120. package/references/video/style-template-schema.md +40 -0
  1121. package/references/video/veo-prompting-guide.md +42 -0
  1122. package/schemas/video/artifacts/analyze-output.schema.json +60 -0
  1123. package/schemas/video/artifacts/assemble-report.schema.json +116 -0
  1124. package/schemas/video/artifacts/asset-manifest.schema.json +23 -0
  1125. package/schemas/video/artifacts/batch-queue-manifest.schema.json +59 -0
  1126. package/schemas/video/artifacts/brand-definition.schema.json +93 -0
  1127. package/schemas/video/artifacts/brand-dna.schema.json +55 -0
  1128. package/schemas/video/artifacts/brief.schema.json +13 -0
  1129. package/schemas/video/artifacts/clone-plan.schema.json +44 -0
  1130. package/schemas/video/artifacts/dialogue.schema.json +52 -0
  1131. package/schemas/video/artifacts/environment-assets.schema.json +30 -0
  1132. package/schemas/video/artifacts/execution-plan.schema.json +64 -0
  1133. package/schemas/video/artifacts/execution-report.schema.json +37 -0
  1134. package/schemas/video/artifacts/filmmaking-prompts.schema.json +129 -0
  1135. package/schemas/video/artifacts/flow-characters.schema.json +31 -0
  1136. package/schemas/video/artifacts/flow-voices.schema.json +30 -0
  1137. package/schemas/video/artifacts/motion-overlay-plan.schema.json +50 -0
  1138. package/schemas/video/artifacts/multi-shot-prompt.schema.json +90 -0
  1139. package/schemas/video/artifacts/music-video-config.schema.json +108 -0
  1140. package/schemas/video/artifacts/narration.schema.json +54 -0
  1141. package/schemas/video/artifacts/product-references.schema.json +29 -0
  1142. package/schemas/video/artifacts/project-blueprint.schema.json +236 -0
  1143. package/schemas/video/artifacts/publish-report.schema.json +12 -0
  1144. package/schemas/video/artifacts/reference-sheets.schema.json +85 -0
  1145. package/schemas/video/artifacts/review-report.schema.json +12 -0
  1146. package/schemas/video/artifacts/scene-candidates.schema.json +86 -0
  1147. package/schemas/video/artifacts/scene-selection.schema.json +50 -0
  1148. package/schemas/video/artifacts/seedance-assets.schema.json +31 -0
  1149. package/schemas/video/artifacts/sfx.schema.json +31 -0
  1150. package/schemas/video/artifacts/show-bible.schema.json +66 -0
  1151. package/schemas/video/artifacts/soundtrack.schema.json +39 -0
  1152. package/schemas/video/artifacts/story-bible.schema.json +131 -0
  1153. package/schemas/video/artifacts/storyboard.schema.json +58 -0
  1154. package/schemas/video/artifacts/voice-clones.schema.json +37 -0
  1155. package/schemas/video/brand-profile.schema.json +20 -0
  1156. package/schemas/video/errors.json +48 -0
  1157. package/schemas/video/pipeline-manifest.schema.json +51 -0
  1158. package/skills/README.md +113 -0
  1159. package/skills/ai-director/SKILL.md +140 -0
  1160. package/skills/ai-filmmaking/SKILL.md +239 -0
  1161. package/skills/ai-slop-cleaner/SKILL.md +114 -0
  1162. package/skills/brand-agency/SKILL.md +181 -0
  1163. package/skills/brand-presenter/SKILL.md +114 -0
  1164. package/skills/build-fix/SKILL.md +145 -0
  1165. package/skills/bunty/SKILL.md +41 -0
  1166. package/skills/catalog.json +326 -0
  1167. package/skills/character-ad/SKILL.md +154 -0
  1168. package/skills/character-creator/SKILL.md +303 -0
  1169. package/skills/character-library/README.md +12 -0
  1170. package/skills/character-library/SKILL.md +110 -0
  1171. package/skills/clawbot/SKILL.md +26 -0
  1172. package/skills/concierge/SKILL.md +183 -0
  1173. package/skills/configure-notifications/SKILL.md +286 -0
  1174. package/skills/davendra-presenter/SKILL.md +27 -0
  1175. package/skills/davendra-presenter/assets/davendra_intro_1.jpg +0 -0
  1176. package/skills/davendra-presenter/assets/davendra_intro_2.jpg +0 -0
  1177. package/skills/davendra-presenter/assets/davendra_outro_1.jpg +0 -0
  1178. package/skills/davendra-presenter/assets/davendra_outro_2.jpg +0 -0
  1179. package/skills/deep-interview/SKILL.md +358 -0
  1180. package/skills/deepsearch/SKILL.md +38 -0
  1181. package/skills/doctor/SKILL.md +200 -0
  1182. package/skills/graphify/SKILL.md +616 -0
  1183. package/skills/help/SKILL.md +200 -0
  1184. package/skills/higgsfield-generate/SKILL.md +171 -0
  1185. package/skills/improvement-run/SKILL.md +47 -0
  1186. package/skills/motion-reel/SKILL.md +102 -0
  1187. package/skills/movie-director/SKILL.md +338 -0
  1188. package/skills/multi-shot-prompt/SKILL.md +77 -0
  1189. package/skills/nex-presenter/SKILL.md +25 -0
  1190. package/skills/nex-presenter/assets/logo_manifest.json +26 -0
  1191. package/skills/nex-presenter/assets/logo_source.jpg +0 -0
  1192. package/skills/nex-presenter/assets/nex_brief_intro.mp4 +0 -0
  1193. package/skills/nex-presenter/assets/nex_intro_1.jpg +0 -0
  1194. package/skills/nex-presenter/assets/nex_intro_2.jpg +0 -0
  1195. package/skills/nex-presenter/assets/nex_outro_1.jpg +0 -0
  1196. package/skills/nex-presenter/assets/nex_outro_2.jpg +0 -0
  1197. package/skills/nex-presenter/assets/text_overlay.png +0 -0
  1198. package/skills/note/SKILL.md +62 -0
  1199. package/skills/pipeline/SKILL.md +86 -0
  1200. package/skills/review/SKILL.md +38 -0
  1201. package/skills/runway/SKILL.md +131 -0
  1202. package/skills/seedance-prompts/SKILL.md +194 -0
  1203. package/skills/skill/SKILL.md +835 -0
  1204. package/skills/skills-auditor/SKILL.md +73 -0
  1205. package/skills/studio-mode/SKILL.md +148 -0
  1206. package/skills/ugc/SKILL.md +386 -0
  1207. package/skills/ui-ux-pro-max/SKILL.md +386 -0
  1208. package/skills/video-analyze-template/SKILL.md +77 -0
  1209. package/skills/video-clone-ad/SKILL.md +67 -0
  1210. package/skills/video-framework/SKILL.md +201 -0
  1211. package/skills/video-portfolio-ops/SKILL.md +84 -0
  1212. package/skills/video-post/SKILL.md +97 -0
  1213. package/skills/video-production-handoff/SKILL.md +130 -0
  1214. package/skills/video-release-readiness/SKILL.md +93 -0
  1215. package/skills/video-replicator/SKILL.md +368 -0
  1216. package/skills/video-review-ui-qa/SKILL.md +103 -0
  1217. package/skills/video-storyboard/SKILL.md +71 -0
  1218. package/skills/video-thumbnail-lab/SKILL.md +67 -0
  1219. package/skills/web-clone/SKILL.md +366 -0
  1220. package/skills/worker/SKILL.md +106 -0
  1221. package/skills/youtube-audio/SKILL.md +114 -0
  1222. package/src/video/analyze-output.ts +10 -0
  1223. package/src/video/archive-project.ts +65 -0
  1224. package/src/video/artifact-history.ts +23 -0
  1225. package/src/video/artifact-store.ts +59 -0
  1226. package/src/video/artifact-validation.ts +268 -0
  1227. package/src/video/artifacts.ts +156 -0
  1228. package/src/video/assemble/animate-slides.ts +199 -0
  1229. package/src/video/assemble/animation-styles.json +97 -0
  1230. package/src/video/assemble/animation-styles.ts +54 -0
  1231. package/src/video/assemble/assemble.ts +547 -0
  1232. package/src/video/assemble/audio-concat.ts +165 -0
  1233. package/src/video/assemble/audio-mix-plan.ts +150 -0
  1234. package/src/video/assemble/audio-utils.ts +101 -0
  1235. package/src/video/assemble/cut-segment.ts +121 -0
  1236. package/src/video/assemble/ffmpeg.ts +333 -0
  1237. package/src/video/assemble/gemini-vision-classify.ts +153 -0
  1238. package/src/video/assemble/index.ts +247 -0
  1239. package/src/video/assemble/media-qc.ts +252 -0
  1240. package/src/video/assemble/music.ts +261 -0
  1241. package/src/video/assemble/narration-fit.ts +90 -0
  1242. package/src/video/assemble/overlay.ts +225 -0
  1243. package/src/video/assemble/pdf.ts +169 -0
  1244. package/src/video/assemble/qa-dialogue-lint.ts +129 -0
  1245. package/src/video/assemble/qa-image-filter.ts +147 -0
  1246. package/src/video/assemble/qa-image-vision.ts +154 -0
  1247. package/src/video/assemble/qa-narration-vision.ts +135 -0
  1248. package/src/video/assemble/qa-narration.ts +139 -0
  1249. package/src/video/assemble/stitch-ad.ts +222 -0
  1250. package/src/video/assemble/stitch.ts +918 -0
  1251. package/src/video/assemble/text-card.ts +285 -0
  1252. package/src/video/assemble/title-card.ts +186 -0
  1253. package/src/video/assemble/transcript.ts +240 -0
  1254. package/src/video/assemble/tts-elevenlabs.ts +182 -0
  1255. package/src/video/assemble/tts.ts +227 -0
  1256. package/src/video/assemble/types.ts +45 -0
  1257. package/src/video/assemble/upscale.ts +80 -0
  1258. package/src/video/asset-spec.ts +53 -0
  1259. package/src/video/asset-tag-lookup.ts +51 -0
  1260. package/src/video/atomic-write.ts +7 -0
  1261. package/src/video/audio-platform/native-elevenlabs-sfx.ts +128 -0
  1262. package/src/video/audio-platform/native-elevenlabs-tts.ts +119 -0
  1263. package/src/video/audio-platform/native-flowmusic.ts +167 -0
  1264. package/src/video/audio-platform/native-gemini-tts.ts +226 -0
  1265. package/src/video/audio-platform/native-lyria.ts +231 -0
  1266. package/src/video/audio-platform/native-lyria3.ts +244 -0
  1267. package/src/video/audio-platform/registry.ts +220 -0
  1268. package/src/video/audio-platform/suno-backend.ts +36 -0
  1269. package/src/video/audio-platform/types.ts +138 -0
  1270. package/src/video/batch-queue.ts +685 -0
  1271. package/src/video/blueprint-prompt.ts +118 -0
  1272. package/src/video/brand-definition.ts +287 -0
  1273. package/src/video/brand-dna.ts +478 -0
  1274. package/src/video/brand-prompt.ts +28 -0
  1275. package/src/video/candidate-migrate.ts +171 -0
  1276. package/src/video/category-registry.ts +224 -0
  1277. package/src/video/chain-fallback.ts +53 -0
  1278. package/src/video/character-auto-create.ts +547 -0
  1279. package/src/video/character-consistency.ts +85 -0
  1280. package/src/video/characters.ts +145 -0
  1281. package/src/video/checkpoints.ts +60 -0
  1282. package/src/video/cinema-profile.ts +120 -0
  1283. package/src/video/cinematography.ts +1229 -0
  1284. package/src/video/cli-output.ts +94 -0
  1285. package/src/video/cli-schema.ts +505 -0
  1286. package/src/video/cost-estimate.ts +150 -0
  1287. package/src/video/csv-export.ts +150 -0
  1288. package/src/video/dependencies.ts +64 -0
  1289. package/src/video/dialogue-fit.ts +62 -0
  1290. package/src/video/dialogue.ts +221 -0
  1291. package/src/video/director-defaults.ts +432 -0
  1292. package/src/video/director-preflight.ts +543 -0
  1293. package/src/video/doctor-portfolio.ts +197 -0
  1294. package/src/video/doctor.ts +499 -0
  1295. package/src/video/emotion-cues.ts +36 -0
  1296. package/src/video/environment-assets.ts +69 -0
  1297. package/src/video/environment-auto-create.ts +122 -0
  1298. package/src/video/errors.ts +133 -0
  1299. package/src/video/events.ts +42 -0
  1300. package/src/video/execute-autochain.ts +226 -0
  1301. package/src/video/execute.ts +569 -0
  1302. package/src/video/execution-cancel.ts +103 -0
  1303. package/src/video/execution-plan.ts +178 -0
  1304. package/src/video/execution-profile.ts +162 -0
  1305. package/src/video/execution-runtime.ts +975 -0
  1306. package/src/video/execution-seed.ts +46 -0
  1307. package/src/video/execution-status.ts +736 -0
  1308. package/src/video/filmmaking-prompts.ts +1789 -0
  1309. package/src/video/final-media.ts +118 -0
  1310. package/src/video/finish.ts +255 -0
  1311. package/src/video/flow-character-library.ts +342 -0
  1312. package/src/video/flow-markers.ts +330 -0
  1313. package/src/video/gemini-analyze.ts +387 -0
  1314. package/src/video/gemini-continuity.ts +186 -0
  1315. package/src/video/gemini-judge.ts +300 -0
  1316. package/src/video/gemini-key-pool.ts +153 -0
  1317. package/src/video/gen-image-flow.ts +491 -0
  1318. package/src/video/gen-image.ts +392 -0
  1319. package/src/video/generation-telemetry.ts +282 -0
  1320. package/src/video/http-error-safety.ts +13 -0
  1321. package/src/video/image-dimensions.ts +69 -0
  1322. package/src/video/legacy-import.ts +197 -0
  1323. package/src/video/library-clean.ts +399 -0
  1324. package/src/video/lipsync.ts +200 -0
  1325. package/src/video/media-host.ts +153 -0
  1326. package/src/video/metrics.ts +116 -0
  1327. package/src/video/motion-overlay/analyze-reel.ts +200 -0
  1328. package/src/video/motion-overlay/animate-render.ts +176 -0
  1329. package/src/video/motion-overlay/animate.ts +93 -0
  1330. package/src/video/motion-overlay/avatar-host-transport.ts +458 -0
  1331. package/src/video/motion-overlay/avatar-host.ts +238 -0
  1332. package/src/video/motion-overlay/compose-prompt.ts +247 -0
  1333. package/src/video/motion-overlay/execute.ts +355 -0
  1334. package/src/video/motion-overlay/flow-pack.ts +223 -0
  1335. package/src/video/motion-overlay/ingest.ts +210 -0
  1336. package/src/video/motion-overlay/motifs.ts +223 -0
  1337. package/src/video/motion-overlay/motion-style.ts +162 -0
  1338. package/src/video/motion-overlay/plan.ts +111 -0
  1339. package/src/video/motion-overlay/preview.ts +191 -0
  1340. package/src/video/motion-overlay/render-local.ts +441 -0
  1341. package/src/video/motion-overlay/run.ts +217 -0
  1342. package/src/video/motion-overlay/slice.ts +98 -0
  1343. package/src/video/motion-overlay/transcribe.ts +211 -0
  1344. package/src/video/motion-overlay/types.ts +89 -0
  1345. package/src/video/motion-overlay/v2v-transport.ts +209 -0
  1346. package/src/video/motion-overlay/write.ts +142 -0
  1347. package/src/video/multi-shot-artifact.ts +64 -0
  1348. package/src/video/multi-shot-prompt.ts +608 -0
  1349. package/src/video/music-video.ts +324 -0
  1350. package/src/video/narrate.ts +221 -0
  1351. package/src/video/native-dreamina.ts +638 -0
  1352. package/src/video/native-flow-r2v.ts +279 -0
  1353. package/src/video/native-runway.ts +647 -0
  1354. package/src/video/native-seedance.ts +615 -0
  1355. package/src/video/native-veo.ts +470 -0
  1356. package/src/video/next-actions.ts +247 -0
  1357. package/src/video/obsidian-export.ts +336 -0
  1358. package/src/video/obsidian-sync.ts +649 -0
  1359. package/src/video/obsidian-vault.ts +96 -0
  1360. package/src/video/outfit-prompts.ts +14 -0
  1361. package/src/video/outpaint-keyframe.ts +365 -0
  1362. package/src/video/pipeline-manifest.ts +16 -0
  1363. package/src/video/pipeline-manifests/director.json +46 -0
  1364. package/src/video/pipeline-manifests/storyboard.json +46 -0
  1365. package/src/video/platform-specs.ts +50 -0
  1366. package/src/video/playbooks.ts +34 -0
  1367. package/src/video/post-production.ts +277 -0
  1368. package/src/video/preview-portal/audit.ts +20 -0
  1369. package/src/video/preview-portal/discovery.ts +787 -0
  1370. package/src/video/preview-portal/generate.ts +138 -0
  1371. package/src/video/preview-portal/index.ts +41 -0
  1372. package/src/video/preview-portal/publish.ts +215 -0
  1373. package/src/video/preview-portal/render.ts +865 -0
  1374. package/src/video/preview-portal/shared-assets.ts +455 -0
  1375. package/src/video/preview-portal/templates.ts +112 -0
  1376. package/src/video/preview-portal/types.ts +288 -0
  1377. package/src/video/product-references.ts +43 -0
  1378. package/src/video/project-blueprint.ts +458 -0
  1379. package/src/video/project-index.ts +179 -0
  1380. package/src/video/projects.ts +18 -0
  1381. package/src/video/prompt-guidance.ts +64 -0
  1382. package/src/video/prompt-library.ts +96 -0
  1383. package/src/video/prompt-lint.ts +568 -0
  1384. package/src/video/prompt-quality.ts +635 -0
  1385. package/src/video/prompt-rules.ts +209 -0
  1386. package/src/video/provider-adapter-runner.ts +104 -0
  1387. package/src/video/provider-platform/index.ts +5 -0
  1388. package/src/video/provider-platform/registry.ts +286 -0
  1389. package/src/video/provider-platform/route-capabilities.ts +327 -0
  1390. package/src/video/provider-platform/router.ts +221 -0
  1391. package/src/video/provider-platform/security.ts +29 -0
  1392. package/src/video/provider-platform/telemetry.ts +116 -0
  1393. package/src/video/provider-platform/types.ts +192 -0
  1394. package/src/video/provider-status.ts +199 -0
  1395. package/src/video/providers/dreamina-useapi.ts +345 -0
  1396. package/src/video/providers/flowmusic-useapi.ts +252 -0
  1397. package/src/video/providers/google-flow.ts +110 -0
  1398. package/src/video/providers/public-host.ts +128 -0
  1399. package/src/video/providers/runway-useapi.ts +377 -0
  1400. package/src/video/providers/xskill.ts +304 -0
  1401. package/src/video/readiness.ts +284 -0
  1402. package/src/video/reference-sheet-store.ts +40 -0
  1403. package/src/video/reference-sheets.ts +224 -0
  1404. package/src/video/remix-narrated.ts +92 -0
  1405. package/src/video/report-diff.ts +299 -0
  1406. package/src/video/report-history.ts +122 -0
  1407. package/src/video/report.ts +35 -0
  1408. package/src/video/review-ui.ts +2495 -0
  1409. package/src/video/scene-candidate-store.ts +152 -0
  1410. package/src/video/scene-candidates.ts +195 -0
  1411. package/src/video/scene-selection-store.ts +36 -0
  1412. package/src/video/scene-selection.ts +306 -0
  1413. package/src/video/scheduling.ts +18 -0
  1414. package/src/video/scorecard.ts +90 -0
  1415. package/src/video/seedance-asset-library.ts +259 -0
  1416. package/src/video/seedance-blocks.ts +118 -0
  1417. package/src/video/seedance-chain-host.ts +152 -0
  1418. package/src/video/seedance-content-filter.ts +354 -0
  1419. package/src/video/seedance-skill-loader.ts +83 -0
  1420. package/src/video/sfx.ts +159 -0
  1421. package/src/video/shot-grammar.ts +349 -0
  1422. package/src/video/show-bible.ts +235 -0
  1423. package/src/video/soundtrack.ts +257 -0
  1424. package/src/video/stage-guards.ts +112 -0
  1425. package/src/video/status.ts +342 -0
  1426. package/src/video/story-bible.ts +302 -0
  1427. package/src/video/storyboard-grid.ts +320 -0
  1428. package/src/video/storyboard-markdown.ts +434 -0
  1429. package/src/video/storyboard-still-candidates.ts +82 -0
  1430. package/src/video/storyboard-templates.ts +249 -0
  1431. package/src/video/studio/execute.ts +401 -0
  1432. package/src/video/studio/planner.ts +114 -0
  1433. package/src/video/studio/project-context.ts +25 -0
  1434. package/src/video/studio/recipes.ts +346 -0
  1435. package/src/video/studio/session.ts +24 -0
  1436. package/src/video/studio/types.ts +76 -0
  1437. package/src/video/template-store.ts +241 -0
  1438. package/src/video/timeline.ts +32 -0
  1439. package/src/video/title-overlay.ts +234 -0
  1440. package/src/video/types.ts +465 -0
  1441. package/src/video/veo-subprocess.ts +77 -0
  1442. package/src/video/verify-env.ts +206 -0
  1443. package/src/video/verify-final.ts +65 -0
  1444. package/src/video/video-context.ts +92 -0
  1445. package/src/video/vocal-map.ts +155 -0
  1446. package/src/video/vocal-sync-plan.ts +224 -0
  1447. package/src/video/voice-clone.ts +410 -0
  1448. package/src/video/with-retry.ts +149 -0
  1449. package/src/video/workload.ts +87 -0
  1450. package/src/video/workspace.ts +255 -0
  1451. package/tmp/review-station/index.html +4194 -0
  1452. package/tsconfig.json +19 -0
@@ -0,0 +1,2638 @@
1
+ # CLI Reference
2
+
3
+ ## Agent-friendly surface (v3)
4
+
5
+ These four properties hold across every `vclaw` subcommand. They are the
6
+ contract external agents (Claude Code / Codex / Antigravity / Cursor) can
7
+ rely on.
8
+
9
+ ### 1. JSON on non-TTY
10
+
11
+ When `stdout` is not a TTY (i.e., piped to another command or captured
12
+ by an agent), every subcommand writes JSON to stdout. Human-readable
13
+ formatting is reserved for interactive TTY use. Progress chatter
14
+ (spinners, status updates) always goes to `stderr`.
15
+
16
+ ```bash
17
+ # TTY (human): pretty-printed
18
+ vclaw video providers
19
+
20
+ # Non-TTY (agent / pipe): newline-terminated JSON
21
+ vclaw video providers | jq '.routes[].routeId'
22
+ ```
23
+
24
+ ### 2. Exit-code taxonomy
25
+
26
+ | Code | Name | Meaning |
27
+ |---:|---|---|
28
+ | 0 | SUCCESS | Command completed without errors. |
29
+ | 1 | USER_ERROR | Bad input — invalid flag, missing argument, validation failure. **Retrying with the same input will fail the same way.** |
30
+ | 2 | SYSTEM_ERROR | Environmental failure — provider down, disk full, missing env var. **Retry may succeed.** |
31
+ | 3 | GATE | Gated by an approval / readiness check (e.g., director storyboard.md not approved yet). **The command CAN succeed once the gate clears.** |
32
+
33
+ Agents decide retry strategy from the exit code. Code 1 means "fix the
34
+ input and retry"; code 2 means "investigate the system and try later";
35
+ code 3 means "do the gate-clearing work first, then retry."
36
+
37
+ ### 3. Stable error codes
38
+
39
+ On any non-zero exit, stdout contains a JSON envelope with a stable
40
+ string `code` field. The full catalog lives at
41
+ [`schemas/video/errors.json`](../schemas/video/errors.json) and the
42
+ TS source-of-truth is `src/video/errors.ts` `ALL_ERROR_CODES`.
43
+
44
+ ```json
45
+ {
46
+ "code": "project_not_found",
47
+ "message": "No workspace at projects/foo/",
48
+ "details": { "slug": "foo" }
49
+ }
50
+ ```
51
+
52
+ Codes are **stable** — once shipped, they never change name. New codes
53
+ get added; old ones may get a deprecation note but the string stays
54
+ working for old agents.
55
+
56
+ ### 4. Single-call discovery: `vclaw schema --json`
57
+
58
+ Returns the full v3 contract in one call:
59
+
60
+ - `version`: the v3 release this dump comes from
61
+ - `commands`: array of `{name, usage, flags, aliases?}`
62
+ - `exitCodes`: the 0/1/2/3 taxonomy
63
+ - `errorCodes`: the full ALL_ERROR_CODES list
64
+ - `artifactSchemas`: every `schemas/video/artifacts/*.schema.json` embedded by name
65
+
66
+ Agents should call this once on first contact, then drive the CLI from
67
+ the dump without further introspection. Cheaper than per-command
68
+ `--help` parsing.
69
+
70
+ ```bash
71
+ vclaw schema --json | jq '.commands | map(.name)'
72
+ ```
73
+
74
+ ## Noun-verb command conventions
75
+
76
+ v3 prefers noun-verb command shape (`vclaw video character list`) over
77
+ hyphenated forms (`vclaw video character-list`). Both work — every
78
+ kebab form has a noun-verb alias registered. The canonical name in
79
+ `vclaw schema --json` is the kebab form for now (backwards compat); v3.1
80
+ will switch the canonical form and alias the kebab.
81
+
82
+ See `vclaw schema --json | jq '.commands[] | {name, aliases}'` for the complete list.
83
+
84
+ **`vclaw veo *` subcommands** keep the Bun CLI's colon-separated form
85
+ (`useapi:accounts list`, not `useapi accounts list`). This matches the
86
+ underlying `bun run flow.ts` surface. Aliasing the colon to a space
87
+ would create confusion for users with existing scripts.
88
+
89
+ ---
90
+
91
+ ## Studio Planner
92
+
93
+ `vclaw studio` is the human-friendly planning front door. It maps goals such as
94
+ presenter video, UGC campaign, music video, copy-reference, review, and publish
95
+ to deterministic CLI commands.
96
+
97
+ ```bash
98
+ vclaw studio [--dry-run] [--goal <goal>] [--project <slug>] [--intent <text>] [--input <path-or-url>] [--client <name>] [--duration <seconds>] [--write-session] [--execute] [--confirm-spend] [--auto-approve-storyboard] [--from-step <id>]
99
+ ```
100
+
101
+ Supported goals:
102
+
103
+ - `create-video`
104
+ - `copy-reference`
105
+ - `presenter-video`
106
+ - `music-video`
107
+ - `ugc-campaign`
108
+ - `existing-project`
109
+ - `review-regenerate`
110
+ - `publish-deliver`
111
+
112
+ Studio is plan-only by default: it returns a command plan and optional
113
+ `studio-session.json` artifact, but runs nothing.
114
+
115
+ Add `--execute` to **run** the emitted plan — Studio shells out to the same
116
+ `vclaw video …` commands (it does not re-implement orchestration). Three modes,
117
+ chosen at run time:
118
+
119
+ - `--execute` — **dry**: free steps + spend steps with `--dry-run`; a spend
120
+ subcommand lacking `--dry-run` is refused (`blocked-spend`). Spends nothing.
121
+ - `--execute --confirm-spend` — **real render, human-gated**: promotes the dry
122
+ spend steps to real (strips `--dry-run`); the render still needs the storyboard
123
+ approved out-of-band (the runner strips `VIDEOCLAW_APPROVE_STORYBOARD`).
124
+ - `--execute --confirm-spend --auto-approve-storyboard` — **unattended render**:
125
+ also sets `VIDEOCLAW_APPROVE_STORYBOARD` so one command runs through the real
126
+ render with no human checkpoint.
127
+
128
+ It fails fast (a blocked/failed step stops with no partial spend) and
129
+ `--from-step <id>` resumes after an approval. The result is reported under an
130
+ `execution` block (`mode`, per-step `status`, `stopReason`, a dry-mode `hint`).
131
+ See `docs/STUDIO.md`.
132
+
133
+ ---
134
+
135
+ ## Veo (Bun bridge)
136
+
137
+ The `vclaw veo *` subcommand family bridges to the Bun-based
138
+ `vclaw-cli/flow.ts` for Google Flow access via Puppeteer. The Bun
139
+ runtime is required (install via `curl -fsSL https://bun.sh/install | bash`).
140
+
141
+ ### Standard verbs
142
+
143
+ | Command | Purpose |
144
+ |---|---|
145
+ | `vclaw veo status [batchId]` | Show batch status. |
146
+ | `vclaw veo list` | List all batches. |
147
+ | `vclaw veo history [--limit <n>]` | Recent job history. |
148
+ | `vclaw veo resume [batchId]` | Resume a paused batch. |
149
+ | `vclaw veo reset` | Reset failed jobs to pending. |
150
+ | `vclaw veo cancel` | Cancel current batch. |
151
+
152
+ ### UseAPI verbs
153
+
154
+ | Command | Purpose |
155
+ |---|---|
156
+ | `vclaw veo useapi:accounts list\|add` | Manage useapi.net accounts. |
157
+ | `vclaw veo useapi:captcha list \| --provider <name> --key <key>` | CAPTCHA providers. |
158
+ | `vclaw veo useapi:health` | Account health + history. |
159
+ | `vclaw veo useapi:image --image-prompt "..."` | Generate images. |
160
+ | `vclaw veo useapi:image:upscale --media-id <id> --resolution 2k\|4k` | Upscale images. |
161
+ | `vclaw veo useapi:gif --media-id <id> --output-file <path>` | Video → GIF (free). |
162
+ | `vclaw veo useapi:upscale --media-id <id> --resolution 1080p\|4k` | Upscale videos. |
163
+
164
+ See `vclaw schema --json | jq '.commands[] | select(.name | startswith("veo "))'` for the canonical list.
165
+
166
+ The legacy standalone form `bun run vclaw-cli/flow.ts <verb>` still
167
+ works in v3.0 but is being deprecated. Use `vclaw veo *` going forward.
168
+
169
+ ---
170
+
171
+ ## Project lifecycle
172
+
173
+ ```bash
174
+ vclaw video init <slug> [--root <path>] [--mode storyboard|director]
175
+ vclaw video create "<intent>" [--project <slug>] [--root <path>] [--production-mode storyboard|director] [--title <title>] [--scenes <count>] [--style <preset>] [--color-grading <preset>] [--platform <name>] [--gb-character <Name:ID> ...] [--import-library-characters] [--auto-create-characters <json-path>] [--api-url <url>] [--aspect-ratio 16:9|9:16|1:1] [--quality fast|quality] [--resolution 720p|1080p] [--audio on|off] [--outputs 1-4] [--apply-content-fixes] [--execute] [--dry-run]
176
+ vclaw video auto "<intent>" [...same flags as create]
177
+ vclaw video iterate "<intent>" [...same flags as create]
178
+ vclaw video run-pipeline "<intent>" [...same flags as create]
179
+ vclaw video brief --project <slug> --title <title> --intent <intent> [--root <path>] [--mode storyboard|director] [--platform <name>] [--aspect-ratio 16:9|9:16|1:1] [--quality fast|quality] [--resolution 720p|1080p] [--audio on|off] [--outputs 1-4]
180
+ vclaw video storyboard-template-list
181
+ vclaw video storyboard-template-show --name <template-id>
182
+ vclaw video storyboard --project <slug> (--scene <text> [--scene <text> ...] | --template <template-id> [--environment <text>] [--character-a <name>] [--character-b <name>]) [--scene-character <sceneIndex:name> ...] [--root <path>]
183
+ vclaw video assets --project <slug> --asset <kind:path[:sceneIndex][:backend]> [--asset ...] [--root <path>]
184
+ vclaw video review-ui --project <slug> [--root <path>] [--host <host>] [--port <port>] [--ui-path <path>] [--dry-run]
185
+ vclaw video review-autopilot --project <slug> [--root <path>] [--template <template-id>] [--character <name>] [--run-id <id>]
186
+ vclaw video storyboard-grid --project <slug> [--root <path>] [--output <path>] [--width <px>] [--height <px>] [--dry-run]
187
+ vclaw video portal --project <slug> [--root <path>] [--client <name>] [--run <id>] [--surface edit|review|client-review|preview|compare|index]
188
+ vclaw video portal-index [--root <path>] [--client <name>] [--output <path>]
189
+ vclaw video publish-preview --project <slug> --client <name> --bucket <bucket> [--root <path>] [--run <id>] [--surface edit|review|client-review|preview|compare|index] [--public-base-url <url>] [--wrangler-bin <path>] [--dry-run]
190
+ vclaw video publish-portal-index --bucket <bucket> [--root <path>] [--client <name>] [--public-base-url <url>] [--wrangler-bin <path>] [--dry-run]
191
+ vclaw video review --project <slug> --verdict pass|retry|fail [--finding <text> ...] [--root <path>]
192
+ vclaw video publish --project <slug> --status ready|published|blocked [--final-output <path>] [--note <text> ...] [--root <path>]
193
+ ```
194
+
195
+ For production image-to-video handoff, prefer `review-ui` or
196
+ `review-autopilot`. The simple `review --verdict pass` path is for projects
197
+ that already have equivalent review evidence outside the browser station.
198
+ Publishing remains blocked unless the saved `review-report.json` has
199
+ `verdict: "pass"` and `metrics.publishReady: true`.
200
+
201
+ ## Preview review and delivery portal
202
+
203
+ The preview portal is the standardized static HTML layer for generated video
204
+ projects. It replaces one-off `preview.html`/`review.html` variants with
205
+ repeatable surfaces:
206
+
207
+ > **Staging:** the portal discovers assets under the **project** directory —
208
+ > `projects/<slug>/final/{videos,images,audio}` (and top-level `videos/`,
209
+ > `images/`, `characters/`, …). It does **not** scan a `final/` at the workspace
210
+ > root, so finals staged there produce an empty preview. Put the finished cut,
211
+ > stills, and soundtrack under `projects/<slug>/final/` before building the
212
+ > surface.
213
+
214
+ Portal rendering reads `template` or `previewTemplate` from `project.json` and
215
+ uses the built-in registry for `music-video`, `story-film`, `documentary`,
216
+ `product-ad`, `sports-recap`, and `generic-video` labels/section ordering.
217
+ It also reads project-scoped image entries from `artifacts/asset-manifest.json`
218
+ and renders them as generation inputs; Seedance-backed images appear under
219
+ `Seedance Input Frames` for music-video projects so reviewers can inspect the
220
+ exact start/upscaled frame being sent to Seedance 2.
221
+
222
+ | Command | Output |
223
+ |---|---|
224
+ | `vclaw video portal --project <slug>` | Writes `edit.html`, `review.html`, `client-review.html`, and `preview.html` in the project directory. |
225
+ | `vclaw video portal --project <slug> --surface compare` | Writes `compare.html` for version/run comparison. |
226
+ | `vclaw video portal-index` | Writes `projects/index.html` across all projects. |
227
+ | `vclaw video portal-index --client <name>` | Writes `projects/clients/<client>/index.html` for that client only. |
228
+ | `vclaw video publish-preview --dry-run ...` | Prints the Cloudflare R2 upload plan without side effects. |
229
+ | `vclaw video publish-preview ...` | Uploads referenced files with `wrangler r2 object put` and records a publish audit event. |
230
+ | `vclaw video publish-portal-index --client <name> ...` | Uploads a client index to `clients/<client>/index.html` with links into each uploaded run folder. |
231
+
232
+ Example local generation:
233
+
234
+ ```bash
235
+ vclaw video portal \
236
+ --project 2026-05-27_dhuaan-music-video \
237
+ --root /path/to/video-workspace \
238
+ --client "Acme Studios" \
239
+ --run run-002
240
+ ```
241
+
242
+ Example publish dry-run:
243
+
244
+ ```bash
245
+ vclaw video publish-preview \
246
+ --project 2026-05-27_dhuaan-music-video \
247
+ --root /path/to/video-workspace \
248
+ --client "Acme Studios" \
249
+ --run run-002 \
250
+ --surface preview \
251
+ --bucket videoclaw-reviews \
252
+ --public-base-url https://reviews.example.com \
253
+ --dry-run
254
+ ```
255
+
256
+ The publish plan includes the HTML file plus local `src`/`href` references,
257
+ content types, R2 keys, SHA-256 hashes, and public URLs when a base URL is
258
+ provided. Running without `--dry-run` requires `wrangler` to be installed and
259
+ authenticated. `--wrangler-bin` can point to a specific Wrangler executable
260
+ when running from automation.
261
+
262
+ Project surfaces publish under
263
+ `clients/<client>/<project>/runs/<run>/<surface>.html`. Published client
264
+ indexes link to those run folders, so a client with six generations can open
265
+ `clients/<client>/index.html` and choose among all six project/run previews.
266
+
267
+ `vclaw video create` is the clean-room front door for the legacy “one command
268
+ to start a project” mental model. In its current form it:
269
+
270
+ - initializes the project when needed
271
+ - writes canonical `brief` and `storyboard` artifacts
272
+ - scaffolds storyboard-seed assets for execution planning
273
+ - records Go Bananas character bindings as project character profiles
274
+ - can import exact-name Go Bananas matches from the story intent when `--import-library-characters` is present
275
+ - can auto-create missing Go Bananas characters from a JSON seed file via `--auto-create-characters <json-path>`
276
+ - carries execution-profile overrides (`aspect-ratio`, `quality`, `resolution`,
277
+ `audio`, `outputs`) into the canonical brief and status surfaces
278
+ - generates `storyboard.md` automatically for `director` mode
279
+ - optionally hands off to the existing `execute` path when `--execute` is present
280
+
281
+ For `director` mode, this means the first-run path now supports the same
282
+ storyboard-first approval pattern as the older workflow surface, while still
283
+ writing canonical clean-room artifacts underneath.
284
+
285
+ `vclaw video auto`, `vclaw video iterate`, and `vclaw video run-pipeline` are
286
+ thin creator-mode drivers over `video create` (same flag surface) with
287
+ opinionated defaults:
288
+
289
+ - `vclaw video auto "<intent>" [...]` — defaults `--production-mode director`
290
+ when neither `--mode` nor `--production-mode` is passed; otherwise identical
291
+ to `create`.
292
+ - `vclaw video iterate "<intent>" [...]` — defaults `director` mode AND
293
+ force-appends `--execute`, so it re-generates and immediately runs the
294
+ project in one shot.
295
+ - `vclaw video run-pipeline "<intent>" [...]` — the full create→execute pipeline
296
+ driver: defaults `director` mode and `--execute`; `--dry-run` is supported to
297
+ plan the run without submitting.
298
+
299
+ ## Story bible (continuity reference)
300
+
301
+ Every storyboard-producing command now also emits a deterministic continuity
302
+ bible — `projects/<slug>/artifacts/story-bible.json` (schema
303
+ `schemas/video/artifacts/story-bible.schema.json`, `schemaVersion: 1`). It is
304
+ derived from the canonical `brief` + `storyboard` + character profiles
305
+ (`characters/characters.json`); it spends no credits and calls no providers.
306
+ The commands that write it are `video create`, `video storyboard`,
307
+ `video clone-execute`, `video storyboard-from-clone`, `video storyboard-review`,
308
+ and `video director-preflight --apply-content-fixes` (the bible is regenerated
309
+ after director content-fixes are applied, so it always reflects the corrected
310
+ storyboard).
311
+
312
+ The artifact gives downstream generation one machine-readable reference so
313
+ scenes and regenerations stay consistent — cast (`characters[]` with
314
+ `referenceAssets`), `settings[]`, `props[]`, a per-scene timeline (`scenes[]`
315
+ with `startSeconds`/`endSeconds`/`durationSeconds`, `charactersPresent`,
316
+ `visualPrompt`/`motionPrompt`/`diegeticAudio`, and `continuityNotes[]`), and a
317
+ rolled-up `timeline`.
318
+
319
+ It is recorded in the storyboard checkpoint under `artifacts['story-bible']`,
320
+ carried on the `artifact.storyboard.written` event payload as `storyBiblePath`,
321
+ and surfaced as `storyBiblePath` in the command's JSON output. `doctor-project`
322
+ validates it (added to the canonical-artifacts list, plus a malformed-JSON
323
+ check on `artifacts/story-bible.json`).
324
+
325
+ End-to-end smoke (create → storyboard continuity + content-fix propagation,
326
+ image-only path):
327
+
328
+ ```bash
329
+ npm run smoke:story-bible-image
330
+ ```
331
+
332
+ ## Analysis and templates
333
+
334
+ ```bash
335
+ vclaw video analyze --project <slug> --source <path-or-url> [--title <title>] [--beat <text> ...] [--keep <text> ...] [--change <text> ...] [--var <text> ...] [--auto]
336
+ vclaw video analyze-template --project <slug> --source <path-or-url> [options] [--auto]
337
+ vclaw video prompt-lib-list
338
+ vclaw video prompt-lib-show --name <reference-name> [--root <path>]
339
+ vclaw video template-create --project <slug> --name <template-name> [--root <path>]
340
+ vclaw video template-save --project <slug> --name <template-name> [--root <path>]
341
+ vclaw video template-list [--root <path>]
342
+ vclaw video template-show --name <template-name> [--root <path>]
343
+ vclaw video template-validate --name <template-name> [--root <path>]
344
+ vclaw video clone-ad --template <template-name> --project <slug> --intent <text> [--root <path>] [--mode storyboard|director] [--platform <name>] [--aspect-ratio 16:9|9:16|1:1] [--quality fast|quality] [--resolution 720p|1080p] [--audio on|off] [--outputs 1-4] [--dry-run]
345
+ vclaw video clone-plan --template <template-name> --project <slug> --intent <text> [--root <path>]
346
+ vclaw video clone-init --template <template-name> --project <slug> --intent <text> [--root <path>] [--mode storyboard|director] [--platform <name>] [--aspect-ratio 16:9|9:16|1:1] [--quality fast|quality] [--resolution 720p|1080p] [--audio on|off] [--outputs 1-4]
347
+ vclaw video storyboard-from-clone --project <slug> [--root <path>] [--mode storyboard|director]
348
+ vclaw video clone-execute --template <template-name> --project <slug> --intent <text> [--root <path>] [--mode storyboard|director] [--platform <name>] [--aspect-ratio 16:9|9:16|1:1] [--quality fast|quality] [--resolution 720p|1080p] [--audio on|off] [--outputs 1-4] [--dry-run]
349
+ ```
350
+
351
+ When `--auto` is present on `analyze` / `analyze-template`, the clean-room repo
352
+ uses the Gemini HTTP path to fill the analyze artifact automatically. It reads
353
+ keys from `GEMINI_API_KEYS`, `GOOGLE_API_KEYS`, or `GOOGLE_API_KEY`, and you can
354
+ override the endpoint with `VCLAW_GEMINI_API_ENDPOINT`. When `--source` is a
355
+ readable local video file, `--auto` now samples ~6 JPEG frames spread evenly
356
+ across the whole clip (a frame every `duration / 6` seconds via `ffmpeg`'s `fps`
357
+ filter — the clip duration is probed when not supplied; overridable with
358
+ `VCLAW_FFMPEG_BIN`) and sends them to Gemini so the analysis is grounded in the
359
+ actual footage start-to-end, not just the opening ~20s. URL sources, directory
360
+ paths, and any frame extraction that fails stay metadata-only and fall back to
361
+ text-only analysis (clips whose duration cannot be determined fall back to
362
+ ffmpeg's head-clustered `thumbnail` sampling).
363
+
364
+ Analyze artifacts can now carry optional clone-planning fields:
365
+
366
+ - `styleLayers`
367
+ - `beatCompression`
368
+ - `technicalNotes`
369
+ - `dialogueNotes`
370
+
371
+ Saved templates preserve those fields and clone plans copy them forward with a
372
+ `workflowChecklist` so operators can keep the reusable mechanism while replacing
373
+ brand, product, audience, proof, and offer details.
374
+
375
+ ## Project management
376
+
377
+ ```bash
378
+ vclaw video set-meta --project <slug> [--root <path>] [--owner <name>] [--priority low|medium|high|critical] [--due YYYY-MM-DD] [--tag <value> ...] [--blocked-by <slug> ...] [--blocked-reason <text>]
379
+ vclaw video set-execution-profile --project <slug> [--root <path>] [--aspect-ratio 16:9|9:16|1:1] [--quality fast|quality] [--resolution 720p|1080p] [--audio on|off] [--outputs 1-4]
380
+ vclaw video character-add --project <slug> --name <name> [--gb-id <id>] [--description <text>] [--ref <path> ...] [--note <text> ...] [--root <path>]
381
+ vclaw video character-auto-create --project <slug> --input <json-path> [--root <path>] [--api-url <url>] [--no-sheet] [--sheet-preset <id>] [--dry-run]
382
+ vclaw video environment-auto-create --project <slug> --input <json-path> [--root <path>] [--api-url <url>] [--dry-run]
383
+ vclaw video character-import-library --project <slug> --intent "<text>" [--root <path>] [--api-url <url>]
384
+ vclaw video character-list --project <slug> [--root <path>]
385
+ vclaw video character-show --project <slug> --name <name> [--root <path>]
386
+ vclaw video character-consistency --project <slug> [--root <path>]
387
+ vclaw video find-library --intent "<text>" [--api-url <url>]
388
+ vclaw video library find --intent "<text>" [--api-url <url>]
389
+ vclaw video library clean [--ids <csv>] [--name-regex <pattern>] [--bloated] [--max-prompt-chars <n>] [--dry-run] [--yes]
390
+ vclaw video library clean --patch <id> --base-prompt <text> [--dry-run]
391
+ vclaw video status --project <slug> [--root <path>] [--mode storyboard|director]
392
+ vclaw video readiness --project <slug> [--root <path>] [--mode storyboard|director]
393
+ vclaw video plan --project <slug> [--root <path>] [--mode storyboard|director]
394
+ vclaw video execution-plan --project <slug> [--root <path>] [--mode storyboard|director]
395
+ vclaw video produce --project <slug> [--root <path>] [--mode storyboard|director] [--scene <n> ...] [--dry-run] [--continuity-feedback] [--auto-chain] [--chain-fallback]
396
+ vclaw video execute --project <slug> [--root <path>] [--mode storyboard|director] [--scene <n> ...] [--dry-run] [--continuity-feedback] [--auto-chain] [--chain-fallback]
397
+ vclaw video execute-status --project <slug> [--root <path>] [--mode storyboard|director]
398
+ vclaw video execute-cancel --project <slug> [--root <path>] [--mode storyboard|director]
399
+ vclaw video assemble --project <slug> [--root <path>] [--brand-profile <path>] [--from-clips] [--dry-run]
400
+ vclaw video soundtrack --project <slug> (--prompt "<text>" [--duration <seconds>] [--backends suno,lyria,lyria3,flowmusic] [--lyrics "<[Verse]…>"] [--instrumental] [--dry-run] [--confirm-spend] | --select <backendId>) [--root <path>]
401
+ vclaw video narrate --project <slug> (--text "<script>" | --text-file <path>) [--voice <name>] [--backend gemini-tts|elevenlabs-tts] [--video-duration-ms <ms>] [--dry-run] [--confirm-spend] [--root <path>]
402
+ vclaw video dialogue --project <slug> --turns "Name: line || Name2: line2" [--voice <name>] [--backend gemini-tts|elevenlabs-tts] [--dry-run] [--confirm-spend] [--root <path>]
403
+ vclaw video sfx --project <slug> --prompt "<text>" [--duration <seconds>] [--prompt-influence <0..1>] [--backend elevenlabs-sfx] [--dry-run] [--confirm-spend] [--root <path>]
404
+ vclaw video gen-image --project <slug> --prompt "<text>" --kind prop|screen|overlay [--backend gobananas|openai|flow] [--scene <i>] [--out <path>] [--aspect <ratio>] [--model <id>] [--character-id <n>] [--style-preset-id <n>] [--ref <path|mediaGenerationId>]... [--character <name|ref>]... [--count <1-4>] [--seed <n>] [--dry-run] [--root <path>]
405
+ vclaw video overlay --input <video> --output <path> (--graphic <png> | --alert "<text>" | --lower-third "<text>") [--position <pos>] [--start <s>] [--end <s>] [--fade-in <s>] [--fade-out <s>] [--opacity <0..1>] [--pulse-hz <n>] [--font-size <n>] [--color <c>] [--dry-run]
406
+ vclaw video review-ui --project <slug> [--root <path>] [--host <host>] [--port <port>] [--ui-path <path>] [--dry-run]
407
+ vclaw video review-autopilot --project <slug> [--root <path>] [--template <template-id>] [--character <name>] [--run-id <id>]
408
+ vclaw video artifact-history --project <slug> --artifact <name> [--root <path>]
409
+ vclaw video doctor-project --project <slug> [--root <path>] [--mode storyboard|director]
410
+ vclaw video verify-env [--root <path>] [--workspace-root <path>]
411
+ ```
412
+
413
+ `vclaw video verify-env` is the environment readiness doctor. It prints a JSON
414
+ environment report (provider keys, runtimes) from `buildVideoEnvironmentReport`;
415
+ it is read-only, needs no project, and resolves its workspace root from
416
+ `--workspace-root`, then `--root`, then the current directory.
417
+
418
+ Primary lifecycle names are now `plan` and `produce`. `execution-plan` and `execute`
419
+ remain supported as compatibility aliases over the same handlers.
420
+
421
+ `--continuity-feedback` (opt-in, default off) turns on the PHASE-3 continuity
422
+ loop. It only affects scenes that already carry a chain-from-prev seed (set via
423
+ the scene-selection `chainFromPrev` flag in candidate mode). For each such scene
424
+ it (1) enriches `task.prompt` with a concise `Continuity: <cues>` clause and
425
+ (2) re-pastes the project's full cast/setting/prop descriptor block from the
426
+ `story-bible` artifact verbatim (StoryCraft anti-drift). When the prior scene's
427
+ seed is an on-disk **image** and a Gemini key (`GEMINI_API_KEYS` /
428
+ `GOOGLE_API_KEY`) is configured, the cues are extracted by a single Gemini
429
+ `gemini-2.0-flash` call on that image; otherwise (video seed, no key, or any
430
+ Gemini failure) it falls back to the deterministic story-bible descriptors. The
431
+ re-paste is idempotent. **Omitting the flag is byte-identical to today** — no
432
+ Gemini call and no prompt mutation.
433
+
434
+ `--auto-chain` (opt-in, default off) renders the whole storyboard as a
435
+ continuity chain in one command. Scene 0 renders first; then every later scene
436
+ is automatically seeded from the **previous scene's selected output video**
437
+ (`chainFromPrev`) with continuity prompt-augmentation bundled in (it implies
438
+ `--continuity-feedback`). The previous scene's produced candidate is
439
+ auto-selected — no manual `reroll-scene` per scene. Output is a JSON
440
+ `auto-chain` report: `scenes[]` (each with `chainedFrom` + `selectedCandidateId`)
441
+ and `stoppedAt` (the scene index where it halted, or `null`). It is **resumable**
442
+ — re-running skips scenes that already have a selection — and **fail-fast**: a
443
+ scene that yields no usable candidate halts the chain rather than breaking
444
+ continuity silently. In `director` mode the storyboard-approval gate still
445
+ applies before the first render; for an unattended chain set
446
+ `VIDEOCLAW_APPROVE_STORYBOARD=1` so the per-scene gate stays open through the
447
+ loop. `--scene a b c` restricts and orders the chained subset. It is
448
+ **incompatible with `--dry-run`** (chaining needs each scene's real rendered
449
+ output to seed the next) and is rejected with `invalid_flag_value` rather than
450
+ silently rendering for real. Because the seedance reference assembly now merges
451
+ identity + continuity, a chained scene keeps BOTH its character Asset:// refs and
452
+ the keyframe video.
453
+
454
+ `--chain-fallback` (opt-in) makes the chain **self-heal** instead of fail-fast. A
455
+ chained scene can produce no usable candidate when the provider rejects its
456
+ **video reference** — e.g. Seedance's face filter (`fail_code 4011 RejectFace`)
457
+ rejects a specific upstream clip as an input reference even though other clips
458
+ pass. With this flag, such a scene retries down a ladder —
459
+ **chain-from-prev → chain-from-anchor (the first scene) → image-only** — instead
460
+ of stopping the whole chain (`stoppedAt`). The first rung that yields a candidate
461
+ wins; image-only drops the video chain seed but still renders from the scene's
462
+ character/identity references. When a non-default rung is used, the scene's
463
+ `auto-chain` report entry carries a `fallback` label (e.g. `chain-from-0`,
464
+ `image-only`). Default off → byte-identical fail-fast behavior. The explicit chain
465
+ source is recorded as `chainFromSceneIndex` on the scene-selection entry.
466
+
467
+ **Chain-seed hosting (seedance-direct).** runway/dreamina-useapi upload local
468
+ references themselves, but `seedance-direct` rejects local file paths — a
469
+ reference must be a hosted HTTP(S) URL or an `Asset://` URI. So on that route the
470
+ chain seed (the prior scene's downloaded `.mp4`) is automatically converted to a
471
+ hosted **last-frame image**: ffmpeg extracts the final frame, it is uploaded to
472
+ Go Bananas (returning a public R2 URL), and that image becomes the scene's
473
+ keyframe reference (`reference_images`). This is the proven seedance
474
+ image-to-video keyframe path; it needs `GO_BANANAS_API_KEY` and `ffmpeg` on
475
+ `PATH`. A seed that is already a hosted URL / `Asset://` URI passes through
476
+ untouched, and the transform never runs off the seedance route.
477
+
478
+ #### `@Name` asset tagging (in scene prompts)
479
+
480
+ Write `@Youri` (or `@tokyo-alley`) in any scene prompt. At payload assembly the
481
+ tag is replaced with that character's **visual descriptor** (never the proper
482
+ name — names don't survive across generations) and the character's saved
483
+ reference is auto-wired into that scene, counted against the ≤9 image / ≤3 video /
484
+ ≤3 audio budget. The reference is the character's `Asset://` URI on
485
+ **seedance-direct** (and *only* that — a raw `referenceAssets` portrait is **not**
486
+ wired on seedance, since a local/photoreal portrait both fails submit and trips
487
+ the real-person filter; the descriptor text still substitutes, so register the
488
+ character with `seedance-register-assets` to lock identity); on every other route
489
+ it falls back to the first `referenceAssets` image. An **unresolved** tag (no matching character/asset) is left as
490
+ the bare word with a stderr warning — it never blocks a render. The `@imageN`
491
+ positional binding is reserved (left verbatim). Prompts with no `@` tokens are
492
+ byte-identical to before. `@location` tags resolve once `environment-assets.json`
493
+ exists — generate it with `vclaw video environment-auto-create`.
494
+
495
+ #### `vclaw video character-auto-create`
496
+
497
+ `vclaw video character-auto-create --project <slug> --input <json-path>
498
+ [--api-url <url>] [--dry-run]` — creates each cast member as a **reusable Go
499
+ Bananas library character**, not a one-off image. The `--input` JSON is an array
500
+ of `{ name, description, style? }`; for each it generates a front-facing
501
+ mid-gray-background portrait via the Go Bananas `/images` backend, then `POST`s
502
+ `/characters` to register a real library character (returns its `characterId`,
503
+ visible in the Go Bananas account and reusable across projects), and imports it
504
+ into the project (`goBananasId` + a `gobananas://character/<id>` reference asset).
505
+ This is the command to use when a character must persist in the library — unlike
506
+ `vclaw video gen-image`, which produces a one-off diegetic still (prop/screen/
507
+ overlay) under `assets/props/` and creates no library character.
508
+
509
+ By default each created character also gets its **Cinematic Character Reference
510
+ Sheet**: after registering the library character, the command generates a
511
+ 7-panel identity sheet (Go Bananas style preset `55`, locked to the new
512
+ `characterId`, rendered with `openai-gpt-image-2`), saves it under
513
+ `projects/<slug>/references/sheets/<name>-identity.png`, registers it as a
514
+ `type: identity` reference sheet (the sheet image + the `gbRef` character as the
515
+ two identity-role references), and adds it to the character's `referenceAssets`.
516
+ The new character therefore satisfies the director identity gate and locks
517
+ identity downstream with no extra step. `--no-sheet` opts out; `--sheet-preset
518
+ <id>` overrides preset 55; `create --auto-create-characters` inherits the
519
+ behavior. `--dry-run` skips all network calls. Needs `GO_BANANAS_API_KEY`.
520
+
521
+ #### `vclaw video environment-auto-create`
522
+
523
+ `vclaw video environment-auto-create --project <slug> --input <json-path>
524
+ [--api-url <url>] [--dry-run]` — the location half of the Asset-First Principle,
525
+ mirroring `character-auto-create`. The `--input` JSON is an array of
526
+ `{ name, description, style? }`; for each it generates a **seamless empty
527
+ environment plate** (no people) via the Go Bananas `/images` backend and writes
528
+ `artifacts/environment-assets.json` (`{ name, description, plateUrl, plateRef }`
529
+ per location). `readEnvironmentAssets` then feeds those into `@location` tag
530
+ resolution — `@tokyo-alley` in a prompt becomes the plate's descriptor and wires
531
+ its reference. `--dry-run` skips all network calls. Needs `GO_BANANAS_API_KEY`.
532
+
533
+ #### Cartoon-show workflow: `voice-clone` + `show-bible`
534
+
535
+ These two commands bring the "cartoon show" production system (build a reusable
536
+ world of characters + locations + voices, recombine across episodes) natively
537
+ into vclaw. They sit on top of the existing character / environment / multi-shot
538
+ machinery and add the two pieces it lacked: a **cloned voice asset** and a
539
+ **show asset-library index**.
540
+
541
+ ##### `vclaw video voice-clone`
542
+
543
+ `vclaw video voice-clone --project <slug> --name <name> --audio <sample>
544
+ [--character <name>] [--description <text>] [--slice-seconds <n>] [--width <px>]
545
+ [--height <px>] [--execute | --dry-run]` builds the **"blank video with audio"
546
+ voice reference** — the production-learned voice-cloning trick. Supplying a target
547
+ voice to Seedance 2 / Veo as a raw MP3/WAV reference does NOT lock the voice (it
548
+ drifts to a generic accent); supplying the **same audio as the track of a
549
+ black-frame video** does. This command renders that black-frame MP4 from your
550
+ `--audio` sample (via ffmpeg, locally — no provider spend) and persists it as a
551
+ reusable voice clone in `artifacts/voice-clones.json`.
552
+
553
+ - `--character <name>` binds the clone to a character so any scene featuring that
554
+ character locks the cloned voice — on the `seedance-direct` route the blank
555
+ video is auto-injected into the Seedance `reference_videos` set at execution time
556
+ (the voice-lock reference), with no `@`-tag required. You can also reference a
557
+ voice explicitly with an `@<voice-name>` tag: `readVoiceClones` feeds
558
+ `buildAssetTagLookup`'s `voicesByName`, exactly like environment plates feed
559
+ `@location` resolution.
560
+ - `--slice-seconds <n>` chops the recording into N-second clips (the workflow's
561
+ drift fix — slice per dialogue line if the voice wavers).
562
+ - **Hosting (`--execute`):** the built clip is uploaded to Go Bananas
563
+ (`POST /api/media/upload`) and its durable public URL is stored as `hostedUrl`
564
+ in the artifact. The `seedance-direct` r2v voice-lock injects that URL (the remote
565
+ API can't read a local path). Hosting is graceful: if the GB endpoint/key is
566
+ unavailable the clip stays a local path and a warning is emitted (it never fails
567
+ the clone). Requires `GO_BANANAS_API_KEY`.
568
+ - **Duration cap:** the Seedance/Dreamina r2v reference video must be ≤ 15.2 s
569
+ (`dreamina-seedance-2-0` rejects longer refs with an opaque HTTP 500). An
570
+ un-sliced clip over the cap is flagged with a warning at clone time — re-run with
571
+ `--slice-seconds 15` (or a shorter sample) before using it on `seedance-direct`.
572
+ - **Routes that consume the voice clip** (always the black-frame **video** — a raw
573
+ MP3 does not lock the voice as reliably, which is the whole point of the trick):
574
+ - `seedance-direct` — the voice rides into `reference_videos`.
575
+ - **`runway-useapi`** — Seedance 2 via the UseAPI gateway → `videoAssetId`/`videoAssetId2`
576
+ on `POST /runwayml/videos/create`. Needs **`--audio on`** (the brief's `generateAudio`,
577
+ or `VCLAW_RUNWAY_AUDIO=1`) so Seedance generates speech in the cloned voice.
578
+ - **`dreamina-useapi`** — Seedance 2 via Dreamina **Omni Reference** → `omni_N_videoRef`
579
+ on `POST /dreamina/videos`. The omni video ref is *expected* to drive the voice on
580
+ its own (Dreamina's contract has no audio param) — but this is **unverified live**;
581
+ if a render comes back mute, set `VCLAW_DREAMINA_AUDIO=1` to force `audio:true`.
582
+ This is the **paid hi-res** route (1080p talking cartoons).
583
+
584
+ All three run the talking-cartoon flow natively through `vclaw video produce` — no
585
+ side-script. Default off → byte-identical legacy when no voice clone is bound.
586
+ - **Default-safe:** without `--execute` (or with `--dry-run`) it PLANS only —
587
+ prints the exact ffmpeg command(s) + would-be artifact and renders/writes
588
+ nothing. `--execute` renders the clip(s) and writes the artifact.
589
+ - "Use your own voice": record yourself, pass the recording as `--audio`, and tag
590
+ that voice clone after your character's lines.
591
+
592
+ ##### `vclaw video show-bible`
593
+
594
+ `vclaw video show-bible --project <slug> [--title <t>] [--premise <p>]
595
+ [--style <s>] [--add-episode "id|title|logline"]... [--from-json <path>]
596
+ [--show] [--root <path>]` derives or persists the **cartoon-SHOW asset-library
597
+ index** (`artifacts/show-bible.json`) — the repeatable production system that ties
598
+ the project's characters + locations + voice clones into one reusable world and
599
+ tracks the episode list. By default it DERIVES the bible from the project's
600
+ existing artifacts (characters, `environment-assets.json`, `voice-clones.json`),
601
+ automatically binding each character's voice clone onto its cast entry, and writes
602
+ it. `--show` prints without writing; `--from-json` validates + persists an
603
+ operator-authored bible; `--add-episode` (repeatable) merges episodes by id. It is
604
+ deterministic (no provider calls) and distinct from `story-bible` (per-project
605
+ narrative continuity) and `director-blueprint` (visual direction) — the show bible
606
+ is the multi-episode asset library that lets one creator make many consistent
607
+ episodes of one world.
608
+
609
+ `vclaw video review-ui` starts the local human-in-the-loop review station. It
610
+ serves the bundled Review UI asset by default, exposes project inventory at
611
+ `/api/review-inventory`, and lets the operator save the current decision ledger
612
+ to `projects/<slug>/artifacts/review-ui-ledger.json`. Saving also derives
613
+ `reference-board.json`, `director-seedance-plan.json`,
614
+ `storyboard-stills-plan.json`, `scene-selection.json`,
615
+ `gobananas-character-brief.json`, `post-plan.json`, and `review-report.json` so the next agent has
616
+ concrete production artifacts rather than a loose UI note. Publish handoff is
617
+ canonical only when that saved `review-report.json` has `verdict: "pass"` and
618
+ `metrics.publishReady: true`; stale checkpoints or legacy pass reports without
619
+ that metric remain review work. Use it when a project needs storyboard,
620
+ reference, character, motion-plan, or final assembly choices before the next
621
+ agent step. Use `--ui-path <path>` only when testing a local replacement UI.
622
+
623
+ The review station is explicitly aligned to
624
+ `docs/REFERENCE_VIDEO_SEEDANCE_MOTION_DESIGN_WORKFLOW.md`. Its director defaults
625
+ record the expected professional workflow in the saved ledger: script/voiceover
626
+ first, role-tagged references, still-frame lock, upscaled Seedance inputs,
627
+ start/end frame chaining, control plus short-variant motion prompts, bridge poses
628
+ for hard actions, continuity-frame extraction, and post retiming.
629
+
630
+ `vclaw video review --verdict pass` remains the simple artifact-stage approval
631
+ command for projects that were already reviewed outside the browser station. It
632
+ writes `review-report.json` with `metrics.publishReady: true`, so use it only
633
+ when the operator has equivalent evidence. For director image handoffs, prefer
634
+ `review-ui` or `review-autopilot`; those paths derive `publishReady` from locked
635
+ scene candidates, artifact-backed 4K stills, character-match checks, and final
636
+ assembly approvals.
637
+
638
+ For the operator-facing step-by-step workflow, see
639
+ `docs/REVIEW_UI_STORYBOARD_WORKFLOW.md`.
640
+
641
+ `vclaw video review-autopilot` is the non-interactive counterpart for projects
642
+ that already have storyboard still candidates. It selects and locks the best
643
+ completed still per scene, creates artifact-backed upscaled handoff candidates
644
+ from local still assets where possible, fills the final approval checks, and
645
+ writes the same `review-report.json` readiness truth as the browser station. It
646
+ does not submit video generation jobs.
647
+
648
+ ## Go Bananas library cleanup
649
+
650
+ `vclaw video library clean` is the clean-room port of the legacy character
651
+ library hygiene tool. It supports:
652
+
653
+ - listing cleanup candidates by explicit IDs, name regex, or bloated prompt size
654
+ - dry-run review before deletion
655
+ - prompt patching for a single library character without deleting it
656
+
657
+ `vclaw video find-library` and `vclaw video library find` provide the
658
+ exact-name intent lookup used by the migrated Director lane. They extract
659
+ capitalized candidate names from the intent and call the Go Bananas
660
+ `exact=true` search path so reuse stays conservative.
661
+
662
+ ## Reference sheets
663
+
664
+ ```bash
665
+ vclaw video reference-sheet-add --project <slug> --type <identity|outfit-material|environment|motion-camera|palette-mood> --name <name> [--id <id>] [--description <text>] [--character-name <name>] [--ref <path>:<role>[:<note>] ...] [--gb-ref <kind>:<id>:<role>[:<note>] ...] [--binding <sceneIndex> ...] [--root <path>]
666
+ vclaw video reference-sheet-list --project <slug> [--type <sheet-type>] [--root <path>]
667
+ vclaw video reference-sheet-show --project <slug> --id <sheet-id> [--root <path>]
668
+ vclaw video reference-sheet-bind --project <slug> --id <sheet-id> --scene <sceneIndex> [--scene <sceneIndex> ...] [--root <path>]
669
+ vclaw video reference-sheet-validate --project <slug> [--root <path>]
670
+ ```
671
+
672
+ Reference sheets are role-tagged, per-scene-bound references that the
673
+ readiness, preflight, and ops surfaces treat as first-class state. Every
674
+ sheet has one of five types, each with a closed role vocabulary:
675
+
676
+ - `identity` — `identity`, `wardrobe`, `silhouette`, `age-reference`
677
+ - `outfit-material` — `outfit`, `material`, `accessory`, `texture`, `product-hero`, `product-variant`, `product-in-use`, `packaging`
678
+ - `environment` — `location`, `set-dressing`, `weather`, `time-of-day`
679
+ - `motion-camera` — `motion-rhythm`, `camera-behavior`, `blocking`, `shot-framing`
680
+ - `palette-mood` — `palette`, `composition`, `mood`, `lighting-reference`
681
+
682
+ `--gb-ref` accepts the five Go Bananas kinds: `character`, `product`,
683
+ `scene`, `style-preset`, and `reference-group`. The `product` kind pairs
684
+ with the extended `product-*` roles on `outfit-material` sheets.
685
+
686
+ Full operator guide: [`docs/REFERENCE_SHEETS.md`](./REFERENCE_SHEETS.md).
687
+
688
+ ## Scene candidates and selection
689
+
690
+ ```bash
691
+ vclaw video candidates-list --project <slug> [--scene <sceneIndex>] [--root <path>]
692
+ vclaw video candidates-show --project <slug> --candidate-id <id> [--root <path>]
693
+ vclaw video storyboard-still-add --project <slug> --scene <sceneIndex> --image-url <url> [--image-id <id>] [--prompt <text>] [--notes <text>] [--root <path>]
694
+ vclaw video select-candidate --project <slug> --scene <sceneIndex> --candidate-id <id> [--notes <text>] [--root <path>]
695
+ vclaw video select-candidate --project <slug> --auto-select [--ref <imagePath> ...] [--root <path>]
696
+ vclaw video reject-candidate --project <slug> --scene <sceneIndex> --candidate-id <id> [--notes <text>] [--root <path>]
697
+ vclaw video reroll-scene --project <slug> --scene <sceneIndex> [--chain-from-prev on|off] [--root <path>]
698
+ vclaw video chain-from --project <slug> --scene <sceneIndex> --from <sourceSceneIndex> [--root <path>]
699
+ vclaw video unchain --project <slug> --scene <sceneIndex> [--root <path>]
700
+ vclaw video candidates-migrate-from-assets --project <slug> [--dry-run] [--root <path>]
701
+ ```
702
+
703
+ `select-candidate --auto-select` is an **opt-in LLM-as-judge** pass: it reads every
704
+ scene's candidates, asks Gemini (via the existing `GEMINI_API_KEYS` pool) to pick the
705
+ best candidate per scene — conditioned on each candidate's intended prompt, its first
706
+ image output, and any `--ref <imagePath>` shared reference images — then applies the
707
+ pick through the same `selectCandidate` path a human uses and re-derives the
708
+ asset-manifest. It is defensive: any scene the judge can't parse or that names an
709
+ unknown candidate id is **left for human selection** (reported in the JSON `leftToHuman`
710
+ array and on stderr), never failing the batch. Without `--auto-select` the command's
711
+ behavior is unchanged (single `--scene`/`--candidate-id` human pick).
712
+
713
+ Scene candidates are the output-layer counterpart to reference sheets. The
714
+ execute runtime writes every generated take into
715
+ `projects/<slug>/artifacts/scene-candidates.json` (append-only) and records
716
+ operator selection, rejections, pending ids, reroll state, and chain-from-prev
717
+ into `projects/<slug>/artifacts/scene-selection.json` (mutable).
718
+
719
+ `storyboard-still-add` records generated storyboard still images, such as Go
720
+ Bananas still outputs, into the same scene-candidate artifact with `kind:
721
+ image`. This lets the image/storyboard review loop reuse the existing
722
+ candidate-selection commands before any video generation happens.
723
+
724
+ `produce` and `execute` also accept one or more `--scene <sceneIndex>` flags
725
+ for partial reruns: only the listed scenes get a new generation round, every
726
+ other scene stays on its currently-selected candidate.
727
+
728
+ `chain-from` is v1-limited to chain-from-prev, so `--from` must equal
729
+ `--scene - 1`. Any other source returns `chain-from-unsupported`.
730
+
731
+ Full operator guide: [`docs/SCENE_CANDIDATES.md`](./SCENE_CANDIDATES.md).
732
+
733
+ ## Director approval gate
734
+
735
+ For `director` mode, `vclaw video produce` and `vclaw video execute` now export
736
+ `projects/<slug>/storyboard.md` and block before provider submission unless
737
+ `VIDEOCLAW_APPROVE_STORYBOARD=1` is present in the environment. This preserves
738
+ the legacy two-step storyboard-review flow without requiring the long smoke path.
739
+
740
+ `vclaw video approve --project <slug> [--root <path>] [--mode storyboard|director] [--dry-run]`
741
+ is the one-shot way to clear that gate and run execution. It requires
742
+ `--project`, defaults `--mode director`, and runs the execution with
743
+ `VIDEOCLAW_APPROVE_STORYBOARD=1` injected internally — so it approves the
744
+ `storyboard.md` gate and submits in a single command. `--dry-run` plans the run
745
+ without submitting.
746
+
747
+ When a live job is already in flight, `vclaw video execute-cancel` attempts to
748
+ cancel it through the configured adapter surface and records the cancellation
749
+ into the project execution report and event timeline.
750
+
751
+ At the moment, the built-in native cancel path exists for `seedance-direct`.
752
+ Other routes may return an explicit `unsupported` cancellation result rather
753
+ than silently pretending the job was cancelled.
754
+
755
+ That review file now includes a character-binding table for referenced scene
756
+ characters, including any stored Go Bananas ids and reference assets.
757
+
758
+ ## Assemble stage
759
+
760
+ `vclaw video assemble --project <slug>` runs the post-execution assembly
761
+ pipeline in order: (optional) PDF slide extraction, (optional) branded title
762
+ card, per-slide animation, per-scene TTS narration, (optional) background-music
763
+ bed, and the final FFmpeg stitch — then advisory QA (dialogue/narration/image
764
+ filter) whose findings land in the report `warnings`. It writes a typed
765
+ `assemble-report.json` artifact (schema: `schemas/video/artifacts/assemble-report.schema.json`).
766
+
767
+ `--dry-run` plans the entire pipeline (every FFmpeg command + provider call,
768
+ recorded into the manifest and `events`) WITHOUT executing anything or needing
769
+ ffmpeg or any API key — this is the agent-safe planning surface. `--brand-profile <path>`
770
+ supplies the presenter knobs (voice, intro/outro segments, optional deck/music/
771
+ title-card config). Real (non-dry-run) assembly spawns FFmpeg and calls the TTS
772
+ and music providers; verifying the rendered MP4 looks/sounds correct is a human
773
+ integration checkpoint.
774
+
775
+ `--from-clips` switches the body-segment source from animated slides to the
776
+ per-scene rendered clips `vclaw video execute` wrote to `outputs/scene-<i>.mp4`,
777
+ concatenating a finished clip-based production into one MP4. Each clip's native
778
+ audio (incl. omni-flash voice) is kept (no TTS narration); the optional
779
+ music bed is mixed under it; dialogue/SFX auto-layers are not applied. Title
780
+ card, intro/outro, and per-scene color grade still apply. See
781
+ [docs/ASSEMBLE.md](./ASSEMBLE.md#clip-stitch-mode).
782
+
783
+ ### Slide-animation styles
784
+
785
+ `vclaw video animation-styles [--style <id>]` lists the slide-animation styles
786
+ from the shared registry (`src/video/assemble/animation-styles.json`), or prints
787
+ one style's full Veo motion prompt with `--style <id>`. Read-only and free.
788
+
789
+ The styles drive the **animated-slide** path: each slide becomes a subtle F2V
790
+ motion loop (camera static, ~80–90% of the frame still) instead of a static hold.
791
+ There are 11 — `broadcast` (default), `tabloid`, `minimal`, `comic`, `indian-tv`,
792
+ `neon-esports`, `cinematic-film`, `gold-luxe`, `retro-vhs`, `stadium-live`,
793
+ `chalkboard`. The registry is the **single source of truth**: this CLI/TS layer
794
+ and the Python generator (`skills/video-replicator/scripts/bunty_animate_slides.py`,
795
+ `--style <id>`, ~10 Veo credits/slide → `stitch_bunty.py --animated`) both read the
796
+ same JSON, so adding a style is a one-file change. Motion prompts are kept clear of
797
+ content-filter HIGH_RISK_VOCAB (a test enforces this).
798
+
799
+ > **Spend gate (paid audio commands).** `soundtrack` (generate path), `narrate`,
800
+ > `dialogue`, and `sfx` call paid providers. Invoked directly without `--dry-run`,
801
+ > they **refuse** with the `spend_confirmation_required` gate unless you pass
802
+ > `--confirm-spend` to authorize the spend; `--dry-run` always previews offline
803
+ > (no keys/network). Orchestrated `studio --execute` runs are gated separately by
804
+ > the fail-closed FREE allow-list.
805
+
806
+ ### Soundtrack A/B (`vclaw video soundtrack`)
807
+
808
+ `vclaw video soundtrack --project <slug> --prompt "<text>"` generates one
809
+ **soundtrack candidate per available music backend** (the audio-platform
810
+ registry — `suno` via `KIE_API_KEY`, `lyria` via Vertex creds, `lyria3` via a
811
+ Gemini key, `flowmusic` via `USEAPI_API_TOKEN`) and writes each
812
+ to `projects/<slug>/artifacts/audio/soundtrack-<backendId>.mp3`, alongside a
813
+ typed `soundtrack.json` artifact (schema:
814
+ `schemas/video/artifacts/soundtrack.schema.json`) listing every candidate. This
815
+ lets an operator A/B-compare tracks in the preview portal before committing one.
816
+
817
+ > **Default backend: `flowmusic`.** It runs on the shared `USEAPI_API_TOKEN`
818
+ > (free for us), so prefer `--backends flowmusic` for a music bed. `lyria3`
819
+ > needs the Generative Language API enabled on the Gemini key's GCP project (it
820
+ > 403s otherwise) and `lyria` needs Vertex creds — reach for those only when
821
+ > specifically wanted.
822
+
823
+ - `--duration <seconds>` — desired track length (forwarded to each backend).
824
+ - `--backends suno,lyria,lyria3,flowmusic` — restrict to a comma-separated subset
825
+ (unavailable ones are skipped; an unknown id errors). Default = every available
826
+ backend.
827
+ - `--lyrics "<[Verse]…>"` — supply your own lyrics ([Verse]/[Chorus]-tagged) for a
828
+ vocal song. **FlowMusic only** (instrumental-only backends ignore it).
829
+ - `--instrumental` — force an instrumental render. **FlowMusic only.**
830
+ - `--dry-run` — plan + write the artifact without calling any provider or needing
831
+ keys (the candidate audio files are not downloaded).
832
+ - `--select <backendId>` — mark the human-chosen candidate: sets
833
+ `soundtrack.json.selected` AND writes that candidate's path into the project
834
+ manifest `soundtrack` field, which the preview portal reads to render the
835
+ headline `<audio>` player. (Does not regenerate.)
836
+
837
+ If only one backend is configured it still works (single candidate). When the
838
+ preview portal finds `soundtrack.json` with >1 candidate it renders one labelled
839
+ `<audio>` player per backend (the selected one flagged as the headline);
840
+ single-soundtrack projects without `soundtrack.json` keep the legacy behaviour.
841
+
842
+ **FlowMusic (Lyria 3 Pro vocal songs).** The `flowmusic` backend generates **full
843
+ vocal songs** (and instrumentals) via Google Lyria 3 Pro on useapi.net — the only
844
+ music backend that sings. It **reuses the same `USEAPI_API_TOKEN`** as the
845
+ `dreamina-useapi` / `runway-useapi` video routes (no new token), and requires a
846
+ FlowMusic (flowmusic.app) account registered on that useapi.net subscription. It
847
+ submits async, polls to completion, and downloads the first of the A/B clip pair
848
+ as `.mp3`. Pair it with `--lyrics` for a scripted vocal or `--instrumental` for a
849
+ bed. Env: `USEAPI_API_TOKEN` (required); optional `VCLAW_FLOWMUSIC_ACCOUNT`
850
+ (pin the flowmusic.app account email — omitted → useapi auto-selects),
851
+ `VCLAW_FLOWMUSIC_GHOSTWRITER` (`standard`|`pro`, lyrics-writer used when the model
852
+ writes the lyrics).
853
+
854
+ ### Narration / TTS (`vclaw video narrate`)
855
+
856
+ `vclaw video narrate --project <slug> --text "<script>"` synthesizes a single
857
+ narration clip via a **TTS backend** (the audio-platform registry) and writes it
858
+ to `projects/<slug>/artifacts/audio/narration.{wav,mp3}`, alongside a typed
859
+ `narration.json` artifact (schema: `schemas/video/artifacts/narration.schema.json`).
860
+ Two backends are registered:
861
+
862
+ - **`gemini-tts`** (default) — Gemini API `gemini-2.5-flash-preview-tts`, an
863
+ **API-key** product (not Vertex) resolving a key from the Gemini key pool
864
+ (`GEMINI_API_KEYS` / `GOOGLE_API_KEYS` / `GOOGLE_API_KEY`). Returns raw 24kHz
865
+ mono PCM wrapped as WAV; duration computed from the PCM byte count.
866
+ **Requires the Gemini `generativelanguage` API enabled on the key's project**
867
+ (else HTTP 403).
868
+ - **`elevenlabs-tts`** — ElevenLabs `eleven_multilingual_v2`
869
+ (`--backend elevenlabs-tts`). Requires `ELEVENLABS_API_KEY`; `--voice` is an
870
+ ElevenLabs **voice_id** (default "Rachel"). Returns mp3; duration estimated
871
+ from text length. A **Gemini-free** alternative.
872
+
873
+ Without `--backend`, narration uses an **automatic fallback chain**: it tries
874
+ the available backends in registry order (`gemini-tts`, then `elevenlabs-tts`)
875
+ and falls back to the next when one fails at runtime — so a `gemini-tts` 403
876
+ (API not enabled) transparently lands on `elevenlabs-tts` when its key is set.
877
+ `narration.json` records the winner as `backendId` and any failed-over backends
878
+ in `fallbackFrom`. An explicit `--backend` is **strict** (no fallback — the
879
+ error surfaces directly).
880
+
881
+ - `--text "<script>"` / `--text-file <path>` — the narration script (one is
882
+ required; `--text` wins if both are given).
883
+ - `--voice <name>` — prebuilt voice name (default `Kore`).
884
+ - `--backend gemini-tts` — pin a specific backend (defaults to the first
885
+ available; an unavailable named backend errors `tts_failed`).
886
+ - `--video-duration-ms <ms>` — when given, the artifact also embeds a
887
+ `planNarrationFit()` plan (`tempo` / `loopVideo` / `targetDurationMs` /
888
+ `warnings`) so the assemble step can fit narration to the video bed (atempo
889
+ speed-up within threshold, otherwise loop the visual bed).
890
+ - `--dry-run` — estimate duration from text length and write a placeholder WAV
891
+ without any network call or key (availability is still gated on a key being
892
+ present).
893
+
894
+ ### Per-character dialogue (`vclaw video dialogue`)
895
+
896
+ `vclaw video dialogue --project <slug> --turns "Alice: Hello || Bob: Hi there"`
897
+ synthesizes **one TTS clip per dialogue turn** over the same audio-platform TTS
898
+ registry (`gemini-tts`), writing each clip to
899
+ `projects/<slug>/artifacts/audio/dialogue-<i>-<name>.wav` and persisting a typed
900
+ `dialogue.json` artifact (schema: `schemas/video/artifacts/dialogue.schema.json`).
901
+
902
+ - `--turns "Name: line || Name2: line2"` (required) — turns separated by `||`;
903
+ each turn is split on the **first** `:` into `{ name, line }`. Empty pieces are
904
+ skipped.
905
+ - `--voice <name>` — applied to **every** turn.
906
+ - `--backend gemini-tts` — pin a specific TTS backend (defaults to the first
907
+ available; an unavailable named backend errors `tts_failed`).
908
+ - `--dry-run` — estimate duration per turn and write placeholder WAVs without any
909
+ network call (availability is still gated on a Gemini key being present).
910
+
911
+ JSON output: `{ slug, action: "dialogue", dryRun, clips: [{ name, path,
912
+ durationMs }], artifactPath }`.
913
+
914
+ ### Sound effects / foley (`vclaw video sfx`)
915
+
916
+ `vclaw video sfx --project <slug> --prompt "whoosh"` generates **one
917
+ sound-effect clip** from a text prompt via an **SFX backend** (currently
918
+ `elevenlabs-sfx`, the ElevenLabs Sound Generation API — requires
919
+ `ELEVENLABS_API_KEY`), writes it to
920
+ `projects/<slug>/artifacts/audio/sfx-<n>.mp3`, and **appends** it to a typed
921
+ `sfx.json` artifact (schema: `schemas/video/artifacts/sfx.schema.json`).
922
+
923
+ - `--prompt "<text>"` (required) — the sound-effect description.
924
+ - `--duration <seconds>` — requested clip length (0.5–22s for ElevenLabs).
925
+ - `--prompt-influence <0..1>` — how strictly the backend follows the prompt.
926
+ - `--backend elevenlabs-sfx` — pin a specific SFX backend (defaults to the first
927
+ available; an unavailable named backend errors `music_gen_failed`).
928
+ - `--dry-run` — write a placeholder clip without any network call (availability
929
+ is still gated on `ELEVENLABS_API_KEY` being present).
930
+
931
+ JSON output: `{ slug, action: "sfx", dryRun, backendId, path, durationMs }`.
932
+ ### Diegetic stills (`vclaw video gen-image`)
933
+
934
+ `vclaw video gen-image --project <slug> --prompt "<text>" --kind <kind>` generates
935
+ a diegetic still — an in-world **prop**, an on-screen **screen** (UI / dashboard),
936
+ or an **overlay** graphic (e.g. a "SYSTEM COMPROMISED" alert). Three backends,
937
+ selected by `--backend` (default `gobananas` — omitting the flag is byte-identical
938
+ to the pre-backend behavior):
939
+
940
+ - `gobananas` (default) — the **Go Bananas image API** (the same `POST /images`
941
+ backend `character-auto-create` uses; resolves `GO_BANANAS_API_KEY` /
942
+ `GO_BANANAS_API_URL`, no OpenAI key).
943
+ - `openai` — the OpenAI Images API (gpt-image family, `OPENAI_API_KEY`). Override the endpoint with `VCLAW_OPENAI_IMAGE_ENDPOINT` (e.g. an Azure/proxy deployment) and the model with `VCLAW_OPENAI_IMAGE_MODEL`.
944
+ - `flow` — **Google Flow via useapi.net** (`POST /google-flow/images`; needs
945
+ `USEAPI_API_TOKEN` + `USEAPI_ACCOUNT_EMAIL`). See the Flow backend notes below.
946
+
947
+ The result is written under `projects/<slug>/assets/props/` and can be composited
948
+ onto footage with the assemble overlay builders. Pairs with the storyboard
949
+ contract: generate the screen, overlay it.
950
+
951
+ - `--kind prop|screen|overlay` (required) — weaves a per-kind render directive into
952
+ the prompt: `screen` = flat UI capture (no bezel), `overlay` = centered on a
953
+ solid background for keying, `prop` = isolated on neutral. Screens and overlays
954
+ **keep text** (they are UIs/alerts); props suppress it.
955
+ - `--scene <i>` — tag the output filename (`screen-scene001.png`) and the
956
+ registration hint.
957
+ - `--out <path>` — override the output path (default `assets/props/<kind>[-scene<i>].png`).
958
+ - `--aspect <ratio>` — override the aspect (default `16:9` for screen, `1:1` otherwise).
959
+ - `--model <id>` — backend model id (Go Bananas default `gemini-pro-image`; for
960
+ `flow` it must be one of the Flow models below).
961
+ - `--character-id <n>` / `--style-preset-id <n>` (**gobananas only**, rejected on
962
+ other backends) — `--character-id` locks the still to a managed Go Bananas
963
+ character for identity consistency; `--style-preset-id` renders via a style
964
+ preset (e.g. the multi-view reference sheet). When either is set the per-kind
965
+ directive is **omitted** (your prompt is authoritative), while `--kind` still
966
+ sets the default aspect ratio and negative prompt. (For a character's full
967
+ identity + reference sheet, prefer `vclaw video character-auto-create`, which
968
+ renders and registers the sheet automatically.)
969
+ - `--dry-run` — print the composed request + output path **without spending**
970
+ (no key needed).
971
+
972
+ The non-dry output includes a `registerHint` — the `vclaw video assets` command to
973
+ attach the generated still to a scene so it flows into the preview portal.
974
+
975
+ #### Flow backend (`--backend flow`)
976
+
977
+ The Flow backend renders through Google Flow's image models with reference and
978
+ saved-character slots:
979
+
980
+ | Model | Reference budget | Auto-selected when |
981
+ |---|---|---|
982
+ | `imagen-4` | ≤3 reference images | 0 references (best pure text-to-image) |
983
+ | `nano-banana` | ≤10 reference images | 1–3 references (character consistency) |
984
+ | `nano-banana-pro` | ≤10 reference images | 4+ references (max references, upscale-able) |
985
+
986
+ `--model` pins one explicitly; otherwise it is auto-selected from the TOTAL
987
+ reference-image count. **Character refs count toward the same per-model budget**
988
+ (each contributes its saved image count — the `-imgs:N-` segment of the ref —
989
+ default 1), so e.g. `imagen-4` with 2 `--ref` + 2 single-image `--character`
990
+ values fails fast with a budget error before any upload.
991
+
992
+ Flow-only flags (rejected with `invalid_flag_value` on other backends — never
993
+ silently ignored):
994
+
995
+ - `--ref <path|mediaGenerationId>` (repeatable, ≤10) — `reference_1..N` slots in
996
+ order. Values are classified by **shape**: anything shaped like an
997
+ already-uploaded media ref (`user:...` prefix) is passed through verbatim;
998
+ everything else is treated as a **local image path**, must exist (a typo'd
999
+ path fails fast with `invalid_flag_value` before any upload — it is never
1000
+ silently shipped as a bogus id), and is uploaded first
1001
+ (`POST /google-flow/assets`, PNG/JPEG) with its `mediaGenerationId`
1002
+ substituted.
1003
+ - `--aspect <ratio>` — one of `16:9`, `4:3`, `1:1`, `3:4`, `9:16`, `auto`
1004
+ (plus the legacy aliases `landscape`/`portrait`); anything else is rejected
1005
+ with `invalid_flag_value`. Defaults to `16:9` for `--kind screen`, `1:1`
1006
+ otherwise. `auto` derives the aspect from the references and therefore
1007
+ requires a nano-banana model AND at least one reference image
1008
+ (`--ref`/`--character`) — `imagen-4` or a reference-less request rejects it.
1009
+ - `--character <name|ref>` (repeatable, ≤7) — `character_1..N` slots in order. A
1010
+ **name** resolves case-insensitively via the project's `flow-characters.json`
1011
+ (`vclaw video flow-register-characters`); a value that is neither registered
1012
+ nor shaped like a Flow character ref (`user:...-character:...`) fails fast.
1013
+ - `--count <1-4>` — images per generation (default 1; the API default of 4 would
1014
+ 4x the spend). Extra images are written next to `--out` with `-2`/`-3`/`-4`
1015
+ suffixes before the extension.
1016
+ - `--seed <n>` — non-negative integer for reproducible results.
1017
+
1018
+ **Inline @-markers**: the prompt may anchor a slot to a position in the text with
1019
+ `@reference_1..10` / `@character_1..7` (case-insensitive, opt-in). Every marker
1020
+ must have a matching slot or the API would 400, so the CLI validates markers
1021
+ **before any upload or spend** — including under `--dry-run`. (`@referenceImage_N`
1022
+ / `@referenceAudio_N` are video-endpoint markers and are rejected in image
1023
+ prompts.)
1024
+
1025
+ `--dry-run` prints the fully-composed `POST /google-flow/images` params plus
1026
+ `plannedUploads` (local `--ref` paths are listed and shown verbatim in
1027
+ `reference_N`; a real run uploads them first). Example:
1028
+
1029
+ ```bash
1030
+ vclaw video gen-image --project cyber --kind screen \
1031
+ --backend flow --model nano-banana \
1032
+ --prompt "breach dashboard beside @character_1" \
1033
+ --ref ./assets/props/logo.png --character Bunty --count 2 --dry-run
1034
+ ```
1035
+
1036
+ The non-dry result includes `paths` (every written file), the generated
1037
+ `mediaGenerationIds` (reusable as `--ref` inputs downstream), and
1038
+ `uploadedReferenceIds` for any local refs that were uploaded.
1039
+
1040
+ ### Motion-graphics overlays (`vclaw video overlay`)
1041
+
1042
+ `vclaw video overlay --input <video> --output <path>` composites a motion-graphics
1043
+ overlay onto a video via FFmpeg. Exactly one mode is required:
1044
+
1045
+ - `--graphic <png>` — overlay a PNG/alpha image, time-gated (`--start`/`--end`),
1046
+ alpha-faded (`--fade-in`/`--fade-out`), positioned (`--position`, 8 presets +
1047
+ `full`), and `--opacity`. **This is the font-free path** and pairs with
1048
+ `gen-image`: generate a "SYSTEM COMPROMISED" / dashboard screen, then overlay it
1049
+ (real-render validated).
1050
+ - `--alert "<text>"` — burn a pulsing alert (`--pulse-hz`, `--color`, `--font-size`).
1051
+ - `--lower-third "<text>"` — burn a boxed name/role caption.
1052
+
1053
+ The two text modes use the FFmpeg `drawtext` filter and require an ffmpeg built
1054
+ **with libfreetype**; on a drawtext-less build, render the text to a PNG (e.g. via
1055
+ `gen-image`) and use `--graphic` instead. `--dry-run` prints the planned ffmpeg
1056
+ command without running it. The command is file-scoped (no `--project`).
1057
+
1058
+ Flag value constraints (rejected with `invalid_flag_value`): `--start`/`--end`/
1059
+ `--fade-in`/`--fade-out` are non-negative seconds, `--opacity` is a `0..1` alpha,
1060
+ and `--pulse-hz`/`--font-size` must be strictly positive. Empty numeric values are
1061
+ rejected (they would otherwise coerce to `0`), and `--color` accepts only a colour
1062
+ name or `#hex` (optionally `@opacity`) so nothing can inject into the ffmpeg filter.
1063
+
1064
+ ### Motion-overlay reels (`vclaw video motion-overlay`)
1065
+
1066
+ ```
1067
+ vclaw video motion-overlay --input <video-path> (--project <slug> | --output-dir <path>)
1068
+ [--layout split|overlay|motion-only|avatar-host] # default: split
1069
+ [--style apple-clean|editorial-dark|knowledge-tool] # default: apple-clean
1070
+ [--accent <hex>] [--delivery local|flow-web|flow-api]
1071
+ [--render v2v|local] [--kicker <text>] [--headlines] [--icons]
1072
+ [--emit-flow-pack] [--restitch <flow-outputs-dir>]
1073
+ [--lang <code>] [--max-take-seconds 10]
1074
+ [--transcript <path>] [--gb-character <Name:ID>]
1075
+ [--gb-character-image <path>] [--gb-voice <preset>] # avatar-host
1076
+ [--host-engine omni-r2v|veo-i2v] # avatar-host, default omni-r2v
1077
+ [--host-retries <n>] # avatar-host, default 3
1078
+ [--host-look <text>] [--no-host-chain] # avatar-host consistency
1079
+ [--preview] [--root <path>] [--execute --confirm-spend]
1080
+ ```
1081
+
1082
+ Turns an existing **talking-head video** into a reel with **motion-graphics
1083
+ overlays synced to the speech**, driven by Google Flow's **Omni Flash V2V**
1084
+ (kinetic typography / icons / metaphors painted on the footage, original voice
1085
+ preserved).
1086
+
1087
+ **Plan/dry by default — no provider spend.** The pipeline is: ingest (ffmpeg
1088
+ probe + audio extract + frame-accurate take cuts + reference frames) → Gemini STT
1089
+ (or a bring-your-own `--transcript <path>` JSON) → sentence-boundary slice into
1090
+ `≤ --max-take-seconds` (default 10s) takes → per-take overlay-prompt composition →
1091
+ writes a work folder (`source/ takes/ frames/ prompts/`), a README, and the
1092
+ `motion-overlay-plan.json` manifest (schemaVersion 1). `--preview` also renders
1093
+ the preview-portal `review/review.html` approval surface (aspect-aware cards).
1094
+
1095
+ **`--render local` (recommended) is the free, reliable render path.** Because the
1096
+ omni-flash V2V "add-overlay" edit is moderation-blocked for most input clips
1097
+ (`FINISH_REASON_INPUT_VIDEO_EDIT`, input-specific), `--render local` renders the
1098
+ finished reel natively — each segment becomes a broadcast lower-third (SVG →
1099
+ `sharp` PNG → ffmpeg `overlay`, no freetype) over the source, original audio kept.
1100
+ It costs nothing (no `--confirm-spend` gate), writes `motion-overlay-local.mp4`,
1101
+ and `--kicker <text>` sets the small brand label. `--style` picks the card look
1102
+ (`apple-clean` rounded frosted · `editorial-dark` squared UPPERCASE poster ·
1103
+ `knowledge-tool` serif + lavender), and `--headlines` adds frame-filling anchor-word
1104
+ headlines with the accent `*` beat-marker synced to the spoken moment.
1105
+
1106
+ `--render v2v` (default) `--execute` renders via omni-flash V2V and is gated behind
1107
+ `--confirm-spend` (exit-3 `spend_confirmation_required` otherwise, so no provider is
1108
+ ever silently called). Per take it runs omni-flash V2V → restores the **original
1109
+ take audio** via `ffmpeg -map 0:v -map 1:a -c:v copy -c:a aac` → clip-stitches the
1110
+ audio-restored takes (in order) into `motion-overlay-reel.mp4`.
1111
+
1112
+ **Layouts:** `split` (graphics top, speaker bottom), `overlay` (graphics over the
1113
+ speaker with safe areas), `motion-only` (speaker removed, full-frame graphics
1114
+ narrated by their voice), and `avatar-host` (Layout D). The `avatar-host` layout
1115
+ replaces the speaker with an **identity-locked character that speaks each line in
1116
+ Omni's own voice** and **requires `--gb-character <Name:ID>`** (parsed on the final
1117
+ `:`, so `Dr. Vox:97` works) plus, at `--execute`, `--gb-character-image <path>`
1118
+ (the R2V reference still) and optional `--gb-voice <preset>` (default `Puck`).
1119
+ Under `--execute --confirm-spend` it generates a per-take host clip with
1120
+ **omni-flash R2V + native voice** (Omni produces the speech + lip-synced video
1121
+ together — genuinely lip-synced, NOT moderation-blocked), stitches the clips into
1122
+ `avatar-reel.mp4`, then re-transcribes the avatar's own speech and renders local
1123
+ lower-thirds into `motion-overlay-avatar.mp4` (the caption pass is best-effort).
1124
+
1125
+ The Flow safety filter rejects a benign R2V generation **probabilistically**, so
1126
+ across a multi-take reel a single rejected take would otherwise fail-fast the whole
1127
+ run. Two safeguards make it robust: each take is **retried up to `--host-retries`**
1128
+ (default 3) — a plain retry of the same line usually clears — and generation is
1129
+ **resumable**: a host clip that already exists on disk (`host/take-NN.mp4` from a
1130
+ prior run, written atomically) is reused, never regenerated, so re-running after a
1131
+ mid-reel failure does not re-spend on the takes that already succeeded.
1132
+
1133
+ **Character consistency — two engines (`--host-engine`).** R2V treats the reference as
1134
+ a *loose* influence, so the talking avatar drifts (face/wardrobe/backdrop) across
1135
+ independently-generated takes — and no scriptable path locks identity *and* gives
1136
+ native voice at once (Flow `@Character` is web-UI only). So `avatar-host` offers a fork:
1137
+
1138
+ - **`omni-r2v`** (default) — native voice + lip-sync, loose identity *mitigated* by
1139
+ `--host-look <text>` (pins a stable appearance + fixed setting on every take's
1140
+ prompt, killing backdrop/wardrobe jumps) and cross-take **chaining** (on by default,
1141
+ `--no-host-chain` to disable; seeds each take from the previous take's last frame).
1142
+ - **`veo-i2v`** — every take starts from the **same character still** as the literal
1143
+ first frame (Veo 3.1 I2V), so frame 0 of every take is pixel-identical → **tight
1144
+ identity**, but **silent** (captioned from the planned script; add a VO/soundtrack
1145
+ separately). Landscape-only. Shares the retry + resume plumbing — a slow provider
1146
+ queue can time a take out; re-run to resume from it (completed takes are reused).
1147
+
1148
+ Every side effect (Gemini STT, ffmpeg, omni-flash V2V, and the omni-flash R2V
1149
+ host generation) is behind an injectable interface, so the command is fully
1150
+ unit- and e2e-tested offline with no network and no spend. Full guide:
1151
+ [`docs/MOTION_OVERLAY.md`](https://videoclaw-docs.vercel.app/reference/MOTION_OVERLAY).
1152
+
1153
+ The JSON returned by `vclaw video status` now also includes referenced
1154
+ `characterBindings` so project-facing status surfaces can show the same identity
1155
+ anchors without reparsing `storyboard.md`.
1156
+
1157
+ `vclaw video readiness` now also includes a `warnings` array. Current warnings
1158
+ include image-input aspect/size problems and non-blocking identity-sheet quality
1159
+ signals such as `reference-sheet-thin-identity-coverage`.
1160
+
1161
+ `vclaw video status` now also includes:
1162
+
1163
+ - `characterProfiles`
1164
+ - `characterHydrationSummary`
1165
+
1166
+ so a later inspection can still show how the cast was assembled after the
1167
+ initial `video create` response is gone.
1168
+
1169
+ When a review file has been generated, `status` and the project index also carry
1170
+ the `storyboardReviewPath` so review tooling can link directly to the current
1171
+ artifact.
1172
+
1173
+ The same `storyboardReviewPath` now flows through:
1174
+
1175
+ - `vclaw video report`
1176
+ - `vclaw video export-csv`
1177
+ - `vclaw video export-obsidian`
1178
+ - `vclaw video sync-obsidian` dashboard views
1179
+ - `vclaw video next-actions` when approval is waiting on storyboard review
1180
+
1181
+ The `Next Actions.md` note generated by `sync-obsidian` now includes the same
1182
+ review link when a project is waiting on storyboard approval.
1183
+
1184
+ When present, `next-actions` also carries `storyboardReviewGeneratedAt`, and the
1185
+ generated note includes that freshness inline with the review link.
1186
+
1187
+ `vclaw video doctor-project` now also flags projects whose storyboard checkpoint
1188
+ is `awaiting-approval` but whose `storyboard.md` review artifact is missing.
1189
+
1190
+ `vclaw video doctor-portfolio` now also reports a portfolio-level
1191
+ `missingStoryboardReviewProjects` count for the same workflow invariant.
1192
+
1193
+ It now also reports `staleStoryboardReviewProjects` when approval is pending but
1194
+ the storyboard changed after the last generated review.
1195
+
1196
+ `vclaw video storyboard-review` now also appends a `storyboard.review.generated`
1197
+ event, so the review workflow shows up in timeline-style exports and history.
1198
+
1199
+ When stale review blocks execution, the runtime now emits a
1200
+ `storyboard.review.stale.blocked` event so timeline/history surfaces capture the
1201
+ enforcement step as well.
1202
+
1203
+ When review events exist, `status` and `index` now also expose
1204
+ `storyboardReviewGeneratedAt` alongside `storyboardReviewPath`.
1205
+
1206
+ The same surfaces now also expose `storyboardReviewExists`, so tooling can tell
1207
+ whether a review has ever been generated before trying to reason about freshness.
1208
+
1209
+ They now also expose a normalized `storyboardReviewState` field with one of:
1210
+
1211
+ - `missing`
1212
+ - `current`
1213
+ - `stale`
1214
+
1215
+ The same `storyboardReviewState` now flows through:
1216
+
1217
+ - `vclaw video report`
1218
+ - `vclaw video export-csv`
1219
+ - `vclaw video export-obsidian`
1220
+ - `vclaw video sync-obsidian` dashboard views
1221
+ - `vclaw video next-actions`
1222
+
1223
+ `vclaw video report-diff` now also exposes:
1224
+
1225
+ - `reviewStateChanged` when the review-state ladder changes between snapshots
1226
+ - `platformChanged` when the stored project platform changes between snapshots
1227
+ - `executionProfileChanged` when the normalized execution profile changes between snapshots
1228
+ - `legacyImportChanged` when captured legacy import diagnostics change between snapshots
1229
+
1230
+ Its top-line summary now also carries deltas for:
1231
+
1232
+ - `legacyImportedProjectsDelta`
1233
+ - `legacyQueueDriftProjectsDelta`
1234
+ - `legacyNestedOutputProjectsDelta`
1235
+
1236
+ The same `storyboardReviewExists` now flows through:
1237
+
1238
+ - `vclaw video report`
1239
+ - `vclaw video export-csv`
1240
+ - `vclaw video export-obsidian`
1241
+ - `vclaw video sync-obsidian` dashboard views
1242
+
1243
+ The same `storyboardReviewGeneratedAt` now flows through:
1244
+
1245
+ - `vclaw video report`
1246
+ - `vclaw video export-csv`
1247
+ - `vclaw video export-obsidian`
1248
+ - `vclaw video sync-obsidian` dashboard views
1249
+
1250
+ When the storyboard changes after the latest review generation, `status` now
1251
+ marks the review stale and `next-actions` prioritizes refreshing the review
1252
+ artifact before approval.
1253
+
1254
+ The same stale-review signal now flows through:
1255
+
1256
+ - `vclaw video report`
1257
+ - `vclaw video export-csv`
1258
+ - `vclaw video export-obsidian`
1259
+ - `vclaw video sync-obsidian` dashboard views
1260
+
1261
+ That same stale-review signal now gates director runtime operations as well:
1262
+
1263
+ - `vclaw video execute`
1264
+ - `vclaw video execute-status`
1265
+
1266
+ The same referenced `characterBindings` now flow through:
1267
+
1268
+ - `vclaw video report`
1269
+ - `vclaw video export-csv`
1270
+ - `vclaw video export-obsidian`
1271
+ - `vclaw video index`
1272
+ - `vclaw video sync-obsidian`
1273
+
1274
+ The same cast provenance now also flows through:
1275
+
1276
+ - `vclaw video status`
1277
+ - `vclaw video index`
1278
+ - `vclaw video report`
1279
+ - `vclaw video export-csv`
1280
+
1281
+ The same review file now includes a focused director preflight result. Current
1282
+ preflight coverage includes:
1283
+
1284
+ - provider-risk content hazard detection
1285
+ - stored Go Bananas id resolution and reference-image presence checks
1286
+ - remote reference-asset probe failures
1287
+ - pronoun drift warnings against known character descriptions
1288
+ - repeated adjacent-scene warnings
1289
+ - prompt-quality warnings/errors from `docs/PROMPT_QUALITY.md`
1290
+ - dialogue duration fit warnings/errors (`DIALOGUE_DURATION_OVERFLOW`)
1291
+ - reference-sheet validation and Go Bananas reference checks
1292
+
1293
+ Supported env controls for this flow:
1294
+
1295
+ - `DIRECTOR_AUTO_FIX_CONTENT=1`
1296
+ auto-rewrites known provider-risk phrases before preflight re-checks the storyboard
1297
+ - `SKIP_DIRECTOR_PREFLIGHT=1`
1298
+ bypasses the preflight step and goes straight to the storyboard approval gate
1299
+ - `DIRECTOR_STRICT_PROMPT_QUALITY=1`
1300
+ promotes prompt-quality warnings to blocking errors
1301
+ - `DIRECTOR_STRICT_DIALOGUE_FIT=1`
1302
+ promotes dialogue duration warnings to blocking errors
1303
+
1304
+ Direct CLI surface:
1305
+
1306
+ ```bash
1307
+ vclaw video director-preflight --project <slug> [--root <path>] [--apply-content-fixes]
1308
+ vclaw video preflight --project <slug> [--root <path>] [--apply-content-fixes]
1309
+ vclaw video storyboard-review --project <slug> [--root <path>] [--mode storyboard|director] [--apply-content-fixes]
1310
+ ```
1311
+
1312
+ For `director` mode, `storyboard-review` now writes `storyboard.md` and, when
1313
+ preflight passes, marks the storyboard checkpoint `awaiting-approval` without
1314
+ starting execution.
1315
+
1316
+ When `--apply-content-fixes` is set, `director-preflight`/`preflight` and
1317
+ `storyboard-review` regenerate `artifacts/story-bible.json` after the fixes land
1318
+ so the continuity bible reflects the corrected storyboard (see
1319
+ [Story bible](#story-bible-continuity-reference)).
1320
+
1321
+ Projects in `awaiting-approval` now surface as `needs-review` across the index,
1322
+ dashboard, and metrics layer instead of generic `active`.
1323
+
1324
+ Portfolio metrics now also expose `staleStoryboardReviewProjects` so stale
1325
+ approval reviews are visible in the summary layer.
1326
+
1327
+ They also expose `unreviewedStoryboardProjects`, which counts projects that have
1328
+ not generated a storyboard review yet.
1329
+
1330
+ They now also expose `byReviewState` with explicit `missing`, `current`, and
1331
+ `stale` counts.
1332
+
1333
+ ## Local media post-production (file-level utilities)
1334
+
1335
+ Free, local ffmpeg utilities over a project's final output (`--project <slug>`,
1336
+ resolved via `final/` or the publish report) or any file (`--file <path>`).
1337
+ All emit machine-readable JSON.
1338
+
1339
+ | Command | Usage | What it does |
1340
+ | --- | --- | --- |
1341
+ | `verify-final` | `vclaw video verify-final (--project <slug> \| --file <path>) [--output-dir <path>]` | Probe + sanity-check the final master (dims/duration/streams). |
1342
+ | `make-vertical` | `vclaw video make-vertical (--project <slug> \| --file <path>) [--output <path>]` | 9:16 vertical cut (1080×1920 scale-to-cover + center crop). |
1343
+ | `make-square` | `vclaw video make-square (--project <slug> \| --file <path>) [--output <path>]` | 1:1 square cut (1080×1080 scale-to-cover + center crop). |
1344
+ | `make-loop` | `vclaw video make-loop (--project <slug> \| --file <path>) [--output <path>]` | Boomerang loop (forward + reversed concat). |
1345
+ | `thumbnail` | `vclaw video thumbnail (--project <slug> \| --file <path>) [--output <path>] [--text <title>]` | Poster-frame thumbnail, optional title text. |
1346
+ | `burn-subtitles` | `vclaw video burn-subtitles (--project <slug> \| --file <path>) --subtitle <path> [--output <path>]` | Burn a subtitle file into the video. |
1347
+ | `remix-narrated` | `vclaw video remix-narrated --project <slug> [--output <path>]` | Re-stitch the project's narrated scene clips into one master. |
1348
+
1349
+ ## Archive, playbooks, and library lookups
1350
+
1351
+ | Command | Usage | What it does |
1352
+ | --- | --- | --- |
1353
+ | `archive-project` | `vclaw video archive-project --project <slug> [--archive-dir <path>] [--cleanup]` | Move a finished project out of the active workspace (optionally pruning state). |
1354
+ | `playbook-list` | `vclaw video playbook-list` | List the bundled operator playbooks. |
1355
+ | `playbook-show` | `vclaw video playbook-show --name <playbook-name>` | Print one playbook. |
1356
+ | `list-library` | `vclaw video list-library [--name-regex <pattern>]` | List Go Bananas library characters (see also `find-library` / `library find`). |
1357
+
1358
+ ## Live execution adapters
1359
+
1360
+ `vclaw video produce` submits a JSON payload to a route-specific adapter command
1361
+ via `stdin`. Configure one of:
1362
+
1363
+ ```bash
1364
+ VCLAW_VEO_USEAPI_ADAPTER
1365
+ VCLAW_SEEDANCE_DIRECT_ADAPTER
1366
+ VCLAW_RUNWAY_USEAPI_ADAPTER
1367
+ VCLAW_DREAMINA_USEAPI_ADAPTER
1368
+ ```
1369
+
1370
+ The adapter should print JSON to `stdout`. If `produce` returns `externalJobId`,
1371
+ `vclaw` records that in the execution report and leaves the assets stage `pending`.
1372
+ `execute-status` then sends a poll request to the same adapter and, on completion,
1373
+ merges generated outputs into the canonical asset manifest and advances the project
1374
+ to `review`.
1375
+
1376
+ In candidate mode (per-scene submits, e.g. `--auto-chain`) each scene carries its
1377
+ own adapter job id on its candidate. If the most recent `execute` left a **blocked,
1378
+ job-less** execution report (a later scene failed to submit), `execute-status`
1379
+ still polls every *pending* candidate that has its own job id and promotes each
1380
+ independently — so one blocked scene never strands the rest of the chain's
1381
+ in-flight jobs. With no candidate artifact (legacy single-job runs) the blocked
1382
+ report is reported as-is, unchanged.
1383
+
1384
+ For built-in core-route adapters:
1385
+
1386
+ ```bash
1387
+ VCLAW_SEEDANCE_DIRECT_SUBMIT_CMD
1388
+ VCLAW_SEEDANCE_DIRECT_POLL_CMD
1389
+ VCLAW_VEO_USEAPI_SUBMIT_CMD
1390
+ VCLAW_VEO_USEAPI_POLL_CMD
1391
+ ```
1392
+
1393
+ If `VCLAW_SEEDANCE_DIRECT_ADAPTER` or `VCLAW_VEO_USEAPI_ADAPTER` is unset,
1394
+ `vclaw` automatically falls back to the built-in adapter binary for that route.
1395
+
1396
+ Every produce and execute-status path appends `generation.telemetry.recorded`
1397
+ events to `projects/<slug>/events/events.jsonl`. These records capture route,
1398
+ operation, task count, prompt/reference summary, external job id, provider cost
1399
+ fields, timing fields, issues, and output-ingest count when available.
1400
+
1401
+ For `seedance-direct`, if `VCLAW_SEEDANCE_DIRECT_SUBMIT_CMD` / `VCLAW_SEEDANCE_DIRECT_POLL_CMD`
1402
+ are also unset, the built-in adapter can talk directly to the Seedance API using:
1403
+
1404
+ ```bash
1405
+ SUTUI_API_KEY
1406
+ VCLAW_SEEDANCE_BASE_URL # optional, defaults to https://api.xskill.ai
1407
+ ```
1408
+
1409
+ For `veo-useapi`, if `VCLAW_VEO_USEAPI_SUBMIT_CMD` / `VCLAW_VEO_USEAPI_POLL_CMD`
1410
+ are unset, the built-in adapter can run the local `vclaw-cli` workspace using:
1411
+
1412
+ ```bash
1413
+ VCLAW_VEO_CLI_ROOT # optional, defaults to <workspace>/vclaw-cli
1414
+ VCLAW_VEO_BUN_BIN # optional, defaults to bun
1415
+ VCLAW_VEO_OUTPUT_DIR # optional, defaults to <vclaw-cli>/output-videos
1416
+ ```
1417
+
1418
+ #### Omni-flash passthrough (`veo-useapi`)
1419
+
1420
+ The native transport forwards the following execution-profile / per-scene
1421
+ fields to `flow.ts` when present (absent → byte-identical legacy command):
1422
+
1423
+ - `executionProfile.veoModel` (`fast` | `quality` | `lite` | `free` | `omni-flash`)
1424
+ → `flow.ts -m` (resolved to the useapi model string by `mapModelToUseApi`).
1425
+ `omni-flash` unlocks native audio and video-to-video; `lite` → `veo-3.1-lite`
1426
+ (cheaper Veo tier) and `free` → `veo-3.1-lite-low-priority` (the relaxed /
1427
+ explore lane — Ultra-tier-gated at the provider, errors clearly otherwise);
1428
+ defaults to `quality` when unset.
1429
+ - Per-scene `voicePreset` (one of the 30 Flow v1 voice presets) → `--voice`
1430
+ (Flow `referenceAudio_1`). **omni-flash-only** — a voice preset on any other
1431
+ `veoModel` fails the route-capability check (downgraded to a warning under
1432
+ `VCLAW_ALLOW_UNSAFE_MODELS=1`).
1433
+ - Per-scene `durationSeconds` → `--duration`, emitted only for the allowlisted
1434
+ values `4 | 6 | 8 | 10` (mirrors the `flow.ts` allowlist); other values are
1435
+ dropped rather than forwarded.
1436
+ - Per-scene `referenceVideoMediaId` → `--ref-video` (Flow `referenceVideo_1`,
1437
+ video-to-video edit). **omni-flash-only** (same guard as voice). This is the
1438
+ dedicated V2V edit source — not the scene-chaining seed, which any model
1439
+ supports.
1440
+ - **Image references are model-aware** (encoded in the prompt, which is how
1441
+ `flow.ts` reads them). On Veo models an image reference is the first-frame
1442
+ `image:<path>` startImage (I2V). On **omni-flash** (which rejects `startImage`
1443
+ by default) the same references become `ingredients:<p1,p2,…>`
1444
+ (`referenceImage_*`, R2V, up to 7). Mutually exclusive with V2V — when
1445
+ `referenceVideoMediaId` is set, the R2V `ingredients:` prefix is suppressed.
1446
+ - **omni-flash First-Frame (gated, build-ahead).** `--scene-first-frame
1447
+ <sceneIndex>[,<sceneIndex>…]` on `storyboard` marks scenes to deliver their
1448
+ single reference as a literal first frame (`image:` startImage / I2V) on
1449
+ omni-flash — locking the opening frame **while keeping native voice** — instead
1450
+ of the loose R2V `ingredients:` path. This is **gated by the
1451
+ `VCLAW_OMNI_FIRST_FRAME` env flag** and OFF by default: with the gate off the
1452
+ scene flag is ignored (a stderr advisory is logged) and behavior is
1453
+ byte-identical. The feature is **build-ahead / UNVERIFIED-LIVE** — useapi.net
1454
+ marks omni-flash frames mode "coming soon", so the in-process and `vclaw-cli`
1455
+ validators only relax their omni-flash `startImage` blocks when the gate is set.
1456
+ Inferred wire shape to confirm when useapi ships it: `{ model:"omni-flash",
1457
+ startImage:<mediaId>, referenceAudio_1:<voice>, duration }`.
1458
+ - **Voice needs a reference.** `referenceAudio` is rejected by the provider on
1459
+ pure text-to-video, so voice on omni-flash requires either an image reference
1460
+ (R2V) or `referenceVideoMediaId` (V2V); the route-capability check now fails
1461
+ fast otherwise. **R2V + voice is the reliable narrated path** (V2V + voice is
1462
+ heavily moderation-gated).
1463
+
1464
+ Authoring the fields:
1465
+
1466
+ - `--veo-model fast|quality|lite|free|omni-flash` on `set-execution-profile` / `brief` /
1467
+ `create` / `clone-*` persists `veoModel` into the brief execution profile.
1468
+ - `--scene-voice <sceneIndex>:<preset>` and `--scene-ref-video <sceneIndex>:<mediaId>`
1469
+ on `storyboard` set the per-scene `voicePreset` / `referenceVideoMediaId`
1470
+ (repeatable, same shape as `--scene-character` / `--scene-color`).
1471
+ - `--scene-first-frame <sceneIndex>[,<sceneIndex>…]` on `storyboard` sets the
1472
+ per-scene `firstFrame` flag (repeatable; each value is one index or a
1473
+ comma-separated list). Honored only when `VCLAW_OMNI_FIRST_FRAME` is set at
1474
+ execution time (gated build-ahead, see above).
1475
+
1476
+ For `dreamina-useapi` (Dreamina / CapCut-ByteDance Seed, Seedance 2.0 via
1477
+ useapi.net — keyframe image-to-video plus text-to-video, 1080p on CA accounts),
1478
+ the built-in native transport (`src/video/native-dreamina.ts`) talks directly to
1479
+ the useapi.net Dreamina API. It reuses the same `USEAPI_API_TOKEN` as
1480
+ `runway-useapi` (no new token) and reads the account/region from env:
1481
+
1482
+ ```bash
1483
+ USEAPI_API_TOKEN # required, shared with runway-useapi
1484
+ VCLAW_DREAMINA_ACCOUNT # required, e.g. "CA:ai@example.com" (already configured server-side)
1485
+ VCLAW_DREAMINA_REGION # optional, defaults to CA
1486
+ VCLAW_DREAMINA_MODEL # optional, defaults to seedance-2.0
1487
+ VCLAW_DREAMINA_OMNI_RATIO # optional, "1" to force the project aspect ratio in Omni Reference mode
1488
+ ```
1489
+
1490
+ By default **Omni Reference mode** (multi-image / any video or audio reference)
1491
+ auto-detects the output aspect ratio from the references — but Dreamina defaults
1492
+ that to **landscape (16:9) even when the references are portrait**, so a 9:16
1493
+ project comes out 16:9. Set `VCLAW_DREAMINA_OMNI_RATIO=1` to pin the project's
1494
+ aspect ratio through Omni mode (the API accepts an explicit `ratio` alongside the
1495
+ `omni_N_*Ref` fields — live-confirmed). Default off → ratio is auto-detected as
1496
+ before (byte-identical). Only affects Omni mode; `first_frame` and text-to-video
1497
+ are unchanged.
1498
+
1499
+ The account must already be registered with useapi.net (`POST /accounts` with
1500
+ `{email, password, region, maxJobs}` is done out-of-band); the transport only
1501
+ needs the account id + token at submit time. Image-to-video uploads the first
1502
+ image reference via `POST /dreamina/assets/<account>` to obtain an `assetRef`,
1503
+ then passes it as `firstFrameRef` on `POST /dreamina/videos`; poll uses
1504
+ `GET /dreamina/videos/<jobid>` and downloads `response.videoUrl`. As with
1505
+ `runway-useapi`, you can override the whole route with
1506
+ `VCLAW_DREAMINA_USEAPI_ADAPTER` or the per-action shims
1507
+ `VCLAW_DREAMINA_USEAPI_SUBMIT_CMD` / `_POLL_CMD` / `_CANCEL_CMD`.
1508
+
1509
+ > Seedance 2.0 rejects real human faces at content moderation — use illustrated
1510
+ > or stylized characters, or a Runway-generated real-face start frame.
1511
+
1512
+ ## Execution profile normalization
1513
+
1514
+ `plan` now emits a normalized execution profile and the runtime uses it.
1515
+
1516
+ Supported fields:
1517
+
1518
+ 1. `aspectRatio`
1519
+ 2. `quality`
1520
+ 3. `resolution`
1521
+ 4. `generateAudio`
1522
+ 5. `outputCount`
1523
+
1524
+ You can override them through brief metadata:
1525
+
1526
+ ```json
1527
+ {
1528
+ "executionProfile": {
1529
+ "aspectRatio": "9:16",
1530
+ "quality": "quality",
1531
+ "resolution": "1080p",
1532
+ "generateAudio": false,
1533
+ "outputCount": 2
1534
+ }
1535
+ }
1536
+ ```
1537
+
1538
+ The same profile can now be set directly from the CLI through:
1539
+
1540
+ 1. `brief`
1541
+ 2. `clone-init`
1542
+ 3. `clone-execute`
1543
+ 4. `set-execution-profile`
1544
+
1545
+ ## Cost estimates
1546
+
1547
+ ```bash
1548
+ vclaw video cost-estimate [--project <slug>] [--root <path>] [--scenes <count>] [--clip-duration <seconds>] [--new-characters <count>] [--narration on|off]
1549
+ ```
1550
+
1551
+ Direct flag estimates use the static model. Project estimates infer scene count,
1552
+ average duration, narration, and new-character count from project artifacts when
1553
+ possible. If completed `seedance-direct` telemetry with provider-reported USD is
1554
+ available under the same root, the estimate reports `historical-telemetry` in
1555
+ `estimateSource` and includes a `telemetry` summary. Otherwise it reports
1556
+ `static-default`.
1557
+
1558
+ ## Compatibility aliases
1559
+
1560
+ 1. `execution-plan` remains an alias for `plan`
1561
+ 2. `execute` remains an alias for `produce`
1562
+ 3. deprecation notices are written to `stderr` so JSON `stdout` stays machine-readable
1563
+
1564
+ ## Multi-shot prompt
1565
+
1566
+ ```bash
1567
+ vclaw video multi-shot (--presets | --plan | --validate | --fix | --auto) [flags]
1568
+ ```
1569
+
1570
+ Scaffolds, validates, and (via Gemini) authors **compressed timecoded multi-shot
1571
+ cinematic prompts** — structured shot sequences targeting a fixed duration (default
1572
+ 15 s) with enforced non-repeating camera parameters and a Location/Style/Audio
1573
+ metadata block.
1574
+
1575
+ ### Music videos (`vclaw video music-video`)
1576
+
1577
+ ```
1578
+ vclaw video music-video --config <music-video-config.json>
1579
+ [--work-dir <path>] # default: the config's directory
1580
+ [--output <path>] # default: <work-dir>/master.mp4
1581
+ [--execute] [--dry-run] # plan/dry by default; --execute renders
1582
+ [--ffmpeg-bin <path>] [--ffprobe-bin <path>]
1583
+ ```
1584
+
1585
+ The **vocal-synced, beat-exact music-video assembler** — it turns an
1586
+ operator-authored config into a finished cut whose performers land on their own
1587
+ vocals and whose baked lip-sync stays locked to the muxed song, with **zero
1588
+ cumulative drift**. Fully local: ffmpeg only, **no provider and no spend**, so
1589
+ there is no `--confirm-spend` gate.
1590
+
1591
+ The config (`schemas/video/artifacts/music-video-config.schema.json`,
1592
+ hand-authored) names the **song** + its length, a **clip registry** (`id → path
1593
+ + probed duration`), the **B-roll pools** (`action` / `atmo` / `trio` /
1594
+ `vanish`), and either an **explicit vocal map** (sections carrying their
1595
+ `performerClip`) or a **transcript** (whisper-style `{start,end,text}`) the
1596
+ assembler auto-classifies into rap / hook / instrumental / outro by **word
1597
+ density** — plus `performers: { rap, hook }` to pin the rapper to the rap and the
1598
+ singer to the hook. An optional `grade` id applies one colour pass over the whole
1599
+ cut, and `beats` (seconds) snap cuts to the beat grid.
1600
+
1601
+ The pipeline: `buildVocalMap` (transcript → vocal map) → `planVocalSync`
1602
+ (performer-on-vocal, **time-aligned** so lips stay locked across B-roll cutaways,
1603
+ de-patterned B-roll via shuffle-bag + stepped in-points) → **frame-exact**
1604
+ per-segment cut (`-frames:v round(dur·fps)`, never `-t`, with `-nostdin`) →
1605
+ concat (`-c copy`) → **one** grade pass + mux the song. **Plan/dry by default**
1606
+ prints the resolved vocal map, the per-cut summary (performer vs B-roll counts),
1607
+ and the ffmpeg step list without spawning. `--execute` renders, then asserts the
1608
+ built master's duration equals the planned duration **within one frame**
1609
+ (`audio_sync_drift` otherwise) so sync can never silently regress.
1610
+
1611
+ ### Character-ad stitch (`vclaw video stitch-ad`)
1612
+
1613
+ Assemble ordered scene clips into a short ad with **cross-dissolves** and an
1614
+ optional **instrumental music bed laid UNDER the native voice** (plus a one-shot
1615
+ SFX). The native character-ad finishing recipe — pair it after `flow-r2v` scenes
1616
+ and before `title-card` / `make-vertical`.
1617
+
1618
+ ```
1619
+ vclaw video stitch-ad --clip <path> [--clip <path> ...] --out <path>
1620
+ [--dissolve <sec>] # cross-dissolve length (default 0.6)
1621
+ [--width <px>] [--height <px>] [--fps <n>] # normalize target (default 1280x720 @24)
1622
+ [--bed <track>] [--bed-level <0-1>] # music bed UNDER the voice (default level 0.13)
1623
+ [--sfx <track>] [--sfx-at <sec>] [--sfx-level <0-1>] # one-shot SFX (default level 0.4)
1624
+ [--dry-run] # print the planned ffmpeg command only
1625
+ ```
1626
+
1627
+ `xfade` cross-dissolves the video and `acrossfade` crossfades the clips' **native
1628
+ audio** (the R2V voice). The bed is looped/trimmed to the cut, faded in/out, and
1629
+ mixed low under the voice — never overwriting it. Clips are normalized to a
1630
+ common `WxH`/fps. Fully local FFmpeg, no spend.
1631
+
1632
+ ```bash
1633
+ # stitch four flow-r2v scenes with a noir bed, then title-card + vertical
1634
+ vclaw video stitch-ad --clip s1.mp4 --clip s2.mp4 --clip s3.mp4 --clip s4.mp4 \
1635
+ --bed bed.mp3 --sfx match.mp3 --sfx-at 7.6 --out ad-cut.mp4
1636
+ ```
1637
+
1638
+ ### Music-video titles (`vclaw video title-card`)
1639
+
1640
+ ```
1641
+ vclaw video title-card --input <video> --output <path>
1642
+ (--lower-third "<title || subtitle>" | --end-card "<title || subtitle>" | both)
1643
+ [--lt-start <s>] [--lt-end <s>] # lower-third window (default 4..11, clamped to length)
1644
+ [--end-hold <s>] # end-card seconds before EOF (default 4.5)
1645
+ [--title-font <alias|path>] [--body-font <alias|path>] # didot/avenir/devanagari/...
1646
+ [--title-color <#hex>] [--sub-color <#hex>] [--accent-color <#hex>] [--no-accent]
1647
+ [--python <bin>] [--dry-run]
1648
+ ```
1649
+
1650
+ Burns the **titles you see in music videos** — a faded **lower-third** early in
1651
+ the cut and/or a centred **end card** that holds to the very end — onto a finished
1652
+ video. The text is rasterized to a transparent full-frame PNG by **Pillow + RAQM**
1653
+ (HarfBuzz shaping), so it works on **any ffmpeg build** (no libfreetype needed)
1654
+ and **any script**, including **Devanagari/Arabic** — the vowel marks shape and
1655
+ stack correctly (measure-ink-bottom-and-stack, so a tall glyph can't overlap the
1656
+ line beneath). Each PNG is composited as a **looped input** (`-loop 1`) so a
1657
+ delayed alpha fade actually animates (a static `-i` PNG is one frame at t=0 and a
1658
+ later `fade=in:st=N` never triggers — a real bug this avoids).
1659
+
1660
+ Lines are split on `||`; the first line is title-weight, the rest body-weight.
1661
+ Type scales with the frame height so 720p and 1080p read the same. The end card
1662
+ fades in and **holds with no fade-out** to EOF; the lower third fades both ways
1663
+ and is clamped to the song length. Fully local, **no spend**. `--dry-run` prints
1664
+ the planned cards (sizes/timings) without rendering; omit it to render. Needs
1665
+ `python3` with `Pillow[raqm]` on a real run (clear error otherwise).
1666
+
1667
+ ### HD finish / upscale (`vclaw video finish`)
1668
+
1669
+ ```
1670
+ vclaw video finish --input <video> --output <path>
1671
+ [--backend topaz-proteus|topaz-gaia|topaz-starlight|topaz-local] # default: topaz-proteus
1672
+ [--scale 1..4] [--grain 0..1] [--noise 0..1] [--recover-detail 0..1] [--sharpen]
1673
+ [--topaz-cli <path>] # topaz-local
1674
+ [--dry-run] [--confirm-spend]
1675
+ ```
1676
+
1677
+ Upscales/finishes a rendered cut to a clean HD master. **Hosted Topaz** (Proteus
1678
+ default, Gaia, Starlight) runs through the **apiz/xskill** aggregator — it uploads
1679
+ the input to a temporary public host, submits the `fal-ai/topaz/upscale/video`
1680
+ task, polls to completion, and downloads the result. **`topaz-local`** instead
1681
+ shells a local Topaz CLI (`--topaz-cli <path>` or `VCLAW_TOPAZ_CLI`).
1682
+
1683
+ The **anti-plastic "detail-not-sharp" recipe** is on by default: denoise + halo
1684
+ off (`noise=0`, `halo=0`), film **grain kept** (clamped to the real **0.1** cap —
1685
+ the published schema's `0..1` is wrong for this endpoint), detail recovery high.
1686
+ This avoids the waxy skin a naive sharpen/denoise produces. `--sharpen` opts back
1687
+ into the sharpen path; `--scale` / `--grain` / `--noise` / `--recover-detail`
1688
+ override individual knobs.
1689
+
1690
+ **Hosted backends are PAID** → the command refuses without `--confirm-spend`
1691
+ (exit-3 `spend_confirmation_required`); `--dry-run` prints the resolved Topaz
1692
+ params for free. **`topaz-local` is free** (no gate). Hosted backends need
1693
+ `APIZ_API_KEY` (or `XSKILL_API_KEY`) — an `sk-...` key from the apiz.ai console.
1694
+ (`realesrgan-x4plus` is a planned backend with no executor yet — use a Topaz
1695
+ backend.)
1696
+
1697
+ ### Audio-driven lip-sync (`vclaw video lipsync`)
1698
+
1699
+ ```
1700
+ vclaw video lipsync --image <path> --audio <path> --output <path>
1701
+ [--resolution 720p|1080p] # default 1080p
1702
+ [--prompt "<text>"] [--turbo] [--no-normalize] [--fps <n>]
1703
+ [--dry-run] [--confirm-spend]
1704
+ ```
1705
+
1706
+ Turns a **still / character keyframe + a vocal track** into a **lip-synced,
1707
+ expressive talking-head clip** via **OmniHuman v1.5** (`fal-ai/bytedance/omnihuman/v1.5`
1708
+ through the apiz/xskill aggregator). It uploads the image + audio, submits the
1709
+ task, polls to completion, downloads the result, then **normalizes** it to CFR
1710
+ `--fps` (default 24) + even dimensions — load-bearing, because OmniHuman returns
1711
+ 25 fps and sometimes odd dimensions, which break frame-accurate `-ss`/`-frames:v`
1712
+ seeking in the assembler. `--no-normalize` keeps the raw clip.
1713
+
1714
+ This drives an **external** vocal (a rapper's verse, a singer's hook, a
1715
+ narrator) — it is the building block the music-video lane uses to put a
1716
+ performer's real vocal on their face. (Contrast `motion-overlay --layout
1717
+ avatar-host`, which makes the character speak in its own *generated* voice.)
1718
+
1719
+ Audio length is checked against the model cap **up front** — **1080p ≤ 30 s,
1720
+ 720p ≤ 60 s** — with an actionable error (switch to 720p or split the vocal).
1721
+ **PAID** → refuses without `--confirm-spend` (exit-3 `spend_confirmation_required`);
1722
+ `--dry-run` plans for free. Needs `APIZ_API_KEY` (or `XSKILL_API_KEY`).
1723
+
1724
+ ### Modes
1725
+
1726
+ | Flag | Purpose |
1727
+ |---|---|
1728
+ | `--presets` | List the registered preset contracts as JSON for agents and UIs. |
1729
+ | `--plan` | Scaffold a shot grid (timecodes + suggested camera parameters) without prose. |
1730
+ | `--validate` | Check an existing prompt text against the preset rules. Reads from `--file <path>` or stdin. Exits `0` if valid, `1` if errors are found. |
1731
+ | `--fix` | Apply conservative deterministic fixes and return a before/after validation report. Reads from `--file <path>` or stdin. |
1732
+ | `--auto` | Author the full prompt via Gemini (requires `--image <path>` and a configured Gemini key pool, or `VCLAW_MULTISHOT_AUTO_STUB` for offline/testing). |
1733
+
1734
+ ### Flags
1735
+
1736
+ | Flag | Default | Description |
1737
+ |---|---|---|
1738
+ | `--preset <name>` | `cinematic-15s` | One of `cinematic-15s` (default, 15 s / 3–7 shots / 1500 chars), `seedance-10s` (10 s / 2–5 shots / 1500 chars), `veo-8s` (8 s / 2–4 shots / 1500 chars), `runway-10s` (10 s / 2–5 shots / 1000 chars). Each preset declares its own clip duration, shot-count window, per-shot duration bounds, and char budget; the Nolan `styleLine` and diegetic `audioLine` are shared. Override with `--style-line` / `--audio-line`. Unknown names fail fast. |
1739
+ | `--provider <name>` / `--route <name>` | — | Provider hint used when `--preset` is omitted. `seedance*` resolves to `seedance-10s`, `veo` / `flow` resolves to `veo-8s`, and `runway*` resolves to `runway-10s`. |
1740
+ | `--from-storyboard` | false | Hydrate `--plan` or `--auto` from a project storyboard scene. Requires `--project <slug>` and `--scene <sceneIndex>`. |
1741
+ | `--shots <n>` | auto (preset window) | Exact shot count for `--plan`. Must fall within the resolved preset's `[minShots, maxShots]`; out-of-range values fail fast. |
1742
+ | `--seed <n>` | random | PRNG seed for reproducible plans. |
1743
+ | `--format <name>` | `default` | With `--plan`: select the rendered output. `default` emits the original `{ preset, shots[] }` JSON (unchanged). `seedance-paragraph` renders one flowing labeled paragraph via `composeSeedanceParagraph`. `per-shot` renders one `SHOT N — NAME` block per shot via `composePerShotFormat`. |
1744
+ | `--lang <code>` | `en` | With `--plan` and a non-`default` `--format`: wrap the rendered text for bilingual delivery. `en` = one fenced block; `zh` = one fenced block; `en+zh` = two labeled (`EN` / `中文`) fenced blocks. Translation is offline/identity here — the flag surfaces the wrapper structure only; no network translation is performed. |
1745
+ | `--category <id>` | `cinematic` | With `--plan` and a non-`default` `--format`: the category descriptor (subject type, beat template, genre) that drives the composed prose. One of the 15 registered category ids (`cinematic`, `3d-cgi`, `cartoon`, `comic-to-video`, `fight-scenes`, `motion-design-ad`, `ecommerce-ad`, `anime-action`, `product-360`, `music-video`, `social-hook`, `brand-story`, `fashion-lookbook`, `food-beverage`, `real-estate`); unknown ids fail fast. The category's `genre` drives the `Style & Mood` line (e.g. `3d-cgi` → photoreal CGI, not the Nolan default; `cinematic` and the other live-action categories stay on the Nolan line). Categories with a signature hook (the six creative ids above) **auto-open** with it unless an explicit `--hook` is passed. |
1746
+ | `--hook <patternId>` | — | With `--plan` and a non-`default` `--format`: prepend a named opening-hook directive (`Opening hook — <description>`) drawn from `HOOK_PATTERNS`. The 12 generic ids (`black-to-light`, `silence-to-sound`, `reverse-motion`, `beat-drop`, `match-cut-in`, `whip-reveal`, `speed-ramp`, `first-person-rush`, `impact-freeze`, `title-burn-in`, `slow-reveal`, `snap-zoom`) plus the per-category libraries (e.g. `scale-reveal`, `smash-zoom`, `weapon-clash-spark`, `speed-line-burst`, `hi-hat-flash-cuts`, `impossible-scale`); unknown ids fail fast. An explicit `--hook` overrides the category's auto-open hook. |
1747
+ | `--dialogue "<speaker>: <line>"` | — | With `--plan` and a non-`default` `--format`: append spoken dialogue to the opening of the rendered text via `withDialogue`. Add a second speaker after a `\|\|` separator (`"A: hi \|\| B: bye"`) to emit one `replies:` line. A trailing `[emotion]` on a line (e.g. `"Mara: It is fine. [scared]"`) sets that speaker's emotion. A value with no colon fails fast. Omitting it leaves the rendered text unchanged. |
1748
+ | `--emotion-cues` | off | With `--plan`, a non-`default` `--format`, and `--dialogue`: rewrite each speaker's named emotion into a **physical-cue** descriptor (`scared` → `eyes wide, jaw slack, breath shallow…`) — models perform physical cues better than emotion names. Advisory/additive: unmapped and deliberately-excluded **extreme** emotions (panic, rage, …) pass through named; omitting the flag is byte-identical. |
1749
+ | `--total-seconds <n>` | 15 | Total clip duration in seconds. |
1750
+ | `--max-chars <n>` | 1500 | Character budget enforced by `--validate`. |
1751
+ | `--style-line <text>` | cinematic-15s default | Override the `Style:` metadata line. |
1752
+ | `--audio-line <text>` | cinematic-15s default | Override the `Audio:` metadata line. |
1753
+ | `--image <path>` | — | Reference image path; required for `--auto`. |
1754
+ | `--location <text>` | — | Scene location written into `Location:` block. |
1755
+ | `--time <text>` | `natural daylight` | Time of day written into `Location:` block. |
1756
+ | `--character <text>` | — | Character description hint passed to Gemini. |
1757
+ | `--action <text>` | — | Action description hint passed to Gemini. |
1758
+ | `--dry-run` | false | With `--auto`: print the resolved request and validation contract without reading the image or calling Gemini. |
1759
+ | `--explain-issues` | false | With `--validate`: add stable repair guidance for each unique issue code. |
1760
+ | `--retry-invalid <n>` | `0` | With `--auto`: retry validation failures up to `n` extra times, feeding the previous issue codes/messages back into the authoring request. |
1761
+ | `--project <slug>` | — | Persist the result as a `multi-shot-prompt` artifact under the named project. |
1762
+ | `--root <path>` | `cwd` | Workspace root (used with `--project`). |
1763
+ | `--raw` | false | With `--auto`: print only the prompt body, no JSON envelope. |
1764
+
1765
+ ### Output
1766
+
1767
+ `--presets` emits JSON: `{ presets[] }` with every registered preset and its duration, shot-count, per-shot-duration, character-budget, style, and audio contract.
1768
+
1769
+ `--plan` emits JSON: `{ preset, shots[] }`. The `preset` object carries `name`, `totalSeconds`, `minShotSeconds`, `maxShotSeconds`, `minShots`, `maxShots`, `maxChars`, `styleLine`, and `audioLine`. Each shot has `index`, `start`, `end`, `timecode`, `shotSize`, `lens`, `angle`, `movement`. With `--from-storyboard`, output also includes `source` and resolved `input` so agents can see exactly which scene, characters, action, location, and time of day were used.
1770
+
1771
+ With `--format seedance-paragraph` or `--format per-shot`, `--plan` instead emits the rendered prompt **text** (not JSON), wrapped in fenced code block(s) per `--lang` (`en` default = one block, `en+zh` = two labeled blocks). `--hook` prepends a named opening-hook directive and `--dialogue` appends spoken dialogue to the opening line (both apply only on non-`default` formats and are post-render text transforms — the composers stay pure). `--format default` (or omitting any of these flags) keeps the original JSON output unchanged.
1772
+
1773
+ `--validate` emits JSON: `{ valid, charCount, issues[] }` where each issue has `code`, `severity`, `message`. With `--explain-issues`, it also emits `explanations[]` containing `code`, `summary`, and `suggestedFix`. Exit code `1` when any issue has `severity: "error"`.
1774
+
1775
+ `--fix` emits JSON: `{ original, fixed, appliedFixes[] }`. The first version is deliberately conservative: it normalizes whitespace and can add missing metadata from the resolved preset plus `--location` / `--time`. It does not creatively rewrite shot prose or timecodes.
1776
+
1777
+ `--auto` emits JSON: `{ preset, location, timeOfDay, shots, promptText, charCount, valid, issues, attempts, generatedAt }`. The `shots[]` array is parsed from the authored prompt so project artifacts are usable by downstream review and execution code. `attempts[]` records every validation attempt when `--retry-invalid` is used. With `--from-storyboard`, output and persisted artifacts also include `source`. With `--raw`, prints only `promptText`. With `--dry-run`, it emits `{ mode, dryRun, preset, source?, input, validationContract }` and makes no model call.
1778
+
1779
+ > **Note:** When `--project` is supplied, the artifact is persisted to disk even when validation fails (`valid: false`); the issues array is recorded and the process exits with code `1`. A persisted artifact does **not** imply the prompt passed validation — always check the `valid` field.
1780
+
1781
+ Project `status` and `readiness` surfaces summarize the latest `multi-shot-prompt` artifact with preset, validity, shot count, issue count, generation time, and storyboard source metadata. Invalid multi-shot artifacts are warnings, not hard readiness blockers, because the artifact is optional until a workflow explicitly chooses to render from it.
1782
+
1783
+ ### Worked example
1784
+
1785
+ ```bash
1786
+ # 0. Discover preset contracts
1787
+ vclaw video multi-shot --presets
1788
+
1789
+ # 1. Generate a 5-shot plan (reproducible with --seed)
1790
+ vclaw video multi-shot --plan --shots 5 --seed 42
1791
+
1792
+ # 1b. Generate a provider-shaped plan from storyboard scene 0
1793
+ vclaw video multi-shot --plan --from-storyboard \
1794
+ --project my-project --scene 0 --route seedance-direct
1795
+
1796
+ # 2. Validate an existing prompt file — exits 0 if clean
1797
+ vclaw video multi-shot --validate --file my-prompt.txt --explain-issues
1798
+
1799
+ # 3. Validate from stdin
1800
+ cat my-prompt.txt | vclaw video multi-shot --validate
1801
+
1802
+ # 4. Apply conservative deterministic fixes
1803
+ vclaw video multi-shot --fix --file my-prompt.txt --location "Tokyo alley" --time "night"
1804
+
1805
+ # 5. Author and validate via Gemini (requires GEMINI_API_KEYS)
1806
+ vclaw video multi-shot --auto \
1807
+ --image /path/to/ref.png \
1808
+ --location "Tokyo back alley" \
1809
+ --time "night" \
1810
+ --retry-invalid 2 \
1811
+ --project my-project
1812
+
1813
+ # 5b. Author from storyboard scene context and persist source metadata
1814
+ vclaw video multi-shot --auto \
1815
+ --image /path/to/ref.png \
1816
+ --from-storyboard \
1817
+ --project my-project \
1818
+ --scene 0 \
1819
+ --provider veo
1820
+
1821
+ # 6. Print only the raw prompt body (no JSON wrapper)
1822
+ vclaw video multi-shot --auto --image /path/to/ref.png \
1823
+ --location "Tokyo back alley" --time "night" --raw
1824
+ ```
1825
+
1826
+ **Tokyo-alley example** (5-shot, 15 s, cinematic-15s preset):
1827
+
1828
+ ```
1829
+ [00:00 - 00:04] Wide, 24mm, low angle, tracking — a man walks through a Tokyo alley.
1830
+
1831
+ [00:04 - 00:07] Medium, 50mm, eye-level, handheld — he moves between food stalls.
1832
+
1833
+ [00:07 - 00:09] Close-up, 85mm, high angle, static — his hand brushes a lantern.
1834
+
1835
+ [00:09 - 00:12] Wide, 35mm, Dutch angle, push-in — he emerges into a broad street.
1836
+
1837
+ [00:12 - 00:15] Medium close-up, 50mm, low angle, pull-out — he looks up at a sign.
1838
+
1839
+ Location: Narrow Tokyo alley, night.
1840
+ Style: Cool shadows, natural skin tones. IMAX-scale composition, deep focus, practical lighting. High contrast, grounded realism. In the style of a Christopher Nolan movie.
1841
+ Audio: Diegetic sound only — natural ambience, environmental foley, and subject-driven sound.
1842
+ ```
1843
+
1844
+ Validation rules enforced by `--validate` / `--auto`:
1845
+ - Timecodes must start at `00:00`, be contiguous (no gaps), and total exactly `--total-seconds`.
1846
+ - Each shot duration must be within `[minShotSeconds, maxShotSeconds]` (default 2–5 s).
1847
+ - No camera parameter (shot size, lens, angle, movement) may repeat in consecutive shots.
1848
+ - Prompt must not exceed `--max-chars`.
1849
+ - A `Location:` / `Style:` / `Audio:` metadata block must be present.
1850
+
1851
+ Full framework rules and the variation guide: `vclaw video prompt-lib-show --name multi-shot-framework`.
1852
+
1853
+ ## Director blueprint
1854
+
1855
+ ```bash
1856
+ vclaw video director-blueprint --project <slug> (--from-json <path> [--write] | --show) [--root <path>]
1857
+ ```
1858
+
1859
+ The **director layer ABOVE** `filmmaking-prompts`. A Project Blueprint locks the
1860
+ project's visual identity, master color system, lighting grammar, per-character
1861
+ blueprint (silhouette + palette + voice + power/vulnerability/signature camera
1862
+ framing), environment blueprint (with the 5-sensory-words rule), the project
1863
+ camera bible (dominant + **forbidden** movements + the one rule the camera must
1864
+ never break), and performance rules. It is distinct from the *story bible*
1865
+ (continuity: cast/props/timeline) — this is the *visual direction* bible.
1866
+
1867
+ Authoring is a creative task handled by the **`ai-director` skill**, which emits
1868
+ a `project-blueprint.json`; this command only **validates + persists** it
1869
+ (`--from-json … --write` → `artifacts/project-blueprint.json`, history-tracked) or
1870
+ prints the stored one (`--show`). Validation is lenient on sub-fields but strict
1871
+ on the eight required sections (one listing error). Once persisted,
1872
+ `filmmaking-prompts` auto-reads it and appends a prose `DIRECTOR — …` addendum to
1873
+ every scene packet plus a `forbidden-camera-movement` issue per banned move — no
1874
+ extra flag needed. See `docs/DIRECTOR_BLUEPRINT.md`.
1875
+
1876
+ ## Brand definition
1877
+
1878
+ ```bash
1879
+ vclaw video brand-definition --project <slug> (--from-json <path> [--write] | --show) [--root <path>]
1880
+ ```
1881
+
1882
+ The **locked brand system** for a project: brand name, positioning statement,
1883
+ taglines (functional/emotional/community), voice rules, a 6-color hex palette
1884
+ (every color carries a prompt-safe `name`), typography hierarchy, a 12-week
1885
+ theme map, and the vision-verified master asset. It layers with its neighbors:
1886
+ `brand-dna.json` (`brand-extract`) is extraction *evidence*, the brand
1887
+ definition is the locked brand *decision*, and `project-blueprint.json`
1888
+ (`director-blueprint`) is per-project visual *direction* — none replaces
1889
+ another.
1890
+
1891
+ Authoring is a creative task handled by the **`brand-agency` skill**, which
1892
+ emits a `brand-definition.json`; this command only **validates + persists** it
1893
+ (`--from-json … --write` → `artifacts/brand-definition.json`, history-tracked)
1894
+ or prints the stored one (`--show`). Validation is strict on the required
1895
+ sections and on palette hex (`#RRGGBB`), lenient on other sub-fields, and
1896
+ reports every problem in one error. Once persisted, `filmmaking-prompts`
1897
+ auto-reads it and appends a compact prose `BRAND — Wordmark: …. Palette: ….
1898
+ Voice: ….` line to every scene packet (palette colors render by their authored
1899
+ names, never hex) — no extra flag needed; no artifact → byte-identical legacy
1900
+ output. See `docs/BRAND_AGENCY.md`.
1901
+
1902
+ ## Filmmaking prompt packets
1903
+
1904
+ ```bash
1905
+ vclaw video filmmaking-prompts --project <slug> [--root <path>] [--duration <seconds>] [--panels 9|12|15|20] [--detail terse|standard|rich] [--register prose|numeric] [--storyboard-grid <path>] [--category <id>] [--genre live-action|pixar|anime|noir|influencer|action|music-video] [--aspect-ratio 16:9|9:16] [--phase storyboard|video] [--realism] [--no-realism] [--dialogue "<speaker>: <line> [emotion] [|| <speaker>: <line> [emotion]]"] [--dialogue-scene "<sceneIndex>:<speaker>: <line> [|| ...]" ...] [--emotion-cues] [--no-faces] [--write]
1906
+ ```
1907
+
1908
+ **Photorealism is the universal default — dial down by exception** (Joey 2.0:
1909
+ "Photoreal is the universal default"). With zero flags and no project
1910
+ cinema-profile, a project resolves the full detailed treatment: `rich` detail,
1911
+ capture-realism on, and the `prose` cinematography register (behaviour-not-
1912
+ numbers physical wording, no Kelvin / key-angle / ratio numerals). Dial it down
1913
+ per-call with `--detail`, `--register numeric`, or `--no-realism`, or persist a
1914
+ project-wide reduction with `vclaw video cinema-profile` (below). Precedence is
1915
+ CLI flag > `project.cinemaProfile` > genre default > the photoreal hard default;
1916
+ the `influencer`/`ugc` genres default to a `phone` capture register.
1917
+
1918
+ Generates the first-class prompt packet layer derived from the
1919
+ `ai-filmmaking` workflow. This command is deterministic: it reads existing
1920
+ project artifacts and writes no model output unless `--write` is provided.
1921
+
1922
+ `--genre` is a swappable style parameter (the skill is genre-agnostic): it sets
1923
+ the character-sheet STYLE block, the storyboard grid style descriptors, and the
1924
+ Seedance FORMAT tone, and selects the annotation third line (MOOD by default,
1925
+ VOICE for `influencer`/vlog, STYLE for `action`/martial-arts). Aliases like
1926
+ `photoreal`→`live-action`, `3d`→`pixar`, `vlog`→`influencer` resolve
1927
+ automatically; an unknown value passes through as a free-form descriptor.
1928
+ `--aspect-ratio` (default `16:9`; use `9:16` for vertical/social) is stated in
1929
+ every template and every shot. `--no-faces` renders the storyboard grid in a
1930
+ silhouette / no-frontal-face register so it survives real-person content
1931
+ filters when used as a provider `reference_image`. `--detail terse|standard|rich`
1932
+ (default `standard`) sets cinematography language density: `terse`/`standard`
1933
+ emit today's phrasing unchanged, while `rich` appends a quantified suffix
1934
+ (lens mm, Kelvin + key-angle, color-grade hue°/sat%, audio dB hierarchy, move
1935
+ velocity in ft/s) from the shared `src/video/cinematography.ts` emitters.
1936
+ `--phase storyboard|video` gates which slice is returned: `storyboard` returns
1937
+ the storyboard/camera-language portion only (video `seedancePackets` gated to
1938
+ `[]`) for the lock-the-grid step, while `video` and the default (omitted) return
1939
+ the full packet. `--category <id>` selects the category descriptor (character vs
1940
+ product path); unknown ids fail fast.
1941
+
1942
+ `--dialogue "<speaker>: <line> [emotion] [|| <speaker>: <line> [emotion]]"`
1943
+ weaves spoken dialogue into every Seedance packet using the same notation as
1944
+ `vclaw video multi-shot --dialogue` (the ai-filmmaking "Dialog scenes" rule: a
1945
+ second speaker always renders as `replies:`, which signals consecutive-order
1946
+ speech so the speakers don't collapse into each other). The text-driven
1947
+ variant carries it on the opening FRAME MAP beat; the grid-reference and
1948
+ character-sheets-plus-storyboard-grid variants carry it on the `Storyline:`
1949
+ line. A speaker whose name matches a stored character is emitted as that
1950
+ character's visual descriptor, never the proper name. `--dialogue` is a
1951
+ blanket: it applies to every scene packet. To target a single scene, use the
1952
+ repeatable `--dialogue-scene "<sceneIndex>:<speaker>: <line> [|| <speaker>:
1953
+ <line>]"` (the first colon splits the scene index from the dialogue string,
1954
+ which carries its own `<speaker>:` colons). A scene with a `--dialogue-scene`
1955
+ entry uses it instead of `--dialogue`; a scene without one falls back to
1956
+ `--dialogue` if given, else stays dialogue-free — so `--dialogue-scene 2:"…"`
1957
+ alone puts the exchange only on scene 2. `--emotion-cues` rewrites a trailing
1958
+ named `[emotion]` per speaker into physical-cue descriptors (same map as
1959
+ `multi-shot --emotion-cues`) for both dialogue sources. All default off —
1960
+ omitting them keeps the output byte-identical.
1961
+
1962
+ ### Joey cinematic flags
1963
+
1964
+ The photoreal default (rich + realism + prose) is now the zero-flag output of
1965
+ `filmmaking-prompts`; these flags tune or dial it down. `vclaw video
1966
+ cinema-profile` adds one new subcommand, so the `vclaw schema --json` command
1967
+ count moved from 82 to 83.
1968
+
1969
+ `filmmaking-prompts`:
1970
+
1971
+ - `--register prose|numeric` — prose (Joey behaviour wording, no colour-math numerals) vs numeric (Kelvin / key-angle / ratio) cinematography register. Resolved default `prose`.
1972
+ - `--no-realism` — dial the capture-realism block OFF (recovers the lean register even though the resolved default has it on).
1973
+ - `--sheet 8-shot|6-panel` — character-sheet layout. `8-shot` (default) is the four-column / eight-shot sheet; `6-panel` emits the compact 3-column × 2-row mid-gray sheet (`characterSheetSixPanelPrompt`).
1974
+ - `--realism` — the keystone anti-plastic `captureRealismBlock` (per-zone specular kill, subsurface scattering, strand hair, contrast curve, volumetric haze, flattering-realism ceiling, film grain) on the **rich**-detail Style line. On by default; pass it explicitly to tune `--wet`/`--haze`.
1975
+ - `--wet` — add the moisture-matte clause (`moistureMatteClause`) to the realism block.
1976
+ - `--haze thin|light|heavy` — volumetric-haze density (`volumetricHaze`) inside the realism block (default `light`).
1977
+ - `--background mid-gray|white|black` — append a backdrop-plate clause (`backgroundPlate`) to the storyboard-grid Style line. Mid-gray is the locked character-work default; white/black are explicit opt-ins.
1978
+ - `--lighting <id>` / `--grade <id>` — swap the lighting / color-grade register in the **rich**-detail cinematography suffix (e.g. `--lighting night-fire`, `--grade bleach-bypass`). Default `neutral-studio` / `teal-orange`.
1979
+
1980
+ ### Project cinema-profile
1981
+
1982
+ `vclaw video cinema-profile` persists a project-level look profile onto
1983
+ `project.json` so every later `filmmaking-prompts` run inherits it (the
1984
+ dial-down-by-exception path). Each flag is optional; at least one is required.
1985
+
1986
+ ```bash
1987
+ vclaw video cinema-profile --project <slug> [--detail terse|standard|rich] [--register prose|numeric] [--realism on|off] [--no-realism] [--haze thin|light|heavy] [--capture cinema|phone] [--root <path>]
1988
+
1989
+ # dial a project down to a lean, numeric, no-realism register
1990
+ vclaw video cinema-profile --project dhuaan --detail standard --register numeric --no-realism
1991
+
1992
+ # pin a UGC project to the phone capture register
1993
+ vclaw video cinema-profile --project promo --capture phone
1994
+ ```
1995
+
1996
+ `multi-shot`:
1997
+
1998
+ - `--genre <id>` — resolve the preset's Style line via `resolveStyleLine` (`music-video`, `action`, `anime`, `noir`, `influencer`, `pixar`). Unknown/absent genre falls back to the cinematic Nolan default. The resolved style line flows into the plan JSON and the `seedance-paragraph` / `per-shot` rendered formats.
1999
+
2000
+ Trigger-word map (operator phrasing → emitter):
2001
+
2002
+ | You say… | Flag / emitter |
2003
+ | --- | --- |
2004
+ | "mid-gray" / "neutral backdrop" | `--background mid-gray` → `backgroundPlate` |
2005
+ | "add haze" / "atmosphere" | `--haze` → `volumetricHaze` |
2006
+ | "anti-plastic" / "not AI-looking" | `--realism` → `captureRealismBlock` |
2007
+ | "wet" / "rain-soaked" / "moisture" | `--wet` → `moistureMatteClause` |
2008
+ | "bleach-bypass" / "lifted blacks" | `--grade bleach-bypass` → lift/gamma/gain |
2009
+ | "no on-screen text" | Last Frame suppression (10-block Seedance packet) |
2010
+ | "music video" / "beat-synced" | `--genre music-video` → `resolveStyleLine` + `musicSyncLine` |
2011
+
2012
+ Additional Joey-adaptation surfaces wired in earlier phases: the **10-block Seedance master-prompt** is the default `seedancePackets` format; the **negative-direction lint** warns on tempo negation (use positive phrasing); **outfit-swap** / two-step outfit-build prompt emitters; the assemble post-production helpers (`cut-at-3s` tail trim, `letterbox` normalization, gated Topaz upscale); and the **photoreal-face guard** that keeps real-person face refs off the `seedance-direct` route.
2013
+
2014
+ The packet includes:
2015
+
2016
+ - `characterSheetPrompts[]` — 8-view character reference sheet prompts. When a
2017
+ character already has reference assets, the prompt uses reference-image mode
2018
+ and avoids re-describing the image; otherwise it uses a concise description.
2019
+ Descriptions over 60 words warn; over 100 words are flagged as an error
2020
+ (the skill's bloat/scene-contamination failure threshold).
2021
+ - `storyboardGridPrompt` — a multi-panel cinematic storyboard grid prompt.
2022
+ `--panels` (9/12/15/20, default 15) sets the adaptive grid layout
2023
+ (3×3 / 3×4 / 3×5 / 4×5, transposed for vertical `--aspect-ratio`), each panel
2024
+ carries a per-panel timecode and a CAM / MOVE / (MOOD|VOICE|STYLE)
2025
+ production-note strip, and beats follow a three-act progression
2026
+ (setup → inciting → rising → climax → denouement). `rows`/`cols` are recorded
2027
+ on the prompt for the deterministic `storyboard-grid` renderer.
2028
+ - `referenceMap[]` — stable `@image1`, `@image2`, ... slots for character
2029
+ sheets, storyboard grid, and per-scene start frames.
2030
+ - `seedancePackets[]` — per-scene Seedance prompt packets. If character sheets
2031
+ and a storyboard grid are available, the packet uses the higher-fidelity
2032
+ character-sheets-plus-storyboard-grid variant; otherwise it falls back toward
2033
+ grid-only or text-driven prompting.
2034
+ - `issues[]` — prompt-authoring warnings such as missing character
2035
+ descriptions, pending storyboard-grid images, or the default `NO MUSIC`
2036
+ policy.
2037
+
2038
+ By default Seedance packets use `15` seconds, matching the ai-filmmaking rule
2039
+ that Seedance 2.0 generations should use the full available runtime unless the
2040
+ operator explicitly requests a shorter duration.
2041
+
2042
+ Use `--storyboard-grid <path>` after the 9-panel board image has been generated
2043
+ from `storyboardGridPrompt.promptText`. That path marks the storyboard-grid slot
2044
+ as `ready`, removes the pending-grid warning, and makes the grid eligible for
2045
+ Seedance execution. Without it, the slot remains reserved but pending.
2046
+
2047
+ To generate a deterministic local review board from the packet panels:
2048
+
2049
+ ```bash
2050
+ vclaw video storyboard-grid \
2051
+ --project 2026-05-27_dhuaan-music-video \
2052
+ --root /path/to/video-workspace
2053
+ ```
2054
+
2055
+ This writes `projects/<slug>/assets/storyboard-grid.png`, updates the
2056
+ storyboard-grid slot in `filmmaking-prompts.json` to `ready`, removes the
2057
+ pending-grid warnings, and snapshots the updated artifact. The rendered board is
2058
+ not a replacement for an image-model-generated cinematic grid; it is the
2059
+ reviewable production-board fallback and a stable attachment point for the
2060
+ Seedance reference workflow.
2061
+
2062
+ ## Brand DNA ingest (`brand-extract` + `brief --from-brand-dna`)
2063
+
2064
+ ```bash
2065
+ vclaw video brand-extract --project <slug> --url <website> [--root <path>] [--gemini-endpoint <url>]
2066
+ vclaw video brief --project <slug> --from-brand-dna # seed the brief from brand-dna.json
2067
+ ```
2068
+
2069
+ `brand-extract` turns a client website into a machine-readable **brand DNA** artifact —
2070
+ the only LLM step in the brief→storyboard chain, isolated in its own stage so downstream
2071
+ stages stay deterministic. It:
2072
+
2073
+ - scrapes the page with plain `fetch` + regex (no headless browser, no new deps),
2074
+ - computes the colour palette **deterministically** from the page's colours (drops
2075
+ white/black/greys, frequency-ranks: top-3 primary / next-5 secondary),
2076
+ - runs one strict-JSON Gemini pass (via the shared `GEMINI_API_KEYS` key-pool;
2077
+ `VCLAW_GEMINI_API_ENDPOINT`/`--gemini-endpoint` override the endpoint) for the
2078
+ brand-voice / audience / messaging fields, then merges the deterministic palette over
2079
+ the model's guess,
2080
+ - writes `projects/<slug>/artifacts/brand-dna.json` (schema
2081
+ `schemas/video/artifacts/brand-dna.schema.json`: brandName, industry, tagline,
2082
+ valueProposition, toneOfVoice[], brandPersonality[], targetAudience, keyMessages[],
2083
+ primaryColors[], secondaryColors[], fonts[], logoUrl, imageryStyle, layoutStyle).
2084
+
2085
+ **Content-filter rule:** the artifact records logo URL / colours / text only — scraped
2086
+ photoreal faces are never recorded or passed downstream as reference images (they trip
2087
+ the ARK/Seedance real-person filter and don't lock identity).
2088
+
2089
+ `vclaw video brief --from-brand-dna` is **opt-in** (off by default → brief output is
2090
+ byte-identical to before). When set, it reads `brand-dna.json`, fills `--title`←brandName
2091
+ and `--intent`←valueProposition only where you omit them (explicit flags always win), and
2092
+ parks the richer brand fields under `brief.metadata.brandDna` for later stages. If the
2093
+ artifact is absent it errors — no silent fallback. The `vclaw studio --goal brand-campaign`
2094
+ recipe chains these two commands (see `docs/STUDIO.md`).
2095
+
2096
+ ## Seedance Asset Library (character consistency)
2097
+
2098
+ ```bash
2099
+ vclaw video seedance-register-assets --project <slug> --character <name>:<imageUrl> [--character ...] [--group <name>] [--root <path>]
2100
+ ```
2101
+
2102
+ Registers character reference images as **xskill Asset Library avatars** and
2103
+ returns their `Asset://` URIs — the official `ark/seedance-2.0` mechanism for
2104
+ locking character identity across shots. Passing raw photoreal image URLs in
2105
+ `reference_images` trips the "real person" content filter and does not lock
2106
+ identity; managed assets pass the filter and lock the character (validated
2107
+ 2026-05-29: identical to the proven endpoint `ep-…`).
2108
+
2109
+ - Each `--character` is `<name>:<publicImageUrl>` (the image must be a public
2110
+ http(s) URL). `--group` defaults to `<slug>-cast`.
2111
+ - Requires `SUTUI_API_KEY` in the environment.
2112
+ - Ensures the Asset group, creates each asset, waits for it to sync to the
2113
+ international Ark profile (`sync_status: active`), and writes
2114
+ `projects/<slug>/artifacts/seedance-assets.json` (name → `Asset://` URI).
2115
+ - Feed the resulting `Asset://` URIs into execution as scene reference paths —
2116
+ `native-seedance.ts` already routes `Asset://` references into
2117
+ `reference_images` on `ark/seedance-2.0`.
2118
+
2119
+ ### End-to-end identity flow (seedance-direct)
2120
+
2121
+ The `seedance-assets.json` artifact closes the loop so identity is locked
2122
+ automatically at execution time, without hand-editing scene reference paths:
2123
+
2124
+ 1. **Register** — `vclaw video seedance-register-assets` registers each
2125
+ character image as a managed Asset Library avatar and writes
2126
+ `projects/<slug>/artifacts/seedance-assets.json`. Its canonical contract is
2127
+ `schemas/video/artifacts/seedance-assets.schema.json` (`{ schemaVersion: 1,
2128
+ projectSlug, groupName, generatedAt, assets: [{ name, assetId, assetUri,
2129
+ intlAssetUri }] }`).
2130
+ 2. **Resolve** — on the `seedance-direct` route only, `buildExecutionPayload`
2131
+ (`src/video/execution-runtime.ts`) reads that artifact via
2132
+ `readSeedanceAssets(workspaceRoot, slug)` and auto-resolves each scene's
2133
+ `referencePaths` by matching the scene's `characters` names → their
2134
+ `Asset://` URIs. A project without `seedance-assets.json` behaves exactly as
2135
+ before (no auto-resolution).
2136
+ 3. **Budget cap** — references are capped at **≤9 image / ≤3 video / ≤3 audio**
2137
+ per submission. `assertReferenceBudget` is preflighted across the whole
2138
+ payload in `submitSeedanceDirectNative` before any provider submit, so an
2139
+ over-budget run fails fast with no partial submission.
2140
+
2141
+ Characters are matched by **name** (the scene's `characters` entries), but
2142
+ prompts should still describe characters by **visual descriptor, not proper
2143
+ name** — names do not survive across generations; the Asset Library avatar is
2144
+ what locks identity.
2145
+
2146
+ Example:
2147
+
2148
+ ```bash
2149
+ vclaw video filmmaking-prompts \
2150
+ --project 2026-05-27_dhuaan-music-video \
2151
+ --root /path/to/video-workspace \
2152
+ --storyboard-grid projects/2026-05-27_dhuaan-music-video/assets/storyboard-grid.png \
2153
+ --write
2154
+ ```
2155
+
2156
+ With `--write`, the packet is saved to
2157
+ `projects/<slug>/artifacts/filmmaking-prompts.json` and snapshotted in artifact
2158
+ history. This artifact is intended to feed the preview portal and Seedance
2159
+ execution layer so the operator can inspect exactly which prompt variant,
2160
+ reference slots, duration, and start frames are being used.
2161
+
2162
+ During execution, videoclaw only consumes Seedance packets whose references are
2163
+ all marked `ready` and have concrete paths. Ready packets override the scene
2164
+ animation prompt, duration, and reference list; pending packets are ignored and
2165
+ execution falls back to the normal storyboard plus asset manifest inputs. This
2166
+ prevents incomplete prompts such as `@image3` storyboard-grid references from
2167
+ being submitted before the matching image exists.
2168
+
2169
+ ## Google Flow Characters & Voices (veo-useapi)
2170
+
2171
+ useapi.net's Google Flow v1 API exposes **reusable Characters** (locked identity +
2172
+ optional bundled voice) and **custom Voices**, scriptable end-to-end. This mirrors
2173
+ the Seedance Asset Library pattern for the `veo-useapi` route.
2174
+
2175
+ ```bash
2176
+ vclaw video flow-register-characters --project <slug> --input <json-path> [--root <path>]
2177
+ vclaw video flow-register-voices --project <slug> --input <json-path> [--root <path>]
2178
+ vclaw video flow-r2v --prompt "<text>" --character <name|ref> [--character ...] --out <path> [--project <slug>] [--root <path>] [--duration 4|6|8|10] [--aspect landscape|portrait] [--keep-music] [--allow-reverb] [--retries <n>] [--cooldown <sec>] [--dry-run]
2179
+ ```
2180
+
2181
+ Requires `USEAPI_API_TOKEN` + `USEAPI_ACCOUNT_EMAIL`.
2182
+
2183
+ ### Native character-ad scene render (`flow-r2v`)
2184
+
2185
+ `flow-r2v` renders ONE Google Flow **Reference-to-Video (R2V)** scene straight
2186
+ from saved Flow characters — the native character-ad workflow. Register the
2187
+ person(s) and the product once with `flow-register-characters`, then each
2188
+ `--character` (a friendly name resolved via `artifacts/flow-characters.json`
2189
+ when `--project` is set, or a raw character ref) maps to `character_1..7` so a
2190
+ single scene locks **both the person and the product**. Dialogue lives inline in
2191
+ `--prompt` and Veo generates the voice + lip-sync natively. It uses
2192
+ `veo-3.1-fast` (R2V; no startImage — the Veo 3.1 R2V lane clears photoreal human
2193
+ faces, live-proven).
2194
+
2195
+ By default the **dry-voice** (close-mic, no echo/reverb) and **no-baked-music**
2196
+ directives are appended to the prompt so a music bed added in post sits cleanly
2197
+ under the native voice without clashing — opt out with `--keep-music` /
2198
+ `--allow-reverb`. A `403` reCAPTCHA burst-throttle is cooled-down-and-retried
2199
+ (`--retries`, default 2; `--cooldown` seconds, default 300). `--dry-run` prints
2200
+ the composed request (resolved refs + hygiened prompt) without spending.
2201
+
2202
+ ```bash
2203
+ # lock Asha + the candle, render the hook scene with native voice
2204
+ vclaw video flow-r2v --project dhuaan-candle \
2205
+ --prompt 'Asha looks to camera and says: "A candle should fill the room. Most do not."' \
2206
+ --character Asha --character DhuaanMaster --out outputs/ad1-s1.mp4
2207
+ ```
2208
+
2209
+ **Characters** — input is a JSON array of `{ name, images:[path|mediaId, …], voice?, personalityNotes? }`
2210
+ (1–2 images each; `voice` is a system preset like `"Charon"` or a registered voice
2211
+ ref). Each image is uploaded, then bundled into a saved character via
2212
+ `POST /google-flow/characters`. Writes `projects/<slug>/artifacts/flow-characters.json`
2213
+ (`{ schemaVersion: 1, projectSlug, generatedAt, characters: [{ name, entityId,
2214
+ characterRef, voice }] }`, schema `schemas/video/artifacts/flow-characters.schema.json`).
2215
+
2216
+ **Voices** — input is a JSON array of `{ name, basePreset, dialog, voicePerformance }`.
2217
+ Writes `artifacts/flow-voices.json`.
2218
+
2219
+ ### End-to-end identity flow (veo-useapi)
2220
+
2221
+ 1. **Register** — `flow-register-characters` saves each character and writes
2222
+ `flow-characters.json`.
2223
+ 2. **Resolve** — on the **`veo-useapi` route only**, `buildExecutionPayload`
2224
+ reads it via `readFlowCharacters(workspaceRoot, slug)` and resolves each
2225
+ scene's `characters` names → their character refs into `task.characterRefs`.
2226
+ A project without `flow-characters.json` behaves exactly as before.
2227
+ 3. **Submit** — `native-veo.ts` passes `characterRefs` to `flow.ts` as repeated
2228
+ `--character` flags (Flow v1 `character_1..7`), routing to R2V entity mode with
2229
+ the bundled voice.
2230
+
2231
+ > ⚠️ **Moderation:** `character_*` routes through **R2V**, so realistic human
2232
+ > faces are rejected by Google's real-person-reference filter
2233
+ > (`PUBLIC_ERROR_UNSAFE_GENERATION` / `INPUT_OTHER`). Use Characters for
2234
+ > **stylized / mascot** identities (proven live with a robot mascot). For
2235
+ > photoreal humans, use the **Veo-I2V** path (`--scene-first-frame` /
2236
+ > startImage), which is a more permissive filter and also carries native voice.
2237
+
2238
+ API quirks hardcoded around (the HTML docs are wrong on these): `POST /characters`
2239
+ **rejects** an `email` body field (account = token); `POST /voices` **requires** it.
2240
+
2241
+ ### Google Flow inline @-markers (veo-useapi)
2242
+
2243
+ useapi.net's Google Flow v1 API (blog 260609) accepts **inline `@`-mention
2244
+ markers** in prompt text that anchor a body-slot reference to a position in the
2245
+ prompt (tighter compositional control + identity without textual description):
2246
+
2247
+ | Marker | Index range | Endpoint |
2248
+ |---|---|---|
2249
+ | `@character_N` | 1–7 | `POST /videos` and `POST /images` |
2250
+ | `@referenceImage_N` | 1–7 | `POST /videos` |
2251
+ | `@referenceAudio_N` | 1–5 | `POST /videos` |
2252
+ | `@reference_N` | 1–10 | `POST /images` |
2253
+
2254
+ - **Case-insensitive** (`@Character_2` == `@character_2`) and **opt-in**: a body
2255
+ slot without a marker is always fine, but a marker without a matching body
2256
+ slot makes the API 400.
2257
+ - The marker grammar is **reserved** in videoclaw's prompt pipeline: `@Name` tag
2258
+ resolution (`resolveAssetTags`) preserves these tokens verbatim, exactly like
2259
+ the `@imageN` positional bindings.
2260
+ - **veo-useapi route only** — on every other route (`seedance-direct`,
2261
+ `runway-useapi`, `dreamina-useapi`) `buildExecutionPayload` strips the marker
2262
+ tokens from the scene prompt and warns, so literal markers never leak to a
2263
+ provider that doesn't understand them.
2264
+ - **V2V has no marker** — there is deliberately no `@referenceVideo_1`;
2265
+ video-to-video reference stays flag-only (`--ref-video` /
2266
+ `referenceVideoMediaId`).
2267
+ - The pure helper module is `src/video/flow-markers.ts`
2268
+ (`extractFlowMarkers` / `validateFlowVideoMarkers` /
2269
+ `validateFlowImageMarkers` / `stripFlowMarkers` /
2270
+ `planFlowCharacterSlots` / `injectFlowCharacterMarkers`).
2271
+
2272
+ **Auto-injection (`@Name` → `@character_N`)** — on veo-useapi,
2273
+ `buildExecutionPayload` rewrites each `@Name` tag whose character has a
2274
+ registered Flow ref (`artifacts/flow-characters.json`, see
2275
+ `flow-register-characters`) into its canonical lowercase `@character_N` marker,
2276
+ and the same slot plan emits the task's `characterRefs` array (which becomes
2277
+ the repeated `--character` flags → `character_1..7` body slots, in order):
2278
+
2279
+ - **Ordering contract:** slot order = **scene cast order first**
2280
+ (`scene.characters`, today's exact order), **then tag-only characters**
2281
+ (registered names that appear only as `@Name` tags in the prompt, in tag
2282
+ scan order).
2283
+ - **Matching semantics are split by phase.** Cast-name matching is
2284
+ **exact-case** — the legacy lookup, verbatim — which is exactly why a
2285
+ tagless prompt yields a byte-identical payload (a cast name that only
2286
+ case-mismatches the registry stays unresolved, as before). `@Name` **tag**
2287
+ matching is case-insensitive (`@clawbot` resolves to a registered
2288
+ `Clawbot`); duplicate `@Name` mentions all resolve to the SAME
2289
+ `@character_N` (one slot — the API dedup rule).
2290
+ - Capped at **7** slots; registered names beyond the cap are dropped from the
2291
+ scene with a warning naming them.
2292
+ - **Hand-authored markers** (`@character_2` etc.) pass through verbatim and
2293
+ ground against the same final `characterRefs` array — if slot N has no
2294
+ entry, the vclaw-cli sidecar's pre-submit marker validation (shipped
2295
+ alongside this feature in the `feat/flow-markers-vclaw-cli` slice) fails
2296
+ fast before any CAPTCHA spend.
2297
+ - **Intended behavior change:** a ref-registered character's `@Name` tag no
2298
+ longer also attaches its loose portrait image to the scene's
2299
+ `referencePaths` — the saved Flow character already bundles its identity
2300
+ images, so the portrait would only waste the shared image-reference budget.
2301
+ Characters WITHOUT a Flow ref keep the normal descriptor-substitution path,
2302
+ including portrait collection.
2303
+
2304
+ ### Direct primitives (Bun bridge)
2305
+
2306
+ `flow.ts` exposes the raw endpoints for ad-hoc use:
2307
+
2308
+ ```bash
2309
+ bun run flow.ts characters create --display-name "Clawbot" --image-ref <mediaId> [--image-ref <mediaId2>] [--voice Puck] [--personality "<notes>"]
2310
+ bun run flow.ts characters list
2311
+ bun run flow.ts characters delete <characterRef>
2312
+ bun run flow.ts voices create --voice Charon --display-name "BuntyVoice" --dialog "Shabash!" --voice-performance "warm, excitable"
2313
+ bun run flow.ts -p "He says hello" -m omni-flash --character <characterRef> # generate with a saved character
2314
+ ```
2315
+
2316
+ ### omni-flash startImage (First Frame) — now default-on
2317
+
2318
+ omni-flash image-to-video (`startImage`) is **live-verified** and enabled by
2319
+ default. `VCLAW_OMNI_FIRST_FRAME=0/off` is a kill-switch. Drive it through the
2320
+ project pipeline with `vclaw video storyboard … --scene-first-frame <i>`.
2321
+
2322
+ ## Prompt lint
2323
+
2324
+ ```
2325
+ vclaw video prompt-lint (--project <slug> | --file <path>) [flags]
2326
+ ```
2327
+
2328
+ A **pure validator** over a `filmmaking-prompts` artifact (the JSON produced by `vclaw video filmmaking-prompts --write`, or any equivalent file passed with `--file`). It runs no providers and never spends credits — it only reads and checks. Per Seedance packet it reports:
2329
+
2330
+ - **10-block order** — text-driven packets must carry the canonical Joey block order (`SCENE & MOOD → FRAME MAP → SUBJECT LOCK → CROSS-FRAME → MOVEMENT → LAST FRAME → WORLD PLATE → SOUND BED → CAPTURE REALISM → CAMERA CAPTURE`).
2331
+ - **Word count** — warns when a packet falls outside the 280–600 words/packet window.
2332
+ - **Required video blocks** — text-driven packets must carry `SUBJECT LOCK`, `CAPTURE REALISM`, and `CAMERA CAPTURE` (error). Grid-reference variants carry the same discipline inline and are exempt.
2333
+ - **Grid guard** — when a `storyboard-grid` reference is attached, the single-full-frame guard must be present, or the grid leaks as a moving 9-panel split-screen (error).
2334
+ - **Prose-register hygiene** — flags Kelvin (`5200K`) and hue/angle degree (`40°`) numeric-register tokens in a prose-register packet (error). Pass `--register numeric` to suppress when those numerals are intentional.
2335
+ - **Brand / proper-name scrub** — with `--cast <Name:descriptor>` and/or `--brand <token>`, flags any packet whose text still contains a cast proper name or a brand token (error).
2336
+
2337
+ When the artifact carries a storyboard-grid prompt, its panels are also linted
2338
+ (advisory — the operator's panels are reported, never rewritten):
2339
+
2340
+ - **Annotation slug format** — CAM/MOVE/MOOD strips longer than 6 words or
2341
+ written as lowercase prose (they should read as 2-6 word uppercase screenplay
2342
+ slug lines) raise a warning.
2343
+ - **Framing progression** — the panels should vary wide → medium → close (a
2344
+ grid with only one recognizable shot size warns), and the final-third
2345
+ climax panels should contain at least one close framing. Free-text CAM
2346
+ values with no recognizable shot size are ignored, never false-positived.
2347
+
2348
+ In `--project` mode, each stored character profile's identity description is
2349
+ additionally checked against the ai-filmmaking word budget (30-60 words is the
2350
+ target): 61-100 words warns, **over 100 words is an error** — mirroring the
2351
+ generation-time `character-description-long` check, so a pipeline can gate on
2352
+ the same failure after the fact. `--file` mode lints the artifact alone.
2353
+
2354
+ | Flag | Default | Notes |
2355
+ |---|---|---|
2356
+ | `--project <slug>` | — | Lint `projects/<slug>/artifacts/filmmaking-prompts.json`. |
2357
+ | `--file <path>` | — | Lint an arbitrary artifact file instead. Exactly one of `--project`/`--file` is required. |
2358
+ | `--root <path>` | cwd | Workspace root for `--project`. |
2359
+ | `--register prose\|numeric` | `prose` | Suppress the Kelvin/hue check under `numeric`. |
2360
+ | `--cast <Name:descriptor>` | — | Repeatable; enables the proper-name leak check. |
2361
+ | `--brand <token>` | — | Repeatable; enables the brand leak check. |
2362
+ | `--checklist` | off | Additive. Also run the 9-criterion video-prompt health checklist over each packet's prompt text. |
2363
+
2364
+ Output is machine-readable JSON `{ packets: [{ sceneIndex, issues: [...] }], grid?, characters?, ok }`. The `grid` section (`{ issues: [...] }`) appears only when the artifact carries a storyboard-grid prompt; `characters` (`[{ name, issues: [...] }]`) appears only in `--project` mode with stored descriptions — without them the output shape is unchanged. The command exits non-zero when `ok` is `false` (any error-severity issue anywhere), so it can gate a pipeline.
2365
+
2366
+ With `--checklist`, an additional `checklist` array is appended to the output (the base shape is unchanged without the flag). Each entry is `{ sceneIndex, results: [{ criterion, pass, note? }], summary: { passed, total: 9, failures: [...] } }`. The nine yes/no criteria are: explicit subject, explicit action, explicit scene/setting, camera angle, camera movement, lens/optical effects, concrete (non-vague) style, temporal/sequence cues, and audio spec. The checklist is advisory only — it does not change `ok` or the exit code.
2367
+
2368
+ ```bash
2369
+ # Lint a project's prompt packets
2370
+ vclaw video prompt-lint --project rani-rooftop
2371
+
2372
+ # Lint an artifact file, enforcing brand/name scrub
2373
+ vclaw video prompt-lint --file out/filmmaking-prompts.json \
2374
+ --cast "Rani:a compact woman in a navy tactical vest" --brand "Nike"
2375
+
2376
+ # Lint plus the 9-criterion health checklist per packet
2377
+ vclaw video prompt-lint --project rani-rooftop --checklist
2378
+ ```
2379
+
2380
+ ## Outpaint keyframe
2381
+
2382
+ ```
2383
+ vclaw video outpaint-keyframe --input <path> --output <path> [--width <px>] [--height <px>] [--mask-dilation <frac>] [--fill gobananas|none] [--prompt <text>] [--size <WxH>] [--project <slug>] [--root <path>]
2384
+ ```
2385
+
2386
+ Pad a keyframe image onto a larger target canvas (centred, letterboxed) and build an **RGBA alpha** inpainting mask for the new border region — the standard first step of an outpaint workflow (e.g. taking a square or portrait keyframe to a 16:9 1920×1080 frame). The pad + mask math is **pure and deterministic** (sharp only, no network), so the default `--fill none` runs entirely offline.
2387
+
2388
+ The mask is alpha-keyed to match the inpainting model: **transparent (alpha 0) = the border region to fill, opaque (alpha 255) = the original image to preserve**. `--fill gobananas` performs the proven upload×2 → edit-by-id flow against the go-bananas REST API: it `POST`s the padded source and the alpha mask to `/api/images/upload` (multipart, field `file`), then runs a masked `POST /api/edit-image` with `model_id: openai-gpt-image-2` (masked edits require an OpenAI model), and downloads the returned `fullUrl`.
2389
+
2390
+ | Flag | Default | Notes |
2391
+ |---|---|---|
2392
+ | `--input <path>` | — | Source keyframe image (required). |
2393
+ | `--output <path>` | — | Output PNG path (required). |
2394
+ | `--width <px>` | `1920` | Target canvas width. |
2395
+ | `--height <px>` | `1080` | Target canvas height. |
2396
+ | `--mask-dilation <frac>` | `0.03` | Mask border dilation as a fraction of the smaller canvas dimension (standard inpaint overlap; the opaque keep-region shrinks inward so the fill bites into the seam). |
2397
+ | `--fill gobananas\|none` | `none` | `none` writes the padded letterbox only (deterministic, offline). `gobananas` uploads the source + alpha mask and runs a masked `gpt-image-2` edit (requires `GO_BANANAS_API_KEY`). |
2398
+ | `--prompt <text>` | extend-scene default | Outpaint instruction for `--fill gobananas` (ignored for `--fill none`). |
2399
+ | `--size <WxH>` | provider default | Optional `gpt-image-2` output size for `--fill gobananas`, e.g. `1536x1024` (ignored for `--fill none`). |
2400
+ | `--project <slug>` / `--root <path>` | — / cwd | Optional context for path resolution. |
2401
+
2402
+ The source is scaled to fit inside the target preserving aspect ratio and is never upscaled beyond 1:1. Output is machine-readable JSON `{ outputPath, width, height, filled }`, where `filled` is `true` only when a fill backend produced the border.
2403
+
2404
+ ```bash
2405
+ # Deterministic letterbox + mask (offline)
2406
+ vclaw video outpaint-keyframe --input frame.png --output frame-1080.png
2407
+
2408
+ # Outpaint the border via go-bananas (needs GO_BANANAS_API_KEY)
2409
+ vclaw video outpaint-keyframe --input frame.png --output frame-1080.png --fill gobananas
2410
+
2411
+ # Steer the outpaint with a custom prompt + pinned size
2412
+ vclaw video outpaint-keyframe --input frame.png --output frame-wide.png \
2413
+ --width 1536 --height 1024 --fill gobananas \
2414
+ --prompt "extend the neon-lit alley, wet asphalt reflections" --size 1536x1024
2415
+ ```
2416
+
2417
+ ## Overnight batch video queue
2418
+
2419
+ Queue many independent video jobs and run them unattended overnight. The
2420
+ default route is the **free** `runway-useapi` explore mode — low-res, slow
2421
+ "backfill draft" generation that costs no credits, so a large queue can land
2422
+ by morning. Target `dreamina-useapi` (or `seedance-direct`) when you want paid
2423
+ hi-res output instead.
2424
+
2425
+ **Free explore-mode ceiling: 720p, ≤10s per clip.** The free lane (Runway
2426
+ Unlimited plan, `exploreMode`) serves **720p max** (1080p/4K are credit-mode
2427
+ only) and **5s or 10s** durations, on a lower-priority queue (~10 min/clip,
2428
+ limited concurrency). Batch defaults therefore use **`seconds: 10`** (the free
2429
+ ceiling) and **`resolution: 720p`** — override per job, or switch to a paid
2430
+ route for 1080p/longer finals.
2431
+
2432
+ A batch is one JSON manifest you author. It compiles into a single execution
2433
+ payload with N tasks and runs through the same native route transport
2434
+ (`native-runway` / `native-dreamina` / `native-seedance`) the normal execute
2435
+ runtime uses — there is no separate submit/poll path.
2436
+
2437
+ > **Transient retries:** the native submit/poll calls on the `runway-useapi`,
2438
+ > `dreamina-useapi`, and `seedance-direct` transports are wrapped in exponential
2439
+ > backoff (3 retries: 1s, 2s, 4s). Only transient failures are retried —
2440
+ > network-level errors (dropped connections, timeouts) and HTTP 5xx. HTTP 4xx
2441
+ > business errors (including Seedance content-moderation rejections) are **not**
2442
+ > retried and surface immediately with their original error message.
2443
+
2444
+ ### Manifest shape
2445
+
2446
+ `schemas/video/artifacts/batch-queue-manifest.schema.json`:
2447
+
2448
+ ```json
2449
+ {
2450
+ "schemaVersion": 1,
2451
+ "route": "runway-useapi",
2452
+ "defaults": { "seconds": 8, "aspectRatio": "16:9", "resolution": "720p" },
2453
+ "jobs": [
2454
+ { "id": "skyline", "prompt": "a neon city skyline at night, slow drift" },
2455
+ { "id": "forest", "prompt": "a quiet pine forest at dawn", "keyframe": "/refs/forest.jpg", "seconds": 10 },
2456
+ { "id": "desert", "prompt": "a desert dune ridge under hard noon sun", "aspectRatio": "9:16" }
2457
+ ]
2458
+ }
2459
+ ```
2460
+
2461
+ - `route` (optional) — one of `runway-useapi` (default, free), `dreamina-useapi`,
2462
+ `seedance-direct`.
2463
+ - `defaults` (optional) — `seconds` / `aspectRatio` / `resolution` applied to any
2464
+ job that omits them.
2465
+ - each `job` requires `id` (stable; becomes the downloaded clip filename) and
2466
+ `prompt`; `keyframe` (local path or public http(s) URL), `characterRefs`, and
2467
+ `seconds` are optional per-job overrides. `id`s must be unique.
2468
+ - `characterRefs` (optional, array of local paths or public http(s) URLs) —
2469
+ character reference images, one per character. They are delivered to the
2470
+ provider's reference slot (Runway `imageAssetId1..N`, Dreamina
2471
+ `omni_N_imageRef`) via `referenceRole: 'character'`, so a lone character sheet
2472
+ is **never** used as the video's first frame (avoids the character-grid
2473
+ opening). Use `characterRefs` for identity-lock; use `keyframe` only for a
2474
+ genuine first-frame seed (they are mutually exclusive — `characterRefs` wins
2475
+ if both are set).
2476
+ - `endKeyframe` (optional, local path or public http(s) URL) — an **end frame**.
2477
+ With `keyframe` set, the clip animates from `keyframe` (first frame) to
2478
+ `endKeyframe` (last frame) via Seedance-2 keyframe interpolation
2479
+ (`startFrameAssetId` → `endFrameAssetId`), turning two stills into one
2480
+ continuous shot — ideal for combining two storyboard frames of the same
2481
+ subject/location into a single 10s clip. Requires `keyframe`; mutually
2482
+ exclusive with `characterRefs`.
2483
+
2484
+ ### Commands
2485
+
2486
+ ```bash
2487
+ # 1. Submit the whole batch (free explore by default). Writes <dir>/batch-queue.json.
2488
+ vclaw video batch-submit --manifest batch.json --out runs/overnight [--route runway-useapi]
2489
+
2490
+ # 2. Monitor on a schedule. --once does a single pass + exits (what launchd calls).
2491
+ vclaw video batch-monitor --out runs/overnight --once
2492
+
2493
+ # 2b. Or loop foreground until everything is terminal (or --max-minutes elapses):
2494
+ vclaw video batch-monitor --out runs/overnight --interval 1200 --max-minutes 600
2495
+
2496
+ # 3. Read-only rollup (never polls):
2497
+ vclaw video batch-status --out runs/overnight
2498
+ ```
2499
+
2500
+ - `batch-submit` reads the manifest, builds the payload, calls the route's
2501
+ native submit, and persists `<dir>/batch-queue.json`
2502
+ (`{ externalJobId, route, outputDir, submittedAt, jobs:[{id, sceneIndex, taskId, status}] }`).
2503
+ **Resumable on the free explore throttle (runway-useapi):** the explore lane
2504
+ allows ~1 concurrent job, so a submit can only place some scenes before the
2505
+ rest hit `429 canUseExploreMode`. Rather than fail, `batch-submit` persists
2506
+ each scene the moment it is accepted and reports `{ submitted, pending,
2507
+ throttled }`. Re-running it against the same `--out` **reuses the job id and
2508
+ skips already-submitted scenes** — it never re-fires scene 0 — so repeated
2509
+ calls drain the queue one slot at a time, each scene submitted exactly once.
2510
+ A scheduler can simply loop `batch-submit` until `pending` is `0`.
2511
+ - `batch-monitor` polls once via the route's native transport (which downloads
2512
+ completed outputs to `<dir>/scene-<i>.mp4`), then copies each finished scene to
2513
+ `<dir>/clips/<jobId>.mp4`, updates statuses, and writes `<dir>/batch-status.json`.
2514
+ - `batch-status` prints the current done/pending/failed rollup without polling.
2515
+
2516
+ **Resumable / idempotent.** Re-running `batch-monitor` only advances pending
2517
+ jobs to done/failed. Jobs already `done` (or whose `clips/<id>.mp4` already
2518
+ exists) short-circuit — completed clips are never re-downloaded and nothing is
2519
+ resubmitted. This is what makes `--once` safe to drive from launchd/cron on a
2520
+ schedule: each scheduled invocation just picks up where the last one left off.
2521
+
2522
+ **Wedge handling (`--stall-minutes` / `--fail-wedged`, opt-in).** A free-explore
2523
+ queue can wedge — the provider leaves a scene `submitted` and never returns it —
2524
+ which would otherwise make the monitor poll until `--max-minutes`. Pass
2525
+ `--stall-minutes <n>` (default `0` = off) to flag any scene still `submitted`
2526
+ more than `n` minutes after the batch was submitted as **wedged** (reported in
2527
+ `batch-status.json` and the monitor's output). Add `--fail-wedged` to mark those
2528
+ wedged scenes `failed`, so the queue reaches terminal and the monitor exits
2529
+ cleanly instead of looping; you then re-run just the wedged ids as a fresh small
2530
+ batch. Without `--fail-wedged` the scenes stay `pending` and are only surfaced.
2531
+ `--stall-minutes 0` keeps the original behaviour byte-for-byte.
2532
+
2533
+ **Auto-resubmit (`--auto-resubmit` / `--max-resubmits <n>`, opt-in).** Instead of
2534
+ just failing wedged scenes, pass `--auto-resubmit` (together with
2535
+ `--stall-minutes <n>` — without a stall window it is a no-op) to **re-submit** each
2536
+ wedged scene as a fresh single-scene job, up to `--max-resubmits <n>` times
2537
+ (default `2`). This is **only permitted on the free `runway-useapi` explore
2538
+ route** — it is refused on the paid `dreamina-useapi`/`seedance-direct` routes (a
2539
+ guard fires before any poll/submit, and the credit-spending path self-guards too),
2540
+ so auto-resubmit can never spend credits. A re-submitted scene keeps its
2541
+ `scene-<i>.mp4` slot (first-writer-wins, so no double-download), and the monitor
2542
+ polls every active job id and attributes each scene to its live job. Throttle
2543
+ backoff applies to resubmits too.
2544
+
2545
+ **Throttle backoff (automatic).** When the explore queue is saturated
2546
+ (`canUseExploreMode:false` / HTTP 429), the monitor catches it and grows the poll
2547
+ interval (exponential, capped) instead of hammering; genuine errors still surface.
2548
+ Surfaced as `throttled` in `batch-status.json`.
2549
+
2550
+ ### Scheduling with launchd
2551
+
2552
+ Point a launchd agent at `vclaw video batch-monitor --out <dir> --once` on a
2553
+ 20-minute `StartInterval` (1200s). Each tick advances the queue and exits; when
2554
+ the rollup is terminal, subsequent ticks are no-ops. Finished clips collect in
2555
+ `<dir>/clips/<jobId>.mp4`, ready to use by morning.
2556
+
2557
+ ## Prompt library
2558
+
2559
+ `prompt-lib-list` and `prompt-lib-show` expose imported reference assets for:
2560
+
2561
+ 1. Seedance formulas
2562
+ 2. Veo prompting guidance
2563
+ 3. style template schema
2564
+ 4. stage directors
2565
+ 5. checkpoint protocol
2566
+ 6. generation telemetry
2567
+ 7. dialogue duration preflight
2568
+ 8. character reference sheets
2569
+ 9. clone-ad template workflow
2570
+ 10. multi-shot cinematic prompt framework
2571
+
2572
+ ## Portfolio operations
2573
+
2574
+ ```bash
2575
+ vclaw video list [--root <path>]
2576
+ vclaw video index [--root <path>] [--output <path>]
2577
+ vclaw video metrics [--root <path>] [--mode storyboard|director]
2578
+ vclaw video workload [--root <path>] [--mode storyboard|director]
2579
+ vclaw video next-actions [--root <path>] [--mode storyboard|director]
2580
+ vclaw video dependencies [--root <path>] [--mode storyboard|director]
2581
+ vclaw video doctor-portfolio [--root <path>] [--mode storyboard|director]
2582
+ vclaw video report [--root <path>] [--mode storyboard|director]
2583
+ vclaw video report-snapshot [--root <path>] [--mode storyboard|director]
2584
+ vclaw video report-history [--root <path>]
2585
+ vclaw video report-diff [--root <path>] [--from <snapshot-path>] [--to <snapshot-path>]
2586
+ vclaw video trends [--root <path>]
2587
+ vclaw video export-csv [--root <path>] [--output-dir <path>] [--mode storyboard|director]
2588
+ ```
2589
+
2590
+ ## Obsidian
2591
+
2592
+ ```bash
2593
+ vclaw video scaffold-obsidian-vault [--output-dir <path>]
2594
+ vclaw video export-obsidian --project <slug> [--root <path>] [--output-dir <path>] [--mode storyboard|director]
2595
+ vclaw video sync-obsidian [--root <path>] [--output-dir <path>] [--mode storyboard|director]
2596
+ ```
2597
+
2598
+ ## Migration
2599
+
2600
+ ```bash
2601
+ vclaw video import-legacy --source <path> [--root <path>]
2602
+ ```
2603
+
2604
+ ## MCP server
2605
+
2606
+ `vclaw mcp serve` starts a stdio MCP (Model Context Protocol) server
2607
+ exposing read-only project introspection to MCP-aware agent hosts
2608
+ (Claude Code, Codex, Cursor, Antigravity).
2609
+
2610
+ ### Tools exposed (all read-only)
2611
+
2612
+ | Tool | Input | Returns |
2613
+ |---|---|---|
2614
+ | `list_projects` | `{ root? }` | All projects in the workspace |
2615
+ | `get_project_status` | `{ slug, root? }` | Stage + checkpoint state for one project |
2616
+ | `get_artifacts` | `{ slug, root? }` | The project's JSON artifacts |
2617
+ | `get_event_log` | `{ slug, limit?, root? }` | Recent events from events.jsonl |
2618
+ | `list_provider_routes` | `{ root? }` | Provider routes + availability |
2619
+
2620
+ **Writes go through the CLI, not MCP.** Per the agent-integration
2621
+ research, the CLI is the deterministic action surface; MCP is for
2622
+ live-state queries. To create/modify a project, an agent calls
2623
+ `vclaw video *` commands directly.
2624
+
2625
+ ### Configuring an MCP client
2626
+
2627
+ In a Claude Code / Codex / Cursor MCP config:
2628
+
2629
+ ```json
2630
+ {
2631
+ "mcpServers": {
2632
+ "videoclaw": {
2633
+ "command": "vclaw",
2634
+ "args": ["mcp", "serve"]
2635
+ }
2636
+ }
2637
+ }
2638
+ ```