@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.
- package/dist/index.js +78 -21
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
454007
|
-
$ vibe edit noise-reduce noisy.mp4 -o clean.mp4
|
|
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
|
|
466071
|
-
$ vibe export project.vibe.json -o output.webm
|
|
466072
|
-
$ vibe export project.vibe.json -o output.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
|
|
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
|
|
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
|
|
467723
|
-
|
|
467724
|
-
|
|
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
|
-
|
|
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\`
|
|
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.
|
|
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.
|
|
61
|
-
"@vibeframe/core": "0.
|
|
60
|
+
"@vibeframe/cli": "0.79.1",
|
|
61
|
+
"@vibeframe/core": "0.79.1"
|
|
62
62
|
},
|
|
63
63
|
"engines": {
|
|
64
64
|
"node": ">=20"
|