bob-app-assistant 0.0.1
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 +292 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +296 -0
- package/dist/cli.js.map +1 -0
- package/dist/database.d.ts +42 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +199 -0
- package/dist/database.js.map +1 -0
- package/dist/postinstall.d.ts +3 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +48 -0
- package/dist/postinstall.js.map +1 -0
- package/dist/routes/aiRoutes.d.ts +3 -0
- package/dist/routes/aiRoutes.d.ts.map +1 -0
- package/dist/routes/aiRoutes.js +1277 -0
- package/dist/routes/aiRoutes.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +120 -0
- package/dist/server.js.map +1 -0
- package/dist/services/apiTestingService.d.ts +90 -0
- package/dist/services/apiTestingService.d.ts.map +1 -0
- package/dist/services/apiTestingService.js +351 -0
- package/dist/services/apiTestingService.js.map +1 -0
- package/dist/services/backupService.d.ts +63 -0
- package/dist/services/backupService.d.ts.map +1 -0
- package/dist/services/backupService.js +235 -0
- package/dist/services/backupService.js.map +1 -0
- package/dist/services/bobShellService.d.ts +91 -0
- package/dist/services/bobShellService.d.ts.map +1 -0
- package/dist/services/bobShellService.js +534 -0
- package/dist/services/bobShellService.js.map +1 -0
- package/dist/services/codeQualityService.d.ts +105 -0
- package/dist/services/codeQualityService.d.ts.map +1 -0
- package/dist/services/codeQualityService.js +432 -0
- package/dist/services/codeQualityService.js.map +1 -0
- package/dist/services/dependencyService.d.ts +127 -0
- package/dist/services/dependencyService.d.ts.map +1 -0
- package/dist/services/dependencyService.js +499 -0
- package/dist/services/dependencyService.js.map +1 -0
- package/dist/services/diffService.d.ts +48 -0
- package/dist/services/diffService.d.ts.map +1 -0
- package/dist/services/diffService.js +175 -0
- package/dist/services/diffService.js.map +1 -0
- package/dist/services/documentationService.d.ts +124 -0
- package/dist/services/documentationService.d.ts.map +1 -0
- package/dist/services/documentationService.js +628 -0
- package/dist/services/documentationService.js.map +1 -0
- package/dist/services/promptEnhancerService.d.ts +92 -0
- package/dist/services/promptEnhancerService.d.ts.map +1 -0
- package/dist/services/promptEnhancerService.js +459 -0
- package/dist/services/promptEnhancerService.js.map +1 -0
- package/dist/services/securityService.d.ts +99 -0
- package/dist/services/securityService.d.ts.map +1 -0
- package/dist/services/securityService.js +467 -0
- package/dist/services/securityService.js.map +1 -0
- package/dist/websocket.d.ts +17 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +242 -0
- package/dist/websocket.js.map +1 -0
- package/package.json +74 -0
- package/public/assistant-ui.html +211 -0
- package/public/dist/assets/index-BdGvFYpE.css +1 -0
- package/public/dist/assets/index-Dfe7xGmm.js +55 -0
- package/public/dist/index.html +13 -0
- package/public/inject.js +241 -0
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const child_process_1 = require("child_process");
|
|
37
|
+
const util_1 = require("util");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
41
|
+
const readFile = (0, util_1.promisify)(fs.readFile);
|
|
42
|
+
class DependencyService {
|
|
43
|
+
constructor(projectRoot) {
|
|
44
|
+
// Restrictive licenses that may cause issues
|
|
45
|
+
this.restrictiveLicenses = [
|
|
46
|
+
'GPL-3.0',
|
|
47
|
+
'GPL-2.0',
|
|
48
|
+
'AGPL-3.0',
|
|
49
|
+
'LGPL-3.0',
|
|
50
|
+
'LGPL-2.1',
|
|
51
|
+
'CC-BY-NC',
|
|
52
|
+
'CC-BY-NC-SA',
|
|
53
|
+
];
|
|
54
|
+
// Permissive licenses that are generally safe
|
|
55
|
+
this.permissiveLicenses = [
|
|
56
|
+
'MIT',
|
|
57
|
+
'Apache-2.0',
|
|
58
|
+
'BSD-2-Clause',
|
|
59
|
+
'BSD-3-Clause',
|
|
60
|
+
'ISC',
|
|
61
|
+
'CC0-1.0',
|
|
62
|
+
'Unlicense',
|
|
63
|
+
];
|
|
64
|
+
this.projectRoot = projectRoot;
|
|
65
|
+
}
|
|
66
|
+
static getInstance(projectRoot) {
|
|
67
|
+
if (!DependencyService.instance) {
|
|
68
|
+
DependencyService.instance = new DependencyService(projectRoot);
|
|
69
|
+
}
|
|
70
|
+
return DependencyService.instance;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Audit project dependencies
|
|
74
|
+
*/
|
|
75
|
+
async auditDependencies() {
|
|
76
|
+
const [vulnerabilities, outdated, licenses, unused, duplicates] = await Promise.all([
|
|
77
|
+
this.checkVulnerabilities(),
|
|
78
|
+
this.checkOutdated(),
|
|
79
|
+
this.checkLicenses(),
|
|
80
|
+
this.findUnusedDependencies(),
|
|
81
|
+
this.findDuplicates(),
|
|
82
|
+
]);
|
|
83
|
+
const riskScore = this.calculateRiskScore(vulnerabilities, outdated, licenses);
|
|
84
|
+
const summary = this.generateSummary(riskScore, vulnerabilities, outdated);
|
|
85
|
+
const recommendations = this.generateRecommendations(vulnerabilities, outdated, licenses, unused);
|
|
86
|
+
return {
|
|
87
|
+
vulnerabilities,
|
|
88
|
+
outdated,
|
|
89
|
+
licenses,
|
|
90
|
+
unused,
|
|
91
|
+
duplicates,
|
|
92
|
+
riskScore,
|
|
93
|
+
summary,
|
|
94
|
+
recommendations,
|
|
95
|
+
timestamp: new Date().toISOString(),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check for vulnerabilities using npm audit
|
|
100
|
+
*/
|
|
101
|
+
async checkVulnerabilities() {
|
|
102
|
+
try {
|
|
103
|
+
const { stdout } = await execAsync('npm audit --json', {
|
|
104
|
+
cwd: this.projectRoot,
|
|
105
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB buffer
|
|
106
|
+
});
|
|
107
|
+
const auditData = JSON.parse(stdout);
|
|
108
|
+
const vulnerabilities = [];
|
|
109
|
+
// Parse npm audit v7+ format
|
|
110
|
+
if (auditData.vulnerabilities) {
|
|
111
|
+
for (const [name, vuln] of Object.entries(auditData.vulnerabilities)) {
|
|
112
|
+
const v = vuln;
|
|
113
|
+
vulnerabilities.push({
|
|
114
|
+
name,
|
|
115
|
+
severity: v.severity,
|
|
116
|
+
title: v.via?.[0]?.title || 'Vulnerability detected',
|
|
117
|
+
description: v.via?.[0]?.description || '',
|
|
118
|
+
version: v.range || 'unknown',
|
|
119
|
+
fixedIn: v.fixAvailable?.version,
|
|
120
|
+
cve: v.via?.filter((item) => item.cve).map((item) => item.cve),
|
|
121
|
+
url: v.via?.[0]?.url,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const metadata = auditData.metadata || {};
|
|
126
|
+
return {
|
|
127
|
+
total: metadata.vulnerabilities?.total || vulnerabilities.length,
|
|
128
|
+
critical: metadata.vulnerabilities?.critical || 0,
|
|
129
|
+
high: metadata.vulnerabilities?.high || 0,
|
|
130
|
+
moderate: metadata.vulnerabilities?.moderate || 0,
|
|
131
|
+
low: metadata.vulnerabilities?.low || 0,
|
|
132
|
+
list: vulnerabilities,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
// npm audit returns non-zero exit code when vulnerabilities found
|
|
137
|
+
if (error.stdout) {
|
|
138
|
+
try {
|
|
139
|
+
const auditData = JSON.parse(error.stdout);
|
|
140
|
+
const vulnerabilities = [];
|
|
141
|
+
if (auditData.vulnerabilities) {
|
|
142
|
+
for (const [name, vuln] of Object.entries(auditData.vulnerabilities)) {
|
|
143
|
+
const v = vuln;
|
|
144
|
+
vulnerabilities.push({
|
|
145
|
+
name,
|
|
146
|
+
severity: v.severity,
|
|
147
|
+
title: v.via?.[0]?.title || 'Vulnerability detected',
|
|
148
|
+
description: v.via?.[0]?.description || '',
|
|
149
|
+
version: v.range || 'unknown',
|
|
150
|
+
fixedIn: v.fixAvailable?.version,
|
|
151
|
+
cve: v.via?.filter((item) => item.cve).map((item) => item.cve),
|
|
152
|
+
url: v.via?.[0]?.url,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const metadata = auditData.metadata || {};
|
|
157
|
+
return {
|
|
158
|
+
total: metadata.vulnerabilities?.total || vulnerabilities.length,
|
|
159
|
+
critical: metadata.vulnerabilities?.critical || 0,
|
|
160
|
+
high: metadata.vulnerabilities?.high || 0,
|
|
161
|
+
moderate: metadata.vulnerabilities?.moderate || 0,
|
|
162
|
+
low: metadata.vulnerabilities?.low || 0,
|
|
163
|
+
list: vulnerabilities,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// If parsing fails, return empty result
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
total: 0,
|
|
172
|
+
critical: 0,
|
|
173
|
+
high: 0,
|
|
174
|
+
moderate: 0,
|
|
175
|
+
low: 0,
|
|
176
|
+
list: [],
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Check for outdated packages
|
|
182
|
+
*/
|
|
183
|
+
async checkOutdated() {
|
|
184
|
+
try {
|
|
185
|
+
const { stdout } = await execAsync('npm outdated --json', {
|
|
186
|
+
cwd: this.projectRoot,
|
|
187
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
188
|
+
});
|
|
189
|
+
const outdatedData = JSON.parse(stdout);
|
|
190
|
+
const outdated = [];
|
|
191
|
+
for (const [name, info] of Object.entries(outdatedData)) {
|
|
192
|
+
const i = info;
|
|
193
|
+
const breaking = this.isBreakingChange(i.current, i.latest);
|
|
194
|
+
outdated.push({
|
|
195
|
+
name,
|
|
196
|
+
current: i.current,
|
|
197
|
+
wanted: i.wanted,
|
|
198
|
+
latest: i.latest,
|
|
199
|
+
type: i.type || 'dependencies',
|
|
200
|
+
breaking,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
total: outdated.length,
|
|
205
|
+
breaking: outdated.filter(p => p.breaking).length,
|
|
206
|
+
list: outdated,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
// npm outdated returns non-zero when packages are outdated
|
|
211
|
+
if (error.stdout) {
|
|
212
|
+
try {
|
|
213
|
+
const outdatedData = JSON.parse(error.stdout);
|
|
214
|
+
const outdated = [];
|
|
215
|
+
for (const [name, info] of Object.entries(outdatedData)) {
|
|
216
|
+
const i = info;
|
|
217
|
+
const breaking = this.isBreakingChange(i.current, i.latest);
|
|
218
|
+
outdated.push({
|
|
219
|
+
name,
|
|
220
|
+
current: i.current,
|
|
221
|
+
wanted: i.wanted,
|
|
222
|
+
latest: i.latest,
|
|
223
|
+
type: i.type || 'dependencies',
|
|
224
|
+
breaking,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
total: outdated.length,
|
|
229
|
+
breaking: outdated.filter(p => p.breaking).length,
|
|
230
|
+
list: outdated,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// If parsing fails, return empty result
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
total: 0,
|
|
239
|
+
breaking: 0,
|
|
240
|
+
list: [],
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Check package licenses
|
|
246
|
+
*/
|
|
247
|
+
async checkLicenses() {
|
|
248
|
+
try {
|
|
249
|
+
const packageJsonPath = path.join(this.projectRoot, 'package.json');
|
|
250
|
+
const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));
|
|
251
|
+
const allDeps = {
|
|
252
|
+
...packageJson.dependencies,
|
|
253
|
+
...packageJson.devDependencies,
|
|
254
|
+
};
|
|
255
|
+
const licenses = [];
|
|
256
|
+
let incompatible = 0;
|
|
257
|
+
for (const [name, version] of Object.entries(allDeps)) {
|
|
258
|
+
try {
|
|
259
|
+
const depPackageJsonPath = path.join(this.projectRoot, 'node_modules', name, 'package.json');
|
|
260
|
+
const depPackageJson = JSON.parse(await readFile(depPackageJsonPath, 'utf-8'));
|
|
261
|
+
const license = depPackageJson.license || 'UNKNOWN';
|
|
262
|
+
const compatible = this.isLicenseCompatible(license);
|
|
263
|
+
const risk = this.getLicenseRisk(license);
|
|
264
|
+
if (!compatible)
|
|
265
|
+
incompatible++;
|
|
266
|
+
licenses.push({
|
|
267
|
+
name,
|
|
268
|
+
version: depPackageJson.version,
|
|
269
|
+
license,
|
|
270
|
+
repository: depPackageJson.repository?.url,
|
|
271
|
+
compatible,
|
|
272
|
+
risk,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// Skip if package.json not found
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
total: licenses.length,
|
|
281
|
+
incompatible,
|
|
282
|
+
list: licenses,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
return {
|
|
287
|
+
total: 0,
|
|
288
|
+
incompatible: 0,
|
|
289
|
+
list: [],
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Find unused dependencies
|
|
295
|
+
*/
|
|
296
|
+
async findUnusedDependencies() {
|
|
297
|
+
try {
|
|
298
|
+
// This is a simplified check - in production, use tools like depcheck
|
|
299
|
+
const packageJsonPath = path.join(this.projectRoot, 'package.json');
|
|
300
|
+
const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));
|
|
301
|
+
const dependencies = Object.keys(packageJson.dependencies || {});
|
|
302
|
+
const unused = [];
|
|
303
|
+
// Check if dependency is imported anywhere in the codebase
|
|
304
|
+
for (const dep of dependencies) {
|
|
305
|
+
const { stdout } = await execAsync(`grep -r "from '${dep}'" --include="*.ts" --include="*.js" --include="*.tsx" --include="*.jsx" . || true`, { cwd: this.projectRoot });
|
|
306
|
+
if (!stdout.trim()) {
|
|
307
|
+
unused.push(dep);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return unused;
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
return [];
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Find duplicate dependencies
|
|
318
|
+
*/
|
|
319
|
+
async findDuplicates() {
|
|
320
|
+
try {
|
|
321
|
+
const { stdout } = await execAsync('npm ls --json --all', {
|
|
322
|
+
cwd: this.projectRoot,
|
|
323
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
324
|
+
});
|
|
325
|
+
const tree = JSON.parse(stdout);
|
|
326
|
+
const versions = new Map();
|
|
327
|
+
const traverse = (node) => {
|
|
328
|
+
if (node.dependencies) {
|
|
329
|
+
for (const [name, info] of Object.entries(node.dependencies)) {
|
|
330
|
+
const i = info;
|
|
331
|
+
if (!versions.has(name)) {
|
|
332
|
+
versions.set(name, new Set());
|
|
333
|
+
}
|
|
334
|
+
versions.get(name).add(i.version);
|
|
335
|
+
traverse(i);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
traverse(tree);
|
|
340
|
+
const duplicates = [];
|
|
341
|
+
for (const [name, versionSet] of versions.entries()) {
|
|
342
|
+
if (versionSet.size > 1) {
|
|
343
|
+
duplicates.push({
|
|
344
|
+
name,
|
|
345
|
+
versions: Array.from(versionSet),
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return duplicates;
|
|
350
|
+
}
|
|
351
|
+
catch (error) {
|
|
352
|
+
return [];
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Update a specific dependency
|
|
357
|
+
*/
|
|
358
|
+
async updateDependency(name, version) {
|
|
359
|
+
try {
|
|
360
|
+
const versionSpec = version || 'latest';
|
|
361
|
+
await execAsync(`npm install ${name}@${versionSpec}`, {
|
|
362
|
+
cwd: this.projectRoot,
|
|
363
|
+
});
|
|
364
|
+
// Get the installed version
|
|
365
|
+
const packageJsonPath = path.join(this.projectRoot, 'node_modules', name, 'package.json');
|
|
366
|
+
const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));
|
|
367
|
+
return {
|
|
368
|
+
success: true,
|
|
369
|
+
newVersion: packageJson.version,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
throw new Error(`Failed to update ${name}: ${error.message}`);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Fix vulnerabilities automatically
|
|
378
|
+
*/
|
|
379
|
+
async fixVulnerabilities() {
|
|
380
|
+
try {
|
|
381
|
+
const { stdout } = await execAsync('npm audit fix --json', {
|
|
382
|
+
cwd: this.projectRoot,
|
|
383
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
384
|
+
});
|
|
385
|
+
const result = JSON.parse(stdout);
|
|
386
|
+
const fixed = result.metadata?.fixed || 0;
|
|
387
|
+
const remaining = result.metadata?.vulnerabilities?.total || 0;
|
|
388
|
+
return { fixed, remaining };
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
if (error.stdout) {
|
|
392
|
+
try {
|
|
393
|
+
const result = JSON.parse(error.stdout);
|
|
394
|
+
const fixed = result.metadata?.fixed || 0;
|
|
395
|
+
const remaining = result.metadata?.vulnerabilities?.total || 0;
|
|
396
|
+
return { fixed, remaining };
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
throw new Error('Failed to fix vulnerabilities');
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
throw new Error('Failed to fix vulnerabilities');
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Helper: Check if version change is breaking
|
|
407
|
+
*/
|
|
408
|
+
isBreakingChange(current, latest) {
|
|
409
|
+
const currentMajor = parseInt(current.split('.')[0]);
|
|
410
|
+
const latestMajor = parseInt(latest.split('.')[0]);
|
|
411
|
+
return latestMajor > currentMajor;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Helper: Check if license is compatible
|
|
415
|
+
*/
|
|
416
|
+
isLicenseCompatible(license) {
|
|
417
|
+
return !this.restrictiveLicenses.some(l => license.includes(l));
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Helper: Get license risk level
|
|
421
|
+
*/
|
|
422
|
+
getLicenseRisk(license) {
|
|
423
|
+
if (this.permissiveLicenses.some(l => license.includes(l))) {
|
|
424
|
+
return 'low';
|
|
425
|
+
}
|
|
426
|
+
if (this.restrictiveLicenses.some(l => license.includes(l))) {
|
|
427
|
+
return 'high';
|
|
428
|
+
}
|
|
429
|
+
return 'medium';
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Calculate overall risk score
|
|
433
|
+
*/
|
|
434
|
+
calculateRiskScore(vulnerabilities, outdated, licenses) {
|
|
435
|
+
let score = 100;
|
|
436
|
+
// Deduct for vulnerabilities
|
|
437
|
+
score -= vulnerabilities.critical * 20;
|
|
438
|
+
score -= vulnerabilities.high * 10;
|
|
439
|
+
score -= vulnerabilities.moderate * 5;
|
|
440
|
+
score -= vulnerabilities.low * 2;
|
|
441
|
+
// Deduct for outdated packages
|
|
442
|
+
score -= outdated.breaking * 5;
|
|
443
|
+
score -= (outdated.total - outdated.breaking) * 2;
|
|
444
|
+
// Deduct for license issues
|
|
445
|
+
score -= licenses.incompatible * 10;
|
|
446
|
+
return Math.max(0, score);
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Generate summary
|
|
450
|
+
*/
|
|
451
|
+
generateSummary(riskScore, vulnerabilities, outdated) {
|
|
452
|
+
if (riskScore >= 90) {
|
|
453
|
+
return 'Excellent dependency health. All packages are secure and up-to-date.';
|
|
454
|
+
}
|
|
455
|
+
else if (riskScore >= 70) {
|
|
456
|
+
return 'Good dependency health. Minor updates recommended.';
|
|
457
|
+
}
|
|
458
|
+
else if (riskScore >= 50) {
|
|
459
|
+
return 'Fair dependency health. Several packages need attention.';
|
|
460
|
+
}
|
|
461
|
+
else if (riskScore >= 30) {
|
|
462
|
+
return 'Poor dependency health. Multiple vulnerabilities detected.';
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
return 'Critical dependency issues. Immediate action required.';
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Generate recommendations
|
|
470
|
+
*/
|
|
471
|
+
generateRecommendations(vulnerabilities, outdated, licenses, unused) {
|
|
472
|
+
const recommendations = [];
|
|
473
|
+
if (vulnerabilities.critical > 0) {
|
|
474
|
+
recommendations.push(`Fix ${vulnerabilities.critical} critical vulnerabilities immediately`);
|
|
475
|
+
}
|
|
476
|
+
if (vulnerabilities.high > 0) {
|
|
477
|
+
recommendations.push(`Address ${vulnerabilities.high} high-severity vulnerabilities`);
|
|
478
|
+
}
|
|
479
|
+
if (outdated.breaking > 0) {
|
|
480
|
+
recommendations.push(`Review ${outdated.breaking} packages with breaking changes before updating`);
|
|
481
|
+
}
|
|
482
|
+
if (outdated.total > 5) {
|
|
483
|
+
recommendations.push('Update outdated packages to latest versions');
|
|
484
|
+
}
|
|
485
|
+
if (licenses.incompatible > 0) {
|
|
486
|
+
recommendations.push(`Review ${licenses.incompatible} packages with incompatible licenses`);
|
|
487
|
+
}
|
|
488
|
+
if (unused.length > 0) {
|
|
489
|
+
recommendations.push(`Remove ${unused.length} unused dependencies`);
|
|
490
|
+
}
|
|
491
|
+
if (recommendations.length === 0) {
|
|
492
|
+
recommendations.push('All dependencies are healthy and up-to-date');
|
|
493
|
+
}
|
|
494
|
+
return recommendations;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
exports.default = DependencyService;
|
|
498
|
+
// Made with Bob
|
|
499
|
+
//# sourceMappingURL=dependencyService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencyService.js","sourceRoot":"","sources":["../../src/services/dependencyService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface FileDiff {
|
|
2
|
+
path: string;
|
|
3
|
+
oldContent: string;
|
|
4
|
+
newContent: string;
|
|
5
|
+
diff: DiffChange[];
|
|
6
|
+
stats: DiffStats;
|
|
7
|
+
}
|
|
8
|
+
export interface DiffChange {
|
|
9
|
+
type: 'add' | 'remove' | 'unchanged';
|
|
10
|
+
value: string;
|
|
11
|
+
lineNumber?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface DiffStats {
|
|
14
|
+
additions: number;
|
|
15
|
+
deletions: number;
|
|
16
|
+
changes: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class DiffService {
|
|
19
|
+
/**
|
|
20
|
+
* Generate diff between old and new content
|
|
21
|
+
*/
|
|
22
|
+
generateDiff(oldContent: string, newContent: string): DiffChange[];
|
|
23
|
+
/**
|
|
24
|
+
* Calculate diff statistics
|
|
25
|
+
*/
|
|
26
|
+
calculateStats(diffChanges: DiffChange[]): DiffStats;
|
|
27
|
+
/**
|
|
28
|
+
* Generate file diff
|
|
29
|
+
*/
|
|
30
|
+
generateFileDiff(filePath: string, newContent: string, projectRoot: string): Promise<FileDiff>;
|
|
31
|
+
/**
|
|
32
|
+
* Generate diffs for multiple files
|
|
33
|
+
*/
|
|
34
|
+
generateMultipleFileDiffs(files: Array<{
|
|
35
|
+
path: string;
|
|
36
|
+
content: string;
|
|
37
|
+
}>, projectRoot: string): Promise<FileDiff[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Format diff for display (unified diff format)
|
|
40
|
+
*/
|
|
41
|
+
formatUnifiedDiff(fileDiff: FileDiff): string;
|
|
42
|
+
/**
|
|
43
|
+
* Apply diff to file
|
|
44
|
+
*/
|
|
45
|
+
applyDiff(fileDiff: FileDiff, projectRoot: string): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
export declare const diffService: DiffService;
|
|
48
|
+
//# sourceMappingURL=diffService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diffService.d.ts","sourceRoot":"","sources":["../../src/services/diffService.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,WAAW,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,WAAW;IACtB;;OAEG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE;IAuClE;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,SAAS;IAoBpD;;OAEG;IACG,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,CAAC;IAuBpB;;OAEG;IACG,yBAAyB,CAC7B,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,EAC/C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,EAAE,CAAC;IAWtB;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;IAoB7C;;OAEG;IACG,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAYxE;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|