codealmanac 0.1.6 → 0.1.7

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 (43) hide show
  1. package/dist/chunk-2JJTTN7P.js +539 -0
  2. package/dist/chunk-2JJTTN7P.js.map +1 -0
  3. package/dist/chunk-3C5SY5SE.js +1239 -0
  4. package/dist/chunk-3C5SY5SE.js.map +1 -0
  5. package/dist/chunk-4CODZRHH.js +19 -0
  6. package/dist/chunk-4CODZRHH.js.map +1 -0
  7. package/dist/chunk-7JUX4ADQ.js +38 -0
  8. package/dist/chunk-7JUX4ADQ.js.map +1 -0
  9. package/dist/chunk-A6PUCAVJ.js +145 -0
  10. package/dist/chunk-A6PUCAVJ.js.map +1 -0
  11. package/dist/chunk-AXFPUHBN.js +227 -0
  12. package/dist/chunk-AXFPUHBN.js.map +1 -0
  13. package/dist/chunk-FM3VRDK7.js +20 -0
  14. package/dist/chunk-FM3VRDK7.js.map +1 -0
  15. package/dist/chunk-H6WU6PYH.js +441 -0
  16. package/dist/chunk-H6WU6PYH.js.map +1 -0
  17. package/dist/chunk-P3LDTCLB.js +34 -0
  18. package/dist/chunk-P3LDTCLB.js.map +1 -0
  19. package/dist/chunk-QHQ6YH7U.js +81 -0
  20. package/dist/chunk-QHQ6YH7U.js.map +1 -0
  21. package/dist/chunk-Z4MWLVS2.js +355 -0
  22. package/dist/chunk-Z4MWLVS2.js.map +1 -0
  23. package/dist/chunk-Z6MBJ3D2.js +203 -0
  24. package/dist/chunk-Z6MBJ3D2.js.map +1 -0
  25. package/dist/cli-AIH5QQ5H.js +393 -0
  26. package/dist/cli-AIH5QQ5H.js.map +1 -0
  27. package/dist/codealmanac.js +32 -5
  28. package/dist/codealmanac.js.map +1 -1
  29. package/dist/doctor-6FN5JO5F.js +15 -0
  30. package/dist/doctor-6FN5JO5F.js.map +1 -0
  31. package/dist/hook-CRJMWSSO.js +12 -0
  32. package/dist/hook-CRJMWSSO.js.map +1 -0
  33. package/dist/register-commands-PZMQNGCH.js +2644 -0
  34. package/dist/register-commands-PZMQNGCH.js.map +1 -0
  35. package/dist/uninstall-NBEZNNKM.js +12 -0
  36. package/dist/uninstall-NBEZNNKM.js.map +1 -0
  37. package/dist/update-IL243I4E.js +10 -0
  38. package/dist/update-IL243I4E.js.map +1 -0
  39. package/dist/wiki-EHZ7LG7R.js +238 -0
  40. package/dist/wiki-EHZ7LG7R.js.map +1 -0
  41. package/package.json +1 -1
  42. package/dist/cli-GTEC5PC7.js +0 -6237
  43. package/dist/cli-GTEC5PC7.js.map +0 -1
@@ -0,0 +1,393 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ emit
4
+ } from "./chunk-P3LDTCLB.js";
5
+ import {
6
+ runInternalUpdateCheck,
7
+ scheduleBackgroundUpdateCheck
8
+ } from "./chunk-QHQ6YH7U.js";
9
+ import {
10
+ BLUE,
11
+ BOLD,
12
+ DIM,
13
+ RST
14
+ } from "./chunk-FM3VRDK7.js";
15
+ import {
16
+ runSetup
17
+ } from "./chunk-2JJTTN7P.js";
18
+ import "./chunk-Z4MWLVS2.js";
19
+ import {
20
+ getConfigPath,
21
+ getStatePath,
22
+ isNewer
23
+ } from "./chunk-AXFPUHBN.js";
24
+ import "./chunk-7JUX4ADQ.js";
25
+
26
+ // src/cli.ts
27
+ import { createRequire as createRequire2 } from "module";
28
+ import { basename } from "path";
29
+ import { Command } from "commander";
30
+
31
+ // src/cli/help.ts
32
+ var HELP_GROUPS = [
33
+ {
34
+ title: "Query",
35
+ commands: ["search", "show", "health", "list"]
36
+ },
37
+ {
38
+ title: "Edit",
39
+ commands: ["tag", "untag", "topics"]
40
+ },
41
+ {
42
+ title: "Wiki lifecycle",
43
+ commands: ["bootstrap", "capture", "hook", "reindex"]
44
+ },
45
+ {
46
+ title: "Setup",
47
+ commands: ["setup", "uninstall", "doctor", "update"]
48
+ }
49
+ ];
50
+ function configureGroupedHelp(program) {
51
+ program.configureHelp({
52
+ formatHelp(cmd, helper) {
53
+ if (cmd.parent !== null) {
54
+ return renderDefault(cmd, helper);
55
+ }
56
+ const termWidth = helper.padWidth(cmd, helper);
57
+ const helpWidth = helper.helpWidth ?? process.stdout.columns ?? 80;
58
+ const itemSepWidth = 2;
59
+ const out = [];
60
+ out.push(`${BOLD}Usage:${RST} ${helper.commandUsage(cmd)}
61
+ `);
62
+ const description = helper.commandDescription(cmd);
63
+ if (description.length > 0) {
64
+ out.push(
65
+ helper.wrap(description, helpWidth, 0) + "\n"
66
+ );
67
+ }
68
+ const optionList = helper.visibleOptions(cmd).map((o) => {
69
+ const term = helper.optionTerm(o);
70
+ const pad = " ".repeat(Math.max(0, termWidth - term.length) + itemSepWidth);
71
+ return `${BLUE}${term}${RST}${pad}${DIM}${helper.optionDescription(o)}${RST}`;
72
+ });
73
+ if (optionList.length > 0) {
74
+ out.push(`${BOLD}Options:${RST}`);
75
+ for (const l of optionList) out.push(` ${l}`);
76
+ out.push("");
77
+ }
78
+ const visible = helper.visibleCommands(cmd);
79
+ const byName = /* @__PURE__ */ new Map();
80
+ for (const c of visible) byName.set(c.name(), c);
81
+ for (const group of HELP_GROUPS) {
82
+ const members = group.commands.map((n) => byName.get(n)).filter((c) => c !== void 0);
83
+ if (members.length === 0) continue;
84
+ out.push(`${BOLD}${group.title}:${RST}`);
85
+ for (const c of members) {
86
+ const term = helper.subcommandTerm(c);
87
+ const desc = helper.subcommandDescription(c);
88
+ const padding = Math.max(
89
+ 0,
90
+ termWidth - term.length + itemSepWidth
91
+ );
92
+ out.push(` ${BLUE}${term}${RST}${" ".repeat(padding)}${DIM}${desc}${RST}`);
93
+ byName.delete(c.name());
94
+ }
95
+ out.push("");
96
+ }
97
+ byName.delete("help");
98
+ if (byName.size > 0) {
99
+ out.push(`${BOLD}Other:${RST}`);
100
+ for (const c of byName.values()) {
101
+ const term = helper.subcommandTerm(c);
102
+ const desc = helper.subcommandDescription(c);
103
+ const padding = Math.max(
104
+ 0,
105
+ termWidth - term.length + itemSepWidth
106
+ );
107
+ out.push(` ${BLUE}${term}${RST}${" ".repeat(padding)}${DIM}${desc}${RST}`);
108
+ }
109
+ out.push("");
110
+ }
111
+ return out.join("\n");
112
+ }
113
+ });
114
+ }
115
+ function renderDefault(cmd, helper) {
116
+ const termWidth = helper.padWidth(cmd, helper);
117
+ const helpWidth = helper.helpWidth ?? process.stdout.columns ?? 80;
118
+ const itemSepWidth = 2;
119
+ const lines = [`${BOLD}Usage:${RST} ${helper.commandUsage(cmd)}
120
+ `];
121
+ const description = helper.commandDescription(cmd);
122
+ if (description.length > 0) {
123
+ lines.push(helper.wrap(description, helpWidth, 0) + "\n");
124
+ }
125
+ const args = helper.visibleArguments(cmd).map((a) => {
126
+ const term = helper.argumentTerm(a);
127
+ const pad = " ".repeat(Math.max(0, termWidth - term.length) + itemSepWidth);
128
+ return `${BLUE}${term}${RST}${pad}${DIM}${helper.argumentDescription(a)}${RST}`;
129
+ });
130
+ if (args.length > 0) {
131
+ lines.push(`${BOLD}Arguments:${RST}`);
132
+ for (const a of args) lines.push(` ${a}`);
133
+ lines.push("");
134
+ }
135
+ const opts = helper.visibleOptions(cmd).map((o) => {
136
+ const term = helper.optionTerm(o);
137
+ const pad = " ".repeat(Math.max(0, termWidth - term.length) + itemSepWidth);
138
+ return `${BLUE}${term}${RST}${pad}${DIM}${helper.optionDescription(o)}${RST}`;
139
+ });
140
+ if (opts.length > 0) {
141
+ lines.push(`${BOLD}Options:${RST}`);
142
+ for (const o of opts) lines.push(` ${o}`);
143
+ lines.push("");
144
+ }
145
+ const subs = helper.visibleCommands(cmd).map((c) => {
146
+ const term = helper.subcommandTerm(c);
147
+ const pad = " ".repeat(Math.max(0, termWidth - term.length) + itemSepWidth);
148
+ return `${BLUE}${term}${RST}${pad}${DIM}${helper.subcommandDescription(c)}${RST}`;
149
+ });
150
+ if (subs.length > 0) {
151
+ lines.push(`${BOLD}Commands:${RST}`);
152
+ for (const s of subs) lines.push(` ${s}`);
153
+ lines.push("");
154
+ }
155
+ return lines.join("\n");
156
+ }
157
+
158
+ // src/update/announce.ts
159
+ import { readFileSync } from "fs";
160
+ import { createRequire } from "module";
161
+ var RST2 = "\x1B[0m";
162
+ var BOLD2 = "\x1B[1m";
163
+ var YELLOW = "\x1B[33m";
164
+ function announceUpdateIfAvailable(stderr, opts = {}) {
165
+ const statePath = opts.statePath ?? getStatePath();
166
+ const configPath = opts.configPath ?? getConfigPath();
167
+ const installed = opts.installedVersion ?? readInstalledVersion();
168
+ if (!shouldNotify(configPath)) return;
169
+ const state = readStateSync(statePath);
170
+ if (state === null) return;
171
+ if (state.latest_version.length === 0) return;
172
+ if (!isNewer(state.latest_version, installed)) return;
173
+ if (state.dismissed_versions.includes(state.latest_version)) return;
174
+ const useColor = opts.color ?? (process.stderr.isTTY === true && !("NO_COLOR" in process.env));
175
+ const warn = useColor ? `${YELLOW}${BOLD2}\u26A0${RST2}` : "!";
176
+ const cmd = useColor ? `${BOLD2}almanac update${RST2}` : "almanac update";
177
+ stderr.write(
178
+ `${warn} codealmanac ${state.latest_version} available (you're on ${installed}) \u2014 run: ${cmd}
179
+ `
180
+ );
181
+ }
182
+ function readStateSync(path) {
183
+ let raw;
184
+ try {
185
+ raw = readFileSync(path, "utf8");
186
+ } catch {
187
+ return null;
188
+ }
189
+ const trimmed = raw.trim();
190
+ if (trimmed.length === 0) return null;
191
+ try {
192
+ const parsed = JSON.parse(trimmed);
193
+ return {
194
+ last_check_at: typeof parsed.last_check_at === "number" ? parsed.last_check_at : 0,
195
+ installed_version: typeof parsed.installed_version === "string" ? parsed.installed_version : "",
196
+ latest_version: typeof parsed.latest_version === "string" ? parsed.latest_version : "",
197
+ dismissed_versions: Array.isArray(parsed.dismissed_versions) ? parsed.dismissed_versions.filter(
198
+ (v) => typeof v === "string"
199
+ ) : []
200
+ };
201
+ } catch {
202
+ return null;
203
+ }
204
+ }
205
+ function shouldNotify(configPath) {
206
+ let raw;
207
+ try {
208
+ raw = readFileSync(configPath, "utf8");
209
+ } catch {
210
+ return true;
211
+ }
212
+ const trimmed = raw.trim();
213
+ if (trimmed.length === 0) return true;
214
+ try {
215
+ const parsed = JSON.parse(trimmed);
216
+ if (parsed.update_notifier === false) return false;
217
+ return true;
218
+ } catch {
219
+ return true;
220
+ }
221
+ }
222
+ function readInstalledVersion() {
223
+ try {
224
+ const require2 = createRequire(import.meta.url);
225
+ const pkg = require2("../../package.json");
226
+ if (typeof pkg.version === "string" && pkg.version.length > 0) {
227
+ return pkg.version;
228
+ }
229
+ } catch {
230
+ }
231
+ try {
232
+ const require2 = createRequire(import.meta.url);
233
+ const pkg = require2("../package.json");
234
+ if (typeof pkg.version === "string" && pkg.version.length > 0) {
235
+ return pkg.version;
236
+ }
237
+ } catch {
238
+ }
239
+ return "unknown";
240
+ }
241
+
242
+ // src/cli.ts
243
+ async function run(argv, deps = {}) {
244
+ const runSetupFn = deps.runSetup ?? runSetup;
245
+ const announceUpdateFn = deps.announceUpdate ?? announceUpdateIfAvailable;
246
+ const scheduleUpdateCheckFn = deps.scheduleUpdateCheck ?? scheduleBackgroundUpdateCheck;
247
+ const runInternalUpdateCheckFn = deps.runInternalUpdateCheck ?? runInternalUpdateCheck;
248
+ if (argv.slice(2).includes("--internal-check-updates")) {
249
+ await runInternalUpdateCheckFn();
250
+ return;
251
+ }
252
+ const programName = getProgramName(argv);
253
+ announceUpdateFn(process.stderr);
254
+ scheduleUpdateCheckFn(argv);
255
+ const program = new Command();
256
+ program.name(programName).description(
257
+ "codealmanac \u2014 a living wiki for codebases, maintained by AI agents"
258
+ ).version(readPackageVersion(), "-v, --version", "print version");
259
+ if (isRootVersionInvocation(argv.slice(2))) {
260
+ await program.parseAsync(argv);
261
+ return;
262
+ }
263
+ if (programName === "codealmanac") {
264
+ const setupInvocation = tryParseSetupShortcut(argv.slice(2));
265
+ if (setupInvocation !== null) {
266
+ emit(await runSetupFn(setupInvocation));
267
+ return;
268
+ }
269
+ }
270
+ if (await tryRunSqliteFreeCommand(argv.slice(2), runSetupFn)) {
271
+ return;
272
+ }
273
+ const { registerCommands } = await import("./register-commands-PZMQNGCH.js");
274
+ registerCommands(program);
275
+ configureGroupedHelp(program);
276
+ await program.parseAsync(argv);
277
+ }
278
+ function getProgramName(argv) {
279
+ const invoked = argv[1] !== void 0 ? basename(argv[1]) : "almanac";
280
+ return invoked === "codealmanac" ? "codealmanac" : "almanac";
281
+ }
282
+ function isRootVersionInvocation(args) {
283
+ return args.length === 1 && (args[0] === "--version" || args[0] === "-v");
284
+ }
285
+ function parseSetupFlags(args) {
286
+ return {
287
+ yes: args.includes("--yes") || args.includes("-y"),
288
+ skipHook: args.includes("--skip-hook"),
289
+ skipGuides: args.includes("--skip-guides")
290
+ };
291
+ }
292
+ function parseUpdateFlags(args) {
293
+ return {
294
+ dismiss: args.includes("--dismiss"),
295
+ check: args.includes("--check"),
296
+ enableNotifier: args.includes("--enable-notifier"),
297
+ disableNotifier: args.includes("--disable-notifier")
298
+ };
299
+ }
300
+ function parseUninstallFlags(args) {
301
+ return {
302
+ yes: args.includes("--yes") || args.includes("-y"),
303
+ keepHook: args.includes("--keep-hook"),
304
+ keepGuides: args.includes("--keep-guides")
305
+ };
306
+ }
307
+ function parseDoctorFlags(args) {
308
+ return {
309
+ json: args.includes("--json"),
310
+ installOnly: args.includes("--install-only"),
311
+ wikiOnly: args.includes("--wiki-only")
312
+ };
313
+ }
314
+ async function tryRunSqliteFreeCommand(args, runSetupFn) {
315
+ if (args.includes("--help") || args.includes("-h")) return false;
316
+ const [command, subcommand] = args;
317
+ if (command === void 0) return false;
318
+ if (command === "setup") {
319
+ emit(await runSetupFn(parseSetupFlags(args.slice(1))));
320
+ return true;
321
+ }
322
+ if (command === "hook") {
323
+ const { runHookInstall, runHookStatus, runHookUninstall } = await import("./hook-CRJMWSSO.js");
324
+ if (subcommand === "install") {
325
+ emit(await runHookInstall());
326
+ return true;
327
+ }
328
+ if (subcommand === "uninstall") {
329
+ emit(await runHookUninstall());
330
+ return true;
331
+ }
332
+ if (subcommand === "status") {
333
+ emit(await runHookStatus());
334
+ return true;
335
+ }
336
+ return false;
337
+ }
338
+ if (command === "update") {
339
+ const { runUpdate } = await import("./update-IL243I4E.js");
340
+ emit(await runUpdate(parseUpdateFlags(args.slice(1))));
341
+ return true;
342
+ }
343
+ if (command === "doctor") {
344
+ const { runDoctor } = await import("./doctor-6FN5JO5F.js");
345
+ emit(await runDoctor({
346
+ cwd: process.cwd(),
347
+ ...parseDoctorFlags(args.slice(1))
348
+ }));
349
+ return true;
350
+ }
351
+ if (command === "uninstall") {
352
+ const { runUninstall } = await import("./uninstall-NBEZNNKM.js");
353
+ emit(await runUninstall(parseUninstallFlags(args.slice(1))));
354
+ return true;
355
+ }
356
+ return false;
357
+ }
358
+ function readPackageVersion() {
359
+ try {
360
+ const require2 = createRequire2(import.meta.url);
361
+ const pkg = require2("../package.json");
362
+ if (typeof pkg.version === "string" && pkg.version.length > 0) {
363
+ return pkg.version;
364
+ }
365
+ } catch {
366
+ }
367
+ return "unknown";
368
+ }
369
+ function tryParseSetupShortcut(args) {
370
+ if (args.length === 0) return {};
371
+ const opts = {};
372
+ for (const arg of args) {
373
+ if (arg === "--yes" || arg === "-y") {
374
+ opts.yes = true;
375
+ continue;
376
+ }
377
+ if (arg === "--skip-hook") {
378
+ opts.skipHook = true;
379
+ continue;
380
+ }
381
+ if (arg === "--skip-guides") {
382
+ opts.skipGuides = true;
383
+ continue;
384
+ }
385
+ return null;
386
+ }
387
+ return opts;
388
+ }
389
+ export {
390
+ run,
391
+ tryParseSetupShortcut
392
+ };
393
+ //# sourceMappingURL=cli-AIH5QQ5H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../src/cli/help.ts","../src/update/announce.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { basename } from \"node:path\";\n\nimport { Command } from \"commander\";\n\nimport { runSetup } from \"./commands/setup.js\";\nimport { configureGroupedHelp } from \"./cli/help.js\";\nimport { emit } from \"./cli/helpers.js\";\nimport { announceUpdateIfAvailable } from \"./update/announce.js\";\nimport {\n runInternalUpdateCheck,\n scheduleBackgroundUpdateCheck,\n} from \"./update/schedule.js\";\n\n/**\n * Optional dependency overrides for `run`. Tests use these to avoid\n * spawning the real setup wizard, the real update background check,\n * and the real update banner. Production callers pass nothing.\n */\nexport interface RunDeps {\n /** Replace the setup wizard (bare `codealmanac` / `almanac setup`). */\n runSetup?: typeof runSetup;\n /** Replace the pre-command update-nag banner. */\n announceUpdate?: (stderr: NodeJS.WritableStream) => void;\n /** Replace the post-command background update check scheduler. */\n scheduleUpdateCheck?: (argv: string[]) => void;\n /** Replace the internal update-check worker (run on --internal-check-updates). */\n runInternalUpdateCheck?: () => Promise<void>;\n}\n\n/**\n * Process-level CLI entrypoint. This owns invocation-level behavior:\n * update checks, bare `codealmanac` setup routing, Commander creation,\n * grouped help, and parsing. Individual command wiring lives in\n * `src/cli/register-commands.ts`.\n */\nexport async function run(argv: string[], deps: RunDeps = {}): Promise<void> {\n const runSetupFn = deps.runSetup ?? runSetup;\n const announceUpdateFn = deps.announceUpdate ?? announceUpdateIfAvailable;\n const scheduleUpdateCheckFn =\n deps.scheduleUpdateCheck ?? scheduleBackgroundUpdateCheck;\n const runInternalUpdateCheckFn =\n deps.runInternalUpdateCheck ?? runInternalUpdateCheck;\n\n if (argv.slice(2).includes(\"--internal-check-updates\")) {\n await runInternalUpdateCheckFn();\n return;\n }\n\n const programName = getProgramName(argv);\n\n announceUpdateFn(process.stderr);\n scheduleUpdateCheckFn(argv);\n\n const program = new Command();\n program\n .name(programName)\n .description(\n \"codealmanac — a living wiki for codebases, maintained by AI agents\",\n )\n .version(readPackageVersion(), \"-v, --version\", \"print version\");\n\n if (isRootVersionInvocation(argv.slice(2))) {\n await program.parseAsync(argv);\n return;\n }\n\n if (programName === \"codealmanac\") {\n const setupInvocation = tryParseSetupShortcut(argv.slice(2));\n if (setupInvocation !== null) {\n emit(await runSetupFn(setupInvocation));\n return;\n }\n }\n\n if (await tryRunSqliteFreeCommand(argv.slice(2), runSetupFn)) {\n return;\n }\n\n const { registerCommands } = await import(\"./cli/register-commands.js\");\n registerCommands(program);\n configureGroupedHelp(program);\n\n await program.parseAsync(argv);\n}\n\nfunction getProgramName(argv: string[]): \"almanac\" | \"codealmanac\" {\n const invoked = argv[1] !== undefined ? basename(argv[1]) : \"almanac\";\n return invoked === \"codealmanac\" ? \"codealmanac\" : \"almanac\";\n}\n\nfunction isRootVersionInvocation(args: string[]): boolean {\n return args.length === 1 && (args[0] === \"--version\" || args[0] === \"-v\");\n}\n\nfunction parseSetupFlags(args: string[]): {\n yes?: boolean;\n skipHook?: boolean;\n skipGuides?: boolean;\n} {\n return {\n yes: args.includes(\"--yes\") || args.includes(\"-y\"),\n skipHook: args.includes(\"--skip-hook\"),\n skipGuides: args.includes(\"--skip-guides\"),\n };\n}\n\nfunction parseUpdateFlags(args: string[]): {\n dismiss?: boolean;\n check?: boolean;\n enableNotifier?: boolean;\n disableNotifier?: boolean;\n} {\n return {\n dismiss: args.includes(\"--dismiss\"),\n check: args.includes(\"--check\"),\n enableNotifier: args.includes(\"--enable-notifier\"),\n disableNotifier: args.includes(\"--disable-notifier\"),\n };\n}\n\nfunction parseUninstallFlags(args: string[]): {\n yes?: boolean;\n keepHook?: boolean;\n keepGuides?: boolean;\n} {\n return {\n yes: args.includes(\"--yes\") || args.includes(\"-y\"),\n keepHook: args.includes(\"--keep-hook\"),\n keepGuides: args.includes(\"--keep-guides\"),\n };\n}\n\nfunction parseDoctorFlags(args: string[]): {\n json?: boolean;\n installOnly?: boolean;\n wikiOnly?: boolean;\n} {\n return {\n json: args.includes(\"--json\"),\n installOnly: args.includes(\"--install-only\"),\n wikiOnly: args.includes(\"--wiki-only\"),\n };\n}\n\nasync function tryRunSqliteFreeCommand(\n args: string[],\n runSetupFn: typeof runSetup,\n): Promise<boolean> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) return false;\n\n const [command, subcommand] = args;\n if (command === undefined) return false;\n\n if (command === \"setup\") {\n emit(await runSetupFn(parseSetupFlags(args.slice(1))));\n return true;\n }\n\n if (command === \"hook\") {\n const { runHookInstall, runHookStatus, runHookUninstall } = await import(\n \"./commands/hook.js\"\n );\n if (subcommand === \"install\") {\n emit(await runHookInstall());\n return true;\n }\n if (subcommand === \"uninstall\") {\n emit(await runHookUninstall());\n return true;\n }\n if (subcommand === \"status\") {\n emit(await runHookStatus());\n return true;\n }\n return false;\n }\n\n if (command === \"update\") {\n const { runUpdate } = await import(\"./commands/update.js\");\n emit(await runUpdate(parseUpdateFlags(args.slice(1))));\n return true;\n }\n\n if (command === \"doctor\") {\n const { runDoctor } = await import(\"./commands/doctor.js\");\n emit(await runDoctor({\n cwd: process.cwd(),\n ...parseDoctorFlags(args.slice(1)),\n }));\n return true;\n }\n\n if (command === \"uninstall\") {\n const { runUninstall } = await import(\"./commands/uninstall.js\");\n emit(await runUninstall(parseUninstallFlags(args.slice(1))));\n return true;\n }\n\n return false;\n}\n\nfunction readPackageVersion(): string {\n try {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version?: unknown };\n if (typeof pkg.version === \"string\" && pkg.version.length > 0) {\n return pkg.version;\n }\n } catch {\n // Fall back to \"unknown\" rather than crashing the CLI on a broken install.\n }\n return \"unknown\";\n}\n\nexport interface SetupShortcutOptions {\n yes?: boolean;\n skipHook?: boolean;\n skipGuides?: boolean;\n}\n\n/**\n * Decide whether a bare `codealmanac [...args]` invocation should route\n * straight to `runSetup` (and if so, with which flags). Returns the\n * options object when it's a setup shortcut, or `null` when Commander\n * should parse the invocation normally.\n */\nexport function tryParseSetupShortcut(args: string[]): SetupShortcutOptions | null {\n if (args.length === 0) return {};\n\n const opts: SetupShortcutOptions = {};\n for (const arg of args) {\n if (arg === \"--yes\" || arg === \"-y\") {\n opts.yes = true;\n continue;\n }\n if (arg === \"--skip-hook\") {\n opts.skipHook = true;\n continue;\n }\n if (arg === \"--skip-guides\") {\n opts.skipGuides = true;\n continue;\n }\n return null;\n }\n return opts;\n}\n","import { Command, type Help } from \"commander\";\n\nimport { BLUE, BOLD, DIM, RST } from \"../ansi.js\";\n\nconst HELP_GROUPS: Array<{ title: string; commands: string[] }> = [\n {\n title: \"Query\",\n commands: [\"search\", \"show\", \"health\", \"list\"],\n },\n {\n title: \"Edit\",\n commands: [\"tag\", \"untag\", \"topics\"],\n },\n {\n title: \"Wiki lifecycle\",\n commands: [\"bootstrap\", \"capture\", \"hook\", \"reindex\"],\n },\n {\n title: \"Setup\",\n commands: [\"setup\", \"uninstall\", \"doctor\", \"update\"],\n },\n];\n\n/**\n * Install a custom `formatHelp` that replaces commander's flat\n * \"Commands:\" section with grouped headings. Keeps usage + options +\n * per-command short descriptions; only the commands section changes.\n */\nexport function configureGroupedHelp(program: Command): void {\n program.configureHelp({\n formatHelp(cmd, helper): string {\n if (cmd.parent !== null) {\n return renderDefault(cmd, helper);\n }\n\n const termWidth = helper.padWidth(cmd, helper);\n const helpWidth =\n helper.helpWidth ?? process.stdout.columns ?? 80;\n const itemSepWidth = 2;\n\n const out: string[] = [];\n out.push(`${BOLD}Usage:${RST} ${helper.commandUsage(cmd)}\\n`);\n\n const description = helper.commandDescription(cmd);\n if (description.length > 0) {\n out.push(\n helper.wrap(description, helpWidth, 0) + \"\\n\",\n );\n }\n\n const optionList = helper\n .visibleOptions(cmd)\n .map((o) => {\n const term = helper.optionTerm(o);\n const pad = \" \".repeat(Math.max(0, termWidth - term.length) + itemSepWidth);\n return `${BLUE}${term}${RST}${pad}${DIM}${helper.optionDescription(o)}${RST}`;\n });\n if (optionList.length > 0) {\n out.push(`${BOLD}Options:${RST}`);\n for (const l of optionList) out.push(` ${l}`);\n out.push(\"\");\n }\n\n const visible = helper.visibleCommands(cmd);\n const byName = new Map<string, (typeof visible)[number]>();\n for (const c of visible) byName.set(c.name(), c);\n\n for (const group of HELP_GROUPS) {\n const members = group.commands\n .map((n) => byName.get(n))\n .filter((c): c is (typeof visible)[number] => c !== undefined);\n if (members.length === 0) continue;\n out.push(`${BOLD}${group.title}:${RST}`);\n for (const c of members) {\n const term = helper.subcommandTerm(c);\n const desc = helper.subcommandDescription(c);\n const padding = Math.max(\n 0,\n termWidth - term.length + itemSepWidth,\n );\n out.push(` ${BLUE}${term}${RST}${\" \".repeat(padding)}${DIM}${desc}${RST}`);\n byName.delete(c.name());\n }\n out.push(\"\");\n }\n\n byName.delete(\"help\");\n if (byName.size > 0) {\n out.push(`${BOLD}Other:${RST}`);\n for (const c of byName.values()) {\n const term = helper.subcommandTerm(c);\n const desc = helper.subcommandDescription(c);\n const padding = Math.max(\n 0,\n termWidth - term.length + itemSepWidth,\n );\n out.push(` ${BLUE}${term}${RST}${\" \".repeat(padding)}${DIM}${desc}${RST}`);\n }\n out.push(\"\");\n }\n\n return out.join(\"\\n\");\n },\n });\n}\n\nfunction renderDefault(cmd: Command, helper: Help): string {\n const termWidth = helper.padWidth(cmd, helper);\n const helpWidth = helper.helpWidth ?? process.stdout.columns ?? 80;\n const itemSepWidth = 2;\n\n const lines: string[] = [`${BOLD}Usage:${RST} ${helper.commandUsage(cmd)}\\n`];\n const description = helper.commandDescription(cmd);\n if (description.length > 0) {\n lines.push(helper.wrap(description, helpWidth, 0) + \"\\n\");\n }\n\n const args = helper.visibleArguments(cmd).map((a) => {\n const term = helper.argumentTerm(a);\n const pad = \" \".repeat(Math.max(0, termWidth - term.length) + itemSepWidth);\n return `${BLUE}${term}${RST}${pad}${DIM}${helper.argumentDescription(a)}${RST}`;\n });\n if (args.length > 0) {\n lines.push(`${BOLD}Arguments:${RST}`);\n for (const a of args) lines.push(` ${a}`);\n lines.push(\"\");\n }\n\n const opts = helper.visibleOptions(cmd).map((o) => {\n const term = helper.optionTerm(o);\n const pad = \" \".repeat(Math.max(0, termWidth - term.length) + itemSepWidth);\n return `${BLUE}${term}${RST}${pad}${DIM}${helper.optionDescription(o)}${RST}`;\n });\n if (opts.length > 0) {\n lines.push(`${BOLD}Options:${RST}`);\n for (const o of opts) lines.push(` ${o}`);\n lines.push(\"\");\n }\n\n const subs = helper.visibleCommands(cmd).map((c) => {\n const term = helper.subcommandTerm(c);\n const pad = \" \".repeat(Math.max(0, termWidth - term.length) + itemSepWidth);\n return `${BLUE}${term}${RST}${pad}${DIM}${helper.subcommandDescription(c)}${RST}`;\n });\n if (subs.length > 0) {\n lines.push(`${BOLD}Commands:${RST}`);\n for (const s of subs) lines.push(` ${s}`);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\n\nimport { getConfigPath } from \"./config.js\";\nimport { isNewer } from \"./semver.js\";\nimport { getStatePath, type UpdateState } from \"./state.js\";\n\n/**\n * Pre-command update-nag banner. Runs synchronously at the very top of\n * every `run()` invocation, before commander even touches argv. Prints\n * one line to stderr if:\n *\n * 1. `~/.almanac/update-state.json` exists and parses.\n * 2. `latest_version` is strictly newer than `installed_version`.\n * 3. `latest_version` is NOT in `dismissed_versions`.\n * 4. `~/.almanac/config.json`.`update_notifier` is not `false`.\n *\n * Otherwise silent. Deliberately synchronous and filesystem-blocking:\n * this runs in the CLI critical path and waiting on a Promise would\n * force every command to become async upfront. The files are tiny\n * (<1KB each); a sync read is cheap.\n *\n * Why stderr: agents and scripts parse stdout; stderr is the\n * conventional channel for diagnostics and nags. A tool piping\n * `almanac search` into `xargs` shouldn't see the banner mixed into\n * its slug list. Users running interactively see stderr anyway, so\n * the nag is visible in practice.\n */\n\nexport interface AnnounceOptions {\n statePath?: string;\n configPath?: string;\n /** Override for tests — normally reads from package.json at import time. */\n installedVersion?: string;\n /** Enable ANSI coloring regardless of isTTY. Tests pass `false`. */\n color?: boolean;\n}\n\nconst RST = \"\\x1b[0m\";\nconst BOLD = \"\\x1b[1m\";\nconst YELLOW = \"\\x1b[33m\";\n\nexport function announceUpdateIfAvailable(\n stderr: NodeJS.WritableStream,\n opts: AnnounceOptions = {},\n): void {\n const statePath = opts.statePath ?? getStatePath();\n const configPath = opts.configPath ?? getConfigPath();\n const installed = opts.installedVersion ?? readInstalledVersion();\n\n // Config gate. Must be checked before state: a user who disabled the\n // notifier shouldn't pay even a state-file read.\n if (!shouldNotify(configPath)) return;\n\n const state = readStateSync(statePath);\n if (state === null) return;\n if (state.latest_version.length === 0) return;\n if (!isNewer(state.latest_version, installed)) return;\n if (state.dismissed_versions.includes(state.latest_version)) return;\n\n const useColor =\n opts.color ?? (process.stderr.isTTY === true && !(\"NO_COLOR\" in process.env));\n const warn = useColor ? `${YELLOW}${BOLD}\\u26a0${RST}` : \"!\";\n const cmd = useColor ? `${BOLD}almanac update${RST}` : \"almanac update\";\n stderr.write(\n `${warn} codealmanac ${state.latest_version} available ` +\n `(you're on ${installed}) — run: ${cmd}\\n`,\n );\n}\n\n/**\n * Sync-read the state file. Returns `null` when missing, empty, or\n * malformed — the announce path MUST NOT throw into the CLI critical\n * path. Avoids the `async readState` used by the worker because\n * `run()` would otherwise need `await announceUpdateIfAvailable(...)`\n * on every invocation, which turns into a multi-millisecond penalty\n * on commands that don't care.\n */\nfunction readStateSync(path: string): UpdateState | null {\n let raw: string;\n try {\n raw = readFileSync(path, \"utf8\");\n } catch {\n return null;\n }\n const trimmed = raw.trim();\n if (trimmed.length === 0) return null;\n try {\n const parsed = JSON.parse(trimmed) as Partial<UpdateState>;\n return {\n last_check_at:\n typeof parsed.last_check_at === \"number\" ? parsed.last_check_at : 0,\n installed_version:\n typeof parsed.installed_version === \"string\"\n ? parsed.installed_version\n : \"\",\n latest_version:\n typeof parsed.latest_version === \"string\" ? parsed.latest_version : \"\",\n dismissed_versions: Array.isArray(parsed.dismissed_versions)\n ? parsed.dismissed_versions.filter(\n (v): v is string => typeof v === \"string\",\n )\n : [],\n };\n } catch {\n return null;\n }\n}\n\nfunction shouldNotify(configPath: string): boolean {\n let raw: string;\n try {\n raw = readFileSync(configPath, \"utf8\");\n } catch {\n return true; // no config file → default notify on\n }\n const trimmed = raw.trim();\n if (trimmed.length === 0) return true;\n try {\n const parsed = JSON.parse(trimmed) as { update_notifier?: unknown };\n if (parsed.update_notifier === false) return false;\n return true;\n } catch {\n return true;\n }\n}\n\nfunction readInstalledVersion(): string {\n // Dev: `src/update/announce.ts` → `../../package.json`. Bundled:\n // `dist/codealmanac.js` → `../package.json`. Try both.\n try {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../../package.json\") as { version?: unknown };\n if (typeof pkg.version === \"string\" && pkg.version.length > 0) {\n return pkg.version;\n }\n } catch {\n // Fall through.\n }\n try {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version?: unknown };\n if (typeof pkg.version === \"string\" && pkg.version.length > 0) {\n return pkg.version;\n }\n } catch {\n // Fall through.\n }\n return \"unknown\";\n}\n"],"mappings":"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","names":["createRequire","RST","BOLD","require","require","createRequire"]}
@@ -51,17 +51,44 @@ function detectInstallDir() {
51
51
  }
52
52
 
53
53
  // bin/codealmanac.ts
54
- var abiError = checkSqliteAbi();
55
- if (abiError !== null) {
56
- process.stderr.write(`almanac: ${abiError}
54
+ if (shouldCheckSqliteAbi(process.argv)) {
55
+ const abiError = checkSqliteAbi();
56
+ if (abiError !== null) {
57
+ process.stderr.write(`almanac: ${abiError}
57
58
  `);
58
- process.exit(1);
59
+ process.exit(1);
60
+ }
59
61
  }
60
- var { run } = await import("./cli-GTEC5PC7.js");
62
+ var { run } = await import("./cli-AIH5QQ5H.js");
61
63
  run(process.argv).catch((err) => {
62
64
  const message = err instanceof Error ? err.message : String(err);
63
65
  process.stderr.write(`almanac: ${message}
64
66
  `);
65
67
  process.exit(1);
66
68
  });
69
+ function shouldCheckSqliteAbi(argv) {
70
+ const invoked = argv[1]?.split(/[\\/]/).pop() ?? "almanac";
71
+ const args = argv.slice(2);
72
+ if (args.includes("--internal-check-updates")) return false;
73
+ if (args.length === 1 && (args[0] === "--version" || args[0] === "-v")) {
74
+ return false;
75
+ }
76
+ if (invoked === "codealmanac") {
77
+ if (args.length === 0) return false;
78
+ if (args.every(
79
+ (arg) => arg === "--yes" || arg === "-y" || arg === "--skip-hook" || arg === "--skip-guides"
80
+ )) {
81
+ return false;
82
+ }
83
+ }
84
+ const sqliteFreeCommands = /* @__PURE__ */ new Set([
85
+ "setup",
86
+ "hook",
87
+ "uninstall",
88
+ "update",
89
+ "doctor"
90
+ ]);
91
+ const firstCommand = args.find((arg) => !arg.startsWith("-"));
92
+ return firstCommand === void 0 || !sqliteFreeCommands.has(firstCommand);
93
+ }
67
94
  //# sourceMappingURL=codealmanac.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/abi-guard.ts","../bin/codealmanac.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Check whether the `better-sqlite3` native binding is compatible with\n * the currently-running Node version. Called once at startup — before any\n * commander setup or wiki code runs — so users see a clear, actionable\n * error instead of a cryptic `NODE_MODULE_VERSION` stack trace deep inside\n * the indexer.\n *\n * Returns `null` when the binding loads cleanly (happy path). Returns a\n * human-readable error string when the binding fails; the caller writes\n * it to stderr and exits 1.\n *\n * **Why this exists (bug #3 from codealmanac-known-bugs.md):**\n *\n * `better-sqlite3` uses the old V8 ABI (not N-API). When a user switches\n * Node versions via nvm/volta/fnm, the prebuilt native binding compiled\n * for the old version fails under the new one. Node 21 (EOL) has no\n * prebuilt binary at all, so even a fresh install can fail there.\n *\n * The guard catches this at the entry point and emits two actionable lines:\n * 1. What went wrong (was installed for Node ABI X, running ABI Y)\n * 2. The exact command to fix it (`npm rebuild better-sqlite3`)\n */\nexport function checkSqliteAbi(): string | null {\n const req = createRequire(import.meta.url);\n try {\n // Open an in-memory DB — the cheapest proof that the native binding\n // loads. `:memory:` doesn't touch disk; we close immediately.\n const Database = req(\"better-sqlite3\") as typeof import(\"better-sqlite3\");\n const db = new Database(\":memory:\");\n db.close();\n return null; // All good.\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n const firstLine = msg.split(\"\\n\")[0] ?? msg;\n\n // Extract ABI version numbers from the error message when present.\n // NODE_MODULE_VERSION errors read: \"Expected N, got M\".\n const versionMatch = firstLine.match(/Expected (\\d+), got (\\d+)/);\n const detail = versionMatch\n ? ` (built for Node ABI ${versionMatch[1]}, running ABI ${versionMatch[2]})`\n : `: ${firstLine}`;\n\n // Find the codealmanac install directory so the `npm rebuild` hint\n // points at the right place. Walk up from this module's location.\n const installDir = detectInstallDir();\n\n return (\n `better-sqlite3 native binding failed${detail}.\\n` +\n ` Fix: cd \"${installDir}\" && npm rebuild better-sqlite3\\n` +\n ` Or switch back to the Node version it was compiled for: nvm use <version>`\n );\n }\n}\n\n/**\n * Walk up from this module's file to the nearest directory that contains\n * `package.json` with `\"name\": \"codealmanac\"`. Falls back to a generic\n * description when the walk fails (unusual install layout or bundled).\n */\nfunction detectInstallDir(): string {\n try {\n const here = fileURLToPath(import.meta.url);\n const req = createRequire(import.meta.url);\n let dir = path.dirname(here);\n for (let i = 0; i < 5; i++) {\n const pkgPath = path.join(dir, \"package.json\");\n try {\n const raw = req(\"fs\").readFileSync(pkgPath, \"utf-8\") as string;\n const pkg = JSON.parse(raw) as { name?: unknown };\n if (pkg.name === \"codealmanac\") return dir;\n } catch {\n // keep walking\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n // import.meta.url unavailable or fs broken — use fallback.\n }\n // Generic fallback: point at the typical global install location.\n return path.join(\n homedir(),\n \".nvm/versions/node\",\n process.version,\n \"lib/node_modules/codealmanac\",\n );\n}\n","import { checkSqliteAbi } from \"../src/abi-guard.js\";\n\n// ABI guard: detect better-sqlite3 binding mismatch before any command\n// runs. When the binary was compiled for a different Node ABI (common\n// after switching Node versions via nvm/volta/fnm), the native binding\n// throws a cryptic NODE_MODULE_VERSION error the first time any indexer\n// code touches it. The guard catches it here, at the entry point, and\n// emits a human-readable message with a concrete fix before exiting.\n// This is bug #3 from codealmanac-known-bugs.md.\nconst abiError = checkSqliteAbi();\nif (abiError !== null) {\n process.stderr.write(`almanac: ${abiError}\\n`);\n process.exit(1);\n}\n\nconst { run } = await import(\"../src/cli.js\");\n\nrun(process.argv).catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`almanac: ${message}\\n`);\n process.exit(1);\n});\n"],"mappings":";;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AACxB,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAwBvB,SAAS,iBAAgC;AAC9C,QAAM,MAAM,cAAc,YAAY,GAAG;AACzC,MAAI;AAGF,UAAM,WAAW,IAAI,gBAAgB;AACrC,UAAM,KAAK,IAAI,SAAS,UAAU;AAClC,OAAG,MAAM;AACT,WAAO;AAAA,EACT,SAAS,KAAc;AACrB,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAM,YAAY,IAAI,MAAM,IAAI,EAAE,CAAC,KAAK;AAIxC,UAAM,eAAe,UAAU,MAAM,2BAA2B;AAChE,UAAM,SAAS,eACX,wBAAwB,aAAa,CAAC,CAAC,iBAAiB,aAAa,CAAC,CAAC,MACvE,KAAK,SAAS;AAIlB,UAAM,aAAa,iBAAiB;AAEpC,WACE,uCAAuC,MAAM;AAAA,aAC/B,UAAU;AAAA;AAAA,EAG5B;AACF;AAOA,SAAS,mBAA2B;AAClC,MAAI;AACF,UAAM,OAAO,cAAc,YAAY,GAAG;AAC1C,UAAM,MAAM,cAAc,YAAY,GAAG;AACzC,QAAI,MAAM,KAAK,QAAQ,IAAI;AAC3B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,UAAU,KAAK,KAAK,KAAK,cAAc;AAC7C,UAAI;AACF,cAAM,MAAM,IAAI,IAAI,EAAE,aAAa,SAAS,OAAO;AACnD,cAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,YAAI,IAAI,SAAS,cAAe,QAAO;AAAA,MACzC,QAAQ;AAAA,MAER;AACA,YAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,UAAI,WAAW,IAAK;AACpB,YAAM;AAAA,IACR;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,KAAK;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AACF;;;ACnFA,IAAM,WAAW,eAAe;AAChC,IAAI,aAAa,MAAM;AACrB,UAAQ,OAAO,MAAM,YAAY,QAAQ;AAAA,CAAI;AAC7C,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,EAAE,IAAI,IAAI,MAAM,OAAO,mBAAe;AAE5C,IAAI,QAAQ,IAAI,EAAE,MAAM,CAAC,QAAiB;AACxC,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,UAAQ,OAAO,MAAM,YAAY,OAAO;AAAA,CAAI;AAC5C,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/abi-guard.ts","../bin/codealmanac.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Check whether the `better-sqlite3` native binding is compatible with\n * the currently-running Node version. Called once at startup — before any\n * commander setup or wiki code runs — so users see a clear, actionable\n * error instead of a cryptic `NODE_MODULE_VERSION` stack trace deep inside\n * the indexer.\n *\n * Returns `null` when the binding loads cleanly (happy path). Returns a\n * human-readable error string when the binding fails; the caller writes\n * it to stderr and exits 1.\n *\n * **Why this exists (bug #3 from codealmanac-known-bugs.md):**\n *\n * `better-sqlite3` uses the old V8 ABI (not N-API). When a user switches\n * Node versions via nvm/volta/fnm, the prebuilt native binding compiled\n * for the old version fails under the new one. Node 21 (EOL) has no\n * prebuilt binary at all, so even a fresh install can fail there.\n *\n * The guard catches this at the entry point and emits two actionable lines:\n * 1. What went wrong (was installed for Node ABI X, running ABI Y)\n * 2. The exact command to fix it (`npm rebuild better-sqlite3`)\n */\nexport function checkSqliteAbi(): string | null {\n const req = createRequire(import.meta.url);\n try {\n // Open an in-memory DB — the cheapest proof that the native binding\n // loads. `:memory:` doesn't touch disk; we close immediately.\n const Database = req(\"better-sqlite3\") as typeof import(\"better-sqlite3\");\n const db = new Database(\":memory:\");\n db.close();\n return null; // All good.\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n const firstLine = msg.split(\"\\n\")[0] ?? msg;\n\n // Extract ABI version numbers from the error message when present.\n // NODE_MODULE_VERSION errors read: \"Expected N, got M\".\n const versionMatch = firstLine.match(/Expected (\\d+), got (\\d+)/);\n const detail = versionMatch\n ? ` (built for Node ABI ${versionMatch[1]}, running ABI ${versionMatch[2]})`\n : `: ${firstLine}`;\n\n // Find the codealmanac install directory so the `npm rebuild` hint\n // points at the right place. Walk up from this module's location.\n const installDir = detectInstallDir();\n\n return (\n `better-sqlite3 native binding failed${detail}.\\n` +\n ` Fix: cd \"${installDir}\" && npm rebuild better-sqlite3\\n` +\n ` Or switch back to the Node version it was compiled for: nvm use <version>`\n );\n }\n}\n\n/**\n * Walk up from this module's file to the nearest directory that contains\n * `package.json` with `\"name\": \"codealmanac\"`. Falls back to a generic\n * description when the walk fails (unusual install layout or bundled).\n */\nfunction detectInstallDir(): string {\n try {\n const here = fileURLToPath(import.meta.url);\n const req = createRequire(import.meta.url);\n let dir = path.dirname(here);\n for (let i = 0; i < 5; i++) {\n const pkgPath = path.join(dir, \"package.json\");\n try {\n const raw = req(\"fs\").readFileSync(pkgPath, \"utf-8\") as string;\n const pkg = JSON.parse(raw) as { name?: unknown };\n if (pkg.name === \"codealmanac\") return dir;\n } catch {\n // keep walking\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n // import.meta.url unavailable or fs broken — use fallback.\n }\n // Generic fallback: point at the typical global install location.\n return path.join(\n homedir(),\n \".nvm/versions/node\",\n process.version,\n \"lib/node_modules/codealmanac\",\n );\n}\n","import { checkSqliteAbi } from \"../src/abi-guard.js\";\n\n// ABI guard: detect better-sqlite3 binding mismatch before commands that may\n// touch the indexer. Skip setup/version/update-only paths so a fresh `npx\n// codealmanac` can install/fix itself even when the native binding is broken.\nif (shouldCheckSqliteAbi(process.argv)) {\n const abiError = checkSqliteAbi();\n if (abiError !== null) {\n process.stderr.write(`almanac: ${abiError}\\n`);\n process.exit(1);\n }\n}\n\nconst { run } = await import(\"../src/cli.js\");\n\nrun(process.argv).catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`almanac: ${message}\\n`);\n process.exit(1);\n});\n\nfunction shouldCheckSqliteAbi(argv: string[]): boolean {\n const invoked = argv[1]?.split(/[\\\\/]/).pop() ?? \"almanac\";\n const args = argv.slice(2);\n\n if (args.includes(\"--internal-check-updates\")) return false;\n if (args.length === 1 && (args[0] === \"--version\" || args[0] === \"-v\")) {\n return false;\n }\n\n if (invoked === \"codealmanac\") {\n if (args.length === 0) return false;\n if (\n args.every((arg) =>\n arg === \"--yes\" ||\n arg === \"-y\" ||\n arg === \"--skip-hook\" ||\n arg === \"--skip-guides\"\n )\n ) {\n return false;\n }\n }\n\n const sqliteFreeCommands = new Set([\n \"setup\",\n \"hook\",\n \"uninstall\",\n \"update\",\n \"doctor\",\n ]);\n const firstCommand = args.find((arg) => !arg.startsWith(\"-\"));\n return firstCommand === undefined || !sqliteFreeCommands.has(firstCommand);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ runDoctor
4
+ } from "./chunk-H6WU6PYH.js";
5
+ import "./chunk-4CODZRHH.js";
6
+ import "./chunk-QHQ6YH7U.js";
7
+ import "./chunk-FM3VRDK7.js";
8
+ import "./chunk-2JJTTN7P.js";
9
+ import "./chunk-Z4MWLVS2.js";
10
+ import "./chunk-AXFPUHBN.js";
11
+ import "./chunk-7JUX4ADQ.js";
12
+ export {
13
+ runDoctor
14
+ };
15
+ //# sourceMappingURL=doctor-6FN5JO5F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ runHookInstall,
4
+ runHookStatus,
5
+ runHookUninstall
6
+ } from "./chunk-Z4MWLVS2.js";
7
+ export {
8
+ runHookInstall,
9
+ runHookStatus,
10
+ runHookUninstall
11
+ };
12
+ //# sourceMappingURL=hook-CRJMWSSO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}