@kevinrabun/judges 3.60.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 (38) hide show
  1. package/CHANGELOG.md +7 -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/ai-provenance.d.ts +5 -0
  6. package/dist/commands/ai-provenance.d.ts.map +1 -0
  7. package/dist/commands/ai-provenance.js +248 -0
  8. package/dist/commands/ai-provenance.js.map +1 -0
  9. package/dist/commands/blame-review.d.ts +5 -0
  10. package/dist/commands/blame-review.d.ts.map +1 -0
  11. package/dist/commands/blame-review.js +270 -0
  12. package/dist/commands/blame-review.js.map +1 -0
  13. package/dist/commands/evidence-chain.d.ts +5 -0
  14. package/dist/commands/evidence-chain.d.ts.map +1 -0
  15. package/dist/commands/evidence-chain.js +310 -0
  16. package/dist/commands/evidence-chain.js.map +1 -0
  17. package/dist/commands/merge-verdict.d.ts +5 -0
  18. package/dist/commands/merge-verdict.d.ts.map +1 -0
  19. package/dist/commands/merge-verdict.js +288 -0
  20. package/dist/commands/merge-verdict.js.map +1 -0
  21. package/dist/commands/quick-check.d.ts +5 -0
  22. package/dist/commands/quick-check.d.ts.map +1 -0
  23. package/dist/commands/quick-check.js +174 -0
  24. package/dist/commands/quick-check.js.map +1 -0
  25. package/dist/commands/review-contract.d.ts +5 -0
  26. package/dist/commands/review-contract.d.ts.map +1 -0
  27. package/dist/commands/review-contract.js +200 -0
  28. package/dist/commands/review-contract.js.map +1 -0
  29. package/dist/commands/review-handoff.d.ts +5 -0
  30. package/dist/commands/review-handoff.d.ts.map +1 -0
  31. package/dist/commands/review-handoff.js +209 -0
  32. package/dist/commands/review-handoff.js.map +1 -0
  33. package/dist/commands/review-receipt.d.ts +5 -0
  34. package/dist/commands/review-receipt.d.ts.map +1 -0
  35. package/dist/commands/review-receipt.js +221 -0
  36. package/dist/commands/review-receipt.js.map +1 -0
  37. package/package.json +1 -1
  38. package/server.json +2 -2
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Quick-check — sub-100ms pattern-only review for real-time save-on-type feedback.
3
+ */
4
+ import { readFileSync, statSync } from "fs";
5
+ import { extname } from "path";
6
+ const PATTERNS = [
7
+ // Critical
8
+ { regex: /\beval\s*\(/, rule: "QC-INJECT-01", severity: "critical", message: "eval() usage — code injection risk" },
9
+ {
10
+ regex: /(?:password|secret|api[_-]?key)\s*[:=]\s*['"][^'"]{4,}['"]/,
11
+ rule: "QC-SECRET-01",
12
+ severity: "critical",
13
+ message: "Hardcoded credential detected",
14
+ },
15
+ { regex: /\.innerHTML\s*=/, rule: "QC-XSS-01", severity: "critical", message: "innerHTML assignment — XSS risk" },
16
+ {
17
+ regex: /new\s+Function\s*\(/,
18
+ rule: "QC-INJECT-02",
19
+ severity: "critical",
20
+ message: "new Function() — code injection risk",
21
+ },
22
+ // High
23
+ {
24
+ regex: /new\s+Buffer\s*\(/,
25
+ rule: "QC-DEPR-01",
26
+ severity: "high",
27
+ message: "Deprecated new Buffer() — use Buffer.from()",
28
+ },
29
+ {
30
+ regex: /(?:setTimeout|setInterval)\s*\(\s*['"]/,
31
+ rule: "QC-INJECT-03",
32
+ severity: "high",
33
+ message: "String passed to timer — implicit eval",
34
+ },
35
+ {
36
+ regex: /process\.exit\s*\(\s*\)/,
37
+ rule: "QC-RELIAB-01",
38
+ severity: "high",
39
+ message: "Unconditional process.exit() — may crash graceful shutdown",
40
+ },
41
+ {
42
+ regex: /document\.write\s*\(/,
43
+ rule: "QC-XSS-02",
44
+ severity: "high",
45
+ message: "document.write() — XSS and DOM clobbering risk",
46
+ },
47
+ // Medium
48
+ {
49
+ regex: /catch\s*\(\s*\w*\s*\)\s*\{\s*\}/,
50
+ rule: "QC-ERR-01",
51
+ severity: "medium",
52
+ message: "Empty catch block — errors silently swallowed",
53
+ },
54
+ { regex: /debugger\b/, rule: "QC-DEV-01", severity: "medium", message: "Debugger statement left in code" },
55
+ { regex: /console\.log\s*\(/, rule: "QC-DEV-02", severity: "medium", message: "console.log() in production code" },
56
+ {
57
+ regex: /\/\/\s*TODO\b|\/\/\s*FIXME\b|\/\/\s*HACK\b|\/\/\s*XXX\b/,
58
+ rule: "QC-DEBT-01",
59
+ severity: "medium",
60
+ message: "Open TODO/FIXME comment",
61
+ },
62
+ {
63
+ regex: /\.then\s*\([^)]*\)\s*;?\s*$/,
64
+ rule: "QC-ASYNC-01",
65
+ severity: "medium",
66
+ message: "Unhandled promise — missing .catch()",
67
+ },
68
+ // Low
69
+ { regex: /\bvar\s+\w+\s*=/, rule: "QC-MODERN-01", severity: "low", message: "var declaration — use const or let" },
70
+ {
71
+ regex: /\.substr\s*\(/,
72
+ rule: "QC-DEPR-02",
73
+ severity: "low",
74
+ message: "Deprecated .substr() — use .substring() or .slice()",
75
+ },
76
+ {
77
+ regex: /==\s*null\b|!=\s*null\b/,
78
+ rule: "QC-TYPE-01",
79
+ severity: "low",
80
+ message: "Loose null comparison — use === null",
81
+ },
82
+ ];
83
+ // ─── Analysis ───────────────────────────────────────────────────────────────
84
+ function quickScan(filepath, content) {
85
+ const start = performance.now();
86
+ const code = content || readFileSync(filepath, "utf-8");
87
+ const lines = code.split("\n");
88
+ const findings = [];
89
+ for (let i = 0; i < lines.length; i++) {
90
+ const line = lines[i];
91
+ const trimmed = line.trim();
92
+ // Skip comments
93
+ if (trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*"))
94
+ continue;
95
+ for (const pattern of PATTERNS) {
96
+ if (pattern.regex.test(line)) {
97
+ findings.push({
98
+ line: i + 1,
99
+ severity: pattern.severity,
100
+ rule: pattern.rule,
101
+ message: pattern.message,
102
+ });
103
+ }
104
+ }
105
+ }
106
+ const critCount = findings.filter((f) => f.severity === "critical").length;
107
+ const highCount = findings.filter((f) => f.severity === "high").length;
108
+ const medCount = findings.filter((f) => f.severity === "medium").length;
109
+ const score = Math.max(0, 100 - critCount * 20 - highCount * 10 - medCount * 4 - findings.filter((f) => f.severity === "low").length);
110
+ return {
111
+ file: filepath,
112
+ findings,
113
+ score,
114
+ elapsedMs: Math.round((performance.now() - start) * 100) / 100,
115
+ };
116
+ }
117
+ // ─── CLI ────────────────────────────────────────────────────────────────────
118
+ export function runQuickCheck(argv) {
119
+ if (argv.includes("--help") || argv.includes("-h")) {
120
+ console.log(`
121
+ judges quick-check — Sub-100ms pattern-only review for real-time feedback
122
+
123
+ Usage:
124
+ judges quick-check <file>
125
+ judges quick-check src/app.ts --format json
126
+
127
+ Options:
128
+ <file> File to check (required)
129
+ --format json JSON output (for IDE integration)
130
+ --help, -h Show this help
131
+
132
+ Designed for save-on-type IDE integration. Runs only cheap regex/pattern
133
+ checks with no LLM calls. Use 'judges review' for deep analysis.
134
+ `);
135
+ return;
136
+ }
137
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
138
+ const file = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0 && argv[argv.indexOf(a) - 1] !== "--format");
139
+ if (!file) {
140
+ console.error("Error: File path required. Usage: judges quick-check <file>");
141
+ process.exitCode = 1;
142
+ return;
143
+ }
144
+ try {
145
+ statSync(file);
146
+ }
147
+ catch {
148
+ console.error(`Error: File not found: ${file}`);
149
+ process.exitCode = 1;
150
+ return;
151
+ }
152
+ const ext = extname(file);
153
+ if (![".ts", ".tsx", ".js", ".jsx", ".py", ".java", ".go", ".cs", ".rs", ".rb"].includes(ext)) {
154
+ console.error(`Warning: Language '${ext}' may have limited coverage.`);
155
+ }
156
+ const result = quickScan(file);
157
+ if (format === "json") {
158
+ console.log(JSON.stringify(result, null, 2));
159
+ }
160
+ else {
161
+ const icon = result.score >= 80 ? "✅" : result.score >= 50 ? "⚠️ " : "❌";
162
+ console.log(`\n Quick Check: ${icon} ${result.score}/100 (${result.elapsedMs}ms)\n ─────────────────────────────`);
163
+ if (result.findings.length === 0) {
164
+ console.log(" No issues found.\n");
165
+ return;
166
+ }
167
+ for (const f of result.findings) {
168
+ const sev = f.severity === "critical" ? "🔴" : f.severity === "high" ? "🟠" : f.severity === "medium" ? "🟡" : "🔵";
169
+ console.log(` ${sev} L${f.line} [${f.rule}] ${f.message}`);
170
+ }
171
+ console.log(`\n ${result.findings.length} finding(s) in ${result.elapsedMs}ms\n`);
172
+ }
173
+ }
174
+ //# sourceMappingURL=quick-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-check.js","sourceRoot":"","sources":["../../src/commands/quick-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-contract — versionable document defining exactly what Judges reviews.
3
+ */
4
+ export declare function runReviewContract(argv: string[]): void;
5
+ //# sourceMappingURL=review-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-contract.d.ts","sourceRoot":"","sources":["../../src/commands/review-contract.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsIH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyHtD"}
@@ -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":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA6B5B,8EAA8E;AAE9E,SAAS,eAAe;IACtB,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACjC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACjC,KAAK,EAAE;YACL,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE;YACpF,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE;YACpF,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE;YACjF,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE;YAC3E,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;YACjF,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;YACjF,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE;YAClF,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE;YAChF,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;YAC7E,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;SACrF;QACD,kBAAkB,EAAE;YAClB,UAAU,EAAE,UAAU;YACtB,kBAAkB,EAAE,MAAM;YAC1B,aAAa,EAAE,KAAK;SACrB;QACD,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE;YACT,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,EAAE;SACrB;KACF,CAAC;AACJ,CAAC;AAWD,SAAS,cAAc,CAAC,QAAwB;IAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,wBAAwB;IACxB,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACxG,IAAI,CAAC,QAAQ,CAAC,kBAAkB;QAAE,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAE7E,sBAAsB;IACtB,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1E,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,QAAQ,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,uBAAuB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9D,QAAQ,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,yBAAyB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,eAAe,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAC3F,CAAC;IACF,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,gGAAgG,CAAC,CAAC;IAClH,CAAC;IAED,YAAY;IACZ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACvB,IAAI,QAAQ,CAAC,SAAS,CAAC,YAAY,GAAG,MAAM,EAAE,CAAC;YAC7C,QAAQ,CAAC,IAAI,CAAC,uBAAuB,QAAQ,CAAC,SAAS,CAAC,YAAY,uBAAuB,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,QAAQ,CAAC,SAAS,CAAC,gBAAgB,GAAG,EAAE,EAAE,CAAC;YAC7C,QAAQ,CAAC,IAAI,CAAC,wBAAwB,QAAQ,CAAC,SAAS,CAAC,gBAAgB,qCAAqC,CAAC,CAAC;QAClH,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,iDAAiD,CAAC,CAAC;IACnG,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACpE,MAAM,cAAc,GAAG,EAAE,CAAC,CAAC,cAAc;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC;IAEnE,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;QACR,QAAQ;KACT,CAAC;AACJ,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;;;;;;;;;;;;;;;;;;;CAmBf,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,GACd,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC;IACpH,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IAEvD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;YAC/F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QACnC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,wFAAwF,CAAC,CAAC;QACxG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,QAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAmB,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAExC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtC,OAAO,CAAC,GAAG,CACT,8BAA8B,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,mCAAmC,CAC5G,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;YAEjD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;gBACvD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM;oBAAE,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;gBAC3D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;oBAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,OAAO;IACP,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,CAAC,OAAO,mCAAmC,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;QAElD,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QACrD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAChG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,QAAQ,MAAM,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAChG,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,yBAAyB,QAAQ,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,yBAAyB,QAAQ,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,yBAAyB,QAAQ,CAAC,kBAAkB,CAAC,aAAa,EAAE,CAAC,CAAC;QAElF,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,CAAC,SAAS,CAAC,YAAY,IAAI,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE7E,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,aAAa;gBAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -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"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Review-handoff — structured escalation to human reviewers with narrowed scope.
3
+ */
4
+ import { readFileSync, readdirSync, statSync } 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"]);
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 ESCALATION_PATTERNS = [
41
+ {
42
+ regex: /(?:payment|billing|charge|refund|invoice)\w*\s*(?:=|:|\()/i,
43
+ reason: "Payment/billing logic",
44
+ question: "Is this payment flow correctly handling edge cases (partial payments, refunds, currency conversion)?",
45
+ preAnalysis: "Payment logic detected — automated review verified syntax but cannot assess business rule correctness",
46
+ severity: "high",
47
+ confidence: 40,
48
+ },
49
+ {
50
+ regex: /(?:auth|permission|role|acl|rbac)\w*\s*(?:=|:|\()/i,
51
+ reason: "Authorization/permission logic",
52
+ question: "Does this authorization check cover all required permissions and fail-closed on errors?",
53
+ preAnalysis: "Authorization pattern detected — verify the permission model matches business requirements",
54
+ severity: "high",
55
+ confidence: 45,
56
+ },
57
+ {
58
+ regex: /(?:encrypt|decrypt|sign|verify|hash|hmac|cipher)\s*\(/i,
59
+ reason: "Cryptographic operation",
60
+ question: "Are the crypto algorithm, key size, and mode appropriate for this use case?",
61
+ preAnalysis: "Cryptographic code detected — automated review verified API usage but cannot assess algorithm fitness",
62
+ severity: "critical",
63
+ confidence: 35,
64
+ },
65
+ {
66
+ regex: /(?:delete|remove|purge|destroy|drop)\s*(?:All|Many|Collection|Table|Database|User)/i,
67
+ reason: "Destructive bulk operation",
68
+ question: "Is this bulk deletion protected by confirmation, soft-delete, or backup mechanisms?",
69
+ preAnalysis: "Bulk destructive operation detected — verify rollback and recovery procedures exist",
70
+ severity: "high",
71
+ confidence: 50,
72
+ },
73
+ {
74
+ regex: /(?:migration|migrate|schema|alter\s+table|add\s+column)/i,
75
+ reason: "Database schema change",
76
+ question: "Is this migration reversible? Has it been tested against production-sized data?",
77
+ preAnalysis: "Schema migration detected — verify backward compatibility and rollback plan",
78
+ severity: "high",
79
+ confidence: 45,
80
+ },
81
+ {
82
+ regex: /(?:cron|schedule|interval|recurring|periodic)\s*(?:=|:|\()/i,
83
+ reason: "Scheduled task configuration",
84
+ question: "Is the schedule correct? What happens if the task runs longer than the interval?",
85
+ preAnalysis: "Scheduled task detected — verify idempotency and overlap handling",
86
+ severity: "medium",
87
+ confidence: 55,
88
+ },
89
+ {
90
+ regex: /(?:feature[_-]?flag|toggle|experiment|canary|rollout)\s*(?:=|:|\()/i,
91
+ reason: "Feature flag / experiment",
92
+ question: "Is the feature flag cleanup planned? Are default values safe?",
93
+ preAnalysis: "Feature flag detected — verify kill switch and rollback behavior",
94
+ severity: "medium",
95
+ confidence: 55,
96
+ },
97
+ {
98
+ regex: /(?:race|mutex|lock|semaphore|atomic|concurrent)/i,
99
+ reason: "Concurrency primitive",
100
+ question: "Is this concurrency pattern correct? Could it deadlock under load?",
101
+ preAnalysis: "Concurrency pattern detected — automated analysis cannot verify liveness guarantees",
102
+ severity: "high",
103
+ confidence: 35,
104
+ },
105
+ ];
106
+ // ─── Analysis ───────────────────────────────────────────────────────────────
107
+ function analyzeFile(filepath, baseDir) {
108
+ const items = [];
109
+ let content;
110
+ try {
111
+ content = readFileSync(filepath, "utf-8");
112
+ }
113
+ catch {
114
+ return items;
115
+ }
116
+ const lines = content.split("\n");
117
+ const rel = relative(baseDir, filepath);
118
+ for (let i = 0; i < lines.length; i++) {
119
+ const line = lines[i];
120
+ const trimmed = line.trim();
121
+ if (trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*"))
122
+ continue;
123
+ for (const pattern of ESCALATION_PATTERNS) {
124
+ if (pattern.regex.test(line)) {
125
+ items.push({
126
+ file: rel,
127
+ lineStart: Math.max(1, i - 2),
128
+ lineEnd: Math.min(lines.length, i + 5),
129
+ reason: pattern.reason,
130
+ confidence: pattern.confidence,
131
+ question: pattern.question,
132
+ preAnalysis: pattern.preAnalysis,
133
+ severity: pattern.severity,
134
+ });
135
+ break; // Only one escalation per line
136
+ }
137
+ }
138
+ }
139
+ return items;
140
+ }
141
+ // ─── CLI ────────────────────────────────────────────────────────────────────
142
+ export function runReviewHandoff(argv) {
143
+ if (argv.includes("--help") || argv.includes("-h")) {
144
+ console.log(`
145
+ judges review-handoff — Structured escalation to human reviewers
146
+
147
+ Usage:
148
+ judges review-handoff [dir]
149
+ judges review-handoff src/ --format json
150
+
151
+ Options:
152
+ [dir] Directory to scan (default: .)
153
+ --format json JSON output
154
+ --help, -h Show this help
155
+
156
+ When Judges encounters low-confidence findings (payment logic, crypto,
157
+ permissions, schema migrations, concurrency), it creates targeted human
158
+ review requests with narrowed scope, specific questions, and pre-analysis.
159
+ `);
160
+ return;
161
+ }
162
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
163
+ const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0 && argv[argv.indexOf(a) - 1] !== "--format") || ".";
164
+ const files = collectFiles(dir);
165
+ const allItems = [];
166
+ for (const f of files)
167
+ allItems.push(...analyzeFile(f, dir));
168
+ // Sort by severity then confidence (lowest confidence first — highest need for human review)
169
+ const sevOrder = { critical: 0, high: 1, medium: 2, low: 3 };
170
+ allItems.sort((a, b) => sevOrder[a.severity] - sevOrder[b.severity] || a.confidence - b.confidence);
171
+ const totalFiles = files.length;
172
+ const filesWithEscalations = new Set(allItems.map((i) => i.file)).size;
173
+ const verifiedCount = totalFiles - filesWithEscalations;
174
+ const report = {
175
+ escalationCount: allItems.length,
176
+ verifiedCount,
177
+ items: allItems,
178
+ verifiedSummary: `${verifiedCount}/${totalFiles} files passed automated review with high confidence — no human review needed.`,
179
+ };
180
+ if (format === "json") {
181
+ console.log(JSON.stringify({ ...report, timestamp: new Date().toISOString() }, null, 2));
182
+ }
183
+ else {
184
+ console.log(`\n Review Handoff\n ─────────────────────────────`);
185
+ console.log(` ✅ ${verifiedCount}/${totalFiles} files — automated review complete (high confidence)`);
186
+ console.log(` 🔍 ${allItems.length} item(s) escalated for human review\n`);
187
+ if (allItems.length === 0) {
188
+ console.log(" No escalations needed — all files passed automated review.\n");
189
+ return;
190
+ }
191
+ for (const item of allItems.slice(0, 15)) {
192
+ const icon = item.severity === "critical"
193
+ ? "🔴"
194
+ : item.severity === "high"
195
+ ? "🟠"
196
+ : item.severity === "medium"
197
+ ? "🟡"
198
+ : "🔵";
199
+ console.log(` ${icon} ${item.reason} (confidence: ${item.confidence}%)`);
200
+ console.log(` 📄 ${item.file}:${item.lineStart}-${item.lineEnd}`);
201
+ console.log(` ❓ ${item.question}`);
202
+ console.log(` 📋 ${item.preAnalysis}`);
203
+ console.log();
204
+ }
205
+ if (allItems.length > 15)
206
+ console.log(` ... and ${allItems.length - 15} more escalations\n`);
207
+ }
208
+ }
209
+ //# sourceMappingURL=review-handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-handoff.js","sourceRoot":"","sources":["../../src/commands/review-handoff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Review-receipt — cryptographically signed attestation of review completeness.
3
+ */
4
+ export declare function runReviewReceipt(argv: string[]): void;
5
+ //# sourceMappingURL=review-receipt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-receipt.d.ts","sourceRoot":"","sources":["../../src/commands/review-receipt.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0NH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyErD"}