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.
- package/AGENTS.md +165 -0
- package/CLAUDE.md +232 -0
- package/LICENSE +36 -0
- package/README.md +737 -0
- package/dist/cli/args.d.ts +59 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +279 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/handlers/analysis.d.ts +3 -0
- package/dist/cli/handlers/analysis.d.ts.map +1 -0
- package/dist/cli/handlers/analysis.js +111 -0
- package/dist/cli/handlers/analysis.js.map +1 -0
- package/dist/cli/handlers/audio.d.ts +25 -0
- package/dist/cli/handlers/audio.d.ts.map +1 -0
- package/dist/cli/handlers/audio.js +321 -0
- package/dist/cli/handlers/audio.js.map +1 -0
- package/dist/cli/handlers/batch.d.ts +4 -0
- package/dist/cli/handlers/batch.d.ts.map +1 -0
- package/dist/cli/handlers/batch.js +424 -0
- package/dist/cli/handlers/batch.js.map +1 -0
- package/dist/cli/handlers/candidates.d.ts +10 -0
- package/dist/cli/handlers/candidates.d.ts.map +1 -0
- package/dist/cli/handlers/candidates.js +389 -0
- package/dist/cli/handlers/candidates.js.map +1 -0
- package/dist/cli/handlers/character.d.ts +8 -0
- package/dist/cli/handlers/character.d.ts.map +1 -0
- package/dist/cli/handlers/character.js +202 -0
- package/dist/cli/handlers/character.js.map +1 -0
- package/dist/cli/handlers/clone.d.ts +5 -0
- package/dist/cli/handlers/clone.d.ts.map +1 -0
- package/dist/cli/handlers/clone.js +303 -0
- package/dist/cli/handlers/clone.js.map +1 -0
- package/dist/cli/handlers/create.d.ts +5 -0
- package/dist/cli/handlers/create.d.ts.map +1 -0
- package/dist/cli/handlers/create.js +635 -0
- package/dist/cli/handlers/create.js.map +1 -0
- package/dist/cli/handlers/execution.d.ts +5 -0
- package/dist/cli/handlers/execution.d.ts.map +1 -0
- package/dist/cli/handlers/execution.js +132 -0
- package/dist/cli/handlers/execution.js.map +1 -0
- package/dist/cli/handlers/library.d.ts +8 -0
- package/dist/cli/handlers/library.d.ts.map +1 -0
- package/dist/cli/handlers/library.js +77 -0
- package/dist/cli/handlers/library.js.map +1 -0
- package/dist/cli/handlers/media-ops.d.ts +7 -0
- package/dist/cli/handlers/media-ops.d.ts.map +1 -0
- package/dist/cli/handlers/media-ops.js +120 -0
- package/dist/cli/handlers/media-ops.js.map +1 -0
- package/dist/cli/handlers/media-production.d.ts +56 -0
- package/dist/cli/handlers/media-production.d.ts.map +1 -0
- package/dist/cli/handlers/media-production.js +673 -0
- package/dist/cli/handlers/media-production.js.map +1 -0
- package/dist/cli/handlers/motion-overlay.d.ts +10 -0
- package/dist/cli/handlers/motion-overlay.d.ts.map +1 -0
- package/dist/cli/handlers/motion-overlay.js +651 -0
- package/dist/cli/handlers/motion-overlay.js.map +1 -0
- package/dist/cli/handlers/multi-shot.d.ts +2 -0
- package/dist/cli/handlers/multi-shot.d.ts.map +1 -0
- package/dist/cli/handlers/multi-shot.js +424 -0
- package/dist/cli/handlers/multi-shot.js.map +1 -0
- package/dist/cli/handlers/project-ops.d.ts +14 -0
- package/dist/cli/handlers/project-ops.d.ts.map +1 -0
- package/dist/cli/handlers/project-ops.js +241 -0
- package/dist/cli/handlers/project-ops.js.map +1 -0
- package/dist/cli/handlers/prompt-craft.d.ts +8 -0
- package/dist/cli/handlers/prompt-craft.d.ts.map +1 -0
- package/dist/cli/handlers/prompt-craft.js +397 -0
- package/dist/cli/handlers/prompt-craft.js.map +1 -0
- package/dist/cli/handlers/provider-registration.d.ts +29 -0
- package/dist/cli/handlers/provider-registration.d.ts.map +1 -0
- package/dist/cli/handlers/provider-registration.js +225 -0
- package/dist/cli/handlers/provider-registration.js.map +1 -0
- package/dist/cli/handlers/reference-sheets.d.ts +6 -0
- package/dist/cli/handlers/reference-sheets.d.ts.map +1 -0
- package/dist/cli/handlers/reference-sheets.js +181 -0
- package/dist/cli/handlers/reference-sheets.js.map +1 -0
- package/dist/cli/handlers/reporting.d.ts +18 -0
- package/dist/cli/handlers/reporting.d.ts.map +1 -0
- package/dist/cli/handlers/reporting.js +155 -0
- package/dist/cli/handlers/reporting.js.map +1 -0
- package/dist/cli/handlers/review-portal.d.ts +8 -0
- package/dist/cli/handlers/review-portal.d.ts.map +1 -0
- package/dist/cli/handlers/review-portal.js +276 -0
- package/dist/cli/handlers/review-portal.js.map +1 -0
- package/dist/cli/handlers/show.d.ts +11 -0
- package/dist/cli/handlers/show.d.ts.map +1 -0
- package/dist/cli/handlers/show.js +136 -0
- package/dist/cli/handlers/show.js.map +1 -0
- package/dist/cli/handlers/stages.d.ts +6 -0
- package/dist/cli/handlers/stages.d.ts.map +1 -0
- package/dist/cli/handlers/stages.js +333 -0
- package/dist/cli/handlers/stages.js.map +1 -0
- package/dist/cli/handlers/studio.d.ts +2 -0
- package/dist/cli/handlers/studio.d.ts.map +1 -0
- package/dist/cli/handlers/studio.js +159 -0
- package/dist/cli/handlers/studio.js.map +1 -0
- package/dist/cli/handlers/templates.d.ts +7 -0
- package/dist/cli/handlers/templates.d.ts.map +1 -0
- package/dist/cli/handlers/templates.js +61 -0
- package/dist/cli/handlers/templates.js.map +1 -0
- package/dist/cli/provider-adapter.d.ts +3 -0
- package/dist/cli/provider-adapter.d.ts.map +1 -0
- package/dist/cli/provider-adapter.js +96 -0
- package/dist/cli/provider-adapter.js.map +1 -0
- package/dist/cli/vclaw.d.ts +15 -0
- package/dist/cli/vclaw.d.ts.map +1 -0
- package/dist/cli/vclaw.js +318 -0
- package/dist/cli/vclaw.js.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +3 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +27 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +168 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +55 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +80 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/video/analyze-output.d.ts +5 -0
- package/dist/video/analyze-output.d.ts.map +1 -0
- package/dist/video/analyze-output.js +7 -0
- package/dist/video/analyze-output.js.map +1 -0
- package/dist/video/archive-project.d.ts +14 -0
- package/dist/video/archive-project.d.ts.map +1 -0
- package/dist/video/archive-project.js +41 -0
- package/dist/video/archive-project.js.map +1 -0
- package/dist/video/artifact-history.d.ts +8 -0
- package/dist/video/artifact-history.d.ts.map +1 -0
- package/dist/video/artifact-history.js +12 -0
- package/dist/video/artifact-history.js.map +1 -0
- package/dist/video/artifact-store.d.ts +8 -0
- package/dist/video/artifact-store.d.ts.map +1 -0
- package/dist/video/artifact-store.js +37 -0
- package/dist/video/artifact-store.js.map +1 -0
- package/dist/video/artifact-validation.d.ts +15 -0
- package/dist/video/artifact-validation.d.ts.map +1 -0
- package/dist/video/artifact-validation.js +287 -0
- package/dist/video/artifact-validation.js.map +1 -0
- package/dist/video/artifacts.d.ts +112 -0
- package/dist/video/artifacts.d.ts.map +1 -0
- package/dist/video/artifacts.js +31 -0
- package/dist/video/artifacts.js.map +1 -0
- package/dist/video/assemble/animate-slides.d.ts +108 -0
- package/dist/video/assemble/animate-slides.d.ts.map +1 -0
- package/dist/video/assemble/animate-slides.js +152 -0
- package/dist/video/assemble/animate-slides.js.map +1 -0
- package/dist/video/assemble/animation-styles.d.ts +21 -0
- package/dist/video/assemble/animation-styles.d.ts.map +1 -0
- package/dist/video/assemble/animation-styles.js +32 -0
- package/dist/video/assemble/animation-styles.js.map +1 -0
- package/dist/video/assemble/animation-styles.json +97 -0
- package/dist/video/assemble/assemble.d.ts +24 -0
- package/dist/video/assemble/assemble.d.ts.map +1 -0
- package/dist/video/assemble/assemble.js +457 -0
- package/dist/video/assemble/assemble.js.map +1 -0
- package/dist/video/assemble/audio-concat.d.ts +61 -0
- package/dist/video/assemble/audio-concat.d.ts.map +1 -0
- package/dist/video/assemble/audio-concat.js +108 -0
- package/dist/video/assemble/audio-concat.js.map +1 -0
- package/dist/video/assemble/audio-mix-plan.d.ts +84 -0
- package/dist/video/assemble/audio-mix-plan.d.ts.map +1 -0
- package/dist/video/assemble/audio-mix-plan.js +74 -0
- package/dist/video/assemble/audio-mix-plan.js.map +1 -0
- package/dist/video/assemble/audio-utils.d.ts +32 -0
- package/dist/video/assemble/audio-utils.d.ts.map +1 -0
- package/dist/video/assemble/audio-utils.js +91 -0
- package/dist/video/assemble/audio-utils.js.map +1 -0
- package/dist/video/assemble/cut-segment.d.ts +40 -0
- package/dist/video/assemble/cut-segment.d.ts.map +1 -0
- package/dist/video/assemble/cut-segment.js +77 -0
- package/dist/video/assemble/cut-segment.js.map +1 -0
- package/dist/video/assemble/ffmpeg.d.ts +91 -0
- package/dist/video/assemble/ffmpeg.d.ts.map +1 -0
- package/dist/video/assemble/ffmpeg.js +251 -0
- package/dist/video/assemble/ffmpeg.js.map +1 -0
- package/dist/video/assemble/gemini-vision-classify.d.ts +37 -0
- package/dist/video/assemble/gemini-vision-classify.d.ts.map +1 -0
- package/dist/video/assemble/gemini-vision-classify.js +123 -0
- package/dist/video/assemble/gemini-vision-classify.js.map +1 -0
- package/dist/video/assemble/index.d.ts +47 -0
- package/dist/video/assemble/index.d.ts.map +1 -0
- package/dist/video/assemble/index.js +40 -0
- package/dist/video/assemble/index.js.map +1 -0
- package/dist/video/assemble/media-qc.d.ts +44 -0
- package/dist/video/assemble/media-qc.d.ts.map +1 -0
- package/dist/video/assemble/media-qc.js +181 -0
- package/dist/video/assemble/media-qc.js.map +1 -0
- package/dist/video/assemble/music.d.ts +51 -0
- package/dist/video/assemble/music.d.ts.map +1 -0
- package/dist/video/assemble/music.js +171 -0
- package/dist/video/assemble/music.js.map +1 -0
- package/dist/video/assemble/narration-fit.d.ts +32 -0
- package/dist/video/assemble/narration-fit.d.ts.map +1 -0
- package/dist/video/assemble/narration-fit.js +59 -0
- package/dist/video/assemble/narration-fit.js.map +1 -0
- package/dist/video/assemble/overlay.d.ts +81 -0
- package/dist/video/assemble/overlay.d.ts.map +1 -0
- package/dist/video/assemble/overlay.js +141 -0
- package/dist/video/assemble/overlay.js.map +1 -0
- package/dist/video/assemble/pdf.d.ts +46 -0
- package/dist/video/assemble/pdf.d.ts.map +1 -0
- package/dist/video/assemble/pdf.js +111 -0
- package/dist/video/assemble/pdf.js.map +1 -0
- package/dist/video/assemble/qa-dialogue-lint.d.ts +56 -0
- package/dist/video/assemble/qa-dialogue-lint.d.ts.map +1 -0
- package/dist/video/assemble/qa-dialogue-lint.js +85 -0
- package/dist/video/assemble/qa-dialogue-lint.js.map +1 -0
- package/dist/video/assemble/qa-image-filter.d.ts +52 -0
- package/dist/video/assemble/qa-image-filter.d.ts.map +1 -0
- package/dist/video/assemble/qa-image-filter.js +102 -0
- package/dist/video/assemble/qa-image-filter.js.map +1 -0
- package/dist/video/assemble/qa-image-vision.d.ts +57 -0
- package/dist/video/assemble/qa-image-vision.d.ts.map +1 -0
- package/dist/video/assemble/qa-image-vision.js +96 -0
- package/dist/video/assemble/qa-image-vision.js.map +1 -0
- package/dist/video/assemble/qa-narration-vision.d.ts +53 -0
- package/dist/video/assemble/qa-narration-vision.d.ts.map +1 -0
- package/dist/video/assemble/qa-narration-vision.js +87 -0
- package/dist/video/assemble/qa-narration-vision.js.map +1 -0
- package/dist/video/assemble/qa-narration.d.ts +53 -0
- package/dist/video/assemble/qa-narration.d.ts.map +1 -0
- package/dist/video/assemble/qa-narration.js +85 -0
- package/dist/video/assemble/qa-narration.js.map +1 -0
- package/dist/video/assemble/stitch-ad.d.ts +88 -0
- package/dist/video/assemble/stitch-ad.d.ts.map +1 -0
- package/dist/video/assemble/stitch-ad.js +161 -0
- package/dist/video/assemble/stitch-ad.js.map +1 -0
- package/dist/video/assemble/stitch.d.ts +341 -0
- package/dist/video/assemble/stitch.d.ts.map +1 -0
- package/dist/video/assemble/stitch.js +607 -0
- package/dist/video/assemble/stitch.js.map +1 -0
- package/dist/video/assemble/text-card.d.ts +78 -0
- package/dist/video/assemble/text-card.d.ts.map +1 -0
- package/dist/video/assemble/text-card.js +210 -0
- package/dist/video/assemble/text-card.js.map +1 -0
- package/dist/video/assemble/title-card.d.ts +39 -0
- package/dist/video/assemble/title-card.d.ts.map +1 -0
- package/dist/video/assemble/title-card.js +127 -0
- package/dist/video/assemble/title-card.js.map +1 -0
- package/dist/video/assemble/transcript.d.ts +66 -0
- package/dist/video/assemble/transcript.d.ts.map +1 -0
- package/dist/video/assemble/transcript.js +200 -0
- package/dist/video/assemble/transcript.js.map +1 -0
- package/dist/video/assemble/tts-elevenlabs.d.ts +52 -0
- package/dist/video/assemble/tts-elevenlabs.d.ts.map +1 -0
- package/dist/video/assemble/tts-elevenlabs.js +118 -0
- package/dist/video/assemble/tts-elevenlabs.js.map +1 -0
- package/dist/video/assemble/tts.d.ts +79 -0
- package/dist/video/assemble/tts.d.ts.map +1 -0
- package/dist/video/assemble/tts.js +131 -0
- package/dist/video/assemble/tts.js.map +1 -0
- package/dist/video/assemble/types.d.ts +43 -0
- package/dist/video/assemble/types.d.ts.map +1 -0
- package/dist/video/assemble/types.js +2 -0
- package/dist/video/assemble/types.js.map +1 -0
- package/dist/video/assemble/upscale.d.ts +43 -0
- package/dist/video/assemble/upscale.d.ts.map +1 -0
- package/dist/video/assemble/upscale.js +52 -0
- package/dist/video/assemble/upscale.js.map +1 -0
- package/dist/video/asset-spec.d.ts +15 -0
- package/dist/video/asset-spec.d.ts.map +1 -0
- package/dist/video/asset-spec.js +43 -0
- package/dist/video/asset-spec.js.map +1 -0
- package/dist/video/asset-tag-lookup.d.ts +31 -0
- package/dist/video/asset-tag-lookup.d.ts.map +1 -0
- package/dist/video/asset-tag-lookup.js +45 -0
- package/dist/video/asset-tag-lookup.js.map +1 -0
- package/dist/video/atomic-write.d.ts +2 -0
- package/dist/video/atomic-write.d.ts.map +1 -0
- package/dist/video/atomic-write.js +7 -0
- package/dist/video/atomic-write.js.map +1 -0
- package/dist/video/audio-platform/native-elevenlabs-sfx.d.ts +29 -0
- package/dist/video/audio-platform/native-elevenlabs-sfx.d.ts.map +1 -0
- package/dist/video/audio-platform/native-elevenlabs-sfx.js +95 -0
- package/dist/video/audio-platform/native-elevenlabs-sfx.js.map +1 -0
- package/dist/video/audio-platform/native-elevenlabs-tts.d.ts +30 -0
- package/dist/video/audio-platform/native-elevenlabs-tts.d.ts.map +1 -0
- package/dist/video/audio-platform/native-elevenlabs-tts.js +95 -0
- package/dist/video/audio-platform/native-elevenlabs-tts.js.map +1 -0
- package/dist/video/audio-platform/native-flowmusic.d.ts +21 -0
- package/dist/video/audio-platform/native-flowmusic.d.ts.map +1 -0
- package/dist/video/audio-platform/native-flowmusic.js +137 -0
- package/dist/video/audio-platform/native-flowmusic.js.map +1 -0
- package/dist/video/audio-platform/native-gemini-tts.d.ts +26 -0
- package/dist/video/audio-platform/native-gemini-tts.d.ts.map +1 -0
- package/dist/video/audio-platform/native-gemini-tts.js +202 -0
- package/dist/video/audio-platform/native-gemini-tts.js.map +1 -0
- package/dist/video/audio-platform/native-lyria.d.ts +35 -0
- package/dist/video/audio-platform/native-lyria.d.ts.map +1 -0
- package/dist/video/audio-platform/native-lyria.js +189 -0
- package/dist/video/audio-platform/native-lyria.js.map +1 -0
- package/dist/video/audio-platform/native-lyria3.d.ts +36 -0
- package/dist/video/audio-platform/native-lyria3.d.ts.map +1 -0
- package/dist/video/audio-platform/native-lyria3.js +210 -0
- package/dist/video/audio-platform/native-lyria3.js.map +1 -0
- package/dist/video/audio-platform/registry.d.ts +82 -0
- package/dist/video/audio-platform/registry.d.ts.map +1 -0
- package/dist/video/audio-platform/registry.js +189 -0
- package/dist/video/audio-platform/registry.js.map +1 -0
- package/dist/video/audio-platform/suno-backend.d.ts +11 -0
- package/dist/video/audio-platform/suno-backend.d.ts.map +1 -0
- package/dist/video/audio-platform/suno-backend.js +33 -0
- package/dist/video/audio-platform/suno-backend.js.map +1 -0
- package/dist/video/audio-platform/types.d.ts +128 -0
- package/dist/video/audio-platform/types.d.ts.map +1 -0
- package/dist/video/audio-platform/types.js +9 -0
- package/dist/video/audio-platform/types.js.map +1 -0
- package/dist/video/batch-queue.d.ts +276 -0
- package/dist/video/batch-queue.d.ts.map +1 -0
- package/dist/video/batch-queue.js +519 -0
- package/dist/video/batch-queue.js.map +1 -0
- package/dist/video/blueprint-prompt.d.ts +37 -0
- package/dist/video/blueprint-prompt.d.ts.map +1 -0
- package/dist/video/blueprint-prompt.js +107 -0
- package/dist/video/blueprint-prompt.js.map +1 -0
- package/dist/video/brand-definition.d.ts +97 -0
- package/dist/video/brand-definition.d.ts.map +1 -0
- package/dist/video/brand-definition.js +206 -0
- package/dist/video/brand-definition.js.map +1 -0
- package/dist/video/brand-dna.d.ts +101 -0
- package/dist/video/brand-dna.d.ts.map +1 -0
- package/dist/video/brand-dna.js +370 -0
- package/dist/video/brand-dna.js.map +1 -0
- package/dist/video/brand-prompt.d.ts +13 -0
- package/dist/video/brand-prompt.d.ts.map +1 -0
- package/dist/video/brand-prompt.js +26 -0
- package/dist/video/brand-prompt.js.map +1 -0
- package/dist/video/candidate-migrate.d.ts +27 -0
- package/dist/video/candidate-migrate.d.ts.map +1 -0
- package/dist/video/candidate-migrate.js +119 -0
- package/dist/video/candidate-migrate.js.map +1 -0
- package/dist/video/category-registry.d.ts +38 -0
- package/dist/video/category-registry.d.ts.map +1 -0
- package/dist/video/category-registry.js +188 -0
- package/dist/video/category-registry.js.map +1 -0
- package/dist/video/chain-fallback.d.ts +39 -0
- package/dist/video/chain-fallback.d.ts.map +1 -0
- package/dist/video/chain-fallback.js +43 -0
- package/dist/video/chain-fallback.js.map +1 -0
- package/dist/video/character-auto-create.d.ts +72 -0
- package/dist/video/character-auto-create.d.ts.map +1 -0
- package/dist/video/character-auto-create.js +392 -0
- package/dist/video/character-auto-create.js.map +1 -0
- package/dist/video/character-consistency.d.ts +3 -0
- package/dist/video/character-consistency.d.ts.map +1 -0
- package/dist/video/character-consistency.js +69 -0
- package/dist/video/character-consistency.js.map +1 -0
- package/dist/video/characters.d.ts +44 -0
- package/dist/video/characters.d.ts.map +1 -0
- package/dist/video/characters.js +96 -0
- package/dist/video/characters.js.map +1 -0
- package/dist/video/checkpoints.d.ts +16 -0
- package/dist/video/checkpoints.d.ts.map +1 -0
- package/dist/video/checkpoints.js +29 -0
- package/dist/video/checkpoints.js.map +1 -0
- package/dist/video/cinema-profile.d.ts +57 -0
- package/dist/video/cinema-profile.d.ts.map +1 -0
- package/dist/video/cinema-profile.js +89 -0
- package/dist/video/cinema-profile.js.map +1 -0
- package/dist/video/cinematography.d.ts +299 -0
- package/dist/video/cinematography.d.ts.map +1 -0
- package/dist/video/cinematography.js +914 -0
- package/dist/video/cinematography.js.map +1 -0
- package/dist/video/cli-output.d.ts +52 -0
- package/dist/video/cli-output.d.ts.map +1 -0
- package/dist/video/cli-output.js +81 -0
- package/dist/video/cli-output.js.map +1 -0
- package/dist/video/cli-schema.d.ts +40 -0
- package/dist/video/cli-schema.d.ts.map +1 -0
- package/dist/video/cli-schema.js +447 -0
- package/dist/video/cli-schema.js.map +1 -0
- package/dist/video/cost-estimate.d.ts +37 -0
- package/dist/video/cost-estimate.d.ts.map +1 -0
- package/dist/video/cost-estimate.js +103 -0
- package/dist/video/cost-estimate.js.map +1 -0
- package/dist/video/csv-export.d.ts +8 -0
- package/dist/video/csv-export.d.ts.map +1 -0
- package/dist/video/csv-export.js +133 -0
- package/dist/video/csv-export.js.map +1 -0
- package/dist/video/dependencies.d.ts +23 -0
- package/dist/video/dependencies.d.ts.map +1 -0
- package/dist/video/dependencies.js +36 -0
- package/dist/video/dependencies.js.map +1 -0
- package/dist/video/dialogue-fit.d.ts +23 -0
- package/dist/video/dialogue-fit.d.ts.map +1 -0
- package/dist/video/dialogue-fit.js +38 -0
- package/dist/video/dialogue-fit.js.map +1 -0
- package/dist/video/dialogue.d.ts +77 -0
- package/dist/video/dialogue.d.ts.map +1 -0
- package/dist/video/dialogue.js +143 -0
- package/dist/video/dialogue.js.map +1 -0
- package/dist/video/director-defaults.d.ts +37 -0
- package/dist/video/director-defaults.d.ts.map +1 -0
- package/dist/video/director-defaults.js +383 -0
- package/dist/video/director-defaults.js.map +1 -0
- package/dist/video/director-preflight.d.ts +53 -0
- package/dist/video/director-preflight.d.ts.map +1 -0
- package/dist/video/director-preflight.js +462 -0
- package/dist/video/director-preflight.js.map +1 -0
- package/dist/video/doctor-portfolio.d.ts +43 -0
- package/dist/video/doctor-portfolio.d.ts.map +1 -0
- package/dist/video/doctor-portfolio.js +137 -0
- package/dist/video/doctor-portfolio.js.map +1 -0
- package/dist/video/doctor.d.ts +13 -0
- package/dist/video/doctor.d.ts.map +1 -0
- package/dist/video/doctor.js +449 -0
- package/dist/video/doctor.js.map +1 -0
- package/dist/video/emotion-cues.d.ts +15 -0
- package/dist/video/emotion-cues.d.ts.map +1 -0
- package/dist/video/emotion-cues.js +37 -0
- package/dist/video/emotion-cues.js.map +1 -0
- package/dist/video/environment-assets.d.ts +28 -0
- package/dist/video/environment-assets.d.ts.map +1 -0
- package/dist/video/environment-assets.js +43 -0
- package/dist/video/environment-assets.js.map +1 -0
- package/dist/video/environment-auto-create.d.ts +20 -0
- package/dist/video/environment-auto-create.d.ts.map +1 -0
- package/dist/video/environment-auto-create.js +88 -0
- package/dist/video/environment-auto-create.js.map +1 -0
- package/dist/video/errors.d.ts +35 -0
- package/dist/video/errors.d.ts.map +1 -0
- package/dist/video/errors.js +117 -0
- package/dist/video/errors.js.map +1 -0
- package/dist/video/events.d.ts +11 -0
- package/dist/video/events.d.ts.map +1 -0
- package/dist/video/events.js +32 -0
- package/dist/video/events.js.map +1 -0
- package/dist/video/execute-autochain.d.ts +65 -0
- package/dist/video/execute-autochain.d.ts.map +1 -0
- package/dist/video/execute-autochain.js +165 -0
- package/dist/video/execute-autochain.js.map +1 -0
- package/dist/video/execute.d.ts +27 -0
- package/dist/video/execute.d.ts.map +1 -0
- package/dist/video/execute.js +477 -0
- package/dist/video/execute.js.map +1 -0
- package/dist/video/execution-cancel.d.ts +11 -0
- package/dist/video/execution-cancel.d.ts.map +1 -0
- package/dist/video/execution-cancel.js +85 -0
- package/dist/video/execution-cancel.js.map +1 -0
- package/dist/video/execution-plan.d.ts +5 -0
- package/dist/video/execution-plan.d.ts.map +1 -0
- package/dist/video/execution-plan.js +145 -0
- package/dist/video/execution-plan.js.map +1 -0
- package/dist/video/execution-profile.d.ts +25 -0
- package/dist/video/execution-profile.d.ts.map +1 -0
- package/dist/video/execution-profile.js +124 -0
- package/dist/video/execution-profile.js.map +1 -0
- package/dist/video/execution-runtime.d.ts +104 -0
- package/dist/video/execution-runtime.d.ts.map +1 -0
- package/dist/video/execution-runtime.js +750 -0
- package/dist/video/execution-runtime.js.map +1 -0
- package/dist/video/execution-seed.d.ts +14 -0
- package/dist/video/execution-seed.d.ts.map +1 -0
- package/dist/video/execution-seed.js +29 -0
- package/dist/video/execution-seed.js.map +1 -0
- package/dist/video/execution-status.d.ts +12 -0
- package/dist/video/execution-status.d.ts.map +1 -0
- package/dist/video/execution-status.js +666 -0
- package/dist/video/execution-status.js.map +1 -0
- package/dist/video/filmmaking-prompts.d.ts +356 -0
- package/dist/video/filmmaking-prompts.d.ts.map +1 -0
- package/dist/video/filmmaking-prompts.js +1212 -0
- package/dist/video/filmmaking-prompts.js.map +1 -0
- package/dist/video/final-media.d.ts +17 -0
- package/dist/video/final-media.d.ts.map +1 -0
- package/dist/video/final-media.js +78 -0
- package/dist/video/final-media.js.map +1 -0
- package/dist/video/finish.d.ts +99 -0
- package/dist/video/finish.d.ts.map +1 -0
- package/dist/video/finish.js +159 -0
- package/dist/video/finish.js.map +1 -0
- package/dist/video/flow-character-library.d.ts +143 -0
- package/dist/video/flow-character-library.d.ts.map +1 -0
- package/dist/video/flow-character-library.js +211 -0
- package/dist/video/flow-character-library.js.map +1 -0
- package/dist/video/flow-markers.d.ts +107 -0
- package/dist/video/flow-markers.d.ts.map +1 -0
- package/dist/video/flow-markers.js +278 -0
- package/dist/video/flow-markers.js.map +1 -0
- package/dist/video/gemini-analyze.d.ts +44 -0
- package/dist/video/gemini-analyze.d.ts.map +1 -0
- package/dist/video/gemini-analyze.js +323 -0
- package/dist/video/gemini-analyze.js.map +1 -0
- package/dist/video/gemini-continuity.d.ts +40 -0
- package/dist/video/gemini-continuity.d.ts.map +1 -0
- package/dist/video/gemini-continuity.js +145 -0
- package/dist/video/gemini-continuity.js.map +1 -0
- package/dist/video/gemini-judge.d.ts +33 -0
- package/dist/video/gemini-judge.d.ts.map +1 -0
- package/dist/video/gemini-judge.js +218 -0
- package/dist/video/gemini-judge.js.map +1 -0
- package/dist/video/gemini-key-pool.d.ts +23 -0
- package/dist/video/gemini-key-pool.d.ts.map +1 -0
- package/dist/video/gemini-key-pool.js +107 -0
- package/dist/video/gemini-key-pool.js.map +1 -0
- package/dist/video/gen-image-flow.d.ts +187 -0
- package/dist/video/gen-image-flow.d.ts.map +1 -0
- package/dist/video/gen-image-flow.js +331 -0
- package/dist/video/gen-image-flow.js.map +1 -0
- package/dist/video/gen-image.d.ts +153 -0
- package/dist/video/gen-image.d.ts.map +1 -0
- package/dist/video/gen-image.js +263 -0
- package/dist/video/gen-image.js.map +1 -0
- package/dist/video/generation-telemetry.d.ts +60 -0
- package/dist/video/generation-telemetry.d.ts.map +1 -0
- package/dist/video/generation-telemetry.js +214 -0
- package/dist/video/generation-telemetry.js.map +1 -0
- package/dist/video/http-error-safety.d.ts +9 -0
- package/dist/video/http-error-safety.d.ts.map +1 -0
- package/dist/video/http-error-safety.js +14 -0
- package/dist/video/http-error-safety.js.map +1 -0
- package/dist/video/image-dimensions.d.ts +7 -0
- package/dist/video/image-dimensions.d.ts.map +1 -0
- package/dist/video/image-dimensions.js +54 -0
- package/dist/video/image-dimensions.js.map +1 -0
- package/dist/video/legacy-import.d.ts +11 -0
- package/dist/video/legacy-import.d.ts.map +1 -0
- package/dist/video/legacy-import.js +181 -0
- package/dist/video/legacy-import.js.map +1 -0
- package/dist/video/library-clean.d.ts +34 -0
- package/dist/video/library-clean.d.ts.map +1 -0
- package/dist/video/library-clean.js +340 -0
- package/dist/video/library-clean.js.map +1 -0
- package/dist/video/lipsync.d.ts +72 -0
- package/dist/video/lipsync.d.ts.map +1 -0
- package/dist/video/lipsync.js +136 -0
- package/dist/video/lipsync.js.map +1 -0
- package/dist/video/media-host.d.ts +41 -0
- package/dist/video/media-host.d.ts.map +1 -0
- package/dist/video/media-host.js +106 -0
- package/dist/video/media-host.js.map +1 -0
- package/dist/video/metrics.d.ts +30 -0
- package/dist/video/metrics.d.ts.map +1 -0
- package/dist/video/metrics.js +81 -0
- package/dist/video/metrics.js.map +1 -0
- package/dist/video/motion-overlay/analyze-reel.d.ts +38 -0
- package/dist/video/motion-overlay/analyze-reel.d.ts.map +1 -0
- package/dist/video/motion-overlay/analyze-reel.js +185 -0
- package/dist/video/motion-overlay/analyze-reel.js.map +1 -0
- package/dist/video/motion-overlay/animate-render.d.ts +63 -0
- package/dist/video/motion-overlay/animate-render.d.ts.map +1 -0
- package/dist/video/motion-overlay/animate-render.js +128 -0
- package/dist/video/motion-overlay/animate-render.js.map +1 -0
- package/dist/video/motion-overlay/animate.d.ts +37 -0
- package/dist/video/motion-overlay/animate.d.ts.map +1 -0
- package/dist/video/motion-overlay/animate.js +97 -0
- package/dist/video/motion-overlay/animate.js.map +1 -0
- package/dist/video/motion-overlay/avatar-host-transport.d.ts +161 -0
- package/dist/video/motion-overlay/avatar-host-transport.d.ts.map +1 -0
- package/dist/video/motion-overlay/avatar-host-transport.js +325 -0
- package/dist/video/motion-overlay/avatar-host-transport.js.map +1 -0
- package/dist/video/motion-overlay/avatar-host.d.ts +131 -0
- package/dist/video/motion-overlay/avatar-host.d.ts.map +1 -0
- package/dist/video/motion-overlay/avatar-host.js +131 -0
- package/dist/video/motion-overlay/avatar-host.js.map +1 -0
- package/dist/video/motion-overlay/compose-prompt.d.ts +48 -0
- package/dist/video/motion-overlay/compose-prompt.d.ts.map +1 -0
- package/dist/video/motion-overlay/compose-prompt.js +217 -0
- package/dist/video/motion-overlay/compose-prompt.js.map +1 -0
- package/dist/video/motion-overlay/execute.d.ts +190 -0
- package/dist/video/motion-overlay/execute.d.ts.map +1 -0
- package/dist/video/motion-overlay/execute.js +205 -0
- package/dist/video/motion-overlay/execute.js.map +1 -0
- package/dist/video/motion-overlay/flow-pack.d.ts +65 -0
- package/dist/video/motion-overlay/flow-pack.d.ts.map +1 -0
- package/dist/video/motion-overlay/flow-pack.js +178 -0
- package/dist/video/motion-overlay/flow-pack.js.map +1 -0
- package/dist/video/motion-overlay/ingest.d.ts +74 -0
- package/dist/video/motion-overlay/ingest.d.ts.map +1 -0
- package/dist/video/motion-overlay/ingest.js +172 -0
- package/dist/video/motion-overlay/ingest.js.map +1 -0
- package/dist/video/motion-overlay/motifs.d.ts +63 -0
- package/dist/video/motion-overlay/motifs.d.ts.map +1 -0
- package/dist/video/motion-overlay/motifs.js +192 -0
- package/dist/video/motion-overlay/motifs.js.map +1 -0
- package/dist/video/motion-overlay/motion-style.d.ts +56 -0
- package/dist/video/motion-overlay/motion-style.d.ts.map +1 -0
- package/dist/video/motion-overlay/motion-style.js +130 -0
- package/dist/video/motion-overlay/motion-style.js.map +1 -0
- package/dist/video/motion-overlay/plan.d.ts +49 -0
- package/dist/video/motion-overlay/plan.d.ts.map +1 -0
- package/dist/video/motion-overlay/plan.js +79 -0
- package/dist/video/motion-overlay/plan.js.map +1 -0
- package/dist/video/motion-overlay/preview.d.ts +36 -0
- package/dist/video/motion-overlay/preview.d.ts.map +1 -0
- package/dist/video/motion-overlay/preview.js +169 -0
- package/dist/video/motion-overlay/preview.js.map +1 -0
- package/dist/video/motion-overlay/render-local.d.ts +118 -0
- package/dist/video/motion-overlay/render-local.d.ts.map +1 -0
- package/dist/video/motion-overlay/render-local.js +298 -0
- package/dist/video/motion-overlay/render-local.js.map +1 -0
- package/dist/video/motion-overlay/run.d.ts +58 -0
- package/dist/video/motion-overlay/run.d.ts.map +1 -0
- package/dist/video/motion-overlay/run.js +147 -0
- package/dist/video/motion-overlay/run.js.map +1 -0
- package/dist/video/motion-overlay/slice.d.ts +29 -0
- package/dist/video/motion-overlay/slice.d.ts.map +1 -0
- package/dist/video/motion-overlay/slice.js +88 -0
- package/dist/video/motion-overlay/slice.js.map +1 -0
- package/dist/video/motion-overlay/transcribe.d.ts +49 -0
- package/dist/video/motion-overlay/transcribe.d.ts.map +1 -0
- package/dist/video/motion-overlay/transcribe.js +180 -0
- package/dist/video/motion-overlay/transcribe.js.map +1 -0
- package/dist/video/motion-overlay/types.d.ts +82 -0
- package/dist/video/motion-overlay/types.d.ts.map +1 -0
- package/dist/video/motion-overlay/types.js +12 -0
- package/dist/video/motion-overlay/types.js.map +1 -0
- package/dist/video/motion-overlay/v2v-transport.d.ts +37 -0
- package/dist/video/motion-overlay/v2v-transport.d.ts.map +1 -0
- package/dist/video/motion-overlay/v2v-transport.js +178 -0
- package/dist/video/motion-overlay/v2v-transport.js.map +1 -0
- package/dist/video/motion-overlay/write.d.ts +40 -0
- package/dist/video/motion-overlay/write.d.ts.map +1 -0
- package/dist/video/motion-overlay/write.js +113 -0
- package/dist/video/motion-overlay/write.js.map +1 -0
- package/dist/video/multi-shot-artifact.d.ts +19 -0
- package/dist/video/multi-shot-artifact.d.ts.map +1 -0
- package/dist/video/multi-shot-artifact.js +44 -0
- package/dist/video/multi-shot-artifact.js.map +1 -0
- package/dist/video/multi-shot-prompt.d.ts +99 -0
- package/dist/video/multi-shot-prompt.d.ts.map +1 -0
- package/dist/video/multi-shot-prompt.js +466 -0
- package/dist/video/multi-shot-prompt.js.map +1 -0
- package/dist/video/music-video.d.ts +110 -0
- package/dist/video/music-video.d.ts.map +1 -0
- package/dist/video/music-video.js +190 -0
- package/dist/video/music-video.js.map +1 -0
- package/dist/video/narrate.d.ts +58 -0
- package/dist/video/narrate.d.ts.map +1 -0
- package/dist/video/narrate.js +145 -0
- package/dist/video/narrate.js.map +1 -0
- package/dist/video/native-dreamina.d.ts +35 -0
- package/dist/video/native-dreamina.d.ts.map +1 -0
- package/dist/video/native-dreamina.js +532 -0
- package/dist/video/native-dreamina.js.map +1 -0
- package/dist/video/native-flow-r2v.d.ts +113 -0
- package/dist/video/native-flow-r2v.d.ts.map +1 -0
- package/dist/video/native-flow-r2v.js +223 -0
- package/dist/video/native-flow-r2v.js.map +1 -0
- package/dist/video/native-runway.d.ts +41 -0
- package/dist/video/native-runway.d.ts.map +1 -0
- package/dist/video/native-runway.js +523 -0
- package/dist/video/native-runway.js.map +1 -0
- package/dist/video/native-seedance.d.ts +74 -0
- package/dist/video/native-seedance.d.ts.map +1 -0
- package/dist/video/native-seedance.js +461 -0
- package/dist/video/native-seedance.js.map +1 -0
- package/dist/video/native-veo.d.ts +20 -0
- package/dist/video/native-veo.d.ts.map +1 -0
- package/dist/video/native-veo.js +390 -0
- package/dist/video/native-veo.js.map +1 -0
- package/dist/video/next-actions.d.ts +27 -0
- package/dist/video/next-actions.d.ts.map +1 -0
- package/dist/video/next-actions.js +201 -0
- package/dist/video/next-actions.js.map +1 -0
- package/dist/video/obsidian-export.d.ts +12 -0
- package/dist/video/obsidian-export.d.ts.map +1 -0
- package/dist/video/obsidian-export.js +285 -0
- package/dist/video/obsidian-export.js.map +1 -0
- package/dist/video/obsidian-sync.d.ts +13 -0
- package/dist/video/obsidian-sync.d.ts.map +1 -0
- package/dist/video/obsidian-sync.js +479 -0
- package/dist/video/obsidian-sync.js.map +1 -0
- package/dist/video/obsidian-vault.d.ts +8 -0
- package/dist/video/obsidian-vault.d.ts.map +1 -0
- package/dist/video/obsidian-vault.js +81 -0
- package/dist/video/obsidian-vault.js.map +1 -0
- package/dist/video/outfit-prompts.d.ts +10 -0
- package/dist/video/outfit-prompts.d.ts.map +1 -0
- package/dist/video/outfit-prompts.js +14 -0
- package/dist/video/outfit-prompts.js.map +1 -0
- package/dist/video/outpaint-keyframe.d.ts +95 -0
- package/dist/video/outpaint-keyframe.d.ts.map +1 -0
- package/dist/video/outpaint-keyframe.js +244 -0
- package/dist/video/outpaint-keyframe.js.map +1 -0
- package/dist/video/pipeline-manifest.d.ts +4 -0
- package/dist/video/pipeline-manifest.d.ts.map +1 -0
- package/dist/video/pipeline-manifest.js +13 -0
- package/dist/video/pipeline-manifest.js.map +1 -0
- package/dist/video/pipeline-manifests/director.json +46 -0
- package/dist/video/pipeline-manifests/storyboard.json +46 -0
- package/dist/video/platform-specs.d.ts +26 -0
- package/dist/video/platform-specs.d.ts.map +1 -0
- package/dist/video/platform-specs.js +34 -0
- package/dist/video/platform-specs.js.map +1 -0
- package/dist/video/playbooks.d.ts +11 -0
- package/dist/video/playbooks.d.ts.map +1 -0
- package/dist/video/playbooks.js +22 -0
- package/dist/video/playbooks.js.map +1 -0
- package/dist/video/post-production.d.ts +57 -0
- package/dist/video/post-production.d.ts.map +1 -0
- package/dist/video/post-production.js +210 -0
- package/dist/video/post-production.js.map +1 -0
- package/dist/video/preview-portal/audit.d.ts +4 -0
- package/dist/video/preview-portal/audit.d.ts.map +1 -0
- package/dist/video/preview-portal/audit.js +16 -0
- package/dist/video/preview-portal/audit.js.map +1 -0
- package/dist/video/preview-portal/discovery.d.ts +23 -0
- package/dist/video/preview-portal/discovery.d.ts.map +1 -0
- package/dist/video/preview-portal/discovery.js +733 -0
- package/dist/video/preview-portal/discovery.js.map +1 -0
- package/dist/video/preview-portal/generate.d.ts +42 -0
- package/dist/video/preview-portal/generate.d.ts.map +1 -0
- package/dist/video/preview-portal/generate.js +101 -0
- package/dist/video/preview-portal/generate.js.map +1 -0
- package/dist/video/preview-portal/index.d.ts +12 -0
- package/dist/video/preview-portal/index.d.ts.map +1 -0
- package/dist/video/preview-portal/index.js +8 -0
- package/dist/video/preview-portal/index.js.map +1 -0
- package/dist/video/preview-portal/publish.d.ts +48 -0
- package/dist/video/preview-portal/publish.d.ts.map +1 -0
- package/dist/video/preview-portal/publish.js +169 -0
- package/dist/video/preview-portal/publish.js.map +1 -0
- package/dist/video/preview-portal/render.d.ts +4 -0
- package/dist/video/preview-portal/render.d.ts.map +1 -0
- package/dist/video/preview-portal/render.js +822 -0
- package/dist/video/preview-portal/render.js.map +1 -0
- package/dist/video/preview-portal/shared-assets.d.ts +6 -0
- package/dist/video/preview-portal/shared-assets.d.ts.map +1 -0
- package/dist/video/preview-portal/shared-assets.js +452 -0
- package/dist/video/preview-portal/shared-assets.js.map +1 -0
- package/dist/video/preview-portal/templates.d.ts +4 -0
- package/dist/video/preview-portal/templates.d.ts.map +1 -0
- package/dist/video/preview-portal/templates.js +109 -0
- package/dist/video/preview-portal/templates.js.map +1 -0
- package/dist/video/preview-portal/types.d.ts +246 -0
- package/dist/video/preview-portal/types.d.ts.map +1 -0
- package/dist/video/preview-portal/types.js +28 -0
- package/dist/video/preview-portal/types.js.map +1 -0
- package/dist/video/product-references.d.ts +21 -0
- package/dist/video/product-references.d.ts.map +1 -0
- package/dist/video/product-references.js +25 -0
- package/dist/video/product-references.js.map +1 -0
- package/dist/video/project-blueprint.d.ts +178 -0
- package/dist/video/project-blueprint.d.ts.map +1 -0
- package/dist/video/project-blueprint.js +286 -0
- package/dist/video/project-blueprint.js.map +1 -0
- package/dist/video/project-index.d.ts +82 -0
- package/dist/video/project-index.d.ts.map +1 -0
- package/dist/video/project-index.js +89 -0
- package/dist/video/project-index.js.map +1 -0
- package/dist/video/projects.d.ts +3 -0
- package/dist/video/projects.d.ts.map +1 -0
- package/dist/video/projects.js +18 -0
- package/dist/video/projects.js.map +1 -0
- package/dist/video/prompt-guidance.d.ts +14 -0
- package/dist/video/prompt-guidance.d.ts.map +1 -0
- package/dist/video/prompt-guidance.js +44 -0
- package/dist/video/prompt-guidance.js.map +1 -0
- package/dist/video/prompt-library.d.ts +11 -0
- package/dist/video/prompt-library.d.ts.map +1 -0
- package/dist/video/prompt-library.js +85 -0
- package/dist/video/prompt-library.js.map +1 -0
- package/dist/video/prompt-lint.d.ts +146 -0
- package/dist/video/prompt-lint.d.ts.map +1 -0
- package/dist/video/prompt-lint.js +433 -0
- package/dist/video/prompt-lint.js.map +1 -0
- package/dist/video/prompt-quality.d.ts +29 -0
- package/dist/video/prompt-quality.d.ts.map +1 -0
- package/dist/video/prompt-quality.js +532 -0
- package/dist/video/prompt-quality.js.map +1 -0
- package/dist/video/prompt-rules.d.ts +94 -0
- package/dist/video/prompt-rules.d.ts.map +1 -0
- package/dist/video/prompt-rules.js +169 -0
- package/dist/video/prompt-rules.js.map +1 -0
- package/dist/video/provider-adapter-runner.d.ts +5 -0
- package/dist/video/provider-adapter-runner.d.ts.map +1 -0
- package/dist/video/provider-adapter-runner.js +92 -0
- package/dist/video/provider-adapter-runner.js.map +1 -0
- package/dist/video/provider-platform/index.d.ts +6 -0
- package/dist/video/provider-platform/index.d.ts.map +1 -0
- package/dist/video/provider-platform/index.js +6 -0
- package/dist/video/provider-platform/index.js.map +1 -0
- package/dist/video/provider-platform/registry.d.ts +5 -0
- package/dist/video/provider-platform/registry.d.ts.map +1 -0
- package/dist/video/provider-platform/registry.js +279 -0
- package/dist/video/provider-platform/registry.js.map +1 -0
- package/dist/video/provider-platform/route-capabilities.d.ts +133 -0
- package/dist/video/provider-platform/route-capabilities.d.ts.map +1 -0
- package/dist/video/provider-platform/route-capabilities.js +192 -0
- package/dist/video/provider-platform/route-capabilities.js.map +1 -0
- package/dist/video/provider-platform/router.d.ts +7 -0
- package/dist/video/provider-platform/router.d.ts.map +1 -0
- package/dist/video/provider-platform/router.js +150 -0
- package/dist/video/provider-platform/router.js.map +1 -0
- package/dist/video/provider-platform/security.d.ts +8 -0
- package/dist/video/provider-platform/security.d.ts.map +1 -0
- package/dist/video/provider-platform/security.js +21 -0
- package/dist/video/provider-platform/security.js.map +1 -0
- package/dist/video/provider-platform/telemetry.d.ts +24 -0
- package/dist/video/provider-platform/telemetry.d.ts.map +1 -0
- package/dist/video/provider-platform/telemetry.js +88 -0
- package/dist/video/provider-platform/telemetry.js.map +1 -0
- package/dist/video/provider-platform/types.d.ts +139 -0
- package/dist/video/provider-platform/types.d.ts.map +1 -0
- package/dist/video/provider-platform/types.js +17 -0
- package/dist/video/provider-platform/types.js.map +1 -0
- package/dist/video/provider-status.d.ts +12 -0
- package/dist/video/provider-status.d.ts.map +1 -0
- package/dist/video/provider-status.js +169 -0
- package/dist/video/provider-status.js.map +1 -0
- package/dist/video/providers/dreamina-useapi.d.ts +170 -0
- package/dist/video/providers/dreamina-useapi.d.ts.map +1 -0
- package/dist/video/providers/dreamina-useapi.js +176 -0
- package/dist/video/providers/dreamina-useapi.js.map +1 -0
- package/dist/video/providers/flowmusic-useapi.d.ts +114 -0
- package/dist/video/providers/flowmusic-useapi.d.ts.map +1 -0
- package/dist/video/providers/flowmusic-useapi.js +159 -0
- package/dist/video/providers/flowmusic-useapi.js.map +1 -0
- package/dist/video/providers/google-flow.d.ts +57 -0
- package/dist/video/providers/google-flow.d.ts.map +1 -0
- package/dist/video/providers/google-flow.js +63 -0
- package/dist/video/providers/google-flow.js.map +1 -0
- package/dist/video/providers/public-host.d.ts +40 -0
- package/dist/video/providers/public-host.d.ts.map +1 -0
- package/dist/video/providers/public-host.js +91 -0
- package/dist/video/providers/public-host.js.map +1 -0
- package/dist/video/providers/runway-useapi.d.ts +159 -0
- package/dist/video/providers/runway-useapi.d.ts.map +1 -0
- package/dist/video/providers/runway-useapi.js +200 -0
- package/dist/video/providers/runway-useapi.js.map +1 -0
- package/dist/video/providers/xskill.d.ts +108 -0
- package/dist/video/providers/xskill.d.ts.map +1 -0
- package/dist/video/providers/xskill.js +233 -0
- package/dist/video/providers/xskill.js.map +1 -0
- package/dist/video/readiness.d.ts +18 -0
- package/dist/video/readiness.d.ts.map +1 -0
- package/dist/video/readiness.js +221 -0
- package/dist/video/readiness.js.map +1 -0
- package/dist/video/reference-sheet-store.d.ts +5 -0
- package/dist/video/reference-sheet-store.d.ts.map +1 -0
- package/dist/video/reference-sheet-store.js +28 -0
- package/dist/video/reference-sheet-store.js.map +1 -0
- package/dist/video/reference-sheets.d.ts +40 -0
- package/dist/video/reference-sheets.d.ts.map +1 -0
- package/dist/video/reference-sheets.js +160 -0
- package/dist/video/reference-sheets.js.map +1 -0
- package/dist/video/remix-narrated.d.ts +12 -0
- package/dist/video/remix-narrated.d.ts.map +1 -0
- package/dist/video/remix-narrated.js +73 -0
- package/dist/video/remix-narrated.js.map +1 -0
- package/dist/video/report-diff.d.ts +89 -0
- package/dist/video/report-diff.d.ts.map +1 -0
- package/dist/video/report-diff.js +176 -0
- package/dist/video/report-diff.js.map +1 -0
- package/dist/video/report-history.d.ts +40 -0
- package/dist/video/report-history.d.ts.map +1 -0
- package/dist/video/report-history.js +74 -0
- package/dist/video/report-history.js.map +1 -0
- package/dist/video/report.d.ts +15 -0
- package/dist/video/report.d.ts.map +1 -0
- package/dist/video/report.js +21 -0
- package/dist/video/report.js.map +1 -0
- package/dist/video/review-ui.d.ts +180 -0
- package/dist/video/review-ui.d.ts.map +1 -0
- package/dist/video/review-ui.js +2008 -0
- package/dist/video/review-ui.js.map +1 -0
- package/dist/video/scene-candidate-store.d.ts +12 -0
- package/dist/video/scene-candidate-store.d.ts.map +1 -0
- package/dist/video/scene-candidate-store.js +134 -0
- package/dist/video/scene-candidate-store.js.map +1 -0
- package/dist/video/scene-candidates.d.ts +57 -0
- package/dist/video/scene-candidates.d.ts.map +1 -0
- package/dist/video/scene-candidates.js +149 -0
- package/dist/video/scene-candidates.js.map +1 -0
- package/dist/video/scene-selection-store.d.ts +5 -0
- package/dist/video/scene-selection-store.d.ts.map +1 -0
- package/dist/video/scene-selection-store.js +22 -0
- package/dist/video/scene-selection-store.js.map +1 -0
- package/dist/video/scene-selection.d.ts +83 -0
- package/dist/video/scene-selection.d.ts.map +1 -0
- package/dist/video/scene-selection.js +225 -0
- package/dist/video/scene-selection.js.map +1 -0
- package/dist/video/scheduling.d.ts +3 -0
- package/dist/video/scheduling.d.ts.map +1 -0
- package/dist/video/scheduling.js +16 -0
- package/dist/video/scheduling.js.map +1 -0
- package/dist/video/scorecard.d.ts +12 -0
- package/dist/video/scorecard.d.ts.map +1 -0
- package/dist/video/scorecard.js +68 -0
- package/dist/video/scorecard.js.map +1 -0
- package/dist/video/seedance-asset-library.d.ts +82 -0
- package/dist/video/seedance-asset-library.d.ts.map +1 -0
- package/dist/video/seedance-asset-library.js +146 -0
- package/dist/video/seedance-asset-library.js.map +1 -0
- package/dist/video/seedance-blocks.d.ts +56 -0
- package/dist/video/seedance-blocks.d.ts.map +1 -0
- package/dist/video/seedance-blocks.js +97 -0
- package/dist/video/seedance-blocks.js.map +1 -0
- package/dist/video/seedance-chain-host.d.ts +42 -0
- package/dist/video/seedance-chain-host.d.ts.map +1 -0
- package/dist/video/seedance-chain-host.js +128 -0
- package/dist/video/seedance-chain-host.js.map +1 -0
- package/dist/video/seedance-content-filter.d.ts +80 -0
- package/dist/video/seedance-content-filter.d.ts.map +1 -0
- package/dist/video/seedance-content-filter.js +293 -0
- package/dist/video/seedance-content-filter.js.map +1 -0
- package/dist/video/seedance-skill-loader.d.ts +40 -0
- package/dist/video/seedance-skill-loader.d.ts.map +1 -0
- package/dist/video/seedance-skill-loader.js +53 -0
- package/dist/video/seedance-skill-loader.js.map +1 -0
- package/dist/video/sfx.d.ts +49 -0
- package/dist/video/sfx.d.ts.map +1 -0
- package/dist/video/sfx.js +104 -0
- package/dist/video/sfx.js.map +1 -0
- package/dist/video/shot-grammar.d.ts +103 -0
- package/dist/video/shot-grammar.d.ts.map +1 -0
- package/dist/video/shot-grammar.js +286 -0
- package/dist/video/shot-grammar.js.map +1 -0
- package/dist/video/show-bible.d.ts +113 -0
- package/dist/video/show-bible.d.ts.map +1 -0
- package/dist/video/show-bible.js +140 -0
- package/dist/video/show-bible.js.map +1 -0
- package/dist/video/soundtrack.d.ts +72 -0
- package/dist/video/soundtrack.d.ts.map +1 -0
- package/dist/video/soundtrack.js +171 -0
- package/dist/video/soundtrack.js.map +1 -0
- package/dist/video/stage-guards.d.ts +4 -0
- package/dist/video/stage-guards.d.ts.map +1 -0
- package/dist/video/stage-guards.js +94 -0
- package/dist/video/stage-guards.js.map +1 -0
- package/dist/video/status.d.ts +69 -0
- package/dist/video/status.d.ts.map +1 -0
- package/dist/video/status.js +245 -0
- package/dist/video/status.js.map +1 -0
- package/dist/video/story-bible.d.ts +70 -0
- package/dist/video/story-bible.d.ts.map +1 -0
- package/dist/video/story-bible.js +181 -0
- package/dist/video/story-bible.js.map +1 -0
- package/dist/video/storyboard-grid.d.ts +28 -0
- package/dist/video/storyboard-grid.d.ts.map +1 -0
- package/dist/video/storyboard-grid.js +231 -0
- package/dist/video/storyboard-grid.js.map +1 -0
- package/dist/video/storyboard-markdown.d.ts +62 -0
- package/dist/video/storyboard-markdown.d.ts.map +1 -0
- package/dist/video/storyboard-markdown.js +332 -0
- package/dist/video/storyboard-markdown.js.map +1 -0
- package/dist/video/storyboard-still-candidates.d.ts +31 -0
- package/dist/video/storyboard-still-candidates.d.ts.map +1 -0
- package/dist/video/storyboard-still-candidates.js +57 -0
- package/dist/video/storyboard-still-candidates.js.map +1 -0
- package/dist/video/storyboard-templates.d.ts +28 -0
- package/dist/video/storyboard-templates.d.ts.map +1 -0
- package/dist/video/storyboard-templates.js +215 -0
- package/dist/video/storyboard-templates.js.map +1 -0
- package/dist/video/studio/execute.d.ts +142 -0
- package/dist/video/studio/execute.d.ts.map +1 -0
- package/dist/video/studio/execute.js +270 -0
- package/dist/video/studio/execute.js.map +1 -0
- package/dist/video/studio/planner.d.ts +3 -0
- package/dist/video/studio/planner.d.ts.map +1 -0
- package/dist/video/studio/planner.js +110 -0
- package/dist/video/studio/planner.js.map +1 -0
- package/dist/video/studio/project-context.d.ts +4 -0
- package/dist/video/studio/project-context.d.ts.map +1 -0
- package/dist/video/studio/project-context.js +20 -0
- package/dist/video/studio/project-context.js.map +1 -0
- package/dist/video/studio/recipes.d.ts +4 -0
- package/dist/video/studio/recipes.d.ts.map +1 -0
- package/dist/video/studio/recipes.js +343 -0
- package/dist/video/studio/recipes.js.map +1 -0
- package/dist/video/studio/session.d.ts +8 -0
- package/dist/video/studio/session.d.ts.map +1 -0
- package/dist/video/studio/session.js +17 -0
- package/dist/video/studio/session.js.map +1 -0
- package/dist/video/studio/types.d.ts +59 -0
- package/dist/video/studio/types.d.ts.map +1 -0
- package/dist/video/studio/types.js +2 -0
- package/dist/video/studio/types.js.map +1 -0
- package/dist/video/template-store.d.ts +65 -0
- package/dist/video/template-store.d.ts.map +1 -0
- package/dist/video/template-store.js +168 -0
- package/dist/video/template-store.js.map +1 -0
- package/dist/video/timeline.d.ts +8 -0
- package/dist/video/timeline.d.ts.map +1 -0
- package/dist/video/timeline.js +21 -0
- package/dist/video/timeline.js.map +1 -0
- package/dist/video/title-overlay.d.ts +85 -0
- package/dist/video/title-overlay.d.ts.map +1 -0
- package/dist/video/title-overlay.js +163 -0
- package/dist/video/title-overlay.js.map +1 -0
- package/dist/video/types.d.ts +403 -0
- package/dist/video/types.d.ts.map +1 -0
- package/dist/video/types.js +2 -0
- package/dist/video/types.js.map +1 -0
- package/dist/video/veo-subprocess.d.ts +27 -0
- package/dist/video/veo-subprocess.d.ts.map +1 -0
- package/dist/video/veo-subprocess.js +52 -0
- package/dist/video/veo-subprocess.js.map +1 -0
- package/dist/video/verify-env.d.ts +43 -0
- package/dist/video/verify-env.d.ts.map +1 -0
- package/dist/video/verify-env.js +156 -0
- package/dist/video/verify-env.js.map +1 -0
- package/dist/video/verify-final.d.ts +20 -0
- package/dist/video/verify-final.d.ts.map +1 -0
- package/dist/video/verify-final.js +39 -0
- package/dist/video/verify-final.js.map +1 -0
- package/dist/video/video-context.d.ts +10 -0
- package/dist/video/video-context.d.ts.map +1 -0
- package/dist/video/video-context.js +74 -0
- package/dist/video/video-context.js.map +1 -0
- package/dist/video/vocal-map.d.ts +55 -0
- package/dist/video/vocal-map.d.ts.map +1 -0
- package/dist/video/vocal-map.js +107 -0
- package/dist/video/vocal-map.js.map +1 -0
- package/dist/video/vocal-sync-plan.d.ts +76 -0
- package/dist/video/vocal-sync-plan.d.ts.map +1 -0
- package/dist/video/vocal-sync-plan.js +166 -0
- package/dist/video/vocal-sync-plan.js.map +1 -0
- package/dist/video/voice-clone.d.ts +152 -0
- package/dist/video/voice-clone.d.ts.map +1 -0
- package/dist/video/voice-clone.js +267 -0
- package/dist/video/voice-clone.js.map +1 -0
- package/dist/video/with-retry.d.ts +67 -0
- package/dist/video/with-retry.d.ts.map +1 -0
- package/dist/video/with-retry.js +105 -0
- package/dist/video/with-retry.js.map +1 -0
- package/dist/video/workload.d.ts +20 -0
- package/dist/video/workload.d.ts.map +1 -0
- package/dist/video/workload.js +55 -0
- package/dist/video/workload.js.map +1 -0
- package/dist/video/workspace.d.ts +109 -0
- package/dist/video/workspace.d.ts.map +1 -0
- package/dist/video/workspace.js +132 -0
- package/dist/video/workspace.js.map +1 -0
- package/docs/AGENT_INTEGRATION_RESEARCH.md +123 -0
- package/docs/AI_FILMMAKING_PROMPTS.md +195 -0
- package/docs/ARCHITECTURE.md +257 -0
- package/docs/ASSEMBLE.md +376 -0
- package/docs/BRAND_AGENCY.md +63 -0
- package/docs/CLAWBOT_COVERAGE_PROMPT.md +78 -0
- package/docs/CLI_REFERENCE.md +2638 -0
- package/docs/CONCIERGE_PROMPT.md +139 -0
- package/docs/Claude Code + Higgsfield MCP = FULL Creative Agency.md +179 -0
- package/docs/DEMO_RECORDING.md +61 -0
- package/docs/DEPRECATION.md +79 -0
- package/docs/DIAGRAMS_SOURCE.md +347 -0
- package/docs/DIRECTOR_BLUEPRINT.md +94 -0
- package/docs/GENERATION_TELEMETRY.md +81 -0
- package/docs/IMPROVE_PROMPT.md +76 -0
- package/docs/INFOGRAPHICS_PROMPT.md +83 -0
- package/docs/MASTER_PLAN_ALIGNMENT.md +563 -0
- package/docs/MIGRATION.md +213 -0
- package/docs/MOTION_OVERLAY.md +355 -0
- package/docs/OBSIDIAN.md +300 -0
- package/docs/OPERATIONS.md +142 -0
- package/docs/OPERATOR_HANDOFF.md +108 -0
- package/docs/PRODUCTION_WORKFLOW.md +148 -0
- package/docs/PROJECT_LAYOUT.md +262 -0
- package/docs/PROMPT_QUALITY.md +214 -0
- package/docs/PROVIDER_PLATFORM.md +195 -0
- package/docs/PUBLISHING.md +175 -0
- package/docs/PYTHON_PIPELINE.md +139 -0
- package/docs/REFERENCE_SHEETS.md +469 -0
- package/docs/REFERENCE_VIDEO_SEEDANCE_MOTION_DESIGN_WORKFLOW.md +465 -0
- package/docs/RELEASE_READINESS.md +573 -0
- package/docs/REVIEW_UI_STORYBOARD_WORKFLOW.md +200 -0
- package/docs/SCENE_CANDIDATES.md +518 -0
- package/docs/SKILLS.md +477 -0
- package/docs/SKILL_COHESION_PROMPT.md +88 -0
- package/docs/STORY_BIBLE.md +288 -0
- package/docs/STUDIO.md +96 -0
- package/docs/TEMPLATES.md +143 -0
- package/docs/UNIFICATION_AUDIT.md +321 -0
- package/docs/UPDATE_DOCS_PROMPT.md +78 -0
- package/docs/assets/demo-quickstart.cast +13 -0
- package/docs/assets/demo-quickstart.gif +0 -0
- package/docs/assets/diagram-architecture.jpg +0 -0
- package/docs/assets/diagram-assemble.jpg +0 -0
- package/docs/assets/diagram-lifecycle.jpg +0 -0
- package/docs/assets/diagram-obsidian-loop.jpg +0 -0
- package/docs/assets/diagram-obsidian-vault.jpg +0 -0
- package/docs/assets/diagram-routing.jpg +0 -0
- package/docs/assets/diagram-skills-ecosystem.jpg +0 -0
- package/docs/assets/diagram-story-bible.jpg +0 -0
- package/docs/assets/diagram-studio-goals.jpg +0 -0
- package/docs/assets/docsite-preview.png +0 -0
- package/docs/assets/logo.jpg +0 -0
- package/docs/assets/logo.png +0 -0
- package/docs/preview-portal-audit.md +151 -0
- package/package.json +119 -0
- package/playbooks/seedance-ugc.json +32 -0
- package/playbooks/veo-generic.json +26 -0
- package/references/video/.fixtures/multi-shot-runway-10s.txt +9 -0
- package/references/video/.fixtures/multi-shot-seedance-10s.txt +9 -0
- package/references/video/.fixtures/multi-shot-valid.txt +13 -0
- package/references/video/.fixtures/multi-shot-veo-8s.txt +9 -0
- package/references/video/ai-director-blueprint.md +614 -0
- package/references/video/camera-bible.md +294 -0
- package/references/video/character-reference-sheet.md +14 -0
- package/references/video/checkpoint-protocol.md +26 -0
- package/references/video/clone-ad-template-workflow.md +14 -0
- package/references/video/dialogue-duration-preflight.md +17 -0
- package/references/video/generation-telemetry.md +18 -0
- package/references/video/multi-shot-framework.md +455 -0
- package/references/video/seedance-skills/01-cinematic.md +1329 -0
- package/references/video/seedance-skills/02-3d-cgi.md +884 -0
- package/references/video/seedance-skills/03-cartoon.md +1668 -0
- package/references/video/seedance-skills/04-comic-to-video.md +1810 -0
- package/references/video/seedance-skills/05-fight-scenes.md +741 -0
- package/references/video/seedance-skills/06-motion-design-ad.md +1145 -0
- package/references/video/seedance-skills/07-ecommerce-ad.md +928 -0
- package/references/video/seedance-skills/08-anime-action.md +1145 -0
- package/references/video/seedance-skills/09-product-360.md +988 -0
- package/references/video/seedance-skills/10-music-video.md +1662 -0
- package/references/video/seedance-skills/11-social-hook.md +1874 -0
- package/references/video/seedance-skills/12-brand-story.md +1151 -0
- package/references/video/seedance-skills/13-fashion-lookbook.md +1236 -0
- package/references/video/seedance-skills/14-food-beverage.md +1110 -0
- package/references/video/seedance-skills/15-real-estate.md +2344 -0
- package/references/video/seedance-transport-payloads.md +144 -0
- package/references/video/seedance-ugc-formulas.md +104 -0
- package/references/video/stage-directors.md +47 -0
- package/references/video/style-template-schema.md +40 -0
- package/references/video/veo-prompting-guide.md +42 -0
- package/schemas/video/artifacts/analyze-output.schema.json +60 -0
- package/schemas/video/artifacts/assemble-report.schema.json +116 -0
- package/schemas/video/artifacts/asset-manifest.schema.json +23 -0
- package/schemas/video/artifacts/batch-queue-manifest.schema.json +59 -0
- package/schemas/video/artifacts/brand-definition.schema.json +93 -0
- package/schemas/video/artifacts/brand-dna.schema.json +55 -0
- package/schemas/video/artifacts/brief.schema.json +13 -0
- package/schemas/video/artifacts/clone-plan.schema.json +44 -0
- package/schemas/video/artifacts/dialogue.schema.json +52 -0
- package/schemas/video/artifacts/environment-assets.schema.json +30 -0
- package/schemas/video/artifacts/execution-plan.schema.json +64 -0
- package/schemas/video/artifacts/execution-report.schema.json +37 -0
- package/schemas/video/artifacts/filmmaking-prompts.schema.json +129 -0
- package/schemas/video/artifacts/flow-characters.schema.json +31 -0
- package/schemas/video/artifacts/flow-voices.schema.json +30 -0
- package/schemas/video/artifacts/motion-overlay-plan.schema.json +50 -0
- package/schemas/video/artifacts/multi-shot-prompt.schema.json +90 -0
- package/schemas/video/artifacts/music-video-config.schema.json +108 -0
- package/schemas/video/artifacts/narration.schema.json +54 -0
- package/schemas/video/artifacts/product-references.schema.json +29 -0
- package/schemas/video/artifacts/project-blueprint.schema.json +236 -0
- package/schemas/video/artifacts/publish-report.schema.json +12 -0
- package/schemas/video/artifacts/reference-sheets.schema.json +85 -0
- package/schemas/video/artifacts/review-report.schema.json +12 -0
- package/schemas/video/artifacts/scene-candidates.schema.json +86 -0
- package/schemas/video/artifacts/scene-selection.schema.json +50 -0
- package/schemas/video/artifacts/seedance-assets.schema.json +31 -0
- package/schemas/video/artifacts/sfx.schema.json +31 -0
- package/schemas/video/artifacts/show-bible.schema.json +66 -0
- package/schemas/video/artifacts/soundtrack.schema.json +39 -0
- package/schemas/video/artifacts/story-bible.schema.json +131 -0
- package/schemas/video/artifacts/storyboard.schema.json +58 -0
- package/schemas/video/artifacts/voice-clones.schema.json +37 -0
- package/schemas/video/brand-profile.schema.json +20 -0
- package/schemas/video/errors.json +48 -0
- package/schemas/video/pipeline-manifest.schema.json +51 -0
- package/skills/README.md +113 -0
- package/skills/ai-director/SKILL.md +140 -0
- package/skills/ai-filmmaking/SKILL.md +239 -0
- package/skills/ai-slop-cleaner/SKILL.md +114 -0
- package/skills/brand-agency/SKILL.md +181 -0
- package/skills/brand-presenter/SKILL.md +114 -0
- package/skills/build-fix/SKILL.md +145 -0
- package/skills/bunty/SKILL.md +41 -0
- package/skills/catalog.json +326 -0
- package/skills/character-ad/SKILL.md +154 -0
- package/skills/character-creator/SKILL.md +303 -0
- package/skills/character-library/README.md +12 -0
- package/skills/character-library/SKILL.md +110 -0
- package/skills/clawbot/SKILL.md +26 -0
- package/skills/concierge/SKILL.md +183 -0
- package/skills/configure-notifications/SKILL.md +286 -0
- package/skills/davendra-presenter/SKILL.md +27 -0
- package/skills/davendra-presenter/assets/davendra_intro_1.jpg +0 -0
- package/skills/davendra-presenter/assets/davendra_intro_2.jpg +0 -0
- package/skills/davendra-presenter/assets/davendra_outro_1.jpg +0 -0
- package/skills/davendra-presenter/assets/davendra_outro_2.jpg +0 -0
- package/skills/deep-interview/SKILL.md +358 -0
- package/skills/deepsearch/SKILL.md +38 -0
- package/skills/doctor/SKILL.md +200 -0
- package/skills/graphify/SKILL.md +616 -0
- package/skills/help/SKILL.md +200 -0
- package/skills/higgsfield-generate/SKILL.md +171 -0
- package/skills/improvement-run/SKILL.md +47 -0
- package/skills/motion-reel/SKILL.md +102 -0
- package/skills/movie-director/SKILL.md +338 -0
- package/skills/multi-shot-prompt/SKILL.md +77 -0
- package/skills/nex-presenter/SKILL.md +25 -0
- package/skills/nex-presenter/assets/logo_manifest.json +26 -0
- package/skills/nex-presenter/assets/logo_source.jpg +0 -0
- package/skills/nex-presenter/assets/nex_brief_intro.mp4 +0 -0
- package/skills/nex-presenter/assets/nex_intro_1.jpg +0 -0
- package/skills/nex-presenter/assets/nex_intro_2.jpg +0 -0
- package/skills/nex-presenter/assets/nex_outro_1.jpg +0 -0
- package/skills/nex-presenter/assets/nex_outro_2.jpg +0 -0
- package/skills/nex-presenter/assets/text_overlay.png +0 -0
- package/skills/note/SKILL.md +62 -0
- package/skills/pipeline/SKILL.md +86 -0
- package/skills/review/SKILL.md +38 -0
- package/skills/runway/SKILL.md +131 -0
- package/skills/seedance-prompts/SKILL.md +194 -0
- package/skills/skill/SKILL.md +835 -0
- package/skills/skills-auditor/SKILL.md +73 -0
- package/skills/studio-mode/SKILL.md +148 -0
- package/skills/ugc/SKILL.md +386 -0
- package/skills/ui-ux-pro-max/SKILL.md +386 -0
- package/skills/video-analyze-template/SKILL.md +77 -0
- package/skills/video-clone-ad/SKILL.md +67 -0
- package/skills/video-framework/SKILL.md +201 -0
- package/skills/video-portfolio-ops/SKILL.md +84 -0
- package/skills/video-post/SKILL.md +97 -0
- package/skills/video-production-handoff/SKILL.md +130 -0
- package/skills/video-release-readiness/SKILL.md +93 -0
- package/skills/video-replicator/SKILL.md +368 -0
- package/skills/video-review-ui-qa/SKILL.md +103 -0
- package/skills/video-storyboard/SKILL.md +71 -0
- package/skills/video-thumbnail-lab/SKILL.md +67 -0
- package/skills/web-clone/SKILL.md +366 -0
- package/skills/worker/SKILL.md +106 -0
- package/skills/youtube-audio/SKILL.md +114 -0
- package/src/video/analyze-output.ts +10 -0
- package/src/video/archive-project.ts +65 -0
- package/src/video/artifact-history.ts +23 -0
- package/src/video/artifact-store.ts +59 -0
- package/src/video/artifact-validation.ts +268 -0
- package/src/video/artifacts.ts +156 -0
- package/src/video/assemble/animate-slides.ts +199 -0
- package/src/video/assemble/animation-styles.json +97 -0
- package/src/video/assemble/animation-styles.ts +54 -0
- package/src/video/assemble/assemble.ts +547 -0
- package/src/video/assemble/audio-concat.ts +165 -0
- package/src/video/assemble/audio-mix-plan.ts +150 -0
- package/src/video/assemble/audio-utils.ts +101 -0
- package/src/video/assemble/cut-segment.ts +121 -0
- package/src/video/assemble/ffmpeg.ts +333 -0
- package/src/video/assemble/gemini-vision-classify.ts +153 -0
- package/src/video/assemble/index.ts +247 -0
- package/src/video/assemble/media-qc.ts +252 -0
- package/src/video/assemble/music.ts +261 -0
- package/src/video/assemble/narration-fit.ts +90 -0
- package/src/video/assemble/overlay.ts +225 -0
- package/src/video/assemble/pdf.ts +169 -0
- package/src/video/assemble/qa-dialogue-lint.ts +129 -0
- package/src/video/assemble/qa-image-filter.ts +147 -0
- package/src/video/assemble/qa-image-vision.ts +154 -0
- package/src/video/assemble/qa-narration-vision.ts +135 -0
- package/src/video/assemble/qa-narration.ts +139 -0
- package/src/video/assemble/stitch-ad.ts +222 -0
- package/src/video/assemble/stitch.ts +918 -0
- package/src/video/assemble/text-card.ts +285 -0
- package/src/video/assemble/title-card.ts +186 -0
- package/src/video/assemble/transcript.ts +240 -0
- package/src/video/assemble/tts-elevenlabs.ts +182 -0
- package/src/video/assemble/tts.ts +227 -0
- package/src/video/assemble/types.ts +45 -0
- package/src/video/assemble/upscale.ts +80 -0
- package/src/video/asset-spec.ts +53 -0
- package/src/video/asset-tag-lookup.ts +51 -0
- package/src/video/atomic-write.ts +7 -0
- package/src/video/audio-platform/native-elevenlabs-sfx.ts +128 -0
- package/src/video/audio-platform/native-elevenlabs-tts.ts +119 -0
- package/src/video/audio-platform/native-flowmusic.ts +167 -0
- package/src/video/audio-platform/native-gemini-tts.ts +226 -0
- package/src/video/audio-platform/native-lyria.ts +231 -0
- package/src/video/audio-platform/native-lyria3.ts +244 -0
- package/src/video/audio-platform/registry.ts +220 -0
- package/src/video/audio-platform/suno-backend.ts +36 -0
- package/src/video/audio-platform/types.ts +138 -0
- package/src/video/batch-queue.ts +685 -0
- package/src/video/blueprint-prompt.ts +118 -0
- package/src/video/brand-definition.ts +287 -0
- package/src/video/brand-dna.ts +478 -0
- package/src/video/brand-prompt.ts +28 -0
- package/src/video/candidate-migrate.ts +171 -0
- package/src/video/category-registry.ts +224 -0
- package/src/video/chain-fallback.ts +53 -0
- package/src/video/character-auto-create.ts +547 -0
- package/src/video/character-consistency.ts +85 -0
- package/src/video/characters.ts +145 -0
- package/src/video/checkpoints.ts +60 -0
- package/src/video/cinema-profile.ts +120 -0
- package/src/video/cinematography.ts +1229 -0
- package/src/video/cli-output.ts +94 -0
- package/src/video/cli-schema.ts +505 -0
- package/src/video/cost-estimate.ts +150 -0
- package/src/video/csv-export.ts +150 -0
- package/src/video/dependencies.ts +64 -0
- package/src/video/dialogue-fit.ts +62 -0
- package/src/video/dialogue.ts +221 -0
- package/src/video/director-defaults.ts +432 -0
- package/src/video/director-preflight.ts +543 -0
- package/src/video/doctor-portfolio.ts +197 -0
- package/src/video/doctor.ts +499 -0
- package/src/video/emotion-cues.ts +36 -0
- package/src/video/environment-assets.ts +69 -0
- package/src/video/environment-auto-create.ts +122 -0
- package/src/video/errors.ts +133 -0
- package/src/video/events.ts +42 -0
- package/src/video/execute-autochain.ts +226 -0
- package/src/video/execute.ts +569 -0
- package/src/video/execution-cancel.ts +103 -0
- package/src/video/execution-plan.ts +178 -0
- package/src/video/execution-profile.ts +162 -0
- package/src/video/execution-runtime.ts +975 -0
- package/src/video/execution-seed.ts +46 -0
- package/src/video/execution-status.ts +736 -0
- package/src/video/filmmaking-prompts.ts +1789 -0
- package/src/video/final-media.ts +118 -0
- package/src/video/finish.ts +255 -0
- package/src/video/flow-character-library.ts +342 -0
- package/src/video/flow-markers.ts +330 -0
- package/src/video/gemini-analyze.ts +387 -0
- package/src/video/gemini-continuity.ts +186 -0
- package/src/video/gemini-judge.ts +300 -0
- package/src/video/gemini-key-pool.ts +153 -0
- package/src/video/gen-image-flow.ts +491 -0
- package/src/video/gen-image.ts +392 -0
- package/src/video/generation-telemetry.ts +282 -0
- package/src/video/http-error-safety.ts +13 -0
- package/src/video/image-dimensions.ts +69 -0
- package/src/video/legacy-import.ts +197 -0
- package/src/video/library-clean.ts +399 -0
- package/src/video/lipsync.ts +200 -0
- package/src/video/media-host.ts +153 -0
- package/src/video/metrics.ts +116 -0
- package/src/video/motion-overlay/analyze-reel.ts +200 -0
- package/src/video/motion-overlay/animate-render.ts +176 -0
- package/src/video/motion-overlay/animate.ts +93 -0
- package/src/video/motion-overlay/avatar-host-transport.ts +458 -0
- package/src/video/motion-overlay/avatar-host.ts +238 -0
- package/src/video/motion-overlay/compose-prompt.ts +247 -0
- package/src/video/motion-overlay/execute.ts +355 -0
- package/src/video/motion-overlay/flow-pack.ts +223 -0
- package/src/video/motion-overlay/ingest.ts +210 -0
- package/src/video/motion-overlay/motifs.ts +223 -0
- package/src/video/motion-overlay/motion-style.ts +162 -0
- package/src/video/motion-overlay/plan.ts +111 -0
- package/src/video/motion-overlay/preview.ts +191 -0
- package/src/video/motion-overlay/render-local.ts +441 -0
- package/src/video/motion-overlay/run.ts +217 -0
- package/src/video/motion-overlay/slice.ts +98 -0
- package/src/video/motion-overlay/transcribe.ts +211 -0
- package/src/video/motion-overlay/types.ts +89 -0
- package/src/video/motion-overlay/v2v-transport.ts +209 -0
- package/src/video/motion-overlay/write.ts +142 -0
- package/src/video/multi-shot-artifact.ts +64 -0
- package/src/video/multi-shot-prompt.ts +608 -0
- package/src/video/music-video.ts +324 -0
- package/src/video/narrate.ts +221 -0
- package/src/video/native-dreamina.ts +638 -0
- package/src/video/native-flow-r2v.ts +279 -0
- package/src/video/native-runway.ts +647 -0
- package/src/video/native-seedance.ts +615 -0
- package/src/video/native-veo.ts +470 -0
- package/src/video/next-actions.ts +247 -0
- package/src/video/obsidian-export.ts +336 -0
- package/src/video/obsidian-sync.ts +649 -0
- package/src/video/obsidian-vault.ts +96 -0
- package/src/video/outfit-prompts.ts +14 -0
- package/src/video/outpaint-keyframe.ts +365 -0
- package/src/video/pipeline-manifest.ts +16 -0
- package/src/video/pipeline-manifests/director.json +46 -0
- package/src/video/pipeline-manifests/storyboard.json +46 -0
- package/src/video/platform-specs.ts +50 -0
- package/src/video/playbooks.ts +34 -0
- package/src/video/post-production.ts +277 -0
- package/src/video/preview-portal/audit.ts +20 -0
- package/src/video/preview-portal/discovery.ts +787 -0
- package/src/video/preview-portal/generate.ts +138 -0
- package/src/video/preview-portal/index.ts +41 -0
- package/src/video/preview-portal/publish.ts +215 -0
- package/src/video/preview-portal/render.ts +865 -0
- package/src/video/preview-portal/shared-assets.ts +455 -0
- package/src/video/preview-portal/templates.ts +112 -0
- package/src/video/preview-portal/types.ts +288 -0
- package/src/video/product-references.ts +43 -0
- package/src/video/project-blueprint.ts +458 -0
- package/src/video/project-index.ts +179 -0
- package/src/video/projects.ts +18 -0
- package/src/video/prompt-guidance.ts +64 -0
- package/src/video/prompt-library.ts +96 -0
- package/src/video/prompt-lint.ts +568 -0
- package/src/video/prompt-quality.ts +635 -0
- package/src/video/prompt-rules.ts +209 -0
- package/src/video/provider-adapter-runner.ts +104 -0
- package/src/video/provider-platform/index.ts +5 -0
- package/src/video/provider-platform/registry.ts +286 -0
- package/src/video/provider-platform/route-capabilities.ts +327 -0
- package/src/video/provider-platform/router.ts +221 -0
- package/src/video/provider-platform/security.ts +29 -0
- package/src/video/provider-platform/telemetry.ts +116 -0
- package/src/video/provider-platform/types.ts +192 -0
- package/src/video/provider-status.ts +199 -0
- package/src/video/providers/dreamina-useapi.ts +345 -0
- package/src/video/providers/flowmusic-useapi.ts +252 -0
- package/src/video/providers/google-flow.ts +110 -0
- package/src/video/providers/public-host.ts +128 -0
- package/src/video/providers/runway-useapi.ts +377 -0
- package/src/video/providers/xskill.ts +304 -0
- package/src/video/readiness.ts +284 -0
- package/src/video/reference-sheet-store.ts +40 -0
- package/src/video/reference-sheets.ts +224 -0
- package/src/video/remix-narrated.ts +92 -0
- package/src/video/report-diff.ts +299 -0
- package/src/video/report-history.ts +122 -0
- package/src/video/report.ts +35 -0
- package/src/video/review-ui.ts +2495 -0
- package/src/video/scene-candidate-store.ts +152 -0
- package/src/video/scene-candidates.ts +195 -0
- package/src/video/scene-selection-store.ts +36 -0
- package/src/video/scene-selection.ts +306 -0
- package/src/video/scheduling.ts +18 -0
- package/src/video/scorecard.ts +90 -0
- package/src/video/seedance-asset-library.ts +259 -0
- package/src/video/seedance-blocks.ts +118 -0
- package/src/video/seedance-chain-host.ts +152 -0
- package/src/video/seedance-content-filter.ts +354 -0
- package/src/video/seedance-skill-loader.ts +83 -0
- package/src/video/sfx.ts +159 -0
- package/src/video/shot-grammar.ts +349 -0
- package/src/video/show-bible.ts +235 -0
- package/src/video/soundtrack.ts +257 -0
- package/src/video/stage-guards.ts +112 -0
- package/src/video/status.ts +342 -0
- package/src/video/story-bible.ts +302 -0
- package/src/video/storyboard-grid.ts +320 -0
- package/src/video/storyboard-markdown.ts +434 -0
- package/src/video/storyboard-still-candidates.ts +82 -0
- package/src/video/storyboard-templates.ts +249 -0
- package/src/video/studio/execute.ts +401 -0
- package/src/video/studio/planner.ts +114 -0
- package/src/video/studio/project-context.ts +25 -0
- package/src/video/studio/recipes.ts +346 -0
- package/src/video/studio/session.ts +24 -0
- package/src/video/studio/types.ts +76 -0
- package/src/video/template-store.ts +241 -0
- package/src/video/timeline.ts +32 -0
- package/src/video/title-overlay.ts +234 -0
- package/src/video/types.ts +465 -0
- package/src/video/veo-subprocess.ts +77 -0
- package/src/video/verify-env.ts +206 -0
- package/src/video/verify-final.ts +65 -0
- package/src/video/video-context.ts +92 -0
- package/src/video/vocal-map.ts +155 -0
- package/src/video/vocal-sync-plan.ts +224 -0
- package/src/video/voice-clone.ts +410 -0
- package/src/video/with-retry.ts +149 -0
- package/src/video/workload.ts +87 -0
- package/src/video/workspace.ts +255 -0
- package/tmp/review-station/index.html +4194 -0
- 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
|
+
```
|