@kevinrabun/judges 3.48.0 → 3.50.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 +24 -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/api-audit.d.ts +9 -0
- package/dist/commands/api-audit.d.ts.map +1 -0
- package/dist/commands/api-audit.js +360 -0
- package/dist/commands/api-audit.js.map +1 -0
- package/dist/commands/compliance-map.d.ts +9 -0
- package/dist/commands/compliance-map.d.ts.map +1 -0
- package/dist/commands/compliance-map.js +375 -0
- package/dist/commands/compliance-map.js.map +1 -0
- package/dist/commands/exec-report.d.ts +9 -0
- package/dist/commands/exec-report.d.ts.map +1 -0
- package/dist/commands/exec-report.js +272 -0
- package/dist/commands/exec-report.js.map +1 -0
- package/dist/commands/guided-tour.d.ts +9 -0
- package/dist/commands/guided-tour.d.ts.map +1 -0
- package/dist/commands/guided-tour.js +288 -0
- package/dist/commands/guided-tour.js.map +1 -0
- package/dist/commands/iac-lint.d.ts +8 -0
- package/dist/commands/iac-lint.d.ts.map +1 -0
- package/dist/commands/iac-lint.js +313 -0
- package/dist/commands/iac-lint.js.map +1 -0
- package/dist/commands/incident-response.d.ts +8 -0
- package/dist/commands/incident-response.d.ts.map +1 -0
- package/dist/commands/incident-response.js +255 -0
- package/dist/commands/incident-response.js.map +1 -0
- package/dist/commands/learning-path.d.ts +9 -0
- package/dist/commands/learning-path.d.ts.map +1 -0
- package/dist/commands/learning-path.js +326 -0
- package/dist/commands/learning-path.js.map +1 -0
- package/dist/commands/license-scan.d.ts +9 -0
- package/dist/commands/license-scan.d.ts.map +1 -0
- package/dist/commands/license-scan.js +180 -0
- package/dist/commands/license-scan.js.map +1 -0
- package/dist/commands/org-policy.d.ts +8 -0
- package/dist/commands/org-policy.d.ts.map +1 -0
- package/dist/commands/org-policy.js +208 -0
- package/dist/commands/org-policy.js.map +1 -0
- package/dist/commands/perf-compare.d.ts +9 -0
- package/dist/commands/perf-compare.d.ts.map +1 -0
- package/dist/commands/perf-compare.js +246 -0
- package/dist/commands/perf-compare.js.map +1 -0
- package/dist/commands/pii-scan.d.ts +8 -0
- package/dist/commands/pii-scan.d.ts.map +1 -0
- package/dist/commands/pii-scan.js +300 -0
- package/dist/commands/pii-scan.js.map +1 -0
- package/dist/commands/predict.d.ts +8 -0
- package/dist/commands/predict.d.ts.map +1 -0
- package/dist/commands/predict.js +219 -0
- package/dist/commands/predict.js.map +1 -0
- package/dist/commands/risk-heatmap.d.ts +8 -0
- package/dist/commands/risk-heatmap.d.ts.map +1 -0
- package/dist/commands/risk-heatmap.js +224 -0
- package/dist/commands/risk-heatmap.js.map +1 -0
- package/dist/commands/sbom-export.d.ts +8 -0
- package/dist/commands/sbom-export.d.ts.map +1 -0
- package/dist/commands/sbom-export.js +162 -0
- package/dist/commands/sbom-export.js.map +1 -0
- package/dist/commands/secret-scan.d.ts +8 -0
- package/dist/commands/secret-scan.d.ts.map +1 -0
- package/dist/commands/secret-scan.js +245 -0
- package/dist/commands/secret-scan.js.map +1 -0
- package/dist/commands/test-correlate.d.ts +8 -0
- package/dist/commands/test-correlate.d.ts.map +1 -0
- package/dist/commands/test-correlate.js +222 -0
- package/dist/commands/test-correlate.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Org policy — defines, validates, and enforces organization-wide
|
|
3
|
+
* policy manifests that cascade into per-repo .judgesrc files.
|
|
4
|
+
*
|
|
5
|
+
* All data stored locally.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, mkdirSync, writeFileSync } from "fs";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
// ─── Default Policy ─────────────────────────────────────────────────────────
|
|
10
|
+
const DEFAULT_POLICY = {
|
|
11
|
+
name: "default",
|
|
12
|
+
version: "1.0.0",
|
|
13
|
+
minSeverity: "medium",
|
|
14
|
+
requiredJudges: [],
|
|
15
|
+
bannedRules: [],
|
|
16
|
+
maxSuppressionsPerRepo: 50,
|
|
17
|
+
requiredPreset: "",
|
|
18
|
+
enforcedOptions: {},
|
|
19
|
+
lastUpdated: new Date().toISOString(),
|
|
20
|
+
};
|
|
21
|
+
// ─── Compliance Check ───────────────────────────────────────────────────────
|
|
22
|
+
function checkCompliance(policy) {
|
|
23
|
+
const violations = [];
|
|
24
|
+
const warnings = [];
|
|
25
|
+
// Check .judgesrc exists
|
|
26
|
+
if (!existsSync(".judgesrc")) {
|
|
27
|
+
violations.push("Missing .judgesrc configuration file");
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
try {
|
|
31
|
+
const config = JSON.parse(readFileSync(".judgesrc", "utf-8"));
|
|
32
|
+
// Check min severity
|
|
33
|
+
if (policy.minSeverity) {
|
|
34
|
+
const sevOrder = ["critical", "high", "medium", "low", "info"];
|
|
35
|
+
const policyIdx = sevOrder.indexOf(policy.minSeverity);
|
|
36
|
+
const configIdx = sevOrder.indexOf(config.minSeverity || "low");
|
|
37
|
+
if (configIdx > policyIdx) {
|
|
38
|
+
violations.push(`minSeverity '${config.minSeverity || "low"}' is less strict than policy requirement '${policy.minSeverity}'`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Check required judges
|
|
42
|
+
const disabledJudges = config.disabledJudges || [];
|
|
43
|
+
for (const required of policy.requiredJudges) {
|
|
44
|
+
if (disabledJudges.includes(required)) {
|
|
45
|
+
violations.push(`Required judge '${required}' is disabled in .judgesrc`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Check banned rules
|
|
49
|
+
const enabledRules = config.ruleOverrides ? Object.keys(config.ruleOverrides) : [];
|
|
50
|
+
for (const banned of policy.bannedRules) {
|
|
51
|
+
if (enabledRules.includes(banned)) {
|
|
52
|
+
warnings.push(`Banned rule '${banned}' has overrides in .judgesrc`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Check preset
|
|
56
|
+
if (policy.requiredPreset && config.preset !== policy.requiredPreset) {
|
|
57
|
+
violations.push(`Required preset '${policy.requiredPreset}' not configured (found: '${config.preset || "none"}')`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
violations.push("Invalid .judgesrc — cannot parse JSON");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Check suppressions count
|
|
65
|
+
if (existsSync(".judges-suppressions.json")) {
|
|
66
|
+
try {
|
|
67
|
+
const supps = JSON.parse(readFileSync(".judges-suppressions.json", "utf-8"));
|
|
68
|
+
const count = Array.isArray(supps) ? supps.length : supps.suppressions?.length || 0;
|
|
69
|
+
if (count > policy.maxSuppressionsPerRepo) {
|
|
70
|
+
violations.push(`Suppressions count (${count}) exceeds policy limit (${policy.maxSuppressionsPerRepo})`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
/* skip */
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
compliant: violations.length === 0,
|
|
79
|
+
violations,
|
|
80
|
+
warnings,
|
|
81
|
+
checkedAt: new Date().toISOString(),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
85
|
+
const STORE = ".judges-org-policy";
|
|
86
|
+
export function runOrgPolicy(argv) {
|
|
87
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
88
|
+
console.log(`
|
|
89
|
+
judges org-policy — Organization-wide policy management
|
|
90
|
+
|
|
91
|
+
Usage:
|
|
92
|
+
judges org-policy --init
|
|
93
|
+
judges org-policy --check
|
|
94
|
+
judges org-policy --show
|
|
95
|
+
judges org-policy --set-required-judges "owasp-judge,crypto-judge"
|
|
96
|
+
judges org-policy --set-min-severity medium
|
|
97
|
+
|
|
98
|
+
Options:
|
|
99
|
+
--init Create default org policy file
|
|
100
|
+
--check Check repo compliance against org policy
|
|
101
|
+
--show Show current org policy
|
|
102
|
+
--set-required-judges Comma-separated list of required judge IDs
|
|
103
|
+
--set-banned-rules Comma-separated list of banned rule IDs
|
|
104
|
+
--set-min-severity Minimum severity level
|
|
105
|
+
--set-preset Required preset name
|
|
106
|
+
--set-max-suppressions Maximum allowed suppressions per repo
|
|
107
|
+
--format json JSON output
|
|
108
|
+
--help, -h Show this help
|
|
109
|
+
`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
113
|
+
const policyPath = join(STORE, "org-policy.json");
|
|
114
|
+
// Init
|
|
115
|
+
if (argv.includes("--init")) {
|
|
116
|
+
if (!existsSync(STORE))
|
|
117
|
+
mkdirSync(STORE, { recursive: true });
|
|
118
|
+
if (existsSync(policyPath)) {
|
|
119
|
+
console.log(" Org policy already exists. Edit directly or use --set-* options.");
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
writeFileSync(policyPath, JSON.stringify(DEFAULT_POLICY, null, 2));
|
|
123
|
+
console.log(` Initialized org policy at ${policyPath}`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// Load policy
|
|
127
|
+
let policy;
|
|
128
|
+
if (existsSync(policyPath)) {
|
|
129
|
+
policy = JSON.parse(readFileSync(policyPath, "utf-8"));
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
if (!argv.includes("--init")) {
|
|
133
|
+
console.log(" No org policy found. Run --init to create one.");
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
policy = DEFAULT_POLICY;
|
|
137
|
+
}
|
|
138
|
+
// Set options
|
|
139
|
+
let modified = false;
|
|
140
|
+
const reqJudges = argv.find((_a, i) => argv[i - 1] === "--set-required-judges");
|
|
141
|
+
if (reqJudges) {
|
|
142
|
+
policy.requiredJudges = reqJudges.split(",");
|
|
143
|
+
modified = true;
|
|
144
|
+
}
|
|
145
|
+
const bannedRules = argv.find((_a, i) => argv[i - 1] === "--set-banned-rules");
|
|
146
|
+
if (bannedRules) {
|
|
147
|
+
policy.bannedRules = bannedRules.split(",");
|
|
148
|
+
modified = true;
|
|
149
|
+
}
|
|
150
|
+
const minSev = argv.find((_a, i) => argv[i - 1] === "--set-min-severity");
|
|
151
|
+
if (minSev) {
|
|
152
|
+
policy.minSeverity = minSev;
|
|
153
|
+
modified = true;
|
|
154
|
+
}
|
|
155
|
+
const preset = argv.find((_a, i) => argv[i - 1] === "--set-preset");
|
|
156
|
+
if (preset) {
|
|
157
|
+
policy.requiredPreset = preset;
|
|
158
|
+
modified = true;
|
|
159
|
+
}
|
|
160
|
+
const maxSupp = argv.find((_a, i) => argv[i - 1] === "--set-max-suppressions");
|
|
161
|
+
if (maxSupp) {
|
|
162
|
+
policy.maxSuppressionsPerRepo = parseInt(maxSupp, 10);
|
|
163
|
+
modified = true;
|
|
164
|
+
}
|
|
165
|
+
if (modified) {
|
|
166
|
+
policy.lastUpdated = new Date().toISOString();
|
|
167
|
+
if (!existsSync(STORE))
|
|
168
|
+
mkdirSync(STORE, { recursive: true });
|
|
169
|
+
writeFileSync(policyPath, JSON.stringify(policy, null, 2));
|
|
170
|
+
console.log(" Org policy updated.");
|
|
171
|
+
}
|
|
172
|
+
// Check compliance
|
|
173
|
+
if (argv.includes("--check")) {
|
|
174
|
+
const result = checkCompliance(policy);
|
|
175
|
+
if (format === "json") {
|
|
176
|
+
console.log(JSON.stringify(result, null, 2));
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
console.log(`\n Org Policy Compliance\n ──────────────────────────`);
|
|
180
|
+
console.log(` Status: ${result.compliant ? "✅ Compliant" : "❌ Non-compliant"}\n`);
|
|
181
|
+
for (const v of result.violations)
|
|
182
|
+
console.log(` ❌ ${v}`);
|
|
183
|
+
for (const w of result.warnings)
|
|
184
|
+
console.log(` ⚠️ ${w}`);
|
|
185
|
+
if (result.compliant && result.warnings.length === 0)
|
|
186
|
+
console.log(` All checks passed`);
|
|
187
|
+
console.log("");
|
|
188
|
+
}
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Show
|
|
192
|
+
if (argv.includes("--show") || !modified) {
|
|
193
|
+
if (format === "json") {
|
|
194
|
+
console.log(JSON.stringify(policy, null, 2));
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
console.log(`\n Org Policy: ${policy.name} v${policy.version}`);
|
|
198
|
+
console.log(` ──────────────────────────`);
|
|
199
|
+
console.log(` Min severity: ${policy.minSeverity}`);
|
|
200
|
+
console.log(` Required preset: ${policy.requiredPreset || "(none)"}`);
|
|
201
|
+
console.log(` Required judges: ${policy.requiredJudges.length > 0 ? policy.requiredJudges.join(", ") : "(none)"}`);
|
|
202
|
+
console.log(` Banned rules: ${policy.bannedRules.length > 0 ? policy.bannedRules.join(", ") : "(none)"}`);
|
|
203
|
+
console.log(` Max suppressions: ${policy.maxSuppressionsPerRepo}`);
|
|
204
|
+
console.log(` Last updated: ${policy.lastUpdated}\n`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=org-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-policy.js","sourceRoot":"","sources":["../../src/commands/org-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perf compare — before/after performance comparison of code changes.
|
|
3
|
+
* Compares algorithmic complexity, loop nesting, allocation patterns,
|
|
4
|
+
* and async anti-patterns between two code versions.
|
|
5
|
+
*
|
|
6
|
+
* All analysis local.
|
|
7
|
+
*/
|
|
8
|
+
export declare function runPerfCompare(argv: string[]): void;
|
|
9
|
+
//# sourceMappingURL=perf-compare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-compare.d.ts","sourceRoot":"","sources":["../../src/commands/perf-compare.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4KH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkHnD"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perf compare — before/after performance comparison of code changes.
|
|
3
|
+
* Compares algorithmic complexity, loop nesting, allocation patterns,
|
|
4
|
+
* and async anti-patterns between two code versions.
|
|
5
|
+
*
|
|
6
|
+
* All analysis local.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync } from "fs";
|
|
9
|
+
// ─── Analysers ──────────────────────────────────────────────────────────────
|
|
10
|
+
function analyzePerformance(content) {
|
|
11
|
+
const lines = content.split("\n");
|
|
12
|
+
// Loop depth
|
|
13
|
+
let maxLoopDepth = 0;
|
|
14
|
+
let currentDepth = 0;
|
|
15
|
+
let loopCount = 0;
|
|
16
|
+
for (const line of lines) {
|
|
17
|
+
if (/\b(?:for|while|do)\s*\(/.test(line) || /\.(?:forEach|map|filter|reduce|flatMap|some|every)\s*\(/.test(line)) {
|
|
18
|
+
currentDepth++;
|
|
19
|
+
loopCount++;
|
|
20
|
+
maxLoopDepth = Math.max(maxLoopDepth, currentDepth);
|
|
21
|
+
}
|
|
22
|
+
// Rough depth tracking by braces
|
|
23
|
+
const opens = (line.match(/{/g) || []).length;
|
|
24
|
+
const closes = (line.match(/}/g) || []).length;
|
|
25
|
+
if (closes > opens && currentDepth > 0)
|
|
26
|
+
currentDepth--;
|
|
27
|
+
}
|
|
28
|
+
// Allocations (new, object/array literals in loops)
|
|
29
|
+
let allocations = 0;
|
|
30
|
+
for (const line of lines) {
|
|
31
|
+
if (/\bnew\s+\w+/.test(line))
|
|
32
|
+
allocations++;
|
|
33
|
+
if (/(?:new\s+Array|new\s+Object|\[\s*\]|\{\s*\})\s*;?\s*$/.test(line.trim()))
|
|
34
|
+
allocations++;
|
|
35
|
+
}
|
|
36
|
+
// Async anti-patterns
|
|
37
|
+
let asyncAntiPatterns = 0;
|
|
38
|
+
for (let i = 0; i < lines.length; i++) {
|
|
39
|
+
// await in loop
|
|
40
|
+
if (/\bawait\b/.test(lines[i]) && currentDepth > 0)
|
|
41
|
+
asyncAntiPatterns++;
|
|
42
|
+
// sequential awaits that could be parallel
|
|
43
|
+
if (/\bawait\b/.test(lines[i]) && i > 0 && /\bawait\b/.test(lines[i - 1]))
|
|
44
|
+
asyncAntiPatterns++;
|
|
45
|
+
}
|
|
46
|
+
// Recursive calls
|
|
47
|
+
let recursiveCalls = 0;
|
|
48
|
+
const fnNames = [];
|
|
49
|
+
for (const line of lines) {
|
|
50
|
+
const fnMatch = line.match(/(?:function\s+(\w+)|(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s+)?(?:\(|function))/);
|
|
51
|
+
if (fnMatch)
|
|
52
|
+
fnNames.push(fnMatch[1] || fnMatch[2]);
|
|
53
|
+
}
|
|
54
|
+
for (const line of lines) {
|
|
55
|
+
for (const fn of fnNames) {
|
|
56
|
+
if (fn && new RegExp(`\\b${fn}\\s*\\(`).test(line)) {
|
|
57
|
+
const fnDef = lines.find((l) => l.includes(`function ${fn}`) || l.includes(`${fn} =`));
|
|
58
|
+
if (fnDef && fnDef !== line)
|
|
59
|
+
recursiveCalls++;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Regex count (complex regex can be perf bottleneck)
|
|
64
|
+
let regexCount = 0;
|
|
65
|
+
for (const line of lines) {
|
|
66
|
+
if (/new\s+RegExp|\/[^/]+\/[gimsuy]*/.test(line))
|
|
67
|
+
regexCount++;
|
|
68
|
+
}
|
|
69
|
+
// String concatenation in loops
|
|
70
|
+
let stringConcat = 0;
|
|
71
|
+
for (const line of lines) {
|
|
72
|
+
if (/\+=\s*["'`]|["'`]\s*\+/.test(line))
|
|
73
|
+
stringConcat++;
|
|
74
|
+
}
|
|
75
|
+
// Nested callbacks
|
|
76
|
+
let nestedCallbacks = 0;
|
|
77
|
+
let callbackDepth = 0;
|
|
78
|
+
for (const line of lines) {
|
|
79
|
+
if (/\bcallback\b|function\s*\(|=>\s*{/.test(line)) {
|
|
80
|
+
callbackDepth++;
|
|
81
|
+
if (callbackDepth >= 3)
|
|
82
|
+
nestedCallbacks++;
|
|
83
|
+
}
|
|
84
|
+
if (/}\s*\)/.test(line) && callbackDepth > 0)
|
|
85
|
+
callbackDepth--;
|
|
86
|
+
}
|
|
87
|
+
// Big-O estimate
|
|
88
|
+
let bigO = "O(n)";
|
|
89
|
+
if (maxLoopDepth >= 3)
|
|
90
|
+
bigO = "O(n³+)";
|
|
91
|
+
else if (maxLoopDepth === 2)
|
|
92
|
+
bigO = "O(n²)";
|
|
93
|
+
else if (recursiveCalls > 0 && maxLoopDepth > 0)
|
|
94
|
+
bigO = "O(n log n)";
|
|
95
|
+
else if (loopCount === 0)
|
|
96
|
+
bigO = "O(1)";
|
|
97
|
+
return {
|
|
98
|
+
loopDepth: maxLoopDepth,
|
|
99
|
+
loopCount,
|
|
100
|
+
allocations,
|
|
101
|
+
asyncAntiPatterns,
|
|
102
|
+
recursiveCalls,
|
|
103
|
+
regexCount,
|
|
104
|
+
stringConcat,
|
|
105
|
+
nestedCallbacks,
|
|
106
|
+
bigOEstimate: bigO,
|
|
107
|
+
lineCount: lines.length,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function compareAnalyses(before, after) {
|
|
111
|
+
const metrics = [];
|
|
112
|
+
function add(name, b, a, higherIsWorse, severity) {
|
|
113
|
+
const delta = a - b;
|
|
114
|
+
let verdict = "unchanged";
|
|
115
|
+
if (delta !== 0)
|
|
116
|
+
verdict = delta > 0 === higherIsWorse ? "regressed" : "improved";
|
|
117
|
+
metrics.push({
|
|
118
|
+
name,
|
|
119
|
+
before: b,
|
|
120
|
+
after: a,
|
|
121
|
+
delta,
|
|
122
|
+
verdict,
|
|
123
|
+
severity: verdict === "regressed" ? severity : undefined,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
add("Loop nesting depth", before.loopDepth, after.loopDepth, true, "high");
|
|
127
|
+
add("Loop count", before.loopCount, after.loopCount, true, "medium");
|
|
128
|
+
add("Allocations", before.allocations, after.allocations, true, "medium");
|
|
129
|
+
add("Async anti-patterns", before.asyncAntiPatterns, after.asyncAntiPatterns, true, "high");
|
|
130
|
+
add("Recursive calls", before.recursiveCalls, after.recursiveCalls, true, "medium");
|
|
131
|
+
add("Regex operations", before.regexCount, after.regexCount, true, "low");
|
|
132
|
+
add("String concatenations", before.stringConcat, after.stringConcat, true, "low");
|
|
133
|
+
add("Nested callbacks", before.nestedCallbacks, after.nestedCallbacks, true, "medium");
|
|
134
|
+
add("Lines of code", before.lineCount, after.lineCount, true, "low");
|
|
135
|
+
// Big-O change
|
|
136
|
+
const oOrder = ["O(1)", "O(log n)", "O(n)", "O(n log n)", "O(n²)", "O(n³+)"];
|
|
137
|
+
const bIdx = oOrder.indexOf(before.bigOEstimate);
|
|
138
|
+
const aIdx = oOrder.indexOf(after.bigOEstimate);
|
|
139
|
+
metrics.push({
|
|
140
|
+
name: "Algorithmic complexity",
|
|
141
|
+
before: bIdx,
|
|
142
|
+
after: aIdx,
|
|
143
|
+
delta: aIdx - bIdx,
|
|
144
|
+
verdict: aIdx > bIdx ? "regressed" : aIdx < bIdx ? "improved" : "unchanged",
|
|
145
|
+
severity: aIdx > bIdx ? "critical" : undefined,
|
|
146
|
+
detail: `${before.bigOEstimate} → ${after.bigOEstimate}`,
|
|
147
|
+
});
|
|
148
|
+
return metrics;
|
|
149
|
+
}
|
|
150
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
151
|
+
export function runPerfCompare(argv) {
|
|
152
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
153
|
+
console.log(`
|
|
154
|
+
judges perf-compare — Before/after performance comparison
|
|
155
|
+
|
|
156
|
+
Usage:
|
|
157
|
+
judges perf-compare <before-file> <after-file>
|
|
158
|
+
judges perf-compare old.ts new.ts --format json
|
|
159
|
+
|
|
160
|
+
Options:
|
|
161
|
+
--format json JSON output
|
|
162
|
+
--help, -h Show this help
|
|
163
|
+
|
|
164
|
+
Analyses:
|
|
165
|
+
• Loop nesting depth & count
|
|
166
|
+
• Memory allocations
|
|
167
|
+
• Async anti-patterns (await in loop, sequential awaits)
|
|
168
|
+
• Recursive call patterns
|
|
169
|
+
• Regex operation count
|
|
170
|
+
• String concatenation patterns
|
|
171
|
+
• Callback nesting depth
|
|
172
|
+
• Algorithmic complexity estimate (Big-O)
|
|
173
|
+
`);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
177
|
+
const positional = argv.filter((a) => !a.startsWith("--") && !argv[argv.indexOf(a) - 1]?.startsWith("--"));
|
|
178
|
+
if (positional.length < 2) {
|
|
179
|
+
console.error(" Usage: judges perf-compare <before-file> <after-file>");
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const [beforeFile, afterFile] = positional;
|
|
183
|
+
if (!existsSync(beforeFile)) {
|
|
184
|
+
console.error(` File not found: ${beforeFile}`);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (!existsSync(afterFile)) {
|
|
188
|
+
console.error(` File not found: ${afterFile}`);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
let beforeContent, afterContent;
|
|
192
|
+
try {
|
|
193
|
+
beforeContent = readFileSync(beforeFile, "utf-8");
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
console.error(` Cannot read: ${beforeFile}`);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
afterContent = readFileSync(afterFile, "utf-8");
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
console.error(` Cannot read: ${afterFile}`);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const beforeAnalysis = analyzePerformance(beforeContent);
|
|
207
|
+
const afterAnalysis = analyzePerformance(afterContent);
|
|
208
|
+
const metrics = compareAnalyses(beforeAnalysis, afterAnalysis);
|
|
209
|
+
const regressions = metrics.filter((m) => m.verdict === "regressed");
|
|
210
|
+
const improvements = metrics.filter((m) => m.verdict === "improved");
|
|
211
|
+
if (format === "json") {
|
|
212
|
+
console.log(JSON.stringify({
|
|
213
|
+
before: { file: beforeFile, analysis: beforeAnalysis },
|
|
214
|
+
after: { file: afterFile, analysis: afterAnalysis },
|
|
215
|
+
metrics,
|
|
216
|
+
summary: {
|
|
217
|
+
regressions: regressions.length,
|
|
218
|
+
improvements: improvements.length,
|
|
219
|
+
unchanged: metrics.filter((m) => m.verdict === "unchanged").length,
|
|
220
|
+
},
|
|
221
|
+
timestamp: new Date().toISOString(),
|
|
222
|
+
}, null, 2));
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
console.log(`\n Performance Comparison`);
|
|
226
|
+
console.log(` Before: ${beforeFile} (${beforeAnalysis.bigOEstimate})`);
|
|
227
|
+
console.log(` After: ${afterFile} (${afterAnalysis.bigOEstimate})\n ──────────────────────────`);
|
|
228
|
+
console.log(`\n ${"Metric".padEnd(30)} ${"Before".padEnd(8)} ${"After".padEnd(8)} ${"Delta".padEnd(8)} Verdict`);
|
|
229
|
+
console.log(` ${"─".repeat(70)}`);
|
|
230
|
+
for (const m of metrics) {
|
|
231
|
+
const icon = m.verdict === "improved" ? "✅" : m.verdict === "regressed" ? "❌" : "➖";
|
|
232
|
+
const deltaStr = m.delta > 0 ? `+${m.delta}` : String(m.delta);
|
|
233
|
+
const detail = m.detail ? ` (${m.detail})` : "";
|
|
234
|
+
console.log(` ${m.name.padEnd(30)} ${String(m.before).padEnd(8)} ${String(m.after).padEnd(8)} ${deltaStr.padEnd(8)} ${icon}${detail}`);
|
|
235
|
+
}
|
|
236
|
+
console.log(`\n Summary: ${improvements.length} improved, ${regressions.length} regressed, ${metrics.length - improvements.length - regressions.length} unchanged`);
|
|
237
|
+
if (regressions.length > 0) {
|
|
238
|
+
console.log(`\n ⚠️ Performance regressions detected:`);
|
|
239
|
+
for (const r of regressions) {
|
|
240
|
+
console.log(` • ${r.name}: ${r.before} → ${r.after}${r.severity ? ` [${r.severity}]` : ""}${r.detail ? ` (${r.detail})` : ""}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
console.log("");
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=perf-compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf-compare.js","sourceRoot":"","sources":["../../src/commands/perf-compare.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pii-scan.d.ts","sourceRoot":"","sources":["../../src/commands/pii-scan.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuNH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsH/C"}
|