@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,57 @@
1
+ import { LocalFileSink, Sanitizer, getOrCreateMachineId, resetMachineId, } from "@ryanstark24/sfgraph-core";
2
+ import { getSfgraphPaths } from "@ryanstark24/sfgraph-shared";
3
+ import { defaultSinkPath, readConfig, writeConfig } from "../config.js";
4
+ export function defaultEnv() {
5
+ const p = getSfgraphPaths();
6
+ return { configDir: p.config, dataDir: p.data, log: (s) => console.log(s) };
7
+ }
8
+ export async function statusCmd(env = defaultEnv()) {
9
+ const cfg = readConfig(env.configDir);
10
+ env.log(`telemetry: ${cfg.telemetry.enabled ? "enabled" : "disabled"}`);
11
+ env.log(`sink: ${cfg.telemetry.sink}`);
12
+ if (cfg.telemetry.sinkPath)
13
+ env.log(`sinkPath: ${cfg.telemetry.sinkPath}`);
14
+ }
15
+ export async function enableLocalCmd(env = defaultEnv()) {
16
+ const cfg = readConfig(env.configDir);
17
+ cfg.telemetry.enabled = true;
18
+ cfg.telemetry.sink = "local";
19
+ cfg.telemetry.sinkPath = cfg.telemetry.sinkPath ?? defaultSinkPath(env.dataDir);
20
+ writeConfig(env.configDir, cfg);
21
+ getOrCreateMachineId({ telemetryEnabled: true, configDir: env.configDir });
22
+ env.log("telemetry enabled (local)");
23
+ }
24
+ export async function disableCmd(env = defaultEnv()) {
25
+ const cfg = readConfig(env.configDir);
26
+ cfg.telemetry.enabled = false;
27
+ writeConfig(env.configDir, cfg);
28
+ env.log("telemetry disabled");
29
+ }
30
+ export async function previewCmd(env = defaultEnv()) {
31
+ const sample = {
32
+ kind: "cli_command",
33
+ ts: Date.now(),
34
+ command: "ingest --org acme at /Users/alice/code",
35
+ durationMs: 1234,
36
+ exitCode: 0,
37
+ };
38
+ const out = new Sanitizer().sanitizeEvent(sample);
39
+ env.log(JSON.stringify(out, null, 2));
40
+ }
41
+ export async function purgeCmd(env = defaultEnv()) {
42
+ const cfg = readConfig(env.configDir);
43
+ const path = cfg.telemetry.sinkPath ?? defaultSinkPath(env.dataDir);
44
+ const sink = new LocalFileSink(path);
45
+ await sink.purge();
46
+ env.log(`purged: ${path}`);
47
+ }
48
+ export async function resetIdCmd(env = defaultEnv()) {
49
+ const cfg = readConfig(env.configDir);
50
+ if (!cfg.telemetry.enabled) {
51
+ env.log("telemetry is disabled; nothing to reset");
52
+ return;
53
+ }
54
+ const id = resetMachineId({ telemetryEnabled: true, configDir: env.configDir });
55
+ env.log(`new machine id: ${id}`);
56
+ }
57
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface WipOpts {
2
+ depth?: number | undefined;
3
+ mode?: "changed-only" | "full-folder" | undefined;
4
+ project?: string | undefined;
5
+ org?: string | undefined;
6
+ }
7
+ export declare function wipCmd(opts: WipOpts): Promise<void>;
8
+ //# sourceMappingURL=wip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wip.d.ts","sourceRoot":"","sources":["../../src/commands/wip.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,cAAc,GAAG,aAAa,GAAG,SAAS,CAAC;IAClD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDzD"}
@@ -0,0 +1,60 @@
1
+ import path from "node:path";
2
+ import { SqliteGraphStore, analyze, resolveDefaultOrgAlias, resolveOrg, } from "@ryanstark24/sfgraph-core";
3
+ import { ConfigError, ConsoleLogger, SfgraphError, asOrgId, findProjectRoot, getSfgraphPaths, readWorkspace, safeOrgDbPath, } from "@ryanstark24/sfgraph-shared";
4
+ export async function wipCmd(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
+ // Resolve orgId: --org → workspace binding → default alias
10
+ let orgId = null;
11
+ if (opts.org) {
12
+ const resolved = await resolveOrg(opts.org);
13
+ orgId = resolved.orgId;
14
+ }
15
+ else {
16
+ const ws = await readWorkspace(projectRoot);
17
+ if (ws?.orgId) {
18
+ orgId = ws.orgId;
19
+ }
20
+ else {
21
+ const alias = await resolveDefaultOrgAlias();
22
+ if (!alias) {
23
+ throw new ConfigError("wip: no --org provided, no workspace binding, and no default org configured. Run `sfgraph link --org <alias>` or pass --org.");
24
+ }
25
+ const resolved = await resolveOrg(alias);
26
+ orgId = resolved.orgId;
27
+ }
28
+ }
29
+ const dbPath = safeOrgDbPath(getSfgraphPaths().data, orgId);
30
+ const graphStore = new SqliteGraphStore({ dbPath });
31
+ await graphStore.init();
32
+ try {
33
+ const result = await analyze.analyzeLocalImpact({
34
+ graphStore,
35
+ orgId: asOrgId(orgId),
36
+ projectRoot,
37
+ depth: opts.depth ?? 3,
38
+ mode: opts.mode ?? "changed-only",
39
+ logger,
40
+ });
41
+ console.log(`WIP impact: changed=${result.changedQnames.length} added=${result.addedQnames.length} removed=${result.removedQnames.length} dependents=${result.dependents.length}`);
42
+ console.log("\n```mermaid");
43
+ console.log(result.mermaid);
44
+ console.log("```");
45
+ }
46
+ finally {
47
+ await graphStore.close();
48
+ }
49
+ }
50
+ catch (e) {
51
+ if (e instanceof SfgraphError) {
52
+ console.error(`[${e.code}] ${e.message}`);
53
+ }
54
+ else {
55
+ console.error(e.message);
56
+ }
57
+ process.exitCode = 1;
58
+ }
59
+ }
60
+ //# sourceMappingURL=wip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wip.js","sourceRoot":"","sources":["../../src/commands/wip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface TelemetryConfig {
2
+ enabled: boolean;
3
+ sink: "null" | "local";
4
+ sinkPath?: string;
5
+ }
6
+ export interface SfgraphConfig {
7
+ telemetry: TelemetryConfig;
8
+ }
9
+ export declare const DEFAULT_CONFIG: SfgraphConfig;
10
+ export declare function configPath(configDir: string): string;
11
+ export declare function readConfig(configDir: string): SfgraphConfig;
12
+ export declare function writeConfig(configDir: string, cfg: SfgraphConfig): void;
13
+ export declare function defaultSinkPath(dataDir: string): string;
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,eAAe,CAAC;CAC5B;AAED,eAAO,MAAM,cAAc,EAAE,aAE5B,CAAC;AAEF,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAU3D;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAGvE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD"}
package/dist/config.js ADDED
@@ -0,0 +1,28 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ export const DEFAULT_CONFIG = {
4
+ telemetry: { enabled: false, sink: "null" },
5
+ };
6
+ export function configPath(configDir) {
7
+ return join(configDir, "sfgraph.json");
8
+ }
9
+ export function readConfig(configDir) {
10
+ try {
11
+ const raw = readFileSync(configPath(configDir), "utf8");
12
+ const parsed = JSON.parse(raw);
13
+ return {
14
+ telemetry: { ...DEFAULT_CONFIG.telemetry, ...(parsed.telemetry ?? {}) },
15
+ };
16
+ }
17
+ catch {
18
+ return structuredClone(DEFAULT_CONFIG);
19
+ }
20
+ }
21
+ export function writeConfig(configDir, cfg) {
22
+ mkdirSync(configDir, { recursive: true });
23
+ writeFileSync(configPath(configDir), `${JSON.stringify(cfg, null, 2)}\n`, "utf8");
24
+ }
25
+ export function defaultSinkPath(dataDir) {
26
+ return join(dataDir, "telemetry.jsonl");
27
+ }
28
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAYjC,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE;CAC5C,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,OAAO,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,CAAC;QACzD,OAAO;YACL,SAAS,EAAE,EAAE,GAAG,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE;SACxE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,GAAkB;IAC/D,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ import { getCliVersion } from "./version.js";
3
+ export declare function buildProgram(): Command;
4
+ export declare function run(argv: string[]): Promise<void>;
5
+ export { getCliVersion };
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,wBAAgB,YAAY,IAAI,OAAO,CAoWtC;AAED,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvD;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,239 @@
1
+ import { Command } from "commander";
2
+ import { doctorCmd } from "./commands/doctor.js";
3
+ import { ingestCmd } from "./commands/ingest.js";
4
+ import { installCmd } from "./commands/install.js";
5
+ import { linkCmd } from "./commands/link.js";
6
+ import { snapshotCreateCmd, snapshotDeleteCmd, snapshotDiffCmd, snapshotListCmd, snapshotPruneCmd, } from "./commands/snapshot.js";
7
+ import { disableCmd, enableLocalCmd, previewCmd, purgeCmd, resetIdCmd, statusCmd, } from "./commands/telemetry.js";
8
+ import { wipCmd } from "./commands/wip.js";
9
+ import { getCliVersion } from "./version.js";
10
+ export function buildProgram() {
11
+ const program = new Command();
12
+ program.name("sfgraph").description("sfgraph CLI").version(getCliVersion());
13
+ program
14
+ .command("version")
15
+ .description("print sfgraph version")
16
+ .action(() => {
17
+ console.log(getCliVersion());
18
+ });
19
+ program
20
+ .command("install")
21
+ .description("install skills + MCP config for the target editor(s)")
22
+ .option("--target <target>", "claude | cursor | vscode | all", "all")
23
+ .option("--dry-run", "show what would be written without writing", false)
24
+ .option("--skills-only", "only install skills; skip MCP config", false)
25
+ .option("--mcp-only", "only write MCP config; skip skills", false)
26
+ .option("--local", "point the MCP entry at this local binary instead of `npx @ryanstark24/sfgraph` (use when the npm package isn't published yet)", false)
27
+ .option("--pin-node <path>", "absolute path to a node binary to use as the MCP entry's `command` (defaults to process.execPath when --local is set). Pins the IDE child to a Node ABI matching the rebuilt better-sqlite3 binding.")
28
+ .action(async (opts) => {
29
+ const args = {
30
+ target: opts.target,
31
+ dryRun: opts.dryRun,
32
+ skillsOnly: opts.skillsOnly,
33
+ mcpOnly: opts.mcpOnly,
34
+ local: opts.local,
35
+ };
36
+ if (opts.pinNode !== undefined)
37
+ args.pinNode = opts.pinNode;
38
+ await installCmd(args);
39
+ });
40
+ program
41
+ .command("mcp")
42
+ .description("start the MCP server over stdio (this is what IDEs invoke)")
43
+ .action(async () => {
44
+ const { runMcpServer } = await import("@ryanstark24/sfgraph-server");
45
+ await runMcpServer();
46
+ });
47
+ program
48
+ .command("ingest")
49
+ .description("sync a Salesforce org into the local graph (read-only)")
50
+ .option("--org <alias>", "Salesforce alias/username (defaults to `sf config` target-org)")
51
+ .option("--orgs <list>", "comma-separated list of aliases to ingest in one run (ignores --org)")
52
+ .option("--all", "ingest every authenticated org from `sf` (ignores --org)", false)
53
+ .option("--parallel", "with --orgs/--all, run all orgs concurrently (shares default rate-limit pools)", false)
54
+ .option("--mode <mode>", "full | incremental | auto", "auto")
55
+ .option("--rebuild", "discard existing graph (move to backups/), open fresh DB, force full sync", false)
56
+ .option("--no-backup", "with --rebuild, delete existing graph instead of backing it up")
57
+ .option("--detect-deletions", "with full sync, delete qnames present in the graph but not touched this run (skipped on parse errors)", false)
58
+ .option("--db <path>", "override SQLite database path")
59
+ .option("--only <labels>", "comma-separated source labels to fetch (e.g. 'apex,generic:Profile'); merges into existing graph without rebuild")
60
+ .option("--retry-skipped", "re-fetch only sources that were skipped in the previous run (read from <dataDir>/<orgId>.skips.json)", false)
61
+ .option("--embed-model <path>", "absolute path to a custom embedding model dir (overrides the vendored MiniLM); also reads SFGRAPH_EMBED_MODEL_PATH")
62
+ .option("--embed-model-id <id>", "model id (e.g. 'MyOrg/MyModel'); also reads SFGRAPH_EMBED_MODEL_ID")
63
+ .option("--embed-model-dim <n>", "embedding dimension (default 384); also reads SFGRAPH_EMBED_MODEL_DIM", (v) => Number.parseInt(v, 10))
64
+ .option("--tooling-pool <n>", "max concurrent Tooling-API calls (default 5; also reads SFGRAPH_TOOLING_POOL)", (v) => Number.parseInt(v, 10))
65
+ .option("--metadata-pool <n>", "max concurrent Metadata-API calls (default 5; also reads SFGRAPH_METADATA_POOL). Bump this (e.g. 8-10) to speed up slow ingests dominated by Profile/PermissionSet/Layout fans.", (v) => Number.parseInt(v, 10))
66
+ .option("--data-pool <n>", "max concurrent SObject/Bulk queries (default 10; also reads SFGRAPH_DATA_POOL)", (v) => Number.parseInt(v, 10))
67
+ .option("--debug", "verbose ingest tracing: heartbeat every 10s with heap/rss, last-source tag, signal stack traces. Also sets SFGRAPH_DEBUG_INGEST=1. Use when an ingest dies silently to identify which extractor was active when it stopped.", false)
68
+ .action(async (opts) => {
69
+ if (opts.debug)
70
+ process.env.SFGRAPH_DEBUG_INGEST = "1";
71
+ await ingestCmd({
72
+ org: opts.org,
73
+ orgs: opts.orgs,
74
+ all: opts.all,
75
+ parallel: opts.parallel,
76
+ mode: opts.mode,
77
+ db: opts.db,
78
+ embedModel: opts.embedModel,
79
+ embedModelId: opts.embedModelId,
80
+ embedModelDim: opts.embedModelDim,
81
+ rebuild: opts.rebuild,
82
+ noBackup: opts.backup === false,
83
+ detectDeletions: opts.detectDeletions,
84
+ only: opts.only,
85
+ retrySkipped: opts.retrySkipped,
86
+ toolingPool: opts.toolingPool,
87
+ metadataPool: opts.metadataPool,
88
+ dataPool: opts.dataPool,
89
+ });
90
+ });
91
+ program
92
+ .command("link")
93
+ .description("link the current sfdx project to a Salesforce org alias")
94
+ .requiredOption("--org <alias>", "Salesforce alias/username to bind to this project")
95
+ .option("--project <path>", "override project root (defaults to CWD)")
96
+ .action(async (opts) => {
97
+ await linkCmd({ org: opts.org, project: opts.project });
98
+ });
99
+ program
100
+ .command("wip")
101
+ .description("analyze local sfdx-source changes against the linked org's graph")
102
+ .option("--depth <n>", "traversal depth (1..5)", (v) => Number.parseInt(v, 10), 3)
103
+ .option("--mode <mode>", "changed-only | full-folder", (v) => v, "changed-only")
104
+ .option("--project <path>", "override project root (defaults to CWD)")
105
+ .option("--org <alias>", "override org alias (defaults to workspace binding)")
106
+ .action(async (opts) => {
107
+ await wipCmd({
108
+ depth: opts.depth,
109
+ mode: opts.mode,
110
+ project: opts.project,
111
+ org: opts.org,
112
+ });
113
+ });
114
+ const snapshot = program
115
+ .command("snapshot")
116
+ .description("manage graph snapshots (list, create, diff, prune, delete)");
117
+ snapshot
118
+ .command("list")
119
+ .description("list snapshots for an org")
120
+ .option("--org <alias>", "Salesforce alias (defaults to workspace binding or `sf` default)")
121
+ .option("--project <path>", "override project root (defaults to CWD)")
122
+ .action(async (opts) => {
123
+ await snapshotListCmd({ org: opts.org, project: opts.project });
124
+ });
125
+ snapshot
126
+ .command("create")
127
+ .description("create a labeled snapshot of the current graph")
128
+ .requiredOption("--label <name>", "human-readable label")
129
+ .option("--kind <kind>", "manual | scheduled", "manual")
130
+ .option("--org <alias>", "Salesforce alias")
131
+ .option("--project <path>", "override project root")
132
+ .action(async (opts) => {
133
+ await snapshotCreateCmd({
134
+ label: opts.label,
135
+ kind: opts.kind,
136
+ org: opts.org,
137
+ project: opts.project,
138
+ });
139
+ });
140
+ snapshot
141
+ .command("diff <fromId> <toId>")
142
+ .description("diff two snapshots (or a snapshot vs. 'current')")
143
+ .option("--org <alias>", "Salesforce alias")
144
+ .option("--project <path>", "override project root")
145
+ .action(async (fromId, toId, opts) => {
146
+ await snapshotDiffCmd({ fromId, toId, org: opts.org, project: opts.project });
147
+ });
148
+ snapshot
149
+ .command("prune")
150
+ .description("delete auto-snapshots older than --retain-days")
151
+ .requiredOption("--retain-days <n>", "retention window in days", (v) => Number.parseInt(v, 10))
152
+ .option("--org <alias>", "Salesforce alias")
153
+ .option("--project <path>", "override project root")
154
+ .action(async (opts) => {
155
+ await snapshotPruneCmd({
156
+ retainDays: opts.retainDays,
157
+ org: opts.org,
158
+ project: opts.project,
159
+ });
160
+ });
161
+ snapshot
162
+ .command("delete <snapshotId>")
163
+ .description("delete a single snapshot by id")
164
+ .option("--org <alias>", "Salesforce alias")
165
+ .option("--project <path>", "override project root")
166
+ .action(async (snapshotId, opts) => {
167
+ await snapshotDeleteCmd({ snapshotId, org: opts.org, project: opts.project });
168
+ });
169
+ program
170
+ .command("rebuild-bindings")
171
+ .description("rebuild better-sqlite3's native binding for the current Node runtime (fixes 'bindings file not found' / ABI mismatch after Node upgrade or on a Node version without prebuilts)")
172
+ .option("--dry-run", "show what would be run without executing", false)
173
+ .option("--package-manager <pm>", "force npm | pnpm (auto-detected by default)")
174
+ .action(async (opts) => {
175
+ const { rebuildBindingsCmd } = await import("./commands/rebuild-bindings.js");
176
+ await rebuildBindingsCmd({
177
+ dryRun: opts.dryRun,
178
+ ...(opts.packageManager ? { packageManager: opts.packageManager } : {}),
179
+ });
180
+ });
181
+ program
182
+ .command("doctor")
183
+ .description("diagnose sfgraph install (Node ABI, better-sqlite3 binding, data dir, org DBs, sf CLI, IDE MCP config)")
184
+ .action(async () => {
185
+ await doctorCmd();
186
+ });
187
+ program
188
+ .command("refresh-orgs")
189
+ .description("re-snapshot sf-CLI org state (aliases + default-org) so the MCP child sees the latest after a `sf org login` / alias change / `sf config set target-org`")
190
+ .action(async () => {
191
+ const { refreshOrgsCmd } = await import("./commands/refresh-orgs.js");
192
+ await refreshOrgsCmd();
193
+ });
194
+ program
195
+ .command("serve")
196
+ .description("start the local web visualiser for the ingested graph")
197
+ .option("--port <port>", "port to bind", "7777")
198
+ .option("--host <host>", "host to bind (default 127.0.0.1 — do not expose publicly)", "127.0.0.1")
199
+ .option("--no-open", "do not auto-open the browser")
200
+ .option("--i-understand-public-bind", "required acknowledgement when binding to a non-loopback host (the web API has no auth)", false)
201
+ .action(async (opts) => {
202
+ const { serveCmd } = await import("./commands/serve.js");
203
+ await serveCmd({
204
+ port: Number.parseInt(opts.port, 10) || 7777,
205
+ host: opts.host,
206
+ open: opts.open !== false,
207
+ iUnderstandPublicBind: Boolean(opts.iUnderstandPublicBind),
208
+ });
209
+ });
210
+ const telemetry = program.command("telemetry").description("manage local telemetry");
211
+ telemetry.command("status").action(async () => {
212
+ await statusCmd();
213
+ });
214
+ telemetry
215
+ .command("enable")
216
+ .option("--local", "use local file sink", false)
217
+ .action(async () => {
218
+ await enableLocalCmd();
219
+ });
220
+ telemetry.command("disable").action(async () => {
221
+ await disableCmd();
222
+ });
223
+ telemetry.command("preview").action(async () => {
224
+ await previewCmd();
225
+ });
226
+ telemetry.command("purge").action(async () => {
227
+ await purgeCmd();
228
+ });
229
+ telemetry.command("reset-id").action(async () => {
230
+ await resetIdCmd();
231
+ });
232
+ return program;
233
+ }
234
+ export async function run(argv) {
235
+ const program = buildProgram();
236
+ await program.parseAsync(argv);
237
+ }
238
+ export { getCliVersion };
239
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,UAAU,EACV,cAAc,EACd,UAAU,EACV,QAAQ,EACR,UAAU,EACV,SAAS,GACV,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAE5E,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,KAAK,CAAC;SACpE,MAAM,CAAC,WAAW,EAAE,4CAA4C,EAAE,KAAK,CAAC;SACxE,MAAM,CAAC,eAAe,EAAE,sCAAsC,EAAE,KAAK,CAAC;SACtE,MAAM,CAAC,YAAY,EAAE,oCAAoC,EAAE,KAAK,CAAC;SACjE,MAAM,CACL,SAAS,EACT,+HAA+H,EAC/H,KAAK,CACN;SACA,MAAM,CACL,mBAAmB,EACnB,sMAAsM,CACvM;SACA,MAAM,CACL,KAAK,EAAE,IAON,EAAE,EAAE;QACH,MAAM,IAAI,GAAqC;YAC7C,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5D,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,CACF,CAAC;IAEJ,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QACrE,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,eAAe,EAAE,gEAAgE,CAAC;SACzF,MAAM,CAAC,eAAe,EAAE,sEAAsE,CAAC;SAC/F,MAAM,CAAC,OAAO,EAAE,0DAA0D,EAAE,KAAK,CAAC;SAClF,MAAM,CACL,YAAY,EACZ,gFAAgF,EAChF,KAAK,CACN;SACA,MAAM,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAC5D,MAAM,CACL,WAAW,EACX,2EAA2E,EAC3E,KAAK,CACN;SACA,MAAM,CAAC,aAAa,EAAE,gEAAgE,CAAC;SACvF,MAAM,CACL,oBAAoB,EACpB,uGAAuG,EACvG,KAAK,CACN;SACA,MAAM,CAAC,aAAa,EAAE,+BAA+B,CAAC;SACtD,MAAM,CACL,iBAAiB,EACjB,kHAAkH,CACnH;SACA,MAAM,CACL,iBAAiB,EACjB,sGAAsG,EACtG,KAAK,CACN;SACA,MAAM,CACL,sBAAsB,EACtB,oHAAoH,CACrH;SACA,MAAM,CACL,uBAAuB,EACvB,oEAAoE,CACrE;SACA,MAAM,CACL,uBAAuB,EACvB,uEAAuE,EACvE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAC9B;SACA,MAAM,CACL,oBAAoB,EACpB,+EAA+E,EAC/E,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAC9B;SACA,MAAM,CACL,qBAAqB,EACrB,iLAAiL,EACjL,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAC9B;SACA,MAAM,CACL,iBAAiB,EACjB,gFAAgF,EAChF,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAC9B;SACA,MAAM,CACL,SAAS,EACT,6NAA6N,EAC7N,KAAK,CACN;SACA,MAAM,CACL,KAAK,EAAE,IAmBN,EAAE,EAAE;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,GAAG,CAAC;QACvD,MAAM,SAAS,CAAC;YACd,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,KAAK;YAC/B,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEJ,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yDAAyD,CAAC;SACtE,cAAc,CAAC,eAAe,EAAE,mDAAmD,CAAC;SACpF,MAAM,CAAC,kBAAkB,EAAE,yCAAyC,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,IAAuC,EAAE,EAAE;QACxD,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,kEAAkE,CAAC;SAC/E,MAAM,CAAC,aAAa,EAAE,wBAAwB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;SACjF,MAAM,CACL,eAAe,EACf,4BAA4B,EAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAmC,EAC1C,cAAc,CACf;SACA,MAAM,CAAC,kBAAkB,EAAE,yCAAyC,CAAC;SACrE,MAAM,CAAC,eAAe,EAAE,oDAAoD,CAAC;SAC7E,MAAM,CACL,KAAK,EAAE,IAKN,EAAE,EAAE;QACH,MAAM,MAAM,CAAC;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEJ,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,4DAA4D,CAAC,CAAC;IAC7E,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,eAAe,EAAE,kEAAkE,CAAC;SAC3F,MAAM,CAAC,kBAAkB,EAAE,yCAAyC,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,IAAwC,EAAE,EAAE;QACzD,MAAM,eAAe,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACL,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,cAAc,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;SACxD,MAAM,CAAC,eAAe,EAAE,oBAAoB,EAAE,QAAQ,CAAC;SACvD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC;SAC3C,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;SACnD,MAAM,CACL,KAAK,EAAE,IAKN,EAAE,EAAE;QACH,MAAM,iBAAiB,CAAC;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IACJ,QAAQ;SACL,OAAO,CAAC,sBAAsB,CAAC;SAC/B,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC;SAC3C,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAY,EAAE,IAAwC,EAAE,EAAE;QACvF,MAAM,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IACL,QAAQ;SACL,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,cAAc,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SAC9F,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC;SAC3C,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,IAA4D,EAAE,EAAE;QAC7E,MAAM,gBAAgB,CAAC;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACL,QAAQ;SACL,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC;SAC3C,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,IAAwC,EAAE,EAAE;QAC7E,MAAM,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CACV,iLAAiL,CAClL;SACA,MAAM,CAAC,WAAW,EAAE,0CAA0C,EAAE,KAAK,CAAC;SACtE,MAAM,CAAC,wBAAwB,EAAE,6CAA6C,CAAC;SAC/E,MAAM,CAAC,KAAK,EAAE,IAA0D,EAAE,EAAE;QAC3E,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QAC9E,MAAM,kBAAkB,CAAC;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,wGAAwG,CACzG;SACA,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CACV,0JAA0J,CAC3J;SACA,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QACtE,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,eAAe,EAAE,cAAc,EAAE,MAAM,CAAC;SAC/C,MAAM,CACL,eAAe,EACf,2DAA2D,EAC3D,WAAW,CACZ;SACA,MAAM,CAAC,WAAW,EAAE,8BAA8B,CAAC;SACnD,MAAM,CACL,4BAA4B,EAC5B,wFAAwF,EACxF,KAAK,CACN;SACA,MAAM,CACL,KAAK,EAAE,IAKN,EAAE,EAAE;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACzD,MAAM,QAAQ,CAAC;YACb,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI;YAC5C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,KAAK;YACzB,qBAAqB,EAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC;SAC3D,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEJ,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;IACrF,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QAC5C,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,SAAS;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,MAAM,CAAC,SAAS,EAAE,qBAAqB,EAAE,KAAK,CAAC;SAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IACL,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QAC7C,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QAC7C,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QAC3C,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QAC9C,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getCliVersion(): string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAMA,wBAAgB,aAAa,IAAI,MAAM,CAYtC"}
@@ -0,0 +1,20 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const here = dirname(fileURLToPath(import.meta.url));
5
+ export function getCliVersion() {
6
+ // dist/version.js → ../package.json
7
+ const candidates = [join(here, "..", "package.json"), join(here, "..", "..", "package.json")];
8
+ for (const p of candidates) {
9
+ try {
10
+ const pkg = JSON.parse(readFileSync(p, "utf8"));
11
+ if (pkg.version)
12
+ return pkg.version;
13
+ }
14
+ catch {
15
+ // try next
16
+ }
17
+ }
18
+ return "0.0.0";
19
+ }
20
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAErD,MAAM,UAAU,aAAa;IAC3B,oCAAoC;IACpC,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAC;YACxE,IAAI,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,OAAO,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@ryanstark24/sfgraph-cli",
3
+ "version": "1.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ }
12
+ },
13
+ "dependencies": {
14
+ "commander": "^12.0.0",
15
+ "@ryanstark24/sfgraph-core": "1.1.0",
16
+ "@ryanstark24/sfgraph-server": "1.1.0",
17
+ "@ryanstark24/sfgraph-web": "1.1.0",
18
+ "@ryanstark24/sfgraph-skills": "1.1.0",
19
+ "@ryanstark24/sfgraph-shared": "1.1.0"
20
+ },
21
+ "devDependencies": {
22
+ "@biomejs/biome": "^1.9.0",
23
+ "@types/node": "^22.0.0",
24
+ "typescript": "^5.6.0",
25
+ "vitest": "^3.2.4"
26
+ },
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/ryanStark24/sfgraph"
31
+ },
32
+ "engines": {
33
+ "node": ">=20"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "description": "sfgraph CLI: install, ingest, snapshot, telemetry",
39
+ "files": [
40
+ "dist",
41
+ "README.md"
42
+ ],
43
+ "keywords": [
44
+ "salesforce",
45
+ "sfgraph",
46
+ "mcp",
47
+ "graph",
48
+ "apex",
49
+ "lwc",
50
+ "flow"
51
+ ],
52
+ "scripts": {
53
+ "build": "tsc -p tsconfig.json",
54
+ "test": "vitest run",
55
+ "lint": "biome check src",
56
+ "lint:fix": "biome check --write src",
57
+ "typecheck": "tsc -p tsconfig.json --noEmit",
58
+ "clean": "rm -rf dist"
59
+ }
60
+ }