@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.
Files changed (70) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +112 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/api-audit.d.ts +9 -0
  6. package/dist/commands/api-audit.d.ts.map +1 -0
  7. package/dist/commands/api-audit.js +360 -0
  8. package/dist/commands/api-audit.js.map +1 -0
  9. package/dist/commands/compliance-map.d.ts +9 -0
  10. package/dist/commands/compliance-map.d.ts.map +1 -0
  11. package/dist/commands/compliance-map.js +375 -0
  12. package/dist/commands/compliance-map.js.map +1 -0
  13. package/dist/commands/exec-report.d.ts +9 -0
  14. package/dist/commands/exec-report.d.ts.map +1 -0
  15. package/dist/commands/exec-report.js +272 -0
  16. package/dist/commands/exec-report.js.map +1 -0
  17. package/dist/commands/guided-tour.d.ts +9 -0
  18. package/dist/commands/guided-tour.d.ts.map +1 -0
  19. package/dist/commands/guided-tour.js +288 -0
  20. package/dist/commands/guided-tour.js.map +1 -0
  21. package/dist/commands/iac-lint.d.ts +8 -0
  22. package/dist/commands/iac-lint.d.ts.map +1 -0
  23. package/dist/commands/iac-lint.js +313 -0
  24. package/dist/commands/iac-lint.js.map +1 -0
  25. package/dist/commands/incident-response.d.ts +8 -0
  26. package/dist/commands/incident-response.d.ts.map +1 -0
  27. package/dist/commands/incident-response.js +255 -0
  28. package/dist/commands/incident-response.js.map +1 -0
  29. package/dist/commands/learning-path.d.ts +9 -0
  30. package/dist/commands/learning-path.d.ts.map +1 -0
  31. package/dist/commands/learning-path.js +326 -0
  32. package/dist/commands/learning-path.js.map +1 -0
  33. package/dist/commands/license-scan.d.ts +9 -0
  34. package/dist/commands/license-scan.d.ts.map +1 -0
  35. package/dist/commands/license-scan.js +180 -0
  36. package/dist/commands/license-scan.js.map +1 -0
  37. package/dist/commands/org-policy.d.ts +8 -0
  38. package/dist/commands/org-policy.d.ts.map +1 -0
  39. package/dist/commands/org-policy.js +208 -0
  40. package/dist/commands/org-policy.js.map +1 -0
  41. package/dist/commands/perf-compare.d.ts +9 -0
  42. package/dist/commands/perf-compare.d.ts.map +1 -0
  43. package/dist/commands/perf-compare.js +246 -0
  44. package/dist/commands/perf-compare.js.map +1 -0
  45. package/dist/commands/pii-scan.d.ts +8 -0
  46. package/dist/commands/pii-scan.d.ts.map +1 -0
  47. package/dist/commands/pii-scan.js +300 -0
  48. package/dist/commands/pii-scan.js.map +1 -0
  49. package/dist/commands/predict.d.ts +8 -0
  50. package/dist/commands/predict.d.ts.map +1 -0
  51. package/dist/commands/predict.js +219 -0
  52. package/dist/commands/predict.js.map +1 -0
  53. package/dist/commands/risk-heatmap.d.ts +8 -0
  54. package/dist/commands/risk-heatmap.d.ts.map +1 -0
  55. package/dist/commands/risk-heatmap.js +224 -0
  56. package/dist/commands/risk-heatmap.js.map +1 -0
  57. package/dist/commands/sbom-export.d.ts +8 -0
  58. package/dist/commands/sbom-export.d.ts.map +1 -0
  59. package/dist/commands/sbom-export.js +162 -0
  60. package/dist/commands/sbom-export.js.map +1 -0
  61. package/dist/commands/secret-scan.d.ts +8 -0
  62. package/dist/commands/secret-scan.d.ts.map +1 -0
  63. package/dist/commands/secret-scan.js +245 -0
  64. package/dist/commands/secret-scan.js.map +1 -0
  65. package/dist/commands/test-correlate.d.ts +8 -0
  66. package/dist/commands/test-correlate.d.ts.map +1 -0
  67. package/dist/commands/test-correlate.js +222 -0
  68. package/dist/commands/test-correlate.js.map +1 -0
  69. package/package.json +1 -1
  70. 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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AA2B9C,+EAA+E;AAE/E,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,aAAa;IACb,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,yDAAyD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACjH,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QACtD,CAAC;QACD,iCAAiC;QACjC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAC9C,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAC/C,IAAI,MAAM,GAAG,KAAK,IAAI,YAAY,GAAG,CAAC;YAAE,YAAY,EAAE,CAAC;IACzD,CAAC;IAED,oDAAoD;IACpD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,WAAW,EAAE,CAAC;QAC5C,IAAI,uDAAuD,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAAE,WAAW,EAAE,CAAC;IAC/F,CAAC;IAED,sBAAsB;IACtB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,gBAAgB;QAChB,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,GAAG,CAAC;YAAE,iBAAiB,EAAE,CAAC;QACxE,2CAA2C;QAC3C,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,iBAAiB,EAAE,CAAC;IACjG,CAAC;IAED,kBAAkB;IAClB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;QAChH,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,IAAI,EAAE,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;gBACvF,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI;oBAAE,cAAc,EAAE,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,UAAU,EAAE,CAAC;IACjE,CAAC;IAED,gCAAgC;IAChC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,YAAY,EAAE,CAAC;IAC1D,CAAC;IAED,mBAAmB;IACnB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,aAAa,EAAE,CAAC;YAChB,IAAI,aAAa,IAAI,CAAC;gBAAE,eAAe,EAAE,CAAC;QAC5C,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,GAAG,CAAC;YAAE,aAAa,EAAE,CAAC;IAChE,CAAC;IAED,iBAAiB;IACjB,IAAI,IAAI,GAAG,MAAM,CAAC;IAClB,IAAI,YAAY,IAAI,CAAC;QAAE,IAAI,GAAG,QAAQ,CAAC;SAClC,IAAI,YAAY,KAAK,CAAC;QAAE,IAAI,GAAG,OAAO,CAAC;SACvC,IAAI,cAAc,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC;QAAE,IAAI,GAAG,YAAY,CAAC;SAChE,IAAI,SAAS,KAAK,CAAC;QAAE,IAAI,GAAG,MAAM,CAAC;IAExC,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,SAAS;QACT,WAAW;QACX,iBAAiB;QACjB,cAAc;QACd,UAAU;QACV,YAAY;QACZ,eAAe;QACf,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,KAAK,CAAC,MAAM;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAoB,EAAE,KAAmB;IAChE,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,SAAS,GAAG,CAAC,IAAY,EAAE,CAAS,EAAE,CAAS,EAAE,aAAsB,EAAE,QAAgC;QACvG,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,OAAO,GAA0B,WAAW,CAAC;QACjD,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,GAAG,KAAK,GAAG,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;YACR,KAAK;YACL,OAAO;YACP,QAAQ,EAAE,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACzD,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3E,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrE,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1E,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5F,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpF,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1E,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACnF,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvF,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAErE,eAAe;IACf,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI,GAAG,IAAI;QAClB,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;QAC3E,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QAC9C,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,MAAM,KAAK,CAAC,YAAY,EAAE;KACzD,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,cAAc,CAAC,IAAc;IAC3C,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,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnH,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,UAAU,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,IAAI,aAAqB,EAAE,YAAoB,CAAC;IAChD,IAAI,CAAC;QACH,aAAa,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,YAAY,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,eAAe,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC;IAErE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE;YACtD,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE;YACnD,OAAO;YACP,OAAO,EAAE;gBACP,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,YAAY,EAAE,YAAY,CAAC,MAAM;gBACjC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,MAAM;aACnE;YACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,KAAK,cAAc,CAAC,YAAY,GAAG,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,KAAK,aAAa,CAAC,YAAY,iCAAiC,CAAC,CAAC;QAEpG,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACpH,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAErC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACpF,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CACT,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,MAAM,EAAE,CAC7H,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CACT,kBAAkB,YAAY,CAAC,MAAM,cAAc,WAAW,CAAC,MAAM,eAAe,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,YAAY,CAC1J,CAAC;QAEF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CACT,WAAW,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACxH,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * PII scan — detect personally-identifiable information patterns
3
+ * in source code: string literals, logs, config files.
4
+ *
5
+ * All analysis local.
6
+ */
7
+ export declare function runPiiScan(argv: string[]): void;
8
+ //# sourceMappingURL=pii-scan.d.ts.map
@@ -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"}