@kevinrabun/judges 3.59.0 → 3.61.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 +19 -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/adoption-track.d.ts +5 -0
  6. package/dist/commands/adoption-track.d.ts.map +1 -0
  7. package/dist/commands/adoption-track.js +247 -0
  8. package/dist/commands/adoption-track.js.map +1 -0
  9. package/dist/commands/ai-provenance.d.ts +5 -0
  10. package/dist/commands/ai-provenance.d.ts.map +1 -0
  11. package/dist/commands/ai-provenance.js +248 -0
  12. package/dist/commands/ai-provenance.js.map +1 -0
  13. package/dist/commands/blame-review.d.ts +5 -0
  14. package/dist/commands/blame-review.d.ts.map +1 -0
  15. package/dist/commands/blame-review.js +270 -0
  16. package/dist/commands/blame-review.js.map +1 -0
  17. package/dist/commands/context-blind.d.ts +5 -0
  18. package/dist/commands/context-blind.d.ts.map +1 -0
  19. package/dist/commands/context-blind.js +273 -0
  20. package/dist/commands/context-blind.js.map +1 -0
  21. package/dist/commands/evidence-chain.d.ts +5 -0
  22. package/dist/commands/evidence-chain.d.ts.map +1 -0
  23. package/dist/commands/evidence-chain.js +310 -0
  24. package/dist/commands/evidence-chain.js.map +1 -0
  25. package/dist/commands/finding-budget.d.ts +5 -0
  26. package/dist/commands/finding-budget.d.ts.map +1 -0
  27. package/dist/commands/finding-budget.js +233 -0
  28. package/dist/commands/finding-budget.js.map +1 -0
  29. package/dist/commands/hallucination-detect.d.ts +5 -0
  30. package/dist/commands/hallucination-detect.d.ts.map +1 -0
  31. package/dist/commands/hallucination-detect.js +351 -0
  32. package/dist/commands/hallucination-detect.js.map +1 -0
  33. package/dist/commands/merge-verdict.d.ts +5 -0
  34. package/dist/commands/merge-verdict.d.ts.map +1 -0
  35. package/dist/commands/merge-verdict.js +288 -0
  36. package/dist/commands/merge-verdict.js.map +1 -0
  37. package/dist/commands/over-abstraction.d.ts +5 -0
  38. package/dist/commands/over-abstraction.d.ts.map +1 -0
  39. package/dist/commands/over-abstraction.js +308 -0
  40. package/dist/commands/over-abstraction.js.map +1 -0
  41. package/dist/commands/quick-check.d.ts +5 -0
  42. package/dist/commands/quick-check.d.ts.map +1 -0
  43. package/dist/commands/quick-check.js +174 -0
  44. package/dist/commands/quick-check.js.map +1 -0
  45. package/dist/commands/review-contract.d.ts +5 -0
  46. package/dist/commands/review-contract.d.ts.map +1 -0
  47. package/dist/commands/review-contract.js +200 -0
  48. package/dist/commands/review-contract.js.map +1 -0
  49. package/dist/commands/review-digest.d.ts +5 -0
  50. package/dist/commands/review-digest.d.ts.map +1 -0
  51. package/dist/commands/review-digest.js +266 -0
  52. package/dist/commands/review-digest.js.map +1 -0
  53. package/dist/commands/review-handoff.d.ts +5 -0
  54. package/dist/commands/review-handoff.d.ts.map +1 -0
  55. package/dist/commands/review-handoff.js +209 -0
  56. package/dist/commands/review-handoff.js.map +1 -0
  57. package/dist/commands/review-receipt.d.ts +5 -0
  58. package/dist/commands/review-receipt.d.ts.map +1 -0
  59. package/dist/commands/review-receipt.js +221 -0
  60. package/dist/commands/review-receipt.js.map +1 -0
  61. package/dist/commands/security-theater.d.ts +5 -0
  62. package/dist/commands/security-theater.d.ts.map +1 -0
  63. package/dist/commands/security-theater.js +279 -0
  64. package/dist/commands/security-theater.js.map +1 -0
  65. package/dist/commands/stale-pattern.d.ts +5 -0
  66. package/dist/commands/stale-pattern.d.ts.map +1 -0
  67. package/dist/commands/stale-pattern.js +294 -0
  68. package/dist/commands/stale-pattern.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Review-contract — versionable document defining exactly what Judges reviews.
3
+ */
4
+ import { readFileSync, existsSync, writeFileSync } from "fs";
5
+ import { join } from "path";
6
+ // ─── Default contract template ─────────────────────────────────────────────
7
+ function defaultContract() {
8
+ return {
9
+ version: "1.0.0",
10
+ team: "default",
11
+ created: new Date().toISOString(),
12
+ updated: new Date().toISOString(),
13
+ rules: [
14
+ { judge: "data-security", enabled: true, severity: "critical", escalation: "block" },
15
+ { judge: "cybersecurity", enabled: true, severity: "critical", escalation: "block" },
16
+ { judge: "authentication", enabled: true, severity: "high", escalation: "block" },
17
+ { judge: "database", enabled: true, severity: "high", escalation: "block" },
18
+ { judge: "reliability", enabled: true, severity: "medium", escalation: "review" },
19
+ { judge: "performance", enabled: true, severity: "medium", escalation: "review" },
20
+ { judge: "maintainability", enabled: true, severity: "low", escalation: "inform" },
21
+ { judge: "documentation", enabled: true, severity: "low", escalation: "inform" },
22
+ { judge: "testing", enabled: true, severity: "medium", escalation: "review" },
23
+ { judge: "error-handling", enabled: true, severity: "medium", escalation: "review" },
24
+ ],
25
+ severityThresholds: {
26
+ blockMerge: "critical",
27
+ requireHumanReview: "high",
28
+ informational: "low",
29
+ },
30
+ acceptedRisks: [],
31
+ reviewSLA: {
32
+ maxLatencyMs: 30000,
33
+ maxFindingsPerPR: 25,
34
+ },
35
+ };
36
+ }
37
+ function verifyContract(contract) {
38
+ const issues = [];
39
+ const warnings = [];
40
+ // Check required fields
41
+ if (!contract.version)
42
+ issues.push("Missing contract version");
43
+ if (!contract.rules || contract.rules.length === 0)
44
+ issues.push("No rules defined — contract is empty");
45
+ if (!contract.severityThresholds)
46
+ issues.push("Missing severity thresholds");
47
+ // Check rule validity
48
+ const validSeverities = new Set(["critical", "high", "medium", "low", "info"]);
49
+ const validEscalations = new Set(["block", "review", "inform", "ignore"]);
50
+ for (const rule of contract.rules) {
51
+ if (!rule.judge)
52
+ issues.push("Rule with missing judge name");
53
+ if (rule.severity && !validSeverities.has(rule.severity)) {
54
+ warnings.push(`Rule ${rule.judge}: unknown severity '${rule.severity}'`);
55
+ }
56
+ if (rule.escalation && !validEscalations.has(rule.escalation)) {
57
+ warnings.push(`Rule ${rule.judge}: unknown escalation '${rule.escalation}'`);
58
+ }
59
+ }
60
+ // Check for security coverage
61
+ const securityJudges = contract.rules.filter((r) => r.enabled && ["data-security", "cybersecurity", "authentication"].includes(r.judge));
62
+ if (securityJudges.length === 0) {
63
+ warnings.push("No security judges enabled — consider enabling data-security, cybersecurity, or authentication");
64
+ }
65
+ // Check SLA
66
+ if (contract.reviewSLA) {
67
+ if (contract.reviewSLA.maxLatencyMs > 120000) {
68
+ warnings.push(`Review SLA latency (${contract.reviewSLA.maxLatencyMs}ms) exceeds 2 minutes`);
69
+ }
70
+ if (contract.reviewSLA.maxFindingsPerPR > 50) {
71
+ warnings.push(`Max findings per PR (${contract.reviewSLA.maxFindingsPerPR}) is high — may cause alert fatigue`);
72
+ }
73
+ }
74
+ // Accepted risks
75
+ if (contract.acceptedRisks.length > 10) {
76
+ warnings.push(`${contract.acceptedRisks.length} accepted risks — review if all are still valid`);
77
+ }
78
+ const enabledCount = contract.rules.filter((r) => r.enabled).length;
79
+ const totalAvailable = 45; // approximate
80
+ const coverage = Math.round((enabledCount / totalAvailable) * 100);
81
+ return {
82
+ valid: issues.length === 0,
83
+ issues,
84
+ warnings,
85
+ coverage,
86
+ };
87
+ }
88
+ // ─── CLI ────────────────────────────────────────────────────────────────────
89
+ export function runReviewContract(argv) {
90
+ if (argv.includes("--help") || argv.includes("-h")) {
91
+ console.log(`
92
+ judges review-contract — Define and verify what Judges reviews
93
+
94
+ Usage:
95
+ judges review-contract init Create default review-contract.json
96
+ judges review-contract verify Verify contract is valid
97
+ judges review-contract show Show current contract
98
+ judges review-contract --format json JSON output
99
+
100
+ Options:
101
+ init Create a new review-contract.json template
102
+ verify Validate the current contract
103
+ show Display the current contract
104
+ --format json JSON output
105
+ --help, -h Show this help
106
+
107
+ A review contract defines: which judges are enabled, severity thresholds,
108
+ escalation policies, review SLA, and accepted risks. The contract is
109
+ diffable and reviewable in PRs.
110
+ `);
111
+ return;
112
+ }
113
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
114
+ const subcommand = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0 && argv[argv.indexOf(a) - 1] !== "--format") || "show";
115
+ const contractPath = join(".", "review-contract.json");
116
+ if (subcommand === "init") {
117
+ if (existsSync(contractPath)) {
118
+ console.error("Error: review-contract.json already exists. Delete it first or edit manually.");
119
+ process.exitCode = 1;
120
+ return;
121
+ }
122
+ const contract = defaultContract();
123
+ writeFileSync(contractPath, JSON.stringify(contract, null, 2), "utf-8");
124
+ console.log("Created review-contract.json with default template.");
125
+ console.log("Edit rules, thresholds, and SLA to match your team's requirements.");
126
+ return;
127
+ }
128
+ // Load existing contract
129
+ if (!existsSync(contractPath)) {
130
+ console.error("Error: No review-contract.json found. Run 'judges review-contract init' to create one.");
131
+ process.exitCode = 1;
132
+ return;
133
+ }
134
+ let contract;
135
+ try {
136
+ contract = JSON.parse(readFileSync(contractPath, "utf-8"));
137
+ }
138
+ catch {
139
+ console.error("Error: review-contract.json is not valid JSON.");
140
+ process.exitCode = 1;
141
+ return;
142
+ }
143
+ if (subcommand === "verify") {
144
+ const result = verifyContract(contract);
145
+ if (format === "json") {
146
+ console.log(JSON.stringify(result, null, 2));
147
+ }
148
+ else {
149
+ const icon = result.valid ? "✅" : "❌";
150
+ console.log(`\n Contract Verification: ${icon} ${result.valid ? "VALID" : "INVALID"}\n ─────────────────────────────`);
151
+ console.log(` Coverage: ${result.coverage}%`);
152
+ if (result.issues.length > 0) {
153
+ console.log(`\n Issues (${result.issues.length}):`);
154
+ for (const issue of result.issues)
155
+ console.log(` ❌ ${issue}`);
156
+ }
157
+ if (result.warnings.length > 0) {
158
+ console.log(`\n Warnings (${result.warnings.length}):`);
159
+ for (const w of result.warnings)
160
+ console.log(` ⚠️ ${w}`);
161
+ }
162
+ if (result.valid && result.warnings.length === 0) {
163
+ console.log(" No issues found.");
164
+ }
165
+ console.log();
166
+ }
167
+ if (!result.valid)
168
+ process.exitCode = 1;
169
+ return;
170
+ }
171
+ // Show
172
+ if (format === "json") {
173
+ console.log(JSON.stringify(contract, null, 2));
174
+ }
175
+ else {
176
+ console.log(`\n Review Contract v${contract.version}\n ─────────────────────────────`);
177
+ console.log(` Team: ${contract.team}`);
178
+ console.log(` Updated: ${contract.updated}\n`);
179
+ console.log(` Rules (${contract.rules.length}):`);
180
+ for (const rule of contract.rules) {
181
+ const icon = rule.enabled ? "✅" : "⬜";
182
+ const escIcon = rule.escalation === "block" ? "🛑" : rule.escalation === "review" ? "🔍" : "ℹ️";
183
+ console.log(` ${icon} ${rule.judge} — ${rule.severity} / ${escIcon} ${rule.escalation}`);
184
+ }
185
+ console.log(`\n Thresholds:`);
186
+ console.log(` Block merge: ${contract.severityThresholds.blockMerge}`);
187
+ console.log(` Human review: ${contract.severityThresholds.requireHumanReview}`);
188
+ console.log(` Informational: ${contract.severityThresholds.informational}`);
189
+ console.log(`\n SLA:`);
190
+ console.log(` Max latency: ${contract.reviewSLA.maxLatencyMs}ms`);
191
+ console.log(` Max findings/PR: ${contract.reviewSLA.maxFindingsPerPR}`);
192
+ if (contract.acceptedRisks.length > 0) {
193
+ console.log(`\n Accepted Risks:`);
194
+ for (const risk of contract.acceptedRisks)
195
+ console.log(` ⚠️ ${risk}`);
196
+ }
197
+ console.log();
198
+ }
199
+ }
200
+ //# sourceMappingURL=review-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-contract.js","sourceRoot":"","sources":["../../src/commands/review-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-digest — generate concise, role-appropriate review summaries.
3
+ */
4
+ export declare function runReviewDigest(argv: string[]): void;
5
+ //# sourceMappingURL=review-digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-digest.d.ts","sourceRoot":"","sources":["../../src/commands/review-digest.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiOH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmFpD"}
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Review-digest — generate concise, role-appropriate review summaries.
3
+ */
4
+ import { readFileSync, readdirSync, statSync, writeFileSync } from "fs";
5
+ import { join, extname, relative } from "path";
6
+ // ─── File Collection ────────────────────────────────────────────────────────
7
+ const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".py", ".java", ".go", ".cs", ".rb", ".rs"]);
8
+ function collectFiles(dir, max = 300) {
9
+ const files = [];
10
+ function walk(d) {
11
+ if (files.length >= max)
12
+ return;
13
+ let entries;
14
+ try {
15
+ entries = readdirSync(d);
16
+ }
17
+ catch {
18
+ return;
19
+ }
20
+ for (const e of entries) {
21
+ if (files.length >= max)
22
+ return;
23
+ if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
24
+ continue;
25
+ const full = join(d, e);
26
+ try {
27
+ if (statSync(full).isDirectory())
28
+ walk(full);
29
+ else if (CODE_EXTS.has(extname(full)))
30
+ files.push(full);
31
+ }
32
+ catch {
33
+ /* skip */
34
+ }
35
+ }
36
+ }
37
+ walk(dir);
38
+ return files;
39
+ }
40
+ const QUICK_PATTERNS = [
41
+ { regex: /eval\s*\(/, category: "Security", title: "eval() usage", severity: "critical", autoFix: false },
42
+ {
43
+ regex: /(?:password|secret|api[_-]?key)\s*[:=]\s*['"][^'"]+['"]/,
44
+ category: "Security",
45
+ title: "Hardcoded credential",
46
+ severity: "critical",
47
+ autoFix: false,
48
+ },
49
+ { regex: /TODO|FIXME|HACK|XXX/, category: "Debt", title: "Open TODO/FIXME", severity: "low", autoFix: false },
50
+ { regex: /console\.\w+\s*\(/, category: "Quality", title: "Console statement", severity: "low", autoFix: true },
51
+ {
52
+ regex: /catch\s*\(\s*\w*\s*\)\s*\{\s*\}/,
53
+ category: "Reliability",
54
+ title: "Empty catch block",
55
+ severity: "medium",
56
+ autoFix: false,
57
+ },
58
+ {
59
+ regex: /any(?:\s*[;,)\]}]|\s*$)/,
60
+ category: "Types",
61
+ title: "Explicit 'any' type",
62
+ severity: "low",
63
+ autoFix: false,
64
+ },
65
+ {
66
+ regex: /(?:\.innerHTML|\.outerHTML)\s*=/,
67
+ category: "Security",
68
+ title: "innerHTML assignment (XSS risk)",
69
+ severity: "high",
70
+ autoFix: false,
71
+ },
72
+ {
73
+ regex: /new\s+Buffer\s*\(/,
74
+ category: "Security",
75
+ title: "Deprecated new Buffer()",
76
+ severity: "high",
77
+ autoFix: true,
78
+ },
79
+ {
80
+ regex: /process\.exit\s*\(/,
81
+ category: "Reliability",
82
+ title: "process.exit() call",
83
+ severity: "medium",
84
+ autoFix: false,
85
+ },
86
+ {
87
+ regex: /(?:setTimeout|setInterval)\s*\(\s*['"]/,
88
+ category: "Security",
89
+ title: "String passed to timer (implicit eval)",
90
+ severity: "high",
91
+ autoFix: false,
92
+ },
93
+ {
94
+ regex: /\.then\s*\([^)]*\)\s*(?:;|\n)\s*(?!\.catch)/,
95
+ category: "Reliability",
96
+ title: "Unhandled promise rejection",
97
+ severity: "medium",
98
+ autoFix: false,
99
+ },
100
+ { regex: /debugger\b/, category: "Quality", title: "Debugger statement", severity: "medium", autoFix: true },
101
+ ];
102
+ // ─── Analysis ───────────────────────────────────────────────────────────────
103
+ function analyzeFile(filepath, baseDir) {
104
+ const findings = [];
105
+ let content;
106
+ try {
107
+ content = readFileSync(filepath, "utf-8");
108
+ }
109
+ catch {
110
+ return findings;
111
+ }
112
+ const lines = content.split("\n");
113
+ const rel = relative(baseDir, filepath);
114
+ for (let i = 0; i < lines.length; i++) {
115
+ const line = lines[i];
116
+ const trimmed = line.trim();
117
+ if (trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*"))
118
+ continue;
119
+ for (const pattern of QUICK_PATTERNS) {
120
+ if (pattern.regex.test(line)) {
121
+ findings.push({
122
+ file: rel,
123
+ line: i + 1,
124
+ severity: pattern.severity,
125
+ category: pattern.category,
126
+ title: pattern.title,
127
+ autoFixable: pattern.autoFix,
128
+ });
129
+ }
130
+ }
131
+ }
132
+ return findings;
133
+ }
134
+ function buildDigest(allFindings) {
135
+ const critical = allFindings.filter((f) => f.severity === "critical").length;
136
+ const high = allFindings.filter((f) => f.severity === "high").length;
137
+ const medium = allFindings.filter((f) => f.severity === "medium").length;
138
+ const low = allFindings.filter((f) => f.severity === "low").length;
139
+ const autoFixable = allFindings.filter((f) => f.autoFixable).length;
140
+ const riskScore = Math.max(0, 100 - critical * 20 - high * 10 - medium * 4 - low * 1);
141
+ // Top categories
142
+ const catMap = new Map();
143
+ for (const f of allFindings)
144
+ catMap.set(f.category, (catMap.get(f.category) || 0) + 1);
145
+ const topCategories = [...catMap.entries()]
146
+ .sort((a, b) => b[1] - a[1])
147
+ .slice(0, 5)
148
+ .map(([category, count]) => ({ category, count }));
149
+ // Hot files
150
+ const fileMap = new Map();
151
+ for (const f of allFindings)
152
+ fileMap.set(f.file, (fileMap.get(f.file) || 0) + 1);
153
+ const hotFiles = [...fileMap.entries()]
154
+ .sort((a, b) => b[1] - a[1])
155
+ .slice(0, 5)
156
+ .map(([file, count]) => ({ file, count }));
157
+ // Action items
158
+ const actionItems = [];
159
+ if (critical > 0)
160
+ actionItems.push(`Fix ${critical} critical finding(s) immediately`);
161
+ if (high > 0)
162
+ actionItems.push(`Address ${high} high-severity finding(s) before merge`);
163
+ if (autoFixable > 0)
164
+ actionItems.push(`${autoFixable} finding(s) can be auto-fixed`);
165
+ if (hotFiles.length > 0)
166
+ actionItems.push(`Focus on ${hotFiles[0].file} (${hotFiles[0].count} findings)`);
167
+ // Start here — top 5 most impactful
168
+ const startHere = allFindings.filter((f) => f.severity === "critical" || f.severity === "high").slice(0, 5);
169
+ const badge = riskScore >= 80 ? "LOW RISK" : riskScore >= 50 ? "MODERATE RISK" : "HIGH RISK";
170
+ return {
171
+ riskScore,
172
+ badge,
173
+ totalFindings: allFindings.length,
174
+ critical,
175
+ high,
176
+ medium,
177
+ low,
178
+ autoFixable,
179
+ topCategories,
180
+ hotFiles,
181
+ actionItems,
182
+ startHere,
183
+ };
184
+ }
185
+ // ─── CLI ────────────────────────────────────────────────────────────────────
186
+ export function runReviewDigest(argv) {
187
+ if (argv.includes("--help") || argv.includes("-h")) {
188
+ console.log(`
189
+ judges review-digest — Generate concise, role-appropriate review summaries
190
+
191
+ Usage:
192
+ judges review-digest [dir]
193
+ judges review-digest src/ --format json
194
+ judges review-digest src/ --out digest.md
195
+
196
+ Options:
197
+ [dir] Directory to scan (default: .)
198
+ --format json JSON output
199
+ --out <file> Write digest to file
200
+ --help, -h Show this help
201
+
202
+ Generates: risk score, top categories, hot files, action items,
203
+ "start here" list of most impactful findings, auto-fix counts.
204
+ `);
205
+ return;
206
+ }
207
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
208
+ const outFile = argv.find((_a, i) => argv[i - 1] === "--out");
209
+ const dir = argv.find((a) => !a.startsWith("-") &&
210
+ argv.indexOf(a) > 0 &&
211
+ argv[argv.indexOf(a) - 1] !== "--format" &&
212
+ argv[argv.indexOf(a) - 1] !== "--out") || ".";
213
+ const files = collectFiles(dir);
214
+ const allFindings = [];
215
+ for (const f of files)
216
+ allFindings.push(...analyzeFile(f, dir));
217
+ const digest = buildDigest(allFindings);
218
+ if (format === "json") {
219
+ const json = JSON.stringify({ digest, findings: allFindings, timestamp: new Date().toISOString() }, null, 2);
220
+ if (outFile) {
221
+ writeFileSync(outFile, json, "utf-8");
222
+ console.log(`Digest written to ${outFile}`);
223
+ }
224
+ else
225
+ console.log(json);
226
+ }
227
+ else {
228
+ const icon = digest.riskScore >= 80 ? "✅" : digest.riskScore >= 50 ? "⚠️ " : "❌";
229
+ let out = `\n Review Digest: ${icon} ${digest.badge} (${digest.riskScore}/100)\n ─────────────────────────────\n`;
230
+ out += ` Findings: ${digest.totalFindings} (${digest.critical} critical, ${digest.high} high, ${digest.medium} medium, ${digest.low} low)\n`;
231
+ out += ` Auto-fixable: ${digest.autoFixable}\n\n`;
232
+ if (digest.actionItems.length > 0) {
233
+ out += ` Action Items:\n`;
234
+ for (const item of digest.actionItems)
235
+ out += ` → ${item}\n`;
236
+ out += `\n`;
237
+ }
238
+ if (digest.startHere.length > 0) {
239
+ out += ` Start Here (highest impact):\n`;
240
+ for (const f of digest.startHere) {
241
+ const icon2 = f.severity === "critical" ? "🔴" : "🟡";
242
+ out += ` ${icon2} [${f.category}] ${f.title} — ${f.file}:${f.line}\n`;
243
+ }
244
+ out += `\n`;
245
+ }
246
+ if (digest.hotFiles.length > 0) {
247
+ out += ` Hot Files:\n`;
248
+ for (const h of digest.hotFiles)
249
+ out += ` ${h.file} — ${h.count} finding(s)\n`;
250
+ out += `\n`;
251
+ }
252
+ if (digest.topCategories.length > 0) {
253
+ out += ` Top Categories:\n`;
254
+ for (const c of digest.topCategories)
255
+ out += ` ${c.category}: ${c.count}\n`;
256
+ out += `\n`;
257
+ }
258
+ if (outFile) {
259
+ writeFileSync(outFile, out, "utf-8");
260
+ console.log(`Digest written to ${outFile}`);
261
+ }
262
+ else
263
+ console.log(out);
264
+ }
265
+ }
266
+ //# sourceMappingURL=review-digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-digest.js","sourceRoot":"","sources":["../../src/commands/review-digest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-handoff — structured escalation to human reviewers with narrowed scope.
3
+ */
4
+ export declare function runReviewHandoff(argv: string[]): void;
5
+ //# sourceMappingURL=review-handoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-handoff.d.ts","sourceRoot":"","sources":["../../src/commands/review-handoff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgLH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyErD"}