@kevinrabun/judges 3.54.0 → 3.56.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-versioning-audit.d.ts +6 -0
- package/dist/commands/api-versioning-audit.d.ts.map +1 -0
- package/dist/commands/api-versioning-audit.js +234 -0
- package/dist/commands/api-versioning-audit.js.map +1 -0
- package/dist/commands/boundary-enforce.d.ts +6 -0
- package/dist/commands/boundary-enforce.d.ts.map +1 -0
- package/dist/commands/boundary-enforce.js +256 -0
- package/dist/commands/boundary-enforce.js.map +1 -0
- package/dist/commands/build-optimize.d.ts +7 -0
- package/dist/commands/build-optimize.d.ts.map +1 -0
- package/dist/commands/build-optimize.js +257 -0
- package/dist/commands/build-optimize.js.map +1 -0
- package/dist/commands/commit-hygiene.d.ts +6 -0
- package/dist/commands/commit-hygiene.d.ts.map +1 -0
- package/dist/commands/commit-hygiene.js +176 -0
- package/dist/commands/commit-hygiene.js.map +1 -0
- package/dist/commands/deploy-readiness.d.ts +6 -0
- package/dist/commands/deploy-readiness.d.ts.map +1 -0
- package/dist/commands/deploy-readiness.js +212 -0
- package/dist/commands/deploy-readiness.js.map +1 -0
- package/dist/commands/error-taxonomy.d.ts +6 -0
- package/dist/commands/error-taxonomy.d.ts.map +1 -0
- package/dist/commands/error-taxonomy.js +227 -0
- package/dist/commands/error-taxonomy.js.map +1 -0
- package/dist/commands/log-quality.d.ts +6 -0
- package/dist/commands/log-quality.d.ts.map +1 -0
- package/dist/commands/log-quality.js +212 -0
- package/dist/commands/log-quality.js.map +1 -0
- package/dist/commands/migration-safety.d.ts +6 -0
- package/dist/commands/migration-safety.d.ts.map +1 -0
- package/dist/commands/migration-safety.js +257 -0
- package/dist/commands/migration-safety.js.map +1 -0
- package/dist/commands/null-safety-audit.d.ts +6 -0
- package/dist/commands/null-safety-audit.d.ts.map +1 -0
- package/dist/commands/null-safety-audit.js +222 -0
- package/dist/commands/null-safety-audit.js.map +1 -0
- package/dist/commands/observability-gap.d.ts +6 -0
- package/dist/commands/observability-gap.d.ts.map +1 -0
- package/dist/commands/observability-gap.js +212 -0
- package/dist/commands/observability-gap.js.map +1 -0
- package/dist/commands/ownership-map.d.ts +6 -0
- package/dist/commands/ownership-map.d.ts.map +1 -0
- package/dist/commands/ownership-map.js +229 -0
- package/dist/commands/ownership-map.js.map +1 -0
- package/dist/commands/retry-pattern-audit.d.ts +6 -0
- package/dist/commands/retry-pattern-audit.d.ts.map +1 -0
- package/dist/commands/retry-pattern-audit.js +216 -0
- package/dist/commands/retry-pattern-audit.js.map +1 -0
- package/dist/commands/rollback-safety.d.ts +5 -0
- package/dist/commands/rollback-safety.d.ts.map +1 -0
- package/dist/commands/rollback-safety.js +192 -0
- package/dist/commands/rollback-safety.js.map +1 -0
- package/dist/commands/secret-age.d.ts +6 -0
- package/dist/commands/secret-age.d.ts.map +1 -0
- package/dist/commands/secret-age.js +215 -0
- package/dist/commands/secret-age.js.map +1 -0
- package/dist/commands/test-isolation.d.ts +6 -0
- package/dist/commands/test-isolation.d.ts.map +1 -0
- package/dist/commands/test-isolation.js +235 -0
- package/dist/commands/test-isolation.js.map +1 -0
- package/dist/commands/test-quality.d.ts +6 -0
- package/dist/commands/test-quality.d.ts.map +1 -0
- package/dist/commands/test-quality.js +161 -0
- package/dist/commands/test-quality.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log quality — assess logging hygiene: structured format consistency,
|
|
3
|
+
* PII leaks, level correctness, and coverage gaps.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, readdirSync, statSync } from "fs";
|
|
6
|
+
import { join, extname } from "path";
|
|
7
|
+
// ─── File Collection ────────────────────────────────────────────────────────
|
|
8
|
+
const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".py", ".java", ".go", ".rs"]);
|
|
9
|
+
function collectFiles(dir, max = 300) {
|
|
10
|
+
const files = [];
|
|
11
|
+
function walk(d) {
|
|
12
|
+
if (files.length >= max)
|
|
13
|
+
return;
|
|
14
|
+
let entries;
|
|
15
|
+
try {
|
|
16
|
+
entries = readdirSync(d);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
for (const e of entries) {
|
|
22
|
+
if (files.length >= max)
|
|
23
|
+
return;
|
|
24
|
+
if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
|
|
25
|
+
continue;
|
|
26
|
+
const full = join(d, e);
|
|
27
|
+
try {
|
|
28
|
+
if (statSync(full).isDirectory())
|
|
29
|
+
walk(full);
|
|
30
|
+
else if (CODE_EXTS.has(extname(full)))
|
|
31
|
+
files.push(full);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
/* skip */
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
walk(dir);
|
|
39
|
+
return files;
|
|
40
|
+
}
|
|
41
|
+
// ─── Analysis ───────────────────────────────────────────────────────────────
|
|
42
|
+
const PII_PATTERNS = [
|
|
43
|
+
{ pattern: /(?:email|e-mail|user_?email)\s*[:=]/i, name: "email" },
|
|
44
|
+
{ pattern: /(?:password|passwd|pwd|secret)\s*[:=]/i, name: "password" },
|
|
45
|
+
{ pattern: /(?:ssn|social.?security|national.?id)\s*[:=]/i, name: "SSN/national ID" },
|
|
46
|
+
{ pattern: /(?:credit.?card|card.?number|ccn)\s*[:=]/i, name: "credit card" },
|
|
47
|
+
{ pattern: /(?:phone.?number|mobile|cell)\s*[:=]/i, name: "phone number" },
|
|
48
|
+
{ pattern: /(?:date.?of.?birth|dob|birthday)\s*[:=]/i, name: "date of birth" },
|
|
49
|
+
{ pattern: /(?:ip.?address|client.?ip|remote.?addr)\s*[:=]/i, name: "IP address" },
|
|
50
|
+
];
|
|
51
|
+
function analyzeFile(filepath) {
|
|
52
|
+
const issues = [];
|
|
53
|
+
let content;
|
|
54
|
+
try {
|
|
55
|
+
content = readFileSync(filepath, "utf-8");
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return issues;
|
|
59
|
+
}
|
|
60
|
+
const lines = content.split("\n");
|
|
61
|
+
const isTestFile = /\.test\.|\.spec\.|__test__/i.test(filepath);
|
|
62
|
+
if (isTestFile)
|
|
63
|
+
return issues;
|
|
64
|
+
for (let i = 0; i < lines.length; i++) {
|
|
65
|
+
const line = lines[i];
|
|
66
|
+
// Console.log in production code
|
|
67
|
+
if (/console\.log\s*\(/.test(line) && !/\/\//.test(line.split("console")[0])) {
|
|
68
|
+
issues.push({
|
|
69
|
+
file: filepath,
|
|
70
|
+
line: i + 1,
|
|
71
|
+
issue: "console.log in production code",
|
|
72
|
+
severity: "medium",
|
|
73
|
+
suggestion: "Use a structured logger (winston, pino, bunyan)",
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// Wrong log level
|
|
77
|
+
if (/console\.log\s*\(\s*['"`](?:error|err|fail|exception|crash)/i.test(line)) {
|
|
78
|
+
issues.push({
|
|
79
|
+
file: filepath,
|
|
80
|
+
line: i + 1,
|
|
81
|
+
issue: "Error logged at info/debug level",
|
|
82
|
+
severity: "high",
|
|
83
|
+
suggestion: "Use console.error or logger.error for error conditions",
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (/(?:logger|log)\.(?:debug|info|trace)\s*\(\s*['"`](?:error|fail|exception|crash)/i.test(line)) {
|
|
87
|
+
issues.push({
|
|
88
|
+
file: filepath,
|
|
89
|
+
line: i + 1,
|
|
90
|
+
issue: "Error logged at info/debug level",
|
|
91
|
+
severity: "high",
|
|
92
|
+
suggestion: "Use logger.error() for error conditions",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// String interpolation in structured logger
|
|
96
|
+
if (/(?:logger|log)\.\w+\s*\(\s*`/.test(line)) {
|
|
97
|
+
issues.push({
|
|
98
|
+
file: filepath,
|
|
99
|
+
line: i + 1,
|
|
100
|
+
issue: "Template literal in structured logger",
|
|
101
|
+
severity: "medium",
|
|
102
|
+
suggestion: "Use structured fields: logger.info('msg', { key: value }) for queryability",
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// PII in log statements
|
|
106
|
+
if (/(?:console|log|logger)\.\w+\s*\(/.test(line)) {
|
|
107
|
+
for (const pii of PII_PATTERNS) {
|
|
108
|
+
if (pii.pattern.test(line)) {
|
|
109
|
+
issues.push({
|
|
110
|
+
file: filepath,
|
|
111
|
+
line: i + 1,
|
|
112
|
+
issue: `Potential ${pii.name} in log output`,
|
|
113
|
+
severity: "high",
|
|
114
|
+
suggestion: "Mask or redact PII before logging — may violate GDPR/CCPA",
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Logging full objects/errors without selection
|
|
120
|
+
if (/(?:console|log|logger)\.\w+\s*\(\s*(?:err|error|exception|e)\s*\)/.test(line)) {
|
|
121
|
+
issues.push({
|
|
122
|
+
file: filepath,
|
|
123
|
+
line: i + 1,
|
|
124
|
+
issue: "Logging full error object",
|
|
125
|
+
severity: "low",
|
|
126
|
+
suggestion: "Log error.message and error.stack separately for structured parsing",
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// Log statements with string concatenation (not structured)
|
|
130
|
+
if (/(?:console|log|logger)\.\w+\s*\(\s*['"].*['"]\s*\+/.test(line)) {
|
|
131
|
+
issues.push({
|
|
132
|
+
file: filepath,
|
|
133
|
+
line: i + 1,
|
|
134
|
+
issue: "String concatenation in log",
|
|
135
|
+
severity: "low",
|
|
136
|
+
suggestion: "Use structured logging with key-value pairs",
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Check for catch blocks without logging
|
|
141
|
+
for (let i = 0; i < lines.length; i++) {
|
|
142
|
+
if (/\bcatch\s*\(/.test(lines[i])) {
|
|
143
|
+
const block = lines.slice(i, Math.min(i + 8, lines.length)).join("\n");
|
|
144
|
+
if (!/log|logger|console\.(error|warn|log)|print|println/i.test(block) && !/throw|rethrow|reject/i.test(block)) {
|
|
145
|
+
issues.push({
|
|
146
|
+
file: filepath,
|
|
147
|
+
line: i + 1,
|
|
148
|
+
issue: "Silent catch block",
|
|
149
|
+
severity: "high",
|
|
150
|
+
suggestion: "Log errors in catch blocks or explicitly re-throw",
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return issues;
|
|
156
|
+
}
|
|
157
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
158
|
+
export function runLogQuality(argv) {
|
|
159
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
160
|
+
console.log(`
|
|
161
|
+
judges log-quality — Assess logging hygiene and quality
|
|
162
|
+
|
|
163
|
+
Usage:
|
|
164
|
+
judges log-quality [dir]
|
|
165
|
+
judges log-quality src/ --format json
|
|
166
|
+
|
|
167
|
+
Options:
|
|
168
|
+
[dir] Directory to scan (default: .)
|
|
169
|
+
--format json JSON output
|
|
170
|
+
--help, -h Show this help
|
|
171
|
+
|
|
172
|
+
Checks: wrong log levels, PII in logs, unstructured logging, string concatenation,
|
|
173
|
+
template literals in structured loggers, silent catch blocks.
|
|
174
|
+
`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
178
|
+
const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
|
|
179
|
+
const files = collectFiles(dir);
|
|
180
|
+
const allIssues = [];
|
|
181
|
+
for (const f of files)
|
|
182
|
+
allIssues.push(...analyzeFile(f));
|
|
183
|
+
const highCount = allIssues.filter((i) => i.severity === "high").length;
|
|
184
|
+
const medCount = allIssues.filter((i) => i.severity === "medium").length;
|
|
185
|
+
const score = Math.max(0, 100 - highCount * 10 - medCount * 3);
|
|
186
|
+
if (format === "json") {
|
|
187
|
+
console.log(JSON.stringify({
|
|
188
|
+
issues: allIssues,
|
|
189
|
+
score,
|
|
190
|
+
summary: { high: highCount, medium: medCount, total: allIssues.length },
|
|
191
|
+
timestamp: new Date().toISOString(),
|
|
192
|
+
}, null, 2));
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
const badge = score >= 80 ? "✅ GOOD" : score >= 50 ? "⚠️ NEEDS WORK" : "❌ POOR";
|
|
196
|
+
console.log(`\n Log Quality: ${badge} (${score}/100)\n ─────────────────────────`);
|
|
197
|
+
if (allIssues.length === 0) {
|
|
198
|
+
console.log(" No logging issues detected.\n");
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
for (const issue of allIssues.slice(0, 25)) {
|
|
202
|
+
const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
|
|
203
|
+
console.log(` ${icon} ${issue.issue}`);
|
|
204
|
+
console.log(` ${issue.file}:${issue.line}`);
|
|
205
|
+
console.log(` → ${issue.suggestion}`);
|
|
206
|
+
}
|
|
207
|
+
if (allIssues.length > 25)
|
|
208
|
+
console.log(` ... and ${allIssues.length - 25} more`);
|
|
209
|
+
console.log(`\n Total: ${allIssues.length} | High: ${highCount} | Medium: ${medCount} | Score: ${score}/100\n`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=log-quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-quality.js","sourceRoot":"","sources":["../../src/commands/log-quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-safety.d.ts","sourceRoot":"","sources":["../../src/commands/migration-safety.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsNH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2EvD"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration safety — validate framework/language migration PRs for
|
|
3
|
+
* compatibility gaps, data-loss risks, and breaking changes.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, readdirSync, statSync } from "fs";
|
|
6
|
+
import { join, extname } from "path";
|
|
7
|
+
// ─── File Collection ────────────────────────────────────────────────────────
|
|
8
|
+
const CODE_EXTS = new Set([
|
|
9
|
+
".ts",
|
|
10
|
+
".tsx",
|
|
11
|
+
".js",
|
|
12
|
+
".jsx",
|
|
13
|
+
".mjs",
|
|
14
|
+
".cjs",
|
|
15
|
+
".py",
|
|
16
|
+
".java",
|
|
17
|
+
".go",
|
|
18
|
+
".rs",
|
|
19
|
+
".json",
|
|
20
|
+
".yaml",
|
|
21
|
+
".yml",
|
|
22
|
+
]);
|
|
23
|
+
function collectFiles(dir, max = 300) {
|
|
24
|
+
const files = [];
|
|
25
|
+
function walk(d) {
|
|
26
|
+
if (files.length >= max)
|
|
27
|
+
return;
|
|
28
|
+
let entries;
|
|
29
|
+
try {
|
|
30
|
+
entries = readdirSync(d);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
for (const e of entries) {
|
|
36
|
+
if (files.length >= max)
|
|
37
|
+
return;
|
|
38
|
+
if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build")
|
|
39
|
+
continue;
|
|
40
|
+
const full = join(d, e);
|
|
41
|
+
try {
|
|
42
|
+
if (statSync(full).isDirectory())
|
|
43
|
+
walk(full);
|
|
44
|
+
else if (CODE_EXTS.has(extname(full)))
|
|
45
|
+
files.push(full);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
/* skip */
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
walk(dir);
|
|
53
|
+
return files;
|
|
54
|
+
}
|
|
55
|
+
// ─── Analysis ───────────────────────────────────────────────────────────────
|
|
56
|
+
const MIGRATION_PATTERNS = [
|
|
57
|
+
// Framework migrations
|
|
58
|
+
{
|
|
59
|
+
pattern: /(?:from|import)\s+['"]react-router(?:-dom)?['"]/i,
|
|
60
|
+
risk: "React Router migration",
|
|
61
|
+
severity: "high",
|
|
62
|
+
detail: "React Router v5→v6: <Switch> replaced by <Routes>, useHistory→useNavigate",
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
pattern: /(?:from|import)\s+['"]@angular\/(?:core|common)['"]/i,
|
|
66
|
+
risk: "Angular version migration",
|
|
67
|
+
severity: "high",
|
|
68
|
+
detail: "Angular major versions change DI, module system, and template syntax",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
pattern: /(?:from|import)\s+['"]vue['"]/i,
|
|
72
|
+
risk: "Vue migration",
|
|
73
|
+
severity: "high",
|
|
74
|
+
detail: "Vue 2→3: Options API defaults change, Composition API, Proxy-based reactivity",
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
pattern: /(?:from|import)\s+['"]express['"].*(?:from|import)\s+['"]fastify['"]/is,
|
|
78
|
+
risk: "Express→Fastify migration",
|
|
79
|
+
severity: "high",
|
|
80
|
+
detail: "Middleware model differs — req/res API changes, plugin system replaces middleware chain",
|
|
81
|
+
},
|
|
82
|
+
// TypeScript/JavaScript evolution
|
|
83
|
+
{
|
|
84
|
+
pattern: /require\s*\(.*\).*(?:import|from).*['"]/i,
|
|
85
|
+
risk: "CJS/ESM mixed imports",
|
|
86
|
+
severity: "medium",
|
|
87
|
+
detail: "Mixed require() and import — choose one module system",
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
pattern: /"type"\s*:\s*"module"/i,
|
|
91
|
+
risk: "ESM migration",
|
|
92
|
+
severity: "medium",
|
|
93
|
+
detail: "ESM migration: ensure all imports have extensions, __dirname unavailable",
|
|
94
|
+
},
|
|
95
|
+
// Database migrations
|
|
96
|
+
{
|
|
97
|
+
pattern: /(?:ALTER|DROP)\s+(?:TABLE|COLUMN|INDEX)/i,
|
|
98
|
+
risk: "Schema migration",
|
|
99
|
+
severity: "critical",
|
|
100
|
+
detail: "Schema changes may lose data — run on copy first, verify rollback",
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
pattern: /(?:mongoose|sequelize|typeorm|prisma).*(?:migrate|migration)/i,
|
|
104
|
+
risk: "ORM migration",
|
|
105
|
+
severity: "high",
|
|
106
|
+
detail: "ORM migrations may have different default behaviors across versions",
|
|
107
|
+
},
|
|
108
|
+
// Config format changes
|
|
109
|
+
{
|
|
110
|
+
pattern: /(?:webpack|rollup|vite|esbuild|parcel).*(?:config|\.config)/i,
|
|
111
|
+
risk: "Bundler migration",
|
|
112
|
+
severity: "medium",
|
|
113
|
+
detail: "Bundler configs are not portable — verify plugin equivalents",
|
|
114
|
+
},
|
|
115
|
+
// API surface changes
|
|
116
|
+
{
|
|
117
|
+
pattern: /deprecated|@deprecated|TODO.*migrate|FIXME.*upgrade/i,
|
|
118
|
+
risk: "Deprecated API usage",
|
|
119
|
+
severity: "medium",
|
|
120
|
+
detail: "Deprecated APIs may be removed in next version — update now",
|
|
121
|
+
},
|
|
122
|
+
// Runtime changes
|
|
123
|
+
{
|
|
124
|
+
pattern: /engines.*node.*['"]\d+/i,
|
|
125
|
+
risk: "Node.js version requirement",
|
|
126
|
+
severity: "high",
|
|
127
|
+
detail: "Node version changes affect API availability, performance, and security",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
pattern: /python_requires.*['"]\s*>=?\s*3\./i,
|
|
131
|
+
risk: "Python version requirement",
|
|
132
|
+
severity: "high",
|
|
133
|
+
detail: "Python version changes affect syntax, stdlib, and type hints",
|
|
134
|
+
},
|
|
135
|
+
// Data serialization changes
|
|
136
|
+
{
|
|
137
|
+
pattern: /(?:protobuf|proto3|avro|thrift).*(?:schema|definition)/i,
|
|
138
|
+
risk: "Serialization schema change",
|
|
139
|
+
severity: "critical",
|
|
140
|
+
detail: "Schema changes can break wire compatibility — ensure backward compat",
|
|
141
|
+
},
|
|
142
|
+
// Authentication changes
|
|
143
|
+
{
|
|
144
|
+
pattern: /(?:passport|auth0|firebase[.-]auth|cognito).*(?:migrate|upgrade|v\d)/i,
|
|
145
|
+
risk: "Auth provider migration",
|
|
146
|
+
severity: "critical",
|
|
147
|
+
detail: "Auth migrations risk locking out users — run parallel during transition",
|
|
148
|
+
},
|
|
149
|
+
];
|
|
150
|
+
function analyzeFile(filepath) {
|
|
151
|
+
const risks = [];
|
|
152
|
+
let content;
|
|
153
|
+
try {
|
|
154
|
+
content = readFileSync(filepath, "utf-8");
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return risks;
|
|
158
|
+
}
|
|
159
|
+
const lines = content.split("\n");
|
|
160
|
+
for (let i = 0; i < lines.length; i++) {
|
|
161
|
+
for (const mp of MIGRATION_PATTERNS) {
|
|
162
|
+
if (mp.pattern.test(lines[i])) {
|
|
163
|
+
risks.push({ file: filepath, line: i + 1, risk: mp.risk, severity: mp.severity, detail: mp.detail });
|
|
164
|
+
break; // One finding per line
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return risks;
|
|
169
|
+
}
|
|
170
|
+
function detectMigrationContext(dir) {
|
|
171
|
+
const signals = [];
|
|
172
|
+
const files = collectFiles(dir, 50);
|
|
173
|
+
const allContent = files
|
|
174
|
+
.map((f) => {
|
|
175
|
+
try {
|
|
176
|
+
return readFileSync(f, "utf-8");
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return "";
|
|
180
|
+
}
|
|
181
|
+
})
|
|
182
|
+
.join("\n");
|
|
183
|
+
if (/codemod|jscodeshift|ast-grep/i.test(allContent))
|
|
184
|
+
signals.push("Codemod tooling detected — automated migration in progress");
|
|
185
|
+
if (/compatibility|compat|shim|polyfill/i.test(allContent))
|
|
186
|
+
signals.push("Compatibility layer/shim detected");
|
|
187
|
+
if (/canary|feature.?flag|gradual.?rollout/i.test(allContent))
|
|
188
|
+
signals.push("Gradual rollout strategy detected");
|
|
189
|
+
if (/(?:upgrade|migration).?guide|MIGRATION/i.test(allContent))
|
|
190
|
+
signals.push("Migration guide referenced");
|
|
191
|
+
return signals;
|
|
192
|
+
}
|
|
193
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
194
|
+
export function runMigrationSafety(argv) {
|
|
195
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
196
|
+
console.log(`
|
|
197
|
+
judges migration-safety — Validate migration PRs for compatibility and data-loss risks
|
|
198
|
+
|
|
199
|
+
Usage:
|
|
200
|
+
judges migration-safety [dir]
|
|
201
|
+
judges migration-safety src/ --format json
|
|
202
|
+
|
|
203
|
+
Options:
|
|
204
|
+
[dir] Directory to scan (default: .)
|
|
205
|
+
--format json JSON output
|
|
206
|
+
--help, -h Show this help
|
|
207
|
+
|
|
208
|
+
Detects: framework version breaks, CJS/ESM mixed imports, schema migrations,
|
|
209
|
+
bundler config changes, deprecated APIs, runtime version changes, serialization
|
|
210
|
+
schema breaks, auth provider migrations.
|
|
211
|
+
`);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
215
|
+
const dir = argv.find((a) => !a.startsWith("-") && argv.indexOf(a) > 0) || ".";
|
|
216
|
+
const files = collectFiles(dir);
|
|
217
|
+
const allRisks = [];
|
|
218
|
+
for (const f of files)
|
|
219
|
+
allRisks.push(...analyzeFile(f));
|
|
220
|
+
const signals = detectMigrationContext(dir);
|
|
221
|
+
const critCount = allRisks.filter((r) => r.severity === "critical").length;
|
|
222
|
+
const highCount = allRisks.filter((r) => r.severity === "high").length;
|
|
223
|
+
const score = allRisks.length === 0 ? 100 : Math.max(0, 100 - critCount * 20 - highCount * 8);
|
|
224
|
+
if (format === "json") {
|
|
225
|
+
console.log(JSON.stringify({
|
|
226
|
+
risks: allRisks,
|
|
227
|
+
signals,
|
|
228
|
+
score,
|
|
229
|
+
summary: { critical: critCount, high: highCount, total: allRisks.length },
|
|
230
|
+
timestamp: new Date().toISOString(),
|
|
231
|
+
}, null, 2));
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
const badge = critCount > 0 ? "🚫 HIGH RISK" : highCount > 2 ? "⚠️ CAUTION" : "✅ SAFE";
|
|
235
|
+
console.log(`\n Migration Safety: ${badge} (${score}/100)\n ─────────────────────────────`);
|
|
236
|
+
if (signals.length > 0) {
|
|
237
|
+
console.log("\n Context:");
|
|
238
|
+
for (const s of signals)
|
|
239
|
+
console.log(` 📌 ${s}`);
|
|
240
|
+
}
|
|
241
|
+
if (allRisks.length === 0) {
|
|
242
|
+
console.log("\n No migration risks detected.\n");
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
console.log("\n Risks:");
|
|
246
|
+
for (const r of allRisks.slice(0, 25)) {
|
|
247
|
+
const icon = r.severity === "critical" ? "🚫" : r.severity === "high" ? "🔴" : "🟡";
|
|
248
|
+
console.log(` ${icon} [${r.severity.toUpperCase()}] ${r.risk}`);
|
|
249
|
+
console.log(` ${r.file}:${r.line}`);
|
|
250
|
+
console.log(` ${r.detail}`);
|
|
251
|
+
}
|
|
252
|
+
if (allRisks.length > 25)
|
|
253
|
+
console.log(` ... and ${allRisks.length - 25} more`);
|
|
254
|
+
console.log(`\n Total: ${allRisks.length} | Critical: ${critCount} | High: ${highCount} | Score: ${score}/100\n`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=migration-safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-safety.js","sourceRoot":"","sources":["../../src/commands/migration-safety.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"null-safety-audit.d.ts","sourceRoot":"","sources":["../../src/commands/null-safety-audit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4LH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+DvD"}
|