@holdyourvoice/hyv 2.9.1 → 2.9.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
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.3] — 2026-06-12
6
+
7
+ ### Fixed
8
+ - Browser signup OAuth — clearer error when Google denies; server fix for `redirect_uri_mismatch` (requires API deploy)
9
+
10
+ ## [2.9.2] — 2026-06-12
11
+
12
+ ### Changed
13
+ - Welcome step 4 copy — warmer signup pitch, highlights $1 first month and what paid unlocks
14
+
5
15
  ## [2.9.1] — 2026-06-12
6
16
 
7
17
  ### Added
package/dist/index.js CHANGED
@@ -5479,6 +5479,15 @@ async function authenticateWithBrowser() {
5479
5479
  if (url.pathname === "/callback") {
5480
5480
  const code = url.searchParams.get("code");
5481
5481
  const state = url.searchParams.get("state");
5482
+ const oauthError = url.searchParams.get("error");
5483
+ if (oauthError) {
5484
+ res.writeHead(400, { "Content-Type": "text/html" });
5485
+ res.end(`<h1>Authentication failed</h1><p>${escapeHtml(oauthError)}</p>`);
5486
+ clearTimeout(timeout);
5487
+ server.close();
5488
+ reject(new Error(`Google sign-in failed: ${oauthError}`));
5489
+ return;
5490
+ }
5482
5491
  if (!code || !state) {
5483
5492
  res.writeHead(400, { "Content-Type": "text/html" });
5484
5493
  res.end("<h1>Authentication failed</h1><p>Missing code or state.</p>");
@@ -11443,13 +11452,14 @@ function buildStepGuide(step, profileName) {
11443
11452
  return [
11444
11453
  "### Step 4 \u2014 save & unlock",
11445
11454
  "",
11446
- "When they are happy with the local profile:",
11447
- "1. `hyv init` \u2014 browser signup",
11448
- "2. `hyv plan --upgrade` \u2014 first month $1, unlocks learning + sync",
11455
+ "Explain warmly: their profile is local-only until they sign up. A free account backs it up and syncs across machines.",
11456
+ "Paid unlock is **$1 for the first month** \u2014 profiles that learn, hybrid rewrite, dashboard.",
11457
+ "Scanning/fix/MCP stay free forever without an account.",
11449
11458
  "",
11450
- `Pricing: ${PRICING_URL}`,
11459
+ "1. `hyv init` \u2014 browser signup",
11460
+ "2. `hyv plan --upgrade` \u2014 $1 first month",
11451
11461
  "",
11452
- "Local scan stays free forever."
11462
+ `Pricing: ${PRICING_URL}`
11453
11463
  ].join("\n");
11454
11464
  default:
11455
11465
  return buildWelcomeGuide({ profileName });
@@ -11774,15 +11784,20 @@ async function stepTest(profileName) {
11774
11784
  }
11775
11785
  async function stepSignup(profileName) {
11776
11786
  console.log(import_chalk12.default.bold("\nstep 4 \xB7 save & unlock\n"));
11777
- console.log(" local profile is ready. signup syncs it and unlocks learning.\n");
11778
- console.log(import_chalk12.default.dim(` free forever: hyv scan, fix, check, mcp`));
11779
- console.log(import_chalk12.default.dim(` paid: profiles that learn, hybrid rewrite, dashboard
11780
- `));
11781
- const ready = await askYesNo(" create your account now?");
11787
+ console.log(" your voice profile is saved locally \u2014 that's enough to scan and test.");
11788
+ console.log(" but it won't follow you to another machine, and it won't get sharper");
11789
+ console.log(" every time you rewrite.\n");
11790
+ console.log(" a free account backs up your profile and syncs it everywhere you use hyv.");
11791
+ console.log(" upgrade when you're ready: " + import_chalk12.default.bold("$1 for your first month") + ", then full");
11792
+ console.log(" access to profiles that learn, hybrid rewrite, and your dashboard.\n");
11793
+ console.log(import_chalk12.default.dim(" free forever (no account): scan, fix, check, mcp"));
11794
+ console.log(import_chalk12.default.dim(" paid unlock: learning loop, rich rewrites, sync across devices\n"));
11795
+ const ready = await askYesNo(" create your free account now? ($1 first month to unlock everything)");
11782
11796
  if (!ready) {
11783
- console.log(import_chalk12.default.dim("\n whenever you are ready:"));
11797
+ console.log(import_chalk12.default.dim("\n no rush \u2014 your profile stays on this machine."));
11798
+ console.log(import_chalk12.default.dim(" whenever you want backup + learning:"));
11784
11799
  console.log(import_chalk12.default.dim(" hyv init"));
11785
- console.log(import_chalk12.default.dim(" hyv plan --upgrade"));
11800
+ console.log(import_chalk12.default.dim(" hyv plan --upgrade ($1 first month)"));
11786
11801
  console.log(import_chalk12.default.dim(` ${PRICING_URL}
11787
11802
  `));
11788
11803
  return;
@@ -11808,7 +11823,7 @@ async function stepSignup(profileName) {
11808
11823
  } catch {
11809
11824
  console.log(import_chalk12.default.yellow(" profile saved locally \u2014 run `hyv sync` after you upgrade"));
11810
11825
  }
11811
- console.log(import_chalk12.default.cyan("\n opening pricing..."));
11826
+ console.log(import_chalk12.default.cyan("\n opening pricing \u2014 $1 first month to unlock learning + sync..."));
11812
11827
  const { default: open3 } = await Promise.resolve().then(() => __toESM(require_open()));
11813
11828
  const { assertSafeOpenUrl: assertSafeOpenUrl2 } = await Promise.resolve().then(() => (init_config(), config_exports));
11814
11829
  await open3(assertSafeOpenUrl2(PRICING_URL));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@holdyourvoice/hyv",
3
- "version": "2.9.1",
3
+ "version": "2.9.3",
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": {