@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.
- package/CHANGELOG.md +24 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +112 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/audit-bundle.d.ts +29 -0
- package/dist/commands/audit-bundle.d.ts.map +1 -0
- package/dist/commands/audit-bundle.js +235 -0
- package/dist/commands/audit-bundle.js.map +1 -0
- package/dist/commands/compare-runs.d.ts +38 -0
- package/dist/commands/compare-runs.d.ts.map +1 -0
- package/dist/commands/compare-runs.js +229 -0
- package/dist/commands/compare-runs.js.map +1 -0
- package/dist/commands/config-drift.d.ts +25 -0
- package/dist/commands/config-drift.d.ts.map +1 -0
- package/dist/commands/config-drift.js +214 -0
- package/dist/commands/config-drift.js.map +1 -0
- package/dist/commands/correlate.d.ts +28 -0
- package/dist/commands/correlate.d.ts.map +1 -0
- package/dist/commands/correlate.js +242 -0
- package/dist/commands/correlate.js.map +1 -0
- package/dist/commands/dev-score.d.ts +37 -0
- package/dist/commands/dev-score.d.ts.map +1 -0
- package/dist/commands/dev-score.js +204 -0
- package/dist/commands/dev-score.js.map +1 -0
- package/dist/commands/digest.d.ts +20 -0
- package/dist/commands/digest.d.ts.map +1 -0
- package/dist/commands/digest.js +222 -0
- package/dist/commands/digest.js.map +1 -0
- package/dist/commands/explain-finding.d.ts +8 -0
- package/dist/commands/explain-finding.d.ts.map +1 -0
- package/dist/commands/explain-finding.js +279 -0
- package/dist/commands/explain-finding.js.map +1 -0
- package/dist/commands/generate.d.ts +8 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +404 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/judge-reputation.d.ts +29 -0
- package/dist/commands/judge-reputation.d.ts.map +1 -0
- package/dist/commands/judge-reputation.js +199 -0
- package/dist/commands/judge-reputation.js.map +1 -0
- package/dist/commands/learn.d.ts +27 -0
- package/dist/commands/learn.d.ts.map +1 -0
- package/dist/commands/learn.js +289 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/model-risk.d.ts +28 -0
- package/dist/commands/model-risk.d.ts.map +1 -0
- package/dist/commands/model-risk.js +221 -0
- package/dist/commands/model-risk.js.map +1 -0
- package/dist/commands/query.d.ts +20 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +230 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/reg-watch.d.ts +21 -0
- package/dist/commands/reg-watch.d.ts.map +1 -0
- package/dist/commands/reg-watch.js +220 -0
- package/dist/commands/reg-watch.js.map +1 -0
- package/dist/commands/retro.d.ts +23 -0
- package/dist/commands/retro.d.ts.map +1 -0
- package/dist/commands/retro.js +217 -0
- package/dist/commands/retro.js.map +1 -0
- package/dist/commands/rule-share.d.ts +35 -0
- package/dist/commands/rule-share.d.ts.map +1 -0
- package/dist/commands/rule-share.js +203 -0
- package/dist/commands/rule-share.js.map +1 -0
- package/dist/commands/vote.d.ts +32 -0
- package/dist/commands/vote.d.ts.map +1 -0
- package/dist/commands/vote.js +201 -0
- package/dist/commands/vote.js.map +1 -0
- package/package.json +1 -1
- 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"}
|