@vibeframe/cli 0.92.0 → 0.94.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,7 @@ var init_api_keys = __esm({
14377
14380
  });
14378
14381
  defineApiKey({
14379
14382
  configKey: "fal",
14380
- envVar: "FAL_KEY",
14383
+ envVar: "FAL_API_KEY",
14381
14384
  label: "fal.ai",
14382
14385
  showInSetup: true,
14383
14386
  setupDescription: "Seedance 2.0 video gen ($$, default since v0.57)",
@@ -14394,7 +14397,7 @@ var init_api_keys = __esm({
14394
14397
  label: "xAI",
14395
14398
  showInSetup: true,
14396
14399
  setupDescription: "Grok \u2014 video gen with audio ($$), image ($), Agent",
14397
- envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no FAL_KEY)",
14400
+ envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no FAL_API_KEY)",
14398
14401
  envExampleUrl: "https://console.x.ai/",
14399
14402
  keyFormat: { prefix: /^xai-/, example: "xai-..." }
14400
14403
  });
@@ -24451,7 +24454,7 @@ var init_FalProvider = __esm({
24451
24454
  return {
24452
24455
  id: "",
24453
24456
  status: "failed",
24454
- error: "fal.ai API key not configured. Set FAL_KEY in .env."
24457
+ error: "fal.ai API key not configured. Set FAL_API_KEY in .env."
24455
24458
  };
24456
24459
  }
24457
24460
  const variant = options?.model ?? DEFAULT_VARIANT;
@@ -25228,6 +25231,7 @@ __export(dist_exports2, {
25228
25231
  getCommandKeyMap: () => getCommandKeyMap,
25229
25232
  getDisplayLabelForApiKey: () => getDisplayLabelForApiKey,
25230
25233
  getKeyFormat: () => getKeyFormat,
25234
+ getProviderEnvAliases: () => getProviderEnvAliases,
25231
25235
  getProviderEnvVars: () => getProviderEnvVars,
25232
25236
  getProvidersFor: () => getProvidersFor,
25233
25237
  getSetupProviders: () => getSetupProviders,
@@ -25687,7 +25691,7 @@ function createDefaultConfig() {
25687
25691
  }
25688
25692
  };
25689
25693
  }
25690
- var PROVIDER_NAMES, PROVIDER_ENV_VARS;
25694
+ var PROVIDER_NAMES, PROVIDER_ENV_VARS, PROVIDER_ENV_ALIASES;
25691
25695
  var init_schema = __esm({
25692
25696
  "src/config/schema.ts"() {
25693
25697
  "use strict";
@@ -25701,6 +25705,7 @@ var init_schema = __esm({
25701
25705
  openrouter: "OpenRouter"
25702
25706
  };
25703
25707
  PROVIDER_ENV_VARS = getProviderEnvVars();
25708
+ PROVIDER_ENV_ALIASES = getProviderEnvAliases();
25704
25709
  }
25705
25710
  });
25706
25711
 
@@ -25709,6 +25714,7 @@ var config_exports = {};
25709
25714
  __export(config_exports, {
25710
25715
  CONFIG_DIR: () => CONFIG_DIR,
25711
25716
  CONFIG_PATH: () => CONFIG_PATH,
25717
+ PROVIDER_ENV_ALIASES: () => PROVIDER_ENV_ALIASES,
25712
25718
  PROVIDER_ENV_VARS: () => PROVIDER_ENV_VARS,
25713
25719
  PROVIDER_NAMES: () => PROVIDER_NAMES,
25714
25720
  USER_CONFIG_DIR: () => USER_CONFIG_DIR,
@@ -25823,7 +25829,7 @@ async function isConfigured() {
25823
25829
  return true;
25824
25830
  }
25825
25831
  const envVar = PROVIDER_ENV_VARS[providerKey];
25826
- if (envVar && process.env[envVar]) {
25832
+ if (envVar && getEnvValue(envVar)) {
25827
25833
  return true;
25828
25834
  }
25829
25835
  return false;
@@ -25834,9 +25840,12 @@ async function getApiKeyFromConfig(providerKey) {
25834
25840
  return config2.providers[providerKey];
25835
25841
  }
25836
25842
  const envVar = PROVIDER_ENV_VARS[providerKey];
25837
- if (envVar) return process.env[envVar];
25843
+ if (envVar) return getEnvValue(envVar);
25838
25844
  return void 0;
25839
25845
  }
25846
+ function getEnvValue(envVar) {
25847
+ return process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean);
25848
+ }
25840
25849
  async function updateProviderKey(providerKey, apiKey, options = {}) {
25841
25850
  const scope = options.scope ?? await getActiveScope(options.cwd);
25842
25851
  let config2 = await loadConfig({ scope, cwd: options.cwd });
@@ -25862,6 +25871,12 @@ var init_config = __esm({
25862
25871
  import { createInterface } from "node:readline";
25863
25872
  import { readFile as readFile3, writeFile as writeFile3, access as access3 } from "node:fs/promises";
25864
25873
  import { resolve as resolve5 } from "node:path";
25874
+ function providerKeyForEnvVar(envVar) {
25875
+ return PROVIDER_KEY_BY_ENV_VAR[envVar];
25876
+ }
25877
+ function getEnvValue2(envVar) {
25878
+ return process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean);
25879
+ }
25865
25880
  function loadEnv() {
25866
25881
  (0, import_dotenv.config)({ path: resolve5(process.cwd(), ".env"), debug: false, quiet: true });
25867
25882
  const monorepoRoot = findMonorepoRoot();
@@ -25924,19 +25939,7 @@ async function getApiKey(envVar, providerName, optionValue) {
25924
25939
  if (optionValue) {
25925
25940
  return optionValue;
25926
25941
  }
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];
25942
+ const providerKey = providerKeyForEnvVar(envVar);
25940
25943
  if (providerKey) {
25941
25944
  const configKey = await getApiKeyFromConfig(providerKey);
25942
25945
  if (configKey) {
@@ -25944,7 +25947,7 @@ async function getApiKey(envVar, providerName, optionValue) {
25944
25947
  }
25945
25948
  }
25946
25949
  loadEnv();
25947
- const envValue = process.env[envVar];
25950
+ const envValue = getEnvValue2(envVar);
25948
25951
  if (envValue) {
25949
25952
  return envValue;
25950
25953
  }
@@ -25970,7 +25973,7 @@ async function getApiKey(envVar, providerName, optionValue) {
25970
25973
  }
25971
25974
  function hasApiKey(envVar) {
25972
25975
  loadEnv();
25973
- return !!process.env[envVar];
25976
+ return !!getEnvValue2(envVar);
25974
25977
  }
25975
25978
  async function requireApiKey(envVar, providerName, cliOverride) {
25976
25979
  const key = await getApiKey(envVar, providerName, cliOverride);
@@ -25999,19 +26002,33 @@ async function saveApiKeyToEnv(envVar, apiKey) {
25999
26002
  }
26000
26003
  await writeFile3(envPath, content, "utf-8");
26001
26004
  }
26002
- var import_dotenv, API_KEY_URLS, ApiKeyError;
26005
+ var import_dotenv, PROVIDER_KEY_BY_ENV_VAR, API_KEY_URLS, ApiKeyError;
26003
26006
  var init_api_key = __esm({
26004
26007
  "src/utils/api-key.ts"() {
26005
26008
  "use strict";
26006
26009
  import_dotenv = __toESM(require_main(), 1);
26007
26010
  init_source();
26008
26011
  init_config();
26012
+ PROVIDER_KEY_BY_ENV_VAR = {
26013
+ ANTHROPIC_API_KEY: "anthropic",
26014
+ OPENAI_API_KEY: "openai",
26015
+ GOOGLE_API_KEY: "google",
26016
+ XAI_API_KEY: "xai",
26017
+ ELEVENLABS_API_KEY: "elevenlabs",
26018
+ FAL_API_KEY: "fal",
26019
+ RUNWAY_API_SECRET: "runway",
26020
+ KLING_API_KEY: "kling",
26021
+ OPENROUTER_API_KEY: "openrouter",
26022
+ IMGBB_API_KEY: "imgbb",
26023
+ REPLICATE_API_TOKEN: "replicate"
26024
+ };
26009
26025
  API_KEY_URLS = {
26010
26026
  GOOGLE_API_KEY: "https://aistudio.google.com/apikey",
26011
26027
  OPENAI_API_KEY: "https://platform.openai.com/api-keys",
26012
26028
  ANTHROPIC_API_KEY: "https://console.anthropic.com/settings/keys",
26013
26029
  XAI_API_KEY: "https://console.x.ai",
26014
26030
  ELEVENLABS_API_KEY: "https://elevenlabs.io/app/settings/api-keys",
26031
+ FAL_API_KEY: "https://fal.ai/dashboard/keys",
26015
26032
  RUNWAY_API_SECRET: "https://app.runwayml.com/settings/api-keys",
26016
26033
  KLING_API_KEY: "https://klingai.com/dev",
26017
26034
  REPLICATE_API_TOKEN: "https://replicate.com/account/api-tokens",
@@ -33417,7 +33434,7 @@ async function loadProviderDefaults() {
33417
33434
  configProviderKeys = null;
33418
33435
  }
33419
33436
  }
33420
- function providerKeyForEnvVar(envVar) {
33437
+ function providerKeyForEnvVar2(envVar) {
33421
33438
  const envVars = getProviderEnvVars();
33422
33439
  for (const [providerKey, candidateEnvVar] of Object.entries(envVars)) {
33423
33440
  if (candidateEnvVar === envVar) return providerKey;
@@ -33427,7 +33444,7 @@ function providerKeyForEnvVar(envVar) {
33427
33444
  function hasCandidateKey(candidate) {
33428
33445
  if (candidate.envVar === null) return true;
33429
33446
  if (hasApiKey(candidate.envVar)) return true;
33430
- const providerKey = providerKeyForEnvVar(candidate.envVar);
33447
+ const providerKey = providerKeyForEnvVar2(candidate.envVar);
33431
33448
  return providerKey ? Boolean(configProviderKeys?.has(providerKey)) : false;
33432
33449
  }
33433
33450
  function resolveProvider(category) {
@@ -35229,7 +35246,7 @@ function registerVideoCommand(parent) {
35229
35246
  "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
35247
  ).option(
35231
35248
  "-k, --api-key <key>",
35232
- "API key (or set FAL_KEY / XAI_API_KEY / RUNWAY_API_SECRET / KLING_API_KEY / GOOGLE_API_KEY env)"
35249
+ "API key (or set FAL_API_KEY / XAI_API_KEY / RUNWAY_API_SECRET / KLING_API_KEY / GOOGLE_API_KEY env)"
35233
35250
  ).option("-o, --output <path>", "Output file path (downloads video)").option("-i, --image <path>", "Reference image for image-to-video").option(
35234
35251
  "-d, --duration <sec>",
35235
35252
  "Duration in seconds. Seedance accepts 4-15; Kling accepts 5 or 10; Veo maps to 6 or 8.",
@@ -35252,7 +35269,7 @@ function registerVideoCommand(parent) {
35252
35269
  "after",
35253
35270
  `
35254
35271
  Examples:
35255
- $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_KEY is set
35272
+ $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_API_KEY is set
35256
35273
  $ vibe gen vid "cinematic city timelapse" -o city.mp4 -p seedance # Seedance via fal.ai
35257
35274
  $ vibe gen vid "city timelapse" -o city.mp4 -p kling # Kling
35258
35275
  $ vibe gen vid "epic scene" -i frame.png -o out.mp4 -p runway # Image-to-video
@@ -35295,7 +35312,7 @@ Examples:
35295
35312
  veo: "GOOGLE_API_KEY",
35296
35313
  kling: "KLING_API_KEY",
35297
35314
  runway: "RUNWAY_API_SECRET",
35298
- seedance: "FAL_KEY"
35315
+ seedance: "FAL_API_KEY"
35299
35316
  };
35300
35317
  let provider;
35301
35318
  if (options.provider) {
@@ -35398,7 +35415,7 @@ Examples:
35398
35415
  kling: "KLING_API_KEY",
35399
35416
  veo: "GOOGLE_API_KEY",
35400
35417
  grok: "XAI_API_KEY",
35401
- seedance: "FAL_KEY"
35418
+ seedance: "FAL_API_KEY"
35402
35419
  };
35403
35420
  const providerNameMap = {
35404
35421
  runway: "Runway",
@@ -35777,7 +35794,7 @@ var init_generate = __esm({
35777
35794
  Examples:
35778
35795
  $ vibe generate image "a sunset over the ocean" -o sunset.png
35779
35796
  $ 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
35797
+ $ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_API_KEY is set
35781
35798
  $ vibe generate video "city timelapse" -o city.mp4 -p seedance # Seedance via fal.ai
35782
35799
  $ vibe generate video "city timelapse" -o city.mp4 -p kling # Kling
35783
35800
  $ vibe generate video "epic scene" -i frame.png -o out.mp4 -p runway # Image-to-video
@@ -35788,7 +35805,7 @@ Examples:
35788
35805
  API Keys (per provider):
35789
35806
  GOOGLE_API_KEY Image (default), Veo video
35790
35807
  OPENAI_API_KEY Image (-p openai)
35791
- FAL_KEY Seedance video (-p seedance, default video)
35808
+ FAL_API_KEY Seedance video (-p seedance, default video)
35792
35809
  XAI_API_KEY Grok image/video
35793
35810
  KLING_API_KEY Kling video (-p kling)
35794
35811
  RUNWAY_API_SECRET Runway video (-p runway)
@@ -52806,10 +52823,11 @@ async function executeVideoGenerate(options) {
52806
52823
  runway: "RUNWAY_API_SECRET",
52807
52824
  kling: "KLING_API_KEY",
52808
52825
  veo: "GOOGLE_API_KEY",
52809
- seedance: "FAL_KEY",
52810
- fal: "FAL_KEY"
52826
+ seedance: "FAL_API_KEY",
52827
+ fal: "FAL_API_KEY"
52811
52828
  };
52812
- const key = apiKey || process.env[envKeyMap[provider] || ""];
52829
+ const envKey = envKeyMap[provider] || "";
52830
+ const key = apiKey || (hasApiKey(envKey) ? process.env[envKey] : void 0);
52813
52831
  if (!key) return { success: false, error: `${envKeyMap[provider]} required for ${provider}` };
52814
52832
  let referenceImage;
52815
52833
  let referenceImageBuffer;
@@ -53206,6 +53224,7 @@ var init_ai_video = __esm({
53206
53224
  init_dist2();
53207
53225
  init_upload_host();
53208
53226
  init_ai_helpers();
53227
+ init_api_key();
53209
53228
  }
53210
53229
  });
53211
53230
 
@@ -63425,7 +63444,7 @@ init_source();
63425
63444
  // package.json
63426
63445
  var package_default = {
63427
63446
  name: "@vibeframe/cli",
63428
- version: "0.92.0",
63447
+ version: "0.94.0",
63429
63448
  description: "VibeFrame CLI - natural language video editing from the terminal",
63430
63449
  private: false,
63431
63450
  license: "MIT",
@@ -70423,6 +70442,12 @@ var VALID_LLM_PROVIDERS = [
70423
70442
  "openrouter"
70424
70443
  ];
70425
70444
  var VALID_SCOPES = ["user", "project"];
70445
+ function envValueFor(meta) {
70446
+ return process.env[meta.envVar] || meta.envAliases?.map((alias) => process.env[alias]).find(Boolean);
70447
+ }
70448
+ function envValueForName(envVar) {
70449
+ return process.env[envVar];
70450
+ }
70426
70451
  function parseScope(raw) {
70427
70452
  const v = String(raw ?? "user");
70428
70453
  if (!VALID_SCOPES.includes(v)) {
@@ -70569,7 +70594,7 @@ var AI_FEATURES = [
70569
70594
  keys: [
70570
70595
  {
70571
70596
  configKey: "fal",
70572
- envVar: "FAL_KEY",
70597
+ envVar: "FAL_API_KEY",
70573
70598
  name: "Seedance 2.0 (via fal.ai)",
70574
70599
  url: "https://fal.ai/dashboard/keys",
70575
70600
  what: "ByteDance Seedance 2.0 text-to-video and image-to-video"
@@ -70581,7 +70606,7 @@ var AI_FEATURES = [
70581
70606
  desc: "recommended default, text-to-video + image-to-video",
70582
70607
  key: {
70583
70608
  configKey: "fal",
70584
- envVar: "FAL_KEY",
70609
+ envVar: "FAL_API_KEY",
70585
70610
  name: "Seedance 2.0 (via fal.ai)",
70586
70611
  url: "https://fal.ai/dashboard/keys",
70587
70612
  what: "ByteDance Seedance 2.0 text-to-video and image-to-video"
@@ -70890,7 +70915,7 @@ async function runNonInteractiveSetup(opts) {
70890
70915
  if (opts.importEnv) {
70891
70916
  loadEnv();
70892
70917
  for (const meta of getAllApiKeys()) {
70893
- const envValue = process.env[meta.envVar];
70918
+ const envValue = envValueFor(meta);
70894
70919
  if (!envValue) continue;
70895
70920
  const existing = config2.providers[meta.configKey];
70896
70921
  if (existing === envValue) continue;
@@ -71020,7 +71045,7 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
71020
71045
  },
71021
71046
  {
71022
71047
  configKey: "fal",
71023
- envVar: "FAL_KEY",
71048
+ envVar: "FAL_API_KEY",
71024
71049
  name: "fal.ai",
71025
71050
  url: "https://fal.ai/dashboard/keys",
71026
71051
  what: "Seedance 2.0 \u2014 video generation, default since v0.57"
@@ -71231,7 +71256,7 @@ async function runAIFeaturesSetup(config2, _scope) {
71231
71256
  }
71232
71257
  loadEnv();
71233
71258
  const configValue = config2.providers[keyDef.configKey];
71234
- const envValue = process.env[keyDef.envVar];
71259
+ const envValue = envValueForName(keyDef.envVar);
71235
71260
  if (configValue || envValue) {
71236
71261
  const value = configValue || envValue;
71237
71262
  const source = configValue ? "config" : ".env";
@@ -71279,7 +71304,7 @@ async function collectKeys(config2, keys) {
71279
71304
  loadEnv();
71280
71305
  for (const keyDef of keys) {
71281
71306
  const configValue = config2.providers[keyDef.configKey];
71282
- const envValue = process.env[keyDef.envVar];
71307
+ const envValue = envValueForName(keyDef.envVar);
71283
71308
  if (configValue) {
71284
71309
  console.log(
71285
71310
  ` ${source_default.green("\u2713")} ${keyDef.name.padEnd(14)} ${maskApiKey(configValue)} ${source_default.dim("(config)")}`
@@ -71540,7 +71565,7 @@ async function showConfig(opts = { verbose: false }) {
71540
71565
  { key: "openai", name: "OpenAI", env: "OPENAI_API_KEY" },
71541
71566
  { key: "google", name: "Google", env: "GOOGLE_API_KEY" },
71542
71567
  { key: "xai", name: "xAI", env: "XAI_API_KEY" },
71543
- { key: "fal", name: "fal.ai", env: "FAL_KEY" },
71568
+ { key: "fal", name: "fal.ai", env: "FAL_API_KEY" },
71544
71569
  { key: "elevenlabs", name: "ElevenLabs", env: "ELEVENLABS_API_KEY" },
71545
71570
  { key: "runway", name: "Runway", env: "RUNWAY_API_SECRET" },
71546
71571
  { key: "kling", name: "Kling", env: "KLING_API_KEY" },
@@ -71847,7 +71872,7 @@ OPENROUTER_API_KEY= # multiplexes any provider above
71847
71872
 
71848
71873
  # \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
71874
  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
71875
+ FAL_API_KEY= # Seedance 2.0 \u2014 default video provider since v0.57
71851
71876
  IMGBB_API_KEY= # image hosting for Seedance/Kling image-to-video
71852
71877
  RUNWAY_API_SECRET= # Runway Gen-4.5 video
71853
71878
  KLING_API_KEY= # Kling video
@@ -72722,7 +72747,9 @@ async function runDiagnostics() {
72722
72747
  let readyCount = FREE_COMMANDS.length;
72723
72748
  let totalCount = FREE_COMMANDS.length;
72724
72749
  for (const [envVar, commands] of Object.entries(COMMAND_KEY_MAP)) {
72725
- const configured = !!process.env[envVar];
72750
+ const configured = Boolean(
72751
+ process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean)
72752
+ );
72726
72753
  const providerName = Object.entries(PROVIDER_ENV_VARS).find(([, v]) => v === envVar)?.[0] ?? envVar;
72727
72754
  providers[providerName] = { envVar, configured, commands };
72728
72755
  totalCount += commands.length;
@@ -73011,7 +73038,7 @@ async function runLiveKeyTests(results) {
73011
73038
  }
73012
73039
  const { testKey: testKey2 } = await Promise.resolve().then(() => (init_key_live_test(), key_live_test_exports));
73013
73040
  for (const [name, info] of configured) {
73014
- const value = process.env[info.envVar];
73041
+ const value = process.env[info.envVar] || PROVIDER_ENV_ALIASES[info.envVar]?.map((alias) => process.env[alias]).find(Boolean);
73015
73042
  if (!value) continue;
73016
73043
  process.stdout.write(` ${name.padEnd(12)} `);
73017
73044
  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.94.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.94.0",
187
+ "@vibeframe/core": "0.94.0"
188
188
  },
189
189
  "engines": {
190
190
  "node": ">=20"