@kevinrabun/judges 3.40.0 → 3.42.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 +39 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +133 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto-calibrate.d.ts +15 -0
- package/dist/commands/auto-calibrate.d.ts.map +1 -0
- package/dist/commands/auto-calibrate.js +107 -0
- package/dist/commands/auto-calibrate.js.map +1 -0
- package/dist/commands/auto-triage.d.ts +32 -0
- package/dist/commands/auto-triage.d.ts.map +1 -0
- package/dist/commands/auto-triage.js +126 -0
- package/dist/commands/auto-triage.js.map +1 -0
- package/dist/commands/config-migrate.d.ts +44 -0
- package/dist/commands/config-migrate.d.ts.map +1 -0
- package/dist/commands/config-migrate.js +241 -0
- package/dist/commands/config-migrate.js.map +1 -0
- package/dist/commands/coverage-map.d.ts +23 -0
- package/dist/commands/coverage-map.d.ts.map +1 -0
- package/dist/commands/coverage-map.js +223 -0
- package/dist/commands/coverage-map.js.map +1 -0
- package/dist/commands/dedup-report.d.ts +13 -0
- package/dist/commands/dedup-report.d.ts.map +1 -0
- package/dist/commands/dedup-report.js +138 -0
- package/dist/commands/dedup-report.js.map +1 -0
- package/dist/commands/dep-audit.d.ts +53 -0
- package/dist/commands/dep-audit.d.ts.map +1 -0
- package/dist/commands/dep-audit.js +278 -0
- package/dist/commands/dep-audit.js.map +1 -0
- package/dist/commands/deprecated.d.ts +48 -0
- package/dist/commands/deprecated.d.ts.map +1 -0
- package/dist/commands/deprecated.js +202 -0
- package/dist/commands/deprecated.js.map +1 -0
- package/dist/commands/diff-only.d.ts +34 -0
- package/dist/commands/diff-only.d.ts.map +1 -0
- package/dist/commands/diff-only.js +152 -0
- package/dist/commands/diff-only.js.map +1 -0
- package/dist/commands/fix-pr.d.ts +23 -0
- package/dist/commands/fix-pr.d.ts.map +1 -0
- package/dist/commands/fix-pr.js +323 -0
- package/dist/commands/fix-pr.js.map +1 -0
- package/dist/commands/group-findings.d.ts +23 -0
- package/dist/commands/group-findings.d.ts.map +1 -0
- package/dist/commands/group-findings.js +155 -0
- package/dist/commands/group-findings.js.map +1 -0
- package/dist/commands/interactive-fix.d.ts +23 -0
- package/dist/commands/interactive-fix.d.ts.map +1 -0
- package/dist/commands/interactive-fix.js +140 -0
- package/dist/commands/interactive-fix.js.map +1 -0
- package/dist/commands/monorepo.d.ts +38 -0
- package/dist/commands/monorepo.d.ts.map +1 -0
- package/dist/commands/monorepo.js +233 -0
- package/dist/commands/monorepo.js.map +1 -0
- package/dist/commands/notify.d.ts +79 -0
- package/dist/commands/notify.d.ts.map +1 -0
- package/dist/commands/notify.js +325 -0
- package/dist/commands/notify.js.map +1 -0
- package/dist/commands/pr-summary.d.ts +26 -0
- package/dist/commands/pr-summary.d.ts.map +1 -0
- package/dist/commands/pr-summary.js +188 -0
- package/dist/commands/pr-summary.js.map +1 -0
- package/dist/commands/profile.d.ts +38 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +102 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/quality-gate.d.ts +70 -0
- package/dist/commands/quality-gate.d.ts.map +1 -0
- package/dist/commands/quality-gate.js +264 -0
- package/dist/commands/quality-gate.js.map +1 -0
- package/dist/commands/smart-select.d.ts +27 -0
- package/dist/commands/smart-select.d.ts.map +1 -0
- package/dist/commands/smart-select.js +346 -0
- package/dist/commands/smart-select.js.map +1 -0
- package/dist/commands/upload.d.ts +14 -0
- package/dist/commands/upload.d.ts.map +1 -0
- package/dist/commands/upload.js +173 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/commands/validate-config.d.ts +17 -0
- package/dist/commands/validate-config.d.ts.map +1 -0
- package/dist/commands/validate-config.js +268 -0
- package/dist/commands/validate-config.js.map +1 -0
- package/dist/commands/warm-cache.d.ts +31 -0
- package/dist/commands/warm-cache.d.ts.map +1 -0
- package/dist/commands/warm-cache.js +166 -0
- package/dist/commands/warm-cache.js.map +1 -0
- package/dist/evaluators/framework-rules.d.ts +59 -0
- package/dist/evaluators/framework-rules.d.ts.map +1 -0
- package/dist/evaluators/framework-rules.js +292 -0
- package/dist/evaluators/framework-rules.js.map +1 -0
- package/dist/parallel.d.ts +53 -0
- package/dist/parallel.d.ts.map +1 -0
- package/dist/parallel.js +170 -0
- package/dist/parallel.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule coverage map — show which rules apply to which languages,
|
|
3
|
+
* helping teams understand their coverage and identify gaps.
|
|
4
|
+
*/
|
|
5
|
+
// ─── Rules-to-Language Mapping ──────────────────────────────────────────────
|
|
6
|
+
/**
|
|
7
|
+
* Universal rules applicable to all programming languages.
|
|
8
|
+
*/
|
|
9
|
+
const UNIVERSAL_RULES = [
|
|
10
|
+
{ pattern: "SEC-", judge: "cybersecurity", severity: "high" },
|
|
11
|
+
{ pattern: "ERR-", judge: "error-handling", severity: "medium" },
|
|
12
|
+
{ pattern: "MAINT-", judge: "maintainability", severity: "low" },
|
|
13
|
+
{ pattern: "DOC-", judge: "documentation", severity: "low" },
|
|
14
|
+
{ pattern: "STRUCT-", judge: "code-structure", severity: "medium" },
|
|
15
|
+
{ pattern: "TEST-", judge: "testing", severity: "medium" },
|
|
16
|
+
{ pattern: "LOG-", judge: "logging-privacy", severity: "medium" },
|
|
17
|
+
{ pattern: "AI-", judge: "ai-code-safety", severity: "high" },
|
|
18
|
+
];
|
|
19
|
+
/**
|
|
20
|
+
* Language-specific rules with limited applicability.
|
|
21
|
+
*/
|
|
22
|
+
const LANGUAGE_RULES = [
|
|
23
|
+
{
|
|
24
|
+
pattern: "INJECT-SQL",
|
|
25
|
+
judge: "cybersecurity",
|
|
26
|
+
severity: "critical",
|
|
27
|
+
languages: ["typescript", "javascript", "python", "java", "csharp", "php", "ruby", "go"],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
pattern: "INJECT-CMD",
|
|
31
|
+
judge: "cybersecurity",
|
|
32
|
+
severity: "critical",
|
|
33
|
+
languages: ["typescript", "javascript", "python", "java", "csharp", "php", "ruby", "go", "rust"],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
pattern: "XSS-",
|
|
37
|
+
judge: "cybersecurity",
|
|
38
|
+
severity: "high",
|
|
39
|
+
languages: ["typescript", "javascript", "python", "java", "csharp", "php", "ruby"],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
pattern: "SSRF-",
|
|
43
|
+
judge: "cybersecurity",
|
|
44
|
+
severity: "high",
|
|
45
|
+
languages: ["typescript", "javascript", "python", "java", "csharp", "go", "ruby"],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
pattern: "CRYPTO-",
|
|
49
|
+
judge: "cybersecurity",
|
|
50
|
+
severity: "high",
|
|
51
|
+
languages: ["typescript", "javascript", "python", "java", "csharp", "go", "rust", "c", "cpp"],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
pattern: "AUTH-",
|
|
55
|
+
judge: "authentication",
|
|
56
|
+
severity: "high",
|
|
57
|
+
languages: ["typescript", "javascript", "python", "java", "csharp", "go", "ruby", "php"],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
pattern: "PERF-",
|
|
61
|
+
judge: "performance",
|
|
62
|
+
severity: "medium",
|
|
63
|
+
languages: ["typescript", "javascript", "python", "java", "csharp", "go", "rust", "c", "cpp"],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
pattern: "DB-",
|
|
67
|
+
judge: "database",
|
|
68
|
+
severity: "medium",
|
|
69
|
+
languages: ["typescript", "javascript", "python", "java", "csharp", "go", "ruby", "sql"],
|
|
70
|
+
},
|
|
71
|
+
{ pattern: "IAC-", judge: "iac-security", severity: "high", languages: ["terraform", "bicep", "yaml", "dockerfile"] },
|
|
72
|
+
{ pattern: "CICD-", judge: "ci-cd", severity: "high", languages: ["yaml", "dockerfile", "bash", "powershell"] },
|
|
73
|
+
{
|
|
74
|
+
pattern: "CONCUR-",
|
|
75
|
+
judge: "concurrency",
|
|
76
|
+
severity: "high",
|
|
77
|
+
languages: ["go", "rust", "java", "csharp", "python", "c", "cpp"],
|
|
78
|
+
},
|
|
79
|
+
{ pattern: "A11Y-", judge: "accessibility", severity: "medium", languages: ["typescript", "javascript", "html"] },
|
|
80
|
+
{
|
|
81
|
+
pattern: "I18N-",
|
|
82
|
+
judge: "internationalization",
|
|
83
|
+
severity: "low",
|
|
84
|
+
languages: ["typescript", "javascript", "python", "java", "csharp"],
|
|
85
|
+
},
|
|
86
|
+
{ pattern: "FW-REACT", judge: "framework-safety", severity: "high", languages: ["typescript", "javascript"] },
|
|
87
|
+
{ pattern: "FW-EXPRESS", judge: "framework-safety", severity: "high", languages: ["typescript", "javascript"] },
|
|
88
|
+
{ pattern: "FW-DJANGO", judge: "framework-safety", severity: "high", languages: ["python"] },
|
|
89
|
+
{ pattern: "FW-FLASK", judge: "framework-safety", severity: "high", languages: ["python"] },
|
|
90
|
+
{ pattern: "FW-SPRING", judge: "framework-safety", severity: "high", languages: ["java", "kotlin"] },
|
|
91
|
+
{ pattern: "FW-RAILS", judge: "framework-safety", severity: "high", languages: ["ruby"] },
|
|
92
|
+
{ pattern: "FW-NEXT", judge: "framework-safety", severity: "high", languages: ["typescript", "javascript"] },
|
|
93
|
+
{ pattern: "FW-FASTAPI", judge: "framework-safety", severity: "high", languages: ["python"] },
|
|
94
|
+
];
|
|
95
|
+
const ALL_LANGUAGES = [
|
|
96
|
+
"typescript",
|
|
97
|
+
"javascript",
|
|
98
|
+
"python",
|
|
99
|
+
"java",
|
|
100
|
+
"csharp",
|
|
101
|
+
"go",
|
|
102
|
+
"rust",
|
|
103
|
+
"ruby",
|
|
104
|
+
"php",
|
|
105
|
+
"c",
|
|
106
|
+
"cpp",
|
|
107
|
+
"kotlin",
|
|
108
|
+
"scala",
|
|
109
|
+
"swift",
|
|
110
|
+
"dart",
|
|
111
|
+
"bash",
|
|
112
|
+
"powershell",
|
|
113
|
+
"sql",
|
|
114
|
+
"terraform",
|
|
115
|
+
"bicep",
|
|
116
|
+
"yaml",
|
|
117
|
+
"dockerfile",
|
|
118
|
+
"html",
|
|
119
|
+
];
|
|
120
|
+
// ─── Coverage Computation ───────────────────────────────────────────────────
|
|
121
|
+
export function buildCoverageMap(languages) {
|
|
122
|
+
const langs = languages || ALL_LANGUAGES;
|
|
123
|
+
const rules = [];
|
|
124
|
+
const matrix = {};
|
|
125
|
+
// Universal rules
|
|
126
|
+
for (const r of UNIVERSAL_RULES) {
|
|
127
|
+
const coverage = {
|
|
128
|
+
ruleId: r.pattern.replace(/-$/, ""),
|
|
129
|
+
languages: [...langs],
|
|
130
|
+
severity: r.severity,
|
|
131
|
+
judge: r.judge,
|
|
132
|
+
};
|
|
133
|
+
rules.push(coverage);
|
|
134
|
+
matrix[coverage.ruleId] = {};
|
|
135
|
+
for (const l of langs)
|
|
136
|
+
matrix[coverage.ruleId][l] = true;
|
|
137
|
+
}
|
|
138
|
+
// Language-specific rules
|
|
139
|
+
for (const r of LANGUAGE_RULES) {
|
|
140
|
+
const applicableLangs = r.languages.filter((l) => langs.includes(l));
|
|
141
|
+
const coverage = {
|
|
142
|
+
ruleId: r.pattern.replace(/-$/, ""),
|
|
143
|
+
languages: applicableLangs,
|
|
144
|
+
severity: r.severity,
|
|
145
|
+
judge: r.judge,
|
|
146
|
+
};
|
|
147
|
+
rules.push(coverage);
|
|
148
|
+
matrix[coverage.ruleId] = {};
|
|
149
|
+
for (const l of langs)
|
|
150
|
+
matrix[coverage.ruleId][l] = applicableLangs.includes(l);
|
|
151
|
+
}
|
|
152
|
+
// Statistics
|
|
153
|
+
const byLanguage = {};
|
|
154
|
+
const byJudge = {};
|
|
155
|
+
for (const r of rules) {
|
|
156
|
+
byJudge[r.judge] = (byJudge[r.judge] || 0) + 1;
|
|
157
|
+
for (const l of r.languages) {
|
|
158
|
+
byLanguage[l] = (byLanguage[l] || 0) + 1;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
languages: langs,
|
|
163
|
+
rules,
|
|
164
|
+
matrix,
|
|
165
|
+
stats: { totalRules: rules.length, byLanguage, byJudge },
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
169
|
+
export function runCoverageMap(argv) {
|
|
170
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
171
|
+
console.log(`
|
|
172
|
+
judges coverage-map — Show which rules apply to which languages
|
|
173
|
+
|
|
174
|
+
Usage:
|
|
175
|
+
judges coverage-map Full coverage matrix
|
|
176
|
+
judges coverage-map --languages typescript,python Focus on specific languages
|
|
177
|
+
judges coverage-map --judge cybersecurity Filter by judge
|
|
178
|
+
|
|
179
|
+
Options:
|
|
180
|
+
--languages <list> Comma-separated languages to show
|
|
181
|
+
--judge <id> Filter rules by judge
|
|
182
|
+
--format json JSON output
|
|
183
|
+
--help, -h Show this help
|
|
184
|
+
`);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const langsArg = argv.find((_a, i) => argv[i - 1] === "--languages");
|
|
188
|
+
const judgeFilter = argv.find((_a, i) => argv[i - 1] === "--judge");
|
|
189
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
190
|
+
const languages = langsArg ? langsArg.split(",").map((s) => s.trim()) : undefined;
|
|
191
|
+
const map = buildCoverageMap(languages);
|
|
192
|
+
let rules = map.rules;
|
|
193
|
+
if (judgeFilter) {
|
|
194
|
+
rules = rules.filter((r) => r.judge === judgeFilter);
|
|
195
|
+
}
|
|
196
|
+
if (format === "json") {
|
|
197
|
+
console.log(JSON.stringify({ ...map, rules }, null, 2));
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
console.log(`\n Rule Coverage Map\n`);
|
|
201
|
+
console.log(` Total rules: ${rules.length} | Languages: ${map.languages.length}\n`);
|
|
202
|
+
// Show compact matrix
|
|
203
|
+
const displayLangs = map.languages.slice(0, 12); // limit width
|
|
204
|
+
const header = " " + "Rule".padEnd(20) + displayLangs.map((l) => l.slice(0, 4).padEnd(5)).join("");
|
|
205
|
+
console.log(header);
|
|
206
|
+
console.log(" " + "─".repeat(header.length - 2));
|
|
207
|
+
for (const r of rules) {
|
|
208
|
+
const row = displayLangs.map((l) => (r.languages.includes(l) ? " ✓ " : " · ")).join("");
|
|
209
|
+
console.log(` ${r.ruleId.padEnd(20)}${row}`);
|
|
210
|
+
}
|
|
211
|
+
console.log(`\n Coverage by language:`);
|
|
212
|
+
const sorted = Object.entries(map.stats.byLanguage).sort((a, b) => b[1] - a[1]);
|
|
213
|
+
for (const [lang, count] of sorted) {
|
|
214
|
+
const pct = ((count / rules.length) * 100).toFixed(0);
|
|
215
|
+
console.log(` ${lang.padEnd(15)} ${String(count).padStart(3)} rules (${pct}%)`);
|
|
216
|
+
}
|
|
217
|
+
console.log(`\n Coverage by judge:`);
|
|
218
|
+
for (const [judge, count] of Object.entries(map.stats.byJudge).sort((a, b) => b[1] - a[1])) {
|
|
219
|
+
console.log(` ${judge.padEnd(25)} ${count} rules`);
|
|
220
|
+
}
|
|
221
|
+
console.log("");
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=coverage-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-map.js","sourceRoot":"","sources":["../../src/commands/coverage-map.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges dedup-report` — Cross-run finding deduplication report.
|
|
3
|
+
*
|
|
4
|
+
* Shows which findings are new vs recurring vs fixed across runs.
|
|
5
|
+
* Built on the existing finding-lifecycle tracking infrastructure.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* judges dedup-report # Show finding delta report
|
|
9
|
+
* judges dedup-report --format json # JSON output
|
|
10
|
+
* judges dedup-report --stats # Summary statistics only
|
|
11
|
+
*/
|
|
12
|
+
export declare function runDedupReport(argv: string[]): void;
|
|
13
|
+
//# sourceMappingURL=dedup-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup-report.d.ts","sourceRoot":"","sources":["../../src/commands/dedup-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0HnD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges dedup-report` — Cross-run finding deduplication report.
|
|
3
|
+
*
|
|
4
|
+
* Shows which findings are new vs recurring vs fixed across runs.
|
|
5
|
+
* Built on the existing finding-lifecycle tracking infrastructure.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* judges dedup-report # Show finding delta report
|
|
9
|
+
* judges dedup-report --format json # JSON output
|
|
10
|
+
* judges dedup-report --stats # Summary statistics only
|
|
11
|
+
*/
|
|
12
|
+
import { loadFindingStore, getFindingStats } from "../finding-lifecycle.js";
|
|
13
|
+
import { resolve } from "path";
|
|
14
|
+
// ─── CLI Runner ─────────────────────────────────────────────────────────────
|
|
15
|
+
export function runDedupReport(argv) {
|
|
16
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
17
|
+
console.log(`
|
|
18
|
+
judges dedup-report — Cross-run finding deduplication report
|
|
19
|
+
|
|
20
|
+
Usage:
|
|
21
|
+
judges dedup-report [dir] Show finding delta report
|
|
22
|
+
judges dedup-report --stats Summary statistics only
|
|
23
|
+
judges dedup-report --recurring Show only recurring findings
|
|
24
|
+
judges dedup-report --new Show only new findings since last run
|
|
25
|
+
judges dedup-report --fixed Show recently fixed findings
|
|
26
|
+
judges dedup-report --format json JSON output
|
|
27
|
+
|
|
28
|
+
Reads .judges-findings.json from the project directory to show:
|
|
29
|
+
• New findings introduced since last run
|
|
30
|
+
• Recurring findings (persistent across runs)
|
|
31
|
+
• Fixed findings (no longer detected)
|
|
32
|
+
• Trend analysis (improving / stable / degrading)
|
|
33
|
+
|
|
34
|
+
Options:
|
|
35
|
+
--dir <path> Project directory (default: current)
|
|
36
|
+
--stats Show summary statistics only
|
|
37
|
+
--recurring Filter to recurring findings
|
|
38
|
+
--new Filter to newly introduced findings
|
|
39
|
+
--fixed Filter to fixed findings
|
|
40
|
+
--format <fmt> Output format: text, json
|
|
41
|
+
--help, -h Show this help
|
|
42
|
+
`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const dir = resolve(argv.find((_a, i) => argv[i - 1] === "--dir") ||
|
|
46
|
+
argv.find((a, i) => i > 1 && !a.startsWith("-") && argv[i - 1] !== "--format" && argv[i - 1] !== "--dir") ||
|
|
47
|
+
".");
|
|
48
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
49
|
+
const statsOnly = argv.includes("--stats");
|
|
50
|
+
const showRecurring = argv.includes("--recurring");
|
|
51
|
+
const showNew = argv.includes("--new");
|
|
52
|
+
const showFixed = argv.includes("--fixed");
|
|
53
|
+
const store = loadFindingStore(dir);
|
|
54
|
+
if (store.findings.length === 0) {
|
|
55
|
+
console.log("\n No finding history found. Run 'judges eval' first to build the finding store.\n");
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const stats = getFindingStats(store);
|
|
59
|
+
if (format === "json") {
|
|
60
|
+
const data = { stats, runNumber: store.runNumber, lastRunAt: store.lastRunAt };
|
|
61
|
+
if (!statsOnly) {
|
|
62
|
+
const openFindings = store.findings.filter((f) => f.status === "open");
|
|
63
|
+
const fixedFindings = store.findings.filter((f) => f.status === "fixed");
|
|
64
|
+
const newFindings = openFindings.filter((f) => f.runCount === 1);
|
|
65
|
+
const recurringFindings = openFindings.filter((f) => f.runCount > 1);
|
|
66
|
+
if (showNew)
|
|
67
|
+
data.findings = newFindings;
|
|
68
|
+
else if (showRecurring)
|
|
69
|
+
data.findings = recurringFindings;
|
|
70
|
+
else if (showFixed)
|
|
71
|
+
data.findings = fixedFindings;
|
|
72
|
+
else
|
|
73
|
+
data.findings = { new: newFindings, recurring: recurringFindings, fixed: fixedFindings };
|
|
74
|
+
}
|
|
75
|
+
console.log(JSON.stringify(data, null, 2));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Text output
|
|
79
|
+
console.log(`\n Finding Deduplication Report — Run #${store.runNumber} (${store.lastRunAt})\n`);
|
|
80
|
+
// Stats
|
|
81
|
+
console.log(` Total tracked: ${stats.totalOpen + stats.totalFixed}`);
|
|
82
|
+
console.log(` Open: ${stats.totalOpen}`);
|
|
83
|
+
console.log(` Fixed: ${stats.totalFixed}`);
|
|
84
|
+
console.log(` Triaged: ${stats.totalTriaged}`);
|
|
85
|
+
console.log(` Avg age (days): ${Math.round(stats.avgAge)}`);
|
|
86
|
+
console.log("");
|
|
87
|
+
// Severity breakdown
|
|
88
|
+
console.log(" By severity:");
|
|
89
|
+
for (const [sev, count] of Object.entries(stats.bySeverity)) {
|
|
90
|
+
if (count > 0) {
|
|
91
|
+
console.log(` ${sev.toUpperCase().padEnd(10)} ${count}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
console.log("");
|
|
95
|
+
if (statsOnly)
|
|
96
|
+
return;
|
|
97
|
+
const openFindings = store.findings.filter((f) => f.status === "open");
|
|
98
|
+
const fixedFindings = store.findings.filter((f) => f.status === "fixed");
|
|
99
|
+
const newFindings = openFindings.filter((f) => f.runCount === 1);
|
|
100
|
+
const recurringFindings = openFindings.filter((f) => f.runCount > 1);
|
|
101
|
+
// New findings
|
|
102
|
+
if (!showRecurring && !showFixed && newFindings.length > 0) {
|
|
103
|
+
console.log(` ─── New Findings (${newFindings.length}) ───\n`);
|
|
104
|
+
printFindings(newFindings);
|
|
105
|
+
}
|
|
106
|
+
// Recurring
|
|
107
|
+
if (!showNew && !showFixed && recurringFindings.length > 0) {
|
|
108
|
+
console.log(` ─── Recurring Findings (${recurringFindings.length}) ───\n`);
|
|
109
|
+
printFindings(recurringFindings, true);
|
|
110
|
+
}
|
|
111
|
+
// Fixed
|
|
112
|
+
if (!showNew && !showRecurring && fixedFindings.length > 0) {
|
|
113
|
+
const recentFixed = fixedFindings.filter((f) => {
|
|
114
|
+
if (!f.fixedAt)
|
|
115
|
+
return false;
|
|
116
|
+
const fixedDate = new Date(f.fixedAt);
|
|
117
|
+
const weekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
|
|
118
|
+
return fixedDate >= weekAgo;
|
|
119
|
+
});
|
|
120
|
+
if (recentFixed.length > 0) {
|
|
121
|
+
console.log(` ─── Recently Fixed (${recentFixed.length}) ───\n`);
|
|
122
|
+
printFindings(recentFixed);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
console.log("");
|
|
126
|
+
}
|
|
127
|
+
function printFindings(findings, showRunCount = false) {
|
|
128
|
+
for (const f of findings.slice(0, 20)) {
|
|
129
|
+
const runInfo = showRunCount ? ` (${f.runCount} runs)` : "";
|
|
130
|
+
console.log(` • [${f.severity.toUpperCase()}] ${f.ruleId}: ${f.title}${runInfo}`);
|
|
131
|
+
console.log(` ${f.filePath}`);
|
|
132
|
+
}
|
|
133
|
+
if (findings.length > 20) {
|
|
134
|
+
console.log(` ... and ${findings.length - 20} more`);
|
|
135
|
+
}
|
|
136
|
+
console.log("");
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=dedup-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup-report.js","sourceRoot":"","sources":["../../src/commands/dedup-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges dep-audit` — Dependency vulnerability correlation.
|
|
3
|
+
*
|
|
4
|
+
* Correlates code-level findings with known vulnerabilities in project
|
|
5
|
+
* dependencies. Uses npm audit / pip audit output to enrich findings
|
|
6
|
+
* with CVE data, adding urgency context to code review.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* judges dep-audit # Audit current directory
|
|
10
|
+
* judges dep-audit --format json # JSON output
|
|
11
|
+
* judges dep-audit --correlate results.json # Correlate with findings
|
|
12
|
+
*/
|
|
13
|
+
import type { Finding, Severity } from "../types.js";
|
|
14
|
+
export interface VulnerablePackage {
|
|
15
|
+
/** Package name */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Installed version */
|
|
18
|
+
version: string;
|
|
19
|
+
/** Vulnerability severity */
|
|
20
|
+
severity: Severity;
|
|
21
|
+
/** CVE identifier(s) */
|
|
22
|
+
cves: string[];
|
|
23
|
+
/** CWE identifier(s) */
|
|
24
|
+
cwes: string[];
|
|
25
|
+
/** Advisory title */
|
|
26
|
+
title: string;
|
|
27
|
+
/** URL for more information */
|
|
28
|
+
url?: string;
|
|
29
|
+
/** Fixed version (if known) */
|
|
30
|
+
fixedIn?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface DepAuditResult {
|
|
33
|
+
/** Detected package manager */
|
|
34
|
+
packageManager: "npm" | "pip" | "unknown";
|
|
35
|
+
/** Vulnerable packages found */
|
|
36
|
+
vulnerabilities: VulnerablePackage[];
|
|
37
|
+
/** Total vulnerability count */
|
|
38
|
+
totalVulnerabilities: number;
|
|
39
|
+
/** Counts by severity */
|
|
40
|
+
severityCounts: Record<Severity, number>;
|
|
41
|
+
/** Correlations with code findings */
|
|
42
|
+
correlations: Array<{
|
|
43
|
+
vulnerability: VulnerablePackage;
|
|
44
|
+
relatedFindings: Array<{
|
|
45
|
+
ruleId: string;
|
|
46
|
+
title: string;
|
|
47
|
+
reason: string;
|
|
48
|
+
}>;
|
|
49
|
+
}>;
|
|
50
|
+
}
|
|
51
|
+
export declare function runDepAudit(dir: string, findings?: Finding[]): DepAuditResult;
|
|
52
|
+
export declare function runDepAuditCommand(argv: string[]): void;
|
|
53
|
+
//# sourceMappingURL=dep-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dep-audit.d.ts","sourceRoot":"","sources":["../../src/commands/dep-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIrD,MAAM,WAAW,iBAAiB;IAChC,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,wBAAwB;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,wBAAwB;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,cAAc,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;IAC1C,gCAAgC;IAChC,eAAe,EAAE,iBAAiB,EAAE,CAAC;IACrC,gCAAgC;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,yBAAyB;IACzB,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzC,sCAAsC;IACtC,YAAY,EAAE,KAAK,CAAC;QAClB,aAAa,EAAE,iBAAiB,CAAC;QACjC,eAAe,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC3E,CAAC,CAAC;CACJ;AA0KD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,cAAc,CA+B7E;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgGvD"}
|