@ryanstark24/sfgraph-cli 1.2.0 → 1.4.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__/diagnose.test.d.ts +2 -0
- package/dist/__tests__/diagnose.test.d.ts.map +1 -0
- package/dist/__tests__/diagnose.test.js +272 -0
- package/dist/__tests__/diagnose.test.js.map +1 -0
- package/dist/__tests__/install-e2e.test.js +1 -1
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +8 -3
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/diagnose.d.ts +139 -0
- package/dist/commands/diagnose.d.ts.map +1 -0
- package/dist/commands/diagnose.js +508 -0
- package/dist/commands/diagnose.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +30 -1
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/rebuild-bindings.d.ts.map +1 -1
- package/dist/commands/rebuild-bindings.js +2 -2
- package/dist/commands/rebuild-bindings.js.map +1 -1
- package/dist/commands/reset-elemid-map.d.ts.map +1 -1
- package/dist/commands/reset-elemid-map.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -1
- package/package.json +16 -16
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/diagnose.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 1.5 W1.5-05 — diagnose CLI subcommand tests.
|
|
3
|
+
*
|
|
4
|
+
* The diagnose command's heavy lifting is the parsing of namespaced
|
|
5
|
+
* warning strings into the structured report shape, plus the env-restore
|
|
6
|
+
* try/finally invariant. We test those directly here against the
|
|
7
|
+
* `DiagnoseReporter` class and the `diagnoseCmd` entrypoint with mocked
|
|
8
|
+
* runner/resolveOrg so no Salesforce connection is required.
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
11
|
+
import { tmpdir } from "node:os";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
14
|
+
import { DiagnoseReporter, diagnoseCmd, topSlowestSources } from "../commands/diagnose.js";
|
|
15
|
+
let tmpRoot;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
tmpRoot = mkdtempSync(join(tmpdir(), "sfgraph-diagnose-test-"));
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
rmSync(tmpRoot, { recursive: true, force: true });
|
|
21
|
+
});
|
|
22
|
+
const fakeResolveOrg = async (alias) => ({
|
|
23
|
+
alias,
|
|
24
|
+
orgId: "00DTEST00000001",
|
|
25
|
+
apiVersion: "60.0",
|
|
26
|
+
instanceUrl: "https://test.my.salesforce.com",
|
|
27
|
+
conn: {},
|
|
28
|
+
});
|
|
29
|
+
/** Build a runner that just emits a canned LiveIngestResult — no real
|
|
30
|
+
* Salesforce activity, no SqliteGraphStore touched (the diagnoseCmd
|
|
31
|
+
* still opens one against the temp dir, which is fine; the runner
|
|
32
|
+
* bypasses any heavy work). */
|
|
33
|
+
function fakeRunner(opts) {
|
|
34
|
+
return async () => {
|
|
35
|
+
if (opts.timeoutMs) {
|
|
36
|
+
await new Promise((r) => setTimeout(r, opts.timeoutMs));
|
|
37
|
+
}
|
|
38
|
+
if (opts.throws)
|
|
39
|
+
throw opts.throws;
|
|
40
|
+
const stub = {
|
|
41
|
+
orgId: "00DTEST00000001",
|
|
42
|
+
capabilities: opts.capabilities ?? { sourceTracking: false, agentforce: false },
|
|
43
|
+
mode: "full",
|
|
44
|
+
membersProcessed: 0,
|
|
45
|
+
parseErrors: 0,
|
|
46
|
+
deletions: 0,
|
|
47
|
+
durationMs: 1,
|
|
48
|
+
crossFlavorEdges: 0,
|
|
49
|
+
arityResolved: 0,
|
|
50
|
+
flowMethodsResolved: 0,
|
|
51
|
+
danglingEdges: 0,
|
|
52
|
+
reflectionEdges: 0,
|
|
53
|
+
overlap: { matched: 0, diverged: 0, empty: 0, annotated: 0 },
|
|
54
|
+
warnings: opts.warnings ?? [],
|
|
55
|
+
};
|
|
56
|
+
return stub;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
describe("DiagnoseReporter.ingestWarnings", () => {
|
|
60
|
+
it("parses a firstYield wedge warning into a structured event", () => {
|
|
61
|
+
const r = new DiagnoseReporter("00DTEST00000001", "alias", 1_000);
|
|
62
|
+
r.ingestWarning("wedge:lwc:firstYield:90s:lastYielded=LightningComponentBundle/Foo:wedgedForMs=90123");
|
|
63
|
+
const out = r.build({
|
|
64
|
+
finishedAtEpoch: 2_000,
|
|
65
|
+
capabilities: {},
|
|
66
|
+
config: { sourceConcurrency: 1, toolingPool: 1, metadataPool: 1, dataPool: 1 },
|
|
67
|
+
warnings: [
|
|
68
|
+
"wedge:lwc:firstYield:90s:lastYielded=LightningComponentBundle/Foo:wedgedForMs=90123",
|
|
69
|
+
],
|
|
70
|
+
exitStatus: "ok",
|
|
71
|
+
});
|
|
72
|
+
const lwc = out.perSource.find((s) => s.name === "lwc");
|
|
73
|
+
expect(lwc).toBeDefined();
|
|
74
|
+
expect(lwc?.wedged).toBe(true);
|
|
75
|
+
expect(lwc?.lastYieldedRecord).toBe("LightningComponentBundle/Foo");
|
|
76
|
+
expect(lwc?.wedgeEvents).toHaveLength(1);
|
|
77
|
+
expect(lwc?.wedgeEvents[0]?.kind).toBe("firstYield");
|
|
78
|
+
expect(lwc?.wedgeEvents[0]?.atMs).toBe(90_000);
|
|
79
|
+
expect(lwc?.wedgeEvents[0]?.lastYieldedRecord).toBe("LightningComponentBundle/Foo");
|
|
80
|
+
});
|
|
81
|
+
it("parses an empty-stream detect-deletions refusal", () => {
|
|
82
|
+
const r = new DiagnoseReporter("00DTEST00000001");
|
|
83
|
+
r.ingestWarning("wedge:detect-deletions:refuse:label=Profile:reason=empty-stream:priorCount=100");
|
|
84
|
+
const out = r.build({
|
|
85
|
+
capabilities: {},
|
|
86
|
+
config: { sourceConcurrency: 1, toolingPool: 1, metadataPool: 1, dataPool: 1 },
|
|
87
|
+
warnings: [],
|
|
88
|
+
exitStatus: "ok",
|
|
89
|
+
});
|
|
90
|
+
expect(out.detectDeletionsRefusals).toHaveLength(1);
|
|
91
|
+
expect(out.detectDeletionsRefusals[0]).toEqual({
|
|
92
|
+
label: "Profile",
|
|
93
|
+
reason: "empty-stream",
|
|
94
|
+
priorCount: 100,
|
|
95
|
+
});
|
|
96
|
+
// Mirrors onto perSource with needsDiagnose=true
|
|
97
|
+
const profile = out.perSource.find((s) => s.name === "Profile");
|
|
98
|
+
expect(profile?.needsDiagnose).toBe(true);
|
|
99
|
+
expect(out.needsDiagnose).toContain("Profile");
|
|
100
|
+
});
|
|
101
|
+
it("parses a drop-ratio refusal with dropped/prior/ratio fields", () => {
|
|
102
|
+
const r = new DiagnoseReporter("00DTEST00000001");
|
|
103
|
+
r.ingestWarning("wedge:detect-deletions:refuse:label=Profile:reason=drop-ratio:dropped=50:prior=100:ratio=0.50");
|
|
104
|
+
const out = r.build({
|
|
105
|
+
capabilities: {},
|
|
106
|
+
config: { sourceConcurrency: 1, toolingPool: 1, metadataPool: 1, dataPool: 1 },
|
|
107
|
+
warnings: [],
|
|
108
|
+
exitStatus: "ok",
|
|
109
|
+
});
|
|
110
|
+
expect(out.detectDeletionsRefusals[0]).toEqual({
|
|
111
|
+
label: "Profile",
|
|
112
|
+
reason: "drop-ratio",
|
|
113
|
+
priorCount: 100,
|
|
114
|
+
touchedCount: 50,
|
|
115
|
+
ratio: 0.5,
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
it("parses a cap-evicted background-wedge entry onto the named source", () => {
|
|
119
|
+
const r = new DiagnoseReporter("00DTEST00000001");
|
|
120
|
+
r.ingestWarning("wedge:cap:backgroundWedgeAborted:source=generic:Layout:ageMs=12345:reason=backgroundWedgeCapExceeded");
|
|
121
|
+
const out = r.build({
|
|
122
|
+
capabilities: {},
|
|
123
|
+
config: { sourceConcurrency: 1, toolingPool: 1, metadataPool: 1, dataPool: 1 },
|
|
124
|
+
warnings: [],
|
|
125
|
+
exitStatus: "ok",
|
|
126
|
+
});
|
|
127
|
+
// "source=generic" is the parsed value because colon-split treats
|
|
128
|
+
// generic:Layout as two segments. The reporter records whatever the
|
|
129
|
+
// warning string identified; the contract is that future warning
|
|
130
|
+
// formats stay compatible. We assert structure, not the exact label.
|
|
131
|
+
const evicted = out.perSource.find((s) => s.wedgeEvents.some((e) => e.kind === "cap-evicted"));
|
|
132
|
+
expect(evicted).toBeDefined();
|
|
133
|
+
expect(evicted?.wedged).toBe(true);
|
|
134
|
+
expect(evicted?.wedgeEvents[0]?.wedgedForMs).toBe(12345);
|
|
135
|
+
});
|
|
136
|
+
it("ignores non-wedge warnings (e.g. plain skip messages)", () => {
|
|
137
|
+
const r = new DiagnoseReporter("00DTEST00000001");
|
|
138
|
+
r.ingestWarning("generic:Layout: skipped (insufficient_access)");
|
|
139
|
+
const out = r.build({
|
|
140
|
+
capabilities: {},
|
|
141
|
+
config: { sourceConcurrency: 1, toolingPool: 1, metadataPool: 1, dataPool: 1 },
|
|
142
|
+
warnings: ["generic:Layout: skipped (insufficient_access)"],
|
|
143
|
+
exitStatus: "ok",
|
|
144
|
+
});
|
|
145
|
+
expect(out.perSource).toHaveLength(0);
|
|
146
|
+
expect(out.detectDeletionsRefusals).toHaveLength(0);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
describe("topSlowestSources", () => {
|
|
150
|
+
it("returns top N by elapsedMs descending; wedged-but-incomplete sources sort to the top", () => {
|
|
151
|
+
const src = (name, elapsedMs, wedged = false) => ({
|
|
152
|
+
name,
|
|
153
|
+
yieldCount: 0,
|
|
154
|
+
wedged,
|
|
155
|
+
wedgeEvents: [],
|
|
156
|
+
...(elapsedMs !== undefined ? { elapsedMs } : {}),
|
|
157
|
+
});
|
|
158
|
+
const sources = [
|
|
159
|
+
src("a", 1_000),
|
|
160
|
+
src("b", 5_000),
|
|
161
|
+
src("c", undefined, true), // wedged, no elapsed → top
|
|
162
|
+
src("d", 3_000),
|
|
163
|
+
src("e", 2_000),
|
|
164
|
+
];
|
|
165
|
+
const top = topSlowestSources(sources, 3);
|
|
166
|
+
expect(top.map((s) => s.name)).toEqual(["c", "b", "d"]);
|
|
167
|
+
});
|
|
168
|
+
it("respects the N parameter", () => {
|
|
169
|
+
const sources = [
|
|
170
|
+
{ name: "x", yieldCount: 0, wedged: false, wedgeEvents: [], elapsedMs: 100 },
|
|
171
|
+
{ name: "y", yieldCount: 0, wedged: false, wedgeEvents: [], elapsedMs: 200 },
|
|
172
|
+
{ name: "z", yieldCount: 0, wedged: false, wedgeEvents: [], elapsedMs: 300 },
|
|
173
|
+
];
|
|
174
|
+
expect(topSlowestSources(sources, 1).map((s) => s.name)).toEqual(["z"]);
|
|
175
|
+
expect(topSlowestSources(sources, 2).map((s) => s.name)).toEqual(["z", "y"]);
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
describe("diagnoseCmd integration", () => {
|
|
179
|
+
it("writes a JSON report with the expected shape to --output", async () => {
|
|
180
|
+
const outPath = join(tmpRoot, "report.json");
|
|
181
|
+
const { reportPath, report } = await diagnoseCmd({ orgId: "myalias", output: outPath, keepGraph: false }, {
|
|
182
|
+
resolveOrg: fakeResolveOrg,
|
|
183
|
+
runner: fakeRunner({
|
|
184
|
+
warnings: [
|
|
185
|
+
"wedge:lwc:firstYield:90s:lastYielded=LightningComponentBundle/Foo:wedgedForMs=90123",
|
|
186
|
+
"wedge:detect-deletions:refuse:label=Profile:reason=empty-stream:priorCount=100",
|
|
187
|
+
],
|
|
188
|
+
capabilities: { sourceTracking: false, agentforce: true },
|
|
189
|
+
}),
|
|
190
|
+
});
|
|
191
|
+
expect(reportPath).toBe(outPath);
|
|
192
|
+
expect(existsSync(outPath)).toBe(true);
|
|
193
|
+
const onDisk = JSON.parse(readFileSync(outPath, "utf8"));
|
|
194
|
+
expect(onDisk.schemaVersion).toBe(1);
|
|
195
|
+
expect(onDisk.diagnosticMode).toBe(true);
|
|
196
|
+
expect(onDisk.orgId).toBe("myalias");
|
|
197
|
+
expect(onDisk.exitStatus).toBe("ok");
|
|
198
|
+
expect(onDisk.config).toMatchObject({
|
|
199
|
+
sourceConcurrency: 1,
|
|
200
|
+
toolingPool: 1,
|
|
201
|
+
metadataPool: 1,
|
|
202
|
+
dataPool: 1,
|
|
203
|
+
});
|
|
204
|
+
expect(onDisk.capabilities.agentforce).toBe(true);
|
|
205
|
+
// Per-source wedge + refusal parsed
|
|
206
|
+
expect(onDisk.perSource.find((s) => s.name === "lwc").wedged).toBe(true);
|
|
207
|
+
expect(onDisk.detectDeletionsRefusals).toHaveLength(1);
|
|
208
|
+
expect(onDisk.needsDiagnose).toContain("Profile");
|
|
209
|
+
// The in-memory `report` matches what was written
|
|
210
|
+
expect(report.exitStatus).toBe("ok");
|
|
211
|
+
});
|
|
212
|
+
it("restores SFGRAPH_SOURCE_CONCURRENCY after the run (try/finally invariant)", async () => {
|
|
213
|
+
const prior = process.env.SFGRAPH_SOURCE_CONCURRENCY;
|
|
214
|
+
process.env.SFGRAPH_SOURCE_CONCURRENCY = "4";
|
|
215
|
+
try {
|
|
216
|
+
const outPath = join(tmpRoot, "report.json");
|
|
217
|
+
await diagnoseCmd({ orgId: "myalias", output: outPath, keepGraph: false }, { resolveOrg: fakeResolveOrg, runner: fakeRunner({ warnings: [] }) });
|
|
218
|
+
expect(process.env.SFGRAPH_SOURCE_CONCURRENCY).toBe("4");
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
if (prior === undefined) {
|
|
222
|
+
// biome-ignore lint/performance/noDelete: env var restoration requires removing the key
|
|
223
|
+
delete process.env.SFGRAPH_SOURCE_CONCURRENCY;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
process.env.SFGRAPH_SOURCE_CONCURRENCY = prior;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
it("restores SFGRAPH_TOOLING_POOL / METADATA_POOL / DATA_POOL even when the runner throws", async () => {
|
|
231
|
+
const snapshot = {
|
|
232
|
+
SFGRAPH_TOOLING_POOL: process.env.SFGRAPH_TOOLING_POOL,
|
|
233
|
+
SFGRAPH_METADATA_POOL: process.env.SFGRAPH_METADATA_POOL,
|
|
234
|
+
SFGRAPH_DATA_POOL: process.env.SFGRAPH_DATA_POOL,
|
|
235
|
+
};
|
|
236
|
+
process.env.SFGRAPH_TOOLING_POOL = "7";
|
|
237
|
+
process.env.SFGRAPH_METADATA_POOL = "8";
|
|
238
|
+
process.env.SFGRAPH_DATA_POOL = "9";
|
|
239
|
+
try {
|
|
240
|
+
const outPath = join(tmpRoot, "report.json");
|
|
241
|
+
const { report } = await diagnoseCmd({ orgId: "myalias", output: outPath, keepGraph: false }, {
|
|
242
|
+
resolveOrg: fakeResolveOrg,
|
|
243
|
+
runner: fakeRunner({ throws: new Error("simulated wedge") }),
|
|
244
|
+
});
|
|
245
|
+
expect(report.exitStatus).toBe("failed");
|
|
246
|
+
expect(report.error).toContain("simulated wedge");
|
|
247
|
+
// Env restored despite the throw
|
|
248
|
+
expect(process.env.SFGRAPH_TOOLING_POOL).toBe("7");
|
|
249
|
+
expect(process.env.SFGRAPH_METADATA_POOL).toBe("8");
|
|
250
|
+
expect(process.env.SFGRAPH_DATA_POOL).toBe("9");
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
for (const [k, v] of Object.entries(snapshot)) {
|
|
254
|
+
if (v === undefined)
|
|
255
|
+
delete process.env[k];
|
|
256
|
+
else
|
|
257
|
+
process.env[k] = v;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
it("hits the timeout path when the runner outlasts --max-duration", async () => {
|
|
262
|
+
const outPath = join(tmpRoot, "report.json");
|
|
263
|
+
const { report } = await diagnoseCmd({ orgId: "myalias", output: outPath, keepGraph: false, maxDuration: 0 }, {
|
|
264
|
+
resolveOrg: fakeResolveOrg,
|
|
265
|
+
// Promise that never resolves within 0s — Promise.race picks the timeout
|
|
266
|
+
runner: fakeRunner({ timeoutMs: 100_000 }),
|
|
267
|
+
});
|
|
268
|
+
expect(report.exitStatus).toBe("timeout");
|
|
269
|
+
expect(report.error).toMatch(/max-duration/);
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
//# sourceMappingURL=diagnose.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.test.js","sourceRoot":"","sources":["../../src/__tests__/diagnose.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ describe("installCmd e2e", () => {
|
|
|
20
20
|
});
|
|
21
21
|
const skillRows = rows.filter((r) => r.kind === "skill");
|
|
22
22
|
const mcpRows = rows.filter((r) => r.kind === "mcp");
|
|
23
|
-
expect(skillRows.length).toBe(
|
|
23
|
+
expect(skillRows.length).toBe(60); // 20 skills * 3 targets
|
|
24
24
|
expect(mcpRows.length).toBe(3);
|
|
25
25
|
expect(existsSync(join(home, ".claude", "skills"))).toBe(true);
|
|
26
26
|
expect(existsSync(join(home, ".cursor", "rules"))).toBe(true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,6DAA6D;IAC7D,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC3B;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,6DAA6D;IAC7D,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC3B;AA+DD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD7D"}
|
package/dist/commands/audit.js
CHANGED
|
@@ -21,11 +21,13 @@ async function resolveOrgIdFromOpts(opts) {
|
|
|
21
21
|
function pad(s, n) {
|
|
22
22
|
return s.length >= n ? s : s + " ".repeat(n - s.length);
|
|
23
23
|
}
|
|
24
|
-
function printTable(orgId, totalEdges, danglingCount, byRel, byDstPrefix, sample) {
|
|
24
|
+
function printTable(orgId, totalEdges, danglingCount, platformRefCount, unexpectedCount, byRel, byDstPrefix, sample) {
|
|
25
25
|
const pct = totalEdges === 0 ? "0%" : `${((danglingCount / totalEdges) * 100).toFixed(1)}%`;
|
|
26
26
|
console.log(`audit: org=${orgId}`);
|
|
27
27
|
console.log(` total edges: ${totalEdges}`);
|
|
28
28
|
console.log(` dangling: ${danglingCount} (${pct})`);
|
|
29
|
+
console.log(` platform refs (expected — standard tabs / standard-schema fields): ${platformRefCount}`);
|
|
30
|
+
console.log(` unexpected (worth investigating): ${unexpectedCount}`);
|
|
29
31
|
if (danglingCount === 0)
|
|
30
32
|
return;
|
|
31
33
|
console.log("");
|
|
@@ -59,7 +61,7 @@ export async function auditCmd(opts) {
|
|
|
59
61
|
console.log(JSON.stringify({ orgId, ...result }, null, 2));
|
|
60
62
|
}
|
|
61
63
|
else {
|
|
62
|
-
printTable(orgId, result.totalEdges, result.danglingCount, result.byRel, result.byDstPrefix, result.sample);
|
|
64
|
+
printTable(orgId, result.totalEdges, result.danglingCount, result.platformRefCount, result.unexpectedCount, result.byRel, result.byDstPrefix, result.sample);
|
|
63
65
|
}
|
|
64
66
|
if (opts.deleteDangling) {
|
|
65
67
|
if (!opts.yes) {
|
|
@@ -67,8 +69,11 @@ export async function auditCmd(opts) {
|
|
|
67
69
|
process.exitCode = 1;
|
|
68
70
|
return;
|
|
69
71
|
}
|
|
70
|
-
const { deleted } = deleteDanglingEdges(store, orgId);
|
|
72
|
+
const { deleted, keptPlatformRefs } = deleteDanglingEdges(store, orgId);
|
|
71
73
|
console.log(`audit: deleted ${deleted} dangling edge${deleted === 1 ? "" : "s"}.`);
|
|
74
|
+
if (keptPlatformRefs > 0) {
|
|
75
|
+
console.log(`audit: kept ${keptPlatformRefs} platform-builtin reference${keptPlatformRefs === 1 ? "" : "s"} (standard tabs / standard-schema fields — real security data with no metadata source).`);
|
|
76
|
+
}
|
|
72
77
|
}
|
|
73
78
|
}
|
|
74
79
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { LiveIngestOpts, LiveIngestResult } from "@ryanstark24/sfgraph-core";
|
|
2
|
+
export type WedgeEventKind = "firstYield" | "inactivity" | "cap-evicted" | "resolvedLate";
|
|
3
|
+
export interface WedgeEvent {
|
|
4
|
+
kind: WedgeEventKind;
|
|
5
|
+
/** ms since this source started; `undefined` when not derivable from the
|
|
6
|
+
* warning string (e.g. cap-evicted carries ageMs, not start-relative). */
|
|
7
|
+
atMs?: number;
|
|
8
|
+
lastYieldedRecord?: string;
|
|
9
|
+
wedgedForMs?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface DiagnoseReportSourceEntry {
|
|
12
|
+
/** Source label (e.g. "lwc", "generic:Profile"). */
|
|
13
|
+
name: string;
|
|
14
|
+
startedAt?: string;
|
|
15
|
+
finishedAt?: string;
|
|
16
|
+
elapsedMs?: number;
|
|
17
|
+
/** Records observed for this source. Populated when the runner supplies
|
|
18
|
+
* onSourceStart/onSourceComplete callbacks. */
|
|
19
|
+
yieldCount: number;
|
|
20
|
+
wedged: boolean;
|
|
21
|
+
lastYieldedRecord?: string;
|
|
22
|
+
wedgeEvents: WedgeEvent[];
|
|
23
|
+
/** W1.5-07: surfaced when this label was refused by the deletion guard. */
|
|
24
|
+
needsDiagnose?: boolean;
|
|
25
|
+
error?: {
|
|
26
|
+
code: string;
|
|
27
|
+
message: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface DetectDeletionsRefusal {
|
|
31
|
+
label: string;
|
|
32
|
+
reason: "empty-stream" | "drop-ratio";
|
|
33
|
+
priorCount: number;
|
|
34
|
+
touchedCount?: number;
|
|
35
|
+
ratio?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface DiagnoseReport {
|
|
38
|
+
schemaVersion: 1;
|
|
39
|
+
diagnosticMode: true;
|
|
40
|
+
/** Caveat reproduced inside the report itself so anyone reading it later
|
|
41
|
+
* understands that wall-clock here != production throughput. */
|
|
42
|
+
note: string;
|
|
43
|
+
orgId: string;
|
|
44
|
+
alias?: string;
|
|
45
|
+
startedAt: string;
|
|
46
|
+
finishedAt: string;
|
|
47
|
+
totalElapsedMs: number;
|
|
48
|
+
exitStatus: "ok" | "failed" | "timeout";
|
|
49
|
+
capabilities: Record<string, unknown>;
|
|
50
|
+
config: {
|
|
51
|
+
sourceConcurrency: number;
|
|
52
|
+
toolingPool: number;
|
|
53
|
+
metadataPool: number;
|
|
54
|
+
dataPool: number;
|
|
55
|
+
/** Echo of the runtime watchdog budgets (NOT overridden by diagnose). */
|
|
56
|
+
watchdogFirstYieldMs?: number;
|
|
57
|
+
watchdogInactivityMs?: number;
|
|
58
|
+
backgroundWedgeCap?: number;
|
|
59
|
+
detectDeletionsMaxDropRatio?: number;
|
|
60
|
+
};
|
|
61
|
+
perSource: DiagnoseReportSourceEntry[];
|
|
62
|
+
detectDeletionsRefusals: DetectDeletionsRefusal[];
|
|
63
|
+
/** Raw namespaced warning strings, preserved verbatim. */
|
|
64
|
+
warnings: string[];
|
|
65
|
+
/** Source labels flagged as needing further diagnosis (typically via
|
|
66
|
+
* detect-deletions guard refusal). */
|
|
67
|
+
needsDiagnose: string[];
|
|
68
|
+
/** Optional error message when `exitStatus !== "ok"`. */
|
|
69
|
+
error?: string;
|
|
70
|
+
}
|
|
71
|
+
export declare class DiagnoseReporter {
|
|
72
|
+
private readonly perSource;
|
|
73
|
+
private readonly refusals;
|
|
74
|
+
private readonly startedAt;
|
|
75
|
+
private readonly orgId;
|
|
76
|
+
private readonly alias?;
|
|
77
|
+
constructor(orgId: string, alias?: string, startedAtEpoch?: number);
|
|
78
|
+
/** Called when a source begins. Idempotent. */
|
|
79
|
+
noteSourceStart(label: string, atEpoch?: number): void;
|
|
80
|
+
/** Called when a source completes (success OR caught error). */
|
|
81
|
+
noteSourceComplete(label: string, info?: {
|
|
82
|
+
recordCount: number;
|
|
83
|
+
error?: Error;
|
|
84
|
+
}, atEpoch?: number): void;
|
|
85
|
+
/** Parse warnings produced by the ingest into structured wedge events +
|
|
86
|
+
* detect-deletions refusal records. Warnings are emitted in the
|
|
87
|
+
* documented namespaced format (see bulk-retrieve.ts fmtWedgeWarning +
|
|
88
|
+
* detect-deletions-guard.ts). */
|
|
89
|
+
ingestWarnings(warnings: readonly string[]): void;
|
|
90
|
+
ingestWarning(w: string): void;
|
|
91
|
+
build(opts: {
|
|
92
|
+
finishedAtEpoch?: number;
|
|
93
|
+
capabilities: Record<string, unknown>;
|
|
94
|
+
config: DiagnoseReport["config"];
|
|
95
|
+
warnings: readonly string[];
|
|
96
|
+
exitStatus: DiagnoseReport["exitStatus"];
|
|
97
|
+
error?: string;
|
|
98
|
+
}): DiagnoseReport;
|
|
99
|
+
}
|
|
100
|
+
export declare function defaultReportPath(orgId: string, now?: Date): string;
|
|
101
|
+
export interface DiagnoseOpts {
|
|
102
|
+
/** Salesforce alias / username / orgId. Treated identically to `ingest --org`. */
|
|
103
|
+
orgId: string;
|
|
104
|
+
/** Override the default report path. */
|
|
105
|
+
output?: string;
|
|
106
|
+
/** Overall diagnose timeout in seconds. Default 600 (10min). */
|
|
107
|
+
maxDuration?: number;
|
|
108
|
+
/** Stream per-source timing to stdout in addition to the JSON report. */
|
|
109
|
+
verbose?: boolean;
|
|
110
|
+
/** Write to the real org graph DB instead of a temp DB. Default false. */
|
|
111
|
+
keepGraph?: boolean;
|
|
112
|
+
}
|
|
113
|
+
/** Internal injection seam: the heavy ingest runner. Production code points
|
|
114
|
+
* at `liveIngest` (lazy-imported). Tests pass a stub. */
|
|
115
|
+
export type DiagnoseLiveRunner = (opts: LiveIngestOpts, reporter: DiagnoseReporter) => Promise<LiveIngestResult>;
|
|
116
|
+
/** Internal injection seam: org-alias resolver. Production code points at
|
|
117
|
+
* `resolveOrg`. Tests pass a stub. */
|
|
118
|
+
export type DiagnoseResolveOrg = (alias: string) => Promise<{
|
|
119
|
+
alias: string;
|
|
120
|
+
orgId: string;
|
|
121
|
+
apiVersion?: string;
|
|
122
|
+
conn?: unknown;
|
|
123
|
+
instanceUrl?: string;
|
|
124
|
+
}>;
|
|
125
|
+
export interface DiagnoseDeps {
|
|
126
|
+
runner?: DiagnoseLiveRunner;
|
|
127
|
+
resolveOrg?: DiagnoseResolveOrg;
|
|
128
|
+
/** Override `Date.now()` for deterministic timestamps in tests. */
|
|
129
|
+
now?: () => number;
|
|
130
|
+
}
|
|
131
|
+
export declare function diagnoseCmd(opts: DiagnoseOpts, deps?: DiagnoseDeps): Promise<{
|
|
132
|
+
reportPath: string;
|
|
133
|
+
report: DiagnoseReport;
|
|
134
|
+
}>;
|
|
135
|
+
/** Top-N by elapsedMs descending. Sources without elapsedMs (never
|
|
136
|
+
* completed) sort to the bottom; if they're wedged we still want them
|
|
137
|
+
* visible, so bump their effective elapsed to maxDurationMs-equivalent. */
|
|
138
|
+
export declare function topSlowestSources(perSource: readonly DiagnoseReportSourceEntry[], n: number): DiagnoseReportSourceEntry[];
|
|
139
|
+
//# sourceMappingURL=diagnose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../../src/commands/diagnose.ts"],"names":[],"mappings":"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"}
|