@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.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +117 -95
  3. 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 — it exposes VibeFrame's operations as typed MCP tools so an MCP-capable host can call them by natural language.
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 \u2014 this file is the single source of truth for every scene's palette, typography, and motion.` : `Visual identity for **${name}**. Fill the sections below before authoring any scene HTML or generating any backdrop. Pick a named style with \`vibe scene list-styles\` if you want a credible starting point.`;
26068
- const moodLine = style ? `**Mood:** ${style.mood} \xB7 **Best for:** ${style.bestFor}` : `**Mood:** _(one line \u2014 what should the viewer FEEL?)_`;
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_ \u2014 primary
26072
- - _hex_ \u2014 accent
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} \u2014 Design
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 scene init --visual-style "${style.name}"\`._` : `_Seed this file from a named style: \`vibe scene init <dir> --visual-style "<name>"\`._`}
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 \u2014 what each section demonstrates, in order." : kind3 === "motion" ? "Motion piece \u2014 the message and the beats of on-screen text/graphics." : kind3 === "aivideo" ? "AI-video script \u2014 the spoken/voiced narrative the generated shots illustrate." : "Narrative script \u2014 scene-by-scene story, dialogue, and voiceover.";
26135
- return `# ${name} \u2014 Script
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} \u2014 Characters
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 \u2014 the identity anchor for keyframe edits).
26173
- - **Identity:** one paragraph of fixed, on-model traits \u2014 age, build, hair,
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} \u2014 Storyboard
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 \u2014 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 \u2014 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 \u2014 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} \u2014 Scene Authoring Project
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 \u2014 run the generate command directly.
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 scene init . --visual-style "Swiss Pulse"\` (idempotent).
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/\`; that directory is reserved for local composition
26288
- rules installed by VibeFrame.
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 \u2014 plain prompts, not a built-in command:
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 \u2014 USE THESE FIRST
26376
+ ## Skills - USE THESE FIRST
26373
26377
 
26374
- **Load the \`hyperframes\` skill before authoring scenes** \u2014 it encodes the
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 \u2014 DESIGN.md hard-gate, named styles, motion principles |
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 \u2014 they cover
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\` \u2014 visual identity contract (palette, type, motion, transitions)
26403
- - \`STORYBOARD.md\` \u2014 per-beat narration/backdrop/duration cues for \`vibe build\`
26404
- - \`media/\` \u2014 user-provided source files (photos, logos, clips, voice recordings)
26405
- - \`index.html\` \u2014 root composition (timeline)
26406
- - \`compositions/scene-*.html\` \u2014 per-scene HTML authored by you or the agent
26407
- - \`assets/\` \u2014 generated/canonical build media (narration audio, images, video)
26408
- - \`.agents/skills/hyperframes/\` \u2014 upstream composition rules, when installed here rather than globally
26409
- - \`transcript.json\` \u2014 Whisper word-level transcript (if narration exists)
26410
- - \`hyperframes.json\` \u2014 HF registry config (speak to both toolchains)
26411
- - \`vibe.config.json\` \u2014 canonical VibeFrame config (providers, budget)
26412
- - \`renders/\` \u2014 output MP4s
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 \u2014 works in this project too)
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"\` \u2014 the framework uses this for visibility control.
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 \u2014 no \`Date.now()\`, \`Math.random()\`, or network fetches.
26458
+ 7. Only deterministic logic - no \`Date.now()\`, \`Math.random()\`, or network fetches.
26443
26459
 
26444
- ## Linting \u2014 run after changes
26460
+ ## Linting - run after changes
26445
26461
 
26446
26462
  \`\`\`bash
26447
- vibe scene lint # preferred \u2014 in-process, no network
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} \u2014 Claude Code Overrides
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 \u2014 caches, checkpoints, and project-scope config.yaml (may contain API keys)
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 scene init <dir>\` first.`);
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 scene init <dir>\` to create a starter, or add STORYBOARD.md with per-beat cues.`);
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(`1. Run \`vibe scene install-skill\` to install the Hyperframes composition rules, then read them.`);
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 scene init\` first.`
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 scene init <dir>\` to create a starter, or add STORYBOARD.md with per-beat cues.`,
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 scene init`."
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 scene init <dir> --visual-style "<name>"')
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 scene init <dir> --visual-style "${style.name}"`)
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(`Root composition not found: ${rootPath}. Run \`vibe scene init\` first.`);
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\`. Each scene is one HTML file with scoped CSS
314673
- and a paused GSAP timeline. Cheap to edit, cheap to lint, expensive only
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\` (v0.60+) is the supported one-shot driver from a
314677
- written storyboard to an MP4. Plan H (v0.70) added \`--mode agent\` so the
314678
- host agent itself authors the per-beat HTML \u2014 no internal LLM call.
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"\` \u2014 seeds
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) \u2014
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\` \u2014 project-specific palette / typography / motion
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 \u2014 scenes that contradict DESIGN.md fail lint.
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** \u2014 running it on an existing Hyperframes
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 \u2014 preferred entry points)
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>] [--mode agent|batch|auto] # H3 dispatch
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** \u2014 backdrop + bottom caption (default)
314743
- - **announcement** \u2014 single huge headline, gradient text
314744
- - **explainer** \u2014 kicker + title + subtitle stack
314745
- - **kinetic-type** \u2014 words animate in word-by-word
314746
- - **product-shot** \u2014 corner label + bottom headline + slow zoom
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 \u2014 narration, backdrop, duration)
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
- - **\`--mode agent\`** (default when an agent host is detected) \u2014 emits a
314764
- \`needs-author\` plan via \`vibe scene compose-prompts\`. The host agent
314765
- authors each \`compositions/scene-<id>.html\` itself, then re-invoking
314766
- \`vibe build\` proceeds to lint + render.
314767
- - **\`--mode batch\`** \u2014 VibeFrame runs an internal LLM (Claude / OpenAI /
314768
- Gemini) to compose the HTML, then renders.
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 \u2014 if errors persist, fall back
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\` \u2014 previous step's output path
314857
- - \`$<step-id>.result.<field>\` \u2014 structured field from JSON result
314858
- - \`\${ENV_VAR}\` \u2014 environment variable
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** \u2014 keep it in your project directory and run
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** \u2014 you see estimated cost and resolved variable
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\`) \u2014 they appear in logs and variable refs.
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.) \u2014 useful at the tail of a pipeline.
314925
+ overlay, etc.) - useful at the tail of a pipeline.
314905
314926
  `;
314906
- var ARCHITECTURE_WALKTHROUGH = `# vibe agent / build / run \u2014 when to pick which
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 \u2014 more reproducible, less surprise.
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 \u2014
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 \u2014 `name`, `description`, then `steps:` with `id` + `action` + inputs/outputs.",
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-native video editing exposed over the Model Context Protocol (stdio).",
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 \u2014 there is normally nothing to interact with on the terminal.",
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.28")) {
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.28"
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.28",
4
- "description": "VibeFrame MCP Server - AI-native video editing via Model Context Protocol",
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-editing",
19
- "ai",
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://github.com/vericontext/vibeframe#mcp-integration",
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.28",
64
- "@vibeframe/cli": "0.113.28"
69
+ "@vibeframe/core": "0.113.30",
70
+ "@vibeframe/cli": "0.113.30"
65
71
  },
66
72
  "engines": {
67
73
  "node": ">=20"