codedev-mcp 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +90 -0
- package/LICENSE +21 -0
- package/README.md +760 -0
- package/dist/analyzers/api-contract.d.ts +46 -0
- package/dist/analyzers/api-contract.d.ts.map +1 -0
- package/dist/analyzers/api-contract.js +319 -0
- package/dist/analyzers/api-contract.js.map +1 -0
- package/dist/analyzers/architecture.d.ts +37 -0
- package/dist/analyzers/architecture.d.ts.map +1 -0
- package/dist/analyzers/architecture.js +149 -0
- package/dist/analyzers/architecture.js.map +1 -0
- package/dist/analyzers/branch-compare.d.ts +46 -0
- package/dist/analyzers/branch-compare.d.ts.map +1 -0
- package/dist/analyzers/branch-compare.js +128 -0
- package/dist/analyzers/branch-compare.js.map +1 -0
- package/dist/analyzers/cicd.d.ts +42 -0
- package/dist/analyzers/cicd.d.ts.map +1 -0
- package/dist/analyzers/cicd.js +237 -0
- package/dist/analyzers/cicd.js.map +1 -0
- package/dist/analyzers/codebase.d.ts +64 -0
- package/dist/analyzers/codebase.d.ts.map +1 -0
- package/dist/analyzers/codebase.js +354 -0
- package/dist/analyzers/codebase.js.map +1 -0
- package/dist/analyzers/complexity-heatmap.d.ts +50 -0
- package/dist/analyzers/complexity-heatmap.d.ts.map +1 -0
- package/dist/analyzers/complexity-heatmap.js +156 -0
- package/dist/analyzers/complexity-heatmap.js.map +1 -0
- package/dist/analyzers/context-pack.d.ts +43 -0
- package/dist/analyzers/context-pack.d.ts.map +1 -0
- package/dist/analyzers/context-pack.js +232 -0
- package/dist/analyzers/context-pack.js.map +1 -0
- package/dist/analyzers/coverage.d.ts +70 -0
- package/dist/analyzers/coverage.d.ts.map +1 -0
- package/dist/analyzers/coverage.js +313 -0
- package/dist/analyzers/coverage.js.map +1 -0
- package/dist/analyzers/db-schema.d.ts +55 -0
- package/dist/analyzers/db-schema.d.ts.map +1 -0
- package/dist/analyzers/db-schema.js +237 -0
- package/dist/analyzers/db-schema.js.map +1 -0
- package/dist/analyzers/dead-code.d.ts +34 -0
- package/dist/analyzers/dead-code.d.ts.map +1 -0
- package/dist/analyzers/dead-code.js +131 -0
- package/dist/analyzers/dead-code.js.map +1 -0
- package/dist/analyzers/dep-vuln.d.ts +36 -0
- package/dist/analyzers/dep-vuln.d.ts.map +1 -0
- package/dist/analyzers/dep-vuln.js +342 -0
- package/dist/analyzers/dep-vuln.js.map +1 -0
- package/dist/analyzers/docs.d.ts +47 -0
- package/dist/analyzers/docs.d.ts.map +1 -0
- package/dist/analyzers/docs.js +473 -0
- package/dist/analyzers/docs.js.map +1 -0
- package/dist/analyzers/git.d.ts +115 -0
- package/dist/analyzers/git.d.ts.map +1 -0
- package/dist/analyzers/git.js +214 -0
- package/dist/analyzers/git.js.map +1 -0
- package/dist/analyzers/iac.d.ts +39 -0
- package/dist/analyzers/iac.d.ts.map +1 -0
- package/dist/analyzers/iac.js +233 -0
- package/dist/analyzers/iac.js.map +1 -0
- package/dist/analyzers/impact.d.ts +51 -0
- package/dist/analyzers/impact.d.ts.map +1 -0
- package/dist/analyzers/impact.js +235 -0
- package/dist/analyzers/impact.js.map +1 -0
- package/dist/analyzers/monorepo.d.ts +36 -0
- package/dist/analyzers/monorepo.d.ts.map +1 -0
- package/dist/analyzers/monorepo.js +233 -0
- package/dist/analyzers/monorepo.js.map +1 -0
- package/dist/analyzers/notebook.d.ts +53 -0
- package/dist/analyzers/notebook.d.ts.map +1 -0
- package/dist/analyzers/notebook.js +149 -0
- package/dist/analyzers/notebook.js.map +1 -0
- package/dist/analyzers/perf-profile.d.ts +39 -0
- package/dist/analyzers/perf-profile.d.ts.map +1 -0
- package/dist/analyzers/perf-profile.js +222 -0
- package/dist/analyzers/perf-profile.js.map +1 -0
- package/dist/analyzers/scaffold.d.ts +46 -0
- package/dist/analyzers/scaffold.d.ts.map +1 -0
- package/dist/analyzers/scaffold.js +313 -0
- package/dist/analyzers/scaffold.js.map +1 -0
- package/dist/analyzers/security.d.ts +42 -0
- package/dist/analyzers/security.d.ts.map +1 -0
- package/dist/analyzers/security.js +281 -0
- package/dist/analyzers/security.js.map +1 -0
- package/dist/analyzers/symbols.d.ts +49 -0
- package/dist/analyzers/symbols.d.ts.map +1 -0
- package/dist/analyzers/symbols.js +212 -0
- package/dist/analyzers/symbols.js.map +1 -0
- package/dist/analyzers/tree-sitter.d.ts +71 -0
- package/dist/analyzers/tree-sitter.d.ts.map +1 -0
- package/dist/analyzers/tree-sitter.js +333 -0
- package/dist/analyzers/tree-sitter.js.map +1 -0
- package/dist/analyzers/type-flow.d.ts +39 -0
- package/dist/analyzers/type-flow.d.ts.map +1 -0
- package/dist/analyzers/type-flow.js +75 -0
- package/dist/analyzers/type-flow.js.map +1 -0
- package/dist/cache/memory-cache.d.ts +130 -0
- package/dist/cache/memory-cache.d.ts.map +1 -0
- package/dist/cache/memory-cache.js +273 -0
- package/dist/cache/memory-cache.js.map +1 -0
- package/dist/config.d.ts +32 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/constants/instructions.d.ts +2 -0
- package/dist/constants/instructions.d.ts.map +1 -0
- package/dist/constants/instructions.js +82 -0
- package/dist/constants/instructions.js.map +1 -0
- package/dist/db/connection.d.ts +12 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +34 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/json-store.d.ts +111 -0
- package/dist/db/json-store.d.ts.map +1 -0
- package/dist/db/json-store.js +201 -0
- package/dist/db/json-store.js.map +1 -0
- package/dist/db/sqlite-store.d.ts +153 -0
- package/dist/db/sqlite-store.d.ts.map +1 -0
- package/dist/db/sqlite-store.js +388 -0
- package/dist/db/sqlite-store.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/health.d.ts +35 -0
- package/dist/resources/health.d.ts.map +1 -0
- package/dist/resources/health.js +81 -0
- package/dist/resources/health.js.map +1 -0
- package/dist/schemas/output-schemas.d.ts +517 -0
- package/dist/schemas/output-schemas.d.ts.map +1 -0
- package/dist/schemas/output-schemas.js +296 -0
- package/dist/schemas/output-schemas.js.map +1 -0
- package/dist/search/fast-search.d.ts +90 -0
- package/dist/search/fast-search.d.ts.map +1 -0
- package/dist/search/fast-search.js +387 -0
- package/dist/search/fast-search.js.map +1 -0
- package/dist/search/semantic.d.ts +26 -0
- package/dist/search/semantic.d.ts.map +1 -0
- package/dist/search/semantic.js +458 -0
- package/dist/search/semantic.js.map +1 -0
- package/dist/tools/analysis.d.ts +7 -0
- package/dist/tools/analysis.d.ts.map +1 -0
- package/dist/tools/analysis.js +491 -0
- package/dist/tools/analysis.js.map +1 -0
- package/dist/tools/architecture.d.ts +7 -0
- package/dist/tools/architecture.d.ts.map +1 -0
- package/dist/tools/architecture.js +176 -0
- package/dist/tools/architecture.js.map +1 -0
- package/dist/tools/devops.d.ts +7 -0
- package/dist/tools/devops.d.ts.map +1 -0
- package/dist/tools/devops.js +179 -0
- package/dist/tools/devops.js.map +1 -0
- package/dist/tools/docs.d.ts +7 -0
- package/dist/tools/docs.d.ts.map +1 -0
- package/dist/tools/docs.js +102 -0
- package/dist/tools/docs.js.map +1 -0
- package/dist/tools/git.d.ts +7 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +475 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/nav.d.ts +7 -0
- package/dist/tools/nav.d.ts.map +1 -0
- package/dist/tools/nav.js +275 -0
- package/dist/tools/nav.js.map +1 -0
- package/dist/tools/notebook.d.ts +7 -0
- package/dist/tools/notebook.d.ts.map +1 -0
- package/dist/tools/notebook.js +102 -0
- package/dist/tools/notebook.js.map +1 -0
- package/dist/tools/performance.d.ts +7 -0
- package/dist/tools/performance.d.ts.map +1 -0
- package/dist/tools/performance.js +59 -0
- package/dist/tools/performance.js.map +1 -0
- package/dist/tools/quality.d.ts +7 -0
- package/dist/tools/quality.d.ts.map +1 -0
- package/dist/tools/quality.js +279 -0
- package/dist/tools/quality.js.map +1 -0
- package/dist/tools/scaffold.d.ts +7 -0
- package/dist/tools/scaffold.d.ts.map +1 -0
- package/dist/tools/scaffold.js +80 -0
- package/dist/tools/scaffold.js.map +1 -0
- package/dist/tools/search.d.ts +7 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +308 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/security.d.ts +7 -0
- package/dist/tools/security.d.ts.map +1 -0
- package/dist/tools/security.js +138 -0
- package/dist/tools/security.js.map +1 -0
- package/dist/utils/analytics.d.ts +69 -0
- package/dist/utils/analytics.d.ts.map +1 -0
- package/dist/utils/analytics.js +144 -0
- package/dist/utils/analytics.js.map +1 -0
- package/dist/utils/concurrency.d.ts +43 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +78 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/fallback.d.ts +52 -0
- package/dist/utils/fallback.d.ts.map +1 -0
- package/dist/utils/fallback.js +137 -0
- package/dist/utils/fallback.js.map +1 -0
- package/dist/utils/git-hooks.d.ts +24 -0
- package/dist/utils/git-hooks.d.ts.map +1 -0
- package/dist/utils/git-hooks.js +108 -0
- package/dist/utils/git-hooks.js.map +1 -0
- package/dist/utils/languages.d.ts +72 -0
- package/dist/utils/languages.d.ts.map +1 -0
- package/dist/utils/languages.js +463 -0
- package/dist/utils/languages.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +34 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/plugins.d.ts +105 -0
- package/dist/utils/plugins.d.ts.map +1 -0
- package/dist/utils/plugins.js +325 -0
- package/dist/utils/plugins.js.map +1 -0
- package/dist/utils/security.d.ts +17 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +48 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/streaming.d.ts +56 -0
- package/dist/utils/streaming.d.ts.map +1 -0
- package/dist/utils/streaming.js +95 -0
- package/dist/utils/streaming.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/mcp.json +100 -0
- package/package.json +89 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Vulnerability Scanner
|
|
3
|
+
* Cross-references package lock files (package-lock.json, yarn.lock, pnpm-lock.yaml,
|
|
4
|
+
* Cargo.lock, Pipfile.lock, go.sum) against known vulnerability patterns.
|
|
5
|
+
* Checks for outdated packages, known-vulnerable version ranges, and security advisories.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from 'node:fs/promises';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
// Known patterns for vulnerable packages / versions (static heuristic-based)
|
|
10
|
+
const KNOWN_VULN_PATTERNS = [
|
|
11
|
+
// npm ecosystem
|
|
12
|
+
{ name: /^lodash$/, maxSafe: '4.17.21', severity: 'high', reason: 'Prototype pollution (CVE-2021-23337)' },
|
|
13
|
+
{ name: /^minimist$/, maxSafe: '1.2.6', severity: 'high', reason: 'Prototype pollution (CVE-2021-44906)' },
|
|
14
|
+
{ name: /^node-fetch$/, maxSafe: '2.6.7', severity: 'high', reason: 'Exposure of sensitive info (CVE-2022-0235)' },
|
|
15
|
+
{ name: /^axios$/, maxSafe: '1.6.0', severity: 'medium', reason: 'SSRF vulnerability in versions < 1.6.0' },
|
|
16
|
+
{
|
|
17
|
+
name: /^jsonwebtoken$/,
|
|
18
|
+
maxSafe: '9.0.0',
|
|
19
|
+
severity: 'high',
|
|
20
|
+
reason: 'Insecure token verification (CVE-2022-23529)',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: /^express$/,
|
|
24
|
+
maxSafe: '4.19.2',
|
|
25
|
+
severity: 'medium',
|
|
26
|
+
reason: 'Open redirect vulnerability in older versions',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: /^tar$/,
|
|
30
|
+
maxSafe: '6.1.12',
|
|
31
|
+
severity: 'high',
|
|
32
|
+
reason: 'Arbitrary file creation/overwrite (CVE-2021-37712)',
|
|
33
|
+
},
|
|
34
|
+
{ name: /^semver$/, maxSafe: '7.5.2', severity: 'medium', reason: 'ReDoS vulnerability (CVE-2022-25883)' },
|
|
35
|
+
{ name: /^xml2js$/, maxSafe: '0.5.0', severity: 'high', reason: 'Prototype pollution (CVE-2023-0842)' },
|
|
36
|
+
{ name: /^got$/, maxSafe: '11.8.5', severity: 'medium', reason: 'Open redirect (CVE-2022-33987)' },
|
|
37
|
+
{ name: /^moment$/, maxSafe: '999.0.0', severity: 'low', reason: 'Deprecated — use date-fns or dayjs instead' },
|
|
38
|
+
{ name: /^request$/, maxSafe: '999.0.0', severity: 'low', reason: 'Deprecated and unmaintained' },
|
|
39
|
+
{
|
|
40
|
+
name: /^event-stream$/,
|
|
41
|
+
maxSafe: '999.0.0',
|
|
42
|
+
severity: 'critical',
|
|
43
|
+
reason: 'Known malicious versions (flatmap-stream incident)',
|
|
44
|
+
},
|
|
45
|
+
{ name: /^ua-parser-js$/, maxSafe: '0.7.33', severity: 'critical', reason: 'Supply chain attack (CVE-2021-27292)' },
|
|
46
|
+
{ name: /^colors$/, maxSafe: '1.4.0', severity: 'high', reason: 'Sabotaged by maintainer in v1.4.1+' },
|
|
47
|
+
{ name: /^faker$/, maxSafe: '5.5.3', severity: 'high', reason: 'Sabotaged by maintainer in v6+' },
|
|
48
|
+
// Python ecosystem
|
|
49
|
+
{ name: /^pyyaml$/i, maxSafe: '6.0', severity: 'high', reason: 'Arbitrary code execution via yaml.load' },
|
|
50
|
+
{ name: /^django$/i, maxSafe: '4.2.0', severity: 'medium', reason: 'Multiple security fixes in 4.2+' },
|
|
51
|
+
{ name: /^flask$/i, maxSafe: '2.3.0', severity: 'low', reason: 'Security improvements in 2.3+' },
|
|
52
|
+
{
|
|
53
|
+
name: /^pillow$/i,
|
|
54
|
+
maxSafe: '10.0.0',
|
|
55
|
+
severity: 'high',
|
|
56
|
+
reason: 'Buffer overflow vulnerabilities in older versions',
|
|
57
|
+
},
|
|
58
|
+
{ name: /^cryptography$/i, maxSafe: '41.0.0', severity: 'high', reason: 'Multiple CVEs in older versions' },
|
|
59
|
+
{ name: /^urllib3$/i, maxSafe: '2.0.0', severity: 'medium', reason: 'Cookie leaking, CRLF injection in < 2.0' },
|
|
60
|
+
// Rust ecosystem
|
|
61
|
+
{ name: /^hyper$/, maxSafe: '0.14.23', severity: 'high', reason: 'HTTP request smuggling (RUSTSEC-2023-0034)' },
|
|
62
|
+
{ name: /^regex$/, maxSafe: '1.8.0', severity: 'medium', reason: 'ReDoS in older versions' },
|
|
63
|
+
];
|
|
64
|
+
/**
|
|
65
|
+
* Simple semver comparison (major.minor.patch). Returns true if a < b.
|
|
66
|
+
* @param a - First version string
|
|
67
|
+
* @param b - Second version string
|
|
68
|
+
* @returns True if version a is less than version b
|
|
69
|
+
*/
|
|
70
|
+
function semverLessThan(a, b) {
|
|
71
|
+
const parse = (v) => v
|
|
72
|
+
.replace(/^[~^>=<]+/, '')
|
|
73
|
+
.split('.')
|
|
74
|
+
.map((n) => parseInt(n, 10) || 0);
|
|
75
|
+
const pa = parse(a);
|
|
76
|
+
const pb = parse(b);
|
|
77
|
+
for (let i = 0; i < 3; i++) {
|
|
78
|
+
if ((pa[i] || 0) < (pb[i] || 0))
|
|
79
|
+
return true;
|
|
80
|
+
if ((pa[i] || 0) > (pb[i] || 0))
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parse package-lock.json or package.json dependencies.
|
|
87
|
+
* @param content - The raw file content
|
|
88
|
+
* @returns Array of dependency name/version pairs
|
|
89
|
+
*/
|
|
90
|
+
function parseNpmLock(content) {
|
|
91
|
+
const deps = [];
|
|
92
|
+
try {
|
|
93
|
+
const data = JSON.parse(content);
|
|
94
|
+
// package-lock.json v2/v3
|
|
95
|
+
if (data.packages) {
|
|
96
|
+
for (const [pkgPath, info] of Object.entries(data.packages)) {
|
|
97
|
+
const d = info;
|
|
98
|
+
if (pkgPath && d.version) {
|
|
99
|
+
const name = pkgPath.replace(/^node_modules\//, '').replace(/.*node_modules\//, '');
|
|
100
|
+
if (name)
|
|
101
|
+
deps.push({ name, version: d.version });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// package-lock.json v1
|
|
106
|
+
else if (data.dependencies) {
|
|
107
|
+
for (const [name, info] of Object.entries(data.dependencies)) {
|
|
108
|
+
const d = info;
|
|
109
|
+
if (d.version)
|
|
110
|
+
deps.push({ name, version: d.version });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// package.json (fallback, ranges only)
|
|
114
|
+
else if (data.name && (data.dependencies || data.devDependencies)) {
|
|
115
|
+
for (const [name, ver] of Object.entries({ ...(data.dependencies || {}), ...(data.devDependencies || {}) })) {
|
|
116
|
+
deps.push({ name, version: String(ver) });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
/* skip */
|
|
122
|
+
}
|
|
123
|
+
return deps;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Parse Cargo.lock.
|
|
127
|
+
* @param content - The raw Cargo.lock content
|
|
128
|
+
* @returns Array of dependency name/version pairs
|
|
129
|
+
*/
|
|
130
|
+
function parseCargoLock(content) {
|
|
131
|
+
const deps = [];
|
|
132
|
+
const pkgRegex = /\[\[package\]\]\s*\nname\s*=\s*"([^"]+)"\s*\nversion\s*=\s*"([^"]+)"/g;
|
|
133
|
+
let match;
|
|
134
|
+
while ((match = pkgRegex.exec(content)) !== null) {
|
|
135
|
+
deps.push({ name: match[1], version: match[2] });
|
|
136
|
+
}
|
|
137
|
+
return deps;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Parse Pipfile.lock or requirements.txt.
|
|
141
|
+
* @param content - The raw file content
|
|
142
|
+
* @param file - The file path to determine format
|
|
143
|
+
* @returns Array of dependency name/version pairs
|
|
144
|
+
*/
|
|
145
|
+
function parsePythonDeps(content, file) {
|
|
146
|
+
const deps = [];
|
|
147
|
+
if (file.endsWith('.lock')) {
|
|
148
|
+
try {
|
|
149
|
+
const data = JSON.parse(content);
|
|
150
|
+
for (const section of ['default', 'develop']) {
|
|
151
|
+
const pkgs = data[section] || {};
|
|
152
|
+
for (const [name, info] of Object.entries(pkgs)) {
|
|
153
|
+
const d = info;
|
|
154
|
+
if (d.version)
|
|
155
|
+
deps.push({ name, version: d.version.replace(/^==/, '') });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
/* skip */
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// requirements.txt
|
|
165
|
+
for (const line of content.split('\n')) {
|
|
166
|
+
const match = line.trim().match(/^([a-zA-Z0-9_-]+)\s*[=<>!~]+\s*([0-9.]+)/);
|
|
167
|
+
if (match)
|
|
168
|
+
deps.push({ name: match[1], version: match[2] });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return deps;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Parse go.sum.
|
|
175
|
+
* @param content - The raw go.sum content
|
|
176
|
+
* @returns Array of dependency name/version pairs
|
|
177
|
+
*/
|
|
178
|
+
function parseGoSum(content) {
|
|
179
|
+
const deps = [];
|
|
180
|
+
const seen = new Set();
|
|
181
|
+
for (const line of content.split('\n')) {
|
|
182
|
+
const match = line.match(/^(\S+)\s+v([0-9.]+)/);
|
|
183
|
+
if (match && !seen.has(match[1])) {
|
|
184
|
+
seen.add(match[1]);
|
|
185
|
+
deps.push({ name: match[1], version: match[2] });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return deps;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Main vulnerability scan function.
|
|
192
|
+
* @param cwd - The working directory to scan
|
|
193
|
+
* @returns Vulnerability scan results with findings and summary
|
|
194
|
+
*/
|
|
195
|
+
export async function scanDependencyVulns(cwd) {
|
|
196
|
+
const vulnerabilities = [];
|
|
197
|
+
const lockFiles = [];
|
|
198
|
+
const ecosystems = new Set();
|
|
199
|
+
let totalDeps = 0;
|
|
200
|
+
let outdatedCount = 0;
|
|
201
|
+
// Scan npm lock files
|
|
202
|
+
for (const lockFile of ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml']) {
|
|
203
|
+
try {
|
|
204
|
+
const content = await readFile(path.join(cwd, lockFile), 'utf-8');
|
|
205
|
+
lockFiles.push(lockFile);
|
|
206
|
+
ecosystems.add('npm');
|
|
207
|
+
// Only parse JSON lock files for now
|
|
208
|
+
if (lockFile === 'package-lock.json') {
|
|
209
|
+
const deps = parseNpmLock(content);
|
|
210
|
+
totalDeps += deps.length;
|
|
211
|
+
for (const dep of deps) {
|
|
212
|
+
for (const pattern of KNOWN_VULN_PATTERNS) {
|
|
213
|
+
if (pattern.name.test(dep.name) && pattern.maxSafe && semverLessThan(dep.version, pattern.maxSafe)) {
|
|
214
|
+
vulnerabilities.push({
|
|
215
|
+
name: dep.name,
|
|
216
|
+
version: dep.version,
|
|
217
|
+
severity: pattern.severity,
|
|
218
|
+
reason: pattern.reason,
|
|
219
|
+
file: lockFile,
|
|
220
|
+
ecosystem: 'npm',
|
|
221
|
+
recommendation: `Upgrade to >= ${pattern.maxSafe}`,
|
|
222
|
+
});
|
|
223
|
+
if (pattern.severity !== 'info')
|
|
224
|
+
outdatedCount++;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
/* file doesn't exist */
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Scan package.json if no lock file found
|
|
235
|
+
if (!lockFiles.some((f) => f.includes('lock'))) {
|
|
236
|
+
try {
|
|
237
|
+
const content = await readFile(path.join(cwd, 'package.json'), 'utf-8');
|
|
238
|
+
lockFiles.push('package.json');
|
|
239
|
+
ecosystems.add('npm');
|
|
240
|
+
const deps = parseNpmLock(content);
|
|
241
|
+
totalDeps += deps.length;
|
|
242
|
+
for (const dep of deps) {
|
|
243
|
+
for (const pattern of KNOWN_VULN_PATTERNS) {
|
|
244
|
+
if (pattern.name.test(dep.name) && pattern.maxSafe && semverLessThan(dep.version, pattern.maxSafe)) {
|
|
245
|
+
vulnerabilities.push({
|
|
246
|
+
name: dep.name,
|
|
247
|
+
version: dep.version,
|
|
248
|
+
severity: pattern.severity,
|
|
249
|
+
reason: pattern.reason,
|
|
250
|
+
file: 'package.json',
|
|
251
|
+
ecosystem: 'npm',
|
|
252
|
+
recommendation: `Upgrade to >= ${pattern.maxSafe}`,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
/* skip */
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// Scan Cargo.lock
|
|
263
|
+
try {
|
|
264
|
+
const content = await readFile(path.join(cwd, 'Cargo.lock'), 'utf-8');
|
|
265
|
+
lockFiles.push('Cargo.lock');
|
|
266
|
+
ecosystems.add('cargo');
|
|
267
|
+
const deps = parseCargoLock(content);
|
|
268
|
+
totalDeps += deps.length;
|
|
269
|
+
for (const dep of deps) {
|
|
270
|
+
for (const pattern of KNOWN_VULN_PATTERNS) {
|
|
271
|
+
if (pattern.name.test(dep.name) && pattern.maxSafe && semverLessThan(dep.version, pattern.maxSafe)) {
|
|
272
|
+
vulnerabilities.push({
|
|
273
|
+
name: dep.name,
|
|
274
|
+
version: dep.version,
|
|
275
|
+
severity: pattern.severity,
|
|
276
|
+
reason: pattern.reason,
|
|
277
|
+
file: 'Cargo.lock',
|
|
278
|
+
ecosystem: 'cargo',
|
|
279
|
+
recommendation: `Upgrade to >= ${pattern.maxSafe}`,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
/* skip */
|
|
287
|
+
}
|
|
288
|
+
// Scan Python deps
|
|
289
|
+
for (const pyFile of ['Pipfile.lock', 'requirements.txt', 'requirements-dev.txt']) {
|
|
290
|
+
try {
|
|
291
|
+
const content = await readFile(path.join(cwd, pyFile), 'utf-8');
|
|
292
|
+
lockFiles.push(pyFile);
|
|
293
|
+
ecosystems.add('pip');
|
|
294
|
+
const deps = parsePythonDeps(content, pyFile);
|
|
295
|
+
totalDeps += deps.length;
|
|
296
|
+
for (const dep of deps) {
|
|
297
|
+
for (const pattern of KNOWN_VULN_PATTERNS) {
|
|
298
|
+
if (pattern.name.test(dep.name) && pattern.maxSafe && semverLessThan(dep.version, pattern.maxSafe)) {
|
|
299
|
+
vulnerabilities.push({
|
|
300
|
+
name: dep.name,
|
|
301
|
+
version: dep.version,
|
|
302
|
+
severity: pattern.severity,
|
|
303
|
+
reason: pattern.reason,
|
|
304
|
+
file: pyFile,
|
|
305
|
+
ecosystem: 'pip',
|
|
306
|
+
recommendation: `Upgrade to >= ${pattern.maxSafe}`,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
/* skip */
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Scan go.sum
|
|
317
|
+
try {
|
|
318
|
+
const content = await readFile(path.join(cwd, 'go.sum'), 'utf-8');
|
|
319
|
+
lockFiles.push('go.sum');
|
|
320
|
+
ecosystems.add('go');
|
|
321
|
+
const deps = parseGoSum(content);
|
|
322
|
+
totalDeps += deps.length;
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
/* skip */
|
|
326
|
+
}
|
|
327
|
+
// Sort by severity
|
|
328
|
+
const severityOrder = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };
|
|
329
|
+
vulnerabilities.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
|
|
330
|
+
const summary = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
|
|
331
|
+
for (const v of vulnerabilities)
|
|
332
|
+
summary[v.severity]++;
|
|
333
|
+
return {
|
|
334
|
+
vulnerabilities,
|
|
335
|
+
totalDeps,
|
|
336
|
+
outdatedCount,
|
|
337
|
+
ecosystems: Array.from(ecosystems),
|
|
338
|
+
lockFiles,
|
|
339
|
+
summary,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=dep-vuln.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dep-vuln.js","sourceRoot":"","sources":["../../src/analyzers/dep-vuln.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Documentation extraction from source code.
|
|
3
|
+
* Parses JSDoc, Python docstrings, Rustdoc, Javadoc, Go doc comments.
|
|
4
|
+
* Links documentation to symbols for "show docs for X" queries.
|
|
5
|
+
*/
|
|
6
|
+
export interface DocEntry {
|
|
7
|
+
symbol: string;
|
|
8
|
+
/** The type of symbol: function, class, method, etc. */
|
|
9
|
+
symbolType: string;
|
|
10
|
+
file: string;
|
|
11
|
+
line: number;
|
|
12
|
+
doc: string;
|
|
13
|
+
params?: {
|
|
14
|
+
name: string;
|
|
15
|
+
type?: string;
|
|
16
|
+
description: string;
|
|
17
|
+
}[];
|
|
18
|
+
returns?: {
|
|
19
|
+
type?: string;
|
|
20
|
+
description: string;
|
|
21
|
+
};
|
|
22
|
+
examples?: string[];
|
|
23
|
+
tags?: {
|
|
24
|
+
tag: string;
|
|
25
|
+
value: string;
|
|
26
|
+
}[];
|
|
27
|
+
deprecated?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Extract all documentation from a file.
|
|
31
|
+
* @param filePath - Path to the source file
|
|
32
|
+
* @param language - Programming language of the file
|
|
33
|
+
* @returns Array of documentation entries found in the file
|
|
34
|
+
*/
|
|
35
|
+
export declare function extractDocs(filePath: string, language: string): Promise<DocEntry[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Find undocumented public symbols in a file.
|
|
38
|
+
* @param filePath - Path to the source file
|
|
39
|
+
* @param language - Programming language of the file
|
|
40
|
+
* @returns Array of undocumented symbols with line numbers
|
|
41
|
+
*/
|
|
42
|
+
export declare function findUndocumented(filePath: string, language: string): Promise<{
|
|
43
|
+
symbol: string;
|
|
44
|
+
line: number;
|
|
45
|
+
type: string;
|
|
46
|
+
}[]>;
|
|
47
|
+
//# sourceMappingURL=docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/analyzers/docs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CA0BzF;AAibD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CA4B3D"}
|