@kevinrabun/judges 3.3.0 → 3.5.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 (75) hide show
  1. package/README.md +310 -1
  2. package/dist/ast/tree-sitter-ast.js +2 -4
  3. package/dist/ast/tree-sitter-ast.js.map +1 -1
  4. package/dist/cli.d.ts +8 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +438 -12
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/baseline.d.ts +2 -0
  9. package/dist/commands/baseline.d.ts.map +1 -0
  10. package/dist/commands/baseline.js +126 -0
  11. package/dist/commands/baseline.js.map +1 -0
  12. package/dist/commands/ci-templates.d.ts +10 -0
  13. package/dist/commands/ci-templates.d.ts.map +1 -0
  14. package/dist/commands/ci-templates.js +90 -0
  15. package/dist/commands/ci-templates.js.map +1 -0
  16. package/dist/commands/completions.d.ts +2 -0
  17. package/dist/commands/completions.d.ts.map +1 -0
  18. package/dist/commands/completions.js +226 -0
  19. package/dist/commands/completions.js.map +1 -0
  20. package/dist/commands/deps.d.ts +6 -0
  21. package/dist/commands/deps.d.ts.map +1 -0
  22. package/dist/commands/deps.js +123 -0
  23. package/dist/commands/deps.js.map +1 -0
  24. package/dist/commands/diff.d.ts +7 -0
  25. package/dist/commands/diff.d.ts.map +1 -0
  26. package/dist/commands/diff.js +209 -0
  27. package/dist/commands/diff.js.map +1 -0
  28. package/dist/commands/docs.d.ts +2 -0
  29. package/dist/commands/docs.d.ts.map +1 -0
  30. package/dist/commands/docs.js +157 -0
  31. package/dist/commands/docs.js.map +1 -0
  32. package/dist/commands/fix.d.ts +21 -0
  33. package/dist/commands/fix.d.ts.map +1 -0
  34. package/dist/commands/fix.js +189 -0
  35. package/dist/commands/fix.js.map +1 -0
  36. package/dist/commands/hook.d.ts +9 -0
  37. package/dist/commands/hook.d.ts.map +1 -0
  38. package/dist/commands/hook.js +149 -0
  39. package/dist/commands/hook.js.map +1 -0
  40. package/dist/commands/init.d.ts +11 -0
  41. package/dist/commands/init.d.ts.map +1 -0
  42. package/dist/commands/init.js +266 -0
  43. package/dist/commands/init.js.map +1 -0
  44. package/dist/commands/report.d.ts +13 -0
  45. package/dist/commands/report.d.ts.map +1 -0
  46. package/dist/commands/report.js +140 -0
  47. package/dist/commands/report.js.map +1 -0
  48. package/dist/commands/watch.d.ts +18 -0
  49. package/dist/commands/watch.d.ts.map +1 -0
  50. package/dist/commands/watch.js +183 -0
  51. package/dist/commands/watch.js.map +1 -0
  52. package/dist/formatters/badge.d.ts +17 -0
  53. package/dist/formatters/badge.d.ts.map +1 -0
  54. package/dist/formatters/badge.js +79 -0
  55. package/dist/formatters/badge.js.map +1 -0
  56. package/dist/formatters/codeclimate.d.ts +25 -0
  57. package/dist/formatters/codeclimate.d.ts.map +1 -0
  58. package/dist/formatters/codeclimate.js +81 -0
  59. package/dist/formatters/codeclimate.js.map +1 -0
  60. package/dist/formatters/html.d.ts +13 -0
  61. package/dist/formatters/html.d.ts.map +1 -0
  62. package/dist/formatters/html.js +219 -0
  63. package/dist/formatters/html.js.map +1 -0
  64. package/dist/formatters/junit.d.ts +7 -0
  65. package/dist/formatters/junit.d.ts.map +1 -0
  66. package/dist/formatters/junit.js +69 -0
  67. package/dist/formatters/junit.js.map +1 -0
  68. package/dist/index.js +23 -3
  69. package/dist/index.js.map +1 -1
  70. package/dist/presets.d.ts +22 -0
  71. package/dist/presets.d.ts.map +1 -0
  72. package/dist/presets.js +115 -0
  73. package/dist/presets.js.map +1 -0
  74. package/judgesrc.schema.json +74 -0
  75. package/package.json +14 -1
@@ -0,0 +1,209 @@
1
+ // ─── Diff Command ────────────────────────────────────────────────────────────
2
+ // Evaluate only changed lines from a unified diff or git diff output.
3
+ //
4
+ // Usage:
5
+ // git diff HEAD~1 | judges diff --language typescript
6
+ // judges diff --file changes.patch --language typescript
7
+ // ──────────────────────────────────────────────────────────────────────────────
8
+ import { readFileSync, existsSync } from "fs";
9
+ import { resolve, extname } from "path";
10
+ import { evaluateDiff } from "../evaluators/index.js";
11
+ /**
12
+ * Parse a unified diff into hunks with changed line information.
13
+ * Handles `git diff` and standard `diff -u` output.
14
+ */
15
+ function parseUnifiedDiff(diffText) {
16
+ const hunks = [];
17
+ const lines = diffText.split("\n");
18
+ let currentFile;
19
+ let newLines = [];
20
+ let changedLineNumbers = [];
21
+ let newLineNum = 0;
22
+ function flushFile() {
23
+ if (currentFile && (newLines.length > 0 || changedLineNumbers.length > 0)) {
24
+ hunks.push({
25
+ filePath: currentFile,
26
+ newContent: newLines.join("\n"),
27
+ changedLines: changedLineNumbers,
28
+ });
29
+ }
30
+ newLines = [];
31
+ changedLineNumbers = [];
32
+ newLineNum = 0;
33
+ }
34
+ for (const line of lines) {
35
+ // New file header: +++ b/path/to/file.ts
36
+ if (line.startsWith("+++ ")) {
37
+ const path = line.slice(4).replace(/^b\//, "").trim();
38
+ if (path !== "/dev/null") {
39
+ flushFile();
40
+ currentFile = path;
41
+ }
42
+ continue;
43
+ }
44
+ // Skip --- header
45
+ if (line.startsWith("--- "))
46
+ continue;
47
+ // Hunk header: @@ -10,5 +20,8 @@
48
+ const hunkMatch = line.match(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
49
+ if (hunkMatch) {
50
+ newLineNum = parseInt(hunkMatch[1], 10) - 1; // will increment on first line
51
+ continue;
52
+ }
53
+ // diff --git header — skip
54
+ if (line.startsWith("diff --git ") || line.startsWith("index "))
55
+ continue;
56
+ // Context line (starts with space or is empty in diff)
57
+ if (line.startsWith(" ") || (line === "" && newLineNum > 0)) {
58
+ newLineNum++;
59
+ newLines.push(line.startsWith(" ") ? line.slice(1) : line);
60
+ continue;
61
+ }
62
+ // Added line
63
+ if (line.startsWith("+")) {
64
+ newLineNum++;
65
+ changedLineNumbers.push(newLineNum);
66
+ newLines.push(line.slice(1));
67
+ continue;
68
+ }
69
+ // Removed line — skip (not in new content)
70
+ if (line.startsWith("-")) {
71
+ continue;
72
+ }
73
+ }
74
+ flushFile();
75
+ return hunks;
76
+ }
77
+ // ─── Language Detection ─────────────────────────────────────────────────────
78
+ const EXT_TO_LANG = {
79
+ ".ts": "typescript",
80
+ ".tsx": "typescript",
81
+ ".js": "javascript",
82
+ ".jsx": "javascript",
83
+ ".mjs": "javascript",
84
+ ".cjs": "javascript",
85
+ ".py": "python",
86
+ ".rs": "rust",
87
+ ".go": "go",
88
+ ".java": "java",
89
+ ".cs": "csharp",
90
+ ".rb": "ruby",
91
+ ".php": "php",
92
+ ".swift": "swift",
93
+ ".kt": "kotlin",
94
+ ".scala": "scala",
95
+ ".c": "c",
96
+ ".cpp": "cpp",
97
+ ".h": "c",
98
+ ".hpp": "cpp",
99
+ ".yaml": "yaml",
100
+ ".yml": "yaml",
101
+ ".json": "json",
102
+ ".tf": "terraform",
103
+ ".hcl": "terraform",
104
+ ".sh": "bash",
105
+ ".bash": "bash",
106
+ };
107
+ function detectLanguage(filePath) {
108
+ const ext = extname(filePath.toLowerCase());
109
+ if (filePath.toLowerCase().includes("dockerfile"))
110
+ return "dockerfile";
111
+ return EXT_TO_LANG[ext];
112
+ }
113
+ // ─── CLI Entry Point ────────────────────────────────────────────────────────
114
+ export function parseDiffArgs(argv) {
115
+ let file;
116
+ let language;
117
+ let format = "text";
118
+ for (let i = 3; i < argv.length; i++) {
119
+ const arg = argv[i];
120
+ switch (arg) {
121
+ case "--file":
122
+ case "-f":
123
+ file = argv[++i];
124
+ break;
125
+ case "--language":
126
+ case "-l":
127
+ language = argv[++i];
128
+ break;
129
+ case "--format":
130
+ case "-o":
131
+ format = argv[++i];
132
+ break;
133
+ default:
134
+ if (!arg.startsWith("-") && !file)
135
+ file = arg;
136
+ break;
137
+ }
138
+ }
139
+ return { file, language, format };
140
+ }
141
+ export function runDiff(argv) {
142
+ const args = parseDiffArgs(argv);
143
+ // Read diff from file or stdin
144
+ let diffText;
145
+ if (args.file) {
146
+ const abs = resolve(args.file);
147
+ if (!existsSync(abs)) {
148
+ console.error(`Error: File not found: ${abs}`);
149
+ process.exit(1);
150
+ }
151
+ diffText = readFileSync(abs, "utf-8");
152
+ }
153
+ else if (!process.stdin.isTTY) {
154
+ try {
155
+ diffText = readFileSync(0, "utf-8");
156
+ }
157
+ catch {
158
+ console.error("Error: Could not read diff from stdin");
159
+ process.exit(1);
160
+ }
161
+ }
162
+ else {
163
+ console.error("Usage: git diff | judges diff --language <lang>");
164
+ console.error(" judges diff --file changes.patch");
165
+ process.exit(1);
166
+ return; // unreachable but satisfies TS
167
+ }
168
+ const hunks = parseUnifiedDiff(diffText);
169
+ if (hunks.length === 0) {
170
+ console.log("No changed files found in diff.");
171
+ process.exit(0);
172
+ }
173
+ let totalFindings = 0;
174
+ let worstScore = 100;
175
+ const allResults = [];
176
+ for (const hunk of hunks) {
177
+ if (hunk.changedLines.length === 0)
178
+ continue;
179
+ const lang = args.language || detectLanguage(hunk.filePath) || "typescript";
180
+ const verdict = evaluateDiff(hunk.newContent, lang, hunk.changedLines);
181
+ totalFindings += verdict.findings.length;
182
+ if (verdict.score < worstScore)
183
+ worstScore = verdict.score;
184
+ allResults.push({ file: hunk.filePath, verdict });
185
+ }
186
+ if (args.format === "json") {
187
+ console.log(JSON.stringify({ files: allResults, totalFindings, worstScore }, null, 2));
188
+ }
189
+ else {
190
+ // Text output
191
+ console.log("");
192
+ console.log("╔══════════════════════════════════════════════════════════════╗");
193
+ console.log("║ Judges Panel — Diff Analysis ║");
194
+ console.log("╚══════════════════════════════════════════════════════════════╝");
195
+ console.log("");
196
+ for (const { file, verdict } of allResults) {
197
+ const icon = verdict.verdict === "pass" ? "✅" : verdict.verdict === "warning" ? "⚠️ " : "❌";
198
+ console.log(` ${icon} ${file} — ${verdict.score}/100 (${verdict.findings.length} findings, ${verdict.linesAnalyzed} lines changed)`);
199
+ for (const f of verdict.findings) {
200
+ console.log(` [${f.severity.toUpperCase().padEnd(8)}] ${f.ruleId}: ${f.title}`);
201
+ }
202
+ }
203
+ console.log("");
204
+ console.log(` Total: ${totalFindings} finding(s) across ${allResults.length} file(s), worst score: ${worstScore}/100`);
205
+ console.log("");
206
+ }
207
+ process.exit(totalFindings > 0 && worstScore < 50 ? 1 : 0);
208
+ }
209
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runDocs(argv: string[]): void;
2
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAuHA,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkE5C"}
@@ -0,0 +1,157 @@
1
+ // ─── Rule Documentation Generator ────────────────────────────────────────────
2
+ // Generate per-judge/per-rule documentation in Markdown format.
3
+ //
4
+ // Usage:
5
+ // judges docs # output all judge docs to stdout
6
+ // judges docs --output docs/rules/ # write individual files
7
+ // judges docs --judge cybersecurity # single judge
8
+ // ──────────────────────────────────────────────────────────────────────────────
9
+ import { writeFileSync, mkdirSync, existsSync } from "fs";
10
+ import { join, resolve } from "path";
11
+ import { JUDGES, getJudge } from "../judges/index.js";
12
+ function extractRulesFromPrompt(judge) {
13
+ const rules = [];
14
+ const prompt = judge.systemPrompt;
15
+ // Typically rules are documented in the system prompt with patterns like:
16
+ // SEC-001: Title — Description
17
+ // or SEC-001 | Title | Description
18
+ const rulePattern = new RegExp(`(${judge.rulePrefix}-\\d{3})[:\\s|]+([^\\n|]+?)(?:\\s*[—|]\\s*([^\\n]+))?$`, "gm");
19
+ let match;
20
+ while ((match = rulePattern.exec(prompt)) !== null) {
21
+ rules.push({
22
+ ruleId: match[1],
23
+ title: match[2].trim(),
24
+ description: match[3]?.trim() || match[2].trim(),
25
+ });
26
+ }
27
+ return rules;
28
+ }
29
+ // ─── Generate Documentation ─────────────────────────────────────────────────
30
+ function generateJudgeDoc(judge) {
31
+ const rules = extractRulesFromPrompt(judge);
32
+ const lines = [];
33
+ lines.push(`# ${judge.name}`);
34
+ lines.push("");
35
+ lines.push(`**Domain:** ${judge.domain}`);
36
+ lines.push(`**Rule Prefix:** \`${judge.rulePrefix}\``);
37
+ lines.push(`**Judge ID:** \`${judge.id}\``);
38
+ lines.push("");
39
+ lines.push("## Description");
40
+ lines.push("");
41
+ lines.push(judge.description);
42
+ lines.push("");
43
+ if (rules.length > 0) {
44
+ lines.push("## Rules");
45
+ lines.push("");
46
+ lines.push("| Rule ID | Title | Description |");
47
+ lines.push("|---------|-------|-------------|");
48
+ for (const rule of rules) {
49
+ lines.push(`| \`${rule.ruleId}\` | ${rule.title} | ${rule.description} |`);
50
+ }
51
+ lines.push("");
52
+ }
53
+ lines.push("## Usage");
54
+ lines.push("");
55
+ lines.push("```bash");
56
+ lines.push(`# Evaluate with this judge only`);
57
+ lines.push(`judges eval --judge ${judge.id} --file <path>`);
58
+ lines.push("");
59
+ lines.push("# As part of the full tribunal");
60
+ lines.push("judges eval --file <path>");
61
+ lines.push("```");
62
+ lines.push("");
63
+ return lines.join("\n");
64
+ }
65
+ function generateIndexDoc() {
66
+ const lines = [];
67
+ lines.push("# Judges Panel — Rule Reference");
68
+ lines.push("");
69
+ lines.push(`The Judges Panel includes **${JUDGES.length}** specialized judges that evaluate AI-generated code.`);
70
+ lines.push("");
71
+ lines.push("## Judges");
72
+ lines.push("");
73
+ lines.push("| Judge | Domain | Rule Prefix | Description |");
74
+ lines.push("|-------|--------|-------------|-------------|");
75
+ for (const judge of JUDGES) {
76
+ lines.push(`| [${judge.name}](${judge.id}.md) | ${judge.domain} | \`${judge.rulePrefix}\` | ${judge.description} |`);
77
+ }
78
+ lines.push("");
79
+ lines.push("## Quick Start");
80
+ lines.push("");
81
+ lines.push("```bash");
82
+ lines.push("# Evaluate a file with all judges");
83
+ lines.push("judges eval --file src/app.ts");
84
+ lines.push("");
85
+ lines.push("# Evaluate with a specific judge");
86
+ lines.push("judges eval --judge cybersecurity --file src/app.ts");
87
+ lines.push("");
88
+ lines.push("# List all available judges");
89
+ lines.push("judges list");
90
+ lines.push("```");
91
+ lines.push("");
92
+ return lines.join("\n");
93
+ }
94
+ // ─── CLI Entry Point ────────────────────────────────────────────────────────
95
+ export function runDocs(argv) {
96
+ let output;
97
+ let judgeId;
98
+ for (let i = 3; i < argv.length; i++) {
99
+ const arg = argv[i];
100
+ switch (arg) {
101
+ case "--output":
102
+ case "-o":
103
+ output = argv[++i];
104
+ break;
105
+ case "--judge":
106
+ case "-j":
107
+ judgeId = argv[++i];
108
+ break;
109
+ case "--help":
110
+ case "-h":
111
+ console.log(`
112
+ Judges Panel — Rule Documentation Generator
113
+
114
+ USAGE:
115
+ judges docs Print all docs to stdout
116
+ judges docs --output docs/rules/ Write per-judge .md files
117
+ judges docs --judge cybersecurity Show single judge documentation
118
+
119
+ OPTIONS:
120
+ --output, -o <dir> Output directory for .md files
121
+ --judge, -j <id> Generate docs for a single judge
122
+ `);
123
+ process.exit(0);
124
+ }
125
+ }
126
+ if (judgeId) {
127
+ const judge = getJudge(judgeId);
128
+ if (!judge) {
129
+ console.error(`Unknown judge: ${judgeId}`);
130
+ console.error('Run "judges list" to see available judges.');
131
+ process.exit(1);
132
+ }
133
+ console.log(generateJudgeDoc(judge));
134
+ process.exit(0);
135
+ }
136
+ if (output) {
137
+ const dir = resolve(output);
138
+ if (!existsSync(dir))
139
+ mkdirSync(dir, { recursive: true });
140
+ // Write index
141
+ writeFileSync(join(dir, "README.md"), generateIndexDoc(), "utf-8");
142
+ // Write per-judge docs
143
+ for (const judge of JUDGES) {
144
+ writeFileSync(join(dir, `${judge.id}.md`), generateJudgeDoc(judge), "utf-8");
145
+ }
146
+ console.log(`✅ Generated documentation for ${JUDGES.length} judges in ${dir}`);
147
+ }
148
+ else {
149
+ // Print everything to stdout
150
+ console.log(generateIndexDoc());
151
+ for (const judge of JUDGES) {
152
+ console.log(generateJudgeDoc(judge));
153
+ }
154
+ }
155
+ process.exit(0);
156
+ }
157
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `judges fix` — Apply auto-fix patches from findings.
3
+ *
4
+ * Evaluates code with the full tribunal, collects findings with patches,
5
+ * and either previews or applies the fixes.
6
+ *
7
+ * Usage:
8
+ * judges fix src/app.ts # Preview fixes (dry-run)
9
+ * judges fix src/app.ts --apply # Apply fixes in-place
10
+ * judges fix src/app.ts --judge cyber # Fixes from one judge only
11
+ */
12
+ interface FixArgs {
13
+ file: string | undefined;
14
+ language: string | undefined;
15
+ judge: string | undefined;
16
+ apply: boolean;
17
+ }
18
+ export declare function parseFixArgs(argv: string[]): FixArgs;
19
+ export declare function runFix(argv: string[]): void;
20
+ export {};
21
+ //# sourceMappingURL=fix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAsFH,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAoCpD;AAID,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsF3C"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * `judges fix` — Apply auto-fix patches from findings.
3
+ *
4
+ * Evaluates code with the full tribunal, collects findings with patches,
5
+ * and either previews or applies the fixes.
6
+ *
7
+ * Usage:
8
+ * judges fix src/app.ts # Preview fixes (dry-run)
9
+ * judges fix src/app.ts --apply # Apply fixes in-place
10
+ * judges fix src/app.ts --judge cyber # Fixes from one judge only
11
+ */
12
+ import { existsSync, readFileSync, writeFileSync } from "fs";
13
+ import { resolve, extname } from "path";
14
+ import { evaluateWithTribunal, evaluateWithJudge } from "../evaluators/index.js";
15
+ import { getJudge } from "../judges/index.js";
16
+ // ─── Language Detection (shared with cli.ts) ────────────────────────────────
17
+ const EXT_TO_LANG = {
18
+ ".ts": "typescript",
19
+ ".tsx": "typescript",
20
+ ".js": "javascript",
21
+ ".jsx": "javascript",
22
+ ".mjs": "javascript",
23
+ ".cjs": "javascript",
24
+ ".py": "python",
25
+ ".rs": "rust",
26
+ ".go": "go",
27
+ ".java": "java",
28
+ ".cs": "csharp",
29
+ ".cpp": "cpp",
30
+ ".cc": "cpp",
31
+ ".cxx": "cpp",
32
+ ".h": "c",
33
+ ".hpp": "cpp",
34
+ };
35
+ function detectLanguage(filePath) {
36
+ const base = filePath.toLowerCase();
37
+ if (base.endsWith("dockerfile") || base.includes("dockerfile."))
38
+ return "dockerfile";
39
+ const ext = extname(base);
40
+ return EXT_TO_LANG[ext] || "typescript";
41
+ }
42
+ /**
43
+ * Sort patches bottom-to-top (by startLine descending) to avoid line offsets.
44
+ */
45
+ function sortPatchesBottomUp(patches) {
46
+ return [...patches].sort((a, b) => b.patch.startLine - a.patch.startLine);
47
+ }
48
+ /**
49
+ * Apply patches to source code. Patches are applied bottom-to-top so that
50
+ * earlier line numbers remain stable.
51
+ */
52
+ function applyPatches(code, patches) {
53
+ const lines = code.split("\n");
54
+ const sorted = sortPatchesBottomUp(patches);
55
+ let applied = 0;
56
+ let skipped = 0;
57
+ for (const p of sorted) {
58
+ const { patch } = p;
59
+ // Validate the old text matches what we expect
60
+ const regionLines = lines.slice(patch.startLine - 1, patch.endLine);
61
+ const regionText = regionLines.join("\n");
62
+ if (regionText.includes(patch.oldText) || regionText.trim() === patch.oldText.trim()) {
63
+ // Apply the replacement
64
+ const newRegionText = regionText.replace(patch.oldText, patch.newText);
65
+ const newLines = newRegionText.split("\n");
66
+ lines.splice(patch.startLine - 1, patch.endLine - patch.startLine + 1, ...newLines);
67
+ applied++;
68
+ }
69
+ else {
70
+ skipped++;
71
+ }
72
+ }
73
+ return { result: lines.join("\n"), applied, skipped };
74
+ }
75
+ export function parseFixArgs(argv) {
76
+ const args = {
77
+ file: undefined,
78
+ language: undefined,
79
+ judge: undefined,
80
+ apply: false,
81
+ };
82
+ for (let i = 3; i < argv.length; i++) {
83
+ // skip node, script, "fix"
84
+ const arg = argv[i];
85
+ switch (arg) {
86
+ case "--apply":
87
+ case "-a":
88
+ args.apply = true;
89
+ break;
90
+ case "--language":
91
+ case "-l":
92
+ args.language = argv[++i];
93
+ break;
94
+ case "--judge":
95
+ case "-j":
96
+ args.judge = argv[++i];
97
+ break;
98
+ case "--file":
99
+ case "-f":
100
+ args.file = argv[++i];
101
+ break;
102
+ default:
103
+ if (!arg.startsWith("-") && !args.file) {
104
+ args.file = arg;
105
+ }
106
+ break;
107
+ }
108
+ }
109
+ return args;
110
+ }
111
+ // ─── Main Fix Command ──────────────────────────────────────────────────────
112
+ export function runFix(argv) {
113
+ const args = parseFixArgs(argv);
114
+ if (!args.file) {
115
+ console.error("Error: No file specified.");
116
+ console.error("Usage: judges fix <file> [--apply]");
117
+ process.exit(1);
118
+ }
119
+ const filePath = resolve(args.file);
120
+ if (!existsSync(filePath)) {
121
+ console.error(`Error: File not found: ${filePath}`);
122
+ process.exit(1);
123
+ }
124
+ const code = readFileSync(filePath, "utf-8");
125
+ const language = args.language || detectLanguage(filePath);
126
+ // Run evaluation
127
+ let findings;
128
+ if (args.judge) {
129
+ const judge = getJudge(args.judge);
130
+ if (!judge) {
131
+ console.error(`Error: Unknown judge "${args.judge}"`);
132
+ process.exit(1);
133
+ }
134
+ const evaluation = evaluateWithJudge(judge, code, language);
135
+ findings = evaluation.findings;
136
+ }
137
+ else {
138
+ const verdict = evaluateWithTribunal(code, language);
139
+ findings = verdict.evaluations.flatMap((e) => e.findings);
140
+ }
141
+ // Collect fixable findings (those with patches)
142
+ const fixable = findings
143
+ .filter((f) => f.patch)
144
+ .map((f) => ({
145
+ ruleId: f.ruleId,
146
+ title: f.title,
147
+ severity: f.severity,
148
+ patch: f.patch,
149
+ lineNumbers: f.lineNumbers,
150
+ }));
151
+ console.log("");
152
+ console.log("╔══════════════════════════════════════════════════════════════╗");
153
+ console.log("║ Judges Panel — Auto-Fix ║");
154
+ console.log("╚══════════════════════════════════════════════════════════════╝");
155
+ console.log("");
156
+ console.log(` File : ${args.file}`);
157
+ console.log(` Language : ${language}`);
158
+ console.log(` Findings : ${findings.length} total, ${fixable.length} auto-fixable`);
159
+ console.log("");
160
+ if (fixable.length === 0) {
161
+ console.log(" No auto-fixable findings. Nothing to do.\n");
162
+ process.exit(0);
163
+ }
164
+ // Show preview
165
+ console.log(" Fixes available:");
166
+ console.log(" " + "─".repeat(60));
167
+ for (const p of fixable) {
168
+ const line = p.lineNumbers?.[0] ?? p.patch.startLine;
169
+ console.log(` [${p.severity.toUpperCase().padEnd(8)}] ${p.ruleId}: ${p.title}`);
170
+ console.log(` Line ${line}: "${p.patch.oldText.slice(0, 50)}" → "${p.patch.newText.slice(0, 50)}"`);
171
+ }
172
+ console.log("");
173
+ if (!args.apply) {
174
+ console.log(" Dry run — no changes made.");
175
+ console.log(" Run with --apply to write fixes:\n");
176
+ console.log(` judges fix ${args.file} --apply\n`);
177
+ process.exit(0);
178
+ }
179
+ // Apply patches
180
+ const { result, applied, skipped } = applyPatches(code, fixable);
181
+ writeFileSync(filePath, result, "utf-8");
182
+ console.log(` ✅ Applied ${applied} fix(es) to ${args.file}`);
183
+ if (skipped > 0) {
184
+ console.log(` ⏭ Skipped ${skipped} fix(es) (source text changed)`);
185
+ }
186
+ console.log("");
187
+ console.log(" Run 'judges eval' to verify the remaining findings.\n");
188
+ }
189
+ //# sourceMappingURL=fix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `judges hook` — Install/uninstall pre-commit git hooks.
3
+ *
4
+ * Usage:
5
+ * judges hook install # Install pre-commit hook
6
+ * judges hook uninstall # Remove pre-commit hook
7
+ */
8
+ export declare function runHook(argv: string[]): void;
9
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuDH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAa5C"}