@holdyourvoice/hyv 2.9.4 → 2.9.5

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/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  All notable CLI changes. Also mirrored to [holdyourvoice.com/changelog](https://holdyourvoice.com/changelog) for user-facing releases.
4
4
 
5
+ ## [2.9.5] — 2026-06-12
6
+
7
+ ### Fixed
8
+ - Post-signup browser opens `/app/billing` (live dashboard) instead of `/dashboard` (404)
9
+ - Worker redirects `/dashboard` → `/app` for old links
10
+
5
11
  ## [2.9.4] — 2026-06-12
6
12
 
7
13
  ### Fixed
package/dist/index.js CHANGED
@@ -4612,6 +4612,40 @@ var require_source = __commonJS({
4612
4612
  });
4613
4613
 
4614
4614
  // src/lib/config.ts
4615
+ var config_exports = {};
4616
+ __export(config_exports, {
4617
+ API_BASE: () => API_BASE,
4618
+ AUTH_FILE: () => AUTH_FILE,
4619
+ CACHE_DIR: () => CACHE_DIR,
4620
+ CONFIG_FILE: () => CONFIG_FILE,
4621
+ HYV_DIR: () => HYV_DIR,
4622
+ LAST_SESSION_FILE: () => LAST_SESSION_FILE,
4623
+ PROFILES_DIR: () => PROFILES_DIR,
4624
+ QUEUE_DIR: () => QUEUE_DIR,
4625
+ appendSecureLine: () => appendSecureLine,
4626
+ assertSafeOAuthUrl: () => assertSafeOAuthUrl,
4627
+ assertSafeOpenUrl: () => assertSafeOpenUrl2,
4628
+ assertSafeProfileName: () => assertSafeProfileName,
4629
+ clearAuth: () => clearAuth,
4630
+ clearQueuedSignals: () => clearQueuedSignals,
4631
+ cliApiUrl: () => cliApiUrl,
4632
+ ensureHyvDir: () => ensureHyvDir,
4633
+ getQueuedSignals: () => getQueuedSignals,
4634
+ getToken: () => getToken,
4635
+ isInitialized: () => isInitialized,
4636
+ listCachedProfiles: () => listCachedProfiles,
4637
+ profilePathForName: () => profilePathForName,
4638
+ queueSignal: () => queueSignal,
4639
+ readAuth: () => readAuth,
4640
+ readCachedProfile: () => readCachedProfile,
4641
+ readConfig: () => readConfig,
4642
+ readLastEditSession: () => readLastEditSession,
4643
+ saveLastEditSession: () => saveLastEditSession,
4644
+ writeAuth: () => writeAuth,
4645
+ writeCachedProfile: () => writeCachedProfile,
4646
+ writeConfig: () => writeConfig,
4647
+ writeSecureFile: () => writeSecureFile
4648
+ });
4615
4649
  function validateApiBase(raw) {
4616
4650
  const trimmed = raw.replace(/\/$/, "");
4617
4651
  let parsed;
@@ -4703,6 +4737,10 @@ function ensureHyvDir() {
4703
4737
  }
4704
4738
  }
4705
4739
  }
4740
+ function writeSecureFile(filePath, content) {
4741
+ ensureHyvDir();
4742
+ fs.writeFileSync(filePath, content, { mode: 384 });
4743
+ }
4706
4744
  function appendSecureLine(filePath, line, dir) {
4707
4745
  if (dir) {
4708
4746
  if (!fs.existsSync(dir))
@@ -4741,6 +4779,11 @@ function writeAuth(auth) {
4741
4779
  ensureHyvDir();
4742
4780
  fs.writeFileSync(AUTH_FILE, JSON.stringify(auth, null, 2), { mode: 384 });
4743
4781
  }
4782
+ function clearAuth() {
4783
+ if (fs.existsSync(AUTH_FILE)) {
4784
+ fs.unlinkSync(AUTH_FILE);
4785
+ }
4786
+ }
4744
4787
  function readConfig() {
4745
4788
  try {
4746
4789
  if (!fs.existsSync(CONFIG_FILE))
@@ -4811,6 +4854,17 @@ function queueSignal(signal) {
4811
4854
  const filePath = path.join(QUEUE_DIR, `${id}.json`);
4812
4855
  fs.writeFileSync(filePath, JSON.stringify(signal, null, 2), { mode: 384 });
4813
4856
  }
4857
+ function clearQueuedSignals() {
4858
+ try {
4859
+ if (!fs.existsSync(QUEUE_DIR))
4860
+ return;
4861
+ const files = fs.readdirSync(QUEUE_DIR).filter((f) => f.endsWith(".json"));
4862
+ for (const f of files) {
4863
+ fs.unlinkSync(path.join(QUEUE_DIR, f));
4864
+ }
4865
+ } catch {
4866
+ }
4867
+ }
4814
4868
  function saveLastEditSession(session) {
4815
4869
  ensureHyvDir();
4816
4870
  const data = { ...session, saved_at: (/* @__PURE__ */ new Date()).toISOString() };
@@ -5494,8 +5548,7 @@ async function openAuthenticatedDashboard(opts = {}) {
5494
5548
  const response = await authenticatedRequest(cliApiUrl("/cli/auth/web-handoff"), {
5495
5549
  method: "POST",
5496
5550
  body: {
5497
- next: opts.next || "/dashboard",
5498
- tab: opts.tab || "billing"
5551
+ next: opts.next || "/app/billing"
5499
5552
  }
5500
5553
  });
5501
5554
  if (response.status !== 200) {
@@ -5566,6 +5619,17 @@ var init_auth = __esm({
5566
5619
  });
5567
5620
 
5568
5621
  // src/lib/free-paid.ts
5622
+ var free_paid_exports = {};
5623
+ __export(free_paid_exports, {
5624
+ COMMUNITY_URL: () => COMMUNITY_URL,
5625
+ DASHBOARD_BILLING_URL: () => DASHBOARD_BILLING_URL,
5626
+ FREE_CLI_COMMANDS: () => FREE_CLI_COMMANDS,
5627
+ FREE_WEB_TOOLS: () => FREE_WEB_TOOLS,
5628
+ NPX_EXAMPLES: () => NPX_EXAMPLES,
5629
+ PAID_FEATURES: () => PAID_FEATURES,
5630
+ PRICING_URL: () => PRICING_URL,
5631
+ printFreePaidMatrix: () => printFreePaidMatrix
5632
+ });
5569
5633
  function printFreePaidMatrix(opts = {}) {
5570
5634
  if (opts.compact) {
5571
5635
  console.log(import_chalk2.default.bold("\nFree forever (local)"));
@@ -5646,7 +5710,7 @@ var init_free_paid = __esm({
5646
5710
  ];
5647
5711
  COMMUNITY_URL = "https://holdyourvoice.com/community";
5648
5712
  PRICING_URL = "https://holdyourvoice.com/#pricing";
5649
- DASHBOARD_BILLING_URL = "https://holdyourvoice.com/dashboard?tab=billing";
5713
+ DASHBOARD_BILLING_URL = "https://holdyourvoice.com/app/billing";
5650
5714
  }
5651
5715
  });
5652
5716
 
@@ -11796,10 +11860,14 @@ async function stepSignup(profileName) {
11796
11860
  }
11797
11861
  try {
11798
11862
  console.log(import_chalk12.default.cyan("\n opening billing in your dashboard ($1 first month)..."));
11799
- await withSpinner("opening dashboard\u2026", () => openAuthenticatedDashboard({ tab: "billing" }));
11863
+ await withSpinner("opening dashboard\u2026", () => openAuthenticatedDashboard({ next: "/app/billing" }));
11800
11864
  await briefPause();
11801
11865
  } catch {
11802
- console.log(import_chalk12.default.yellow(" could not auto-open dashboard \u2014 visit holdyourvoice.com/dashboard"));
11866
+ const { DASHBOARD_BILLING_URL: DASHBOARD_BILLING_URL2 } = await Promise.resolve().then(() => (init_free_paid(), free_paid_exports));
11867
+ const { assertSafeOpenUrl: assertSafeOpenUrl3 } = await Promise.resolve().then(() => (init_config(), config_exports));
11868
+ const { default: open3 } = await Promise.resolve().then(() => __toESM(require_open()));
11869
+ console.log(import_chalk12.default.yellow(" handoff unavailable \u2014 opening billing (sign in if prompted)..."));
11870
+ await open3(assertSafeOpenUrl3(DASHBOARD_BILLING_URL2));
11803
11871
  }
11804
11872
  markStepComplete("signup");
11805
11873
  console.log(import_chalk12.default.dim("\n you're signed in \u2014 pick a plan in billing, no second login.\n"));
@@ -16830,7 +16898,7 @@ async function showPlan() {
16830
16898
  async function upgradePlan() {
16831
16899
  console.log(import_chalk14.default.cyan("\nOpening billing in your dashboard ($1 first month)...\n"));
16832
16900
  try {
16833
- await openAuthenticatedDashboard({ tab: "billing" });
16901
+ await openAuthenticatedDashboard({ next: "/app/billing" });
16834
16902
  console.log(import_chalk14.default.green("\n\u2713 Dashboard opened \u2014 you're already signed in"));
16835
16903
  console.log(import_chalk14.default.dim("Pick a plan in billing. No second login."));
16836
16904
  } catch {
@@ -18414,7 +18482,7 @@ var import_chalk29 = __toESM(require_source());
18414
18482
  var PAGES = {
18415
18483
  dashboard: "https://holdyourvoice.com/dashboard",
18416
18484
  profiles: "https://holdyourvoice.com/dashboard",
18417
- pricing: "https://holdyourvoice.com/pricing",
18485
+ pricing: "https://holdyourvoice.com/app/billing",
18418
18486
  settings: "https://holdyourvoice.com/dashboard"
18419
18487
  };
18420
18488
  function registerOpenCommand(program3) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@holdyourvoice/hyv",
3
- "version": "2.9.4",
3
+ "version": "2.9.5",
4
4
  "description": "Free local AI writing scan for cursor & claude. MCP server, 220+ pattern detection, voice profiles. npx @holdyourvoice/hyv welcome",
5
5
  "main": "dist/index.js",
6
6
  "bin": {