@vibeframe/cli 0.92.0 → 0.93.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/CONTEXT.md CHANGED
@@ -92,7 +92,7 @@ export GOOGLE_API_KEY="..." # Gemini (image, video, inspect)
92
92
  export OPENAI_API_KEY="..." # Whisper, DALL-E, GPT
93
93
  export ANTHROPIC_API_KEY="..." # Claude (storyboard, grading)
94
94
  export XAI_API_KEY="..." # Grok
95
- export FAL_KEY="..." # Seedance video (default)
95
+ export FAL_API_KEY="..." # Seedance video (default)
96
96
  export ELEVENLABS_API_KEY="..." # TTS, music, sound effects
97
97
  export KLING_API_KEY="..." # Kling video
98
98
  export RUNWAY_API_SECRET="..." # Runway video
package/dist/index.js CHANGED
@@ -14270,6 +14270,9 @@ function getProvidersFor(kind) {
14270
14270
  function getProviderEnvVars() {
14271
14271
  return Object.fromEntries([...apiKeyRegistry.values()].map((k) => [k.configKey, k.envVar]));
14272
14272
  }
14273
+ function getProviderEnvAliases() {
14274
+ return Object.fromEntries([...apiKeyRegistry.values()].filter((k) => k.envAliases && k.envAliases.length > 0).map((k) => [k.envVar, k.envAliases ?? []]));
14275
+ }
14273
14276
  function getCommandKeyMap() {
14274
14277
  const map = {};
14275
14278
  for (const p of providerRegistry2.values()) {
@@ -14377,7 +14380,8 @@ var init_api_keys = __esm({
14377
14380
  });
14378
14381
  defineApiKey({
14379
14382
  configKey: "fal",
14380
- envVar: "FAL_KEY",
14383
+ envVar: "FAL_API_KEY",
14384
+ envAliases: ["FAL_KEY"],
14381
14385
  label: "fal.ai",
14382
14386
  showInSetup: true,
14383
14387
  setupDescription: "Seedance 2.0 video gen ($$, default since v0.57)",
@@ -14394,7 +14398,7 @@ var init_api_keys = __esm({
14394
14398
  label: "xAI",
14395
14399
  showInSetup: true,
14396
14400
  setupDescription: "Grok \u2014 video gen with audio ($$), image ($), Agent",
14397
- envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no FAL_KEY)",
14401
+ envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no FAL_API_KEY)",
14398
14402
  envExampleUrl: "https://console.x.ai/",
14399
14403
  keyFormat: { prefix: /^xai-/, example: "xai-..." }
14400
14404
  });
@@ -24451,7 +24455,7 @@ var init_FalProvider = __esm({
24451
24455
  return {
24452
24456
  id: "",
24453
24457
  status: "failed",
24454
- error: "fal.ai API key not configured. Set FAL_KEY in .env."
24458
+ error: "fal.ai API key not configured. Set FAL_API_KEY in .env."
24455
24459
  };
24456
24460
  }
24457
24461
  const variant = options?.model ?? DEFAULT_VARIANT;
@@ -25228,6 +25232,7 @@ __export(dist_exports2, {
25228
25232
  getCommandKeyMap: () => getCommandKeyMap,
25229
25233
  getDisplayLabelForApiKey: () => getDisplayLabelForApiKey,
25230
25234
  getKeyFormat: () => getKeyFormat,
25235
+ getProviderEnvAliases: () => getProviderEnvAliases,
25231
25236
  getProviderEnvVars: () => getProviderEnvVars,
25232
25237
  getProvidersFor: () => getProvidersFor,
25233
25238
  getSetupProviders: () => getSetupProviders,
@@ -25687,7 +25692,7 @@ function createDefaultConfig() {
25687
25692
  }
25688
25693
  };
25689
25694
  }
25690
- var PROVIDER_NAMES, PROVIDER_ENV_VARS;
25695
+ var PROVIDER_NAMES, PROVIDER_ENV_VARS, PROVIDER_ENV_ALIASES;
25691
25696
  var init_schema = __esm({
25692
25697
  "src/config/schema.ts"() {
25693
25698
  "use strict";
@@ -25701,6 +25706,7 @@ var init_schema = __esm({
25701
25706
  openrouter: "OpenRouter"
25702
25707
  };
25703
25708
  PROVIDER_ENV_VARS = getProviderEnvVars();
25709
+ PROVIDER_ENV_ALIASES = getProviderEnvAliases();
25704
25710
  }
25705
25711
  });
25706
25712
 
@@ -25709,6 +25715,7 @@ var config_exports = {};
25709
25715
  __export(config_exports, {
25710
25716
  CONFIG_DIR: () => CONFIG_DIR,
25711
25717
  CONFIG_PATH: () => CONFIG_PATH,
25718
+ PROVIDER_ENV_ALIASES: () => PROVIDER_ENV_ALIASES,
25712
25719
  PROVIDER_ENV_VARS: () => PROVIDER_ENV_VARS,
25713
25720
  PROVIDER_NAMES: () => PROVIDER_NAMES,
25714
25721
  USER_CONFIG_DIR: () => USER_CONFIG_DIR,
@@ -25823,7 +25830,7 @@ async function isConfigured() {
25823
25830
  return true;
25824
25831
  }
25825
25832
  const envVar = PROVIDER_ENV_VARS[providerKey];
25826
- if (envVar && process.env[envVar]) {
25833
+ if (envVar && getEnvValue(envVar)) {
25827
25834
  return true;
25828
25835
  }
25829
25836
  return false;
@@ -25834,9 +25841,12 @@ async function getApiKeyFromConfig(providerKey) {
25834
25841
  return config2.providers[providerKey];
25835
25842
  }
25836
25843
  const envVar = PROVIDER_ENV_VARS[providerKey];
25837
- if (envVar) return process.env[envVar];
25844
+ if (envVar) return getEnvValue(envVar);
25838
25845
  return void 0;
25839
25846
  }
25847
+ function getEnvValue(envVar) {
25848
+ return process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean);
25849
+ }
25840
25850
  async function updateProviderKey(providerKey, apiKey, options = {}) {
25841
25851
  const scope = options.scope ?? await getActiveScope(options.cwd);
25842
25852
  let config2 = await loadConfig({ scope, cwd: options.cwd });
@@ -25862,6 +25872,12 @@ var init_config = __esm({
25862
25872
  import { createInterface } from "node:readline";
25863
25873
  import { readFile as readFile3, writeFile as writeFile3, access as access3 } from "node:fs/promises";
25864
25874
  import { resolve as resolve5 } from "node:path";
25875
+ function providerKeyForEnvVar(envVar) {
25876
+ return PROVIDER_KEY_BY_ENV_VAR[envVar];
25877
+ }
25878
+ function getEnvValue2(envVar) {
25879
+ return process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean);
25880
+ }
25865
25881
  function loadEnv() {
25866
25882
  (0, import_dotenv.config)({ path: resolve5(process.cwd(), ".env"), debug: false, quiet: true });
25867
25883
  const monorepoRoot = findMonorepoRoot();
@@ -25924,19 +25940,7 @@ async function getApiKey(envVar, providerName, optionValue) {
25924
25940
  if (optionValue) {
25925
25941
  return optionValue;
25926
25942
  }
25927
- const providerKeyMap = {
25928
- ANTHROPIC_API_KEY: "anthropic",
25929
- OPENAI_API_KEY: "openai",
25930
- GOOGLE_API_KEY: "google",
25931
- XAI_API_KEY: "xai",
25932
- ELEVENLABS_API_KEY: "elevenlabs",
25933
- RUNWAY_API_SECRET: "runway",
25934
- KLING_API_KEY: "kling",
25935
- OPENROUTER_API_KEY: "openrouter",
25936
- IMGBB_API_KEY: "imgbb",
25937
- REPLICATE_API_TOKEN: "replicate"
25938
- };
25939
- const providerKey = providerKeyMap[envVar];
25943
+ const providerKey = providerKeyForEnvVar(envVar);
25940
25944
  if (providerKey) {
25941
25945
  const configKey = await getApiKeyFromConfig(providerKey);
25942
25946
  if (configKey) {
@@ -25944,7 +25948,7 @@ async function getApiKey(envVar, providerName, optionValue) {
25944
25948
  }
25945
25949
  }
25946
25950
  loadEnv();
25947
- const envValue = process.env[envVar];
25951
+ const envValue = getEnvValue2(envVar);
25948
25952
  if (envValue) {
25949
25953
  return envValue;
25950
25954
  }
@@ -25970,7 +25974,7 @@ async function getApiKey(envVar, providerName, optionValue) {
25970
25974
  }
25971
25975
  function hasApiKey(envVar) {
25972
25976
  loadEnv();
25973
- return !!process.env[envVar];
25977
+ return !!getEnvValue2(envVar);
25974
25978
  }
25975
25979
  async function requireApiKey(envVar, providerName, cliOverride) {
25976
25980
  const key = await getApiKey(envVar, providerName, cliOverride);
@@ -25999,19 +26003,35 @@ async function saveApiKeyToEnv(envVar, apiKey) {
25999
26003
  }
26000
26004
  await writeFile3(envPath, content, "utf-8");
26001
26005
  }
26002
- var import_dotenv, API_KEY_URLS, ApiKeyError;
26006
+ var import_dotenv, PROVIDER_KEY_BY_ENV_VAR, API_KEY_URLS, ApiKeyError;
26003
26007
  var init_api_key = __esm({
26004
26008
  "src/utils/api-key.ts"() {
26005
26009
  "use strict";
26006
26010
  import_dotenv = __toESM(require_main(), 1);
26007
26011
  init_source();
26008
26012
  init_config();
26013
+ PROVIDER_KEY_BY_ENV_VAR = {
26014
+ ANTHROPIC_API_KEY: "anthropic",
26015
+ OPENAI_API_KEY: "openai",
26016
+ GOOGLE_API_KEY: "google",
26017
+ XAI_API_KEY: "xai",
26018
+ ELEVENLABS_API_KEY: "elevenlabs",
26019
+ FAL_API_KEY: "fal",
26020
+ FAL_KEY: "fal",
26021
+ RUNWAY_API_SECRET: "runway",
26022
+ KLING_API_KEY: "kling",
26023
+ OPENROUTER_API_KEY: "openrouter",
26024
+ IMGBB_API_KEY: "imgbb",
26025
+ REPLICATE_API_TOKEN: "replicate"
26026
+ };
26009
26027
  API_KEY_URLS = {
26010
26028
  GOOGLE_API_KEY: "https://aistudio.google.com/apikey",
26011
26029
  OPENAI_API_KEY: "https://platform.openai.com/api-keys",
26012
26030
  ANTHROPIC_API_KEY: "https://console.anthropic.com/settings/keys",
26013
26031
  XAI_API_KEY: "https://console.x.ai",
26014
26032
  ELEVENLABS_API_KEY: "https://elevenlabs.io/app/settings/api-keys",
26033
+ FAL_API_KEY: "https://fal.ai/dashboard/keys",
26034
+ FAL_KEY: "https://fal.ai/dashboard/keys",
26015
26035
  RUNWAY_API_SECRET: "https://app.runwayml.com/settings/api-keys",
26016
26036
  KLING_API_KEY: "https://klingai.com/dev",
26017
26037
  REPLICATE_API_TOKEN: "https://replicate.com/account/api-tokens",
@@ -33417,7 +33437,7 @@ async function loadProviderDefaults() {
33417
33437
  configProviderKeys = null;
33418
33438
  }
33419
33439
  }
33420
- function providerKeyForEnvVar(envVar) {
33440
+ function providerKeyForEnvVar2(envVar) {
33421
33441
  const envVars = getProviderEnvVars();
33422
33442
  for (const [providerKey, candidateEnvVar] of Object.entries(envVars)) {
33423
33443
  if (candidateEnvVar === envVar) return providerKey;
@@ -33427,7 +33447,7 @@ function providerKeyForEnvVar(envVar) {
33427
33447
  function hasCandidateKey(candidate) {
33428
33448
  if (candidate.envVar === null) return true;
33429
33449
  if (hasApiKey(candidate.envVar)) return true;
33430
- const providerKey = providerKeyForEnvVar(candidate.envVar);
33450
+ const providerKey = providerKeyForEnvVar2(candidate.envVar);
33431
33451
  return providerKey ? Boolean(configProviderKeys?.has(providerKey)) : false;
33432
33452
  }
33433
33453
  function resolveProvider(category) {
@@ -35229,7 +35249,7 @@ function registerVideoCommand(parent) {
35229
35249
  "Provider: seedance (ByteDance Seedance 2.0 via fal.ai), grok, kling, runway, veo. `fal` is a deprecated v0.x alias for seedance and will be removed in 1.0."
35230
35250
  ).option(
35231
35251
  "-k, --api-key <key>",
35232
- "API key (or set FAL_KEY / XAI_API_KEY / RUNWAY_API_SECRET / KLING_API_KEY / GOOGLE_API_KEY env)"
35252
+ "API key (or set FAL_API_KEY / XAI_API_KEY / RUNWAY_API_SECRET / KLING_API_KEY / GOOGLE_API_KEY env)"
35233
35253
  ).option("-o, --output <path>", "Output file path (downloads video)").option("-i, --image <path>", "Reference image for image-to-video").option(
35234
35254
  "-d, --duration <sec>",
35235
35255
  "Duration in seconds. Seedance accepts 4-15; Kling accepts 5 or 10; Veo maps to 6 or 8.",
@@ -35252,7 +35272,7 @@ function registerVideoCommand(parent) {
35252
35272
  "after",
35253
35273
  `
35254
35274
  Examples:
35255
- $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_KEY is set
35275
+ $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_API_KEY is set
35256
35276
  $ vibe gen vid "cinematic city timelapse" -o city.mp4 -p seedance # Seedance via fal.ai
35257
35277
  $ vibe gen vid "city timelapse" -o city.mp4 -p kling # Kling
35258
35278
  $ vibe gen vid "epic scene" -i frame.png -o out.mp4 -p runway # Image-to-video
@@ -35295,7 +35315,7 @@ Examples:
35295
35315
  veo: "GOOGLE_API_KEY",
35296
35316
  kling: "KLING_API_KEY",
35297
35317
  runway: "RUNWAY_API_SECRET",
35298
- seedance: "FAL_KEY"
35318
+ seedance: "FAL_API_KEY"
35299
35319
  };
35300
35320
  let provider;
35301
35321
  if (options.provider) {
@@ -35398,7 +35418,7 @@ Examples:
35398
35418
  kling: "KLING_API_KEY",
35399
35419
  veo: "GOOGLE_API_KEY",
35400
35420
  grok: "XAI_API_KEY",
35401
- seedance: "FAL_KEY"
35421
+ seedance: "FAL_API_KEY"
35402
35422
  };
35403
35423
  const providerNameMap = {
35404
35424
  runway: "Runway",
@@ -35777,7 +35797,7 @@ var init_generate = __esm({
35777
35797
  Examples:
35778
35798
  $ vibe generate image "a sunset over the ocean" -o sunset.png
35779
35799
  $ vibe generate image "logo design" -o logo.png -p openai
35780
- $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_KEY is set
35800
+ $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_API_KEY is set
35781
35801
  $ vibe generate video "city timelapse" -o city.mp4 -p seedance # Seedance via fal.ai
35782
35802
  $ vibe generate video "city timelapse" -o city.mp4 -p kling # Kling
35783
35803
  $ vibe generate video "epic scene" -i frame.png -o out.mp4 -p runway # Image-to-video
@@ -35788,7 +35808,7 @@ Examples:
35788
35808
  API Keys (per provider):
35789
35809
  GOOGLE_API_KEY Image (default), Veo video
35790
35810
  OPENAI_API_KEY Image (-p openai)
35791
- FAL_KEY Seedance video (-p seedance, default video)
35811
+ FAL_API_KEY Seedance video (-p seedance, default video)
35792
35812
  XAI_API_KEY Grok image/video
35793
35813
  KLING_API_KEY Kling video (-p kling)
35794
35814
  RUNWAY_API_SECRET Runway video (-p runway)
@@ -52806,10 +52826,11 @@ async function executeVideoGenerate(options) {
52806
52826
  runway: "RUNWAY_API_SECRET",
52807
52827
  kling: "KLING_API_KEY",
52808
52828
  veo: "GOOGLE_API_KEY",
52809
- seedance: "FAL_KEY",
52810
- fal: "FAL_KEY"
52829
+ seedance: "FAL_API_KEY",
52830
+ fal: "FAL_API_KEY"
52811
52831
  };
52812
- const key = apiKey || process.env[envKeyMap[provider] || ""];
52832
+ const envKey = envKeyMap[provider] || "";
52833
+ const key = apiKey || (hasApiKey(envKey) ? process.env[envKey] || (envKey === "FAL_API_KEY" ? process.env.FAL_KEY : void 0) : void 0);
52813
52834
  if (!key) return { success: false, error: `${envKeyMap[provider]} required for ${provider}` };
52814
52835
  let referenceImage;
52815
52836
  let referenceImageBuffer;
@@ -53206,6 +53227,7 @@ var init_ai_video = __esm({
53206
53227
  init_dist2();
53207
53228
  init_upload_host();
53208
53229
  init_ai_helpers();
53230
+ init_api_key();
53209
53231
  }
53210
53232
  });
53211
53233
 
@@ -63425,7 +63447,7 @@ init_source();
63425
63447
  // package.json
63426
63448
  var package_default = {
63427
63449
  name: "@vibeframe/cli",
63428
- version: "0.92.0",
63450
+ version: "0.93.0",
63429
63451
  description: "VibeFrame CLI - natural language video editing from the terminal",
63430
63452
  private: false,
63431
63453
  license: "MIT",
@@ -70423,6 +70445,13 @@ var VALID_LLM_PROVIDERS = [
70423
70445
  "openrouter"
70424
70446
  ];
70425
70447
  var VALID_SCOPES = ["user", "project"];
70448
+ function envValueFor(meta) {
70449
+ return process.env[meta.envVar] || meta.envAliases?.map((alias) => process.env[alias]).find(Boolean);
70450
+ }
70451
+ function envValueForName(envVar) {
70452
+ if (envVar === "FAL_API_KEY") return process.env.FAL_API_KEY || process.env.FAL_KEY;
70453
+ return process.env[envVar];
70454
+ }
70426
70455
  function parseScope(raw) {
70427
70456
  const v = String(raw ?? "user");
70428
70457
  if (!VALID_SCOPES.includes(v)) {
@@ -70569,7 +70598,7 @@ var AI_FEATURES = [
70569
70598
  keys: [
70570
70599
  {
70571
70600
  configKey: "fal",
70572
- envVar: "FAL_KEY",
70601
+ envVar: "FAL_API_KEY",
70573
70602
  name: "Seedance 2.0 (via fal.ai)",
70574
70603
  url: "https://fal.ai/dashboard/keys",
70575
70604
  what: "ByteDance Seedance 2.0 text-to-video and image-to-video"
@@ -70581,7 +70610,7 @@ var AI_FEATURES = [
70581
70610
  desc: "recommended default, text-to-video + image-to-video",
70582
70611
  key: {
70583
70612
  configKey: "fal",
70584
- envVar: "FAL_KEY",
70613
+ envVar: "FAL_API_KEY",
70585
70614
  name: "Seedance 2.0 (via fal.ai)",
70586
70615
  url: "https://fal.ai/dashboard/keys",
70587
70616
  what: "ByteDance Seedance 2.0 text-to-video and image-to-video"
@@ -70890,7 +70919,7 @@ async function runNonInteractiveSetup(opts) {
70890
70919
  if (opts.importEnv) {
70891
70920
  loadEnv();
70892
70921
  for (const meta of getAllApiKeys()) {
70893
- const envValue = process.env[meta.envVar];
70922
+ const envValue = envValueFor(meta);
70894
70923
  if (!envValue) continue;
70895
70924
  const existing = config2.providers[meta.configKey];
70896
70925
  if (existing === envValue) continue;
@@ -71020,7 +71049,7 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
71020
71049
  },
71021
71050
  {
71022
71051
  configKey: "fal",
71023
- envVar: "FAL_KEY",
71052
+ envVar: "FAL_API_KEY",
71024
71053
  name: "fal.ai",
71025
71054
  url: "https://fal.ai/dashboard/keys",
71026
71055
  what: "Seedance 2.0 \u2014 video generation, default since v0.57"
@@ -71231,7 +71260,7 @@ async function runAIFeaturesSetup(config2, _scope) {
71231
71260
  }
71232
71261
  loadEnv();
71233
71262
  const configValue = config2.providers[keyDef.configKey];
71234
- const envValue = process.env[keyDef.envVar];
71263
+ const envValue = envValueForName(keyDef.envVar);
71235
71264
  if (configValue || envValue) {
71236
71265
  const value = configValue || envValue;
71237
71266
  const source = configValue ? "config" : ".env";
@@ -71279,7 +71308,7 @@ async function collectKeys(config2, keys) {
71279
71308
  loadEnv();
71280
71309
  for (const keyDef of keys) {
71281
71310
  const configValue = config2.providers[keyDef.configKey];
71282
- const envValue = process.env[keyDef.envVar];
71311
+ const envValue = envValueForName(keyDef.envVar);
71283
71312
  if (configValue) {
71284
71313
  console.log(
71285
71314
  ` ${source_default.green("\u2713")} ${keyDef.name.padEnd(14)} ${maskApiKey(configValue)} ${source_default.dim("(config)")}`
@@ -71540,7 +71569,7 @@ async function showConfig(opts = { verbose: false }) {
71540
71569
  { key: "openai", name: "OpenAI", env: "OPENAI_API_KEY" },
71541
71570
  { key: "google", name: "Google", env: "GOOGLE_API_KEY" },
71542
71571
  { key: "xai", name: "xAI", env: "XAI_API_KEY" },
71543
- { key: "fal", name: "fal.ai", env: "FAL_KEY" },
71572
+ { key: "fal", name: "fal.ai", env: "FAL_API_KEY" },
71544
71573
  { key: "elevenlabs", name: "ElevenLabs", env: "ELEVENLABS_API_KEY" },
71545
71574
  { key: "runway", name: "Runway", env: "RUNWAY_API_SECRET" },
71546
71575
  { key: "kling", name: "Kling", env: "KLING_API_KEY" },
@@ -71551,7 +71580,7 @@ async function showConfig(opts = { verbose: false }) {
71551
71580
  let unsetCount = 0;
71552
71581
  for (const p of providerKeys) {
71553
71582
  const configValue = config2?.providers[p.key];
71554
- const dotenvValue = dotenvKeys[p.env];
71583
+ const dotenvValue = dotenvKeys[p.env] || (p.env === "FAL_API_KEY" ? dotenvKeys.FAL_KEY : void 0);
71555
71584
  if (configValue || dotenvValue) {
71556
71585
  const sources = [];
71557
71586
  if (configValue) sources.push("config");
@@ -71847,7 +71876,7 @@ OPENROUTER_API_KEY= # multiplexes any provider above
71847
71876
 
71848
71877
  # \u2500\u2500 Media providers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
71849
71878
  ELEVENLABS_API_KEY= # paid TTS / SFX / music (Kokoro is the free fallback)
71850
- FAL_KEY= # Seedance 2.0 \u2014 default video provider since v0.57
71879
+ FAL_API_KEY= # Seedance 2.0 \u2014 default video provider since v0.57
71851
71880
  IMGBB_API_KEY= # image hosting for Seedance/Kling image-to-video
71852
71881
  RUNWAY_API_SECRET= # Runway Gen-4.5 video
71853
71882
  KLING_API_KEY= # Kling video
@@ -72722,7 +72751,9 @@ async function runDiagnostics() {
72722
72751
  let readyCount = FREE_COMMANDS.length;
72723
72752
  let totalCount = FREE_COMMANDS.length;
72724
72753
  for (const [envVar, commands] of Object.entries(COMMAND_KEY_MAP)) {
72725
- const configured = !!process.env[envVar];
72754
+ const configured = Boolean(
72755
+ process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean)
72756
+ );
72726
72757
  const providerName = Object.entries(PROVIDER_ENV_VARS).find(([, v]) => v === envVar)?.[0] ?? envVar;
72727
72758
  providers[providerName] = { envVar, configured, commands };
72728
72759
  totalCount += commands.length;
@@ -73011,7 +73042,7 @@ async function runLiveKeyTests(results) {
73011
73042
  }
73012
73043
  const { testKey: testKey2 } = await Promise.resolve().then(() => (init_key_live_test(), key_live_test_exports));
73013
73044
  for (const [name, info] of configured) {
73014
- const value = process.env[info.envVar];
73045
+ const value = process.env[info.envVar] || PROVIDER_ENV_ALIASES[info.envVar]?.map((alias) => process.env[alias]).find(Boolean);
73015
73046
  if (!value) continue;
73016
73047
  process.stdout.write(` ${name.padEnd(12)} `);
73017
73048
  const result = await testKey2(name, value);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/cli",
3
- "version": "0.92.0",
3
+ "version": "0.93.0",
4
4
  "description": "VibeFrame CLI - natural language video editing from the terminal",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -183,8 +183,8 @@
183
183
  "tsx": "^4.21.0",
184
184
  "typescript": "^5.3.3",
185
185
  "vitest": "^1.2.2",
186
- "@vibeframe/core": "0.92.0",
187
- "@vibeframe/ai-providers": "0.92.0"
186
+ "@vibeframe/ai-providers": "0.93.0",
187
+ "@vibeframe/core": "0.93.0"
188
188
  },
189
189
  "engines": {
190
190
  "node": ">=20"