diff --git a/bin/cli/sqlite.mjs b/bin/cli/sqlite.mjs index 9502b0aedb..923903b404 100644 --- a/bin/cli/sqlite.mjs +++ b/bin/cli/sqlite.mjs @@ -21,6 +21,18 @@ export function createSqliteNativeError(error) { "(rebuilds into a user-writable runtime; works without a C++ toolchain)." ); } + if ( + message.includes("Could not locate the bindings file") || + message.includes("MODULE_NOT_FOUND") || + message.includes("Cannot find module 'better-sqlite3'") + ) { + return new Error( + "better-sqlite3 native binding could not be found (no prebuilt addon for this platform). " + + "This is common under `npx`, which runs a fresh, ephemeral install that never built the addon. " + + "Run: omniroute runtime repair " + + "(rebuilds into a user-writable runtime; works without a C++ toolchain)." + ); + } return error; } diff --git a/changelog.d/fixes/7868-reset-password-sqlite-bindings.md b/changelog.d/fixes/7868-reset-password-sqlite-bindings.md new file mode 100644 index 0000000000..63f6b31313 --- /dev/null +++ b/changelog.d/fixes/7868-reset-password-sqlite-bindings.md @@ -0,0 +1 @@ +- fix(cli): translate missing better-sqlite3 native bindings error into actionable `omniroute runtime repair` guidance in `reset-password`/setup CLI commands (#7868) diff --git a/tests/unit/cli-sqlite-bindings-not-found-7868.test.ts b/tests/unit/cli-sqlite-bindings-not-found-7868.test.ts new file mode 100644 index 0000000000..1ccd7c9ebc --- /dev/null +++ b/tests/unit/cli-sqlite-bindings-not-found-7868.test.ts @@ -0,0 +1,31 @@ +import { test } from "node:test"; +import assert from "node:assert/strict"; +import { createSqliteNativeError } from "../../bin/cli/sqlite.mjs"; + +test("#7868: createSqliteNativeError() gives actionable guidance for a missing-bindings-file error", () => { + const rawBindingsError = new Error( + "Could not locate the bindings file. Tried:\n" + + " → /Users/agent_user/.npm/_npx/44b85dff014d9ceb/node_modules/better-sqlite3/build/better_sqlite3.node\n" + + " → /Users/agent_user/.npm/_npx/44b85dff014d9ceb/node_modules/better-sqlite3/build/Release/better_sqlite3.node\n" + + " → /Users/agent_user/.npm/_npx/44b85dff014d9ceb/node_modules/better-sqlite3/lib/binding/node-v147-darwin-arm64/better_sqlite3.node" + ); + + const translated = createSqliteNativeError(rawBindingsError); + + assert.notStrictEqual( + translated.message, + rawBindingsError.message, + "createSqliteNativeError() passed the raw 'Could not locate the bindings file' dump through " + + "unchanged instead of translating it into actionable guidance (#7868)" + ); + assert.match( + translated.message, + /runtime repair/i, + "translated error should point the user at the existing self-heal command " + + "(`omniroute runtime repair`), same as the ABI-mismatch branch already does" + ); + assert.ok( + !translated.message.includes("Tried:"), + "a raw path dump reaching the user is itself a signal the fix regressed" + ); +});