@kevinrabun/judges 3.45.0 → 3.47.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/adoption-report.d.ts +8 -0
  6. package/dist/commands/adoption-report.d.ts.map +1 -0
  7. package/dist/commands/adoption-report.js +219 -0
  8. package/dist/commands/adoption-report.js.map +1 -0
  9. package/dist/commands/ai-model-trust.d.ts +17 -0
  10. package/dist/commands/ai-model-trust.d.ts.map +1 -0
  11. package/dist/commands/ai-model-trust.js +235 -0
  12. package/dist/commands/ai-model-trust.js.map +1 -0
  13. package/dist/commands/ai-prompt-audit.d.ts +23 -0
  14. package/dist/commands/ai-prompt-audit.d.ts.map +1 -0
  15. package/dist/commands/ai-prompt-audit.js +255 -0
  16. package/dist/commands/ai-prompt-audit.js.map +1 -0
  17. package/dist/commands/audit-bundle.d.ts +29 -0
  18. package/dist/commands/audit-bundle.d.ts.map +1 -0
  19. package/dist/commands/audit-bundle.js +235 -0
  20. package/dist/commands/audit-bundle.js.map +1 -0
  21. package/dist/commands/code-owner-suggest.d.ts +17 -0
  22. package/dist/commands/code-owner-suggest.d.ts.map +1 -0
  23. package/dist/commands/code-owner-suggest.js +215 -0
  24. package/dist/commands/code-owner-suggest.js.map +1 -0
  25. package/dist/commands/config-drift.d.ts +25 -0
  26. package/dist/commands/config-drift.d.ts.map +1 -0
  27. package/dist/commands/config-drift.js +214 -0
  28. package/dist/commands/config-drift.js.map +1 -0
  29. package/dist/commands/cost-forecast.d.ts +19 -0
  30. package/dist/commands/cost-forecast.d.ts.map +1 -0
  31. package/dist/commands/cost-forecast.js +194 -0
  32. package/dist/commands/cost-forecast.js.map +1 -0
  33. package/dist/commands/dev-score.d.ts +37 -0
  34. package/dist/commands/dev-score.d.ts.map +1 -0
  35. package/dist/commands/dev-score.js +204 -0
  36. package/dist/commands/dev-score.js.map +1 -0
  37. package/dist/commands/generate.d.ts +8 -0
  38. package/dist/commands/generate.d.ts.map +1 -0
  39. package/dist/commands/generate.js +404 -0
  40. package/dist/commands/generate.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/pr-quality-gate.d.ts +29 -0
  50. package/dist/commands/pr-quality-gate.d.ts.map +1 -0
  51. package/dist/commands/pr-quality-gate.js +208 -0
  52. package/dist/commands/pr-quality-gate.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/team-leaderboard.d.ts +25 -0
  62. package/dist/commands/team-leaderboard.d.ts.map +1 -0
  63. package/dist/commands/team-leaderboard.js +228 -0
  64. package/dist/commands/team-leaderboard.js.map +1 -0
  65. package/dist/commands/team-rules-sync.d.ts +8 -0
  66. package/dist/commands/team-rules-sync.d.ts.map +1 -0
  67. package/dist/commands/team-rules-sync.js +251 -0
  68. package/dist/commands/team-rules-sync.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,208 @@
1
+ /**
2
+ * PR quality gate — automated pass/fail gate for PRs with
3
+ * configurable thresholds for auto-approval.
4
+ *
5
+ * All decisions are local — integrates via output format.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
8
+ import { join } from "path";
9
+ const GATE_DIR = ".judges-quality-gate";
10
+ const GATE_FILE = join(GATE_DIR, "gate-history.json");
11
+ const POLICY_FILE = join(GATE_DIR, "policy.json");
12
+ const DEFAULT_POLICY = {
13
+ maxCritical: 0,
14
+ maxHigh: 2,
15
+ maxTotal: 20,
16
+ requireTestCoverage: false,
17
+ autoApproveBelow: 80,
18
+ };
19
+ // ─── Core ───────────────────────────────────────────────────────────────────
20
+ function ensureDir() {
21
+ if (!existsSync(GATE_DIR))
22
+ mkdirSync(GATE_DIR, { recursive: true });
23
+ }
24
+ function loadPolicy() {
25
+ if (!existsSync(POLICY_FILE))
26
+ return { ...DEFAULT_POLICY };
27
+ try {
28
+ return { ...DEFAULT_POLICY, ...JSON.parse(readFileSync(POLICY_FILE, "utf-8")) };
29
+ }
30
+ catch {
31
+ return { ...DEFAULT_POLICY };
32
+ }
33
+ }
34
+ function savePolicy(policy) {
35
+ ensureDir();
36
+ writeFileSync(POLICY_FILE, JSON.stringify(policy, null, 2));
37
+ }
38
+ function loadHistory() {
39
+ if (!existsSync(GATE_FILE))
40
+ return { results: [], updatedAt: new Date().toISOString() };
41
+ try {
42
+ return JSON.parse(readFileSync(GATE_FILE, "utf-8"));
43
+ }
44
+ catch {
45
+ return { results: [], updatedAt: new Date().toISOString() };
46
+ }
47
+ }
48
+ function saveHistory(history) {
49
+ ensureDir();
50
+ history.updatedAt = new Date().toISOString();
51
+ writeFileSync(GATE_FILE, JSON.stringify(history, null, 2));
52
+ }
53
+ export function evaluateGate(critical, high, medium, low, score) {
54
+ const policy = loadPolicy();
55
+ const total = critical + high + medium + low;
56
+ let passed = true;
57
+ let reason = "All checks passed";
58
+ if (critical > policy.maxCritical) {
59
+ passed = false;
60
+ reason = `Critical findings (${critical}) exceed limit (${policy.maxCritical})`;
61
+ }
62
+ else if (high > policy.maxHigh) {
63
+ passed = false;
64
+ reason = `High findings (${high}) exceed limit (${policy.maxHigh})`;
65
+ }
66
+ else if (total > policy.maxTotal) {
67
+ passed = false;
68
+ reason = `Total findings (${total}) exceed limit (${policy.maxTotal})`;
69
+ }
70
+ else if (score < policy.autoApproveBelow) {
71
+ passed = false;
72
+ reason = `Score (${score}) below threshold (${policy.autoApproveBelow})`;
73
+ }
74
+ const result = {
75
+ passed,
76
+ reason,
77
+ critical,
78
+ high,
79
+ medium,
80
+ low,
81
+ total,
82
+ score,
83
+ policy,
84
+ timestamp: new Date().toISOString(),
85
+ };
86
+ // Record
87
+ const history = loadHistory();
88
+ history.results.push(result);
89
+ if (history.results.length > 200)
90
+ history.results = history.results.slice(-200);
91
+ saveHistory(history);
92
+ return result;
93
+ }
94
+ // ─── CLI ────────────────────────────────────────────────────────────────────
95
+ export function runPrQualityGate(argv) {
96
+ if (argv.includes("--help") || argv.includes("-h")) {
97
+ console.log(`
98
+ judges pr-quality-gate — Automated PR pass/fail quality gate
99
+
100
+ Usage:
101
+ judges pr-quality-gate --check --critical 0 --high 1 --medium 5 --low 10 --score 85
102
+ judges pr-quality-gate --policy
103
+ judges pr-quality-gate --set-policy --max-critical 0 --max-high 3 --max-total 25
104
+ judges pr-quality-gate --history
105
+
106
+ Options:
107
+ --check Evaluate against policy (exit code 1 = fail)
108
+ --critical <n> Critical finding count
109
+ --high <n> High finding count
110
+ --medium <n> Medium finding count
111
+ --low <n> Low finding count
112
+ --score <n> Overall score (0-100)
113
+ --policy Show current policy
114
+ --set-policy Update policy thresholds
115
+ --max-critical <n> Set max critical threshold
116
+ --max-high <n> Set max high threshold
117
+ --max-total <n> Set max total threshold
118
+ --auto-approve <n> Set auto-approve score threshold
119
+ --history Show gate decision history
120
+ --format json JSON output
121
+ --help, -h Show this help
122
+ `);
123
+ return;
124
+ }
125
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
126
+ // Show policy
127
+ if (argv.includes("--policy") && !argv.includes("--set-policy")) {
128
+ const policy = loadPolicy();
129
+ if (format === "json") {
130
+ console.log(JSON.stringify(policy, null, 2));
131
+ }
132
+ else {
133
+ console.log(`\n PR Quality Gate Policy\n ──────────────────────────`);
134
+ console.log(` Max critical: ${policy.maxCritical}`);
135
+ console.log(` Max high: ${policy.maxHigh}`);
136
+ console.log(` Max total: ${policy.maxTotal}`);
137
+ console.log(` Auto-approve >= ${policy.autoApproveBelow} score`);
138
+ console.log(` Require tests: ${policy.requireTestCoverage}`);
139
+ console.log("");
140
+ }
141
+ return;
142
+ }
143
+ // Set policy
144
+ if (argv.includes("--set-policy")) {
145
+ const policy = loadPolicy();
146
+ const mc = argv.find((_a, i) => argv[i - 1] === "--max-critical");
147
+ const mh = argv.find((_a, i) => argv[i - 1] === "--max-high");
148
+ const mt = argv.find((_a, i) => argv[i - 1] === "--max-total");
149
+ const aa = argv.find((_a, i) => argv[i - 1] === "--auto-approve");
150
+ if (mc)
151
+ policy.maxCritical = parseInt(mc, 10);
152
+ if (mh)
153
+ policy.maxHigh = parseInt(mh, 10);
154
+ if (mt)
155
+ policy.maxTotal = parseInt(mt, 10);
156
+ if (aa)
157
+ policy.autoApproveBelow = parseInt(aa, 10);
158
+ savePolicy(policy);
159
+ console.log(` ✅ Policy updated`);
160
+ return;
161
+ }
162
+ // History
163
+ if (argv.includes("--history")) {
164
+ const history = loadHistory();
165
+ if (format === "json") {
166
+ console.log(JSON.stringify(history, null, 2));
167
+ }
168
+ else {
169
+ const passRate = history.results.length > 0
170
+ ? Math.round((history.results.filter((r) => r.passed).length / history.results.length) * 100)
171
+ : 0;
172
+ console.log(`\n Gate History (${history.results.length} checks, ${passRate}% pass rate)\n ──────────────────────────`);
173
+ for (const r of history.results.slice(-15)) {
174
+ const icon = r.passed ? "✅" : "❌";
175
+ console.log(` ${icon} ${r.timestamp.slice(0, 16)} score:${r.score} C:${r.critical} H:${r.high} — ${r.reason}`);
176
+ }
177
+ console.log("");
178
+ }
179
+ return;
180
+ }
181
+ // Check
182
+ if (argv.includes("--check")) {
183
+ const critical = parseInt(argv.find((_a, i) => argv[i - 1] === "--critical") || "0", 10);
184
+ const high = parseInt(argv.find((_a, i) => argv[i - 1] === "--high") || "0", 10);
185
+ const medium = parseInt(argv.find((_a, i) => argv[i - 1] === "--medium") || "0", 10);
186
+ const low = parseInt(argv.find((_a, i) => argv[i - 1] === "--low") || "0", 10);
187
+ const score = parseInt(argv.find((_a, i) => argv[i - 1] === "--score") || "100", 10);
188
+ const result = evaluateGate(critical, high, medium, low, score);
189
+ if (format === "json") {
190
+ console.log(JSON.stringify(result, null, 2));
191
+ }
192
+ else {
193
+ const icon = result.passed ? "✅ PASSED" : "❌ FAILED";
194
+ console.log(`\n PR Quality Gate: ${icon}`);
195
+ console.log(` ──────────────────────────`);
196
+ console.log(` Score: ${result.score}/100`);
197
+ console.log(` Findings: C:${result.critical} H:${result.high} M:${result.medium} L:${result.low} (total: ${result.total})`);
198
+ console.log(` Reason: ${result.reason}`);
199
+ console.log("");
200
+ }
201
+ if (!result.passed) {
202
+ process.exitCode = 1;
203
+ }
204
+ return;
205
+ }
206
+ console.error(" Use --check, --policy, --set-policy, or --history. --help for usage.");
207
+ }
208
+ //# sourceMappingURL=pr-quality-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-quality-gate.js","sourceRoot":"","sources":["../../src/commands/pr-quality-gate.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"}