@kevinrabun/judges 3.95.0 → 3.97.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-annotation-layer.d.ts +5 -0
  6. package/dist/commands/finding-annotation-layer.d.ts.map +1 -0
  7. package/dist/commands/finding-annotation-layer.js +129 -0
  8. package/dist/commands/finding-annotation-layer.js.map +1 -0
  9. package/dist/commands/finding-confidence-calibrate.d.ts +5 -0
  10. package/dist/commands/finding-confidence-calibrate.d.ts.map +1 -0
  11. package/dist/commands/finding-confidence-calibrate.js +112 -0
  12. package/dist/commands/finding-confidence-calibrate.js.map +1 -0
  13. package/dist/commands/finding-impact-rank.d.ts +5 -0
  14. package/dist/commands/finding-impact-rank.d.ts.map +1 -0
  15. package/dist/commands/finding-impact-rank.js +86 -0
  16. package/dist/commands/finding-impact-rank.js.map +1 -0
  17. package/dist/commands/finding-risk-score.d.ts +5 -0
  18. package/dist/commands/finding-risk-score.d.ts.map +1 -0
  19. package/dist/commands/finding-risk-score.js +96 -0
  20. package/dist/commands/finding-risk-score.js.map +1 -0
  21. package/dist/commands/finding-severity-heatmap.d.ts +5 -0
  22. package/dist/commands/finding-severity-heatmap.d.ts.map +1 -0
  23. package/dist/commands/finding-severity-heatmap.js +109 -0
  24. package/dist/commands/finding-severity-heatmap.js.map +1 -0
  25. package/dist/commands/finding-trend-forecast.d.ts +5 -0
  26. package/dist/commands/finding-trend-forecast.d.ts.map +1 -0
  27. package/dist/commands/finding-trend-forecast.js +107 -0
  28. package/dist/commands/finding-trend-forecast.js.map +1 -0
  29. package/dist/commands/review-adoption-metrics.d.ts +5 -0
  30. package/dist/commands/review-adoption-metrics.d.ts.map +1 -0
  31. package/dist/commands/review-adoption-metrics.js +96 -0
  32. package/dist/commands/review-adoption-metrics.js.map +1 -0
  33. package/dist/commands/review-bulk-apply.d.ts +5 -0
  34. package/dist/commands/review-bulk-apply.d.ts.map +1 -0
  35. package/dist/commands/review-bulk-apply.js +103 -0
  36. package/dist/commands/review-bulk-apply.js.map +1 -0
  37. package/dist/commands/review-compliance-map.d.ts +5 -0
  38. package/dist/commands/review-compliance-map.d.ts.map +1 -0
  39. package/dist/commands/review-compliance-map.js +111 -0
  40. package/dist/commands/review-compliance-map.js.map +1 -0
  41. package/dist/commands/review-config-migrate.d.ts +5 -0
  42. package/dist/commands/review-config-migrate.d.ts.map +1 -0
  43. package/dist/commands/review-config-migrate.js +124 -0
  44. package/dist/commands/review-config-migrate.js.map +1 -0
  45. package/dist/commands/review-gate-config.d.ts +5 -0
  46. package/dist/commands/review-gate-config.d.ts.map +1 -0
  47. package/dist/commands/review-gate-config.js +154 -0
  48. package/dist/commands/review-gate-config.js.map +1 -0
  49. package/dist/commands/review-history-compare.d.ts +5 -0
  50. package/dist/commands/review-history-compare.d.ts.map +1 -0
  51. package/dist/commands/review-history-compare.js +94 -0
  52. package/dist/commands/review-history-compare.js.map +1 -0
  53. package/dist/commands/review-output-transform.d.ts +5 -0
  54. package/dist/commands/review-output-transform.d.ts.map +1 -0
  55. package/dist/commands/review-output-transform.js +120 -0
  56. package/dist/commands/review-output-transform.js.map +1 -0
  57. package/dist/commands/review-policy-engine.d.ts +5 -0
  58. package/dist/commands/review-policy-engine.d.ts.map +1 -0
  59. package/dist/commands/review-policy-engine.js +136 -0
  60. package/dist/commands/review-policy-engine.js.map +1 -0
  61. package/dist/commands/review-rollout-plan.d.ts +5 -0
  62. package/dist/commands/review-rollout-plan.d.ts.map +1 -0
  63. package/dist/commands/review-rollout-plan.js +124 -0
  64. package/dist/commands/review-rollout-plan.js.map +1 -0
  65. package/dist/commands/review-team-dashboard.d.ts +5 -0
  66. package/dist/commands/review-team-dashboard.d.ts.map +1 -0
  67. package/dist/commands/review-team-dashboard.js +99 -0
  68. package/dist/commands/review-team-dashboard.js.map +1 -0
  69. package/dist/commands/review-webhook-dispatch.d.ts +5 -0
  70. package/dist/commands/review-webhook-dispatch.d.ts.map +1 -0
  71. package/dist/commands/review-webhook-dispatch.js +100 -0
  72. package/dist/commands/review-webhook-dispatch.js.map +1 -0
  73. package/dist/commands/review-workspace-init.d.ts +5 -0
  74. package/dist/commands/review-workspace-init.d.ts.map +1 -0
  75. package/dist/commands/review-workspace-init.js +105 -0
  76. package/dist/commands/review-workspace-init.js.map +1 -0
  77. package/package.json +1 -1
  78. package/server.json +2 -2
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Review-rollout-plan — Generate a phased rollout plan for Judges adoption.
3
+ */
4
+ import { writeFileSync } from "fs";
5
+ import { defaultRegistry } from "../judge-registry.js";
6
+ // ─── CLI ────────────────────────────────────────────────────────────────────
7
+ export function runReviewRolloutPlan(argv) {
8
+ const teamIdx = argv.indexOf("--team-size");
9
+ const outIdx = argv.indexOf("--out");
10
+ const formatIdx = argv.indexOf("--format");
11
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
12
+ const teamSize = teamIdx >= 0 ? parseInt(argv[teamIdx + 1], 10) : 5;
13
+ if (argv.includes("--help") || argv.includes("-h")) {
14
+ console.log(`
15
+ judges review-rollout-plan — Generate a phased rollout plan
16
+
17
+ Usage:
18
+ judges review-rollout-plan [--team-size <n>] [--out <path>]
19
+ [--format table|json]
20
+
21
+ Options:
22
+ --team-size <n> Team size for rollout planning (default: 5)
23
+ --out <path> Save plan to file
24
+ --format <fmt> Output format: table (default), json
25
+ --help, -h Show this help
26
+ `);
27
+ return;
28
+ }
29
+ const allJudges = defaultRegistry.getJudges();
30
+ const securityJudges = allJudges.filter((j) => j.domain === "security").map((j) => j.id);
31
+ const qualityJudges = allJudges
32
+ .filter((j) => j.domain === "quality" || j.domain === "best-practices")
33
+ .map((j) => j.id);
34
+ const otherJudges = allJudges
35
+ .filter((j) => j.domain !== "security" && j.domain !== "quality" && j.domain !== "best-practices")
36
+ .map((j) => j.id);
37
+ const phases = [
38
+ {
39
+ phase: 1,
40
+ name: "Pilot",
41
+ duration: "1-2 weeks",
42
+ judges: securityJudges.slice(0, 3),
43
+ goals: [
44
+ `Onboard ${Math.max(1, Math.floor(teamSize * 0.2))} pilot users`,
45
+ "Run security judges on non-critical repos",
46
+ "Collect feedback on finding quality",
47
+ ],
48
+ successCriteria: ["Pilot users complete 5+ reviews", "False positive rate < 15%", "Positive user feedback"],
49
+ },
50
+ {
51
+ phase: 2,
52
+ name: "Expand Security",
53
+ duration: "2-3 weeks",
54
+ judges: securityJudges,
55
+ goals: [
56
+ `Expand to ${Math.max(2, Math.floor(teamSize * 0.5))} users`,
57
+ "Enable all security judges",
58
+ "Integrate into CI pipeline",
59
+ ],
60
+ successCriteria: ["CI integration operational", "Review turnaround < 5 min", "Team adoption > 50%"],
61
+ },
62
+ {
63
+ phase: 3,
64
+ name: "Full Judge Suite",
65
+ duration: "2-4 weeks",
66
+ judges: [...securityJudges, ...qualityJudges.slice(0, 5)],
67
+ goals: [
68
+ `Expand to full team (${teamSize} users)`,
69
+ "Enable quality and best-practice judges",
70
+ "Establish baseline metrics",
71
+ ],
72
+ successCriteria: ["100% team adoption", "Baseline established", "Documented processes"],
73
+ },
74
+ {
75
+ phase: 4,
76
+ name: "Optimization",
77
+ duration: "Ongoing",
78
+ judges: [...securityJudges, ...qualityJudges, ...otherJudges],
79
+ goals: [
80
+ "Enable full judge suite",
81
+ "Tune thresholds based on team feedback",
82
+ "Automate fix application where safe",
83
+ ],
84
+ successCriteria: [
85
+ "Finding resolution rate > 80%",
86
+ "Average review score > 7/10",
87
+ "Continuous improvement cycle active",
88
+ ],
89
+ },
90
+ ];
91
+ const plan = {
92
+ teamSize,
93
+ phases,
94
+ generatedAt: new Date().toISOString().split("T")[0],
95
+ };
96
+ // Save if requested
97
+ if (outIdx >= 0) {
98
+ const outPath = argv[outIdx + 1];
99
+ writeFileSync(outPath, JSON.stringify(plan, null, 2));
100
+ console.log(`Rollout plan saved to: ${outPath}`);
101
+ return;
102
+ }
103
+ if (format === "json") {
104
+ console.log(JSON.stringify(plan, null, 2));
105
+ return;
106
+ }
107
+ console.log(`\nRollout Plan (team size: ${teamSize})`);
108
+ console.log("═".repeat(65));
109
+ for (const p of phases) {
110
+ console.log(`\n Phase ${p.phase}: ${p.name} (${p.duration})`);
111
+ console.log(" " + "─".repeat(55));
112
+ console.log(` Judges: ${p.judges.slice(0, 5).join(", ")}${p.judges.length > 5 ? ` (+${p.judges.length - 5} more)` : ""}`);
113
+ console.log(" Goals:");
114
+ for (const g of p.goals) {
115
+ console.log(` • ${g}`);
116
+ }
117
+ console.log(" Success Criteria:");
118
+ for (const s of p.successCriteria) {
119
+ console.log(` ✓ ${s}`);
120
+ }
121
+ }
122
+ console.log("\n═".repeat(65));
123
+ }
124
+ //# sourceMappingURL=review-rollout-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-rollout-plan.js","sourceRoot":"","sources":["../../src/commands/review-rollout-plan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAmBvD,+EAA+E;AAE/E,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,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;IAC9D,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;CAYf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,EAAE,CAAC;IAC9C,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzF,MAAM,aAAa,GAAG,SAAS;SAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC;SACtE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpB,MAAM,WAAW,GAAG,SAAS;SAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC;SACjG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEpB,MAAM,MAAM,GAAmB;QAC7B;YACE,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,KAAK,EAAE;gBACL,WAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,cAAc;gBAChE,2CAA2C;gBAC3C,qCAAqC;aACtC;YACD,eAAe,EAAE,CAAC,iCAAiC,EAAE,2BAA2B,EAAE,wBAAwB,CAAC;SAC5G;QACD;YACE,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE;gBACL,aAAa,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,QAAQ;gBAC5D,4BAA4B;gBAC5B,4BAA4B;aAC7B;YACD,eAAe,EAAE,CAAC,4BAA4B,EAAE,2BAA2B,EAAE,qBAAqB,CAAC;SACpG;QACD;YACE,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,CAAC,GAAG,cAAc,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACzD,KAAK,EAAE;gBACL,wBAAwB,QAAQ,SAAS;gBACzC,yCAAyC;gBACzC,4BAA4B;aAC7B;YACD,eAAe,EAAE,CAAC,oBAAoB,EAAE,sBAAsB,EAAE,sBAAsB,CAAC;SACxF;QACD;YACE,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,SAAS;YACnB,MAAM,EAAE,CAAC,GAAG,cAAc,EAAE,GAAG,aAAa,EAAE,GAAG,WAAW,CAAC;YAC7D,KAAK,EAAE;gBACL,yBAAyB;gBACzB,wCAAwC;gBACxC,qCAAqC;aACtC;YACD,eAAe,EAAE;gBACf,+BAA+B;gBAC/B,6BAA6B;gBAC7B,qCAAqC;aACtC;SACF;KACF,CAAC;IAEF,MAAM,IAAI,GAAgB;QACxB,QAAQ;QACR,MAAM;QACN,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACpD,CAAC;IAEF,oBAAoB;IACpB,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,QAAQ,GAAG,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CACT,aAAa,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9G,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-team-dashboard — Team-level review dashboard with aggregated metrics.
3
+ */
4
+ export declare function runReviewTeamDashboard(argv: string[]): void;
5
+ //# sourceMappingURL=review-team-dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-team-dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/review-team-dashboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0G3D"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Review-team-dashboard — Team-level review dashboard with aggregated metrics.
3
+ */
4
+ import { readFileSync, existsSync, readdirSync } from "fs";
5
+ import { join } from "path";
6
+ // ─── CLI ────────────────────────────────────────────────────────────────────
7
+ export function runReviewTeamDashboard(argv) {
8
+ const dirIdx = argv.indexOf("--dir");
9
+ const formatIdx = argv.indexOf("--format");
10
+ const dirPath = dirIdx >= 0 ? argv[dirIdx + 1] : process.cwd();
11
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
12
+ if (argv.includes("--help") || argv.includes("-h")) {
13
+ console.log(`
14
+ judges review-team-dashboard — Team review dashboard
15
+
16
+ Usage:
17
+ judges review-team-dashboard [--dir <path>] [--format table|json]
18
+
19
+ Options:
20
+ --dir <path> Directory with review JSON files (default: cwd)
21
+ --format <fmt> Output format: table (default), json
22
+ --help, -h Show this help
23
+ `);
24
+ return;
25
+ }
26
+ if (!existsSync(dirPath)) {
27
+ console.error(`Error: directory not found: ${dirPath}`);
28
+ process.exitCode = 1;
29
+ return;
30
+ }
31
+ const files = readdirSync(dirPath).filter((f) => typeof f === "string" && f.endsWith(".json"));
32
+ const verdicts = [];
33
+ for (const file of files) {
34
+ try {
35
+ const v = JSON.parse(readFileSync(join(dirPath, file), "utf-8"));
36
+ if (v.overallVerdict !== undefined && v.findings !== undefined) {
37
+ verdicts.push(v);
38
+ }
39
+ }
40
+ catch {
41
+ // skip
42
+ }
43
+ }
44
+ if (verdicts.length === 0) {
45
+ console.log("No review files found. Generate reviews first.");
46
+ return;
47
+ }
48
+ const ruleCounts = {};
49
+ const severityCounts = {};
50
+ const dateCounts = {};
51
+ let scoreSum = 0;
52
+ let passCount = 0;
53
+ for (const v of verdicts) {
54
+ scoreSum += v.overallScore;
55
+ if (v.overallVerdict === "pass")
56
+ passCount++;
57
+ const date = v.timestamp ? v.timestamp.split("T")[0] : "unknown";
58
+ dateCounts[date] = (dateCounts[date] ?? 0) + 1;
59
+ for (const f of v.findings) {
60
+ ruleCounts[f.ruleId] = (ruleCounts[f.ruleId] ?? 0) + 1;
61
+ severityCounts[f.severity] = (severityCounts[f.severity] ?? 0) + 1;
62
+ }
63
+ }
64
+ const metrics = {
65
+ totalReviews: verdicts.length,
66
+ totalFindings: verdicts.reduce((s, v) => s + v.findings.length, 0),
67
+ avgScore: Math.round((scoreSum / verdicts.length) * 100) / 100,
68
+ passRate: Math.round((passCount / verdicts.length) * 100),
69
+ topIssues: Object.entries(ruleCounts)
70
+ .sort((a, b) => b[1] - a[1])
71
+ .slice(0, 10)
72
+ .map(([ruleId, count]) => ({ ruleId, count })),
73
+ severityTrend: severityCounts,
74
+ reviewsPerDay: dateCounts,
75
+ };
76
+ if (format === "json") {
77
+ console.log(JSON.stringify(metrics, null, 2));
78
+ return;
79
+ }
80
+ console.log(`\nTeam Review Dashboard`);
81
+ console.log("═".repeat(55));
82
+ console.log(` Reviews: ${metrics.totalReviews}`);
83
+ console.log(` Findings: ${metrics.totalFindings}`);
84
+ console.log(` Avg Score: ${metrics.avgScore}`);
85
+ console.log(` Pass Rate: ${metrics.passRate}%`);
86
+ console.log(`\n Severity Distribution:`);
87
+ for (const [sev, count] of Object.entries(metrics.severityTrend)) {
88
+ const bar = "█".repeat(Math.min(count, 30));
89
+ console.log(` ${sev.padEnd(10)} ${String(count).padStart(4)} ${bar}`);
90
+ }
91
+ if (metrics.topIssues.length > 0) {
92
+ console.log(`\n Top Issues:`);
93
+ for (const issue of metrics.topIssues) {
94
+ console.log(` ${issue.ruleId.padEnd(25)} ${issue.count}`);
95
+ }
96
+ }
97
+ console.log("═".repeat(55));
98
+ }
99
+ //# sourceMappingURL=review-team-dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-team-dashboard.js","sourceRoot":"","sources":["../../src/commands/review-team-dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-webhook-dispatch — Configure webhook endpoints for review events.
3
+ */
4
+ export declare function runReviewWebhookDispatch(argv: string[]): void;
5
+ //# sourceMappingURL=review-webhook-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-webhook-dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/review-webhook-dispatch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmG7D"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Review-webhook-dispatch — Configure webhook endpoints for review events.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ // ─── CLI ────────────────────────────────────────────────────────────────────
6
+ export function runReviewWebhookDispatch(argv) {
7
+ const storeIdx = argv.indexOf("--store");
8
+ const storePath = storeIdx >= 0 ? argv[storeIdx + 1] : ".judges-webhooks.json";
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 review-webhook-dispatch — Configure webhook dispatch for review events
14
+
15
+ Usage:
16
+ judges review-webhook-dispatch [--store <path>] [--add <json>]
17
+ [--remove <id>] [--test <id>]
18
+ [--format table|json]
19
+
20
+ Options:
21
+ --store <path> Webhook config file (default: .judges-webhooks.json)
22
+ --add <json> Add webhook config (JSON)
23
+ --remove <id> Remove webhook by id
24
+ --test <id> Test webhook connectivity (dry run)
25
+ --format <fmt> Output format: table (default), json
26
+ --help, -h Show this help
27
+ `);
28
+ return;
29
+ }
30
+ let store;
31
+ if (existsSync(storePath)) {
32
+ store = JSON.parse(readFileSync(storePath, "utf-8"));
33
+ }
34
+ else {
35
+ store = { webhooks: [], lastUpdated: new Date().toISOString().split("T")[0] };
36
+ }
37
+ // Add webhook
38
+ const addIdx = argv.indexOf("--add");
39
+ if (addIdx >= 0) {
40
+ const webhook = JSON.parse(argv[addIdx + 1]);
41
+ const existingIdx = store.webhooks.findIndex((w) => w.id === webhook.id);
42
+ if (existingIdx >= 0) {
43
+ store.webhooks[existingIdx] = webhook;
44
+ }
45
+ else {
46
+ store.webhooks.push(webhook);
47
+ }
48
+ store.lastUpdated = new Date().toISOString().split("T")[0];
49
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
50
+ console.log(`Webhook "${webhook.id}" saved.`);
51
+ return;
52
+ }
53
+ // Remove webhook
54
+ const removeIdx = argv.indexOf("--remove");
55
+ if (removeIdx >= 0) {
56
+ const id = argv[removeIdx + 1];
57
+ store.webhooks = store.webhooks.filter((w) => w.id !== id);
58
+ store.lastUpdated = new Date().toISOString().split("T")[0];
59
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
60
+ console.log(`Webhook "${id}" removed.`);
61
+ return;
62
+ }
63
+ // Test webhook
64
+ const testIdx = argv.indexOf("--test");
65
+ if (testIdx >= 0) {
66
+ const id = argv[testIdx + 1];
67
+ const webhook = store.webhooks.find((w) => w.id === id);
68
+ if (!webhook) {
69
+ console.error(`Webhook "${id}" not found.`);
70
+ process.exitCode = 1;
71
+ return;
72
+ }
73
+ console.log(`Webhook test (dry run):`);
74
+ console.log(` ID: ${webhook.id}`);
75
+ console.log(` URL: ${webhook.url}`);
76
+ console.log(` Events: ${webhook.events.join(", ")}`);
77
+ console.log(` Status: ${webhook.enabled ? "enabled" : "disabled"}`);
78
+ console.log(` Would send: { "event": "test", "timestamp": "${new Date().toISOString()}" }`);
79
+ return;
80
+ }
81
+ // List webhooks
82
+ if (format === "json") {
83
+ console.log(JSON.stringify(store, null, 2));
84
+ return;
85
+ }
86
+ console.log(`\nWebhook Dispatch Config`);
87
+ console.log("═".repeat(60));
88
+ if (store.webhooks.length === 0) {
89
+ console.log(" No webhooks configured. Use --add to create one.");
90
+ }
91
+ else {
92
+ for (const w of store.webhooks) {
93
+ const status = w.enabled ? "ON" : "OFF";
94
+ console.log(` [${status}] ${w.id.padEnd(20)} ${w.url}`);
95
+ console.log(` Events: ${w.events.join(", ")}`);
96
+ }
97
+ }
98
+ console.log("═".repeat(60));
99
+ }
100
+ //# sourceMappingURL=review-webhook-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-webhook-dispatch.js","sourceRoot":"","sources":["../../src/commands/review-webhook-dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-workspace-init — Initialize a workspace for Judges code review.
3
+ */
4
+ export declare function runReviewWorkspaceInit(argv: string[]): void;
5
+ //# sourceMappingURL=review-workspace-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-workspace-init.d.ts","sourceRoot":"","sources":["../../src/commands/review-workspace-init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuBH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2F3D"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Review-workspace-init — Initialize a workspace for Judges code review.
3
+ */
4
+ import { writeFileSync, mkdirSync, existsSync } from "fs";
5
+ import { join } from "path";
6
+ // ─── Default configs ────────────────────────────────────────────────────────
7
+ const DEFAULT_JUDGESRC = {
8
+ preset: "default",
9
+ disabledJudges: [],
10
+ disabledRules: [],
11
+ ruleOverrides: {},
12
+ minSeverity: "low",
13
+ };
14
+ const DEFAULT_BASELINE = {
15
+ version: 1,
16
+ baselinedAt: new Date().toISOString().split("T")[0],
17
+ findings: [],
18
+ };
19
+ // ─── CLI ────────────────────────────────────────────────────────────────────
20
+ export function runReviewWorkspaceInit(argv) {
21
+ const dirIdx = argv.indexOf("--dir");
22
+ const dir = dirIdx >= 0 ? argv[dirIdx + 1] : ".";
23
+ const force = argv.includes("--force");
24
+ const formatIdx = argv.indexOf("--format");
25
+ const format = formatIdx >= 0 ? argv[formatIdx + 1] : "table";
26
+ if (argv.includes("--help") || argv.includes("-h")) {
27
+ console.log(`
28
+ judges review-workspace-init — Initialize workspace for Judges
29
+
30
+ Usage:
31
+ judges review-workspace-init [--dir <path>] [--force] [--format table|json]
32
+
33
+ Options:
34
+ --dir <path> Workspace root (default: current directory)
35
+ --force Overwrite existing config files
36
+ --format <fmt> Output format: table (default), json
37
+ --help, -h Show this help
38
+
39
+ This creates:
40
+ .judgesrc — Judges configuration file
41
+ .judges-baseline.json — Baseline for existing findings
42
+ .judges/ — Local data directory
43
+ `);
44
+ return;
45
+ }
46
+ const created = [];
47
+ const skipped = [];
48
+ // 1. .judgesrc
49
+ const rcPath = join(dir, ".judgesrc");
50
+ if (!existsSync(rcPath) || force) {
51
+ writeFileSync(rcPath, JSON.stringify(DEFAULT_JUDGESRC, null, 2));
52
+ created.push(".judgesrc");
53
+ }
54
+ else {
55
+ skipped.push(".judgesrc (exists)");
56
+ }
57
+ // 2. .judges-baseline.json
58
+ const baselinePath = join(dir, ".judges-baseline.json");
59
+ if (!existsSync(baselinePath) || force) {
60
+ writeFileSync(baselinePath, JSON.stringify(DEFAULT_BASELINE, null, 2));
61
+ created.push(".judges-baseline.json");
62
+ }
63
+ else {
64
+ skipped.push(".judges-baseline.json (exists)");
65
+ }
66
+ // 3. .judges/ directory
67
+ const judgesDir = join(dir, ".judges");
68
+ if (!existsSync(judgesDir)) {
69
+ mkdirSync(judgesDir, { recursive: true });
70
+ created.push(".judges/");
71
+ }
72
+ else {
73
+ skipped.push(".judges/ (exists)");
74
+ }
75
+ // 4. .judges/cache directory
76
+ const cacheDir = join(judgesDir, "cache");
77
+ if (!existsSync(cacheDir)) {
78
+ mkdirSync(cacheDir, { recursive: true });
79
+ created.push(".judges/cache/");
80
+ }
81
+ else {
82
+ skipped.push(".judges/cache/ (exists)");
83
+ }
84
+ if (format === "json") {
85
+ console.log(JSON.stringify({ created, skipped }, null, 2));
86
+ return;
87
+ }
88
+ console.log(`\nWorkspace Initialization`);
89
+ console.log("═".repeat(50));
90
+ if (created.length > 0) {
91
+ console.log(`\n Created:`);
92
+ for (const c of created) {
93
+ console.log(` + ${c}`);
94
+ }
95
+ }
96
+ if (skipped.length > 0) {
97
+ console.log(`\n Skipped:`);
98
+ for (const s of skipped) {
99
+ console.log(` - ${s}`);
100
+ }
101
+ }
102
+ console.log(`\n Workspace ready at: ${dir === "." ? process.cwd() : dir}`);
103
+ console.log("═".repeat(50));
104
+ }
105
+ //# sourceMappingURL=review-workspace-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-workspace-init.js","sourceRoot":"","sources":["../../src/commands/review-workspace-init.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.95.0",
3
+ "version": "3.97.0",
4
4
  "description": "45 specialized judges that evaluate AI-generated code for security, cost, and quality.",
5
5
  "mcpName": "io.github.KevinRabun/judges",
6
6
  "type": "module",
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/kevinrabun/judges",
8
8
  "source": "github"
9
9
  },
10
- "version": "3.95.0",
10
+ "version": "3.97.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.95.0",
15
+ "version": "3.97.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }