@kevinrabun/judges 3.67.0 → 3.68.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 (38) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +56 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-cluster.d.ts +5 -0
  6. package/dist/commands/finding-cluster.d.ts.map +1 -0
  7. package/dist/commands/finding-cluster.js +158 -0
  8. package/dist/commands/finding-cluster.js.map +1 -0
  9. package/dist/commands/finding-hotspot.d.ts +5 -0
  10. package/dist/commands/finding-hotspot.d.ts.map +1 -0
  11. package/dist/commands/finding-hotspot.js +116 -0
  12. package/dist/commands/finding-hotspot.js.map +1 -0
  13. package/dist/commands/review-ab-test.d.ts +5 -0
  14. package/dist/commands/review-ab-test.d.ts.map +1 -0
  15. package/dist/commands/review-ab-test.js +225 -0
  16. package/dist/commands/review-ab-test.js.map +1 -0
  17. package/dist/commands/review-audit-log.d.ts +5 -0
  18. package/dist/commands/review-audit-log.d.ts.map +1 -0
  19. package/dist/commands/review-audit-log.js +140 -0
  20. package/dist/commands/review-audit-log.js.map +1 -0
  21. package/dist/commands/review-badge.d.ts +5 -0
  22. package/dist/commands/review-badge.d.ts.map +1 -0
  23. package/dist/commands/review-badge.js +153 -0
  24. package/dist/commands/review-badge.js.map +1 -0
  25. package/dist/commands/review-integration.d.ts +5 -0
  26. package/dist/commands/review-integration.d.ts.map +1 -0
  27. package/dist/commands/review-integration.js +237 -0
  28. package/dist/commands/review-integration.js.map +1 -0
  29. package/dist/commands/review-sandbox.d.ts +5 -0
  30. package/dist/commands/review-sandbox.d.ts.map +1 -0
  31. package/dist/commands/review-sandbox.js +192 -0
  32. package/dist/commands/review-sandbox.js.map +1 -0
  33. package/dist/commands/review-streak.d.ts +5 -0
  34. package/dist/commands/review-streak.d.ts.map +1 -0
  35. package/dist/commands/review-streak.js +151 -0
  36. package/dist/commands/review-streak.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Review-sandbox — Sandbox mode for testing review configurations safely.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const SANDBOX_FILE = join(".judges", "sandbox.json");
8
+ function loadStore() {
9
+ if (!existsSync(SANDBOX_FILE))
10
+ return { version: "1.0.0", active: "", sandboxes: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(SANDBOX_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", active: "", sandboxes: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(SANDBOX_FILE), { recursive: true });
20
+ writeFileSync(SANDBOX_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ // ─── CLI ────────────────────────────────────────────────────────────────────
23
+ export function runReviewSandbox(argv) {
24
+ if (argv.includes("--help") || argv.includes("-h")) {
25
+ console.log(`
26
+ judges review-sandbox — Test review configurations safely
27
+
28
+ Usage:
29
+ judges review-sandbox create --name experiment1 Create a sandbox
30
+ judges review-sandbox list List sandboxes
31
+ judges review-sandbox activate --name experiment1 Activate sandbox
32
+ judges review-sandbox deactivate Deactivate sandbox
33
+ judges review-sandbox delete --name experiment1 Delete a sandbox
34
+ judges review-sandbox show --name experiment1 Show sandbox details
35
+ judges review-sandbox apply --name experiment1 Apply sandbox to real config
36
+
37
+ Options:
38
+ --name <name> Sandbox name
39
+ --preset <preset> Base preset for sandbox
40
+ --disable <judges> Comma-separated judges to disable
41
+ --severity <level> Minimum severity override
42
+ --notes <text> Description/notes
43
+ --format json JSON output
44
+ --help, -h Show this help
45
+
46
+ Test different review configurations without affecting your real setup.
47
+ Data stored locally in .judges/sandbox.json.
48
+ `);
49
+ return;
50
+ }
51
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
52
+ const subcommand = argv.find((a) => ["create", "list", "activate", "deactivate", "delete", "show", "apply"].includes(a)) || "list";
53
+ const store = loadStore();
54
+ const name = argv.find((_a, i) => argv[i - 1] === "--name");
55
+ if (subcommand === "create") {
56
+ if (!name) {
57
+ console.error("Error: --name is required.");
58
+ process.exitCode = 1;
59
+ return;
60
+ }
61
+ if (store.sandboxes.find((s) => s.name === name)) {
62
+ console.error(`Error: Sandbox "${name}" already exists.`);
63
+ process.exitCode = 1;
64
+ return;
65
+ }
66
+ const preset = argv.find((_a, i) => argv[i - 1] === "--preset") || "";
67
+ const disable = argv.find((_a, i) => argv[i - 1] === "--disable") || "";
68
+ const severity = argv.find((_a, i) => argv[i - 1] === "--severity") || "";
69
+ const notes = argv.find((_a, i) => argv[i - 1] === "--notes") || "";
70
+ const overrides = {};
71
+ if (preset)
72
+ overrides.preset = preset;
73
+ if (disable)
74
+ overrides.disabledJudges = disable.split(",").map((s) => s.trim());
75
+ if (severity)
76
+ overrides.minSeverity = severity;
77
+ // Load current .judgesrc as base
78
+ let baseConfig = {};
79
+ if (existsSync(".judgesrc")) {
80
+ try {
81
+ baseConfig = JSON.parse(readFileSync(".judgesrc", "utf-8"));
82
+ }
83
+ catch {
84
+ /* empty */
85
+ }
86
+ }
87
+ store.sandboxes.push({
88
+ name,
89
+ createdAt: new Date().toISOString(),
90
+ baseConfig,
91
+ overrides,
92
+ notes,
93
+ });
94
+ saveStore(store);
95
+ console.log(`Sandbox "${name}" created.`);
96
+ return;
97
+ }
98
+ if (subcommand === "activate") {
99
+ if (!name) {
100
+ console.error("Error: --name is required.");
101
+ process.exitCode = 1;
102
+ return;
103
+ }
104
+ if (!store.sandboxes.find((s) => s.name === name)) {
105
+ console.error(`Error: Sandbox "${name}" not found.`);
106
+ process.exitCode = 1;
107
+ return;
108
+ }
109
+ store.active = name;
110
+ saveStore(store);
111
+ console.log(`Sandbox "${name}" activated. Reviews will use sandbox config.`);
112
+ return;
113
+ }
114
+ if (subcommand === "deactivate") {
115
+ store.active = "";
116
+ saveStore(store);
117
+ console.log("Sandbox deactivated. Reviews will use normal config.");
118
+ return;
119
+ }
120
+ if (subcommand === "delete") {
121
+ if (!name) {
122
+ console.error("Error: --name is required.");
123
+ process.exitCode = 1;
124
+ return;
125
+ }
126
+ store.sandboxes = store.sandboxes.filter((s) => s.name !== name);
127
+ if (store.active === name)
128
+ store.active = "";
129
+ saveStore(store);
130
+ console.log(`Sandbox "${name}" deleted.`);
131
+ return;
132
+ }
133
+ if (subcommand === "show") {
134
+ if (!name) {
135
+ console.error("Error: --name is required.");
136
+ process.exitCode = 1;
137
+ return;
138
+ }
139
+ const sandbox = store.sandboxes.find((s) => s.name === name);
140
+ if (!sandbox) {
141
+ console.error(`Error: Sandbox "${name}" not found.`);
142
+ process.exitCode = 1;
143
+ return;
144
+ }
145
+ if (format === "json") {
146
+ console.log(JSON.stringify(sandbox, null, 2));
147
+ return;
148
+ }
149
+ console.log(`\nSandbox: ${sandbox.name}`);
150
+ console.log("─".repeat(40));
151
+ console.log(` Created: ${sandbox.createdAt.slice(0, 19)}`);
152
+ console.log(` Active: ${store.active === sandbox.name ? "YES" : "no"}`);
153
+ console.log(` Notes: ${sandbox.notes || "-"}`);
154
+ console.log(` Overrides: ${JSON.stringify(sandbox.overrides)}`);
155
+ console.log("─".repeat(40));
156
+ return;
157
+ }
158
+ if (subcommand === "apply") {
159
+ if (!name) {
160
+ console.error("Error: --name is required.");
161
+ process.exitCode = 1;
162
+ return;
163
+ }
164
+ const sandbox = store.sandboxes.find((s) => s.name === name);
165
+ if (!sandbox) {
166
+ console.error(`Error: Sandbox "${name}" not found.`);
167
+ process.exitCode = 1;
168
+ return;
169
+ }
170
+ const merged = { ...sandbox.baseConfig, ...sandbox.overrides };
171
+ writeFileSync(".judgesrc", JSON.stringify(merged, null, 2), "utf-8");
172
+ console.log(`Applied sandbox "${name}" config to .judgesrc.`);
173
+ return;
174
+ }
175
+ // list
176
+ if (format === "json") {
177
+ console.log(JSON.stringify({ active: store.active, sandboxes: store.sandboxes.map((s) => s.name) }, null, 2));
178
+ return;
179
+ }
180
+ if (store.sandboxes.length === 0) {
181
+ console.log("No sandboxes configured. Use 'judges review-sandbox create --name <n>' to create one.");
182
+ return;
183
+ }
184
+ console.log("\nSandboxes:");
185
+ console.log("─".repeat(50));
186
+ for (const s of store.sandboxes) {
187
+ const active = store.active === s.name ? " [ACTIVE]" : "";
188
+ console.log(` ${s.name}${active} (created: ${s.createdAt.slice(0, 10)})`);
189
+ }
190
+ console.log("─".repeat(50));
191
+ }
192
+ //# sourceMappingURL=review-sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-sandbox.js","sourceRoot":"","sources":["../../src/commands/review-sandbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-streak — Track consecutive clean review streaks to encourage habitual use.
3
+ */
4
+ export declare function runReviewStreak(argv: string[]): void;
5
+ //# sourceMappingURL=review-streak.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-streak.d.ts","sourceRoot":"","sources":["../../src/commands/review-streak.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgEH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqHpD"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Review-streak — Track consecutive clean review streaks to encourage habitual use.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const STREAK_FILE = join(".judges", "review-streak.json");
8
+ function loadStore() {
9
+ if (!existsSync(STREAK_FILE))
10
+ return { version: "1.0.0", currentStreak: 0, longestStreak: 0, totalReviews: 0, totalPassed: 0, entries: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(STREAK_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", currentStreak: 0, longestStreak: 0, totalReviews: 0, totalPassed: 0, entries: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(STREAK_FILE), { recursive: true });
20
+ writeFileSync(STREAK_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ // ─── Helpers ────────────────────────────────────────────────────────────────
23
+ function todayStr() {
24
+ return new Date().toISOString().slice(0, 10);
25
+ }
26
+ function recalcStreak(entries) {
27
+ let longest = 0;
28
+ let streak = 0;
29
+ for (const e of entries) {
30
+ if (e.passed) {
31
+ streak++;
32
+ if (streak > longest)
33
+ longest = streak;
34
+ }
35
+ else {
36
+ streak = 0;
37
+ }
38
+ }
39
+ return { current: streak, longest };
40
+ }
41
+ // ─── CLI ────────────────────────────────────────────────────────────────────
42
+ export function runReviewStreak(argv) {
43
+ if (argv.includes("--help") || argv.includes("-h")) {
44
+ console.log(`
45
+ judges review-streak — Track consecutive clean review streaks
46
+
47
+ Usage:
48
+ judges review-streak show Show current streak
49
+ judges review-streak record --score 8.5 Record a review result
50
+ judges review-streak record --pass Record a passing review
51
+ judges review-streak record --fail Record a failing review
52
+ judges review-streak reset Reset streak data
53
+ judges review-streak history Show full history
54
+
55
+ Options:
56
+ --score <n> Review score (pass if >= 7.0)
57
+ --pass Record as passing
58
+ --fail Record as failing
59
+ --threshold <n> Custom pass threshold (default: 7.0)
60
+ --format json JSON output
61
+ --help, -h Show this help
62
+
63
+ Tracks daily review streaks to encourage consistent code review habits.
64
+ Data stored locally in .judges/review-streak.json.
65
+ `);
66
+ return;
67
+ }
68
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
69
+ const subcommand = argv.find((a) => ["show", "record", "reset", "history"].includes(a)) || "show";
70
+ const store = loadStore();
71
+ if (subcommand === "record") {
72
+ const threshold = parseFloat(argv.find((_a, i) => argv[i - 1] === "--threshold") || "7.0");
73
+ const scoreArg = argv.find((_a, i) => argv[i - 1] === "--score");
74
+ const score = scoreArg ? parseFloat(scoreArg) : 0;
75
+ let passed = score >= threshold;
76
+ if (argv.includes("--pass"))
77
+ passed = true;
78
+ if (argv.includes("--fail"))
79
+ passed = false;
80
+ const today = todayStr();
81
+ const existing = store.entries.findIndex((e) => e.date === today);
82
+ const entry = { date: today, passed, score, criticalCount: 0 };
83
+ if (existing >= 0) {
84
+ store.entries[existing] = entry;
85
+ }
86
+ else {
87
+ store.entries.push(entry);
88
+ }
89
+ store.entries.sort((a, b) => a.date.localeCompare(b.date));
90
+ store.totalReviews++;
91
+ if (passed)
92
+ store.totalPassed++;
93
+ const { current, longest } = recalcStreak(store.entries);
94
+ store.currentStreak = current;
95
+ store.longestStreak = longest;
96
+ saveStore(store);
97
+ console.log(`Recorded ${passed ? "PASS" : "FAIL"} for ${today}. Current streak: ${current} day(s).`);
98
+ return;
99
+ }
100
+ if (subcommand === "reset") {
101
+ saveStore({ version: "1.0.0", currentStreak: 0, longestStreak: 0, totalReviews: 0, totalPassed: 0, entries: [] });
102
+ console.log("Streak data reset.");
103
+ return;
104
+ }
105
+ if (subcommand === "history") {
106
+ if (store.entries.length === 0) {
107
+ console.log("No review history recorded yet.");
108
+ return;
109
+ }
110
+ if (format === "json") {
111
+ console.log(JSON.stringify(store.entries, null, 2));
112
+ return;
113
+ }
114
+ console.log("\nReview History:");
115
+ console.log("─".repeat(50));
116
+ for (const e of store.entries) {
117
+ const status = e.passed ? "PASS" : "FAIL";
118
+ console.log(` ${e.date} ${status} score=${e.score.toFixed(1)}`);
119
+ }
120
+ console.log("─".repeat(50));
121
+ return;
122
+ }
123
+ // show
124
+ if (format === "json") {
125
+ console.log(JSON.stringify({
126
+ currentStreak: store.currentStreak,
127
+ longestStreak: store.longestStreak,
128
+ totalReviews: store.totalReviews,
129
+ totalPassed: store.totalPassed,
130
+ passRate: store.totalReviews > 0 ? ((store.totalPassed / store.totalReviews) * 100).toFixed(1) + "%" : "N/A",
131
+ }, null, 2));
132
+ return;
133
+ }
134
+ console.log("\n🔥 Review Streak Dashboard");
135
+ console.log("─".repeat(40));
136
+ console.log(` Current streak: ${store.currentStreak} day(s)`);
137
+ console.log(` Longest streak: ${store.longestStreak} day(s)`);
138
+ console.log(` Total reviews: ${store.totalReviews}`);
139
+ console.log(` Pass rate: ${store.totalReviews > 0 ? ((store.totalPassed / store.totalReviews) * 100).toFixed(1) + "%" : "N/A"}`);
140
+ console.log("─".repeat(40));
141
+ if (store.currentStreak >= 30)
142
+ console.log(" Achievement: Platinum — 30+ day streak!");
143
+ else if (store.currentStreak >= 14)
144
+ console.log(" Achievement: Gold — 14+ day streak!");
145
+ else if (store.currentStreak >= 7)
146
+ console.log(" Achievement: Silver — 7+ day streak!");
147
+ else if (store.currentStreak >= 3)
148
+ console.log(" Achievement: Bronze — 3+ day streak!");
149
+ console.log();
150
+ }
151
+ //# sourceMappingURL=review-streak.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-streak.js","sourceRoot":"","sources":["../../src/commands/review-streak.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAoBrC,+EAA+E;AAE/E,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAE1D,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAChH,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAgB,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAChH,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAkB;IACnC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,+EAA+E;AAE/E,SAAS,QAAQ;IACf,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,YAAY,CAAC,OAAsB;IAC1C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,EAAE,CAAC;YACT,IAAI,MAAM,GAAG,OAAO;gBAAE,OAAO,GAAG,MAAM,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACtC,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;CAqBf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC;IAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAClG,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAE1B,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,aAAa,CAAC,IAAI,KAAK,CAAC,CAAC;QAC3G,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,MAAM,GAAG,KAAK,IAAI,SAAS,CAAC;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC;QAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,MAAM,GAAG,KAAK,CAAC;QAE5C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QAClE,MAAM,KAAK,GAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;QAC5E,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAE3D,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,IAAI,MAAM;YAAE,KAAK,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC;QAC9B,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC;QAC9B,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,KAAK,qBAAqB,OAAO,UAAU,CAAC,CAAC;QACrG,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAClH,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,OAAO;IACP,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK;SAC7G,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,aAAa,SAAS,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,aAAa,SAAS,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CACT,sBAAsB,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAC3H,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,IAAI,KAAK,CAAC,aAAa,IAAI,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;SACnF,IAAI,KAAK,CAAC,aAAa,IAAI,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;SACpF,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;SACpF,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinrabun/judges",
3
- "version": "3.67.0",
3
+ "version": "3.68.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.67.0",
10
+ "version": "3.68.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.67.0",
15
+ "version": "3.68.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }