@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,260 @@
1
+ import path from "node:path";
2
+ import { SqliteGraphStore, SqliteSnapshotStore, listAllAuthenticatedOrgs, liveIngest, multiOrgIngest, } from "@ryanstark24/sfgraph-core";
3
+ import { ConsoleLogger, SfgraphError, getSfgraphPaths, safeOrgDbPath, } from "@ryanstark24/sfgraph-shared";
4
+ function formatRow(cols, widths) {
5
+ return cols.map((c, i) => c.padEnd(widths[i] ?? c.length)).join(" ");
6
+ }
7
+ function printResultsTable(entries, mode) {
8
+ const header = ["Org", "Mode", "Members", "Deletions", "ParseErrors", "Elapsed(ms)", "Status"];
9
+ const rows = entries.map((e) => [
10
+ e.alias,
11
+ e.result?.mode ?? mode,
12
+ String(e.result?.membersProcessed ?? "-"),
13
+ String(e.result?.deletions ?? "-"),
14
+ String(e.result?.parseErrors ?? "-"),
15
+ String(e.finishedAt - e.startedAt),
16
+ e.status === "ok" ? "OK" : `ERR: ${e.error ?? ""}`,
17
+ ]);
18
+ const widths = header.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] ?? "").length)));
19
+ console.log(formatRow(header, widths));
20
+ console.log(formatRow(widths.map((w) => "-".repeat(w)), widths));
21
+ for (const r of rows)
22
+ console.log(formatRow(r, widths));
23
+ }
24
+ /**
25
+ * Validate that a user-supplied `--db <path>` resolves to an absolute path
26
+ * inside `getSfgraphPaths().data`. The CLI is local, but treating `--db`
27
+ * as an unconstrained `fs.write` target lets a curious script overwrite
28
+ * unrelated files (or fill `/`). Require explicit `SFGRAPH_ALLOW_ANY_DB`
29
+ * to escape the data dir — for power-users who deliberately want to
30
+ * stash an ingest elsewhere.
31
+ */
32
+ function validateDbPath(rawDbPath, dataDir) {
33
+ const abs = path.resolve(rawDbPath);
34
+ const rel = path.relative(path.resolve(dataDir), abs);
35
+ const inside = rel.length > 0 && !rel.startsWith("..") && !path.isAbsolute(rel);
36
+ if (!inside && process.env.SFGRAPH_ALLOW_ANY_DB !== "1") {
37
+ throw new Error(`--db path resolves outside the sfgraph data dir (${dataDir}). Refusing to write to ${abs}. Set SFGRAPH_ALLOW_ANY_DB=1 if this is intentional.`);
38
+ }
39
+ return abs;
40
+ }
41
+ async function buildSingleIngestOpts(alias, opts, logger, deps) {
42
+ const resolved = await deps.resolveOrg(alias);
43
+ const dataDir = getSfgraphPaths().data;
44
+ const dbPath = opts.db
45
+ ? validateDbPath(opts.db, dataDir)
46
+ : safeOrgDbPath(dataDir, String(resolved.orgId));
47
+ if (opts.rebuild) {
48
+ await applyRebuild(dbPath, String(resolved.orgId), Boolean(opts.noBackup), logger);
49
+ }
50
+ const graphStore = new SqliteGraphStore({ dbPath });
51
+ await graphStore.init();
52
+ const snapshotStore = new SqliteSnapshotStore({
53
+ dbPath,
54
+ db: graphStore.db,
55
+ skipMigrations: true,
56
+ });
57
+ await snapshotStore.init();
58
+ // --rebuild and --only and --retry-skipped all force a full sync because
59
+ // incremental wouldn't pick up newly-permitted/unblocked types.
60
+ const forceFull = Boolean(opts.rebuild || opts.only || opts.retrySkipped);
61
+ const mode = forceFull ? "full" : (opts.mode ?? "auto");
62
+ // Resolve onlyLabels from --only or --retry-skipped. The skip report lives
63
+ // at <dataDir>/<orgId>.skips.json (written at end of every ingest).
64
+ const skipReportPath = path.join(getSfgraphPaths().data, `${resolved.orgId}.skips.json`);
65
+ let onlyLabels;
66
+ if (opts.only) {
67
+ onlyLabels = new Set(opts.only
68
+ .split(",")
69
+ .map((s) => s.trim())
70
+ .filter((s) => s.length > 0));
71
+ }
72
+ else if (opts.retrySkipped) {
73
+ const { existsSync, readFileSync } = await import("node:fs");
74
+ if (!existsSync(skipReportPath)) {
75
+ throw new Error(`--retry-skipped: no skip report found at ${skipReportPath}. Run a full ingest first.`);
76
+ }
77
+ try {
78
+ const raw = JSON.parse(readFileSync(skipReportPath, "utf8"));
79
+ const labels = (raw.skips ?? []).map((s) => s.label).filter(Boolean);
80
+ if (labels.length === 0) {
81
+ console.log("--retry-skipped: previous run had zero skips. Nothing to retry.");
82
+ // Return a no-op opts; the live-ingest will exit cleanly with no work.
83
+ onlyLabels = new Set();
84
+ }
85
+ else {
86
+ onlyLabels = new Set(labels);
87
+ console.log(`--retry-skipped: retrying ${labels.length} previously-skipped source${labels.length === 1 ? "" : "s"} from ${skipReportPath}`);
88
+ }
89
+ }
90
+ catch (e) {
91
+ throw new Error(`--retry-skipped: failed to read skip report at ${skipReportPath}: ${e.message}`);
92
+ }
93
+ }
94
+ return {
95
+ alias,
96
+ mode,
97
+ graphStore,
98
+ snapshotStore,
99
+ logger,
100
+ preResolved: resolved,
101
+ detectDeletions: Boolean(opts.detectDeletions),
102
+ ...(onlyLabels ? { onlyLabels } : {}),
103
+ skipReportPath,
104
+ };
105
+ }
106
+ /**
107
+ * SQLite uses WAL by default in this codebase, which means alongside
108
+ * `<file>.sqlite` you also get `<file>.sqlite-wal` and `<file>.sqlite-shm`.
109
+ * Plain rollback journals add `<file>.sqlite-journal`. Without handling
110
+ * these sidecars during --rebuild, the move/delete leaves orphans that
111
+ * SQLite later reads back into the new DB, corrupting state.
112
+ */
113
+ const SQLITE_SIDECAR_SUFFIXES = ["-wal", "-shm", "-journal"];
114
+ async function applyRebuild(dbPath, orgId, noBackup, logger) {
115
+ const { existsSync, mkdirSync, renameSync, unlinkSync } = await import("node:fs");
116
+ if (!existsSync(dbPath)) {
117
+ logger.info(`rebuild: no existing graph at ${dbPath}; starting fresh`);
118
+ return;
119
+ }
120
+ if (noBackup) {
121
+ unlinkSync(dbPath);
122
+ for (const suffix of SQLITE_SIDECAR_SUFFIXES) {
123
+ const sidecar = `${dbPath}${suffix}`;
124
+ if (existsSync(sidecar)) {
125
+ try {
126
+ unlinkSync(sidecar);
127
+ }
128
+ catch {
129
+ /* best-effort */
130
+ }
131
+ }
132
+ }
133
+ console.warn(`REBUILD: existing graph for ${orgId} DELETED (no-backup); running full sync`);
134
+ return;
135
+ }
136
+ const backupDir = path.join(getSfgraphPaths().data, "backups");
137
+ mkdirSync(backupDir, { recursive: true });
138
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
139
+ const backupPath = path.join(backupDir, `${orgId}.rebuild-${stamp}.sqlite`);
140
+ renameSync(dbPath, backupPath);
141
+ for (const suffix of SQLITE_SIDECAR_SUFFIXES) {
142
+ const sidecar = `${dbPath}${suffix}`;
143
+ if (existsSync(sidecar)) {
144
+ try {
145
+ renameSync(sidecar, `${backupPath}${suffix}`);
146
+ }
147
+ catch {
148
+ /* best-effort: if we can't move the sidecar, delete it so it
149
+ doesn't get associated with the fresh DB */
150
+ try {
151
+ unlinkSync(sidecar);
152
+ }
153
+ catch {
154
+ /* swallow */
155
+ }
156
+ }
157
+ }
158
+ }
159
+ console.warn(`REBUILD: existing graph for ${orgId} moved to ${backupPath}; running full sync`);
160
+ }
161
+ export async function ingestCmd(opts) {
162
+ const logger = new ConsoleLogger("info");
163
+ if (opts.embedModel)
164
+ process.env.SFGRAPH_EMBED_MODEL_PATH = opts.embedModel;
165
+ if (opts.embedModelId)
166
+ process.env.SFGRAPH_EMBED_MODEL_ID = opts.embedModelId;
167
+ if (opts.embedModelDim !== undefined) {
168
+ process.env.SFGRAPH_EMBED_MODEL_DIM = String(opts.embedModelDim);
169
+ }
170
+ try {
171
+ const { resolveOrg, resolveDefaultOrgAlias, configureDefaultPools } = await import("@ryanstark24/sfgraph-core");
172
+ // Apply pool-concurrency overrides. CLI flags win; SFGRAPH_*_POOL env
173
+ // vars are a secondary knob (handled inside configureDefaultPools).
174
+ const poolOverrides = {};
175
+ if (opts.toolingPool !== undefined)
176
+ poolOverrides.tooling = opts.toolingPool;
177
+ if (opts.metadataPool !== undefined)
178
+ poolOverrides.metadata = opts.metadataPool;
179
+ if (opts.dataPool !== undefined)
180
+ poolOverrides.data = opts.dataPool;
181
+ const applied = await configureDefaultPools(poolOverrides);
182
+ logger.info(`ingest: pool concurrency tooling=${applied.tooling} metadata=${applied.metadata} data=${applied.data}`);
183
+ // Determine the alias list (multi-org modes).
184
+ let aliases = null;
185
+ if (opts.all) {
186
+ try {
187
+ aliases = await listAllAuthenticatedOrgs();
188
+ }
189
+ catch (e) {
190
+ console.error(`ingest --all: failed to enumerate authenticated orgs: ${e.message}`);
191
+ process.exitCode = 1;
192
+ return;
193
+ }
194
+ if (aliases.length === 0) {
195
+ console.error("ingest --all: no authenticated orgs found. Run `sf org login web` first.");
196
+ process.exitCode = 1;
197
+ return;
198
+ }
199
+ logger.info(`ingest --all: discovered ${aliases.length} orgs: ${aliases.join(", ")}`);
200
+ }
201
+ else if (opts.orgs) {
202
+ aliases = opts.orgs
203
+ .split(",")
204
+ .map((s) => s.trim())
205
+ .filter((s) => s.length > 0);
206
+ if (aliases.length === 0) {
207
+ console.error("ingest --orgs: empty alias list.");
208
+ process.exitCode = 1;
209
+ return;
210
+ }
211
+ }
212
+ if (aliases !== null && aliases.length > 0) {
213
+ const list = aliases;
214
+ const summary = await multiOrgIngest({
215
+ aliases: list,
216
+ parallel: Boolean(opts.parallel),
217
+ logger,
218
+ buildOpts: (alias) => buildSingleIngestOpts(alias, opts, logger, { resolveOrg }),
219
+ });
220
+ console.log(`\nMulti-org ingest complete (${summary.parallel ? "parallel" : "sequential"}, ${summary.totalElapsedMs}ms):`);
221
+ printResultsTable(summary.entries, opts.mode ?? "auto");
222
+ const failed = summary.entries.filter((e) => e.status === "error").length;
223
+ if (failed > 0)
224
+ process.exitCode = 1;
225
+ return;
226
+ }
227
+ // Single-org path (preserved behavior).
228
+ let alias;
229
+ if (opts.org) {
230
+ alias = opts.org;
231
+ }
232
+ else {
233
+ const detected = await resolveDefaultOrgAlias();
234
+ if (!detected) {
235
+ console.error("ingest: no --org provided and no default org configured. Run `sf config set target-org <alias>` or pass --org.");
236
+ process.exitCode = 1;
237
+ return;
238
+ }
239
+ alias = detected;
240
+ logger.info(`ingest: using default org from sf config: ${alias}`);
241
+ }
242
+ const built = await buildSingleIngestOpts(alias, opts, logger, { resolveOrg });
243
+ const startedAt = Date.now();
244
+ logger.info(`ingest: starting alias=${alias}`);
245
+ const result = await liveIngest(built);
246
+ logger.info("ingest: capabilities", result.capabilities);
247
+ logger.info(`ingest: complete mode=${result.mode} members=${result.membersProcessed} deletions=${result.deletions} parseErrors=${result.parseErrors} elapsed=${Date.now() - startedAt}ms`);
248
+ await built.graphStore.close();
249
+ }
250
+ catch (e) {
251
+ if (e instanceof SfgraphError) {
252
+ console.error(`[${e.code}] ${e.message}`);
253
+ }
254
+ else {
255
+ console.error(e.message);
256
+ }
257
+ process.exitCode = 1;
258
+ }
259
+ }
260
+ //# sourceMappingURL=ingest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /** Snapshot of `sf` CLI org state at install time. Written to
2
+ * `<dataDir>/orgs-snapshot.json`. list_orgs and other tools read this when
3
+ * StateAggregator returns empty (the sandboxed-IDE-child case). */
4
+ export interface OrgSnapshot {
5
+ recordedAt: number;
6
+ defaultAlias: string | null;
7
+ /** alias -> username */
8
+ aliases: Record<string, string>;
9
+ /** username -> { orgId, instanceUrl } */
10
+ authorizations: Record<string, {
11
+ orgId: string;
12
+ instanceUrl: string;
13
+ }>;
14
+ }
15
+ export declare const ORG_SNAPSHOT_FILENAME = "orgs-snapshot.json";
16
+ /** Exported so `sfgraph refresh-orgs` can call it directly without going
17
+ * through the rest of the install flow (MCP config writes, skill copies). */
18
+ export declare function writeOrgSnapshot(dataDir: string): Promise<void>;
19
+ export interface InstallCmdOpts {
20
+ target?: "claude" | "cursor" | "vscode" | "all";
21
+ dryRun?: boolean;
22
+ skillsOnly?: boolean;
23
+ mcpOnly?: boolean;
24
+ /** Write MCP entry that invokes the currently-running binary directly,
25
+ * instead of `npx @ryanstark24/sfgraph`. Use this for local dev
26
+ * before the package is published. */
27
+ local?: boolean;
28
+ /** Absolute path to a Node binary. With --local, the MCP entry's
29
+ * `command` is pinned to this Node so IDE-spawned children always use a
30
+ * Node ABI that matches the rebuilt better-sqlite3 binding. Defaults to
31
+ * `process.execPath` when `--local` is set without `--pin-node`. */
32
+ pinNode?: string;
33
+ homeOverride?: string;
34
+ log?: (s: string) => void;
35
+ }
36
+ export interface InstallSummaryRow {
37
+ target: string;
38
+ kind: "skill" | "mcp";
39
+ name: string;
40
+ path: string;
41
+ action: string;
42
+ }
43
+ export declare function installCmd(opts?: InstallCmdOpts): Promise<InstallSummaryRow[]>;
44
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAKA;;oEAEoE;AACpE,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,yCAAyC;IACzC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxE;AAED,eAAO,MAAM,qBAAqB,uBAAuB,CAAC;AAE1D;8EAC8E;AAC9E,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuGrE;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;2CAEuC;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;yEAGqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA4HxF"}
@@ -0,0 +1,214 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { install as installSkills } from "@ryanstark24/sfgraph-skills";
4
+ import { writeMcpConfig } from "./_mcp-config.js";
5
+ export const ORG_SNAPSHOT_FILENAME = "orgs-snapshot.json";
6
+ /** Exported so `sfgraph refresh-orgs` can call it directly without going
7
+ * through the rest of the install flow (MCP config writes, skill copies). */
8
+ export async function writeOrgSnapshot(dataDir) {
9
+ // Run @salesforce/core in this process (NOT the MCP child) so it can
10
+ // actually read ~/.sf/. Capture everything we need; the sandboxed child
11
+ // will read from the JSON instead of from ~/.sf/.
12
+ // @salesforce/core isn't a direct dep of the CLI package — resolve it
13
+ // through a sibling (@ryanstark24/sfgraph-server) that lists it as a
14
+ // direct dependency. Same pattern doctor.ts uses for better-sqlite3.
15
+ const { createRequire } = await import("node:module");
16
+ const here = createRequire(import.meta.url);
17
+ let resolvedSfCorePath;
18
+ try {
19
+ const serverEntry = here.resolve("@ryanstark24/sfgraph-server");
20
+ const sibling = createRequire(serverEntry);
21
+ resolvedSfCorePath = sibling.resolve("@salesforce/core");
22
+ }
23
+ catch {
24
+ // Fall back to direct resolve (might work in some hoisted layouts).
25
+ resolvedSfCorePath = "@salesforce/core";
26
+ }
27
+ const sfCore = (await import(resolvedSfCorePath));
28
+ const auths = await sfCore.AuthInfo.listAllAuthorizations();
29
+ const authorizations = {};
30
+ for (const a of auths) {
31
+ if (!a.username)
32
+ continue;
33
+ authorizations[a.username] = {
34
+ orgId: a.orgId ?? "",
35
+ instanceUrl: a.instanceUrl ?? "",
36
+ };
37
+ }
38
+ let aliases = {};
39
+ try {
40
+ if (sfCore.StateAggregator?.create) {
41
+ const agg = await sfCore.StateAggregator.create();
42
+ aliases = agg.aliases.getAll() ?? {};
43
+ }
44
+ }
45
+ catch {
46
+ /* aliases stay empty */
47
+ }
48
+ let defaultAlias = null;
49
+ try {
50
+ if (sfCore.ConfigAggregator?.create) {
51
+ const cfg = await sfCore.ConfigAggregator.create();
52
+ const v = (cfg.getInfo("target-org") ?? cfg.getInfo("defaultusername"))?.value;
53
+ if (typeof v === "string" && v.length > 0)
54
+ defaultAlias = v;
55
+ }
56
+ }
57
+ catch {
58
+ /* default stays null */
59
+ }
60
+ // Fallback: ConfigAggregator reads project-local config first which is
61
+ // usually empty when we run from outside the user's sfdx project. Read
62
+ // the GLOBAL config file directly so `sf config set target-org=foo`
63
+ // (run from any project dir) still resolves.
64
+ if (!defaultAlias) {
65
+ try {
66
+ const { readFileSync, existsSync } = await import("node:fs");
67
+ const { homedir } = await import("node:os");
68
+ const { join } = await import("node:path");
69
+ // Newer sf CLI: ~/.sf/config.json. Legacy sfdx: ~/.sfdx/sfdx-config.json.
70
+ const candidates = [
71
+ join(homedir(), ".sf", "config.json"),
72
+ join(homedir(), ".sfdx", "sfdx-config.json"),
73
+ ];
74
+ for (const cfgPath of candidates) {
75
+ if (!existsSync(cfgPath))
76
+ continue;
77
+ const parsed = JSON.parse(readFileSync(cfgPath, "utf8"));
78
+ const v = parsed["target-org"] ?? parsed.defaultusername;
79
+ if (typeof v === "string" && v.length > 0) {
80
+ defaultAlias = v;
81
+ break;
82
+ }
83
+ }
84
+ }
85
+ catch {
86
+ /* fallback failed; defaultAlias stays null */
87
+ }
88
+ }
89
+ const snapshot = {
90
+ recordedAt: Date.now(),
91
+ defaultAlias,
92
+ aliases,
93
+ authorizations,
94
+ };
95
+ mkdirSync(dataDir, { recursive: true });
96
+ writeFileSync(join(dataDir, ORG_SNAPSHOT_FILENAME), JSON.stringify(snapshot, null, 2), "utf8");
97
+ }
98
+ export async function installCmd(opts = {}) {
99
+ const target = opts.target ?? "all";
100
+ const log = opts.log ?? ((s) => console.log(s));
101
+ const rows = [];
102
+ const sharedOpts = {
103
+ dryRun: opts.dryRun ?? false,
104
+ };
105
+ if (opts.homeOverride !== undefined)
106
+ sharedOpts.homeOverride = opts.homeOverride;
107
+ // Local-dev mode: derive the absolute path of THIS sfgraph binary so the
108
+ // MCP entry invokes it directly. process.argv[1] is the script path that
109
+ // Node received. Resolve to an absolute, normalized form.
110
+ let localBinPath;
111
+ if (opts.local) {
112
+ const { realpathSync } = await import("node:fs");
113
+ const { resolve } = await import("node:path");
114
+ const candidate = process.argv[1] ?? "";
115
+ if (!candidate) {
116
+ throw new Error("install --local: cannot detect this binary's path from process.argv");
117
+ }
118
+ try {
119
+ localBinPath = realpathSync(resolve(candidate));
120
+ }
121
+ catch {
122
+ localBinPath = resolve(candidate);
123
+ }
124
+ }
125
+ const mcpOpts = {
126
+ ...sharedOpts,
127
+ };
128
+ if (localBinPath)
129
+ mcpOpts.localBinPath = localBinPath;
130
+ // Always propagate the shell's resolved data/config/log dirs into the MCP
131
+ // entry's env. This is the only way sandboxed IDE child processes (Cursor
132
+ // on macOS, Claude Desktop) read from the same on-disk location the shell
133
+ // wrote to. Without this, the child's env-paths resolver lands in a
134
+ // different (often non-writable) location than the shell.
135
+ const { getSfgraphPaths } = await import("@ryanstark24/sfgraph-shared");
136
+ const shellPaths = getSfgraphPaths();
137
+ mcpOpts.env = {
138
+ SFGRAPH_DATA_DIR: shellPaths.data,
139
+ SFGRAPH_CONFIG_DIR: shellPaths.config,
140
+ SFGRAPH_CACHE_DIR: shellPaths.cache,
141
+ SFGRAPH_LOG_DIR: shellPaths.log,
142
+ };
143
+ // Snapshot the sf-CLI alias map + default-org at install time. The
144
+ // sandboxed MCP child on Cursor/Claude can't read ~/.sf/alias.json or
145
+ // ~/.sf/config.json (filesystem permission), so StateAggregator and
146
+ // ConfigAggregator return empty there. We capture both while running
147
+ // outside the sandbox and persist to a JSON file under the data dir
148
+ // (which is sandbox-readable thanks to SFGRAPH_DATA_DIR above).
149
+ if (!opts.dryRun) {
150
+ try {
151
+ await writeOrgSnapshot(shellPaths.data);
152
+ }
153
+ catch (e) {
154
+ // Best-effort: install shouldn't fail if sf isn't authenticated yet.
155
+ log(`note: could not snapshot sf orgs (${e.message}); list_orgs in IDE may show empty aliases`);
156
+ }
157
+ }
158
+ // Resolve pinNode: explicit flag wins; otherwise default to process.execPath
159
+ // when --local is set so the IDE child uses the same Node that ran install.
160
+ if (opts.pinNode) {
161
+ mcpOpts.pinNode = opts.pinNode;
162
+ }
163
+ else if (opts.local) {
164
+ mcpOpts.pinNode = process.execPath;
165
+ }
166
+ if (!opts.mcpOnly) {
167
+ const skillResults = await installSkills(target, sharedOpts);
168
+ for (const r of skillResults) {
169
+ rows.push({
170
+ target: r.target,
171
+ kind: "skill",
172
+ name: r.skill,
173
+ path: r.path,
174
+ action: r.action,
175
+ });
176
+ }
177
+ }
178
+ if (!opts.skillsOnly) {
179
+ const mcpTargets = target === "all" ? ["claude", "cursor", "vscode"] : [target];
180
+ for (const t of mcpTargets) {
181
+ const res = await writeMcpConfig(t, mcpOpts);
182
+ rows.push({
183
+ target: res.target,
184
+ kind: "mcp",
185
+ name: "sfgraph",
186
+ path: res.path,
187
+ action: res.action,
188
+ });
189
+ }
190
+ }
191
+ // Print summary table.
192
+ const header = ["target", "kind", "name", "action", "path"];
193
+ const widths = header.map((h) => h.length);
194
+ const data = rows.map((r) => [r.target, r.kind, r.name, r.action, r.path]);
195
+ for (const row of data) {
196
+ for (let i = 0; i < row.length; i++) {
197
+ const cell = row[i] ?? "";
198
+ const w = widths[i] ?? cell.length;
199
+ widths[i] = Math.max(w, cell.length);
200
+ }
201
+ }
202
+ const pad = (cells) => cells.map((c, i) => c.padEnd(widths[i] ?? c.length)).join(" ");
203
+ log(pad(header));
204
+ log(widths.map((w) => "-".repeat(w)).join(" "));
205
+ for (const row of data) {
206
+ log(pad(row));
207
+ }
208
+ if (opts.dryRun) {
209
+ log("");
210
+ log("[dry-run] no files written");
211
+ }
212
+ return rows;
213
+ }
214
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface LinkOpts {
2
+ org: string;
3
+ project?: string | undefined;
4
+ }
5
+ export declare function linkCmd(opts: LinkOpts): Promise<void>;
6
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB3D"}
@@ -0,0 +1,23 @@
1
+ import path from "node:path";
2
+ import { resolveOrg } from "@ryanstark24/sfgraph-core";
3
+ import { ConsoleLogger, SfgraphError, findProjectRoot, linkWorkspace, } from "@ryanstark24/sfgraph-shared";
4
+ export async function linkCmd(opts) {
5
+ const logger = new ConsoleLogger("info");
6
+ try {
7
+ const startDir = opts.project ? path.resolve(opts.project) : process.cwd();
8
+ const projectRoot = findProjectRoot(startDir) ?? startDir;
9
+ const resolved = await resolveOrg(opts.org);
10
+ const ws = await linkWorkspace(projectRoot, opts.org, resolved.orgId);
11
+ logger.info(`Linked ${ws.projectRoot} -> org ${opts.org} (${resolved.orgId})`);
12
+ }
13
+ catch (e) {
14
+ if (e instanceof SfgraphError) {
15
+ console.error(`[${e.code}] ${e.message}`);
16
+ }
17
+ else {
18
+ console.error(e.message);
19
+ }
20
+ process.exitCode = 1;
21
+ }
22
+ }
23
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,eAAe,EACf,aAAa,GACd,MAAM,6BAA6B,CAAC;AAOrC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC3E,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,WAAW,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Rebuild the better-sqlite3 native binding against the *current* Node
3
+ * runtime. The published npm package ships prebuilts for common Node
4
+ * versions, but users on very new Node releases (no prebuilt yet) or who
5
+ * upgraded Node after install will hit "bindings file not found" / ABI
6
+ * mismatch errors. `npm rebuild better-sqlite3 --build-from-source`
7
+ * produces a binding matching `process.versions.modules`, which fixes
8
+ * both classes.
9
+ *
10
+ * Strategy:
11
+ * 1. Locate the better-sqlite3 install root via `require.resolve`.
12
+ * Walking up from that to its package root gives us the directory
13
+ * `npm rebuild` needs to run in.
14
+ * 2. Prefer the package manager that owns the install (pnpm if there's
15
+ * a `node_modules/.pnpm` sibling, npm otherwise).
16
+ * 3. Stream child stdout/stderr through so the user sees node-gyp
17
+ * progress live — a 20–60s compile feels less like a hang.
18
+ */
19
+ export interface RebuildBindingsOpts {
20
+ /** When true, print what would be run without executing. */
21
+ dryRun?: boolean;
22
+ /** Override the resolved package manager (auto-detected otherwise). */
23
+ packageManager?: "npm" | "pnpm";
24
+ }
25
+ export declare function rebuildBindingsCmd(opts?: RebuildBindingsOpts): Promise<void>;
26
+ //# sourceMappingURL=rebuild-bindings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebuild-bindings.d.ts","sourceRoot":"","sources":["../../src/commands/rebuild-bindings.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACjC;AAgDD,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsFtF"}