@kevinrabun/judges 3.93.0 → 3.95.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-correlation-map.d.ts +5 -0
  10. package/dist/commands/finding-correlation-map.d.ts.map +1 -0
  11. package/dist/commands/finding-correlation-map.js +102 -0
  12. package/dist/commands/finding-correlation-map.js.map +1 -0
  13. package/dist/commands/finding-dedup-cross.d.ts +5 -0
  14. package/dist/commands/finding-dedup-cross.d.ts.map +1 -0
  15. package/dist/commands/finding-dedup-cross.js +91 -0
  16. package/dist/commands/finding-dedup-cross.js.map +1 -0
  17. package/dist/commands/finding-explain.d.ts +5 -0
  18. package/dist/commands/finding-explain.d.ts.map +1 -0
  19. package/dist/commands/finding-explain.js +94 -0
  20. package/dist/commands/finding-explain.js.map +1 -0
  21. package/dist/commands/finding-filter-view.d.ts +5 -0
  22. package/dist/commands/finding-filter-view.d.ts.map +1 -0
  23. package/dist/commands/finding-filter-view.js +108 -0
  24. package/dist/commands/finding-filter-view.js.map +1 -0
  25. package/dist/commands/finding-groupby-file.d.ts +5 -0
  26. package/dist/commands/finding-groupby-file.d.ts.map +1 -0
  27. package/dist/commands/finding-groupby-file.js +95 -0
  28. package/dist/commands/finding-groupby-file.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-api-export.d.ts +5 -0
  34. package/dist/commands/review-api-export.d.ts.map +1 -0
  35. package/dist/commands/review-api-export.js +99 -0
  36. package/dist/commands/review-api-export.js.map +1 -0
  37. package/dist/commands/review-ide-sync.d.ts +5 -0
  38. package/dist/commands/review-ide-sync.d.ts.map +1 -0
  39. package/dist/commands/review-ide-sync.js +92 -0
  40. package/dist/commands/review-ide-sync.js.map +1 -0
  41. package/dist/commands/review-interactive.d.ts +5 -0
  42. package/dist/commands/review-interactive.d.ts.map +1 -0
  43. package/dist/commands/review-interactive.js +86 -0
  44. package/dist/commands/review-interactive.js.map +1 -0
  45. package/dist/commands/review-merge-request.d.ts +5 -0
  46. package/dist/commands/review-merge-request.d.ts.map +1 -0
  47. package/dist/commands/review-merge-request.js +96 -0
  48. package/dist/commands/review-merge-request.js.map +1 -0
  49. package/dist/commands/review-notification-config.d.ts +5 -0
  50. package/dist/commands/review-notification-config.d.ts.map +1 -0
  51. package/dist/commands/review-notification-config.js +123 -0
  52. package/dist/commands/review-notification-config.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-quickstart.d.ts +5 -0
  58. package/dist/commands/review-quickstart.d.ts.map +1 -0
  59. package/dist/commands/review-quickstart.js +108 -0
  60. package/dist/commands/review-quickstart.js.map +1 -0
  61. package/dist/commands/review-scope-select.d.ts +5 -0
  62. package/dist/commands/review-scope-select.d.ts.map +1 -0
  63. package/dist/commands/review-scope-select.js +99 -0
  64. package/dist/commands/review-scope-select.js.map +1 -0
  65. package/dist/commands/review-summary-dashboard.d.ts +5 -0
  66. package/dist/commands/review-summary-dashboard.d.ts.map +1 -0
  67. package/dist/commands/review-summary-dashboard.js +97 -0
  68. package/dist/commands/review-summary-dashboard.js.map +1 -0
  69. package/dist/commands/review-template-library.d.ts +5 -0
  70. package/dist/commands/review-template-library.d.ts.map +1 -0
  71. package/dist/commands/review-template-library.js +156 -0
  72. package/dist/commands/review-template-library.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-correlation-map — Map correlations between related findings.
3
+ */
4
+ export declare function runFindingCorrelationMap(argv: string[]): void;
5
+ //# sourceMappingURL=finding-correlation-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-correlation-map.d.ts","sourceRoot":"","sources":["../../src/commands/finding-correlation-map.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0DH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqE7D"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Finding-correlation-map — Map correlations between related findings.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Helpers ────────────────────────────────────────────────────────────────
6
+ function findCorrelations(findings) {
7
+ const correlations = [];
8
+ for (let i = 0; i < findings.length; i++) {
9
+ for (let j = i + 1; j < findings.length; j++) {
10
+ const a = findings[i];
11
+ const b = findings[j];
12
+ // Same line overlap
13
+ const aLines = a.lineNumbers !== undefined ? a.lineNumbers : [];
14
+ const bLines = b.lineNumbers !== undefined ? b.lineNumbers : [];
15
+ const shared = aLines.filter((ln) => bLines.includes(ln));
16
+ if (shared.length > 0) {
17
+ correlations.push({
18
+ finding1: { ruleId: a.ruleId, title: a.title },
19
+ finding2: { ruleId: b.ruleId, title: b.title },
20
+ relationship: "co-located",
21
+ sharedLines: shared,
22
+ });
23
+ continue;
24
+ }
25
+ // Same rule prefix (same domain)
26
+ const prefixA = a.ruleId.split("-")[0];
27
+ const prefixB = b.ruleId.split("-")[0];
28
+ if (prefixA === prefixB && a.severity === b.severity) {
29
+ correlations.push({
30
+ finding1: { ruleId: a.ruleId, title: a.title },
31
+ finding2: { ruleId: b.ruleId, title: b.title },
32
+ relationship: "same-domain-same-severity",
33
+ sharedLines: [],
34
+ });
35
+ }
36
+ }
37
+ }
38
+ return correlations;
39
+ }
40
+ // ─── CLI ────────────────────────────────────────────────────────────────────
41
+ export function runFindingCorrelationMap(argv) {
42
+ const fileIdx = argv.indexOf("--file");
43
+ const formatIdx = argv.indexOf("--format");
44
+ const filePath = fileIdx >= 0 ? argv[fileIdx + 1] : undefined;
45
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
46
+ if (argv.includes("--help") || argv.includes("-h")) {
47
+ console.log(`
48
+ judges finding-correlation-map — Map finding correlations
49
+
50
+ Usage:
51
+ judges finding-correlation-map --file <review.json> [--format table|json]
52
+
53
+ Options:
54
+ --file <path> Review result JSON file
55
+ --format <fmt> Output format: table (default), json
56
+ --help, -h Show this help
57
+ `);
58
+ return;
59
+ }
60
+ if (!filePath) {
61
+ console.error("Error: --file is required");
62
+ process.exitCode = 1;
63
+ return;
64
+ }
65
+ if (!existsSync(filePath)) {
66
+ console.error(`Error: file not found: ${filePath}`);
67
+ process.exitCode = 1;
68
+ return;
69
+ }
70
+ let verdict;
71
+ try {
72
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
73
+ }
74
+ catch {
75
+ console.error(`Error: failed to parse review file: ${filePath}`);
76
+ process.exitCode = 1;
77
+ return;
78
+ }
79
+ const correlations = findCorrelations(verdict.findings);
80
+ if (format === "json") {
81
+ console.log(JSON.stringify({ total: correlations.length, correlations }, null, 2));
82
+ return;
83
+ }
84
+ console.log(`\nFinding Correlations: ${correlations.length} relationship(s)`);
85
+ console.log("═".repeat(65));
86
+ if (correlations.length === 0) {
87
+ console.log(" No correlations found between findings.");
88
+ console.log("═".repeat(65));
89
+ return;
90
+ }
91
+ for (const c of correlations) {
92
+ console.log(`\n ${c.finding1.ruleId} ↔ ${c.finding2.ruleId}`);
93
+ console.log(` Relationship: ${c.relationship}`);
94
+ if (c.sharedLines.length > 0) {
95
+ console.log(` Shared lines: ${c.sharedLines.join(", ")}`);
96
+ }
97
+ console.log(` A: ${c.finding1.title}`);
98
+ console.log(` B: ${c.finding2.title}`);
99
+ }
100
+ console.log("\n" + "═".repeat(65));
101
+ }
102
+ //# sourceMappingURL=finding-correlation-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-correlation-map.js","sourceRoot":"","sources":["../../src/commands/finding-correlation-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-dedup-cross — Deduplicate findings across multiple review files.
3
+ */
4
+ export declare function runFindingDedupCross(argv: string[]): void;
5
+ //# sourceMappingURL=finding-dedup-cross.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-dedup-cross.d.ts","sourceRoot":"","sources":["../../src/commands/finding-dedup-cross.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8FzD"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Finding-dedup-cross — Deduplicate findings across multiple review files.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingDedupCross(argv) {
7
+ const filesIdx = argv.indexOf("--files");
8
+ const formatIdx = argv.indexOf("--format");
9
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
10
+ if (argv.includes("--help") || argv.includes("-h")) {
11
+ console.log(`
12
+ judges finding-dedup-cross — Deduplicate findings across reviews
13
+
14
+ Usage:
15
+ judges finding-dedup-cross --files <file1.json> <file2.json> ...
16
+ [--format table|json]
17
+
18
+ Options:
19
+ --files <paths> Review JSON files (space-separated)
20
+ --format <fmt> Output format: table (default), json
21
+ --help, -h Show this help
22
+ `);
23
+ return;
24
+ }
25
+ if (filesIdx < 0) {
26
+ console.error("Error: --files is required");
27
+ process.exitCode = 1;
28
+ return;
29
+ }
30
+ // Collect file paths (everything after --files until next flag)
31
+ const filePaths = [];
32
+ for (let i = filesIdx + 1; i < argv.length; i++) {
33
+ if (argv[i].startsWith("--"))
34
+ break;
35
+ filePaths.push(argv[i]);
36
+ }
37
+ if (filePaths.length === 0) {
38
+ console.error("Error: no files specified after --files");
39
+ process.exitCode = 1;
40
+ return;
41
+ }
42
+ const seen = new Map();
43
+ let totalDuplicates = 0;
44
+ for (const fp of filePaths) {
45
+ if (!existsSync(fp)) {
46
+ console.error(`Warning: file not found, skipping: ${fp}`);
47
+ continue;
48
+ }
49
+ let verdict;
50
+ try {
51
+ verdict = JSON.parse(readFileSync(fp, "utf-8"));
52
+ }
53
+ catch {
54
+ console.error(`Warning: failed to parse, skipping: ${fp}`);
55
+ continue;
56
+ }
57
+ for (const f of verdict.findings) {
58
+ const key = `${f.ruleId}|${f.title}|${f.severity}`;
59
+ const existing = seen.get(key);
60
+ if (existing !== undefined) {
61
+ if (!existing.seenIn.includes(fp)) {
62
+ existing.seenIn.push(fp);
63
+ }
64
+ totalDuplicates++;
65
+ }
66
+ else {
67
+ seen.set(key, { ...f, seenIn: [fp] });
68
+ }
69
+ }
70
+ }
71
+ const result = {
72
+ unique: seen.size,
73
+ duplicates: totalDuplicates,
74
+ findings: [...seen.values()],
75
+ };
76
+ if (format === "json") {
77
+ console.log(JSON.stringify(result, null, 2));
78
+ return;
79
+ }
80
+ console.log(`\nCross-Review Deduplication`);
81
+ console.log(` Files analyzed: ${filePaths.length}`);
82
+ console.log(` Unique findings: ${result.unique}`);
83
+ console.log(` Duplicates removed: ${result.duplicates}`);
84
+ console.log("═".repeat(65));
85
+ for (const f of result.findings) {
86
+ const dupLabel = f.seenIn.length > 1 ? ` (in ${f.seenIn.length} files)` : "";
87
+ console.log(` [${f.severity}] ${f.ruleId}: ${f.title}${dupLabel}`);
88
+ }
89
+ console.log("═".repeat(65));
90
+ }
91
+ //# sourceMappingURL=finding-dedup-cross.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-dedup-cross.js","sourceRoot":"","sources":["../../src/commands/finding-dedup-cross.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-groupby-file — Group findings by source file path.
3
+ */
4
+ export declare function runFindingGroupbyFile(argv: string[]): void;
5
+ //# sourceMappingURL=finding-groupby-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-groupby-file.d.ts","sourceRoot":"","sources":["../../src/commands/finding-groupby-file.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+BH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwF1D"}