@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.
- package/dist/__tests__/doctor.test.d.ts +2 -0
- package/dist/__tests__/doctor.test.d.ts.map +1 -0
- package/dist/__tests__/doctor.test.js +64 -0
- package/dist/__tests__/doctor.test.js.map +1 -0
- package/dist/__tests__/ingest-db-guard.test.d.ts +2 -0
- package/dist/__tests__/ingest-db-guard.test.d.ts.map +1 -0
- package/dist/__tests__/ingest-db-guard.test.js +110 -0
- package/dist/__tests__/ingest-db-guard.test.js.map +1 -0
- package/dist/__tests__/ingest-multi.test.d.ts +2 -0
- package/dist/__tests__/ingest-multi.test.d.ts.map +1 -0
- package/dist/__tests__/ingest-multi.test.js +51 -0
- package/dist/__tests__/ingest-multi.test.js.map +1 -0
- package/dist/__tests__/install-dry-run.test.d.ts +2 -0
- package/dist/__tests__/install-dry-run.test.d.ts.map +1 -0
- package/dist/__tests__/install-dry-run.test.js +29 -0
- package/dist/__tests__/install-dry-run.test.js.map +1 -0
- package/dist/__tests__/install-e2e.test.d.ts +2 -0
- package/dist/__tests__/install-e2e.test.d.ts.map +1 -0
- package/dist/__tests__/install-e2e.test.js +33 -0
- package/dist/__tests__/install-e2e.test.js.map +1 -0
- package/dist/__tests__/mcp-config.test.d.ts +2 -0
- package/dist/__tests__/mcp-config.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-config.test.js +104 -0
- package/dist/__tests__/mcp-config.test.js.map +1 -0
- package/dist/__tests__/rebuild.test.d.ts +2 -0
- package/dist/__tests__/rebuild.test.d.ts.map +1 -0
- package/dist/__tests__/rebuild.test.js +180 -0
- package/dist/__tests__/rebuild.test.js.map +1 -0
- package/dist/__tests__/serve-guard.test.d.ts +2 -0
- package/dist/__tests__/serve-guard.test.d.ts.map +1 -0
- package/dist/__tests__/serve-guard.test.js +82 -0
- package/dist/__tests__/serve-guard.test.js.map +1 -0
- package/dist/__tests__/snapshot.test.d.ts +2 -0
- package/dist/__tests__/snapshot.test.d.ts.map +1 -0
- package/dist/__tests__/snapshot.test.js +139 -0
- package/dist/__tests__/snapshot.test.js.map +1 -0
- package/dist/__tests__/telemetry.test.d.ts +2 -0
- package/dist/__tests__/telemetry.test.d.ts.map +1 -0
- package/dist/__tests__/telemetry.test.js +53 -0
- package/dist/__tests__/telemetry.test.js.map +1 -0
- package/dist/commands/_mcp-config.d.ts +30 -0
- package/dist/commands/_mcp-config.d.ts.map +1 -0
- package/dist/commands/_mcp-config.js +98 -0
- package/dist/commands/_mcp-config.js.map +1 -0
- package/dist/commands/doctor.d.ts +28 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +356 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/ingest.d.ts +31 -0
- package/dist/commands/ingest.d.ts.map +1 -0
- package/dist/commands/ingest.js +260 -0
- package/dist/commands/ingest.js.map +1 -0
- package/dist/commands/install.d.ts +44 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +214 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/link.d.ts +6 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +23 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/rebuild-bindings.d.ts +26 -0
- package/dist/commands/rebuild-bindings.d.ts.map +1 -0
- package/dist/commands/rebuild-bindings.js +129 -0
- package/dist/commands/rebuild-bindings.js.map +1 -0
- package/dist/commands/refresh-orgs.d.ts +17 -0
- package/dist/commands/refresh-orgs.d.ts.map +1 -0
- package/dist/commands/refresh-orgs.js +26 -0
- package/dist/commands/refresh-orgs.js.map +1 -0
- package/dist/commands/serve.d.ts +8 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +188 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/snapshot.d.ts +26 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +164 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/telemetry.d.ts +13 -0
- package/dist/commands/telemetry.d.ts.map +1 -0
- package/dist/commands/telemetry.js +57 -0
- package/dist/commands/telemetry.js.map +1 -0
- package/dist/commands/wip.d.ts +8 -0
- package/dist/commands/wip.d.ts.map +1 -0
- package/dist/commands/wip.js +60 -0
- package/dist/commands/wip.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +239 -0
- package/dist/index.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +20 -0
- package/dist/version.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { createRequire } from "node:module";
|
|
5
|
+
function detectPackageManager(installRoot) {
|
|
6
|
+
// installRoot looks like .../node_modules/better-sqlite3 or
|
|
7
|
+
// .../node_modules/.pnpm/better-sqlite3@x.y.z/node_modules/better-sqlite3.
|
|
8
|
+
// The .pnpm segment is the unambiguous tell.
|
|
9
|
+
return installRoot.includes(`${path.sep}.pnpm${path.sep}`) ? "pnpm" : "npm";
|
|
10
|
+
}
|
|
11
|
+
function findInstallRoot() {
|
|
12
|
+
// better-sqlite3 isn't a direct dep of @ryanstark24/sfgraph-cli — it's
|
|
13
|
+
// owned by @ryanstark24/sfgraph-core and @ryanstark24/sfgraph-server.
|
|
14
|
+
// Walk through one of those to find the actual binding, matching the
|
|
15
|
+
// resolution chain doctor.ts uses (so we rebuild the SAME copy that
|
|
16
|
+
// would have been loaded at runtime, not a workspace-root duplicate).
|
|
17
|
+
const here = createRequire(import.meta.url);
|
|
18
|
+
const chains = ["@ryanstark24/sfgraph-core", "@ryanstark24/sfgraph-server"];
|
|
19
|
+
for (const chain of chains) {
|
|
20
|
+
try {
|
|
21
|
+
const entry = here.resolve(chain);
|
|
22
|
+
const downstream = createRequire(entry);
|
|
23
|
+
const pkgPath = downstream.resolve("better-sqlite3/package.json");
|
|
24
|
+
return path.dirname(pkgPath);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// try next chain
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Last resort: maybe better-sqlite3 IS resolvable directly (CLI ran from
|
|
31
|
+
// a flat install layout, e.g. global npm with no workspace).
|
|
32
|
+
try {
|
|
33
|
+
const pkgPath = here.resolve("better-sqlite3/package.json");
|
|
34
|
+
return path.dirname(pkgPath);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function workspaceRootFor(installRoot) {
|
|
41
|
+
// For pnpm: walk up past the `.pnpm/<pkg>/node_modules/<pkg>` chain to
|
|
42
|
+
// the workspace root. For npm: parent of node_modules.
|
|
43
|
+
const parts = installRoot.split(path.sep);
|
|
44
|
+
const nodeModulesIdx = parts.lastIndexOf("node_modules");
|
|
45
|
+
if (nodeModulesIdx < 0)
|
|
46
|
+
return installRoot;
|
|
47
|
+
// For pnpm, there may be a deeper node_modules — find the outermost one.
|
|
48
|
+
const firstNodeModulesIdx = parts.indexOf("node_modules");
|
|
49
|
+
return parts.slice(0, firstNodeModulesIdx).join(path.sep) || path.sep;
|
|
50
|
+
}
|
|
51
|
+
export async function rebuildBindingsCmd(opts = {}) {
|
|
52
|
+
const installRoot = findInstallRoot();
|
|
53
|
+
if (!installRoot) {
|
|
54
|
+
console.error("sfgraph rebuild-bindings: better-sqlite3 not resolvable from this install.");
|
|
55
|
+
console.error(" Run `npm install` (or `pnpm install`) first, then re-run this command.");
|
|
56
|
+
process.exitCode = 1;
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (!existsSync(installRoot)) {
|
|
60
|
+
console.error(`sfgraph rebuild-bindings: resolved install root does not exist: ${installRoot}`);
|
|
61
|
+
process.exitCode = 1;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const pm = opts.packageManager ?? detectPackageManager(installRoot);
|
|
65
|
+
const cwd = workspaceRootFor(installRoot);
|
|
66
|
+
// pnpm and npm both accept `rebuild <pkg>`. --build-from-source forces a
|
|
67
|
+
// fresh compile even if a stale prebuilt is cached — necessary when the
|
|
68
|
+
// failure mode is "downloaded prebuilt for wrong ABI."
|
|
69
|
+
const args = pm === "pnpm"
|
|
70
|
+
? ["rebuild", "better-sqlite3"]
|
|
71
|
+
: ["rebuild", "better-sqlite3", "--build-from-source"];
|
|
72
|
+
console.log(`sfgraph rebuild-bindings:`);
|
|
73
|
+
console.log(` Node: ${process.version} (ABI ${process.versions.modules})`);
|
|
74
|
+
console.log(` Package mgr: ${pm}`);
|
|
75
|
+
console.log(` Workspace: ${cwd}`);
|
|
76
|
+
console.log(` Install root: ${installRoot}`);
|
|
77
|
+
console.log(` Command: ${pm} ${args.join(" ")}`);
|
|
78
|
+
if (opts.dryRun) {
|
|
79
|
+
console.log(" (dry-run — no command executed)");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
console.log("");
|
|
83
|
+
console.log("Running rebuild — this typically takes 20–60s on first run…");
|
|
84
|
+
console.log("");
|
|
85
|
+
await new Promise((resolve, reject) => {
|
|
86
|
+
const child = spawn(pm, args, { cwd, stdio: "inherit", shell: false });
|
|
87
|
+
child.on("error", reject);
|
|
88
|
+
child.on("exit", (code) => {
|
|
89
|
+
if (code === 0)
|
|
90
|
+
resolve();
|
|
91
|
+
else
|
|
92
|
+
reject(new Error(`${pm} ${args[0]} exited with code ${code}`));
|
|
93
|
+
});
|
|
94
|
+
}).catch((e) => {
|
|
95
|
+
console.error("");
|
|
96
|
+
console.error(`sfgraph rebuild-bindings: failed — ${e.message}`);
|
|
97
|
+
console.error(" Common cause: no C++ toolchain. Install one for your platform:");
|
|
98
|
+
console.error(" macOS: xcode-select --install");
|
|
99
|
+
console.error(" Linux: apt install build-essential python3 # Debian/Ubuntu");
|
|
100
|
+
console.error(" dnf groupinstall 'Development Tools' && dnf install python3 # Fedora/RHEL");
|
|
101
|
+
console.error(" pacman -S base-devel python # Arch");
|
|
102
|
+
console.error(" apk add build-base python3 # Alpine (musl always rebuilds from source)");
|
|
103
|
+
console.error(" Windows: install Visual Studio Build Tools with the 'Desktop development with C++' workload,");
|
|
104
|
+
console.error(" then restart your shell so cl.exe is on PATH.");
|
|
105
|
+
process.exitCode = 1;
|
|
106
|
+
});
|
|
107
|
+
if (process.exitCode === 1)
|
|
108
|
+
return;
|
|
109
|
+
// Verify the rebuild actually produced a loadable binding for the
|
|
110
|
+
// current ABI. Doing this here turns "did it work?" from a separate
|
|
111
|
+
// `sfgraph doctor` round-trip into a single command.
|
|
112
|
+
try {
|
|
113
|
+
const req = createRequire(import.meta.url);
|
|
114
|
+
// Clear any cached failure from earlier in this process.
|
|
115
|
+
delete req.cache?.[req.resolve("better-sqlite3")];
|
|
116
|
+
req("better-sqlite3");
|
|
117
|
+
console.log("");
|
|
118
|
+
console.log("✓ better-sqlite3 loads cleanly for the current Node runtime.");
|
|
119
|
+
console.log(" Next: `sfgraph doctor` to verify org DBs open, then resume normal use.");
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
console.error("");
|
|
123
|
+
console.error("✗ Rebuild completed but better-sqlite3 still fails to load:");
|
|
124
|
+
console.error(` ${e.message.split("\n")[0]}`);
|
|
125
|
+
console.error(" Run `sfgraph doctor` for more detail.");
|
|
126
|
+
process.exitCode = 1;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=rebuild-bindings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rebuild-bindings.js","sourceRoot":"","sources":["../../src/commands/rebuild-bindings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA2B5C,SAAS,oBAAoB,CAAC,WAAmB;IAC/C,4DAA4D;IAC5D,2EAA2E;IAC3E,6CAA6C;IAC7C,OAAO,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9E,CAAC;AAED,SAAS,eAAe;IACtB,uEAAuE;IACvE,sEAAsE;IACtE,qEAAqE;IACrE,oEAAoE;IACpE,sEAAsE;IACtE,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,CAAC,2BAA2B,EAAE,6BAA6B,CAAC,CAAC;IAC5E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IACD,yEAAyE;IACzE,6DAA6D;IAC7D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,uEAAuE;IACvE,uDAAuD;IACvD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IACzD,IAAI,cAAc,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC;IAC3C,yEAAyE;IACzE,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAA4B,EAAE;IACrE,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAC5F,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC1F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,mEAAmE,WAAW,EAAE,CAAC,CAAC;QAChG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,IAAI,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE1C,yEAAyE;IACzE,wEAAwE;IACxE,uDAAuD;IACvD,MAAM,IAAI,GACR,EAAE,KAAK,MAAM;QACX,CAAC,CAAC,CAAC,SAAS,EAAE,gBAAgB,CAAC;QAC/B,CAAC,CAAC,CAAC,SAAS,EAAE,gBAAgB,EAAE,qBAAqB,CAAC,CAAC;IAE3D,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,OAAO,SAAS,OAAO,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,qBAAqB,WAAW,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEzD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;;gBACrB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACb,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,sCAAuC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAClF,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACpF,OAAO,CAAC,KAAK,CAAC,0FAA0F,CAAC,CAAC;QAC1G,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,KAAK,CAAC,uFAAuF,CAAC,CAAC;QACvG,OAAO,CAAC,KAAK,CACX,kGAAkG,CACnG,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO;IAEnC,kEAAkE;IAClE,oEAAoE;IACpE,qDAAqD;IACrD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,yDAAyD;QACzD,OAAQ,GAAG,CAAC,KAA6C,EAAE,CACzD,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAC9B,CAAC;QACF,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;IAC1F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,KAAK,CAAC,KAAM,CAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface RefreshOrgsOpts {
|
|
2
|
+
/** Override the data dir (where the snapshot is written). Defaults to
|
|
3
|
+
* `getSfgraphPaths().data`. Useful in tests. */
|
|
4
|
+
dataDir?: string;
|
|
5
|
+
log?: (s: string) => void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Re-snapshot `sf` CLI org state (alias map, default-org, authorizations)
|
|
9
|
+
* into `<dataDir>/orgs-snapshot.json`. The MCP child reads this snapshot
|
|
10
|
+
* when it can't reach `~/.sf/` directly (Cursor's macOS sandbox case).
|
|
11
|
+
*
|
|
12
|
+
* Run this whenever sf state changes (new login, alias change, target-org
|
|
13
|
+
* flipped) without having to re-do the full `sfgraph install` (which also
|
|
14
|
+
* rewrites MCP config + reinstalls skills).
|
|
15
|
+
*/
|
|
16
|
+
export declare function refreshOrgsCmd(opts?: RefreshOrgsOpts): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=refresh-orgs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-orgs.d.ts","sourceRoot":"","sources":["../../src/commands/refresh-orgs.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B;qDACiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9E"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getSfgraphPaths } from "@ryanstark24/sfgraph-shared";
|
|
2
|
+
import { ORG_SNAPSHOT_FILENAME, writeOrgSnapshot } from "./install.js";
|
|
3
|
+
/**
|
|
4
|
+
* Re-snapshot `sf` CLI org state (alias map, default-org, authorizations)
|
|
5
|
+
* into `<dataDir>/orgs-snapshot.json`. The MCP child reads this snapshot
|
|
6
|
+
* when it can't reach `~/.sf/` directly (Cursor's macOS sandbox case).
|
|
7
|
+
*
|
|
8
|
+
* Run this whenever sf state changes (new login, alias change, target-org
|
|
9
|
+
* flipped) without having to re-do the full `sfgraph install` (which also
|
|
10
|
+
* rewrites MCP config + reinstalls skills).
|
|
11
|
+
*/
|
|
12
|
+
export async function refreshOrgsCmd(opts = {}) {
|
|
13
|
+
const log = opts.log ?? ((s) => console.log(s));
|
|
14
|
+
const dataDir = opts.dataDir ?? getSfgraphPaths().data;
|
|
15
|
+
try {
|
|
16
|
+
await writeOrgSnapshot(dataDir);
|
|
17
|
+
const path = `${dataDir}/${ORG_SNAPSHOT_FILENAME}`;
|
|
18
|
+
log(`✓ refreshed sf org snapshot at ${path}`);
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
log(`✗ could not refresh: ${e.message}`);
|
|
22
|
+
log(" Hint: make sure `sf` is authenticated (run `sf org login web --alias <X>` first).");
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=refresh-orgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-orgs.js","sourceRoot":"","sources":["../../src/commands/refresh-orgs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AASvE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAwB,EAAE;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC,IAAI,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,GAAG,OAAO,IAAI,qBAAqB,EAAE,CAAC;QACnD,GAAG,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,wBAAyB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,GAAG,CAAC,qFAAqF,CAAC,CAAC;QAC3F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAsID,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD7D"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
2
|
+
import { platform } from "node:os";
|
|
3
|
+
/**
|
|
4
|
+
* Find PIDs holding the given TCP port in LISTEN state.
|
|
5
|
+
* macOS / Linux: `lsof -ti tcp:<port> -sTCP:LISTEN`
|
|
6
|
+
* Windows: `netstat -ano` filtered to LISTENING lines on `:<port>`
|
|
7
|
+
* Returns an empty list if the probe fails, which triggers the normal
|
|
8
|
+
* EADDRINUSE error path (sane fallback — we never want this helper to
|
|
9
|
+
* raise into the user's error stream).
|
|
10
|
+
*/
|
|
11
|
+
function pidsOnPort(port) {
|
|
12
|
+
try {
|
|
13
|
+
if (platform() === "win32") {
|
|
14
|
+
const r = spawnSync("netstat", ["-ano"], { encoding: "utf8" });
|
|
15
|
+
if (r.status !== 0 || !r.stdout)
|
|
16
|
+
return [];
|
|
17
|
+
const pids = new Set();
|
|
18
|
+
// Lines look like: TCP 127.0.0.1:7777 0.0.0.0:0 LISTENING 1234
|
|
19
|
+
// Match the trailing PID column on rows whose local address ends in
|
|
20
|
+
// `:<port>` and whose state is LISTENING. The `:port` suffix anchor
|
|
21
|
+
// matters — without it, a remote-side port match would false-positive.
|
|
22
|
+
const re = new RegExp(`\\s+TCP\\s+\\S+:${port}\\s+\\S+\\s+LISTENING\\s+(\\d+)`);
|
|
23
|
+
for (const line of r.stdout.split(/\r?\n/)) {
|
|
24
|
+
const m = re.exec(line);
|
|
25
|
+
if (m?.[1]) {
|
|
26
|
+
const pid = Number.parseInt(m[1], 10);
|
|
27
|
+
if (Number.isFinite(pid) && pid > 0)
|
|
28
|
+
pids.add(pid);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return [...pids];
|
|
32
|
+
}
|
|
33
|
+
const lsof = spawnSync("lsof", ["-ti", `tcp:${port}`, "-sTCP:LISTEN"], { encoding: "utf8" });
|
|
34
|
+
if (lsof.status === 0 && lsof.stdout) {
|
|
35
|
+
return lsof.stdout
|
|
36
|
+
.split("\n")
|
|
37
|
+
.map((s) => Number.parseInt(s.trim(), 10))
|
|
38
|
+
.filter((n) => Number.isFinite(n) && n > 0);
|
|
39
|
+
}
|
|
40
|
+
// Fallback for Linux distros that don't ship lsof by default (Alpine,
|
|
41
|
+
// minimal Docker base images, some embedded distros). `ss` from
|
|
42
|
+
// iproute2 is near-universally available on modern Linux and emits
|
|
43
|
+
// pid info in the form `users:(("node",pid=1234,fd=21))`.
|
|
44
|
+
const ss = spawnSync("ss", ["-tlnpH", `sport = :${port}`], { encoding: "utf8" });
|
|
45
|
+
if (ss.status !== 0 || !ss.stdout)
|
|
46
|
+
return [];
|
|
47
|
+
const pids = new Set();
|
|
48
|
+
const re = /pid=(\d+)/g;
|
|
49
|
+
let m = re.exec(ss.stdout);
|
|
50
|
+
while (m !== null) {
|
|
51
|
+
const pid = Number.parseInt(m[1] ?? "", 10);
|
|
52
|
+
if (Number.isFinite(pid) && pid > 0)
|
|
53
|
+
pids.add(pid);
|
|
54
|
+
m = re.exec(ss.stdout);
|
|
55
|
+
}
|
|
56
|
+
return [...pids];
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Terminate each pid.
|
|
64
|
+
* Unix: SIGTERM, brief grace period, then SIGKILL any survivors.
|
|
65
|
+
* Windows: `taskkill /F /PID <pid>` — Windows has no SIGTERM/SIGKILL
|
|
66
|
+
* distinction; TerminateProcess is the only primitive. /F
|
|
67
|
+
* forces termination; without it, the call only delivers a
|
|
68
|
+
* WM_CLOSE that GUI-less processes ignore.
|
|
69
|
+
* We only kill PIDs we identified as listening on OUR port — never a blind
|
|
70
|
+
* kill. Self-PID is filtered out as a safety belt.
|
|
71
|
+
*/
|
|
72
|
+
async function killPids(pids) {
|
|
73
|
+
const self = process.pid;
|
|
74
|
+
const targets = pids.filter((p) => p !== self);
|
|
75
|
+
if (targets.length === 0)
|
|
76
|
+
return;
|
|
77
|
+
if (platform() === "win32") {
|
|
78
|
+
for (const p of targets) {
|
|
79
|
+
try {
|
|
80
|
+
spawnSync("taskkill", ["/F", "/PID", String(p)], { stdio: "ignore" });
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
/* already gone or insufficient permissions */
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// One tick so Windows releases the TCP bind before we retry listen.
|
|
87
|
+
await new Promise((r) => setTimeout(r, 250));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
for (const p of targets) {
|
|
91
|
+
try {
|
|
92
|
+
process.kill(p, "SIGTERM");
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
/* already gone */
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Brief grace period for clean shutdown, then escalate.
|
|
99
|
+
await new Promise((r) => setTimeout(r, 400));
|
|
100
|
+
for (const p of targets) {
|
|
101
|
+
try {
|
|
102
|
+
process.kill(p, 0); // probe — throws if gone
|
|
103
|
+
process.kill(p, "SIGKILL");
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
/* gone */
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// One more tick so the kernel releases the bind.
|
|
110
|
+
await new Promise((r) => setTimeout(r, 150));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Hosts that bind only to the loopback interface. Anything else is reachable
|
|
114
|
+
* from the LAN (or, for `0.0.0.0`, from anyone the machine routes to). The
|
|
115
|
+
* web API has no auth — exposing it leaks the ingested org graph in full.
|
|
116
|
+
*/
|
|
117
|
+
const LOOPBACK_HOSTS = new Set(["127.0.0.1", "localhost", "::1", "::ffff:127.0.0.1"]);
|
|
118
|
+
function isLoopback(host) {
|
|
119
|
+
return LOOPBACK_HOSTS.has(host.toLowerCase());
|
|
120
|
+
}
|
|
121
|
+
/** Open `url` in the user's default browser. Best-effort; failure is silent. */
|
|
122
|
+
function openBrowser(url) {
|
|
123
|
+
const cmd = platform() === "darwin"
|
|
124
|
+
? ["open", [url]]
|
|
125
|
+
: platform() === "win32"
|
|
126
|
+
? ["cmd", ["/c", "start", "", url]]
|
|
127
|
+
: ["xdg-open", [url]];
|
|
128
|
+
try {
|
|
129
|
+
const child = spawn(cmd[0], cmd[1], {
|
|
130
|
+
stdio: "ignore",
|
|
131
|
+
detached: true,
|
|
132
|
+
});
|
|
133
|
+
child.on("error", () => { });
|
|
134
|
+
child.unref();
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
/* best effort */
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export async function serveCmd(opts) {
|
|
141
|
+
if (!isLoopback(opts.host) && !opts.iUnderstandPublicBind) {
|
|
142
|
+
console.error(`sfgraph serve: refusing to bind to non-loopback host '${opts.host}' without --i-understand-public-bind.
|
|
143
|
+
The web API has no authentication; binding publicly exposes the full ingested org graph (schema, Apex names, relationships) to the LAN.
|
|
144
|
+
If this is what you want, re-run with --i-understand-public-bind.`);
|
|
145
|
+
process.exitCode = 1;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (!isLoopback(opts.host)) {
|
|
149
|
+
console.warn(`sfgraph serve: WARNING — binding to '${opts.host}'. The web API has no auth; anyone reachable on this interface can read the entire ingested org graph.`);
|
|
150
|
+
}
|
|
151
|
+
const { startWebServer } = await import("@ryanstark24/sfgraph-web");
|
|
152
|
+
let handle;
|
|
153
|
+
try {
|
|
154
|
+
handle = await startWebServer({ port: opts.port, host: opts.host });
|
|
155
|
+
}
|
|
156
|
+
catch (e) {
|
|
157
|
+
const err = e;
|
|
158
|
+
if (err?.code !== "EADDRINUSE" || !isLoopback(opts.host))
|
|
159
|
+
throw err;
|
|
160
|
+
// Auto-recover: only happens when binding to loopback (the safe default
|
|
161
|
+
// path). For non-loopback binds we surface the original error — the
|
|
162
|
+
// process holding the port might not belong to us.
|
|
163
|
+
const pids = pidsOnPort(opts.port);
|
|
164
|
+
if (pids.length === 0) {
|
|
165
|
+
console.error(`sfgraph serve: port ${opts.port} is in use but I couldn't identify the holder. Pick another port with --port.`);
|
|
166
|
+
throw err;
|
|
167
|
+
}
|
|
168
|
+
console.log(`sfgraph serve: port ${opts.port} held by pid${pids.length > 1 ? "s" : ""} ${pids.join(", ")} — terminating and retrying…`);
|
|
169
|
+
await killPids(pids);
|
|
170
|
+
handle = await startWebServer({ port: opts.port, host: opts.host });
|
|
171
|
+
}
|
|
172
|
+
console.log(`\n open ${handle.url} to explore the ingested graph(s)\n`);
|
|
173
|
+
if (opts.open)
|
|
174
|
+
openBrowser(handle.url);
|
|
175
|
+
// Block until SIGINT/SIGTERM, then shut down cleanly.
|
|
176
|
+
const stop = async (sig) => {
|
|
177
|
+
console.log(`\nsfgraph-web: received ${sig}, shutting down…`);
|
|
178
|
+
await handle.stop();
|
|
179
|
+
process.exit(0);
|
|
180
|
+
};
|
|
181
|
+
process.on("SIGINT", () => void stop("SIGINT"));
|
|
182
|
+
process.on("SIGTERM", () => void stop("SIGTERM"));
|
|
183
|
+
// Keep the loop alive — the http server holds it, but be explicit so a
|
|
184
|
+
// future refactor that closes the listener doesn't accidentally drain
|
|
185
|
+
// the loop. (Same root cause as the post-object-phase silent-exit fix.)
|
|
186
|
+
await new Promise(() => { });
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ConsoleLogger } from "@ryanstark24/sfgraph-shared";
|
|
2
|
+
export interface SnapshotCommonOpts {
|
|
3
|
+
org?: string | undefined;
|
|
4
|
+
project?: string | undefined;
|
|
5
|
+
}
|
|
6
|
+
export interface SnapshotCreateOpts extends SnapshotCommonOpts {
|
|
7
|
+
label: string;
|
|
8
|
+
kind?: "manual" | "scheduled" | undefined;
|
|
9
|
+
}
|
|
10
|
+
export interface SnapshotDiffOpts extends SnapshotCommonOpts {
|
|
11
|
+
fromId: string;
|
|
12
|
+
toId: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SnapshotPruneOpts extends SnapshotCommonOpts {
|
|
15
|
+
retainDays: number;
|
|
16
|
+
}
|
|
17
|
+
export interface SnapshotDeleteOpts extends SnapshotCommonOpts {
|
|
18
|
+
snapshotId: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function snapshotListCmd(opts: SnapshotCommonOpts): Promise<void>;
|
|
21
|
+
export declare function snapshotCreateCmd(opts: SnapshotCreateOpts): Promise<void>;
|
|
22
|
+
export declare function snapshotDiffCmd(opts: SnapshotDiffOpts): Promise<void>;
|
|
23
|
+
export declare function snapshotPruneCmd(opts: SnapshotPruneOpts): Promise<void>;
|
|
24
|
+
export declare function snapshotDeleteCmd(opts: SnapshotDeleteOpts): Promise<void>;
|
|
25
|
+
export { ConsoleLogger };
|
|
26
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,aAAa,EAOd,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,UAAU,EAAE,MAAM,CAAC;CACpB;AA6CD,wBAAsB,eAAe,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB7E;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAe/E;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC3E;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAe7E;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB/E;AAGD,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { SqliteGraphStore, SqliteSnapshotStore, resolveDefaultOrgAlias, resolveOrg, } from "@ryanstark24/sfgraph-core";
|
|
3
|
+
import { ConfigError, ConsoleLogger, SfgraphError, asOrgId, findProjectRoot, getSfgraphPaths, readWorkspace, safeOrgDbPath, } from "@ryanstark24/sfgraph-shared";
|
|
4
|
+
async function resolveOrgId(opts) {
|
|
5
|
+
if (opts.org) {
|
|
6
|
+
const r = await resolveOrg(opts.org);
|
|
7
|
+
return String(r.orgId);
|
|
8
|
+
}
|
|
9
|
+
const startDir = opts.project ? path.resolve(opts.project) : process.cwd();
|
|
10
|
+
const projectRoot = findProjectRoot(startDir) ?? startDir;
|
|
11
|
+
const ws = await readWorkspace(projectRoot);
|
|
12
|
+
if (ws?.orgId)
|
|
13
|
+
return String(ws.orgId);
|
|
14
|
+
const alias = await resolveDefaultOrgAlias();
|
|
15
|
+
if (!alias) {
|
|
16
|
+
throw new ConfigError("snapshot: no --org provided, no workspace binding, and no default org configured.");
|
|
17
|
+
}
|
|
18
|
+
const r = await resolveOrg(alias);
|
|
19
|
+
return String(r.orgId);
|
|
20
|
+
}
|
|
21
|
+
async function openStores(orgId) {
|
|
22
|
+
const dbPath = safeOrgDbPath(getSfgraphPaths().data, orgId);
|
|
23
|
+
const graphStore = new SqliteGraphStore({ dbPath });
|
|
24
|
+
await graphStore.init();
|
|
25
|
+
const snapshotStore = new SqliteSnapshotStore({
|
|
26
|
+
dbPath,
|
|
27
|
+
db: graphStore.db,
|
|
28
|
+
skipMigrations: true,
|
|
29
|
+
});
|
|
30
|
+
await snapshotStore.init();
|
|
31
|
+
return { graphStore, snapshotStore };
|
|
32
|
+
}
|
|
33
|
+
function reportError(e) {
|
|
34
|
+
if (e instanceof SfgraphError) {
|
|
35
|
+
console.error(`[${e.code}] ${e.message}`);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.error(e.message);
|
|
39
|
+
}
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
}
|
|
42
|
+
export async function snapshotListCmd(opts) {
|
|
43
|
+
try {
|
|
44
|
+
const orgId = await resolveOrgId(opts);
|
|
45
|
+
const { graphStore, snapshotStore } = await openStores(orgId);
|
|
46
|
+
try {
|
|
47
|
+
const snaps = snapshotStore.listSnapshots(asOrgId(orgId));
|
|
48
|
+
if (snaps.length === 0) {
|
|
49
|
+
console.log(`No snapshots for org ${orgId}.`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
console.log("| ID | Label | Created | Auto |");
|
|
53
|
+
console.log("|---|---|---|---|");
|
|
54
|
+
for (const s of snaps) {
|
|
55
|
+
console.log(`| ${s.id} | ${s.label} | ${new Date(s.createdAt).toISOString()} | ${s.isAuto ? "yes" : "no"} |`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
await graphStore.close();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
reportError(e);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export async function snapshotCreateCmd(opts) {
|
|
67
|
+
try {
|
|
68
|
+
const orgId = await resolveOrgId(opts);
|
|
69
|
+
const { graphStore, snapshotStore } = await openStores(orgId);
|
|
70
|
+
try {
|
|
71
|
+
const kind = opts.kind ?? "manual";
|
|
72
|
+
const label = `${kind}:${opts.label}`;
|
|
73
|
+
const snap = snapshotStore.createSnapshot(asOrgId(orgId), label, false);
|
|
74
|
+
console.log(`Created snapshot ${snap.id} (label="${label}") for org ${orgId}.`);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
await graphStore.close();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
reportError(e);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export async function snapshotDiffCmd(opts) {
|
|
85
|
+
try {
|
|
86
|
+
const orgId = await resolveOrgId(opts);
|
|
87
|
+
const { graphStore, snapshotStore } = await openStores(orgId);
|
|
88
|
+
try {
|
|
89
|
+
const to = opts.toId === "current" ? "current" : opts.toId;
|
|
90
|
+
const nodeDiff = snapshotStore.diffNodes(asOrgId(orgId), opts.fromId, to);
|
|
91
|
+
const edgeDiff = snapshotStore.diffEdges(asOrgId(orgId), opts.fromId, to);
|
|
92
|
+
console.log(`## Snapshot diff: ${opts.fromId} → ${opts.toId} (org ${orgId})`);
|
|
93
|
+
console.log("");
|
|
94
|
+
console.log(`**Nodes**: +${nodeDiff.added.length} -${nodeDiff.removed.length} ~${nodeDiff.changed.length}`);
|
|
95
|
+
console.log(`**Edges**: +${edgeDiff.added.length} -${edgeDiff.removed.length}`);
|
|
96
|
+
console.log("");
|
|
97
|
+
if (nodeDiff.added.length > 0) {
|
|
98
|
+
console.log("### Added nodes");
|
|
99
|
+
for (const n of nodeDiff.added)
|
|
100
|
+
console.log(`- ${n.label}: ${n.qualifiedName}`);
|
|
101
|
+
}
|
|
102
|
+
if (nodeDiff.removed.length > 0) {
|
|
103
|
+
console.log("");
|
|
104
|
+
console.log("### Removed nodes");
|
|
105
|
+
for (const n of nodeDiff.removed)
|
|
106
|
+
console.log(`- ${n.label}: ${n.qualifiedName}`);
|
|
107
|
+
}
|
|
108
|
+
if (nodeDiff.changed.length > 0) {
|
|
109
|
+
console.log("");
|
|
110
|
+
console.log("### Changed nodes");
|
|
111
|
+
for (const { before, after } of nodeDiff.changed) {
|
|
112
|
+
console.log(`- ${after.label}: ${after.qualifiedName} (hash ${before.sourceHash.slice(0, 8)}…→${after.sourceHash.slice(0, 8)}…)`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
await graphStore.close();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
reportError(e);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export async function snapshotPruneCmd(opts) {
|
|
125
|
+
try {
|
|
126
|
+
const orgId = await resolveOrgId(opts);
|
|
127
|
+
const { graphStore, snapshotStore } = await openStores(orgId);
|
|
128
|
+
try {
|
|
129
|
+
const n = snapshotStore.prune(asOrgId(orgId), opts.retainDays);
|
|
130
|
+
console.log(`Pruned ${n} auto-snapshot(s) older than ${opts.retainDays} days for org ${orgId}.`);
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
await graphStore.close();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (e) {
|
|
137
|
+
reportError(e);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export async function snapshotDeleteCmd(opts) {
|
|
141
|
+
try {
|
|
142
|
+
const orgId = await resolveOrgId(opts);
|
|
143
|
+
const { graphStore, snapshotStore } = await openStores(orgId);
|
|
144
|
+
try {
|
|
145
|
+
const existing = snapshotStore.getSnapshot(opts.snapshotId);
|
|
146
|
+
if (!existing) {
|
|
147
|
+
console.error(`snapshot ${opts.snapshotId} not found for org ${orgId}.`);
|
|
148
|
+
process.exitCode = 1;
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
snapshotStore.deleteSnapshot(opts.snapshotId);
|
|
152
|
+
console.log(`Deleted snapshot ${opts.snapshotId} for org ${orgId}.`);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
await graphStore.close();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
reportError(e);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Silence unused-import warning when ConsoleLogger isn't referenced.
|
|
163
|
+
export { ConsoleLogger };
|
|
164
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface TelemetryEnv {
|
|
2
|
+
configDir: string;
|
|
3
|
+
dataDir: string;
|
|
4
|
+
log: (s: string) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function defaultEnv(): TelemetryEnv;
|
|
7
|
+
export declare function statusCmd(env?: TelemetryEnv): Promise<void>;
|
|
8
|
+
export declare function enableLocalCmd(env?: TelemetryEnv): Promise<void>;
|
|
9
|
+
export declare function disableCmd(env?: TelemetryEnv): Promise<void>;
|
|
10
|
+
export declare function previewCmd(env?: TelemetryEnv): Promise<void>;
|
|
11
|
+
export declare function purgeCmd(env?: TelemetryEnv): Promise<void>;
|
|
12
|
+
export declare function resetIdCmd(env?: TelemetryEnv): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1B;AAED,wBAAgB,UAAU,IAAI,YAAY,CAGzC;AAED,wBAAsB,SAAS,CAAC,GAAG,GAAE,YAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/E;AAED,wBAAsB,cAAc,CAAC,GAAG,GAAE,YAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpF;AAED,wBAAsB,UAAU,CAAC,GAAG,GAAE,YAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhF;AAED,wBAAsB,UAAU,CAAC,GAAG,GAAE,YAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhF;AAED,wBAAsB,QAAQ,CAAC,GAAG,GAAE,YAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAM9E;AAED,wBAAsB,UAAU,CAAC,GAAG,GAAE,YAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhF"}
|