@vibeframe/mcp-server 0.82.0 → 0.84.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 +163 -3
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -452425,7 +452425,7 @@ var init_validate = __esm({
452425
452425
  import { resolve as resolve27, extname as extname7, basename as basename8 } from "node:path";
452426
452426
  import { existsSync as existsSync39 } from "node:fs";
452427
452427
  function registerEditCommands(aiCommand) {
452428
- aiCommand.command("silence-cut").alias("sc").description("Remove silent segments from video (FFmpeg default, or Gemini for smart detection)").argument("<video>", "Video file path").option("-o, --output <path>", "Output file path (default: <name>-cut.<ext>)").option("--noise <dB>", "Silence threshold in dB (default: -30)", "-30").option("-d, --min-duration <seconds>", "Minimum silence duration to cut (default: 0.5)", "0.5").option("--padding <seconds>", "Padding around non-silent segments (default: 0.1)", "0.1").option("--analyze-only", "Only detect silence, don't cut").option("--use-gemini", "Use Gemini Video Understanding for context-aware silence detection").option("-m, --model <model>", "Gemini model (default: flash)").option("--low-res", "Low resolution mode for longer videos (Gemini only)").option("-k, --api-key <key>", "Google API key override (or set GOOGLE_API_KEY env)").option("--dry-run", "Preview parameters without executing").addHelpText("after", `
452428
+ aiCommand.command("silence-cut").alias("sc").description("Remove silent segments from video (FFmpeg default, or Gemini for smart detection)").argument("<video>", "Video file path").option("-o, --output <path>", "Output file path (default: <name>-cut.<ext>)").option("--noise <dB>", "Silence threshold in dB (default: -30)", "-30").option("-d, --min-duration <seconds>", "Minimum silence duration to cut (default: 0.5)", "0.5").option("--padding <seconds>", "Padding around non-silent segments (default: 0.1)", "0.1").option("--analyze-only", "(deprecated \u2014 use `vibe detect silence`) Only detect silence, don't cut").option("--use-gemini", "Use Gemini Video Understanding for context-aware silence detection").option("-m, --model <model>", "Gemini model (default: flash)").option("--low-res", "Low resolution mode for longer videos (Gemini only)").option("-k, --api-key <key>", "Google API key override (or set GOOGLE_API_KEY env)").option("--dry-run", "Preview parameters without executing").addHelpText("after", `
452429
452429
  Examples:
452430
452430
  $ vibe edit silence-cut interview.mp4 -o clean.mp4
452431
452431
  $ vibe ed sc podcast.mp4 -o trimmed.mp4 --noise -25 --min-duration 1.0
@@ -452450,6 +452450,13 @@ No API key needed (FFmpeg only). Use --use-gemini for smart detection (requires
452450
452450
  const name = basename8(videoPath, ext);
452451
452451
  const outputPath = options.output || `${name}-cut${ext}`;
452452
452452
  const useGemini = options.useGemini || false;
452453
+ if (options.analyzeOnly) {
452454
+ console.error(
452455
+ source_default.yellow(
452456
+ "\u26A0 --analyze-only is deprecated. Use `vibe detect silence` for read-only detection. Will be removed in v1.0."
452457
+ )
452458
+ );
452459
+ }
452453
452460
  if (options.dryRun) {
452454
452461
  outputSuccess({
452455
452462
  command: "edit silence-cut",
@@ -453863,6 +453870,42 @@ var init_ai_fill_gaps = __esm({
453863
453870
  }
453864
453871
  });
453865
453872
 
453873
+ // ../cli/src/commands/_shared/cost-tier.ts
453874
+ function applyTier(cmd, tier) {
453875
+ cmd[COST_TIER_KEY] = tier;
453876
+ const colored = TIER_COLOR[tier](`Cost: ${tier} (${TIER_DESCRIPTION[tier]})`);
453877
+ cmd.addHelpText("after", `
453878
+ ${colored}
453879
+ `);
453880
+ return cmd;
453881
+ }
453882
+ function applyTiers(parent, tiers) {
453883
+ for (const cmd of parent.commands) {
453884
+ const tier = tiers[cmd.name()];
453885
+ if (tier) applyTier(cmd, tier);
453886
+ }
453887
+ }
453888
+ var TIER_DESCRIPTION, TIER_COLOR, COST_TIER_KEY;
453889
+ var init_cost_tier = __esm({
453890
+ "../cli/src/commands/_shared/cost-tier.ts"() {
453891
+ "use strict";
453892
+ init_source();
453893
+ TIER_DESCRIPTION = {
453894
+ "free": "FFmpeg only, no API call",
453895
+ "low": "$0.01\u2013$0.10 per call",
453896
+ "high": "$1\u2013$5 per call",
453897
+ "very-high": "$5\u2013$50+ per call"
453898
+ };
453899
+ TIER_COLOR = {
453900
+ "free": source_default.green,
453901
+ "low": source_default.cyan,
453902
+ "high": source_default.yellow,
453903
+ "very-high": source_default.red
453904
+ };
453905
+ COST_TIER_KEY = /* @__PURE__ */ Symbol.for("@vibeframe/cli.costTier");
453906
+ }
453907
+ });
453908
+
453866
453909
  // ../cli/src/commands/edit-cmd.ts
453867
453910
  var edit_cmd_exports = {};
453868
453911
  __export(edit_cmd_exports, {
@@ -454065,6 +454108,7 @@ var init_edit_cmd = __esm({
454065
454108
  init_ai_fill_gaps();
454066
454109
  init_output();
454067
454110
  init_validate();
454111
+ init_cost_tier();
454068
454112
  editCommand = new Command("edit").alias("ed").description(
454069
454113
  "Edit and post-process media (silence-cut, caption, grade, reframe, upscale...)"
454070
454114
  ).addHelpText(
@@ -454812,6 +454856,26 @@ Run 'vibe schema edit.<command>' for structured parameter info.
454812
454856
  exitWithError(generalError(`Video upscaling failed: ${msg}`));
454813
454857
  }
454814
454858
  });
454859
+ applyTiers(editCommand, {
454860
+ // free — FFmpeg only
454861
+ "noise-reduce": "free",
454862
+ "fade": "free",
454863
+ "text-overlay": "free",
454864
+ "interpolate": "free",
454865
+ // low — Whisper / single LLM call
454866
+ "silence-cut": "low",
454867
+ "caption": "low",
454868
+ "translate-srt": "low",
454869
+ "jump-cut": "low",
454870
+ "grade": "low",
454871
+ "speed-ramp": "low",
454872
+ // high — vision LLM or image gen
454873
+ "reframe": "high",
454874
+ "image": "high",
454875
+ "upscale": "high",
454876
+ // very-high — video gen per gap
454877
+ "fill-gaps": "very-high"
454878
+ });
454815
454879
  }
454816
454880
  });
454817
454881
 
@@ -460269,6 +460333,10 @@ __export(generate_exports, {
460269
460333
  executeStoryboard: () => executeStoryboard,
460270
460334
  generateCommand: () => generateCommand
460271
460335
  });
460336
+ function tierLast(parent, tier) {
460337
+ const newest = parent.commands[parent.commands.length - 1];
460338
+ if (newest) applyTier(newest, tier);
460339
+ }
460272
460340
  var generateCommand;
460273
460341
  var init_generate = __esm({
460274
460342
  "../cli/src/commands/generate.ts"() {
@@ -460287,6 +460355,7 @@ var init_generate = __esm({
460287
460355
  init_video_extend();
460288
460356
  init_image();
460289
460357
  init_video();
460358
+ init_cost_tier();
460290
460359
  init_sound_effect();
460291
460360
  init_music_status();
460292
460361
  init_background();
@@ -460324,18 +460393,31 @@ Run 'vibe schema generate.<command>' for structured parameter info.
460324
460393
  `
460325
460394
  );
460326
460395
  registerImageCommand(generateCommand);
460396
+ tierLast(generateCommand, "high");
460327
460397
  registerVideoCommand(generateCommand);
460398
+ tierLast(generateCommand, "very-high");
460328
460399
  registerSpeechCommand(generateCommand);
460400
+ tierLast(generateCommand, "low");
460329
460401
  registerSoundEffectCommand(generateCommand);
460402
+ tierLast(generateCommand, "low");
460330
460403
  registerMusicCommand(generateCommand);
460404
+ tierLast(generateCommand, "low");
460331
460405
  registerMusicStatusCommand(generateCommand);
460406
+ tierLast(generateCommand, "free");
460332
460407
  registerStoryboardCommand(generateCommand);
460408
+ tierLast(generateCommand, "high");
460333
460409
  registerMotionCommand(generateCommand);
460410
+ tierLast(generateCommand, "high");
460334
460411
  registerThumbnailCommand(generateCommand);
460412
+ tierLast(generateCommand, "free");
460335
460413
  registerBackgroundCommand(generateCommand);
460414
+ tierLast(generateCommand, "high");
460336
460415
  registerVideoStatusCommand(generateCommand);
460416
+ tierLast(generateCommand, "free");
460337
460417
  registerVideoCancelCommand(generateCommand);
460418
+ tierLast(generateCommand, "free");
460338
460419
  registerVideoExtendCommand(generateCommand);
460420
+ tierLast(generateCommand, "very-high");
460339
460421
  }
460340
460422
  });
460341
460423
 
@@ -460809,6 +460891,7 @@ var init_detect = __esm({
460809
460891
  init_exec_safe();
460810
460892
  init_output();
460811
460893
  init_validate();
460894
+ init_cost_tier();
460812
460895
  detectCommand = new Command("detect").description("Auto-detect scenes, beats, and silences in media");
460813
460896
  detectCommand.command("scenes").description("Detect scene changes in video").argument("<video>", "Video file path").option("--threshold <value>", "Scene change threshold (0-1)", "0.3").option("-o, --output <path>", "Output JSON file with timestamps").option("--project <path>", "Add scenes as clips to project").option("--dry-run", "Preview parameters without executing").action(async (videoPath, options) => {
460814
460897
  const startedAt = Date.now();
@@ -461100,6 +461183,11 @@ var init_detect = __esm({
461100
461183
  exitWithError(generalError(`Beat detection failed: ${msg}`));
461101
461184
  }
461102
461185
  });
461186
+ applyTiers(detectCommand, {
461187
+ "scenes": "free",
461188
+ "silence": "free",
461189
+ "beats": "free"
461190
+ });
461103
461191
  }
461104
461192
  });
461105
461193
 
@@ -468088,6 +468176,59 @@ When the user has a working shell sequence, extract steps:
468088
468176
  The \`compose\` action is the catch-all assembly step (audio mux, video
468089
468177
  overlay, etc.) \u2014 useful at the tail of a pipeline.
468090
468178
  `;
468179
+ var ARCHITECTURE_WALKTHROUGH = `# vibe agent / build / run \u2014 when to pick which
468180
+
468181
+ The CLI has three orchestrating commands that coordinate other primitives:
468182
+ \`vibe agent\`, \`vibe build\`, \`vibe run\`. New users routinely ask which one
468183
+ they want for a given task. The full audit lives in
468184
+ [\`docs/cli-architecture.md\`](../../../docs/cli-architecture.md); this
468185
+ walkthrough is the operator-facing summary.
468186
+
468187
+ ## TL;DR
468188
+
468189
+ | | \`vibe agent\` | \`vibe build\` | \`vibe run\` |
468190
+ |---|---|---|---|
468191
+ | **Driving input** | natural-language prompt | \`STORYBOARD.md\` | YAML pipeline file |
468192
+ | **Interactivity** | REPL or one-shot | one-shot | one-shot |
468193
+ | **Reproducibility** | none | high (idempotent) | highest (checkpointed) |
468194
+ | **Budget caps** | per-session max-turns | none | \`--budget-usd\`, \`--budget-tokens\`, \`--max-errors\` |
468195
+ | **Resume after crash** | no | re-invoke | \`--resume\` |
468196
+ | **Best for** | exploration | finished script | repeatable workflows |
468197
+
468198
+ ## Decision tree
468199
+
468200
+ - "I want to play, I'll know it when I see it" \u2192 \`vibe agent\`
468201
+ - "I have a finished script + visual identity" \u2192 \`vibe build\`
468202
+ - "I want this to run again next month" \u2192 \`vibe run\`
468203
+
468204
+ If two seem to fit, pick the rightmost one \u2014 more reproducible, less surprise.
468205
+
468206
+ ## Cost-tier awareness (v0.83+)
468207
+
468208
+ Every primitive subcommand carries a cost tier (\`free\` / \`low\` / \`high\` /
468209
+ \`very-high\`). \`vibe schema --list\` exposes the tier as JSON, and each
468210
+ \`vibe <group> <sub> --help\` page shows it as a colored footer. Use
468211
+ \`vibe doctor --test-keys\` before kicking off any high-cost orchestrator \u2014
468212
+ a single bad key wastes time and money.
468213
+
468214
+ ## Cross-command primitives
468215
+
468216
+ All three commands ultimately call the same primitives:
468217
+ \`generate\` / \`edit\` / \`audio\` / \`inspect\` / \`detect\` / \`remix\`. The
468218
+ agent calls them through a tool manifest; \`build\` calls a curated subset
468219
+ (TTS + image + compose + render); \`run\` exposes 55+ actions one per primitive.
468220
+
468221
+ ## Known overlap
468222
+
468223
+ - \`vibe build\` is conceptually a 4-step pipeline; \`vibe run\` could express
468224
+ the same flow but build's STORYBOARD.md input + opinionated defaults are
468225
+ the value-add.
468226
+ - \`vibe agent\`'s tool registry currently exposes primitives, not
468227
+ orchestrators. Adding \`vibe.build\` / \`vibe.run\` as agent tools is on the
468228
+ table for a future major.
468229
+ - \`vibe run --resume\` has no analog in build/agent; build's idempotent
468230
+ re-invoke covers the common case.
468231
+ `;
468091
468232
  var META = {
468092
468233
  scene: {
468093
468234
  title: "Scene authoring with vibe",
@@ -468125,13 +468266,32 @@ var META = {
468125
468266
  "vibe schema --list",
468126
468267
  "vibe doctor"
468127
468268
  ]
468269
+ },
468270
+ architecture: {
468271
+ title: "vibe agent / build / run \u2014 when to pick which",
468272
+ summary: "Compare the three orchestrating commands on the dimensions that actually decide the choice",
468273
+ steps: [
468274
+ "Pick agent for exploration (NL prompt, REPL, no checkpoints).",
468275
+ "Pick build for STORYBOARD.md \u2192 MP4 with opinionated defaults.",
468276
+ "Pick run for repeatable, budget-capped, checkpointed YAML pipelines.",
468277
+ "Run `vibe doctor --test-keys` before any high-cost orchestrator to validate keys upfront.",
468278
+ "Use `vibe schema --list` (cost field, v0.84) to plan the budget per step before kicking off `vibe run --budget-usd`."
468279
+ ],
468280
+ relatedCommands: [
468281
+ "vibe agent",
468282
+ "vibe build",
468283
+ "vibe run",
468284
+ "vibe doctor",
468285
+ "vibe schema --list"
468286
+ ]
468128
468287
  }
468129
468288
  };
468130
468289
  var CONTENT2 = {
468131
468290
  scene: SCENE_WALKTHROUGH,
468132
- pipeline: PIPELINE_WALKTHROUGH
468291
+ pipeline: PIPELINE_WALKTHROUGH,
468292
+ architecture: ARCHITECTURE_WALKTHROUGH
468133
468293
  };
468134
- var WALKTHROUGH_TOPICS = ["scene", "pipeline"];
468294
+ var WALKTHROUGH_TOPICS = ["scene", "pipeline", "architecture"];
468135
468295
  function loadWalkthrough(topic) {
468136
468296
  const meta = META[topic];
468137
468297
  const content = CONTENT2[topic];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/mcp-server",
3
- "version": "0.82.0",
3
+ "version": "0.84.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.82.0",
61
- "@vibeframe/core": "0.82.0"
60
+ "@vibeframe/cli": "0.84.0",
61
+ "@vibeframe/core": "0.84.0"
62
62
  },
63
63
  "engines": {
64
64
  "node": ">=20"