@kevinrabun/judges 3.102.0 → 3.104.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-export.d.ts +2 -0
  6. package/dist/commands/finding-annotation-export.d.ts.map +1 -0
  7. package/dist/commands/finding-annotation-export.js +98 -0
  8. package/dist/commands/finding-annotation-export.js.map +1 -0
  9. package/dist/commands/finding-cross-file-link.d.ts +2 -0
  10. package/dist/commands/finding-cross-file-link.d.ts.map +1 -0
  11. package/dist/commands/finding-cross-file-link.js +102 -0
  12. package/dist/commands/finding-cross-file-link.js.map +1 -0
  13. package/dist/commands/finding-dedup-smart.d.ts +2 -0
  14. package/dist/commands/finding-dedup-smart.d.ts.map +1 -0
  15. package/dist/commands/finding-dedup-smart.js +110 -0
  16. package/dist/commands/finding-dedup-smart.js.map +1 -0
  17. package/dist/commands/finding-hotspot-detect.d.ts +2 -0
  18. package/dist/commands/finding-hotspot-detect.d.ts.map +1 -0
  19. package/dist/commands/finding-hotspot-detect.js +121 -0
  20. package/dist/commands/finding-hotspot-detect.js.map +1 -0
  21. package/dist/commands/finding-merge-strategy.d.ts +2 -0
  22. package/dist/commands/finding-merge-strategy.d.ts.map +1 -0
  23. package/dist/commands/finding-merge-strategy.js +85 -0
  24. package/dist/commands/finding-merge-strategy.js.map +1 -0
  25. package/dist/commands/finding-similar-match.d.ts +2 -0
  26. package/dist/commands/finding-similar-match.d.ts.map +1 -0
  27. package/dist/commands/finding-similar-match.js +113 -0
  28. package/dist/commands/finding-similar-match.js.map +1 -0
  29. package/dist/commands/finding-trend-alert.d.ts +2 -0
  30. package/dist/commands/finding-trend-alert.d.ts.map +1 -0
  31. package/dist/commands/finding-trend-alert.js +127 -0
  32. package/dist/commands/finding-trend-alert.js.map +1 -0
  33. package/dist/commands/review-ai-feedback-loop.d.ts +2 -0
  34. package/dist/commands/review-ai-feedback-loop.d.ts.map +1 -0
  35. package/dist/commands/review-ai-feedback-loop.js +117 -0
  36. package/dist/commands/review-ai-feedback-loop.js.map +1 -0
  37. package/dist/commands/review-ci-insight.d.ts +2 -0
  38. package/dist/commands/review-ci-insight.d.ts.map +1 -0
  39. package/dist/commands/review-ci-insight.js +101 -0
  40. package/dist/commands/review-ci-insight.js.map +1 -0
  41. package/dist/commands/review-code-health-score.d.ts +2 -0
  42. package/dist/commands/review-code-health-score.d.ts.map +1 -0
  43. package/dist/commands/review-code-health-score.js +101 -0
  44. package/dist/commands/review-code-health-score.js.map +1 -0
  45. package/dist/commands/review-confidence-explain.d.ts +2 -0
  46. package/dist/commands/review-confidence-explain.d.ts.map +1 -0
  47. package/dist/commands/review-confidence-explain.js +100 -0
  48. package/dist/commands/review-confidence-explain.js.map +1 -0
  49. package/dist/commands/review-focus-area.d.ts +2 -0
  50. package/dist/commands/review-focus-area.d.ts.map +1 -0
  51. package/dist/commands/review-focus-area.js +97 -0
  52. package/dist/commands/review-focus-area.js.map +1 -0
  53. package/dist/commands/review-pr-size-check.d.ts +2 -0
  54. package/dist/commands/review-pr-size-check.d.ts.map +1 -0
  55. package/dist/commands/review-pr-size-check.js +99 -0
  56. package/dist/commands/review-pr-size-check.js.map +1 -0
  57. package/dist/commands/review-scope-suggest.d.ts +2 -0
  58. package/dist/commands/review-scope-suggest.d.ts.map +1 -0
  59. package/dist/commands/review-scope-suggest.js +113 -0
  60. package/dist/commands/review-scope-suggest.js.map +1 -0
  61. package/dist/commands/review-team-analytics.d.ts +2 -0
  62. package/dist/commands/review-team-analytics.d.ts.map +1 -0
  63. package/dist/commands/review-team-analytics.js +95 -0
  64. package/dist/commands/review-team-analytics.js.map +1 -0
  65. package/dist/commands/review-template-suggest.d.ts +2 -0
  66. package/dist/commands/review-template-suggest.d.ts.map +1 -0
  67. package/dist/commands/review-template-suggest.js +120 -0
  68. package/dist/commands/review-template-suggest.js.map +1 -0
  69. package/dist/commands/review-velocity-track.d.ts +2 -0
  70. package/dist/commands/review-velocity-track.d.ts.map +1 -0
  71. package/dist/commands/review-velocity-track.js +95 -0
  72. package/dist/commands/review-velocity-track.js.map +1 -0
  73. package/dist/commands/review-workload-balance.d.ts +2 -0
  74. package/dist/commands/review-workload-balance.d.ts.map +1 -0
  75. package/dist/commands/review-workload-balance.js +87 -0
  76. package/dist/commands/review-workload-balance.js.map +1 -0
  77. package/package.json +1 -1
  78. package/server.json +2 -2
@@ -0,0 +1,120 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ const TEMPLATES = {
4
+ "bug-fix": {
5
+ changeType: "Bug Fix",
6
+ template: "bug-fix-review",
7
+ focusAreas: ["Root cause analysis", "Regression test coverage", "Edge cases"],
8
+ checklistItems: [
9
+ "Bug root cause identified",
10
+ "Fix addresses root cause, not just symptom",
11
+ "Regression tests added",
12
+ "No unintended side effects",
13
+ ],
14
+ },
15
+ feature: {
16
+ changeType: "New Feature",
17
+ template: "feature-review",
18
+ focusAreas: ["Design alignment", "Security review", "Performance impact", "Documentation"],
19
+ checklistItems: [
20
+ "Feature matches requirements",
21
+ "Security implications reviewed",
22
+ "Performance tested",
23
+ "Documentation updated",
24
+ "Tests cover happy and error paths",
25
+ ],
26
+ },
27
+ refactor: {
28
+ changeType: "Refactor",
29
+ template: "refactor-review",
30
+ focusAreas: ["Behavior preservation", "Test coverage unchanged", "Code clarity"],
31
+ checklistItems: [
32
+ "No behavioral changes introduced",
33
+ "All existing tests still pass",
34
+ "Code readability improved",
35
+ "No new dependencies added unnecessarily",
36
+ ],
37
+ },
38
+ config: {
39
+ changeType: "Configuration",
40
+ template: "config-review",
41
+ focusAreas: ["Secret exposure", "Environment parity", "Breaking changes"],
42
+ checklistItems: [
43
+ "No secrets or credentials exposed",
44
+ "Compatible with all environments",
45
+ "Backward compatible or migration documented",
46
+ ],
47
+ },
48
+ dependency: {
49
+ changeType: "Dependency Update",
50
+ template: "dependency-review",
51
+ focusAreas: ["Security advisories", "Breaking changes", "License compatibility"],
52
+ checklistItems: [
53
+ "No known vulnerabilities in new version",
54
+ "Breaking changes reviewed",
55
+ "License still compatible",
56
+ "Lock file updated consistently",
57
+ ],
58
+ },
59
+ };
60
+ function detectChangeType(files) {
61
+ const hasConfig = files.some((f) => f.endsWith(".json") || f.endsWith(".yml") || f.endsWith(".yaml") || f.endsWith(".toml") || f.endsWith(".env"));
62
+ const hasDeps = files.some((f) => f.includes("package.json") || f.includes("Cargo.toml") || f.includes("go.mod") || f.includes("requirements"));
63
+ const hasTests = files.some((f) => f.includes("test") || f.includes("spec"));
64
+ const hasSource = files.some((f) => f.endsWith(".ts") || f.endsWith(".js") || f.endsWith(".py") || f.endsWith(".go") || f.endsWith(".rs"));
65
+ if (hasDeps)
66
+ return "dependency";
67
+ if (hasConfig && !hasSource)
68
+ return "config";
69
+ if (hasTests && hasSource)
70
+ return "bug-fix";
71
+ if (hasSource)
72
+ return "feature";
73
+ return "refactor";
74
+ }
75
+ export function runReviewTemplateSuggest(argv) {
76
+ if (argv.includes("--help") || argv.includes("-h")) {
77
+ console.log(`Usage: judges review-template-suggest [options]
78
+
79
+ Suggest review templates based on change type.
80
+
81
+ Options:
82
+ --files <path> File listing changed files (one per line)
83
+ --type <type> Override change type: bug-fix, feature, refactor, config, dependency
84
+ --format <fmt> Output format: table (default) or json
85
+ -h, --help Show this help message`);
86
+ return;
87
+ }
88
+ const formatIdx = argv.indexOf("--format");
89
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
90
+ const typeIdx = argv.indexOf("--type");
91
+ let changeType = typeIdx !== -1 && argv[typeIdx + 1] ? argv[typeIdx + 1] : "";
92
+ if (changeType === "") {
93
+ const filesIdx = argv.indexOf("--files");
94
+ const filesPath = filesIdx !== -1 && argv[filesIdx + 1] ? join(process.cwd(), argv[filesIdx + 1]) : null;
95
+ let changedFiles = [];
96
+ if (filesPath !== null && existsSync(filesPath)) {
97
+ changedFiles = readFileSync(filesPath, "utf-8")
98
+ .split("\n")
99
+ .map((l) => l.trim())
100
+ .filter((l) => l.length > 0);
101
+ }
102
+ changeType = changedFiles.length > 0 ? detectChangeType(changedFiles) : "feature";
103
+ }
104
+ const suggestion = TEMPLATES[changeType] ?? TEMPLATES["feature"];
105
+ if (format === "json") {
106
+ console.log(JSON.stringify(suggestion, null, 2));
107
+ return;
108
+ }
109
+ console.log(`\n=== Review Template: ${suggestion.changeType} ===\n`);
110
+ console.log(`Template: ${suggestion.template}`);
111
+ console.log("\nFocus Areas:");
112
+ for (const area of suggestion.focusAreas) {
113
+ console.log(` • ${area}`);
114
+ }
115
+ console.log("\nChecklist:");
116
+ for (const item of suggestion.checklistItems) {
117
+ console.log(` ☐ ${item}`);
118
+ }
119
+ }
120
+ //# sourceMappingURL=review-template-suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-template-suggest.js","sourceRoot":"","sources":["../../src/commands/review-template-suggest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runReviewVelocityTrack(argv: string[]): void;
2
+ //# sourceMappingURL=review-velocity-track.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-velocity-track.d.ts","sourceRoot":"","sources":["../../src/commands/review-velocity-track.ts"],"names":[],"mappings":"AAsDA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA0E3D"}
@@ -0,0 +1,95 @@
1
+ import { readFileSync, existsSync, readdirSync } from "fs";
2
+ import { join } from "path";
3
+ function computeVelocity(verdicts) {
4
+ const periods = new Map();
5
+ for (const entry of verdicts) {
6
+ const date = entry.timestamp.substring(0, 10);
7
+ const group = periods.get(date);
8
+ if (group !== undefined) {
9
+ group.push(entry.verdict);
10
+ }
11
+ else {
12
+ periods.set(date, [entry.verdict]);
13
+ }
14
+ }
15
+ const velocityData = [];
16
+ const sortedPeriods = [...periods.keys()].sort();
17
+ for (const period of sortedPeriods) {
18
+ const vdcts = periods.get(period) ?? [];
19
+ const totalFindings = vdcts.reduce((sum, v) => sum + (v.findings?.length ?? 0), 0);
20
+ const passCount = vdcts.filter((v) => v.overallVerdict === "pass").length;
21
+ const totalScore = vdcts.reduce((sum, v) => sum + (v.overallScore ?? 0), 0);
22
+ velocityData.push({
23
+ period,
24
+ reviewCount: vdcts.length,
25
+ totalFindings,
26
+ avgFindings: vdcts.length > 0 ? totalFindings / vdcts.length : 0,
27
+ passRate: vdcts.length > 0 ? passCount / vdcts.length : 0,
28
+ avgScore: vdcts.length > 0 ? totalScore / vdcts.length : 0,
29
+ });
30
+ }
31
+ return velocityData;
32
+ }
33
+ export function runReviewVelocityTrack(argv) {
34
+ if (argv.includes("--help") || argv.includes("-h")) {
35
+ console.log(`Usage: judges review-velocity-track [options]
36
+
37
+ Track review velocity and throughput over time.
38
+
39
+ Options:
40
+ --dir <path> Directory with verdict JSON files
41
+ --format <fmt> Output format: table (default) or json
42
+ -h, --help Show this help message`);
43
+ return;
44
+ }
45
+ const formatIdx = argv.indexOf("--format");
46
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
47
+ const dirIdx = argv.indexOf("--dir");
48
+ const dirPath = dirIdx !== -1 && argv[dirIdx + 1]
49
+ ? join(process.cwd(), argv[dirIdx + 1])
50
+ : join(process.cwd(), ".judges", "history");
51
+ const verdicts = [];
52
+ if (existsSync(dirPath)) {
53
+ const files = readdirSync(dirPath).filter((f) => f.endsWith(".json")).sort();
54
+ for (const file of files) {
55
+ const data = JSON.parse(readFileSync(join(dirPath, file), "utf-8"));
56
+ verdicts.push({
57
+ timestamp: data.timestamp ?? file.replace(/\.json$/, ""),
58
+ verdict: data,
59
+ });
60
+ }
61
+ }
62
+ const defaultPath = join(process.cwd(), ".judges", "last-verdict.json");
63
+ if (existsSync(defaultPath)) {
64
+ const data = JSON.parse(readFileSync(defaultPath, "utf-8"));
65
+ verdicts.push({
66
+ timestamp: data.timestamp ?? new Date().toISOString(),
67
+ verdict: data,
68
+ });
69
+ }
70
+ if (verdicts.length === 0) {
71
+ console.log("No verdict data found. Run reviews first or provide --dir.");
72
+ return;
73
+ }
74
+ const velocity = computeVelocity(verdicts);
75
+ if (format === "json") {
76
+ console.log(JSON.stringify(velocity, null, 2));
77
+ return;
78
+ }
79
+ console.log("\n=== Review Velocity ===\n");
80
+ console.log(`Total data points: ${verdicts.length}\n`);
81
+ for (const v of velocity) {
82
+ console.log(`${v.period}: ${v.reviewCount} review(s)`);
83
+ console.log(` Findings: ${v.totalFindings} total, ${v.avgFindings.toFixed(1)} avg`);
84
+ console.log(` Pass rate: ${(v.passRate * 100).toFixed(0)}%`);
85
+ console.log(` Avg score: ${v.avgScore.toFixed(1)}`);
86
+ console.log();
87
+ }
88
+ if (velocity.length >= 2) {
89
+ const first = velocity[0];
90
+ const last = velocity[velocity.length - 1];
91
+ const trend = last.avgScore > first.avgScore ? "improving" : last.avgScore < first.avgScore ? "declining" : "stable";
92
+ console.log(`Trend: ${trend} (${first.avgScore.toFixed(1)} → ${last.avgScore.toFixed(1)})`);
93
+ }
94
+ }
95
+ //# sourceMappingURL=review-velocity-track.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-velocity-track.js","sourceRoot":"","sources":["../../src/commands/review-velocity-track.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runReviewWorkloadBalance(argv: string[]): void;
2
+ //# sourceMappingURL=review-workload-balance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-workload-balance.d.ts","sourceRoot":"","sources":["../../src/commands/review-workload-balance.ts"],"names":[],"mappings":"AA8DA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmE7D"}
@@ -0,0 +1,87 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ function computeWorkload(config) {
4
+ const loads = [];
5
+ for (const reviewer of config.reviewers) {
6
+ const assigned = reviewer.assignedReviews ?? 0;
7
+ const findings = reviewer.findingsHandled ?? 0;
8
+ const capacity = reviewer.capacity ?? 10;
9
+ const loadScore = capacity > 0 ? assigned / capacity : 1;
10
+ let recommendation;
11
+ if (loadScore > 0.9) {
12
+ recommendation = "Overloaded — reassign pending reviews";
13
+ }
14
+ else if (loadScore > 0.7) {
15
+ recommendation = "Heavy load — limit new assignments";
16
+ }
17
+ else if (loadScore < 0.3) {
18
+ recommendation = "Available — can take more reviews";
19
+ }
20
+ else {
21
+ recommendation = "Balanced";
22
+ }
23
+ loads.push({
24
+ reviewer: reviewer.name,
25
+ assignedReviews: assigned,
26
+ findingsHandled: findings,
27
+ lastActive: reviewer.lastActive ?? "unknown",
28
+ loadScore,
29
+ recommendation,
30
+ });
31
+ }
32
+ loads.sort((a, b) => a.loadScore - b.loadScore);
33
+ return loads;
34
+ }
35
+ export function runReviewWorkloadBalance(argv) {
36
+ if (argv.includes("--help") || argv.includes("-h")) {
37
+ console.log(`Usage: judges review-workload-balance [options]
38
+
39
+ Analyze and balance reviewer workload across team members.
40
+
41
+ Options:
42
+ --config <path> Path to team config JSON file
43
+ --format <fmt> Output format: table (default) or json
44
+ -h, --help Show this help message`);
45
+ return;
46
+ }
47
+ const formatIdx = argv.indexOf("--format");
48
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
49
+ const configIdx = argv.indexOf("--config");
50
+ const configPath = configIdx !== -1 && argv[configIdx + 1]
51
+ ? join(process.cwd(), argv[configIdx + 1])
52
+ : join(process.cwd(), ".judges", "team-workload.json");
53
+ if (!existsSync(configPath)) {
54
+ console.log(`No team config found at: ${configPath}`);
55
+ console.log("Create .judges/team-workload.json with reviewer data.");
56
+ console.log("\nExample:");
57
+ console.log(JSON.stringify({
58
+ reviewers: [
59
+ { name: "alice", assignedReviews: 5, findingsHandled: 23, capacity: 10, lastActive: "2026-03-14" },
60
+ { name: "bob", assignedReviews: 2, findingsHandled: 8, capacity: 8, lastActive: "2026-03-13" },
61
+ ],
62
+ }, null, 2));
63
+ return;
64
+ }
65
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
66
+ if (!config.reviewers || config.reviewers.length === 0) {
67
+ console.log("No reviewers defined in config.");
68
+ return;
69
+ }
70
+ const loads = computeWorkload(config);
71
+ if (format === "json") {
72
+ console.log(JSON.stringify(loads, null, 2));
73
+ return;
74
+ }
75
+ console.log("\n=== Review Workload Balance ===\n");
76
+ console.log(`Team size: ${loads.length}\n`);
77
+ for (const load of loads) {
78
+ const bar = "█".repeat(Math.round(load.loadScore * 10)) + "░".repeat(10 - Math.round(load.loadScore * 10));
79
+ console.log(`${load.reviewer}`);
80
+ console.log(` Load: [${bar}] ${(load.loadScore * 100).toFixed(0)}%`);
81
+ console.log(` Reviews: ${load.assignedReviews} | Findings: ${load.findingsHandled}`);
82
+ console.log(` Last active: ${load.lastActive}`);
83
+ console.log(` → ${load.recommendation}`);
84
+ console.log();
85
+ }
86
+ }
87
+ //# sourceMappingURL=review-workload-balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-workload-balance.js","sourceRoot":"","sources":["../../src/commands/review-workload-balance.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.102.0",
3
+ "version": "3.104.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.102.0",
10
+ "version": "3.104.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.102.0",
15
+ "version": "3.104.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }