@vibeframe/cli 0.113.28 → 0.113.29

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/dist/index.js CHANGED
@@ -26882,12 +26882,12 @@ colors:
26882
26882
  ---
26883
26883
 
26884
26884
  `;
26885
- const intro = style ? `Visual identity for **${name}**, scaffolded from the **${style.name}** style (after ${style.designer}). Customise freely \u2014 this file is the single source of truth for every scene's palette, typography, and motion.` : `Visual identity for **${name}**. Fill the sections below before authoring any scene HTML or generating any backdrop. Pick a named style with \`vibe scene list-styles\` if you want a credible starting point.`;
26886
- const moodLine = style ? `**Mood:** ${style.mood} \xB7 **Best for:** ${style.bestFor}` : `**Mood:** _(one line \u2014 what should the viewer FEEL?)_`;
26885
+ const intro = style ? `Visual identity for **${name}**, scaffolded from the **${style.name}** style (after ${style.designer}). Customise freely - this file is the single source of truth for every scene's palette, typography, and motion.` : `Visual identity for **${name}**. Fill the sections below before authoring any scene HTML or generating any backdrop. Pick a named style with \`vibe scene list-styles\` if you want a credible starting point.`;
26886
+ const moodLine = style ? `**Mood:** ${style.mood} \xB7 **Best for:** ${style.bestFor}` : `**Mood:** _(one line - what should the viewer FEEL?)_`;
26887
26887
  const palette = style ? `${style.palette.map((c) => `- \`${c}\``).join("\n")}
26888
26888
 
26889
- ${style.paletteNotes}` : `- _hex_ \u2014 primary
26890
- - _hex_ \u2014 accent
26889
+ ${style.paletteNotes}` : `- _hex_ - primary
26890
+ - _hex_ - accent
26891
26891
 
26892
26892
  _2\u20133 colours max. Declare explicit hex values; never name colours abstractly._`;
26893
26893
  const typography = style ? style.typography : `_One family, two weights. State the role of each (headline / label / body)._`;
@@ -26901,7 +26901,7 @@ _2\u20133 colours max. Declare explicit hex values; never name colours abstractl
26901
26901
  const avoid = style ? style.avoid.map((a) => `- ${a}`).join("\n") : `- _anti-pattern 1_
26902
26902
  - _anti-pattern 2_
26903
26903
  - _anti-pattern 3_`;
26904
- return `${frontmatter}# ${name} \u2014 Design
26904
+ return `${frontmatter}# ${name} - Design
26905
26905
 
26906
26906
  > **Hard-gate (BUILD flow only).** This file is the visual contract for
26907
26907
  > the scene-project flow (\`vibe build\`, \`vibe scene ...\`, composition
@@ -26949,8 +26949,8 @@ ${style ? `_This file was seeded by \`vibe scene init --visual-style "${style.na
26949
26949
  `;
26950
26950
  }
26951
26951
  function buildScriptMd(name, kind = DEFAULT_SCENE_KIND) {
26952
- const intent = kind === "product" ? "Product walkthrough \u2014 what each section demonstrates, in order." : kind === "motion" ? "Motion piece \u2014 the message and the beats of on-screen text/graphics." : kind === "aivideo" ? "AI-video script \u2014 the spoken/voiced narrative the generated shots illustrate." : "Narrative script \u2014 scene-by-scene story, dialogue, and voiceover.";
26953
- return `# ${name} \u2014 Script
26952
+ const intent = kind === "product" ? "Product walkthrough - what each section demonstrates, in order." : kind === "motion" ? "Motion piece - the message and the beats of on-screen text/graphics." : kind === "aivideo" ? "AI-video script - the spoken/voiced narrative the generated shots illustrate." : "Narrative script - scene-by-scene story, dialogue, and voiceover.";
26953
+ return `# ${name} - Script
26954
26954
 
26955
26955
  > **Authoring order:** SCRIPT.md (this file) \u2192 STORYBOARD.md (beats + cues)${kindHasCast(kind) ? " \u2192 CHARACTERS.md (cast bible)" : ""}.
26956
26956
  > ${intent}
@@ -26978,7 +26978,7 @@ Voiceover / on-screen: \u2026
26978
26978
  `;
26979
26979
  }
26980
26980
  function buildCharactersMd(name) {
26981
- return `# ${name} \u2014 Characters
26981
+ return `# ${name} - Characters
26982
26982
 
26983
26983
  > Each character is referenced from STORYBOARD beats via the \`characters:\` cue.
26984
26984
  > The reference sheet + identity block keep keyframes and image-to-video on-model
@@ -26987,8 +26987,8 @@ function buildCharactersMd(name) {
26987
26987
  ## hero
26988
26988
 
26989
26989
  - **Reference sheet:** \`assets/characters/hero.png\` (a clean, front-lit full-body
26990
- or portrait sheet \u2014 the identity anchor for keyframe edits).
26991
- - **Identity:** one paragraph of fixed, on-model traits \u2014 age, build, hair,
26990
+ or portrait sheet - the identity anchor for keyframe edits).
26991
+ - **Identity:** one paragraph of fixed, on-model traits - age, build, hair,
26992
26992
  wardrobe, palette. Keep this stable across every beat.
26993
26993
  - **Range:** expressions / poses this character should hit.
26994
26994
 
@@ -27006,14 +27006,14 @@ tts: auto
27006
27006
  imageProvider: openai
27007
27007
  ---
27008
27008
 
27009
- # ${name} \u2014 Storyboard
27009
+ # ${name} - Storyboard
27010
27010
 
27011
27011
  Edit these beats before running \`vibe build\`. Each beat starts with
27012
27012
  YAML cues that drive narration, backdrop generation, and timing.
27013
27013
  Pacing: keep beats 6-15 seconds (split longer ones); a 90s video should
27014
27014
  have 6-8 beats, not 3 long ones.
27015
27015
 
27016
- ## Beat hook \u2014 Hook
27016
+ ## Beat hook - Hook
27017
27017
 
27018
27018
  \`\`\`yaml
27019
27019
  narration: "Introduce the promise in one crisp sentence."
@@ -27024,7 +27024,7 @@ duration: 4
27024
27024
  Show the core visual identity immediately. Keep copy short enough for one
27025
27025
  screen and one spoken breath.
27026
27026
 
27027
- ## Beat proof \u2014 Proof
27027
+ ## Beat proof - Proof
27028
27028
 
27029
27029
  \`\`\`yaml
27030
27030
  narration: "Show the mechanism or proof point that makes the promise believable."
@@ -27035,7 +27035,7 @@ duration: 4
27035
27035
  Use this beat for the concrete differentiator: command, workflow, metric, or
27036
27036
  before/after.
27037
27037
 
27038
- ## Beat close \u2014 Close
27038
+ ## Beat close - Close
27039
27039
 
27040
27040
  \`\`\`yaml
27041
27041
  narration: "Close with the action the viewer should remember."
@@ -27048,7 +27048,7 @@ final beat.
27048
27048
  `;
27049
27049
  }
27050
27050
  function buildProjectAgentsMd(name) {
27051
- return `# ${name} \u2014 Scene Authoring Project
27051
+ return `# ${name} - Scene Authoring Project
27052
27052
 
27053
27053
  This is the canonical cross-agent guidance file for this scene project.
27054
27054
  Claude Code imports it through \`CLAUDE.md\`; Codex, Cursor, Aider,
@@ -27087,7 +27087,7 @@ contradict DESIGN.md are rejected by the Hyperframes \`hyperframes\`
27087
27087
  skill.
27088
27088
 
27089
27089
  Single-asset requests (\`vibe generate image|video|speech|...\`) do NOT
27090
- consult this file \u2014 run the generate command directly.
27090
+ consult this file - run the generate command directly.
27091
27091
 
27092
27092
  Browse named styles: \`vibe scene list-styles\`. Re-seed from one with
27093
27093
  \`vibe scene init . --visual-style "Swiss Pulse"\` (idempotent).
@@ -27102,8 +27102,9 @@ after init, those two files are the working source of truth.
27102
27102
  Use \`media/\` for user-provided source files: product photos, screenshots,
27103
27103
  logos, B-roll, recorded narration, or reference clips. Keep those inputs
27104
27104
  inside this project so build references stay project-relative. Do not put user
27105
- media in \`references/\`; that directory is reserved for local composition
27106
- rules installed by VibeFrame.
27105
+ media in \`references/\`; older VibeFrame versions vendored composition rules
27106
+ there, and current installs keep the rules under \`.agents/skills/hyperframes/\`
27107
+ via \`vibe scene install-skill\`.
27107
27108
 
27108
27109
  When a beat should reuse a local file, reference it from \`STORYBOARD.md\`
27109
27110
  with a project-relative path:
@@ -27159,7 +27160,7 @@ project-level agent loop; it provides \`--json\` commands, dry runs, cost caps,
27159
27160
  \`requiresConfirmation\`, \`fixOwner\`, deterministic repair, and render
27160
27161
  inspection for the host agent to reason over.
27161
27162
 
27162
- Copy-paste agent prompts \u2014 plain prompts, not a built-in command:
27163
+ Copy-paste agent prompts - plain prompts, not a built-in command:
27163
27164
 
27164
27165
  \`\`\`text
27165
27166
  Build this VibeFrame project into renders/final.mp4. Use --json for every
@@ -27187,9 +27188,9 @@ target duration/aspect ratio, clean render inspection, any AI review score >= 90
27187
27188
  no unresolved unacknowledged host-agent issues.
27188
27189
  \`\`\`
27189
27190
 
27190
- ## Skills \u2014 USE THESE FIRST
27191
+ ## Skills - USE THESE FIRST
27191
27192
 
27192
- **Load the \`hyperframes\` skill before authoring scenes** \u2014 it encodes the
27193
+ **Load the \`hyperframes\` skill before authoring scenes** - it encodes the
27193
27194
  composition rules, motion principles, type system, and visual-identity gate.
27194
27195
  If your agent has it installed globally it is already available; otherwise run
27195
27196
  \`vibe scene install-skill\`, which runs upstream's installer and writes
@@ -27201,7 +27202,7 @@ semantics, VibeFrame pipeline conventions) that are NOT in generic web docs.
27201
27202
 
27202
27203
  | Skill | Command | When to use |
27203
27204
  | ----------------- | ---------------- | ------------------------------------------------------------------------------------- |
27204
- | **hyperframes** | \`/hyperframes\` | Cinematic-quality composition \u2014 DESIGN.md hard-gate, named styles, motion principles |
27205
+ | **hyperframes** | \`/hyperframes\` | Cinematic-quality composition - DESIGN.md hard-gate, named styles, motion principles |
27205
27206
  | **vibe-scene** | \`/vibe-scene\` | VibeFrame's authoring loop, AI assets, lint feedback, pipeline integration |
27206
27207
  | **gsap** | \`/gsap\` | GSAP tweens, timelines, easing |
27207
27208
 
@@ -27212,22 +27213,22 @@ npx skills add heygen-com/hyperframes
27212
27213
  \`\`\`
27213
27214
 
27214
27215
  Restart your agent session (or reload the skill list) after installing.
27215
- If skills aren't available, follow the **Key Rules** below \u2014 they cover
27216
+ If skills aren't available, follow the **Key Rules** below - they cover
27216
27217
  the framework-level minimum, not the cinematic craft layer.
27217
27218
 
27218
27219
  ## Project structure
27219
27220
 
27220
- - \`DESIGN.md\` \u2014 visual identity contract (palette, type, motion, transitions)
27221
- - \`STORYBOARD.md\` \u2014 per-beat narration/backdrop/duration cues for \`vibe build\`
27222
- - \`media/\` \u2014 user-provided source files (photos, logos, clips, voice recordings)
27223
- - \`index.html\` \u2014 root composition (timeline)
27224
- - \`compositions/scene-*.html\` \u2014 per-scene HTML authored by you or the agent
27225
- - \`assets/\` \u2014 generated/canonical build media (narration audio, images, video)
27226
- - \`.agents/skills/hyperframes/\` \u2014 upstream composition rules, when installed here rather than globally
27227
- - \`transcript.json\` \u2014 Whisper word-level transcript (if narration exists)
27228
- - \`hyperframes.json\` \u2014 HF registry config (speak to both toolchains)
27229
- - \`vibe.config.json\` \u2014 canonical VibeFrame config (providers, budget)
27230
- - \`renders/\` \u2014 output MP4s
27221
+ - \`DESIGN.md\` - visual identity contract (palette, type, motion, transitions)
27222
+ - \`STORYBOARD.md\` - per-beat narration/backdrop/duration cues for \`vibe build\`
27223
+ - \`media/\` - user-provided source files (photos, logos, clips, voice recordings)
27224
+ - \`index.html\` - root composition (timeline)
27225
+ - \`compositions/scene-*.html\` - per-scene HTML authored by you or the agent
27226
+ - \`assets/\` - generated/canonical build media (narration audio, images, video)
27227
+ - \`.agents/skills/hyperframes/\` - upstream composition rules, when installed here rather than globally
27228
+ - \`transcript.json\` - Whisper word-level transcript (if narration exists)
27229
+ - \`hyperframes.json\` - HF registry config (speak to both toolchains)
27230
+ - \`vibe.config.json\` - canonical VibeFrame config (providers, budget)
27231
+ - \`renders/\` - output MP4s
27231
27232
 
27232
27233
  ## Commands
27233
27234
 
@@ -27237,7 +27238,7 @@ vibe build # STORYBOARD.md \u219
27237
27238
  vibe scene lint # Validate scenes (in-process HF linter)
27238
27239
  vibe render # Render to MP4
27239
27240
 
27240
- # Hyperframes CLI (if installed \u2014 works in this project too)
27241
+ # Hyperframes CLI (if installed - works in this project too)
27241
27242
  npx hyperframes preview
27242
27243
  npx hyperframes render
27243
27244
  \`\`\`
@@ -27245,7 +27246,7 @@ npx hyperframes render
27245
27246
  ## Key Rules (for hand-authored scene HTML)
27246
27247
 
27247
27248
  1. Every timed element needs \`data-start\`, \`data-duration\`, and \`data-track-index\`.
27248
- 2. Elements with timing **MUST** have \`class="clip"\` \u2014 the framework uses this for visibility control.
27249
+ 2. Elements with timing **MUST** have \`class="clip"\` - the framework uses this for visibility control.
27249
27250
  3. Timelines must be paused and registered on \`window.__timelines\`:
27250
27251
  \`\`\`js
27251
27252
  window.__timelines = window.__timelines || {};
@@ -27257,12 +27258,12 @@ npx hyperframes render
27257
27258
  \`filter\` tweens to \`.scene-content\` or any ancestor containing live text.
27258
27259
  Animate background/media layers instead; text/cards should enter briefly and
27259
27260
  then hold still at their final CSS positions.
27260
- 7. Only deterministic logic \u2014 no \`Date.now()\`, \`Math.random()\`, or network fetches.
27261
+ 7. Only deterministic logic - no \`Date.now()\`, \`Math.random()\`, or network fetches.
27261
27262
 
27262
- ## Linting \u2014 run after changes
27263
+ ## Linting - run after changes
27263
27264
 
27264
27265
  \`\`\`bash
27265
- vibe scene lint # preferred \u2014 in-process, no network
27266
+ vibe scene lint # preferred - in-process, no network
27266
27267
  vibe scene lint --fix # auto-fix mechanical issues
27267
27268
  vibe scene lint --json # structured output for agent loops
27268
27269
  \`\`\`
@@ -27271,7 +27272,7 @@ vibe scene lint --json # structured output for agent loops
27271
27272
  function buildProjectClaudeMd(name) {
27272
27273
  return `@AGENTS.md
27273
27274
 
27274
- # ${name} \u2014 Claude Code Overrides
27275
+ # ${name} - Claude Code Overrides
27275
27276
 
27276
27277
  This file imports \`AGENTS.md\`; keep cross-agent VibeFrame and
27277
27278
  Hyperframes instructions there so Codex, Cursor, Aider, Gemini CLI, and
@@ -27280,7 +27281,7 @@ only when this project needs them.
27280
27281
  `;
27281
27282
  }
27282
27283
  function buildSceneGitignore() {
27283
- return `# VibeFrame \u2014 caches, checkpoints, and project-scope config.yaml (may contain API keys)
27284
+ return `# VibeFrame - caches, checkpoints, and project-scope config.yaml (may contain API keys)
27284
27285
  .vibeframe/
27285
27286
 
27286
27287
  # Render outputs
@@ -57541,13 +57542,15 @@ var init_walkthroughs = __esm({
57541
57542
  SCENE_WALKTHROUGH = `# Scene authoring with vibe
57542
57543
 
57543
57544
  A scene project is a directory that is **bilingual**: it works with both
57544
- \`vibe\` and \`npx hyperframes\`. Each scene is one HTML file with scoped CSS
57545
- and a paused GSAP timeline. Cheap to edit, cheap to lint, expensive only
57545
+ \`vibe\` and \`npx hyperframes\`. Scene composition is Hyperframes' job:
57546
+ each scene is one HTML file with scoped CSS and a paused GSAP timeline,
57547
+ authored to upstream's composition rules (install them with
57548
+ \`vibe scene install-skill\`). Cheap to edit, cheap to lint, expensive only
57546
57549
  at render.
57547
57550
 
57548
- \`vibe build\` (v0.60+) is the supported one-shot driver from a
57549
- written storyboard to an MP4. Plan H (v0.70) added \`--mode agent\` so the
57550
- host agent itself authors the per-beat HTML \u2014 no internal LLM call.
57551
+ \`vibe build\` is the supported one-shot driver from a written storyboard
57552
+ to an MP4. The host agent authors the per-beat HTML - the CLI makes no
57553
+ internal LLM call.
57551
57554
 
57552
57555
  ## Three authoring paths
57553
57556
 
@@ -57562,20 +57565,20 @@ narration / backdrop intent.
57562
57565
 
57563
57566
  ## High-craft path
57564
57567
 
57565
- 1. \`vibe init my-promo --visual-style "Swiss Pulse"\` \u2014 seeds
57568
+ 1. \`vibe init my-promo --visual-style "Swiss Pulse"\` - seeds
57566
57569
  \`DESIGN.md\` (palette, typography, motion, transitions) plus the
57567
57570
  \`vibe.config.json\` / \`hyperframes.json\` / \`index.html\` scaffold.
57568
57571
  It does **not** install the composition rules; if your agent does not
57569
57572
  already have the \`hyperframes\` skill, run
57570
57573
  \`vibe scene install-skill\` to fetch them from upstream into
57571
57574
  \`.agents/skills/hyperframes/\`.
57572
- 2. Read \`.agents/skills/hyperframes/SKILL.md\` (or your global copy) \u2014
57575
+ 2. Read \`.agents/skills/hyperframes/SKILL.md\` (or your global copy) -
57573
57576
  framework rules, motion principles, type system, transition recipes.
57574
- 3. Read \`DESIGN.md\` \u2014 project-specific palette / typography / motion
57577
+ 3. Read \`DESIGN.md\` - project-specific palette / typography / motion
57575
57578
  signature (visual identity hard-gate).
57576
57579
  4. Author each scene HTML directly under \`compositions/scene-<id>.html\`
57577
57580
  using the rules from steps 2 and 3. The skill enforces the visual
57578
- identity contract \u2014 scenes that contradict DESIGN.md fail lint.
57581
+ identity contract - scenes that contradict DESIGN.md fail lint.
57579
57582
  5. \`vibe scene lint --fix\` for mechanical issues, \`vibe render my-promo\`
57580
57583
  to MP4.
57581
57584
 
@@ -57589,16 +57592,16 @@ vibe scene lint
57589
57592
  vibe render my-promo
57590
57593
  \`\`\`
57591
57594
 
57592
- \`vibe init\` is **idempotent** \u2014 running it on an existing Hyperframes
57595
+ \`vibe init\` is **idempotent** - running it on an existing Hyperframes
57593
57596
  directory merges \`hyperframes.json\` instead of clobbering it. Safe to
57594
57597
  invoke on user-provided projects.
57595
57598
 
57596
57599
  ## Subcommands
57597
57600
 
57598
57601
  \`\`\`bash
57599
- # Project flow (top-level \u2014 preferred entry points)
57602
+ # Project flow (top-level - preferred entry points)
57600
57603
  vibe init <dir> [-r 16:9|9:16|1:1|4:5] [-d <sec>] [--visual-style "<name>"]
57601
- vibe build [<dir>] [--mode agent|batch|auto] # H3 dispatch
57604
+ vibe build [<dir>] [--composer template] # agent authors scenes by default
57602
57605
  vibe render [<dir>] [--fps 30] [--quality standard] [--format mp4]
57603
57606
 
57604
57607
  # Lower-level scene authoring
@@ -57611,11 +57614,11 @@ vibe scene lint [<root>] [--json] [--fix]
57611
57614
 
57612
57615
  ## Style presets (for \`vibe scene add --style\`)
57613
57616
 
57614
- - **simple** \u2014 backdrop + bottom caption (default)
57615
- - **announcement** \u2014 single huge headline, gradient text
57616
- - **explainer** \u2014 kicker + title + subtitle stack
57617
- - **kinetic-type** \u2014 words animate in word-by-word
57618
- - **product-shot** \u2014 corner label + bottom headline + slow zoom
57617
+ - **simple** - backdrop + bottom caption (default)
57618
+ - **announcement** - single huge headline, gradient text
57619
+ - **explainer** - kicker + title + subtitle stack
57620
+ - **kinetic-type** - words animate in word-by-word
57621
+ - **product-shot** - corner label + bottom headline + slow zoom
57619
57622
 
57620
57623
  All presets accept \`--narration <text|file>\`, \`--visuals <prompt>\`,
57621
57624
  \`--headline\`, \`--kicker\`. With \`--narration\`, scene duration auto-derives
@@ -57625,21 +57628,19 @@ from the generated TTS audio.
57625
57628
 
57626
57629
  \`\`\`bash
57627
57630
  vibe init my-promo --visual-style "Swiss Pulse" -d 12
57628
- # (edit STORYBOARD.md with per-beat YAML cues \u2014 narration, backdrop, duration)
57631
+ # (edit STORYBOARD.md with per-beat YAML cues - narration, backdrop, duration)
57629
57632
  vibe build my-promo
57630
57633
  \`\`\`
57631
57634
 
57632
57635
  \`vibe build\` reads the STORYBOARD frontmatter + per-beat cues,
57633
57636
  dispatches TTS + image-gen per beat, then either:
57634
57637
 
57635
- - **\`--mode agent\`** (default when an agent host is detected) \u2014 emits a
57636
- \`needs-author\` plan via \`vibe scene compose-prompts\`. The host agent
57637
- authors each \`compositions/scene-<id>.html\` itself, then re-invoking
57638
- \`vibe build\` proceeds to lint + render.
57639
- - **\`--mode batch\`** \u2014 VibeFrame runs an internal LLM (Claude / OpenAI /
57640
- Gemini) to compose the HTML, then renders.
57641
-
57642
- \`VIBE_BUILD_MODE\` env var overrides the auto-resolve.
57638
+ - **Agent authoring** (default) - emits a \`needs-author\` plan via
57639
+ \`vibe scene compose-prompts\`. The host agent authors each
57640
+ \`compositions/scene-<id>.html\` itself, then re-invoking \`vibe build\`
57641
+ proceeds to lint + render. The CLI makes no internal LLM call.
57642
+ - **\`--composer template\`** - the deterministic no-model composer
57643
+ (concat background + lower-thirds), for when no agent is available.
57643
57644
 
57644
57645
  ## Lint feedback loop
57645
57646
 
@@ -57649,7 +57650,7 @@ vibe scene lint --json --fix
57649
57650
 
57650
57651
  Returns structured findings. The recommended loop: 1) run lint with
57651
57652
  \`--fix\` (mechanical fixes applied), 2) if \`errorCount > 0\`, edit the
57652
- scene HTML, 3) re-lint. Cap retries at 3 \u2014 if errors persist, fall back
57653
+ scene HTML, 3) re-lint. Cap retries at 3 - if errors persist, fall back
57653
57654
  to a template preset (\`vibe scene add <id> --style simple --force\`)
57654
57655
  and surface the error to the user.
57655
57656
 
@@ -57725,9 +57726,9 @@ The full set lives in \`packages/cli/src/pipeline/executor.ts\`.
57725
57726
 
57726
57727
  ## Variable references
57727
57728
 
57728
- - \`$<step-id>.output\` \u2014 previous step's output path
57729
- - \`$<step-id>.result.<field>\` \u2014 structured field from JSON result
57730
- - \`\${ENV_VAR}\` \u2014 environment variable
57729
+ - \`$<step-id>.output\` - previous step's output path
57730
+ - \`$<step-id>.result.<field>\` - structured field from JSON result
57731
+ - \`\${ENV_VAR}\` - environment variable
57731
57732
  - Values can be templated: \`"\${SCRIPT_TITLE} - Episode \${EPISODE}"\`
57732
57733
 
57733
57734
  ## Running
@@ -57744,12 +57745,12 @@ Checkpoints land next to the YAML: \`pipeline.yaml.checkpoint.json\`.
57744
57745
 
57745
57746
  ## Authoring tips
57746
57747
 
57747
- 1. **Start from a tiny YAML** \u2014 keep it in your project directory and run
57748
+ 1. **Start from a tiny YAML** - keep it in your project directory and run
57748
57749
  \`vibe run pipeline.yaml --dry-run\` before spending provider budget.
57749
- 2. **Dry-run first** \u2014 you see estimated cost and resolved variable
57750
+ 2. **Dry-run first** - you see estimated cost and resolved variable
57750
57751
  graph before spending API credits.
57751
57752
  3. **Keep step ids short and descriptive** (\`intro\`, \`scene1\`, \`voice\`,
57752
- \`bgm\`) \u2014 they appear in logs and variable refs.
57753
+ \`bgm\`) - they appear in logs and variable refs.
57753
57754
  4. **Name outputs** with extensions matching the action (\`.mp4\`, \`.mp3\`,
57754
57755
  \`.png\`, \`.json\`).
57755
57756
  5. **Declare \`budget:\`** on expensive pipelines:
@@ -57773,9 +57774,9 @@ When the user has a working shell sequence, extract steps:
57773
57774
  - Wrap the entire chain in a \`name:\` + \`steps:\` skeleton
57774
57775
 
57775
57776
  The \`compose\` action is the catch-all assembly step (audio mux, video
57776
- overlay, etc.) \u2014 useful at the tail of a pipeline.
57777
+ overlay, etc.) - useful at the tail of a pipeline.
57777
57778
  `;
57778
- ARCHITECTURE_WALKTHROUGH = `# vibe agent / build / run \u2014 when to pick which
57779
+ ARCHITECTURE_WALKTHROUGH = `# vibe agent / build / run - when to pick which
57779
57780
 
57780
57781
  The CLI has three orchestrating commands that coordinate other primitives:
57781
57782
  \`vibe agent\`, \`vibe build\`, \`vibe run\`. New users routinely ask which one
@@ -57804,14 +57805,14 @@ built-in fallback when you do not already have an agent host.
57804
57805
  - "I have a finished script + visual identity" \u2192 \`vibe build\`
57805
57806
  - "I want this to run again next month" \u2192 \`vibe run\`
57806
57807
 
57807
- If two seem to fit, pick the rightmost one \u2014 more reproducible, less surprise.
57808
+ If two seem to fit, pick the rightmost one - more reproducible, less surprise.
57808
57809
 
57809
57810
  ## Cost-tier awareness (v0.83+)
57810
57811
 
57811
57812
  Every primitive subcommand carries a cost tier (\`free\` / \`low\` / \`high\` /
57812
57813
  \`very-high\`). \`vibe schema --list\` exposes the tier as JSON, and each
57813
57814
  \`vibe <group> <sub> --help\` page shows it as a colored footer. Use
57814
- \`vibe doctor --test-keys\` before kicking off any high-cost orchestrator \u2014
57815
+ \`vibe doctor --test-keys\` before kicking off any high-cost orchestrator -
57815
57816
  a single bad key wastes time and money.
57816
57817
 
57817
57818
  ## Cross-command primitives
@@ -57921,7 +57922,7 @@ vibe generate motion "animated product logo reveal" --render -o logo-reveal.mp4
57921
57922
  title: "YAML pipelines (Video as Code)",
57922
57923
  summary: "Author and run reproducible multi-step video workflows",
57923
57924
  steps: [
57924
- "Sketch the workflow as YAML \u2014 `name`, `description`, then `steps:` with `id` + `action` + inputs/outputs.",
57925
+ "Sketch the workflow as YAML - `name`, `description`, then `steps:` with `id` + `action` + inputs/outputs.",
57925
57926
  "Reference previous step outputs via `$<step-id>.output` (or `$<step-id>.result.<field>` for structured returns).",
57926
57927
  "Run `vibe run pipeline.yaml --dry-run` to see the resolved graph + cost estimate before spending API budget.",
57927
57928
  "Add a `budget:` block (tokens / cost_usd / max_tool_errors) to cap expensive runs.",
@@ -74248,8 +74249,8 @@ init_source();
74248
74249
  // package.json
74249
74250
  var package_default = {
74250
74251
  name: "@vibeframe/cli",
74251
- version: "0.113.28",
74252
- description: "VibeFrame CLI - agentic video workflow runtime",
74252
+ version: "0.113.29",
74253
+ description: "Frontier AI video generation for coding agents - Seedance, Runway, Veo, and Kling on your own keys, behind a hard cost cap",
74253
74254
  private: false,
74254
74255
  license: "MIT",
74255
74256
  repository: {
@@ -74260,13 +74261,21 @@ var package_default = {
74260
74261
  bugs: {
74261
74262
  url: "https://github.com/vericontext/vibeframe/issues"
74262
74263
  },
74264
+ homepage: "https://vibeframe.ai",
74263
74265
  keywords: [
74264
74266
  "vibeframe",
74265
74267
  "cli",
74266
- "video-editing",
74267
- "ai",
74268
- "ffmpeg",
74269
- "commander"
74268
+ "ai-video",
74269
+ "video-generation",
74270
+ "text-to-video",
74271
+ "image-to-video",
74272
+ "seedance",
74273
+ "runway",
74274
+ "veo",
74275
+ "kling",
74276
+ "ai-agent",
74277
+ "mcp",
74278
+ "ffmpeg"
74270
74279
  ],
74271
74280
  type: "module",
74272
74281
  bin: {
@@ -81597,7 +81606,7 @@ function parseScope(raw) {
81597
81606
  }
81598
81607
  return v;
81599
81608
  }
81600
- var setupCommand = new Command("setup").description("Configure VibeFrame (LLM provider, API keys)").option("--reset", "Reset configuration to defaults").option("--full", "Run full setup with all optional providers").option("--show", "Show current configuration (for debugging)").option(
81609
+ var setupCommand = new Command("setup").description("Configure VibeFrame (video/image provider keys, LLM provider)").option("--reset", "Reset configuration to defaults").option("--full", "Run full setup with all optional providers").option("--show", "Show current configuration (for debugging)").option(
81601
81610
  "-v, --verbose",
81602
81611
  "With --show: include unset providers + Resolution order + Defaults block"
81603
81612
  ).option("--claude-code", "Show Claude Code integration guide").option("-y, --yes", "Non-interactive: write config without prompting (CI / devcontainer)").option(
@@ -81617,8 +81626,8 @@ Non-interactive examples (no TTY required):
81617
81626
  vibe setup --scope project --yes --import-env Project-only setup (./.vibeframe/config.yaml)
81618
81627
 
81619
81628
  Scopes:
81620
- user (default) ~/.vibeframe/config.yaml \u2014 shared across every project
81621
- project ./.vibeframe/config.yaml \u2014 gitignored, isolates keys/defaults to this directory
81629
+ user (default) ~/.vibeframe/config.yaml - shared across every project
81630
+ project ./.vibeframe/config.yaml - gitignored, isolates keys/defaults to this directory
81622
81631
  When a project config exists at the cwd, it is used and the user file is ignored.
81623
81632
 
81624
81633
  Exit codes (non-interactive):
@@ -81825,7 +81834,7 @@ var AI_FEATURES = [
81825
81834
  {
81826
81835
  label: "Audio",
81827
81836
  desc: "TTS, SFX, music, voice clone",
81828
- defaultProvider: "ElevenLabs (paid, premium quality) \u2014 falls back to local Kokoro when no key (free, since v0.54)",
81837
+ defaultProvider: "ElevenLabs (paid, premium quality) - falls back to local Kokoro when no key (free, since v0.54)",
81829
81838
  alsoAvailable: "Replicate MusicGen (music only)",
81830
81839
  keyHint: "0-1 key",
81831
81840
  keys: [
@@ -82131,7 +82140,7 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
82131
82140
  const displayPath2 = scope === "user" ? userStatus?.source === "legacy" ? userStatus.configPath : USER_CONFIG_PATH : getConfigPath(scope);
82132
82141
  const cfgPath = displayPath2.replace(homedir6(), "~");
82133
82142
  const scopeNote = scope === "project" ? "applies to this project only \xB7 user config is ignored while this file exists \xB7 add .vibeframe/ to .gitignore" : "applies to every project for this user";
82134
- console.log(source_default.bold.magenta("VibeFrame Setup") + source_default.bold(` \u2014 ${scope} scope`));
82143
+ console.log(source_default.bold.magenta("VibeFrame Setup") + source_default.bold(` - ${scope} scope`));
82135
82144
  console.log(source_default.dim(`${cfgPath} \xB7 ${scopeNote}`));
82136
82145
  if (userStatus?.source === "legacy") {
82137
82146
  console.log(
@@ -82162,14 +82171,14 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
82162
82171
  console.log(source_default.bold("What would you like to do?"));
82163
82172
  console.log();
82164
82173
  const topLabels = [
82174
+ `Generate AI video ${source_default.dim("(build from a storyboard, remix highlights, auto-shorts)")}`,
82175
+ `AI features ${source_default.dim("(pick what you need - images, videos, audio, editing)")}`,
82165
82176
  `Edit videos offline ${source_default.dim("(silence-cut, fade, noise-reduce, detect)")} ${source_default.green("no API keys")}`,
82166
- `AI features ${source_default.dim("(pick what you need \u2014 images, videos, audio, editing)")}`,
82167
- `Full AI pipeline ${source_default.dim("(build, remix highlights, auto-shorts)")}`,
82168
- `Full provider list ${source_default.dim("(every supported provider, one by one \u2014 same as --full)")}`
82177
+ `Full provider list ${source_default.dim("(every supported provider, one by one - same as --full)")}`
82169
82178
  ];
82170
82179
  const topIndex = await promptSelect(source_default.cyan(" Select [1-4]: "), topLabels, 0);
82171
82180
  console.log();
82172
- if (topIndex === 0) {
82181
+ if (topIndex === 2) {
82173
82182
  await saveConfig(config2, { scope });
82174
82183
  await completeOrContinue(config2, "vibe edit silence-cut video.mp4 -o clean.mp4", [], scope);
82175
82184
  return;
@@ -82180,7 +82189,7 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
82180
82189
  await completeOrContinue(config2, "vibe doctor --test-keys", [], scope);
82181
82190
  return;
82182
82191
  }
82183
- if (topIndex === 2) {
82192
+ if (topIndex === 0) {
82184
82193
  config2.llm.provider = "claude";
82185
82194
  const pipelineKeys = [
82186
82195
  {
@@ -82188,7 +82197,7 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
82188
82197
  envVar: "ANTHROPIC_API_KEY",
82189
82198
  name: "Anthropic",
82190
82199
  url: "https://console.anthropic.com/settings/keys",
82191
- what: "Claude \u2014 storyboard generation + reasoning"
82200
+ what: "Claude - storyboard generation + reasoning"
82192
82201
  },
82193
82202
  {
82194
82203
  configKey: "openai",
@@ -82202,7 +82211,7 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
82202
82211
  envVar: "FAL_API_KEY",
82203
82212
  name: "fal.ai",
82204
82213
  url: "https://fal.ai/dashboard/keys",
82205
- what: "Seedance 2.0 \u2014 video generation, default since v0.57"
82214
+ what: "Seedance 2.0 - video generation, default since v0.57"
82206
82215
  },
82207
82216
  {
82208
82217
  configKey: "elevenlabs",
@@ -82514,7 +82523,7 @@ async function runCustomSetup(config2, scope = "user", opts = {}) {
82514
82523
  xai: "Grok 4.1 Fast, 2M context, great for tool calling",
82515
82524
  openrouter: "300+ models via one API key (Claude, GPT, Gemini, Llama, etc.)",
82516
82525
  evolink: "GPT-5, Claude, Gemini, DeepSeek & more via one key",
82517
- ollama: "Free, local, no API key \u2014 offline capable (default: llama3.2)"
82526
+ ollama: "Free, local, no API key - offline capable (default: llama3.2)"
82518
82527
  };
82519
82528
  const providerLabels = providers.map((p) => {
82520
82529
  const rec = p === "claude" ? source_default.dim(" (recommended)") : "";
@@ -82635,19 +82644,19 @@ async function showComplete(config2, defaultTryCommand, features = [], scope = "
82635
82644
  console.log();
82636
82645
  console.log(
82637
82646
  source_default.dim(
82638
- ` Detected ${primary.label} \u2014 \`vibe init\` will scaffold ${primary.projectFiles.join(" + ")} in your project.`
82647
+ ` Detected ${primary.label} - \`vibe init\` will scaffold ${primary.projectFiles.join(" + ")} in your project.`
82639
82648
  )
82640
82649
  );
82641
82650
  console.log(
82642
82651
  source_default.dim(
82643
- ` Scene composer will auto-dispatch to ${primary.label} (${source_default.bold("--mode agent")}). Run \`vibe init my-promo\` to scaffold a video project + install local composition rules.`
82652
+ ` ${primary.label} authors each scene during \`vibe build\`. Run \`vibe init my-promo\` to scaffold a video project.`
82644
82653
  )
82645
82654
  );
82646
82655
  } else {
82647
82656
  console.log();
82648
82657
  console.log(
82649
82658
  source_default.dim(
82650
- ` No agent host detected \u2014 \`vibe build\` will use the internal LLM composer (${source_default.bold("--mode batch")}).`
82659
+ ` No agent host detected - scenes are authored by a coding agent during \`vibe build\`; pass ${source_default.bold("--composer template")} for the deterministic no-model fallback.`
82651
82660
  )
82652
82661
  );
82653
82662
  }
@@ -82658,7 +82667,7 @@ async function setupClaudeCode() {
82658
82667
  console.log(source_default.bold.cyan("Claude Code Integration"));
82659
82668
  console.log(source_default.dim("\u2500".repeat(40)));
82660
82669
  console.log();
82661
- console.log(" VibeFrame CLI is self-discoverable \u2014 no extra setup needed.");
82670
+ console.log(" VibeFrame CLI is self-discoverable - no extra setup needed.");
82662
82671
  console.log(" Claude Code can use these commands to understand the CLI:");
82663
82672
  console.log();
82664
82673
  console.log(` ${source_default.green("vibe --help")} All command groups`);
@@ -82763,7 +82772,7 @@ async function showConfig(opts = { verbose: false }) {
82763
82772
  if (!verbose && unsetCount > 0) {
82764
82773
  console.log(
82765
82774
  source_default.dim(
82766
- ` (${unsetCount} provider${unsetCount === 1 ? "" : "s"} unset \u2014 run with --verbose to list)`
82775
+ ` (${unsetCount} provider${unsetCount === 1 ? "" : "s"} unset - run with --verbose to list)`
82767
82776
  )
82768
82777
  );
82769
82778
  }
@@ -82834,7 +82843,7 @@ providers:
82834
82843
  # ${product} - Storyboard
82835
82844
 
82836
82845
  Pacing: keep beats 6-15 seconds. Longer beats render as static, overstuffed
82837
- scenes \u2014 split them instead.
82846
+ scenes - split them instead.
82838
82847
 
82839
82848
  Brief: ${brief}
82840
82849
 
@@ -83348,26 +83357,27 @@ function cmdQuote(value) {
83348
83357
  // src/commands/_shared/init-templates.ts
83349
83358
  var AGENTS_MD = `# AGENTS.md
83350
83359
 
83351
- This project uses [VibeFrame](https://github.com/vericontext/vibeframe) \u2014
83352
- a CLI for AI-powered video editing. The \`vibe\` command provides 80+
83353
- subcommands for video generation, editing, analysis, and pipeline
83354
- orchestration. Cost tiers below \u2014 **always confirm with the user before
83355
- running High / Very High tier commands**.
83360
+ This project uses [VibeFrame](https://github.com/vericontext/vibeframe) -
83361
+ a CLI for AI video generation on the user's own provider keys (Seedance,
83362
+ Runway, Veo, Kling), behind dry runs and a hard \`--max-cost\` ceiling.
83363
+ The \`vibe\` command provides 80+ subcommands for video generation,
83364
+ editing, and analysis. Cost tiers below - **always confirm with the user
83365
+ before running High / Very High tier commands**.
83356
83366
 
83357
83367
  ## Agent host coverage
83358
83368
 
83359
83369
  VibeFrame's CLI works with any bash-capable AI coding agent. Six host
83360
83370
  families have first-class auto-detection and scaffolds today:
83361
83371
 
83362
- - **Claude Code** \u2014 \`CLAUDE.md\` (this file's import wrapper) +
83372
+ - **Claude Code** - \`CLAUDE.md\` (this file's import wrapper) +
83363
83373
  \`AGENTS.md\` + \`/vibe-*\` slash commands.
83364
- - **OpenAI Codex** \u2014 reads \`AGENTS.md\` natively (agents.md spec).
83365
- - **Cursor** \u2014 reads \`AGENTS.md\` plus \`.cursor/rules/\` for project
83374
+ - **OpenAI Codex** - reads \`AGENTS.md\` natively (agents.md spec).
83375
+ - **Cursor** - reads \`AGENTS.md\` plus \`.cursor/rules/\` for project
83366
83376
  rules; supports MCP via \`.cursor/mcp.json\`.
83367
- - **Aider** \u2014 reads \`AGENTS.md\` (binary-only detection by VibeFrame).
83368
- - **Gemini CLI** \u2014 primary context file is \`GEMINI.md\`; also reads
83377
+ - **Aider** - reads \`AGENTS.md\` (binary-only detection by VibeFrame).
83378
+ - **Gemini CLI** - primary context file is \`GEMINI.md\`; also reads
83369
83379
  \`AGENTS.md\` if present.
83370
- - **OpenCode** \u2014 reads \`AGENTS.md\` (officially supported per
83380
+ - **OpenCode** - reads \`AGENTS.md\` (officially supported per
83371
83381
  \`opencode.ai/docs/rules\`); supports MCP via \`.opencode/mcp.json\`.
83372
83382
 
83373
83383
  Run \`vibe doctor\` to see which host(s) the CLI detects in your
@@ -83377,7 +83387,7 @@ fallback.
83377
83387
 
83378
83388
  ## Self-discovery
83379
83389
 
83380
- Don't memorise the command surface \u2014 read it from the CLI:
83390
+ Don't memorise the command surface - read it from the CLI:
83381
83391
 
83382
83392
  \`\`\`bash
83383
83393
  vibe --help # command groups overview
@@ -83397,10 +83407,10 @@ vibe guide pipeline # step-by-step authoring guide (pipeline)
83397
83407
  Routing the user's request correctly is the most important judgement call
83398
83408
  you'll make. Do not force everything into a scene project.
83399
83409
 
83400
- **ASSET \u2014 default for any single-asset request OR ambiguous prompt.**
83410
+ **ASSET - default for any single-asset request OR ambiguous prompt.**
83401
83411
  If the user asks for a single image, single video clip, sound effect, music
83402
- bed, or narration file \u2014 **OR pastes a visual/audio brief without explicit
83403
- storyboard / scene / multi-scene language** \u2014 treat it as ASSET. Use
83412
+ bed, or narration file - **OR pastes a visual/audio brief without explicit
83413
+ storyboard / scene / multi-scene language** - treat it as ASSET. Use
83404
83414
  \`vibe generate ...\` directly. Do **not** edit \`DESIGN.md\`,
83405
83415
  \`STORYBOARD.md\`, run \`vibe scene ...\`, or auto-load the hyperframes
83406
83416
  skill until BUILD intent is explicit. The visual-identity hard-gate
@@ -83417,13 +83427,13 @@ If genuinely uncertain, ask one short question: *"single asset or
83417
83427
  multi-scene project?"* before authoring DESIGN.md or loading the
83418
83428
  hyperframes skill.
83419
83429
 
83420
- **BUILD \u2014 create new video from text intent.**
83430
+ **BUILD - create new video from text intent.**
83421
83431
  Use \`vibe build\` with a STORYBOARD.md + DESIGN.md. The
83422
83432
  skills-driven pipeline (v0.60+) dispatches narration TTS + backdrop
83423
83433
  image-gen per beat, composes scene HTML via the bundled composition rules
83424
83434
  bundle, then renders to MP4. Idempotent re-runs reuse cached assets.
83425
83435
 
83426
- **REMIX \u2014 transform existing video / audio.**
83436
+ **REMIX - transform existing video / audio.**
83427
83437
  Use \`vibe remix\`, \`vibe edit\`, or \`vibe audio\`. One-shot,
83428
83438
  batch-oriented operations on a file the user already has on disk.
83429
83439
  \`vibe edit text-overlay\` is the free deterministic path for simple static
@@ -83483,7 +83493,7 @@ starting from a media file and wants it transformed, it's REMIX.
83483
83493
  When you run vibe commands programmatically:
83484
83494
 
83485
83495
  1. **Always \`--json\`** for structured output you can parse without regex
83486
- 2. **Always \`--dry-run\` first** for any High/Very-High tier command \u2014 it returns
83496
+ 2. **Always \`--dry-run\` first** for any High/Very-High tier command - it returns
83487
83497
  the cost estimate without spending API budget
83488
83498
  3. **Use \`vibe schema <command>\`** to discover parameters; do not guess flags
83489
83499
  4. **Pass complex options via \`--stdin\`**:
@@ -83525,7 +83535,7 @@ vibe host doctor all --json # verify readiness
83525
83535
 
83526
83536
  Default setup is snippet-only; use \`--write\` when you want VibeFrame to merge
83527
83537
  the generated config. Keep provider keys in \`.vibeframe/config.yaml\`, user
83528
- config, or env files \u2014 not in app host config.
83538
+ config, or env files - not in app host config.
83529
83539
 
83530
83540
  ## Host agent loop
83531
83541
 
@@ -83536,7 +83546,7 @@ budget caps, \`build-report.json\`, \`review-report.json\`, \`nextActions\`,
83536
83546
  \`safeToAutoRun\`, \`requiresConfirmation\`, \`fixOwner\`, deterministic repair,
83537
83547
  and render inspection for the host agent to decide what to do next.
83538
83548
 
83539
- Copy-paste agent prompt (Codex) \u2014 a plain prompt, not a built-in command:
83549
+ Copy-paste agent prompt (Codex) - a plain prompt, not a built-in command:
83540
83550
 
83541
83551
  \`\`\`text
83542
83552
  Build this VibeFrame project into renders/final.mp4. Use --json for every
@@ -83553,7 +83563,7 @@ remaining host-agent issue is fixed, accepted with rationale, or reported as
83553
83563
  blocked.
83554
83564
  \`\`\`
83555
83565
 
83556
- Copy-paste agent prompt (Claude Code) \u2014 a plain prompt, not a built-in command:
83566
+ Copy-paste agent prompt (Claude Code) - a plain prompt, not a built-in command:
83557
83567
 
83558
83568
  \`\`\`text
83559
83569
  Finish this VibeFrame render using your host's agent loop as the outer
@@ -83568,7 +83578,7 @@ no unresolved unacknowledged host-agent issues.
83568
83578
 
83569
83579
  ### Composition rules (scene HTML)
83570
83580
 
83571
- Composition rules live in the **Hyperframes skill** \u2014 framework rules, motion
83581
+ Composition rules live in the **Hyperframes skill** - framework rules, motion
83572
83582
  principles, type system, and visual-identity hard-gate. **Load that skill
83573
83583
  before authoring any scene composition HTML under \`compositions/\`.** The same
83574
83584
  rules govern \`vibe scene lint\`, so your authored HTML and the linter stay in
@@ -83592,22 +83602,12 @@ containing live text/cards. Put ambient zoom/parallax on background or media
83592
83602
  layers only; text should enter briefly and then hold still at its final CSS
83593
83603
  position.
83594
83604
 
83595
- ### Scene composer (batch / non-agent fallback)
83605
+ ### Scene composer (non-agent fallback)
83596
83606
 
83597
- When you don't want to author HTML yourself, \`vibe build --mode batch\` runs an
83598
- LLM internally with the same skill bundle. It auto-picks a provider based
83599
- on available keys (\`claude > gemini > openai\`) \u2014 pass \`--composer <name>\`
83600
- to force one:
83601
-
83602
- | Provider | Env var | Spike notes (v0.70) |
83603
- |---|---|---|
83604
- | Claude (default) | \`ANTHROPIC_API_KEY\` | ~9 s/beat. Fastest, validated baseline. |
83605
- | Gemini | \`GOOGLE_API_KEY\` | ~20 s/beat. ~2.6\xD7 cheaper than Claude. |
83606
- | OpenAI | \`OPENAI_API_KEY\` | ~70 s/beat. gpt-5 reasoning latency \u2014 opt-in only. |
83607
-
83608
- All three pass first-shot lint at every effort tier on the \`vibeframe-promo\`
83609
- fixture. Quality on more complex storyboards may differ \u2014 fall back to
83610
- \`--composer claude\` if a non-default provider repeatedly fails lint.
83607
+ Scene HTML is authored by you, the host agent - the CLI makes no LLM call
83608
+ during \`vibe build\`. When no agent is available to author scenes, pass
83609
+ \`--composer template\` for the deterministic no-model composer
83610
+ (concat background + lower-thirds).
83611
83611
 
83612
83612
  ## Project conventions
83613
83613
 
@@ -83622,7 +83622,7 @@ var CLAUDE_MD = `@AGENTS.md
83622
83622
 
83623
83623
  # Claude Code overrides
83624
83624
 
83625
- This file imports \`AGENTS.md\` (above) \u2014 that's the canonical source.
83625
+ This file imports \`AGENTS.md\` (above) - that's the canonical source.
83626
83626
  Add anything Claude-Code-specific *below*; everything generic should
83627
83627
  stay in AGENTS.md so other agent hosts (Codex, Cursor, Aider, Gemini CLI, OpenCode) see it
83628
83628
  too.
@@ -83630,11 +83630,11 @@ too.
83630
83630
  ## Skills
83631
83631
 
83632
83632
  If you ran \`vibe init\` with Claude Code detected, the VibeFrame skill
83633
- pack is available as slash commands (consolidated to 2 in v0.62 \u2014 the
83633
+ pack is available as slash commands (consolidated to 2 in v0.62 - the
83634
83634
  overview content moved into AGENTS.md above):
83635
83635
 
83636
- - \`/vibe-pipeline\` \u2014 YAML pipeline authoring helper (Video as Code)
83637
- - \`/vibe-scene\` \u2014 per-scene HTML authoring + \`vibe build\`
83636
+ - \`/vibe-pipeline\` - YAML pipeline authoring helper (Video as Code)
83637
+ - \`/vibe-scene\` - per-scene HTML authoring + \`vibe build\`
83638
83638
 
83639
83639
  Claude-specific routing note: follow the ASSET / BUILD / REMIX decision
83640
83640
  rules in \`AGENTS.md\`. In particular, a request for one generated image or
@@ -83661,7 +83661,7 @@ var GEMINI_MD = `@AGENTS.md
83661
83661
 
83662
83662
  # Gemini CLI overrides
83663
83663
 
83664
- This project's canonical agent guidance lives in \`AGENTS.md\` \u2014 read
83664
+ This project's canonical agent guidance lives in \`AGENTS.md\` - read
83665
83665
  it first. The \`@AGENTS.md\` line above is the import marker; if
83666
83666
  Gemini CLI doesn't inline imported files in your version, open
83667
83667
  \`AGENTS.md\` directly. Both files are kept in sync by \`vibe init\`.
@@ -83678,11 +83678,11 @@ function renderEnvExample(opts = {}) {
83678
83678
  # Run \`vibe doctor\` to see what's currently detected.
83679
83679
 
83680
83680
  `;
83681
- return `# VibeFrame API keys \u2014 copy this file to \`.env\` and fill in what you need.
83681
+ return `# VibeFrame API keys - copy this file to \`.env\` and fill in what you need.
83682
83682
  # Free local fallbacks work without any keys. See README for the full list.
83683
83683
 
83684
83684
  ${fallback2}# \u2500\u2500 LLM provider / optional \`vibe agent\` fallback (pick one) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
83685
- ANTHROPIC_API_KEY= # Claude \u2014 recommended default
83685
+ ANTHROPIC_API_KEY= # Claude - recommended default
83686
83686
  OPENAI_API_KEY= # GPT-5-mini \xB7 Whisper \xB7 gpt-image-2
83687
83687
  GOOGLE_API_KEY= # Gemini \xB7 Veo
83688
83688
  XAI_API_KEY= # Grok image+video
@@ -83691,7 +83691,7 @@ OPENROUTER_API_KEY= # multiplexes any provider above
83691
83691
 
83692
83692
  # \u2500\u2500 Media providers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
83693
83693
  ELEVENLABS_API_KEY= # paid TTS / SFX / music (Kokoro is the free fallback)
83694
- FAL_API_KEY= # Seedance 2.0 \u2014 default video provider since v0.57
83694
+ FAL_API_KEY= # Seedance 2.0 - default video provider since v0.57
83695
83695
  IMGBB_API_KEY= # image hosting for Seedance/Kling image-to-video
83696
83696
  RUNWAY_API_SECRET= # Runway Gen-4.5 video
83697
83697
  KLING_API_KEY= # Kling video
@@ -85143,7 +85143,7 @@ function printNeedsAuthor(result) {
85143
85143
  console.log(" Then run: vibe build");
85144
85144
  console.log(
85145
85145
  source_default.dim(
85146
- " Use `vibe build --mode batch` when you want the CLI to call an LLM composer instead."
85146
+ " Use `vibe build --composer template` for the deterministic no-model composer instead."
85147
85147
  )
85148
85148
  );
85149
85149
  }
@@ -85798,7 +85798,7 @@ var doctorCommand = new Command("doctor").description("Check system health and a
85798
85798
  `
85799
85799
  Examples:
85800
85800
  $ vibe doctor Compact health summary (issues + Ready %)
85801
- $ vibe doctor --verbose Full report \u2014 all providers, composer, free commands
85801
+ $ vibe doctor --verbose Full report - all providers, composer, free commands
85802
85802
  $ vibe doctor --test-keys Validate each configured key against its provider
85803
85803
  $ vibe doctor --json Machine-readable output
85804
85804
  `
@@ -86140,11 +86140,11 @@ function printReport(results, opts = { verbose: false }) {
86140
86140
  );
86141
86141
  if (sc.composer) {
86142
86142
  console.log(
86143
- ` Revise LLM ${source_default.green("OK")} ${source_default.dim(`${composerLabel(sc.composer)} (${sc.composerEnvVar}) \u2014 powers 'vibe storyboard revise'`)}`
86143
+ ` Revise LLM ${source_default.green("OK")} ${source_default.dim(`${composerLabel(sc.composer)} (${sc.composerEnvVar}) - powers 'vibe storyboard revise'`)}`
86144
86144
  );
86145
86145
  } else {
86146
86146
  console.log(
86147
- ` Revise LLM ${source_default.yellow("--")} ${source_default.dim("no ANTHROPIC_API_KEY / GOOGLE_API_KEY / OPENAI_API_KEY \u2014 'vibe storyboard revise' unavailable")}`
86147
+ ` Revise LLM ${source_default.yellow("--")} ${source_default.dim("no ANTHROPIC_API_KEY / GOOGLE_API_KEY / OPENAI_API_KEY - 'vibe storyboard revise' unavailable")}`
86148
86148
  );
86149
86149
  }
86150
86150
  if (sc.sceneProjectInCwd) {
@@ -86158,7 +86158,7 @@ function printReport(results, opts = { verbose: false }) {
86158
86158
  }
86159
86159
  } else {
86160
86160
  console.log(
86161
- ` HF rules ${source_default.dim("(no STORYBOARD.md in cwd \u2014 rules are per-scene-project)")}`
86161
+ ` HF rules ${source_default.dim("(no STORYBOARD.md in cwd - rules are per-scene-project)")}`
86162
86162
  );
86163
86163
  }
86164
86164
  }
@@ -86282,7 +86282,7 @@ async function runLiveKeyTests(results) {
86282
86282
  );
86283
86283
  const configured = Object.entries(results.providers).filter(([, info]) => info.configured);
86284
86284
  if (configured.length === 0) {
86285
- console.log(source_default.dim(" No keys configured \u2014 nothing to test."));
86285
+ console.log(source_default.dim(" No keys configured - nothing to test."));
86286
86286
  return;
86287
86287
  }
86288
86288
  const { testKey: testKey2 } = await Promise.resolve().then(() => (init_key_live_test(), key_live_test_exports));
@@ -87236,7 +87236,7 @@ async function registerAllTools(registry) {
87236
87236
  // src/agent/prompts/system.ts
87237
87237
  function getSystemPrompt(context) {
87238
87238
  const projectInfo = context.projectPath ? `Current project: ${context.projectPath}` : "No timeline loaded. Use timeline_create or project_create to start.";
87239
- return `You are VibeFrame, an AI video editing assistant. You help users edit videos through natural language commands.
87239
+ return `You are VibeFrame, an AI video generation and editing assistant. You help users generate video from frontier models on their own provider keys - behind dry runs and cost caps - and edit the results, through natural language commands.
87240
87240
 
87241
87241
  ## Current Context
87242
87242
  - Working directory: ${context.workingDirectory}
@@ -87244,10 +87244,10 @@ function getSystemPrompt(context) {
87244
87244
 
87245
87245
  ## Your Capabilities
87246
87246
  You have access to tools for:
87247
- 1. **Timeline Management**: Create, open, save, and modify low-level timeline JSON state
87248
- 2. **Timeline Editing**: Add sources, create clips, add tracks, apply effects, trim, split, move, and delete clips
87249
- 3. **Media Analysis**: Detect scenes, silence, and beats in media files
87250
- 4. **AI Generation**: Generate images, videos, TTS, sound effects, music, and more
87247
+ 1. **AI Generation**: Generate images, videos, TTS, sound effects, music, and more on the user's provider keys
87248
+ 2. **Media Analysis**: Detect scenes, silence, and beats in media files
87249
+ 3. **Timeline Management**: Create, open, save, and modify low-level timeline JSON state
87250
+ 4. **Timeline Editing**: Add sources, create clips, add tracks, apply effects, trim, split, move, and delete clips
87251
87251
  5. **Export**: Export projects to video files
87252
87252
 
87253
87253
  ## Guidelines
@@ -88203,20 +88203,24 @@ async function markBannerShown() {
88203
88203
  function showFirstRunBanner() {
88204
88204
  console.log();
88205
88205
  console.log(source_default.cyan.bold(" Welcome to VibeFrame!"));
88206
- console.log(source_default.dim(" AI-native video editing from your terminal."));
88206
+ console.log(source_default.dim(" Frontier video generation for your coding agent. Your keys, your ceiling."));
88207
88207
  console.log();
88208
88208
  console.log(
88209
- ` ${source_default.white("1.")} ${source_default.green("vibe setup")} Configure API keys ${source_default.dim("(1 min)")}`
88209
+ ` ${source_default.white("1.")} ${source_default.green('vibe init demo --from "30s video"')} Scaffold a project ${source_default.dim("(no key needed)")}`
88210
+ );
88211
+ console.log(
88212
+ ` ${source_default.white("2.")} ${source_default.green("vibe build demo --dry-run")} Price it before any spend`
88213
+ );
88214
+ console.log(
88215
+ ` ${source_default.white("3.")} ${source_default.green("vibe setup")} Add provider keys when a step generates`
88210
88216
  );
88211
- console.log(` ${source_default.white("2.")} ${source_default.green("vibe doctor")} Check system health`);
88212
- console.log(` ${source_default.white("3.")} ${source_default.green("vibe --help")} See all commands`);
88213
88217
  console.log();
88214
88218
  console.log(source_default.dim(" Try without keys:"));
88215
88219
  console.log(
88216
- ` ${source_default.green("vibe demo")} Run sample edits on a test video`
88220
+ ` ${source_default.green("vibe build demo --dry-run --max-cost 5")} See the cost gate refuse an over-budget build`
88217
88221
  );
88222
+ console.log(source_default.dim(" vibe demo Run sample edits on a test video"));
88218
88223
  console.log(source_default.dim(" vibe edit silence-cut video.mp4 -o clean.mp4"));
88219
- console.log(source_default.dim(" vibe detect scenes video.mp4"));
88220
88224
  console.log();
88221
88225
  }
88222
88226
 
@@ -88280,7 +88284,7 @@ async function readStdin() {
88280
88284
  return Buffer.concat(chunks).toString("utf-8").trim();
88281
88285
  }
88282
88286
  var program2 = new Command();
88283
- program2.name("vibe").showSuggestionAfterError(true).description("VibeFrame CLI - video projects, AI media generation, and workflow automation").version(package_default.version).option("--json", "Output in JSON format").option("-q, --quiet", "Output only the primary result value (path, URL, or ID)").option("--fields <fields>", "Limit JSON output to specific fields (comma-separated)").option("--stdin", "Read options from stdin as JSON (for agent/script use)").option("--describe", "Show JSON schema for the command and exit (no execution)").exitOverride().configureOutput({
88287
+ program2.name("vibe").showSuggestionAfterError(true).description("VibeFrame CLI - AI video generation on your own provider keys, behind dry runs and a hard cost cap").version(package_default.version).option("--json", "Output in JSON format").option("-q, --quiet", "Output only the primary result value (path, URL, or ID)").option("--fields <fields>", "Limit JSON output to specific fields (comma-separated)").option("--stdin", "Read options from stdin as JSON (for agent/script use)").option("--describe", "Show JSON schema for the command and exit (no execution)").exitOverride().configureOutput({
88284
88288
  outputError: (str, write2) => {
88285
88289
  if (process.env.VIBE_JSON_OUTPUT === "1" || process.argv.includes("--json")) {
88286
88290
  const err = {