@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.
- package/dist/index.js +163 -3
- 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.
|
|
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.
|
|
61
|
-
"@vibeframe/core": "0.
|
|
60
|
+
"@vibeframe/cli": "0.84.0",
|
|
61
|
+
"@vibeframe/core": "0.84.0"
|
|
62
62
|
},
|
|
63
63
|
"engines": {
|
|
64
64
|
"node": ">=20"
|