@kevinrabun/judges 3.62.0 → 3.63.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 +7 -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-group.d.ts +16 -0
  6. package/dist/commands/finding-group.d.ts.map +1 -0
  7. package/dist/commands/finding-group.js +165 -0
  8. package/dist/commands/finding-group.js.map +1 -0
  9. package/dist/commands/ignore-list.d.ts +19 -0
  10. package/dist/commands/ignore-list.d.ts.map +1 -0
  11. package/dist/commands/ignore-list.js +166 -0
  12. package/dist/commands/ignore-list.js.map +1 -0
  13. package/dist/commands/incremental-review.d.ts +5 -0
  14. package/dist/commands/incremental-review.d.ts.map +1 -0
  15. package/dist/commands/incremental-review.js +240 -0
  16. package/dist/commands/incremental-review.js.map +1 -0
  17. package/dist/commands/review-cache.d.ts +23 -0
  18. package/dist/commands/review-cache.d.ts.map +1 -0
  19. package/dist/commands/review-cache.js +135 -0
  20. package/dist/commands/review-cache.js.map +1 -0
  21. package/dist/commands/review-log.d.ts +23 -0
  22. package/dist/commands/review-log.d.ts.map +1 -0
  23. package/dist/commands/review-log.js +165 -0
  24. package/dist/commands/review-log.js.map +1 -0
  25. package/dist/commands/review-summary.d.ts +5 -0
  26. package/dist/commands/review-summary.d.ts.map +1 -0
  27. package/dist/commands/review-summary.js +175 -0
  28. package/dist/commands/review-summary.js.map +1 -0
  29. package/dist/commands/rule-test.d.ts +5 -0
  30. package/dist/commands/rule-test.d.ts.map +1 -0
  31. package/dist/commands/rule-test.js +216 -0
  32. package/dist/commands/rule-test.js.map +1 -0
  33. package/dist/commands/team-config.d.ts +5 -0
  34. package/dist/commands/team-config.d.ts.map +1 -0
  35. package/dist/commands/team-config.js +235 -0
  36. package/dist/commands/team-config.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Rule-test — Test custom rules against sample code before deployment.
3
+ */
4
+ import { readFileSync, existsSync, readdirSync, statSync } from "fs";
5
+ import { join, extname } from "path";
6
+ // ─── Rule loading ───────────────────────────────────────────────────────────
7
+ function loadRules(rulesPath) {
8
+ const raw = readFileSync(rulesPath, "utf-8");
9
+ const parsed = JSON.parse(raw);
10
+ const rules = Array.isArray(parsed) ? parsed : parsed.rules || [];
11
+ return rules;
12
+ }
13
+ // ─── File collection ────────────────────────────────────────────────────────
14
+ function collectFiles(dirPath) {
15
+ const results = [];
16
+ if (!existsSync(dirPath))
17
+ return results;
18
+ const entries = readdirSync(dirPath);
19
+ for (const entry of entries) {
20
+ const fullPath = join(dirPath, entry);
21
+ try {
22
+ const st = statSync(fullPath);
23
+ if (st.isDirectory()) {
24
+ results.push(...collectFiles(fullPath));
25
+ }
26
+ else {
27
+ results.push(fullPath);
28
+ }
29
+ }
30
+ catch {
31
+ // skip inaccessible entries
32
+ }
33
+ }
34
+ return results;
35
+ }
36
+ // ─── Language matching ──────────────────────────────────────────────────────
37
+ const EXT_TO_LANG = {
38
+ ".ts": "typescript",
39
+ ".tsx": "typescript",
40
+ ".js": "javascript",
41
+ ".jsx": "javascript",
42
+ ".py": "python",
43
+ ".go": "go",
44
+ ".rs": "rust",
45
+ ".java": "java",
46
+ ".cs": "csharp",
47
+ ".cpp": "cpp",
48
+ ".c": "c",
49
+ ".rb": "ruby",
50
+ ".php": "php",
51
+ };
52
+ function matchesLanguage(filePath, languages) {
53
+ if (!languages || languages.length === 0)
54
+ return true;
55
+ const ext = extname(filePath).toLowerCase();
56
+ const lang = EXT_TO_LANG[ext] || ext.slice(1);
57
+ return languages.includes(lang);
58
+ }
59
+ // ─── Rule testing ───────────────────────────────────────────────────────────
60
+ function testRule(rule, files) {
61
+ const results = [];
62
+ let regex;
63
+ try {
64
+ regex = new RegExp(rule.pattern, "gi");
65
+ }
66
+ catch {
67
+ console.error(` ❌ Rule '${rule.id}' has invalid regex: ${rule.pattern}`);
68
+ return results;
69
+ }
70
+ for (const file of files) {
71
+ if (!matchesLanguage(file, rule.languages))
72
+ continue;
73
+ let content;
74
+ try {
75
+ content = readFileSync(file, "utf-8");
76
+ }
77
+ catch {
78
+ continue;
79
+ }
80
+ const lines = content.split("\n");
81
+ const matches = [];
82
+ for (let i = 0; i < lines.length; i++) {
83
+ regex.lastIndex = 0;
84
+ if (regex.test(lines[i])) {
85
+ matches.push({ line: i + 1, content: lines[i].trim().slice(0, 120) });
86
+ }
87
+ }
88
+ results.push({
89
+ ruleId: rule.id,
90
+ file,
91
+ matches,
92
+ matched: matches.length > 0,
93
+ });
94
+ }
95
+ return results;
96
+ }
97
+ // ─── CLI ────────────────────────────────────────────────────────────────────
98
+ export function runRuleTest(argv) {
99
+ if (argv.includes("--help") || argv.includes("-h")) {
100
+ console.log(`
101
+ judges rule-test — Test custom rules against sample code
102
+
103
+ Usage:
104
+ judges rule-test --rules custom-rules.json --fixtures tests/fixtures
105
+ judges rule-test --rules custom-rules.json --file sample.ts
106
+ judges rule-test --rules custom-rules.json --fixtures src --format json
107
+
108
+ Options:
109
+ --rules <file> JSON file with custom rules (required)
110
+ --fixtures <dir> Directory with test fixture files
111
+ --file <path> Test against a single file
112
+ --rule <id> Test only a specific rule by ID
113
+ --format json JSON output
114
+ --help, -h Show this help
115
+
116
+ Validates custom rules against real code before deployment. Ensures
117
+ patterns match expected findings and catch the intended issues.
118
+ `);
119
+ return;
120
+ }
121
+ const rulesPath = argv.find((_a, i) => argv[i - 1] === "--rules");
122
+ const fixturesDir = argv.find((_a, i) => argv[i - 1] === "--fixtures");
123
+ const singleFile = argv.find((_a, i) => argv[i - 1] === "--file");
124
+ const ruleFilter = argv.find((_a, i) => argv[i - 1] === "--rule");
125
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
126
+ if (!rulesPath) {
127
+ console.error("Error: --rules is required. Provide a custom rules JSON file.");
128
+ process.exitCode = 1;
129
+ return;
130
+ }
131
+ if (!existsSync(rulesPath)) {
132
+ console.error(`Error: Rules file not found: ${rulesPath}`);
133
+ process.exitCode = 1;
134
+ return;
135
+ }
136
+ let rules;
137
+ try {
138
+ rules = loadRules(rulesPath);
139
+ }
140
+ catch {
141
+ console.error(`Error: Cannot parse rules file: ${rulesPath}`);
142
+ process.exitCode = 1;
143
+ return;
144
+ }
145
+ if (ruleFilter) {
146
+ rules = rules.filter((r) => r.id === ruleFilter);
147
+ if (rules.length === 0) {
148
+ console.error(`Error: Rule '${ruleFilter}' not found in ${rulesPath}`);
149
+ process.exitCode = 1;
150
+ return;
151
+ }
152
+ }
153
+ // Gather target files
154
+ let files;
155
+ if (singleFile) {
156
+ if (!existsSync(singleFile)) {
157
+ console.error(`Error: File not found: ${singleFile}`);
158
+ process.exitCode = 1;
159
+ return;
160
+ }
161
+ files = [singleFile];
162
+ }
163
+ else if (fixturesDir) {
164
+ files = collectFiles(fixturesDir);
165
+ }
166
+ else {
167
+ console.error("Error: Either --fixtures or --file is required.");
168
+ process.exitCode = 1;
169
+ return;
170
+ }
171
+ if (files.length === 0) {
172
+ console.log("No files found to test against.");
173
+ return;
174
+ }
175
+ // Run tests
176
+ const allResults = [];
177
+ for (const rule of rules) {
178
+ allResults.push(...testRule(rule, files));
179
+ }
180
+ const matchedResults = allResults.filter((r) => r.matched);
181
+ const rulesWithMatches = new Set(matchedResults.map((r) => r.ruleId));
182
+ if (format === "json") {
183
+ console.log(JSON.stringify({
184
+ rulesCount: rules.length,
185
+ filesCount: files.length,
186
+ matchedRules: rulesWithMatches.size,
187
+ totalMatches: matchedResults.reduce((s, r) => s + r.matches.length, 0),
188
+ results: matchedResults.map((r) => ({
189
+ ruleId: r.ruleId,
190
+ file: r.file,
191
+ matchCount: r.matches.length,
192
+ matches: r.matches,
193
+ })),
194
+ }, null, 2));
195
+ return;
196
+ }
197
+ console.log(`\n Rule Test Results\n ─────────────────────────────`);
198
+ console.log(` Rules tested: ${rules.length}`);
199
+ console.log(` Files scanned: ${files.length}`);
200
+ console.log(` Rules with matches: ${rulesWithMatches.size}\n`);
201
+ for (const rule of rules) {
202
+ const ruleResults = matchedResults.filter((r) => r.ruleId === rule.id);
203
+ const totalMatches = ruleResults.reduce((s, r) => s + r.matches.length, 0);
204
+ const icon = totalMatches > 0 ? "✅" : "⬜";
205
+ console.log(` ${icon} ${rule.id} — ${totalMatches} match(es) across ${ruleResults.length} file(s)`);
206
+ console.log(` Pattern: ${rule.pattern}`);
207
+ console.log(` Severity: ${rule.severity}`);
208
+ for (const rr of ruleResults.slice(0, 3)) {
209
+ for (const m of rr.matches.slice(0, 3)) {
210
+ console.log(` L${m.line}: ${m.content}`);
211
+ }
212
+ }
213
+ console.log();
214
+ }
215
+ }
216
+ //# sourceMappingURL=rule-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-test.js","sourceRoot":"","sources":["../../src/commands/rule-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Team-config — Team-level shared configuration management.
3
+ */
4
+ export declare function runTeamConfig(argv: string[]): void;
5
+ //# sourceMappingURL=team-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-config.d.ts","sourceRoot":"","sources":["../../src/commands/team-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4HH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6JlD"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Team-config — Team-level shared configuration management.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync } from "fs";
5
+ // ─── Default config ────────────────────────────────────────────────────────
6
+ function defaultTeamConfig() {
7
+ return {
8
+ version: "1.0.0",
9
+ team: "default",
10
+ preset: "recommended",
11
+ enabledJudges: [
12
+ "data-security",
13
+ "cybersecurity",
14
+ "authentication",
15
+ "database",
16
+ "reliability",
17
+ "performance",
18
+ "maintainability",
19
+ "documentation",
20
+ "testing",
21
+ "error-handling",
22
+ ],
23
+ disabledRules: [],
24
+ severityOverrides: {},
25
+ customPatterns: [],
26
+ ignorePatterns: ["**/*.test.ts", "**/*.spec.ts", "**/fixtures/**"],
27
+ reviewGate: {
28
+ maxCritical: 0,
29
+ maxHigh: 5,
30
+ maxTotal: 25,
31
+ blockOnSecurity: true,
32
+ },
33
+ formatting: {
34
+ defaultFormat: "text",
35
+ includeRecommendations: true,
36
+ includeEvidence: true,
37
+ },
38
+ };
39
+ }
40
+ function validateConfig(config) {
41
+ const issues = [];
42
+ const warnings = [];
43
+ if (!config.version)
44
+ issues.push("Missing version");
45
+ if (!config.team)
46
+ issues.push("Missing team name");
47
+ if (!config.enabledJudges || config.enabledJudges.length === 0) {
48
+ warnings.push("No judges enabled — all judges will be used");
49
+ }
50
+ const validPresets = new Set(["strict", "recommended", "lenient", "security-only", "quality-only"]);
51
+ if (config.preset && !validPresets.has(config.preset)) {
52
+ warnings.push(`Unknown preset '${config.preset}' — using 'recommended' defaults`);
53
+ }
54
+ if (config.reviewGate) {
55
+ if (config.reviewGate.maxCritical < 0)
56
+ issues.push("maxCritical cannot be negative");
57
+ if (config.reviewGate.maxHigh < 0)
58
+ issues.push("maxHigh cannot be negative");
59
+ if (config.reviewGate.maxTotal < 0)
60
+ issues.push("maxTotal cannot be negative");
61
+ }
62
+ for (const cp of config.customPatterns || []) {
63
+ if (!cp.name)
64
+ issues.push("Custom pattern missing name");
65
+ if (!cp.pattern)
66
+ issues.push(`Custom pattern '${cp.name}' missing regex pattern`);
67
+ try {
68
+ new RegExp(cp.pattern);
69
+ }
70
+ catch {
71
+ issues.push(`Custom pattern '${cp.name}' has invalid regex: ${cp.pattern}`);
72
+ }
73
+ }
74
+ return { valid: issues.length === 0, issues, warnings };
75
+ }
76
+ // ─── Config merging ────────────────────────────────────────────────────────
77
+ function mergeConfigs(base, override) {
78
+ return {
79
+ ...base,
80
+ ...override,
81
+ reviewGate: { ...base.reviewGate, ...(override.reviewGate || {}) },
82
+ formatting: { ...base.formatting, ...(override.formatting || {}) },
83
+ enabledJudges: override.enabledJudges || base.enabledJudges,
84
+ disabledRules: [...(base.disabledRules || []), ...(override.disabledRules || [])],
85
+ ignorePatterns: override.ignorePatterns || base.ignorePatterns,
86
+ severityOverrides: { ...(base.severityOverrides || {}), ...(override.severityOverrides || {}) },
87
+ };
88
+ }
89
+ // ─── CLI ────────────────────────────────────────────────────────────────────
90
+ export function runTeamConfig(argv) {
91
+ if (argv.includes("--help") || argv.includes("-h")) {
92
+ console.log(`
93
+ judges team-config — Team-level shared configuration
94
+
95
+ Usage:
96
+ judges team-config init Create team-config.json template
97
+ judges team-config show Show current configuration
98
+ judges team-config validate Validate configuration
99
+ judges team-config merge --base base.json --override local.json
100
+ judges team-config --format json JSON output
101
+
102
+ Subcommands:
103
+ init Create a team-config.json template
104
+ show Display current configuration
105
+ validate Validate configuration file
106
+ merge Merge base config with local overrides
107
+
108
+ Options:
109
+ --config <path> Config file path (default: team-config.json)
110
+ --base <path> Base config for merge
111
+ --override <path> Override config for merge
112
+ --format json JSON output
113
+ --help, -h Show this help
114
+
115
+ Team config defines shared review settings: enabled judges, severity
116
+ overrides, review gate thresholds, and formatting preferences. Commit
117
+ to your repository to share across the team.
118
+ `);
119
+ return;
120
+ }
121
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
122
+ const configPath = argv.find((_a, i) => argv[i - 1] === "--config") || "team-config.json";
123
+ const subcommand = argv.find((a) => !a.startsWith("-") &&
124
+ a !== "team-config" &&
125
+ argv[argv.indexOf(a) - 1] !== "--config" &&
126
+ argv[argv.indexOf(a) - 1] !== "--format" &&
127
+ argv[argv.indexOf(a) - 1] !== "--base" &&
128
+ argv[argv.indexOf(a) - 1] !== "--override") || "show";
129
+ if (subcommand === "init") {
130
+ if (existsSync(configPath)) {
131
+ console.error(`Error: ${configPath} already exists.`);
132
+ process.exitCode = 1;
133
+ return;
134
+ }
135
+ writeFileSync(configPath, JSON.stringify(defaultTeamConfig(), null, 2), "utf-8");
136
+ console.log(`Created ${configPath}. Edit and commit to share with your team.`);
137
+ return;
138
+ }
139
+ if (subcommand === "merge") {
140
+ const basePath = argv.find((_a, i) => argv[i - 1] === "--base");
141
+ const overridePath = argv.find((_a, i) => argv[i - 1] === "--override");
142
+ if (!basePath || !overridePath) {
143
+ console.error("Error: Both --base and --override paths are required.");
144
+ process.exitCode = 1;
145
+ return;
146
+ }
147
+ try {
148
+ const base = JSON.parse(readFileSync(basePath, "utf-8"));
149
+ const override = JSON.parse(readFileSync(overridePath, "utf-8"));
150
+ const merged = mergeConfigs(base, override);
151
+ if (format === "json") {
152
+ console.log(JSON.stringify(merged, null, 2));
153
+ }
154
+ else {
155
+ console.log("Merged configuration:");
156
+ console.log(JSON.stringify(merged, null, 2));
157
+ }
158
+ }
159
+ catch {
160
+ console.error("Error: Cannot read or parse config files.");
161
+ process.exitCode = 1;
162
+ }
163
+ return;
164
+ }
165
+ // Load config
166
+ let config;
167
+ if (existsSync(configPath)) {
168
+ try {
169
+ config = JSON.parse(readFileSync(configPath, "utf-8"));
170
+ }
171
+ catch {
172
+ console.error(`Error: ${configPath} is not valid JSON.`);
173
+ process.exitCode = 1;
174
+ return;
175
+ }
176
+ }
177
+ else {
178
+ config = defaultTeamConfig();
179
+ }
180
+ if (subcommand === "validate") {
181
+ const result = validateConfig(config);
182
+ if (format === "json") {
183
+ console.log(JSON.stringify(result, null, 2));
184
+ if (!result.valid)
185
+ process.exitCode = 1;
186
+ return;
187
+ }
188
+ const icon = result.valid ? "✅" : "❌";
189
+ console.log(`\n Config Validation: ${icon} ${result.valid ? "VALID" : "INVALID"}\n ─────────────────────────────`);
190
+ if (result.issues.length > 0) {
191
+ console.log(`\n Issues (${result.issues.length}):`);
192
+ for (const issue of result.issues)
193
+ console.log(` ❌ ${issue}`);
194
+ }
195
+ if (result.warnings.length > 0) {
196
+ console.log(`\n Warnings (${result.warnings.length}):`);
197
+ for (const w of result.warnings)
198
+ console.log(` ⚠️ ${w}`);
199
+ }
200
+ if (result.valid && result.warnings.length === 0)
201
+ console.log(" No issues found.");
202
+ console.log();
203
+ if (!result.valid)
204
+ process.exitCode = 1;
205
+ return;
206
+ }
207
+ // Show
208
+ if (format === "json") {
209
+ console.log(JSON.stringify(config, null, 2));
210
+ return;
211
+ }
212
+ console.log(`\n Team Configuration\n ─────────────────────────────`);
213
+ console.log(` Team: ${config.team}`);
214
+ console.log(` Preset: ${config.preset}`);
215
+ console.log(` Source: ${existsSync(configPath) ? configPath : "defaults"}`);
216
+ console.log(`\n Enabled Judges (${config.enabledJudges.length}):`);
217
+ for (const j of config.enabledJudges)
218
+ console.log(` ✅ ${j}`);
219
+ if (config.disabledRules.length > 0) {
220
+ console.log(`\n Disabled Rules (${config.disabledRules.length}):`);
221
+ for (const r of config.disabledRules)
222
+ console.log(` ⬜ ${r}`);
223
+ }
224
+ console.log("\n Review Gate:");
225
+ console.log(` Max critical: ${config.reviewGate.maxCritical}`);
226
+ console.log(` Max high: ${config.reviewGate.maxHigh}`);
227
+ console.log(` Max total: ${config.reviewGate.maxTotal}`);
228
+ console.log(` Block on security: ${config.reviewGate.blockOnSecurity}`);
229
+ console.log("\n Formatting:");
230
+ console.log(` Default format: ${config.formatting.defaultFormat}`);
231
+ console.log(` Include recommendations: ${config.formatting.includeRecommendations}`);
232
+ console.log(` Include evidence: ${config.formatting.includeEvidence}`);
233
+ console.log();
234
+ }
235
+ //# sourceMappingURL=team-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-config.js","sourceRoot":"","sources":["../../src/commands/team-config.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.62.0",
3
+ "version": "3.63.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.62.0",
10
+ "version": "3.63.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.62.0",
15
+ "version": "3.63.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }