@ryanstark24/sfgraph-cli 1.1.0

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 (97) hide show
  1. package/dist/__tests__/doctor.test.d.ts +2 -0
  2. package/dist/__tests__/doctor.test.d.ts.map +1 -0
  3. package/dist/__tests__/doctor.test.js +64 -0
  4. package/dist/__tests__/doctor.test.js.map +1 -0
  5. package/dist/__tests__/ingest-db-guard.test.d.ts +2 -0
  6. package/dist/__tests__/ingest-db-guard.test.d.ts.map +1 -0
  7. package/dist/__tests__/ingest-db-guard.test.js +110 -0
  8. package/dist/__tests__/ingest-db-guard.test.js.map +1 -0
  9. package/dist/__tests__/ingest-multi.test.d.ts +2 -0
  10. package/dist/__tests__/ingest-multi.test.d.ts.map +1 -0
  11. package/dist/__tests__/ingest-multi.test.js +51 -0
  12. package/dist/__tests__/ingest-multi.test.js.map +1 -0
  13. package/dist/__tests__/install-dry-run.test.d.ts +2 -0
  14. package/dist/__tests__/install-dry-run.test.d.ts.map +1 -0
  15. package/dist/__tests__/install-dry-run.test.js +29 -0
  16. package/dist/__tests__/install-dry-run.test.js.map +1 -0
  17. package/dist/__tests__/install-e2e.test.d.ts +2 -0
  18. package/dist/__tests__/install-e2e.test.d.ts.map +1 -0
  19. package/dist/__tests__/install-e2e.test.js +33 -0
  20. package/dist/__tests__/install-e2e.test.js.map +1 -0
  21. package/dist/__tests__/mcp-config.test.d.ts +2 -0
  22. package/dist/__tests__/mcp-config.test.d.ts.map +1 -0
  23. package/dist/__tests__/mcp-config.test.js +104 -0
  24. package/dist/__tests__/mcp-config.test.js.map +1 -0
  25. package/dist/__tests__/rebuild.test.d.ts +2 -0
  26. package/dist/__tests__/rebuild.test.d.ts.map +1 -0
  27. package/dist/__tests__/rebuild.test.js +180 -0
  28. package/dist/__tests__/rebuild.test.js.map +1 -0
  29. package/dist/__tests__/serve-guard.test.d.ts +2 -0
  30. package/dist/__tests__/serve-guard.test.d.ts.map +1 -0
  31. package/dist/__tests__/serve-guard.test.js +82 -0
  32. package/dist/__tests__/serve-guard.test.js.map +1 -0
  33. package/dist/__tests__/snapshot.test.d.ts +2 -0
  34. package/dist/__tests__/snapshot.test.d.ts.map +1 -0
  35. package/dist/__tests__/snapshot.test.js +139 -0
  36. package/dist/__tests__/snapshot.test.js.map +1 -0
  37. package/dist/__tests__/telemetry.test.d.ts +2 -0
  38. package/dist/__tests__/telemetry.test.d.ts.map +1 -0
  39. package/dist/__tests__/telemetry.test.js +53 -0
  40. package/dist/__tests__/telemetry.test.js.map +1 -0
  41. package/dist/commands/_mcp-config.d.ts +30 -0
  42. package/dist/commands/_mcp-config.d.ts.map +1 -0
  43. package/dist/commands/_mcp-config.js +98 -0
  44. package/dist/commands/_mcp-config.js.map +1 -0
  45. package/dist/commands/doctor.d.ts +28 -0
  46. package/dist/commands/doctor.d.ts.map +1 -0
  47. package/dist/commands/doctor.js +356 -0
  48. package/dist/commands/doctor.js.map +1 -0
  49. package/dist/commands/ingest.d.ts +31 -0
  50. package/dist/commands/ingest.d.ts.map +1 -0
  51. package/dist/commands/ingest.js +260 -0
  52. package/dist/commands/ingest.js.map +1 -0
  53. package/dist/commands/install.d.ts +44 -0
  54. package/dist/commands/install.d.ts.map +1 -0
  55. package/dist/commands/install.js +214 -0
  56. package/dist/commands/install.js.map +1 -0
  57. package/dist/commands/link.d.ts +6 -0
  58. package/dist/commands/link.d.ts.map +1 -0
  59. package/dist/commands/link.js +23 -0
  60. package/dist/commands/link.js.map +1 -0
  61. package/dist/commands/rebuild-bindings.d.ts +26 -0
  62. package/dist/commands/rebuild-bindings.d.ts.map +1 -0
  63. package/dist/commands/rebuild-bindings.js +129 -0
  64. package/dist/commands/rebuild-bindings.js.map +1 -0
  65. package/dist/commands/refresh-orgs.d.ts +17 -0
  66. package/dist/commands/refresh-orgs.d.ts.map +1 -0
  67. package/dist/commands/refresh-orgs.js +26 -0
  68. package/dist/commands/refresh-orgs.js.map +1 -0
  69. package/dist/commands/serve.d.ts +8 -0
  70. package/dist/commands/serve.d.ts.map +1 -0
  71. package/dist/commands/serve.js +188 -0
  72. package/dist/commands/serve.js.map +1 -0
  73. package/dist/commands/snapshot.d.ts +26 -0
  74. package/dist/commands/snapshot.d.ts.map +1 -0
  75. package/dist/commands/snapshot.js +164 -0
  76. package/dist/commands/snapshot.js.map +1 -0
  77. package/dist/commands/telemetry.d.ts +13 -0
  78. package/dist/commands/telemetry.d.ts.map +1 -0
  79. package/dist/commands/telemetry.js +57 -0
  80. package/dist/commands/telemetry.js.map +1 -0
  81. package/dist/commands/wip.d.ts +8 -0
  82. package/dist/commands/wip.d.ts.map +1 -0
  83. package/dist/commands/wip.js +60 -0
  84. package/dist/commands/wip.js.map +1 -0
  85. package/dist/config.d.ts +14 -0
  86. package/dist/config.d.ts.map +1 -0
  87. package/dist/config.js +28 -0
  88. package/dist/config.js.map +1 -0
  89. package/dist/index.d.ts +6 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +239 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/version.d.ts +2 -0
  94. package/dist/version.d.ts.map +1 -0
  95. package/dist/version.js +20 -0
  96. package/dist/version.js.map +1 -0
  97. package/package.json +60 -0
@@ -0,0 +1,98 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { homedir, platform } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ /** MCP server invocation. On Windows, `npx` is `npx.cmd`; spawned tools that
6
+ * receive `command: 'npx'` literally will ENOENT. We emit the platform-correct
7
+ * binary so the same `sfgraph install` produces a working config on macOS,
8
+ * Linux, and Windows.
9
+ *
10
+ * When `localBinPath` is set (local-dev mode), invoke the local build via
11
+ * `node <absPath> mcp` — no PATH dependency, no published npm package
12
+ * required. */
13
+ function sfgraphEntryFor(plat, localBinPath, pinNode, env) {
14
+ let entry;
15
+ if (localBinPath) {
16
+ entry = { command: pinNode ?? "node", args: [localBinPath, "mcp"] };
17
+ }
18
+ else if (plat === "win32") {
19
+ entry = { command: "npx.cmd", args: ["-y", "@ryanstark24/sfgraph"] };
20
+ }
21
+ else {
22
+ entry = { command: "npx", args: ["-y", "@ryanstark24/sfgraph"] };
23
+ }
24
+ if (env && Object.keys(env).length > 0)
25
+ entry.env = env;
26
+ return entry;
27
+ }
28
+ export function configPathFor(target, opts = {}) {
29
+ const home = opts.homeOverride ?? homedir();
30
+ const plat = opts.platformOverride ?? platform();
31
+ switch (target) {
32
+ case "claude": {
33
+ // Claude Desktop config path is per-platform.
34
+ if (plat === "darwin") {
35
+ return join(home, "Library", "Application Support", "Claude", "claude_desktop_config.json");
36
+ }
37
+ if (plat === "win32") {
38
+ return join(home, "AppData", "Roaming", "Claude", "claude_desktop_config.json");
39
+ }
40
+ // linux fallback
41
+ return join(home, ".config", "Claude", "claude_desktop_config.json");
42
+ }
43
+ case "cursor":
44
+ // Cursor uses ~/.cursor on every platform.
45
+ return join(home, ".cursor", "mcp.json");
46
+ case "vscode":
47
+ // VS Code's User settings dir is per-platform.
48
+ if (plat === "darwin") {
49
+ return join(home, "Library", "Application Support", "Code", "User", "mcp.json");
50
+ }
51
+ if (plat === "win32") {
52
+ return join(home, "AppData", "Roaming", "Code", "User", "mcp.json");
53
+ }
54
+ return join(home, ".config", "Code", "User", "mcp.json");
55
+ }
56
+ }
57
+ export async function writeMcpConfig(target, opts = {}) {
58
+ const path = configPathFor(target, opts);
59
+ const plat = opts.platformOverride ?? platform();
60
+ const sfgraphEntry = sfgraphEntryFor(plat, opts.localBinPath, opts.pinNode, opts.env);
61
+ let existing = {};
62
+ if (existsSync(path)) {
63
+ try {
64
+ existing = JSON.parse(await readFile(path, "utf8"));
65
+ }
66
+ catch {
67
+ existing = {};
68
+ }
69
+ }
70
+ const merged = { ...existing };
71
+ const servers = { ...(merged.mcpServers ?? {}) };
72
+ const before = servers.sfgraph;
73
+ servers.sfgraph = sfgraphEntry;
74
+ merged.mcpServers = servers;
75
+ const nextJson = `${JSON.stringify(merged, null, 2)}\n`;
76
+ let action;
77
+ if (opts.dryRun) {
78
+ action = "would-write";
79
+ }
80
+ else if (existsSync(path)) {
81
+ const prev = await readFile(path, "utf8");
82
+ if (prev === nextJson && before && before.command === sfgraphEntry.command) {
83
+ action = "skipped";
84
+ }
85
+ else {
86
+ await mkdir(dirname(path), { recursive: true });
87
+ await writeFile(path, nextJson, "utf8");
88
+ action = "updated";
89
+ }
90
+ }
91
+ else {
92
+ await mkdir(dirname(path), { recursive: true });
93
+ await writeFile(path, nextJson, "utf8");
94
+ action = "created";
95
+ }
96
+ return { target, path, action };
97
+ }
98
+ //# sourceMappingURL=_mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_mcp-config.js","sourceRoot":"","sources":["../../src/commands/_mcp-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface DoctorOpts {
2
+ log?: (s: string) => void;
3
+ /** Override the data dir used for the on-disk checks (tests). */
4
+ dataDir?: string;
5
+ /** Override home for resolving IDE MCP config paths (tests). */
6
+ homeOverride?: string;
7
+ /** Stub the `sf --version` check (tests). */
8
+ sfProbe?: () => {
9
+ ok: boolean;
10
+ detail: string;
11
+ };
12
+ /** Stub the require used to load better-sqlite3 (tests). */
13
+ requireFn?: (id: string) => unknown;
14
+ }
15
+ export interface DoctorCheck {
16
+ name: string;
17
+ status: "ok" | "warn" | "fail";
18
+ detail: string;
19
+ /** Optional copy-paste fix command shown to the user. */
20
+ fix?: string;
21
+ }
22
+ export interface DoctorReport {
23
+ checks: DoctorCheck[];
24
+ ok: boolean;
25
+ }
26
+ export declare function runDoctorChecks(opts?: DoctorOpts): DoctorReport;
27
+ export declare function doctorCmd(opts?: DoctorOpts): Promise<DoctorReport>;
28
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1B,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,4DAA4D;IAC5D,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,EAAE,EAAE,OAAO,CAAC;CACb;AA0UD,wBAAgB,eAAe,CAAC,IAAI,GAAE,UAAe,GAAG,YAAY,CAmBnE;AAQD,wBAAsB,SAAS,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAa5E"}
@@ -0,0 +1,356 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { constants, accessSync, existsSync, readFileSync, readdirSync, statSync } from "node:fs";
3
+ import { createRequire } from "node:module";
4
+ import path from "node:path";
5
+ import { isAbiMismatch } from "@ryanstark24/sfgraph-core";
6
+ import { getSfgraphPaths } from "@ryanstark24/sfgraph-shared";
7
+ import { configPathFor } from "./_mcp-config.js";
8
+ function check(name, fn) {
9
+ try {
10
+ return { name, ...fn() };
11
+ }
12
+ catch (e) {
13
+ return {
14
+ name,
15
+ status: "fail",
16
+ detail: `unexpected error: ${e.message}`,
17
+ };
18
+ }
19
+ }
20
+ function checkNode() {
21
+ return {
22
+ status: "ok",
23
+ detail: `${process.version} (ABI ${process.versions.modules}); exec=${process.execPath}`,
24
+ };
25
+ }
26
+ /** Resolve better-sqlite3 from any package that depends on it (core/mcp-server),
27
+ * not just the CLI's own node_modules. Packaged distribution sees it hoisted
28
+ * alongside `@ryanstark24/sfgraph-server`, so resolve via that package's path. */
29
+ function defaultRequire() {
30
+ // Resolve through a sibling package (@ryanstark24/sfgraph-server) that
31
+ // depends on better-sqlite3, so the doctor works whether or not the CLI's
32
+ // own node_modules has the binding hoisted into it.
33
+ const here = createRequire(import.meta.url);
34
+ try {
35
+ const serverEntry = here.resolve("@ryanstark24/sfgraph-server");
36
+ return createRequire(serverEntry);
37
+ }
38
+ catch {
39
+ return here;
40
+ }
41
+ }
42
+ function checkBetterSqlite3(requireFn) {
43
+ const req = requireFn ?? defaultRequire();
44
+ try {
45
+ req("better-sqlite3");
46
+ return { status: "ok", detail: "loads cleanly" };
47
+ }
48
+ catch (e) {
49
+ const msg = e.message;
50
+ if (isAbiMismatch(msg)) {
51
+ return {
52
+ status: "fail",
53
+ detail: `ABI mismatch — binding compiled for a different Node ABI (running ABI ${process.versions.modules})`,
54
+ fix: "npm rebuild better-sqlite3 # or: pnpm rebuild better-sqlite3",
55
+ };
56
+ }
57
+ return {
58
+ status: "fail",
59
+ detail: `failed to load: ${msg.split("\n")[0]}`,
60
+ fix: "npm install --force better-sqlite3",
61
+ };
62
+ }
63
+ }
64
+ /**
65
+ * macOS-only: verify the better-sqlite3 binding's code signature is one
66
+ * dyld will actually accept. The failure mode this catches is the
67
+ * "linker-signed adhoc" stamp that the build toolchain emits — macOS 26+
68
+ * rejects it with SIGKILL on dlopen, with no JS handler able to intercept.
69
+ * The kill is silent; ingests die mid-run with no error message. This
70
+ * check surfaces the issue *before* the next ingest hits it.
71
+ */
72
+ function checkMacosCodesign(requireFn) {
73
+ if (process.platform !== "darwin")
74
+ return null;
75
+ const req = requireFn ?? defaultRequire();
76
+ // Resolve the actual .node file path.
77
+ let bindingPath = null;
78
+ try {
79
+ // The official entry point is index.js; the .node lives under build/Release.
80
+ const entry = req.resolve("better-sqlite3");
81
+ // entry ≈ <pkg>/lib/index.js — walk up to <pkg> then into build/Release.
82
+ const pkgRoot = path.resolve(path.dirname(entry), "..");
83
+ const candidate = path.join(pkgRoot, "build", "Release", "better_sqlite3.node");
84
+ if (existsSync(candidate))
85
+ bindingPath = candidate;
86
+ }
87
+ catch {
88
+ /* unresolvable; skip */
89
+ }
90
+ if (!bindingPath) {
91
+ return {
92
+ status: "warn",
93
+ detail: "couldn't locate better_sqlite3.node to verify code signature",
94
+ };
95
+ }
96
+ const r = spawnSync("codesign", ["--verify", "--strict", bindingPath], {
97
+ encoding: "utf8",
98
+ });
99
+ if (r.error) {
100
+ return {
101
+ status: "warn",
102
+ detail: `codesign tool unavailable: ${r.error.message}`,
103
+ };
104
+ }
105
+ if (r.status === 0) {
106
+ // Verified. Also check it's not the brittle linker-signed adhoc stamp.
107
+ const display = spawnSync("codesign", ["-dvv", bindingPath], { encoding: "utf8" });
108
+ const out = (display.stderr || display.stdout || "").toString();
109
+ if (/linker-signed/.test(out)) {
110
+ return {
111
+ status: "warn",
112
+ detail: "binding has linker-signed adhoc stamp; macOS 26+ may SIGKILL on dlopen. Re-sign with ad-hoc.",
113
+ fix: `codesign --force --sign - "${bindingPath}"`,
114
+ };
115
+ }
116
+ // Secondary check: AMFI library-validation rejection. If Node has
117
+ // Hardened Runtime + library validation enabled (the default for the
118
+ // Node.js Foundation builds + nvm), it refuses to load ad-hoc-signed
119
+ // bindings — even though `codesign --verify` says the binding itself
120
+ // is fine. The symptom is a silent SIGKILL mid-ingest. Detect by
121
+ // inspecting Node's own signing flags + entitlements (NOT the
122
+ // binding's — those are unrelated).
123
+ const nodeFlags = spawnSync("codesign", ["-dvv", process.execPath], { encoding: "utf8" });
124
+ const nodeFlagsOut = (nodeFlags.stderr || nodeFlags.stdout || "").toString();
125
+ const nodeEnts = spawnSync("codesign", ["-d", "--entitlements", "-", "--xml", process.execPath], { encoding: "utf8" });
126
+ const entsOut = (nodeEnts.stdout || nodeEnts.stderr || "").toString();
127
+ const hasLibValDisabled = /com\.apple\.security\.cs\.disable-library-validation/.test(entsOut);
128
+ // Node binary has Hardened Runtime if its codesign flags include
129
+ // `runtime` (the human-readable name) or 0x10000 (the bit). Foundation
130
+ // / nvm builds always do.
131
+ const isHardenedRuntime = /flags=0x[0-9a-f]*\(.*\bruntime\b/.test(nodeFlagsOut) ||
132
+ /flags=0x10000\b/.test(nodeFlagsOut) ||
133
+ /\bruntime\b/.test(nodeFlagsOut);
134
+ if (isHardenedRuntime && !hasLibValDisabled) {
135
+ const entitlementsPath = "/tmp/sfgraph-node-libval.plist";
136
+ const plistBody = `<?xml version="1.0" encoding="UTF-8"?>
137
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
138
+ <plist version="1.0"><dict>
139
+ <key>com.apple.security.cs.disable-library-validation</key><true/>
140
+ <key>com.apple.security.cs.allow-jit</key><true/>
141
+ <key>com.apple.security.cs.allow-unsigned-executable-memory</key><true/>
142
+ </dict></plist>`;
143
+ return {
144
+ status: "warn",
145
+ detail: `Node has Hardened Runtime with library validation; AMFI will SIGKILL on ad-hoc-signed bindings mid-ingest (silent death, no error). Re-sign Node with disable-library-validation entitlement.`,
146
+ fix: `cat > ${entitlementsPath} <<'EOF'\n${plistBody}\nEOF\ncodesign --force --sign - --entitlements ${entitlementsPath} ${process.execPath}`,
147
+ };
148
+ }
149
+ return { status: "ok", detail: `code signature valid (${bindingPath})` };
150
+ }
151
+ return {
152
+ status: "fail",
153
+ detail: `codesign rejected binding: ${(r.stderr || r.stdout || "").trim().split("\n")[0]}`,
154
+ fix: `codesign --force --sign - "${bindingPath}"`,
155
+ };
156
+ }
157
+ function checkDataDir(dataDir) {
158
+ if (!existsSync(dataDir)) {
159
+ return {
160
+ status: "warn",
161
+ detail: `${dataDir} does not exist (will be created on first ingest)`,
162
+ };
163
+ }
164
+ try {
165
+ accessSync(dataDir, constants.W_OK);
166
+ return { status: "ok", detail: `${dataDir} (writable)` };
167
+ }
168
+ catch {
169
+ return {
170
+ status: "fail",
171
+ detail: `${dataDir} exists but is not writable`,
172
+ fix: `chmod u+w "${dataDir}"`,
173
+ };
174
+ }
175
+ }
176
+ function checkOrgDatabases(dataDir, requireFn) {
177
+ if (!existsSync(dataDir)) {
178
+ return { status: "warn", detail: "no data dir yet — run `sfgraph ingest --org <alias>`" };
179
+ }
180
+ let files = [];
181
+ try {
182
+ files = readdirSync(dataDir).filter((f) => f.endsWith(".sqlite") && !f.startsWith("backups"));
183
+ }
184
+ catch {
185
+ return { status: "warn", detail: "cannot read data dir" };
186
+ }
187
+ if (files.length === 0) {
188
+ return { status: "warn", detail: "no <orgId>.sqlite files yet" };
189
+ }
190
+ const req = requireFn ?? defaultRequire();
191
+ let Ctor;
192
+ try {
193
+ Ctor = req("better-sqlite3");
194
+ }
195
+ catch (e) {
196
+ return {
197
+ status: "fail",
198
+ detail: `cannot load better-sqlite3 to verify org DBs: ${e.message.split("\n")[0]}`,
199
+ };
200
+ }
201
+ const Ctor2 = Ctor;
202
+ const failures = [];
203
+ for (const f of files) {
204
+ const dbPath = path.join(dataDir, f);
205
+ try {
206
+ const db = new Ctor2(dbPath, { readonly: true, fileMustExist: true });
207
+ try {
208
+ // _sfgraph_schema_version is created by the migration runner on first init
209
+ db.prepare("SELECT version FROM _sfgraph_schema_version LIMIT 1").get();
210
+ }
211
+ finally {
212
+ db.close();
213
+ }
214
+ }
215
+ catch (e) {
216
+ // Surface the full multi-line error message — better-sqlite3 ABI
217
+ // mismatch errors put the salient detail on lines 2-4, and the
218
+ // single-line truncation made every failure look identical even
219
+ // when the root cause varied.
220
+ const fullMsg = e.message.replace(/\n/g, "\n ");
221
+ failures.push(`${f}:\n ${fullMsg}`);
222
+ }
223
+ }
224
+ if (failures.length > 0) {
225
+ return {
226
+ status: "fail",
227
+ detail: `${failures.length} of ${files.length} org DBs failed to open:\n ${failures.join("\n ")}`,
228
+ // The 'bindings file not found' / ABI mismatch failure mode is a
229
+ // native-binding issue (Node version doesn't match what better-sqlite3
230
+ // was built for), NOT a graph corruption issue. Re-ingest would just
231
+ // hit the same load failure. Point users at the binding rebuild
232
+ // instead; once that's green, `sfgraph doctor` reruns cleanly.
233
+ fix: "Rebuild the native binding for your Node runtime: sfgraph rebuild-bindings",
234
+ };
235
+ }
236
+ return { status: "ok", detail: `${files.length} org DB(s) open with expected schema` };
237
+ }
238
+ function checkSfCli(sfProbe) {
239
+ if (sfProbe) {
240
+ const r = sfProbe();
241
+ return r.ok
242
+ ? { status: "ok", detail: r.detail }
243
+ : { status: "warn", detail: r.detail, fix: "install: npm i -g @salesforce/cli" };
244
+ }
245
+ const r = spawnSync(process.platform === "win32" ? "sf.cmd" : "sf", ["--version"], {
246
+ encoding: "utf8",
247
+ });
248
+ if (r.error || r.status !== 0) {
249
+ return {
250
+ status: "warn",
251
+ detail: "`sf` CLI not found on PATH (only required for `sfgraph ingest`)",
252
+ fix: "npm i -g @salesforce/cli",
253
+ };
254
+ }
255
+ return { status: "ok", detail: (r.stdout || "").trim().split("\n")[0] ?? "found" };
256
+ }
257
+ function checkMcpConfigs(homeOverride) {
258
+ const targets = ["claude", "cursor", "vscode"];
259
+ const found = [];
260
+ const missing = [];
261
+ for (const t of targets) {
262
+ const opts = homeOverride ? { homeOverride } : {};
263
+ const p = configPathFor(t, opts);
264
+ if (existsSync(p))
265
+ found.push(`${t}: ${p}`);
266
+ else
267
+ missing.push(t);
268
+ }
269
+ if (found.length === 0) {
270
+ return {
271
+ status: "warn",
272
+ detail: "no IDE MCP configs detected",
273
+ fix: "sfgraph install --target cursor # or claude / vscode / all",
274
+ };
275
+ }
276
+ const detail = found.join(", ") + (missing.length > 0 ? ` (not configured: ${missing.join(", ")})` : "");
277
+ return { status: "ok", detail };
278
+ }
279
+ function checkOrgSnapshot(dataDir) {
280
+ const p = path.join(dataDir, "orgs-snapshot.json");
281
+ if (!existsSync(p)) {
282
+ return {
283
+ status: "warn",
284
+ detail: "missing — list_orgs in a sandboxed MCP child will show empty aliases / no default-org",
285
+ fix: "Run `sfgraph refresh-orgs` (or `sfgraph install`) to capture sf state",
286
+ };
287
+ }
288
+ try {
289
+ const raw = JSON.parse(readFileSync(p, "utf8"));
290
+ const orgCount = Object.keys(raw.authorizations ?? {}).length;
291
+ if (orgCount === 0) {
292
+ return {
293
+ status: "warn",
294
+ detail: "snapshot has 0 orgs — sf was probably not authenticated when install ran",
295
+ fix: "Run `sf org login web --alias <X>` then `sfgraph refresh-orgs`",
296
+ };
297
+ }
298
+ const ageMs = Date.now() - (raw.recordedAt ?? statSync(p).mtimeMs);
299
+ const ageDays = Math.floor(ageMs / (1000 * 60 * 60 * 24));
300
+ if (ageDays >= 7) {
301
+ return {
302
+ status: "warn",
303
+ detail: `${orgCount} org${orgCount === 1 ? "" : "s"} snapshot, ${ageDays}d old`,
304
+ fix: "Run `sfgraph refresh-orgs` to capture any sf-CLI changes",
305
+ };
306
+ }
307
+ return {
308
+ status: "ok",
309
+ detail: `${orgCount} org${orgCount === 1 ? "" : "s"} snapshot, ${ageDays}d old`,
310
+ };
311
+ }
312
+ catch (e) {
313
+ return {
314
+ status: "fail",
315
+ detail: `unreadable: ${e.message}`,
316
+ fix: "Run `sfgraph refresh-orgs` to regenerate",
317
+ };
318
+ }
319
+ }
320
+ export function runDoctorChecks(opts = {}) {
321
+ const dataDir = opts.dataDir ?? getSfgraphPaths().data;
322
+ const checks = [
323
+ check("node runtime", checkNode),
324
+ check("better-sqlite3 native binding", () => checkBetterSqlite3(opts.requireFn)),
325
+ ];
326
+ if (process.platform === "darwin") {
327
+ const codesign = checkMacosCodesign(opts.requireFn);
328
+ if (codesign)
329
+ checks.push({ name: "macOS code-signing", ...codesign });
330
+ }
331
+ checks.push(check("sfgraph data dir", () => checkDataDir(dataDir)), check("org databases", () => checkOrgDatabases(dataDir, opts.requireFn)), check("org snapshot", () => checkOrgSnapshot(dataDir)), check("sf CLI", () => checkSfCli(opts.sfProbe)), check("IDE MCP configs", () => checkMcpConfigs(opts.homeOverride)));
332
+ const ok = checks.every((c) => c.status !== "fail");
333
+ return { checks, ok };
334
+ }
335
+ const ICON = {
336
+ ok: "✓",
337
+ warn: "⚠",
338
+ fail: "✗",
339
+ };
340
+ export async function doctorCmd(opts = {}) {
341
+ const log = opts.log ?? ((s) => console.log(s));
342
+ const report = runDoctorChecks(opts);
343
+ log("sfgraph doctor");
344
+ log("");
345
+ for (const c of report.checks) {
346
+ log(` ${ICON[c.status]} ${c.name}: ${c.detail}`);
347
+ if (c.fix)
348
+ log(` fix: ${c.fix}`);
349
+ }
350
+ log("");
351
+ log(report.ok ? "All checks passed." : "One or more checks failed — see fix hints above.");
352
+ if (!report.ok)
353
+ process.exitCode = 1;
354
+ return report;
355
+ }
356
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface IngestOpts {
2
+ org?: string | undefined;
3
+ orgs?: string | undefined;
4
+ all?: boolean | undefined;
5
+ parallel?: boolean | undefined;
6
+ mode?: "full" | "incremental" | "auto" | undefined;
7
+ db?: string | undefined;
8
+ embedModel?: string | undefined;
9
+ embedModelId?: string | undefined;
10
+ embedModelDim?: number | undefined;
11
+ rebuild?: boolean | undefined;
12
+ noBackup?: boolean | undefined;
13
+ detectDeletions?: boolean | undefined;
14
+ /** Comma-separated source labels to fetch (e.g. 'apex,generic:Profile').
15
+ * Forces mode=full and merges into the existing graph without rebuild. */
16
+ only?: string | undefined;
17
+ /** Read the previously-persisted skip report and re-ingest only those
18
+ * labels. Useful for rate-limit recovery and post-permission-grant
19
+ * backfill. */
20
+ retrySkipped?: boolean | undefined;
21
+ /** Override Tooling-API pool maxConcurrent (default 5). */
22
+ toolingPool?: number | undefined;
23
+ /** Override Metadata-API pool maxConcurrent (default 5). Bumping this is
24
+ * usually the highest-leverage knob for slow ingests because Profile /
25
+ * PermissionSet / Layout fans go through here. */
26
+ metadataPool?: number | undefined;
27
+ /** Override Data (SObject/Bulk) pool maxConcurrent (default 10). */
28
+ dataPool?: number | undefined;
29
+ }
30
+ export declare function ingestCmd(opts: IngestOpts): Promise<void>;
31
+ //# sourceMappingURL=ingest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;IACnD,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC;+EAC2E;IAC3E,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B;;oBAEgB;IAChB,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;uDAEmD;IACnD,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AA8LD,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA0G/D"}