@vibeframe/cli 0.113.28 → 0.113.30
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 +22 -16
- package/dist/commands/_shared/init-templates.d.ts +5 -5
- package/dist/commands/_shared/scene-project.d.ts +11 -11
- package/dist/commands/_shared/walkthroughs/walkthroughs.d.ts +3 -3
- package/dist/commands/output.d.ts +21 -0
- package/dist/index.js +238 -239
- package/dist/tools/manifest/index.js +112 -91
- package/package.json +16 -8
|
@@ -24010,6 +24010,9 @@ function exitWithError(err) {
|
|
|
24010
24010
|
if (err.suggestion) {
|
|
24011
24011
|
console.error(source_default.dim(` ${err.suggestion}`));
|
|
24012
24012
|
}
|
|
24013
|
+
if (err.retryWith && err.retryWith.length > 0) {
|
|
24014
|
+
console.error(source_default.dim(` Retry: ${err.retryWith[0]}`));
|
|
24015
|
+
}
|
|
24013
24016
|
console.error();
|
|
24014
24017
|
}
|
|
24015
24018
|
process.exit(err.exitCode);
|
|
@@ -26064,12 +26067,12 @@ colors:
|
|
|
26064
26067
|
---
|
|
26065
26068
|
|
|
26066
26069
|
`;
|
|
26067
|
-
const intro = style ? `Visual identity for **${name}**, scaffolded from the **${style.name}** style (after ${style.designer}). Customise freely
|
|
26068
|
-
const moodLine = style ? `**Mood:** ${style.mood} \xB7 **Best for:** ${style.bestFor}` : `**Mood:** _(one line
|
|
26070
|
+
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.`;
|
|
26071
|
+
const moodLine = style ? `**Mood:** ${style.mood} \xB7 **Best for:** ${style.bestFor}` : `**Mood:** _(one line - what should the viewer FEEL?)_`;
|
|
26069
26072
|
const palette = style ? `${style.palette.map((c) => `- \`${c}\``).join("\n")}
|
|
26070
26073
|
|
|
26071
|
-
${style.paletteNotes}` : `- _hex_
|
|
26072
|
-
- _hex_
|
|
26074
|
+
${style.paletteNotes}` : `- _hex_ - primary
|
|
26075
|
+
- _hex_ - accent
|
|
26073
26076
|
|
|
26074
26077
|
_2\u20133 colours max. Declare explicit hex values; never name colours abstractly._`;
|
|
26075
26078
|
const typography = style ? style.typography : `_One family, two weights. State the role of each (headline / label / body)._`;
|
|
@@ -26083,7 +26086,7 @@ _2\u20133 colours max. Declare explicit hex values; never name colours abstractl
|
|
|
26083
26086
|
const avoid = style ? style.avoid.map((a) => `- ${a}`).join("\n") : `- _anti-pattern 1_
|
|
26084
26087
|
- _anti-pattern 2_
|
|
26085
26088
|
- _anti-pattern 3_`;
|
|
26086
|
-
return `${frontmatter}# ${name}
|
|
26089
|
+
return `${frontmatter}# ${name} - Design
|
|
26087
26090
|
|
|
26088
26091
|
> **Hard-gate (BUILD flow only).** This file is the visual contract for
|
|
26089
26092
|
> the scene-project flow (\`vibe build\`, \`vibe scene ...\`, composition
|
|
@@ -26127,12 +26130,12 @@ ${avoid}
|
|
|
26127
26130
|
---
|
|
26128
26131
|
|
|
26129
26132
|
_Browse other named styles: \`vibe scene list-styles\`_
|
|
26130
|
-
${style ? `_This file was seeded by \`vibe
|
|
26133
|
+
${style ? `_This file was seeded by \`vibe init --visual-style "${style.name}"\`._` : `_Seed this file from a named style: \`vibe init <dir> --visual-style "<name>"\`._`}
|
|
26131
26134
|
`;
|
|
26132
26135
|
}
|
|
26133
26136
|
function buildScriptMd(name, kind = DEFAULT_SCENE_KIND) {
|
|
26134
|
-
const intent = kind === "product" ? "Product walkthrough
|
|
26135
|
-
return `# ${name}
|
|
26137
|
+
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.";
|
|
26138
|
+
return `# ${name} - Script
|
|
26136
26139
|
|
|
26137
26140
|
> **Authoring order:** SCRIPT.md (this file) \u2192 STORYBOARD.md (beats + cues)${kindHasCast(kind) ? " \u2192 CHARACTERS.md (cast bible)" : ""}.
|
|
26138
26141
|
> ${intent}
|
|
@@ -26160,7 +26163,7 @@ Voiceover / on-screen: \u2026
|
|
|
26160
26163
|
`;
|
|
26161
26164
|
}
|
|
26162
26165
|
function buildCharactersMd(name) {
|
|
26163
|
-
return `# ${name}
|
|
26166
|
+
return `# ${name} - Characters
|
|
26164
26167
|
|
|
26165
26168
|
> Each character is referenced from STORYBOARD beats via the \`characters:\` cue.
|
|
26166
26169
|
> The reference sheet + identity block keep keyframes and image-to-video on-model
|
|
@@ -26169,8 +26172,8 @@ function buildCharactersMd(name) {
|
|
|
26169
26172
|
## hero
|
|
26170
26173
|
|
|
26171
26174
|
- **Reference sheet:** \`assets/characters/hero.png\` (a clean, front-lit full-body
|
|
26172
|
-
or portrait sheet
|
|
26173
|
-
- **Identity:** one paragraph of fixed, on-model traits
|
|
26175
|
+
or portrait sheet - the identity anchor for keyframe edits).
|
|
26176
|
+
- **Identity:** one paragraph of fixed, on-model traits - age, build, hair,
|
|
26174
26177
|
wardrobe, palette. Keep this stable across every beat.
|
|
26175
26178
|
- **Range:** expressions / poses this character should hit.
|
|
26176
26179
|
|
|
@@ -26188,14 +26191,14 @@ tts: auto
|
|
|
26188
26191
|
imageProvider: openai
|
|
26189
26192
|
---
|
|
26190
26193
|
|
|
26191
|
-
# ${name}
|
|
26194
|
+
# ${name} - Storyboard
|
|
26192
26195
|
|
|
26193
26196
|
Edit these beats before running \`vibe build\`. Each beat starts with
|
|
26194
26197
|
YAML cues that drive narration, backdrop generation, and timing.
|
|
26195
26198
|
Pacing: keep beats 6-15 seconds (split longer ones); a 90s video should
|
|
26196
26199
|
have 6-8 beats, not 3 long ones.
|
|
26197
26200
|
|
|
26198
|
-
## Beat hook
|
|
26201
|
+
## Beat hook - Hook
|
|
26199
26202
|
|
|
26200
26203
|
\`\`\`yaml
|
|
26201
26204
|
narration: "Introduce the promise in one crisp sentence."
|
|
@@ -26206,7 +26209,7 @@ duration: 4
|
|
|
26206
26209
|
Show the core visual identity immediately. Keep copy short enough for one
|
|
26207
26210
|
screen and one spoken breath.
|
|
26208
26211
|
|
|
26209
|
-
## Beat proof
|
|
26212
|
+
## Beat proof - Proof
|
|
26210
26213
|
|
|
26211
26214
|
\`\`\`yaml
|
|
26212
26215
|
narration: "Show the mechanism or proof point that makes the promise believable."
|
|
@@ -26217,7 +26220,7 @@ duration: 4
|
|
|
26217
26220
|
Use this beat for the concrete differentiator: command, workflow, metric, or
|
|
26218
26221
|
before/after.
|
|
26219
26222
|
|
|
26220
|
-
## Beat close
|
|
26223
|
+
## Beat close - Close
|
|
26221
26224
|
|
|
26222
26225
|
\`\`\`yaml
|
|
26223
26226
|
narration: "Close with the action the viewer should remember."
|
|
@@ -26230,7 +26233,7 @@ final beat.
|
|
|
26230
26233
|
`;
|
|
26231
26234
|
}
|
|
26232
26235
|
function buildProjectAgentsMd(name) {
|
|
26233
|
-
return `# ${name}
|
|
26236
|
+
return `# ${name} - Scene Authoring Project
|
|
26234
26237
|
|
|
26235
26238
|
This is the canonical cross-agent guidance file for this scene project.
|
|
26236
26239
|
Claude Code imports it through \`CLAUDE.md\`; Codex, Cursor, Aider,
|
|
@@ -26269,10 +26272,10 @@ contradict DESIGN.md are rejected by the Hyperframes \`hyperframes\`
|
|
|
26269
26272
|
skill.
|
|
26270
26273
|
|
|
26271
26274
|
Single-asset requests (\`vibe generate image|video|speech|...\`) do NOT
|
|
26272
|
-
consult this file
|
|
26275
|
+
consult this file - run the generate command directly.
|
|
26273
26276
|
|
|
26274
26277
|
Browse named styles: \`vibe scene list-styles\`. Re-seed from one with
|
|
26275
|
-
\`vibe
|
|
26278
|
+
\`vibe init . --visual-style "Swiss Pulse"\` (idempotent).
|
|
26276
26279
|
|
|
26277
26280
|
## Brief and local media
|
|
26278
26281
|
|
|
@@ -26284,8 +26287,9 @@ after init, those two files are the working source of truth.
|
|
|
26284
26287
|
Use \`media/\` for user-provided source files: product photos, screenshots,
|
|
26285
26288
|
logos, B-roll, recorded narration, or reference clips. Keep those inputs
|
|
26286
26289
|
inside this project so build references stay project-relative. Do not put user
|
|
26287
|
-
media in \`references/\`;
|
|
26288
|
-
rules
|
|
26290
|
+
media in \`references/\`; older VibeFrame versions vendored composition rules
|
|
26291
|
+
there, and current installs keep the rules under \`.agents/skills/hyperframes/\`
|
|
26292
|
+
via \`vibe scene install-skill\`.
|
|
26289
26293
|
|
|
26290
26294
|
When a beat should reuse a local file, reference it from \`STORYBOARD.md\`
|
|
26291
26295
|
with a project-relative path:
|
|
@@ -26341,7 +26345,7 @@ project-level agent loop; it provides \`--json\` commands, dry runs, cost caps,
|
|
|
26341
26345
|
\`requiresConfirmation\`, \`fixOwner\`, deterministic repair, and render
|
|
26342
26346
|
inspection for the host agent to reason over.
|
|
26343
26347
|
|
|
26344
|
-
Copy-paste agent prompts
|
|
26348
|
+
Copy-paste agent prompts - plain prompts, not a built-in command:
|
|
26345
26349
|
|
|
26346
26350
|
\`\`\`text
|
|
26347
26351
|
Build this VibeFrame project into renders/final.mp4. Use --json for every
|
|
@@ -26369,9 +26373,9 @@ target duration/aspect ratio, clean render inspection, any AI review score >= 90
|
|
|
26369
26373
|
no unresolved unacknowledged host-agent issues.
|
|
26370
26374
|
\`\`\`
|
|
26371
26375
|
|
|
26372
|
-
## Skills
|
|
26376
|
+
## Skills - USE THESE FIRST
|
|
26373
26377
|
|
|
26374
|
-
**Load the \`hyperframes\` skill before authoring scenes**
|
|
26378
|
+
**Load the \`hyperframes\` skill before authoring scenes** - it encodes the
|
|
26375
26379
|
composition rules, motion principles, type system, and visual-identity gate.
|
|
26376
26380
|
If your agent has it installed globally it is already available; otherwise run
|
|
26377
26381
|
\`vibe scene install-skill\`, which runs upstream's installer and writes
|
|
@@ -26383,7 +26387,7 @@ semantics, VibeFrame pipeline conventions) that are NOT in generic web docs.
|
|
|
26383
26387
|
|
|
26384
26388
|
| Skill | Command | When to use |
|
|
26385
26389
|
| ----------------- | ---------------- | ------------------------------------------------------------------------------------- |
|
|
26386
|
-
| **hyperframes** | \`/hyperframes\` | Cinematic-quality composition
|
|
26390
|
+
| **hyperframes** | \`/hyperframes\` | Cinematic-quality composition - DESIGN.md hard-gate, named styles, motion principles |
|
|
26387
26391
|
| **vibe-scene** | \`/vibe-scene\` | VibeFrame's authoring loop, AI assets, lint feedback, pipeline integration |
|
|
26388
26392
|
| **gsap** | \`/gsap\` | GSAP tweens, timelines, easing |
|
|
26389
26393
|
|
|
@@ -26394,22 +26398,22 @@ npx skills add heygen-com/hyperframes
|
|
|
26394
26398
|
\`\`\`
|
|
26395
26399
|
|
|
26396
26400
|
Restart your agent session (or reload the skill list) after installing.
|
|
26397
|
-
If skills aren't available, follow the **Key Rules** below
|
|
26401
|
+
If skills aren't available, follow the **Key Rules** below - they cover
|
|
26398
26402
|
the framework-level minimum, not the cinematic craft layer.
|
|
26399
26403
|
|
|
26400
26404
|
## Project structure
|
|
26401
26405
|
|
|
26402
|
-
- \`DESIGN.md\`
|
|
26403
|
-
- \`STORYBOARD.md\`
|
|
26404
|
-
- \`media/\`
|
|
26405
|
-
- \`index.html\`
|
|
26406
|
-
- \`compositions/scene-*.html\`
|
|
26407
|
-
- \`assets/\`
|
|
26408
|
-
- \`.agents/skills/hyperframes/\`
|
|
26409
|
-
- \`transcript.json\`
|
|
26410
|
-
- \`hyperframes.json\`
|
|
26411
|
-
- \`vibe.config.json\`
|
|
26412
|
-
- \`renders/\`
|
|
26406
|
+
- \`DESIGN.md\` - visual identity contract (palette, type, motion, transitions)
|
|
26407
|
+
- \`STORYBOARD.md\` - per-beat narration/backdrop/duration cues for \`vibe build\`
|
|
26408
|
+
- \`media/\` - user-provided source files (photos, logos, clips, voice recordings)
|
|
26409
|
+
- \`index.html\` - root composition (timeline)
|
|
26410
|
+
- \`compositions/scene-*.html\` - per-scene HTML authored by you or the agent
|
|
26411
|
+
- \`assets/\` - generated/canonical build media (narration audio, images, video)
|
|
26412
|
+
- \`.agents/skills/hyperframes/\` - upstream composition rules, when installed here rather than globally
|
|
26413
|
+
- \`transcript.json\` - Whisper word-level transcript (if narration exists)
|
|
26414
|
+
- \`hyperframes.json\` - HF registry config (speak to both toolchains)
|
|
26415
|
+
- \`vibe.config.json\` - canonical VibeFrame config (providers, budget)
|
|
26416
|
+
- \`renders/\` - output MP4s
|
|
26413
26417
|
|
|
26414
26418
|
## Commands
|
|
26415
26419
|
|
|
@@ -26419,16 +26423,28 @@ vibe build # STORYBOARD.md \u219
|
|
|
26419
26423
|
vibe scene lint # Validate scenes (in-process HF linter)
|
|
26420
26424
|
vibe render # Render to MP4
|
|
26421
26425
|
|
|
26422
|
-
# Hyperframes CLI (if installed
|
|
26426
|
+
# Hyperframes CLI (if installed - works in this project too)
|
|
26423
26427
|
npx hyperframes preview
|
|
26424
26428
|
npx hyperframes render
|
|
26425
26429
|
\`\`\`
|
|
26426
26430
|
|
|
26427
26431
|
## Key Rules (for hand-authored scene HTML)
|
|
26428
26432
|
|
|
26433
|
+
0. A scene file is a \`<template id="scene-<id>-template">\` wrapping ONE
|
|
26434
|
+
composition div - not a standalone \`<!doctype html>\` document:
|
|
26435
|
+
\`\`\`html
|
|
26436
|
+
<template id="scene-hook-template">
|
|
26437
|
+
<div data-composition-id="scene-hook" data-start="0" data-duration="3.3"
|
|
26438
|
+
data-width="1920" data-height="1080">\u2026</div>
|
|
26439
|
+
</template>
|
|
26440
|
+
\`\`\`
|
|
26441
|
+
The composition div **MUST** carry \`data-width\` and \`data-height\`.
|
|
26429
26442
|
1. Every timed element needs \`data-start\`, \`data-duration\`, and \`data-track-index\`.
|
|
26430
|
-
2. Elements with timing **MUST** have \`class="clip"\`
|
|
26431
|
-
3. Timelines must be paused and registered on \`window.__timelines
|
|
26443
|
+
2. Elements with timing **MUST** have \`class="clip"\` - the framework uses this for visibility control.
|
|
26444
|
+
3. Timelines must be paused and registered on \`window.__timelines\`, which is an
|
|
26445
|
+
OBJECT keyed by composition id - not an array, and \`.push()\` leaves the
|
|
26446
|
+
timeline undiscovered, which renders a black frame because \`gsap.from\` holds
|
|
26447
|
+
elements at their start state:
|
|
26432
26448
|
\`\`\`js
|
|
26433
26449
|
window.__timelines = window.__timelines || {};
|
|
26434
26450
|
window.__timelines["composition-id"] = gsap.timeline({ paused: true });
|
|
@@ -26439,12 +26455,12 @@ npx hyperframes render
|
|
|
26439
26455
|
\`filter\` tweens to \`.scene-content\` or any ancestor containing live text.
|
|
26440
26456
|
Animate background/media layers instead; text/cards should enter briefly and
|
|
26441
26457
|
then hold still at their final CSS positions.
|
|
26442
|
-
7. Only deterministic logic
|
|
26458
|
+
7. Only deterministic logic - no \`Date.now()\`, \`Math.random()\`, or network fetches.
|
|
26443
26459
|
|
|
26444
|
-
## Linting
|
|
26460
|
+
## Linting - run after changes
|
|
26445
26461
|
|
|
26446
26462
|
\`\`\`bash
|
|
26447
|
-
vibe scene lint # preferred
|
|
26463
|
+
vibe scene lint # preferred - in-process, no network
|
|
26448
26464
|
vibe scene lint --fix # auto-fix mechanical issues
|
|
26449
26465
|
vibe scene lint --json # structured output for agent loops
|
|
26450
26466
|
\`\`\`
|
|
@@ -26453,7 +26469,7 @@ vibe scene lint --json # structured output for agent loops
|
|
|
26453
26469
|
function buildProjectClaudeMd(name) {
|
|
26454
26470
|
return `@AGENTS.md
|
|
26455
26471
|
|
|
26456
|
-
# ${name}
|
|
26472
|
+
# ${name} - Claude Code Overrides
|
|
26457
26473
|
|
|
26458
26474
|
This file imports \`AGENTS.md\`; keep cross-agent VibeFrame and
|
|
26459
26475
|
Hyperframes instructions there so Codex, Cursor, Aider, Gemini CLI, and
|
|
@@ -26462,7 +26478,7 @@ only when this project needs them.
|
|
|
26462
26478
|
`;
|
|
26463
26479
|
}
|
|
26464
26480
|
function buildSceneGitignore() {
|
|
26465
|
-
return `# VibeFrame
|
|
26481
|
+
return `# VibeFrame - caches, checkpoints, and project-scope config.yaml (may contain API keys)
|
|
26466
26482
|
.vibeframe/
|
|
26467
26483
|
|
|
26468
26484
|
# Render outputs
|
|
@@ -30749,10 +30765,10 @@ async function getComposePrompts(opts) {
|
|
|
30749
30765
|
error: msg
|
|
30750
30766
|
});
|
|
30751
30767
|
if (!existsSync8(designPath)) {
|
|
30752
|
-
return baseError(`DESIGN.md not found at ${designPath}. Run \`vibe
|
|
30768
|
+
return baseError(`DESIGN.md not found at ${designPath}. Run \`vibe init <dir>\` first.`);
|
|
30753
30769
|
}
|
|
30754
30770
|
if (!existsSync8(storyboardPath)) {
|
|
30755
|
-
return baseError(`STORYBOARD.md not found at ${storyboardPath}. Run \`vibe
|
|
30771
|
+
return baseError(`STORYBOARD.md not found at ${storyboardPath}. Run \`vibe init <dir>\` to create a starter, or add STORYBOARD.md with per-beat cues.`);
|
|
30756
30772
|
}
|
|
30757
30773
|
if (!hyperframesSkillAvailable(projectDir)) {
|
|
30758
30774
|
warnings.push(
|
|
@@ -30832,7 +30848,9 @@ function buildInstructions(args) {
|
|
|
30832
30848
|
if (args.skillRef) {
|
|
30833
30849
|
lines.push(`1. Read \`${args.skillRef}\` for the Hyperframes framework rules + house style. This is the visual-identity hard-gate.`);
|
|
30834
30850
|
} else {
|
|
30835
|
-
lines.push(
|
|
30851
|
+
lines.push(
|
|
30852
|
+
`1. Read this project's \`AGENTS.md\` section "Key Rules (for hand-authored scene HTML)" - written by \`vibe init\`, and the authoritative local contract. \`vibe scene install-skill\` adds Hyperframes' house style on top, but note it installs a ROUTER whose full contract sits behind \`/hyperframes-core\`, which resolves only in a host that has upstream's Hyperframes skills.`
|
|
30853
|
+
);
|
|
30836
30854
|
}
|
|
30837
30855
|
lines.push(`2. Read \`DESIGN.md\` for project-specific palette, typography, motion signature.`);
|
|
30838
30856
|
if (args.compositionRef) {
|
|
@@ -30842,6 +30860,7 @@ function buildInstructions(args) {
|
|
|
30842
30860
|
lines.push(`3b. Use each beat's \`finalDurationSec\` (narration-synced) for \`data-duration\` and timeline anchors when present \u2014 NOT the storyboard \`duration\`, which is only the minimum. Scenes composed at the storyboard duration end early and render black tails.`);
|
|
30843
30861
|
lines.push(`3c. Never give inner \`.clip\` elements a non-zero \`data-start\` \u2014 the renderer does not toggle internal clip visibility inside sub-compositions, so phased clips render all phases at once (overlapping text). Use full-window clips and GSAP autoAlpha phase transitions instead. Also keep beats 6-15s; split anything longer in the storyboard first.`);
|
|
30844
30862
|
lines.push(`3d. If your environment cannot write files (e.g. Claude Desktop / MCP-only hosts), author each beat's HTML and submit it with the \`scene_submit\` tool (beat id + html). It validates with the same Hyperframes lint and writes the file for you; on lint errors it returns the findings without writing \u2014 fix and resubmit.`);
|
|
30863
|
+
lines.push(`3e. Hard requirements the linter fails on, so satisfy them even without the full contract. A scene file is a \`<template id="scene-<id>-template">\` wrapping ONE \`<div data-composition-id="scene-<id>" data-start="0" data-duration="<sec>" data-width="1920" data-height="1080">\` \u2014 not a standalone \`<!doctype html>\` document. Register the paused GSAP timeline on the registry OBJECT keyed by composition id: \`window.__timelines = window.__timelines || {}; window.__timelines["scene-<id>"] = tl;\` \u2014 it is not an array, and \`.push()\` leaves the timeline undiscovered, which renders a black frame because \`gsap.from\` holds elements at their start state. Also put \`class="clip"\` on every timed element and give timeline-visible elements a stable \`id\`. Generate a reference scene with \`vibe scene add <id> --style <preset> --no-audio --no-image\` and match its shape.`);
|
|
30845
30864
|
if (args.beatCount > 1) {
|
|
30846
30865
|
lines.push(`4. After authoring all ${args.beatCount} beat(s), run \`vibe build <project> --stage sync --json\` to assemble the root composition (index.html) from the fragments. Lint needs that root, so sync comes first.`);
|
|
30847
30866
|
} else if (args.filtered) {
|
|
@@ -31940,7 +31959,7 @@ async function executeSceneRender(opts = {}) {
|
|
|
31940
31959
|
kind: "render",
|
|
31941
31960
|
beat: opts.beatId ?? null,
|
|
31942
31961
|
root,
|
|
31943
|
-
error: `Root composition not found: ${resolve20(projectDir, root)}. Run \`vibe
|
|
31962
|
+
error: `Root composition not found: ${resolve20(projectDir, root)}. Run \`vibe build ${projectDir}\` once to create the render scaffold, or scaffold it up front with \`vibe init <dir> --profile full\`.`
|
|
31944
31963
|
};
|
|
31945
31964
|
}
|
|
31946
31965
|
const chrome = await preflightChrome();
|
|
@@ -34188,7 +34207,7 @@ async function executeSceneBuild(opts) {
|
|
|
34188
34207
|
phase: "failed",
|
|
34189
34208
|
mode,
|
|
34190
34209
|
selectedStage,
|
|
34191
|
-
error: `STORYBOARD.md not found at ${storyboardPath}. Run \`vibe
|
|
34210
|
+
error: `STORYBOARD.md not found at ${storyboardPath}. Run \`vibe init <dir>\` to create a starter, or add STORYBOARD.md with per-beat cues.`,
|
|
34192
34211
|
beats: [],
|
|
34193
34212
|
stageReports,
|
|
34194
34213
|
warnings,
|
|
@@ -52975,7 +52994,7 @@ function insertClipIntoRoot(rootHtml, clip) {
|
|
|
52975
52994
|
const closeMatch = rootHtml.match(/\n(\s*)<\/div>(\s*\n\s*<script>)/);
|
|
52976
52995
|
if (!closeMatch) {
|
|
52977
52996
|
throw new Error(
|
|
52978
|
-
"Could not find root composition closing </div>. Ensure index.html follows the layout from `vibe
|
|
52997
|
+
"Could not find root composition closing </div>. Ensure index.html follows the layout from `vibe init`."
|
|
52979
52998
|
);
|
|
52980
52999
|
}
|
|
52981
53000
|
const closeIdx = closeMatch.index;
|
|
@@ -53376,7 +53395,7 @@ sceneCommand.command("list-styles").description("List vendored visual styles (or
|
|
|
53376
53395
|
console.log(source_default.dim("Show details: "), source_default.cyan('vibe scene list-styles "<name>"'));
|
|
53377
53396
|
console.log(
|
|
53378
53397
|
source_default.dim("Seed DESIGN.md:"),
|
|
53379
|
-
source_default.cyan('vibe
|
|
53398
|
+
source_default.cyan('vibe init <dir> --visual-style "<name>"')
|
|
53380
53399
|
);
|
|
53381
53400
|
return;
|
|
53382
53401
|
}
|
|
@@ -53411,7 +53430,7 @@ sceneCommand.command("list-styles").description("List vendored visual styles (or
|
|
|
53411
53430
|
console.log();
|
|
53412
53431
|
console.log(
|
|
53413
53432
|
source_default.dim("Seed DESIGN.md:"),
|
|
53414
|
-
source_default.cyan(`vibe
|
|
53433
|
+
source_default.cyan(`vibe init <dir> --visual-style "${style.name}"`)
|
|
53415
53434
|
);
|
|
53416
53435
|
});
|
|
53417
53436
|
sceneCommand.command("add").description("Add a new scene to a project: AI narration + image + per-scene HTML").argument("<name>", "Scene name (slugified into the composition id)").option("--style <preset>", `Style preset: ${SCENE_PRESETS.join(", ")}`, "simple").option(
|
|
@@ -53669,7 +53688,9 @@ async function executeSceneAdd(opts) {
|
|
|
53669
53688
|
error
|
|
53670
53689
|
});
|
|
53671
53690
|
if (!await pathExists2(rootPath)) {
|
|
53672
|
-
return errResult(
|
|
53691
|
+
return errResult(
|
|
53692
|
+
`Root composition not found: ${rootPath}. Run \`vibe build\` once to create the render scaffold, or scaffold it up front with \`vibe init <dir> --profile full\`.`
|
|
53693
|
+
);
|
|
53673
53694
|
}
|
|
53674
53695
|
if (!opts.force && await pathExists2(scenePath)) {
|
|
53675
53696
|
return errResult(`Scene already exists: ${sceneRel}. Re-run with --force to overwrite.`);
|
|
@@ -62544,13 +62565,15 @@ var agentOnlyTools = [
|
|
|
62544
62565
|
var SCENE_WALKTHROUGH = `# Scene authoring with vibe
|
|
62545
62566
|
|
|
62546
62567
|
A scene project is a directory that is **bilingual**: it works with both
|
|
62547
|
-
\`vibe\` and \`npx hyperframes\`.
|
|
62548
|
-
|
|
62568
|
+
\`vibe\` and \`npx hyperframes\`. Scene composition is Hyperframes' job:
|
|
62569
|
+
each scene is one HTML file with scoped CSS and a paused GSAP timeline,
|
|
62570
|
+
authored to upstream's composition rules (install them with
|
|
62571
|
+
\`vibe scene install-skill\`). Cheap to edit, cheap to lint, expensive only
|
|
62549
62572
|
at render.
|
|
62550
62573
|
|
|
62551
|
-
\`vibe build\`
|
|
62552
|
-
|
|
62553
|
-
|
|
62574
|
+
\`vibe build\` is the supported one-shot driver from a written storyboard
|
|
62575
|
+
to an MP4. The host agent authors the per-beat HTML - the CLI makes no
|
|
62576
|
+
internal LLM call.
|
|
62554
62577
|
|
|
62555
62578
|
## Three authoring paths
|
|
62556
62579
|
|
|
@@ -62565,20 +62588,20 @@ narration / backdrop intent.
|
|
|
62565
62588
|
|
|
62566
62589
|
## High-craft path
|
|
62567
62590
|
|
|
62568
|
-
1. \`vibe init my-promo --visual-style "Swiss Pulse"\`
|
|
62591
|
+
1. \`vibe init my-promo --visual-style "Swiss Pulse"\` - seeds
|
|
62569
62592
|
\`DESIGN.md\` (palette, typography, motion, transitions) plus the
|
|
62570
62593
|
\`vibe.config.json\` / \`hyperframes.json\` / \`index.html\` scaffold.
|
|
62571
62594
|
It does **not** install the composition rules; if your agent does not
|
|
62572
62595
|
already have the \`hyperframes\` skill, run
|
|
62573
62596
|
\`vibe scene install-skill\` to fetch them from upstream into
|
|
62574
62597
|
\`.agents/skills/hyperframes/\`.
|
|
62575
|
-
2. Read \`.agents/skills/hyperframes/SKILL.md\` (or your global copy)
|
|
62598
|
+
2. Read \`.agents/skills/hyperframes/SKILL.md\` (or your global copy) -
|
|
62576
62599
|
framework rules, motion principles, type system, transition recipes.
|
|
62577
|
-
3. Read \`DESIGN.md\`
|
|
62600
|
+
3. Read \`DESIGN.md\` - project-specific palette / typography / motion
|
|
62578
62601
|
signature (visual identity hard-gate).
|
|
62579
62602
|
4. Author each scene HTML directly under \`compositions/scene-<id>.html\`
|
|
62580
62603
|
using the rules from steps 2 and 3. The skill enforces the visual
|
|
62581
|
-
identity contract
|
|
62604
|
+
identity contract - scenes that contradict DESIGN.md fail lint.
|
|
62582
62605
|
5. \`vibe scene lint --fix\` for mechanical issues, \`vibe render my-promo\`
|
|
62583
62606
|
to MP4.
|
|
62584
62607
|
|
|
@@ -62592,16 +62615,16 @@ vibe scene lint
|
|
|
62592
62615
|
vibe render my-promo
|
|
62593
62616
|
\`\`\`
|
|
62594
62617
|
|
|
62595
|
-
\`vibe init\` is **idempotent**
|
|
62618
|
+
\`vibe init\` is **idempotent** - running it on an existing Hyperframes
|
|
62596
62619
|
directory merges \`hyperframes.json\` instead of clobbering it. Safe to
|
|
62597
62620
|
invoke on user-provided projects.
|
|
62598
62621
|
|
|
62599
62622
|
## Subcommands
|
|
62600
62623
|
|
|
62601
62624
|
\`\`\`bash
|
|
62602
|
-
# Project flow (top-level
|
|
62625
|
+
# Project flow (top-level - preferred entry points)
|
|
62603
62626
|
vibe init <dir> [-r 16:9|9:16|1:1|4:5] [-d <sec>] [--visual-style "<name>"]
|
|
62604
|
-
vibe build [<dir>] [--
|
|
62627
|
+
vibe build [<dir>] [--composer template] # agent authors scenes by default
|
|
62605
62628
|
vibe render [<dir>] [--fps 30] [--quality standard] [--format mp4]
|
|
62606
62629
|
|
|
62607
62630
|
# Lower-level scene authoring
|
|
@@ -62614,11 +62637,11 @@ vibe scene lint [<root>] [--json] [--fix]
|
|
|
62614
62637
|
|
|
62615
62638
|
## Style presets (for \`vibe scene add --style\`)
|
|
62616
62639
|
|
|
62617
|
-
- **simple**
|
|
62618
|
-
- **announcement**
|
|
62619
|
-
- **explainer**
|
|
62620
|
-
- **kinetic-type**
|
|
62621
|
-
- **product-shot**
|
|
62640
|
+
- **simple** - backdrop + bottom caption (default)
|
|
62641
|
+
- **announcement** - single huge headline, gradient text
|
|
62642
|
+
- **explainer** - kicker + title + subtitle stack
|
|
62643
|
+
- **kinetic-type** - words animate in word-by-word
|
|
62644
|
+
- **product-shot** - corner label + bottom headline + slow zoom
|
|
62622
62645
|
|
|
62623
62646
|
All presets accept \`--narration <text|file>\`, \`--visuals <prompt>\`,
|
|
62624
62647
|
\`--headline\`, \`--kicker\`. With \`--narration\`, scene duration auto-derives
|
|
@@ -62628,21 +62651,19 @@ from the generated TTS audio.
|
|
|
62628
62651
|
|
|
62629
62652
|
\`\`\`bash
|
|
62630
62653
|
vibe init my-promo --visual-style "Swiss Pulse" -d 12
|
|
62631
|
-
# (edit STORYBOARD.md with per-beat YAML cues
|
|
62654
|
+
# (edit STORYBOARD.md with per-beat YAML cues - narration, backdrop, duration)
|
|
62632
62655
|
vibe build my-promo
|
|
62633
62656
|
\`\`\`
|
|
62634
62657
|
|
|
62635
62658
|
\`vibe build\` reads the STORYBOARD frontmatter + per-beat cues,
|
|
62636
62659
|
dispatches TTS + image-gen per beat, then either:
|
|
62637
62660
|
|
|
62638
|
-
-
|
|
62639
|
-
\`
|
|
62640
|
-
|
|
62641
|
-
|
|
62642
|
-
- **\`--
|
|
62643
|
-
|
|
62644
|
-
|
|
62645
|
-
\`VIBE_BUILD_MODE\` env var overrides the auto-resolve.
|
|
62661
|
+
- **Agent authoring** (default) - emits a \`needs-author\` plan via
|
|
62662
|
+
\`vibe scene compose-prompts\`. The host agent authors each
|
|
62663
|
+
\`compositions/scene-<id>.html\` itself, then re-invoking \`vibe build\`
|
|
62664
|
+
proceeds to lint + render. The CLI makes no internal LLM call.
|
|
62665
|
+
- **\`--composer template\`** - the deterministic no-model composer
|
|
62666
|
+
(concat background + lower-thirds), for when no agent is available.
|
|
62646
62667
|
|
|
62647
62668
|
## Lint feedback loop
|
|
62648
62669
|
|
|
@@ -62652,7 +62673,7 @@ vibe scene lint --json --fix
|
|
|
62652
62673
|
|
|
62653
62674
|
Returns structured findings. The recommended loop: 1) run lint with
|
|
62654
62675
|
\`--fix\` (mechanical fixes applied), 2) if \`errorCount > 0\`, edit the
|
|
62655
|
-
scene HTML, 3) re-lint. Cap retries at 3
|
|
62676
|
+
scene HTML, 3) re-lint. Cap retries at 3 - if errors persist, fall back
|
|
62656
62677
|
to a template preset (\`vibe scene add <id> --style simple --force\`)
|
|
62657
62678
|
and surface the error to the user.
|
|
62658
62679
|
|
|
@@ -62728,9 +62749,9 @@ The full set lives in \`packages/cli/src/pipeline/executor.ts\`.
|
|
|
62728
62749
|
|
|
62729
62750
|
## Variable references
|
|
62730
62751
|
|
|
62731
|
-
- \`$<step-id>.output\`
|
|
62732
|
-
- \`$<step-id>.result.<field>\`
|
|
62733
|
-
- \`\${ENV_VAR}\`
|
|
62752
|
+
- \`$<step-id>.output\` - previous step's output path
|
|
62753
|
+
- \`$<step-id>.result.<field>\` - structured field from JSON result
|
|
62754
|
+
- \`\${ENV_VAR}\` - environment variable
|
|
62734
62755
|
- Values can be templated: \`"\${SCRIPT_TITLE} - Episode \${EPISODE}"\`
|
|
62735
62756
|
|
|
62736
62757
|
## Running
|
|
@@ -62747,12 +62768,12 @@ Checkpoints land next to the YAML: \`pipeline.yaml.checkpoint.json\`.
|
|
|
62747
62768
|
|
|
62748
62769
|
## Authoring tips
|
|
62749
62770
|
|
|
62750
|
-
1. **Start from a tiny YAML**
|
|
62771
|
+
1. **Start from a tiny YAML** - keep it in your project directory and run
|
|
62751
62772
|
\`vibe run pipeline.yaml --dry-run\` before spending provider budget.
|
|
62752
|
-
2. **Dry-run first**
|
|
62773
|
+
2. **Dry-run first** - you see estimated cost and resolved variable
|
|
62753
62774
|
graph before spending API credits.
|
|
62754
62775
|
3. **Keep step ids short and descriptive** (\`intro\`, \`scene1\`, \`voice\`,
|
|
62755
|
-
\`bgm\`)
|
|
62776
|
+
\`bgm\`) - they appear in logs and variable refs.
|
|
62756
62777
|
4. **Name outputs** with extensions matching the action (\`.mp4\`, \`.mp3\`,
|
|
62757
62778
|
\`.png\`, \`.json\`).
|
|
62758
62779
|
5. **Declare \`budget:\`** on expensive pipelines:
|
|
@@ -62776,9 +62797,9 @@ When the user has a working shell sequence, extract steps:
|
|
|
62776
62797
|
- Wrap the entire chain in a \`name:\` + \`steps:\` skeleton
|
|
62777
62798
|
|
|
62778
62799
|
The \`compose\` action is the catch-all assembly step (audio mux, video
|
|
62779
|
-
overlay, etc.)
|
|
62800
|
+
overlay, etc.) - useful at the tail of a pipeline.
|
|
62780
62801
|
`;
|
|
62781
|
-
var ARCHITECTURE_WALKTHROUGH = `# vibe agent / build / run
|
|
62802
|
+
var ARCHITECTURE_WALKTHROUGH = `# vibe agent / build / run - when to pick which
|
|
62782
62803
|
|
|
62783
62804
|
The CLI has three orchestrating commands that coordinate other primitives:
|
|
62784
62805
|
\`vibe agent\`, \`vibe build\`, \`vibe run\`. New users routinely ask which one
|
|
@@ -62807,14 +62828,14 @@ built-in fallback when you do not already have an agent host.
|
|
|
62807
62828
|
- "I have a finished script + visual identity" \u2192 \`vibe build\`
|
|
62808
62829
|
- "I want this to run again next month" \u2192 \`vibe run\`
|
|
62809
62830
|
|
|
62810
|
-
If two seem to fit, pick the rightmost one
|
|
62831
|
+
If two seem to fit, pick the rightmost one - more reproducible, less surprise.
|
|
62811
62832
|
|
|
62812
62833
|
## Cost-tier awareness (v0.83+)
|
|
62813
62834
|
|
|
62814
62835
|
Every primitive subcommand carries a cost tier (\`free\` / \`low\` / \`high\` /
|
|
62815
62836
|
\`very-high\`). \`vibe schema --list\` exposes the tier as JSON, and each
|
|
62816
62837
|
\`vibe <group> <sub> --help\` page shows it as a colored footer. Use
|
|
62817
|
-
\`vibe doctor --test-keys\` before kicking off any high-cost orchestrator
|
|
62838
|
+
\`vibe doctor --test-keys\` before kicking off any high-cost orchestrator -
|
|
62818
62839
|
a single bad key wastes time and money.
|
|
62819
62840
|
|
|
62820
62841
|
## Cross-command primitives
|
|
@@ -62924,7 +62945,7 @@ var META = {
|
|
|
62924
62945
|
title: "YAML pipelines (Video as Code)",
|
|
62925
62946
|
summary: "Author and run reproducible multi-step video workflows",
|
|
62926
62947
|
steps: [
|
|
62927
|
-
"Sketch the workflow as YAML
|
|
62948
|
+
"Sketch the workflow as YAML - `name`, `description`, then `steps:` with `id` + `action` + inputs/outputs.",
|
|
62928
62949
|
"Reference previous step outputs via `$<step-id>.output` (or `$<step-id>.result.<field>` for structured returns).",
|
|
62929
62950
|
"Run `vibe run pipeline.yaml --dry-run` to see the resolved graph + cost estimate before spending API budget.",
|
|
62930
62951
|
"Add a `budget:` block (tokens / cost_usd / max_tool_errors) to cap expensive runs.",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeframe/cli",
|
|
3
|
-
"version": "0.113.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.113.30",
|
|
4
|
+
"description": "Frontier AI video generation for coding agents - Seedance, Runway, Veo, and Kling on your own keys, behind a hard cost cap",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -12,13 +12,21 @@
|
|
|
12
12
|
"bugs": {
|
|
13
13
|
"url": "https://github.com/vericontext/vibeframe/issues"
|
|
14
14
|
},
|
|
15
|
+
"homepage": "https://vibeframe.ai",
|
|
15
16
|
"keywords": [
|
|
16
17
|
"vibeframe",
|
|
17
18
|
"cli",
|
|
18
|
-
"video
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
19
|
+
"ai-video",
|
|
20
|
+
"video-generation",
|
|
21
|
+
"text-to-video",
|
|
22
|
+
"image-to-video",
|
|
23
|
+
"seedance",
|
|
24
|
+
"runway",
|
|
25
|
+
"veo",
|
|
26
|
+
"kling",
|
|
27
|
+
"ai-agent",
|
|
28
|
+
"mcp",
|
|
29
|
+
"ffmpeg"
|
|
22
30
|
],
|
|
23
31
|
"type": "module",
|
|
24
32
|
"bin": {
|
|
@@ -83,8 +91,8 @@
|
|
|
83
91
|
"tsx": "^4.21.0",
|
|
84
92
|
"typescript": "^5.3.3",
|
|
85
93
|
"vitest": "^1.2.2",
|
|
86
|
-
"@vibeframe/
|
|
87
|
-
"@vibeframe/
|
|
94
|
+
"@vibeframe/core": "0.113.30",
|
|
95
|
+
"@vibeframe/ai-providers": "0.113.30"
|
|
88
96
|
},
|
|
89
97
|
"engines": {
|
|
90
98
|
"node": ">=20"
|