@vibeframe/mcp-server 0.104.2 → 0.104.3

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 (2) hide show
  1. package/dist/index.js +52 -11
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -7613,7 +7613,7 @@ YAML cues that drive narration, backdrop generation, and timing.
7613
7613
 
7614
7614
  \`\`\`yaml
7615
7615
  narration: "Introduce the promise in one crisp sentence."
7616
- backdrop: "Cinematic abstract technology backdrop, precise light, premium editorial feel"
7616
+ backdrop: "Topic-aligned editorial background plate, abstract visual system, no readable text, no logos, no consumer products, clean negative space for HTML overlays"
7617
7617
  duration: 4
7618
7618
  \`\`\`
7619
7619
 
@@ -7624,7 +7624,7 @@ screen and one spoken breath.
7624
7624
 
7625
7625
  \`\`\`yaml
7626
7626
  narration: "Show the mechanism or proof point that makes the promise believable."
7627
- backdrop: "Layered interface details, subtle motion trails, high-contrast product storytelling"
7627
+ backdrop: "Topic-aligned analytical background plate, abstract dashboard structure, no readable text, no product photos, no shoes, no unrelated objects"
7628
7628
  duration: 4
7629
7629
  \`\`\`
7630
7630
 
@@ -7635,7 +7635,7 @@ before/after.
7635
7635
 
7636
7636
  \`\`\`yaml
7637
7637
  narration: "Close with the action the viewer should remember."
7638
- backdrop: "Resolved hero frame, confident final composition, clean negative space"
7638
+ backdrop: "Resolved editorial background plate, confident final composition, clean negative space, no readable text, no logos, no unrelated products"
7639
7639
  duration: 4
7640
7640
  \`\`\`
7641
7641
 
@@ -7768,7 +7768,11 @@ npx hyperframes render
7768
7768
  \`\`\`
7769
7769
  4. Videos use \`muted\` with a separate \`<audio>\` element for the audio track.
7770
7770
  5. Sub-compositions use \`data-composition-src="compositions/file.html"\`.
7771
- 6. Only deterministic logic \u2014 no \`Date.now()\`, \`Math.random()\`, or network fetches.
7771
+ 6. For render-stable text, do not apply continuous \`scale\`, \`x\`, \`y\`, or
7772
+ \`filter\` tweens to \`.scene-content\` or any ancestor containing live text.
7773
+ Animate background/media layers instead; text/cards should enter briefly and
7774
+ then hold still at their final CSS positions.
7775
+ 7. Only deterministic logic \u2014 no \`Date.now()\`, \`Math.random()\`, or network fetches.
7772
7776
 
7773
7777
  ## Linting \u2014 run after changes
7774
7778
 
@@ -449179,13 +449183,18 @@ Requirements (non-negotiable):
449179
449183
  producer's seek lands past the timeline's natural end and visibility state
449180
449184
  goes stale \u2014 the hold phase renders BLACK. Anchor the timeline to the full
449181
449185
  beat duration via either:
449182
- 1. A subtle idle motion spanning 0\u2192duration on a parent element, e.g.
449183
- \`tl.fromTo(".scene-content", { scale: 1.0 }, { scale: 1.015, duration: <beat>, ease: "none" }, 0);\`
449186
+ 1. A subtle idle motion spanning 0\u2192duration on a background/media layer,
449187
+ e.g. \`tl.fromTo(".backdrop", { scale: 1.0 }, { scale: 1.015, duration: <beat>, ease: "none" }, 0);\`
449184
449188
  (Ken-Burns, breathing opacity, gradient drift \u2014 should be barely
449185
449189
  perceptible so it doesn't compete with entry/exit beats).
449186
449190
  2. OR an explicit \`tl.set(target, { ...natural state... }, <beat - 0.001>)\`
449187
449191
  anchor at the end.
449188
449192
  This is the #2 source of "text disappears mid-beat" bugs after \`.clip\` sizing.
449193
+ - Do not apply continuous \`scale\`, \`x\`, \`y\`, \`filter\`, or other transform
449194
+ tweens to \`.scene-content\` or any ancestor that contains live text/cards.
449195
+ Animate the backdrop/media plane instead; let text enter briefly, then hold
449196
+ still at its final CSS position. Continuous transforms on text ancestors can
449197
+ create subpixel shimmer in screenshot-captured renders.
449189
449198
  - Timed children inside the composition have \`class="clip"\` plus
449190
449199
  \`data-start\`, \`data-duration\`, \`data-track-index\`.
449191
449200
  - If \`assets/backdrop-${ctx.beat.id}.png\` exists, use that local file as the
@@ -449255,7 +449264,9 @@ Reference shape (verbatim \u2014 match this skeleton exactly, no DOCTYPE / html
449255
449264
  const tl = gsap.timeline({ paused: true });
449256
449265
  // Idle motion spanning full beat duration \u2014 required to keep timeline
449257
449266
  // length aligned with data-duration (otherwise hold phase goes black).
449258
- tl.fromTo(".scene-content", { scale: 1.0 }, { scale: 1.015, duration: <sec>, ease: "none" }, 0);
449267
+ // Keep continuous motion on the background/media layer so live text does
449268
+ // not shimmer from subpixel resampling.
449269
+ tl.fromTo(".backdrop", { scale: 1.0 }, { scale: 1.015, duration: <sec>, ease: "none" }, 0);
449259
449270
  // entry tweens
449260
449271
  window.__timelines["${compositionId}"] = tl;
449261
449272
  </script>
@@ -451197,6 +451208,32 @@ var init_build_asset_metadata = __esm({
451197
451208
  }
451198
451209
  });
451199
451210
 
451211
+ // ../cli/src/commands/_shared/build-backdrop-prompt.ts
451212
+ function augmentBackdropPrompt(cue) {
451213
+ const trimmed = cue.trim();
451214
+ const lower = trimmed.toLowerCase();
451215
+ const requestsTextOrMarks = /\b(text|typography|title|headline|label|caption|logo|logos|wordmark|brand mark|brand marks)\b/.test(lower);
451216
+ const forbidsTextOrMarks = /\b(no|without|avoid)\s+(readable\s+)?(text|typography|titles?|headlines?|labels?|captions?|brand\s+logos?|logos?|wordmarks?|brand\s+marks?)\b/.test(
451217
+ lower
451218
+ );
451219
+ const allowsTextOrMarks = requestsTextOrMarks && !forbidsTextOrMarks;
451220
+ const overlayContract = allowsTextOrMarks ? "The image is a video background or end-card plate; do not add any text, logos, charts, or UI beyond what the scene cue explicitly requests." : "The image is a background only; HTML overlays will provide all final text, charts, logos, and UI labels.";
451221
+ const textRule = allowsTextOrMarks ? "If text, logos, or brand marks are explicitly requested, keep them minimal, legible, and do not invent extras." : "No readable text, labels, UI copy, logos, brand marks, watermarks, or invented typography.";
451222
+ return [
451223
+ "Create a 16:9 video background plate for a HyperFrames scene.",
451224
+ overlayContract,
451225
+ `Scene cue: ${trimmed}`,
451226
+ textRule,
451227
+ "Avoid unrelated consumer product photography, shoes, packaging, food, people, celebrity faces, advertisements, and random objects unless explicitly requested by the scene cue.",
451228
+ "Leave generous negative space for overlay text and cards. Keep the result topic-aligned, editorial, cinematic, and non-distracting."
451229
+ ].join(" ");
451230
+ }
451231
+ var init_build_backdrop_prompt = __esm({
451232
+ "../cli/src/commands/_shared/build-backdrop-prompt.ts"() {
451233
+ "use strict";
451234
+ }
451235
+ });
451236
+
451200
451237
  // ../cli/src/commands/_shared/storyboard-edit.ts
451201
451238
  function validateStoryboardMarkdown(markdown) {
451202
451239
  const parsed = parseStoryboard(markdown);
@@ -451481,6 +451518,7 @@ async function createBuildPlan(opts) {
451481
451518
  const voice = stringOrUndefined3(cue.voice) ?? resolved.voice;
451482
451519
  const narrationText = stringOrUndefined3(cue.narration);
451483
451520
  const backdropPrompt = stringOrUndefined3(cue.backdrop);
451521
+ const augmentedBackdropPrompt = backdropPrompt ? augmentBackdropPrompt(backdropPrompt) : null;
451484
451522
  const videoPrompt = stringOrUndefined3(cue.video);
451485
451523
  const musicPrompt = stringOrUndefined3(cue.music);
451486
451524
  const genericReference = resolveGenericAssetReference(projectDir, cue.asset);
@@ -451500,9 +451538,9 @@ async function createBuildPlan(opts) {
451500
451538
  voice,
451501
451539
  ext: resolved.narration.resolved === "elevenlabs" ? "mp3" : "wav"
451502
451540
  }) : null;
451503
- const backdropCache = backdropPrompt && !backdropReference ? backdropCacheDescriptor({
451541
+ const backdropCache = augmentedBackdropPrompt && !backdropReference ? backdropCacheDescriptor({
451504
451542
  beatId: beat.id,
451505
- cue: backdropPrompt,
451543
+ cue: augmentedBackdropPrompt,
451506
451544
  provider: resolved.image.resolved,
451507
451545
  quality: imageQuality,
451508
451546
  size: imageSize2,
@@ -452032,6 +452070,7 @@ var init_build_plan = __esm({
452032
452070
  init_build_asset_reference();
452033
452071
  init_build_cache();
452034
452072
  init_build_asset_metadata();
452073
+ init_build_backdrop_prompt();
452035
452074
  init_composer_resolve();
452036
452075
  init_storyboard_parse();
452037
452076
  init_project_config();
@@ -454786,8 +454825,9 @@ async function dispatchNarration(beat, ctx) {
454786
454825
  async function dispatchBackdrop(beat, ctx) {
454787
454826
  const reference = assetReferenceForBeat(ctx.projectDir, "backdrop", beat);
454788
454827
  if (reference) return referencePrimitiveOutcome("backdrop", beat, ctx, reference);
454789
- const prompt3 = stringOrUndefined4(beat.cues?.backdrop);
454790
- if (!prompt3) return { status: "no-cue" };
454828
+ const cue = stringOrUndefined4(beat.cues?.backdrop);
454829
+ if (!cue) return { status: "no-cue" };
454830
+ const prompt3 = augmentBackdropPrompt(cue);
454791
454831
  const rel = `assets/backdrop-${beat.id}.png`;
454792
454832
  const abs = join33(ctx.projectDir, rel);
454793
454833
  const size = ctx.imageSize ?? "1536x1024";
@@ -455765,6 +455805,7 @@ var init_scene_build = __esm({
455765
455805
  init_root_sync();
455766
455806
  init_build_cache();
455767
455807
  init_build_asset_metadata();
455808
+ init_build_backdrop_prompt();
455768
455809
  init_ai_video();
455769
455810
  init_music();
455770
455811
  init_status_jobs();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/mcp-server",
3
- "version": "0.104.2",
3
+ "version": "0.104.3",
4
4
  "description": "VibeFrame MCP Server - AI-native video editing via Model Context Protocol",
5
5
  "type": "module",
6
6
  "bin": {
@@ -57,8 +57,8 @@
57
57
  "tsx": "^4.21.0",
58
58
  "typescript": "^5.3.3",
59
59
  "vitest": "^1.2.2",
60
- "@vibeframe/core": "0.104.2",
61
- "@vibeframe/cli": "0.104.2"
60
+ "@vibeframe/cli": "0.104.3",
61
+ "@vibeframe/core": "0.104.3"
62
62
  },
63
63
  "engines": {
64
64
  "node": ">=20"