@kevinrabun/judges 3.46.0 → 3.47.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 +12 -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/adoption-report.d.ts +8 -0
  6. package/dist/commands/adoption-report.d.ts.map +1 -0
  7. package/dist/commands/adoption-report.js +219 -0
  8. package/dist/commands/adoption-report.js.map +1 -0
  9. package/dist/commands/ai-model-trust.d.ts +17 -0
  10. package/dist/commands/ai-model-trust.d.ts.map +1 -0
  11. package/dist/commands/ai-model-trust.js +235 -0
  12. package/dist/commands/ai-model-trust.js.map +1 -0
  13. package/dist/commands/ai-prompt-audit.d.ts +23 -0
  14. package/dist/commands/ai-prompt-audit.d.ts.map +1 -0
  15. package/dist/commands/ai-prompt-audit.js +255 -0
  16. package/dist/commands/ai-prompt-audit.js.map +1 -0
  17. package/dist/commands/code-owner-suggest.d.ts +17 -0
  18. package/dist/commands/code-owner-suggest.d.ts.map +1 -0
  19. package/dist/commands/code-owner-suggest.js +215 -0
  20. package/dist/commands/code-owner-suggest.js.map +1 -0
  21. package/dist/commands/cost-forecast.d.ts +19 -0
  22. package/dist/commands/cost-forecast.d.ts.map +1 -0
  23. package/dist/commands/cost-forecast.js +194 -0
  24. package/dist/commands/cost-forecast.js.map +1 -0
  25. package/dist/commands/pr-quality-gate.d.ts +29 -0
  26. package/dist/commands/pr-quality-gate.d.ts.map +1 -0
  27. package/dist/commands/pr-quality-gate.js +208 -0
  28. package/dist/commands/pr-quality-gate.js.map +1 -0
  29. package/dist/commands/team-leaderboard.d.ts +25 -0
  30. package/dist/commands/team-leaderboard.d.ts.map +1 -0
  31. package/dist/commands/team-leaderboard.js +228 -0
  32. package/dist/commands/team-leaderboard.js.map +1 -0
  33. package/dist/commands/team-rules-sync.d.ts +8 -0
  34. package/dist/commands/team-rules-sync.d.ts.map +1 -0
  35. package/dist/commands/team-rules-sync.js +251 -0
  36. package/dist/commands/team-rules-sync.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Team leaderboard — gamified security review engagement
3
+ * tracking across developers.
4
+ *
5
+ * All data stays in local .judges-leaderboard/ directory.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
8
+ import { join } from "path";
9
+ const LB_DIR = ".judges-leaderboard";
10
+ const LB_FILE = join(LB_DIR, "leaderboard.json");
11
+ // ─── Badge definitions ──────────────────────────────────────────────────────
12
+ function computeBadges(dev) {
13
+ const badges = [];
14
+ if (dev.scansRun >= 100)
15
+ badges.push("Century Scanner");
16
+ else if (dev.scansRun >= 50)
17
+ badges.push("Veteran Scanner");
18
+ else if (dev.scansRun >= 10)
19
+ badges.push("Active Scanner");
20
+ if (dev.criticalFixed >= 10)
21
+ badges.push("Critical Crusher");
22
+ else if (dev.criticalFixed >= 5)
23
+ badges.push("Bug Buster");
24
+ if (dev.findingsFixed >= 50)
25
+ badges.push("Fix Master");
26
+ else if (dev.findingsFixed >= 20)
27
+ badges.push("Fixer Upper");
28
+ if (dev.streak >= 30)
29
+ badges.push("Monthly Streak");
30
+ else if (dev.streak >= 7)
31
+ badges.push("Weekly Streak");
32
+ if (dev.findingsReviewed >= 100)
33
+ badges.push("Review Champion");
34
+ return badges;
35
+ }
36
+ // ─── Core ───────────────────────────────────────────────────────────────────
37
+ function ensureDir() {
38
+ if (!existsSync(LB_DIR))
39
+ mkdirSync(LB_DIR, { recursive: true });
40
+ }
41
+ function loadStore() {
42
+ if (!existsSync(LB_FILE))
43
+ return { developers: [], updatedAt: new Date().toISOString() };
44
+ try {
45
+ return JSON.parse(readFileSync(LB_FILE, "utf-8"));
46
+ }
47
+ catch {
48
+ return { developers: [], updatedAt: new Date().toISOString() };
49
+ }
50
+ }
51
+ function saveStore(store) {
52
+ ensureDir();
53
+ store.updatedAt = new Date().toISOString();
54
+ writeFileSync(LB_FILE, JSON.stringify(store, null, 2));
55
+ }
56
+ function sanitizeAuthor(author) {
57
+ return author.replace(/[^a-zA-Z0-9@._-]/g, "_").slice(0, 100);
58
+ }
59
+ export function recordActivity(author, activity) {
60
+ const store = loadStore();
61
+ const safeAuthor = sanitizeAuthor(author);
62
+ let dev = store.developers.find((d) => d.author === safeAuthor);
63
+ if (!dev) {
64
+ dev = {
65
+ author: safeAuthor,
66
+ findingsReviewed: 0,
67
+ findingsFixed: 0,
68
+ criticalFixed: 0,
69
+ scansRun: 0,
70
+ streak: 0,
71
+ lastActive: "",
72
+ badges: [],
73
+ };
74
+ store.developers.push(dev);
75
+ }
76
+ dev.findingsReviewed += activity.reviewed || 0;
77
+ dev.findingsFixed += activity.fixed || 0;
78
+ dev.criticalFixed += activity.criticalFixed || 0;
79
+ dev.scansRun += activity.scansRun || 0;
80
+ // Streak tracking
81
+ const today = new Date().toISOString().slice(0, 10);
82
+ const yesterday = new Date(Date.now() - 86400000).toISOString().slice(0, 10);
83
+ if (dev.lastActive === yesterday || dev.lastActive === today) {
84
+ if (dev.lastActive !== today)
85
+ dev.streak++;
86
+ }
87
+ else {
88
+ dev.streak = 1;
89
+ }
90
+ dev.lastActive = today;
91
+ dev.badges = computeBadges(dev);
92
+ saveStore(store);
93
+ return dev;
94
+ }
95
+ // ─── CLI ────────────────────────────────────────────────────────────────────
96
+ export function runTeamLeaderboard(argv) {
97
+ if (argv.includes("--help") || argv.includes("-h")) {
98
+ console.log(`
99
+ judges team-leaderboard — Gamified security review engagement
100
+
101
+ Usage:
102
+ judges team-leaderboard
103
+ judges team-leaderboard --record --author "alice@co.com" --reviewed 5 --fixed 3
104
+ judges team-leaderboard --author "alice@co.com"
105
+ judges team-leaderboard --top 5
106
+ judges team-leaderboard --badges
107
+
108
+ Options:
109
+ --record Record developer activity
110
+ --author <email> Developer identifier
111
+ --reviewed <n> Findings reviewed count
112
+ --fixed <n> Findings fixed count
113
+ --critical-fixed <n> Critical findings fixed count
114
+ --scans <n> Scans run count
115
+ --top <n> Show top N developers (default: 10)
116
+ --badges Show badge catalog
117
+ --format json JSON output
118
+ --help, -h Show this help
119
+ `);
120
+ return;
121
+ }
122
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
123
+ // Badge catalog
124
+ if (argv.includes("--badges")) {
125
+ const catalog = [
126
+ { badge: "Century Scanner", requirement: "100+ scans run" },
127
+ { badge: "Veteran Scanner", requirement: "50+ scans run" },
128
+ { badge: "Active Scanner", requirement: "10+ scans run" },
129
+ { badge: "Critical Crusher", requirement: "10+ critical findings fixed" },
130
+ { badge: "Bug Buster", requirement: "5+ critical findings fixed" },
131
+ { badge: "Fix Master", requirement: "50+ findings fixed" },
132
+ { badge: "Fixer Upper", requirement: "20+ findings fixed" },
133
+ { badge: "Monthly Streak", requirement: "30+ day activity streak" },
134
+ { badge: "Weekly Streak", requirement: "7+ day activity streak" },
135
+ { badge: "Review Champion", requirement: "100+ findings reviewed" },
136
+ ];
137
+ if (format === "json") {
138
+ console.log(JSON.stringify(catalog, null, 2));
139
+ }
140
+ else {
141
+ console.log(`\n Badge Catalog\n ──────────────────────────`);
142
+ for (const b of catalog) {
143
+ console.log(` 🏆 ${b.badge.padEnd(20)} ${b.requirement}`);
144
+ }
145
+ console.log("");
146
+ }
147
+ return;
148
+ }
149
+ // Record activity
150
+ if (argv.includes("--record")) {
151
+ const author = argv.find((_a, i) => argv[i - 1] === "--author");
152
+ if (!author) {
153
+ console.error(" --author required for --record");
154
+ return;
155
+ }
156
+ const reviewed = parseInt(argv.find((_a, i) => argv[i - 1] === "--reviewed") || "0", 10);
157
+ const fixed = parseInt(argv.find((_a, i) => argv[i - 1] === "--fixed") || "0", 10);
158
+ const criticalFixed = parseInt(argv.find((_a, i) => argv[i - 1] === "--critical-fixed") || "0", 10);
159
+ const scansRun = parseInt(argv.find((_a, i) => argv[i - 1] === "--scans") || "0", 10);
160
+ const dev = recordActivity(author, { reviewed, fixed, criticalFixed, scansRun });
161
+ if (format === "json") {
162
+ console.log(JSON.stringify(dev, null, 2));
163
+ }
164
+ else {
165
+ console.log(`\n ✅ Activity recorded for ${dev.author}`);
166
+ console.log(` Reviewed: ${dev.findingsReviewed} | Fixed: ${dev.findingsFixed} | Streak: ${dev.streak}`);
167
+ if (dev.badges.length > 0)
168
+ console.log(` Badges: ${dev.badges.join(", ")}`);
169
+ console.log("");
170
+ }
171
+ return;
172
+ }
173
+ // Individual stats
174
+ const author = argv.find((_a, i) => argv[i - 1] === "--author");
175
+ if (author) {
176
+ const store = loadStore();
177
+ const dev = store.developers.find((d) => d.author === sanitizeAuthor(author));
178
+ if (!dev) {
179
+ console.error(` Developer not found: ${author}`);
180
+ return;
181
+ }
182
+ if (format === "json") {
183
+ console.log(JSON.stringify(dev, null, 2));
184
+ }
185
+ else {
186
+ console.log(`\n Developer Stats — ${dev.author}`);
187
+ console.log(` ──────────────────────────`);
188
+ console.log(` Reviewed: ${dev.findingsReviewed}`);
189
+ console.log(` Fixed: ${dev.findingsFixed}`);
190
+ console.log(` Critical fixed: ${dev.criticalFixed}`);
191
+ console.log(` Scans: ${dev.scansRun}`);
192
+ console.log(` Streak: ${dev.streak} days`);
193
+ console.log(` Badges: ${dev.badges.join(", ") || "none yet"}`);
194
+ console.log("");
195
+ }
196
+ return;
197
+ }
198
+ // Leaderboard
199
+ const topN = parseInt(argv.find((_a, i) => argv[i - 1] === "--top") || "10", 10);
200
+ const store = loadStore();
201
+ const sorted = [...store.developers].sort((a, b) => {
202
+ // Score: fixed * 3 + reviewed + criticalFixed * 5
203
+ const scoreA = a.findingsFixed * 3 + a.findingsReviewed + a.criticalFixed * 5;
204
+ const scoreB = b.findingsFixed * 3 + b.findingsReviewed + b.criticalFixed * 5;
205
+ return scoreB - scoreA;
206
+ });
207
+ const top = sorted.slice(0, topN);
208
+ if (format === "json") {
209
+ console.log(JSON.stringify(top, null, 2));
210
+ }
211
+ else {
212
+ console.log(`\n Team Leaderboard (top ${topN})\n ──────────────────────────`);
213
+ if (top.length === 0) {
214
+ console.log(" No data yet. Record activity with --record first.");
215
+ }
216
+ else {
217
+ top.forEach((dev, i) => {
218
+ const score = dev.findingsFixed * 3 + dev.findingsReviewed + dev.criticalFixed * 5;
219
+ const medal = i === 0 ? "🥇" : i === 1 ? "🥈" : i === 2 ? "🥉" : " ";
220
+ console.log(` ${medal} #${(i + 1).toString().padEnd(3)} ${dev.author.padEnd(25)} score: ${score.toString().padEnd(6)} streak: ${dev.streak}d`);
221
+ if (dev.badges.length)
222
+ console.log(` Badges: ${dev.badges.join(", ")}`);
223
+ });
224
+ }
225
+ console.log("");
226
+ }
227
+ }
228
+ //# sourceMappingURL=team-leaderboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-leaderboard.js","sourceRoot":"","sources":["../../src/commands/team-leaderboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Team rules sync — fast onboarding by pulling org rules from a
3
+ * shared config file or Git repo's .judgesrc.
4
+ *
5
+ * All config is read-only; stored locally only.
6
+ */
7
+ export declare function runTeamRulesSync(argv: string[]): void;
8
+ //# sourceMappingURL=team-rules-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-rules-sync.d.ts","sourceRoot":"","sources":["../../src/commands/team-rules-sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+IH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmIrD"}
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Team rules sync — fast onboarding by pulling org rules from a
3
+ * shared config file or Git repo's .judgesrc.
4
+ *
5
+ * All config is read-only; stored locally only.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from "fs";
8
+ import { join, basename } from "path";
9
+ const SYNC_DIR = ".judges-team-sync";
10
+ // ─── Built-in team templates ────────────────────────────────────────────────
11
+ const TEAM_TEMPLATES = {
12
+ "security-team": {
13
+ name: "Security Team",
14
+ preset: "strict,security-only",
15
+ disabledJudges: [],
16
+ disabledRules: [],
17
+ minSeverity: "low",
18
+ customRules: ["SEC-*", "INJECT-*", "CRYPTO-*", "AUTH-*"],
19
+ },
20
+ "frontend-team": {
21
+ name: "Frontend Team",
22
+ preset: "react,nextjs",
23
+ disabledJudges: [],
24
+ disabledRules: ["PERF-004", "PERF-005"],
25
+ minSeverity: "medium",
26
+ customRules: ["XSS-*", "DOM-*", "CSP-*"],
27
+ },
28
+ "backend-team": {
29
+ name: "Backend Team",
30
+ preset: "express,strict",
31
+ disabledJudges: [],
32
+ disabledRules: [],
33
+ minSeverity: "medium",
34
+ customRules: ["SQL-*", "AUTH-*", "SSRF-*", "CMD-*"],
35
+ },
36
+ "data-team": {
37
+ name: "Data Engineering Team",
38
+ preset: "lenient",
39
+ disabledJudges: [],
40
+ disabledRules: ["PERF-001"],
41
+ minSeverity: "high",
42
+ customRules: ["SQL-*", "SEC-*"],
43
+ },
44
+ startup: {
45
+ name: "Startup / Small Team",
46
+ preset: "startup",
47
+ disabledJudges: [],
48
+ disabledRules: [],
49
+ minSeverity: "medium",
50
+ customRules: [],
51
+ },
52
+ };
53
+ // ─── Core ───────────────────────────────────────────────────────────────────
54
+ function ensureDir() {
55
+ if (!existsSync(SYNC_DIR))
56
+ mkdirSync(SYNC_DIR, { recursive: true });
57
+ }
58
+ function loadSyncHistory() {
59
+ const file = join(SYNC_DIR, "sync-history.json");
60
+ if (!existsSync(file))
61
+ return [];
62
+ try {
63
+ return JSON.parse(readFileSync(file, "utf-8"));
64
+ }
65
+ catch {
66
+ return [];
67
+ }
68
+ }
69
+ function saveSyncHistory(history) {
70
+ ensureDir();
71
+ writeFileSync(join(SYNC_DIR, "sync-history.json"), JSON.stringify(history, null, 2));
72
+ }
73
+ function applyTeamConfig(config) {
74
+ // Load existing .judgesrc or create new
75
+ let existing = {};
76
+ if (existsSync(".judgesrc")) {
77
+ try {
78
+ existing = JSON.parse(readFileSync(".judgesrc", "utf-8"));
79
+ }
80
+ catch {
81
+ /* start fresh */
82
+ }
83
+ }
84
+ // Merge
85
+ if (config.preset)
86
+ existing["preset"] = config.preset;
87
+ if (config.disabledJudges?.length)
88
+ existing["disabledJudges"] = config.disabledJudges;
89
+ if (config.disabledRules?.length)
90
+ existing["disabledRules"] = config.disabledRules;
91
+ if (config.ruleOverrides)
92
+ existing["ruleOverrides"] = {
93
+ ...(existing["ruleOverrides"] || {}),
94
+ ...config.ruleOverrides,
95
+ };
96
+ if (config.minSeverity)
97
+ existing["minSeverity"] = config.minSeverity;
98
+ writeFileSync(".judgesrc", JSON.stringify(existing, null, 2));
99
+ const result = {
100
+ team: config.name,
101
+ rulesApplied: (config.customRules?.length || 0) + (config.disabledRules?.length || 0),
102
+ presetsApplied: config.preset ? config.preset.split(",") : [],
103
+ overridesApplied: config.ruleOverrides ? Object.keys(config.ruleOverrides).length : 0,
104
+ timestamp: new Date().toISOString(),
105
+ };
106
+ // Save history
107
+ const history = loadSyncHistory();
108
+ history.push(result);
109
+ if (history.length > 50)
110
+ history.splice(0, history.length - 50);
111
+ saveSyncHistory(history);
112
+ return result;
113
+ }
114
+ function syncFromFile(path) {
115
+ if (!existsSync(path))
116
+ throw new Error(`Config file not found: ${path}`);
117
+ const config = JSON.parse(readFileSync(path, "utf-8"));
118
+ if (!config.name)
119
+ config.name = basename(path, ".json");
120
+ return applyTeamConfig(config);
121
+ }
122
+ // ─── CLI ────────────────────────────────────────────────────────────────────
123
+ export function runTeamRulesSync(argv) {
124
+ if (argv.includes("--help") || argv.includes("-h")) {
125
+ console.log(`
126
+ judges team-rules-sync — Fast team onboarding with shared rules
127
+
128
+ Usage:
129
+ judges team-rules-sync --team security-team
130
+ judges team-rules-sync --from ./team-config.json
131
+ judges team-rules-sync --list
132
+ judges team-rules-sync --history
133
+ judges team-rules-sync --scan ./configs/
134
+
135
+ Options:
136
+ --team <name> Apply built-in team template
137
+ --from <path> Sync from a custom team config JSON file
138
+ --list List available team templates
139
+ --scan <dir> Find and list .judgesrc files in directory
140
+ --history Show sync history
141
+ --dry-run Preview changes without applying
142
+ --format json JSON output
143
+ --help, -h Show this help
144
+ `);
145
+ return;
146
+ }
147
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
148
+ // List templates
149
+ if (argv.includes("--list")) {
150
+ const templates = Object.entries(TEAM_TEMPLATES);
151
+ if (format === "json") {
152
+ console.log(JSON.stringify(TEAM_TEMPLATES, null, 2));
153
+ }
154
+ else {
155
+ console.log(`\n Team Templates (${templates.length})\n ──────────────────────────`);
156
+ for (const [id, t] of templates) {
157
+ console.log(` ${id.padEnd(20)} ${t.name.padEnd(25)} preset: ${t.preset || "none"}`);
158
+ }
159
+ console.log(`\n Use: judges team-rules-sync --team <name>\n`);
160
+ }
161
+ return;
162
+ }
163
+ // History
164
+ if (argv.includes("--history")) {
165
+ const history = loadSyncHistory();
166
+ if (format === "json") {
167
+ console.log(JSON.stringify(history, null, 2));
168
+ }
169
+ else {
170
+ console.log(`\n Sync History (${history.length} records)\n ──────────────────────────`);
171
+ for (const r of history.slice(-20)) {
172
+ console.log(` ${r.timestamp.slice(0, 10)} ${r.team.padEnd(25)} +${r.rulesApplied} rules, ${r.presetsApplied.join(",") || "none"}`);
173
+ }
174
+ console.log("");
175
+ }
176
+ return;
177
+ }
178
+ // Scan directory
179
+ const scanDir = argv.find((_a, i) => argv[i - 1] === "--scan");
180
+ if (scanDir) {
181
+ if (!existsSync(scanDir)) {
182
+ console.error(` Directory not found: ${scanDir}`);
183
+ return;
184
+ }
185
+ const files = readdirSync(scanDir, { recursive: true })
186
+ .map(String)
187
+ .filter((f) => f.endsWith(".judgesrc") || f.endsWith("judgesrc.json"));
188
+ if (format === "json") {
189
+ console.log(JSON.stringify(files, null, 2));
190
+ }
191
+ else {
192
+ console.log(`\n Config files found in ${scanDir}: ${files.length}\n ──────────────────────────`);
193
+ for (const f of files)
194
+ console.log(` ${f}`);
195
+ console.log("");
196
+ }
197
+ return;
198
+ }
199
+ // Apply team template
200
+ const teamId = argv.find((_a, i) => argv[i - 1] === "--team");
201
+ if (teamId) {
202
+ const template = TEAM_TEMPLATES[teamId];
203
+ if (!template) {
204
+ console.error(` Team template not found: ${teamId}`);
205
+ console.error(` Available: ${Object.keys(TEAM_TEMPLATES).join(", ")}`);
206
+ return;
207
+ }
208
+ if (argv.includes("--dry-run")) {
209
+ console.log(`\n Dry Run — ${template.name}\n ──────────────────────────`);
210
+ console.log(` Preset: ${template.preset || "none"}`);
211
+ console.log(` Rules: ${template.customRules?.join(", ") || "none"}`);
212
+ console.log(` Disabled: ${template.disabledRules?.join(", ") || "none"}`);
213
+ console.log(` Min sev: ${template.minSeverity || "default"}`);
214
+ console.log(`\n No changes applied (--dry-run)\n`);
215
+ return;
216
+ }
217
+ const result = applyTeamConfig(template);
218
+ if (format === "json") {
219
+ console.log(JSON.stringify(result, null, 2));
220
+ }
221
+ else {
222
+ console.log(`\n ✅ Team rules synced: ${result.team}`);
223
+ console.log(` Rules applied: ${result.rulesApplied}`);
224
+ console.log(` Presets: ${result.presetsApplied.join(", ")}`);
225
+ console.log(` .judgesrc updated\n`);
226
+ }
227
+ return;
228
+ }
229
+ // Sync from file
230
+ const fromPath = argv.find((_a, i) => argv[i - 1] === "--from");
231
+ if (fromPath) {
232
+ try {
233
+ const result = syncFromFile(fromPath);
234
+ if (format === "json") {
235
+ console.log(JSON.stringify(result, null, 2));
236
+ }
237
+ else {
238
+ console.log(`\n ✅ Synced from: ${fromPath}`);
239
+ console.log(` Team: ${result.team}`);
240
+ console.log(` Rules: ${result.rulesApplied}`);
241
+ console.log(` Presets: ${result.presetsApplied.join(", ")}\n`);
242
+ }
243
+ }
244
+ catch (err) {
245
+ console.error(` Error: ${err instanceof Error ? err.message : String(err)}`);
246
+ }
247
+ return;
248
+ }
249
+ console.error(" Use --team, --from, --list, or --history. --help for usage.");
250
+ }
251
+ //# sourceMappingURL=team-rules-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-rules-sync.js","sourceRoot":"","sources":["../../src/commands/team-rules-sync.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.46.0",
3
+ "version": "3.47.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.46.0",
10
+ "version": "3.47.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.46.0",
15
+ "version": "3.47.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }