@vibeframe/cli 0.55.1 → 0.56.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 +27 -28
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -18508,7 +18508,7 @@ var DEFAULT_MODEL, OpenAIImageProvider, openaiImageProvider;
18508
18508
  var init_OpenAIImageProvider = __esm({
18509
18509
  "../ai-providers/dist/openai-image/OpenAIImageProvider.js"() {
18510
18510
  "use strict";
18511
- DEFAULT_MODEL = "gpt-image-1.5";
18511
+ DEFAULT_MODEL = "gpt-image-2";
18512
18512
  OpenAIImageProvider = class {
18513
18513
  constructor() {
18514
18514
  this.id = "openai-image";
@@ -21130,9 +21130,7 @@ async function getApiKey(envVar, providerName, optionValue) {
21130
21130
  }
21131
21131
  function hasApiKey(envVar) {
21132
21132
  loadEnv();
21133
- if (process.env[envVar]) return true;
21134
- const key = getApiKeyFromConfig(envVar);
21135
- return !!key;
21133
+ return !!process.env[envVar];
21136
21134
  }
21137
21135
  async function requireApiKey(envVar, providerName, cliOverride) {
21138
21136
  const key = await getApiKey(envVar, providerName, cliOverride);
@@ -21570,9 +21568,7 @@ function buildPreset(input) {
21570
21568
  const captionInner = useWordSync ? renderTranscriptSpans(transcript) : esc(captionText);
21571
21569
  const wordCss = useWordSync ? `
21572
21570
  ${scope} .caption .word { display: inline-block; opacity: 0; }` : "";
21573
- const timeline = useWordSync ? `${buildTranscriptTweens(transcript, `${scope} .caption .word`)}
21574
- tl.to('${scope} .caption', { opacity: 0, duration: 0.4, ease: 'power2.in' }, ${(dur - 0.4).toFixed(2)});` : `tl.from('${scope} .caption', { opacity: 0, y: 28, duration: 0.6, ease: 'power2.out' }, 0.1);
21575
- tl.to('${scope} .caption', { opacity: 0, duration: 0.4, ease: 'power2.in' }, ${(dur - 0.4).toFixed(2)});`;
21571
+ const timeline = useWordSync ? buildTranscriptTweens(transcript, `${scope} .caption .word`) : `tl.from('${scope} .caption', { opacity: 0, y: 28, duration: 0.45, ease: 'power3.out' }, 0.05);`;
21576
21572
  return {
21577
21573
  css: `${scope} {
21578
21574
  position: absolute; inset: 0; width: 100%; height: 100%;
@@ -21620,8 +21616,11 @@ function buildPreset(input) {
21620
21616
  }`,
21621
21617
  body: `${backdropMarkup}
21622
21618
  <div class="announce"><h1 id="headline">${esc(headline)}</h1></div>`,
21623
- timeline: `tl.from('${scope} #headline', { opacity: 0, scale: 0.8, duration: 0.9, ease: 'back.out(1.6)' }, 0.15);
21624
- tl.to('${scope} #headline', { opacity: 0, duration: 0.4, ease: 'power2.in' }, ${(dur - 0.4).toFixed(2)});`
21619
+ // Faster, snappier entrance and no tail fade-out — see the
21620
+ // matching note in the `simple` case above. The headline stays
21621
+ // on screen until the producer cuts to the next clip; the next
21622
+ // scene's own fade-in handles the visual transition.
21623
+ timeline: `tl.from('${scope} #headline', { opacity: 0, scale: 0.92, duration: 0.55, ease: 'power3.out' }, 0.05);`
21625
21624
  };
21626
21625
  }
21627
21626
  case "explainer": {
@@ -25353,7 +25352,7 @@ async function executeSilenceCut(options) {
25353
25352
  return { success: false, error: `Video not found: ${videoPath}` };
25354
25353
  }
25355
25354
  if (!commandExists("ffmpeg")) {
25356
- return { success: false, error: "FFmpeg not found. Please install FFmpeg." };
25355
+ return { success: false, error: "FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details." };
25357
25356
  }
25358
25357
  const method = useGemini ? "gemini" : "ffmpeg";
25359
25358
  try {
@@ -25503,7 +25502,7 @@ async function executeJumpCut(options) {
25503
25502
  return { success: false, error: `Video not found: ${videoPath}` };
25504
25503
  }
25505
25504
  if (!commandExists("ffmpeg")) {
25506
- return { success: false, error: "FFmpeg not found. Please install FFmpeg." };
25505
+ return { success: false, error: "FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details." };
25507
25506
  }
25508
25507
  const openaiKey = apiKey || process.env.OPENAI_API_KEY;
25509
25508
  if (!openaiKey) {
@@ -25648,7 +25647,7 @@ async function executeCaption(options) {
25648
25647
  return { success: false, error: `Video not found: ${videoPath}` };
25649
25648
  }
25650
25649
  if (!commandExists("ffmpeg")) {
25651
- return { success: false, error: "FFmpeg not found. Please install FFmpeg." };
25650
+ return { success: false, error: "FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details." };
25652
25651
  }
25653
25652
  const openaiKey = apiKey || process.env.OPENAI_API_KEY;
25654
25653
  if (!openaiKey) {
@@ -25786,7 +25785,7 @@ async function executeNoiseReduce(options) {
25786
25785
  return { success: false, error: `File not found: ${inputPath}` };
25787
25786
  }
25788
25787
  if (!commandExists("ffmpeg")) {
25789
- return { success: false, error: "FFmpeg not found. Please install FFmpeg." };
25788
+ return { success: false, error: "FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details." };
25790
25789
  }
25791
25790
  try {
25792
25791
  const inputDuration = await getVideoDuration(inputPath);
@@ -25840,7 +25839,7 @@ async function executeFade(options) {
25840
25839
  return { success: false, error: `Video not found: ${videoPath}` };
25841
25840
  }
25842
25841
  if (!commandExists("ffmpeg")) {
25843
- return { success: false, error: "FFmpeg not found. Please install FFmpeg." };
25842
+ return { success: false, error: "FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details." };
25844
25843
  }
25845
25844
  try {
25846
25845
  const totalDuration = await getVideoDuration(videoPath);
@@ -26066,7 +26065,7 @@ async function applyTextOverlays(options) {
26066
26065
  return { success: false, error: `Video not found: ${absVideoPath}` };
26067
26066
  }
26068
26067
  if (!commandExists("ffmpeg")) {
26069
- return { success: false, error: "FFmpeg not found. Please install FFmpeg." };
26068
+ return { success: false, error: "FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details." };
26070
26069
  }
26071
26070
  let hasDrawtext = true;
26072
26071
  try {
@@ -28076,8 +28075,8 @@ var init_provider_resolver = __esm({
28076
28075
  "use strict";
28077
28076
  init_api_key();
28078
28077
  IMAGE_PROVIDERS = [
28079
- { name: "gemini", envVar: "GOOGLE_API_KEY", label: "Gemini" },
28080
28078
  { name: "openai", envVar: "OPENAI_API_KEY", label: "OpenAI" },
28079
+ { name: "gemini", envVar: "GOOGLE_API_KEY", label: "Gemini" },
28081
28080
  { name: "grok", envVar: "XAI_API_KEY", label: "Grok" }
28082
28081
  ];
28083
28082
  VIDEO_PROVIDERS = [
@@ -28328,7 +28327,7 @@ function _registerImageCommands(aiCommand) {
28328
28327
  exitWithError(notFoundError(absVideoPath));
28329
28328
  }
28330
28329
  if (!commandExists("ffmpeg")) {
28331
- exitWithError(generalError("FFmpeg not found. Please install FFmpeg."));
28330
+ exitWithError(generalError("FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details."));
28332
28331
  }
28333
28332
  const apiKey2 = await getApiKey("GOOGLE_API_KEY", "Google", options.apiKey);
28334
28333
  if (!apiKey2) {
@@ -28787,7 +28786,7 @@ async function executeThumbnailBestFrame(options) {
28787
28786
  return { success: false, error: `Video not found: ${videoPath}` };
28788
28787
  }
28789
28788
  if (!commandExists("ffmpeg")) {
28790
- return { success: false, error: "FFmpeg not found. Please install FFmpeg." };
28789
+ return { success: false, error: "FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details." };
28791
28790
  }
28792
28791
  const googleKey = apiKey || process.env.GOOGLE_API_KEY;
28793
28792
  if (!googleKey) {
@@ -30917,7 +30916,7 @@ No API key needed (FFmpeg only). Use --use-gemini for smart detection (requires
30917
30916
  exitWithError(notFoundError(absVideoPath));
30918
30917
  }
30919
30918
  if (!commandExists("ffmpeg")) {
30920
- exitWithError(generalError("FFmpeg not found. Please install FFmpeg."));
30919
+ exitWithError(generalError("FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details."));
30921
30920
  }
30922
30921
  const ext = extname7(videoPath);
30923
30922
  const name = basename11(videoPath, ext);
@@ -31011,7 +31010,7 @@ Requires: OPENAI_API_KEY (Whisper transcription) + FFmpeg`).action(async (videoP
31011
31010
  exitWithError(notFoundError(absVideoPath));
31012
31011
  }
31013
31012
  if (!commandExists("ffmpeg")) {
31014
- exitWithError(generalError("FFmpeg not found. Please install FFmpeg."));
31013
+ exitWithError(generalError("FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details."));
31015
31014
  }
31016
31015
  if (options.dryRun) {
31017
31016
  outputResult({
@@ -31085,7 +31084,7 @@ Requires: OPENAI_API_KEY (Whisper transcription) + FFmpeg`).action(async (videoP
31085
31084
  exitWithError(notFoundError(absInputPath));
31086
31085
  }
31087
31086
  if (!commandExists("ffmpeg")) {
31088
- exitWithError(generalError("FFmpeg not found. Please install FFmpeg."));
31087
+ exitWithError(generalError("FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details."));
31089
31088
  }
31090
31089
  if (options.dryRun) {
31091
31090
  outputResult({
@@ -31144,7 +31143,7 @@ Requires: OPENAI_API_KEY (Whisper transcription) + FFmpeg`).action(async (videoP
31144
31143
  exitWithError(notFoundError(absVideoPath));
31145
31144
  }
31146
31145
  if (!commandExists("ffmpeg")) {
31147
- exitWithError(generalError("FFmpeg not found. Please install FFmpeg."));
31146
+ exitWithError(generalError("FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details."));
31148
31147
  }
31149
31148
  if (options.dryRun) {
31150
31149
  outputResult({
@@ -31281,7 +31280,7 @@ Requires: OPENAI_API_KEY (Whisper transcription) + FFmpeg`).action(async (videoP
31281
31280
  exitWithError(notFoundError(absVideoPath));
31282
31281
  }
31283
31282
  if (!commandExists("ffmpeg")) {
31284
- exitWithError(generalError("FFmpeg not found. Please install FFmpeg."));
31283
+ exitWithError(generalError("FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details."));
31285
31284
  }
31286
31285
  if (options.dryRun) {
31287
31286
  const fillers2 = options.fillers ? options.fillers.split(",").map((f) => f.trim()) : void 0;
@@ -33514,7 +33513,7 @@ Analyze both what is SHOWN (visual cues, actions, expressions) and what is SAID
33514
33513
  try {
33515
33514
  if (!commandExists("ffmpeg")) {
33516
33515
  audioSpinner.fail("FFmpeg not found");
33517
- exitWithError(generalError("FFmpeg not found. Please install FFmpeg."));
33516
+ exitWithError(generalError("FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details."));
33518
33517
  }
33519
33518
  const { stdout: probeOut } = await execSafe("ffprobe", [
33520
33519
  "-v",
@@ -33703,7 +33702,7 @@ Analyze both what is SHOWN (visual cues, actions, expressions) and what is SAID
33703
33702
  return;
33704
33703
  }
33705
33704
  if (!commandExists("ffmpeg")) {
33706
- exitWithError(generalError("FFmpeg not found. Please install FFmpeg."));
33705
+ exitWithError(generalError("FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details."));
33707
33706
  }
33708
33707
  const targetDuration = parseInt(options.duration);
33709
33708
  const shortCount = parseInt(options.count);
@@ -46843,7 +46842,7 @@ ${segmentTexts}`,
46843
46842
  return;
46844
46843
  }
46845
46844
  if (!commandExists("ffmpeg")) {
46846
- exitWithError(generalError("FFmpeg not found. Please install FFmpeg."));
46845
+ exitWithError(generalError("FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details."));
46847
46846
  }
46848
46847
  const spinner2 = ora("Processing audio ducking...").start();
46849
46848
  const absMusic = resolve41(process.cwd(), musicPath);
@@ -53225,7 +53224,7 @@ init_source();
53225
53224
  // package.json
53226
53225
  var package_default = {
53227
53226
  name: "@vibeframe/cli",
53228
- version: "0.55.1",
53227
+ version: "0.56.0",
53229
53228
  description: "VibeFrame CLI - natural language video editing from the terminal",
53230
53229
  private: false,
53231
53230
  license: "MIT",
@@ -55805,7 +55804,7 @@ function registerBrollCommand(ai) {
55805
55804
  exitWithError(authError("ANTHROPIC_API_KEY", "Anthropic"));
55806
55805
  }
55807
55806
  if (!commandExists("ffmpeg")) {
55808
- exitWithError(generalError("FFmpeg not found. Please install FFmpeg."));
55807
+ exitWithError(generalError("FFmpeg not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux). Run `vibe doctor` for details."));
55809
55808
  }
55810
55809
  console.log();
55811
55810
  console.log(source_default.bold.cyan("\u{1F3AC} B-Roll Matcher Pipeline"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/cli",
3
- "version": "0.55.1",
3
+ "version": "0.56.0",
4
4
  "description": "VibeFrame CLI - natural language video editing from the terminal",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -149,8 +149,8 @@
149
149
  "tsx": "^4.21.0",
150
150
  "typescript": "^5.3.3",
151
151
  "vitest": "^1.2.2",
152
- "@vibeframe/ai-providers": "0.55.1",
153
- "@vibeframe/core": "0.55.1"
152
+ "@vibeframe/core": "0.56.0",
153
+ "@vibeframe/ai-providers": "0.56.0"
154
154
  },
155
155
  "engines": {
156
156
  "node": ">=20"