@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.
Files changed (2) hide show
  1. package/dist/index.js +113 -81
  2. 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("Advanced scene commands for VibeFrame video projects").addHelpText("after", `
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 render # Render to renders/<name>-<timestamp>.mp4
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
- Most users can start with \`vibe init\`, \`vibe build\`, and \`vibe render\`.
30256
- This namespace exposes lower-level scene authoring and rendering controls.
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 (v0.60)").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) => {
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.73.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("Analyze media using AI (images, videos, YouTube URLs)").addHelpText(
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 analyze media image.png "Describe this image"
63722
- $ vibe analyze media video.mp4 "Summarize this video"
63723
- $ vibe analyze media "https://youtube.com/watch?v=..." "Key takeaways"
63724
- $ vibe analyze video video.mp4 "List all scene changes" --low-res
63725
- $ vibe analyze review video.mp4 --auto-apply -o fixed.mp4
63726
- $ vibe analyze suggest project.vibe.json "make it more dramatic"
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 analyze commands (Gemini)
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 analyze.<command>' for structured parameter info.
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 # List available voices
63946
+ $ vibe audio list-voices # List available voices
63928
63947
  $ vibe audio isolate song.mp3 -o vocals.mp3
63929
- $ vibe audio voice-clone sample.mp3 -n "my-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-clone
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").option("-k, --api-key <key>", "ElevenLabs API key (or set ELEVENLABS_API_KEY env)").action(async (options) => {
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").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) => {
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-clone",
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-clone",
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
- ).addHelpText(
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
- PROCESS \u2014 existing video/audio \u2192 transformed media
64622
- Use \`vibe pipeline\` (this group) or \`vibe edit\` / \`vibe audio\`.
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 (PROCESS):
64626
- $ vibe pipeline highlights long-video.mp4 -o highlights.json -d 60
64627
- $ vibe pipeline auto-shorts long-video.mp4 -o shorts/ -n 3 --add-captions
64628
- $ vibe pipeline animated-caption video.mp4 -o captioned.mp4 -s highlight
64629
- $ vibe pipeline animated-caption video.mp4 -o out.mp4 -s karaoke-sweep --fast
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
- Note: \`pipeline script-to-video\` was removed \u2014 use \`vibe build\` for
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 pipeline.<command>' for structured parameter info.
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 pipeline animated-caption video.mp4 -o captioned.mp4
64658
- $ vibe pipeline animated-caption video.mp4 -o out.mp4 -s bounce
64659
- $ vibe pipeline animated-caption video.mp4 -o out.mp4 -s karaoke-sweep --fast
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
- **PROCESS \u2014 transform existing video / audio.**
69838
- Use \`vibe pipeline\`, \`vibe edit\`, or \`vibe audio\`. One-shot,
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
- PROCESS.
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
- ### PROCESS (transform existing media)
69884
+ ### REMIX (transform existing media)
69859
69885
 
69860
69886
  | Task | Command |
69861
69887
  |---|---|
69862
- | Extract highlights from a long video | \`vibe pipeline highlights file.mp4 -d 60\` |
69863
- | Long video \u2192 vertical shorts | \`vibe pipeline auto-shorts file.mp4 -n 3 --add-captions\` |
69864
- | Add animated word-by-word captions | \`vibe pipeline animated-caption file.mp4 -s karaoke-sweep\` |
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
- | Analyze a video | \`vibe analyze video file.mp4 "summarise"\` |
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** | \`analyze *\`, \`audio transcribe\`, \`generate image\` | $0.01\u2013$0.10 |
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** | \`pipeline *\` (highlights, auto-shorts, regenerate-scene), \`build\` | $5\u2013$50+ |
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 pipeline auto-shorts --stdin --json
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
- Cost tiers:
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
- Asset tools:
72375
- vibe generate image "..." Generate a still image
72376
- vibe generate video "..." Generate a standalone AI video
72377
-
72378
- Workflow automation:
72379
- vibe run workflow.yaml Run a Video-as-YAML pipeline
72380
- vibe schema --list Discover all commands
72381
-
72382
- Agent integration:
72383
- vibe walkthrough scene Load the scene authoring guide
72384
- echo '{"provider":"kling"}' | vibe generate video "prompt" --stdin --json
72385
- vibe schema generate.video Get parameter schema for any command
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.73.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.73.0",
186
- "@vibeframe/core": "0.73.0"
185
+ "@vibeframe/ai-providers": "0.74.0",
186
+ "@vibeframe/core": "0.74.0"
187
187
  },
188
188
  "engines": {
189
189
  "node": ">=20"