@vibeframe/cli 0.73.0 → 0.74.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 +113 -81
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -6546,8 +6546,10 @@ var output_exports = {};
|
|
|
6546
6546
|
__export(output_exports, {
|
|
6547
6547
|
COST_ESTIMATES: () => COST_ESTIMATES,
|
|
6548
6548
|
ExitCode: () => ExitCode,
|
|
6549
|
+
_resetDeprecationMemoryForTesting: () => _resetDeprecationMemoryForTesting,
|
|
6549
6550
|
apiError: () => apiError,
|
|
6550
6551
|
authError: () => authError,
|
|
6552
|
+
emitDeprecationWarning: () => emitDeprecationWarning,
|
|
6551
6553
|
exitWithError: () => exitWithError,
|
|
6552
6554
|
generalError: () => generalError,
|
|
6553
6555
|
isJsonMode: () => isJsonMode,
|
|
@@ -6692,6 +6694,19 @@ function suggestNext(tip) {
|
|
|
6692
6694
|
Tip: ${tip}`));
|
|
6693
6695
|
}
|
|
6694
6696
|
}
|
|
6697
|
+
function emitDeprecationWarning(oldName, newName, removeIn) {
|
|
6698
|
+
if (isJsonMode() || isQuietMode()) return;
|
|
6699
|
+
if (!process.stderr.isTTY) return;
|
|
6700
|
+
const key = `${oldName}\u2192${newName}`;
|
|
6701
|
+
if (_seenDeprecations.has(key)) return;
|
|
6702
|
+
_seenDeprecations.add(key);
|
|
6703
|
+
process.stderr.write(
|
|
6704
|
+
source_default.yellow(`[deprecated] '${oldName}' is deprecated; use '${newName}' instead. Alias will be removed in ${removeIn}.`) + "\n"
|
|
6705
|
+
);
|
|
6706
|
+
}
|
|
6707
|
+
function _resetDeprecationMemoryForTesting() {
|
|
6708
|
+
_seenDeprecations.clear();
|
|
6709
|
+
}
|
|
6695
6710
|
function outputError(error, details) {
|
|
6696
6711
|
if (isJsonMode()) {
|
|
6697
6712
|
console.error(JSON.stringify({ success: false, error, ...details }, null, 2));
|
|
@@ -6699,7 +6714,7 @@ function outputError(error, details) {
|
|
|
6699
6714
|
console.error(error);
|
|
6700
6715
|
}
|
|
6701
6716
|
}
|
|
6702
|
-
var ExitCode, PROVIDER_ERROR_HINTS, COST_ESTIMATES;
|
|
6717
|
+
var ExitCode, PROVIDER_ERROR_HINTS, COST_ESTIMATES, _seenDeprecations;
|
|
6703
6718
|
var init_output = __esm({
|
|
6704
6719
|
"src/commands/output.ts"() {
|
|
6705
6720
|
"use strict";
|
|
@@ -6734,7 +6749,7 @@ var init_output = __esm({
|
|
|
6734
6749
|
{ pattern: /context_length_exceeded|maximum.*context.*length|token.*limit.*exceeded|prompt.*too.*long/i, suggestion: "Input exceeds the model's context window. Shorten the prompt, or use a model with larger context (run 'vibe schema <command>' for options).", retryable: false },
|
|
6735
6750
|
{ pattern: /model.*not.*found|invalid.*model|unknown.*model|model_not_found/i, suggestion: "The specified model is unavailable. Check 'vibe schema <command>' for valid model options.", retryable: false },
|
|
6736
6751
|
// Provider-specific
|
|
6737
|
-
{ pattern: /voice.*not.*found|voice_not_found|invalid.*voice.?id/i, suggestion: "Voice ID not found. Run 'vibe audio voices' to list available voices, then pass --voice <id>.", retryable: false },
|
|
6752
|
+
{ pattern: /voice.*not.*found|voice_not_found|invalid.*voice.?id/i, suggestion: "Voice ID not found. Run 'vibe audio list-voices' to list available voices, then pass --voice <id>.", retryable: false },
|
|
6738
6753
|
{ pattern: /character.*(count|limit).*exceeded|invalid_character_count/i, suggestion: "Text exceeds the TTS provider's character limit. Shorten the text or split into chunks.", retryable: false },
|
|
6739
6754
|
{ pattern: /invalid.*aspect.*ratio|unsupported.*aspect.*ratio|unsupported.*resolution/i, suggestion: "This aspect ratio or resolution isn't supported by the chosen model. Check 'vibe schema <command>' for supported values.", retryable: false },
|
|
6740
6755
|
{ pattern: /invalid.*file.*format|unsupported.*(format|codec)|unsupported.*media.?type/i, suggestion: "Input file format not supported. Convert to MP4/MP3/PNG first with 'vibe export' or 'ffmpeg'.", retryable: false },
|
|
@@ -6785,6 +6800,7 @@ var init_output = __esm({
|
|
|
6785
6800
|
// pre-flight). Range covers a 1-beat preview to a 10-beat long-form.
|
|
6786
6801
|
"compose scenes with skills": { min: 0.05, max: 1.5, unit: "per pipeline" }
|
|
6787
6802
|
};
|
|
6803
|
+
_seenDeprecations = /* @__PURE__ */ new Set();
|
|
6788
6804
|
}
|
|
6789
6805
|
});
|
|
6790
6806
|
|
|
@@ -30237,10 +30253,8 @@ var init_scene = __esm({
|
|
|
30237
30253
|
init_compose_prompts();
|
|
30238
30254
|
VALID_ASPECTS2 = ["16:9", "9:16", "1:1", "4:5"];
|
|
30239
30255
|
VALID_SCENE_INIT_PROFILES = ["minimal", "agent", "full"];
|
|
30240
|
-
sceneCommand = new Command("scene").description("
|
|
30256
|
+
sceneCommand = new Command("scene").description("Lower-level scene authoring (add, lint, styles). For project flow use `vibe init` / `vibe build` / `vibe render`.").addHelpText("after", `
|
|
30241
30257
|
Examples:
|
|
30242
|
-
$ vibe scene init my-video # Scaffold a new project
|
|
30243
|
-
$ vibe scene init my-video -r 9:16 -d 30 # Vertical 30s project
|
|
30244
30258
|
$ vibe scene add intro --style announcement \\
|
|
30245
30259
|
--headline "Welcome to VibeFrame" # Headline-only scene
|
|
30246
30260
|
$ vibe scene add overview --narration "VibeFrame turns scripts into video." \\
|
|
@@ -30248,14 +30262,13 @@ Examples:
|
|
|
30248
30262
|
$ vibe scene lint # Validate every scene against composition rules
|
|
30249
30263
|
$ vibe scene lint --fix # Auto-fix mechanical issues (e.g. missing class="clip")
|
|
30250
30264
|
$ vibe scene lint --json # Structured output for agent loops
|
|
30251
|
-
$ vibe scene
|
|
30252
|
-
$ vibe scene render -o demo.mp4 --quality high # Custom output path + quality
|
|
30253
|
-
$ vibe scene render --fps 60 --format webm # 60fps WebM render
|
|
30265
|
+
$ vibe scene styles # Browse seed visual styles for DESIGN.md
|
|
30254
30266
|
|
|
30255
|
-
|
|
30256
|
-
|
|
30267
|
+
For the project flow (init / build / render), use the top-level commands.
|
|
30268
|
+
The \`scene init\`, \`scene build\`, and \`scene render\` legacy aliases
|
|
30269
|
+
are still callable but hidden from this help \u2014 they will be removed in v1.0.
|
|
30257
30270
|
Run 'vibe schema scene.<command>' for structured parameter info.`);
|
|
30258
|
-
sceneCommand.command("init").description("Scaffold a new scene project (or safely augment an existing project)").argument("<dir>", "Project directory (created if it doesn't exist)").option("-n, --name <name>", "Project name (defaults to directory basename)").option("-r, --ratio <ratio>", "Aspect ratio: 16:9, 9:16, 1:1, 4:5", "16:9").option("-d, --duration <sec>", "Default root composition duration (seconds)", "10").option("--visual-style <name>", `Seed DESIGN.md from a named style (browse via \`vibe scene styles\`). E.g. "Swiss Pulse"`).option("--profile <profile>", "Scene profile: minimal (storyboard/design only), agent (recommended), full (render scaffold upfront)", "agent").option("--dry-run", "Preview parameters without writing files").action(async (dir, options) => {
|
|
30271
|
+
sceneCommand.command("init", { hidden: true }).description("Scaffold a new scene project (or safely augment an existing project) [legacy \u2014 prefer `vibe init`]").argument("<dir>", "Project directory (created if it doesn't exist)").option("-n, --name <name>", "Project name (defaults to directory basename)").option("-r, --ratio <ratio>", "Aspect ratio: 16:9, 9:16, 1:1, 4:5", "16:9").option("-d, --duration <sec>", "Default root composition duration (seconds)", "10").option("--visual-style <name>", `Seed DESIGN.md from a named style (browse via \`vibe scene styles\`). E.g. "Swiss Pulse"`).option("--profile <profile>", "Scene profile: minimal (storyboard/design only), agent (recommended), full (render scaffold upfront)", "agent").option("--dry-run", "Preview parameters without writing files").action(async (dir, options) => {
|
|
30259
30272
|
const startedAt = Date.now();
|
|
30260
30273
|
const aspect = validateAspect(options.ratio);
|
|
30261
30274
|
const duration = validateDuration(options.duration);
|
|
@@ -30712,7 +30725,7 @@ Run 'vibe schema scene.<command>' for structured parameter info.`);
|
|
|
30712
30725
|
VALID_FPS = [24, 30, 60];
|
|
30713
30726
|
VALID_QUALITIES = ["draft", "standard", "high"];
|
|
30714
30727
|
VALID_FORMATS = ["mp4", "webm", "mov"];
|
|
30715
|
-
sceneCommand.command("render").description("Render a scene project to MP4/WebM/MOV via the Hyperframes producer (requires Chrome)").argument("[root]", "Root composition file relative to --project", "index.html").option("--project <dir>", "Project directory", ".").option("-o, --out <path>", "Output file (default: renders/<name>-<timestamp>.<format>)").option("--fps <n>", `Frames per second: ${VALID_FPS.join("|")}`, "30").option("--quality <q>", `Quality preset: ${VALID_QUALITIES.join("|")}`, "standard").option("--format <f>", `Output container: ${VALID_FORMATS.join("|")}`, "mp4").option("--workers <n>", "Capture workers (1-16, default 1)", "1").option("--dry-run", "Preview parameters without rendering").action(async (root, options) => {
|
|
30728
|
+
sceneCommand.command("render", { hidden: true }).description("Render a scene project to MP4/WebM/MOV via the Hyperframes producer (requires Chrome) [legacy \u2014 prefer `vibe render`]").argument("[root]", "Root composition file relative to --project", "index.html").option("--project <dir>", "Project directory", ".").option("-o, --out <path>", "Output file (default: renders/<name>-<timestamp>.<format>)").option("--fps <n>", `Frames per second: ${VALID_FPS.join("|")}`, "30").option("--quality <q>", `Quality preset: ${VALID_QUALITIES.join("|")}`, "standard").option("--format <f>", `Output container: ${VALID_FORMATS.join("|")}`, "mp4").option("--workers <n>", "Capture workers (1-16, default 1)", "1").option("--dry-run", "Preview parameters without rendering").action(async (root, options) => {
|
|
30716
30729
|
const startedAt = Date.now();
|
|
30717
30730
|
const fps = validateFps(options.fps);
|
|
30718
30731
|
const quality = validateQuality(options.quality);
|
|
@@ -30788,7 +30801,7 @@ Run 'vibe schema scene.<command>' for structured parameter info.`);
|
|
|
30788
30801
|
}
|
|
30789
30802
|
}
|
|
30790
30803
|
});
|
|
30791
|
-
sceneCommand.command("build").description("One-shot: read STORYBOARD.md cues, dispatch TTS + image-gen per beat, compose, render to MP4
|
|
30804
|
+
sceneCommand.command("build", { hidden: true }).description("One-shot: read STORYBOARD.md cues, dispatch TTS + image-gen per beat, compose, render to MP4 [legacy \u2014 prefer `vibe build`]").argument("[project-dir]", "Project directory containing STORYBOARD.md", ".").option("--mode <mode>", "Build mode: agent (host-agent authors HTML) | batch (CLI's internal LLM authors HTML) | auto (agent if any host detected) [Plan H \u2014 Phase 3]", "auto").option("--effort <level>", "Compose effort tier (batch mode only): low|medium|high", "medium").option("--composer <provider>", "LLM that composes scene HTML in batch mode: claude|openai|gemini (default: auto-resolve from available API keys, claude > gemini > openai)").option("--skip-narration", "Don't dispatch TTS even when beats declare narration cues").option("--skip-backdrop", "Don't dispatch image-gen even when beats declare backdrop cues").option("--skip-render", "Compose only \u2014 don't render to MP4").option("--tts <provider>", "TTS provider: auto|elevenlabs|kokoro (overrides frontmatter)").option("--voice <id>", "Voice id (provider-specific \u2014 overrides frontmatter)").option("--image-provider <name>", "Image provider: openai (only one supported in v0.60)").option("--quality <q>", "Image quality: standard|hd", "hd").option("--image-size <s>", "Image size: 1024x1024|1536x1024|1024x1536", "1536x1024").option("--force", "Re-dispatch primitives even when assets already exist").option("--dry-run", "Preview parameters without dispatching").action(async (projectDirArg, options) => {
|
|
30792
30805
|
const startedAt = Date.now();
|
|
30793
30806
|
const projectDir = resolve14(projectDirArg);
|
|
30794
30807
|
if (options.dryRun) {
|
|
@@ -62588,7 +62601,7 @@ init_source();
|
|
|
62588
62601
|
// package.json
|
|
62589
62602
|
var package_default = {
|
|
62590
62603
|
name: "@vibeframe/cli",
|
|
62591
|
-
version: "0.
|
|
62604
|
+
version: "0.74.0",
|
|
62592
62605
|
description: "VibeFrame CLI - natural language video editing from the terminal",
|
|
62593
62606
|
private: false,
|
|
62594
62607
|
license: "MIT",
|
|
@@ -63714,22 +63727,28 @@ init_sanitize();
|
|
|
63714
63727
|
init_validate();
|
|
63715
63728
|
import { readFile as readFile26, writeFile as writeFile31 } from "node:fs/promises";
|
|
63716
63729
|
import { resolve as resolve36 } from "node:path";
|
|
63717
|
-
var analyzeCommand = new Command("analyze").alias("az").description("
|
|
63730
|
+
var analyzeCommand = new Command("inspect").alias("analyze").alias("az").description("Inspect media using AI (images, videos, YouTube URLs)").hook("preAction", () => {
|
|
63731
|
+
const invoked = process.argv[2];
|
|
63732
|
+
if (invoked === "analyze" || invoked === "az") {
|
|
63733
|
+
emitDeprecationWarning(invoked, "inspect", "v1.0");
|
|
63734
|
+
}
|
|
63735
|
+
}).addHelpText(
|
|
63718
63736
|
"after",
|
|
63719
63737
|
`
|
|
63720
63738
|
Examples:
|
|
63721
|
-
$ vibe
|
|
63722
|
-
$ vibe
|
|
63723
|
-
$ vibe
|
|
63724
|
-
$ vibe
|
|
63725
|
-
$ vibe
|
|
63726
|
-
$ vibe
|
|
63739
|
+
$ vibe inspect media image.png "Describe this image"
|
|
63740
|
+
$ vibe inspect media video.mp4 "Summarize this video"
|
|
63741
|
+
$ vibe inspect media "https://youtube.com/watch?v=..." "Key takeaways"
|
|
63742
|
+
$ vibe inspect video video.mp4 "List all scene changes" --low-res
|
|
63743
|
+
$ vibe inspect review video.mp4 --auto-apply -o fixed.mp4
|
|
63744
|
+
$ vibe inspect suggest project.vibe.json "make it more dramatic"
|
|
63727
63745
|
|
|
63728
63746
|
API Keys:
|
|
63729
|
-
GOOGLE_API_KEY Required for all
|
|
63747
|
+
GOOGLE_API_KEY Required for all inspect commands (Gemini)
|
|
63730
63748
|
|
|
63749
|
+
Aliases: \`analyze\`, \`az\` (deprecated \u2014 removed in v1.0).
|
|
63731
63750
|
Use '--fields response,model' to limit output size.
|
|
63732
|
-
Run 'vibe schema
|
|
63751
|
+
Run 'vibe schema inspect.<command>' for structured parameter info.
|
|
63733
63752
|
`
|
|
63734
63753
|
);
|
|
63735
63754
|
analyzeCommand.command("media").description("Analyze any media: images, videos, or YouTube URLs using Gemini").argument("<source>", "Image/video file path, image URL, or YouTube URL").argument("<prompt>", "Analysis prompt (e.g., 'Describe this image', 'Summarize this video')").option("-k, --api-key <key>", "Google API key (or set GOOGLE_API_KEY env)").option("-m, --model <model>", "Model: flash (default), flash-2.5, pro", "flash").option("--fps <number>", "Frames per second for video (default: 1)").option("--start <seconds>", "Start offset in seconds (video only)").option("--end <seconds>", "End offset in seconds (video only)").option("--low-res", "Use low resolution mode (fewer tokens)").option("-v, --verbose", "Show token usage").option("--fields <fields>", "Comma-separated fields to include in output (e.g., response,model)").action(async (source, prompt3, options) => {
|
|
@@ -63924,18 +63943,19 @@ var audioCommand = new Command("audio").alias("au").description("Audio operation
|
|
|
63924
63943
|
Examples:
|
|
63925
63944
|
$ vibe audio transcribe interview.mp3 -o transcript.srt -f srt
|
|
63926
63945
|
$ vibe audio transcribe video.mp4 -l ko # Specify language
|
|
63927
|
-
$ vibe audio voices
|
|
63946
|
+
$ vibe audio list-voices # List available voices
|
|
63928
63947
|
$ vibe audio isolate song.mp3 -o vocals.mp3
|
|
63929
|
-
$ vibe audio voice
|
|
63948
|
+
$ vibe audio clone-voice sample.mp3 -n "my-voice"
|
|
63930
63949
|
$ vibe audio dub video.mp4 -l ko -o dubbed.mp4
|
|
63931
63950
|
$ vibe audio duck music.mp3 --voice narration.mp3 -o ducked.mp3
|
|
63932
63951
|
|
|
63933
63952
|
API Keys:
|
|
63934
63953
|
OPENAI_API_KEY transcribe (Whisper)
|
|
63935
|
-
ELEVENLABS_API_KEY voices, isolate, voice
|
|
63954
|
+
ELEVENLABS_API_KEY list-voices, isolate, clone-voice
|
|
63936
63955
|
OPENAI_API_KEY + ANTHROPIC_API_KEY + ELEVENLABS_API_KEY dub (full pipeline)
|
|
63937
63956
|
No key needed duck (FFmpeg only)
|
|
63938
63957
|
|
|
63958
|
+
Aliases (deprecated, removed in v1.0): voices \u2192 list-voices, voice-clone \u2192 clone-voice
|
|
63939
63959
|
Run 'vibe schema audio.<command>' for structured parameter info.
|
|
63940
63960
|
`
|
|
63941
63961
|
);
|
|
@@ -63999,7 +64019,9 @@ audioCommand.command("transcribe").description("Transcribe audio using Whisper")
|
|
|
63999
64019
|
exitWithError(apiError(`Transcription failed: ${msg}`, true));
|
|
64000
64020
|
}
|
|
64001
64021
|
});
|
|
64002
|
-
audioCommand.command("voices").description("List available ElevenLabs voices").
|
|
64022
|
+
audioCommand.command("list-voices").alias("voices").description("List available ElevenLabs voices").hook("preAction", () => {
|
|
64023
|
+
if (process.argv[3] === "voices") emitDeprecationWarning("audio voices", "audio list-voices", "v1.0");
|
|
64024
|
+
}).option("-k, --api-key <key>", "ElevenLabs API key (or set ELEVENLABS_API_KEY env)").action(async (options) => {
|
|
64003
64025
|
const startedAt = Date.now();
|
|
64004
64026
|
try {
|
|
64005
64027
|
const apiKey = await requireApiKey("ELEVENLABS_API_KEY", "ElevenLabs", options.apiKey);
|
|
@@ -64010,7 +64032,7 @@ audioCommand.command("voices").description("List available ElevenLabs voices").o
|
|
|
64010
64032
|
spinner2.succeed(source_default.green(`Found ${voices.length} voices`));
|
|
64011
64033
|
if (isJsonMode()) {
|
|
64012
64034
|
outputSuccess({
|
|
64013
|
-
command: "audio voices",
|
|
64035
|
+
command: "audio list-voices",
|
|
64014
64036
|
startedAt,
|
|
64015
64037
|
data: {
|
|
64016
64038
|
voices: voices.map((v) => ({ name: v.name, voiceId: v.voice_id, category: v.category, labels: v.labels }))
|
|
@@ -64077,12 +64099,14 @@ audioCommand.command("isolate").description("Isolate vocals from audio using Ele
|
|
|
64077
64099
|
exitWithError(apiError(`Audio isolation failed: ${msg}`, true));
|
|
64078
64100
|
}
|
|
64079
64101
|
});
|
|
64080
|
-
audioCommand.command("voice-clone").description("Clone a voice from audio samples using ElevenLabs").
|
|
64102
|
+
audioCommand.command("clone-voice").alias("voice-clone").description("Clone a voice from audio samples using ElevenLabs").hook("preAction", () => {
|
|
64103
|
+
if (process.argv[3] === "voice-clone") emitDeprecationWarning("audio voice-clone", "audio clone-voice", "v1.0");
|
|
64104
|
+
}).argument("[samples...]", "Audio sample files (1-25 files)").option("-k, --api-key <key>", "ElevenLabs API key (or set ELEVENLABS_API_KEY env)").option("-n, --name <name>", "Voice name (required)").option("-d, --description <desc>", "Voice description").option("--labels <json>", `Labels as JSON (e.g., '{"accent": "american"}')`).option("--remove-noise", "Remove background noise from samples").option("--list", "List all available voices").option("--dry-run", "Preview parameters without executing").action(async (samples, options) => {
|
|
64081
64105
|
const startedAt = Date.now();
|
|
64082
64106
|
try {
|
|
64083
64107
|
if (options.dryRun) {
|
|
64084
64108
|
outputSuccess({
|
|
64085
|
-
command: "audio voice
|
|
64109
|
+
command: "audio clone-voice",
|
|
64086
64110
|
startedAt,
|
|
64087
64111
|
dryRun: true,
|
|
64088
64112
|
data: { params: { samples: samples?.length, name: options.name } }
|
|
@@ -64143,7 +64167,7 @@ audioCommand.command("voice-clone").description("Clone a voice from audio sample
|
|
|
64143
64167
|
spinner2.succeed(source_default.green("Voice cloned successfully"));
|
|
64144
64168
|
if (isJsonMode()) {
|
|
64145
64169
|
outputSuccess({
|
|
64146
|
-
command: "audio voice
|
|
64170
|
+
command: "audio clone-voice",
|
|
64147
64171
|
startedAt,
|
|
64148
64172
|
data: { name: options.name, voiceId: result.voiceId }
|
|
64149
64173
|
});
|
|
@@ -64609,24 +64633,29 @@ function registerScriptPipelineCommands(aiCommand) {
|
|
|
64609
64633
|
init_ai_highlights();
|
|
64610
64634
|
init_ai_animated_caption();
|
|
64611
64635
|
init_output();
|
|
64612
|
-
var pipelineCommand = new Command("pipeline").alias("pipe").description(
|
|
64636
|
+
var pipelineCommand = new Command("remix").alias("pipeline").alias("pipe").description(
|
|
64613
64637
|
"AI media transformations on existing video / audio (highlights, auto-shorts, animated captions). For BUILD-from-text flows see `vibe build`."
|
|
64614
|
-
).
|
|
64638
|
+
).hook("preAction", () => {
|
|
64639
|
+
const invoked = process.argv[2];
|
|
64640
|
+
if (invoked === "pipeline" || invoked === "pipe") {
|
|
64641
|
+
emitDeprecationWarning(invoked, "remix", "v1.0");
|
|
64642
|
+
}
|
|
64643
|
+
}).addHelpText(
|
|
64615
64644
|
"after",
|
|
64616
64645
|
`
|
|
64617
64646
|
Two flows \u2014 pick by intent:
|
|
64618
64647
|
BUILD \u2014 text \u2192 MP4 (intent \u2192 AI generation \u2192 new video)
|
|
64619
64648
|
Use \`vibe build\` with a STORYBOARD.md + DESIGN.md.
|
|
64620
64649
|
Idempotent, agent-editable, skills-driven (v0.60+).
|
|
64621
|
-
|
|
64622
|
-
Use \`vibe
|
|
64650
|
+
REMIX \u2014 existing video/audio \u2192 transformed media
|
|
64651
|
+
Use \`vibe remix\` (this group) or \`vibe edit\` / \`vibe audio\`.
|
|
64623
64652
|
One-shot, batch-oriented, no storyboard required.
|
|
64624
64653
|
|
|
64625
|
-
Examples (
|
|
64626
|
-
$ vibe
|
|
64627
|
-
$ vibe
|
|
64628
|
-
$ vibe
|
|
64629
|
-
$ vibe
|
|
64654
|
+
Examples (REMIX):
|
|
64655
|
+
$ vibe remix highlights long-video.mp4 -o highlights.json -d 60
|
|
64656
|
+
$ vibe remix auto-shorts long-video.mp4 -o shorts/ -n 3 --add-captions
|
|
64657
|
+
$ vibe remix animated-caption video.mp4 -o captioned.mp4 -s highlight
|
|
64658
|
+
$ vibe remix animated-caption video.mp4 -o out.mp4 -s karaoke-sweep --fast
|
|
64630
64659
|
|
|
64631
64660
|
Provider API Keys:
|
|
64632
64661
|
highlights: GOOGLE_API_KEY (Gemini analysis)
|
|
@@ -64639,12 +64668,9 @@ Cost tiers:
|
|
|
64639
64668
|
animated-caption: $ Low (~$0.01)
|
|
64640
64669
|
regenerate-scene: $$$ High (per-scene re-run; depends on provider)
|
|
64641
64670
|
|
|
64642
|
-
|
|
64643
|
-
text \u2192 MP4. \`pipeline regenerate-scene\` still operates on the
|
|
64644
|
-
storyboard.{yaml,json} layout produced by older runs.
|
|
64645
|
-
|
|
64671
|
+
Aliases: \`pipeline\`, \`pipe\` (deprecated \u2014 removed in v1.0).
|
|
64646
64672
|
Use '--dry-run' to preview parameters before execution.
|
|
64647
|
-
Run 'vibe schema
|
|
64673
|
+
Run 'vibe schema remix.<command>' for structured parameter info.
|
|
64648
64674
|
`
|
|
64649
64675
|
);
|
|
64650
64676
|
registerScriptPipelineCommands(pipelineCommand);
|
|
@@ -64654,9 +64680,9 @@ pipelineCommand.command("animated-caption").description("Add animated captions w
|
|
|
64654
64680
|
"after",
|
|
64655
64681
|
`
|
|
64656
64682
|
Examples:
|
|
64657
|
-
$ vibe
|
|
64658
|
-
$ vibe
|
|
64659
|
-
$ vibe
|
|
64683
|
+
$ vibe remix animated-caption video.mp4 -o captioned.mp4
|
|
64684
|
+
$ vibe remix animated-caption video.mp4 -o out.mp4 -s bounce
|
|
64685
|
+
$ vibe remix animated-caption video.mp4 -o out.mp4 -s karaoke-sweep --fast
|
|
64660
64686
|
|
|
64661
64687
|
Styles:
|
|
64662
64688
|
highlight (default) TikTok-style background highlight on active word (Remotion)
|
|
@@ -69834,13 +69860,13 @@ skills-driven pipeline (v0.60+) dispatches narration TTS + backdrop
|
|
|
69834
69860
|
image-gen per beat, composes scene HTML via the bundled composition rules
|
|
69835
69861
|
bundle, then renders to MP4. Idempotent re-runs reuse cached assets.
|
|
69836
69862
|
|
|
69837
|
-
**
|
|
69838
|
-
Use \`vibe
|
|
69863
|
+
**REMIX \u2014 transform existing video / audio.**
|
|
69864
|
+
Use \`vibe remix\`, \`vibe edit\`, or \`vibe audio\`. One-shot,
|
|
69839
69865
|
batch-oriented operations on a file the user already has on disk.
|
|
69840
69866
|
|
|
69841
69867
|
Decision rule: if the user is starting from intent (a script, a brand,
|
|
69842
69868
|
an idea), it's BUILD. If the user is starting from a media file, it's
|
|
69843
|
-
|
|
69869
|
+
REMIX.
|
|
69844
69870
|
|
|
69845
69871
|
## Common workflows
|
|
69846
69872
|
|
|
@@ -69855,18 +69881,18 @@ PROCESS.
|
|
|
69855
69881
|
| Generate a single video | \`vibe generate video "prompt" -i image.png -o clip.mp4\` |
|
|
69856
69882
|
| Generate narration | \`vibe generate speech "text" -o voice.mp3\` |
|
|
69857
69883
|
|
|
69858
|
-
###
|
|
69884
|
+
### REMIX (transform existing media)
|
|
69859
69885
|
|
|
69860
69886
|
| Task | Command |
|
|
69861
69887
|
|---|---|
|
|
69862
|
-
| Extract highlights from a long video | \`vibe
|
|
69863
|
-
| Long video \u2192 vertical shorts | \`vibe
|
|
69864
|
-
| Add animated word-by-word captions | \`vibe
|
|
69888
|
+
| Extract highlights from a long video | \`vibe remix highlights file.mp4 -d 60\` |
|
|
69889
|
+
| Long video \u2192 vertical shorts | \`vibe remix auto-shorts file.mp4 -n 3 --add-captions\` |
|
|
69890
|
+
| Add animated word-by-word captions | \`vibe remix animated-caption file.mp4 -s karaoke-sweep\` |
|
|
69865
69891
|
| Remove silence | \`vibe edit silence-cut in.mp4 -o out.mp4\` |
|
|
69866
69892
|
| Add static captions | \`vibe edit caption in.mp4 -o out.mp4\` |
|
|
69867
69893
|
| Translate audio (transcribe \u2192 TTS) | \`vibe audio dub file.mp4 -t ko\` |
|
|
69868
69894
|
| Transcribe (Whisper, word-level) | \`vibe audio transcribe file.mp4 --granularity word\` |
|
|
69869
|
-
|
|
|
69895
|
+
| Inspect a video | \`vibe inspect video file.mp4 "summarise"\` |
|
|
69870
69896
|
|
|
69871
69897
|
### Compose pipelines (Video as Code)
|
|
69872
69898
|
|
|
@@ -69880,9 +69906,9 @@ PROCESS.
|
|
|
69880
69906
|
| Tier | Examples | Approx. per call |
|
|
69881
69907
|
|---|---|---|
|
|
69882
69908
|
| **Free** | \`detect *\`, \`edit silence-cut/fade/noise-reduce\`, \`schema\`, \`project\`, \`timeline\` | $0 |
|
|
69883
|
-
| **Low** | \`
|
|
69909
|
+
| **Low** | \`inspect *\`, \`audio transcribe\`, \`generate image\` | $0.01\u2013$0.10 |
|
|
69884
69910
|
| **High** | \`generate video\`, \`edit image\` | $1\u2013$5 |
|
|
69885
|
-
| **Very High** | \`
|
|
69911
|
+
| **Very High** | \`remix *\` (highlights, auto-shorts, regenerate-scene), \`build\` | $5\u2013$50+ |
|
|
69886
69912
|
|
|
69887
69913
|
## Agent invariants
|
|
69888
69914
|
|
|
@@ -69894,7 +69920,7 @@ When you run vibe commands programmatically:
|
|
|
69894
69920
|
3. **Use \`vibe schema <command>\`** to discover parameters; do not guess flags
|
|
69895
69921
|
4. **Pass complex options via \`--stdin\`**:
|
|
69896
69922
|
\`\`\`bash
|
|
69897
|
-
echo '{"video":"long.mp4","count":3,"aspect":"9:16"}' | vibe
|
|
69923
|
+
echo '{"video":"long.mp4","count":3,"aspect":"9:16"}' | vibe remix auto-shorts --stdin --json
|
|
69898
69924
|
\`\`\`
|
|
69899
69925
|
|
|
69900
69926
|
## Provider keys
|
|
@@ -72357,32 +72383,38 @@ Global flags (work with any command):
|
|
|
72357
72383
|
--stdin Read options from stdin as JSON (for agent/script use)
|
|
72358
72384
|
--dry-run Preview without executing (most commands)
|
|
72359
72385
|
|
|
72360
|
-
|
|
72361
|
-
Free detect, edit (silence-cut/fade/noise-reduce), project, timeline, export
|
|
72362
|
-
Low analyze, audio transcribe, generate image ~$0.01-$0.10
|
|
72363
|
-
High generate video, edit image ~$1-$5
|
|
72364
|
-
V.High pipeline (regenerate-scene, highlights, auto-shorts) ~$5-$50+
|
|
72365
|
-
Tip Add --dry-run before paid generation to preview the work.
|
|
72366
|
-
|
|
72367
|
-
Project flow:
|
|
72386
|
+
Get started (90% of users start here):
|
|
72368
72387
|
vibe doctor Check system health and API keys
|
|
72369
72388
|
vibe setup Configure API keys interactively
|
|
72370
72389
|
vibe init my-video Scaffold a video project
|
|
72371
72390
|
vibe build my-video Build STORYBOARD.md into scene compositions/assets
|
|
72372
72391
|
vibe render my-video Render the project to MP4
|
|
72373
|
-
|
|
72374
|
-
|
|
72375
|
-
|
|
72376
|
-
vibe generate
|
|
72377
|
-
|
|
72378
|
-
|
|
72379
|
-
vibe
|
|
72380
|
-
vibe
|
|
72381
|
-
|
|
72382
|
-
|
|
72383
|
-
vibe
|
|
72384
|
-
|
|
72385
|
-
vibe
|
|
72392
|
+
vibe demo Try VibeFrame without API keys
|
|
72393
|
+
|
|
72394
|
+
One-shot media tools:
|
|
72395
|
+
vibe generate image "..." Generate a still image
|
|
72396
|
+
vibe generate video "..." Generate a standalone AI video
|
|
72397
|
+
vibe edit caption clip.mp4 -o out.mp4
|
|
72398
|
+
vibe inspect media clip.mp4 "Summarize this"
|
|
72399
|
+
vibe remix highlights long.mp4 -d 60
|
|
72400
|
+
|
|
72401
|
+
Advanced authoring:
|
|
72402
|
+
vibe project create my-video CRUD on .vibe.json
|
|
72403
|
+
vibe scene add intro --headline "Welcome"
|
|
72404
|
+
vibe timeline add-clip project.vibe.json <source-id>
|
|
72405
|
+
|
|
72406
|
+
Automation & agents:
|
|
72407
|
+
vibe run workflow.yaml Run a Video-as-YAML pipeline
|
|
72408
|
+
vibe agent Natural-language interface
|
|
72409
|
+
vibe schema generate.video Tool schema for any command
|
|
72410
|
+
vibe walkthrough scene Step-by-step authoring guide
|
|
72411
|
+
|
|
72412
|
+
Cost tiers (per call):
|
|
72413
|
+
Free detect, edit (silence-cut/fade/noise-reduce), project, timeline, export
|
|
72414
|
+
Low inspect, audio transcribe, generate image ~$0.01-$0.10
|
|
72415
|
+
High generate video, edit image ~$1-$5
|
|
72416
|
+
V.High remix (regenerate-scene, highlights, auto-shorts) ~$5-$50+
|
|
72417
|
+
Tip Add --dry-run before paid generation to preview the work.
|
|
72386
72418
|
`
|
|
72387
72419
|
);
|
|
72388
72420
|
program2.hook("preAction", async (thisCommand, actionCommand) => {
|
|
@@ -72458,7 +72490,7 @@ program2.addCommand(agentCommand);
|
|
|
72458
72490
|
program2.addCommand(projectCommand);
|
|
72459
72491
|
program2.addCommand(sceneCommand);
|
|
72460
72492
|
program2.addCommand(timelineCommand);
|
|
72461
|
-
program2.addCommand(exportCommand);
|
|
72493
|
+
program2.addCommand(exportCommand, { hidden: true });
|
|
72462
72494
|
program2.addCommand(detectCommand);
|
|
72463
72495
|
program2.addCommand(batchCommand);
|
|
72464
72496
|
program2.addCommand(schemaCommand);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeframe/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.74.0",
|
|
4
4
|
"description": "VibeFrame CLI - natural language video editing from the terminal",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "MIT",
|
|
@@ -182,8 +182,8 @@
|
|
|
182
182
|
"tsx": "^4.21.0",
|
|
183
183
|
"typescript": "^5.3.3",
|
|
184
184
|
"vitest": "^1.2.2",
|
|
185
|
-
"@vibeframe/ai-providers": "0.
|
|
186
|
-
"@vibeframe/core": "0.
|
|
185
|
+
"@vibeframe/ai-providers": "0.74.0",
|
|
186
|
+
"@vibeframe/core": "0.74.0"
|
|
187
187
|
},
|
|
188
188
|
"engines": {
|
|
189
189
|
"node": ">=20"
|