@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,230 @@
1
+ /**
2
+ * Advanced finding search/filter — complex queries across evaluation results.
3
+ *
4
+ * Reads local .judges-results.json files for searching.
5
+ */
6
+ import { readFileSync, existsSync, writeFileSync } from "fs";
7
+ const QUERY_FILE = ".judges-query.json";
8
+ const RESULTS_FILE = ".judges-results.json";
9
+ // ─── Core ───────────────────────────────────────────────────────────────────
10
+ function loadResults() {
11
+ if (!existsSync(RESULTS_FILE))
12
+ return [];
13
+ try {
14
+ const data = JSON.parse(readFileSync(RESULTS_FILE, "utf-8"));
15
+ if (Array.isArray(data))
16
+ return data;
17
+ if (data.findings)
18
+ return data.findings;
19
+ return [];
20
+ }
21
+ catch {
22
+ return [];
23
+ }
24
+ }
25
+ function loadQueryDb() {
26
+ if (!existsSync(QUERY_FILE))
27
+ return { history: [], savedQueries: [] };
28
+ return JSON.parse(readFileSync(QUERY_FILE, "utf-8"));
29
+ }
30
+ function saveQueryDb(db) {
31
+ writeFileSync(QUERY_FILE, JSON.stringify(db, null, 2));
32
+ }
33
+ function matchesFilter(finding, key, value) {
34
+ const lowerVal = value.toLowerCase();
35
+ switch (key) {
36
+ case "severity":
37
+ return finding.severity.toLowerCase() === lowerVal;
38
+ case "rule":
39
+ case "ruleId":
40
+ return finding.ruleId.toLowerCase().includes(lowerVal);
41
+ case "title":
42
+ return finding.title.toLowerCase().includes(lowerVal);
43
+ case "description":
44
+ case "desc":
45
+ return finding.description.toLowerCase().includes(lowerVal);
46
+ case "confidence":
47
+ if (finding.confidence === undefined)
48
+ return false;
49
+ return finding.confidence >= parseFloat(value);
50
+ case "has-patch":
51
+ return !!finding.patch;
52
+ case "has-fix":
53
+ return !!finding.suggestedFix;
54
+ default:
55
+ // Generic text search across all string fields
56
+ return [finding.ruleId, finding.title, finding.description, finding.recommendation].some((f) => f.toLowerCase().includes(lowerVal));
57
+ }
58
+ }
59
+ export function queryFindings(queryStr, findings) {
60
+ const records = findings || loadResults();
61
+ // Parse query: "severity:critical rule:SEC text-search"
62
+ const parts = queryStr.split(/\s+/);
63
+ let matches = [...records];
64
+ const textParts = [];
65
+ for (const part of parts) {
66
+ const colonIdx = part.indexOf(":");
67
+ if (colonIdx > 0) {
68
+ const key = part.slice(0, colonIdx);
69
+ const val = part.slice(colonIdx + 1);
70
+ if (part.startsWith("-")) {
71
+ // Negation: -severity:low
72
+ const negKey = key.slice(1);
73
+ matches = matches.filter((f) => !matchesFilter(f, negKey, val));
74
+ }
75
+ else {
76
+ matches = matches.filter((f) => matchesFilter(f, key, val));
77
+ }
78
+ }
79
+ else {
80
+ textParts.push(part.toLowerCase());
81
+ }
82
+ }
83
+ if (textParts.length > 0) {
84
+ const textQuery = textParts.join(" ");
85
+ matches = matches.filter((f) => [f.ruleId, f.title, f.description, f.recommendation].some((s) => s.toLowerCase().includes(textQuery)));
86
+ }
87
+ return { matches, total: matches.length, query: queryStr };
88
+ }
89
+ export function aggregateFindings(findings, groupBy) {
90
+ const result = {};
91
+ for (const f of findings) {
92
+ let key;
93
+ switch (groupBy) {
94
+ case "severity":
95
+ key = f.severity;
96
+ break;
97
+ case "rule":
98
+ case "ruleId":
99
+ key = f.ruleId;
100
+ break;
101
+ case "confidence":
102
+ key = f.confidence !== undefined ? `${Math.floor(f.confidence * 10) * 10}%` : "unknown";
103
+ break;
104
+ default:
105
+ key = f.severity;
106
+ }
107
+ result[key] = (result[key] || 0) + 1;
108
+ }
109
+ return result;
110
+ }
111
+ // ─── CLI ────────────────────────────────────────────────────────────────────
112
+ export function runQuery(argv) {
113
+ if (argv.includes("--help") || argv.includes("-h")) {
114
+ console.log(`
115
+ judges query — Advanced finding search and filter
116
+
117
+ Usage:
118
+ judges query "severity:critical"
119
+ judges query "rule:SEC -severity:low"
120
+ judges query "injection" --aggregate severity
121
+ judges query --save "critical-sec" "severity:critical rule:SEC"
122
+ judges query --saved "critical-sec"
123
+ judges query --list-saved
124
+
125
+ Filter keys:
126
+ severity:<level> critical | high | medium | low
127
+ rule:<pattern> Match ruleId (substring)
128
+ title:<text> Match title
129
+ desc:<text> Match description
130
+ confidence:<min> Minimum confidence (e.g., 0.8)
131
+ has-patch:true Only findings with patches
132
+ has-fix:true Only findings with suggested fixes
133
+ -<key>:<value> Negate a filter
134
+
135
+ Options:
136
+ --aggregate <key> Group by severity|rule|confidence
137
+ --limit <n> Max results
138
+ --save <name> Save query for reuse
139
+ --saved <name> Run a saved query
140
+ --list-saved List saved queries
141
+ --format json JSON output
142
+ --help, -h Show this help
143
+ `);
144
+ return;
145
+ }
146
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
147
+ // List saved queries
148
+ if (argv.includes("--list-saved")) {
149
+ const db = loadQueryDb();
150
+ if (db.savedQueries.length === 0) {
151
+ console.log("\n No saved queries.\n");
152
+ }
153
+ else {
154
+ console.log(`\n Saved Queries (${db.savedQueries.length})\n ───────────────`);
155
+ for (const q of db.savedQueries) {
156
+ console.log(` ${q.name.padEnd(20)} ${q.query}`);
157
+ }
158
+ console.log("");
159
+ }
160
+ return;
161
+ }
162
+ // Save a query
163
+ const saveName = argv.find((_a, i) => argv[i - 1] === "--save");
164
+ if (saveName) {
165
+ const queryStr = argv.filter((a) => !a.startsWith("--") && a !== saveName).join(" ");
166
+ const db = loadQueryDb();
167
+ db.savedQueries = db.savedQueries.filter((q) => q.name !== saveName);
168
+ db.savedQueries.push({ name: saveName, query: queryStr, createdAt: new Date().toISOString() });
169
+ saveQueryDb(db);
170
+ console.log(` ✅ Saved query "${saveName}": ${queryStr}`);
171
+ return;
172
+ }
173
+ // Run saved query
174
+ const savedName = argv.find((_a, i) => argv[i - 1] === "--saved");
175
+ if (savedName) {
176
+ const db = loadQueryDb();
177
+ const saved = db.savedQueries.find((q) => q.name === savedName);
178
+ if (!saved) {
179
+ console.error(` ❌ Saved query "${savedName}" not found`);
180
+ return;
181
+ }
182
+ const result = queryFindings(saved.query);
183
+ printResults(result, format, argv);
184
+ return;
185
+ }
186
+ // Execute query
187
+ const queryStr = argv.filter((a) => !a.startsWith("--")).join(" ");
188
+ if (!queryStr) {
189
+ console.error(" ❌ No query provided. Use --help for usage.");
190
+ return;
191
+ }
192
+ const result = queryFindings(queryStr);
193
+ printResults(result, format, argv);
194
+ }
195
+ function printResults(result, format, argv) {
196
+ const aggregateBy = argv.find((_a, i) => argv[i - 1] === "--aggregate");
197
+ const limitStr = argv.find((_a, i) => argv[i - 1] === "--limit");
198
+ const limit = limitStr ? parseInt(limitStr, 10) : undefined;
199
+ let { matches } = result;
200
+ if (limit)
201
+ matches = matches.slice(0, limit);
202
+ if (aggregateBy) {
203
+ const agg = aggregateFindings(matches, aggregateBy);
204
+ if (format === "json") {
205
+ console.log(JSON.stringify(agg, null, 2));
206
+ }
207
+ else {
208
+ console.log(`\n Aggregate by ${aggregateBy} (${result.total} matches)\n ──────────────────────`);
209
+ for (const [key, count] of Object.entries(agg).sort((a, b) => b[1] - a[1])) {
210
+ console.log(` ${key.padEnd(20)} ${count}`);
211
+ }
212
+ console.log("");
213
+ }
214
+ return;
215
+ }
216
+ if (format === "json") {
217
+ console.log(JSON.stringify({ ...result, matches }, null, 2));
218
+ return;
219
+ }
220
+ console.log(`\n Query: "${result.query}" → ${result.total} match(es)\n ─────────────────────────`);
221
+ if (matches.length === 0) {
222
+ console.log(" No findings matched.\n");
223
+ return;
224
+ }
225
+ for (const f of matches) {
226
+ console.log(` [${f.severity.toUpperCase()}] ${f.ruleId.padEnd(12)} ${f.title.slice(0, 50)}`);
227
+ }
228
+ console.log("");
229
+ }
230
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Regulatory change monitor — track security standards versions
3
+ * and map coverage changes to the current rule set.
4
+ *
5
+ * Uses local versioned data files in .judges-reg-watch.json.
6
+ */
7
+ interface StandardVersion {
8
+ standard: string;
9
+ version: string;
10
+ lastChecked: string;
11
+ items: {
12
+ id: string;
13
+ title: string;
14
+ covered: boolean;
15
+ coveredBy?: string;
16
+ }[];
17
+ }
18
+ export declare function updateWatch(standards: string[]): StandardVersion[];
19
+ export declare function runRegWatch(argv: string[]): void;
20
+ export {};
21
+ //# sourceMappingURL=reg-watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reg-watch.d.ts","sourceRoot":"","sources":["../../src/commands/reg-watch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9E;AA4HD,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAgBlE;AAID,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuGhD"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Regulatory change monitor — track security standards versions
3
+ * and map coverage changes to the current rule set.
4
+ *
5
+ * Uses local versioned data files in .judges-reg-watch.json.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync } from "fs";
8
+ const REG_FILE = ".judges-reg-watch.json";
9
+ // ─── Built-in standards ─────────────────────────────────────────────────────
10
+ const STANDARDS = {
11
+ "owasp-top10": {
12
+ version: "2021",
13
+ items: [
14
+ { id: "A01", title: "Broken Access Control", rulePrefix: "AUTH" },
15
+ { id: "A02", title: "Cryptographic Failures", rulePrefix: "CRYPTO" },
16
+ { id: "A03", title: "Injection", rulePrefix: "INJECT" },
17
+ { id: "A04", title: "Insecure Design", rulePrefix: "SEC" },
18
+ { id: "A05", title: "Security Misconfiguration", rulePrefix: "SEC" },
19
+ { id: "A06", title: "Vulnerable Components", rulePrefix: "DEP" },
20
+ { id: "A07", title: "Authentication Failures", rulePrefix: "AUTH" },
21
+ { id: "A08", title: "Software Integrity Failures", rulePrefix: "SEC" },
22
+ { id: "A09", title: "Logging & Monitoring Failures", rulePrefix: "ERR" },
23
+ { id: "A10", title: "Server-Side Request Forgery", rulePrefix: "SSRF" },
24
+ ],
25
+ },
26
+ "cwe-top25": {
27
+ version: "2024",
28
+ items: [
29
+ { id: "CWE-787", title: "Out-of-bounds Write", rulePrefix: "MEM" },
30
+ { id: "CWE-79", title: "Cross-site Scripting (XSS)", rulePrefix: "INJECT" },
31
+ { id: "CWE-89", title: "SQL Injection", rulePrefix: "INJECT" },
32
+ { id: "CWE-416", title: "Use After Free", rulePrefix: "MEM" },
33
+ { id: "CWE-78", title: "OS Command Injection", rulePrefix: "INJECT" },
34
+ { id: "CWE-20", title: "Improper Input Validation", rulePrefix: "SEC" },
35
+ { id: "CWE-125", title: "Out-of-bounds Read", rulePrefix: "MEM" },
36
+ { id: "CWE-22", title: "Path Traversal", rulePrefix: "SEC" },
37
+ { id: "CWE-352", title: "Cross-Site Request Forgery", rulePrefix: "SEC" },
38
+ { id: "CWE-434", title: "Unrestricted Upload", rulePrefix: "SEC" },
39
+ { id: "CWE-862", title: "Missing Authorization", rulePrefix: "AUTH" },
40
+ { id: "CWE-476", title: "NULL Pointer Dereference", rulePrefix: "ERR" },
41
+ { id: "CWE-287", title: "Improper Authentication", rulePrefix: "AUTH" },
42
+ { id: "CWE-190", title: "Integer Overflow", rulePrefix: "SEC" },
43
+ { id: "CWE-502", title: "Deserialization of Untrusted Data", rulePrefix: "SEC" },
44
+ { id: "CWE-77", title: "Command Injection", rulePrefix: "INJECT" },
45
+ { id: "CWE-119", title: "Buffer Overflow", rulePrefix: "MEM" },
46
+ { id: "CWE-798", title: "Hardcoded Credentials", rulePrefix: "AUTH" },
47
+ { id: "CWE-918", title: "Server-Side Request Forgery", rulePrefix: "SSRF" },
48
+ { id: "CWE-306", title: "Missing Authentication", rulePrefix: "AUTH" },
49
+ { id: "CWE-362", title: "Race Condition", rulePrefix: "CONCUR" },
50
+ { id: "CWE-269", title: "Improper Privilege Management", rulePrefix: "AUTH" },
51
+ { id: "CWE-94", title: "Code Injection", rulePrefix: "INJECT" },
52
+ { id: "CWE-863", title: "Incorrect Authorization", rulePrefix: "AUTH" },
53
+ { id: "CWE-276", title: "Incorrect Default Permissions", rulePrefix: "SEC" },
54
+ ],
55
+ },
56
+ "nist-ssdf": {
57
+ version: "1.1",
58
+ items: [
59
+ { id: "PO.1", title: "Define Security Requirements", rulePrefix: "SEC" },
60
+ { id: "PS.1", title: "Protect Software", rulePrefix: "SEC" },
61
+ { id: "PS.2", title: "Protect Development Environment", rulePrefix: "SEC" },
62
+ { id: "PW.1", title: "Design for Security", rulePrefix: "SEC" },
63
+ { id: "PW.5", title: "Create Source Code with Security Practices", rulePrefix: "SEC" },
64
+ { id: "PW.6", title: "Configure the Build to Find Issues", rulePrefix: "SEC" },
65
+ { id: "PW.7", title: "Review and Audit Software", rulePrefix: "SEC" },
66
+ { id: "PW.8", title: "Test Executable Code", rulePrefix: "SEC" },
67
+ { id: "RV.1", title: "Identify and Confirm Vulnerabilities", rulePrefix: "SEC" },
68
+ { id: "RV.2", title: "Assess, Prioritize, and Remediate", rulePrefix: "SEC" },
69
+ ],
70
+ },
71
+ };
72
+ // ─── Core ───────────────────────────────────────────────────────────────────
73
+ function loadDb() {
74
+ if (!existsSync(REG_FILE))
75
+ return { standards: [], lastUpdated: "" };
76
+ return JSON.parse(readFileSync(REG_FILE, "utf-8"));
77
+ }
78
+ function saveDb(db) {
79
+ writeFileSync(REG_FILE, JSON.stringify(db, null, 2));
80
+ }
81
+ function checkCoverage(standard) {
82
+ const std = STANDARDS[standard];
83
+ if (!std)
84
+ return null;
85
+ // Check which rules are covered via config
86
+ let config = {};
87
+ if (existsSync(".judgesrc")) {
88
+ try {
89
+ config = JSON.parse(readFileSync(".judgesrc", "utf-8"));
90
+ }
91
+ catch {
92
+ /* empty */
93
+ }
94
+ }
95
+ const disabledRules = new Set(config.disabledRules || []);
96
+ const _disabledJudges = new Set(config.disabledJudges || []);
97
+ const items = std.items.map((item) => {
98
+ // Check if the rule prefix is disabled
99
+ const isDisabled = [...disabledRules].some((r) => r.startsWith(item.rulePrefix));
100
+ const judgeMapped = !["MEM", "CONCUR", "SSRF", "DEP"].includes(item.rulePrefix);
101
+ const covered = judgeMapped && !isDisabled;
102
+ return {
103
+ id: item.id,
104
+ title: item.title,
105
+ covered,
106
+ coveredBy: covered ? `${item.rulePrefix}*` : undefined,
107
+ };
108
+ });
109
+ return {
110
+ standard,
111
+ version: std.version,
112
+ lastChecked: new Date().toISOString(),
113
+ items,
114
+ };
115
+ }
116
+ export function updateWatch(standards) {
117
+ const db = loadDb();
118
+ const results = [];
119
+ for (const std of standards) {
120
+ const result = checkCoverage(std);
121
+ if (result) {
122
+ db.standards = db.standards.filter((s) => s.standard !== std);
123
+ db.standards.push(result);
124
+ results.push(result);
125
+ }
126
+ }
127
+ db.lastUpdated = new Date().toISOString();
128
+ saveDb(db);
129
+ return results;
130
+ }
131
+ // ─── CLI ────────────────────────────────────────────────────────────────────
132
+ export function runRegWatch(argv) {
133
+ if (argv.includes("--help") || argv.includes("-h")) {
134
+ console.log(`
135
+ judges reg-watch — Regulatory change monitoring
136
+
137
+ Usage:
138
+ judges reg-watch --standards owasp-top10,cwe-top25
139
+ judges reg-watch --check owasp-top10
140
+ judges reg-watch --list
141
+ judges reg-watch --status
142
+
143
+ Options:
144
+ --standards <csv> Check coverage for standards (comma-separated)
145
+ --check <name> Check single standard coverage
146
+ --list List available standards
147
+ --status Show last check status
148
+ --format json JSON output
149
+ --help, -h Show this help
150
+
151
+ Available standards:
152
+ owasp-top10 OWASP Top 10 (2021)
153
+ cwe-top25 CWE Top 25 (2024)
154
+ nist-ssdf NIST SSDF v1.1
155
+ `);
156
+ return;
157
+ }
158
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
159
+ // List standards
160
+ if (argv.includes("--list")) {
161
+ if (format === "json") {
162
+ console.log(JSON.stringify(Object.entries(STANDARDS).map(([k, v]) => ({ name: k, version: v.version, items: v.items.length })), null, 2));
163
+ }
164
+ else {
165
+ console.log("\n Available Standards\n ───────────────────");
166
+ for (const [name, std] of Object.entries(STANDARDS)) {
167
+ console.log(` ${name.padEnd(15)} v${std.version} (${std.items.length} items)`);
168
+ }
169
+ console.log("");
170
+ }
171
+ return;
172
+ }
173
+ // Check standards
174
+ const standardsStr = argv.find((_a, i) => argv[i - 1] === "--standards");
175
+ const singleCheck = argv.find((_a, i) => argv[i - 1] === "--check");
176
+ const toCheck = standardsStr ? standardsStr.split(",") : singleCheck ? [singleCheck] : [];
177
+ if (toCheck.length > 0) {
178
+ const results = updateWatch(toCheck);
179
+ for (const result of results) {
180
+ const covered = result.items.filter((i) => i.covered).length;
181
+ const total = result.items.length;
182
+ const pct = Math.round((covered / total) * 100);
183
+ if (format === "json") {
184
+ console.log(JSON.stringify(result, null, 2));
185
+ }
186
+ else {
187
+ console.log(`\n ${result.standard} v${result.version} — Coverage: ${pct}% (${covered}/${total})\n ──────────────────────────────────────`);
188
+ for (const item of result.items) {
189
+ const icon = item.covered ? "✅" : "❌";
190
+ console.log(` ${icon} ${item.id.padEnd(10)} ${item.title.padEnd(40)} ${item.coveredBy || "NOT COVERED"}`);
191
+ }
192
+ console.log("");
193
+ }
194
+ }
195
+ return;
196
+ }
197
+ // Status
198
+ if (argv.includes("--status")) {
199
+ const db = loadDb();
200
+ if (db.standards.length === 0) {
201
+ console.log("\n No standards monitored. Use --standards to start.\n");
202
+ return;
203
+ }
204
+ if (format === "json") {
205
+ console.log(JSON.stringify(db, null, 2));
206
+ }
207
+ else {
208
+ console.log(`\n Regulatory Watch Status\n ───────────────────────`);
209
+ console.log(` Last updated: ${db.lastUpdated}`);
210
+ for (const s of db.standards) {
211
+ const covered = s.items.filter((i) => i.covered).length;
212
+ console.log(` ${s.standard.padEnd(15)} v${s.version} — ${covered}/${s.items.length} covered (${s.lastChecked.split("T")[0]})`);
213
+ }
214
+ console.log("");
215
+ }
216
+ return;
217
+ }
218
+ console.log(" Use --standards or --check to monitor. --help for usage.");
219
+ }
220
+ //# sourceMappingURL=reg-watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reg-watch.js","sourceRoot":"","sources":["../../src/commands/reg-watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Security incident retrospective — analyze whether Judges would have
3
+ * caught a specific vulnerability by running evaluation against
4
+ * historical code state.
5
+ *
6
+ * Uses local git history and evaluation results.
7
+ */
8
+ import type { Finding } from "../types.js";
9
+ interface RetroResult {
10
+ file: string;
11
+ commit?: string;
12
+ cve?: string;
13
+ wouldCatch: boolean;
14
+ matchingFindings: Finding[];
15
+ configWouldSuppress: boolean;
16
+ suppressedBy?: string[];
17
+ recommendedConfig?: Record<string, unknown>;
18
+ analysis: string;
19
+ }
20
+ export declare function runRetroAnalysis(file: string, commit?: string, cve?: string): RetroResult;
21
+ export declare function runRetro(argv: string[]): void;
22
+ export {};
23
+ //# sourceMappingURL=retro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retro.d.ts","sourceRoot":"","sources":["../../src/commands/retro.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,EAAE,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAkDD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,CAiGzF;AAID,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgF7C"}