@vibeframe/cli 0.87.0 → 0.88.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 +149 -72
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -26435,6 +26435,45 @@ var init_scene_project = __esm({
26435
26435
  }
26436
26436
  });
26437
26437
 
26438
+ // src/commands/_shared/cost-tier.ts
26439
+ function applyTier(cmd, tier) {
26440
+ cmd[COST_TIER_KEY] = tier;
26441
+ const colored = TIER_COLOR[tier](`Cost: ${tier} (${TIER_DESCRIPTION[tier]})`);
26442
+ cmd.addHelpText("after", `
26443
+ ${colored}
26444
+ `);
26445
+ return cmd;
26446
+ }
26447
+ function getCostTier(cmd) {
26448
+ return cmd[COST_TIER_KEY];
26449
+ }
26450
+ function applyTiers(parent, tiers) {
26451
+ for (const cmd of parent.commands) {
26452
+ const tier = tiers[cmd.name()];
26453
+ if (tier) applyTier(cmd, tier);
26454
+ }
26455
+ }
26456
+ var TIER_DESCRIPTION, TIER_COLOR, COST_TIER_KEY;
26457
+ var init_cost_tier = __esm({
26458
+ "src/commands/_shared/cost-tier.ts"() {
26459
+ "use strict";
26460
+ init_source();
26461
+ TIER_DESCRIPTION = {
26462
+ "free": "FFmpeg only, no API call",
26463
+ "low": "$0.01\u2013$0.10 per call",
26464
+ "high": "$1\u2013$5 per call",
26465
+ "very-high": "$5\u2013$50+ per call"
26466
+ };
26467
+ TIER_COLOR = {
26468
+ "free": source_default.green,
26469
+ "low": source_default.cyan,
26470
+ "high": source_default.yellow,
26471
+ "very-high": source_default.red
26472
+ };
26473
+ COST_TIER_KEY = Symbol.for("@vibeframe/cli.costTier");
26474
+ }
26475
+ });
26476
+
26438
26477
  // src/commands/_shared/visual-styles.ts
26439
26478
  function listVisualStyles() {
26440
26479
  return STYLES;
@@ -29468,6 +29507,7 @@ var init_scene = __esm({
29468
29507
  init_dist2();
29469
29508
  init_tts_resolve();
29470
29509
  init_scene_project();
29510
+ init_cost_tier();
29471
29511
  init_visual_styles();
29472
29512
  init_scene_html_emit();
29473
29513
  init_scene_lint();
@@ -29833,6 +29873,13 @@ Run 'vibe schema scene.<command>' for structured parameter info.`);
29833
29873
  }
29834
29874
  if (!result.ok) process.exitCode = 1;
29835
29875
  });
29876
+ applyTiers(sceneCommand, {
29877
+ "add": "free",
29878
+ "compose-prompts": "free",
29879
+ "install-skill": "free",
29880
+ "lint": "free",
29881
+ "list-styles": "free"
29882
+ });
29836
29883
  }
29837
29884
  });
29838
29885
 
@@ -35862,45 +35909,6 @@ var init_video = __esm({
35862
35909
  }
35863
35910
  });
35864
35911
 
35865
- // src/commands/_shared/cost-tier.ts
35866
- function applyTier(cmd, tier) {
35867
- cmd[COST_TIER_KEY] = tier;
35868
- const colored = TIER_COLOR[tier](`Cost: ${tier} (${TIER_DESCRIPTION[tier]})`);
35869
- cmd.addHelpText("after", `
35870
- ${colored}
35871
- `);
35872
- return cmd;
35873
- }
35874
- function getCostTier(cmd) {
35875
- return cmd[COST_TIER_KEY];
35876
- }
35877
- function applyTiers(parent, tiers) {
35878
- for (const cmd of parent.commands) {
35879
- const tier = tiers[cmd.name()];
35880
- if (tier) applyTier(cmd, tier);
35881
- }
35882
- }
35883
- var TIER_DESCRIPTION, TIER_COLOR, COST_TIER_KEY;
35884
- var init_cost_tier = __esm({
35885
- "src/commands/_shared/cost-tier.ts"() {
35886
- "use strict";
35887
- init_source();
35888
- TIER_DESCRIPTION = {
35889
- "free": "FFmpeg only, no API call",
35890
- "low": "$0.01\u2013$0.10 per call",
35891
- "high": "$1\u2013$5 per call",
35892
- "very-high": "$5\u2013$50+ per call"
35893
- };
35894
- TIER_COLOR = {
35895
- "free": source_default.green,
35896
- "low": source_default.cyan,
35897
- "high": source_default.yellow,
35898
- "very-high": source_default.red
35899
- };
35900
- COST_TIER_KEY = Symbol.for("@vibeframe/cli.costTier");
35901
- }
35902
- });
35903
-
35904
35912
  // src/commands/generate.ts
35905
35913
  var generate_exports = {};
35906
35914
  __export(generate_exports, {
@@ -62837,7 +62845,7 @@ init_source();
62837
62845
  // package.json
62838
62846
  var package_default = {
62839
62847
  name: "@vibeframe/cli",
62840
- version: "0.87.0",
62848
+ version: "0.88.0",
62841
62849
  description: "VibeFrame CLI - natural language video editing from the terminal",
62842
62850
  private: false,
62843
62851
  license: "MIT",
@@ -63277,6 +63285,7 @@ init_ora();
63277
63285
  init_engine();
63278
63286
  init_validate();
63279
63287
  init_output();
63288
+ init_cost_tier();
63280
63289
  init_project_resolver();
63281
63290
  import { readFile as readFile9, writeFile as writeFile9 } from "node:fs/promises";
63282
63291
  import { existsSync as existsSync8 } from "node:fs";
@@ -63987,6 +63996,21 @@ function detectMediaType(path2) {
63987
63996
  if (ext === ".lottie") return "lottie";
63988
63997
  return "video";
63989
63998
  }
63999
+ applyTiers(timelineCommand, {
64000
+ "create": "free",
64001
+ "info": "free",
64002
+ "set": "free",
64003
+ "list": "free",
64004
+ "add-source": "free",
64005
+ "add-clip": "free",
64006
+ "add-track": "free",
64007
+ "add-effect": "free",
64008
+ "trim-clip": "free",
64009
+ "split-clip": "free",
64010
+ "duplicate-clip": "free",
64011
+ "delete-clip": "free",
64012
+ "move-clip": "free"
64013
+ });
63990
64014
 
63991
64015
  // src/index.ts
63992
64016
  init_generate();
@@ -69218,6 +69242,7 @@ async function parseFile(filePath, options = {}) {
69218
69242
 
69219
69243
  // src/commands/media.ts
69220
69244
  init_output();
69245
+ init_cost_tier();
69221
69246
  var mediaCommand = new Command("media").description("Media file utilities");
69222
69247
  mediaCommand.command("info").description("Get media file information").argument("<file>", "Media file path").action(async (file) => {
69223
69248
  const spinner2 = ora("Analyzing media...").start();
@@ -69352,6 +69377,10 @@ function formatBitrate(bps) {
69352
69377
  }
69353
69378
  return `${(bps / 1e3).toFixed(0)} kbps`;
69354
69379
  }
69380
+ applyTiers(mediaCommand, {
69381
+ "info": "free",
69382
+ "duration": "free"
69383
+ });
69355
69384
 
69356
69385
  // src/commands/batch.ts
69357
69386
  init_esm();
@@ -69359,6 +69388,7 @@ init_source();
69359
69388
  init_ora();
69360
69389
  init_engine();
69361
69390
  init_output();
69391
+ init_cost_tier();
69362
69392
  import { readFile as readFile27, writeFile as writeFile35, readdir as readdir2 } from "node:fs/promises";
69363
69393
  import { resolve as resolve40, basename as basename13, extname as extname10, join as join10 } from "node:path";
69364
69394
  var batchCommand = new Command("batch").description("Batch operations for processing multiple items");
@@ -69721,6 +69751,13 @@ batchCommand.command("info").description("Show batch processing statistics").arg
69721
69751
  exitWithError(generalError(`Failed to load project: ${msg}`));
69722
69752
  }
69723
69753
  });
69754
+ applyTiers(batchCommand, {
69755
+ "import": "free",
69756
+ "concat": "free",
69757
+ "apply-effect": "free",
69758
+ "remove-clips": "free",
69759
+ "info": "free"
69760
+ });
69724
69761
 
69725
69762
  // src/index.ts
69726
69763
  init_detect();
@@ -71664,24 +71701,28 @@ function printReport(results, opts = { verbose: false }) {
71664
71701
  console.log();
71665
71702
  const pct = Math.round(results.readyCount / results.totalCount * 100);
71666
71703
  const readyColor = pct >= 80 ? source_default.green : pct >= 40 ? source_default.yellow : source_default.red;
71704
+ let catalogTotal = 0;
71705
+ let tierCounts = { "free": 0, "low": 0, "high": 0, "very-high": 0 };
71706
+ if (program3) {
71707
+ catalogTotal = countCatalog(program3);
71708
+ tierCounts = countCostTiers(program3);
71709
+ }
71710
+ const taggedTotal = tierCounts.free + tierCounts.low + tierCounts.high + tierCounts["very-high"];
71711
+ console.log(source_default.bold(" Catalog"));
71712
+ if (catalogTotal > 0) {
71713
+ console.log(` Total commands ${source_default.bold(catalogTotal)} ${source_default.dim("(see: vibe schema --list)")}`);
71714
+ }
71667
71715
  console.log(
71668
- ` Ready: ${readyColor(`${results.readyCount}/${results.totalCount}`)} commands runnable with current keys (${pct}%)`
71669
- );
71670
- console.log(
71671
- source_default.dim(` Full command catalog: vibe schema --list`)
71716
+ ` Runnable with keys ${readyColor(`${results.readyCount}/${results.totalCount}`)} ${source_default.dim(`(${pct}%)`)}`
71672
71717
  );
71673
- if (program3) {
71674
- const tierCounts = countCostTiers(program3);
71675
- const total = tierCounts.free + tierCounts.low + tierCounts.high + tierCounts["very-high"];
71676
- if (total > 0) {
71677
- const parts = [
71678
- `${TIER_COLOR.free(`${tierCounts.free} free`)}`,
71679
- `${TIER_COLOR.low(`${tierCounts.low} low`)}`,
71680
- `${TIER_COLOR.high(`${tierCounts.high} high`)}`,
71681
- `${TIER_COLOR["very-high"](`${tierCounts["very-high"]} very-high`)}`
71682
- ];
71683
- console.log(source_default.dim(` Cost mix:`) + ` ${parts.join(source_default.dim(", "))}`);
71684
- }
71718
+ if (taggedTotal > 0) {
71719
+ const parts = [
71720
+ `${TIER_COLOR.free(`${tierCounts.free} free`)}`,
71721
+ `${TIER_COLOR.low(`${tierCounts.low} low`)}`,
71722
+ `${TIER_COLOR.high(`${tierCounts.high} high`)}`,
71723
+ `${TIER_COLOR["very-high"](`${tierCounts["very-high"]} very-high`)}`
71724
+ ];
71725
+ console.log(` Cost-tagged ${source_default.bold(taggedTotal)} ${parts.join(source_default.dim(", "))}`);
71685
71726
  }
71686
71727
  const nextStep = pickNextStep(results, missing.length > 0);
71687
71728
  if (nextStep) {
@@ -71689,6 +71730,26 @@ function printReport(results, opts = { verbose: false }) {
71689
71730
  }
71690
71731
  console.log();
71691
71732
  }
71733
+ function countCatalog(program3) {
71734
+ let count = 0;
71735
+ const skipTopLevel = /* @__PURE__ */ new Set(["help", "schema"]);
71736
+ for (const top of program3.commands) {
71737
+ if (skipTopLevel.has(top.name())) continue;
71738
+ const subCmds = top.commands;
71739
+ if (subCmds.length === 0) {
71740
+ const desc = top.description() || "";
71741
+ if (desc.toLowerCase().includes("deprecated")) continue;
71742
+ count++;
71743
+ continue;
71744
+ }
71745
+ for (const sub of subCmds) {
71746
+ const desc = sub.description() || "";
71747
+ if (desc.toLowerCase().includes("deprecated")) continue;
71748
+ count++;
71749
+ }
71750
+ }
71751
+ return count;
71752
+ }
71692
71753
  function countCostTiers(program3) {
71693
71754
  const counts = {
71694
71755
  "free": 0,
@@ -72771,7 +72832,14 @@ async function promptConfirm2(toolName, args, cost) {
72771
72832
  "high": source_default.yellow,
72772
72833
  "very-high": source_default.red
72773
72834
  };
72774
- const costBadge = cost ? ` ${tierColor[cost](`[${cost.toUpperCase()}]`)}` : "";
72835
+ const tierUsd = {
72836
+ "free": "$0",
72837
+ "low": "~$0.05",
72838
+ "medium": "~$0.50",
72839
+ "high": "~$3",
72840
+ "very-high": "~$25"
72841
+ };
72842
+ const costBadge = cost ? ` ${tierColor[cost](`[${cost.toUpperCase()} ${tierUsd[cost]}]`)}` : "";
72775
72843
  console.log();
72776
72844
  console.log(source_default.yellow(`Execute ${source_default.bold(toolName)}?${costBadge}`));
72777
72845
  console.log(source_default.dim(argsStr));
@@ -72988,7 +73056,7 @@ async function startAgent(options = {}) {
72988
73056
  rl.prompt();
72989
73057
  });
72990
73058
  }
72991
- var agentCommand = new Command("agent").description("Start the AI agent with natural language interface").option("-p, --provider <provider>", "LLM provider (openai, claude, gemini, ollama, xai, openrouter)", "openai").option("-m, --model <model>", "Model to use (provider-specific)").option("--project <path>", "Timeline file or directory to load").option("-v, --verbose", "Show verbose output including tool calls").option("--max-turns <n>", "Maximum turns per request", "10").option("-i, --input <query>", "Run a single query and exit (non-interactive)").option("-c, --confirm", "Confirm before EVERY tool execution (overrides cost gate)").option("--no-confirm", "Disable all confirm prompts including the high/very-high cost gate (CI / automation)").option("--budget-usd <usd>", "Reject tool calls past this cumulative USD ceiling (tier-estimated, conservative)").action(async (options) => {
73059
+ var agentCommand = new Command("agent").description("Start the AI agent with natural language interface").option("-p, --provider <provider>", "LLM provider (openai, claude, gemini, ollama, xai, openrouter)", "openai").option("-m, --model <model>", "Model to use (provider-specific)").option("--project <path>", "Timeline file or directory to load").option("-v, --verbose", "Show verbose output including tool calls").option("--max-turns <n>", "Maximum turns per request", "10").option("-i, --input <query>", "Run a single query and exit (non-interactive)").option("-c, --confirm", "Confirm before every tool \u2014 broadens the default cost gate (paid only) to all calls").option("--no-confirm", "Disable all confirm prompts including the high/very-high cost gate (CI / automation)").option("--budget-usd <usd>", "Reject tool calls past this cumulative USD ceiling (tier-estimated, conservative)").action(async (options) => {
72992
73060
  await startAgent(options);
72993
73061
  });
72994
73062
  function getEnvVar(provider) {
@@ -73154,10 +73222,29 @@ function rejectControlChars2(value, fieldName = "input") {
73154
73222
  }
73155
73223
 
73156
73224
  // src/index.ts
73225
+ init_cost_tier();
73157
73226
  init_config();
73158
73227
  if (process.env.VIBE_DEBUG === "1") {
73159
73228
  console.log("[CLI] Script started, loading modules...");
73160
73229
  }
73230
+ function renderCostTierFooter(prog) {
73231
+ const buckets = { free: [], low: [], high: [], "very-high": [] };
73232
+ const walk = (cmd, prefix) => {
73233
+ const tier = getCostTier(cmd);
73234
+ if (tier) buckets[tier].push(prefix ? `${prefix}.${cmd.name()}` : cmd.name());
73235
+ for (const child of cmd.commands) walk(child, prefix ? `${prefix}.${cmd.name()}` : cmd.name());
73236
+ };
73237
+ for (const top of prog.commands) walk(top, "");
73238
+ const order = ["free", "low", "high", "very-high"];
73239
+ const lines = ["Cost tiers (`vibe --describe <cmd>` for the per-command tag):"];
73240
+ for (const tier of order) {
73241
+ const examples = buckets[tier].slice(0, 3).join(", ");
73242
+ if (!examples) continue;
73243
+ const label = tier === "very-high" ? "V.High" : tier[0].toUpperCase() + tier.slice(1);
73244
+ lines.push(` ${label.padEnd(7)}${examples.padEnd(50)} ${TIER_DESCRIPTION[tier]}`);
73245
+ }
73246
+ return "\n" + lines.join("\n") + "\n";
73247
+ }
73161
73248
  async function readStdin() {
73162
73249
  const chunks = [];
73163
73250
  for await (const chunk of process.stdin) {
@@ -73197,10 +73284,6 @@ this section shows the typical entry points by use case):
73197
73284
  vibe inspect media clip.mp4 "Summarize this"
73198
73285
  vibe remix highlights long.mp4 -d 60
73199
73286
 
73200
- Authoring:
73201
- vibe timeline create my-video Low-level timeline JSON
73202
- vibe scene add intro --headline "Welcome"
73203
-
73204
73287
  Automation & agents:
73205
73288
  vibe run workflow.yaml Video-as-YAML pipeline
73206
73289
  vibe agent Natural-language interface
@@ -73209,14 +73292,8 @@ this section shows the typical entry points by use case):
73209
73292
 
73210
73293
  Common-flag note: most commands accept --dry-run to preview cost/output
73211
73294
  before invoking paid providers.
73212
-
73213
- Cost tiers:
73214
- Free detect, edit (silence-cut/fade/noise-reduce), timeline
73215
- Low inspect, audio transcribe, generate image ~$0.01\u2013$0.10
73216
- High generate video, edit image ~$1\u2013$5
73217
- V.High remix (regenerate-scene, highlights, auto-shorts) ~$5\u2013$50+
73218
73295
  `
73219
- );
73296
+ ).addHelpText("after", () => renderCostTierFooter(program2));
73220
73297
  program2.hook("preAction", async (thisCommand, actionCommand) => {
73221
73298
  const opts = program2.opts();
73222
73299
  if (opts.json || !process.stdout.isTTY && !process.env.VIBE_HUMAN_OUTPUT) {
@@ -73287,9 +73364,9 @@ program2.addCommand(doctorCommand);
73287
73364
  program2.addCommand(demoCommand);
73288
73365
  program2.addCommand(runCommand);
73289
73366
  program2.addCommand(agentCommand);
73290
- program2.addCommand(projectCommand);
73291
- program2.addCommand(sceneCommand);
73292
- program2.addCommand(timelineCommand);
73367
+ program2.addCommand(projectCommand, { hidden: true });
73368
+ program2.addCommand(sceneCommand, { hidden: true });
73369
+ program2.addCommand(timelineCommand, { hidden: true });
73293
73370
  program2.addCommand(detectCommand);
73294
73371
  program2.addCommand(batchCommand);
73295
73372
  program2.addCommand(schemaCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/cli",
3
- "version": "0.87.0",
3
+ "version": "0.88.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.87.0",
187
- "@vibeframe/core": "0.87.0"
186
+ "@vibeframe/ai-providers": "0.88.0",
187
+ "@vibeframe/core": "0.88.0"
188
188
  },
189
189
  "engines": {
190
190
  "node": ">=20"