@kevinrabun/judges 3.70.0 → 3.71.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/finding-auto-fix.d.ts +5 -0
  6. package/dist/commands/finding-auto-fix.d.ts.map +1 -0
  7. package/dist/commands/finding-auto-fix.js +189 -0
  8. package/dist/commands/finding-auto-fix.js.map +1 -0
  9. package/dist/commands/finding-context.d.ts +5 -0
  10. package/dist/commands/finding-context.d.ts.map +1 -0
  11. package/dist/commands/finding-context.js +141 -0
  12. package/dist/commands/finding-context.js.map +1 -0
  13. package/dist/commands/review-coverage-map.d.ts +5 -0
  14. package/dist/commands/review-coverage-map.d.ts.map +1 -0
  15. package/dist/commands/review-coverage-map.js +195 -0
  16. package/dist/commands/review-coverage-map.js.map +1 -0
  17. package/dist/commands/review-history-search.d.ts +5 -0
  18. package/dist/commands/review-history-search.d.ts.map +1 -0
  19. package/dist/commands/review-history-search.js +215 -0
  20. package/dist/commands/review-history-search.js.map +1 -0
  21. package/dist/commands/review-language-stats.d.ts +5 -0
  22. package/dist/commands/review-language-stats.d.ts.map +1 -0
  23. package/dist/commands/review-language-stats.js +153 -0
  24. package/dist/commands/review-language-stats.js.map +1 -0
  25. package/dist/commands/review-onboard.d.ts +5 -0
  26. package/dist/commands/review-onboard.d.ts.map +1 -0
  27. package/dist/commands/review-onboard.js +155 -0
  28. package/dist/commands/review-onboard.js.map +1 -0
  29. package/dist/commands/review-parallel.d.ts +5 -0
  30. package/dist/commands/review-parallel.d.ts.map +1 -0
  31. package/dist/commands/review-parallel.js +183 -0
  32. package/dist/commands/review-parallel.js.map +1 -0
  33. package/dist/commands/review-rollback.d.ts +5 -0
  34. package/dist/commands/review-rollback.d.ts.map +1 -0
  35. package/dist/commands/review-rollback.js +172 -0
  36. package/dist/commands/review-rollback.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Review-parallel — Run parallel reviews on multiple files.
3
+ */
4
+ import { readFileSync, existsSync, readdirSync } from "fs";
5
+ import { join, extname } from "path";
6
+ // ─── Language Detection ─────────────────────────────────────────────────────
7
+ const EXT_TO_LANG = {
8
+ ".ts": "typescript",
9
+ ".tsx": "typescript",
10
+ ".js": "javascript",
11
+ ".jsx": "javascript",
12
+ ".py": "python",
13
+ ".java": "java",
14
+ ".cs": "csharp",
15
+ ".go": "go",
16
+ ".rs": "rust",
17
+ ".rb": "ruby",
18
+ ".php": "php",
19
+ ".cpp": "cpp",
20
+ ".c": "c",
21
+ ".swift": "swift",
22
+ ".kt": "kotlin",
23
+ ".scala": "scala",
24
+ };
25
+ const SOURCE_EXTS = new Set(Object.keys(EXT_TO_LANG));
26
+ // ─── File Discovery ─────────────────────────────────────────────────────────
27
+ function discoverFiles(dir, maxFiles) {
28
+ const files = [];
29
+ function scan(d) {
30
+ if (files.length >= maxFiles)
31
+ return;
32
+ try {
33
+ const entries = readdirSync(d);
34
+ for (const entry of entries) {
35
+ if (files.length >= maxFiles)
36
+ return;
37
+ const name = entry;
38
+ if (name.startsWith(".") || name === "node_modules" || name === "dist" || name === "build")
39
+ continue;
40
+ const full = join(d, name);
41
+ const ext = extname(name);
42
+ if (SOURCE_EXTS.has(ext)) {
43
+ files.push(full);
44
+ }
45
+ else {
46
+ try {
47
+ scan(full);
48
+ }
49
+ catch {
50
+ // Skip
51
+ }
52
+ }
53
+ }
54
+ }
55
+ catch {
56
+ // Skip
57
+ }
58
+ }
59
+ scan(dir);
60
+ return files;
61
+ }
62
+ // ─── CLI ────────────────────────────────────────────────────────────────────
63
+ export function runReviewParallel(argv) {
64
+ if (argv.includes("--help") || argv.includes("-h")) {
65
+ console.log(`
66
+ judges review-parallel — Run parallel reviews on multiple files
67
+
68
+ Usage:
69
+ judges review-parallel --dir src
70
+ judges review-parallel --files "src/api.ts,src/cli.ts"
71
+ judges review-parallel --dir src --max 50
72
+
73
+ Options:
74
+ --dir <path> Directory to scan for source files
75
+ --files <paths> Comma-separated list of files
76
+ --max <n> Max files to process (default: 100)
77
+ --ext <exts> Filter by extensions (e.g., ".ts,.js")
78
+ --format json JSON output
79
+ --help, -h Show this help
80
+
81
+ Discovers source files and queues them for review. Shows review
82
+ readiness for each file including language detection and line counts.
83
+
84
+ Note: For actual review, run 'judges eval --file <path>' on each file.
85
+ This command provides the manifest for batch processing.
86
+ `);
87
+ return;
88
+ }
89
+ const dir = argv.find((_a, i) => argv[i - 1] === "--dir");
90
+ const filesArg = argv.find((_a, i) => argv[i - 1] === "--files");
91
+ const maxFiles = parseInt(argv.find((_a, i) => argv[i - 1] === "--max") || "100", 10);
92
+ const extFilter = argv.find((_a, i) => argv[i - 1] === "--ext");
93
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
94
+ let files;
95
+ if (filesArg) {
96
+ files = filesArg
97
+ .split(",")
98
+ .map((f) => f.trim())
99
+ .filter(Boolean);
100
+ }
101
+ else if (dir) {
102
+ if (!existsSync(dir)) {
103
+ console.error(`Error: Directory "${dir}" does not exist.`);
104
+ process.exitCode = 1;
105
+ return;
106
+ }
107
+ files = discoverFiles(dir, maxFiles);
108
+ }
109
+ else {
110
+ files = discoverFiles(".", maxFiles);
111
+ }
112
+ if (extFilter) {
113
+ const allowedExts = new Set(extFilter.split(",").map((e) => e.trim()));
114
+ files = files.filter((f) => allowedExts.has(extname(f)));
115
+ }
116
+ if (files.length === 0) {
117
+ console.log("No source files found.");
118
+ return;
119
+ }
120
+ const results = [];
121
+ let reviewed = 0;
122
+ let skipped = 0;
123
+ let errors = 0;
124
+ for (const file of files) {
125
+ const ext = extname(file);
126
+ const language = EXT_TO_LANG[ext] || "unknown";
127
+ if (!existsSync(file)) {
128
+ results.push({ file, language, lineCount: 0, status: "error", detail: "File not found" });
129
+ errors++;
130
+ continue;
131
+ }
132
+ try {
133
+ const content = readFileSync(file, "utf-8");
134
+ const lineCount = content.split("\n").length;
135
+ if (lineCount < 2) {
136
+ results.push({ file, language, lineCount, status: "skipped", detail: "Too small" });
137
+ skipped++;
138
+ continue;
139
+ }
140
+ results.push({ file, language, lineCount, status: "queued", detail: "Ready for review" });
141
+ reviewed++;
142
+ }
143
+ catch {
144
+ results.push({ file, language, lineCount: 0, status: "error", detail: "Could not read file" });
145
+ errors++;
146
+ }
147
+ }
148
+ const report = {
149
+ timestamp: new Date().toISOString(),
150
+ totalFiles: files.length,
151
+ results,
152
+ summary: { reviewed, skipped, errors },
153
+ };
154
+ if (format === "json") {
155
+ console.log(JSON.stringify(report, null, 2));
156
+ return;
157
+ }
158
+ console.log("\nParallel Review Manifest:");
159
+ console.log("═".repeat(70));
160
+ console.log(` Total: ${files.length} Queued: ${reviewed} Skipped: ${skipped} Errors: ${errors}`);
161
+ console.log("═".repeat(70));
162
+ // Group by language
163
+ const byLang = new Map();
164
+ for (const r of results) {
165
+ const list = byLang.get(r.language) || [];
166
+ list.push(r);
167
+ byLang.set(r.language, list);
168
+ }
169
+ for (const [lang, langResults] of [...byLang.entries()].sort((a, b) => b[1].length - a[1].length)) {
170
+ const totalLines = langResults.reduce((s, r) => s + r.lineCount, 0);
171
+ console.log(`\n ${lang} (${langResults.length} files, ${totalLines} lines):`);
172
+ for (const r of langResults.slice(0, 20)) {
173
+ const icon = r.status === "queued" ? "○" : r.status === "skipped" ? "─" : "✗";
174
+ console.log(` ${icon} ${r.file} (${r.lineCount} lines)`);
175
+ }
176
+ if (langResults.length > 20) {
177
+ console.log(` ... and ${langResults.length - 20} more`);
178
+ }
179
+ }
180
+ console.log("\n" + "═".repeat(70));
181
+ console.log(" To review: judges eval --file <path>");
182
+ }
183
+ //# sourceMappingURL=review-parallel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-parallel.js","sourceRoot":"","sources":["../../src/commands/review-parallel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-rollback — Roll back review configuration to a previous state.
3
+ */
4
+ export declare function runReviewRollback(argv: string[]): void;
5
+ //# sourceMappingURL=review-rollback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-rollback.d.ts","sourceRoot":"","sources":["../../src/commands/review-rollback.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwDH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqJtD"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Review-rollback — Roll back review configuration to a previous state.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const ROLLBACK_DIR = join(".judges", "rollback");
8
+ const INDEX_FILE = join(ROLLBACK_DIR, "index.json");
9
+ function loadIndex() {
10
+ if (!existsSync(INDEX_FILE))
11
+ return { version: "1.0.0", snapshots: [] };
12
+ try {
13
+ return JSON.parse(readFileSync(INDEX_FILE, "utf-8"));
14
+ }
15
+ catch {
16
+ return { version: "1.0.0", snapshots: [] };
17
+ }
18
+ }
19
+ function saveIndex(store) {
20
+ mkdirSync(ROLLBACK_DIR, { recursive: true });
21
+ writeFileSync(INDEX_FILE, JSON.stringify(store, null, 2), "utf-8");
22
+ }
23
+ function generateId() {
24
+ return `snap-${Date.now().toString(36)}`;
25
+ }
26
+ // ─── Config Discovery ───────────────────────────────────────────────────────
27
+ const CONFIG_FILES = [".judgesrc", ".judgesrc.json", "judgesrc.json", ".judges/config.json"];
28
+ function findConfigFile() {
29
+ for (const f of CONFIG_FILES) {
30
+ if (existsSync(f))
31
+ return f;
32
+ }
33
+ return null;
34
+ }
35
+ // ─── CLI ────────────────────────────────────────────────────────────────────
36
+ export function runReviewRollback(argv) {
37
+ if (argv.includes("--help") || argv.includes("-h")) {
38
+ console.log(`
39
+ judges review-rollback — Roll back review config to a previous state
40
+
41
+ Usage:
42
+ judges review-rollback save --label "before refactor"
43
+ judges review-rollback list
44
+ judges review-rollback restore --id snap-abc123
45
+ judges review-rollback diff --id snap-abc123
46
+ judges review-rollback clear
47
+
48
+ Subcommands:
49
+ save Save a config snapshot
50
+ list List saved snapshots
51
+ restore Restore a snapshot
52
+ diff Compare snapshot with current config
53
+ clear Clear all snapshots
54
+
55
+ Options:
56
+ --label <text> Label for the snapshot
57
+ --id <id> Snapshot ID
58
+ --config <path> Config file path (auto-detected)
59
+ --format json JSON output
60
+ --help, -h Show this help
61
+
62
+ Snapshots stored in .judges/rollback/.
63
+ `);
64
+ return;
65
+ }
66
+ const subcommand = argv.find((a) => ["save", "list", "restore", "diff", "clear"].includes(a)) || "list";
67
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
68
+ const store = loadIndex();
69
+ if (subcommand === "save") {
70
+ const label = argv.find((_a, i) => argv[i - 1] === "--label") || "";
71
+ const configArg = argv.find((_a, i) => argv[i - 1] === "--config");
72
+ const configFile = configArg || findConfigFile();
73
+ if (!configFile || !existsSync(configFile)) {
74
+ console.error("Error: No config file found. Use --config to specify.");
75
+ process.exitCode = 1;
76
+ return;
77
+ }
78
+ const id = generateId();
79
+ const snapshotFile = join(ROLLBACK_DIR, `${id}.json`);
80
+ mkdirSync(ROLLBACK_DIR, { recursive: true });
81
+ copyFileSync(configFile, snapshotFile);
82
+ store.snapshots.push({ id, timestamp: new Date().toISOString(), label, configFile, snapshotFile });
83
+ saveIndex(store);
84
+ console.log(`Saved snapshot ${id}${label ? ` (${label})` : ""} from "${configFile}".`);
85
+ return;
86
+ }
87
+ if (subcommand === "restore") {
88
+ const id = argv.find((_a, i) => argv[i - 1] === "--id");
89
+ if (!id) {
90
+ console.error("Error: --id is required.");
91
+ process.exitCode = 1;
92
+ return;
93
+ }
94
+ const snapshot = store.snapshots.find((s) => s.id === id);
95
+ if (!snapshot) {
96
+ console.error(`Error: Snapshot "${id}" not found.`);
97
+ process.exitCode = 1;
98
+ return;
99
+ }
100
+ if (!existsSync(snapshot.snapshotFile)) {
101
+ console.error(`Error: Snapshot file missing from disk.`);
102
+ process.exitCode = 1;
103
+ return;
104
+ }
105
+ mkdirSync(dirname(snapshot.configFile), { recursive: true });
106
+ copyFileSync(snapshot.snapshotFile, snapshot.configFile);
107
+ console.log(`Restored snapshot ${id} to "${snapshot.configFile}".`);
108
+ return;
109
+ }
110
+ if (subcommand === "diff") {
111
+ const id = argv.find((_a, i) => argv[i - 1] === "--id");
112
+ if (!id) {
113
+ console.error("Error: --id is required.");
114
+ process.exitCode = 1;
115
+ return;
116
+ }
117
+ const snapshot = store.snapshots.find((s) => s.id === id);
118
+ if (!snapshot) {
119
+ console.error(`Error: Snapshot "${id}" not found.`);
120
+ process.exitCode = 1;
121
+ return;
122
+ }
123
+ if (!existsSync(snapshot.snapshotFile)) {
124
+ console.error("Error: Snapshot file missing.");
125
+ process.exitCode = 1;
126
+ return;
127
+ }
128
+ const configFile = findConfigFile();
129
+ if (!configFile || !existsSync(configFile)) {
130
+ console.error("Error: No current config file found.");
131
+ process.exitCode = 1;
132
+ return;
133
+ }
134
+ const snapshotContent = readFileSync(snapshot.snapshotFile, "utf-8");
135
+ const currentContent = readFileSync(configFile, "utf-8");
136
+ if (snapshotContent === currentContent) {
137
+ console.log("No differences between snapshot and current config.");
138
+ return;
139
+ }
140
+ console.log(`\nDiff: snapshot ${id} vs current config`);
141
+ console.log("─".repeat(60));
142
+ console.log("Snapshot:");
143
+ console.log(snapshotContent.slice(0, 500));
144
+ console.log("\nCurrent:");
145
+ console.log(currentContent.slice(0, 500));
146
+ console.log("─".repeat(60));
147
+ return;
148
+ }
149
+ if (subcommand === "clear") {
150
+ saveIndex({ version: "1.0.0", snapshots: [] });
151
+ console.log("Rollback snapshots cleared.");
152
+ return;
153
+ }
154
+ // list
155
+ if (store.snapshots.length === 0) {
156
+ console.log("No snapshots saved. Use 'judges review-rollback save' to create one.");
157
+ return;
158
+ }
159
+ if (format === "json") {
160
+ console.log(JSON.stringify(store.snapshots, null, 2));
161
+ return;
162
+ }
163
+ console.log("\nConfig Snapshots:");
164
+ console.log("─".repeat(70));
165
+ for (const s of store.snapshots) {
166
+ console.log(` ${s.id} ${s.timestamp.slice(0, 19)} ${s.label || "(no label)"}`);
167
+ console.log(` Config: ${s.configFile}`);
168
+ }
169
+ console.log("─".repeat(70));
170
+ console.log(` Total: ${store.snapshots.length} snapshot(s)`);
171
+ }
172
+ //# sourceMappingURL=review-rollback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-rollback.js","sourceRoot":"","sources":["../../src/commands/review-rollback.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.70.0",
3
+ "version": "3.71.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.70.0",
10
+ "version": "3.71.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "@kevinrabun/judges",
15
- "version": "3.70.0",
15
+ "version": "3.71.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }