@kevinrabun/judges 3.65.0 → 3.66.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 +8 -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-timeline.d.ts +5 -0
  6. package/dist/commands/finding-timeline.d.ts.map +1 -0
  7. package/dist/commands/finding-timeline.js +144 -0
  8. package/dist/commands/finding-timeline.js.map +1 -0
  9. package/dist/commands/fix-verify.d.ts +5 -0
  10. package/dist/commands/fix-verify.d.ts.map +1 -0
  11. package/dist/commands/fix-verify.js +124 -0
  12. package/dist/commands/fix-verify.js.map +1 -0
  13. package/dist/commands/review-comment.d.ts +5 -0
  14. package/dist/commands/review-comment.d.ts.map +1 -0
  15. package/dist/commands/review-comment.js +166 -0
  16. package/dist/commands/review-comment.js.map +1 -0
  17. package/dist/commands/review-export.d.ts +5 -0
  18. package/dist/commands/review-export.d.ts.map +1 -0
  19. package/dist/commands/review-export.js +180 -0
  20. package/dist/commands/review-export.js.map +1 -0
  21. package/dist/commands/review-schedule.d.ts +5 -0
  22. package/dist/commands/review-schedule.d.ts.map +1 -0
  23. package/dist/commands/review-schedule.js +170 -0
  24. package/dist/commands/review-schedule.js.map +1 -0
  25. package/dist/commands/review-scope.d.ts +5 -0
  26. package/dist/commands/review-scope.d.ts.map +1 -0
  27. package/dist/commands/review-scope.js +198 -0
  28. package/dist/commands/review-scope.js.map +1 -0
  29. package/dist/commands/rule-catalog.d.ts +5 -0
  30. package/dist/commands/rule-catalog.d.ts.map +1 -0
  31. package/dist/commands/rule-catalog.js +129 -0
  32. package/dist/commands/rule-catalog.js.map +1 -0
  33. package/dist/commands/setup-wizard.d.ts +5 -0
  34. package/dist/commands/setup-wizard.d.ts.map +1 -0
  35. package/dist/commands/setup-wizard.js +175 -0
  36. package/dist/commands/setup-wizard.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Review-export — Unified export of review results to multiple formats.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Format helpers ─────────────────────────────────────────────────────────
7
+ function toCSV(verdict) {
8
+ const findings = verdict.findings || [];
9
+ const header = "severity,ruleId,title,recommendation,confidence,lines";
10
+ const rows = findings.map((f) => {
11
+ const sev = (f.severity || "").replace(/,/g, ";");
12
+ const rule = (f.ruleId || "").replace(/,/g, ";");
13
+ const title = (f.title || "").replace(/,/g, ";").replace(/"/g, '""');
14
+ const rec = (f.recommendation || "").replace(/,/g, ";").replace(/"/g, '""');
15
+ const conf = f.confidence ?? "";
16
+ const lines = f.lineNumbers ? f.lineNumbers.join(";") : "";
17
+ return `${sev},${rule},"${title}","${rec}",${conf},${lines}`;
18
+ });
19
+ return [header, ...rows].join("\n");
20
+ }
21
+ function toMarkdown(verdict) {
22
+ const findings = verdict.findings || [];
23
+ const lines = [];
24
+ lines.push("# Review Results");
25
+ lines.push("");
26
+ lines.push(`**Score**: ${verdict.overallScore || 0}/100`);
27
+ lines.push(`**Verdict**: ${verdict.overallVerdict || "n/a"}`);
28
+ lines.push(`**Findings**: ${findings.length}`);
29
+ lines.push(`**Timestamp**: ${verdict.timestamp || new Date().toISOString()}`);
30
+ lines.push("");
31
+ if (verdict.summary) {
32
+ lines.push("## Summary");
33
+ lines.push("");
34
+ lines.push(verdict.summary);
35
+ lines.push("");
36
+ }
37
+ if (findings.length > 0) {
38
+ lines.push("## Findings");
39
+ lines.push("");
40
+ lines.push("| Severity | Rule | Title | Lines |");
41
+ lines.push("|----------|------|-------|-------|");
42
+ for (const f of findings) {
43
+ const sev = f.severity || "unknown";
44
+ const rule = f.ruleId || "";
45
+ const title = (f.title || "").replace(/\|/g, "\\|");
46
+ const lineNums = f.lineNumbers ? f.lineNumbers.join(", ") : "";
47
+ lines.push(`| ${sev} | ${rule} | ${title} | ${lineNums} |`);
48
+ }
49
+ lines.push("");
50
+ // Details
51
+ lines.push("## Details");
52
+ lines.push("");
53
+ for (const f of findings) {
54
+ lines.push(`### [${(f.severity || "").toUpperCase()}] ${f.title || f.ruleId}`);
55
+ lines.push("");
56
+ if (f.description)
57
+ lines.push(f.description);
58
+ if (f.recommendation) {
59
+ lines.push("");
60
+ lines.push(`**Recommendation**: ${f.recommendation}`);
61
+ }
62
+ lines.push("");
63
+ }
64
+ }
65
+ return lines.join("\n");
66
+ }
67
+ function toHTML(verdict) {
68
+ const findings = verdict.findings || [];
69
+ const severityColor = {
70
+ critical: "#d32f2f",
71
+ high: "#f57c00",
72
+ medium: "#fbc02d",
73
+ low: "#388e3c",
74
+ info: "#1976d2",
75
+ };
76
+ const rows = findings
77
+ .map((f) => {
78
+ const color = severityColor[(f.severity || "").toLowerCase()] || "#666";
79
+ return `<tr>
80
+ <td style="color:${color};font-weight:bold">${(f.severity || "").toUpperCase()}</td>
81
+ <td>${f.ruleId || ""}</td>
82
+ <td>${f.title || ""}</td>
83
+ <td>${f.lineNumbers ? f.lineNumbers.join(", ") : ""}</td>
84
+ <td>${f.recommendation || ""}</td>
85
+ </tr>`;
86
+ })
87
+ .join("\n");
88
+ return `<!DOCTYPE html>
89
+ <html lang="en">
90
+ <head><meta charset="utf-8"><title>Review Results</title>
91
+ <style>body{font-family:system-ui;max-width:900px;margin:0 auto;padding:20px}
92
+ table{width:100%;border-collapse:collapse}th,td{padding:8px 12px;border:1px solid #ddd;text-align:left}
93
+ th{background:#f5f5f5}.summary{background:#f0f7ff;padding:16px;border-radius:8px;margin:16px 0}</style>
94
+ </head>
95
+ <body>
96
+ <h1>Review Results</h1>
97
+ <div class="summary">
98
+ <strong>Score:</strong> ${verdict.overallScore || 0}/100 |
99
+ <strong>Verdict:</strong> ${verdict.overallVerdict || "n/a"} |
100
+ <strong>Findings:</strong> ${findings.length}
101
+ </div>
102
+ ${verdict.summary ? `<p>${verdict.summary}</p>` : ""}
103
+ <table><thead><tr><th>Severity</th><th>Rule</th><th>Title</th><th>Lines</th><th>Recommendation</th></tr></thead>
104
+ <tbody>${rows}</tbody></table>
105
+ </body></html>`;
106
+ }
107
+ // ─── CLI ────────────────────────────────────────────────────────────────────
108
+ export function runReviewExport(argv) {
109
+ if (argv.includes("--help") || argv.includes("-h")) {
110
+ console.log(`
111
+ judges review-export — Export review results to various formats
112
+
113
+ Usage:
114
+ judges review-export --file verdict.json --to csv --output results.csv
115
+ judges review-export --file verdict.json --to markdown --output report.md
116
+ judges review-export --file verdict.json --to html --output report.html
117
+
118
+ Options:
119
+ --file <path> Verdict JSON to export
120
+ --to <format> Export format: csv, markdown, html, json
121
+ --output <path> Output file path
122
+ --stdout Print to stdout instead of file
123
+ --help, -h Show this help
124
+
125
+ Exports review verdicts to CSV, Markdown, HTML, or pretty-printed JSON.
126
+ `);
127
+ return;
128
+ }
129
+ const file = argv.find((_a, i) => argv[i - 1] === "--file");
130
+ const toFormat = argv.find((_a, i) => argv[i - 1] === "--to") || "markdown";
131
+ const outputFile = argv.find((_a, i) => argv[i - 1] === "--output");
132
+ const toStdout = argv.includes("--stdout");
133
+ if (!file) {
134
+ console.error("Error: --file is required.");
135
+ process.exitCode = 1;
136
+ return;
137
+ }
138
+ if (!existsSync(file)) {
139
+ console.error(`Error: File not found: ${file}`);
140
+ process.exitCode = 1;
141
+ return;
142
+ }
143
+ let verdict;
144
+ try {
145
+ verdict = JSON.parse(readFileSync(file, "utf-8"));
146
+ }
147
+ catch {
148
+ console.error(`Error: Could not parse ${file}`);
149
+ process.exitCode = 1;
150
+ return;
151
+ }
152
+ let content;
153
+ switch (toFormat.toLowerCase()) {
154
+ case "csv":
155
+ content = toCSV(verdict);
156
+ break;
157
+ case "markdown":
158
+ case "md":
159
+ content = toMarkdown(verdict);
160
+ break;
161
+ case "html":
162
+ content = toHTML(verdict);
163
+ break;
164
+ case "json":
165
+ content = JSON.stringify(verdict, null, 2);
166
+ break;
167
+ default:
168
+ console.error(`Error: Unknown format '${toFormat}'. Supported: csv, markdown, html, json`);
169
+ process.exitCode = 1;
170
+ return;
171
+ }
172
+ if (toStdout || !outputFile) {
173
+ console.log(content);
174
+ return;
175
+ }
176
+ mkdirSync(dirname(outputFile), { recursive: true });
177
+ writeFileSync(outputFile, content, "utf-8");
178
+ console.log(`Exported ${toFormat} to ${outputFile} (${(verdict.findings || []).length} findings)`);
179
+ }
180
+ //# sourceMappingURL=review-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-export.js","sourceRoot":"","sources":["../../src/commands/review-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-schedule — Configure scheduled review cadences (stored locally).
3
+ */
4
+ export declare function runReviewSchedule(argv: string[]): void;
5
+ //# sourceMappingURL=review-schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-schedule.d.ts","sourceRoot":"","sources":["../../src/commands/review-schedule.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsEH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsItD"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Review-schedule — Configure scheduled review cadences (stored locally).
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const SCHEDULE_FILE = join(".judges", "schedules.json");
8
+ function loadSchedules() {
9
+ if (!existsSync(SCHEDULE_FILE))
10
+ return { version: "1.0.0", schedules: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(SCHEDULE_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", schedules: [] };
16
+ }
17
+ }
18
+ function saveSchedules(store) {
19
+ mkdirSync(dirname(SCHEDULE_FILE), { recursive: true });
20
+ writeFileSync(SCHEDULE_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ // ─── Cron generation ────────────────────────────────────────────────────────
23
+ function generateCiConfig(schedule, ci) {
24
+ if (ci === "github-actions") {
25
+ return `# ${schedule.name}: ${schedule.description}
26
+ name: Scheduled Review - ${schedule.name}
27
+ on:
28
+ schedule:
29
+ - cron: '${schedule.cron}'
30
+ workflow_dispatch:
31
+
32
+ jobs:
33
+ review:
34
+ runs-on: ubuntu-latest
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+ - uses: actions/setup-node@v4
38
+ with:
39
+ node-version: '20'
40
+ - run: npx @kevinrabun/judges ${schedule.command}
41
+ `;
42
+ }
43
+ // Generic
44
+ return `# Schedule: ${schedule.name}\n# Cron: ${schedule.cron}\n# Command: judges ${schedule.command}`;
45
+ }
46
+ // ─── CLI ────────────────────────────────────────────────────────────────────
47
+ export function runReviewSchedule(argv) {
48
+ if (argv.includes("--help") || argv.includes("-h")) {
49
+ console.log(`
50
+ judges review-schedule — Configure scheduled review cadences
51
+
52
+ Usage:
53
+ judges review-schedule list List schedules
54
+ judges review-schedule add --name daily --cron "0 8 * * *" --command "eval src/"
55
+ judges review-schedule remove --id sched-xxx Remove a schedule
56
+ judges review-schedule enable --id sched-xxx Enable a schedule
57
+ judges review-schedule disable --id sched-xxx Disable a schedule
58
+ judges review-schedule generate --id sched-xxx --ci github-actions
59
+
60
+ Subcommands:
61
+ list List all configured schedules
62
+ add Add a new scheduled review
63
+ remove Remove a schedule
64
+ enable Enable a schedule
65
+ disable Disable a schedule
66
+ generate Generate CI configuration for a schedule
67
+
68
+ Options:
69
+ --name <name> Schedule name
70
+ --cron <expr> Cron expression
71
+ --command <cmd> Judges command to run
72
+ --id <id> Schedule ID
73
+ --ci <type> CI system (github-actions)
74
+ --description <text> Description
75
+ --format json JSON output
76
+ --help, -h Show this help
77
+
78
+ Schedules are stored locally in .judges/schedules.json.
79
+ Use 'generate' to create CI workflow files for automated execution.
80
+ `);
81
+ return;
82
+ }
83
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
84
+ const subcommand = argv.find((a) => ["list", "add", "remove", "enable", "disable", "generate"].includes(a)) || "list";
85
+ const store = loadSchedules();
86
+ if (subcommand === "add") {
87
+ const name = argv.find((_a, i) => argv[i - 1] === "--name") || `schedule-${store.schedules.length + 1}`;
88
+ const cron = argv.find((_a, i) => argv[i - 1] === "--cron") || "0 8 * * 1-5";
89
+ const command = argv.find((_a, i) => argv[i - 1] === "--command") || "eval .";
90
+ const description = argv.find((_a, i) => argv[i - 1] === "--description") || "";
91
+ const entry = {
92
+ id: `sched-${Date.now().toString(36)}`,
93
+ name,
94
+ cron,
95
+ command,
96
+ enabled: true,
97
+ createdAt: new Date().toISOString(),
98
+ lastRun: "",
99
+ description,
100
+ };
101
+ store.schedules.push(entry);
102
+ saveSchedules(store);
103
+ console.log(`Added schedule '${name}' (${entry.id}) — cron: ${cron}`);
104
+ return;
105
+ }
106
+ if (subcommand === "remove") {
107
+ const id = argv.find((_a, i) => argv[i - 1] === "--id");
108
+ if (!id) {
109
+ console.error("Error: --id is required.");
110
+ process.exitCode = 1;
111
+ return;
112
+ }
113
+ store.schedules = store.schedules.filter((s) => s.id !== id);
114
+ saveSchedules(store);
115
+ console.log(`Removed schedule '${id}'.`);
116
+ return;
117
+ }
118
+ if (subcommand === "enable" || subcommand === "disable") {
119
+ const id = argv.find((_a, i) => argv[i - 1] === "--id");
120
+ if (!id) {
121
+ console.error("Error: --id is required.");
122
+ process.exitCode = 1;
123
+ return;
124
+ }
125
+ const entry = store.schedules.find((s) => s.id === id);
126
+ if (!entry) {
127
+ console.error(`Error: Schedule '${id}' not found.`);
128
+ process.exitCode = 1;
129
+ return;
130
+ }
131
+ entry.enabled = subcommand === "enable";
132
+ saveSchedules(store);
133
+ console.log(`Schedule '${id}' ${subcommand}d.`);
134
+ return;
135
+ }
136
+ if (subcommand === "generate") {
137
+ const id = argv.find((_a, i) => argv[i - 1] === "--id");
138
+ const ci = argv.find((_a, i) => argv[i - 1] === "--ci") || "github-actions";
139
+ if (!id) {
140
+ console.error("Error: --id is required.");
141
+ process.exitCode = 1;
142
+ return;
143
+ }
144
+ const entry = store.schedules.find((s) => s.id === id);
145
+ if (!entry) {
146
+ console.error(`Error: Schedule '${id}' not found.`);
147
+ process.exitCode = 1;
148
+ return;
149
+ }
150
+ console.log(generateCiConfig(entry, ci));
151
+ return;
152
+ }
153
+ // List
154
+ if (format === "json") {
155
+ console.log(JSON.stringify(store, null, 2));
156
+ return;
157
+ }
158
+ console.log(`\n Review Schedules (${store.schedules.length})\n ═════════════════════════════`);
159
+ if (store.schedules.length === 0) {
160
+ console.log(' No schedules. Add one with: judges review-schedule add --name daily --cron "0 8 * * *"');
161
+ }
162
+ for (const s of store.schedules) {
163
+ const status = s.enabled ? "✅" : "⏸️";
164
+ console.log(` ${status} ${s.id} — ${s.name} (${s.cron}) command: ${s.command}`);
165
+ if (s.description)
166
+ console.log(` ${s.description}`);
167
+ }
168
+ console.log();
169
+ }
170
+ //# sourceMappingURL=review-schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-schedule.js","sourceRoot":"","sources":["../../src/commands/review-schedule.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAoBrC,+EAA+E;AAE/E,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAExD,SAAS,aAAa;IACpB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3E,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAkB,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAoB;IACzC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,+EAA+E;AAE/E,SAAS,gBAAgB,CAAC,QAAuB,EAAE,EAAU;IAC3D,IAAI,EAAE,KAAK,gBAAgB,EAAE,CAAC;QAC5B,OAAO,KAAK,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,WAAW;2BAC3B,QAAQ,CAAC,IAAI;;;eAGzB,QAAQ,CAAC,IAAI;;;;;;;;;;;sCAWU,QAAQ,CAAC,OAAO;CACrD,CAAC;IACA,CAAC;IAED,UAAU;IACV,OAAO,eAAe,QAAQ,CAAC,IAAI,aAAa,QAAQ,CAAC,IAAI,uBAAuB,QAAQ,CAAC,OAAO,EAAE,CAAC;AACzG,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+Bf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC;IAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IACtH,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAE9B,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GACR,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,YAAY,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7G,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,aAAa,CAAC;QAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,WAAW,CAAC,IAAI,QAAQ,CAAC;QAC9F,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,eAAe,CAAC,IAAI,EAAE,CAAC;QAEhG,MAAM,KAAK,GAAkB;YAC3B,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YACtC,IAAI;YACJ,IAAI;YACJ,OAAO;YACP,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,EAAE;YACX,WAAW;SACZ,CAAC;QAEF,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,MAAM,KAAK,CAAC,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;QACxE,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACxD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;QACxE,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC;YACpD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,KAAK,CAAC,OAAO,GAAG,UAAU,KAAK,QAAQ,CAAC;QACxC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,UAAU,IAAI,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC;QAC5F,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC;YACpD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,OAAO;IACP,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,SAAS,CAAC,MAAM,oCAAoC,CAAC,CAAC;IAEjG,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,4FAA4F,CAAC,CAAC;IAC5G,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-scope — Define and manage review scope boundaries.
3
+ */
4
+ export declare function runReviewScope(argv: string[]): void;
5
+ //# sourceMappingURL=review-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-scope.d.ts","sourceRoot":"","sources":["../../src/commands/review-scope.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6DH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6JnD"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Review-scope — Define and manage review scope boundaries.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const SCOPE_FILE = join(".judges", "review-scope.json");
8
+ function loadScope() {
9
+ if (!existsSync(SCOPE_FILE)) {
10
+ return {
11
+ version: "1.0.0",
12
+ name: "default",
13
+ include: ["**/*"],
14
+ exclude: ["node_modules/**", "dist/**", ".git/**", "*.min.js", "*.min.css"],
15
+ languages: [],
16
+ maxFileSize: 500000,
17
+ maxFiles: 1000,
18
+ focusDirs: [],
19
+ ignoreDirs: ["node_modules", "dist", ".git", "vendor", "build", "coverage"],
20
+ };
21
+ }
22
+ try {
23
+ return JSON.parse(readFileSync(SCOPE_FILE, "utf-8"));
24
+ }
25
+ catch {
26
+ return {
27
+ version: "1.0.0",
28
+ name: "default",
29
+ include: ["**/*"],
30
+ exclude: [],
31
+ languages: [],
32
+ maxFileSize: 500000,
33
+ maxFiles: 1000,
34
+ focusDirs: [],
35
+ ignoreDirs: [],
36
+ };
37
+ }
38
+ }
39
+ function saveScope(config) {
40
+ mkdirSync(dirname(SCOPE_FILE), { recursive: true });
41
+ writeFileSync(SCOPE_FILE, JSON.stringify(config, null, 2), "utf-8");
42
+ }
43
+ // ─── CLI ────────────────────────────────────────────────────────────────────
44
+ export function runReviewScope(argv) {
45
+ if (argv.includes("--help") || argv.includes("-h")) {
46
+ console.log(`
47
+ judges review-scope — Define review scope boundaries
48
+
49
+ Usage:
50
+ judges review-scope show Show current scope
51
+ judges review-scope set --name production Set scope name
52
+ judges review-scope include --pattern "src/**" Add include pattern
53
+ judges review-scope exclude --pattern "test/**" Add exclude pattern
54
+ judges review-scope focus --dir src/core Add focus directory
55
+ judges review-scope ignore --dir vendor Add ignore directory
56
+ judges review-scope language --add python Add language filter
57
+ judges review-scope reset Reset to defaults
58
+
59
+ Subcommands:
60
+ show Show current scope configuration
61
+ set Set a scope property
62
+ include Add include pattern
63
+ exclude Add exclude pattern
64
+ focus Add focus directory
65
+ ignore Add ignore directory
66
+ language Manage language filters
67
+ reset Reset to default scope
68
+
69
+ Options:
70
+ --pattern <glob> Glob pattern (for include/exclude)
71
+ --dir <path> Directory (for focus/ignore)
72
+ --name <name> Scope name
73
+ --add <lang> Add language filter
74
+ --remove <lang> Remove language filter
75
+ --max-size <bytes> Maximum file size to review
76
+ --max-files <n> Maximum number of files
77
+ --format json JSON output
78
+ --help, -h Show this help
79
+
80
+ Scope configuration is stored in .judges/review-scope.json.
81
+ `);
82
+ return;
83
+ }
84
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
85
+ const subcommand = argv.find((a) => ["show", "set", "include", "exclude", "focus", "ignore", "language", "reset"].includes(a)) ||
86
+ "show";
87
+ const config = loadScope();
88
+ if (subcommand === "reset") {
89
+ const defaults = loadScope();
90
+ defaults.include = ["**/*"];
91
+ defaults.exclude = ["node_modules/**", "dist/**", ".git/**", "*.min.js", "*.min.css"];
92
+ defaults.languages = [];
93
+ defaults.focusDirs = [];
94
+ defaults.ignoreDirs = ["node_modules", "dist", ".git", "vendor", "build", "coverage"];
95
+ saveScope(defaults);
96
+ console.log("Scope reset to defaults.");
97
+ return;
98
+ }
99
+ if (subcommand === "set") {
100
+ const name = argv.find((_a, i) => argv[i - 1] === "--name");
101
+ const maxSize = argv.find((_a, i) => argv[i - 1] === "--max-size");
102
+ const maxFiles = argv.find((_a, i) => argv[i - 1] === "--max-files");
103
+ if (name)
104
+ config.name = name;
105
+ if (maxSize)
106
+ config.maxFileSize = parseInt(maxSize, 10);
107
+ if (maxFiles)
108
+ config.maxFiles = parseInt(maxFiles, 10);
109
+ saveScope(config);
110
+ console.log("Scope updated.");
111
+ return;
112
+ }
113
+ if (subcommand === "include") {
114
+ const pattern = argv.find((_a, i) => argv[i - 1] === "--pattern");
115
+ if (pattern && !config.include.includes(pattern)) {
116
+ config.include.push(pattern);
117
+ saveScope(config);
118
+ console.log(`Added include pattern: ${pattern}`);
119
+ }
120
+ else {
121
+ console.error("Error: --pattern is required.");
122
+ process.exitCode = 1;
123
+ }
124
+ return;
125
+ }
126
+ if (subcommand === "exclude") {
127
+ const pattern = argv.find((_a, i) => argv[i - 1] === "--pattern");
128
+ if (pattern && !config.exclude.includes(pattern)) {
129
+ config.exclude.push(pattern);
130
+ saveScope(config);
131
+ console.log(`Added exclude pattern: ${pattern}`);
132
+ }
133
+ else {
134
+ console.error("Error: --pattern is required.");
135
+ process.exitCode = 1;
136
+ }
137
+ return;
138
+ }
139
+ if (subcommand === "focus") {
140
+ const dir = argv.find((_a, i) => argv[i - 1] === "--dir");
141
+ if (dir && !config.focusDirs.includes(dir)) {
142
+ config.focusDirs.push(dir);
143
+ saveScope(config);
144
+ console.log(`Added focus directory: ${dir}`);
145
+ }
146
+ else {
147
+ console.error("Error: --dir is required.");
148
+ process.exitCode = 1;
149
+ }
150
+ return;
151
+ }
152
+ if (subcommand === "ignore") {
153
+ const dir = argv.find((_a, i) => argv[i - 1] === "--dir");
154
+ if (dir && !config.ignoreDirs.includes(dir)) {
155
+ config.ignoreDirs.push(dir);
156
+ saveScope(config);
157
+ console.log(`Added ignore directory: ${dir}`);
158
+ }
159
+ else {
160
+ console.error("Error: --dir is required.");
161
+ process.exitCode = 1;
162
+ }
163
+ return;
164
+ }
165
+ if (subcommand === "language") {
166
+ const add = argv.find((_a, i) => argv[i - 1] === "--add");
167
+ const remove = argv.find((_a, i) => argv[i - 1] === "--remove");
168
+ if (add && !config.languages.includes(add)) {
169
+ config.languages.push(add);
170
+ saveScope(config);
171
+ console.log(`Added language filter: ${add}`);
172
+ }
173
+ else if (remove) {
174
+ config.languages = config.languages.filter((l) => l !== remove);
175
+ saveScope(config);
176
+ console.log(`Removed language filter: ${remove}`);
177
+ }
178
+ else {
179
+ console.log(`Languages: ${config.languages.length > 0 ? config.languages.join(", ") : "(all)"}`);
180
+ }
181
+ return;
182
+ }
183
+ // Show
184
+ if (format === "json") {
185
+ console.log(JSON.stringify(config, null, 2));
186
+ return;
187
+ }
188
+ console.log(`\n Review Scope: ${config.name}\n ═════════════════════════════`);
189
+ console.log(` Include: ${config.include.join(", ")}`);
190
+ console.log(` Exclude: ${config.exclude.join(", ")}`);
191
+ console.log(` Languages: ${config.languages.length > 0 ? config.languages.join(", ") : "(all)"}`);
192
+ console.log(` Max file size: ${config.maxFileSize} bytes`);
193
+ console.log(` Max files: ${config.maxFiles}`);
194
+ console.log(` Focus dirs: ${config.focusDirs.length > 0 ? config.focusDirs.join(", ") : "(none)"}`);
195
+ console.log(` Ignore dirs: ${config.ignoreDirs.join(", ")}`);
196
+ console.log();
197
+ }
198
+ //# sourceMappingURL=review-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-scope.js","sourceRoot":"","sources":["../../src/commands/review-scope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Rule-catalog — Browse, search, and preview available rules with examples.
3
+ */
4
+ export declare function runRuleCatalog(argv: string[]): void;
5
+ //# sourceMappingURL=rule-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-catalog.d.ts","sourceRoot":"","sources":["../../src/commands/rule-catalog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyGnD"}