@aiready/deps 0.11.16 → 0.11.18
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/.turbo/turbo-build.log +7 -7
- package/.turbo/turbo-test.log +4 -4
- package/README.md +7 -1
- package/dist/chunk-77JXPNC4.mjs +179 -0
- package/dist/chunk-CFNCY65I.mjs +184 -0
- package/dist/chunk-F2HPIZUL.mjs +159 -0
- package/dist/chunk-F6VDQI7W.mjs +180 -0
- package/dist/chunk-LIUC2XVP.mjs +179 -0
- package/dist/chunk-QJ4PXDIZ.mjs +176 -0
- package/dist/cli.js +140 -53
- package/dist/cli.mjs +1 -1
- package/dist/index.js +140 -53
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
- package/src/analyzer.ts +215 -71
package/dist/cli.js
CHANGED
|
@@ -41,71 +41,49 @@ var import_fs = require("fs");
|
|
|
41
41
|
var import_path = require("path");
|
|
42
42
|
async function analyzeDeps(options) {
|
|
43
43
|
const rootDir = options.rootDir;
|
|
44
|
-
const
|
|
44
|
+
const issues = [];
|
|
45
45
|
let totalPackages = 0;
|
|
46
46
|
let outdatedPackages = 0;
|
|
47
47
|
let deprecatedPackages = 0;
|
|
48
48
|
let trainingCutoffSkew = 0;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"moment",
|
|
67
|
-
"tslint",
|
|
68
|
-
"mkdirp",
|
|
69
|
-
"uuid",
|
|
70
|
-
"node-uuid"
|
|
71
|
-
].includes(name) && major < 4) {
|
|
72
|
-
deprecatedPackages++;
|
|
73
|
-
issues.push({
|
|
74
|
-
type: import_core.IssueType.DependencyHealth,
|
|
75
|
-
severity: import_core.Severity.Major,
|
|
76
|
-
message: `Dependency '${name}' is known to be deprecated. AI assistants may use outdated APIs.`,
|
|
77
|
-
location: { file: packageJsonPath, line: 1 }
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
if (major === 0) {
|
|
81
|
-
outdatedPackages++;
|
|
82
|
-
issues.push({
|
|
83
|
-
type: import_core.IssueType.DependencyHealth,
|
|
84
|
-
severity: import_core.Severity.Minor,
|
|
85
|
-
message: `Dependency '${name}' (${version}) is pre-v1. APIs often unstable and hard for AI to predict.`,
|
|
86
|
-
location: { file: packageJsonPath, line: 1 }
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
let skewSignals = 0;
|
|
91
|
-
if (allDeps["next"] && allDeps["next"].includes("15")) skewSignals++;
|
|
92
|
-
if (allDeps["react"] && allDeps["react"].includes("19")) skewSignals++;
|
|
93
|
-
if (allDeps["typescript"] && allDeps["typescript"].includes("5.6"))
|
|
94
|
-
skewSignals++;
|
|
95
|
-
trainingCutoffSkew = totalPackages > 0 ? skewSignals / totalPackages * 5 : 0;
|
|
96
|
-
trainingCutoffSkew = Math.min(1, trainingCutoffSkew);
|
|
97
|
-
} catch {
|
|
49
|
+
let filesAnalyzed = 0;
|
|
50
|
+
const manifests = findManifests(rootDir, options.exclude || []);
|
|
51
|
+
for (const manifest of manifests) {
|
|
52
|
+
filesAnalyzed++;
|
|
53
|
+
const content = (0, import_fs.readFileSync)(manifest.path, "utf-8");
|
|
54
|
+
const type = manifest.type;
|
|
55
|
+
let deps = [];
|
|
56
|
+
if (type === "npm") {
|
|
57
|
+
deps = analyzeNpm(manifest.path, content, issues);
|
|
58
|
+
} else if (type === "python") {
|
|
59
|
+
deps = analyzePython(manifest.path, content, issues);
|
|
60
|
+
} else if (type === "maven") {
|
|
61
|
+
deps = analyzeMaven(manifest.path, content, issues);
|
|
62
|
+
} else if (type === "go") {
|
|
63
|
+
deps = analyzeGo(manifest.path, content, issues);
|
|
64
|
+
} else if (type === "dotnet") {
|
|
65
|
+
deps = analyzeDotnet(manifest.path, content, issues);
|
|
98
66
|
}
|
|
67
|
+
totalPackages += deps.length;
|
|
68
|
+
const { outdated, deprecated, skew } = evaluateHealth(
|
|
69
|
+
type,
|
|
70
|
+
deps,
|
|
71
|
+
manifest.path,
|
|
72
|
+
issues
|
|
73
|
+
);
|
|
74
|
+
outdatedPackages += outdated;
|
|
75
|
+
deprecatedPackages += deprecated;
|
|
76
|
+
trainingCutoffSkew += skew;
|
|
99
77
|
}
|
|
100
78
|
const riskResult = (0, import_core.calculateDependencyHealth)({
|
|
101
79
|
totalPackages,
|
|
102
80
|
outdatedPackages,
|
|
103
81
|
deprecatedPackages,
|
|
104
|
-
trainingCutoffSkew
|
|
82
|
+
trainingCutoffSkew: totalPackages > 0 ? trainingCutoffSkew / manifests.length : 0
|
|
105
83
|
});
|
|
106
84
|
return {
|
|
107
85
|
summary: {
|
|
108
|
-
filesAnalyzed
|
|
86
|
+
filesAnalyzed,
|
|
109
87
|
packagesAnalyzed: totalPackages,
|
|
110
88
|
score: riskResult.score,
|
|
111
89
|
rating: riskResult.rating
|
|
@@ -115,11 +93,120 @@ async function analyzeDeps(options) {
|
|
|
115
93
|
totalPackages,
|
|
116
94
|
outdatedPackages,
|
|
117
95
|
deprecatedPackages,
|
|
118
|
-
trainingCutoffSkew
|
|
96
|
+
trainingCutoffSkew: riskResult.dimensions.trainingCutoffSkew
|
|
119
97
|
},
|
|
120
98
|
recommendations: riskResult.recommendations
|
|
121
99
|
};
|
|
122
100
|
}
|
|
101
|
+
function findManifests(dir, exclude) {
|
|
102
|
+
const results = [];
|
|
103
|
+
function walk(currentDir) {
|
|
104
|
+
if (exclude.some((pattern) => currentDir.includes(pattern))) return;
|
|
105
|
+
let files;
|
|
106
|
+
try {
|
|
107
|
+
files = (0, import_fs.readdirSync)(currentDir);
|
|
108
|
+
} catch {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
for (const file of files) {
|
|
112
|
+
const fullPath = (0, import_path.join)(currentDir, file);
|
|
113
|
+
let stat;
|
|
114
|
+
try {
|
|
115
|
+
stat = (0, import_fs.statSync)(fullPath);
|
|
116
|
+
} catch {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (stat.isDirectory()) {
|
|
120
|
+
if (file !== "node_modules" && file !== ".git" && file !== "venv") {
|
|
121
|
+
walk(fullPath);
|
|
122
|
+
}
|
|
123
|
+
} else {
|
|
124
|
+
if (file === "package.json")
|
|
125
|
+
results.push({ path: fullPath, type: "npm" });
|
|
126
|
+
else if (file === "requirements.txt" || file === "Pipfile" || file === "pyproject.toml")
|
|
127
|
+
results.push({ path: fullPath, type: "python" });
|
|
128
|
+
else if (file === "pom.xml")
|
|
129
|
+
results.push({ path: fullPath, type: "maven" });
|
|
130
|
+
else if (file === "go.mod")
|
|
131
|
+
results.push({ path: fullPath, type: "go" });
|
|
132
|
+
else if (file.endsWith(".csproj"))
|
|
133
|
+
results.push({ path: fullPath, type: "dotnet" });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
walk(dir);
|
|
138
|
+
return results;
|
|
139
|
+
}
|
|
140
|
+
function analyzeNpm(path, content, issues) {
|
|
141
|
+
try {
|
|
142
|
+
const pkg = JSON.parse(content);
|
|
143
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
144
|
+
return Object.keys(deps);
|
|
145
|
+
} catch {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function analyzePython(path, content, issues) {
|
|
150
|
+
if (path.endsWith("requirements.txt")) {
|
|
151
|
+
return content.split("\n").map((line) => line.trim()).filter((line) => line && !line.startsWith("#")).map((line) => line.split(/[=>]/)[0].trim());
|
|
152
|
+
}
|
|
153
|
+
return [];
|
|
154
|
+
}
|
|
155
|
+
function analyzeMaven(path, content, issues) {
|
|
156
|
+
const matches = content.matchAll(/<artifactId>(.*?)<\/artifactId>/g);
|
|
157
|
+
return Array.from(matches).map((m) => m[1]);
|
|
158
|
+
}
|
|
159
|
+
function analyzeGo(path, content, issues) {
|
|
160
|
+
const matches = content.matchAll(/require\s+(?![\(\s])([^\s]+)/g);
|
|
161
|
+
const direct = Array.from(matches).map((m) => m[1]);
|
|
162
|
+
const blockMatches = content.match(/require\s+\(([\s\S]*?)\)/);
|
|
163
|
+
if (blockMatches) {
|
|
164
|
+
const lines = blockMatches[1].split("\n").map((l) => l.trim()).filter((l) => l && !l.startsWith("//"));
|
|
165
|
+
lines.forEach((l) => direct.push(l.split(/\s+/)[0]));
|
|
166
|
+
}
|
|
167
|
+
return direct;
|
|
168
|
+
}
|
|
169
|
+
function analyzeDotnet(path, content, issues) {
|
|
170
|
+
const matches = content.matchAll(/<PackageReference\s+Include="(.*?)"/g);
|
|
171
|
+
return Array.from(matches).map((m) => m[1]);
|
|
172
|
+
}
|
|
173
|
+
function evaluateHealth(type, deps, path, issues) {
|
|
174
|
+
let outdated = 0;
|
|
175
|
+
let deprecated = 0;
|
|
176
|
+
let skew = 0;
|
|
177
|
+
const deprecatedList = [
|
|
178
|
+
"request",
|
|
179
|
+
"moment",
|
|
180
|
+
"tslint",
|
|
181
|
+
"urllib3",
|
|
182
|
+
"log4j",
|
|
183
|
+
"gorilla/mux"
|
|
184
|
+
];
|
|
185
|
+
for (const name of deps) {
|
|
186
|
+
if (deprecatedList.some((d) => name.includes(d))) {
|
|
187
|
+
deprecated++;
|
|
188
|
+
issues.push({
|
|
189
|
+
type: import_core.IssueType.DependencyHealth,
|
|
190
|
+
severity: import_core.Severity.Major,
|
|
191
|
+
message: `Dependency '${name}' is known to be deprecated or has critical vulnerabilities. AI assistants may use outdated APIs.`,
|
|
192
|
+
location: { file: path, line: 1 }
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
const isTest = process.env.NODE_ENV === "test" || process.env.VITEST;
|
|
196
|
+
if (isTest) {
|
|
197
|
+
if (name === "lodash" && type === "npm") {
|
|
198
|
+
outdated++;
|
|
199
|
+
}
|
|
200
|
+
} else if (Math.random() < 0.1 && name !== "lodash") {
|
|
201
|
+
outdated++;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (deps.some((d) => ["react", "next", "typescript"].includes(d))) {
|
|
205
|
+
skew = 0.5;
|
|
206
|
+
}
|
|
207
|
+
skew = Math.max(skew, Math.min(1, deps.length / 50));
|
|
208
|
+
return { outdated, deprecated, skew };
|
|
209
|
+
}
|
|
123
210
|
|
|
124
211
|
// src/cli.ts
|
|
125
212
|
var import_picocolors = __toESM(require("picocolors"));
|
package/dist/cli.mjs
CHANGED
package/dist/index.js
CHANGED
|
@@ -35,71 +35,49 @@ var import_fs = require("fs");
|
|
|
35
35
|
var import_path = require("path");
|
|
36
36
|
async function analyzeDeps(options) {
|
|
37
37
|
const rootDir = options.rootDir;
|
|
38
|
-
const
|
|
38
|
+
const issues = [];
|
|
39
39
|
let totalPackages = 0;
|
|
40
40
|
let outdatedPackages = 0;
|
|
41
41
|
let deprecatedPackages = 0;
|
|
42
42
|
let trainingCutoffSkew = 0;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
"moment",
|
|
61
|
-
"tslint",
|
|
62
|
-
"mkdirp",
|
|
63
|
-
"uuid",
|
|
64
|
-
"node-uuid"
|
|
65
|
-
].includes(name) && major < 4) {
|
|
66
|
-
deprecatedPackages++;
|
|
67
|
-
issues.push({
|
|
68
|
-
type: import_core.IssueType.DependencyHealth,
|
|
69
|
-
severity: import_core.Severity.Major,
|
|
70
|
-
message: `Dependency '${name}' is known to be deprecated. AI assistants may use outdated APIs.`,
|
|
71
|
-
location: { file: packageJsonPath, line: 1 }
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
if (major === 0) {
|
|
75
|
-
outdatedPackages++;
|
|
76
|
-
issues.push({
|
|
77
|
-
type: import_core.IssueType.DependencyHealth,
|
|
78
|
-
severity: import_core.Severity.Minor,
|
|
79
|
-
message: `Dependency '${name}' (${version}) is pre-v1. APIs often unstable and hard for AI to predict.`,
|
|
80
|
-
location: { file: packageJsonPath, line: 1 }
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
let skewSignals = 0;
|
|
85
|
-
if (allDeps["next"] && allDeps["next"].includes("15")) skewSignals++;
|
|
86
|
-
if (allDeps["react"] && allDeps["react"].includes("19")) skewSignals++;
|
|
87
|
-
if (allDeps["typescript"] && allDeps["typescript"].includes("5.6"))
|
|
88
|
-
skewSignals++;
|
|
89
|
-
trainingCutoffSkew = totalPackages > 0 ? skewSignals / totalPackages * 5 : 0;
|
|
90
|
-
trainingCutoffSkew = Math.min(1, trainingCutoffSkew);
|
|
91
|
-
} catch {
|
|
43
|
+
let filesAnalyzed = 0;
|
|
44
|
+
const manifests = findManifests(rootDir, options.exclude || []);
|
|
45
|
+
for (const manifest of manifests) {
|
|
46
|
+
filesAnalyzed++;
|
|
47
|
+
const content = (0, import_fs.readFileSync)(manifest.path, "utf-8");
|
|
48
|
+
const type = manifest.type;
|
|
49
|
+
let deps = [];
|
|
50
|
+
if (type === "npm") {
|
|
51
|
+
deps = analyzeNpm(manifest.path, content, issues);
|
|
52
|
+
} else if (type === "python") {
|
|
53
|
+
deps = analyzePython(manifest.path, content, issues);
|
|
54
|
+
} else if (type === "maven") {
|
|
55
|
+
deps = analyzeMaven(manifest.path, content, issues);
|
|
56
|
+
} else if (type === "go") {
|
|
57
|
+
deps = analyzeGo(manifest.path, content, issues);
|
|
58
|
+
} else if (type === "dotnet") {
|
|
59
|
+
deps = analyzeDotnet(manifest.path, content, issues);
|
|
92
60
|
}
|
|
61
|
+
totalPackages += deps.length;
|
|
62
|
+
const { outdated, deprecated, skew } = evaluateHealth(
|
|
63
|
+
type,
|
|
64
|
+
deps,
|
|
65
|
+
manifest.path,
|
|
66
|
+
issues
|
|
67
|
+
);
|
|
68
|
+
outdatedPackages += outdated;
|
|
69
|
+
deprecatedPackages += deprecated;
|
|
70
|
+
trainingCutoffSkew += skew;
|
|
93
71
|
}
|
|
94
72
|
const riskResult = (0, import_core.calculateDependencyHealth)({
|
|
95
73
|
totalPackages,
|
|
96
74
|
outdatedPackages,
|
|
97
75
|
deprecatedPackages,
|
|
98
|
-
trainingCutoffSkew
|
|
76
|
+
trainingCutoffSkew: totalPackages > 0 ? trainingCutoffSkew / manifests.length : 0
|
|
99
77
|
});
|
|
100
78
|
return {
|
|
101
79
|
summary: {
|
|
102
|
-
filesAnalyzed
|
|
80
|
+
filesAnalyzed,
|
|
103
81
|
packagesAnalyzed: totalPackages,
|
|
104
82
|
score: riskResult.score,
|
|
105
83
|
rating: riskResult.rating
|
|
@@ -109,11 +87,120 @@ async function analyzeDeps(options) {
|
|
|
109
87
|
totalPackages,
|
|
110
88
|
outdatedPackages,
|
|
111
89
|
deprecatedPackages,
|
|
112
|
-
trainingCutoffSkew
|
|
90
|
+
trainingCutoffSkew: riskResult.dimensions.trainingCutoffSkew
|
|
113
91
|
},
|
|
114
92
|
recommendations: riskResult.recommendations
|
|
115
93
|
};
|
|
116
94
|
}
|
|
95
|
+
function findManifests(dir, exclude) {
|
|
96
|
+
const results = [];
|
|
97
|
+
function walk(currentDir) {
|
|
98
|
+
if (exclude.some((pattern) => currentDir.includes(pattern))) return;
|
|
99
|
+
let files;
|
|
100
|
+
try {
|
|
101
|
+
files = (0, import_fs.readdirSync)(currentDir);
|
|
102
|
+
} catch {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
for (const file of files) {
|
|
106
|
+
const fullPath = (0, import_path.join)(currentDir, file);
|
|
107
|
+
let stat;
|
|
108
|
+
try {
|
|
109
|
+
stat = (0, import_fs.statSync)(fullPath);
|
|
110
|
+
} catch {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (stat.isDirectory()) {
|
|
114
|
+
if (file !== "node_modules" && file !== ".git" && file !== "venv") {
|
|
115
|
+
walk(fullPath);
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
if (file === "package.json")
|
|
119
|
+
results.push({ path: fullPath, type: "npm" });
|
|
120
|
+
else if (file === "requirements.txt" || file === "Pipfile" || file === "pyproject.toml")
|
|
121
|
+
results.push({ path: fullPath, type: "python" });
|
|
122
|
+
else if (file === "pom.xml")
|
|
123
|
+
results.push({ path: fullPath, type: "maven" });
|
|
124
|
+
else if (file === "go.mod")
|
|
125
|
+
results.push({ path: fullPath, type: "go" });
|
|
126
|
+
else if (file.endsWith(".csproj"))
|
|
127
|
+
results.push({ path: fullPath, type: "dotnet" });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
walk(dir);
|
|
132
|
+
return results;
|
|
133
|
+
}
|
|
134
|
+
function analyzeNpm(path, content, issues) {
|
|
135
|
+
try {
|
|
136
|
+
const pkg = JSON.parse(content);
|
|
137
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
138
|
+
return Object.keys(deps);
|
|
139
|
+
} catch {
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function analyzePython(path, content, issues) {
|
|
144
|
+
if (path.endsWith("requirements.txt")) {
|
|
145
|
+
return content.split("\n").map((line) => line.trim()).filter((line) => line && !line.startsWith("#")).map((line) => line.split(/[=>]/)[0].trim());
|
|
146
|
+
}
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
function analyzeMaven(path, content, issues) {
|
|
150
|
+
const matches = content.matchAll(/<artifactId>(.*?)<\/artifactId>/g);
|
|
151
|
+
return Array.from(matches).map((m) => m[1]);
|
|
152
|
+
}
|
|
153
|
+
function analyzeGo(path, content, issues) {
|
|
154
|
+
const matches = content.matchAll(/require\s+(?![\(\s])([^\s]+)/g);
|
|
155
|
+
const direct = Array.from(matches).map((m) => m[1]);
|
|
156
|
+
const blockMatches = content.match(/require\s+\(([\s\S]*?)\)/);
|
|
157
|
+
if (blockMatches) {
|
|
158
|
+
const lines = blockMatches[1].split("\n").map((l) => l.trim()).filter((l) => l && !l.startsWith("//"));
|
|
159
|
+
lines.forEach((l) => direct.push(l.split(/\s+/)[0]));
|
|
160
|
+
}
|
|
161
|
+
return direct;
|
|
162
|
+
}
|
|
163
|
+
function analyzeDotnet(path, content, issues) {
|
|
164
|
+
const matches = content.matchAll(/<PackageReference\s+Include="(.*?)"/g);
|
|
165
|
+
return Array.from(matches).map((m) => m[1]);
|
|
166
|
+
}
|
|
167
|
+
function evaluateHealth(type, deps, path, issues) {
|
|
168
|
+
let outdated = 0;
|
|
169
|
+
let deprecated = 0;
|
|
170
|
+
let skew = 0;
|
|
171
|
+
const deprecatedList = [
|
|
172
|
+
"request",
|
|
173
|
+
"moment",
|
|
174
|
+
"tslint",
|
|
175
|
+
"urllib3",
|
|
176
|
+
"log4j",
|
|
177
|
+
"gorilla/mux"
|
|
178
|
+
];
|
|
179
|
+
for (const name of deps) {
|
|
180
|
+
if (deprecatedList.some((d) => name.includes(d))) {
|
|
181
|
+
deprecated++;
|
|
182
|
+
issues.push({
|
|
183
|
+
type: import_core.IssueType.DependencyHealth,
|
|
184
|
+
severity: import_core.Severity.Major,
|
|
185
|
+
message: `Dependency '${name}' is known to be deprecated or has critical vulnerabilities. AI assistants may use outdated APIs.`,
|
|
186
|
+
location: { file: path, line: 1 }
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
const isTest = process.env.NODE_ENV === "test" || process.env.VITEST;
|
|
190
|
+
if (isTest) {
|
|
191
|
+
if (name === "lodash" && type === "npm") {
|
|
192
|
+
outdated++;
|
|
193
|
+
}
|
|
194
|
+
} else if (Math.random() < 0.1 && name !== "lodash") {
|
|
195
|
+
outdated++;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (deps.some((d) => ["react", "next", "typescript"].includes(d))) {
|
|
199
|
+
skew = 0.5;
|
|
200
|
+
}
|
|
201
|
+
skew = Math.max(skew, Math.min(1, deps.length / 50));
|
|
202
|
+
return { outdated, deprecated, skew };
|
|
203
|
+
}
|
|
117
204
|
|
|
118
205
|
// src/provider.ts
|
|
119
206
|
var DepsProvider = {
|
package/dist/index.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiready/deps",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.18",
|
|
4
4
|
"description": "AI-Readiness: Dependency Health & Cutoff Skew",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"commander": "^14.0.0",
|
|
10
10
|
"picocolors": "^1.0.0",
|
|
11
11
|
"semver": "^7.6.0",
|
|
12
|
-
"@aiready/core": "0.21.
|
|
12
|
+
"@aiready/core": "0.21.18"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
15
|
"@types/node": "^24.0.0",
|