@kevinrabun/judges 3.46.0 → 3.48.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 (70) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +112 -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/audit-trail.d.ts +18 -0
  18. package/dist/commands/audit-trail.d.ts.map +1 -0
  19. package/dist/commands/audit-trail.js +155 -0
  20. package/dist/commands/audit-trail.js.map +1 -0
  21. package/dist/commands/auto-fix.d.ts +18 -0
  22. package/dist/commands/auto-fix.d.ts.map +1 -0
  23. package/dist/commands/auto-fix.js +241 -0
  24. package/dist/commands/auto-fix.js.map +1 -0
  25. package/dist/commands/code-owner-suggest.d.ts +17 -0
  26. package/dist/commands/code-owner-suggest.d.ts.map +1 -0
  27. package/dist/commands/code-owner-suggest.js +215 -0
  28. package/dist/commands/code-owner-suggest.js.map +1 -0
  29. package/dist/commands/cost-forecast.d.ts +19 -0
  30. package/dist/commands/cost-forecast.d.ts.map +1 -0
  31. package/dist/commands/cost-forecast.js +194 -0
  32. package/dist/commands/cost-forecast.js.map +1 -0
  33. package/dist/commands/dep-correlate.d.ts +9 -0
  34. package/dist/commands/dep-correlate.d.ts.map +1 -0
  35. package/dist/commands/dep-correlate.js +208 -0
  36. package/dist/commands/dep-correlate.js.map +1 -0
  37. package/dist/commands/doc-gen.d.ts +8 -0
  38. package/dist/commands/doc-gen.d.ts.map +1 -0
  39. package/dist/commands/doc-gen.js +209 -0
  40. package/dist/commands/doc-gen.js.map +1 -0
  41. package/dist/commands/judge-author.d.ts +8 -0
  42. package/dist/commands/judge-author.d.ts.map +1 -0
  43. package/dist/commands/judge-author.js +261 -0
  44. package/dist/commands/judge-author.js.map +1 -0
  45. package/dist/commands/pattern-registry.d.ts +23 -0
  46. package/dist/commands/pattern-registry.d.ts.map +1 -0
  47. package/dist/commands/pattern-registry.js +227 -0
  48. package/dist/commands/pattern-registry.js.map +1 -0
  49. package/dist/commands/perf-hotspot.d.ts +8 -0
  50. package/dist/commands/perf-hotspot.d.ts.map +1 -0
  51. package/dist/commands/perf-hotspot.js +274 -0
  52. package/dist/commands/perf-hotspot.js.map +1 -0
  53. package/dist/commands/pr-quality-gate.d.ts +29 -0
  54. package/dist/commands/pr-quality-gate.d.ts.map +1 -0
  55. package/dist/commands/pr-quality-gate.js +208 -0
  56. package/dist/commands/pr-quality-gate.js.map +1 -0
  57. package/dist/commands/security-maturity.d.ts +8 -0
  58. package/dist/commands/security-maturity.d.ts.map +1 -0
  59. package/dist/commands/security-maturity.js +313 -0
  60. package/dist/commands/security-maturity.js.map +1 -0
  61. package/dist/commands/team-leaderboard.d.ts +25 -0
  62. package/dist/commands/team-leaderboard.d.ts.map +1 -0
  63. package/dist/commands/team-leaderboard.js +228 -0
  64. package/dist/commands/team-leaderboard.js.map +1 -0
  65. package/dist/commands/team-rules-sync.d.ts +8 -0
  66. package/dist/commands/team-rules-sync.d.ts.map +1 -0
  67. package/dist/commands/team-rules-sync.js +251 -0
  68. package/dist/commands/team-rules-sync.js.map +1 -0
  69. package/package.json +1 -1
  70. 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.48.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.48.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.46.0",
15
+ "version": "3.48.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }