@vibeframe/cli 0.90.0 → 0.91.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 +44 -20
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -14296,7 +14296,7 @@ function getCommandKeyMap() {
14296
14296
  function getSetupProviders() {
14297
14297
  return [...apiKeyRegistry.values()].filter((k) => k.showInSetup).map((k) => ({
14298
14298
  key: k.configKey,
14299
- name: k.label,
14299
+ name: getDisplayLabelForApiKey(k.configKey),
14300
14300
  env: k.envVar,
14301
14301
  desc: k.setupDescription ?? "",
14302
14302
  url: k.envExampleUrl
@@ -14308,6 +14308,16 @@ function getAllApiKeys() {
14308
14308
  function getKeyFormat(configKey) {
14309
14309
  return apiKeyRegistry.get(configKey)?.keyFormat;
14310
14310
  }
14311
+ function getDisplayLabelForApiKey(configKey) {
14312
+ const apiKey = apiKeyRegistry.get(configKey);
14313
+ if (!apiKey)
14314
+ return configKey;
14315
+ const provider = [...providerRegistry2.values()].find((p) => p.apiKey === configKey && p.displayName && p.gateway);
14316
+ if (provider?.displayName && provider.gateway) {
14317
+ return `${provider.displayName} (via ${provider.gateway})`;
14318
+ }
14319
+ return apiKey.label;
14320
+ }
14311
14321
  function getAllProviders() {
14312
14322
  return [...providerRegistry2.values()];
14313
14323
  }
@@ -24412,7 +24422,7 @@ var init_FalProvider = __esm({
24412
24422
  VALID_ASPECTS = ["21:9", "16:9", "4:3", "1:1", "3:4", "9:16", "auto"];
24413
24423
  FalProvider = class {
24414
24424
  constructor() {
24415
- this.id = "fal";
24425
+ this.id = "seedance";
24416
24426
  this.name = "fal.ai (Seedance 2.0)";
24417
24427
  this.description = "fal.ai hosting ByteDance Seedance 2.0 \u2014 Artificial Analysis #2 on both text-to-video and image-to-video leaderboards";
24418
24428
  this.capabilities = ["text-to-video", "image-to-video"];
@@ -24511,11 +24521,13 @@ var init_fal = __esm({
24511
24521
  init_FalProvider();
24512
24522
  init_define_provider();
24513
24523
  defineProvider({
24514
- id: "fal",
24515
- label: "fal.ai (Seedance 2.0)",
24524
+ id: "seedance",
24525
+ label: "Seedance 2.0",
24516
24526
  displayName: "Seedance 2.0",
24517
24527
  gateway: "fal.ai",
24518
- aliases: ["seedance"],
24528
+ // `fal` is a deprecated v0.x alias kept so existing scripts keep working.
24529
+ // Will be removed at the 1.0 cut (see docs/1.0-readiness.md).
24530
+ aliases: ["fal"],
24519
24531
  models: ["seedance-2.0", "seedance-2.0-fast"],
24520
24532
  capabilities: ["text-to-video", "image-to-video", "native-audio"],
24521
24533
  apiKey: "fal",
@@ -25216,6 +25228,7 @@ __export(dist_exports2, {
25216
25228
  getAllProviders: () => getAllProviders,
25217
25229
  getBestProviderForCapability: () => getBestProviderForCapability,
25218
25230
  getCommandKeyMap: () => getCommandKeyMap,
25231
+ getDisplayLabelForApiKey: () => getDisplayLabelForApiKey,
25219
25232
  getKeyFormat: () => getKeyFormat,
25220
25233
  getProviderEnvVars: () => getProviderEnvVars,
25221
25234
  getProvidersFor: () => getProvidersFor,
@@ -35484,9 +35497,9 @@ var init_ai_script_pipeline = __esm({
35484
35497
  import { resolve as resolve26 } from "node:path";
35485
35498
  import { readFile as readFile14, writeFile as writeFile24 } from "node:fs/promises";
35486
35499
  function registerVideoCommand(parent) {
35487
- parent.command("video").alias("vid").description("Generate video using AI (Seedance, Grok, Kling, Runway, or Veo)").argument("[prompt]", "Text prompt describing the video (interactive if omitted)").option("-p, --provider <provider>", "Provider: seedance (ByteDance Seedance 2.0 via fal.ai), grok, kling, runway, veo. `fal` is a backwards-compatible alias for seedance.").option("-k, --api-key <key>", "API key (or set FAL_KEY / XAI_API_KEY / RUNWAY_API_SECRET / KLING_API_KEY / GOOGLE_API_KEY env)").option("-o, --output <path>", "Output file path (downloads video)").option("-i, --image <path>", "Reference image for image-to-video").option(
35500
+ parent.command("video").alias("vid").description("Generate video using AI (Seedance, Grok, Kling, Runway, or Veo)").argument("[prompt]", "Text prompt describing the video (interactive if omitted)").option("-p, --provider <provider>", "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.").option("-k, --api-key <key>", "API key (or set FAL_KEY / XAI_API_KEY / RUNWAY_API_SECRET / KLING_API_KEY / GOOGLE_API_KEY env)").option("-o, --output <path>", "Output file path (downloads video)").option("-i, --image <path>", "Reference image for image-to-video").option(
35488
35501
  "-d, --duration <sec>",
35489
- "Duration in seconds. Seedance accepts 4-15 (`fal` alias supported); Kling accepts 5 or 10; Veo maps to 6 or 8.",
35502
+ "Duration in seconds. Seedance accepts 4-15; Kling accepts 5 or 10; Veo maps to 6 or 8.",
35490
35503
  "5"
35491
35504
  ).option("-r, --ratio <ratio>", "Aspect ratio: 16:9, 9:16, or 1:1 (auto-detected from image if omitted)").option("--seed <number>", "Random seed for reproducibility (Runway only)").option("--mode <mode>", "Generation mode: std or pro (Kling only)", "std").option("--seedance-model <model>", "Seedance variant: quality or fast (fal.ai only)", "quality").option("--negative <prompt>", "Negative prompt - what to avoid (Kling/Veo)").option("--resolution <res>", "Video resolution: 720p, 1080p, 4k (Veo only)").option("--last-frame <path>", "Last frame image for frame interpolation (Veo only)").option("--ref-images <paths...>", "Reference images for character consistency (Veo 3.1 only, max 3)").option("--person <mode>", "Person generation: allow_all, allow_adult (Veo only)").option("--veo-model <model>", "Veo model: 3.0, 3.1, 3.1-fast (default: 3.1-fast)", "3.1-fast").option("--runway-model <model>", "Runway model: gen4.5 (default, text+image-to-video), gen4_turbo (image-to-video only)", "gen4.5").option("--no-wait", "Start generation and return task ID without waiting").option("--dry-run", "Preview parameters without executing").addHelpText("after", `
35492
35505
  Examples:
@@ -35532,8 +35545,7 @@ Examples:
35532
35545
  veo: "GOOGLE_API_KEY",
35533
35546
  kling: "KLING_API_KEY",
35534
35547
  runway: "RUNWAY_API_SECRET",
35535
- seedance: "FAL_KEY",
35536
- fal: "FAL_KEY"
35548
+ seedance: "FAL_KEY"
35537
35549
  };
35538
35550
  let provider;
35539
35551
  if (options.provider) {
@@ -35542,9 +35554,17 @@ Examples:
35542
35554
  exitWithError(
35543
35555
  usageError(
35544
35556
  `Invalid provider: ${provider}`,
35545
- "Available providers: seedance, grok, kling, runway, veo. `fal` is a backwards-compatible alias for seedance."
35557
+ "Available providers: seedance, grok, kling, runway, veo. `fal` is a deprecated alias for seedance."
35558
+ )
35559
+ );
35560
+ }
35561
+ if (provider === "fal") {
35562
+ process.stderr.write(
35563
+ source_default.yellow(
35564
+ "Note: `-p fal` is a deprecated alias for `-p seedance` and will be removed in 1.0.\n"
35546
35565
  )
35547
35566
  );
35567
+ provider = "seedance";
35548
35568
  }
35549
35569
  if (videoEnvMap[provider] && !hasApiKey(videoEnvMap[provider]) && !options.apiKey) {
35550
35570
  const resolved = resolveProvider("video");
@@ -35605,7 +35625,7 @@ Examples:
35605
35625
  data: {
35606
35626
  params: {
35607
35627
  prompt: prompt3,
35608
- provider: provider === "fal" ? "seedance" : provider,
35628
+ provider,
35609
35629
  duration: options.duration,
35610
35630
  ratio: options.ratio,
35611
35631
  image: options.image,
@@ -35624,16 +35644,14 @@ Examples:
35624
35644
  kling: "KLING_API_KEY",
35625
35645
  veo: "GOOGLE_API_KEY",
35626
35646
  grok: "XAI_API_KEY",
35627
- seedance: "FAL_KEY",
35628
- fal: "FAL_KEY"
35647
+ seedance: "FAL_KEY"
35629
35648
  };
35630
35649
  const providerNameMap = {
35631
35650
  runway: "Runway",
35632
35651
  kling: "Kling",
35633
35652
  veo: "Veo",
35634
35653
  grok: "Grok",
35635
- seedance: "Seedance 2.0 via fal.ai",
35636
- fal: "Seedance 2.0 via fal.ai"
35654
+ seedance: "Seedance 2.0 via fal.ai"
35637
35655
  };
35638
35656
  const envKey = envKeyMap[provider];
35639
35657
  const providerName = providerNameMap[provider];
@@ -35852,7 +35870,7 @@ Examples:
35852
35870
  },
35853
35871
  3e5
35854
35872
  );
35855
- } else if (provider === "fal" || provider === "seedance") {
35873
+ } else if (provider === "seedance") {
35856
35874
  const fal = new FalProvider();
35857
35875
  await fal.initialize({ apiKey });
35858
35876
  let falImage = referenceImage;
@@ -62892,7 +62910,7 @@ init_source();
62892
62910
  // package.json
62893
62911
  var package_default = {
62894
62912
  name: "@vibeframe/cli",
62895
- version: "0.90.0",
62913
+ version: "0.91.0",
62896
62914
  description: "VibeFrame CLI - natural language video editing from the terminal",
62897
62915
  private: false,
62898
62916
  license: "MIT",
@@ -69976,7 +69994,7 @@ var AI_FEATURES = [
69976
69994
  desc: "generate + extend",
69977
69995
  defaultProvider: "Seedance 2.0 via fal.ai (Artificial Analysis #2 t2v + i2v, since v0.57)",
69978
69996
  alsoAvailable: "Grok Imagine, Kling, Runway Gen-4.5, Google Veo",
69979
- keys: [{ configKey: "fal", envVar: "FAL_KEY", name: "fal.ai", url: "https://fal.ai/dashboard/keys", what: "ByteDance Seedance 2.0 text-to-video and image-to-video" }],
69997
+ keys: [{ configKey: "fal", envVar: "FAL_KEY", name: "Seedance 2.0 (via fal.ai)", url: "https://fal.ai/dashboard/keys", what: "ByteDance Seedance 2.0 text-to-video and image-to-video" }],
69980
69998
  tryCommand: 'vibe generate video "ocean waves" -o waves.mp4'
69981
69999
  },
69982
70000
  {
@@ -71795,11 +71813,16 @@ function printReport(results, opts = { verbose: false }) {
71795
71813
  console.log(source_default.bold(" API Keys"));
71796
71814
  const configured = [];
71797
71815
  const missing = [];
71816
+ const labelFor = (configKey, fallbackEnv) => {
71817
+ const label = getDisplayLabelForApiKey(configKey);
71818
+ return label === configKey ? fallbackEnv : label;
71819
+ };
71798
71820
  for (const [name, info] of Object.entries(results.providers)) {
71799
71821
  if (info.configured) {
71800
71822
  configured.push(name);
71823
+ const label = labelFor(name, info.envVar);
71801
71824
  console.log(
71802
- ` ${source_default.green("OK")} ${info.envVar.padEnd(24)} ${source_default.dim(info.commands.join(", "))}`
71825
+ ` ${source_default.green("OK")} ${label.padEnd(28)} ${source_default.dim(info.envVar.padEnd(20))} ${source_default.dim(info.commands.join(", "))}`
71803
71826
  );
71804
71827
  } else {
71805
71828
  missing.push(name);
@@ -71809,8 +71832,9 @@ function printReport(results, opts = { verbose: false }) {
71809
71832
  if (verbose) {
71810
71833
  for (const name of missing) {
71811
71834
  const info = results.providers[name];
71835
+ const label = labelFor(name, info.envVar);
71812
71836
  console.log(
71813
- ` ${source_default.red("--")} ${info.envVar.padEnd(24)} ${source_default.dim(info.commands.join(", "))}`
71837
+ ` ${source_default.red("--")} ${label.padEnd(28)} ${source_default.dim(info.envVar.padEnd(20))} ${source_default.dim(info.commands.join(", "))}`
71814
71838
  );
71815
71839
  }
71816
71840
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/cli",
3
- "version": "0.90.0",
3
+ "version": "0.91.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/ai-providers": "0.90.0",
187
- "@vibeframe/core": "0.90.0"
186
+ "@vibeframe/ai-providers": "0.91.0",
187
+ "@vibeframe/core": "0.91.0"
188
188
  },
189
189
  "engines": {
190
190
  "node": ">=20"