@vibeframe/cli 0.86.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.
- package/dist/index.js +185 -100
- 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.
|
|
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();
|
|
@@ -65122,13 +65146,20 @@ applyTiers(remixCommand, {
|
|
|
65122
65146
|
init_esm();
|
|
65123
65147
|
init_output();
|
|
65124
65148
|
init_cost_tier();
|
|
65125
|
-
var schemaCommand = new Command("schema").description("Show JSON schema for a CLI command").argument("[command]", "Command path (e.g., generate.image, edit.silence-cut)").option("--list", "List all available command paths").action((commandPath, options) => {
|
|
65149
|
+
var schemaCommand = new Command("schema").description("Show JSON schema for a CLI command").argument("[command]", "Command path (e.g., generate.image, edit.silence-cut)").option("--list", "List all available command paths").option("--filter <tier>", "With --list, only show commands at the given cost tier (free | low | high | very-high)").action((commandPath, options) => {
|
|
65126
65150
|
const program3 = schemaCommand.parent;
|
|
65127
65151
|
if (!program3) {
|
|
65128
65152
|
exitWithError(generalError("Schema command must be registered on a program"));
|
|
65129
65153
|
}
|
|
65130
65154
|
if (options.list || !commandPath) {
|
|
65131
|
-
|
|
65155
|
+
const validTiers = /* @__PURE__ */ new Set(["free", "low", "high", "very-high"]);
|
|
65156
|
+
if (options.filter && !validTiers.has(options.filter)) {
|
|
65157
|
+
exitWithError(usageError(
|
|
65158
|
+
`Invalid --filter: ${options.filter}`,
|
|
65159
|
+
`Must be one of: free, low, high, very-high (matches the cost field on each subcommand).`
|
|
65160
|
+
));
|
|
65161
|
+
}
|
|
65162
|
+
listCommands(program3, options.filter);
|
|
65132
65163
|
return;
|
|
65133
65164
|
}
|
|
65134
65165
|
const parts = commandPath.split(".");
|
|
@@ -65168,7 +65199,7 @@ var schemaCommand = new Command("schema").description("Show JSON schema for a CL
|
|
|
65168
65199
|
const schema = buildSchema(actionCmd, toolName);
|
|
65169
65200
|
console.log(JSON.stringify(schema, null, 2));
|
|
65170
65201
|
});
|
|
65171
|
-
function listCommands(program3) {
|
|
65202
|
+
function listCommands(program3, filter) {
|
|
65172
65203
|
const commands = [];
|
|
65173
65204
|
const skipTopLevel = /* @__PURE__ */ new Set(["help", "schema"]);
|
|
65174
65205
|
for (const group of program3.commands) {
|
|
@@ -65179,6 +65210,7 @@ function listCommands(program3) {
|
|
|
65179
65210
|
const desc = group.description() || "";
|
|
65180
65211
|
if (desc.toLowerCase().includes("deprecated")) continue;
|
|
65181
65212
|
const cost = getCostTier(group);
|
|
65213
|
+
if (filter && cost !== filter) continue;
|
|
65182
65214
|
commands.push({ path: name, description: desc, ...cost ? { cost } : {} });
|
|
65183
65215
|
continue;
|
|
65184
65216
|
}
|
|
@@ -65186,6 +65218,7 @@ function listCommands(program3) {
|
|
|
65186
65218
|
const desc = sub.description() || "";
|
|
65187
65219
|
if (desc.toLowerCase().includes("deprecated")) continue;
|
|
65188
65220
|
const cost = getCostTier(sub);
|
|
65221
|
+
if (filter && cost !== filter) continue;
|
|
65189
65222
|
commands.push({
|
|
65190
65223
|
path: `${name}.${sub.name()}`,
|
|
65191
65224
|
description: desc,
|
|
@@ -69209,6 +69242,7 @@ async function parseFile(filePath, options = {}) {
|
|
|
69209
69242
|
|
|
69210
69243
|
// src/commands/media.ts
|
|
69211
69244
|
init_output();
|
|
69245
|
+
init_cost_tier();
|
|
69212
69246
|
var mediaCommand = new Command("media").description("Media file utilities");
|
|
69213
69247
|
mediaCommand.command("info").description("Get media file information").argument("<file>", "Media file path").action(async (file) => {
|
|
69214
69248
|
const spinner2 = ora("Analyzing media...").start();
|
|
@@ -69343,6 +69377,10 @@ function formatBitrate(bps) {
|
|
|
69343
69377
|
}
|
|
69344
69378
|
return `${(bps / 1e3).toFixed(0)} kbps`;
|
|
69345
69379
|
}
|
|
69380
|
+
applyTiers(mediaCommand, {
|
|
69381
|
+
"info": "free",
|
|
69382
|
+
"duration": "free"
|
|
69383
|
+
});
|
|
69346
69384
|
|
|
69347
69385
|
// src/commands/batch.ts
|
|
69348
69386
|
init_esm();
|
|
@@ -69350,6 +69388,7 @@ init_source();
|
|
|
69350
69388
|
init_ora();
|
|
69351
69389
|
init_engine();
|
|
69352
69390
|
init_output();
|
|
69391
|
+
init_cost_tier();
|
|
69353
69392
|
import { readFile as readFile27, writeFile as writeFile35, readdir as readdir2 } from "node:fs/promises";
|
|
69354
69393
|
import { resolve as resolve40, basename as basename13, extname as extname10, join as join10 } from "node:path";
|
|
69355
69394
|
var batchCommand = new Command("batch").description("Batch operations for processing multiple items");
|
|
@@ -69712,6 +69751,13 @@ batchCommand.command("info").description("Show batch processing statistics").arg
|
|
|
69712
69751
|
exitWithError(generalError(`Failed to load project: ${msg}`));
|
|
69713
69752
|
}
|
|
69714
69753
|
});
|
|
69754
|
+
applyTiers(batchCommand, {
|
|
69755
|
+
"import": "free",
|
|
69756
|
+
"concat": "free",
|
|
69757
|
+
"apply-effect": "free",
|
|
69758
|
+
"remove-clips": "free",
|
|
69759
|
+
"info": "free"
|
|
69760
|
+
});
|
|
69715
69761
|
|
|
69716
69762
|
// src/index.ts
|
|
69717
69763
|
init_detect();
|
|
@@ -71655,24 +71701,28 @@ function printReport(results, opts = { verbose: false }) {
|
|
|
71655
71701
|
console.log();
|
|
71656
71702
|
const pct = Math.round(results.readyCount / results.totalCount * 100);
|
|
71657
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
|
+
}
|
|
71658
71715
|
console.log(
|
|
71659
|
-
`
|
|
71660
|
-
);
|
|
71661
|
-
console.log(
|
|
71662
|
-
source_default.dim(` Full command catalog: vibe schema --list`)
|
|
71716
|
+
` Runnable with keys ${readyColor(`${results.readyCount}/${results.totalCount}`)} ${source_default.dim(`(${pct}%)`)}`
|
|
71663
71717
|
);
|
|
71664
|
-
if (
|
|
71665
|
-
const
|
|
71666
|
-
|
|
71667
|
-
|
|
71668
|
-
|
|
71669
|
-
|
|
71670
|
-
|
|
71671
|
-
|
|
71672
|
-
`${TIER_COLOR["very-high"](`${tierCounts["very-high"]} very-high`)}`
|
|
71673
|
-
];
|
|
71674
|
-
console.log(source_default.dim(` Cost mix:`) + ` ${parts.join(source_default.dim(", "))}`);
|
|
71675
|
-
}
|
|
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(", "))}`);
|
|
71676
71726
|
}
|
|
71677
71727
|
const nextStep = pickNextStep(results, missing.length > 0);
|
|
71678
71728
|
if (nextStep) {
|
|
@@ -71680,6 +71730,26 @@ function printReport(results, opts = { verbose: false }) {
|
|
|
71680
71730
|
}
|
|
71681
71731
|
console.log();
|
|
71682
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
|
+
}
|
|
71683
71753
|
function countCostTiers(program3) {
|
|
71684
71754
|
const counts = {
|
|
71685
71755
|
"free": 0,
|
|
@@ -72084,18 +72154,27 @@ Run 'vibe schema run' for structured parameter info.
|
|
|
72084
72154
|
} else {
|
|
72085
72155
|
console.log(source_default.bold(" Execution Plan:"));
|
|
72086
72156
|
console.log();
|
|
72157
|
+
let totalMax = 0;
|
|
72087
72158
|
for (let i = 0; i < result2.steps.length; i++) {
|
|
72088
72159
|
const step = result2.steps[i];
|
|
72089
72160
|
const est = step.data?.estimatedCost;
|
|
72161
|
+
if (typeof est === "string") {
|
|
72162
|
+
const m = est.match(/\$([\d.]+)/);
|
|
72163
|
+
if (m) totalMax += parseFloat(m[1]);
|
|
72164
|
+
}
|
|
72090
72165
|
const costTag = est ? source_default.dim(` ~${est}`) : "";
|
|
72091
72166
|
console.log(` ${source_default.dim(`${i + 1}.`)} ${source_default.bold(step.id)} ${source_default.dim(`\u2192 ${step.action}`)}${costTag}`);
|
|
72092
72167
|
}
|
|
72093
|
-
if (
|
|
72168
|
+
if (totalMax > 0) {
|
|
72094
72169
|
console.log();
|
|
72095
|
-
console.log(source_default.dim(` Total upper-bound: $${
|
|
72170
|
+
console.log(source_default.dim(` Total upper-bound: $${totalMax.toFixed(2)}`) + source_default.dim(` (sum of per-step ceilings)`));
|
|
72171
|
+
}
|
|
72172
|
+
if (result2.budget) {
|
|
72096
72173
|
if (result2.budget.abortedBy) {
|
|
72097
72174
|
console.log(source_default.yellow(` \u26A0 Budget ceiling exceeded (${result2.budget.abortedBy}) \u2014 execution will abort.`));
|
|
72098
72175
|
}
|
|
72176
|
+
} else if (totalMax > 0) {
|
|
72177
|
+
console.log(source_default.dim(` Tip: cap with --budget-usd ${Math.ceil(totalMax)} to abort if cost exceeds the estimate.`));
|
|
72099
72178
|
}
|
|
72100
72179
|
console.log();
|
|
72101
72180
|
console.log(source_default.dim(" Run without --dry-run to execute."));
|
|
@@ -72745,30 +72824,27 @@ init_tty();
|
|
|
72745
72824
|
init_api_key();
|
|
72746
72825
|
init_output();
|
|
72747
72826
|
async function promptConfirm2(toolName, args, cost) {
|
|
72748
|
-
const
|
|
72749
|
-
const
|
|
72750
|
-
|
|
72751
|
-
|
|
72752
|
-
|
|
72753
|
-
|
|
72754
|
-
|
|
72755
|
-
|
|
72756
|
-
|
|
72757
|
-
|
|
72758
|
-
|
|
72759
|
-
|
|
72760
|
-
|
|
72761
|
-
|
|
72762
|
-
|
|
72763
|
-
|
|
72764
|
-
|
|
72765
|
-
|
|
72766
|
-
|
|
72767
|
-
|
|
72768
|
-
|
|
72769
|
-
resolve64(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
|
|
72770
|
-
});
|
|
72771
|
-
});
|
|
72827
|
+
const argsStr = JSON.stringify(args, null, 2);
|
|
72828
|
+
const tierColor = {
|
|
72829
|
+
"free": source_default.green,
|
|
72830
|
+
"low": source_default.cyan,
|
|
72831
|
+
"medium": source_default.yellow,
|
|
72832
|
+
"high": source_default.yellow,
|
|
72833
|
+
"very-high": source_default.red
|
|
72834
|
+
};
|
|
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]}]`)}` : "";
|
|
72843
|
+
console.log();
|
|
72844
|
+
console.log(source_default.yellow(`Execute ${source_default.bold(toolName)}?${costBadge}`));
|
|
72845
|
+
console.log(source_default.dim(argsStr));
|
|
72846
|
+
const defaultYes = cost !== "very-high";
|
|
72847
|
+
return promptConfirm("", defaultYes);
|
|
72772
72848
|
}
|
|
72773
72849
|
async function startAgent(options = {}) {
|
|
72774
72850
|
const isNonInteractive = !!options.input;
|
|
@@ -72980,7 +73056,7 @@ async function startAgent(options = {}) {
|
|
|
72980
73056
|
rl.prompt();
|
|
72981
73057
|
});
|
|
72982
73058
|
}
|
|
72983
|
-
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
|
|
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) => {
|
|
72984
73060
|
await startAgent(options);
|
|
72985
73061
|
});
|
|
72986
73062
|
function getEnvVar(provider) {
|
|
@@ -73146,10 +73222,29 @@ function rejectControlChars2(value, fieldName = "input") {
|
|
|
73146
73222
|
}
|
|
73147
73223
|
|
|
73148
73224
|
// src/index.ts
|
|
73225
|
+
init_cost_tier();
|
|
73149
73226
|
init_config();
|
|
73150
73227
|
if (process.env.VIBE_DEBUG === "1") {
|
|
73151
73228
|
console.log("[CLI] Script started, loading modules...");
|
|
73152
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
|
+
}
|
|
73153
73248
|
async function readStdin() {
|
|
73154
73249
|
const chunks = [];
|
|
73155
73250
|
for await (const chunk of process.stdin) {
|
|
@@ -73189,10 +73284,6 @@ this section shows the typical entry points by use case):
|
|
|
73189
73284
|
vibe inspect media clip.mp4 "Summarize this"
|
|
73190
73285
|
vibe remix highlights long.mp4 -d 60
|
|
73191
73286
|
|
|
73192
|
-
Authoring:
|
|
73193
|
-
vibe timeline create my-video Low-level timeline JSON
|
|
73194
|
-
vibe scene add intro --headline "Welcome"
|
|
73195
|
-
|
|
73196
73287
|
Automation & agents:
|
|
73197
73288
|
vibe run workflow.yaml Video-as-YAML pipeline
|
|
73198
73289
|
vibe agent Natural-language interface
|
|
@@ -73201,14 +73292,8 @@ this section shows the typical entry points by use case):
|
|
|
73201
73292
|
|
|
73202
73293
|
Common-flag note: most commands accept --dry-run to preview cost/output
|
|
73203
73294
|
before invoking paid providers.
|
|
73204
|
-
|
|
73205
|
-
Cost tiers:
|
|
73206
|
-
Free detect, edit (silence-cut/fade/noise-reduce), timeline
|
|
73207
|
-
Low inspect, audio transcribe, generate image ~$0.01\u2013$0.10
|
|
73208
|
-
High generate video, edit image ~$1\u2013$5
|
|
73209
|
-
V.High remix (regenerate-scene, highlights, auto-shorts) ~$5\u2013$50+
|
|
73210
73295
|
`
|
|
73211
|
-
);
|
|
73296
|
+
).addHelpText("after", () => renderCostTierFooter(program2));
|
|
73212
73297
|
program2.hook("preAction", async (thisCommand, actionCommand) => {
|
|
73213
73298
|
const opts = program2.opts();
|
|
73214
73299
|
if (opts.json || !process.stdout.isTTY && !process.env.VIBE_HUMAN_OUTPUT) {
|
|
@@ -73279,9 +73364,9 @@ program2.addCommand(doctorCommand);
|
|
|
73279
73364
|
program2.addCommand(demoCommand);
|
|
73280
73365
|
program2.addCommand(runCommand);
|
|
73281
73366
|
program2.addCommand(agentCommand);
|
|
73282
|
-
program2.addCommand(projectCommand);
|
|
73283
|
-
program2.addCommand(sceneCommand);
|
|
73284
|
-
program2.addCommand(timelineCommand);
|
|
73367
|
+
program2.addCommand(projectCommand, { hidden: true });
|
|
73368
|
+
program2.addCommand(sceneCommand, { hidden: true });
|
|
73369
|
+
program2.addCommand(timelineCommand, { hidden: true });
|
|
73285
73370
|
program2.addCommand(detectCommand);
|
|
73286
73371
|
program2.addCommand(batchCommand);
|
|
73287
73372
|
program2.addCommand(schemaCommand);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeframe/cli",
|
|
3
|
-
"version": "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.
|
|
187
|
-
"@vibeframe/core": "0.
|
|
186
|
+
"@vibeframe/ai-providers": "0.88.0",
|
|
187
|
+
"@vibeframe/core": "0.88.0"
|
|
188
188
|
},
|
|
189
189
|
"engines": {
|
|
190
190
|
"node": ">=20"
|