@kevinrabun/judges 3.61.0 → 3.63.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 +14 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +112 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/batch-review.d.ts +5 -0
- package/dist/commands/batch-review.d.ts.map +1 -0
- package/dist/commands/batch-review.js +181 -0
- package/dist/commands/batch-review.js.map +1 -0
- package/dist/commands/custom-rule.d.ts +5 -0
- package/dist/commands/custom-rule.d.ts.map +1 -0
- package/dist/commands/custom-rule.js +211 -0
- package/dist/commands/custom-rule.js.map +1 -0
- package/dist/commands/diff-review.d.ts +5 -0
- package/dist/commands/diff-review.d.ts.map +1 -0
- package/dist/commands/diff-review.js +191 -0
- package/dist/commands/diff-review.js.map +1 -0
- package/dist/commands/finding-group.d.ts +16 -0
- package/dist/commands/finding-group.d.ts.map +1 -0
- package/dist/commands/finding-group.js +165 -0
- package/dist/commands/finding-group.js.map +1 -0
- package/dist/commands/focus-area.d.ts +6 -0
- package/dist/commands/focus-area.d.ts.map +1 -0
- package/dist/commands/focus-area.js +193 -0
- package/dist/commands/focus-area.js.map +1 -0
- package/dist/commands/ignore-list.d.ts +19 -0
- package/dist/commands/ignore-list.d.ts.map +1 -0
- package/dist/commands/ignore-list.js +166 -0
- package/dist/commands/ignore-list.js.map +1 -0
- package/dist/commands/incremental-review.d.ts +5 -0
- package/dist/commands/incremental-review.d.ts.map +1 -0
- package/dist/commands/incremental-review.js +240 -0
- package/dist/commands/incremental-review.js.map +1 -0
- package/dist/commands/review-cache.d.ts +23 -0
- package/dist/commands/review-cache.d.ts.map +1 -0
- package/dist/commands/review-cache.js +135 -0
- package/dist/commands/review-cache.js.map +1 -0
- package/dist/commands/review-compare.d.ts +5 -0
- package/dist/commands/review-compare.d.ts.map +1 -0
- package/dist/commands/review-compare.js +201 -0
- package/dist/commands/review-compare.js.map +1 -0
- package/dist/commands/review-explain.d.ts +6 -0
- package/dist/commands/review-explain.d.ts.map +1 -0
- package/dist/commands/review-explain.js +195 -0
- package/dist/commands/review-explain.js.map +1 -0
- package/dist/commands/review-gate.d.ts +5 -0
- package/dist/commands/review-gate.d.ts.map +1 -0
- package/dist/commands/review-gate.js +213 -0
- package/dist/commands/review-gate.js.map +1 -0
- package/dist/commands/review-log.d.ts +23 -0
- package/dist/commands/review-log.d.ts.map +1 -0
- package/dist/commands/review-log.js +165 -0
- package/dist/commands/review-log.js.map +1 -0
- package/dist/commands/review-summary.d.ts +5 -0
- package/dist/commands/review-summary.d.ts.map +1 -0
- package/dist/commands/review-summary.js +175 -0
- package/dist/commands/review-summary.js.map +1 -0
- package/dist/commands/rule-test.d.ts +5 -0
- package/dist/commands/rule-test.d.ts.map +1 -0
- package/dist/commands/rule-test.js +216 -0
- package/dist/commands/rule-test.js.map +1 -0
- package/dist/commands/severity-tune.d.ts +5 -0
- package/dist/commands/severity-tune.d.ts.map +1 -0
- package/dist/commands/severity-tune.js +209 -0
- package/dist/commands/severity-tune.js.map +1 -0
- package/dist/commands/team-config.d.ts +5 -0
- package/dist/commands/team-config.d.ts.map +1 -0
- package/dist/commands/team-config.js +235 -0
- package/dist/commands/team-config.js.map +1 -0
- package/dist/commands/trend-report.d.ts +5 -0
- package/dist/commands/trend-report.d.ts.map +1 -0
- package/dist/commands/trend-report.js +149 -0
- package/dist/commands/trend-report.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding-group — Group related findings into actionable clusters.
|
|
3
|
+
*/
|
|
4
|
+
import type { Finding } from "../types.js";
|
|
5
|
+
export interface FindingCluster {
|
|
6
|
+
id: string;
|
|
7
|
+
label: string;
|
|
8
|
+
pattern: string;
|
|
9
|
+
count: number;
|
|
10
|
+
severities: Record<string, number>;
|
|
11
|
+
findings: Finding[];
|
|
12
|
+
files: string[];
|
|
13
|
+
recommendation: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function runFindingGroup(argv: string[]): void;
|
|
16
|
+
//# sourceMappingURL=finding-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-group.d.ts","sourceRoot":"","sources":["../../src/commands/finding-group.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAiFD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoGpD"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding-group — Group related findings into actionable clusters.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync } from "fs";
|
|
5
|
+
// ─── Grouping strategies ────────────────────────────────────────────────────
|
|
6
|
+
function groupByRule(findings) {
|
|
7
|
+
const groups = new Map();
|
|
8
|
+
for (const f of findings) {
|
|
9
|
+
const key = f.ruleId || "unknown";
|
|
10
|
+
const existing = groups.get(key) || [];
|
|
11
|
+
existing.push(f);
|
|
12
|
+
groups.set(key, existing);
|
|
13
|
+
}
|
|
14
|
+
return groups;
|
|
15
|
+
}
|
|
16
|
+
function groupBySeverity(findings) {
|
|
17
|
+
const groups = new Map();
|
|
18
|
+
for (const f of findings) {
|
|
19
|
+
const key = f.severity || "unknown";
|
|
20
|
+
const existing = groups.get(key) || [];
|
|
21
|
+
existing.push(f);
|
|
22
|
+
groups.set(key, existing);
|
|
23
|
+
}
|
|
24
|
+
return groups;
|
|
25
|
+
}
|
|
26
|
+
function groupByCategory(findings) {
|
|
27
|
+
const groups = new Map();
|
|
28
|
+
for (const f of findings) {
|
|
29
|
+
const ruleId = f.ruleId || "";
|
|
30
|
+
let category = "other";
|
|
31
|
+
if (/sql|inject|xss|csrf|traversal|auth|secret|crypt/i.test(ruleId))
|
|
32
|
+
category = "security";
|
|
33
|
+
else if (/perf|cache|memory|leak|optim/i.test(ruleId))
|
|
34
|
+
category = "performance";
|
|
35
|
+
else if (/error|exception|throw|catch/i.test(ruleId))
|
|
36
|
+
category = "error-handling";
|
|
37
|
+
else if (/doc|comment|jsdoc|readme/i.test(ruleId))
|
|
38
|
+
category = "documentation";
|
|
39
|
+
else if (/test|assert|mock|coverage/i.test(ruleId))
|
|
40
|
+
category = "testing";
|
|
41
|
+
else if (/lint|format|naming|style/i.test(ruleId))
|
|
42
|
+
category = "code-style";
|
|
43
|
+
const existing = groups.get(category) || [];
|
|
44
|
+
existing.push(f);
|
|
45
|
+
groups.set(category, existing);
|
|
46
|
+
}
|
|
47
|
+
return groups;
|
|
48
|
+
}
|
|
49
|
+
// ─── Build clusters ─────────────────────────────────────────────────────────
|
|
50
|
+
function buildClusters(groups, strategy) {
|
|
51
|
+
const clusters = [];
|
|
52
|
+
let idx = 0;
|
|
53
|
+
for (const [key, findings] of groups) {
|
|
54
|
+
idx++;
|
|
55
|
+
const severities = {};
|
|
56
|
+
for (const f of findings) {
|
|
57
|
+
const s = f.severity || "unknown";
|
|
58
|
+
severities[s] = (severities[s] || 0) + 1;
|
|
59
|
+
}
|
|
60
|
+
const topFinding = findings.sort((a, b) => {
|
|
61
|
+
const order = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
62
|
+
return (order[a.severity] ?? 4) - (order[b.severity] ?? 4);
|
|
63
|
+
})[0];
|
|
64
|
+
clusters.push({
|
|
65
|
+
id: `${strategy}-${idx}`,
|
|
66
|
+
label: key,
|
|
67
|
+
pattern: strategy,
|
|
68
|
+
count: findings.length,
|
|
69
|
+
severities,
|
|
70
|
+
findings,
|
|
71
|
+
files: [],
|
|
72
|
+
recommendation: topFinding?.recommendation || "Review grouped findings",
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return clusters.sort((a, b) => b.count - a.count);
|
|
76
|
+
}
|
|
77
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
78
|
+
export function runFindingGroup(argv) {
|
|
79
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
80
|
+
console.log(`
|
|
81
|
+
judges finding-group — Group related findings into actionable clusters
|
|
82
|
+
|
|
83
|
+
Usage:
|
|
84
|
+
judges finding-group --input findings.json
|
|
85
|
+
judges finding-group --input findings.json --strategy severity
|
|
86
|
+
judges finding-group --input findings.json --format json
|
|
87
|
+
|
|
88
|
+
Options:
|
|
89
|
+
--input <file> JSON file with findings array (required)
|
|
90
|
+
--strategy <type> Grouping strategy: rule, severity, category (default: rule)
|
|
91
|
+
--format json JSON output
|
|
92
|
+
--min-count <n> Minimum findings to form a cluster (default: 1)
|
|
93
|
+
--help, -h Show this help
|
|
94
|
+
|
|
95
|
+
Strategies:
|
|
96
|
+
rule Group by rule ID (most specific)
|
|
97
|
+
severity Group by severity level
|
|
98
|
+
category Group by inferred category (security, performance, etc.)
|
|
99
|
+
|
|
100
|
+
Groups related findings to help you fix issues systematically rather
|
|
101
|
+
than one by one.
|
|
102
|
+
`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const inputPath = argv.find((_a, i) => argv[i - 1] === "--input");
|
|
106
|
+
const strategy = argv.find((_a, i) => argv[i - 1] === "--strategy") || "rule";
|
|
107
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
108
|
+
const minCountStr = argv.find((_a, i) => argv[i - 1] === "--min-count");
|
|
109
|
+
const minCount = minCountStr ? parseInt(minCountStr, 10) : 1;
|
|
110
|
+
if (!inputPath) {
|
|
111
|
+
console.error("Error: --input is required. Provide a JSON file with findings.");
|
|
112
|
+
process.exitCode = 1;
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
let findings;
|
|
116
|
+
try {
|
|
117
|
+
const raw = readFileSync(inputPath, "utf-8");
|
|
118
|
+
const parsed = JSON.parse(raw);
|
|
119
|
+
findings = Array.isArray(parsed) ? parsed : parsed.findings || [];
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
console.error(`Error: Cannot read or parse ${inputPath}`);
|
|
123
|
+
process.exitCode = 1;
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (findings.length === 0) {
|
|
127
|
+
console.log("No findings to group.");
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
let groups;
|
|
131
|
+
switch (strategy) {
|
|
132
|
+
case "severity":
|
|
133
|
+
groups = groupBySeverity(findings);
|
|
134
|
+
break;
|
|
135
|
+
case "category":
|
|
136
|
+
groups = groupByCategory(findings);
|
|
137
|
+
break;
|
|
138
|
+
default:
|
|
139
|
+
groups = groupByRule(findings);
|
|
140
|
+
}
|
|
141
|
+
let clusters = buildClusters(groups, strategy);
|
|
142
|
+
clusters = clusters.filter((c) => c.count >= minCount);
|
|
143
|
+
if (format === "json") {
|
|
144
|
+
console.log(JSON.stringify({
|
|
145
|
+
strategy,
|
|
146
|
+
totalFindings: findings.length,
|
|
147
|
+
clusterCount: clusters.length,
|
|
148
|
+
clusters: clusters.map((c) => ({ ...c, findings: undefined })),
|
|
149
|
+
}, null, 2));
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
console.log(`\n Finding Groups (strategy: ${strategy})\n ─────────────────────────────`);
|
|
153
|
+
console.log(` Total findings: ${findings.length}`);
|
|
154
|
+
console.log(` Clusters: ${clusters.length}\n`);
|
|
155
|
+
for (const cluster of clusters) {
|
|
156
|
+
const severitySummary = Object.entries(cluster.severities)
|
|
157
|
+
.map(([s, n]) => `${n} ${s}`)
|
|
158
|
+
.join(", ");
|
|
159
|
+
console.log(` [${cluster.id}] ${cluster.label} — ${cluster.count} finding(s)`);
|
|
160
|
+
console.log(` Severities: ${severitySummary}`);
|
|
161
|
+
console.log(` Recommendation: ${cluster.recommendation}`);
|
|
162
|
+
console.log();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=finding-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-group.js","sourceRoot":"","sources":["../../src/commands/finding-group.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-area.d.ts","sourceRoot":"","sources":["../../src/commands/focus-area.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsKH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoEjD"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Focus-area — Identify high-risk areas that need the most review attention
|
|
3
|
+
* based on code complexity and pattern density.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, readdirSync, statSync } from "fs";
|
|
6
|
+
import { join, extname, relative } from "path";
|
|
7
|
+
// ─── Patterns ──────────────────────────────────────────────────────────────
|
|
8
|
+
const RISK_PATTERNS = [
|
|
9
|
+
{ name: "hardcoded-secret", weight: 10, regex: /(?:password|secret|api_key|token)\s*[:=]\s*["'][^"']{8,}/i },
|
|
10
|
+
{ name: "eval-usage", weight: 10, regex: /\beval\s*\(/ },
|
|
11
|
+
{ name: "sql-concat", weight: 10, regex: /(?:query|execute)\s*\(\s*["'`].*\+/ },
|
|
12
|
+
{ name: "xss-risk", weight: 8, regex: /innerHTML\s*=|document\.write\s*\(/ },
|
|
13
|
+
{ name: "command-injection", weight: 10, regex: /exec(?:Sync)?\s*\(\s*`[^`]*\$\{/ },
|
|
14
|
+
{ name: "empty-catch", weight: 3, regex: /catch\s*\([^)]*\)\s*\{\s*\}/ },
|
|
15
|
+
{ name: "any-type", weight: 2, regex: /:\s*any\b/ },
|
|
16
|
+
{ name: "unsafe-regex", weight: 7, regex: /new\s+RegExp\s*\([^)]*\+/ },
|
|
17
|
+
{ name: "nested-callback", weight: 4, regex: /\)\s*=>\s*\{[^}]*\)\s*=>\s*\{/ },
|
|
18
|
+
{ name: "deep-nesting", weight: 5, regex: /^\s{16,}\S/ },
|
|
19
|
+
{ name: "deprecated-api", weight: 3, regex: /new\s+Buffer\s*\(|\.substr\s*\(/ },
|
|
20
|
+
];
|
|
21
|
+
// ─── Complexity estimation ─────────────────────────────────────────────────
|
|
22
|
+
function estimateComplexity(content) {
|
|
23
|
+
const lines = content.split("\n");
|
|
24
|
+
let complexity = 0;
|
|
25
|
+
for (const line of lines) {
|
|
26
|
+
// Control flow
|
|
27
|
+
if (/\b(?:if|else if|switch|case|while|for|catch)\b/.test(line))
|
|
28
|
+
complexity++;
|
|
29
|
+
// Logical operators
|
|
30
|
+
if (/&&|\|\|/.test(line))
|
|
31
|
+
complexity++;
|
|
32
|
+
// Ternary
|
|
33
|
+
if (/[^?][?][^?]/.test(line))
|
|
34
|
+
complexity += 0.5;
|
|
35
|
+
// Nested functions
|
|
36
|
+
if (/(?:function\s+\w+|=>\s*\{)/.test(line))
|
|
37
|
+
complexity += 0.5;
|
|
38
|
+
}
|
|
39
|
+
return Math.round(complexity);
|
|
40
|
+
}
|
|
41
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
42
|
+
function collectSourceFiles(dir) {
|
|
43
|
+
const exts = new Set([".ts", ".js", ".tsx", ".jsx", ".py", ".java", ".go", ".rs", ".cs"]);
|
|
44
|
+
const files = [];
|
|
45
|
+
const skipDirs = new Set(["node_modules", ".git", "dist", "build", "coverage"]);
|
|
46
|
+
function walk(d) {
|
|
47
|
+
let entries;
|
|
48
|
+
try {
|
|
49
|
+
entries = readdirSync(d);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
for (const name of entries) {
|
|
55
|
+
if (skipDirs.has(name))
|
|
56
|
+
continue;
|
|
57
|
+
const full = join(d, name);
|
|
58
|
+
try {
|
|
59
|
+
const st = statSync(full);
|
|
60
|
+
if (st.isDirectory())
|
|
61
|
+
walk(full);
|
|
62
|
+
else if (exts.has(extname(name)))
|
|
63
|
+
files.push(full);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// skip
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
walk(dir);
|
|
71
|
+
return files;
|
|
72
|
+
}
|
|
73
|
+
function analyzeRisk(files, baseDir) {
|
|
74
|
+
const fileRisks = [];
|
|
75
|
+
for (const filePath of files) {
|
|
76
|
+
let content;
|
|
77
|
+
try {
|
|
78
|
+
content = readFileSync(filePath, "utf-8");
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const lines = content.split("\n");
|
|
84
|
+
const lineCount = lines.length;
|
|
85
|
+
const complexity = estimateComplexity(content);
|
|
86
|
+
const patternHits = new Map();
|
|
87
|
+
let totalWeight = 0;
|
|
88
|
+
for (const line of lines) {
|
|
89
|
+
for (const pat of RISK_PATTERNS) {
|
|
90
|
+
if (pat.regex.test(line)) {
|
|
91
|
+
totalWeight += pat.weight;
|
|
92
|
+
patternHits.set(pat.name, (patternHits.get(pat.name) || 0) + 1);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const findingCount = [...patternHits.values()].reduce((a, b) => a + b, 0);
|
|
97
|
+
const patternDensity = lineCount > 0 ? Math.round((findingCount / lineCount) * 1000) / 10 : 0;
|
|
98
|
+
// Risk score: weighted sum of complexity, pattern weight, and density
|
|
99
|
+
const riskScore = Math.round(complexity * 0.3 + totalWeight * 2 + patternDensity * 10);
|
|
100
|
+
if (riskScore > 0) {
|
|
101
|
+
const topPatterns = [...patternHits.entries()]
|
|
102
|
+
.sort((a, b) => b[1] - a[1])
|
|
103
|
+
.slice(0, 3)
|
|
104
|
+
.map(([name]) => name);
|
|
105
|
+
fileRisks.push({
|
|
106
|
+
file: relative(baseDir, filePath),
|
|
107
|
+
riskScore,
|
|
108
|
+
complexity,
|
|
109
|
+
patternDensity,
|
|
110
|
+
lineCount,
|
|
111
|
+
findingCount,
|
|
112
|
+
topPatterns,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
fileRisks.sort((a, b) => b.riskScore - a.riskScore);
|
|
117
|
+
const distribution = { high: 0, medium: 0, low: 0 };
|
|
118
|
+
for (const fr of fileRisks) {
|
|
119
|
+
if (fr.riskScore >= 50)
|
|
120
|
+
distribution.high++;
|
|
121
|
+
else if (fr.riskScore >= 20)
|
|
122
|
+
distribution.medium++;
|
|
123
|
+
else
|
|
124
|
+
distribution.low++;
|
|
125
|
+
}
|
|
126
|
+
const summary = distribution.high > 0
|
|
127
|
+
? `${distribution.high} high-risk file(s) need immediate review attention.`
|
|
128
|
+
: fileRisks.length > 0
|
|
129
|
+
? `No critical risk areas. ${fileRisks.length} files have minor improvements available.`
|
|
130
|
+
: "No risk areas detected in scanned files.";
|
|
131
|
+
return {
|
|
132
|
+
filesAnalyzed: files.length,
|
|
133
|
+
highRiskFiles: fileRisks.slice(0, 20),
|
|
134
|
+
riskDistribution: distribution,
|
|
135
|
+
summary,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
139
|
+
export function runFocusArea(argv) {
|
|
140
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
141
|
+
console.log(`
|
|
142
|
+
judges focus-area — Identify high-risk areas needing review attention
|
|
143
|
+
|
|
144
|
+
Usage:
|
|
145
|
+
judges focus-area [dir] Analyze risk areas
|
|
146
|
+
judges focus-area --top 10 Show top N files
|
|
147
|
+
judges focus-area --format json JSON output
|
|
148
|
+
|
|
149
|
+
Options:
|
|
150
|
+
[dir] Target directory (default: .)
|
|
151
|
+
--top <n> Number of files to show (default: 20)
|
|
152
|
+
--format json JSON output
|
|
153
|
+
--help, -h Show this help
|
|
154
|
+
|
|
155
|
+
Combines code complexity and security pattern density to rank files by
|
|
156
|
+
risk. Use this to prioritize review effort where it matters most.
|
|
157
|
+
`);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
161
|
+
const dir = argv.find((a) => !a.startsWith("-") &&
|
|
162
|
+
a !== "focus-area" &&
|
|
163
|
+
argv[argv.indexOf(a) - 1] !== "--format" &&
|
|
164
|
+
argv[argv.indexOf(a) - 1] !== "--top") || ".";
|
|
165
|
+
const topN = parseInt(argv.find((_a, i) => argv[i - 1] === "--top") || "20", 10);
|
|
166
|
+
const files = collectSourceFiles(dir);
|
|
167
|
+
if (files.length === 0) {
|
|
168
|
+
console.log("No source files found.");
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const result = analyzeRisk(files, dir);
|
|
172
|
+
if (format === "json") {
|
|
173
|
+
console.log(JSON.stringify(result, null, 2));
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
console.log(`\n Focus Area Analysis\n ─────────────────────────────`);
|
|
177
|
+
console.log(` Files analyzed: ${result.filesAnalyzed}`);
|
|
178
|
+
console.log(` Risk distribution: 🔴 ${result.riskDistribution.high} high 🟡 ${result.riskDistribution.medium} medium 🟢 ${result.riskDistribution.low} low`);
|
|
179
|
+
console.log(`\n ${result.summary}`);
|
|
180
|
+
const display = result.highRiskFiles.slice(0, topN);
|
|
181
|
+
if (display.length > 0) {
|
|
182
|
+
console.log("\n Highest risk files:");
|
|
183
|
+
for (const fr of display) {
|
|
184
|
+
const icon = fr.riskScore >= 50 ? "🔴" : fr.riskScore >= 20 ? "🟡" : "🟢";
|
|
185
|
+
console.log(` ${icon} [${fr.riskScore}] ${fr.file} (${fr.lineCount} lines, ${fr.findingCount} findings, complexity: ${fr.complexity})`);
|
|
186
|
+
if (fr.topPatterns.length > 0) {
|
|
187
|
+
console.log(` Top patterns: ${fr.topPatterns.join(", ")}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
console.log();
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=focus-area.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-area.js","sourceRoot":"","sources":["../../src/commands/focus-area.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ignore-list — Configurable ignore patterns for files, directories, and rules.
|
|
3
|
+
*/
|
|
4
|
+
interface IgnoreConfig {
|
|
5
|
+
version: string;
|
|
6
|
+
filePatterns: string[];
|
|
7
|
+
directoryPatterns: string[];
|
|
8
|
+
ruleIgnores: string[];
|
|
9
|
+
inlineSuppressions: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare function shouldIgnoreFile(filePath: string, baseDir: string, config: IgnoreConfig): boolean;
|
|
12
|
+
declare function shouldIgnoreRule(ruleId: string, config: IgnoreConfig): boolean;
|
|
13
|
+
declare function filterFiles(files: string[], baseDir: string, config: IgnoreConfig): {
|
|
14
|
+
effective: string[];
|
|
15
|
+
ignored: string[];
|
|
16
|
+
};
|
|
17
|
+
export declare function runIgnoreList(argv: string[]): void;
|
|
18
|
+
export { shouldIgnoreFile, shouldIgnoreRule, filterFiles, IgnoreConfig };
|
|
19
|
+
//# sourceMappingURL=ignore-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore-list.d.ts","sourceRoot":"","sources":["../../src/commands/ignore-list.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2BH,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAgCD,iBAAS,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAc1F;AAED,iBAAS,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAEvE;AAED,iBAAS,WAAW,CAClB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,GACnB;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAa5C;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA8FlD;AAGD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ignore-list — Configurable ignore patterns for files, directories, and rules.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
5
|
+
import { join, relative } from "path";
|
|
6
|
+
// ─── Simple glob matcher ────────────────────────────────────────────────────
|
|
7
|
+
function globToRegex(pattern) {
|
|
8
|
+
const regex = pattern
|
|
9
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&") // Escape special regex chars (but not * and ?)
|
|
10
|
+
.replace(/\*\*/g, "{{GLOBSTAR}}") // Temp placeholder for **
|
|
11
|
+
.replace(/\*/g, "[^/]*") // * matches anything except /
|
|
12
|
+
.replace(/\?/g, "[^/]") // ? matches single char except /
|
|
13
|
+
.replace(/\{\{GLOBSTAR\}\}/g, ".*"); // ** matches everything including /
|
|
14
|
+
return new RegExp(`^${regex}$`);
|
|
15
|
+
}
|
|
16
|
+
function matchGlob(filePath, pattern) {
|
|
17
|
+
try {
|
|
18
|
+
return globToRegex(pattern).test(filePath);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// ─── Default config ────────────────────────────────────────────────────────
|
|
25
|
+
function defaultIgnoreConfig() {
|
|
26
|
+
return {
|
|
27
|
+
version: "1.0.0",
|
|
28
|
+
filePatterns: [
|
|
29
|
+
"**/*.test.ts",
|
|
30
|
+
"**/*.test.js",
|
|
31
|
+
"**/*.spec.ts",
|
|
32
|
+
"**/*.spec.js",
|
|
33
|
+
"**/*.d.ts",
|
|
34
|
+
"**/fixtures/**",
|
|
35
|
+
"**/testdata/**",
|
|
36
|
+
],
|
|
37
|
+
directoryPatterns: ["node_modules", "dist", "build", "coverage", ".git", ".next", "__pycache__", "vendor"],
|
|
38
|
+
ruleIgnores: [],
|
|
39
|
+
inlineSuppressions: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// ─── Matching engine ───────────────────────────────────────────────────────
|
|
43
|
+
function shouldIgnoreFile(filePath, baseDir, config) {
|
|
44
|
+
const rel = relative(baseDir, filePath).replace(/\\/g, "/");
|
|
45
|
+
for (const pattern of config.filePatterns) {
|
|
46
|
+
if (matchGlob(rel, pattern))
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
// Check directory patterns
|
|
50
|
+
const parts = rel.split("/");
|
|
51
|
+
for (const dir of config.directoryPatterns) {
|
|
52
|
+
if (parts.includes(dir))
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
function shouldIgnoreRule(ruleId, config) {
|
|
58
|
+
return config.ruleIgnores.includes(ruleId);
|
|
59
|
+
}
|
|
60
|
+
function filterFiles(files, baseDir, config) {
|
|
61
|
+
const effective = [];
|
|
62
|
+
const ignored = [];
|
|
63
|
+
for (const f of files) {
|
|
64
|
+
if (shouldIgnoreFile(f, baseDir, config)) {
|
|
65
|
+
ignored.push(f);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
effective.push(f);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { effective, ignored };
|
|
72
|
+
}
|
|
73
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
74
|
+
export function runIgnoreList(argv) {
|
|
75
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
76
|
+
console.log(`
|
|
77
|
+
judges ignore-list — Manage review ignore patterns
|
|
78
|
+
|
|
79
|
+
Usage:
|
|
80
|
+
judges ignore-list init Create .judgesignore.json template
|
|
81
|
+
judges ignore-list show Show current ignore config
|
|
82
|
+
judges ignore-list test <path> Test if a path would be ignored
|
|
83
|
+
judges ignore-list --format json JSON output
|
|
84
|
+
|
|
85
|
+
Subcommands:
|
|
86
|
+
init Create a .judgesignore.json template
|
|
87
|
+
show Display current ignore configuration
|
|
88
|
+
test <path> Test whether a specific path is ignored
|
|
89
|
+
|
|
90
|
+
Options:
|
|
91
|
+
--format json JSON output
|
|
92
|
+
--help, -h Show this help
|
|
93
|
+
|
|
94
|
+
Ignore patterns are stored in .judgesignore.json and control which files,
|
|
95
|
+
directories, and rules are excluded from review.
|
|
96
|
+
`);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
100
|
+
const configPath = join(".", ".judgesignore.json");
|
|
101
|
+
const subcommand = argv.find((a) => !a.startsWith("-") && a !== "ignore-list") || "show";
|
|
102
|
+
if (subcommand === "init") {
|
|
103
|
+
if (existsSync(configPath)) {
|
|
104
|
+
console.error("Error: .judgesignore.json already exists.");
|
|
105
|
+
process.exitCode = 1;
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
writeFileSync(configPath, JSON.stringify(defaultIgnoreConfig(), null, 2), "utf-8");
|
|
109
|
+
console.log("Created .judgesignore.json with default patterns.");
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Load config
|
|
113
|
+
let config;
|
|
114
|
+
if (existsSync(configPath)) {
|
|
115
|
+
try {
|
|
116
|
+
config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
console.error("Error: .judgesignore.json is not valid JSON.");
|
|
120
|
+
process.exitCode = 1;
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
config = defaultIgnoreConfig();
|
|
126
|
+
}
|
|
127
|
+
if (subcommand === "test") {
|
|
128
|
+
const testPath = argv.find((a) => !a.startsWith("-") && a !== "ignore-list" && a !== "test");
|
|
129
|
+
if (!testPath) {
|
|
130
|
+
console.error("Error: Provide a path to test.");
|
|
131
|
+
process.exitCode = 1;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const ignored = shouldIgnoreFile(testPath, ".", config);
|
|
135
|
+
if (format === "json") {
|
|
136
|
+
console.log(JSON.stringify({ path: testPath, ignored }));
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.log(` ${testPath}: ${ignored ? "❌ IGNORED" : "✅ INCLUDED"}`);
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// Show
|
|
144
|
+
if (format === "json") {
|
|
145
|
+
console.log(JSON.stringify(config, null, 2));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
console.log(`\n Ignore Configuration\n ─────────────────────────────`);
|
|
149
|
+
console.log(` Source: ${existsSync(configPath) ? configPath : "defaults (no .judgesignore.json)"}`);
|
|
150
|
+
console.log(`\n File Patterns (${config.filePatterns.length}):`);
|
|
151
|
+
for (const p of config.filePatterns)
|
|
152
|
+
console.log(` ⬜ ${p}`);
|
|
153
|
+
console.log(`\n Directory Patterns (${config.directoryPatterns.length}):`);
|
|
154
|
+
for (const p of config.directoryPatterns)
|
|
155
|
+
console.log(` ⬜ ${p}`);
|
|
156
|
+
if (config.ruleIgnores.length > 0) {
|
|
157
|
+
console.log(`\n Ignored Rules (${config.ruleIgnores.length}):`);
|
|
158
|
+
for (const r of config.ruleIgnores)
|
|
159
|
+
console.log(` ⬜ ${r}`);
|
|
160
|
+
}
|
|
161
|
+
console.log(`\n Inline suppressions: ${config.inlineSuppressions ? "enabled" : "disabled"}`);
|
|
162
|
+
console.log();
|
|
163
|
+
}
|
|
164
|
+
// Export helpers for use by other commands
|
|
165
|
+
export { shouldIgnoreFile, shouldIgnoreRule, filterFiles };
|
|
166
|
+
//# sourceMappingURL=ignore-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore-list.js","sourceRoot":"","sources":["../../src/commands/ignore-list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEtC,+EAA+E;AAE/E,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,+CAA+C;SACpF,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,0BAA0B;SAC3D,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,8BAA8B;SACtD,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,iCAAiC;SACxD,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAC,oCAAoC;IAC3E,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,OAAe;IAClD,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAoBD,8EAA8E;AAE9E,SAAS,mBAAmB;IAC1B,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,YAAY,EAAE;YACZ,cAAc;YACd,cAAc;YACd,cAAc;YACd,cAAc;YACd,WAAW;YACX,gBAAgB;YAChB,gBAAgB;SACjB;QACD,iBAAiB,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC;QAC1G,WAAW,EAAE,EAAE;QACf,kBAAkB,EAAE,IAAI;KACzB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,QAAgB,EAAE,OAAe,EAAE,MAAoB;IAC/E,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE5D,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAC1C,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;IAC3C,CAAC;IAED,2BAA2B;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IACvC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc,EAAE,MAAoB;IAC5D,OAAO,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,WAAW,CAClB,KAAe,EACf,OAAe,EACf,MAAoB;IAEpB,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;CAoBf,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,GAAG,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,IAAI,MAAM,CAAC;IAEzF,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC3D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,cAAc;IACd,IAAI,MAAoB,CAAC;IACzB,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAiB,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC9D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACjC,CAAC;IAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC;QAC7F,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO;IACT,CAAC;IAED,OAAO;IACP,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kCAAkC,EAAE,CAAC,CAAC;IAEvG,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC;IACpE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,YAAY;QAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,CAAC,iBAAiB,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9E,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,iBAAiB;QAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAEtE,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC;QACnE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,2CAA2C;AAC3C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-review.d.ts","sourceRoot":"","sources":["../../src/commands/incremental-review.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2IH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsIzD"}
|