@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/CONTEXT.md +11 -9
- package/dist/commands/_shared/init-templates.d.ts +5 -5
- package/dist/commands/_shared/scene-project.d.ts +10 -10
- package/dist/commands/_shared/walkthroughs/walkthroughs.d.ts +3 -3
- package/dist/index.js +171 -167
- package/dist/tools/manifest/index.js +80 -79
- package/package.json +16 -8
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
|
|
26886
|
-
const moodLine = style ? `**Mood:** ${style.mood} \xB7 **Best for:** ${style.bestFor}` : `**Mood:** _(one line
|
|
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_
|
|
26890
|
-
- _hex_
|
|
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}
|
|
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
|
|
26953
|
-
return `# ${name}
|
|
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}
|
|
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
|
|
26991
|
-
- **Identity:** one paragraph of fixed, on-model traits
|
|
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}
|
|
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
|
|
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
|
|
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
|
|
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}
|
|
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
|
|
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/\`;
|
|
27106
|
-
rules
|
|
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
|
|
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
|
|
27191
|
+
## Skills - USE THESE FIRST
|
|
27191
27192
|
|
|
27192
|
-
**Load the \`hyperframes\` skill before authoring scenes**
|
|
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
|
|
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
|
|
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\`
|
|
27221
|
-
- \`STORYBOARD.md\`
|
|
27222
|
-
- \`media/\`
|
|
27223
|
-
- \`index.html\`
|
|
27224
|
-
- \`compositions/scene-*.html\`
|
|
27225
|
-
- \`assets/\`
|
|
27226
|
-
- \`.agents/skills/hyperframes/\`
|
|
27227
|
-
- \`transcript.json\`
|
|
27228
|
-
- \`hyperframes.json\`
|
|
27229
|
-
- \`vibe.config.json\`
|
|
27230
|
-
- \`renders/\`
|
|
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
|
|
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"\`
|
|
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
|
|
27261
|
+
7. Only deterministic logic - no \`Date.now()\`, \`Math.random()\`, or network fetches.
|
|
27261
27262
|
|
|
27262
|
-
## Linting
|
|
27263
|
+
## Linting - run after changes
|
|
27263
27264
|
|
|
27264
27265
|
\`\`\`bash
|
|
27265
|
-
vibe scene lint # preferred
|
|
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}
|
|
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
|
|
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\`.
|
|
57545
|
-
|
|
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\`
|
|
57549
|
-
|
|
57550
|
-
|
|
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"\`
|
|
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)
|
|
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\`
|
|
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
|
|
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**
|
|
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
|
|
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>] [--
|
|
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**
|
|
57615
|
-
- **announcement**
|
|
57616
|
-
- **explainer**
|
|
57617
|
-
- **kinetic-type**
|
|
57618
|
-
- **product-shot**
|
|
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
|
|
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
|
-
-
|
|
57636
|
-
\`
|
|
57637
|
-
|
|
57638
|
-
|
|
57639
|
-
- **\`--
|
|
57640
|
-
|
|
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
|
|
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\`
|
|
57729
|
-
- \`$<step-id>.result.<field>\`
|
|
57730
|
-
- \`\${ENV_VAR}\`
|
|
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**
|
|
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**
|
|
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\`)
|
|
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.)
|
|
57777
|
+
overlay, etc.) - useful at the tail of a pipeline.
|
|
57777
57778
|
`;
|
|
57778
|
-
ARCHITECTURE_WALKTHROUGH = `# vibe agent / build / run
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
74252
|
-
description: "
|
|
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
|
|
74267
|
-
"
|
|
74268
|
-
"
|
|
74269
|
-
"
|
|
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 (
|
|
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
|
|
81621
|
-
project ./.vibeframe/config.yaml
|
|
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)
|
|
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(`
|
|
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
|
-
`
|
|
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 ===
|
|
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 ===
|
|
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
|
|
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
|
|
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
|
|
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}
|
|
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
|
-
`
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
83352
|
-
a CLI for AI
|
|
83353
|
-
|
|
83354
|
-
|
|
83355
|
-
|
|
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**
|
|
83372
|
+
- **Claude Code** - \`CLAUDE.md\` (this file's import wrapper) +
|
|
83363
83373
|
\`AGENTS.md\` + \`/vibe-*\` slash commands.
|
|
83364
|
-
- **OpenAI Codex**
|
|
83365
|
-
- **Cursor**
|
|
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**
|
|
83368
|
-
- **Gemini CLI**
|
|
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**
|
|
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
|
|
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
|
|
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
|
|
83403
|
-
storyboard / scene / multi-scene language**
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
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)
|
|
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**
|
|
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 (
|
|
83605
|
+
### Scene composer (non-agent fallback)
|
|
83596
83606
|
|
|
83597
|
-
|
|
83598
|
-
|
|
83599
|
-
|
|
83600
|
-
|
|
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)
|
|
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
|
|
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\`
|
|
83637
|
-
- \`/vibe-scene\`
|
|
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\`
|
|
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
|
|
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
|
|
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
|
|
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 --
|
|
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
|
|
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})
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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. **
|
|
87248
|
-
2. **
|
|
87249
|
-
3. **
|
|
87250
|
-
4. **
|
|
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("
|
|
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(
|
|
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")}
|
|
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
|
|
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 = {
|