@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,310 @@
1
+ /**
2
+ * Evidence-chain — traversable reasoning chain showing exactly why each finding was raised.
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 KNOWN_PATTERNS = [
41
+ {
42
+ id: "EC-INJECT-01",
43
+ regex: /\beval\s*\(/,
44
+ title: "eval() code injection",
45
+ severity: "critical",
46
+ chain: [
47
+ { action: "Pattern match", detail: "Regex /\\beval\\s*\\(/ matched source line", result: "eval() call detected" },
48
+ {
49
+ action: "Context analysis",
50
+ detail: "Checked if input is user-controlled or static",
51
+ result: "Input source may be dynamic",
52
+ },
53
+ {
54
+ action: "Scope check",
55
+ detail: "Verified eval is in application code, not test/build",
56
+ result: "Found in application scope",
57
+ },
58
+ {
59
+ action: "Vulnerability classification",
60
+ detail: "CWE-94 (Code Injection), OWASP A03:2021",
61
+ result: "Critical — arbitrary code execution",
62
+ },
63
+ ],
64
+ },
65
+ {
66
+ id: "EC-SECRET-01",
67
+ regex: /(?:password|secret|api[_-]?key)\s*[:=]\s*['"][^'"]{4,}['"]/,
68
+ title: "Hardcoded credential",
69
+ severity: "critical",
70
+ chain: [
71
+ {
72
+ action: "Pattern match",
73
+ detail: "Credential-like assignment detected",
74
+ result: "Value assigned to sensitive-named variable",
75
+ },
76
+ {
77
+ action: "Value analysis",
78
+ detail: "Checked if value is placeholder (test, example, TODO)",
79
+ result: "Value appears to be a real credential",
80
+ },
81
+ {
82
+ action: "Scope check",
83
+ detail: "Verified location is not test fixture or example file",
84
+ result: "Found in application code",
85
+ },
86
+ {
87
+ action: "Vulnerability classification",
88
+ detail: "CWE-798 (Hardcoded Credentials), OWASP A07:2021",
89
+ result: "Critical — credential exposure in source",
90
+ },
91
+ ],
92
+ },
93
+ {
94
+ id: "EC-XSS-01",
95
+ regex: /\.innerHTML\s*=/,
96
+ title: "XSS via innerHTML",
97
+ severity: "high",
98
+ chain: [
99
+ {
100
+ action: "Pattern match",
101
+ detail: "innerHTML assignment detected",
102
+ result: "DOM manipulation without sanitization",
103
+ },
104
+ {
105
+ action: "Input trace",
106
+ detail: "Checked if assigned value originates from user input",
107
+ result: "Input source requires manual verification",
108
+ },
109
+ {
110
+ action: "Sanitization check",
111
+ detail: "Searched for DOMPurify, sanitize-html, or encoding calls",
112
+ result: "No sanitization found in scope",
113
+ },
114
+ {
115
+ action: "Vulnerability classification",
116
+ detail: "CWE-79 (Cross-site Scripting), OWASP A03:2021",
117
+ result: "High — potential stored/reflected XSS",
118
+ },
119
+ ],
120
+ },
121
+ {
122
+ id: "EC-SQLI-01",
123
+ regex: /(?:query|execute)\s*\([^)]*\+\s*(?:req|input|user|param)/,
124
+ title: "SQL injection via concatenation",
125
+ severity: "critical",
126
+ chain: [
127
+ {
128
+ action: "Pattern match",
129
+ detail: "String concatenation in SQL query detected",
130
+ result: "User input concatenated into query string",
131
+ },
132
+ {
133
+ action: "Parameterization check",
134
+ detail: "Looked for prepared statements or parameterized queries",
135
+ result: "No parameterization found",
136
+ },
137
+ {
138
+ action: "Input validation check",
139
+ detail: "Searched for input sanitization before query",
140
+ result: "No validation at call site",
141
+ },
142
+ {
143
+ action: "Vulnerability classification",
144
+ detail: "CWE-89 (SQL Injection), OWASP A03:2021",
145
+ result: "Critical — full database compromise possible",
146
+ },
147
+ ],
148
+ },
149
+ {
150
+ id: "EC-ERR-01",
151
+ regex: /catch\s*\(\s*\w*\s*\)\s*\{\s*\}/,
152
+ title: "Empty catch block",
153
+ severity: "medium",
154
+ chain: [
155
+ {
156
+ action: "Pattern match",
157
+ detail: "Empty catch block detected via regex",
158
+ result: "Exception caught and silently discarded",
159
+ },
160
+ {
161
+ action: "Context analysis",
162
+ detail: "Checked surrounding code for error handling",
163
+ result: "No logging, rethrow, or fallback in catch",
164
+ },
165
+ {
166
+ action: "Impact assessment",
167
+ detail: "Silent error swallowing can mask bugs and security issues",
168
+ result: "Medium — errors hidden from monitoring",
169
+ },
170
+ ],
171
+ },
172
+ {
173
+ id: "EC-DEPR-01",
174
+ regex: /new\s+Buffer\s*\(/,
175
+ title: "Deprecated new Buffer()",
176
+ severity: "high",
177
+ chain: [
178
+ { action: "Pattern match", detail: "new Buffer() constructor detected", result: "Deprecated API usage found" },
179
+ {
180
+ action: "Security analysis",
181
+ detail: "new Buffer(n) may expose uninitialized memory",
182
+ result: "Potential information leak",
183
+ },
184
+ {
185
+ action: "Modern alternative",
186
+ detail: "Buffer.from(), Buffer.alloc(), Buffer.allocUnsafe()",
187
+ result: "High — use safe Buffer APIs",
188
+ },
189
+ ],
190
+ },
191
+ ];
192
+ // ─── Analysis ───────────────────────────────────────────────────────────────
193
+ function analyzeFile(filepath, baseDir) {
194
+ const results = [];
195
+ let content;
196
+ try {
197
+ content = readFileSync(filepath, "utf-8");
198
+ }
199
+ catch {
200
+ return results;
201
+ }
202
+ const lines = content.split("\n");
203
+ const rel = relative(baseDir, filepath);
204
+ for (let i = 0; i < lines.length; i++) {
205
+ const line = lines[i];
206
+ const trimmed = line.trim();
207
+ if (trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*"))
208
+ continue;
209
+ for (const pattern of KNOWN_PATTERNS) {
210
+ if (pattern.regex.test(line)) {
211
+ // Count similar patterns across file
212
+ let similarCount = 0;
213
+ for (let j = 0; j < lines.length; j++) {
214
+ if (j !== i && pattern.regex.test(lines[j]))
215
+ similarCount++;
216
+ }
217
+ const contextStart = Math.max(0, i - 2);
218
+ const contextEnd = Math.min(lines.length, i + 3);
219
+ const codeContext = lines.slice(contextStart, contextEnd).join("\n");
220
+ const chain = pattern.chain.map((c, idx) => ({
221
+ step: idx + 1,
222
+ action: c.action,
223
+ detail: c.detail,
224
+ result: c.result,
225
+ }));
226
+ results.push({
227
+ findingId: `${pattern.id}@${rel}:${i + 1}`,
228
+ file: rel,
229
+ line: i + 1,
230
+ title: pattern.title,
231
+ severity: pattern.severity,
232
+ chain,
233
+ codeContext,
234
+ similarPatterns: similarCount,
235
+ confidenceScore: Math.min(95, 70 + chain.length * 5 + (similarCount > 0 ? 5 : 0)),
236
+ });
237
+ }
238
+ }
239
+ }
240
+ return results;
241
+ }
242
+ // ─── CLI ────────────────────────────────────────────────────────────────────
243
+ export function runEvidenceChain(argv) {
244
+ if (argv.includes("--help") || argv.includes("-h")) {
245
+ console.log(`
246
+ judges evidence-chain — Traversable reasoning chain for findings
247
+
248
+ Usage:
249
+ judges evidence-chain [dir]
250
+ judges evidence-chain src/ --format json
251
+ judges evidence-chain src/ --finding EC-INJECT-01
252
+
253
+ Options:
254
+ [dir] Directory to scan (default: .)
255
+ --finding <id> Filter to specific finding ID
256
+ --format json JSON output
257
+ --help, -h Show this help
258
+
259
+ For any finding, produces: pattern matched → context analyzed →
260
+ confidence calibrated → CWE/OWASP classification → final reasoning.
261
+ `);
262
+ return;
263
+ }
264
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
265
+ const findingFilter = argv.find((_a, i) => argv[i - 1] === "--finding");
266
+ const dir = argv.find((a) => !a.startsWith("-") &&
267
+ argv.indexOf(a) > 0 &&
268
+ argv[argv.indexOf(a) - 1] !== "--format" &&
269
+ argv[argv.indexOf(a) - 1] !== "--finding") || ".";
270
+ const files = collectFiles(dir);
271
+ let allResults = [];
272
+ for (const f of files)
273
+ allResults.push(...analyzeFile(f, dir));
274
+ if (findingFilter) {
275
+ allResults = allResults.filter((r) => r.findingId.includes(findingFilter));
276
+ }
277
+ if (format === "json") {
278
+ console.log(JSON.stringify({ results: allResults, count: allResults.length, timestamp: new Date().toISOString() }, null, 2));
279
+ }
280
+ else {
281
+ console.log(`\n Evidence Chain: ${allResults.length} finding(s)\n ─────────────────────────────`);
282
+ if (allResults.length === 0) {
283
+ console.log(" No findings to trace.\n");
284
+ return;
285
+ }
286
+ for (const result of allResults.slice(0, 10)) {
287
+ const icon = result.severity === "critical"
288
+ ? "🔴"
289
+ : result.severity === "high"
290
+ ? "🟠"
291
+ : result.severity === "medium"
292
+ ? "🟡"
293
+ : "🔵";
294
+ console.log(`\n ${icon} ${result.title} [${result.findingId}]`);
295
+ console.log(` ${result.file}:${result.line} (confidence: ${result.confidenceScore}%)`);
296
+ console.log(` Reasoning chain:`);
297
+ for (const step of result.chain) {
298
+ console.log(` ${step.step}. ${step.action}: ${step.detail}`);
299
+ console.log(` → ${step.result}`);
300
+ }
301
+ if (result.similarPatterns > 0) {
302
+ console.log(` ℹ️ ${result.similarPatterns} similar pattern(s) found in same file`);
303
+ }
304
+ }
305
+ if (allResults.length > 10)
306
+ console.log(`\n ... and ${allResults.length - 10} more findings`);
307
+ console.log();
308
+ }
309
+ }
310
+ //# sourceMappingURL=evidence-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-chain.js","sourceRoot":"","sources":["../../src/commands/evidence-chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Merge-verdict — single authoritative MERGE/HOLD decision with structured rationale.
3
+ */
4
+ export declare function runMergeVerdict(argv: string[]): void;
5
+ //# sourceMappingURL=merge-verdict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-verdict.d.ts","sourceRoot":"","sources":["../../src/commands/merge-verdict.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyRH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoEpD"}
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Merge-verdict — single authoritative MERGE/HOLD decision with structured rationale.
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", ".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 DIMENSION_PATTERNS = [
41
+ // Security (blocking)
42
+ {
43
+ regex: /\beval\s*\(/,
44
+ category: "Security",
45
+ title: "eval() injection",
46
+ severity: "critical",
47
+ dimension: "security",
48
+ blocking: true,
49
+ },
50
+ {
51
+ regex: /(?:password|secret|api[_-]?key)\s*[:=]\s*['"][^'"]{4,}['"]/,
52
+ category: "Security",
53
+ title: "Hardcoded credential",
54
+ severity: "critical",
55
+ dimension: "security",
56
+ blocking: true,
57
+ },
58
+ {
59
+ regex: /\.innerHTML\s*=/,
60
+ category: "Security",
61
+ title: "XSS via innerHTML",
62
+ severity: "high",
63
+ dimension: "security",
64
+ blocking: true,
65
+ },
66
+ {
67
+ regex: /(?:exec|spawn)\s*\([^)]*\+/,
68
+ category: "Security",
69
+ title: "Command injection",
70
+ severity: "critical",
71
+ dimension: "security",
72
+ blocking: true,
73
+ },
74
+ {
75
+ regex: /SELECT.*FROM.*\+\s*(?:req|input|user|param)/,
76
+ category: "Security",
77
+ title: "SQL injection",
78
+ severity: "critical",
79
+ dimension: "security",
80
+ blocking: true,
81
+ },
82
+ // Quality (non-blocking)
83
+ {
84
+ regex: /catch\s*\(\s*\w*\s*\)\s*\{\s*\}/,
85
+ category: "Quality",
86
+ title: "Empty catch block",
87
+ severity: "medium",
88
+ dimension: "quality",
89
+ blocking: false,
90
+ },
91
+ {
92
+ regex: /console\.log\s*\(/,
93
+ category: "Quality",
94
+ title: "Console statement",
95
+ severity: "low",
96
+ dimension: "quality",
97
+ blocking: false,
98
+ },
99
+ {
100
+ regex: /debugger\b/,
101
+ category: "Quality",
102
+ title: "Debugger statement",
103
+ severity: "medium",
104
+ dimension: "quality",
105
+ blocking: false,
106
+ },
107
+ {
108
+ regex: /TODO|FIXME|HACK|XXX/,
109
+ category: "Quality",
110
+ title: "Open TODO",
111
+ severity: "low",
112
+ dimension: "quality",
113
+ blocking: false,
114
+ },
115
+ // Correctness (blocking for critical)
116
+ {
117
+ regex: /new\s+Buffer\s*\(/,
118
+ category: "Correctness",
119
+ title: "Deprecated Buffer()",
120
+ severity: "high",
121
+ dimension: "correctness",
122
+ blocking: false,
123
+ },
124
+ {
125
+ regex: /process\.exit\s*\(\s*\)/,
126
+ category: "Correctness",
127
+ title: "Ungraceful exit",
128
+ severity: "medium",
129
+ dimension: "correctness",
130
+ blocking: false,
131
+ },
132
+ // Compliance
133
+ {
134
+ regex: /\/\/\s*(?:eslint|tslint|prettier)-disable/,
135
+ category: "Compliance",
136
+ title: "Linter suppression",
137
+ severity: "low",
138
+ dimension: "compliance",
139
+ blocking: false,
140
+ },
141
+ ];
142
+ // ─── Analysis ───────────────────────────────────────────────────────────────
143
+ function analyzeFile(filepath, baseDir) {
144
+ const findings = [];
145
+ let content;
146
+ try {
147
+ content = readFileSync(filepath, "utf-8");
148
+ }
149
+ catch {
150
+ return findings;
151
+ }
152
+ const lines = content.split("\n");
153
+ const rel = relative(baseDir, filepath);
154
+ for (let i = 0; i < lines.length; i++) {
155
+ const line = lines[i];
156
+ const trimmed = line.trim();
157
+ if (trimmed.startsWith("//") || trimmed.startsWith("*") || trimmed.startsWith("/*"))
158
+ continue;
159
+ for (const pattern of DIMENSION_PATTERNS) {
160
+ if (pattern.regex.test(line)) {
161
+ findings.push({
162
+ file: rel,
163
+ line: i + 1,
164
+ severity: pattern.severity,
165
+ category: pattern.category,
166
+ title: pattern.title,
167
+ blocking: pattern.blocking,
168
+ });
169
+ }
170
+ }
171
+ }
172
+ return findings;
173
+ }
174
+ function renderDecision(allFindings, threshold) {
175
+ const blocking = allFindings.filter((f) => f.blocking);
176
+ const accepted = allFindings.filter((f) => !f.blocking);
177
+ // Dimension scores
178
+ const dimFindings = (dim) => allFindings.filter((f) => {
179
+ const p = DIMENSION_PATTERNS.find((dp) => dp.title === f.title);
180
+ return p && p.dimension === dim;
181
+ });
182
+ const dimScore = (dim) => {
183
+ const df = dimFindings(dim);
184
+ const crits = df.filter((f) => f.severity === "critical").length;
185
+ const highs = df.filter((f) => f.severity === "high").length;
186
+ return Math.max(0, 100 -
187
+ crits * 25 -
188
+ highs * 12 -
189
+ df.filter((f) => f.severity === "medium").length * 5 -
190
+ df.filter((f) => f.severity === "low").length);
191
+ };
192
+ const dimensions = {
193
+ security: dimScore("security"),
194
+ quality: dimScore("quality"),
195
+ correctness: dimScore("correctness"),
196
+ compliance: dimScore("compliance"),
197
+ };
198
+ const riskScore = Math.round(dimensions.security * 0.4 + dimensions.quality * 0.2 + dimensions.correctness * 0.25 + dimensions.compliance * 0.15);
199
+ const decision = blocking.length > 0 || riskScore < threshold ? "HOLD" : "MERGE";
200
+ const confidence = blocking.length === 0 ? Math.min(95, riskScore) : Math.max(60, 100 - blocking.length * 10);
201
+ const rationale = [];
202
+ if (blocking.length > 0)
203
+ rationale.push(`${blocking.length} blocking finding(s) require resolution before merge`);
204
+ if (dimensions.security < 70)
205
+ rationale.push(`Security score (${dimensions.security}) is below acceptable threshold`);
206
+ if (dimensions.correctness < 70)
207
+ rationale.push(`Correctness score (${dimensions.correctness}) indicates potential bugs`);
208
+ if (accepted.length > 0)
209
+ rationale.push(`${accepted.length} non-blocking finding(s) accepted as known risks`);
210
+ if (decision === "MERGE")
211
+ rationale.push(`Risk score (${riskScore}) meets or exceeds threshold (${threshold})`);
212
+ const summary = decision === "MERGE"
213
+ ? `MERGE — Code passes review with ${accepted.length} accepted risk(s). Risk score: ${riskScore}/100.`
214
+ : `HOLD — ${blocking.length} blocking finding(s) and risk score ${riskScore}/100 (threshold: ${threshold}).`;
215
+ return {
216
+ decision,
217
+ confidence,
218
+ riskScore,
219
+ blockingFindings: blocking,
220
+ acceptedRisks: accepted,
221
+ dimensions,
222
+ rationale,
223
+ summary,
224
+ };
225
+ }
226
+ // ─── CLI ────────────────────────────────────────────────────────────────────
227
+ export function runMergeVerdict(argv) {
228
+ if (argv.includes("--help") || argv.includes("-h")) {
229
+ console.log(`
230
+ judges merge-verdict — Single authoritative MERGE/HOLD decision
231
+
232
+ Usage:
233
+ judges merge-verdict [dir]
234
+ judges merge-verdict src/ --threshold 75 --format json
235
+
236
+ Options:
237
+ [dir] Directory to scan (default: .)
238
+ --threshold <n> Minimum risk score for MERGE (default: 70)
239
+ --format json JSON output (for CI/CD integration)
240
+ --help, -h Show this help
241
+
242
+ Synthesizes security, quality, correctness, and compliance dimensions
243
+ into one MERGE or HOLD decision with structured rationale.
244
+ `);
245
+ return;
246
+ }
247
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
248
+ const threshStr = argv.find((_a, i) => argv[i - 1] === "--threshold");
249
+ const threshold = threshStr ? parseInt(threshStr, 10) : 70;
250
+ const dir = argv.find((a) => !a.startsWith("-") &&
251
+ argv.indexOf(a) > 0 &&
252
+ argv[argv.indexOf(a) - 1] !== "--format" &&
253
+ argv[argv.indexOf(a) - 1] !== "--threshold") || ".";
254
+ const files = collectFiles(dir);
255
+ const allFindings = [];
256
+ for (const f of files)
257
+ allFindings.push(...analyzeFile(f, dir));
258
+ const result = renderDecision(allFindings, threshold);
259
+ if (format === "json") {
260
+ console.log(JSON.stringify({ ...result, timestamp: new Date().toISOString() }, null, 2));
261
+ }
262
+ else {
263
+ const icon = result.decision === "MERGE" ? "✅" : "❌";
264
+ console.log(`\n ${icon} ${result.decision} (confidence: ${result.confidence}%)\n ─────────────────────────────`);
265
+ console.log(` Risk Score: ${result.riskScore}/100 (threshold: ${threshold})`);
266
+ console.log(` Security: ${result.dimensions.security}/100`);
267
+ console.log(` Quality: ${result.dimensions.quality}/100`);
268
+ console.log(` Correctness: ${result.dimensions.correctness}/100`);
269
+ console.log(` Compliance: ${result.dimensions.compliance}/100\n`);
270
+ if (result.blockingFindings.length > 0) {
271
+ console.log(` Blocking (${result.blockingFindings.length}):`);
272
+ for (const f of result.blockingFindings.slice(0, 10)) {
273
+ console.log(` 🔴 [${f.category}] ${f.title} — ${f.file}:${f.line}`);
274
+ }
275
+ console.log();
276
+ }
277
+ if (result.rationale.length > 0) {
278
+ console.log(` Rationale:`);
279
+ for (const r of result.rationale)
280
+ console.log(` → ${r}`);
281
+ console.log();
282
+ }
283
+ console.log(` ${result.summary}\n`);
284
+ if (result.decision === "HOLD")
285
+ process.exitCode = 1;
286
+ }
287
+ }
288
+ //# sourceMappingURL=merge-verdict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-verdict.js","sourceRoot":"","sources":["../../src/commands/merge-verdict.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Quick-check — sub-100ms pattern-only review for real-time save-on-type feedback.
3
+ */
4
+ export declare function runQuickCheck(argv: string[]): void;
5
+ //# sourceMappingURL=quick-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-check.d.ts","sourceRoot":"","sources":["../../src/commands/quick-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2JH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8DlD"}