@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.
- package/CHANGELOG.md +7 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +56 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/ai-provenance.d.ts +5 -0
- package/dist/commands/ai-provenance.d.ts.map +1 -0
- package/dist/commands/ai-provenance.js +248 -0
- package/dist/commands/ai-provenance.js.map +1 -0
- package/dist/commands/blame-review.d.ts +5 -0
- package/dist/commands/blame-review.d.ts.map +1 -0
- package/dist/commands/blame-review.js +270 -0
- package/dist/commands/blame-review.js.map +1 -0
- package/dist/commands/evidence-chain.d.ts +5 -0
- package/dist/commands/evidence-chain.d.ts.map +1 -0
- package/dist/commands/evidence-chain.js +310 -0
- package/dist/commands/evidence-chain.js.map +1 -0
- package/dist/commands/merge-verdict.d.ts +5 -0
- package/dist/commands/merge-verdict.d.ts.map +1 -0
- package/dist/commands/merge-verdict.js +288 -0
- package/dist/commands/merge-verdict.js.map +1 -0
- package/dist/commands/quick-check.d.ts +5 -0
- package/dist/commands/quick-check.d.ts.map +1 -0
- package/dist/commands/quick-check.js +174 -0
- package/dist/commands/quick-check.js.map +1 -0
- package/dist/commands/review-contract.d.ts +5 -0
- package/dist/commands/review-contract.d.ts.map +1 -0
- package/dist/commands/review-contract.js +200 -0
- package/dist/commands/review-contract.js.map +1 -0
- package/dist/commands/review-handoff.d.ts +5 -0
- package/dist/commands/review-handoff.d.ts.map +1 -0
- package/dist/commands/review-handoff.js +209 -0
- package/dist/commands/review-handoff.js.map +1 -0
- package/dist/commands/review-receipt.d.ts +5 -0
- package/dist/commands/review-receipt.d.ts.map +1 -0
- package/dist/commands/review-receipt.js +221 -0
- package/dist/commands/review-receipt.js.map +1 -0
- package/package.json +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|