@kevinrabun/judges 3.44.0 → 3.46.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/audit-bundle.d.ts +29 -0
  6. package/dist/commands/audit-bundle.d.ts.map +1 -0
  7. package/dist/commands/audit-bundle.js +235 -0
  8. package/dist/commands/audit-bundle.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/config-drift.d.ts +25 -0
  14. package/dist/commands/config-drift.d.ts.map +1 -0
  15. package/dist/commands/config-drift.js +214 -0
  16. package/dist/commands/config-drift.js.map +1 -0
  17. package/dist/commands/correlate.d.ts +28 -0
  18. package/dist/commands/correlate.d.ts.map +1 -0
  19. package/dist/commands/correlate.js +242 -0
  20. package/dist/commands/correlate.js.map +1 -0
  21. package/dist/commands/dev-score.d.ts +37 -0
  22. package/dist/commands/dev-score.d.ts.map +1 -0
  23. package/dist/commands/dev-score.js +204 -0
  24. package/dist/commands/dev-score.js.map +1 -0
  25. package/dist/commands/digest.d.ts +20 -0
  26. package/dist/commands/digest.d.ts.map +1 -0
  27. package/dist/commands/digest.js +222 -0
  28. package/dist/commands/digest.js.map +1 -0
  29. package/dist/commands/explain-finding.d.ts +8 -0
  30. package/dist/commands/explain-finding.d.ts.map +1 -0
  31. package/dist/commands/explain-finding.js +279 -0
  32. package/dist/commands/explain-finding.js.map +1 -0
  33. package/dist/commands/generate.d.ts +8 -0
  34. package/dist/commands/generate.d.ts.map +1 -0
  35. package/dist/commands/generate.js +404 -0
  36. package/dist/commands/generate.js.map +1 -0
  37. package/dist/commands/judge-reputation.d.ts +29 -0
  38. package/dist/commands/judge-reputation.d.ts.map +1 -0
  39. package/dist/commands/judge-reputation.js +199 -0
  40. package/dist/commands/judge-reputation.js.map +1 -0
  41. package/dist/commands/learn.d.ts +27 -0
  42. package/dist/commands/learn.d.ts.map +1 -0
  43. package/dist/commands/learn.js +289 -0
  44. package/dist/commands/learn.js.map +1 -0
  45. package/dist/commands/model-risk.d.ts +28 -0
  46. package/dist/commands/model-risk.d.ts.map +1 -0
  47. package/dist/commands/model-risk.js +221 -0
  48. package/dist/commands/model-risk.js.map +1 -0
  49. package/dist/commands/query.d.ts +20 -0
  50. package/dist/commands/query.d.ts.map +1 -0
  51. package/dist/commands/query.js +230 -0
  52. package/dist/commands/query.js.map +1 -0
  53. package/dist/commands/reg-watch.d.ts +21 -0
  54. package/dist/commands/reg-watch.d.ts.map +1 -0
  55. package/dist/commands/reg-watch.js +220 -0
  56. package/dist/commands/reg-watch.js.map +1 -0
  57. package/dist/commands/retro.d.ts +23 -0
  58. package/dist/commands/retro.d.ts.map +1 -0
  59. package/dist/commands/retro.js +217 -0
  60. package/dist/commands/retro.js.map +1 -0
  61. package/dist/commands/rule-share.d.ts +35 -0
  62. package/dist/commands/rule-share.d.ts.map +1 -0
  63. package/dist/commands/rule-share.js +203 -0
  64. package/dist/commands/rule-share.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,204 @@
1
+ /**
2
+ * Developer growth score — track individual developer improvement
3
+ * based on finding patterns over time.
4
+ *
5
+ * Stored locally in .judges-scores/ directory.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
8
+ import { join } from "path";
9
+ const SCORES_DIR = ".judges-scores";
10
+ // ─── Core ───────────────────────────────────────────────────────────────────
11
+ function ensureDir() {
12
+ if (!existsSync(SCORES_DIR))
13
+ mkdirSync(SCORES_DIR, { recursive: true });
14
+ }
15
+ function sanitizeFilename(author) {
16
+ return author.replace(/[^a-zA-Z0-9._-]/g, "_").toLowerCase();
17
+ }
18
+ function loadScore(author) {
19
+ ensureDir();
20
+ const file = join(SCORES_DIR, `${sanitizeFilename(author)}.json`);
21
+ if (!existsSync(file)) {
22
+ return {
23
+ author,
24
+ currentScore: 100,
25
+ history: [],
26
+ weaknesses: [],
27
+ streak: 0,
28
+ totalFindings: 0,
29
+ totalResolved: 0,
30
+ avgFindingsPerCommit: 0,
31
+ trend: "stable",
32
+ lastUpdated: new Date().toISOString(),
33
+ };
34
+ }
35
+ return JSON.parse(readFileSync(file, "utf-8"));
36
+ }
37
+ function saveScore(score) {
38
+ ensureDir();
39
+ const file = join(SCORES_DIR, `${sanitizeFilename(score.author)}.json`);
40
+ writeFileSync(file, JSON.stringify(score, null, 2));
41
+ }
42
+ function computeScore(history) {
43
+ if (history.length === 0)
44
+ return 100;
45
+ // Score based on recent finding rate and resolution rate
46
+ const recent = history.slice(-10);
47
+ const avgFindings = recent.reduce((s, e) => s + e.findingsCount, 0) / recent.length;
48
+ const avgResolved = recent.reduce((s, e) => s + e.resolvedCount, 0) / recent.length;
49
+ const avgCritical = recent.reduce((s, e) => s + e.criticalCount, 0) / recent.length;
50
+ let score = 100;
51
+ score -= avgFindings * 3; // penalty per finding
52
+ score -= avgCritical * 10; // extra penalty for critical
53
+ score += avgResolved * 2; // bonus for resolving
54
+ score = Math.max(0, Math.min(100, Math.round(score)));
55
+ return score;
56
+ }
57
+ function computeTrend(history) {
58
+ if (history.length < 5)
59
+ return "stable";
60
+ const recent = history.slice(-5);
61
+ const older = history.slice(-10, -5);
62
+ if (older.length < 3)
63
+ return "stable";
64
+ const recentAvg = recent.reduce((s, e) => s + e.findingsCount, 0) / recent.length;
65
+ const olderAvg = older.reduce((s, e) => s + e.findingsCount, 0) / older.length;
66
+ if (recentAvg < olderAvg * 0.8)
67
+ return "improving";
68
+ if (recentAvg > olderAvg * 1.2)
69
+ return "declining";
70
+ return "stable";
71
+ }
72
+ export function recordScan(author, findingsCount, criticalCount, highCount, resolvedCount, commitCount) {
73
+ const score = loadScore(author);
74
+ score.history.push({
75
+ date: new Date().toISOString().split("T")[0],
76
+ findingsCount,
77
+ criticalCount,
78
+ highCount,
79
+ resolvedCount,
80
+ commitCount,
81
+ });
82
+ score.totalFindings += findingsCount;
83
+ score.totalResolved += resolvedCount;
84
+ score.streak = findingsCount === 0 ? score.streak + 1 : 0;
85
+ score.currentScore = computeScore(score.history);
86
+ score.trend = computeTrend(score.history);
87
+ const totalCommits = score.history.reduce((s, e) => s + e.commitCount, 0);
88
+ score.avgFindingsPerCommit = totalCommits > 0 ? Math.round((score.totalFindings / totalCommits) * 100) / 100 : 0;
89
+ score.lastUpdated = new Date().toISOString();
90
+ saveScore(score);
91
+ return score;
92
+ }
93
+ export function getScore(author) {
94
+ return loadScore(author);
95
+ }
96
+ // ─── CLI ────────────────────────────────────────────────────────────────────
97
+ export function runDevScore(argv) {
98
+ if (argv.includes("--help") || argv.includes("-h")) {
99
+ console.log(`
100
+ judges dev-score — Developer growth and improvement tracking
101
+
102
+ Usage:
103
+ judges dev-score --author "jane@company.com"
104
+ judges dev-score --record "jane@company.com" --findings 3 --critical 0 --high 1 --resolved 5 --commits 12
105
+ judges dev-score --leaderboard
106
+ judges dev-score --author "jane@company.com" --history
107
+
108
+ Options:
109
+ --author <email> Developer email/identifier
110
+ --record <email> Record a scan for a developer
111
+ --findings <n> Number of findings
112
+ --critical <n> Critical findings
113
+ --high <n> High findings
114
+ --resolved <n> Resolved findings
115
+ --commits <n> Commits in period
116
+ --leaderboard Show team leaderboard
117
+ --history Show score history for author
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
+ // Record scan
125
+ const recordAuthor = argv.find((_a, i) => argv[i - 1] === "--record");
126
+ if (recordAuthor) {
127
+ const getNum = (flag) => {
128
+ const val = argv.find((_a, i) => argv[i - 1] === flag);
129
+ return val ? parseInt(val, 10) : 0;
130
+ };
131
+ const score = recordScan(recordAuthor, getNum("--findings"), getNum("--critical"), getNum("--high"), getNum("--resolved"), getNum("--commits"));
132
+ if (format === "json") {
133
+ console.log(JSON.stringify(score, null, 2));
134
+ }
135
+ else {
136
+ const icon = score.trend === "improving" ? "📈" : score.trend === "declining" ? "📉" : "➡️";
137
+ console.log(` ✅ Scan recorded for ${recordAuthor}`);
138
+ console.log(` Score: ${score.currentScore}/100 ${icon} Streak: ${score.streak} clean scans`);
139
+ }
140
+ return;
141
+ }
142
+ // Show author score
143
+ const author = argv.find((_a, i) => argv[i - 1] === "--author");
144
+ if (author) {
145
+ const score = getScore(author);
146
+ if (argv.includes("--history")) {
147
+ if (format === "json") {
148
+ console.log(JSON.stringify(score.history, null, 2));
149
+ }
150
+ else if (score.history.length === 0) {
151
+ console.log(`\n No history for ${author}.\n`);
152
+ }
153
+ else {
154
+ console.log(`\n Score History — ${author}\n ────────────────────────`);
155
+ for (const h of score.history.slice(-20)) {
156
+ console.log(` ${h.date} findings: ${h.findingsCount} (C:${h.criticalCount} H:${h.highCount}) resolved: ${h.resolvedCount}`);
157
+ }
158
+ console.log("");
159
+ }
160
+ return;
161
+ }
162
+ if (format === "json") {
163
+ console.log(JSON.stringify(score, null, 2));
164
+ }
165
+ else {
166
+ const icon = score.trend === "improving" ? "📈" : score.trend === "declining" ? "📉" : "➡️";
167
+ console.log(`\n Developer Score — ${author}`);
168
+ console.log(` ──────────────────────────`);
169
+ console.log(` Score: ${score.currentScore}/100 ${icon}`);
170
+ console.log(` Trend: ${score.trend}`);
171
+ console.log(` Clean scan streak: ${score.streak}`);
172
+ console.log(` Total findings: ${score.totalFindings}`);
173
+ console.log(` Total resolved: ${score.totalResolved}`);
174
+ console.log(` Findings/commit: ${score.avgFindingsPerCommit}`);
175
+ console.log(` Scans recorded: ${score.history.length}\n`);
176
+ }
177
+ return;
178
+ }
179
+ // Leaderboard
180
+ if (argv.includes("--leaderboard")) {
181
+ ensureDir();
182
+ const { readdirSync: rds } = require("fs");
183
+ const files = rds(SCORES_DIR).filter((f) => f.endsWith(".json"));
184
+ const scores = files.map((f) => JSON.parse(readFileSync(join(SCORES_DIR, f), "utf-8")));
185
+ scores.sort((a, b) => b.currentScore - a.currentScore);
186
+ if (format === "json") {
187
+ console.log(JSON.stringify(scores.map((s) => ({ author: s.author, score: s.currentScore, trend: s.trend })), null, 2));
188
+ }
189
+ else if (scores.length === 0) {
190
+ console.log("\n No scores recorded. Use --record to start tracking.\n");
191
+ }
192
+ else {
193
+ console.log(`\n Leaderboard (${scores.length} developers)\n ─────────────`);
194
+ scores.forEach((s, i) => {
195
+ const icon = s.trend === "improving" ? "📈" : s.trend === "declining" ? "📉" : "➡️";
196
+ console.log(` ${String(i + 1).padStart(2)}. ${s.author.padEnd(25)} ${String(s.currentScore).padStart(3)}/100 ${icon} streak: ${s.streak}`);
197
+ });
198
+ console.log("");
199
+ }
200
+ return;
201
+ }
202
+ console.log(" Use --author <email> to view a score, or --record to log a scan. --help for usage.");
203
+ }
204
+ //# sourceMappingURL=dev-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-score.js","sourceRoot":"","sources":["../../src/commands/dev-score.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"}