@vibeframe/mcp-server 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/README.md +1 -1
- package/dist/index.js +117 -95
- package/package.json +13 -7
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @vibeframe/mcp-server
|
|
2
2
|
|
|
3
|
-
The MCP (Model Context Protocol) **server** for [VibeFrame](https://github.com/vericontext/vibeframe). This package is _only_ the MCP adapter
|
|
3
|
+
The MCP (Model Context Protocol) **server** for [VibeFrame](https://github.com/vericontext/vibeframe), the frontier-video-generation layer for coding agents: generate video assets on your own provider keys (Seedance, Runway, Veo, Kling), behind dry runs and a hard `--max-cost` ceiling. This package is _only_ the MCP adapter - it exposes VibeFrame's operations as typed MCP tools so an MCP-capable host can call them by natural language.
|
|
4
4
|
|
|
5
5
|
VibeFrame is CLI-first, not terminal-only. The CLI is the stable runtime; MCP is the app-host surface for clients that prefer typed tools over shell commands.
|
|
6
6
|
|
package/dist/index.js
CHANGED
|
@@ -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((c2) => `- \`${c2}\``).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((a4) => `- ${a4}`).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, kind3 = DEFAULT_SCENE_KIND) {
|
|
26134
|
-
const intent = kind3 === "product" ? "Product walkthrough
|
|
26135
|
-
return `# ${name}
|
|
26137
|
+
const intent = kind3 === "product" ? "Product walkthrough - what each section demonstrates, in order." : kind3 === "motion" ? "Motion piece - the message and the beats of on-screen text/graphics." : kind3 === "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(kind3) ? " \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
|
|
@@ -268803,10 +268819,10 @@ async function getComposePrompts(opts) {
|
|
|
268803
268819
|
error: msg
|
|
268804
268820
|
});
|
|
268805
268821
|
if (!existsSync43(designPath)) {
|
|
268806
|
-
return baseError(`DESIGN.md not found at ${designPath}. Run \`vibe
|
|
268822
|
+
return baseError(`DESIGN.md not found at ${designPath}. Run \`vibe init <dir>\` first.`);
|
|
268807
268823
|
}
|
|
268808
268824
|
if (!existsSync43(storyboardPath)) {
|
|
268809
|
-
return baseError(`STORYBOARD.md not found at ${storyboardPath}. Run \`vibe
|
|
268825
|
+
return baseError(`STORYBOARD.md not found at ${storyboardPath}. Run \`vibe init <dir>\` to create a starter, or add STORYBOARD.md with per-beat cues.`);
|
|
268810
268826
|
}
|
|
268811
268827
|
if (!hyperframesSkillAvailable(projectDir)) {
|
|
268812
268828
|
warnings.push(
|
|
@@ -268886,7 +268902,9 @@ function buildInstructions(args) {
|
|
|
268886
268902
|
if (args.skillRef) {
|
|
268887
268903
|
lines.push(`1. Read \`${args.skillRef}\` for the Hyperframes framework rules + house style. This is the visual-identity hard-gate.`);
|
|
268888
268904
|
} else {
|
|
268889
|
-
lines.push(
|
|
268905
|
+
lines.push(
|
|
268906
|
+
`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.`
|
|
268907
|
+
);
|
|
268890
268908
|
}
|
|
268891
268909
|
lines.push(`2. Read \`DESIGN.md\` for project-specific palette, typography, motion signature.`);
|
|
268892
268910
|
if (args.compositionRef) {
|
|
@@ -268896,6 +268914,7 @@ function buildInstructions(args) {
|
|
|
268896
268914
|
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.`);
|
|
268897
268915
|
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.`);
|
|
268898
268916
|
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.`);
|
|
268917
|
+
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.`);
|
|
268899
268918
|
if (args.beatCount > 1) {
|
|
268900
268919
|
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.`);
|
|
268901
268920
|
} else if (args.filtered) {
|
|
@@ -269990,7 +270009,7 @@ async function executeSceneRender(opts = {}) {
|
|
|
269990
270009
|
kind: "render",
|
|
269991
270010
|
beat: opts.beatId ?? null,
|
|
269992
270011
|
root: root2,
|
|
269993
|
-
error: `Root composition not found: ${resolve33(projectDir, root2)}. Run \`vibe
|
|
270012
|
+
error: `Root composition not found: ${resolve33(projectDir, root2)}. Run \`vibe build ${projectDir}\` once to create the render scaffold, or scaffold it up front with \`vibe init <dir> --profile full\`.`
|
|
269994
270013
|
};
|
|
269995
270014
|
}
|
|
269996
270015
|
const chrome2 = await preflightChrome();
|
|
@@ -272240,7 +272259,7 @@ async function executeSceneBuild(opts) {
|
|
|
272240
272259
|
phase: "failed",
|
|
272241
272260
|
mode,
|
|
272242
272261
|
selectedStage,
|
|
272243
|
-
error: `STORYBOARD.md not found at ${storyboardPath}. Run \`vibe
|
|
272262
|
+
error: `STORYBOARD.md not found at ${storyboardPath}. Run \`vibe init <dir>\` to create a starter, or add STORYBOARD.md with per-beat cues.`,
|
|
272244
272263
|
beats: [],
|
|
272245
272264
|
stageReports,
|
|
272246
272265
|
warnings,
|
|
@@ -305085,7 +305104,7 @@ function insertClipIntoRoot(rootHtml, clip) {
|
|
|
305085
305104
|
const closeMatch = rootHtml.match(/\n(\s*)<\/div>(\s*\n\s*<script>)/);
|
|
305086
305105
|
if (!closeMatch) {
|
|
305087
305106
|
throw new Error(
|
|
305088
|
-
"Could not find root composition closing </div>. Ensure index.html follows the layout from `vibe
|
|
305107
|
+
"Could not find root composition closing </div>. Ensure index.html follows the layout from `vibe init`."
|
|
305089
305108
|
);
|
|
305090
305109
|
}
|
|
305091
305110
|
const closeIdx = closeMatch.index;
|
|
@@ -305486,7 +305505,7 @@ sceneCommand.command("list-styles").description("List vendored visual styles (or
|
|
|
305486
305505
|
console.log(source_default.dim("Show details: "), source_default.cyan('vibe scene list-styles "<name>"'));
|
|
305487
305506
|
console.log(
|
|
305488
305507
|
source_default.dim("Seed DESIGN.md:"),
|
|
305489
|
-
source_default.cyan('vibe
|
|
305508
|
+
source_default.cyan('vibe init <dir> --visual-style "<name>"')
|
|
305490
305509
|
);
|
|
305491
305510
|
return;
|
|
305492
305511
|
}
|
|
@@ -305521,7 +305540,7 @@ sceneCommand.command("list-styles").description("List vendored visual styles (or
|
|
|
305521
305540
|
console.log();
|
|
305522
305541
|
console.log(
|
|
305523
305542
|
source_default.dim("Seed DESIGN.md:"),
|
|
305524
|
-
source_default.cyan(`vibe
|
|
305543
|
+
source_default.cyan(`vibe init <dir> --visual-style "${style.name}"`)
|
|
305525
305544
|
);
|
|
305526
305545
|
});
|
|
305527
305546
|
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(
|
|
@@ -305779,7 +305798,9 @@ async function executeSceneAdd(opts) {
|
|
|
305779
305798
|
error
|
|
305780
305799
|
});
|
|
305781
305800
|
if (!await pathExists2(rootPath)) {
|
|
305782
|
-
return errResult(
|
|
305801
|
+
return errResult(
|
|
305802
|
+
`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\`.`
|
|
305803
|
+
);
|
|
305783
305804
|
}
|
|
305784
305805
|
if (!opts.force && await pathExists2(scenePath)) {
|
|
305785
305806
|
return errResult(`Scene already exists: ${sceneRel}. Re-run with --force to overwrite.`);
|
|
@@ -314669,13 +314690,15 @@ import { z as z17 } from "zod";
|
|
|
314669
314690
|
var SCENE_WALKTHROUGH = `# Scene authoring with vibe
|
|
314670
314691
|
|
|
314671
314692
|
A scene project is a directory that is **bilingual**: it works with both
|
|
314672
|
-
\`vibe\` and \`npx hyperframes\`.
|
|
314673
|
-
|
|
314693
|
+
\`vibe\` and \`npx hyperframes\`. Scene composition is Hyperframes' job:
|
|
314694
|
+
each scene is one HTML file with scoped CSS and a paused GSAP timeline,
|
|
314695
|
+
authored to upstream's composition rules (install them with
|
|
314696
|
+
\`vibe scene install-skill\`). Cheap to edit, cheap to lint, expensive only
|
|
314674
314697
|
at render.
|
|
314675
314698
|
|
|
314676
|
-
\`vibe build\`
|
|
314677
|
-
|
|
314678
|
-
|
|
314699
|
+
\`vibe build\` is the supported one-shot driver from a written storyboard
|
|
314700
|
+
to an MP4. The host agent authors the per-beat HTML - the CLI makes no
|
|
314701
|
+
internal LLM call.
|
|
314679
314702
|
|
|
314680
314703
|
## Three authoring paths
|
|
314681
314704
|
|
|
@@ -314690,20 +314713,20 @@ narration / backdrop intent.
|
|
|
314690
314713
|
|
|
314691
314714
|
## High-craft path
|
|
314692
314715
|
|
|
314693
|
-
1. \`vibe init my-promo --visual-style "Swiss Pulse"\`
|
|
314716
|
+
1. \`vibe init my-promo --visual-style "Swiss Pulse"\` - seeds
|
|
314694
314717
|
\`DESIGN.md\` (palette, typography, motion, transitions) plus the
|
|
314695
314718
|
\`vibe.config.json\` / \`hyperframes.json\` / \`index.html\` scaffold.
|
|
314696
314719
|
It does **not** install the composition rules; if your agent does not
|
|
314697
314720
|
already have the \`hyperframes\` skill, run
|
|
314698
314721
|
\`vibe scene install-skill\` to fetch them from upstream into
|
|
314699
314722
|
\`.agents/skills/hyperframes/\`.
|
|
314700
|
-
2. Read \`.agents/skills/hyperframes/SKILL.md\` (or your global copy)
|
|
314723
|
+
2. Read \`.agents/skills/hyperframes/SKILL.md\` (or your global copy) -
|
|
314701
314724
|
framework rules, motion principles, type system, transition recipes.
|
|
314702
|
-
3. Read \`DESIGN.md\`
|
|
314725
|
+
3. Read \`DESIGN.md\` - project-specific palette / typography / motion
|
|
314703
314726
|
signature (visual identity hard-gate).
|
|
314704
314727
|
4. Author each scene HTML directly under \`compositions/scene-<id>.html\`
|
|
314705
314728
|
using the rules from steps 2 and 3. The skill enforces the visual
|
|
314706
|
-
identity contract
|
|
314729
|
+
identity contract - scenes that contradict DESIGN.md fail lint.
|
|
314707
314730
|
5. \`vibe scene lint --fix\` for mechanical issues, \`vibe render my-promo\`
|
|
314708
314731
|
to MP4.
|
|
314709
314732
|
|
|
@@ -314717,16 +314740,16 @@ vibe scene lint
|
|
|
314717
314740
|
vibe render my-promo
|
|
314718
314741
|
\`\`\`
|
|
314719
314742
|
|
|
314720
|
-
\`vibe init\` is **idempotent**
|
|
314743
|
+
\`vibe init\` is **idempotent** - running it on an existing Hyperframes
|
|
314721
314744
|
directory merges \`hyperframes.json\` instead of clobbering it. Safe to
|
|
314722
314745
|
invoke on user-provided projects.
|
|
314723
314746
|
|
|
314724
314747
|
## Subcommands
|
|
314725
314748
|
|
|
314726
314749
|
\`\`\`bash
|
|
314727
|
-
# Project flow (top-level
|
|
314750
|
+
# Project flow (top-level - preferred entry points)
|
|
314728
314751
|
vibe init <dir> [-r 16:9|9:16|1:1|4:5] [-d <sec>] [--visual-style "<name>"]
|
|
314729
|
-
vibe build [<dir>] [--
|
|
314752
|
+
vibe build [<dir>] [--composer template] # agent authors scenes by default
|
|
314730
314753
|
vibe render [<dir>] [--fps 30] [--quality standard] [--format mp4]
|
|
314731
314754
|
|
|
314732
314755
|
# Lower-level scene authoring
|
|
@@ -314739,11 +314762,11 @@ vibe scene lint [<root>] [--json] [--fix]
|
|
|
314739
314762
|
|
|
314740
314763
|
## Style presets (for \`vibe scene add --style\`)
|
|
314741
314764
|
|
|
314742
|
-
- **simple**
|
|
314743
|
-
- **announcement**
|
|
314744
|
-
- **explainer**
|
|
314745
|
-
- **kinetic-type**
|
|
314746
|
-
- **product-shot**
|
|
314765
|
+
- **simple** - backdrop + bottom caption (default)
|
|
314766
|
+
- **announcement** - single huge headline, gradient text
|
|
314767
|
+
- **explainer** - kicker + title + subtitle stack
|
|
314768
|
+
- **kinetic-type** - words animate in word-by-word
|
|
314769
|
+
- **product-shot** - corner label + bottom headline + slow zoom
|
|
314747
314770
|
|
|
314748
314771
|
All presets accept \`--narration <text|file>\`, \`--visuals <prompt>\`,
|
|
314749
314772
|
\`--headline\`, \`--kicker\`. With \`--narration\`, scene duration auto-derives
|
|
@@ -314753,21 +314776,19 @@ from the generated TTS audio.
|
|
|
314753
314776
|
|
|
314754
314777
|
\`\`\`bash
|
|
314755
314778
|
vibe init my-promo --visual-style "Swiss Pulse" -d 12
|
|
314756
|
-
# (edit STORYBOARD.md with per-beat YAML cues
|
|
314779
|
+
# (edit STORYBOARD.md with per-beat YAML cues - narration, backdrop, duration)
|
|
314757
314780
|
vibe build my-promo
|
|
314758
314781
|
\`\`\`
|
|
314759
314782
|
|
|
314760
314783
|
\`vibe build\` reads the STORYBOARD frontmatter + per-beat cues,
|
|
314761
314784
|
dispatches TTS + image-gen per beat, then either:
|
|
314762
314785
|
|
|
314763
|
-
-
|
|
314764
|
-
\`
|
|
314765
|
-
|
|
314766
|
-
|
|
314767
|
-
- **\`--
|
|
314768
|
-
|
|
314769
|
-
|
|
314770
|
-
\`VIBE_BUILD_MODE\` env var overrides the auto-resolve.
|
|
314786
|
+
- **Agent authoring** (default) - emits a \`needs-author\` plan via
|
|
314787
|
+
\`vibe scene compose-prompts\`. The host agent authors each
|
|
314788
|
+
\`compositions/scene-<id>.html\` itself, then re-invoking \`vibe build\`
|
|
314789
|
+
proceeds to lint + render. The CLI makes no internal LLM call.
|
|
314790
|
+
- **\`--composer template\`** - the deterministic no-model composer
|
|
314791
|
+
(concat background + lower-thirds), for when no agent is available.
|
|
314771
314792
|
|
|
314772
314793
|
## Lint feedback loop
|
|
314773
314794
|
|
|
@@ -314777,7 +314798,7 @@ vibe scene lint --json --fix
|
|
|
314777
314798
|
|
|
314778
314799
|
Returns structured findings. The recommended loop: 1) run lint with
|
|
314779
314800
|
\`--fix\` (mechanical fixes applied), 2) if \`errorCount > 0\`, edit the
|
|
314780
|
-
scene HTML, 3) re-lint. Cap retries at 3
|
|
314801
|
+
scene HTML, 3) re-lint. Cap retries at 3 - if errors persist, fall back
|
|
314781
314802
|
to a template preset (\`vibe scene add <id> --style simple --force\`)
|
|
314782
314803
|
and surface the error to the user.
|
|
314783
314804
|
|
|
@@ -314853,9 +314874,9 @@ The full set lives in \`packages/cli/src/pipeline/executor.ts\`.
|
|
|
314853
314874
|
|
|
314854
314875
|
## Variable references
|
|
314855
314876
|
|
|
314856
|
-
- \`$<step-id>.output\`
|
|
314857
|
-
- \`$<step-id>.result.<field>\`
|
|
314858
|
-
- \`\${ENV_VAR}\`
|
|
314877
|
+
- \`$<step-id>.output\` - previous step's output path
|
|
314878
|
+
- \`$<step-id>.result.<field>\` - structured field from JSON result
|
|
314879
|
+
- \`\${ENV_VAR}\` - environment variable
|
|
314859
314880
|
- Values can be templated: \`"\${SCRIPT_TITLE} - Episode \${EPISODE}"\`
|
|
314860
314881
|
|
|
314861
314882
|
## Running
|
|
@@ -314872,12 +314893,12 @@ Checkpoints land next to the YAML: \`pipeline.yaml.checkpoint.json\`.
|
|
|
314872
314893
|
|
|
314873
314894
|
## Authoring tips
|
|
314874
314895
|
|
|
314875
|
-
1. **Start from a tiny YAML**
|
|
314896
|
+
1. **Start from a tiny YAML** - keep it in your project directory and run
|
|
314876
314897
|
\`vibe run pipeline.yaml --dry-run\` before spending provider budget.
|
|
314877
|
-
2. **Dry-run first**
|
|
314898
|
+
2. **Dry-run first** - you see estimated cost and resolved variable
|
|
314878
314899
|
graph before spending API credits.
|
|
314879
314900
|
3. **Keep step ids short and descriptive** (\`intro\`, \`scene1\`, \`voice\`,
|
|
314880
|
-
\`bgm\`)
|
|
314901
|
+
\`bgm\`) - they appear in logs and variable refs.
|
|
314881
314902
|
4. **Name outputs** with extensions matching the action (\`.mp4\`, \`.mp3\`,
|
|
314882
314903
|
\`.png\`, \`.json\`).
|
|
314883
314904
|
5. **Declare \`budget:\`** on expensive pipelines:
|
|
@@ -314901,9 +314922,9 @@ When the user has a working shell sequence, extract steps:
|
|
|
314901
314922
|
- Wrap the entire chain in a \`name:\` + \`steps:\` skeleton
|
|
314902
314923
|
|
|
314903
314924
|
The \`compose\` action is the catch-all assembly step (audio mux, video
|
|
314904
|
-
overlay, etc.)
|
|
314925
|
+
overlay, etc.) - useful at the tail of a pipeline.
|
|
314905
314926
|
`;
|
|
314906
|
-
var ARCHITECTURE_WALKTHROUGH = `# vibe agent / build / run
|
|
314927
|
+
var ARCHITECTURE_WALKTHROUGH = `# vibe agent / build / run - when to pick which
|
|
314907
314928
|
|
|
314908
314929
|
The CLI has three orchestrating commands that coordinate other primitives:
|
|
314909
314930
|
\`vibe agent\`, \`vibe build\`, \`vibe run\`. New users routinely ask which one
|
|
@@ -314932,14 +314953,14 @@ built-in fallback when you do not already have an agent host.
|
|
|
314932
314953
|
- "I have a finished script + visual identity" \u2192 \`vibe build\`
|
|
314933
314954
|
- "I want this to run again next month" \u2192 \`vibe run\`
|
|
314934
314955
|
|
|
314935
|
-
If two seem to fit, pick the rightmost one
|
|
314956
|
+
If two seem to fit, pick the rightmost one - more reproducible, less surprise.
|
|
314936
314957
|
|
|
314937
314958
|
## Cost-tier awareness (v0.83+)
|
|
314938
314959
|
|
|
314939
314960
|
Every primitive subcommand carries a cost tier (\`free\` / \`low\` / \`high\` /
|
|
314940
314961
|
\`very-high\`). \`vibe schema --list\` exposes the tier as JSON, and each
|
|
314941
314962
|
\`vibe <group> <sub> --help\` page shows it as a colored footer. Use
|
|
314942
|
-
\`vibe doctor --test-keys\` before kicking off any high-cost orchestrator
|
|
314963
|
+
\`vibe doctor --test-keys\` before kicking off any high-cost orchestrator -
|
|
314943
314964
|
a single bad key wastes time and money.
|
|
314944
314965
|
|
|
314945
314966
|
## Cross-command primitives
|
|
@@ -315049,7 +315070,7 @@ var META = {
|
|
|
315049
315070
|
title: "YAML pipelines (Video as Code)",
|
|
315050
315071
|
summary: "Author and run reproducible multi-step video workflows",
|
|
315051
315072
|
steps: [
|
|
315052
|
-
"Sketch the workflow as YAML
|
|
315073
|
+
"Sketch the workflow as YAML - `name`, `description`, then `steps:` with `id` + `action` + inputs/outputs.",
|
|
315053
315074
|
"Reference previous step outputs via `$<step-id>.output` (or `$<step-id>.result.<field>` for structured returns).",
|
|
315054
315075
|
"Run `vibe run pipeline.yaml --dry-run` to see the resolved graph + cost estimate before spending API budget.",
|
|
315055
315076
|
"Add a `budget:` block (tokens / cost_usd / max_tool_errors) to cap expensive runs.",
|
|
@@ -316033,9 +316054,10 @@ function usage3(version2) {
|
|
|
316033
316054
|
return [
|
|
316034
316055
|
`VibeFrame MCP Server v${version2}`,
|
|
316035
316056
|
"",
|
|
316036
|
-
"AI
|
|
316057
|
+
"AI video generation and editing exposed over the Model Context Protocol",
|
|
316058
|
+
"(stdio), on your own provider keys and behind dry runs and cost caps.",
|
|
316037
316059
|
"It is launched by an MCP client (Claude Desktop, Cursor, Claude Code), not",
|
|
316038
|
-
"run directly
|
|
316060
|
+
"run directly - there is normally nothing to interact with on the terminal.",
|
|
316039
316061
|
"",
|
|
316040
316062
|
"Add it to your client config:",
|
|
316041
316063
|
"",
|
|
@@ -316068,7 +316090,7 @@ function handleCliFlags(argv, version2) {
|
|
|
316068
316090
|
}
|
|
316069
316091
|
|
|
316070
316092
|
// src/index.ts
|
|
316071
|
-
if (handleCliFlags(process.argv.slice(2), "0.113.
|
|
316093
|
+
if (handleCliFlags(process.argv.slice(2), "0.113.30")) {
|
|
316072
316094
|
process.exit(0);
|
|
316073
316095
|
}
|
|
316074
316096
|
console.log = (...args) => console.error(...args);
|
|
@@ -316081,7 +316103,7 @@ var server = new Server(
|
|
|
316081
316103
|
{
|
|
316082
316104
|
name: "vibeframe",
|
|
316083
316105
|
// Stamped with the package version by build.js at bundle time.
|
|
316084
|
-
version: "0.113.
|
|
316106
|
+
version: "0.113.30"
|
|
316085
316107
|
},
|
|
316086
316108
|
{
|
|
316087
316109
|
capabilities: {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeframe/mcp-server",
|
|
3
|
-
"version": "0.113.
|
|
4
|
-
"description": "VibeFrame MCP Server - AI
|
|
3
|
+
"version": "0.113.30",
|
|
4
|
+
"description": "VibeFrame MCP Server - frontier AI video generation for agents (Seedance, Runway, Veo, Kling) on your own keys, behind a hard cost cap",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"vibeframe-mcp": "./dist/index.js"
|
|
@@ -15,8 +15,14 @@
|
|
|
15
15
|
"mcp",
|
|
16
16
|
"model-context-protocol",
|
|
17
17
|
"vibeframe",
|
|
18
|
-
"video
|
|
19
|
-
"
|
|
18
|
+
"ai-video",
|
|
19
|
+
"video-generation",
|
|
20
|
+
"text-to-video",
|
|
21
|
+
"image-to-video",
|
|
22
|
+
"seedance",
|
|
23
|
+
"runway",
|
|
24
|
+
"veo",
|
|
25
|
+
"kling",
|
|
20
26
|
"claude-desktop",
|
|
21
27
|
"cursor"
|
|
22
28
|
],
|
|
@@ -30,7 +36,7 @@
|
|
|
30
36
|
"bugs": {
|
|
31
37
|
"url": "https://github.com/vericontext/vibeframe/issues"
|
|
32
38
|
},
|
|
33
|
-
"homepage": "https://
|
|
39
|
+
"homepage": "https://vibeframe.ai",
|
|
34
40
|
"dependencies": {
|
|
35
41
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
36
42
|
"zod": "^3.22.4"
|
|
@@ -60,8 +66,8 @@
|
|
|
60
66
|
"tsx": "^4.21.0",
|
|
61
67
|
"typescript": "^5.3.3",
|
|
62
68
|
"vitest": "^1.2.2",
|
|
63
|
-
"@vibeframe/core": "0.113.
|
|
64
|
-
"@vibeframe/cli": "0.113.
|
|
69
|
+
"@vibeframe/core": "0.113.30",
|
|
70
|
+
"@vibeframe/cli": "0.113.30"
|
|
65
71
|
},
|
|
66
72
|
"engines": {
|
|
67
73
|
"node": ">=20"
|