@kevinrabun/judges 3.97.0 → 3.99.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-auto-suppress.d.ts +5 -0
  6. package/dist/commands/finding-auto-suppress.d.ts.map +1 -0
  7. package/dist/commands/finding-auto-suppress.js +127 -0
  8. package/dist/commands/finding-auto-suppress.js.map +1 -0
  9. package/dist/commands/finding-cwe-lookup.d.ts +5 -0
  10. package/dist/commands/finding-cwe-lookup.d.ts.map +1 -0
  11. package/dist/commands/finding-cwe-lookup.js +149 -0
  12. package/dist/commands/finding-cwe-lookup.js.map +1 -0
  13. package/dist/commands/finding-dismiss-workflow.d.ts +5 -0
  14. package/dist/commands/finding-dismiss-workflow.d.ts.map +1 -0
  15. package/dist/commands/finding-dismiss-workflow.js +120 -0
  16. package/dist/commands/finding-dismiss-workflow.js.map +1 -0
  17. package/dist/commands/finding-duplicate-detect.d.ts +5 -0
  18. package/dist/commands/finding-duplicate-detect.d.ts.map +1 -0
  19. package/dist/commands/finding-duplicate-detect.js +114 -0
  20. package/dist/commands/finding-duplicate-detect.js.map +1 -0
  21. package/dist/commands/finding-patch-preview.d.ts +5 -0
  22. package/dist/commands/finding-patch-preview.d.ts.map +1 -0
  23. package/dist/commands/finding-patch-preview.js +104 -0
  24. package/dist/commands/finding-patch-preview.js.map +1 -0
  25. package/dist/commands/finding-priority-matrix.d.ts +5 -0
  26. package/dist/commands/finding-priority-matrix.d.ts.map +1 -0
  27. package/dist/commands/finding-priority-matrix.js +103 -0
  28. package/dist/commands/finding-priority-matrix.js.map +1 -0
  29. package/dist/commands/finding-reachability-check.d.ts +5 -0
  30. package/dist/commands/finding-reachability-check.d.ts.map +1 -0
  31. package/dist/commands/finding-reachability-check.js +103 -0
  32. package/dist/commands/finding-reachability-check.js.map +1 -0
  33. package/dist/commands/review-audit-export.d.ts +5 -0
  34. package/dist/commands/review-audit-export.d.ts.map +1 -0
  35. package/dist/commands/review-audit-export.js +94 -0
  36. package/dist/commands/review-audit-export.js.map +1 -0
  37. package/dist/commands/review-cicd-integrate.d.ts +5 -0
  38. package/dist/commands/review-cicd-integrate.d.ts.map +1 -0
  39. package/dist/commands/review-cicd-integrate.js +123 -0
  40. package/dist/commands/review-cicd-integrate.js.map +1 -0
  41. package/dist/commands/review-data-retention.d.ts +5 -0
  42. package/dist/commands/review-data-retention.d.ts.map +1 -0
  43. package/dist/commands/review-data-retention.js +120 -0
  44. package/dist/commands/review-data-retention.js.map +1 -0
  45. package/dist/commands/review-language-profile.d.ts +5 -0
  46. package/dist/commands/review-language-profile.d.ts.map +1 -0
  47. package/dist/commands/review-language-profile.js +73 -0
  48. package/dist/commands/review-language-profile.js.map +1 -0
  49. package/dist/commands/review-org-dashboard.d.ts +5 -0
  50. package/dist/commands/review-org-dashboard.d.ts.map +1 -0
  51. package/dist/commands/review-org-dashboard.js +69 -0
  52. package/dist/commands/review-org-dashboard.js.map +1 -0
  53. package/dist/commands/review-permission-model.d.ts +5 -0
  54. package/dist/commands/review-permission-model.d.ts.map +1 -0
  55. package/dist/commands/review-permission-model.js +150 -0
  56. package/dist/commands/review-permission-model.js.map +1 -0
  57. package/dist/commands/review-pipeline-status.d.ts +5 -0
  58. package/dist/commands/review-pipeline-status.d.ts.map +1 -0
  59. package/dist/commands/review-pipeline-status.js +55 -0
  60. package/dist/commands/review-pipeline-status.js.map +1 -0
  61. package/dist/commands/review-repo-onboard.d.ts +5 -0
  62. package/dist/commands/review-repo-onboard.d.ts.map +1 -0
  63. package/dist/commands/review-repo-onboard.js +115 -0
  64. package/dist/commands/review-repo-onboard.js.map +1 -0
  65. package/dist/commands/review-report-archive.d.ts +5 -0
  66. package/dist/commands/review-report-archive.d.ts.map +1 -0
  67. package/dist/commands/review-report-archive.js +101 -0
  68. package/dist/commands/review-report-archive.js.map +1 -0
  69. package/dist/commands/review-review-comments.d.ts +5 -0
  70. package/dist/commands/review-review-comments.d.ts.map +1 -0
  71. package/dist/commands/review-review-comments.js +85 -0
  72. package/dist/commands/review-review-comments.js.map +1 -0
  73. package/dist/commands/review-sla-config.d.ts +5 -0
  74. package/dist/commands/review-sla-config.d.ts.map +1 -0
  75. package/dist/commands/review-sla-config.js +89 -0
  76. package/dist/commands/review-sla-config.js.map +1 -0
  77. package/package.json +1 -1
  78. package/server.json +2 -2
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Finding-patch-preview — Preview how patches would modify source files.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingPatchPreview(argv) {
7
+ const reportIdx = argv.indexOf("--report");
8
+ const sourceIdx = argv.indexOf("--source");
9
+ const contextIdx = argv.indexOf("--context");
10
+ const formatIdx = argv.indexOf("--format");
11
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
12
+ const contextLines = contextIdx >= 0 ? parseInt(argv[contextIdx + 1], 10) : 3;
13
+ if (argv.includes("--help") || argv.includes("-h")) {
14
+ console.log(`
15
+ judges finding-patch-preview — Preview patch modifications
16
+
17
+ Usage:
18
+ judges finding-patch-preview --report <path> --source <path>
19
+ [--context <n>] [--format table|json]
20
+
21
+ Options:
22
+ --report <path> Report file with findings
23
+ --source <path> Source file to preview patches against
24
+ --context <n> Context lines around changes (default: 3)
25
+ --format <fmt> Output format: table (default), json
26
+ --help, -h Show this help
27
+ `);
28
+ return;
29
+ }
30
+ if (reportIdx < 0 || sourceIdx < 0) {
31
+ console.error("Missing --report <path> and --source <path>");
32
+ process.exitCode = 1;
33
+ return;
34
+ }
35
+ const reportPath = argv[reportIdx + 1];
36
+ const sourcePath = argv[sourceIdx + 1];
37
+ if (!existsSync(reportPath)) {
38
+ console.error(`Report not found: ${reportPath}`);
39
+ process.exitCode = 1;
40
+ return;
41
+ }
42
+ if (!existsSync(sourcePath)) {
43
+ console.error(`Source not found: ${sourcePath}`);
44
+ process.exitCode = 1;
45
+ return;
46
+ }
47
+ const report = JSON.parse(readFileSync(reportPath, "utf-8"));
48
+ const findings = (report.findings ?? []).filter((f) => f.patch !== undefined && f.patch !== null);
49
+ const sourceContent = readFileSync(sourcePath, "utf-8");
50
+ const sourceLines = sourceContent.split("\n");
51
+ if (findings.length === 0) {
52
+ console.log("No findings with patches to preview.");
53
+ return;
54
+ }
55
+ const previews = [];
56
+ for (const f of findings) {
57
+ const patchStr = String(f.patch);
58
+ const patchLines = patchStr.split("\n");
59
+ const firstLine = patchLines[0] ?? "";
60
+ const lineIdx = sourceLines.findIndex((l) => l.includes(firstLine.trim()));
61
+ const applicable = lineIdx >= 0;
62
+ const start = Math.max(0, lineIdx - contextLines);
63
+ const end = Math.min(sourceLines.length - 1, lineIdx + contextLines);
64
+ const affectedLines = [];
65
+ if (applicable) {
66
+ for (let i = start; i <= end; i++) {
67
+ affectedLines.push(i + 1);
68
+ }
69
+ }
70
+ const snippet = applicable
71
+ ? sourceLines
72
+ .slice(start, end + 1)
73
+ .map((l, i) => {
74
+ const lineNum = start + i + 1;
75
+ const marker = lineNum === lineIdx + 1 ? ">" : " ";
76
+ return `${marker} ${String(lineNum).padStart(4)} | ${l}`;
77
+ })
78
+ .join("\n")
79
+ : "(patch target not found in source)";
80
+ previews.push({
81
+ ruleId: f.ruleId,
82
+ title: f.title,
83
+ patchSnippet: snippet,
84
+ applicable,
85
+ affectedLines,
86
+ });
87
+ }
88
+ if (format === "json") {
89
+ console.log(JSON.stringify(previews, null, 2));
90
+ return;
91
+ }
92
+ console.log(`\nPatch Preview — ${sourcePath}`);
93
+ console.log("═".repeat(70));
94
+ for (const p of previews) {
95
+ const status = p.applicable ? "APPLICABLE" : "NOT FOUND";
96
+ console.log(`\n [${status}] ${p.ruleId} — ${p.title}`);
97
+ console.log(" " + "─".repeat(60));
98
+ console.log(p.patchSnippet);
99
+ }
100
+ const applicableCount = previews.filter((p) => p.applicable).length;
101
+ console.log(`\n ${applicableCount}/${previews.length} patches applicable`);
102
+ console.log("═".repeat(70));
103
+ }
104
+ //# sourceMappingURL=finding-patch-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-patch-preview.js","sourceRoot":"","sources":["../../src/commands/finding-patch-preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-priority-matrix — Create a priority matrix (urgency × impact) for findings.
3
+ */
4
+ export declare function runFindingPriorityMatrix(argv: string[]): void;
5
+ //# sourceMappingURL=finding-priority-matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-priority-matrix.d.ts","sourceRoot":"","sources":["../../src/commands/finding-priority-matrix.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmCH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgG7D"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Finding-priority-matrix — Create a priority matrix (urgency × impact) for findings.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── Matrix model ───────────────────────────────────────────────────────────
6
+ const URGENCY = {
7
+ critical: 5,
8
+ high: 4,
9
+ medium: 3,
10
+ low: 2,
11
+ info: 1,
12
+ };
13
+ function classifyPriority(score) {
14
+ if (score >= 20)
15
+ return "P0-Immediate";
16
+ if (score >= 12)
17
+ return "P1-High";
18
+ if (score >= 6)
19
+ return "P2-Medium";
20
+ if (score >= 3)
21
+ return "P3-Low";
22
+ return "P4-Backlog";
23
+ }
24
+ // ─── CLI ────────────────────────────────────────────────────────────────────
25
+ export function runFindingPriorityMatrix(argv) {
26
+ const reportIdx = argv.indexOf("--report");
27
+ const priorityIdx = argv.indexOf("--priority");
28
+ const formatIdx = argv.indexOf("--format");
29
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
30
+ const priorityFilter = priorityIdx >= 0 ? argv[priorityIdx + 1] : "";
31
+ if (argv.includes("--help") || argv.includes("-h")) {
32
+ console.log(`
33
+ judges finding-priority-matrix — Create urgency × impact priority matrix
34
+
35
+ Usage:
36
+ judges finding-priority-matrix --report <path> [--priority <level>]
37
+ [--format table|json]
38
+
39
+ Options:
40
+ --report <path> Report file with findings
41
+ --priority <level> Filter: P0-Immediate, P1-High, P2-Medium, P3-Low, P4-Backlog
42
+ --format <fmt> Output format: table (default), json
43
+ --help, -h Show this help
44
+ `);
45
+ return;
46
+ }
47
+ if (reportIdx < 0) {
48
+ console.error("Missing --report <path>");
49
+ process.exitCode = 1;
50
+ return;
51
+ }
52
+ const reportPath = argv[reportIdx + 1];
53
+ if (!existsSync(reportPath)) {
54
+ console.error(`Report not found: ${reportPath}`);
55
+ process.exitCode = 1;
56
+ return;
57
+ }
58
+ const report = JSON.parse(readFileSync(reportPath, "utf-8"));
59
+ const findings = report.findings ?? [];
60
+ if (findings.length === 0) {
61
+ console.log("No findings to prioritize.");
62
+ return;
63
+ }
64
+ const entries = findings.map((f) => {
65
+ const urgency = URGENCY[f.severity] ?? 1;
66
+ const conf = f.confidence ?? 0.5;
67
+ const impact = Math.round(urgency * conf * 2);
68
+ const score = urgency * impact;
69
+ return {
70
+ ruleId: f.ruleId,
71
+ title: f.title,
72
+ severity: f.severity,
73
+ urgency,
74
+ impact,
75
+ priority: classifyPriority(score),
76
+ score,
77
+ };
78
+ });
79
+ entries.sort((a, b) => b.score - a.score);
80
+ const display = priorityFilter.length > 0 ? entries.filter((e) => e.priority === priorityFilter) : entries;
81
+ if (format === "json") {
82
+ console.log(JSON.stringify(display, null, 2));
83
+ return;
84
+ }
85
+ console.log(`\nPriority Matrix`);
86
+ console.log("═".repeat(80));
87
+ console.log(` ${"Priority".padEnd(15)} ${"Score".padEnd(7)} ${"Urgency".padEnd(9)} ${"Impact".padEnd(8)} ${"Rule".padEnd(22)} Title`);
88
+ console.log(" " + "─".repeat(75));
89
+ for (const e of display) {
90
+ console.log(` ${e.priority.padEnd(15)} ${String(e.score).padEnd(7)} ${String(e.urgency).padEnd(9)} ${String(e.impact).padEnd(8)} ${e.ruleId.padEnd(22)} ${e.title}`);
91
+ }
92
+ // Summary counts
93
+ const counts = {};
94
+ for (const e of entries) {
95
+ counts[e.priority] = (counts[e.priority] ?? 0) + 1;
96
+ }
97
+ console.log(`\n Summary:`);
98
+ for (const [p, c] of Object.entries(counts).sort()) {
99
+ console.log(` ${p.padEnd(15)} ${c} finding(s)`);
100
+ }
101
+ console.log("═".repeat(80));
102
+ }
103
+ //# sourceMappingURL=finding-priority-matrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-priority-matrix.js","sourceRoot":"","sources":["../../src/commands/finding-priority-matrix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Finding-reachability-check — Check if findings affect reachable code paths.
3
+ */
4
+ export declare function runFindingReachabilityCheck(argv: string[]): void;
5
+ //# sourceMappingURL=finding-reachability-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-reachability-check.d.ts","sourceRoot":"","sources":["../../src/commands/finding-reachability-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyGhE"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Finding-reachability-check — Check if findings affect reachable code paths.
3
+ */
4
+ import { readFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runFindingReachabilityCheck(argv) {
7
+ const reportIdx = argv.indexOf("--report");
8
+ const sourceIdx = argv.indexOf("--source");
9
+ const formatIdx = argv.indexOf("--format");
10
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
11
+ if (argv.includes("--help") || argv.includes("-h")) {
12
+ console.log(`
13
+ judges finding-reachability-check — Check finding reachability
14
+
15
+ Usage:
16
+ judges finding-reachability-check --report <path> [--source <path>]
17
+ [--format table|json]
18
+
19
+ Options:
20
+ --report <path> Report file with findings
21
+ --source <path> Source file to check reachability against
22
+ --format <fmt> Output format: table (default), json
23
+ --help, -h Show this help
24
+
25
+ Checks if findings reference code that is reachable in the source.
26
+ `);
27
+ return;
28
+ }
29
+ if (reportIdx < 0) {
30
+ console.error("Missing --report <path>");
31
+ process.exitCode = 1;
32
+ return;
33
+ }
34
+ const reportPath = argv[reportIdx + 1];
35
+ if (!existsSync(reportPath)) {
36
+ console.error(`Report not found: ${reportPath}`);
37
+ process.exitCode = 1;
38
+ return;
39
+ }
40
+ const report = JSON.parse(readFileSync(reportPath, "utf-8"));
41
+ const findings = report.findings ?? [];
42
+ let sourceLines = [];
43
+ if (sourceIdx >= 0) {
44
+ const sourcePath = argv[sourceIdx + 1];
45
+ if (existsSync(sourcePath)) {
46
+ sourceLines = readFileSync(sourcePath, "utf-8").split("\n");
47
+ }
48
+ }
49
+ const results = findings.map((f) => {
50
+ const lines = f.lineNumbers ?? [];
51
+ let reachable = true;
52
+ let reason = "assumed reachable";
53
+ if (sourceLines.length > 0 && lines.length > 0) {
54
+ // Check if the referenced lines exist and are not commented out
55
+ const referencedLine = lines[0] - 1;
56
+ if (referencedLine >= 0 && referencedLine < sourceLines.length) {
57
+ const line = sourceLines[referencedLine].trim();
58
+ if (line.startsWith("//") || line.startsWith("/*") || line.startsWith("#") || line.startsWith("*")) {
59
+ reachable = false;
60
+ reason = "line is commented out";
61
+ }
62
+ else if (line.length === 0) {
63
+ reachable = false;
64
+ reason = "line is empty";
65
+ }
66
+ else {
67
+ reason = "line exists and is active code";
68
+ }
69
+ }
70
+ else {
71
+ reachable = false;
72
+ reason = "line number out of range";
73
+ }
74
+ }
75
+ else if (lines.length === 0) {
76
+ reason = "no line reference — assumed reachable";
77
+ }
78
+ return {
79
+ ruleId: f.ruleId,
80
+ title: f.title,
81
+ severity: f.severity,
82
+ reachable,
83
+ reason,
84
+ lineNumbers: lines,
85
+ };
86
+ });
87
+ if (format === "json") {
88
+ console.log(JSON.stringify(results, null, 2));
89
+ return;
90
+ }
91
+ console.log(`\nReachability Check`);
92
+ console.log("═".repeat(70));
93
+ const reachableCount = results.filter((r) => r.reachable).length;
94
+ const unreachableCount = results.filter((r) => !r.reachable).length;
95
+ for (const r of results) {
96
+ const status = r.reachable ? "REACHABLE" : "UNREACHABLE";
97
+ const lineRef = r.lineNumbers.length > 0 ? `L${r.lineNumbers[0]}` : "N/A";
98
+ console.log(` [${status.padEnd(11)}] ${r.ruleId.padEnd(25)} ${lineRef.padEnd(8)} ${r.reason}`);
99
+ }
100
+ console.log(`\n Reachable: ${reachableCount} | Unreachable: ${unreachableCount} | Total: ${results.length}`);
101
+ console.log("═".repeat(70));
102
+ }
103
+ //# sourceMappingURL=finding-reachability-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-reachability-check.js","sourceRoot":"","sources":["../../src/commands/finding-reachability-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAc9C,+EAA+E;AAE/E,MAAM,UAAU,2BAA2B,CAAC,IAAc;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAE9D,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;CAcf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACzC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAA6B,CAAC;IACzF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IAEvC,IAAI,WAAW,GAAa,EAAE,CAAC;IAC/B,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,WAAW,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAyB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACvD,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;QAClC,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,MAAM,GAAG,mBAAmB,CAAC;QAEjC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,gEAAgE;YAChE,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;gBAC/D,MAAM,IAAI,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC;gBAChD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnG,SAAS,GAAG,KAAK,CAAC;oBAClB,MAAM,GAAG,uBAAuB,CAAC;gBACnC,CAAC;qBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC7B,SAAS,GAAG,KAAK,CAAC;oBAClB,MAAM,GAAG,eAAe,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,gCAAgC,CAAC;gBAC5C,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,KAAK,CAAC;gBAClB,MAAM,GAAG,0BAA0B,CAAC;YACtC,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,uCAAuC,CAAC;QACnD,CAAC;QAED,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,SAAS;YACT,MAAM;YACN,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAEpE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;QACzD,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,cAAc,mBAAmB,gBAAgB,aAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9G,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-audit-export — Export audit data for external compliance tools.
3
+ */
4
+ export declare function runReviewAuditExport(argv: string[]): void;
5
+ //# sourceMappingURL=review-audit-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-audit-export.d.ts","sourceRoot":"","sources":["../../src/commands/review-audit-export.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuBH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiGzD"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Review-audit-export — Export audit data for external compliance tools.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, readdirSync } from "fs";
5
+ import { join } from "path";
6
+ // ─── CLI ────────────────────────────────────────────────────────────────────
7
+ export function runReviewAuditExport(argv) {
8
+ const dirIdx = argv.indexOf("--dir");
9
+ const dir = dirIdx >= 0 ? argv[dirIdx + 1] : ".judges/audit";
10
+ const outIdx = argv.indexOf("--out");
11
+ const exportFormat = argv.indexOf("--export-format");
12
+ const expFmt = exportFormat >= 0 ? argv[exportFormat + 1] : "json";
13
+ const formatIdx = argv.indexOf("--format");
14
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
15
+ if (argv.includes("--help") || argv.includes("-h")) {
16
+ console.log(`
17
+ judges review-audit-export — Export audit data
18
+
19
+ Usage:
20
+ judges review-audit-export [--dir <path>] [--out <path>]
21
+ [--export-format json|csv]
22
+ [--format table|json]
23
+
24
+ Options:
25
+ --dir <path> Audit data directory (default: .judges/audit)
26
+ --out <path> Write export to file
27
+ --export-format <fmt> Export format: json (default), csv
28
+ --format <fmt> Display format: table (default), json
29
+ --help, -h Show this help
30
+ `);
31
+ return;
32
+ }
33
+ if (!existsSync(dir)) {
34
+ console.log(`Audit directory not found: ${dir}`);
35
+ console.log("No audit data to export.");
36
+ return;
37
+ }
38
+ const files = readdirSync(dir).filter((f) => f.endsWith(".json"));
39
+ const records = [];
40
+ for (const file of files) {
41
+ const content = JSON.parse(readFileSync(join(dir, file), "utf-8"));
42
+ if (Array.isArray(content)) {
43
+ records.push(...content);
44
+ }
45
+ else {
46
+ records.push(content);
47
+ }
48
+ }
49
+ records.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
50
+ const byAction = {};
51
+ for (const r of records) {
52
+ byAction[r.action] = (byAction[r.action] ?? 0) + 1;
53
+ }
54
+ const auditExport = {
55
+ exportedAt: new Date().toISOString(),
56
+ records,
57
+ summary: { total: records.length, byAction },
58
+ };
59
+ // Write to file
60
+ if (outIdx >= 0) {
61
+ const outPath = argv[outIdx + 1];
62
+ if (expFmt === "csv") {
63
+ const header = "timestamp,action,actor,detail,source";
64
+ const rows = records.map((r) => `"${r.timestamp}","${r.action}","${r.actor}","${r.detail}","${r.source}"`);
65
+ writeFileSync(outPath, [header, ...rows].join("\n"));
66
+ }
67
+ else {
68
+ writeFileSync(outPath, JSON.stringify(auditExport, null, 2));
69
+ }
70
+ console.log(`Audit exported to: ${outPath} (${expFmt}, ${records.length} records)`);
71
+ return;
72
+ }
73
+ if (format === "json") {
74
+ console.log(JSON.stringify(auditExport, null, 2));
75
+ return;
76
+ }
77
+ console.log(`\nAudit Export`);
78
+ console.log("═".repeat(70));
79
+ console.log(` Records: ${records.length}`);
80
+ if (Object.keys(byAction).length > 0) {
81
+ console.log(" By action:");
82
+ for (const [action, count] of Object.entries(byAction)) {
83
+ console.log(` ${action.padEnd(20)} ${count}`);
84
+ }
85
+ }
86
+ if (records.length > 0) {
87
+ console.log(`\n Latest records:`);
88
+ for (const r of records.slice(-5)) {
89
+ console.log(` ${r.timestamp.padEnd(22)} ${r.action.padEnd(15)} ${r.actor}`);
90
+ }
91
+ }
92
+ console.log("═".repeat(70));
93
+ }
94
+ //# sourceMappingURL=review-audit-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-audit-export.js","sourceRoot":"","sources":["../../src/commands/review-audit-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-cicd-integrate — Generate CI/CD integration configs for Judges.
3
+ */
4
+ export declare function runReviewCicdIntegrate(argv: string[]): void;
5
+ //# sourceMappingURL=review-cicd-integrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-cicd-integrate.d.ts","sourceRoot":"","sources":["../../src/commands/review-cicd-integrate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiEH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiE3D"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Review-cicd-integrate — Generate CI/CD integration configs for Judges.
3
+ */
4
+ import { writeFileSync } from "fs";
5
+ // ─── Templates ──────────────────────────────────────────────────────────────
6
+ const TEMPLATES = {
7
+ "github-actions": {
8
+ filename: ".github/workflows/judges.yml",
9
+ content: `name: Judges Code Review
10
+ on: [pull_request]
11
+ jobs:
12
+ judges-review:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - uses: actions/setup-node@v4
17
+ with:
18
+ node-version: '20'
19
+ - run: npx @kevinrabun/judges eval --file \${{ github.event.pull_request.head.sha }} --format sarif --fail-on-findings
20
+ `,
21
+ },
22
+ "gitlab-ci": {
23
+ filename: ".gitlab-ci.yml",
24
+ content: `judges-review:
25
+ stage: test
26
+ image: node:20
27
+ script:
28
+ - npx @kevinrabun/judges eval --format sarif --fail-on-findings
29
+ only:
30
+ - merge_requests
31
+ `,
32
+ },
33
+ "azure-pipelines": {
34
+ filename: "azure-pipelines-judges.yml",
35
+ content: `trigger:
36
+ - main
37
+ pool:
38
+ vmImage: 'ubuntu-latest'
39
+ steps:
40
+ - task: NodeTool@0
41
+ inputs:
42
+ versionSpec: '20.x'
43
+ - script: npx @kevinrabun/judges eval --format sarif --fail-on-findings
44
+ displayName: 'Run Judges Review'
45
+ `,
46
+ },
47
+ jenkins: {
48
+ filename: "Jenkinsfile-judges",
49
+ content: `pipeline {
50
+ agent any
51
+ stages {
52
+ stage('Judges Review') {
53
+ steps {
54
+ sh 'npx @kevinrabun/judges eval --format sarif --fail-on-findings'
55
+ }
56
+ }
57
+ }
58
+ }
59
+ `,
60
+ },
61
+ };
62
+ // ─── CLI ────────────────────────────────────────────────────────────────────
63
+ export function runReviewCicdIntegrate(argv) {
64
+ const platformIdx = argv.indexOf("--platform");
65
+ const outIdx = argv.indexOf("--out");
66
+ const formatIdx = argv.indexOf("--format");
67
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
68
+ if (argv.includes("--help") || argv.includes("-h")) {
69
+ console.log(`
70
+ judges review-cicd-integrate — Generate CI/CD integration configs
71
+
72
+ Usage:
73
+ judges review-cicd-integrate --platform <name> [--out <path>]
74
+ [--format table|json]
75
+
76
+ Options:
77
+ --platform <name> CI/CD platform: github-actions, gitlab-ci, azure-pipelines, jenkins
78
+ --out <path> Write config to file (default: print to stdout)
79
+ --format <fmt> Output format: table (default), json
80
+ --help, -h Show this help
81
+ `);
82
+ return;
83
+ }
84
+ // List platforms
85
+ if (platformIdx < 0) {
86
+ const platforms = Object.keys(TEMPLATES);
87
+ if (format === "json") {
88
+ console.log(JSON.stringify({ platforms }, null, 2));
89
+ }
90
+ else {
91
+ console.log(`\nAvailable CI/CD Platforms:`);
92
+ console.log("═".repeat(40));
93
+ for (const p of platforms) {
94
+ const t = TEMPLATES[p];
95
+ console.log(` ${p.padEnd(20)} → ${t.filename}`);
96
+ }
97
+ console.log("\nUse --platform <name> to generate config.");
98
+ console.log("═".repeat(40));
99
+ }
100
+ return;
101
+ }
102
+ const platform = argv[platformIdx + 1];
103
+ const template = TEMPLATES[platform];
104
+ if (template === undefined) {
105
+ console.error(`Unknown platform: ${platform}`);
106
+ console.error(`Available: ${Object.keys(TEMPLATES).join(", ")}`);
107
+ process.exitCode = 1;
108
+ return;
109
+ }
110
+ if (outIdx >= 0) {
111
+ const outPath = argv[outIdx + 1];
112
+ writeFileSync(outPath, template.content);
113
+ console.log(`Config written to: ${outPath}`);
114
+ return;
115
+ }
116
+ if (format === "json") {
117
+ console.log(JSON.stringify(template, null, 2));
118
+ return;
119
+ }
120
+ console.log(`\n--- ${template.filename} ---`);
121
+ console.log(template.content);
122
+ }
123
+ //# sourceMappingURL=review-cicd-integrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-cicd-integrate.js","sourceRoot":"","sources":["../../src/commands/review-cicd-integrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-data-retention — Configure data retention policies for review data.
3
+ */
4
+ export declare function runReviewDataRetention(argv: string[]): void;
5
+ //# sourceMappingURL=review-data-retention.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-data-retention.d.ts","sourceRoot":"","sources":["../../src/commands/review-data-retention.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2BH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmH3D"}