@kevinrabun/judges 3.103.0 → 3.105.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 +26 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +126 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/finding-auto-categorize.d.ts +2 -0
- package/dist/commands/finding-auto-categorize.d.ts.map +1 -0
- package/dist/commands/finding-auto-categorize.js +110 -0
- package/dist/commands/finding-auto-categorize.js.map +1 -0
- package/dist/commands/finding-context-summary.d.ts +2 -0
- package/dist/commands/finding-context-summary.d.ts.map +1 -0
- package/dist/commands/finding-context-summary.js +86 -0
- package/dist/commands/finding-context-summary.js.map +1 -0
- package/dist/commands/finding-cross-file-link.d.ts +2 -0
- package/dist/commands/finding-cross-file-link.d.ts.map +1 -0
- package/dist/commands/finding-cross-file-link.js +102 -0
- package/dist/commands/finding-cross-file-link.js.map +1 -0
- package/dist/commands/finding-hotspot-detect.d.ts +2 -0
- package/dist/commands/finding-hotspot-detect.d.ts.map +1 -0
- package/dist/commands/finding-hotspot-detect.js +121 -0
- package/dist/commands/finding-hotspot-detect.js.map +1 -0
- package/dist/commands/finding-impact-radius.d.ts +2 -0
- package/dist/commands/finding-impact-radius.d.ts.map +1 -0
- package/dist/commands/finding-impact-radius.js +95 -0
- package/dist/commands/finding-impact-radius.js.map +1 -0
- package/dist/commands/finding-similar-match.d.ts +2 -0
- package/dist/commands/finding-similar-match.d.ts.map +1 -0
- package/dist/commands/finding-similar-match.js +113 -0
- package/dist/commands/finding-similar-match.js.map +1 -0
- package/dist/commands/review-approval-criteria.d.ts +2 -0
- package/dist/commands/review-approval-criteria.d.ts.map +1 -0
- package/dist/commands/review-approval-criteria.js +100 -0
- package/dist/commands/review-approval-criteria.js.map +1 -0
- package/dist/commands/review-changelog-impact.d.ts +2 -0
- package/dist/commands/review-changelog-impact.d.ts.map +1 -0
- package/dist/commands/review-changelog-impact.js +90 -0
- package/dist/commands/review-changelog-impact.js.map +1 -0
- package/dist/commands/review-code-health-score.d.ts +2 -0
- package/dist/commands/review-code-health-score.d.ts.map +1 -0
- package/dist/commands/review-code-health-score.js +101 -0
- package/dist/commands/review-code-health-score.js.map +1 -0
- package/dist/commands/review-commit-quality.d.ts +2 -0
- package/dist/commands/review-commit-quality.d.ts.map +1 -0
- package/dist/commands/review-commit-quality.js +95 -0
- package/dist/commands/review-commit-quality.js.map +1 -0
- package/dist/commands/review-focus-area.d.ts +2 -0
- package/dist/commands/review-focus-area.d.ts.map +1 -0
- package/dist/commands/review-focus-area.js +97 -0
- package/dist/commands/review-focus-area.js.map +1 -0
- package/dist/commands/review-pr-size-check.d.ts +2 -0
- package/dist/commands/review-pr-size-check.d.ts.map +1 -0
- package/dist/commands/review-pr-size-check.js +99 -0
- package/dist/commands/review-pr-size-check.js.map +1 -0
- package/dist/commands/review-reviewer-match.d.ts +2 -0
- package/dist/commands/review-reviewer-match.d.ts.map +1 -0
- package/dist/commands/review-reviewer-match.js +109 -0
- package/dist/commands/review-reviewer-match.js.map +1 -0
- package/dist/commands/review-risk-matrix.d.ts +2 -0
- package/dist/commands/review-risk-matrix.d.ts.map +1 -0
- package/dist/commands/review-risk-matrix.js +97 -0
- package/dist/commands/review-risk-matrix.js.map +1 -0
- package/dist/commands/review-stale-finding-clean.d.ts +2 -0
- package/dist/commands/review-stale-finding-clean.d.ts.map +1 -0
- package/dist/commands/review-stale-finding-clean.js +82 -0
- package/dist/commands/review-stale-finding-clean.js.map +1 -0
- package/dist/commands/review-team-analytics.d.ts +2 -0
- package/dist/commands/review-team-analytics.d.ts.map +1 -0
- package/dist/commands/review-team-analytics.js +95 -0
- package/dist/commands/review-team-analytics.js.map +1 -0
- package/dist/commands/review-template-suggest.d.ts +2 -0
- package/dist/commands/review-template-suggest.d.ts.map +1 -0
- package/dist/commands/review-template-suggest.js +120 -0
- package/dist/commands/review-template-suggest.js.map +1 -0
- package/dist/commands/review-velocity-track.d.ts +2 -0
- package/dist/commands/review-velocity-track.d.ts.map +1 -0
- package/dist/commands/review-velocity-track.js +95 -0
- package/dist/commands/review-velocity-track.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
function identifyFocusAreas(findings) {
|
|
4
|
+
const areas = [];
|
|
5
|
+
const rulesByDomain = new Map();
|
|
6
|
+
for (const f of findings) {
|
|
7
|
+
const domain = f.ruleId.split("-")[0];
|
|
8
|
+
const group = rulesByDomain.get(domain);
|
|
9
|
+
if (group !== undefined) {
|
|
10
|
+
group.push(f);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
rulesByDomain.set(domain, [f]);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
for (const [domain, domainFindings] of rulesByDomain) {
|
|
17
|
+
const severities = domainFindings.map((f) => f.severity);
|
|
18
|
+
const hasCritical = severities.includes("critical");
|
|
19
|
+
const hasHigh = severities.includes("high");
|
|
20
|
+
let priority;
|
|
21
|
+
let description;
|
|
22
|
+
if (hasCritical) {
|
|
23
|
+
priority = "critical";
|
|
24
|
+
description = `Critical findings in ${domain} — immediate attention required`;
|
|
25
|
+
}
|
|
26
|
+
else if (hasHigh) {
|
|
27
|
+
priority = "high";
|
|
28
|
+
description = `High-severity issues in ${domain} — review carefully`;
|
|
29
|
+
}
|
|
30
|
+
else if (domainFindings.length >= 5) {
|
|
31
|
+
priority = "medium";
|
|
32
|
+
description = `Multiple ${domain} findings — pattern may indicate deeper issue`;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
priority = "low";
|
|
36
|
+
description = `Minor ${domain} findings — review when time permits`;
|
|
37
|
+
}
|
|
38
|
+
const topSeverity = hasCritical ? "critical" : hasHigh ? "high" : severities.includes("medium") ? "medium" : "low";
|
|
39
|
+
areas.push({
|
|
40
|
+
area: domain,
|
|
41
|
+
priority,
|
|
42
|
+
findingCount: domainFindings.length,
|
|
43
|
+
topSeverity,
|
|
44
|
+
description,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
areas.sort((a, b) => {
|
|
48
|
+
const order = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
49
|
+
return (order[a.priority] ?? 4) - (order[b.priority] ?? 4);
|
|
50
|
+
});
|
|
51
|
+
return areas;
|
|
52
|
+
}
|
|
53
|
+
export function runReviewFocusArea(argv) {
|
|
54
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
55
|
+
console.log(`Usage: judges review-focus-area [options]
|
|
56
|
+
|
|
57
|
+
Identify focus areas for reviewers.
|
|
58
|
+
|
|
59
|
+
Options:
|
|
60
|
+
--report <path> Path to verdict JSON file
|
|
61
|
+
--format <fmt> Output format: table (default) or json
|
|
62
|
+
-h, --help Show this help message`);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const formatIdx = argv.indexOf("--format");
|
|
66
|
+
const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
|
|
67
|
+
const reportIdx = argv.indexOf("--report");
|
|
68
|
+
const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
|
|
69
|
+
? join(process.cwd(), argv[reportIdx + 1])
|
|
70
|
+
: join(process.cwd(), ".judges", "last-verdict.json");
|
|
71
|
+
if (!existsSync(reportPath)) {
|
|
72
|
+
console.log(`No report found at: ${reportPath}`);
|
|
73
|
+
console.log("Run a review first or provide --report.");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const data = JSON.parse(readFileSync(reportPath, "utf-8"));
|
|
77
|
+
const findings = data.findings ?? [];
|
|
78
|
+
if (findings.length === 0) {
|
|
79
|
+
console.log("No findings — no focus areas needed.");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const areas = identifyFocusAreas(findings);
|
|
83
|
+
if (format === "json") {
|
|
84
|
+
console.log(JSON.stringify(areas, null, 2));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
console.log("\n=== Review Focus Areas ===\n");
|
|
88
|
+
console.log(`Total findings: ${findings.length}`);
|
|
89
|
+
console.log(`Focus areas: ${areas.length}\n`);
|
|
90
|
+
for (const area of areas) {
|
|
91
|
+
console.log(`[${area.priority.toUpperCase()}] ${area.area} — ${area.findingCount} finding(s)`);
|
|
92
|
+
console.log(` Top severity: ${area.topSeverity}`);
|
|
93
|
+
console.log(` ${area.description}`);
|
|
94
|
+
console.log();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=review-focus-area.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-focus-area.js","sourceRoot":"","sources":["../../src/commands/review-focus-area.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-pr-size-check.d.ts","sourceRoot":"","sources":["../../src/commands/review-pr-size-check.ts"],"names":[],"mappings":"AAyEA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmDzD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
function checkPrSize(files) {
|
|
4
|
+
let totalLines = 0;
|
|
5
|
+
const fileGroups = new Map();
|
|
6
|
+
for (const file of files) {
|
|
7
|
+
const parts = file.split("/");
|
|
8
|
+
const dir = parts.length > 1 ? parts.slice(0, -1).join("/") : ".";
|
|
9
|
+
const group = fileGroups.get(dir);
|
|
10
|
+
if (group !== undefined) {
|
|
11
|
+
group.push(file);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
fileGroups.set(dir, [file]);
|
|
15
|
+
}
|
|
16
|
+
totalLines += 50;
|
|
17
|
+
}
|
|
18
|
+
let category;
|
|
19
|
+
let recommendation;
|
|
20
|
+
if (files.length > 20 || totalLines > 1000) {
|
|
21
|
+
category = "too-large";
|
|
22
|
+
recommendation = "PR is too large for effective review — strongly recommend splitting";
|
|
23
|
+
}
|
|
24
|
+
else if (files.length > 10 || totalLines > 500) {
|
|
25
|
+
category = "large";
|
|
26
|
+
recommendation = "Large PR — consider splitting for better review quality";
|
|
27
|
+
}
|
|
28
|
+
else if (files.length > 5) {
|
|
29
|
+
category = "medium";
|
|
30
|
+
recommendation = "Moderate size — reviewable but could benefit from split";
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
category = "small";
|
|
34
|
+
recommendation = "Good size for thorough review";
|
|
35
|
+
}
|
|
36
|
+
const splitSuggestions = [];
|
|
37
|
+
if (fileGroups.size > 3 && files.length > 10) {
|
|
38
|
+
for (const [dir, dirFiles] of fileGroups) {
|
|
39
|
+
if (dirFiles.length >= 3) {
|
|
40
|
+
splitSuggestions.push(`Split ${dir}/ changes (${dirFiles.length} files) into separate PR`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const hasTests = files.some((f) => f.includes("test") || f.includes("spec"));
|
|
45
|
+
const hasSource = files.some((f) => f.endsWith(".ts") || f.endsWith(".js") || f.endsWith(".py") || f.endsWith(".go"));
|
|
46
|
+
if (hasTests && hasSource && files.length > 8) {
|
|
47
|
+
splitSuggestions.push("Consider separating test changes from source changes");
|
|
48
|
+
}
|
|
49
|
+
const hasConfig = files.some((f) => f.endsWith(".json") || f.endsWith(".yml") || f.endsWith(".yaml"));
|
|
50
|
+
if (hasConfig && hasSource && files.length > 8) {
|
|
51
|
+
splitSuggestions.push("Consider separating config changes from source changes");
|
|
52
|
+
}
|
|
53
|
+
return { fileCount: files.length, totalLines, category, recommendation, splitSuggestions };
|
|
54
|
+
}
|
|
55
|
+
export function runReviewPrSizeCheck(argv) {
|
|
56
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
57
|
+
console.log(`Usage: judges review-pr-size-check [options]
|
|
58
|
+
|
|
59
|
+
Check PR size and suggest splitting.
|
|
60
|
+
|
|
61
|
+
Options:
|
|
62
|
+
--files <path> File listing changed files (one per line)
|
|
63
|
+
--format <fmt> Output format: table (default) or json
|
|
64
|
+
-h, --help Show this help message`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const formatIdx = argv.indexOf("--format");
|
|
68
|
+
const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
|
|
69
|
+
const filesIdx = argv.indexOf("--files");
|
|
70
|
+
const filesPath = filesIdx !== -1 && argv[filesIdx + 1] ? join(process.cwd(), argv[filesIdx + 1]) : null;
|
|
71
|
+
let changedFiles = [];
|
|
72
|
+
if (filesPath !== null && existsSync(filesPath)) {
|
|
73
|
+
changedFiles = readFileSync(filesPath, "utf-8")
|
|
74
|
+
.split("\n")
|
|
75
|
+
.map((l) => l.trim())
|
|
76
|
+
.filter((l) => l.length > 0);
|
|
77
|
+
}
|
|
78
|
+
if (changedFiles.length === 0) {
|
|
79
|
+
console.log("No changed files found. Provide --files with a list of changed files.");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const result = checkPrSize(changedFiles);
|
|
83
|
+
if (format === "json") {
|
|
84
|
+
console.log(JSON.stringify(result, null, 2));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
console.log("\n=== PR Size Check ===\n");
|
|
88
|
+
console.log(`Files: ${result.fileCount}`);
|
|
89
|
+
console.log(`Estimated lines: ${result.totalLines}`);
|
|
90
|
+
console.log(`Category: ${result.category.toUpperCase()}`);
|
|
91
|
+
console.log(`\n${result.recommendation}`);
|
|
92
|
+
if (result.splitSuggestions.length > 0) {
|
|
93
|
+
console.log("\nSplit Suggestions:");
|
|
94
|
+
for (const s of result.splitSuggestions) {
|
|
95
|
+
console.log(` • ${s}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=review-pr-size-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-pr-size-check.js","sourceRoot":"","sources":["../../src/commands/review-pr-size-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-reviewer-match.d.ts","sourceRoot":"","sources":["../../src/commands/review-reviewer-match.ts"],"names":[],"mappings":"AAuEA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiF3D"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
function matchReviewers(findings, reviewers) {
|
|
4
|
+
const findingDomains = new Set();
|
|
5
|
+
for (const f of findings) {
|
|
6
|
+
const domain = f.ruleId.split("-")[0].toLowerCase();
|
|
7
|
+
findingDomains.add(domain);
|
|
8
|
+
if (f.severity === "critical" || f.severity === "high") {
|
|
9
|
+
findingDomains.add("security");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const matches = [];
|
|
13
|
+
for (const reviewer of reviewers) {
|
|
14
|
+
const matched = [];
|
|
15
|
+
for (const exp of reviewer.expertise) {
|
|
16
|
+
if (findingDomains.has(exp.toLowerCase())) {
|
|
17
|
+
matched.push(exp);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const available = reviewer.currentLoad < reviewer.maxLoad;
|
|
21
|
+
const matchScore = reviewer.expertise.length > 0 ? (matched.length / reviewer.expertise.length) * 100 : 0;
|
|
22
|
+
let recommendation;
|
|
23
|
+
if (!available) {
|
|
24
|
+
recommendation = "Currently at capacity";
|
|
25
|
+
}
|
|
26
|
+
else if (matched.length >= 2) {
|
|
27
|
+
recommendation = "Strong match — assign as primary reviewer";
|
|
28
|
+
}
|
|
29
|
+
else if (matched.length === 1) {
|
|
30
|
+
recommendation = "Partial match — assign as secondary reviewer";
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
recommendation = "No domain match — skip unless needed";
|
|
34
|
+
}
|
|
35
|
+
matches.push({
|
|
36
|
+
reviewer: reviewer.name,
|
|
37
|
+
matchScore: Math.round(matchScore),
|
|
38
|
+
matchedDomains: matched,
|
|
39
|
+
available,
|
|
40
|
+
recommendation,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
matches.sort((a, b) => b.matchScore - a.matchScore);
|
|
44
|
+
return matches;
|
|
45
|
+
}
|
|
46
|
+
export function runReviewReviewerMatch(argv) {
|
|
47
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
48
|
+
console.log(`Usage: judges review-reviewer-match [options]
|
|
49
|
+
|
|
50
|
+
Match reviewers to changes based on expertise.
|
|
51
|
+
|
|
52
|
+
Options:
|
|
53
|
+
--report <path> Path to verdict JSON file
|
|
54
|
+
--team <path> Path to team profiles JSON
|
|
55
|
+
--format <fmt> Output format: table (default) or json
|
|
56
|
+
-h, --help Show this help message`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const formatIdx = argv.indexOf("--format");
|
|
60
|
+
const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
|
|
61
|
+
const reportIdx = argv.indexOf("--report");
|
|
62
|
+
const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
|
|
63
|
+
? join(process.cwd(), argv[reportIdx + 1])
|
|
64
|
+
: join(process.cwd(), ".judges", "last-verdict.json");
|
|
65
|
+
const teamIdx = argv.indexOf("--team");
|
|
66
|
+
const teamPath = teamIdx !== -1 && argv[teamIdx + 1]
|
|
67
|
+
? join(process.cwd(), argv[teamIdx + 1])
|
|
68
|
+
: join(process.cwd(), ".judges", "team-profiles.json");
|
|
69
|
+
if (!existsSync(reportPath)) {
|
|
70
|
+
console.log(`No report found at: ${reportPath}`);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (!existsSync(teamPath)) {
|
|
74
|
+
console.log(`No team profiles found at: ${teamPath}`);
|
|
75
|
+
console.log("Create .judges/team-profiles.json with reviewer expertise data.");
|
|
76
|
+
console.log("\nExample:");
|
|
77
|
+
console.log(JSON.stringify({
|
|
78
|
+
reviewers: [
|
|
79
|
+
{ name: "alice", expertise: ["SEC", "AUTH", "security"], maxLoad: 5, currentLoad: 2 },
|
|
80
|
+
{ name: "bob", expertise: ["PERF", "OPT", "performance"], maxLoad: 4, currentLoad: 1 },
|
|
81
|
+
],
|
|
82
|
+
}, null, 2));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const data = JSON.parse(readFileSync(reportPath, "utf-8"));
|
|
86
|
+
const findings = data.findings ?? [];
|
|
87
|
+
const teamData = JSON.parse(readFileSync(teamPath, "utf-8"));
|
|
88
|
+
const reviewers = teamData.reviewers ?? [];
|
|
89
|
+
if (findings.length === 0) {
|
|
90
|
+
console.log("No findings — any reviewer can handle this.");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const matches = matchReviewers(findings, reviewers);
|
|
94
|
+
if (format === "json") {
|
|
95
|
+
console.log(JSON.stringify(matches, null, 2));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
console.log("\n=== Reviewer Matching ===\n");
|
|
99
|
+
for (const m of matches) {
|
|
100
|
+
const status = m.available ? "Available" : "At capacity";
|
|
101
|
+
console.log(`${m.reviewer} (${m.matchScore}% match) — ${status}`);
|
|
102
|
+
if (m.matchedDomains.length > 0) {
|
|
103
|
+
console.log(` Domains: ${m.matchedDomains.join(", ")}`);
|
|
104
|
+
}
|
|
105
|
+
console.log(` → ${m.recommendation}`);
|
|
106
|
+
console.log();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=review-reviewer-match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-reviewer-match.js","sourceRoot":"","sources":["../../src/commands/review-reviewer-match.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-risk-matrix.d.ts","sourceRoot":"","sources":["../../src/commands/review-risk-matrix.ts"],"names":[],"mappings":"AAgEA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4DxD"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
function buildRiskMatrix(findings) {
|
|
4
|
+
const entries = [];
|
|
5
|
+
const severityScore = {
|
|
6
|
+
critical: 5,
|
|
7
|
+
high: 4,
|
|
8
|
+
medium: 3,
|
|
9
|
+
low: 2,
|
|
10
|
+
info: 1,
|
|
11
|
+
};
|
|
12
|
+
for (const f of findings) {
|
|
13
|
+
const sevScore = severityScore[f.severity] ?? 1;
|
|
14
|
+
const conf = f.confidence ?? 0.5;
|
|
15
|
+
let quadrant;
|
|
16
|
+
let riskLevel;
|
|
17
|
+
if (sevScore >= 4 && conf >= 0.7) {
|
|
18
|
+
quadrant = "Act Now";
|
|
19
|
+
riskLevel = "critical";
|
|
20
|
+
}
|
|
21
|
+
else if (sevScore >= 4 && conf < 0.7) {
|
|
22
|
+
quadrant = "Investigate";
|
|
23
|
+
riskLevel = "high";
|
|
24
|
+
}
|
|
25
|
+
else if (sevScore < 4 && conf >= 0.7) {
|
|
26
|
+
quadrant = "Plan Fix";
|
|
27
|
+
riskLevel = "medium";
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
quadrant = "Monitor";
|
|
31
|
+
riskLevel = "low";
|
|
32
|
+
}
|
|
33
|
+
entries.push({
|
|
34
|
+
ruleId: f.ruleId,
|
|
35
|
+
severity: f.severity,
|
|
36
|
+
confidence: conf,
|
|
37
|
+
riskLevel,
|
|
38
|
+
quadrant,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const order = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
42
|
+
entries.sort((a, b) => (order[a.riskLevel] ?? 4) - (order[b.riskLevel] ?? 4));
|
|
43
|
+
return entries;
|
|
44
|
+
}
|
|
45
|
+
export function runReviewRiskMatrix(argv) {
|
|
46
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
47
|
+
console.log(`Usage: judges review-risk-matrix [options]
|
|
48
|
+
|
|
49
|
+
Generate a risk matrix from review findings.
|
|
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 for risk matrix.");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const entries = buildRiskMatrix(findings);
|
|
74
|
+
if (format === "json") {
|
|
75
|
+
console.log(JSON.stringify(entries, null, 2));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
console.log("\n=== Risk Matrix ===\n");
|
|
79
|
+
const quadrants = new Map();
|
|
80
|
+
for (const e of entries) {
|
|
81
|
+
const q = quadrants.get(e.quadrant);
|
|
82
|
+
if (q !== undefined) {
|
|
83
|
+
q.push(e);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
quadrants.set(e.quadrant, [e]);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (const [quadrant, items] of quadrants) {
|
|
90
|
+
console.log(`[${quadrant}] — ${items.length} finding(s)`);
|
|
91
|
+
for (const item of items) {
|
|
92
|
+
console.log(` ${item.ruleId} (${item.severity}, ${(item.confidence * 100).toFixed(0)}% conf)`);
|
|
93
|
+
}
|
|
94
|
+
console.log();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=review-risk-matrix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-risk-matrix.js","sourceRoot":"","sources":["../../src/commands/review-risk-matrix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-stale-finding-clean.d.ts","sourceRoot":"","sources":["../../src/commands/review-stale-finding-clean.ts"],"names":[],"mappings":"AAmCA,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6E/D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
function findStale(current, baseline) {
|
|
4
|
+
const currentRules = new Set(current.map((f) => f.ruleId));
|
|
5
|
+
const baselineRules = new Set(baseline.map((f) => f.ruleId));
|
|
6
|
+
const resolved = baseline
|
|
7
|
+
.filter((f) => !currentRules.has(f.ruleId))
|
|
8
|
+
.map((f) => ({ ruleId: f.ruleId, severity: f.severity, title: f.title }));
|
|
9
|
+
const persisting = current
|
|
10
|
+
.filter((f) => baselineRules.has(f.ruleId))
|
|
11
|
+
.map((f) => ({ ruleId: f.ruleId, severity: f.severity, title: f.title }));
|
|
12
|
+
const newFindings = current
|
|
13
|
+
.filter((f) => !baselineRules.has(f.ruleId))
|
|
14
|
+
.map((f) => ({ ruleId: f.ruleId, severity: f.severity, title: f.title }));
|
|
15
|
+
return { resolved, persisting, newFindings };
|
|
16
|
+
}
|
|
17
|
+
export function runReviewStaleFindingClean(argv) {
|
|
18
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
19
|
+
console.log(`Usage: judges review-stale-finding-clean [options]
|
|
20
|
+
|
|
21
|
+
Clean up stale findings by comparing against baseline.
|
|
22
|
+
|
|
23
|
+
Options:
|
|
24
|
+
--current <path> Path to current verdict JSON
|
|
25
|
+
--baseline <path> Path to baseline verdict JSON
|
|
26
|
+
--export <path> Export resolved findings to file
|
|
27
|
+
--format <fmt> Output format: table (default) or json
|
|
28
|
+
-h, --help Show this help message`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const formatIdx = argv.indexOf("--format");
|
|
32
|
+
const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
|
|
33
|
+
const currentIdx = argv.indexOf("--current");
|
|
34
|
+
const currentPath = currentIdx !== -1 && argv[currentIdx + 1]
|
|
35
|
+
? join(process.cwd(), argv[currentIdx + 1])
|
|
36
|
+
: join(process.cwd(), ".judges", "last-verdict.json");
|
|
37
|
+
const baselineIdx = argv.indexOf("--baseline");
|
|
38
|
+
const baselinePath = baselineIdx !== -1 && argv[baselineIdx + 1]
|
|
39
|
+
? join(process.cwd(), argv[baselineIdx + 1])
|
|
40
|
+
: join(process.cwd(), ".judges", "baseline-verdict.json");
|
|
41
|
+
if (!existsSync(currentPath)) {
|
|
42
|
+
console.log(`Current verdict not found: ${currentPath}`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (!existsSync(baselinePath)) {
|
|
46
|
+
console.log(`Baseline verdict not found: ${baselinePath}`);
|
|
47
|
+
console.log("Provide --baseline or place baseline at .judges/baseline-verdict.json");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const currentData = JSON.parse(readFileSync(currentPath, "utf-8"));
|
|
51
|
+
const baselineData = JSON.parse(readFileSync(baselinePath, "utf-8"));
|
|
52
|
+
const result = findStale(currentData.findings ?? [], baselineData.findings ?? []);
|
|
53
|
+
const exportIdx = argv.indexOf("--export");
|
|
54
|
+
if (exportIdx !== -1 && argv[exportIdx + 1]) {
|
|
55
|
+
const exportPath = join(process.cwd(), argv[exportIdx + 1]);
|
|
56
|
+
writeFileSync(exportPath, JSON.stringify(result, null, 2));
|
|
57
|
+
console.log(`Stale finding report exported to: ${exportPath}`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (format === "json") {
|
|
61
|
+
console.log(JSON.stringify(result, null, 2));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
console.log("\n=== Stale Finding Cleanup ===\n");
|
|
65
|
+
console.log(`Resolved: ${result.resolved.length}`);
|
|
66
|
+
console.log(`Persisting: ${result.persisting.length}`);
|
|
67
|
+
console.log(`New: ${result.newFindings.length}\n`);
|
|
68
|
+
if (result.resolved.length > 0) {
|
|
69
|
+
console.log("Resolved (can be archived):");
|
|
70
|
+
for (const f of result.resolved) {
|
|
71
|
+
console.log(` ✓ ${f.ruleId} (${f.severity}): ${f.title}`);
|
|
72
|
+
}
|
|
73
|
+
console.log();
|
|
74
|
+
}
|
|
75
|
+
if (result.newFindings.length > 0) {
|
|
76
|
+
console.log("New findings:");
|
|
77
|
+
for (const f of result.newFindings) {
|
|
78
|
+
console.log(` ★ ${f.ruleId} (${f.severity}): ${f.title}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=review-stale-finding-clean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-stale-finding-clean.js","sourceRoot":"","sources":["../../src/commands/review-stale-finding-clean.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-team-analytics.d.ts","sourceRoot":"","sources":["../../src/commands/review-team-analytics.ts"],"names":[],"mappings":"AA4DA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsE3D"}
|