@vibeframe/cli 0.91.1 → 0.91.3

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 +34 -14
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -31896,12 +31896,14 @@ async function promptConfirm(question, defaultYes = true) {
31896
31896
  return answer.toLowerCase().startsWith("y");
31897
31897
  }
31898
31898
  async function promptMultiSelect(_question, options, defaultSelected = [], opts = {}) {
31899
+ const pickFocused = opts.pickFocusedOnEnter ?? opts.enterSelectsFocusedWhenEmpty ?? false;
31899
31900
  const input = getTTYInputStream();
31900
31901
  const selected = options.map((_, i) => Boolean(defaultSelected[i]));
31901
31902
  if (typeof input.setRawMode === "function") {
31902
31903
  return new Promise((resolve64) => {
31903
31904
  let cursor = 0;
31904
31905
  let renderCount = 0;
31906
+ let userToggled = false;
31905
31907
  const render = () => {
31906
31908
  if (renderCount > 0) {
31907
31909
  process.stdout.write(`\x1B[${options.length}A`);
@@ -31931,8 +31933,10 @@ async function promptMultiSelect(_question, options, defaultSelected = [], opts
31931
31933
  };
31932
31934
  const onData = (char) => {
31933
31935
  if (char === "\r" || char === "\n") {
31934
- if (opts.enterSelectsFocusedWhenEmpty && selected.every((v) => !v)) {
31936
+ if (pickFocused && !userToggled) {
31937
+ for (let i = 0; i < selected.length; i++) selected[i] = false;
31935
31938
  selected[cursor] = true;
31939
+ render();
31936
31940
  }
31937
31941
  finish();
31938
31942
  } else if (char === "") {
@@ -31941,6 +31945,7 @@ async function promptMultiSelect(_question, options, defaultSelected = [], opts
31941
31945
  process.exit(1);
31942
31946
  } else if (char === " ") {
31943
31947
  selected[cursor] = !selected[cursor];
31948
+ userToggled = true;
31944
31949
  render();
31945
31950
  } else if (char === "\x1B[A" || char === "k") {
31946
31951
  cursor = (cursor - 1 + options.length) % options.length;
@@ -31951,10 +31956,12 @@ async function promptMultiSelect(_question, options, defaultSelected = [], opts
31951
31956
  } else if (char === "a") {
31952
31957
  const allOn = selected.every(Boolean);
31953
31958
  for (let i = 0; i < selected.length; i++) selected[i] = !allOn;
31959
+ userToggled = true;
31954
31960
  render();
31955
31961
  } else if (char >= "1" && char <= String(Math.min(options.length, 9))) {
31956
31962
  const i = parseInt(char, 10) - 1;
31957
31963
  selected[i] = !selected[i];
31964
+ userToggled = true;
31958
31965
  render();
31959
31966
  }
31960
31967
  };
@@ -51610,7 +51617,7 @@ var init_key_live_test = __esm({
51610
51617
 
51611
51618
  // src/pipeline/renderers/chrome.ts
51612
51619
  import { existsSync as existsSync32 } from "node:fs";
51613
- import { homedir as homedir5 } from "node:os";
51620
+ import { homedir as homedir6 } from "node:os";
51614
51621
  import { join as join11 } from "node:path";
51615
51622
  function findChrome() {
51616
51623
  const candidates = [
@@ -51618,7 +51625,7 @@ function findChrome() {
51618
51625
  process.env.CHROME_PATH,
51619
51626
  // puppeteer auto-downloaded headless shell
51620
51627
  join11(
51621
- homedir5(),
51628
+ homedir6(),
51622
51629
  ".cache",
51623
51630
  "puppeteer",
51624
51631
  "chrome-headless-shell",
@@ -62913,7 +62920,7 @@ init_source();
62913
62920
  // package.json
62914
62921
  var package_default = {
62915
62922
  name: "@vibeframe/cli",
62916
- version: "0.91.1",
62923
+ version: "0.91.3",
62917
62924
  description: "VibeFrame CLI - natural language video editing from the terminal",
62918
62925
  private: false,
62919
62926
  license: "MIT",
@@ -69840,6 +69847,7 @@ init_tty();
69840
69847
  init_api_key();
69841
69848
  import { resolve as resolve42 } from "node:path";
69842
69849
  import { access as access6, readFile as readFile29 } from "node:fs/promises";
69850
+ import { homedir as homedir5 } from "node:os";
69843
69851
 
69844
69852
  // src/utils/key-format.ts
69845
69853
  init_dist2();
@@ -70188,8 +70196,19 @@ async function runNonInteractiveSetup(opts) {
70188
70196
  }
70189
70197
  async function runSetupWizard(fullSetup = false, scope = "user") {
70190
70198
  console.log();
70191
- const scopeLabel = scope === "project" ? source_default.dim(` \u2014 project scope (${getConfigPath("project")})`) : source_default.dim(" \u2014 user scope");
70192
- console.log(source_default.bold.magenta("VibeFrame Setup") + scopeLabel);
70199
+ const cfgPath = getConfigPath(scope).replace(homedir5(), "~");
70200
+ const scopeNote = scope === "project" ? "applies to this project only \xB7 add .vibeframe/ to .gitignore" : "applies to every project for this user";
70201
+ console.log(
70202
+ source_default.bold.magenta("VibeFrame Setup") + source_default.bold(` \u2014 ${scope} scope`)
70203
+ );
70204
+ console.log(source_default.dim(`${cfgPath} \xB7 ${scopeNote}`));
70205
+ if (scope === "user") {
70206
+ console.log(
70207
+ source_default.dim(
70208
+ "Tip: for per-project keys, cd into a project and run: vibe setup --scope project"
70209
+ )
70210
+ );
70211
+ }
70193
70212
  console.log(source_default.dim("\u2500".repeat(40)));
70194
70213
  console.log();
70195
70214
  const hosts = detectedAgentHosts();
@@ -70242,8 +70261,8 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
70242
70261
  }
70243
70262
  console.log(source_default.dim("2. Features"));
70244
70263
  console.log(source_default.bold("Which AI features do you need?"));
70245
- console.log(source_default.dim(" \u2191\u2193 navigate \xB7 space to toggle \xB7 enter to confirm"));
70246
- console.log(source_default.dim(" Tip: pressing enter on the highlighted item selects it if nothing is checked yet."));
70264
+ console.log(source_default.dim(` ${source_default.bold("Most users pick more than one.")} Press ${source_default.bold("space")} on each feature you want, then ${source_default.bold("enter")} to confirm.`));
70265
+ console.log(source_default.dim(" Shortcut: enter alone picks only the highlighted feature."));
70247
70266
  console.log();
70248
70267
  const featureLabels = AI_FEATURES.map((f) => {
70249
70268
  const keyCount = f.keys.length;
@@ -70254,7 +70273,7 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
70254
70273
  source_default.cyan(" Pick (e.g. 1,3 or 'all'): "),
70255
70274
  featureLabels,
70256
70275
  [],
70257
- { enterSelectsFocusedWhenEmpty: true }
70276
+ { pickFocusedOnEnter: true }
70258
70277
  );
70259
70278
  const selectedFeatures = picked.map((i) => AI_FEATURES[i]);
70260
70279
  console.log();
@@ -70268,7 +70287,7 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
70268
70287
  const plannedKeys = /* @__PURE__ */ new Map();
70269
70288
  console.log(source_default.dim("3. Providers"));
70270
70289
  console.log(source_default.bold("Choose providers for each selected feature"));
70271
- console.log(source_default.dim(" Recommended defaults are pre-selected. You can toggle more than one."));
70290
+ console.log(source_default.dim(` Recommended default is highlighted. Press ${source_default.bold("enter")} to pick it, or use ${source_default.bold("space")} to add multiple.`));
70272
70291
  console.log();
70273
70292
  for (const feature of selectedFeatures) {
70274
70293
  const keysForFeature = [];
@@ -70285,9 +70304,10 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
70285
70304
  return `${choice.label} ${source_default.dim(`- ${choice.desc}`)} ${keyHint}`;
70286
70305
  });
70287
70306
  const pickedProviders = await promptMultiSelect(
70288
- source_default.cyan(" Providers (space toggles, enter confirms): "),
70307
+ source_default.cyan(" Providers (arrow + enter picks one, space adds more): "),
70289
70308
  providerLabels,
70290
- defaultSelected
70309
+ defaultSelected,
70310
+ { pickFocusedOnEnter: true }
70291
70311
  );
70292
70312
  const selectedChoices = pickedProviders.map((i) => feature.providerChoices[i]);
70293
70313
  const defaultChoice = selectedChoices.find((choice) => choice.defaultFor);
@@ -71747,12 +71767,12 @@ async function runDiagnostics() {
71747
71767
  }
71748
71768
  } else if (toolName === "chrome") {
71749
71769
  const { existsSync: existsSync41 } = await import("node:fs");
71750
- const { homedir: homedir6 } = await import("node:os");
71770
+ const { homedir: homedir7 } = await import("node:os");
71751
71771
  const { join: join17 } = await import("node:path");
71752
71772
  const chromePaths = [
71753
71773
  process.env.HYPERFRAMES_CHROME_PATH,
71754
71774
  process.env.CHROME_PATH,
71755
- join17(homedir6(), ".cache", "puppeteer", "chrome-headless-shell", "mac_arm-147.0.7727.56", "chrome-headless-shell-mac_arm", "chrome-headless-shell"),
71775
+ join17(homedir7(), ".cache", "puppeteer", "chrome-headless-shell", "mac_arm-147.0.7727.56", "chrome-headless-shell-mac_arm", "chrome-headless-shell"),
71756
71776
  "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
71757
71777
  "/Applications/Chromium.app/Contents/MacOS/Chromium",
71758
71778
  "/usr/bin/google-chrome",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/cli",
3
- "version": "0.91.1",
3
+ "version": "0.91.3",
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.91.1",
187
- "@vibeframe/core": "0.91.1"
186
+ "@vibeframe/ai-providers": "0.91.3",
187
+ "@vibeframe/core": "0.91.3"
188
188
  },
189
189
  "engines": {
190
190
  "node": ">=20"