@kevinrabun/judges 3.43.0 → 3.45.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 (70) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +112 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/burndown.d.ts +27 -0
  6. package/dist/commands/burndown.d.ts.map +1 -0
  7. package/dist/commands/burndown.js +180 -0
  8. package/dist/commands/burndown.js.map +1 -0
  9. package/dist/commands/compare-runs.d.ts +38 -0
  10. package/dist/commands/compare-runs.d.ts.map +1 -0
  11. package/dist/commands/compare-runs.js +229 -0
  12. package/dist/commands/compare-runs.js.map +1 -0
  13. package/dist/commands/correlate.d.ts +28 -0
  14. package/dist/commands/correlate.d.ts.map +1 -0
  15. package/dist/commands/correlate.js +242 -0
  16. package/dist/commands/correlate.js.map +1 -0
  17. package/dist/commands/digest.d.ts +20 -0
  18. package/dist/commands/digest.d.ts.map +1 -0
  19. package/dist/commands/digest.js +222 -0
  20. package/dist/commands/digest.js.map +1 -0
  21. package/dist/commands/explain-finding.d.ts +8 -0
  22. package/dist/commands/explain-finding.d.ts.map +1 -0
  23. package/dist/commands/explain-finding.js +279 -0
  24. package/dist/commands/explain-finding.js.map +1 -0
  25. package/dist/commands/judge-reputation.d.ts +29 -0
  26. package/dist/commands/judge-reputation.d.ts.map +1 -0
  27. package/dist/commands/judge-reputation.js +199 -0
  28. package/dist/commands/judge-reputation.js.map +1 -0
  29. package/dist/commands/kb.d.ts +41 -0
  30. package/dist/commands/kb.d.ts.map +1 -0
  31. package/dist/commands/kb.js +231 -0
  32. package/dist/commands/kb.js.map +1 -0
  33. package/dist/commands/noise-advisor.d.ts +30 -0
  34. package/dist/commands/noise-advisor.d.ts.map +1 -0
  35. package/dist/commands/noise-advisor.js +171 -0
  36. package/dist/commands/noise-advisor.js.map +1 -0
  37. package/dist/commands/query.d.ts +20 -0
  38. package/dist/commands/query.d.ts.map +1 -0
  39. package/dist/commands/query.js +230 -0
  40. package/dist/commands/query.js.map +1 -0
  41. package/dist/commands/recommend.d.ts +21 -0
  42. package/dist/commands/recommend.d.ts.map +1 -0
  43. package/dist/commands/recommend.js +283 -0
  44. package/dist/commands/recommend.js.map +1 -0
  45. package/dist/commands/report-template.d.ts +17 -0
  46. package/dist/commands/report-template.d.ts.map +1 -0
  47. package/dist/commands/report-template.js +291 -0
  48. package/dist/commands/report-template.js.map +1 -0
  49. package/dist/commands/review-queue.d.ts +34 -0
  50. package/dist/commands/review-queue.d.ts.map +1 -0
  51. package/dist/commands/review-queue.js +226 -0
  52. package/dist/commands/review-queue.js.map +1 -0
  53. package/dist/commands/rule-owner.d.ts +31 -0
  54. package/dist/commands/rule-owner.d.ts.map +1 -0
  55. package/dist/commands/rule-owner.js +182 -0
  56. package/dist/commands/rule-owner.js.map +1 -0
  57. package/dist/commands/rule-share.d.ts +35 -0
  58. package/dist/commands/rule-share.d.ts.map +1 -0
  59. package/dist/commands/rule-share.js +203 -0
  60. package/dist/commands/rule-share.js.map +1 -0
  61. package/dist/commands/suppress.d.ts +40 -0
  62. package/dist/commands/suppress.d.ts.map +1 -0
  63. package/dist/commands/suppress.js +209 -0
  64. package/dist/commands/suppress.js.map +1 -0
  65. package/dist/commands/vote.d.ts +32 -0
  66. package/dist/commands/vote.d.ts.map +1 -0
  67. package/dist/commands/vote.js +201 -0
  68. package/dist/commands/vote.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Finding correlation — link related findings, identify root causes,
3
+ * and detect systemic patterns across evaluations.
4
+ *
5
+ * Stored locally in .judges-correlations.json.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync } from "fs";
8
+ const CORRELATION_FILE = ".judges-correlations.json";
9
+ // ─── Core ───────────────────────────────────────────────────────────────────
10
+ function loadDb() {
11
+ if (!existsSync(CORRELATION_FILE))
12
+ return { links: [], rootCauses: [] };
13
+ return JSON.parse(readFileSync(CORRELATION_FILE, "utf-8"));
14
+ }
15
+ function saveDb(db) {
16
+ writeFileSync(CORRELATION_FILE, JSON.stringify(db, null, 2));
17
+ }
18
+ export function linkFindings(findingA, findingB, relationship, notes) {
19
+ const db = loadDb();
20
+ // Avoid duplicates
21
+ const existing = db.links.find((l) => (l.findingA === findingA && l.findingB === findingB) || (l.findingA === findingB && l.findingB === findingA));
22
+ if (existing) {
23
+ existing.relationship = relationship;
24
+ existing.notes = notes;
25
+ saveDb(db);
26
+ return existing;
27
+ }
28
+ const link = {
29
+ findingA,
30
+ findingB,
31
+ relationship,
32
+ notes,
33
+ createdAt: new Date().toISOString(),
34
+ };
35
+ db.links.push(link);
36
+ saveDb(db);
37
+ return link;
38
+ }
39
+ export function addRootCause(title, description, severity, findingIds) {
40
+ const db = loadDb();
41
+ const rootCause = {
42
+ id: `RC-${Date.now()}`,
43
+ title,
44
+ description,
45
+ relatedFindings: findingIds,
46
+ severity,
47
+ createdAt: new Date().toISOString(),
48
+ };
49
+ db.rootCauses.push(rootCause);
50
+ saveDb(db);
51
+ return rootCause;
52
+ }
53
+ export function autoCorrelate(findings) {
54
+ const newLinks = [];
55
+ const db = loadDb();
56
+ for (let i = 0; i < findings.length; i++) {
57
+ for (let j = i + 1; j < findings.length; j++) {
58
+ const a = findings[i];
59
+ const b = findings[j];
60
+ // Same rule → likely related
61
+ if (a.ruleId === b.ruleId) {
62
+ const link = {
63
+ findingA: `${a.ruleId}:${a.title}`,
64
+ findingB: `${b.ruleId}:${b.title}`,
65
+ relationship: "related",
66
+ notes: "Same rule ID",
67
+ createdAt: new Date().toISOString(),
68
+ };
69
+ newLinks.push(link);
70
+ }
71
+ // Same line range → possibly duplicate
72
+ if (a.lineNumbers &&
73
+ b.lineNumbers &&
74
+ a.lineNumbers.length > 0 &&
75
+ b.lineNumbers.length > 0 &&
76
+ a.lineNumbers[0] === b.lineNumbers[0]) {
77
+ const link = {
78
+ findingA: `${a.ruleId}:${a.title}`,
79
+ findingB: `${b.ruleId}:${b.title}`,
80
+ relationship: "duplicate",
81
+ notes: `Same line: ${a.lineNumbers[0]}`,
82
+ createdAt: new Date().toISOString(),
83
+ };
84
+ newLinks.push(link);
85
+ }
86
+ }
87
+ }
88
+ db.links.push(...newLinks);
89
+ saveDb(db);
90
+ return newLinks;
91
+ }
92
+ // ─── CLI ────────────────────────────────────────────────────────────────────
93
+ export function runCorrelate(argv) {
94
+ if (argv.includes("--help") || argv.includes("-h")) {
95
+ console.log(`
96
+ judges correlate — Finding correlation and root-cause analysis
97
+
98
+ Usage:
99
+ judges correlate --link <findingA> <findingB> --relationship related
100
+ judges correlate --root-cause "Missing input validation" --severity high --findings "F1,F2,F3"
101
+ judges correlate --auto Auto-correlate from results
102
+ judges correlate --graph Show correlation graph
103
+ judges correlate --root-causes List root causes
104
+ judges correlate --stats Correlation statistics
105
+
106
+ Options:
107
+ --link <A> <B> Link two findings
108
+ --relationship <type> same-root-cause | related | prerequisite | duplicate
109
+ --notes <text> Optional notes on the link
110
+ --root-cause <title> Create a root cause
111
+ --description <text> Root cause description
112
+ --severity <level> Root cause severity
113
+ --findings <csv> Comma-separated finding IDs
114
+ --auto Auto-correlate findings
115
+ --graph Show relationship graph
116
+ --root-causes List all root causes
117
+ --stats Show statistics
118
+ --format json JSON output
119
+ --help, -h Show this help
120
+ `);
121
+ return;
122
+ }
123
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
124
+ // Link findings
125
+ const linkIdx = argv.indexOf("--link");
126
+ if (linkIdx >= 0 && argv[linkIdx + 1] && argv[linkIdx + 2]) {
127
+ const findingA = argv[linkIdx + 1];
128
+ const findingB = argv[linkIdx + 2];
129
+ const rel = argv.find((_a, i) => argv[i - 1] === "--relationship") ||
130
+ "related";
131
+ const notes = argv.find((_a, i) => argv[i - 1] === "--notes");
132
+ const link = linkFindings(findingA, findingB, rel, notes);
133
+ if (format === "json") {
134
+ console.log(JSON.stringify(link, null, 2));
135
+ }
136
+ else {
137
+ console.log(` ✅ Linked: ${findingA} ↔ ${findingB} (${rel})`);
138
+ }
139
+ return;
140
+ }
141
+ // Root cause
142
+ const rootTitle = argv.find((_a, i) => argv[i - 1] === "--root-cause");
143
+ if (rootTitle) {
144
+ const desc = argv.find((_a, i) => argv[i - 1] === "--description") || rootTitle;
145
+ const severity = argv.find((_a, i) => argv[i - 1] === "--severity") || "medium";
146
+ const findingsStr = argv.find((_a, i) => argv[i - 1] === "--findings") || "";
147
+ const findingIds = findingsStr.split(",").filter(Boolean);
148
+ const rc = addRootCause(rootTitle, desc, severity, findingIds);
149
+ if (format === "json") {
150
+ console.log(JSON.stringify(rc, null, 2));
151
+ }
152
+ else {
153
+ console.log(` ✅ Root cause created: ${rc.id} — ${rc.title} (${rc.severity})`);
154
+ console.log(` Related findings: ${rc.relatedFindings.length}`);
155
+ }
156
+ return;
157
+ }
158
+ // Auto correlate
159
+ if (argv.includes("--auto")) {
160
+ const resultsFile = ".judges-results.json";
161
+ if (!existsSync(resultsFile)) {
162
+ console.error(" ❌ No .judges-results.json found. Run an evaluation first.");
163
+ return;
164
+ }
165
+ try {
166
+ const data = JSON.parse(readFileSync(resultsFile, "utf-8"));
167
+ const findings = Array.isArray(data) ? data : data.findings || [];
168
+ const links = autoCorrelate(findings);
169
+ console.log(` ✅ Auto-correlated ${links.length} link(s) from ${findings.length} findings`);
170
+ }
171
+ catch {
172
+ console.error(" ❌ Failed to parse results file");
173
+ }
174
+ return;
175
+ }
176
+ const db = loadDb();
177
+ // Root causes list
178
+ if (argv.includes("--root-causes")) {
179
+ if (format === "json") {
180
+ console.log(JSON.stringify(db.rootCauses, null, 2));
181
+ }
182
+ else if (db.rootCauses.length === 0) {
183
+ console.log("\n No root causes identified.\n");
184
+ }
185
+ else {
186
+ console.log(`\n Root Causes (${db.rootCauses.length})\n ────────────`);
187
+ for (const rc of db.rootCauses) {
188
+ console.log(` [${rc.severity.toUpperCase()}] ${rc.id} — ${rc.title} (${rc.relatedFindings.length} findings)`);
189
+ }
190
+ console.log("");
191
+ }
192
+ return;
193
+ }
194
+ // Stats
195
+ if (argv.includes("--stats")) {
196
+ const stats = {
197
+ totalLinks: db.links.length,
198
+ rootCauses: db.rootCauses.length,
199
+ byRelationship: {
200
+ related: db.links.filter((l) => l.relationship === "related").length,
201
+ duplicate: db.links.filter((l) => l.relationship === "duplicate").length,
202
+ sameRootCause: db.links.filter((l) => l.relationship === "same-root-cause").length,
203
+ prerequisite: db.links.filter((l) => l.relationship === "prerequisite").length,
204
+ },
205
+ };
206
+ if (format === "json") {
207
+ console.log(JSON.stringify(stats, null, 2));
208
+ }
209
+ else {
210
+ console.log(`
211
+ Correlation Statistics
212
+ ──────────────────────
213
+ Total links: ${stats.totalLinks}
214
+ Root causes: ${stats.rootCauses}
215
+ Related: ${stats.byRelationship.related}
216
+ Duplicates: ${stats.byRelationship.duplicate}
217
+ Same root cause: ${stats.byRelationship.sameRootCause}
218
+ Prerequisites: ${stats.byRelationship.prerequisite}
219
+ `);
220
+ }
221
+ return;
222
+ }
223
+ // Default: graph view
224
+ if (db.links.length === 0 && db.rootCauses.length === 0) {
225
+ console.log("\n No correlations. Use --link or --auto to start.\n");
226
+ return;
227
+ }
228
+ if (format === "json") {
229
+ console.log(JSON.stringify(db, null, 2));
230
+ }
231
+ else {
232
+ console.log(`\n Correlation Graph (${db.links.length} links, ${db.rootCauses.length} root causes)\n ────────────────────`);
233
+ for (const l of db.links.slice(0, 20)) {
234
+ const arrow = l.relationship === "prerequisite" ? "→" : "↔";
235
+ console.log(` ${l.findingA} ${arrow} ${l.findingB} [${l.relationship}]`);
236
+ }
237
+ if (db.links.length > 20)
238
+ console.log(` ... and ${db.links.length - 20} more`);
239
+ console.log("");
240
+ }
241
+ }
242
+ //# sourceMappingURL=correlate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlate.js","sourceRoot":"","sources":["../../src/commands/correlate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Periodic report builder — weekly/daily digest generation
3
+ * with trend summaries, comparisons, and distribution.
4
+ *
5
+ * Stored locally in .judges-digest.json.
6
+ */
7
+ interface DigestSnapshot {
8
+ date: string;
9
+ critical: number;
10
+ high: number;
11
+ medium: number;
12
+ low: number;
13
+ total: number;
14
+ resolved: number;
15
+ newFindings: number;
16
+ }
17
+ export declare function addSnapshot(snapshot: Omit<DigestSnapshot, "date">): DigestSnapshot;
18
+ export declare function runDigest(argv: string[]): void;
19
+ export {};
20
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../src/commands/digest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AA+BD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,cAAc,CAMlF;AAgFD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwI9C"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Periodic report builder — weekly/daily digest generation
3
+ * with trend summaries, comparisons, and distribution.
4
+ *
5
+ * Stored locally in .judges-digest.json.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync } from "fs";
8
+ const DIGEST_FILE = ".judges-digest.json";
9
+ // ─── Core ───────────────────────────────────────────────────────────────────
10
+ function loadDb() {
11
+ if (!existsSync(DIGEST_FILE))
12
+ return {
13
+ snapshots: [],
14
+ config: { frequency: "weekly", includeResolved: true, includeTrends: true },
15
+ };
16
+ return JSON.parse(readFileSync(DIGEST_FILE, "utf-8"));
17
+ }
18
+ function saveDb(db) {
19
+ writeFileSync(DIGEST_FILE, JSON.stringify(db, null, 2));
20
+ }
21
+ export function addSnapshot(snapshot) {
22
+ const db = loadDb();
23
+ const entry = { ...snapshot, date: new Date().toISOString().split("T")[0] };
24
+ db.snapshots.push(entry);
25
+ saveDb(db);
26
+ return entry;
27
+ }
28
+ function generateDigestReport(db, period) {
29
+ const lines = [];
30
+ const now = new Date();
31
+ let cutoff;
32
+ switch (period) {
33
+ case "daily":
34
+ cutoff = new Date(now.getTime() - 86400000);
35
+ break;
36
+ case "weekly":
37
+ cutoff = new Date(now.getTime() - 7 * 86400000);
38
+ break;
39
+ case "monthly":
40
+ cutoff = new Date(now.getTime() - 30 * 86400000);
41
+ break;
42
+ default:
43
+ cutoff = new Date(now.getTime() - 7 * 86400000);
44
+ }
45
+ const recent = db.snapshots.filter((s) => new Date(s.date) >= cutoff);
46
+ const older = db.snapshots.filter((s) => new Date(s.date) < cutoff);
47
+ lines.push(`# Judges Digest — ${period.charAt(0).toUpperCase() + period.slice(1)} Report`);
48
+ lines.push(`> Generated: ${now.toISOString()}\n`);
49
+ if (recent.length === 0) {
50
+ lines.push("No data for this period. Use `judges digest --snapshot` to record findings.\n");
51
+ return lines.join("\n");
52
+ }
53
+ const latest = recent[recent.length - 1];
54
+ lines.push("## Current Status");
55
+ lines.push(`| Severity | Count |`);
56
+ lines.push(`|----------|-------|`);
57
+ lines.push(`| Critical | ${latest.critical} |`);
58
+ lines.push(`| High | ${latest.high} |`);
59
+ lines.push(`| Medium | ${latest.medium} |`);
60
+ lines.push(`| Low | ${latest.low} |`);
61
+ lines.push(`| **Total** | **${latest.total}** |`);
62
+ lines.push("");
63
+ if (db.config.includeTrends && recent.length >= 2) {
64
+ const first = recent[0];
65
+ const delta = latest.total - first.total;
66
+ const arrow = delta > 0 ? "📈" : delta < 0 ? "📉" : "➡️";
67
+ lines.push("## Trend");
68
+ lines.push(`- Period: ${first.date} → ${latest.date}`);
69
+ lines.push(`- Change: ${delta > 0 ? "+" : ""}${delta} findings ${arrow}`);
70
+ lines.push(`- New: ${recent.reduce((s, r) => s + r.newFindings, 0)}`);
71
+ lines.push(`- Resolved: ${recent.reduce((s, r) => s + r.resolved, 0)}`);
72
+ lines.push("");
73
+ }
74
+ if (db.config.includeResolved && older.length > 0) {
75
+ const prevTotal = older[older.length - 1].total;
76
+ lines.push("## Comparison with Previous Period");
77
+ lines.push(`- Previous total: ${prevTotal}`);
78
+ lines.push(`- Current total: ${latest.total}`);
79
+ lines.push(`- Net change: ${latest.total - prevTotal}`);
80
+ lines.push("");
81
+ }
82
+ // Sparkline-style chart
83
+ if (recent.length >= 3) {
84
+ lines.push("## Trend Chart");
85
+ const max = Math.max(...recent.map((r) => r.total), 1);
86
+ for (const s of recent) {
87
+ const bar = "█".repeat(Math.max(1, Math.round((s.total / max) * 30)));
88
+ lines.push(` ${s.date} ${bar} ${s.total}`);
89
+ }
90
+ lines.push("");
91
+ }
92
+ return lines.join("\n");
93
+ }
94
+ // ─── CLI ────────────────────────────────────────────────────────────────────
95
+ export function runDigest(argv) {
96
+ if (argv.includes("--help") || argv.includes("-h")) {
97
+ console.log(`
98
+ judges digest — Periodic finding digest and trend reports
99
+
100
+ Usage:
101
+ judges digest --snapshot --critical 2 --high 5 --medium 10 --low 3 --resolved 4 --new 3
102
+ judges digest --generate weekly
103
+ judges digest --generate daily --output report.md
104
+ judges digest --configure --frequency weekly
105
+ judges digest --history
106
+ judges digest --stats
107
+
108
+ Options:
109
+ --snapshot Record a point-in-time snapshot
110
+ --critical <n> Critical count
111
+ --high <n> High count
112
+ --medium <n> Medium count
113
+ --low <n> Low count
114
+ --resolved <n> Resolved since last snapshot
115
+ --new <n> New findings since last snapshot
116
+ --generate <period> Generate digest: daily | weekly | monthly
117
+ --output <file> Write report to file
118
+ --configure Update digest configuration
119
+ --frequency <freq> daily | weekly | monthly
120
+ --history Show snapshot history
121
+ --stats Summary statistics
122
+ --format json JSON output
123
+ --help, -h Show this help
124
+ `);
125
+ return;
126
+ }
127
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
128
+ // Record snapshot
129
+ if (argv.includes("--snapshot")) {
130
+ const getNum = (flag) => {
131
+ const val = argv.find((_a, i) => argv[i - 1] === flag);
132
+ return val ? parseInt(val, 10) : 0;
133
+ };
134
+ const snapshot = addSnapshot({
135
+ critical: getNum("--critical"),
136
+ high: getNum("--high"),
137
+ medium: getNum("--medium"),
138
+ low: getNum("--low"),
139
+ total: getNum("--critical") + getNum("--high") + getNum("--medium") + getNum("--low"),
140
+ resolved: getNum("--resolved"),
141
+ newFindings: getNum("--new"),
142
+ });
143
+ if (format === "json") {
144
+ console.log(JSON.stringify(snapshot, null, 2));
145
+ }
146
+ else {
147
+ console.log(` ✅ Snapshot recorded: ${snapshot.date} — ${snapshot.total} findings (${snapshot.newFindings} new, ${snapshot.resolved} resolved)`);
148
+ }
149
+ return;
150
+ }
151
+ // Generate digest
152
+ const period = argv.find((_a, i) => argv[i - 1] === "--generate");
153
+ if (period) {
154
+ const db = loadDb();
155
+ const report = generateDigestReport(db, period);
156
+ const outputFile = argv.find((_a, i) => argv[i - 1] === "--output");
157
+ if (outputFile) {
158
+ writeFileSync(outputFile, report);
159
+ console.log(` ✅ Digest written to ${outputFile}`);
160
+ }
161
+ else {
162
+ console.log(report);
163
+ }
164
+ return;
165
+ }
166
+ // Configure
167
+ if (argv.includes("--configure")) {
168
+ const db = loadDb();
169
+ const freq = argv.find((_a, i) => argv[i - 1] === "--frequency");
170
+ if (freq)
171
+ db.config.frequency = freq;
172
+ saveDb(db);
173
+ console.log(` ✅ Digest configured: frequency=${db.config.frequency}`);
174
+ return;
175
+ }
176
+ const db = loadDb();
177
+ // History
178
+ if (argv.includes("--history")) {
179
+ if (format === "json") {
180
+ console.log(JSON.stringify(db.snapshots, null, 2));
181
+ }
182
+ else if (db.snapshots.length === 0) {
183
+ console.log("\n No snapshots. Use --snapshot to record.\n");
184
+ }
185
+ else {
186
+ console.log(`\n Snapshot History (${db.snapshots.length})\n ─────────────────`);
187
+ for (const s of db.snapshots.slice(-20)) {
188
+ console.log(` ${s.date} C:${s.critical} H:${s.high} M:${s.medium} L:${s.low} (${s.total} total, +${s.newFindings} -${s.resolved})`);
189
+ }
190
+ console.log("");
191
+ }
192
+ return;
193
+ }
194
+ // Stats
195
+ if (argv.includes("--stats") || db.snapshots.length > 0) {
196
+ if (db.snapshots.length === 0) {
197
+ console.log("\n No digest data. Use --snapshot to start tracking.\n");
198
+ return;
199
+ }
200
+ const latest = db.snapshots[db.snapshots.length - 1];
201
+ const totalResolved = db.snapshots.reduce((s, snap) => s + snap.resolved, 0);
202
+ const totalNew = db.snapshots.reduce((s, snap) => s + snap.newFindings, 0);
203
+ if (format === "json") {
204
+ console.log(JSON.stringify({ latest, totalResolved, totalNew, snapshots: db.snapshots.length }, null, 2));
205
+ }
206
+ else {
207
+ console.log(`
208
+ Digest Summary
209
+ ──────────────
210
+ Snapshots: ${db.snapshots.length}
211
+ Latest total: ${latest.total} (${latest.date})
212
+ Total resolved: ${totalResolved}
213
+ Total new: ${totalNew}
214
+ Net change: ${totalNew - totalResolved}
215
+ Frequency: ${db.config.frequency}
216
+ `);
217
+ }
218
+ return;
219
+ }
220
+ console.log("\n No digest data. Use --snapshot to start tracking, then --generate to create reports.\n");
221
+ }
222
+ //# sourceMappingURL=digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.js","sourceRoot":"","sources":["../../src/commands/digest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Detailed finding explanation — provide rich context, references,
3
+ * and remediation guidance for individual findings.
4
+ */
5
+ import type { Finding } from "../types.js";
6
+ export declare function explainFinding(finding: Finding): string;
7
+ export declare function runExplainFinding(argv: string[]): void;
8
+ //# sourceMappingURL=explain-finding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain-finding.d.ts","sourceRoot":"","sources":["../../src/commands/explain-finding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAgH3C,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAkEvD;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgHtD"}