@kevinrabun/judges 3.66.0 → 3.67.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 +8 -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/config-lint.d.ts +5 -0
  6. package/dist/commands/config-lint.d.ts.map +1 -0
  7. package/dist/commands/config-lint.js +188 -0
  8. package/dist/commands/config-lint.js.map +1 -0
  9. package/dist/commands/finding-age.d.ts +5 -0
  10. package/dist/commands/finding-age.d.ts.map +1 -0
  11. package/dist/commands/finding-age.js +146 -0
  12. package/dist/commands/finding-age.js.map +1 -0
  13. package/dist/commands/finding-rank.d.ts +5 -0
  14. package/dist/commands/finding-rank.d.ts.map +1 -0
  15. package/dist/commands/finding-rank.js +139 -0
  16. package/dist/commands/finding-rank.js.map +1 -0
  17. package/dist/commands/review-dashboard.d.ts +5 -0
  18. package/dist/commands/review-dashboard.d.ts.map +1 -0
  19. package/dist/commands/review-dashboard.js +141 -0
  20. package/dist/commands/review-dashboard.js.map +1 -0
  21. package/dist/commands/review-diff-summary.d.ts +5 -0
  22. package/dist/commands/review-diff-summary.d.ts.map +1 -0
  23. package/dist/commands/review-diff-summary.js +155 -0
  24. package/dist/commands/review-diff-summary.js.map +1 -0
  25. package/dist/commands/review-notify.d.ts +5 -0
  26. package/dist/commands/review-notify.d.ts.map +1 -0
  27. package/dist/commands/review-notify.js +144 -0
  28. package/dist/commands/review-notify.js.map +1 -0
  29. package/dist/commands/review-offline.d.ts +5 -0
  30. package/dist/commands/review-offline.d.ts.map +1 -0
  31. package/dist/commands/review-offline.js +126 -0
  32. package/dist/commands/review-offline.js.map +1 -0
  33. package/dist/commands/review-quota.d.ts +5 -0
  34. package/dist/commands/review-quota.d.ts.map +1 -0
  35. package/dist/commands/review-quota.js +127 -0
  36. package/dist/commands/review-quota.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-quota.d.ts","sourceRoot":"","sources":["../../src/commands/review-quota.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiDH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqHnD"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Review-quota — Track review usage quotas locally.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const QUOTA_FILE = join(".judges", "review-quota.json");
8
+ function loadQuota() {
9
+ if (!existsSync(QUOTA_FILE))
10
+ return { version: "1.0.0", dailyLimit: 100, monthlyLimit: 3000, usage: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(QUOTA_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", dailyLimit: 100, monthlyLimit: 3000, usage: [] };
16
+ }
17
+ }
18
+ function saveQuota(store) {
19
+ mkdirSync(dirname(QUOTA_FILE), { recursive: true });
20
+ writeFileSync(QUOTA_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ function today() {
23
+ return new Date().toISOString().slice(0, 10);
24
+ }
25
+ function thisMonth() {
26
+ return new Date().toISOString().slice(0, 7);
27
+ }
28
+ // ─── CLI ────────────────────────────────────────────────────────────────────
29
+ export function runReviewQuota(argv) {
30
+ if (argv.includes("--help") || argv.includes("-h")) {
31
+ console.log(`
32
+ judges review-quota — Track review usage quotas
33
+
34
+ Usage:
35
+ judges review-quota show Show current usage
36
+ judges review-quota record --files 5 --findings 12 Record usage
37
+ judges review-quota set --daily 200 --monthly 5000 Set limits
38
+ judges review-quota reset Reset usage data
39
+
40
+ Subcommands:
41
+ show Show current usage and quotas
42
+ record Record a review session
43
+ set Set daily/monthly limits
44
+ reset Reset all usage data
45
+
46
+ Options:
47
+ --files <n> Number of files reviewed
48
+ --findings <n> Number of findings generated
49
+ --daily <n> Daily review limit
50
+ --monthly <n> Monthly review limit
51
+ --format json JSON output
52
+ --help, -h Show this help
53
+
54
+ Quotas are tracked locally in .judges/review-quota.json.
55
+ `);
56
+ return;
57
+ }
58
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
59
+ const subcommand = argv.find((a) => ["show", "record", "set", "reset"].includes(a)) || "show";
60
+ const store = loadQuota();
61
+ if (subcommand === "record") {
62
+ const files = parseInt(argv.find((_a, i) => argv[i - 1] === "--files") || "1", 10);
63
+ const findings = parseInt(argv.find((_a, i) => argv[i - 1] === "--findings") || "0", 10);
64
+ const todayStr = today();
65
+ const existing = store.usage.find((u) => u.date === todayStr);
66
+ if (existing) {
67
+ existing.reviewCount++;
68
+ existing.filesReviewed += files;
69
+ existing.findingsGenerated += findings;
70
+ }
71
+ else {
72
+ store.usage.push({ date: todayStr, reviewCount: 1, filesReviewed: files, findingsGenerated: findings });
73
+ }
74
+ saveQuota(store);
75
+ console.log(`Recorded: ${files} files, ${findings} findings.`);
76
+ return;
77
+ }
78
+ if (subcommand === "set") {
79
+ const daily = argv.find((_a, i) => argv[i - 1] === "--daily");
80
+ const monthly = argv.find((_a, i) => argv[i - 1] === "--monthly");
81
+ if (daily)
82
+ store.dailyLimit = parseInt(daily, 10);
83
+ if (monthly)
84
+ store.monthlyLimit = parseInt(monthly, 10);
85
+ saveQuota(store);
86
+ console.log(`Limits set — daily: ${store.dailyLimit}, monthly: ${store.monthlyLimit}`);
87
+ return;
88
+ }
89
+ if (subcommand === "reset") {
90
+ store.usage = [];
91
+ saveQuota(store);
92
+ console.log("Usage data reset.");
93
+ return;
94
+ }
95
+ // Show
96
+ const todayStr = today();
97
+ const monthStr = thisMonth();
98
+ const todayUsage = store.usage.find((u) => u.date === todayStr);
99
+ const dailyReviews = todayUsage ? todayUsage.reviewCount : 0;
100
+ const monthlyReviews = store.usage
101
+ .filter((u) => u.date.startsWith(monthStr))
102
+ .reduce((sum, u) => sum + u.reviewCount, 0);
103
+ const dailyPct = store.dailyLimit > 0 ? Math.round((dailyReviews / store.dailyLimit) * 100) : 0;
104
+ const monthlyPct = store.monthlyLimit > 0 ? Math.round((monthlyReviews / store.monthlyLimit) * 100) : 0;
105
+ if (format === "json") {
106
+ console.log(JSON.stringify({
107
+ daily: { used: dailyReviews, limit: store.dailyLimit, percent: dailyPct },
108
+ monthly: { used: monthlyReviews, limit: store.monthlyLimit, percent: monthlyPct },
109
+ today: todayUsage || null,
110
+ }, null, 2));
111
+ return;
112
+ }
113
+ const dailyBar = "█".repeat(Math.min(Math.round(dailyPct / 5), 20)) + "░".repeat(Math.max(20 - Math.round(dailyPct / 5), 0));
114
+ const monthlyBar = "█".repeat(Math.min(Math.round(monthlyPct / 5), 20)) + "░".repeat(Math.max(20 - Math.round(monthlyPct / 5), 0));
115
+ console.log(`\n Review Quota\n ═════════════════════════════`);
116
+ console.log(` Daily: ${dailyBar} ${dailyReviews}/${store.dailyLimit} (${dailyPct}%)`);
117
+ console.log(` Monthly: ${monthlyBar} ${monthlyReviews}/${store.monthlyLimit} (${monthlyPct}%)`);
118
+ if (todayUsage) {
119
+ console.log(`\n Today: ${todayUsage.reviewCount} reviews, ${todayUsage.filesReviewed} files, ${todayUsage.findingsGenerated} findings`);
120
+ }
121
+ if (dailyPct >= 90)
122
+ console.log("\n ⚠️ Approaching daily limit!");
123
+ if (monthlyPct >= 90)
124
+ console.log(" ⚠️ Approaching monthly limit!");
125
+ console.log();
126
+ }
127
+ //# sourceMappingURL=review-quota.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-quota.js","sourceRoot":"","sources":["../../src/commands/review-quota.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.66.0",
3
+ "version": "3.67.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.66.0",
10
+ "version": "3.67.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.66.0",
15
+ "version": "3.67.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }