@kevinrabun/judges 3.106.0 → 3.107.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 +13 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +63 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/finding-auto-fix-suggest.d.ts +2 -0
- package/dist/commands/finding-auto-fix-suggest.d.ts.map +1 -0
- package/dist/commands/finding-auto-fix-suggest.js +77 -0
- package/dist/commands/finding-auto-fix-suggest.js.map +1 -0
- package/dist/commands/finding-batch-triage.d.ts +2 -0
- package/dist/commands/finding-batch-triage.d.ts.map +1 -0
- package/dist/commands/finding-batch-triage.js +91 -0
- package/dist/commands/finding-batch-triage.js.map +1 -0
- package/dist/commands/finding-confidence-boost.d.ts +2 -0
- package/dist/commands/finding-confidence-boost.d.ts.map +1 -0
- package/dist/commands/finding-confidence-boost.js +89 -0
- package/dist/commands/finding-confidence-boost.js.map +1 -0
- package/dist/commands/finding-noise-reduce.d.ts +2 -0
- package/dist/commands/finding-noise-reduce.d.ts.map +1 -0
- package/dist/commands/finding-noise-reduce.js +82 -0
- package/dist/commands/finding-noise-reduce.js.map +1 -0
- package/dist/commands/finding-scope-filter.d.ts +2 -0
- package/dist/commands/finding-scope-filter.d.ts.map +1 -0
- package/dist/commands/finding-scope-filter.js +78 -0
- package/dist/commands/finding-scope-filter.js.map +1 -0
- package/dist/commands/review-code-ownership.d.ts +2 -0
- package/dist/commands/review-code-ownership.d.ts.map +1 -0
- package/dist/commands/review-code-ownership.js +89 -0
- package/dist/commands/review-code-ownership.js.map +1 -0
- package/dist/commands/review-pr-label-suggest.d.ts +2 -0
- package/dist/commands/review-pr-label-suggest.d.ts.map +1 -0
- package/dist/commands/review-pr-label-suggest.js +78 -0
- package/dist/commands/review-pr-label-suggest.js.map +1 -0
- package/dist/commands/review-release-gate.d.ts +2 -0
- package/dist/commands/review-release-gate.d.ts.map +1 -0
- package/dist/commands/review-release-gate.js +82 -0
- package/dist/commands/review-release-gate.js.map +1 -0
- package/dist/commands/review-review-cadence.d.ts +2 -0
- package/dist/commands/review-review-cadence.d.ts.map +1 -0
- package/dist/commands/review-review-cadence.js +86 -0
- package/dist/commands/review-review-cadence.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-auto-fix-suggest.d.ts","sourceRoot":"","sources":["../../src/commands/finding-auto-fix-suggest.ts"],"names":[],"mappings":"AAsDA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiD7D"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
function suggestFixes(findings) {
|
|
4
|
+
const suggestions = [];
|
|
5
|
+
for (const f of findings) {
|
|
6
|
+
const hasPatch = f.patch !== undefined && f.patch !== null;
|
|
7
|
+
let effort;
|
|
8
|
+
if (hasPatch) {
|
|
9
|
+
effort = "Auto-fixable";
|
|
10
|
+
}
|
|
11
|
+
else if (f.severity === "info" || f.severity === "low") {
|
|
12
|
+
effort = "Quick fix";
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
effort = "Manual review needed";
|
|
16
|
+
}
|
|
17
|
+
const suggestion = hasPatch ? `Apply patch: ${String(f.patch).slice(0, 80)}` : f.recommendation;
|
|
18
|
+
suggestions.push({
|
|
19
|
+
ruleId: f.ruleId,
|
|
20
|
+
title: f.title,
|
|
21
|
+
severity: f.severity,
|
|
22
|
+
hasPatch,
|
|
23
|
+
suggestion,
|
|
24
|
+
effort,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
suggestions.sort((a, b) => {
|
|
28
|
+
if (a.hasPatch && !b.hasPatch)
|
|
29
|
+
return -1;
|
|
30
|
+
if (!a.hasPatch && b.hasPatch)
|
|
31
|
+
return 1;
|
|
32
|
+
return 0;
|
|
33
|
+
});
|
|
34
|
+
return suggestions;
|
|
35
|
+
}
|
|
36
|
+
export function runFindingAutoFixSuggest(argv) {
|
|
37
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
38
|
+
console.log(`Usage: judges finding-auto-fix-suggest [options]
|
|
39
|
+
|
|
40
|
+
Suggest automated fixes for findings.
|
|
41
|
+
|
|
42
|
+
Options:
|
|
43
|
+
--report <path> Path to verdict JSON file
|
|
44
|
+
--format <fmt> Output format: table (default) or json
|
|
45
|
+
-h, --help Show this help message`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const formatIdx = argv.indexOf("--format");
|
|
49
|
+
const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
|
|
50
|
+
const reportIdx = argv.indexOf("--report");
|
|
51
|
+
const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
|
|
52
|
+
? join(process.cwd(), argv[reportIdx + 1])
|
|
53
|
+
: join(process.cwd(), ".judges", "last-verdict.json");
|
|
54
|
+
if (!existsSync(reportPath)) {
|
|
55
|
+
console.log(`No report found at: ${reportPath}`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const data = JSON.parse(readFileSync(reportPath, "utf-8"));
|
|
59
|
+
const findings = data.findings ?? [];
|
|
60
|
+
if (findings.length === 0) {
|
|
61
|
+
console.log("No findings — nothing to fix.");
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const suggestions = suggestFixes(findings);
|
|
65
|
+
const autoFixable = suggestions.filter((s) => s.hasPatch).length;
|
|
66
|
+
if (format === "json") {
|
|
67
|
+
console.log(JSON.stringify({ autoFixable, total: suggestions.length, suggestions }, null, 2));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
console.log(`\n=== Fix Suggestions (${autoFixable} auto-fixable of ${suggestions.length}) ===\n`);
|
|
71
|
+
for (const s of suggestions) {
|
|
72
|
+
console.log(`[${s.effort}] ${s.ruleId}: ${s.title}`);
|
|
73
|
+
console.log(` ${s.suggestion}`);
|
|
74
|
+
console.log();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=finding-auto-fix-suggest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-auto-fix-suggest.js","sourceRoot":"","sources":["../../src/commands/finding-auto-fix-suggest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-batch-triage.d.ts","sourceRoot":"","sources":["../../src/commands/finding-batch-triage.ts"],"names":[],"mappings":"AAwDA,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4D1D"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { readFileSync, existsSync, writeFileSync, mkdirSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
function triageFindings(findings) {
|
|
4
|
+
const decisions = [];
|
|
5
|
+
const now = new Date().toISOString().slice(0, 10);
|
|
6
|
+
for (const f of findings) {
|
|
7
|
+
let action;
|
|
8
|
+
let assignedTo;
|
|
9
|
+
if (f.severity === "critical") {
|
|
10
|
+
action = "Fix immediately";
|
|
11
|
+
assignedTo = "security-lead";
|
|
12
|
+
}
|
|
13
|
+
else if (f.severity === "high") {
|
|
14
|
+
action = "Fix before release";
|
|
15
|
+
assignedTo = "team-lead";
|
|
16
|
+
}
|
|
17
|
+
else if (f.severity === "medium") {
|
|
18
|
+
action = "Schedule fix";
|
|
19
|
+
assignedTo = "developer";
|
|
20
|
+
}
|
|
21
|
+
else if (f.severity === "low") {
|
|
22
|
+
action = "Backlog";
|
|
23
|
+
assignedTo = "developer";
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
action = "Acknowledge";
|
|
27
|
+
assignedTo = "any";
|
|
28
|
+
}
|
|
29
|
+
decisions.push({
|
|
30
|
+
ruleId: f.ruleId,
|
|
31
|
+
title: f.title,
|
|
32
|
+
severity: f.severity,
|
|
33
|
+
action,
|
|
34
|
+
assignedTo,
|
|
35
|
+
triagedAt: now,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return decisions;
|
|
39
|
+
}
|
|
40
|
+
export function runFindingBatchTriage(argv) {
|
|
41
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
42
|
+
console.log(`Usage: judges finding-batch-triage [options]
|
|
43
|
+
|
|
44
|
+
Batch triage findings with auto-assigned actions.
|
|
45
|
+
|
|
46
|
+
Options:
|
|
47
|
+
--report <path> Path to verdict JSON file
|
|
48
|
+
--save Save triage decisions to ledger
|
|
49
|
+
--format <fmt> Output format: table (default) or json
|
|
50
|
+
-h, --help Show this help message`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const formatIdx = argv.indexOf("--format");
|
|
54
|
+
const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
|
|
55
|
+
const save = argv.includes("--save");
|
|
56
|
+
const reportIdx = argv.indexOf("--report");
|
|
57
|
+
const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
|
|
58
|
+
? join(process.cwd(), argv[reportIdx + 1])
|
|
59
|
+
: join(process.cwd(), ".judges", "last-verdict.json");
|
|
60
|
+
if (!existsSync(reportPath)) {
|
|
61
|
+
console.log(`No report found at: ${reportPath}`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const data = JSON.parse(readFileSync(reportPath, "utf-8"));
|
|
65
|
+
const findings = data.findings ?? [];
|
|
66
|
+
if (findings.length === 0) {
|
|
67
|
+
console.log("No findings to triage.");
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const decisions = triageFindings(findings);
|
|
71
|
+
if (save) {
|
|
72
|
+
const triageDir = join(process.cwd(), ".judges");
|
|
73
|
+
if (!existsSync(triageDir)) {
|
|
74
|
+
mkdirSync(triageDir, { recursive: true });
|
|
75
|
+
}
|
|
76
|
+
const triagePath = join(triageDir, "triage-decisions.json");
|
|
77
|
+
writeFileSync(triagePath, JSON.stringify({ decisions }, null, 2), "utf-8");
|
|
78
|
+
console.log(`Triage decisions saved to: ${triagePath}`);
|
|
79
|
+
}
|
|
80
|
+
if (format === "json") {
|
|
81
|
+
console.log(JSON.stringify({ total: decisions.length, decisions }, null, 2));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
console.log(`\n=== Batch Triage (${decisions.length} findings) ===\n`);
|
|
85
|
+
for (const d of decisions) {
|
|
86
|
+
console.log(`[${d.severity.toUpperCase()}] ${d.ruleId}: ${d.title}`);
|
|
87
|
+
console.log(` Action: ${d.action} | Assigned: ${d.assignedTo}`);
|
|
88
|
+
console.log();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=finding-batch-triage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-batch-triage.js","sourceRoot":"","sources":["../../src/commands/finding-batch-triage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-confidence-boost.d.ts","sourceRoot":"","sources":["../../src/commands/finding-confidence-boost.ts"],"names":[],"mappings":"AAoEA,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoD9D"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
function boostConfidence(findings) {
|
|
4
|
+
// Build a map of rule occurrences for corroboration
|
|
5
|
+
const ruleCounts = new Map();
|
|
6
|
+
for (const f of findings) {
|
|
7
|
+
const prefix = f.ruleId.split("-")[0];
|
|
8
|
+
ruleCounts.set(prefix, (ruleCounts.get(prefix) ?? 0) + 1);
|
|
9
|
+
}
|
|
10
|
+
const boosts = [];
|
|
11
|
+
for (const f of findings) {
|
|
12
|
+
const original = f.confidence ?? 0.5;
|
|
13
|
+
let boosted = original;
|
|
14
|
+
const reasons = [];
|
|
15
|
+
// Multiple findings from same domain = corroboration
|
|
16
|
+
const prefix = f.ruleId.split("-")[0];
|
|
17
|
+
const domainCount = ruleCounts.get(prefix) ?? 0;
|
|
18
|
+
if (domainCount >= 3) {
|
|
19
|
+
boosted = Math.min(1, boosted + 0.1);
|
|
20
|
+
reasons.push(`${domainCount} corroborating findings in domain`);
|
|
21
|
+
}
|
|
22
|
+
// Has patch = higher confidence the issue is real
|
|
23
|
+
if (f.patch !== undefined && f.patch !== null) {
|
|
24
|
+
boosted = Math.min(1, boosted + 0.05);
|
|
25
|
+
reasons.push("patch available confirms issue");
|
|
26
|
+
}
|
|
27
|
+
// High severity + evidence = boost
|
|
28
|
+
if ((f.severity === "critical" || f.severity === "high") && f.evidenceBasis) {
|
|
29
|
+
boosted = Math.min(1, boosted + 0.05);
|
|
30
|
+
reasons.push("evidence-backed high severity");
|
|
31
|
+
}
|
|
32
|
+
if (reasons.length > 0) {
|
|
33
|
+
boosts.push({
|
|
34
|
+
ruleId: f.ruleId,
|
|
35
|
+
title: f.title,
|
|
36
|
+
originalConfidence: Math.round(original * 100),
|
|
37
|
+
boostedConfidence: Math.round(boosted * 100),
|
|
38
|
+
boostReasons: reasons,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
boosts.sort((a, b) => b.boostedConfidence - b.originalConfidence - (a.boostedConfidence - a.originalConfidence));
|
|
43
|
+
return boosts;
|
|
44
|
+
}
|
|
45
|
+
export function runFindingConfidenceBoost(argv) {
|
|
46
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
47
|
+
console.log(`Usage: judges finding-confidence-boost [options]
|
|
48
|
+
|
|
49
|
+
Identify findings eligible for confidence boost.
|
|
50
|
+
|
|
51
|
+
Options:
|
|
52
|
+
--report <path> Path to verdict JSON file
|
|
53
|
+
--format <fmt> Output format: table (default) or json
|
|
54
|
+
-h, --help Show this help message`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const formatIdx = argv.indexOf("--format");
|
|
58
|
+
const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
|
|
59
|
+
const reportIdx = argv.indexOf("--report");
|
|
60
|
+
const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
|
|
61
|
+
? join(process.cwd(), argv[reportIdx + 1])
|
|
62
|
+
: join(process.cwd(), ".judges", "last-verdict.json");
|
|
63
|
+
if (!existsSync(reportPath)) {
|
|
64
|
+
console.log(`No report found at: ${reportPath}`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const data = JSON.parse(readFileSync(reportPath, "utf-8"));
|
|
68
|
+
const findings = data.findings ?? [];
|
|
69
|
+
if (findings.length === 0) {
|
|
70
|
+
console.log("No findings to analyze.");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const boosts = boostConfidence(findings);
|
|
74
|
+
if (format === "json") {
|
|
75
|
+
console.log(JSON.stringify(boosts, null, 2));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
console.log(`\n=== Confidence Boost Analysis (${boosts.length} eligible) ===\n`);
|
|
79
|
+
for (const b of boosts) {
|
|
80
|
+
const delta = b.boostedConfidence - b.originalConfidence;
|
|
81
|
+
console.log(`${b.ruleId}: ${b.title}`);
|
|
82
|
+
console.log(` ${b.originalConfidence}% → ${b.boostedConfidence}% (+${delta}%)`);
|
|
83
|
+
for (const r of b.boostReasons) {
|
|
84
|
+
console.log(` • ${r}`);
|
|
85
|
+
}
|
|
86
|
+
console.log();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=finding-confidence-boost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-confidence-boost.js","sourceRoot":"","sources":["../../src/commands/finding-confidence-boost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAgB5B,SAAS,eAAe,CAAC,QAAmB;IAC1C,oDAAoD;IACpD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,IAAI,GAAG,CAAC;QACrC,IAAI,OAAO,GAAG,QAAQ,CAAC;QACvB,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,qDAAqD;QACrD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,mCAAmC,CAAC,CAAC;QAClE,CAAC;QAED,kDAAkD;QAClD,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QACjD,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;YAC5E,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC;gBAC9C,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;gBAC5C,YAAY,EAAE,OAAO;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAEjH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAc;IACtD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;8CAO8B,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAEvF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,UAAU,GACd,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACrC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAE1D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAoB,CAAC;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IAErC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oCAAoC,MAAM,CAAC,MAAM,kBAAkB,CAAC,CAAC;IACjF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,kBAAkB,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,kBAAkB,OAAO,CAAC,CAAC,iBAAiB,OAAO,KAAK,IAAI,CAAC,CAAC;QACjF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-noise-reduce.d.ts","sourceRoot":"","sources":["../../src/commands/finding-noise-reduce.ts"],"names":[],"mappings":"AAqEA,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkD1D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
function identifyNoise(findings) {
|
|
4
|
+
const candidates = [];
|
|
5
|
+
// Count rule occurrences for duplicate detection
|
|
6
|
+
const ruleCounts = new Map();
|
|
7
|
+
for (const f of findings) {
|
|
8
|
+
ruleCounts.set(f.ruleId, (ruleCounts.get(f.ruleId) ?? 0) + 1);
|
|
9
|
+
}
|
|
10
|
+
for (const f of findings) {
|
|
11
|
+
const conf = f.confidence ?? 0.5;
|
|
12
|
+
const reasons = [];
|
|
13
|
+
if (conf < 0.3) {
|
|
14
|
+
reasons.push("very low confidence");
|
|
15
|
+
}
|
|
16
|
+
if (f.severity === "info") {
|
|
17
|
+
reasons.push("informational only");
|
|
18
|
+
}
|
|
19
|
+
if ((ruleCounts.get(f.ruleId) ?? 0) > 3) {
|
|
20
|
+
reasons.push("repeated pattern");
|
|
21
|
+
}
|
|
22
|
+
if (reasons.length > 0) {
|
|
23
|
+
candidates.push({
|
|
24
|
+
ruleId: f.ruleId,
|
|
25
|
+
title: f.title,
|
|
26
|
+
severity: f.severity,
|
|
27
|
+
confidence: Math.round(conf * 100),
|
|
28
|
+
reason: reasons.join(", "),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const noisePct = findings.length > 0 ? Math.round((candidates.length / findings.length) * 100) : 0;
|
|
33
|
+
return {
|
|
34
|
+
totalFindings: findings.length,
|
|
35
|
+
noiseCount: candidates.length,
|
|
36
|
+
noisePct,
|
|
37
|
+
candidates,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function runFindingNoiseReduce(argv) {
|
|
41
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
42
|
+
console.log(`Usage: judges finding-noise-reduce [options]
|
|
43
|
+
|
|
44
|
+
Identify and reduce noisy findings.
|
|
45
|
+
|
|
46
|
+
Options:
|
|
47
|
+
--report <path> Path to verdict JSON file
|
|
48
|
+
--format <fmt> Output format: table (default) or json
|
|
49
|
+
-h, --help Show this help message`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const formatIdx = argv.indexOf("--format");
|
|
53
|
+
const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
|
|
54
|
+
const reportIdx = argv.indexOf("--report");
|
|
55
|
+
const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
|
|
56
|
+
? join(process.cwd(), argv[reportIdx + 1])
|
|
57
|
+
: join(process.cwd(), ".judges", "last-verdict.json");
|
|
58
|
+
if (!existsSync(reportPath)) {
|
|
59
|
+
console.log(`No report found at: ${reportPath}`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const data = JSON.parse(readFileSync(reportPath, "utf-8"));
|
|
63
|
+
const findings = data.findings ?? [];
|
|
64
|
+
const report = identifyNoise(findings);
|
|
65
|
+
if (format === "json") {
|
|
66
|
+
console.log(JSON.stringify(report, null, 2));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
console.log(`\n=== Noise Analysis ===\n`);
|
|
70
|
+
console.log(`Total findings: ${report.totalFindings}`);
|
|
71
|
+
console.log(`Noise candidates: ${report.noiseCount} (${report.noisePct}%)\n`);
|
|
72
|
+
if (report.candidates.length === 0) {
|
|
73
|
+
console.log("No noisy findings detected — signal is clean.");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
for (const c of report.candidates) {
|
|
77
|
+
console.log(` ${c.ruleId}: ${c.title}`);
|
|
78
|
+
console.log(` ${c.severity} | ${c.confidence}% conf | ${c.reason}`);
|
|
79
|
+
}
|
|
80
|
+
console.log("\nConsider suppressing these rules to reduce noise.");
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=finding-noise-reduce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-noise-reduce.js","sourceRoot":"","sources":["../../src/commands/finding-noise-reduce.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-scope-filter.d.ts","sourceRoot":"","sources":["../../src/commands/finding-scope-filter.ts"],"names":[],"mappings":"AAwCA,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2D1D"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
/* ── finding-scope-filter ───────────────────────────────────────────
|
|
4
|
+
Filter findings by scope — rule prefix, severity, confidence,
|
|
5
|
+
or keyword — to focus on relevant subsets during triage.
|
|
6
|
+
─────────────────────────────────────────────────────────────────── */
|
|
7
|
+
function filterFindings(findings, opts) {
|
|
8
|
+
let result = findings;
|
|
9
|
+
if (opts.rule) {
|
|
10
|
+
const prefix = opts.rule.toUpperCase();
|
|
11
|
+
result = result.filter((f) => f.ruleId.toUpperCase().startsWith(prefix));
|
|
12
|
+
}
|
|
13
|
+
if (opts.severity) {
|
|
14
|
+
const sev = opts.severity.toLowerCase();
|
|
15
|
+
result = result.filter((f) => f.severity === sev);
|
|
16
|
+
}
|
|
17
|
+
if (opts.minConfidence !== undefined) {
|
|
18
|
+
result = result.filter((f) => (f.confidence ?? 0) >= opts.minConfidence);
|
|
19
|
+
}
|
|
20
|
+
if (opts.keyword) {
|
|
21
|
+
const kw = opts.keyword.toLowerCase();
|
|
22
|
+
result = result.filter((f) => {
|
|
23
|
+
const text = `${f.ruleId} ${f.title} ${f.description}`.toLowerCase();
|
|
24
|
+
return text.includes(kw);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
export function runFindingScopeFilter(argv) {
|
|
30
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
31
|
+
console.log(`Usage: judges finding-scope-filter [options]
|
|
32
|
+
|
|
33
|
+
Filter findings by scope criteria.
|
|
34
|
+
|
|
35
|
+
Options:
|
|
36
|
+
--report <path> Path to verdict JSON file
|
|
37
|
+
--rule <prefix> Filter by rule prefix (e.g., SEC, PERF)
|
|
38
|
+
--severity <level> Filter by severity
|
|
39
|
+
--min-confidence <n> Minimum confidence (0-1)
|
|
40
|
+
--keyword <text> Filter by keyword in title/description
|
|
41
|
+
--format <fmt> Output format: table (default) or json
|
|
42
|
+
-h, --help Show this help message`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const formatIdx = argv.indexOf("--format");
|
|
46
|
+
const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
|
|
47
|
+
const reportIdx = argv.indexOf("--report");
|
|
48
|
+
const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
|
|
49
|
+
? join(process.cwd(), argv[reportIdx + 1])
|
|
50
|
+
: join(process.cwd(), ".judges", "last-verdict.json");
|
|
51
|
+
const ruleIdx = argv.indexOf("--rule");
|
|
52
|
+
const rule = ruleIdx !== -1 && argv[ruleIdx + 1] ? argv[ruleIdx + 1] : undefined;
|
|
53
|
+
const sevIdx = argv.indexOf("--severity");
|
|
54
|
+
const severity = sevIdx !== -1 && argv[sevIdx + 1] ? argv[sevIdx + 1] : undefined;
|
|
55
|
+
const confIdx = argv.indexOf("--min-confidence");
|
|
56
|
+
const minConfidence = confIdx !== -1 && argv[confIdx + 1] ? parseFloat(argv[confIdx + 1]) : undefined;
|
|
57
|
+
const kwIdx = argv.indexOf("--keyword");
|
|
58
|
+
const keyword = kwIdx !== -1 && argv[kwIdx + 1] ? argv[kwIdx + 1] : undefined;
|
|
59
|
+
if (!existsSync(reportPath)) {
|
|
60
|
+
console.log(`No report found at: ${reportPath}`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const data = JSON.parse(readFileSync(reportPath, "utf-8"));
|
|
64
|
+
const findings = data.findings ?? [];
|
|
65
|
+
const filtered = filterFindings(findings, { rule, severity, minConfidence, keyword });
|
|
66
|
+
if (format === "json") {
|
|
67
|
+
console.log(JSON.stringify({ total: findings.length, filtered: filtered.length, findings: filtered }, null, 2));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
console.log(`\n=== Filtered Findings: ${filtered.length} of ${findings.length} ===\n`);
|
|
71
|
+
for (const f of filtered) {
|
|
72
|
+
console.log(`[${f.severity.toUpperCase()}] ${f.ruleId}: ${f.title}`);
|
|
73
|
+
}
|
|
74
|
+
if (filtered.length === 0) {
|
|
75
|
+
console.log("No findings match the filter criteria.");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=finding-scope-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-scope-filter.js","sourceRoot":"","sources":["../../src/commands/finding-scope-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-code-ownership.d.ts","sourceRoot":"","sources":["../../src/commands/review-code-ownership.ts"],"names":[],"mappings":"AAyDA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgE3D"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
function matchOwner(ruleId, rules) {
|
|
4
|
+
for (const rule of rules) {
|
|
5
|
+
if (ruleId.toUpperCase().startsWith(rule.pattern.toUpperCase())) {
|
|
6
|
+
return rule.owners;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return ["unassigned"];
|
|
10
|
+
}
|
|
11
|
+
function mapOwnership(findings, ownerRules) {
|
|
12
|
+
const ownerMap = new Map();
|
|
13
|
+
for (const f of findings) {
|
|
14
|
+
const owners = matchOwner(f.ruleId, ownerRules);
|
|
15
|
+
for (const owner of owners) {
|
|
16
|
+
const list = ownerMap.get(owner) ?? [];
|
|
17
|
+
list.push({ ruleId: f.ruleId, title: f.title, severity: f.severity });
|
|
18
|
+
ownerMap.set(owner, list);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const mappings = [];
|
|
22
|
+
for (const [owner, ownerFindings] of ownerMap) {
|
|
23
|
+
const criticalCount = ownerFindings.filter((f) => f.severity === "critical").length;
|
|
24
|
+
mappings.push({
|
|
25
|
+
owner,
|
|
26
|
+
findingCount: ownerFindings.length,
|
|
27
|
+
criticalCount,
|
|
28
|
+
findings: ownerFindings,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
mappings.sort((a, b) => b.findingCount - a.findingCount);
|
|
32
|
+
return mappings;
|
|
33
|
+
}
|
|
34
|
+
export function runReviewCodeOwnership(argv) {
|
|
35
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
36
|
+
console.log(`Usage: judges review-code-ownership [options]
|
|
37
|
+
|
|
38
|
+
Map findings to code owners.
|
|
39
|
+
|
|
40
|
+
Options:
|
|
41
|
+
--report <path> Path to verdict JSON file
|
|
42
|
+
--owners <path> Path to ownership rules JSON
|
|
43
|
+
--format <fmt> Output format: table (default) or json
|
|
44
|
+
-h, --help Show this help message`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const formatIdx = argv.indexOf("--format");
|
|
48
|
+
const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
|
|
49
|
+
const reportIdx = argv.indexOf("--report");
|
|
50
|
+
const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
|
|
51
|
+
? join(process.cwd(), argv[reportIdx + 1])
|
|
52
|
+
: join(process.cwd(), ".judges", "last-verdict.json");
|
|
53
|
+
const ownIdx = argv.indexOf("--owners");
|
|
54
|
+
const ownPath = ownIdx !== -1 && argv[ownIdx + 1]
|
|
55
|
+
? join(process.cwd(), argv[ownIdx + 1])
|
|
56
|
+
: join(process.cwd(), ".judges", "code-owners.json");
|
|
57
|
+
if (!existsSync(reportPath)) {
|
|
58
|
+
console.log(`No report found at: ${reportPath}`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const data = JSON.parse(readFileSync(reportPath, "utf-8"));
|
|
62
|
+
const findings = data.findings ?? [];
|
|
63
|
+
let ownerRules;
|
|
64
|
+
if (existsSync(ownPath)) {
|
|
65
|
+
const ownData = JSON.parse(readFileSync(ownPath, "utf-8"));
|
|
66
|
+
ownerRules = ownData.rules ?? [];
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
ownerRules = [
|
|
70
|
+
{ pattern: "SEC", owners: ["security-team"] },
|
|
71
|
+
{ pattern: "PERF", owners: ["performance-team"] },
|
|
72
|
+
];
|
|
73
|
+
console.log(`No ownership config found. Using defaults.\nCreate ${ownPath} for custom mappings.\n`);
|
|
74
|
+
}
|
|
75
|
+
const mappings = mapOwnership(findings, ownerRules);
|
|
76
|
+
if (format === "json") {
|
|
77
|
+
console.log(JSON.stringify(mappings, null, 2));
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
console.log("\n=== Code Ownership ===\n");
|
|
81
|
+
for (const m of mappings) {
|
|
82
|
+
console.log(`${m.owner}: ${m.findingCount} findings (${m.criticalCount} critical)`);
|
|
83
|
+
for (const f of m.findings) {
|
|
84
|
+
console.log(` [${f.severity.toUpperCase()}] ${f.ruleId}: ${f.title}`);
|
|
85
|
+
}
|
|
86
|
+
console.log();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=review-code-ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-code-ownership.js","sourceRoot":"","sources":["../../src/commands/review-code-ownership.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-pr-label-suggest.d.ts","sourceRoot":"","sources":["../../src/commands/review-pr-label-suggest.ts"],"names":[],"mappings":"AA4DA,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwC5D"}
|