@vibeframe/mcp-server 0.70.0 → 0.71.0
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 +412 -42
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -79585,19 +79585,19 @@ var require_range = __commonJS({
|
|
|
79585
79585
|
var replaceCaret = (comp, options) => {
|
|
79586
79586
|
debug7("caret", comp, options);
|
|
79587
79587
|
const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET];
|
|
79588
|
-
const
|
|
79588
|
+
const z13 = options.includePrerelease ? "-0" : "";
|
|
79589
79589
|
return comp.replace(r, (_, M, m, p, pr) => {
|
|
79590
79590
|
debug7("caret", comp, _, M, m, p, pr);
|
|
79591
79591
|
let ret;
|
|
79592
79592
|
if (isX(M)) {
|
|
79593
79593
|
ret = "";
|
|
79594
79594
|
} else if (isX(m)) {
|
|
79595
|
-
ret = `>=${M}.0.0${
|
|
79595
|
+
ret = `>=${M}.0.0${z13} <${+M + 1}.0.0-0`;
|
|
79596
79596
|
} else if (isX(p)) {
|
|
79597
79597
|
if (M === "0") {
|
|
79598
|
-
ret = `>=${M}.${m}.0${
|
|
79598
|
+
ret = `>=${M}.${m}.0${z13} <${M}.${+m + 1}.0-0`;
|
|
79599
79599
|
} else {
|
|
79600
|
-
ret = `>=${M}.${m}.0${
|
|
79600
|
+
ret = `>=${M}.${m}.0${z13} <${+M + 1}.0.0-0`;
|
|
79601
79601
|
}
|
|
79602
79602
|
} else if (pr) {
|
|
79603
79603
|
debug7("replaceCaret pr", pr);
|
|
@@ -79614,9 +79614,9 @@ var require_range = __commonJS({
|
|
|
79614
79614
|
debug7("no pr");
|
|
79615
79615
|
if (M === "0") {
|
|
79616
79616
|
if (m === "0") {
|
|
79617
|
-
ret = `>=${M}.${m}.${p}${
|
|
79617
|
+
ret = `>=${M}.${m}.${p}${z13} <${M}.${m}.${+p + 1}-0`;
|
|
79618
79618
|
} else {
|
|
79619
|
-
ret = `>=${M}.${m}.${p}${
|
|
79619
|
+
ret = `>=${M}.${m}.${p}${z13} <${M}.${+m + 1}.0-0`;
|
|
79620
79620
|
}
|
|
79621
79621
|
} else {
|
|
79622
79622
|
ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
|
|
@@ -106350,7 +106350,7 @@ var require_emscripten_module_WASM_RELEASE_SYNC = __commonJS({
|
|
|
106350
106350
|
m = b;
|
|
106351
106351
|
n = c;
|
|
106352
106352
|
});
|
|
106353
|
-
var p = Object.assign({}, a), t = "./this.program", u = "object" == typeof window, v = "function" == typeof importScripts, w = "object" == typeof process && "object" == typeof process.versions && "string" == typeof process.versions.node, x = "", y,
|
|
106353
|
+
var p = Object.assign({}, a), t = "./this.program", u = "object" == typeof window, v = "function" == typeof importScripts, w = "object" == typeof process && "object" == typeof process.versions && "string" == typeof process.versions.node, x = "", y, z13, A;
|
|
106354
106354
|
if (w) {
|
|
106355
106355
|
var fs8 = __require("fs"), B = __require("path");
|
|
106356
106356
|
x = v ? B.dirname(x) + "/" : __dirname + "/";
|
|
@@ -106366,7 +106366,7 @@ var require_emscripten_module_WASM_RELEASE_SYNC = __commonJS({
|
|
|
106366
106366
|
b.buffer || (b = new Uint8Array(b));
|
|
106367
106367
|
return b;
|
|
106368
106368
|
};
|
|
106369
|
-
|
|
106369
|
+
z13 = (b, c, d) => {
|
|
106370
106370
|
var e = C(b);
|
|
106371
106371
|
e && c(e);
|
|
106372
106372
|
b = b.startsWith("file://") ? new URL(b) : B.normalize(b);
|
|
@@ -106410,7 +106410,7 @@ var require_emscripten_module_WASM_RELEASE_SYNC = __commonJS({
|
|
|
106410
106410
|
return b;
|
|
106411
106411
|
throw d;
|
|
106412
106412
|
}
|
|
106413
|
-
}),
|
|
106413
|
+
}), z13 = (b, c, d) => {
|
|
106414
106414
|
var e = new XMLHttpRequest();
|
|
106415
106415
|
e.open("GET", b, true);
|
|
106416
106416
|
e.responseType = "arraybuffer";
|
|
@@ -106491,9 +106491,9 @@ var require_emscripten_module_WASM_RELEASE_SYNC = __commonJS({
|
|
|
106491
106491
|
}).catch(function() {
|
|
106492
106492
|
return ha(b);
|
|
106493
106493
|
});
|
|
106494
|
-
if (
|
|
106494
|
+
if (z13)
|
|
106495
106495
|
return new Promise(function(c, d) {
|
|
106496
|
-
|
|
106496
|
+
z13(b, function(e) {
|
|
106497
106497
|
c(new Uint8Array(e));
|
|
106498
106498
|
}, d);
|
|
106499
106499
|
});
|
|
@@ -347714,8 +347714,8 @@ async function queryElementStacking(page, nativeHdrVideoIds) {
|
|
|
347714
347714
|
while (current) {
|
|
347715
347715
|
const cs = window.getComputedStyle(current);
|
|
347716
347716
|
const pos = cs.position;
|
|
347717
|
-
const
|
|
347718
|
-
if (!Number.isNaN(
|
|
347717
|
+
const z13 = parseInt(cs.zIndex);
|
|
347718
|
+
if (!Number.isNaN(z13) && pos !== "static") return z13;
|
|
347719
347719
|
current = current.parentElement;
|
|
347720
347720
|
}
|
|
347721
347721
|
return 0;
|
|
@@ -396287,19 +396287,19 @@ ${sourceUrlComment}
|
|
|
396287
396287
|
var replaceCaret = (comp, options) => {
|
|
396288
396288
|
debug62("caret", comp, options);
|
|
396289
396289
|
const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET];
|
|
396290
|
-
const
|
|
396290
|
+
const z13 = options.includePrerelease ? "-0" : "";
|
|
396291
396291
|
return comp.replace(r, (_, M, m, p, pr) => {
|
|
396292
396292
|
debug62("caret", comp, _, M, m, p, pr);
|
|
396293
396293
|
let ret;
|
|
396294
396294
|
if (isX(M)) {
|
|
396295
396295
|
ret = "";
|
|
396296
396296
|
} else if (isX(m)) {
|
|
396297
|
-
ret = `>=${M}.0.0${
|
|
396297
|
+
ret = `>=${M}.0.0${z13} <${+M + 1}.0.0-0`;
|
|
396298
396298
|
} else if (isX(p)) {
|
|
396299
396299
|
if (M === "0") {
|
|
396300
|
-
ret = `>=${M}.${m}.0${
|
|
396300
|
+
ret = `>=${M}.${m}.0${z13} <${M}.${+m + 1}.0-0`;
|
|
396301
396301
|
} else {
|
|
396302
|
-
ret = `>=${M}.${m}.0${
|
|
396302
|
+
ret = `>=${M}.${m}.0${z13} <${+M + 1}.0.0-0`;
|
|
396303
396303
|
}
|
|
396304
396304
|
} else if (pr) {
|
|
396305
396305
|
debug62("replaceCaret pr", pr);
|
|
@@ -396316,9 +396316,9 @@ ${sourceUrlComment}
|
|
|
396316
396316
|
debug62("no pr");
|
|
396317
396317
|
if (M === "0") {
|
|
396318
396318
|
if (m === "0") {
|
|
396319
|
-
ret = `>=${M}.${m}.${p}${
|
|
396319
|
+
ret = `>=${M}.${m}.${p}${z13} <${M}.${m}.${+p + 1}-0`;
|
|
396320
396320
|
} else {
|
|
396321
|
-
ret = `>=${M}.${m}.${p}${
|
|
396321
|
+
ret = `>=${M}.${m}.${p}${z13} <${M}.${+m + 1}.0-0`;
|
|
396322
396322
|
}
|
|
396323
396323
|
} else {
|
|
396324
396324
|
ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
|
|
@@ -422114,7 +422114,7 @@ Attempted to suspend at:`);
|
|
|
422114
422114
|
m = b;
|
|
422115
422115
|
n = c;
|
|
422116
422116
|
});
|
|
422117
|
-
var p = Object.assign({}, a), t = "./this.program", u = "object" == typeof window, v = "function" == typeof importScripts, w = "object" == typeof process && "object" == typeof process.versions && "string" == typeof process.versions.node, x = "", y,
|
|
422117
|
+
var p = Object.assign({}, a), t = "./this.program", u = "object" == typeof window, v = "function" == typeof importScripts, w = "object" == typeof process && "object" == typeof process.versions && "string" == typeof process.versions.node, x = "", y, z13, A;
|
|
422118
422118
|
if (w) {
|
|
422119
422119
|
var fs8 = __require2("fs"), B = __require2("path");
|
|
422120
422120
|
x = v ? B.dirname(x) + "/" : __dirname + "/";
|
|
@@ -422130,7 +422130,7 @@ Attempted to suspend at:`);
|
|
|
422130
422130
|
b.buffer || (b = new Uint8Array(b));
|
|
422131
422131
|
return b;
|
|
422132
422132
|
};
|
|
422133
|
-
|
|
422133
|
+
z13 = (b, c, d) => {
|
|
422134
422134
|
var e = C(b);
|
|
422135
422135
|
e && c(e);
|
|
422136
422136
|
b = b.startsWith("file://") ? new URL(b) : B.normalize(b);
|
|
@@ -422174,7 +422174,7 @@ Attempted to suspend at:`);
|
|
|
422174
422174
|
return b;
|
|
422175
422175
|
throw d;
|
|
422176
422176
|
}
|
|
422177
|
-
}),
|
|
422177
|
+
}), z13 = (b, c, d) => {
|
|
422178
422178
|
var e = new XMLHttpRequest();
|
|
422179
422179
|
e.open("GET", b, true);
|
|
422180
422180
|
e.responseType = "arraybuffer";
|
|
@@ -422255,9 +422255,9 @@ Attempted to suspend at:`);
|
|
|
422255
422255
|
}).catch(function() {
|
|
422256
422256
|
return ha(b);
|
|
422257
422257
|
});
|
|
422258
|
-
if (
|
|
422258
|
+
if (z13)
|
|
422259
422259
|
return new Promise(function(c, d) {
|
|
422260
|
-
|
|
422260
|
+
z13(b, function(e) {
|
|
422261
422261
|
c(new Uint8Array(e));
|
|
422262
422262
|
}, d);
|
|
422263
422263
|
});
|
|
@@ -448826,6 +448826,26 @@ function detectAgentHosts(env4 = process.env) {
|
|
|
448826
448826
|
detected: false,
|
|
448827
448827
|
signals: [],
|
|
448828
448828
|
projectFiles: ["AGENTS.md", ".aider.conf.yml"]
|
|
448829
|
+
},
|
|
448830
|
+
{
|
|
448831
|
+
id: "gemini-cli",
|
|
448832
|
+
label: "Gemini CLI",
|
|
448833
|
+
detected: false,
|
|
448834
|
+
signals: [],
|
|
448835
|
+
// Per https://geminicli.com/docs/cli/gemini-md/ Gemini CLI's primary
|
|
448836
|
+
// context file is GEMINI.md; AGENTS.md is the cross-tool fallback
|
|
448837
|
+
// VibeFrame writes by default. Both are honoured.
|
|
448838
|
+
projectFiles: ["GEMINI.md", "AGENTS.md", ".gemini/"]
|
|
448839
|
+
},
|
|
448840
|
+
{
|
|
448841
|
+
id: "opencode",
|
|
448842
|
+
label: "OpenCode",
|
|
448843
|
+
detected: false,
|
|
448844
|
+
signals: [],
|
|
448845
|
+
// sst/opencode officially supports the agents.md spec — AGENTS.md at
|
|
448846
|
+
// project root is the standard place. Local config also under
|
|
448847
|
+
// `.opencode/` per https://opencode.ai/docs/config/.
|
|
448848
|
+
projectFiles: ["AGENTS.md", ".opencode/"]
|
|
448829
448849
|
}
|
|
448830
448850
|
].map((host) => {
|
|
448831
448851
|
const signals2 = [];
|
|
@@ -448873,14 +448893,21 @@ var init_agent_host_detect = __esm({
|
|
|
448873
448893
|
"claude-code": "claude",
|
|
448874
448894
|
codex: "codex",
|
|
448875
448895
|
cursor: "cursor",
|
|
448876
|
-
aider: "aider"
|
|
448896
|
+
aider: "aider",
|
|
448897
|
+
"gemini-cli": "gemini",
|
|
448898
|
+
opencode: "opencode"
|
|
448877
448899
|
};
|
|
448878
448900
|
HOST_CONFIG_DIRS = {
|
|
448879
448901
|
"claude-code": ".claude",
|
|
448880
448902
|
codex: ".codex",
|
|
448881
448903
|
cursor: ".cursor",
|
|
448882
448904
|
// some installs; macOS app stores prefs elsewhere
|
|
448883
|
-
aider: null
|
|
448905
|
+
aider: null,
|
|
448906
|
+
"gemini-cli": ".gemini",
|
|
448907
|
+
// sst/opencode uses XDG-style `~/.config/opencode/` per
|
|
448908
|
+
// https://opencode.ai/docs/config/. The path is relative to $HOME so
|
|
448909
|
+
// the join in detectAgentHosts() resolves correctly.
|
|
448910
|
+
opencode: ".config/opencode"
|
|
448884
448911
|
};
|
|
448885
448912
|
}
|
|
448886
448913
|
});
|
|
@@ -467461,6 +467488,348 @@ var agentOnlyTools = [
|
|
|
467461
467488
|
mediaConcatTool
|
|
467462
467489
|
];
|
|
467463
467490
|
|
|
467491
|
+
// ../cli/src/tools/manifest/walkthrough.ts
|
|
467492
|
+
import { z as z12 } from "zod";
|
|
467493
|
+
|
|
467494
|
+
// ../cli/src/commands/_shared/walkthroughs/walkthroughs.ts
|
|
467495
|
+
var SCENE_WALKTHROUGH = `# Scene authoring with vibe
|
|
467496
|
+
|
|
467497
|
+
A scene project is a directory that is **bilingual**: it works with both
|
|
467498
|
+
\`vibe\` and \`npx hyperframes\`. Each scene is one HTML file with scoped CSS
|
|
467499
|
+
and a paused GSAP timeline. Cheap to edit, cheap to lint, expensive only
|
|
467500
|
+
at render.
|
|
467501
|
+
|
|
467502
|
+
\`vibe scene build\` (v0.60+) is the supported one-shot driver from a
|
|
467503
|
+
written storyboard to an MP4. Plan H (v0.70) added \`--mode agent\` so the
|
|
467504
|
+
host agent itself authors the per-beat HTML \u2014 no internal LLM call.
|
|
467505
|
+
|
|
467506
|
+
## Three authoring paths
|
|
467507
|
+
|
|
467508
|
+
| Path | Command | When to use |
|
|
467509
|
+
|---|---|---|
|
|
467510
|
+
| **One-shot (default, v0.60+)** | \`vibe scene build [project-dir]\` | STORYBOARD.md has YAML frontmatter + per-beat cues |
|
|
467511
|
+
| **High-craft (manual)** | \`DESIGN.md\` + Hyperframes skill in your agent | Maximum control: hand-author each scene |
|
|
467512
|
+
| **Quick draft** | \`vibe scene add --style <preset>\` | No agent or no API keys; fast iteration |
|
|
467513
|
+
|
|
467514
|
+
Recommend \`vibe scene build\` whenever the user has a STORYBOARD with
|
|
467515
|
+
narration / backdrop intent.
|
|
467516
|
+
|
|
467517
|
+
## High-craft path
|
|
467518
|
+
|
|
467519
|
+
1. \`vibe scene init my-promo --visual-style "Swiss Pulse"\` \u2014 seeds
|
|
467520
|
+
\`DESIGN.md\` (palette, typography, motion, transitions) plus the
|
|
467521
|
+
\`vibe.project.yaml\` / \`hyperframes.json\` / \`index.html\` scaffold.
|
|
467522
|
+
In Plan H this **also installs the Hyperframes skill** at the
|
|
467523
|
+
right place for your host (\`.claude/skills/hyperframes/\` for Claude
|
|
467524
|
+
Code, \`.cursor/rules/hyperframes.mdc\` for Cursor, universal
|
|
467525
|
+
\`SKILL.md\` for everyone else).
|
|
467526
|
+
2. Read \`SKILL.md\` (or the host-specific copy) \u2014 Hyperframes
|
|
467527
|
+
framework rules, motion principles, type system, transition recipes.
|
|
467528
|
+
3. Read \`DESIGN.md\` \u2014 project-specific palette / typography / motion
|
|
467529
|
+
signature (visual identity hard-gate).
|
|
467530
|
+
4. Author each scene HTML directly under \`compositions/scene-<id>.html\`
|
|
467531
|
+
using the rules from steps 2 and 3. The skill enforces the visual
|
|
467532
|
+
identity contract \u2014 scenes that contradict DESIGN.md fail lint.
|
|
467533
|
+
5. \`vibe scene lint --fix\` for mechanical issues, \`vibe scene render\`
|
|
467534
|
+
to MP4.
|
|
467535
|
+
|
|
467536
|
+
## Quick-draft path
|
|
467537
|
+
|
|
467538
|
+
\`\`\`bash
|
|
467539
|
+
vibe scene init my-promo -r 16:9 -d 30
|
|
467540
|
+
vibe scene add intro --style announcement \\
|
|
467541
|
+
--headline "Ship videos, not clicks"
|
|
467542
|
+
vibe scene lint
|
|
467543
|
+
vibe scene render
|
|
467544
|
+
\`\`\`
|
|
467545
|
+
|
|
467546
|
+
\`vibe scene init\` is **idempotent** \u2014 running it on an existing
|
|
467547
|
+
Hyperframes directory merges \`hyperframes.json\` instead of clobbering it.
|
|
467548
|
+
Safe to invoke on user-provided projects.
|
|
467549
|
+
|
|
467550
|
+
## Subcommands
|
|
467551
|
+
|
|
467552
|
+
\`\`\`bash
|
|
467553
|
+
vibe scene init <dir> [-r 16:9|9:16|1:1|4:5] [-d <sec>] [--visual-style "<name>"]
|
|
467554
|
+
vibe scene styles [<name>] # list / show vendored visual identities
|
|
467555
|
+
vibe scene install-skill [<dir>] [--host all] # retroactive Hyperframes-skill install
|
|
467556
|
+
vibe scene add <name> --style <preset> [...]
|
|
467557
|
+
vibe scene compose-prompts [<dir>] [--beat <id>] # H2: emit plan, no LLM call
|
|
467558
|
+
vibe scene lint [<root>] [--json] [--fix]
|
|
467559
|
+
vibe scene render [<root>] [--fps 30] [--quality standard] [--format mp4]
|
|
467560
|
+
vibe scene build [<dir>] [--mode agent|batch|auto] # H3 dispatch
|
|
467561
|
+
\`\`\`
|
|
467562
|
+
|
|
467563
|
+
## Style presets (for \`vibe scene add --style\`)
|
|
467564
|
+
|
|
467565
|
+
- **simple** \u2014 backdrop + bottom caption (default)
|
|
467566
|
+
- **announcement** \u2014 single huge headline, gradient text
|
|
467567
|
+
- **explainer** \u2014 kicker + title + subtitle stack
|
|
467568
|
+
- **kinetic-type** \u2014 words animate in word-by-word
|
|
467569
|
+
- **product-shot** \u2014 corner label + bottom headline + slow zoom
|
|
467570
|
+
|
|
467571
|
+
All presets accept \`--narration <text|file>\`, \`--visuals <prompt>\`,
|
|
467572
|
+
\`--headline\`, \`--kicker\`. With \`--narration\`, scene duration auto-derives
|
|
467573
|
+
from the generated TTS audio.
|
|
467574
|
+
|
|
467575
|
+
## STORYBOARD-to-MP4 (one command, v0.60+)
|
|
467576
|
+
|
|
467577
|
+
\`\`\`bash
|
|
467578
|
+
vibe scene init my-promo --visual-style "Swiss Pulse" -d 12
|
|
467579
|
+
# (edit STORYBOARD.md with per-beat YAML cues \u2014 narration, backdrop, duration)
|
|
467580
|
+
vibe scene build my-promo
|
|
467581
|
+
\`\`\`
|
|
467582
|
+
|
|
467583
|
+
\`vibe scene build\` reads the STORYBOARD frontmatter + per-beat cues,
|
|
467584
|
+
dispatches TTS + image-gen per beat, then either:
|
|
467585
|
+
|
|
467586
|
+
- **\`--mode agent\`** (default when an agent host is detected) \u2014 emits a
|
|
467587
|
+
\`needs-author\` plan via \`vibe scene compose-prompts\`. The host agent
|
|
467588
|
+
authors each \`compositions/scene-<id>.html\` itself, then re-invoking
|
|
467589
|
+
\`vibe scene build\` proceeds to lint + render.
|
|
467590
|
+
- **\`--mode batch\`** \u2014 VibeFrame runs an internal LLM (Claude / OpenAI /
|
|
467591
|
+
Gemini) to compose the HTML, then renders.
|
|
467592
|
+
|
|
467593
|
+
\`VIBE_BUILD_MODE\` env var overrides the auto-resolve.
|
|
467594
|
+
|
|
467595
|
+
## Lint feedback loop
|
|
467596
|
+
|
|
467597
|
+
\`\`\`bash
|
|
467598
|
+
vibe scene lint --json --fix
|
|
467599
|
+
\`\`\`
|
|
467600
|
+
|
|
467601
|
+
Returns structured findings. The recommended loop: 1) run lint with
|
|
467602
|
+
\`--fix\` (mechanical fixes applied), 2) if \`errorCount > 0\`, edit the
|
|
467603
|
+
scene HTML, 3) re-lint. Cap retries at 3 \u2014 if errors persist, fall back
|
|
467604
|
+
to a template preset (\`vibe scene add <id> --style simple --force\`)
|
|
467605
|
+
and surface the error to the user.
|
|
467606
|
+
|
|
467607
|
+
## When to use VibeFrame vs raw Hyperframes
|
|
467608
|
+
|
|
467609
|
+
| Task | Tool |
|
|
467610
|
+
|------|------|
|
|
467611
|
+
| Generate narration + image, then author scene | \`vibe scene add\` |
|
|
467612
|
+
| Generate a full scenes project from a STORYBOARD | \`vibe scene build\` |
|
|
467613
|
+
| Hand-tweak a single scene's animation | edit \`compositions/<file>.html\` directly |
|
|
467614
|
+
| Render the project | \`vibe scene render\` *or* \`npx hyperframes render\` (equivalent) |
|
|
467615
|
+
| Lint | \`vibe scene lint\` *or* \`npx hyperframes lint\` (equivalent) |
|
|
467616
|
+
|
|
467617
|
+
The \`vibe\` CLI adds asset generation, AI orchestration, and pipeline
|
|
467618
|
+
integration on top of Hyperframes' rendering primitives.
|
|
467619
|
+
|
|
467620
|
+
## Quality checklist before render
|
|
467621
|
+
|
|
467622
|
+
- [ ] \`vibe scene lint\` exits 0 (or only warnings)
|
|
467623
|
+
- [ ] \`vibe doctor\` confirms a usable Chrome (required for render)
|
|
467624
|
+
- [ ] Root \`data-duration\` matches the sum of clip durations
|
|
467625
|
+
- [ ] Aspect ratio in \`vibe.project.yaml\` matches the destination platform
|
|
467626
|
+
`;
|
|
467627
|
+
var PIPELINE_WALKTHROUGH = `# YAML pipelines (Video as Code)
|
|
467628
|
+
|
|
467629
|
+
A pipeline is a YAML manifest with steps that reference each other's
|
|
467630
|
+
outputs. \`vibe run pipeline.yaml\` executes them with checkpointing and
|
|
467631
|
+
cost estimation.
|
|
467632
|
+
|
|
467633
|
+
## Minimal skeleton
|
|
467634
|
+
|
|
467635
|
+
\`\`\`yaml
|
|
467636
|
+
name: promo-video
|
|
467637
|
+
description: 15s product teaser
|
|
467638
|
+
steps:
|
|
467639
|
+
- id: backdrop
|
|
467640
|
+
action: generate-image
|
|
467641
|
+
prompt: "sleek product shot on white background"
|
|
467642
|
+
output: backdrop.png
|
|
467643
|
+
- id: scene
|
|
467644
|
+
action: generate-video
|
|
467645
|
+
image: $backdrop.output # reference previous step output
|
|
467646
|
+
prompt: "slow camera pan"
|
|
467647
|
+
duration: 5
|
|
467648
|
+
output: scene.mp4
|
|
467649
|
+
- id: voice
|
|
467650
|
+
action: generate-tts
|
|
467651
|
+
text: "Meet the new standard."
|
|
467652
|
+
output: voice.mp3
|
|
467653
|
+
- id: final
|
|
467654
|
+
action: compose
|
|
467655
|
+
video: $scene.output
|
|
467656
|
+
audio: $voice.output
|
|
467657
|
+
output: final.mp4
|
|
467658
|
+
\`\`\`
|
|
467659
|
+
|
|
467660
|
+
## Supported actions
|
|
467661
|
+
|
|
467662
|
+
- \`generate-image\`, \`generate-video\`, \`generate-tts\`, \`generate-music\`,
|
|
467663
|
+
\`generate-sound-effect\`, \`generate-storyboard\`, \`generate-motion\`
|
|
467664
|
+
- \`edit-silence-cut\`, \`edit-jump-cut\`, \`edit-caption\`, \`edit-grade\`,
|
|
467665
|
+
\`edit-reframe\`, \`edit-speed-ramp\`, \`edit-fade\`, \`edit-noise-reduce\`,
|
|
467666
|
+
\`edit-text-overlay\`, \`edit-fill-gaps\`
|
|
467667
|
+
- \`analyze-media\`, \`analyze-video\`, \`analyze-review\`, \`analyze-suggest\`
|
|
467668
|
+
- \`audio-transcribe\`, \`audio-isolate\`, \`audio-voice-clone\`, \`audio-dub\`,
|
|
467669
|
+
\`audio-duck\`
|
|
467670
|
+
- \`detect-scenes\`, \`detect-silence\`, \`detect-beats\`
|
|
467671
|
+
- \`compose\`, \`export\`
|
|
467672
|
+
- \`scene-build\` (Plan H one-shot driver) and \`scene-render\`
|
|
467673
|
+
- \`compose-scenes-with-skills\` (internal-LLM compose pass)
|
|
467674
|
+
|
|
467675
|
+
The full set lives in \`packages/cli/src/pipeline/executor.ts\`.
|
|
467676
|
+
|
|
467677
|
+
## Variable references
|
|
467678
|
+
|
|
467679
|
+
- \`$<step-id>.output\` \u2014 previous step's output path
|
|
467680
|
+
- \`$<step-id>.result.<field>\` \u2014 structured field from JSON result
|
|
467681
|
+
- \`\${ENV_VAR}\` \u2014 environment variable
|
|
467682
|
+
- Values can be templated: \`"\${SCRIPT_TITLE} - Episode \${EPISODE}"\`
|
|
467683
|
+
|
|
467684
|
+
## Running
|
|
467685
|
+
|
|
467686
|
+
\`\`\`bash
|
|
467687
|
+
vibe run pipeline.yaml --dry-run # plan + cost estimate, no execution
|
|
467688
|
+
vibe run pipeline.yaml # execute
|
|
467689
|
+
vibe run pipeline.yaml --resume # retry from last successful step
|
|
467690
|
+
vibe run pipeline.yaml --from scene # start at specific step
|
|
467691
|
+
vibe run pipeline.yaml --provider-video kling # override provider
|
|
467692
|
+
\`\`\`
|
|
467693
|
+
|
|
467694
|
+
Checkpoints land next to the YAML: \`pipeline.yaml.checkpoint.json\`.
|
|
467695
|
+
|
|
467696
|
+
## Authoring tips
|
|
467697
|
+
|
|
467698
|
+
1. **Start from examples** \u2014 \`examples/demo-pipeline.yaml\` (FFmpeg-only,
|
|
467699
|
+
no keys), \`examples/promo-video.yaml\` (AI providers).
|
|
467700
|
+
2. **Dry-run first** \u2014 you see estimated cost and resolved variable
|
|
467701
|
+
graph before spending API credits.
|
|
467702
|
+
3. **Keep step ids short and descriptive** (\`intro\`, \`scene1\`, \`voice\`,
|
|
467703
|
+
\`bgm\`) \u2014 they appear in logs and variable refs.
|
|
467704
|
+
4. **Name outputs** with extensions matching the action (\`.mp4\`, \`.mp3\`,
|
|
467705
|
+
\`.png\`, \`.json\`).
|
|
467706
|
+
5. **Declare \`budget:\`** on expensive pipelines:
|
|
467707
|
+
\`\`\`yaml
|
|
467708
|
+
budget:
|
|
467709
|
+
tokens: 500_000
|
|
467710
|
+
max_tool_errors: 3
|
|
467711
|
+
cost_usd: 5.00
|
|
467712
|
+
\`\`\`
|
|
467713
|
+
6. **Split large pipelines** into smaller YAML files and compose via
|
|
467714
|
+
\`action: run-pipeline\` (nested).
|
|
467715
|
+
|
|
467716
|
+
## Converting ad-hoc shell sessions to pipelines
|
|
467717
|
+
|
|
467718
|
+
When the user has a working shell sequence, extract steps:
|
|
467719
|
+
|
|
467720
|
+
- Each \`vibe ...\` command becomes one step
|
|
467721
|
+
- File outputs become step outputs; downstream \`-i <file>\` references
|
|
467722
|
+
become \`$<id>.output\`
|
|
467723
|
+
- Shared parameters move to a top-level \`defaults:\` section
|
|
467724
|
+
- Wrap the entire chain in a \`name:\` + \`steps:\` skeleton
|
|
467725
|
+
|
|
467726
|
+
The \`compose\` action is the catch-all assembly step (audio mux, video
|
|
467727
|
+
overlay, etc.) \u2014 useful at the tail of a pipeline.
|
|
467728
|
+
`;
|
|
467729
|
+
var META = {
|
|
467730
|
+
scene: {
|
|
467731
|
+
title: "Scene authoring with vibe",
|
|
467732
|
+
summary: "Author per-scene HTML compositions and render to MP4 (BUILD flow)",
|
|
467733
|
+
steps: [
|
|
467734
|
+
'Run `vibe scene init <dir> --visual-style "<style name>"` to scaffold the project + install the Hyperframes skill (Plan H).',
|
|
467735
|
+
"Edit `STORYBOARD.md` with per-beat YAML cues (narration / backdrop / duration).",
|
|
467736
|
+
"Read `SKILL.md` for the framework rules and `DESIGN.md` for the visual-identity hard-gate.",
|
|
467737
|
+
"Run `vibe scene build <dir>`. With an agent host detected, the CLI emits a `needs-author` plan; the host agent authors each `compositions/scene-<id>.html` and re-invokes to render.",
|
|
467738
|
+
"Run `vibe scene lint --fix` to validate, then `vibe scene render` to produce the MP4."
|
|
467739
|
+
],
|
|
467740
|
+
relatedCommands: [
|
|
467741
|
+
"vibe scene init",
|
|
467742
|
+
"vibe scene styles",
|
|
467743
|
+
"vibe scene install-skill",
|
|
467744
|
+
"vibe scene compose-prompts",
|
|
467745
|
+
"vibe scene build",
|
|
467746
|
+
"vibe scene lint",
|
|
467747
|
+
"vibe scene render",
|
|
467748
|
+
"vibe scene add"
|
|
467749
|
+
]
|
|
467750
|
+
},
|
|
467751
|
+
pipeline: {
|
|
467752
|
+
title: "YAML pipelines (Video as Code)",
|
|
467753
|
+
summary: "Author and run reproducible multi-step video workflows",
|
|
467754
|
+
steps: [
|
|
467755
|
+
"Sketch the workflow as YAML \u2014 `name`, `description`, then `steps:` with `id` + `action` + inputs/outputs.",
|
|
467756
|
+
"Reference previous step outputs via `$<step-id>.output` (or `$<step-id>.result.<field>` for structured returns).",
|
|
467757
|
+
"Run `vibe run pipeline.yaml --dry-run` to see the resolved graph + cost estimate before spending API budget.",
|
|
467758
|
+
"Add a `budget:` block (tokens / cost_usd / max_tool_errors) to cap expensive runs.",
|
|
467759
|
+
"Run `vibe run pipeline.yaml` to execute. Failed steps checkpoint to `pipeline.yaml.checkpoint.json`; resume with `--resume`."
|
|
467760
|
+
],
|
|
467761
|
+
relatedCommands: [
|
|
467762
|
+
"vibe run",
|
|
467763
|
+
"vibe schema --list",
|
|
467764
|
+
"vibe doctor"
|
|
467765
|
+
]
|
|
467766
|
+
}
|
|
467767
|
+
};
|
|
467768
|
+
var CONTENT2 = {
|
|
467769
|
+
scene: SCENE_WALKTHROUGH,
|
|
467770
|
+
pipeline: PIPELINE_WALKTHROUGH
|
|
467771
|
+
};
|
|
467772
|
+
var WALKTHROUGH_TOPICS = ["scene", "pipeline"];
|
|
467773
|
+
function loadWalkthrough(topic) {
|
|
467774
|
+
const meta = META[topic];
|
|
467775
|
+
const content = CONTENT2[topic];
|
|
467776
|
+
if (!meta || !content) {
|
|
467777
|
+
throw new Error(`Unknown walkthrough topic: ${topic}`);
|
|
467778
|
+
}
|
|
467779
|
+
return {
|
|
467780
|
+
topic,
|
|
467781
|
+
title: meta.title,
|
|
467782
|
+
summary: meta.summary,
|
|
467783
|
+
steps: meta.steps,
|
|
467784
|
+
relatedCommands: meta.relatedCommands,
|
|
467785
|
+
content
|
|
467786
|
+
};
|
|
467787
|
+
}
|
|
467788
|
+
function listWalkthroughs() {
|
|
467789
|
+
return WALKTHROUGH_TOPICS.map((topic) => ({
|
|
467790
|
+
topic,
|
|
467791
|
+
title: META[topic].title,
|
|
467792
|
+
summary: META[topic].summary
|
|
467793
|
+
}));
|
|
467794
|
+
}
|
|
467795
|
+
|
|
467796
|
+
// ../cli/src/tools/manifest/walkthrough.ts
|
|
467797
|
+
var walkthroughSchema = z12.object({
|
|
467798
|
+
topic: z12.enum(WALKTHROUGH_TOPICS).optional().describe(
|
|
467799
|
+
"Walkthrough topic to load. Omit to list every available walkthrough \u2014 useful for discovery on first contact."
|
|
467800
|
+
)
|
|
467801
|
+
});
|
|
467802
|
+
var walkthroughTool = defineTool({
|
|
467803
|
+
name: "walkthrough",
|
|
467804
|
+
category: "agent",
|
|
467805
|
+
cost: "free",
|
|
467806
|
+
description: "Load the step-by-step authoring guide for a vibe workflow (BUILD scene authoring, YAML pipeline authoring). Universal CLI-equivalent of Claude Code's /vibe-* slash commands \u2014 any host agent that calls this tool gets the same content the slash menu delivers in Claude Code, with no Claude Code dependency. Without a topic, returns the catalog of walkthroughs for discovery.",
|
|
467807
|
+
schema: walkthroughSchema,
|
|
467808
|
+
async execute(args) {
|
|
467809
|
+
if (!args.topic) {
|
|
467810
|
+
const topics = listWalkthroughs();
|
|
467811
|
+
return {
|
|
467812
|
+
success: true,
|
|
467813
|
+
data: { action: "list", topics },
|
|
467814
|
+
humanLines: [
|
|
467815
|
+
`Available walkthroughs: ${topics.map((t) => t.topic).join(", ")}.`,
|
|
467816
|
+
`Call again with topic to load full content.`
|
|
467817
|
+
]
|
|
467818
|
+
};
|
|
467819
|
+
}
|
|
467820
|
+
const result = loadWalkthrough(args.topic);
|
|
467821
|
+
return {
|
|
467822
|
+
success: true,
|
|
467823
|
+
data: { action: "show", ...result },
|
|
467824
|
+
humanLines: [
|
|
467825
|
+
`Loaded walkthrough: ${result.title}.`,
|
|
467826
|
+
`${result.steps.length} steps, ${result.relatedCommands.length} related commands, ${result.content.length} chars of guide content.`
|
|
467827
|
+
]
|
|
467828
|
+
};
|
|
467829
|
+
}
|
|
467830
|
+
});
|
|
467831
|
+
var walkthroughTools = [walkthroughTool];
|
|
467832
|
+
|
|
467464
467833
|
// ../cli/src/tools/manifest/index.ts
|
|
467465
467834
|
var manifest = [
|
|
467466
467835
|
...sceneTools,
|
|
@@ -467473,15 +467842,16 @@ var manifest = [
|
|
|
467473
467842
|
...timelineTools,
|
|
467474
467843
|
...projectTools,
|
|
467475
467844
|
...exportTools,
|
|
467476
|
-
...agentOnlyTools
|
|
467845
|
+
...agentOnlyTools,
|
|
467846
|
+
...walkthroughTools
|
|
467477
467847
|
];
|
|
467478
467848
|
|
|
467479
467849
|
// ../cli/src/tools/zod-to-json-schema.ts
|
|
467480
|
-
function getDef(
|
|
467481
|
-
return
|
|
467850
|
+
function getDef(z13) {
|
|
467851
|
+
return z13._def;
|
|
467482
467852
|
}
|
|
467483
|
-
function getDescription(
|
|
467484
|
-
let current =
|
|
467853
|
+
function getDescription(z13) {
|
|
467854
|
+
let current = z13;
|
|
467485
467855
|
while (current) {
|
|
467486
467856
|
const def = getDef(current);
|
|
467487
467857
|
if (def.description) return def.description;
|
|
@@ -467489,24 +467859,24 @@ function getDescription(z12) {
|
|
|
467489
467859
|
}
|
|
467490
467860
|
return void 0;
|
|
467491
467861
|
}
|
|
467492
|
-
function unwrapOptional(
|
|
467493
|
-
const def = getDef(
|
|
467862
|
+
function unwrapOptional(z13) {
|
|
467863
|
+
const def = getDef(z13);
|
|
467494
467864
|
if (def.typeName === "ZodOptional" && def.innerType) {
|
|
467495
467865
|
return { inner: def.innerType, optional: true };
|
|
467496
467866
|
}
|
|
467497
|
-
return { inner:
|
|
467867
|
+
return { inner: z13, optional: false };
|
|
467498
467868
|
}
|
|
467499
|
-
function unwrapDefault(
|
|
467500
|
-
const def = getDef(
|
|
467869
|
+
function unwrapDefault(z13) {
|
|
467870
|
+
const def = getDef(z13);
|
|
467501
467871
|
if (def.typeName === "ZodDefault" && def.innerType && def.defaultValue) {
|
|
467502
467872
|
return { inner: def.innerType, defaultValue: def.defaultValue() };
|
|
467503
467873
|
}
|
|
467504
|
-
return { inner:
|
|
467874
|
+
return { inner: z13 };
|
|
467505
467875
|
}
|
|
467506
|
-
function convertLeaf(
|
|
467507
|
-
const { inner: afterDefault, defaultValue } = unwrapDefault(
|
|
467876
|
+
function convertLeaf(z13, description) {
|
|
467877
|
+
const { inner: afterDefault, defaultValue } = unwrapDefault(z13);
|
|
467508
467878
|
const def = getDef(afterDefault);
|
|
467509
|
-
const desc = description ?? getDescription(
|
|
467879
|
+
const desc = description ?? getDescription(z13);
|
|
467510
467880
|
const base = {};
|
|
467511
467881
|
if (desc) base.description = desc;
|
|
467512
467882
|
if (defaultValue !== void 0) base.default = defaultValue;
|
|
@@ -467553,8 +467923,8 @@ function convertLeaf(z12, description) {
|
|
|
467553
467923
|
);
|
|
467554
467924
|
}
|
|
467555
467925
|
}
|
|
467556
|
-
function convertObject(
|
|
467557
|
-
const def = getDef(
|
|
467926
|
+
function convertObject(z13, description) {
|
|
467927
|
+
const def = getDef(z13);
|
|
467558
467928
|
if (def.typeName !== "ZodObject" || !def.shape) {
|
|
467559
467929
|
throw new Error(`zod-to-json-schema: convertObject called on non-ZodObject (${def.typeName})`);
|
|
467560
467930
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeframe/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.71.0",
|
|
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/core": "0.71.0",
|
|
61
|
+
"@vibeframe/cli": "0.71.0"
|
|
62
62
|
},
|
|
63
63
|
"engines": {
|
|
64
64
|
"node": ">=20"
|