@kb-labs/quality-entry 2.14.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/README.md +120 -0
- package/dist/cli/commands/build-order.d.ts +16 -0
- package/dist/cli/commands/build-order.js +113 -0
- package/dist/cli/commands/build-order.js.map +1 -0
- package/dist/cli/commands/check-builds.d.ts +10 -0
- package/dist/cli/commands/check-builds.js +93 -0
- package/dist/cli/commands/check-builds.js.map +1 -0
- package/dist/cli/commands/check-tests.d.ts +10 -0
- package/dist/cli/commands/check-tests.js +114 -0
- package/dist/cli/commands/check-tests.js.map +1 -0
- package/dist/cli/commands/check-types.d.ts +10 -0
- package/dist/cli/commands/check-types.js +108 -0
- package/dist/cli/commands/check-types.js.map +1 -0
- package/dist/cli/commands/cycles.d.ts +17 -0
- package/dist/cli/commands/cycles.js +85 -0
- package/dist/cli/commands/cycles.js.map +1 -0
- package/dist/cli/commands/dead-code.d.ts +10 -0
- package/dist/cli/commands/dead-code.js +217 -0
- package/dist/cli/commands/dead-code.js.map +1 -0
- package/dist/cli/commands/fix-deps.d.ts +28 -0
- package/dist/cli/commands/fix-deps.js +389 -0
- package/dist/cli/commands/fix-deps.js.map +1 -0
- package/dist/cli/commands/flags.d.ts +344 -0
- package/dist/cli/commands/flags.js +298 -0
- package/dist/cli/commands/flags.js.map +1 -0
- package/dist/cli/commands/health.d.ts +10 -0
- package/dist/cli/commands/health.js +210 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/index.d.ts +14 -0
- package/dist/cli/commands/index.js +1747 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +10 -0
- package/dist/cli/commands/stats.js +282 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/visualize.d.ts +26 -0
- package/dist/cli/commands/visualize.js +210 -0
- package/dist/cli/commands/visualize.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +666 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +168 -0
- package/dist/manifest.js +666 -0
- package/dist/manifest.js.map +1 -0
- package/dist/rest/handlers/build-order-handler.d.ts +17 -0
- package/dist/rest/handlers/build-order-handler.js +28 -0
- package/dist/rest/handlers/build-order-handler.js.map +1 -0
- package/dist/rest/handlers/builds-handler.d.ts +12 -0
- package/dist/rest/handlers/builds-handler.js +17 -0
- package/dist/rest/handlers/builds-handler.js.map +1 -0
- package/dist/rest/handlers/cycles-handler.d.ts +13 -0
- package/dist/rest/handlers/cycles-handler.js +23 -0
- package/dist/rest/handlers/cycles-handler.js.map +1 -0
- package/dist/rest/handlers/dependencies-handler.d.ts +14 -0
- package/dist/rest/handlers/dependencies-handler.js +19 -0
- package/dist/rest/handlers/dependencies-handler.js.map +1 -0
- package/dist/rest/handlers/graph-handler.d.ts +30 -0
- package/dist/rest/handlers/graph-handler.js +155 -0
- package/dist/rest/handlers/graph-handler.js.map +1 -0
- package/dist/rest/handlers/health-handler.d.ts +15 -0
- package/dist/rest/handlers/health-handler.js +19 -0
- package/dist/rest/handlers/health-handler.js.map +1 -0
- package/dist/rest/handlers/stale-handler.d.ts +30 -0
- package/dist/rest/handlers/stale-handler.js +20 -0
- package/dist/rest/handlers/stale-handler.js.map +1 -0
- package/dist/rest/handlers/stats-handler.d.ts +16 -0
- package/dist/rest/handlers/stats-handler.js +29 -0
- package/dist/rest/handlers/stats-handler.js.map +1 -0
- package/dist/rest/handlers/tests-handler.d.ts +14 -0
- package/dist/rest/handlers/tests-handler.js +19 -0
- package/dist/rest/handlers/tests-handler.js.map +1 -0
- package/dist/rest/handlers/types-handler.d.ts +12 -0
- package/dist/rest/handlers/types-handler.js +17 -0
- package/dist/rest/handlers/types-handler.js.map +1 -0
- package/package.json +98 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { defineCommand, useLoader } from '@kb-labs/sdk';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
|
|
5
|
+
// src/cli/commands/fix-deps.ts
|
|
6
|
+
var fix_deps_default = defineCommand({
|
|
7
|
+
id: "quality:fix-deps",
|
|
8
|
+
description: "Auto-fix dependency issues",
|
|
9
|
+
handler: {
|
|
10
|
+
async execute(ctx, input) {
|
|
11
|
+
const { ui, platform } = ctx;
|
|
12
|
+
const flags = input.flags ?? input;
|
|
13
|
+
const dryRun = flags["dry-run"] ?? false;
|
|
14
|
+
const removeUnused = flags["remove-unused"] || flags.all;
|
|
15
|
+
const addMissing = flags["add-missing"] || flags.all;
|
|
16
|
+
const alignVersions = flags["align-versions"] || flags.all;
|
|
17
|
+
const showStats = flags.stats;
|
|
18
|
+
if (showStats) {
|
|
19
|
+
const stats = await getDependencyStats(ctx.cwd);
|
|
20
|
+
outputStats(stats, flags, ui);
|
|
21
|
+
return { exitCode: 0 };
|
|
22
|
+
}
|
|
23
|
+
if (!removeUnused && !addMissing && !alignVersions) {
|
|
24
|
+
ui?.error?.("No fix options specified. Use --remove-unused, --add-missing, --align-versions, or --all");
|
|
25
|
+
return { exitCode: 1 };
|
|
26
|
+
}
|
|
27
|
+
const loader = useLoader("Scanning packages...");
|
|
28
|
+
loader.start();
|
|
29
|
+
const result = {
|
|
30
|
+
packagesScanned: 0,
|
|
31
|
+
removedDeps: [],
|
|
32
|
+
addedDeps: [],
|
|
33
|
+
alignedDeps: [],
|
|
34
|
+
dryRun
|
|
35
|
+
};
|
|
36
|
+
const packages = findPackages(ctx.cwd);
|
|
37
|
+
result.packagesScanned = packages.length;
|
|
38
|
+
loader.update({ text: `Scanned ${packages.length} packages` });
|
|
39
|
+
if (alignVersions) {
|
|
40
|
+
loader.update({ text: "Analyzing duplicate dependencies..." });
|
|
41
|
+
const aligned = await alignDuplicateVersions(packages, dryRun);
|
|
42
|
+
result.alignedDeps = aligned;
|
|
43
|
+
}
|
|
44
|
+
if (addMissing) {
|
|
45
|
+
loader.update({ text: "Checking for missing workspace dependencies..." });
|
|
46
|
+
const added = await addMissingWorkspaceDeps(packages, dryRun);
|
|
47
|
+
result.addedDeps = added;
|
|
48
|
+
}
|
|
49
|
+
if (removeUnused) {
|
|
50
|
+
loader.update({ text: "Checking for unused dependencies..." });
|
|
51
|
+
const removed = await removeUnusedDeps(packages, dryRun);
|
|
52
|
+
result.removedDeps = removed;
|
|
53
|
+
}
|
|
54
|
+
loader.succeed("Dependency analysis completed");
|
|
55
|
+
await platform.analytics.track("quality:fix-deps", {
|
|
56
|
+
dryRun,
|
|
57
|
+
packagesScanned: result.packagesScanned,
|
|
58
|
+
removedCount: result.removedDeps.length,
|
|
59
|
+
addedCount: result.addedDeps.length,
|
|
60
|
+
alignedCount: result.alignedDeps.length
|
|
61
|
+
});
|
|
62
|
+
outputResults(result, flags, ui);
|
|
63
|
+
return {
|
|
64
|
+
exitCode: 0,
|
|
65
|
+
result
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
function findPackages(rootDir) {
|
|
71
|
+
const packages = [];
|
|
72
|
+
if (!fs.existsSync(rootDir)) {
|
|
73
|
+
return packages;
|
|
74
|
+
}
|
|
75
|
+
const entries = fs.readdirSync(rootDir, { withFileTypes: true });
|
|
76
|
+
for (const entry of entries) {
|
|
77
|
+
if (!entry.isDirectory() || !entry.name.startsWith("kb-labs-")) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const repoPath = path.join(rootDir, entry.name);
|
|
81
|
+
const packagesDir = path.join(repoPath, "packages");
|
|
82
|
+
if (!fs.existsSync(packagesDir)) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const packageDirs = fs.readdirSync(packagesDir, { withFileTypes: true });
|
|
86
|
+
for (const pkgDir of packageDirs) {
|
|
87
|
+
if (!pkgDir.isDirectory()) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const packageJsonPath = path.join(packagesDir, pkgDir.name, "package.json");
|
|
91
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
92
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
93
|
+
packages.push({
|
|
94
|
+
name: packageJson.name || pkgDir.name,
|
|
95
|
+
path: packageJsonPath,
|
|
96
|
+
json: packageJson
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return packages;
|
|
102
|
+
}
|
|
103
|
+
async function getDependencyStats(rootDir) {
|
|
104
|
+
const packages = findPackages(rootDir);
|
|
105
|
+
const allDeps = /* @__PURE__ */ new Map();
|
|
106
|
+
for (const pkg of packages) {
|
|
107
|
+
const deps = {
|
|
108
|
+
...pkg.json.dependencies,
|
|
109
|
+
...pkg.json.devDependencies
|
|
110
|
+
};
|
|
111
|
+
for (const [dep, version] of Object.entries(deps)) {
|
|
112
|
+
if (!allDeps.has(dep)) {
|
|
113
|
+
allDeps.set(dep, /* @__PURE__ */ new Set());
|
|
114
|
+
}
|
|
115
|
+
allDeps.get(dep).add(version);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const duplicates = Array.from(allDeps.entries()).filter(([_, versions]) => versions.size > 1).filter(([dep]) => !dep.startsWith("@kb-labs/"));
|
|
119
|
+
const topUsed = Array.from(allDeps.entries()).map(([name, versions]) => ({ name, count: versions.size > 1 ? versions.size : 1 })).sort((a, b) => b.count - a.count).slice(0, 10);
|
|
120
|
+
return {
|
|
121
|
+
totalPackages: packages.length,
|
|
122
|
+
totalDeps: allDeps.size,
|
|
123
|
+
duplicates: duplicates.length,
|
|
124
|
+
topUsed
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
async function alignDuplicateVersions(packages, dryRun) {
|
|
128
|
+
const aligned = [];
|
|
129
|
+
const depVersions = /* @__PURE__ */ new Map();
|
|
130
|
+
for (const pkg of packages) {
|
|
131
|
+
const deps = {
|
|
132
|
+
...pkg.json.dependencies,
|
|
133
|
+
...pkg.json.devDependencies
|
|
134
|
+
};
|
|
135
|
+
for (const [dep, version] of Object.entries(deps)) {
|
|
136
|
+
if (dep.startsWith("@kb-labs/")) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (!depVersions.has(dep)) {
|
|
140
|
+
depVersions.set(dep, /* @__PURE__ */ new Map());
|
|
141
|
+
}
|
|
142
|
+
const versions = depVersions.get(dep);
|
|
143
|
+
if (!versions.has(version)) {
|
|
144
|
+
versions.set(version, /* @__PURE__ */ new Set());
|
|
145
|
+
}
|
|
146
|
+
versions.get(version).add(pkg.name);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
for (const [dep, versions] of depVersions.entries()) {
|
|
150
|
+
if (versions.size <= 1) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
const versionCounts = Array.from(versions.entries()).map(([ver, pkgs]) => ({
|
|
154
|
+
version: ver,
|
|
155
|
+
count: pkgs.size,
|
|
156
|
+
packages: Array.from(pkgs)
|
|
157
|
+
}));
|
|
158
|
+
versionCounts.sort((a, b) => b.count - a.count);
|
|
159
|
+
const targetVersion = versionCounts[0]?.version;
|
|
160
|
+
if (!targetVersion) {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
for (const { version, packages: pkgNames } of versionCounts.slice(1)) {
|
|
164
|
+
aligned.push({
|
|
165
|
+
dep,
|
|
166
|
+
from: version,
|
|
167
|
+
to: targetVersion,
|
|
168
|
+
packages: pkgNames
|
|
169
|
+
});
|
|
170
|
+
if (!dryRun) {
|
|
171
|
+
for (const pkgName of pkgNames) {
|
|
172
|
+
const pkg = packages.find((p) => p.name === pkgName);
|
|
173
|
+
if (!pkg) {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (pkg.json.dependencies?.[dep]) {
|
|
177
|
+
pkg.json.dependencies[dep] = targetVersion;
|
|
178
|
+
}
|
|
179
|
+
if (pkg.json.devDependencies?.[dep]) {
|
|
180
|
+
pkg.json.devDependencies[dep] = targetVersion;
|
|
181
|
+
}
|
|
182
|
+
fs.writeFileSync(pkg.path, JSON.stringify(pkg.json, null, 2) + "\n");
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return aligned;
|
|
188
|
+
}
|
|
189
|
+
async function addMissingWorkspaceDeps(packages, dryRun) {
|
|
190
|
+
const added = [];
|
|
191
|
+
const workspacePackages = /* @__PURE__ */ new Map();
|
|
192
|
+
for (const pkg of packages) {
|
|
193
|
+
if (pkg.name.startsWith("@kb-labs/")) {
|
|
194
|
+
workspacePackages.set(pkg.name, "workspace:*");
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
for (const pkg of packages) {
|
|
198
|
+
const packageDir = path.dirname(pkg.path);
|
|
199
|
+
const srcDir = path.join(packageDir, "src");
|
|
200
|
+
if (!fs.existsSync(srcDir)) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
const imports = scanImports(srcDir);
|
|
204
|
+
const currentDeps = {
|
|
205
|
+
...pkg.json.dependencies,
|
|
206
|
+
...pkg.json.devDependencies
|
|
207
|
+
};
|
|
208
|
+
for (const imp of imports) {
|
|
209
|
+
if (imp.startsWith("@kb-labs/") && workspacePackages.has(imp) && !currentDeps[imp]) {
|
|
210
|
+
added.push({
|
|
211
|
+
package: pkg.name,
|
|
212
|
+
dep: imp,
|
|
213
|
+
version: "workspace:*"
|
|
214
|
+
});
|
|
215
|
+
if (!dryRun) {
|
|
216
|
+
if (!pkg.json.dependencies) {
|
|
217
|
+
pkg.json.dependencies = {};
|
|
218
|
+
}
|
|
219
|
+
pkg.json.dependencies[imp] = "workspace:*";
|
|
220
|
+
fs.writeFileSync(pkg.path, JSON.stringify(pkg.json, null, 2) + "\n");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return added;
|
|
226
|
+
}
|
|
227
|
+
async function removeUnusedDeps(packages, dryRun) {
|
|
228
|
+
const removed = [];
|
|
229
|
+
for (const pkg of packages) {
|
|
230
|
+
const packageDir = path.dirname(pkg.path);
|
|
231
|
+
const srcDir = path.join(packageDir, "src");
|
|
232
|
+
if (!fs.existsSync(srcDir)) {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const imports = new Set(scanImports(srcDir));
|
|
236
|
+
const deps = {
|
|
237
|
+
...pkg.json.dependencies,
|
|
238
|
+
...pkg.json.devDependencies
|
|
239
|
+
};
|
|
240
|
+
for (const dep of Object.keys(deps)) {
|
|
241
|
+
if (isProtectedDep(dep)) {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (!imports.has(dep)) {
|
|
245
|
+
removed.push({
|
|
246
|
+
package: pkg.name,
|
|
247
|
+
dep
|
|
248
|
+
});
|
|
249
|
+
if (!dryRun) {
|
|
250
|
+
delete pkg.json.dependencies?.[dep];
|
|
251
|
+
delete pkg.json.devDependencies?.[dep];
|
|
252
|
+
fs.writeFileSync(pkg.path, JSON.stringify(pkg.json, null, 2) + "\n");
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return removed;
|
|
258
|
+
}
|
|
259
|
+
function scanImports(dir) {
|
|
260
|
+
const imports = [];
|
|
261
|
+
function walk(currentDir) {
|
|
262
|
+
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
263
|
+
for (const entry of entries) {
|
|
264
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
265
|
+
if (entry.isDirectory()) {
|
|
266
|
+
walk(fullPath);
|
|
267
|
+
} else if (entry.isFile() && /\.(ts|tsx|js|jsx)$/.test(entry.name)) {
|
|
268
|
+
const content = fs.readFileSync(fullPath, "utf-8");
|
|
269
|
+
const importRegex = /(?:import|require)\s*\(?['"]([^'"]+)['"]\)?/g;
|
|
270
|
+
let match;
|
|
271
|
+
while ((match = importRegex.exec(content)) !== null) {
|
|
272
|
+
const imp = match[1];
|
|
273
|
+
if (!imp) {
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
const pkgName = imp.startsWith("@") ? imp.split("/").slice(0, 2).join("/") : imp.split("/")[0];
|
|
277
|
+
if (pkgName) {
|
|
278
|
+
imports.push(pkgName);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
walk(dir);
|
|
285
|
+
return Array.from(new Set(imports));
|
|
286
|
+
}
|
|
287
|
+
function isProtectedDep(dep) {
|
|
288
|
+
const protectedDeps = [
|
|
289
|
+
"typescript",
|
|
290
|
+
"tsup",
|
|
291
|
+
"esbuild",
|
|
292
|
+
"vite",
|
|
293
|
+
"rollup",
|
|
294
|
+
"rimraf",
|
|
295
|
+
"vitest",
|
|
296
|
+
"jest",
|
|
297
|
+
"playwright",
|
|
298
|
+
"eslint",
|
|
299
|
+
"prettier"
|
|
300
|
+
];
|
|
301
|
+
return protectedDeps.some((p) => dep === p || dep.startsWith(`${p}-`) || dep.startsWith(`@${p}/`));
|
|
302
|
+
}
|
|
303
|
+
function outputStats(stats, flags, ui) {
|
|
304
|
+
if (flags.json) {
|
|
305
|
+
ui?.json?.(stats);
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
const sections = [];
|
|
309
|
+
sections.push({
|
|
310
|
+
header: "Overview",
|
|
311
|
+
items: [
|
|
312
|
+
`Total Packages: ${stats.totalPackages}`,
|
|
313
|
+
`Total Dependencies: ${stats.totalDeps}`,
|
|
314
|
+
`Duplicate Versions: ${stats.duplicates}`
|
|
315
|
+
]
|
|
316
|
+
});
|
|
317
|
+
if (stats.topUsed.length > 0) {
|
|
318
|
+
sections.push({
|
|
319
|
+
header: "Top 10 Most Used",
|
|
320
|
+
items: stats.topUsed.map((d) => `${d.name} (${d.count} packages)`)
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
ui?.success?.("Dependency statistics", {
|
|
324
|
+
title: "\u{1F4CA} Dependency Statistics",
|
|
325
|
+
sections
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
function outputResults(result, flags, ui) {
|
|
329
|
+
if (flags.json) {
|
|
330
|
+
ui?.json?.(result);
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
const sections = [];
|
|
334
|
+
const summaryItems = [
|
|
335
|
+
`Packages Scanned: ${result.packagesScanned}`,
|
|
336
|
+
`Mode: ${result.dryRun ? "\u{1F50D} Dry Run (no changes applied)" : "\u2705 Changes Applied"}`
|
|
337
|
+
];
|
|
338
|
+
sections.push({ header: "Summary", items: summaryItems });
|
|
339
|
+
if (result.alignedDeps.length > 0) {
|
|
340
|
+
const alignedItems = result.alignedDeps.map(
|
|
341
|
+
(a) => `${a.dep}: ${a.from} \u2192 ${a.to} (${a.packages.length} packages)`
|
|
342
|
+
);
|
|
343
|
+
sections.push({ header: "Aligned Versions", items: alignedItems.slice(0, 10) });
|
|
344
|
+
if (result.alignedDeps.length > 10) {
|
|
345
|
+
const lastSection = sections[sections.length - 1];
|
|
346
|
+
if (lastSection) {
|
|
347
|
+
lastSection.items.push(`... and ${result.alignedDeps.length - 10} more`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
if (result.addedDeps.length > 0) {
|
|
352
|
+
const addedItems = result.addedDeps.map((a) => `${a.package}: +${a.dep}`);
|
|
353
|
+
sections.push({ header: "Added Dependencies", items: addedItems.slice(0, 10) });
|
|
354
|
+
if (result.addedDeps.length > 10) {
|
|
355
|
+
const lastSection = sections[sections.length - 1];
|
|
356
|
+
if (lastSection) {
|
|
357
|
+
lastSection.items.push(`... and ${result.addedDeps.length - 10} more`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (result.removedDeps.length > 0) {
|
|
362
|
+
const removedItems = result.removedDeps.map((r) => `${r.package}: -${r.dep}`);
|
|
363
|
+
sections.push({ header: "Removed Dependencies", items: removedItems.slice(0, 10) });
|
|
364
|
+
if (result.removedDeps.length > 10) {
|
|
365
|
+
const lastSection = sections[sections.length - 1];
|
|
366
|
+
if (lastSection) {
|
|
367
|
+
lastSection.items.push(`... and ${result.removedDeps.length - 10} more`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (result.alignedDeps.length === 0 && result.addedDeps.length === 0 && result.removedDeps.length === 0) {
|
|
372
|
+
sections.push({ header: "Result", items: ["\u2705 No issues found!"] });
|
|
373
|
+
}
|
|
374
|
+
if (result.dryRun && (result.alignedDeps.length > 0 || result.addedDeps.length > 0 || result.removedDeps.length > 0)) {
|
|
375
|
+
sections.push({
|
|
376
|
+
header: "Next Steps",
|
|
377
|
+
items: ["Remove --dry-run flag to apply changes", "Run `pnpm install` after applying changes"]
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
const title = result.dryRun ? "\u{1F50D} Dependency Fix Preview" : "\u2705 Dependency Fix Complete";
|
|
381
|
+
ui?.success?.("Dependency fix completed", {
|
|
382
|
+
title,
|
|
383
|
+
sections
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
export { fix_deps_default as default };
|
|
388
|
+
//# sourceMappingURL=fix-deps.js.map
|
|
389
|
+
//# sourceMappingURL=fix-deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/fix-deps.ts"],"names":[],"mappings":";;;;;AAiCA,IAAO,mBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,kBAAA;AAAA,EACJ,WAAA,EAAa,4BAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAoD;AACtF,MAAA,MAAM,EAAE,EAAA,EAAI,QAAA,EAAS,GAAI,GAAA;AAGzB,MAAA,MAAM,KAAA,GAAS,MAAc,KAAA,IAAS,KAAA;AAEtC,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,SAAS,CAAA,IAAK,KAAA;AACnC,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,eAAe,CAAA,IAAK,KAAA,CAAM,GAAA;AACrD,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,aAAa,CAAA,IAAK,KAAA,CAAM,GAAA;AACjD,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,gBAAgB,CAAA,IAAK,KAAA,CAAM,GAAA;AACvD,MAAA,MAAM,YAAY,KAAA,CAAM,KAAA;AAGxB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,KAAA,GAAQ,MAAM,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA;AAC9C,QAAA,WAAA,CAAY,KAAA,EAAO,OAAO,EAAE,CAAA;AAC5B,QAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,MACvB;AAGA,MAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,IAAc,CAAC,aAAA,EAAe;AAClD,QAAA,EAAA,EAAI,QAAQ,0FAA0F,CAAA;AACtG,QAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,MACvB;AAEA,MAAA,MAAM,MAAA,GAAS,UAAU,sBAAsB,CAAA;AAC/C,MAAA,MAAA,CAAO,KAAA,EAAM;AAEb,MAAA,MAAM,MAAA,GAAoB;AAAA,QACxB,eAAA,EAAiB,CAAA;AAAA,QACjB,aAAa,EAAC;AAAA,QACd,WAAW,EAAC;AAAA,QACZ,aAAa,EAAC;AAAA,QACd;AAAA,OACF;AAEA,MAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACrC,MAAA,MAAA,CAAO,kBAAkB,QAAA,CAAS,MAAA;AAElC,MAAA,MAAA,CAAO,OAAO,EAAE,IAAA,EAAM,WAAW,QAAA,CAAS,MAAM,aAAa,CAAA;AAG7D,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAM,qCAAA,EAAuC,CAAA;AAC7D,QAAA,MAAM,OAAA,GAAU,MAAM,sBAAA,CAAuB,QAAA,EAAU,MAAM,CAAA;AAC7D,QAAA,MAAA,CAAO,WAAA,GAAc,OAAA;AAAA,MACvB;AAGA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAM,gDAAA,EAAkD,CAAA;AACxE,QAAA,MAAM,KAAA,GAAQ,MAAM,uBAAA,CAAwB,QAAA,EAAU,MAAM,CAAA;AAC5D,QAAA,MAAA,CAAO,SAAA,GAAY,KAAA;AAAA,MACrB;AAGA,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAM,qCAAA,EAAuC,CAAA;AAC7D,QAAA,MAAM,OAAA,GAAU,MAAM,gBAAA,CAAiB,QAAA,EAAU,MAAM,CAAA;AACvD,QAAA,MAAA,CAAO,WAAA,GAAc,OAAA;AAAA,MACvB;AAEA,MAAA,MAAA,CAAO,QAAQ,+BAA+B,CAAA;AAG9C,MAAA,MAAM,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,kBAAA,EAAoB;AAAA,QACjD,MAAA;AAAA,QACA,iBAAiB,MAAA,CAAO,eAAA;AAAA,QACxB,YAAA,EAAc,OAAO,WAAA,CAAY,MAAA;AAAA,QACjC,UAAA,EAAY,OAAO,SAAA,CAAU,MAAA;AAAA,QAC7B,YAAA,EAAc,OAAO,WAAA,CAAY;AAAA,OAClC,CAAA;AAGD,MAAA,aAAA,CAAc,MAAA,EAAQ,OAAO,EAAE,CAAA;AAE/B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,CAAA;AAAA,QACV;AAAA,OACF;AAAA,IACF;AAAA;AAEJ,CAAC;AAKD,SAAS,aAAa,OAAA,EAAmE;AACvF,EAAA,MAAM,WAA6D,EAAC;AAEpE,EAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,OAAO,CAAA,EAAG;AAC3B,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,EAAA,CAAG,WAAA,CAAY,SAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAE/D,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,MAAM,WAAA,EAAY,IAAK,CAAC,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AAE1E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,MAAM,IAAI,CAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AAElD,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,WAAW,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AAE3C,IAAA,MAAM,cAAc,EAAA,CAAG,WAAA,CAAY,aAAa,EAAE,aAAA,EAAe,MAAM,CAAA;AAEvE,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAY,EAAG;AAAC,QAAA;AAAA,MAAS;AAErC,MAAA,MAAM,kBAAkB,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,MAAA,CAAO,MAAM,cAAc,CAAA;AAE1E,MAAA,IAAI,EAAA,CAAG,UAAA,CAAW,eAAe,CAAA,EAAG;AAClC,QAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,GAAG,YAAA,CAAa,eAAA,EAAiB,OAAO,CAAC,CAAA;AACxE,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAM,WAAA,CAAY,IAAA,IAAQ,MAAA,CAAO,IAAA;AAAA,UACjC,IAAA,EAAM,eAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,eAAe,mBAAmB,OAAA,EAA+B;AAC/D,EAAA,MAAM,QAAA,GAAW,aAAa,OAAO,CAAA;AACrC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAyB;AAE7C,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAG,IAAI,IAAA,CAAK,YAAA;AAAA,MACZ,GAAG,IAAI,IAAA,CAAK;AAAA,KACd;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACjD,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,QAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,kBAAK,IAAI,GAAA,EAAK,CAAA;AAAA,MAC5B;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,CAAG,GAAA,CAAI,OAAiB,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,CAAA,CAC5C,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,QAAQ,CAAA,KAAM,SAAS,IAAA,GAAO,CAAC,CAAA,CAC3C,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,CAAC,GAAA,CAAI,UAAA,CAAW,WAAW,CAAC,CAAA;AAEjD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,CACzC,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,QAAQ,CAAA,MAAO,EAAE,MAAM,KAAA,EAAO,QAAA,CAAS,IAAA,GAAO,CAAA,GAAI,SAAS,IAAA,GAAO,CAAA,EAAE,CAAE,CAAA,CAClF,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAK,CAAA,CAChC,KAAA,CAAM,GAAG,EAAE,CAAA;AAEd,EAAA,OAAO;AAAA,IACL,eAAe,QAAA,CAAS,MAAA;AAAA,IACxB,WAAW,OAAA,CAAQ,IAAA;AAAA,IACnB,YAAY,UAAA,CAAW,MAAA;AAAA,IACvB;AAAA,GACF;AACF;AAKA,eAAe,sBAAA,CACb,UACA,MAAA,EAC+E;AAC/E,EAAA,MAAM,UAAgF,EAAC;AAGvF,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsC;AAE9D,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAG,IAAI,IAAA,CAAK,YAAA;AAAA,MACZ,GAAG,IAAI,IAAA,CAAK;AAAA,KACd;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACjD,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAAC,QAAA;AAAA,MAAS;AAE3C,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,QAAA,WAAA,CAAY,GAAA,CAAI,GAAA,kBAAK,IAAI,GAAA,EAAK,CAAA;AAAA,MAChC;AAEA,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACpC,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAiB,CAAA,EAAG;AACpC,QAAA,QAAA,CAAS,GAAA,CAAI,OAAA,kBAAmB,IAAI,GAAA,EAAK,CAAA;AAAA,MAC3C;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,OAAiB,CAAA,CAAG,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,IAC/C;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,CAAA,IAAK,WAAA,CAAY,SAAQ,EAAG;AACnD,IAAA,IAAI,QAAA,CAAS,QAAQ,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AAGlC,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,IAAI,CAAA,MAAO;AAAA,MACzE,OAAA,EAAS,GAAA;AAAA,MACT,OAAO,IAAA,CAAK,IAAA;AAAA,MACZ,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,IAAI;AAAA,KAC3B,CAAE,CAAA;AAEF,IAAA,aAAA,CAAc,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAC9C,IAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,CAAC,CAAA,EAAG,OAAA;AACxC,IAAA,IAAI,CAAC,aAAA,EAAe;AAAC,MAAA;AAAA,IAAS;AAG9B,IAAA,KAAA,MAAW,EAAE,SAAS,QAAA,EAAU,QAAA,MAAc,aAAA,CAAc,KAAA,CAAM,CAAC,CAAA,EAAG;AACpE,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,GAAA;AAAA,QACA,IAAA,EAAM,OAAA;AAAA,QACN,EAAA,EAAI,aAAA;AAAA,QACJ,QAAA,EAAU;AAAA,OACX,CAAA;AAED,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,MAAM,MAAM,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,OAAO,CAAA;AACjD,UAAA,IAAI,CAAC,GAAA,EAAK;AAAC,YAAA;AAAA,UAAS;AAEpB,UAAA,IAAI,GAAA,CAAI,IAAA,CAAK,YAAA,GAAe,GAAG,CAAA,EAAG;AAChC,YAAA,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA,GAAI,aAAA;AAAA,UAC/B;AACA,UAAA,IAAI,GAAA,CAAI,IAAA,CAAK,eAAA,GAAkB,GAAG,CAAA,EAAG;AACnC,YAAA,GAAA,CAAI,IAAA,CAAK,eAAA,CAAgB,GAAG,CAAA,GAAI,aAAA;AAAA,UAClC;AAEA,UAAA,EAAA,CAAG,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,GAAI,IAAI,CAAA;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,eAAe,uBAAA,CACb,UACA,MAAA,EACmE;AACnE,EAAA,MAAM,QAAkE,EAAC;AAGzE,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoB;AAClD,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA,EAAG;AACpC,MAAA,iBAAA,CAAkB,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,aAAa,CAAA;AAAA,IAC/C;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACxC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAE1C,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AAGtC,IAAA,MAAM,OAAA,GAAU,YAAY,MAAM,CAAA;AAClC,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAG,IAAI,IAAA,CAAK,YAAA;AAAA,MACZ,GAAG,IAAI,IAAA,CAAK;AAAA,KACd;AAEA,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,WAAW,CAAA,IAAK,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA,IAAK,CAAC,WAAA,CAAY,GAAG,CAAA,EAAG;AAClF,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,SAAS,GAAA,CAAI,IAAA;AAAA,UACb,GAAA,EAAK,GAAA;AAAA,UACL,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,IAAI,CAAC,GAAA,CAAI,IAAA,CAAK,YAAA,EAAc;AAC1B,YAAA,GAAA,CAAI,IAAA,CAAK,eAAe,EAAC;AAAA,UAC3B;AACA,UAAA,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA,GAAI,aAAA;AAC7B,UAAA,EAAA,CAAG,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,GAAI,IAAI,CAAA;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAe,gBAAA,CACb,UACA,MAAA,EACkD;AAClD,EAAA,MAAM,UAAmD,EAAC;AAE1D,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACxC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAE1C,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AAGtC,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,WAAA,CAAY,MAAM,CAAC,CAAA;AAE3C,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAG,IAAI,IAAA,CAAK,YAAA;AAAA,MACZ,GAAG,IAAI,IAAA,CAAK;AAAA,KACd;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AAEnC,MAAA,IAAI,cAAA,CAAe,GAAG,CAAA,EAAG;AAAC,QAAA;AAAA,MAAS;AAGnC,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,SAAS,GAAA,CAAI,IAAA;AAAA,UACb;AAAA,SACD,CAAA;AAED,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO,GAAA,CAAI,IAAA,CAAK,YAAA,GAAe,GAAG,CAAA;AAClC,UAAA,OAAO,GAAA,CAAI,IAAA,CAAK,eAAA,GAAkB,GAAG,CAAA;AACrC,UAAA,EAAA,CAAG,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,GAAI,IAAI,CAAA;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,YAAY,GAAA,EAAuB;AAC1C,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,SAAS,KAAK,UAAA,EAAoB;AAChC,IAAA,MAAM,UAAU,EAAA,CAAG,WAAA,CAAY,YAAY,EAAE,aAAA,EAAe,MAAM,CAAA;AAElE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,MAAM,IAAI,CAAA;AAEjD,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,MACf,CAAA,MAAA,IAAW,MAAM,MAAA,EAAO,IAAK,qBAAqB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AAClE,QAAA,MAAM,OAAA,GAAU,EAAA,CAAG,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAGjD,QAAA,MAAM,WAAA,GAAc,8CAAA;AACpB,QAAA,IAAI,KAAA;AACJ,QAAA,OAAA,CAAQ,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AACnD,UAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,UAAA,IAAI,CAAC,GAAA,EAAK;AAAC,YAAA;AAAA,UAAS;AAEpB,UAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,GAAG,IAAI,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA,GAAI,IAAI,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAC7F,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,GAAG,CAAA;AACR,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,OAAO,CAAC,CAAA;AACpC;AAKA,SAAS,eAAe,GAAA,EAAsB;AAC5C,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,YAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,cAAc,IAAA,CAAK,CAAA,CAAA,KAAK,GAAA,KAAQ,CAAA,IAAK,IAAI,UAAA,CAAW,CAAA,EAAG,CAAC,CAAA,CAAA,CAAG,KAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,CAAA;AACjG;AAKA,SAAS,WAAA,CAAY,KAAA,EAAY,KAAA,EAAY,EAAA,EAAS;AACpD,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,EAAA,EAAI,OAAO,KAAK,CAAA;AAChB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,WAAuD,EAAC;AAE9D,EAAA,QAAA,CAAS,IAAA,CAAK;AAAA,IACZ,MAAA,EAAQ,UAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,CAAA,gBAAA,EAAmB,MAAM,aAAa,CAAA,CAAA;AAAA,MACtC,CAAA,oBAAA,EAAuB,MAAM,SAAS,CAAA,CAAA;AAAA,MACtC,CAAA,oBAAA,EAAuB,MAAM,UAAU,CAAA;AAAA;AACzC,GACD,CAAA;AAED,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC5B,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,MAAA,EAAQ,kBAAA;AAAA,MACR,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA,UAAA,CAAY;AAAA,KACvE,CAAA;AAAA,EACH;AAEA,EAAA,EAAA,EAAI,UAAU,uBAAA,EAAyB;AAAA,IACrC,KAAA,EAAO,iCAAA;AAAA,IACP;AAAA,GACD,CAAA;AACH;AAKA,SAAS,aAAA,CAAc,MAAA,EAAmB,KAAA,EAAY,EAAA,EAAS;AAC7D,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,EAAA,EAAI,OAAO,MAAM,CAAA;AACjB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,WAAuD,EAAC;AAG9D,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,CAAA,kBAAA,EAAqB,OAAO,eAAe,CAAA,CAAA;AAAA,IAC3C,CAAA,MAAA,EAAS,MAAA,CAAO,MAAA,GAAS,wCAAA,GAAoC,wBAAmB,CAAA;AAAA,GAClF;AACA,EAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,cAAc,CAAA;AAGxD,EAAA,IAAI,MAAA,CAAO,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACjC,IAAA,MAAM,YAAA,GAAe,OAAO,WAAA,CAAY,GAAA;AAAA,MACtC,CAAA,CAAA,KAAK,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,QAAA,EAAM,CAAA,CAAE,EAAE,CAAA,EAAA,EAAK,CAAA,CAAE,SAAS,MAAM,CAAA,UAAA;AAAA,KAC1D;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,kBAAA,EAAoB,KAAA,EAAO,aAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA;AAC9E,IAAA,IAAI,MAAA,CAAO,WAAA,CAAY,MAAA,GAAS,EAAA,EAAI;AAClC,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAChD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,CAAY,MAAM,IAAA,CAAK,CAAA,QAAA,EAAW,OAAO,WAAA,CAAY,MAAA,GAAS,EAAE,CAAA,KAAA,CAAO,CAAA;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA,GAAA,EAAM,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA;AACtE,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,oBAAA,EAAsB,KAAA,EAAO,WAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA;AAC9E,IAAA,IAAI,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,EAAA,EAAI;AAChC,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAChD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,CAAY,MAAM,IAAA,CAAK,CAAA,QAAA,EAAW,OAAO,SAAA,CAAU,MAAA,GAAS,EAAE,CAAA,KAAA,CAAO,CAAA;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACjC,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA,GAAA,EAAM,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA;AAC1E,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,sBAAA,EAAwB,KAAA,EAAO,aAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA;AAClF,IAAA,IAAI,MAAA,CAAO,WAAA,CAAY,MAAA,GAAS,EAAA,EAAI;AAClC,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAChD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,CAAY,MAAM,IAAA,CAAK,CAAA,QAAA,EAAW,OAAO,WAAA,CAAY,MAAA,GAAS,EAAE,CAAA,KAAA,CAAO,CAAA;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IACE,MAAA,CAAO,WAAA,CAAY,MAAA,KAAW,CAAA,IAC9B,MAAA,CAAO,SAAA,CAAU,MAAA,KAAW,CAAA,IAC5B,MAAA,CAAO,WAAA,CAAY,MAAA,KAAW,CAAA,EAC9B;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAC,yBAAoB,GAAG,CAAA;AAAA,EACnE;AAGA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,CAAO,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,CAAA,IAAK,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA,CAAA,EAAI;AACpH,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,MAAA,EAAQ,YAAA;AAAA,MACR,KAAA,EAAO,CAAC,wCAAA,EAA0C,2CAA2C;AAAA,KAC9F,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,GAAS,kCAAA,GAA8B,gCAAA;AAE5D,EAAA,EAAA,EAAI,UAAU,0BAAA,EAA4B;AAAA,IACxC,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH","file":"fix-deps.js","sourcesContent":["/**\n * quality:fix-deps - Dependency auto-fixer\n *\n * Automatically fixes dependency issues:\n * - Remove unused dependencies\n * - Add missing workspace dependencies\n * - Align duplicate dependency versions\n *\n * Supports --dry-run for previewing changes without applying\n */\n\nimport { defineCommand, type PluginContextV3, useLoader } from '@kb-labs/sdk';\nimport type { FixDepsFlags } from './flags.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n// Input type with backward compatibility\ntype FixDepsInput = FixDepsFlags & { argv?: string[] };\n\ninterface FixResult {\n packagesScanned: number;\n removedDeps: Array<{ package: string; dep: string }>;\n addedDeps: Array<{ package: string; dep: string; version: string }>;\n alignedDeps: Array<{ dep: string; from: string; to: string; packages: string[] }>;\n dryRun: boolean;\n}\n\ntype FixDepsCommandResult = {\n exitCode: number;\n result?: FixResult;\n meta?: Record<string, unknown>;\n};\n\nexport default defineCommand({\n id: 'quality:fix-deps',\n description: 'Auto-fix dependency issues',\n\n handler: {\n async execute(ctx: PluginContextV3, input: FixDepsInput): Promise<FixDepsCommandResult> {\n const { ui, platform } = ctx;\n\n // V3: Flags come in input.flags object (not auto-merged)\n const flags = (input as any).flags ?? input;\n\n const dryRun = flags['dry-run'] ?? false;\n const removeUnused = flags['remove-unused'] || flags.all;\n const addMissing = flags['add-missing'] || flags.all;\n const alignVersions = flags['align-versions'] || flags.all;\n const showStats = flags.stats;\n\n // If stats requested, show dependency statistics\n if (showStats) {\n const stats = await getDependencyStats(ctx.cwd);\n outputStats(stats, flags, ui);\n return { exitCode: 0 };\n }\n\n // If no fix flags specified, show error\n if (!removeUnused && !addMissing && !alignVersions) {\n ui?.error?.('No fix options specified. Use --remove-unused, --add-missing, --align-versions, or --all');\n return { exitCode: 1 };\n }\n\n const loader = useLoader('Scanning packages...');\n loader.start();\n\n const result: FixResult = {\n packagesScanned: 0,\n removedDeps: [],\n addedDeps: [],\n alignedDeps: [],\n dryRun,\n };\n\n const packages = findPackages(ctx.cwd);\n result.packagesScanned = packages.length;\n\n loader.update({ text: `Scanned ${packages.length} packages` });\n\n // 1. Align versions first (if requested)\n if (alignVersions) {\n loader.update({ text: 'Analyzing duplicate dependencies...' });\n const aligned = await alignDuplicateVersions(packages, dryRun);\n result.alignedDeps = aligned;\n }\n\n // 2. Add missing workspace dependencies\n if (addMissing) {\n loader.update({ text: 'Checking for missing workspace dependencies...' });\n const added = await addMissingWorkspaceDeps(packages, dryRun);\n result.addedDeps = added;\n }\n\n // 3. Remove unused dependencies\n if (removeUnused) {\n loader.update({ text: 'Checking for unused dependencies...' });\n const removed = await removeUnusedDeps(packages, dryRun);\n result.removedDeps = removed;\n }\n\n loader.succeed('Dependency analysis completed');\n\n // Track analytics\n await platform.analytics.track('quality:fix-deps', {\n dryRun,\n packagesScanned: result.packagesScanned,\n removedCount: result.removedDeps.length,\n addedCount: result.addedDeps.length,\n alignedCount: result.alignedDeps.length,\n });\n\n // Output results\n outputResults(result, flags, ui);\n\n return {\n exitCode: 0,\n result,\n };\n },\n },\n});\n\n/**\n * Find all packages in the monorepo\n */\nfunction findPackages(rootDir: string): Array<{ name: string; path: string; json: any }> {\n const packages: Array<{ name: string; path: string; json: any }> = [];\n\n if (!fs.existsSync(rootDir)) {\n return packages;\n }\n\n const entries = fs.readdirSync(rootDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith('kb-labs-')) {continue;}\n\n const repoPath = path.join(rootDir, entry.name);\n const packagesDir = path.join(repoPath, 'packages');\n\n if (!fs.existsSync(packagesDir)) {continue;}\n\n const packageDirs = fs.readdirSync(packagesDir, { withFileTypes: true });\n\n for (const pkgDir of packageDirs) {\n if (!pkgDir.isDirectory()) {continue;}\n\n const packageJsonPath = path.join(packagesDir, pkgDir.name, 'package.json');\n\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n packages.push({\n name: packageJson.name || pkgDir.name,\n path: packageJsonPath,\n json: packageJson,\n });\n }\n }\n }\n\n return packages;\n}\n\n/**\n * Get dependency statistics\n */\nasync function getDependencyStats(rootDir: string): Promise<any> {\n const packages = findPackages(rootDir);\n const allDeps = new Map<string, Set<string>>();\n\n for (const pkg of packages) {\n const deps = {\n ...pkg.json.dependencies,\n ...pkg.json.devDependencies,\n };\n\n for (const [dep, version] of Object.entries(deps)) {\n if (!allDeps.has(dep)) {\n allDeps.set(dep, new Set());\n }\n allDeps.get(dep)!.add(version as string);\n }\n }\n\n const duplicates = Array.from(allDeps.entries())\n .filter(([_, versions]) => versions.size > 1)\n .filter(([dep]) => !dep.startsWith('@kb-labs/'));\n\n const topUsed = Array.from(allDeps.entries())\n .map(([name, versions]) => ({ name, count: versions.size > 1 ? versions.size : 1 }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n return {\n totalPackages: packages.length,\n totalDeps: allDeps.size,\n duplicates: duplicates.length,\n topUsed,\n };\n}\n\n/**\n * Align duplicate dependency versions to most common version\n */\nasync function alignDuplicateVersions(\n packages: Array<{ name: string; path: string; json: any }>,\n dryRun: boolean\n): Promise<Array<{ dep: string; from: string; to: string; packages: string[] }>> {\n const aligned: Array<{ dep: string; from: string; to: string; packages: string[] }> = [];\n\n // Find all dependencies and their versions\n const depVersions = new Map<string, Map<string, Set<string>>>();\n\n for (const pkg of packages) {\n const deps = {\n ...pkg.json.dependencies,\n ...pkg.json.devDependencies,\n };\n\n for (const [dep, version] of Object.entries(deps)) {\n if (dep.startsWith('@kb-labs/')) {continue;} // Skip workspace deps\n\n if (!depVersions.has(dep)) {\n depVersions.set(dep, new Map());\n }\n\n const versions = depVersions.get(dep)!;\n if (!versions.has(version as string)) {\n versions.set(version as string, new Set());\n }\n versions.get(version as string)!.add(pkg.name);\n }\n }\n\n // Find duplicates and determine most common version\n for (const [dep, versions] of depVersions.entries()) {\n if (versions.size <= 1) {continue;}\n\n // Find most common version\n const versionCounts = Array.from(versions.entries()).map(([ver, pkgs]) => ({\n version: ver,\n count: pkgs.size,\n packages: Array.from(pkgs),\n }));\n\n versionCounts.sort((a, b) => b.count - a.count);\n const targetVersion = versionCounts[0]?.version;\n if (!targetVersion) {continue;}\n\n // Align all packages to target version\n for (const { version, packages: pkgNames } of versionCounts.slice(1)) {\n aligned.push({\n dep,\n from: version,\n to: targetVersion,\n packages: pkgNames,\n });\n\n if (!dryRun) {\n // Apply changes to package.json files\n for (const pkgName of pkgNames) {\n const pkg = packages.find(p => p.name === pkgName);\n if (!pkg) {continue;}\n\n if (pkg.json.dependencies?.[dep]) {\n pkg.json.dependencies[dep] = targetVersion;\n }\n if (pkg.json.devDependencies?.[dep]) {\n pkg.json.devDependencies[dep] = targetVersion;\n }\n\n fs.writeFileSync(pkg.path, JSON.stringify(pkg.json, null, 2) + '\\n');\n }\n }\n }\n }\n\n return aligned;\n}\n\n/**\n * Add missing workspace dependencies\n */\nasync function addMissingWorkspaceDeps(\n packages: Array<{ name: string; path: string; json: any }>,\n dryRun: boolean\n): Promise<Array<{ package: string; dep: string; version: string }>> {\n const added: Array<{ package: string; dep: string; version: string }> = [];\n\n // Build map of workspace packages\n const workspacePackages = new Map<string, string>();\n for (const pkg of packages) {\n if (pkg.name.startsWith('@kb-labs/')) {\n workspacePackages.set(pkg.name, 'workspace:*');\n }\n }\n\n // Check each package for missing workspace deps\n for (const pkg of packages) {\n const packageDir = path.dirname(pkg.path);\n const srcDir = path.join(packageDir, 'src');\n\n if (!fs.existsSync(srcDir)) {continue;}\n\n // Scan imports\n const imports = scanImports(srcDir);\n const currentDeps = {\n ...pkg.json.dependencies,\n ...pkg.json.devDependencies,\n };\n\n for (const imp of imports) {\n if (imp.startsWith('@kb-labs/') && workspacePackages.has(imp) && !currentDeps[imp]) {\n added.push({\n package: pkg.name,\n dep: imp,\n version: 'workspace:*',\n });\n\n if (!dryRun) {\n if (!pkg.json.dependencies) {\n pkg.json.dependencies = {};\n }\n pkg.json.dependencies[imp] = 'workspace:*';\n fs.writeFileSync(pkg.path, JSON.stringify(pkg.json, null, 2) + '\\n');\n }\n }\n }\n }\n\n return added;\n}\n\n/**\n * Remove unused dependencies\n */\nasync function removeUnusedDeps(\n packages: Array<{ name: string; path: string; json: any }>,\n dryRun: boolean\n): Promise<Array<{ package: string; dep: string }>> {\n const removed: Array<{ package: string; dep: string }> = [];\n\n for (const pkg of packages) {\n const packageDir = path.dirname(pkg.path);\n const srcDir = path.join(packageDir, 'src');\n\n if (!fs.existsSync(srcDir)) {continue;}\n\n // Scan imports\n const imports = new Set(scanImports(srcDir));\n\n const deps = {\n ...pkg.json.dependencies,\n ...pkg.json.devDependencies,\n };\n\n for (const dep of Object.keys(deps)) {\n // Skip protected dependencies\n if (isProtectedDep(dep)) {continue;}\n\n // Check if dependency is used\n if (!imports.has(dep)) {\n removed.push({\n package: pkg.name,\n dep,\n });\n\n if (!dryRun) {\n delete pkg.json.dependencies?.[dep];\n delete pkg.json.devDependencies?.[dep];\n fs.writeFileSync(pkg.path, JSON.stringify(pkg.json, null, 2) + '\\n');\n }\n }\n }\n }\n\n return removed;\n}\n\n/**\n * Scan directory for imports\n */\nfunction scanImports(dir: string): string[] {\n const imports: string[] = [];\n\n function walk(currentDir: string) {\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n walk(fullPath);\n } else if (entry.isFile() && /\\.(ts|tsx|js|jsx)$/.test(entry.name)) {\n const content = fs.readFileSync(fullPath, 'utf-8');\n\n // Match import statements\n const importRegex = /(?:import|require)\\s*\\(?['\"]([^'\"]+)['\"]\\)?/g;\n let match;\n while ((match = importRegex.exec(content)) !== null) {\n const imp = match[1];\n if (!imp) {continue;}\n // Extract package name (handle scoped packages)\n const pkgName = imp.startsWith('@') ? imp.split('/').slice(0, 2).join('/') : imp.split('/')[0];\n if (pkgName) {\n imports.push(pkgName);\n }\n }\n }\n }\n }\n\n walk(dir);\n return Array.from(new Set(imports));\n}\n\n/**\n * Check if dependency is protected (build tools, etc.)\n */\nfunction isProtectedDep(dep: string): boolean {\n const protectedDeps = [\n 'typescript',\n 'tsup',\n 'esbuild',\n 'vite',\n 'rollup',\n 'rimraf',\n 'vitest',\n 'jest',\n 'playwright',\n 'eslint',\n 'prettier',\n ];\n\n return protectedDeps.some(p => dep === p || dep.startsWith(`${p}-`) || dep.startsWith(`@${p}/`));\n}\n\n/**\n * Output dependency statistics\n */\nfunction outputStats(stats: any, flags: any, ui: any) {\n if (flags.json) {\n ui?.json?.(stats);\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n sections.push({\n header: 'Overview',\n items: [\n `Total Packages: ${stats.totalPackages}`,\n `Total Dependencies: ${stats.totalDeps}`,\n `Duplicate Versions: ${stats.duplicates}`,\n ],\n });\n\n if (stats.topUsed.length > 0) {\n sections.push({\n header: 'Top 10 Most Used',\n items: stats.topUsed.map((d: any) => `${d.name} (${d.count} packages)`),\n });\n }\n\n ui?.success?.('Dependency statistics', {\n title: '📊 Dependency Statistics',\n sections,\n });\n}\n\n/**\n * Output fix results\n */\nfunction outputResults(result: FixResult, flags: any, ui: any) {\n if (flags.json) {\n ui?.json?.(result);\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Summary\n const summaryItems = [\n `Packages Scanned: ${result.packagesScanned}`,\n `Mode: ${result.dryRun ? '🔍 Dry Run (no changes applied)' : '✅ Changes Applied'}`,\n ];\n sections.push({ header: 'Summary', items: summaryItems });\n\n // Aligned dependencies\n if (result.alignedDeps.length > 0) {\n const alignedItems = result.alignedDeps.map(\n a => `${a.dep}: ${a.from} → ${a.to} (${a.packages.length} packages)`\n );\n sections.push({ header: 'Aligned Versions', items: alignedItems.slice(0, 10) });\n if (result.alignedDeps.length > 10) {\n const lastSection = sections[sections.length - 1];\n if (lastSection) {\n lastSection.items.push(`... and ${result.alignedDeps.length - 10} more`);\n }\n }\n }\n\n // Added dependencies\n if (result.addedDeps.length > 0) {\n const addedItems = result.addedDeps.map(a => `${a.package}: +${a.dep}`);\n sections.push({ header: 'Added Dependencies', items: addedItems.slice(0, 10) });\n if (result.addedDeps.length > 10) {\n const lastSection = sections[sections.length - 1];\n if (lastSection) {\n lastSection.items.push(`... and ${result.addedDeps.length - 10} more`);\n }\n }\n }\n\n // Removed dependencies\n if (result.removedDeps.length > 0) {\n const removedItems = result.removedDeps.map(r => `${r.package}: -${r.dep}`);\n sections.push({ header: 'Removed Dependencies', items: removedItems.slice(0, 10) });\n if (result.removedDeps.length > 10) {\n const lastSection = sections[sections.length - 1];\n if (lastSection) {\n lastSection.items.push(`... and ${result.removedDeps.length - 10} more`);\n }\n }\n }\n\n // No changes\n if (\n result.alignedDeps.length === 0 &&\n result.addedDeps.length === 0 &&\n result.removedDeps.length === 0\n ) {\n sections.push({ header: 'Result', items: ['✅ No issues found!'] });\n }\n\n // Next steps for dry run\n if (result.dryRun && (result.alignedDeps.length > 0 || result.addedDeps.length > 0 || result.removedDeps.length > 0)) {\n sections.push({\n header: 'Next Steps',\n items: ['Remove --dry-run flag to apply changes', 'Run `pnpm install` after applying changes'],\n });\n }\n\n const title = result.dryRun ? '🔍 Dependency Fix Preview' : '✅ Dependency Fix Complete';\n\n ui?.success?.('Dependency fix completed', {\n title,\n sections,\n });\n}\n"]}
|