@kevinrabun/judges 3.54.0 → 3.55.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 +12 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +56 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/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/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/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/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-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,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build optimize — detect build-time inefficiencies in AI-generated code:
|
|
3
|
+
* unused imports defeating tree-shaking, duplicated polyfills, dynamic require(),
|
|
4
|
+
* oversized inlined assets, and circular dependency chains.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, readdirSync, statSync } from "fs";
|
|
7
|
+
import { join, extname } from "path";
|
|
8
|
+
// ─── File Collection ────────────────────────────────────────────────────────
|
|
9
|
+
const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"]);
|
|
10
|
+
function collectFiles(dir, max = 300) {
|
|
11
|
+
const files = [];
|
|
12
|
+
function walk(d) {
|
|
13
|
+
if (files.length >= max)
|
|
14
|
+
return;
|
|
15
|
+
let entries;
|
|
16
|
+
try {
|
|
17
|
+
entries = readdirSync(d);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
for (const e of entries) {
|
|
23
|
+
if (files.length >= max)
|
|
24
|
+
return;
|
|
25
|
+
if (e.startsWith(".") || e === "node_modules" || e === "dist" || e === "build" || e === "coverage")
|
|
26
|
+
continue;
|
|
27
|
+
const full = join(d, e);
|
|
28
|
+
try {
|
|
29
|
+
if (statSync(full).isDirectory())
|
|
30
|
+
walk(full);
|
|
31
|
+
else if (CODE_EXTS.has(extname(full)))
|
|
32
|
+
files.push(full);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
/* skip */
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
walk(dir);
|
|
40
|
+
return files;
|
|
41
|
+
}
|
|
42
|
+
// ─── Analysis ───────────────────────────────────────────────────────────────
|
|
43
|
+
function analyzeFile(filepath) {
|
|
44
|
+
const issues = [];
|
|
45
|
+
let content;
|
|
46
|
+
try {
|
|
47
|
+
content = readFileSync(filepath, "utf-8");
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return issues;
|
|
51
|
+
}
|
|
52
|
+
const lines = content.split("\n");
|
|
53
|
+
for (let i = 0; i < lines.length; i++) {
|
|
54
|
+
const line = lines[i];
|
|
55
|
+
// Dynamic require()
|
|
56
|
+
if (/\brequire\s*\(\s*[^'"`]/.test(line) && !/\/\//.test(line.split("require")[0])) {
|
|
57
|
+
issues.push({
|
|
58
|
+
file: filepath,
|
|
59
|
+
line: i + 1,
|
|
60
|
+
issue: "Dynamic require()",
|
|
61
|
+
severity: "high",
|
|
62
|
+
suggestion: "Use static imports for tree-shaking",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// Barrel re-exports importing everything
|
|
66
|
+
if (/export\s*\*\s*from/.test(line)) {
|
|
67
|
+
issues.push({
|
|
68
|
+
file: filepath,
|
|
69
|
+
line: i + 1,
|
|
70
|
+
issue: "Barrel re-export",
|
|
71
|
+
severity: "medium",
|
|
72
|
+
suggestion: "Named exports enable better tree-shaking",
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// Large base64 inlined data
|
|
76
|
+
const b64Match = line.match(/['"`]data:[^;]+;base64,([A-Za-z0-9+/=]{500,})/);
|
|
77
|
+
if (b64Match) {
|
|
78
|
+
issues.push({
|
|
79
|
+
file: filepath,
|
|
80
|
+
line: i + 1,
|
|
81
|
+
issue: "Large inlined base64 asset",
|
|
82
|
+
severity: "high",
|
|
83
|
+
suggestion: "Move to external file and reference by URL",
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Duplicated polyfills
|
|
87
|
+
if (/import.*(?:core-js|regenerator-runtime|@babel\/polyfill|tslib)/.test(line)) {
|
|
88
|
+
issues.push({
|
|
89
|
+
file: filepath,
|
|
90
|
+
line: i + 1,
|
|
91
|
+
issue: "Polyfill import in source",
|
|
92
|
+
severity: "medium",
|
|
93
|
+
suggestion: "Configure polyfills in bundler config, not per-file",
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// JSON imports without tree-shaking
|
|
97
|
+
if (/require\s*\(\s*['"].*\.json['"]\s*\)/.test(line) && !/\.\/package\.json/.test(line)) {
|
|
98
|
+
issues.push({
|
|
99
|
+
file: filepath,
|
|
100
|
+
line: i + 1,
|
|
101
|
+
issue: "JSON require at top level",
|
|
102
|
+
severity: "low",
|
|
103
|
+
suggestion: "Use import assertions or load at runtime if large",
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Detect unused imports (simple heuristic)
|
|
108
|
+
const importRegex = /import\s+\{([^}]+)\}\s+from/g;
|
|
109
|
+
let match;
|
|
110
|
+
while ((match = importRegex.exec(content)) !== null) {
|
|
111
|
+
const names = match[1]
|
|
112
|
+
.split(",")
|
|
113
|
+
.map((n) => n
|
|
114
|
+
.trim()
|
|
115
|
+
.split(/\s+as\s+/)
|
|
116
|
+
.pop()
|
|
117
|
+
.trim())
|
|
118
|
+
.filter(Boolean);
|
|
119
|
+
for (const name of names) {
|
|
120
|
+
if (name.startsWith("type "))
|
|
121
|
+
continue;
|
|
122
|
+
const cleanName = name.replace(/^type\s+/, "");
|
|
123
|
+
// Count occurrences beyond the import line itself
|
|
124
|
+
const useCount = content.split(cleanName).length - 1;
|
|
125
|
+
if (useCount <= 1) {
|
|
126
|
+
issues.push({
|
|
127
|
+
file: filepath,
|
|
128
|
+
line: 1,
|
|
129
|
+
issue: `Potentially unused import: ${cleanName}`,
|
|
130
|
+
severity: "medium",
|
|
131
|
+
suggestion: "Remove unused imports to reduce bundle size",
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return issues;
|
|
137
|
+
}
|
|
138
|
+
// ─── Circular Dependency Detection ──────────────────────────────────────────
|
|
139
|
+
function buildImportGraph(files) {
|
|
140
|
+
const graph = new Map();
|
|
141
|
+
for (const f of files) {
|
|
142
|
+
let content;
|
|
143
|
+
try {
|
|
144
|
+
content = readFileSync(f, "utf-8");
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const deps = [];
|
|
150
|
+
const importPattern = /(?:import|from)\s+['"]([^'"]+)['"]/g;
|
|
151
|
+
let m;
|
|
152
|
+
while ((m = importPattern.exec(content)) !== null) {
|
|
153
|
+
if (m[1].startsWith(".")) {
|
|
154
|
+
const resolved = join(f, "..", m[1]).replace(/\\/g, "/");
|
|
155
|
+
deps.push(resolved);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
graph.set(f.replace(/\\/g, "/"), deps);
|
|
159
|
+
}
|
|
160
|
+
return graph;
|
|
161
|
+
}
|
|
162
|
+
function findCycles(graph) {
|
|
163
|
+
const cycles = [];
|
|
164
|
+
const visited = new Set();
|
|
165
|
+
const stack = new Set();
|
|
166
|
+
function dfs(node, path) {
|
|
167
|
+
if (stack.has(node)) {
|
|
168
|
+
const cycleStart = path.indexOf(node);
|
|
169
|
+
if (cycleStart >= 0)
|
|
170
|
+
cycles.push(path.slice(cycleStart).concat(node));
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (visited.has(node))
|
|
174
|
+
return;
|
|
175
|
+
visited.add(node);
|
|
176
|
+
stack.add(node);
|
|
177
|
+
const deps = graph.get(node) || [];
|
|
178
|
+
for (const dep of deps) {
|
|
179
|
+
// Resolve extension-less imports
|
|
180
|
+
const candidates = [dep, `${dep}.ts`, `${dep}.js`, `${dep}/index.ts`, `${dep}/index.js`];
|
|
181
|
+
for (const c of candidates) {
|
|
182
|
+
if (graph.has(c)) {
|
|
183
|
+
dfs(c, [...path, node]);
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
stack.delete(node);
|
|
189
|
+
}
|
|
190
|
+
for (const node of graph.keys())
|
|
191
|
+
dfs(node, []);
|
|
192
|
+
return cycles.slice(0, 10); // Cap cycles reported
|
|
193
|
+
}
|
|
194
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
195
|
+
export function runBuildOptimize(argv) {
|
|
196
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
197
|
+
console.log(`
|
|
198
|
+
judges build-optimize — Detect build-time inefficiencies
|
|
199
|
+
|
|
200
|
+
Usage:
|
|
201
|
+
judges build-optimize [dir]
|
|
202
|
+
judges build-optimize src/ --format json
|
|
203
|
+
|
|
204
|
+
Options:
|
|
205
|
+
[dir] Directory to scan (default: .)
|
|
206
|
+
--format json JSON output
|
|
207
|
+
--help, -h Show this help
|
|
208
|
+
|
|
209
|
+
Detects: dynamic require(), barrel re-exports, inlined assets, polyfill imports,
|
|
210
|
+
unused imports, circular dependencies.
|
|
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 allIssues = [];
|
|
218
|
+
for (const f of files)
|
|
219
|
+
allIssues.push(...analyzeFile(f));
|
|
220
|
+
const graph = buildImportGraph(files);
|
|
221
|
+
const cycles = findCycles(graph);
|
|
222
|
+
const highCount = allIssues.filter((i) => i.severity === "high").length;
|
|
223
|
+
const medCount = allIssues.filter((i) => i.severity === "medium").length;
|
|
224
|
+
const score = Math.max(0, 100 - highCount * 10 - medCount * 3 - cycles.length * 15);
|
|
225
|
+
if (format === "json") {
|
|
226
|
+
console.log(JSON.stringify({
|
|
227
|
+
issues: allIssues,
|
|
228
|
+
cycles,
|
|
229
|
+
score,
|
|
230
|
+
summary: { files: files.length, issues: allIssues.length, circularDeps: cycles.length },
|
|
231
|
+
timestamp: new Date().toISOString(),
|
|
232
|
+
}, null, 2));
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
const badge = score >= 80 ? "✅ OPTIMIZED" : score >= 50 ? "⚠️ NEEDS WORK" : "❌ BLOATED";
|
|
236
|
+
console.log(`\n Build Optimization: ${badge} (${score}/100)\n ──────────────────────────────`);
|
|
237
|
+
if (allIssues.length > 0) {
|
|
238
|
+
console.log("\n Issues:");
|
|
239
|
+
for (const issue of allIssues.slice(0, 30)) {
|
|
240
|
+
const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "🔵";
|
|
241
|
+
console.log(` ${icon} ${issue.issue}`);
|
|
242
|
+
console.log(` ${issue.file}:${issue.line}`);
|
|
243
|
+
console.log(` → ${issue.suggestion}`);
|
|
244
|
+
}
|
|
245
|
+
if (allIssues.length > 30)
|
|
246
|
+
console.log(` ... and ${allIssues.length - 30} more`);
|
|
247
|
+
}
|
|
248
|
+
if (cycles.length > 0) {
|
|
249
|
+
console.log("\n Circular Dependencies:");
|
|
250
|
+
for (const cycle of cycles) {
|
|
251
|
+
console.log(` 🔄 ${cycle.map((c) => c.split("/").pop()).join(" → ")}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
console.log(`\n Score: ${score}/100 | Issues: ${allIssues.length} | Circular deps: ${cycles.length}\n`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=build-optimize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-optimize.js","sourceRoot":"","sources":["../../src/commands/build-optimize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-hygiene.d.ts","sourceRoot":"","sources":["../../src/commands/commit-hygiene.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyJH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyDrD"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit hygiene — audit commit messages and diff structure for
|
|
3
|
+
* AI-generated code submission quality.
|
|
4
|
+
*/
|
|
5
|
+
import { execSync } from "child_process";
|
|
6
|
+
// ─── Patterns ───────────────────────────────────────────────────────────────
|
|
7
|
+
const VAGUE_MESSAGES = [
|
|
8
|
+
/^update(d)?\s*(code|files?|stuff)?$/i,
|
|
9
|
+
/^fix(ed)?\s*(it|bug|stuff|things?)?$/i,
|
|
10
|
+
/^changes?$/i,
|
|
11
|
+
/^wip$/i,
|
|
12
|
+
/^misc$/i,
|
|
13
|
+
/^\.+$/,
|
|
14
|
+
/^temp$/i,
|
|
15
|
+
/^asdf/i,
|
|
16
|
+
/^test$/i,
|
|
17
|
+
];
|
|
18
|
+
const CONVENTIONAL_REGEX = /^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?:\s/;
|
|
19
|
+
// ─── Analysis ───────────────────────────────────────────────────────────────
|
|
20
|
+
function getCommits(count) {
|
|
21
|
+
try {
|
|
22
|
+
const log = execSync(`git log --oneline -${count} --format="%H|%s"`, { encoding: "utf-8", timeout: 10000 });
|
|
23
|
+
const commits = [];
|
|
24
|
+
for (const line of log.trim().split("\n")) {
|
|
25
|
+
if (!line)
|
|
26
|
+
continue;
|
|
27
|
+
const [hash, ...msgParts] = line.split("|");
|
|
28
|
+
const message = msgParts.join("|");
|
|
29
|
+
let files = 0, insertions = 0, deletions = 0;
|
|
30
|
+
try {
|
|
31
|
+
const stat = execSync(`git diff --shortstat ${hash}^ ${hash}`, { encoding: "utf-8", timeout: 5000 });
|
|
32
|
+
const fm = stat.match(/(\d+)\s+files?\s+changed/);
|
|
33
|
+
const im = stat.match(/(\d+)\s+insertions?/);
|
|
34
|
+
const dm = stat.match(/(\d+)\s+deletions?/);
|
|
35
|
+
if (fm)
|
|
36
|
+
files = parseInt(fm[1]);
|
|
37
|
+
if (im)
|
|
38
|
+
insertions = parseInt(im[1]);
|
|
39
|
+
if (dm)
|
|
40
|
+
deletions = parseInt(dm[1]);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
/* first commit or error */
|
|
44
|
+
}
|
|
45
|
+
commits.push({ hash: hash.substring(0, 8), message, files, insertions, deletions });
|
|
46
|
+
}
|
|
47
|
+
return commits;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function analyzeCommits(commits, requireConventional) {
|
|
54
|
+
const issues = [];
|
|
55
|
+
for (const c of commits) {
|
|
56
|
+
// Vague message check
|
|
57
|
+
if (VAGUE_MESSAGES.some((r) => r.test(c.message.trim()))) {
|
|
58
|
+
issues.push({
|
|
59
|
+
hash: c.hash,
|
|
60
|
+
message: c.message,
|
|
61
|
+
kind: "vague-message",
|
|
62
|
+
detail: "Commit message is too vague — describe what and why",
|
|
63
|
+
severity: "medium",
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// Conventional commit check
|
|
67
|
+
if (requireConventional && !CONVENTIONAL_REGEX.test(c.message)) {
|
|
68
|
+
issues.push({
|
|
69
|
+
hash: c.hash,
|
|
70
|
+
message: c.message,
|
|
71
|
+
kind: "non-conventional",
|
|
72
|
+
detail: "Missing conventional commit prefix (feat:, fix:, etc.)",
|
|
73
|
+
severity: "low",
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// Message length
|
|
77
|
+
if (c.message.length < 10) {
|
|
78
|
+
issues.push({
|
|
79
|
+
hash: c.hash,
|
|
80
|
+
message: c.message,
|
|
81
|
+
kind: "short-message",
|
|
82
|
+
detail: `Message only ${c.message.length} chars — too short to be descriptive`,
|
|
83
|
+
severity: "low",
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (c.message.length > 100) {
|
|
87
|
+
issues.push({
|
|
88
|
+
hash: c.hash,
|
|
89
|
+
message: c.message,
|
|
90
|
+
kind: "long-subject",
|
|
91
|
+
detail: `Subject line is ${c.message.length} chars — keep under 72`,
|
|
92
|
+
severity: "low",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// Oversized diff
|
|
96
|
+
if (c.files > 20) {
|
|
97
|
+
issues.push({
|
|
98
|
+
hash: c.hash,
|
|
99
|
+
message: c.message,
|
|
100
|
+
kind: "oversized-diff",
|
|
101
|
+
detail: `${c.files} files changed — consider splitting into atomic commits`,
|
|
102
|
+
severity: "high",
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (c.insertions + c.deletions > 1000) {
|
|
106
|
+
issues.push({
|
|
107
|
+
hash: c.hash,
|
|
108
|
+
message: c.message,
|
|
109
|
+
kind: "massive-change",
|
|
110
|
+
detail: `${c.insertions}+ / ${c.deletions}- lines — too large for effective review`,
|
|
111
|
+
severity: "high",
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// Merge commit detection (simple)
|
|
115
|
+
if (/^Merge\s+(branch|pull)/i.test(c.message)) {
|
|
116
|
+
// Not an issue per se, but track for stats
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return issues.sort((a, b) => {
|
|
120
|
+
const sev = { high: 3, medium: 2, low: 1 };
|
|
121
|
+
return sev[b.severity] - sev[a.severity];
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
125
|
+
export function runCommitHygiene(argv) {
|
|
126
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
127
|
+
console.log(`
|
|
128
|
+
judges commit-hygiene — Audit commit message and diff quality
|
|
129
|
+
|
|
130
|
+
Usage:
|
|
131
|
+
judges commit-hygiene
|
|
132
|
+
judges commit-hygiene --count 50
|
|
133
|
+
judges commit-hygiene --conventional
|
|
134
|
+
judges commit-hygiene --format json
|
|
135
|
+
|
|
136
|
+
Options:
|
|
137
|
+
--count <n> Number of recent commits to analyze (default: 20)
|
|
138
|
+
--conventional Require conventional commit format
|
|
139
|
+
--format json JSON output
|
|
140
|
+
--help, -h Show this help
|
|
141
|
+
`);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
145
|
+
const count = parseInt(argv.find((_a, i) => argv[i - 1] === "--count") || "20");
|
|
146
|
+
const requireConventional = argv.includes("--conventional");
|
|
147
|
+
const commits = getCommits(count);
|
|
148
|
+
if (commits.length === 0) {
|
|
149
|
+
console.log(" No commits found. Ensure you're in a git repository.");
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const issues = analyzeCommits(commits, requireConventional);
|
|
153
|
+
if (format === "json") {
|
|
154
|
+
console.log(JSON.stringify({ commits: commits.length, issues, timestamp: new Date().toISOString() }, null, 2));
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
console.log(`\n Commit Hygiene — ${commits.length} commits analyzed, ${issues.length} issue(s)\n ──────────────────────────`);
|
|
158
|
+
if (issues.length === 0) {
|
|
159
|
+
console.log(" ✅ All commits look clean");
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
for (const issue of issues.slice(0, 30)) {
|
|
163
|
+
const icon = issue.severity === "high" ? "🔴" : issue.severity === "medium" ? "🟡" : "⚪";
|
|
164
|
+
console.log(` ${icon} ${issue.hash} "${issue.message.substring(0, 50)}"`);
|
|
165
|
+
console.log(` ${issue.detail}`);
|
|
166
|
+
}
|
|
167
|
+
if (issues.length > 30)
|
|
168
|
+
console.log(`\n ... and ${issues.length - 30} more`);
|
|
169
|
+
}
|
|
170
|
+
// Summary stats
|
|
171
|
+
const avgSize = commits.reduce((s, c) => s + c.insertions + c.deletions, 0) / commits.length;
|
|
172
|
+
console.log(`\n Avg change size: ${Math.round(avgSize)} lines/commit`);
|
|
173
|
+
console.log(` Issues: ${issues.filter((i) => i.severity === "high").length} high, ${issues.filter((i) => i.severity === "medium").length} medium, ${issues.filter((i) => i.severity === "low").length} low\n`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=commit-hygiene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-hygiene.js","sourceRoot":"","sources":["../../src/commands/commit-hygiene.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-readiness.d.ts","sourceRoot":"","sources":["../../src/commands/deploy-readiness.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4LH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsDvD"}
|