@vibeframe/mcp-server 0.78.0 → 0.79.1

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 +78 -21
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -452406,7 +452406,7 @@ function registerEditCommands(aiCommand) {
452406
452406
  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", `
452407
452407
  Examples:
452408
452408
  $ vibe edit silence-cut interview.mp4 -o clean.mp4
452409
- $ vibe ed sc podcast.mp4 -o trimmed.mp4 -n -25 -d 1.0
452409
+ $ vibe ed sc podcast.mp4 -o trimmed.mp4 --noise -25 --min-duration 1.0
452410
452410
  $ vibe ed sc video.mp4 --use-gemini -o smart-cut.mp4 # AI-powered detection
452411
452411
  $ vibe ed sc video.mp4 --analyze-only # Detect only, no cut
452412
452412
  $ vibe ed sc video.mp4 --dry-run --json
@@ -452507,9 +452507,9 @@ No API key needed (FFmpeg only). Use --use-gemini for smart detection (requires
452507
452507
  aiCommand.command("caption").alias("cap").description("Transcribe and burn styled captions onto video (Whisper + FFmpeg)").argument("<video>", "Video file path").option("-o, --output <path>", "Output file path (default: <name>-captioned.<ext>)").option("--style <style>", "Caption style: minimal, bold, outline, karaoke (default: bold)", "bold").option("--font-size <pixels>", "Override auto-calculated font size").option("--color <color>", "Font color (default: white)", "white").option("-l, --language <lang>", "Language code for transcription (e.g., en, ko)").option("--position <pos>", "Caption position: top, center, bottom (default: bottom)", "bottom").option("-k, --api-key <key>", "OpenAI API key (or set OPENAI_API_KEY env)").option("--dry-run", "Preview parameters without executing").addHelpText("after", `
452508
452508
  Examples:
452509
452509
  $ vibe edit caption video.mp4 -o captioned.mp4
452510
- $ vibe ed cap video.mp4 -o out.mp4 -s bold --position top
452510
+ $ vibe ed cap video.mp4 -o out.mp4 --style bold --position top
452511
452511
  $ vibe ed cap video.mp4 -o out.mp4 -l ko # Korean transcription
452512
- $ vibe ed cap video.mp4 -o out.mp4 -s karaoke # Karaoke-style
452512
+ $ vibe ed cap video.mp4 -o out.mp4 --style karaoke # Karaoke-style
452513
452513
  $ vibe ed cap video.mp4 --dry-run --json
452514
452514
 
452515
452515
  Requires: OPENAI_API_KEY (Whisper transcription) + FFmpeg`).action(async (videoPath, options) => {
@@ -453999,12 +453999,12 @@ var init_edit_cmd = __esm({
453999
453999
  `
454000
454000
  Examples:
454001
454001
  $ vibe edit silence-cut interview.mp4 -o clean.mp4
454002
- $ vibe edit caption video.mp4 -o captioned.mp4 -s bold
454002
+ $ vibe edit caption video.mp4 -o captioned.mp4 --style bold
454003
454003
  $ vibe edit grade video.mp4 -o graded.mp4 --preset cinematic-warm
454004
454004
  $ vibe edit reframe landscape.mp4 -o vertical.mp4 -a 9:16
454005
454005
  $ vibe edit image photo.png "add sunset background" -o edited.png
454006
- $ vibe edit text-overlay video.mp4 -t "Title" -s center-bold -o out.mp4
454007
- $ vibe edit noise-reduce noisy.mp4 -o clean.mp4 -s high
454006
+ $ vibe edit text-overlay video.mp4 --text "Title" --style center-bold -o out.mp4
454007
+ $ vibe edit noise-reduce noisy.mp4 -o clean.mp4 --strength high
454008
454008
  $ vibe edit fade video.mp4 -o faded.mp4 --fade-in 1 --fade-out 1
454009
454009
 
454010
454010
  API Keys (varies by subcommand):
@@ -455710,6 +455710,33 @@ function registerMotionCommand(aiCommand) {
455710
455710
  if (options.output) {
455711
455711
  validateOutputPath(options.output);
455712
455712
  }
455713
+ if (options.duration !== void 0) {
455714
+ const d = parseFloat(options.duration);
455715
+ if (!Number.isFinite(d) || d <= 0 || d > 60) {
455716
+ exitWithError(usageError(
455717
+ `Invalid --duration: ${options.duration}`,
455718
+ "Must be a positive number \u2264 60 seconds."
455719
+ ));
455720
+ }
455721
+ }
455722
+ if (options.width !== void 0) {
455723
+ const w = parseInt(options.width, 10);
455724
+ if (!Number.isFinite(w) || w < 16 || w > 7680) {
455725
+ exitWithError(usageError(
455726
+ `Invalid --width: ${options.width}`,
455727
+ "Must be an integer between 16 and 7680."
455728
+ ));
455729
+ }
455730
+ }
455731
+ if (options.height !== void 0) {
455732
+ const h = parseInt(options.height, 10);
455733
+ if (!Number.isFinite(h) || h < 16 || h > 4320) {
455734
+ exitWithError(usageError(
455735
+ `Invalid --height: ${options.height}`,
455736
+ "Must be an integer between 16 and 4320."
455737
+ ));
455738
+ }
455739
+ }
455713
455740
  if (options.dryRun) {
455714
455741
  outputSuccess({
455715
455742
  command: "generate motion",
@@ -456674,13 +456701,22 @@ async function executeMusic(options) {
456674
456701
  }
456675
456702
  }
456676
456703
  function registerMusicCommand(parent) {
456677
- parent.command("music").description("Generate background music from a text prompt (ElevenLabs or Replicate MusicGen)").argument("<prompt>", "Description of the music to generate").option("-p, --provider <provider>", "Provider: elevenlabs (default, up to 10min), replicate (MusicGen, max 30s)", "elevenlabs").option("-k, --api-key <key>", "API key (or set ELEVENLABS_API_KEY / REPLICATE_API_TOKEN env)").option("-d, --duration <seconds>", "Duration in seconds (elevenlabs: 3-600, replicate: 1-30)", "8").option("--instrumental", "Force instrumental music, no vocals (ElevenLabs only)").option("--melody <file>", "Reference melody audio file for conditioning (Replicate only)").option("--model <model>", "Model variant (Replicate only): large, stereo-large, melody-large, stereo-melody-large", "stereo-large").option("-o, --output <path>", "Output audio file path", "music.mp3").option("--no-wait", "Don't wait for generation to complete (Replicate async mode)").option("--dry-run", "Preview parameters without executing").action(async (prompt3, options) => {
456704
+ parent.command("music").description("Generate background music from a text prompt (ElevenLabs or Replicate MusicGen)").argument("<prompt>", "Description of the music to generate").option("-p, --provider <provider>", "Provider: elevenlabs (default, up to 10min), replicate (MusicGen, max 30s)", "elevenlabs").option("-k, --api-key <key>", "API key (or set ELEVENLABS_API_KEY / REPLICATE_API_TOKEN env)").option("-d, --duration <seconds>", "Duration in seconds (elevenlabs: 3-600, replicate: 1-30)", "8").option("--instrumental", "Force instrumental music, no vocals (ElevenLabs only)").option("--melody <file>", "Reference melody audio file for conditioning (Replicate only)").option("-m, --model <model>", "Model variant (Replicate only): large, stereo-large, melody-large, stereo-melody-large", "stereo-large").option("-o, --output <path>", "Output audio file path", "music.mp3").option("--no-wait", "Don't wait for generation to complete (Replicate async mode)").option("--dry-run", "Preview parameters without executing").action(async (prompt3, options) => {
456678
456705
  const startedAt = Date.now();
456679
456706
  try {
456680
456707
  rejectControlChars(prompt3);
456681
456708
  if (options.output) {
456682
456709
  validateOutputPath(options.output);
456683
456710
  }
456711
+ if (options.duration !== void 0) {
456712
+ const d = parseFloat(options.duration);
456713
+ if (!Number.isFinite(d) || d <= 0 || d > 600) {
456714
+ exitWithError(usageError(
456715
+ `Invalid --duration: ${options.duration}`,
456716
+ "Must be a positive number \u2264 600s (ElevenLabs 3-600, Replicate 1-30)."
456717
+ ));
456718
+ }
456719
+ }
456684
456720
  const provider = (options.provider || "elevenlabs").toLowerCase();
456685
456721
  if (options.dryRun) {
456686
456722
  outputSuccess({
@@ -457549,6 +457585,15 @@ Examples:
457549
457585
  if (options.output) {
457550
457586
  validateOutputPath(options.output);
457551
457587
  }
457588
+ if (options.count !== void 0) {
457589
+ const n = parseInt(options.count, 10);
457590
+ if (!Number.isFinite(n) || n < 1 || n > 10) {
457591
+ exitWithError(usageError(
457592
+ `Invalid --count: ${options.count}`,
457593
+ "Must be an integer between 1 and 10."
457594
+ ));
457595
+ }
457596
+ }
457552
457597
  const imageRegistry = getProvidersFor("image");
457553
457598
  const validProviders = [...imageRegistry.map((p) => p.name), "runway"];
457554
457599
  const providerEnvMap = Object.fromEntries(
@@ -459693,6 +459738,15 @@ Examples:
459693
459738
  if (options.output) {
459694
459739
  validateOutputPath(options.output);
459695
459740
  }
459741
+ if (options.duration !== void 0) {
459742
+ const d = parseFloat(options.duration);
459743
+ if (!Number.isFinite(d) || d <= 0 || d > 60) {
459744
+ exitWithError(usageError(
459745
+ `Invalid --duration: ${options.duration}`,
459746
+ "Must be a positive number \u2264 60 seconds."
459747
+ ));
459748
+ }
459749
+ }
459696
459750
  const validProviders = ["runway", "kling", "veo", "grok", "seedance", "fal"];
459697
459751
  const videoEnvMap = {
459698
459752
  grok: "XAI_API_KEY",
@@ -466067,11 +466121,11 @@ var exportCommand = new Command("export").description("Export project to video f
466067
466121
  ).option("--overwrite", "Overwrite output file if exists", false).option("--gap-fill <strategy>", "Gap filling strategy (black, extend)", "extend").option("--backend <name>", "Render backend: ffmpeg (default) | hyperframes (experimental)", "ffmpeg").option("--bitrate <value>", "Video bitrate (e.g. 5000k, 8M) \u2014 overrides preset").option("--fps <number>", "Frames per second (e.g. 24, 30, 60) \u2014 overrides preset").option("--resolution <WxH>", "Output resolution (e.g. 1920x1080) \u2014 overrides preset").option("--codec <codec>", "Video codec: h264 (default) | h265 | vp9 \u2014 overrides preset").option("--dry-run", "Preview parameters without executing").addHelpText("after", `
466068
466122
  Examples:
466069
466123
  $ vibe export project.vibe.json -o output.mp4
466070
- $ vibe export project.vibe.json -o output.mp4 -p high -y
466071
- $ vibe export project.vibe.json -o output.webm -f webm
466072
- $ vibe export project.vibe.json -o output.gif -f gif
466124
+ $ vibe export project.vibe.json -o output.mp4 --preset high --overwrite
466125
+ $ vibe export project.vibe.json -o output.webm --format webm
466126
+ $ vibe export project.vibe.json -o output.gif --format gif
466073
466127
  $ vibe export project.vibe.json -o out.mp4 --bitrate 5000k --fps 24 --codec h265
466074
- $ vibe export project.vibe.json -o out.mp4 -p high --fps 60
466128
+ $ vibe export project.vibe.json -o out.mp4 --preset high --fps 60
466075
466129
 
466076
466130
  Cost: Free (no API keys needed). Requires FFmpeg.
466077
466131
  GIF format: 15fps, no audio, looping. Good for previews and sharing.
@@ -467712,28 +467766,31 @@ narration / backdrop intent.
467712
467766
  ## Quick-draft path
467713
467767
 
467714
467768
  \`\`\`bash
467715
- vibe scene init my-promo -r 16:9 -d 30
467769
+ vibe init my-promo -r 16:9 -d 30
467716
467770
  vibe scene add intro --style announcement \\
467717
467771
  --headline "Ship videos, not clicks"
467718
467772
  vibe scene lint
467719
467773
  vibe render my-promo
467720
467774
  \`\`\`
467721
467775
 
467722
- \`vibe scene init\` is **idempotent** \u2014 running it on an existing
467723
- Hyperframes directory merges \`hyperframes.json\` instead of clobbering it.
467724
- Safe to invoke on user-provided projects.
467776
+ \`vibe init\` is **idempotent** \u2014 running it on an existing Hyperframes
467777
+ directory merges \`hyperframes.json\` instead of clobbering it. Safe to
467778
+ invoke on user-provided projects.
467725
467779
 
467726
467780
  ## Subcommands
467727
467781
 
467728
467782
  \`\`\`bash
467729
- vibe scene init <dir> [-r 16:9|9:16|1:1|4:5] [-d <sec>] [--visual-style "<name>"]
467783
+ # Project flow (top-level \u2014 preferred entry points)
467784
+ vibe init <dir> [-r 16:9|9:16|1:1|4:5] [-d <sec>] [--visual-style "<name>"]
467785
+ vibe build [<dir>] [--mode agent|batch|auto] # H3 dispatch
467786
+ vibe render [<dir>] [--fps 30] [--quality standard] [--format mp4]
467787
+
467788
+ # Lower-level scene authoring
467730
467789
  vibe scene list-styles [<name>] # list / show vendored visual identities
467731
467790
  vibe scene install-skill [<dir>] [--host all] # retroactive composition-rules install
467732
467791
  vibe scene add <name> --style <preset> [...]
467733
467792
  vibe scene compose-prompts [<dir>] [--beat <id>] # H2: emit plan, no LLM call
467734
467793
  vibe scene lint [<root>] [--json] [--fix]
467735
- vibe scene render [<root>] [--fps 30] [--quality standard] [--format mp4]
467736
- vibe build [<dir>] [--mode agent|batch|auto] # H3 dispatch
467737
467794
  \`\`\`
467738
467795
 
467739
467796
  ## Style presets (for \`vibe scene add --style\`)
@@ -467787,7 +467844,7 @@ and surface the error to the user.
467787
467844
  | Generate narration + image, then author scene | \`vibe scene add\` |
467788
467845
  | Generate a full scenes project from a STORYBOARD | \`vibe build\` |
467789
467846
  | Hand-tweak a single scene's animation | edit \`compositions/<file>.html\` directly |
467790
- | Render the project | \`vibe render\` *or* \`vibe scene render\` for lower-level control |
467847
+ | Render the project | \`vibe render\` (one canonical entry point) |
467791
467848
  | Lint | \`vibe scene lint\` *or* \`npx hyperframes lint\` (equivalent) |
467792
467849
 
467793
467850
  The \`vibe\` CLI adds asset generation, AI orchestration, and pipeline
@@ -467915,12 +467972,12 @@ var META = {
467915
467972
  ],
467916
467973
  relatedCommands: [
467917
467974
  "vibe init",
467975
+ "vibe build",
467976
+ "vibe render",
467918
467977
  "vibe scene list-styles",
467919
467978
  "vibe scene install-skill",
467920
467979
  "vibe scene compose-prompts",
467921
- "vibe build",
467922
467980
  "vibe scene lint",
467923
- "vibe scene render",
467924
467981
  "vibe scene add"
467925
467982
  ]
467926
467983
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/mcp-server",
3
- "version": "0.78.0",
3
+ "version": "0.79.1",
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.78.0",
61
- "@vibeframe/core": "0.78.0"
60
+ "@vibeframe/cli": "0.79.1",
61
+ "@vibeframe/core": "0.79.1"
62
62
  },
63
63
  "engines": {
64
64
  "node": ">=20"