@kevinrabun/judges 3.92.0 → 3.94.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +126 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-code-context.d.ts +5 -0
  6. package/dist/commands/finding-code-context.d.ts.map +1 -0
  7. package/dist/commands/finding-code-context.js +97 -0
  8. package/dist/commands/finding-code-context.js.map +1 -0
  9. package/dist/commands/finding-explain.d.ts +5 -0
  10. package/dist/commands/finding-explain.d.ts.map +1 -0
  11. package/dist/commands/finding-explain.js +94 -0
  12. package/dist/commands/finding-explain.js.map +1 -0
  13. package/dist/commands/finding-filter-view.d.ts +5 -0
  14. package/dist/commands/finding-filter-view.d.ts.map +1 -0
  15. package/dist/commands/finding-filter-view.js +108 -0
  16. package/dist/commands/finding-filter-view.js.map +1 -0
  17. package/dist/commands/finding-fix-suggest.d.ts +5 -0
  18. package/dist/commands/finding-fix-suggest.d.ts.map +1 -0
  19. package/dist/commands/finding-fix-suggest.js +89 -0
  20. package/dist/commands/finding-fix-suggest.js.map +1 -0
  21. package/dist/commands/finding-link-graph.d.ts +5 -0
  22. package/dist/commands/finding-link-graph.d.ts.map +1 -0
  23. package/dist/commands/finding-link-graph.js +145 -0
  24. package/dist/commands/finding-link-graph.js.map +1 -0
  25. package/dist/commands/finding-ownership-map.d.ts +5 -0
  26. package/dist/commands/finding-ownership-map.d.ts.map +1 -0
  27. package/dist/commands/finding-ownership-map.js +118 -0
  28. package/dist/commands/finding-ownership-map.js.map +1 -0
  29. package/dist/commands/finding-resolution-track.d.ts +5 -0
  30. package/dist/commands/finding-resolution-track.d.ts.map +1 -0
  31. package/dist/commands/finding-resolution-track.js +151 -0
  32. package/dist/commands/finding-resolution-track.js.map +1 -0
  33. package/dist/commands/review-audit-trail.d.ts +5 -0
  34. package/dist/commands/review-audit-trail.d.ts.map +1 -0
  35. package/dist/commands/review-audit-trail.js +97 -0
  36. package/dist/commands/review-audit-trail.js.map +1 -0
  37. package/dist/commands/review-compliance-report.d.ts +5 -0
  38. package/dist/commands/review-compliance-report.d.ts.map +1 -0
  39. package/dist/commands/review-compliance-report.js +128 -0
  40. package/dist/commands/review-compliance-report.js.map +1 -0
  41. package/dist/commands/review-config-template.d.ts +5 -0
  42. package/dist/commands/review-config-template.d.ts.map +1 -0
  43. package/dist/commands/review-config-template.js +113 -0
  44. package/dist/commands/review-config-template.js.map +1 -0
  45. package/dist/commands/review-ide-sync.d.ts +5 -0
  46. package/dist/commands/review-ide-sync.d.ts.map +1 -0
  47. package/dist/commands/review-ide-sync.js +92 -0
  48. package/dist/commands/review-ide-sync.js.map +1 -0
  49. package/dist/commands/review-interactive.d.ts +5 -0
  50. package/dist/commands/review-interactive.d.ts.map +1 -0
  51. package/dist/commands/review-interactive.js +86 -0
  52. package/dist/commands/review-interactive.js.map +1 -0
  53. package/dist/commands/review-onboard-checklist.d.ts +5 -0
  54. package/dist/commands/review-onboard-checklist.d.ts.map +1 -0
  55. package/dist/commands/review-onboard-checklist.js +120 -0
  56. package/dist/commands/review-onboard-checklist.js.map +1 -0
  57. package/dist/commands/review-progress-track.d.ts +5 -0
  58. package/dist/commands/review-progress-track.d.ts.map +1 -0
  59. package/dist/commands/review-progress-track.js +95 -0
  60. package/dist/commands/review-progress-track.js.map +1 -0
  61. package/dist/commands/review-quickstart.d.ts +5 -0
  62. package/dist/commands/review-quickstart.d.ts.map +1 -0
  63. package/dist/commands/review-quickstart.js +108 -0
  64. package/dist/commands/review-quickstart.js.map +1 -0
  65. package/dist/commands/review-report-schedule.d.ts +5 -0
  66. package/dist/commands/review-report-schedule.d.ts.map +1 -0
  67. package/dist/commands/review-report-schedule.js +97 -0
  68. package/dist/commands/review-report-schedule.js.map +1 -0
  69. package/dist/commands/review-slack-format.d.ts +5 -0
  70. package/dist/commands/review-slack-format.d.ts.map +1 -0
  71. package/dist/commands/review-slack-format.js +114 -0
  72. package/dist/commands/review-slack-format.js.map +1 -0
  73. package/dist/commands/review-tenant-config.d.ts +5 -0
  74. package/dist/commands/review-tenant-config.d.ts.map +1 -0
  75. package/dist/commands/review-tenant-config.js +117 -0
  76. package/dist/commands/review-tenant-config.js.map +1 -0
  77. package/package.json +1 -1
  78. package/server.json +2 -2
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-code-context — Show surrounding code context for each finding.
3
+ */
4
+ export declare function runFindingCodeContext(argv: string[]): void;
5
+ //# sourceMappingURL=finding-code-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-code-context.d.ts","sourceRoot":"","sources":["../../src/commands/finding-code-context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuCH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkF1D"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Finding-code-context — Show surrounding code context for each finding.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ function extractContext(sourceFile, lineNumbers, contextLines) {
6
+ if (!existsSync(sourceFile)) {
7
+ return [`(source file not found: ${sourceFile})`];
8
+ }
9
+ const allLines = readFileSync(sourceFile, "utf-8").split("\n");
10
+ const result = [];
11
+ for (const ln of lineNumbers) {
12
+ const start = Math.max(0, ln - contextLines - 1);
13
+ const end = Math.min(allLines.length, ln + contextLines);
14
+ result.push(`--- Line ${ln} ---`);
15
+ for (let i = start; i < end; i++) {
16
+ const marker = i === ln - 1 ? ">>>" : " ";
17
+ result.push(`${marker} ${String(i + 1).padStart(4)}: ${allLines[i]}`);
18
+ }
19
+ }
20
+ return result;
21
+ }
22
+ // ─── CLI ────────────────────────────────────────────────────────────────────
23
+ export function runFindingCodeContext(argv) {
24
+ const fileIdx = argv.indexOf("--file");
25
+ const sourceIdx = argv.indexOf("--source");
26
+ const linesIdx = argv.indexOf("--context-lines");
27
+ const formatIdx = argv.indexOf("--format");
28
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
29
+ const sourceFile = sourceIdx >= 0 ? argv[sourceIdx + 1] : undefined;
30
+ const contextLines = linesIdx >= 0 ? parseInt(argv[linesIdx + 1], 10) : 3;
31
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
32
+ if (argv.includes("--help") || argv.includes("-h")) {
33
+ console.log(`
34
+ judges finding-code-context — Show code context for findings
35
+
36
+ Usage:
37
+ judges finding-code-context --file <review.json> --source <file>
38
+ [--context-lines <n>] [--format table|json]
39
+
40
+ Options:
41
+ --file <path> Review result JSON file
42
+ --source <file> Original source code file
43
+ --context-lines <n> Lines of context around finding (default: 3)
44
+ --format <fmt> Output format: table (default), json
45
+ --help, -h Show this help
46
+ `);
47
+ return;
48
+ }
49
+ if (!filePath) {
50
+ console.error("Error: --file is required");
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ if (!existsSync(filePath)) {
55
+ console.error(`Error: file not found: ${filePath}`);
56
+ process.exitCode = 1;
57
+ return;
58
+ }
59
+ let verdict;
60
+ try {
61
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
62
+ }
63
+ catch {
64
+ console.error(`Error: failed to parse review file: ${filePath}`);
65
+ process.exitCode = 1;
66
+ return;
67
+ }
68
+ const findings = verdict.findings.filter((f) => f.lineNumbers !== undefined && f.lineNumbers.length > 0);
69
+ const result = findings.map((f) => ({
70
+ ruleId: f.ruleId,
71
+ severity: f.severity,
72
+ title: f.title,
73
+ lineNumbers: f.lineNumbers !== undefined ? f.lineNumbers : [],
74
+ context: sourceFile
75
+ ? extractContext(sourceFile, f.lineNumbers !== undefined ? f.lineNumbers : [], contextLines)
76
+ : ["(no --source provided)"],
77
+ recommendation: f.recommendation,
78
+ }));
79
+ if (format === "json") {
80
+ console.log(JSON.stringify(result, null, 2));
81
+ return;
82
+ }
83
+ console.log(`\nCode Context: ${result.length} finding(s) with line references`);
84
+ console.log("═".repeat(70));
85
+ for (const item of result) {
86
+ console.log(`\n── ${item.ruleId} [${item.severity}] ──`);
87
+ console.log(` ${item.title}`);
88
+ if (item.context.length > 0) {
89
+ for (const line of item.context) {
90
+ console.log(` ${line}`);
91
+ }
92
+ }
93
+ console.log(` Fix: ${item.recommendation}`);
94
+ }
95
+ console.log("\n" + "═".repeat(70));
96
+ }
97
+ //# sourceMappingURL=finding-code-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-code-context.js","sourceRoot":"","sources":["../../src/commands/finding-code-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-explain — Explain findings in natural language with context and examples.
3
+ */
4
+ export declare function runFindingExplain(argv: string[]): void;
5
+ //# sourceMappingURL=finding-explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-explain.d.ts","sourceRoot":"","sources":["../../src/commands/finding-explain.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+CH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuEtD"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Finding-explain — Explain findings in natural language with context and examples.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ import { defaultRegistry } from "../judge-registry.js";
6
+ function explainFinding(f) {
7
+ const judges = defaultRegistry.getJudges();
8
+ const prefix = f.ruleId.split("-")[0];
9
+ const judge = judges.find((j) => j.rulePrefix === prefix);
10
+ const domain = judge !== undefined ? judge.domain : "general";
11
+ const impactMap = {
12
+ critical: "Immediate risk — can lead to security breach, data loss, or system failure",
13
+ high: "Significant risk — may cause serious issues if left unaddressed",
14
+ medium: "Moderate concern — should be addressed in normal development cycle",
15
+ low: "Minor concern — consider fixing during refactoring",
16
+ info: "Informational — awareness item with no immediate risk",
17
+ };
18
+ return {
19
+ ruleId: f.ruleId,
20
+ severity: f.severity,
21
+ title: f.title,
22
+ why: f.description,
23
+ impact: impactMap[f.severity] !== undefined ? impactMap[f.severity] : "Unknown impact level",
24
+ howToFix: f.recommendation,
25
+ example: f.suggestedFix !== undefined ? f.suggestedFix : "No code example available — see recommendation above.",
26
+ judgeDomain: domain,
27
+ };
28
+ }
29
+ // ─── CLI ────────────────────────────────────────────────────────────────────
30
+ export function runFindingExplain(argv) {
31
+ const fileIdx = argv.indexOf("--file");
32
+ const ruleIdx = argv.indexOf("--rule");
33
+ const formatIdx = argv.indexOf("--format");
34
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
35
+ const ruleFilter = ruleIdx >= 0 ? argv[ruleIdx + 1] : undefined;
36
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
37
+ if (argv.includes("--help") || argv.includes("-h")) {
38
+ console.log(`
39
+ judges finding-explain — Explain findings in detail
40
+
41
+ Usage:
42
+ judges finding-explain --file <review.json> [--rule <ruleId>]
43
+ [--format table|json]
44
+
45
+ Options:
46
+ --file <path> Review result JSON file
47
+ --rule <id> Filter to specific rule ID
48
+ --format <fmt> Output format: table (default), json
49
+ --help, -h Show this help
50
+ `);
51
+ return;
52
+ }
53
+ if (!filePath) {
54
+ console.error("Error: --file is required");
55
+ process.exitCode = 1;
56
+ return;
57
+ }
58
+ if (!existsSync(filePath)) {
59
+ console.error(`Error: file not found: ${filePath}`);
60
+ process.exitCode = 1;
61
+ return;
62
+ }
63
+ let verdict;
64
+ try {
65
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
66
+ }
67
+ catch {
68
+ console.error(`Error: failed to parse review file: ${filePath}`);
69
+ process.exitCode = 1;
70
+ return;
71
+ }
72
+ let findings = verdict.findings;
73
+ if (ruleFilter) {
74
+ findings = findings.filter((f) => f.ruleId === ruleFilter);
75
+ }
76
+ const explanations = findings.map((f) => explainFinding(f));
77
+ if (format === "json") {
78
+ console.log(JSON.stringify(explanations, null, 2));
79
+ return;
80
+ }
81
+ console.log(`\nFinding Explanations: ${explanations.length} finding(s)`);
82
+ console.log("═".repeat(65));
83
+ for (const exp of explanations) {
84
+ console.log(`\n── ${exp.ruleId} [${exp.severity}] ──`);
85
+ console.log(` Title: ${exp.title}`);
86
+ console.log(` Domain: ${exp.judgeDomain}`);
87
+ console.log(` Why: ${exp.why}`);
88
+ console.log(` Impact: ${exp.impact}`);
89
+ console.log(` Fix: ${exp.howToFix}`);
90
+ console.log(` Example: ${exp.example}`);
91
+ }
92
+ console.log("\n" + "═".repeat(65));
93
+ }
94
+ //# sourceMappingURL=finding-explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-explain.js","sourceRoot":"","sources":["../../src/commands/finding-explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-filter-view — Filter and view findings by multiple criteria.
3
+ */
4
+ export declare function runFindingFilterView(argv: string[]): void;
5
+ //# sourceMappingURL=finding-filter-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-filter-view.d.ts","sourceRoot":"","sources":["../../src/commands/finding-filter-view.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkHzD"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Finding-filter-view — Filter and view findings by multiple criteria.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingFilterView(argv) {
7
+ const fileIdx = argv.indexOf("--file");
8
+ const severityIdx = argv.indexOf("--severity");
9
+ const ruleIdx = argv.indexOf("--rule");
10
+ const minConfIdx = argv.indexOf("--min-confidence");
11
+ const lineIdx = argv.indexOf("--line-range");
12
+ const formatIdx = argv.indexOf("--format");
13
+ const limitIdx = argv.indexOf("--limit");
14
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
15
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
16
+ if (argv.includes("--help") || argv.includes("-h")) {
17
+ console.log(`
18
+ judges finding-filter-view — Filter findings by multiple criteria
19
+
20
+ Usage:
21
+ judges finding-filter-view --file <review.json> [options]
22
+
23
+ Options:
24
+ --file <path> Review result JSON file
25
+ --severity <level> Filter by severity (critical, high, medium, low, info)
26
+ --rule <prefix> Filter by rule ID prefix
27
+ --min-confidence <n> Minimum confidence (0.0-1.0)
28
+ --line-range <s-e> Filter by line range (e.g., 10-50)
29
+ --limit <n> Maximum findings to show
30
+ --format <fmt> Output format: table (default), json
31
+ --help, -h Show this help
32
+ `);
33
+ return;
34
+ }
35
+ if (!filePath) {
36
+ console.error("Error: --file is required");
37
+ process.exitCode = 1;
38
+ return;
39
+ }
40
+ if (!existsSync(filePath)) {
41
+ console.error(`Error: file not found: ${filePath}`);
42
+ process.exitCode = 1;
43
+ return;
44
+ }
45
+ let verdict;
46
+ try {
47
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
48
+ }
49
+ catch {
50
+ console.error(`Error: failed to parse review file: ${filePath}`);
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ let findings = [...verdict.findings];
55
+ // Apply severity filter
56
+ if (severityIdx >= 0) {
57
+ const sev = argv[severityIdx + 1];
58
+ findings = findings.filter((f) => f.severity === sev);
59
+ }
60
+ // Apply rule prefix filter
61
+ if (ruleIdx >= 0) {
62
+ const prefix = argv[ruleIdx + 1];
63
+ findings = findings.filter((f) => f.ruleId.startsWith(prefix));
64
+ }
65
+ // Apply min confidence filter
66
+ if (minConfIdx >= 0) {
67
+ const minConf = parseFloat(argv[minConfIdx + 1]);
68
+ findings = findings.filter((f) => f.confidence !== undefined && f.confidence >= minConf);
69
+ }
70
+ // Apply line range filter
71
+ if (lineIdx >= 0) {
72
+ const rangeStr = argv[lineIdx + 1];
73
+ const parts = rangeStr.split("-");
74
+ if (parts.length === 2) {
75
+ const start = parseInt(parts[0], 10);
76
+ const end = parseInt(parts[1], 10);
77
+ findings = findings.filter((f) => {
78
+ if (f.lineNumbers === undefined || f.lineNumbers.length === 0)
79
+ return false;
80
+ return f.lineNumbers.some((ln) => ln >= start && ln <= end);
81
+ });
82
+ }
83
+ }
84
+ // Apply limit
85
+ if (limitIdx >= 0) {
86
+ const limit = parseInt(argv[limitIdx + 1], 10);
87
+ findings = findings.slice(0, limit);
88
+ }
89
+ if (format === "json") {
90
+ console.log(JSON.stringify({ total: findings.length, findings }, null, 2));
91
+ return;
92
+ }
93
+ console.log(`\nFiltered Findings: ${findings.length} of ${verdict.findings.length}`);
94
+ console.log("═".repeat(70));
95
+ if (findings.length === 0) {
96
+ console.log(" No findings match the current filters.");
97
+ console.log("═".repeat(70));
98
+ return;
99
+ }
100
+ for (const f of findings) {
101
+ const conf = f.confidence !== undefined ? ` (${(f.confidence * 100).toFixed(0)}%)` : "";
102
+ const lines = f.lineNumbers !== undefined && f.lineNumbers.length > 0 ? ` L${f.lineNumbers.join(",")}` : "";
103
+ console.log(` [${f.severity.toUpperCase().padEnd(8)}] ${f.ruleId}${lines}${conf}`);
104
+ console.log(` ${f.title}`);
105
+ }
106
+ console.log("═".repeat(70));
107
+ }
108
+ //# sourceMappingURL=finding-filter-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-filter-view.js","sourceRoot":"","sources":["../../src/commands/finding-filter-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-fix-suggest — Suggest fixes based on finding patterns.
3
+ */
4
+ export declare function runFindingFixSuggest(argv: string[]): void;
5
+ //# sourceMappingURL=finding-fix-suggest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-fix-suggest.d.ts","sourceRoot":"","sources":["../../src/commands/finding-fix-suggest.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyCH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoEzD"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Finding-fix-suggest — Suggest fixes based on finding patterns.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Analysis ───────────────────────────────────────────────────────────────
6
+ function suggestFixes(verdict) {
7
+ return verdict.findings.map((f) => {
8
+ let suggestion = f.recommendation;
9
+ if (f.patch !== undefined && f.patch !== null) {
10
+ suggestion = `Apply patch: ${String(f.patch).slice(0, 100)}${String(f.patch).length > 100 ? "…" : ""}`;
11
+ }
12
+ else if (f.suggestedFix) {
13
+ suggestion = f.suggestedFix;
14
+ }
15
+ return {
16
+ ruleId: f.ruleId,
17
+ title: f.title,
18
+ severity: (f.severity || "medium").toLowerCase(),
19
+ hasPatch: f.patch !== undefined && f.patch !== null,
20
+ suggestion,
21
+ lineNumbers: f.lineNumbers || [],
22
+ };
23
+ });
24
+ }
25
+ // ─── CLI ────────────────────────────────────────────────────────────────────
26
+ export function runFindingFixSuggest(argv) {
27
+ const fileIdx = argv.indexOf("--file");
28
+ const formatIdx = argv.indexOf("--format");
29
+ const sevIdx = argv.indexOf("--severity");
30
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
31
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
32
+ const sevFilter = sevIdx >= 0 ? argv[sevIdx + 1] : undefined;
33
+ if (argv.includes("--help") || argv.includes("-h")) {
34
+ console.log(`
35
+ judges finding-fix-suggest — Suggest fixes for findings
36
+
37
+ Usage:
38
+ judges finding-fix-suggest --file <verdict.json> [--severity <level>]
39
+ [--format table|json]
40
+
41
+ Options:
42
+ --file <path> Path to verdict JSON file (required)
43
+ --severity <level> Filter by severity level
44
+ --format <fmt> Output format: table (default), json
45
+ --help, -h Show this help
46
+ `);
47
+ return;
48
+ }
49
+ if (!filePath) {
50
+ console.error("Error: --file required");
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ if (!existsSync(filePath)) {
55
+ console.error(`Error: not found: ${filePath}`);
56
+ process.exitCode = 1;
57
+ return;
58
+ }
59
+ let verdict;
60
+ try {
61
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
62
+ }
63
+ catch {
64
+ console.error("Error: invalid JSON");
65
+ process.exitCode = 1;
66
+ return;
67
+ }
68
+ let suggestions = suggestFixes(verdict);
69
+ if (sevFilter) {
70
+ suggestions = suggestions.filter((s) => s.severity === sevFilter.toLowerCase());
71
+ }
72
+ if (format === "json") {
73
+ console.log(JSON.stringify(suggestions, null, 2));
74
+ return;
75
+ }
76
+ console.log(`\nFix Suggestions (${suggestions.length})`);
77
+ console.log("═".repeat(75));
78
+ for (const s of suggestions) {
79
+ const lines = s.lineNumbers.length > 0 ? `L${s.lineNumbers[0]}` : "—";
80
+ const patch = s.hasPatch ? " [has patch]" : "";
81
+ console.log(` [${s.severity.toUpperCase()}] ${s.ruleId} at ${lines}${patch}`);
82
+ console.log(` ${s.title}`);
83
+ const suggDisplay = s.suggestion.length > 70 ? s.suggestion.slice(0, 70) + "…" : s.suggestion;
84
+ console.log(` → ${suggDisplay}`);
85
+ console.log("");
86
+ }
87
+ console.log("═".repeat(75));
88
+ }
89
+ //# sourceMappingURL=finding-fix-suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-fix-suggest.js","sourceRoot":"","sources":["../../src/commands/finding-fix-suggest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-link-graph — Build a graph of related findings by rule co-occurrence.
3
+ */
4
+ export declare function runFindingLinkGraph(argv: string[]): void;
5
+ //# sourceMappingURL=finding-link-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-link-graph.d.ts","sourceRoot":"","sources":["../../src/commands/finding-link-graph.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgHH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmExD"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Finding-link-graph — Build a graph of related findings by rule co-occurrence.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Analysis ───────────────────────────────────────────────────────────────
6
+ function buildGraph(verdict) {
7
+ const nodes = new Map();
8
+ const edges = [];
9
+ // Build nodes
10
+ for (const f of verdict.findings) {
11
+ if (!nodes.has(f.ruleId)) {
12
+ nodes.set(f.ruleId, {
13
+ ruleId: f.ruleId,
14
+ title: f.title,
15
+ severity: (f.severity || "medium").toLowerCase(),
16
+ connections: 0,
17
+ });
18
+ }
19
+ }
20
+ // Build edges based on proximity
21
+ const findings = verdict.findings;
22
+ for (let i = 0; i < findings.length; i++) {
23
+ for (let j = i + 1; j < findings.length; j++) {
24
+ const a = findings[i];
25
+ const b = findings[j];
26
+ if (a.ruleId === b.ruleId)
27
+ continue;
28
+ const aLines = a.lineNumbers || [];
29
+ const bLines = b.lineNumbers || [];
30
+ if (aLines.length > 0 && bLines.length > 0) {
31
+ const minDist = Math.min(...aLines.flatMap((al) => bLines.map((bl) => Math.abs(al - bl))));
32
+ if (minDist <= 10) {
33
+ const existingEdge = edges.find((e) => (e.from === a.ruleId && e.to === b.ruleId) || (e.from === b.ruleId && e.to === a.ruleId));
34
+ if (existingEdge) {
35
+ existingEdge.weight++;
36
+ }
37
+ else {
38
+ edges.push({
39
+ from: a.ruleId,
40
+ to: b.ruleId,
41
+ weight: 1,
42
+ relationship: minDist <= 3 ? "adjacent" : "nearby",
43
+ });
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
49
+ // Update connection counts
50
+ for (const e of edges) {
51
+ const fromNode = nodes.get(e.from);
52
+ const toNode = nodes.get(e.to);
53
+ if (fromNode)
54
+ fromNode.connections++;
55
+ if (toNode)
56
+ toNode.connections++;
57
+ }
58
+ // Simple clustering by connected components
59
+ const clusters = [];
60
+ const visited = new Set();
61
+ for (const nodeId of nodes.keys()) {
62
+ if (visited.has(nodeId))
63
+ continue;
64
+ const cluster = [];
65
+ const stack = [nodeId];
66
+ while (stack.length > 0) {
67
+ const current = stack.pop();
68
+ if (visited.has(current))
69
+ continue;
70
+ visited.add(current);
71
+ cluster.push(current);
72
+ for (const e of edges) {
73
+ if (e.from === current && !visited.has(e.to))
74
+ stack.push(e.to);
75
+ if (e.to === current && !visited.has(e.from))
76
+ stack.push(e.from);
77
+ }
78
+ }
79
+ clusters.push(cluster);
80
+ }
81
+ return { nodes: [...nodes.values()], edges, clusters };
82
+ }
83
+ // ─── CLI ────────────────────────────────────────────────────────────────────
84
+ export function runFindingLinkGraph(argv) {
85
+ const fileIdx = argv.indexOf("--file");
86
+ const formatIdx = argv.indexOf("--format");
87
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
88
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
89
+ if (argv.includes("--help") || argv.includes("-h")) {
90
+ console.log(`
91
+ judges finding-link-graph — Build finding relationship graph
92
+
93
+ Usage:
94
+ judges finding-link-graph --file <verdict.json> [--format table|json]
95
+
96
+ Options:
97
+ --file <path> Path to verdict JSON file (required)
98
+ --format <fmt> Output format: table (default), json
99
+ --help, -h Show this help
100
+ `);
101
+ return;
102
+ }
103
+ if (!filePath) {
104
+ console.error("Error: --file required");
105
+ process.exitCode = 1;
106
+ return;
107
+ }
108
+ if (!existsSync(filePath)) {
109
+ console.error(`Error: not found: ${filePath}`);
110
+ process.exitCode = 1;
111
+ return;
112
+ }
113
+ let verdict;
114
+ try {
115
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
116
+ }
117
+ catch {
118
+ console.error("Error: invalid JSON");
119
+ process.exitCode = 1;
120
+ return;
121
+ }
122
+ const graph = buildGraph(verdict);
123
+ if (format === "json") {
124
+ console.log(JSON.stringify(graph, null, 2));
125
+ return;
126
+ }
127
+ console.log(`\nFinding Link Graph`);
128
+ console.log("═".repeat(65));
129
+ console.log(` Nodes: ${graph.nodes.length} | Edges: ${graph.edges.length} | Clusters: ${graph.clusters.length}`);
130
+ console.log("─".repeat(65));
131
+ if (graph.edges.length > 0) {
132
+ console.log(`\n Connections:`);
133
+ for (const e of graph.edges.slice(0, 15)) {
134
+ console.log(` ${e.from} ─[${e.relationship}]─ ${e.to} (weight: ${e.weight})`);
135
+ }
136
+ }
137
+ if (graph.clusters.length > 0) {
138
+ console.log(`\n Clusters:`);
139
+ for (let i = 0; i < Math.min(graph.clusters.length, 10); i++) {
140
+ console.log(` ${i + 1}. ${graph.clusters[i].join(", ")}`);
141
+ }
142
+ }
143
+ console.log("═".repeat(65));
144
+ }
145
+ //# sourceMappingURL=finding-link-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-link-graph.js","sourceRoot":"","sources":["../../src/commands/finding-link-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-ownership-map — Map findings to code owners.
3
+ */
4
+ export declare function runFindingOwnershipMap(argv: string[]): void;
5
+ //# sourceMappingURL=finding-ownership-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-ownership-map.d.ts","sourceRoot":"","sources":["../../src/commands/finding-ownership-map.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8EH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkE3D"}