@kevinrabun/judges 3.71.0 → 3.73.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 +24 -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/finding-deduplicate.d.ts +5 -0
  6. package/dist/commands/finding-deduplicate.d.ts.map +1 -0
  7. package/dist/commands/finding-deduplicate.js +142 -0
  8. package/dist/commands/finding-deduplicate.js.map +1 -0
  9. package/dist/commands/finding-false-positive.d.ts +5 -0
  10. package/dist/commands/finding-false-positive.d.ts.map +1 -0
  11. package/dist/commands/finding-false-positive.js +135 -0
  12. package/dist/commands/finding-false-positive.js.map +1 -0
  13. package/dist/commands/finding-link.d.ts +5 -0
  14. package/dist/commands/finding-link.d.ts.map +1 -0
  15. package/dist/commands/finding-link.js +129 -0
  16. package/dist/commands/finding-link.js.map +1 -0
  17. package/dist/commands/finding-severity-override.d.ts +5 -0
  18. package/dist/commands/finding-severity-override.d.ts.map +1 -0
  19. package/dist/commands/finding-severity-override.js +132 -0
  20. package/dist/commands/finding-severity-override.js.map +1 -0
  21. package/dist/commands/review-approval.d.ts +5 -0
  22. package/dist/commands/review-approval.d.ts.map +1 -0
  23. package/dist/commands/review-approval.js +134 -0
  24. package/dist/commands/review-approval.js.map +1 -0
  25. package/dist/commands/review-bulk-action.d.ts +5 -0
  26. package/dist/commands/review-bulk-action.d.ts.map +1 -0
  27. package/dist/commands/review-bulk-action.js +110 -0
  28. package/dist/commands/review-bulk-action.js.map +1 -0
  29. package/dist/commands/review-compare-version.d.ts +5 -0
  30. package/dist/commands/review-compare-version.d.ts.map +1 -0
  31. package/dist/commands/review-compare-version.js +109 -0
  32. package/dist/commands/review-compare-version.js.map +1 -0
  33. package/dist/commands/review-config-export.d.ts +5 -0
  34. package/dist/commands/review-config-export.d.ts.map +1 -0
  35. package/dist/commands/review-config-export.js +125 -0
  36. package/dist/commands/review-config-export.js.map +1 -0
  37. package/dist/commands/review-depth.d.ts +5 -0
  38. package/dist/commands/review-depth.d.ts.map +1 -0
  39. package/dist/commands/review-depth.js +143 -0
  40. package/dist/commands/review-depth.js.map +1 -0
  41. package/dist/commands/review-feedback.d.ts +5 -0
  42. package/dist/commands/review-feedback.d.ts.map +1 -0
  43. package/dist/commands/review-feedback.js +146 -0
  44. package/dist/commands/review-feedback.js.map +1 -0
  45. package/dist/commands/review-ignore-path.d.ts +5 -0
  46. package/dist/commands/review-ignore-path.d.ts.map +1 -0
  47. package/dist/commands/review-ignore-path.js +148 -0
  48. package/dist/commands/review-ignore-path.js.map +1 -0
  49. package/dist/commands/review-pr-comment.d.ts +5 -0
  50. package/dist/commands/review-pr-comment.d.ts.map +1 -0
  51. package/dist/commands/review-pr-comment.js +107 -0
  52. package/dist/commands/review-pr-comment.js.map +1 -0
  53. package/dist/commands/review-retry.d.ts +5 -0
  54. package/dist/commands/review-retry.d.ts.map +1 -0
  55. package/dist/commands/review-retry.js +92 -0
  56. package/dist/commands/review-retry.js.map +1 -0
  57. package/dist/commands/review-score-history.d.ts +5 -0
  58. package/dist/commands/review-score-history.d.ts.map +1 -0
  59. package/dist/commands/review-score-history.js +138 -0
  60. package/dist/commands/review-score-history.js.map +1 -0
  61. package/dist/commands/review-session.d.ts +5 -0
  62. package/dist/commands/review-session.d.ts.map +1 -0
  63. package/dist/commands/review-session.js +151 -0
  64. package/dist/commands/review-session.js.map +1 -0
  65. package/dist/commands/review-summary-email.d.ts +5 -0
  66. package/dist/commands/review-summary-email.d.ts.map +1 -0
  67. package/dist/commands/review-summary-email.js +103 -0
  68. package/dist/commands/review-summary-email.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Review-depth — Control review depth (shallow, normal, deep).
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { dirname } from "path";
6
+ // ─── Profiles ───────────────────────────────────────────────────────────────
7
+ const PROFILES = {
8
+ shallow: {
9
+ level: "shallow",
10
+ maxJudges: 5,
11
+ enableAST: false,
12
+ enableCrossFile: false,
13
+ description: "Quick scan — top security rules only",
14
+ },
15
+ normal: {
16
+ level: "normal",
17
+ maxJudges: 20,
18
+ enableAST: true,
19
+ enableCrossFile: false,
20
+ description: "Standard review — core judges with AST",
21
+ },
22
+ deep: {
23
+ level: "deep",
24
+ maxJudges: 45,
25
+ enableAST: true,
26
+ enableCrossFile: true,
27
+ description: "Full review — all judges, cross-file analysis",
28
+ },
29
+ };
30
+ // ─── Storage ────────────────────────────────────────────────────────────────
31
+ const DEPTH_FILE = ".judges/review-depth.json";
32
+ function loadConfig() {
33
+ if (!existsSync(DEPTH_FILE))
34
+ return { version: "1.0.0", currentLevel: "normal", perPath: {} };
35
+ try {
36
+ return JSON.parse(readFileSync(DEPTH_FILE, "utf-8"));
37
+ }
38
+ catch {
39
+ return { version: "1.0.0", currentLevel: "normal", perPath: {} };
40
+ }
41
+ }
42
+ function saveConfig(config) {
43
+ mkdirSync(dirname(DEPTH_FILE), { recursive: true });
44
+ writeFileSync(DEPTH_FILE, JSON.stringify(config, null, 2), "utf-8");
45
+ }
46
+ // ─── CLI ────────────────────────────────────────────────────────────────────
47
+ export function runReviewDepth(argv) {
48
+ if (argv.includes("--help") || argv.includes("-h")) {
49
+ console.log(`
50
+ judges review-depth — Control review depth
51
+
52
+ Usage:
53
+ judges review-depth Show current depth
54
+ judges review-depth set --level deep
55
+ judges review-depth set-path --path src/auth --level deep
56
+ judges review-depth profiles
57
+ judges review-depth reset
58
+
59
+ Subcommands:
60
+ (default) Show current depth setting
61
+ set Set global review depth
62
+ set-path Set depth for a specific path
63
+ profiles Show available depth profiles
64
+ reset Reset to default (normal)
65
+
66
+ Depth Levels:
67
+ shallow Quick scan — top security rules only
68
+ normal Standard review — core judges with AST
69
+ deep Full review — all judges, cross-file analysis
70
+
71
+ Options:
72
+ --level <level> Depth level: shallow, normal, deep
73
+ --path <path> File or directory path
74
+ --format json JSON output
75
+ --help, -h Show this help
76
+
77
+ Config stored in .judges/review-depth.json.
78
+ `);
79
+ return;
80
+ }
81
+ const subcommand = argv.find((a) => ["set", "set-path", "profiles", "reset"].includes(a));
82
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
83
+ const config = loadConfig();
84
+ if (subcommand === "set") {
85
+ const level = argv.find((_a, i) => argv[i - 1] === "--level");
86
+ if (!level || !PROFILES[level]) {
87
+ console.log("Invalid level. Use: shallow, normal, deep");
88
+ return;
89
+ }
90
+ config.currentLevel = level;
91
+ saveConfig(config);
92
+ console.log(`Review depth set to: ${level} — ${PROFILES[level].description}`);
93
+ return;
94
+ }
95
+ if (subcommand === "set-path") {
96
+ const path = argv.find((_a, i) => argv[i - 1] === "--path") || "";
97
+ const level = argv.find((_a, i) => argv[i - 1] === "--level");
98
+ if (!path || !level || !PROFILES[level]) {
99
+ console.log("Specify --path and --level (shallow, normal, deep).");
100
+ return;
101
+ }
102
+ config.perPath[path] = level;
103
+ saveConfig(config);
104
+ console.log(`Set ${path} → ${level}`);
105
+ return;
106
+ }
107
+ if (subcommand === "profiles") {
108
+ if (format === "json") {
109
+ console.log(JSON.stringify(PROFILES, null, 2));
110
+ return;
111
+ }
112
+ console.log("\nDepth Profiles:");
113
+ console.log("═".repeat(50));
114
+ for (const [, p] of Object.entries(PROFILES)) {
115
+ console.log(` ${p.level.padEnd(10)} ${p.description}`);
116
+ console.log(` judges=${p.maxJudges} AST=${p.enableAST} crossFile=${p.enableCrossFile}`);
117
+ }
118
+ console.log("═".repeat(50));
119
+ return;
120
+ }
121
+ if (subcommand === "reset") {
122
+ saveConfig({ version: "1.0.0", currentLevel: "normal", perPath: {} });
123
+ console.log("Review depth reset to normal.");
124
+ return;
125
+ }
126
+ // Default: show current
127
+ const profile = PROFILES[config.currentLevel];
128
+ if (format === "json") {
129
+ console.log(JSON.stringify({ current: config.currentLevel, profile, perPath: config.perPath }, null, 2));
130
+ return;
131
+ }
132
+ console.log(`\nCurrent Review Depth: ${config.currentLevel}`);
133
+ console.log(` ${profile.description}`);
134
+ console.log(` Max judges: ${profile.maxJudges} AST: ${profile.enableAST} Cross-file: ${profile.enableCrossFile}`);
135
+ const pathEntries = Object.entries(config.perPath);
136
+ if (pathEntries.length > 0) {
137
+ console.log("\nPath Overrides:");
138
+ for (const [p, l] of pathEntries) {
139
+ console.log(` ${p} → ${l}`);
140
+ }
141
+ }
142
+ }
143
+ //# sourceMappingURL=review-depth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-depth.js","sourceRoot":"","sources":["../../src/commands/review-depth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-feedback — Collect user feedback on review quality.
3
+ */
4
+ export declare function runReviewFeedback(argv: string[]): void;
5
+ //# sourceMappingURL=review-feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-feedback.d.ts","sourceRoot":"","sources":["../../src/commands/review-feedback.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuEH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoHtD"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Review-feedback — Collect user feedback on review quality.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const FEEDBACK_FILE = join(".judges", "feedback.json");
8
+ function loadStore() {
9
+ if (!existsSync(FEEDBACK_FILE))
10
+ return { version: "1.0.0", entries: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(FEEDBACK_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", entries: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(FEEDBACK_FILE), { recursive: true });
20
+ writeFileSync(FEEDBACK_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ function generateId() {
23
+ return `fb-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
24
+ }
25
+ // ─── Summary ────────────────────────────────────────────────────────────────
26
+ function summarize(entries) {
27
+ if (entries.length === 0) {
28
+ return { totalEntries: 0, avgRating: 0, helpfulPct: 0, recentAvgRating: 0 };
29
+ }
30
+ const ratings = entries.map((e) => e.rating);
31
+ const avgRating = ratings.reduce((a, b) => a + b, 0) / ratings.length;
32
+ const helpfulCount = entries.filter((e) => e.helpful).length;
33
+ const helpfulPct = (helpfulCount / entries.length) * 100;
34
+ const recentCount = Math.min(10, entries.length);
35
+ const recentRatings = entries.slice(-recentCount).map((e) => e.rating);
36
+ const recentAvgRating = recentRatings.reduce((a, b) => a + b, 0) / recentRatings.length;
37
+ return { totalEntries: entries.length, avgRating, helpfulPct, recentAvgRating };
38
+ }
39
+ // ─── CLI ────────────────────────────────────────────────────────────────────
40
+ export function runReviewFeedback(argv) {
41
+ if (argv.includes("--help") || argv.includes("-h")) {
42
+ console.log(`
43
+ judges review-feedback — Collect user feedback on review quality
44
+
45
+ Usage:
46
+ judges review-feedback Show feedback summary
47
+ judges review-feedback add --rating 4 --comment "useful"
48
+ judges review-feedback list
49
+ judges review-feedback remove --id <id>
50
+ judges review-feedback clear
51
+
52
+ Subcommands:
53
+ (default) Show feedback summary
54
+ add Add feedback entry
55
+ list List all feedback
56
+ remove Remove feedback by ID
57
+ clear Clear all feedback
58
+
59
+ Options:
60
+ --rating <1-5> Rating (1=poor, 5=excellent)
61
+ --comment <text> Feedback comment
62
+ --finding <id> Related finding ID
63
+ --helpful Mark finding as helpful (flag)
64
+ --format json JSON output
65
+ --help, -h Show this help
66
+
67
+ Feedback stored locally in .judges/feedback.json.
68
+ `);
69
+ return;
70
+ }
71
+ const subcommand = argv.find((a) => ["add", "list", "remove", "clear"].includes(a));
72
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
73
+ const store = loadStore();
74
+ if (subcommand === "add") {
75
+ const rating = parseInt(argv.find((_a, i) => argv[i - 1] === "--rating") || "3", 10);
76
+ const comment = argv.find((_a, i) => argv[i - 1] === "--comment") || "";
77
+ const findingId = argv.find((_a, i) => argv[i - 1] === "--finding") || "";
78
+ const helpful = argv.includes("--helpful");
79
+ const clampedRating = Math.max(1, Math.min(5, rating));
80
+ const entry = {
81
+ id: generateId(),
82
+ date: new Date().toISOString(),
83
+ rating: clampedRating,
84
+ comment,
85
+ findingId,
86
+ helpful,
87
+ };
88
+ store.entries.push(entry);
89
+ saveStore(store);
90
+ console.log(`Feedback recorded (${entry.id}): rating=${clampedRating}/5`);
91
+ return;
92
+ }
93
+ if (subcommand === "remove") {
94
+ const id = argv.find((_a, i) => argv[i - 1] === "--id") || "";
95
+ const before = store.entries.length;
96
+ store.entries = store.entries.filter((e) => e.id !== id);
97
+ saveStore(store);
98
+ console.log(before > store.entries.length ? `Removed feedback ${id}.` : `Feedback ${id} not found.`);
99
+ return;
100
+ }
101
+ if (subcommand === "clear") {
102
+ saveStore({ version: "1.0.0", entries: [] });
103
+ console.log("Feedback cleared.");
104
+ return;
105
+ }
106
+ if (subcommand === "list") {
107
+ if (store.entries.length === 0) {
108
+ console.log("No feedback entries.");
109
+ return;
110
+ }
111
+ if (format === "json") {
112
+ console.log(JSON.stringify(store.entries, null, 2));
113
+ return;
114
+ }
115
+ console.log("\nFeedback Entries:");
116
+ console.log("─".repeat(60));
117
+ for (const e of store.entries) {
118
+ const stars = "★".repeat(e.rating) + "☆".repeat(5 - e.rating);
119
+ const helpfulTag = e.helpful ? " [helpful]" : "";
120
+ console.log(` ${e.id} ${e.date.slice(0, 10)} ${stars}${helpfulTag}`);
121
+ if (e.comment)
122
+ console.log(` "${e.comment}"`);
123
+ }
124
+ console.log("─".repeat(60));
125
+ return;
126
+ }
127
+ // Default: show summary
128
+ if (store.entries.length === 0) {
129
+ console.log("No feedback collected. Use 'judges review-feedback add' to start.");
130
+ return;
131
+ }
132
+ const summary = summarize(store.entries);
133
+ if (format === "json") {
134
+ console.log(JSON.stringify(summary, null, 2));
135
+ return;
136
+ }
137
+ const stars = "★".repeat(Math.round(summary.avgRating)) + "☆".repeat(5 - Math.round(summary.avgRating));
138
+ console.log("\nFeedback Summary:");
139
+ console.log("═".repeat(50));
140
+ console.log(` Total feedback: ${summary.totalEntries}`);
141
+ console.log(` Avg rating: ${summary.avgRating.toFixed(1)}/5 ${stars}`);
142
+ console.log(` Recent avg: ${summary.recentAvgRating.toFixed(1)}/5`);
143
+ console.log(` Helpful: ${summary.helpfulPct.toFixed(0)}%`);
144
+ console.log("═".repeat(50));
145
+ }
146
+ //# sourceMappingURL=review-feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-feedback.js","sourceRoot":"","sources":["../../src/commands/review-feedback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-ignore-path — Manage path ignore lists for reviews.
3
+ */
4
+ export declare function runReviewIgnorePath(argv: string[]): void;
5
+ //# sourceMappingURL=review-ignore-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-ignore-path.d.ts","sourceRoot":"","sources":["../../src/commands/review-ignore-path.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoDH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsHxD"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Review-ignore-path — Manage path ignore lists for reviews.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Storage ────────────────────────────────────────────────────────────────
7
+ const IGNORE_FILE = join(".judges", "ignore-paths.json");
8
+ function loadStore() {
9
+ if (!existsSync(IGNORE_FILE))
10
+ return { version: "1.0.0", paths: [] };
11
+ try {
12
+ return JSON.parse(readFileSync(IGNORE_FILE, "utf-8"));
13
+ }
14
+ catch {
15
+ return { version: "1.0.0", paths: [] };
16
+ }
17
+ }
18
+ function saveStore(store) {
19
+ mkdirSync(dirname(IGNORE_FILE), { recursive: true });
20
+ writeFileSync(IGNORE_FILE, JSON.stringify(store, null, 2), "utf-8");
21
+ }
22
+ function matchesPattern(filePath, pattern) {
23
+ // Simple glob matching
24
+ if (pattern.endsWith("/**")) {
25
+ return filePath.startsWith(pattern.slice(0, -3));
26
+ }
27
+ if (pattern.startsWith("**/")) {
28
+ return filePath.includes(pattern.slice(3));
29
+ }
30
+ if (pattern.startsWith("*.")) {
31
+ return filePath.endsWith(pattern.slice(1));
32
+ }
33
+ return filePath === pattern || filePath.includes(pattern);
34
+ }
35
+ // ─── CLI ────────────────────────────────────────────────────────────────────
36
+ export function runReviewIgnorePath(argv) {
37
+ if (argv.includes("--help") || argv.includes("-h")) {
38
+ console.log(`
39
+ judges review-ignore-path — Manage path ignore lists
40
+
41
+ Usage:
42
+ judges review-ignore-path add --pattern "test/**" --reason "Test files"
43
+ judges review-ignore-path add --pattern "*.min.js" --reason "Minified files"
44
+ judges review-ignore-path list
45
+ judges review-ignore-path check --file src/api.ts
46
+ judges review-ignore-path remove --pattern "test/**"
47
+ judges review-ignore-path clear
48
+
49
+ Subcommands:
50
+ add Add an ignore pattern
51
+ list List all ignore patterns
52
+ check Check if a file matches any pattern
53
+ remove Remove an ignore pattern
54
+ clear Clear all ignore patterns
55
+
56
+ Options:
57
+ --pattern <glob> Glob pattern to ignore
58
+ --reason <text> Reason for ignoring
59
+ --file <path> File to check
60
+ --format json JSON output
61
+ --help, -h Show this help
62
+
63
+ Ignore patterns stored in .judges/ignore-paths.json.
64
+ Supported patterns: dir/**, **/file, *.ext, exact/path.
65
+ `);
66
+ return;
67
+ }
68
+ const subcommand = argv.find((a) => ["add", "list", "check", "remove", "clear"].includes(a)) || "list";
69
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
70
+ const store = loadStore();
71
+ if (subcommand === "add") {
72
+ const pattern = argv.find((_a, i) => argv[i - 1] === "--pattern") || "";
73
+ const reason = argv.find((_a, i) => argv[i - 1] === "--reason") || "";
74
+ if (!pattern) {
75
+ console.error("Error: --pattern is required.");
76
+ process.exitCode = 1;
77
+ return;
78
+ }
79
+ if (store.paths.some((p) => p.pattern === pattern)) {
80
+ console.error(`Error: Pattern "${pattern}" already exists.`);
81
+ process.exitCode = 1;
82
+ return;
83
+ }
84
+ store.paths.push({ pattern, reason, addedAt: new Date().toISOString() });
85
+ saveStore(store);
86
+ console.log(`Added ignore pattern: ${pattern}`);
87
+ return;
88
+ }
89
+ if (subcommand === "remove") {
90
+ const pattern = argv.find((_a, i) => argv[i - 1] === "--pattern") || "";
91
+ if (!pattern) {
92
+ console.error("Error: --pattern is required.");
93
+ process.exitCode = 1;
94
+ return;
95
+ }
96
+ const before = store.paths.length;
97
+ store.paths = store.paths.filter((p) => p.pattern !== pattern);
98
+ if (store.paths.length === before) {
99
+ console.error(`Error: Pattern "${pattern}" not found.`);
100
+ process.exitCode = 1;
101
+ return;
102
+ }
103
+ saveStore(store);
104
+ console.log(`Removed ignore pattern: ${pattern}`);
105
+ return;
106
+ }
107
+ if (subcommand === "check") {
108
+ const filePath = argv.find((_a, i) => argv[i - 1] === "--file") || "";
109
+ if (!filePath) {
110
+ console.error("Error: --file is required.");
111
+ process.exitCode = 1;
112
+ return;
113
+ }
114
+ const matches = store.paths.filter((p) => matchesPattern(filePath, p.pattern));
115
+ if (matches.length > 0) {
116
+ console.log(`✓ "${filePath}" is ignored by ${matches.length} pattern(s):`);
117
+ for (const m of matches) {
118
+ console.log(` ${m.pattern}${m.reason ? ` — ${m.reason}` : ""}`);
119
+ }
120
+ }
121
+ else {
122
+ console.log(`✗ "${filePath}" is NOT ignored.`);
123
+ }
124
+ return;
125
+ }
126
+ if (subcommand === "clear") {
127
+ saveStore({ version: "1.0.0", paths: [] });
128
+ console.log("Ignore patterns cleared.");
129
+ return;
130
+ }
131
+ // list
132
+ if (store.paths.length === 0) {
133
+ console.log("No ignore patterns. Use 'judges review-ignore-path add' to start.");
134
+ return;
135
+ }
136
+ if (format === "json") {
137
+ console.log(JSON.stringify(store.paths, null, 2));
138
+ return;
139
+ }
140
+ console.log("\nIgnore Patterns:");
141
+ console.log("─".repeat(60));
142
+ for (const p of store.paths) {
143
+ console.log(` ${p.pattern.padEnd(30)} ${p.addedAt.slice(0, 10)} ${p.reason || ""}`);
144
+ }
145
+ console.log("─".repeat(60));
146
+ console.log(` Total: ${store.paths.length} pattern(s)`);
147
+ }
148
+ //# sourceMappingURL=review-ignore-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-ignore-path.js","sourceRoot":"","sources":["../../src/commands/review-ignore-path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-pr-comment — Generate PR comment summaries from review results.
3
+ */
4
+ export declare function runReviewPrComment(argv: string[]): void;
5
+ //# sourceMappingURL=review-pr-comment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-pr-comment.d.ts","sourceRoot":"","sources":["../../src/commands/review-pr-comment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuEH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAwDvD"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Review-pr-comment — Generate PR comment summaries from review results.
3
+ */
4
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
5
+ import { join, dirname } from "path";
6
+ // ─── Generator ──────────────────────────────────────────────────────────────
7
+ function generatePRComment(verdict, title) {
8
+ const findings = verdict.findings || [];
9
+ const criticalCount = verdict.criticalCount || findings.filter((f) => f.severity === "critical").length;
10
+ const highCount = verdict.highCount || findings.filter((f) => f.severity === "high").length;
11
+ const mediumCount = findings.filter((f) => f.severity === "medium").length;
12
+ const lowCount = findings.filter((f) => f.severity === "low").length;
13
+ const scoreEmoji = verdict.overallScore >= 8 ? "🟢" : verdict.overallScore >= 5 ? "🟡" : "🔴";
14
+ const verdictText = verdict.overallVerdict || (verdict.overallScore >= 7 ? "pass" : "fail");
15
+ let body = `## ${scoreEmoji} Judges Panel Review\n\n`;
16
+ body += `**Verdict:** ${verdictText.toUpperCase()} | **Score:** ${verdict.overallScore}/10\n\n`;
17
+ if (findings.length === 0) {
18
+ body += "✨ No findings — code looks good!\n";
19
+ }
20
+ else {
21
+ body += `### Findings Summary\n\n`;
22
+ body += `| Severity | Count |\n|----------|-------|\n`;
23
+ if (criticalCount > 0)
24
+ body += `| 🔴 Critical | ${criticalCount} |\n`;
25
+ if (highCount > 0)
26
+ body += `| 🟠 High | ${highCount} |\n`;
27
+ if (mediumCount > 0)
28
+ body += `| 🟡 Medium | ${mediumCount} |\n`;
29
+ if (lowCount > 0)
30
+ body += `| 🟢 Low | ${lowCount} |\n`;
31
+ body += `\n**Total:** ${findings.length} finding(s)\n\n`;
32
+ // Top findings
33
+ const top = findings.slice(0, 5);
34
+ if (top.length > 0) {
35
+ body += `### Top Findings\n\n`;
36
+ for (const f of top) {
37
+ const sev = (f.severity || "medium").toUpperCase();
38
+ body += `- **[${sev}]** ${f.ruleId}: ${f.title}\n`;
39
+ if (f.recommendation)
40
+ body += ` - Fix: ${f.recommendation}\n`;
41
+ }
42
+ }
43
+ }
44
+ body += `\n---\n*Generated by [Judges Panel](https://github.com/KevinRabun/judges)*\n`;
45
+ return {
46
+ title,
47
+ body,
48
+ verdict: verdictText,
49
+ score: verdict.overallScore,
50
+ findingCount: findings.length,
51
+ criticalCount,
52
+ highCount,
53
+ };
54
+ }
55
+ // ─── CLI ────────────────────────────────────────────────────────────────────
56
+ export function runReviewPrComment(argv) {
57
+ if (argv.includes("--help") || argv.includes("-h")) {
58
+ console.log(`
59
+ judges review-pr-comment — Generate PR comment summaries
60
+
61
+ Usage:
62
+ judges review-pr-comment --file report.json
63
+ judges review-pr-comment --file report.json --out pr-comment.md
64
+ judges review-pr-comment --file report.json --format json
65
+
66
+ Options:
67
+ --file <path> Path to a tribunal verdict JSON file
68
+ --out <path> Output path for the comment (default: stdout)
69
+ --title <text> Comment title
70
+ --format json JSON output
71
+ --help, -h Show this help
72
+
73
+ Generates a formatted markdown comment suitable for GitHub/GitLab PRs.
74
+ Output saved to .judges/pr-comment.md.
75
+ `);
76
+ return;
77
+ }
78
+ const filePath = argv.find((_a, i) => argv[i - 1] === "--file");
79
+ const outPath = argv.find((_a, i) => argv[i - 1] === "--out");
80
+ const title = argv.find((_a, i) => argv[i - 1] === "--title") || "Code Review";
81
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
82
+ if (!filePath || !existsSync(filePath)) {
83
+ console.error("Error: --file is required and must exist.");
84
+ process.exitCode = 1;
85
+ return;
86
+ }
87
+ let verdict;
88
+ try {
89
+ verdict = JSON.parse(readFileSync(filePath, "utf-8"));
90
+ }
91
+ catch {
92
+ console.error("Error: Could not parse verdict file.");
93
+ process.exitCode = 1;
94
+ return;
95
+ }
96
+ const comment = generatePRComment(verdict, title);
97
+ if (format === "json") {
98
+ console.log(JSON.stringify(comment, null, 2));
99
+ return;
100
+ }
101
+ const defaultOut = outPath || join(".judges", "pr-comment.md");
102
+ mkdirSync(dirname(defaultOut), { recursive: true });
103
+ writeFileSync(defaultOut, comment.body, "utf-8");
104
+ console.log(comment.body);
105
+ console.log(`\nComment saved to ${defaultOut}`);
106
+ }
107
+ //# sourceMappingURL=review-pr-comment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-pr-comment.js","sourceRoot":"","sources":["../../src/commands/review-pr-comment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-retry — Retry failed or incomplete reviews.
3
+ */
4
+ export declare function runReviewRetry(argv: string[]): void;
5
+ //# sourceMappingURL=review-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-retry.d.ts","sourceRoot":"","sources":["../../src/commands/review-retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyFnD"}