dep-oracle 1.2.0 → 1.3.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.
Files changed (41) hide show
  1. package/README.md +33 -8
  2. package/dist/action/index.js +398 -16
  3. package/dist/badge-5Z3WAD2B.js +89 -0
  4. package/dist/badge-5Z3WAD2B.js.map +1 -0
  5. package/dist/chunk-32B3QIPY.js +1505 -0
  6. package/dist/chunk-32B3QIPY.js.map +1 -0
  7. package/dist/chunk-7DST6SNA.js +258 -0
  8. package/dist/chunk-7DST6SNA.js.map +1 -0
  9. package/dist/{chunk-TXSNFX3N.js → chunk-DLWG22RC.js} +403 -17
  10. package/dist/chunk-DLWG22RC.js.map +1 -0
  11. package/dist/chunk-HX6MGNBD.js +271 -0
  12. package/dist/chunk-HX6MGNBD.js.map +1 -0
  13. package/dist/chunk-IVXGOPRU.js +145 -0
  14. package/dist/chunk-IVXGOPRU.js.map +1 -0
  15. package/dist/chunk-SP3VYPXX.js +218 -0
  16. package/dist/chunk-SP3VYPXX.js.map +1 -0
  17. package/dist/chunk-T5EVLWZM.js +4234 -0
  18. package/dist/chunk-T5EVLWZM.js.map +1 -0
  19. package/dist/chunk-UMB5MJHL.js +239 -0
  20. package/dist/chunk-UMB5MJHL.js.map +1 -0
  21. package/dist/cli/index.js +163 -6499
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/index.js +9 -84
  24. package/dist/index.js.map +1 -1
  25. package/dist/mcp/server.js +33 -12
  26. package/dist/mcp/server.js.map +1 -1
  27. package/dist/npm-UB54H37N.js +9 -0
  28. package/dist/npm-UB54H37N.js.map +1 -0
  29. package/dist/orchestrator-VOOYKDPT.js +8 -0
  30. package/dist/orchestrator-VOOYKDPT.js.map +1 -0
  31. package/dist/python-U4G2GK4J.js +9 -0
  32. package/dist/python-U4G2GK4J.js.map +1 -0
  33. package/dist/server-WONIBSG4.js +640 -0
  34. package/dist/server-WONIBSG4.js.map +1 -0
  35. package/dist/store-Z5UANEBB.js +8 -0
  36. package/dist/store-Z5UANEBB.js.map +1 -0
  37. package/dist/trust-score-YXYDFVPZ.js +8 -0
  38. package/dist/trust-score-YXYDFVPZ.js.map +1 -0
  39. package/package.json +1 -1
  40. package/server.json +2 -2
  41. package/dist/chunk-TXSNFX3N.js.map +0 -1
@@ -0,0 +1,218 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/analyzers/trust-score.ts
4
+ var NA_SCORE = -1;
5
+ var DEFAULT_WEIGHTS = {
6
+ security: 0.25,
7
+ maintainer: 0.25,
8
+ activity: 0.2,
9
+ popularity: 0.15,
10
+ funding: 0.1,
11
+ license: 0.05
12
+ };
13
+ var TrustScoreEngine = class {
14
+ weights;
15
+ constructor(weights) {
16
+ this.weights = { ...DEFAULT_WEIGHTS, ...weights };
17
+ const total = Object.values(this.weights).reduce((a, b) => a + b, 0);
18
+ if (Math.abs(total - 1) > 0.01) {
19
+ throw new Error(`Trust score weights must sum to 1.0, got ${total.toFixed(4)}`);
20
+ }
21
+ }
22
+ /**
23
+ * Calculate a full trust score from all collector results.
24
+ * Returns the weighted score (0-100), the per-dimension metrics,
25
+ * and metadata about data availability.
26
+ */
27
+ calculate(results) {
28
+ const securityRaw = this.calculateSecurityScore(results.security.data);
29
+ const maintainerRaw = this.calculateMaintainerScore(results.github.data);
30
+ const activityRaw = this.calculateActivityScore(results.registry.data, results.github.data);
31
+ const popularityRaw = this.calculatePopularityScore(results.popularity.data);
32
+ const fundingRaw = this.calculateFundingScore(results.funding.data);
33
+ const licenseRaw = this.calculateLicenseScore(results.license.data);
34
+ const entries = [
35
+ { key: "security", weight: this.weights.security, score: securityRaw },
36
+ { key: "maintainer", weight: this.weights.maintainer, score: maintainerRaw },
37
+ { key: "activity", weight: this.weights.activity, score: activityRaw },
38
+ { key: "popularity", weight: this.weights.popularity, score: popularityRaw },
39
+ { key: "funding", weight: this.weights.funding, score: fundingRaw },
40
+ { key: "license", weight: this.weights.license, score: licenseRaw }
41
+ ];
42
+ const unavailableMetrics = entries.filter((e) => e.score === NA_SCORE).map((e) => e.key);
43
+ const trustScore = this.computeWeightedScore(entries, unavailableMetrics);
44
+ const metrics = {
45
+ security: clamp(securityRaw === NA_SCORE ? 0 : securityRaw),
46
+ maintainer: clamp(maintainerRaw === NA_SCORE ? 0 : maintainerRaw),
47
+ activity: clamp(activityRaw === NA_SCORE ? 0 : activityRaw),
48
+ popularity: clamp(popularityRaw === NA_SCORE ? 0 : popularityRaw),
49
+ funding: clamp(fundingRaw === NA_SCORE ? 0 : fundingRaw),
50
+ license: clamp(licenseRaw === NA_SCORE ? 0 : licenseRaw)
51
+ };
52
+ return {
53
+ trustScore: Math.round(trustScore),
54
+ metrics,
55
+ insufficientData: unavailableMetrics.length >= 2,
56
+ unavailableMetrics
57
+ };
58
+ }
59
+ // -------------------------------------------------------------------------
60
+ // Individual dimension scorers
61
+ // -------------------------------------------------------------------------
62
+ calculateSecurityScore(data) {
63
+ if (data === null) return NA_SCORE;
64
+ const vulns = data.totalVulnerabilities;
65
+ let score;
66
+ if (vulns === 0) {
67
+ score = 100;
68
+ } else if (vulns === 1) {
69
+ score = 85;
70
+ } else if (vulns === 2) {
71
+ score = 72;
72
+ } else if (vulns === 3) {
73
+ score = 60;
74
+ } else if (vulns === 4) {
75
+ score = 50;
76
+ } else {
77
+ score = Math.max(20, 100 - vulns * 12);
78
+ }
79
+ if (vulns > 0 && data.averagePatchDays !== null && data.averagePatchDays > 0) {
80
+ if (data.averagePatchDays <= 7) {
81
+ score = Math.min(100, score + 10);
82
+ } else if (data.averagePatchDays <= 30) {
83
+ score = Math.min(100, score + 5);
84
+ }
85
+ }
86
+ return clamp(score);
87
+ }
88
+ calculateMaintainerScore(data) {
89
+ if (data === null) return NA_SCORE;
90
+ let ceiling;
91
+ if (data.contributorCount <= 1) {
92
+ ceiling = 60;
93
+ } else if (data.contributorCount <= 5) {
94
+ ceiling = 80;
95
+ } else {
96
+ ceiling = 100;
97
+ }
98
+ let score = ceiling;
99
+ if (data.recentCommitCount === 0) {
100
+ score -= 20;
101
+ } else if (data.recentCommitCount < 5) {
102
+ score -= 10;
103
+ } else if (data.recentCommitCount >= 20) {
104
+ score = Math.min(ceiling, score + 5);
105
+ }
106
+ return clamp(score);
107
+ }
108
+ calculateActivityScore(registry, github) {
109
+ if (registry === null && github === null) return NA_SCORE;
110
+ let publishScore = 50;
111
+ let commitScore = 50;
112
+ if (registry !== null && registry.lastPublishDate !== null) {
113
+ const lastPublish = new Date(registry.lastPublishDate);
114
+ const monthsSincePublish = monthsBetween(lastPublish, /* @__PURE__ */ new Date());
115
+ if (monthsSincePublish < 3) {
116
+ publishScore = 100;
117
+ } else if (monthsSincePublish < 6) {
118
+ publishScore = 80;
119
+ } else if (monthsSincePublish < 12) {
120
+ publishScore = 50;
121
+ } else if (monthsSincePublish < 24) {
122
+ publishScore = 20;
123
+ } else {
124
+ publishScore = 0;
125
+ }
126
+ }
127
+ if (github !== null) {
128
+ if (github.recentCommitCount >= 30) {
129
+ commitScore = 100;
130
+ } else if (github.recentCommitCount >= 15) {
131
+ commitScore = 80;
132
+ } else if (github.recentCommitCount >= 5) {
133
+ commitScore = 60;
134
+ } else if (github.recentCommitCount >= 1) {
135
+ commitScore = 40;
136
+ } else {
137
+ commitScore = 10;
138
+ }
139
+ }
140
+ if (registry !== null && github !== null) {
141
+ return clamp(Math.round(publishScore * 0.6 + commitScore * 0.4));
142
+ }
143
+ return clamp(registry !== null ? publishScore : commitScore);
144
+ }
145
+ calculatePopularityScore(data) {
146
+ if (data === null) return NA_SCORE;
147
+ const dl = data.weeklyDownloads;
148
+ if (dl >= 1e7) return 100;
149
+ if (dl >= 1e6) return 90;
150
+ if (dl >= 1e5) return 75;
151
+ if (dl >= 1e4) return 60;
152
+ if (dl >= 1e3) return 40;
153
+ if (dl >= 100) return 25;
154
+ return 10;
155
+ }
156
+ calculateFundingScore(data) {
157
+ if (data === null) return NA_SCORE;
158
+ if (data.estimatedAnnualFunding >= 5e4) {
159
+ return 90;
160
+ }
161
+ if (data.hasOpenCollective) return 70;
162
+ if (data.hasSponsors) return 60;
163
+ if (data.hasNpmFunding) return 65;
164
+ return 30;
165
+ }
166
+ calculateLicenseScore(data) {
167
+ if (data === null) return NA_SCORE;
168
+ switch (data.risk) {
169
+ case "safe":
170
+ return 100;
171
+ case "cautious":
172
+ return 60;
173
+ case "risky":
174
+ return 30;
175
+ case "unknown":
176
+ return 10;
177
+ }
178
+ }
179
+ // -------------------------------------------------------------------------
180
+ // Weighted score computation with N/A redistribution
181
+ // -------------------------------------------------------------------------
182
+ /**
183
+ * Compute the final weighted score. Metrics that returned N/A have their
184
+ * weight redistributed proportionally across the remaining metrics.
185
+ */
186
+ computeWeightedScore(metrics, unavailableMetrics) {
187
+ const unavailableSet = new Set(unavailableMetrics);
188
+ const available = metrics.filter((m) => !unavailableSet.has(m.key));
189
+ if (available.length === 0) return 0;
190
+ const totalAvailableWeight = available.reduce((sum, m) => sum + m.weight, 0);
191
+ if (totalAvailableWeight === 0) return 0;
192
+ let score = 0;
193
+ for (const m of available) {
194
+ const effectiveWeight = m.weight / totalAvailableWeight;
195
+ score += m.score * effectiveWeight;
196
+ }
197
+ const missingWeightFraction = 1 - totalAvailableWeight;
198
+ if (missingWeightFraction > 0) {
199
+ const penalty = (score - 50) * missingWeightFraction;
200
+ score = score - penalty;
201
+ }
202
+ return clamp(Math.round(score));
203
+ }
204
+ };
205
+ function clamp(value, min = 0, max = 100) {
206
+ return Math.max(min, Math.min(max, value));
207
+ }
208
+ function monthsBetween(from, to) {
209
+ const years = to.getFullYear() - from.getFullYear();
210
+ const months = to.getMonth() - from.getMonth();
211
+ const days = to.getDate() - from.getDate();
212
+ return years * 12 + months + (days < 0 ? -0.5 : 0);
213
+ }
214
+
215
+ export {
216
+ TrustScoreEngine
217
+ };
218
+ //# sourceMappingURL=chunk-SP3VYPXX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/analyzers/trust-score.ts"],"sourcesContent":["import type {\n CollectorResult,\n RegistryData,\n GitHubData,\n SecurityData,\n FundingData,\n PopularityData,\n LicenseData,\n TrustMetrics,\n} from '../parsers/schema.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Result returned by the AllCollectorResults interface (from orchestrator). */\nexport interface AllCollectorResults {\n registry: CollectorResult<RegistryData>;\n github: CollectorResult<GitHubData>;\n security: CollectorResult<SecurityData>;\n funding: CollectorResult<FundingData>;\n popularity: CollectorResult<PopularityData>;\n license: CollectorResult<LicenseData>;\n}\n\n/** Extended trust result that includes the weighted score and metadata. */\nexport interface TrustScoreResult {\n trustScore: number;\n metrics: TrustMetrics;\n insufficientData: boolean;\n unavailableMetrics: string[];\n}\n\n/** Internal representation of a single metric evaluation. */\ninterface MetricEntry {\n key: keyof TrustMetrics;\n weight: number;\n score: number;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst NA_SCORE = -1;\n\nconst DEFAULT_WEIGHTS: Record<keyof TrustMetrics, number> = {\n security: 0.25,\n maintainer: 0.25,\n activity: 0.20,\n popularity: 0.15,\n funding: 0.10,\n license: 0.05,\n};\n\n// ---------------------------------------------------------------------------\n// TrustScoreEngine\n// ---------------------------------------------------------------------------\n\nexport class TrustScoreEngine {\n private readonly weights: Record<keyof TrustMetrics, number>;\n\n constructor(weights?: Partial<Record<keyof TrustMetrics, number>>) {\n this.weights = { ...DEFAULT_WEIGHTS, ...weights };\n const total = Object.values(this.weights).reduce((a, b) => a + b, 0);\n if (Math.abs(total - 1.0) > 0.01) {\n throw new Error(`Trust score weights must sum to 1.0, got ${total.toFixed(4)}`);\n }\n }\n\n /**\n * Calculate a full trust score from all collector results.\n * Returns the weighted score (0-100), the per-dimension metrics,\n * and metadata about data availability.\n */\n calculate(results: AllCollectorResults): TrustScoreResult {\n const securityRaw = this.calculateSecurityScore(results.security.data);\n const maintainerRaw = this.calculateMaintainerScore(results.github.data);\n const activityRaw = this.calculateActivityScore(results.registry.data, results.github.data);\n const popularityRaw = this.calculatePopularityScore(results.popularity.data);\n const fundingRaw = this.calculateFundingScore(results.funding.data);\n const licenseRaw = this.calculateLicenseScore(results.license.data);\n\n const entries: MetricEntry[] = [\n { key: 'security', weight: this.weights.security, score: securityRaw },\n { key: 'maintainer', weight: this.weights.maintainer, score: maintainerRaw },\n { key: 'activity', weight: this.weights.activity, score: activityRaw },\n { key: 'popularity', weight: this.weights.popularity, score: popularityRaw },\n { key: 'funding', weight: this.weights.funding, score: fundingRaw },\n { key: 'license', weight: this.weights.license, score: licenseRaw },\n ];\n\n const unavailableMetrics = entries\n .filter((e) => e.score === NA_SCORE)\n .map((e) => e.key);\n\n const trustScore = this.computeWeightedScore(entries, unavailableMetrics);\n\n // Clamp individual metrics for the output (N/A becomes 0 in the final metrics object)\n const metrics: TrustMetrics = {\n security: clamp(securityRaw === NA_SCORE ? 0 : securityRaw),\n maintainer: clamp(maintainerRaw === NA_SCORE ? 0 : maintainerRaw),\n activity: clamp(activityRaw === NA_SCORE ? 0 : activityRaw),\n popularity: clamp(popularityRaw === NA_SCORE ? 0 : popularityRaw),\n funding: clamp(fundingRaw === NA_SCORE ? 0 : fundingRaw),\n license: clamp(licenseRaw === NA_SCORE ? 0 : licenseRaw),\n };\n\n return {\n trustScore: Math.round(trustScore),\n metrics,\n insufficientData: unavailableMetrics.length >= 2,\n unavailableMetrics,\n };\n }\n\n // -------------------------------------------------------------------------\n // Individual dimension scorers\n // -------------------------------------------------------------------------\n\n calculateSecurityScore(data: SecurityData | null): number {\n if (data === null) return NA_SCORE;\n\n const vulns = data.totalVulnerabilities;\n\n // Diminishing penalty scale -- popular packages accumulate CVEs over time,\n // so a flat per-vuln penalty is unreasonably harsh.\n let score: number;\n if (vulns === 0) {\n score = 100;\n } else if (vulns === 1) {\n score = 85;\n } else if (vulns === 2) {\n score = 72;\n } else if (vulns === 3) {\n score = 60;\n } else if (vulns === 4) {\n score = 50;\n } else {\n // 5+ vulns: diminishing penalty with a floor of 20\n score = Math.max(20, 100 - vulns * 12);\n }\n\n // Patched bonus: only if vulnerabilities exist AND patch data is available.\n // averagePatchDays > 0 means at least some vulnerabilities were patched.\n if (vulns > 0 && data.averagePatchDays !== null && data.averagePatchDays > 0) {\n if (data.averagePatchDays <= 7) {\n // Fast patches: +10 bonus\n score = Math.min(100, score + 10);\n } else if (data.averagePatchDays <= 30) {\n // Patched within 30 days: +5 bonus\n score = Math.min(100, score + 5);\n }\n // Patches slower than 30 days: no bonus\n }\n\n return clamp(score);\n }\n\n calculateMaintainerScore(data: GitHubData | null): number {\n if (data === null) return NA_SCORE;\n\n let ceiling: number;\n if (data.contributorCount <= 1) {\n ceiling = 60;\n } else if (data.contributorCount <= 5) {\n ceiling = 80;\n } else {\n ceiling = 100;\n }\n\n let score = ceiling;\n\n // Commit frequency bonus/penalty (30-day window)\n if (data.recentCommitCount === 0) {\n score -= 20;\n } else if (data.recentCommitCount < 5) {\n score -= 10;\n } else if (data.recentCommitCount >= 20) {\n score = Math.min(ceiling, score + 5);\n }\n\n return clamp(score);\n }\n\n calculateActivityScore(\n registry: RegistryData | null,\n github: GitHubData | null,\n ): number {\n if (registry === null && github === null) return NA_SCORE;\n\n let publishScore = 50; // neutral default when registry data is absent\n let commitScore = 50;\n\n if (registry !== null && registry.lastPublishDate !== null) {\n const lastPublish = new Date(registry.lastPublishDate);\n const monthsSincePublish = monthsBetween(lastPublish, new Date());\n\n if (monthsSincePublish < 3) {\n publishScore = 100;\n } else if (monthsSincePublish < 6) {\n publishScore = 80;\n } else if (monthsSincePublish < 12) {\n publishScore = 50;\n } else if (monthsSincePublish < 24) {\n publishScore = 20;\n } else {\n publishScore = 0;\n }\n }\n\n if (github !== null) {\n if (github.recentCommitCount >= 30) {\n commitScore = 100;\n } else if (github.recentCommitCount >= 15) {\n commitScore = 80;\n } else if (github.recentCommitCount >= 5) {\n commitScore = 60;\n } else if (github.recentCommitCount >= 1) {\n commitScore = 40;\n } else {\n commitScore = 10;\n }\n }\n\n // When both are available, weight publish 60% and commit 40%\n if (registry !== null && github !== null) {\n return clamp(Math.round(publishScore * 0.6 + commitScore * 0.4));\n }\n\n // Only one source available — use it directly\n return clamp(registry !== null ? publishScore : commitScore);\n }\n\n calculatePopularityScore(data: PopularityData | null): number {\n if (data === null) return NA_SCORE;\n\n const dl = data.weeklyDownloads;\n\n if (dl >= 10_000_000) return 100;\n if (dl >= 1_000_000) return 90;\n if (dl >= 100_000) return 75;\n if (dl >= 10_000) return 60;\n if (dl >= 1_000) return 40;\n if (dl >= 100) return 25;\n return 10;\n }\n\n calculateFundingScore(data: FundingData | null): number {\n if (data === null) return NA_SCORE;\n\n // Determine the highest tier of funding\n if (data.estimatedAnnualFunding >= 50_000) {\n // Corporate-level funding\n return 90;\n }\n\n if (data.hasOpenCollective) return 70;\n if (data.hasSponsors) return 60;\n if (data.hasNpmFunding) return 65;\n\n // No meaningful funding\n return 30;\n }\n\n calculateLicenseScore(data: LicenseData | null): number {\n if (data === null) return NA_SCORE;\n\n switch (data.risk) {\n case 'safe':\n return 100;\n case 'cautious':\n return 60;\n case 'risky':\n return 30;\n case 'unknown':\n return 10;\n }\n }\n\n // -------------------------------------------------------------------------\n // Weighted score computation with N/A redistribution\n // -------------------------------------------------------------------------\n\n /**\n * Compute the final weighted score. Metrics that returned N/A have their\n * weight redistributed proportionally across the remaining metrics.\n */\n computeWeightedScore(\n metrics: MetricEntry[],\n unavailableMetrics: string[],\n ): number {\n const unavailableSet = new Set(unavailableMetrics);\n\n const available = metrics.filter((m) => !unavailableSet.has(m.key));\n\n if (available.length === 0) return 0;\n\n const totalAvailableWeight = available.reduce((sum, m) => sum + m.weight, 0);\n\n if (totalAvailableWeight === 0) return 0;\n\n // Redistribute: each available metric's effective weight is\n // its original weight scaled so all effective weights sum to 1.\n let score = 0;\n for (const m of available) {\n const effectiveWeight = m.weight / totalAvailableWeight;\n score += m.score * effectiveWeight;\n }\n\n // Apply confidence penalty based on missing weight\n const missingWeightFraction = 1 - totalAvailableWeight;\n if (missingWeightFraction > 0) {\n // Pull score toward midpoint (50) proportionally to missing weight\n const penalty = (score - 50) * missingWeightFraction;\n score = score - penalty;\n }\n\n return clamp(Math.round(score));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction clamp(value: number, min = 0, max = 100): number {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction monthsBetween(from: Date, to: Date): number {\n const years = to.getFullYear() - from.getFullYear();\n const months = to.getMonth() - from.getMonth();\n const days = to.getDate() - from.getDate();\n return years * 12 + months + (days < 0 ? -0.5 : 0);\n}\n"],"mappings":"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","names":[]}