@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.
- package/dist/index.js +52 -11
- 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: "
|
|
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: "
|
|
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
|
|
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.
|
|
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
|
|
449183
|
-
\`tl.fromTo(".
|
|
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
|
-
|
|
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 =
|
|
451541
|
+
const backdropCache = augmentedBackdropPrompt && !backdropReference ? backdropCacheDescriptor({
|
|
451504
451542
|
beatId: beat.id,
|
|
451505
|
-
cue:
|
|
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
|
|
454790
|
-
if (!
|
|
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.
|
|
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/
|
|
61
|
-
"@vibeframe/
|
|
60
|
+
"@vibeframe/cli": "0.104.3",
|
|
61
|
+
"@vibeframe/core": "0.104.3"
|
|
62
62
|
},
|
|
63
63
|
"engines": {
|
|
64
64
|
"node": ">=20"
|