@kevinrabun/judges 3.64.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 (70) hide show
  1. package/CHANGELOG.md +15 -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/code-health.d.ts +5 -0
  6. package/dist/commands/code-health.d.ts.map +1 -0
  7. package/dist/commands/code-health.js +196 -0
  8. package/dist/commands/code-health.js.map +1 -0
  9. package/dist/commands/finding-suppress.d.ts +5 -0
  10. package/dist/commands/finding-suppress.d.ts.map +1 -0
  11. package/dist/commands/finding-suppress.js +165 -0
  12. package/dist/commands/finding-suppress.js.map +1 -0
  13. package/dist/commands/finding-timeline.d.ts +5 -0
  14. package/dist/commands/finding-timeline.d.ts.map +1 -0
  15. package/dist/commands/finding-timeline.js +144 -0
  16. package/dist/commands/finding-timeline.js.map +1 -0
  17. package/dist/commands/fix-verify.d.ts +5 -0
  18. package/dist/commands/fix-verify.d.ts.map +1 -0
  19. package/dist/commands/fix-verify.js +124 -0
  20. package/dist/commands/fix-verify.js.map +1 -0
  21. package/dist/commands/judge-config.d.ts +5 -0
  22. package/dist/commands/judge-config.d.ts.map +1 -0
  23. package/dist/commands/judge-config.js +152 -0
  24. package/dist/commands/judge-config.js.map +1 -0
  25. package/dist/commands/review-annotate.d.ts +5 -0
  26. package/dist/commands/review-annotate.d.ts.map +1 -0
  27. package/dist/commands/review-annotate.js +123 -0
  28. package/dist/commands/review-annotate.js.map +1 -0
  29. package/dist/commands/review-checkpoint.d.ts +5 -0
  30. package/dist/commands/review-checkpoint.d.ts.map +1 -0
  31. package/dist/commands/review-checkpoint.js +164 -0
  32. package/dist/commands/review-checkpoint.js.map +1 -0
  33. package/dist/commands/review-comment.d.ts +5 -0
  34. package/dist/commands/review-comment.d.ts.map +1 -0
  35. package/dist/commands/review-comment.js +166 -0
  36. package/dist/commands/review-comment.js.map +1 -0
  37. package/dist/commands/review-export.d.ts +5 -0
  38. package/dist/commands/review-export.d.ts.map +1 -0
  39. package/dist/commands/review-export.js +180 -0
  40. package/dist/commands/review-export.js.map +1 -0
  41. package/dist/commands/review-filter.d.ts +5 -0
  42. package/dist/commands/review-filter.d.ts.map +1 -0
  43. package/dist/commands/review-filter.js +166 -0
  44. package/dist/commands/review-filter.js.map +1 -0
  45. package/dist/commands/review-merge.d.ts +5 -0
  46. package/dist/commands/review-merge.d.ts.map +1 -0
  47. package/dist/commands/review-merge.js +146 -0
  48. package/dist/commands/review-merge.js.map +1 -0
  49. package/dist/commands/review-schedule.d.ts +5 -0
  50. package/dist/commands/review-schedule.d.ts.map +1 -0
  51. package/dist/commands/review-schedule.js +170 -0
  52. package/dist/commands/review-schedule.js.map +1 -0
  53. package/dist/commands/review-scope.d.ts +5 -0
  54. package/dist/commands/review-scope.d.ts.map +1 -0
  55. package/dist/commands/review-scope.js +198 -0
  56. package/dist/commands/review-scope.js.map +1 -0
  57. package/dist/commands/review-webhook.d.ts +5 -0
  58. package/dist/commands/review-webhook.d.ts.map +1 -0
  59. package/dist/commands/review-webhook.js +141 -0
  60. package/dist/commands/review-webhook.js.map +1 -0
  61. package/dist/commands/rule-catalog.d.ts +5 -0
  62. package/dist/commands/rule-catalog.d.ts.map +1 -0
  63. package/dist/commands/rule-catalog.js +129 -0
  64. package/dist/commands/rule-catalog.js.map +1 -0
  65. package/dist/commands/setup-wizard.d.ts +5 -0
  66. package/dist/commands/setup-wizard.d.ts.map +1 -0
  67. package/dist/commands/setup-wizard.js +175 -0
  68. package/dist/commands/setup-wizard.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Review-merge — Merge multiple review results into a consolidated report.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, readdirSync } from "fs";
5
+ import { join } from "path";
6
+ // ─── Deduplication ──────────────────────────────────────────────────────────
7
+ function fingerprintFinding(f) {
8
+ const parts = [f.ruleId || "", f.title || "", String(f.severity || "")];
9
+ if (f.lineNumbers && f.lineNumbers.length > 0) {
10
+ parts.push(f.lineNumbers.join(","));
11
+ }
12
+ return parts.join("|").toLowerCase();
13
+ }
14
+ function deduplicateFindings(allFindings) {
15
+ const seen = new Set();
16
+ const unique = [];
17
+ for (const f of allFindings) {
18
+ const fp = fingerprintFinding(f);
19
+ if (!seen.has(fp)) {
20
+ seen.add(fp);
21
+ unique.push(f);
22
+ }
23
+ }
24
+ return unique;
25
+ }
26
+ // ─── CLI ────────────────────────────────────────────────────────────────────
27
+ export function runReviewMerge(argv) {
28
+ if (argv.includes("--help") || argv.includes("-h")) {
29
+ console.log(`
30
+ judges review-merge — Merge multiple review results
31
+
32
+ Usage:
33
+ judges review-merge --files a.json b.json c.json Merge verdict files
34
+ judges review-merge --dir ./results Merge all .json in dir
35
+ judges review-merge --output merged.json Write merged output
36
+ judges review-merge --format json JSON output
37
+
38
+ Options:
39
+ --files <paths...> Verdict JSON files to merge
40
+ --dir <directory> Directory containing verdict files
41
+ --output <file> Write merged results to file
42
+ --format json JSON output
43
+ --help, -h Show this help
44
+
45
+ Merges multiple review results into a single consolidated
46
+ report, deduplicating findings and averaging scores.
47
+ `);
48
+ return;
49
+ }
50
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
51
+ const outputFile = argv.find((_a, i) => argv[i - 1] === "--output");
52
+ // Collect input files
53
+ const files = [];
54
+ const filesIdx = argv.indexOf("--files");
55
+ if (filesIdx !== -1) {
56
+ for (let i = filesIdx + 1; i < argv.length; i++) {
57
+ if (argv[i].startsWith("--"))
58
+ break;
59
+ files.push(argv[i]);
60
+ }
61
+ }
62
+ const dirArg = argv.find((_a, i) => argv[i - 1] === "--dir");
63
+ if (dirArg && existsSync(dirArg)) {
64
+ try {
65
+ const entries = readdirSync(dirArg);
66
+ for (const entry of entries) {
67
+ if (typeof entry === "string" && entry.endsWith(".json")) {
68
+ files.push(join(dirArg, entry));
69
+ }
70
+ }
71
+ }
72
+ catch {
73
+ // skip unreadable directory
74
+ }
75
+ }
76
+ if (files.length === 0) {
77
+ console.error("Error: No input files. Use --files or --dir.");
78
+ process.exitCode = 1;
79
+ return;
80
+ }
81
+ // Load verdicts
82
+ const allFindings = [];
83
+ const scores = [];
84
+ const loadedFiles = [];
85
+ for (const file of files) {
86
+ if (!existsSync(file)) {
87
+ console.error(`Warning: File not found: ${file}`);
88
+ continue;
89
+ }
90
+ try {
91
+ const raw = readFileSync(file, "utf-8");
92
+ const data = JSON.parse(raw);
93
+ if (data.findings)
94
+ allFindings.push(...data.findings);
95
+ if (typeof data.overallScore === "number")
96
+ scores.push(data.overallScore);
97
+ loadedFiles.push(file);
98
+ }
99
+ catch {
100
+ console.error(`Warning: Could not parse: ${file}`);
101
+ }
102
+ }
103
+ if (loadedFiles.length === 0) {
104
+ console.error("Error: No valid verdict files found.");
105
+ process.exitCode = 1;
106
+ return;
107
+ }
108
+ const unique = deduplicateFindings(allFindings);
109
+ const avgScore = scores.length > 0 ? Math.round(scores.reduce((a, b) => a + b, 0) / scores.length) : 0;
110
+ const report = {
111
+ sources: loadedFiles,
112
+ mergedAt: new Date().toISOString(),
113
+ totalFindings: allFindings.length,
114
+ uniqueFindings: unique.length,
115
+ deduplicatedCount: allFindings.length - unique.length,
116
+ overallScore: avgScore,
117
+ findings: unique,
118
+ summary: `Merged ${loadedFiles.length} verdict files. ${unique.length} unique findings from ${allFindings.length} total (${allFindings.length - unique.length} duplicates removed). Average score: ${avgScore}/100.`,
119
+ };
120
+ if (outputFile) {
121
+ writeFileSync(outputFile, JSON.stringify(report, null, 2), "utf-8");
122
+ console.log(`Merged results written to ${outputFile}`);
123
+ }
124
+ if (format === "json") {
125
+ console.log(JSON.stringify(report, null, 2));
126
+ return;
127
+ }
128
+ console.log(`\n Merged Review Results\n ─────────────────────────────`);
129
+ console.log(` Sources: ${loadedFiles.length} files`);
130
+ console.log(` Total findings: ${allFindings.length}`);
131
+ console.log(` Unique findings: ${unique.length}`);
132
+ console.log(` Duplicates removed: ${allFindings.length - unique.length}`);
133
+ console.log(` Average score: ${avgScore}/100`);
134
+ console.log();
135
+ const bySeverity = new Map();
136
+ for (const f of unique) {
137
+ const sev = f.severity || "unknown";
138
+ bySeverity.set(sev, (bySeverity.get(sev) || 0) + 1);
139
+ }
140
+ console.log(" By severity:");
141
+ for (const [sev, count] of bySeverity) {
142
+ console.log(` ${sev}: ${count}`);
143
+ }
144
+ console.log();
145
+ }
146
+ //# sourceMappingURL=review-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-merge.js","sourceRoot":"","sources":["../../src/commands/review-merge.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":"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"}
@@ -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
+ * Review-webhook — Configure webhook notifications for review results.
3
+ */
4
+ export declare function runReviewWebhook(argv: string[]): void;
5
+ //# sourceMappingURL=review-webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-webhook.d.ts","sourceRoot":"","sources":["../../src/commands/review-webhook.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0CH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyIrD"}