@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 +10 -0
- package/dist/index.js +28 -13
- package/package.json +1 -1
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
|
-
"
|
|
11447
|
-
"1
|
|
11448
|
-
"
|
|
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
|
-
`
|
|
11459
|
+
"1. `hyv init` \u2014 browser signup",
|
|
11460
|
+
"2. `hyv plan --upgrade` \u2014 $1 first month",
|
|
11451
11461
|
"",
|
|
11452
|
-
|
|
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("
|
|
11778
|
-
console.log(
|
|
11779
|
-
console.log(
|
|
11780
|
-
|
|
11781
|
-
|
|
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
|
|
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