@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.
Files changed (2) hide show
  1. package/dist/index.js +412 -42
  2. 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 z12 = options.includePrerelease ? "-0" : "";
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${z12} <${+M + 1}.0.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${z12} <${M}.${+m + 1}.0-0`;
79598
+ ret = `>=${M}.${m}.0${z13} <${M}.${+m + 1}.0-0`;
79599
79599
  } else {
79600
- ret = `>=${M}.${m}.0${z12} <${+M + 1}.0.0-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}${z12} <${M}.${m}.${+p + 1}-0`;
79617
+ ret = `>=${M}.${m}.${p}${z13} <${M}.${m}.${+p + 1}-0`;
79618
79618
  } else {
79619
- ret = `>=${M}.${m}.${p}${z12} <${M}.${+m + 1}.0-0`;
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, z12, A;
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
- z12 = (b, c, d) => {
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
- }), z12 = (b, c, d) => {
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 (z12)
106494
+ if (z13)
106495
106495
  return new Promise(function(c, d) {
106496
- z12(b, function(e) {
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 z12 = parseInt(cs.zIndex);
347718
- if (!Number.isNaN(z12) && pos !== "static") return z12;
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 z12 = options.includePrerelease ? "-0" : "";
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${z12} <${+M + 1}.0.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${z12} <${M}.${+m + 1}.0-0`;
396300
+ ret = `>=${M}.${m}.0${z13} <${M}.${+m + 1}.0-0`;
396301
396301
  } else {
396302
- ret = `>=${M}.${m}.0${z12} <${+M + 1}.0.0-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}${z12} <${M}.${m}.${+p + 1}-0`;
396319
+ ret = `>=${M}.${m}.${p}${z13} <${M}.${m}.${+p + 1}-0`;
396320
396320
  } else {
396321
- ret = `>=${M}.${m}.${p}${z12} <${M}.${+m + 1}.0-0`;
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, z12, A;
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
- z12 = (b, c, d) => {
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
- }), z12 = (b, c, d) => {
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 (z12)
422258
+ if (z13)
422259
422259
  return new Promise(function(c, d) {
422260
- z12(b, function(e) {
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(z12) {
467481
- return z12._def;
467850
+ function getDef(z13) {
467851
+ return z13._def;
467482
467852
  }
467483
- function getDescription(z12) {
467484
- let current = z12;
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(z12) {
467493
- const def = getDef(z12);
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: z12, optional: false };
467867
+ return { inner: z13, optional: false };
467498
467868
  }
467499
- function unwrapDefault(z12) {
467500
- const def = getDef(z12);
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: z12 };
467874
+ return { inner: z13 };
467505
467875
  }
467506
- function convertLeaf(z12, description) {
467507
- const { inner: afterDefault, defaultValue } = unwrapDefault(z12);
467876
+ function convertLeaf(z13, description) {
467877
+ const { inner: afterDefault, defaultValue } = unwrapDefault(z13);
467508
467878
  const def = getDef(afterDefault);
467509
- const desc = description ?? getDescription(z12);
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(z12, description) {
467557
- const def = getDef(z12);
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.70.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/cli": "0.70.0",
61
- "@vibeframe/core": "0.70.0"
60
+ "@vibeframe/core": "0.71.0",
61
+ "@vibeframe/cli": "0.71.0"
62
62
  },
63
63
  "engines": {
64
64
  "node": ">=20"