@mcptoolshop/registry-stats 3.0.0 → 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/dist/index.d.cts CHANGED
@@ -116,6 +116,183 @@ declare function createHandler(opts?: StatsOptions): Handler;
116
116
  /** Starts an HTTP server. Returns the server instance. */
117
117
  declare function serve(opts?: ServerOptions): node_http.Server<typeof IncomingMessage, typeof ServerResponse>;
118
118
 
119
+ /**
120
+ * AI Inference Module — statistical forecasting, anomaly detection, and recommendations.
121
+ *
122
+ * Zero dependencies. Pure math on time-series data arrays.
123
+ * Designed to run at build-time in the fetch-stats pipeline.
124
+ */
125
+ interface ForecastPoint {
126
+ day: number;
127
+ predicted: number;
128
+ lower: number;
129
+ upper: number;
130
+ }
131
+ interface Anomaly {
132
+ day: number;
133
+ value: number;
134
+ expected: number;
135
+ zscore: number;
136
+ type: 'spike' | 'drop';
137
+ }
138
+ interface TrendSegment {
139
+ start: number;
140
+ end: number;
141
+ direction: 'up' | 'down' | 'flat';
142
+ slope: number;
143
+ magnitude: number;
144
+ }
145
+ interface Recommendation {
146
+ type: 'growth' | 'risk' | 'opportunity' | 'attention';
147
+ priority: 'high' | 'medium' | 'low';
148
+ title: string;
149
+ detail: string;
150
+ metric?: string;
151
+ }
152
+ interface MonthlyAggregate {
153
+ week: number;
154
+ month: number;
155
+ total: number;
156
+ lastUpdated: string;
157
+ }
158
+ interface YearlyProgress {
159
+ name: string;
160
+ registry: string;
161
+ currentYearTotal: number;
162
+ previousYearTotal: number | null;
163
+ yoyGrowthPct: number | null;
164
+ projectedYearEnd: number;
165
+ monthlyTotals: Array<{
166
+ month: string;
167
+ downloads: number;
168
+ }>;
169
+ bestMonth: {
170
+ month: string;
171
+ downloads: number;
172
+ } | null;
173
+ milestones: Array<{
174
+ threshold: number;
175
+ crossed: boolean;
176
+ crossedAt?: string;
177
+ }>;
178
+ }
179
+ interface PackageHealthScore {
180
+ name: string;
181
+ registry: string;
182
+ score: number;
183
+ grade: 'A' | 'B' | 'C' | 'D' | 'F';
184
+ components: {
185
+ activity: number;
186
+ consistency: number;
187
+ growth: number;
188
+ stability: number;
189
+ };
190
+ }
191
+ interface ActionableAdvice {
192
+ type: 'growth' | 'risk' | 'opportunity' | 'attention' | 'milestone';
193
+ severity: 'critical' | 'warning' | 'info' | 'success';
194
+ urgency: 'immediate' | 'this-week' | 'this-month' | 'informational';
195
+ title: string;
196
+ detail: string;
197
+ action: string;
198
+ metric?: string;
199
+ packages?: string[];
200
+ }
201
+ interface PackageInference {
202
+ name: string;
203
+ registry: string;
204
+ forecast7: ForecastPoint[];
205
+ anomalies: Anomaly[];
206
+ trendSegments: TrendSegment[];
207
+ seasonality: {
208
+ dayOfWeek: number[];
209
+ peakDay: string;
210
+ } | null;
211
+ momentum: number;
212
+ }
213
+ interface PortfolioInference {
214
+ packages: PackageInference[];
215
+ recommendations: Recommendation[];
216
+ forecastTotal7: number[];
217
+ riskScore: number;
218
+ diversityTrend: 'improving' | 'stable' | 'declining';
219
+ portfolioMomentum: number;
220
+ healthScores: PackageHealthScore[];
221
+ actionableAdvice: ActionableAdvice[];
222
+ }
223
+ /**
224
+ * Forecast next N days using weighted linear regression on recent data.
225
+ * Uses the last 14 days with exponential weighting (recent days matter more).
226
+ * Returns predictions with 80% confidence intervals.
227
+ */
228
+ declare function forecast(series: number[], days?: number): ForecastPoint[];
229
+ /**
230
+ * Detect anomalies using adaptive z-score with rolling baseline.
231
+ * More sophisticated than simple global z-score — uses a 14-day rolling
232
+ * window so seasonal patterns don't trigger false positives.
233
+ */
234
+ declare function detectAnomalies(series: number[], threshold?: number): Anomaly[];
235
+ /**
236
+ * Segment a time series into directional trend segments.
237
+ * Uses a simple piecewise linear approach with minimum segment length.
238
+ */
239
+ declare function segmentTrends(series: number[], minSegmentLength?: number): TrendSegment[];
240
+ /**
241
+ * Detect day-of-week seasonality patterns.
242
+ * Requires at least 14 days of data to identify weekly cycles.
243
+ */
244
+ declare function detectSeasonality(series: number[], startDaysAgo: number): {
245
+ dayOfWeek: number[];
246
+ peakDay: string;
247
+ } | null;
248
+ /**
249
+ * Compute a composite momentum score (-100 to +100).
250
+ * Combines: short-term trend, acceleration, volume, and consistency.
251
+ */
252
+ declare function computeMomentum(series: number[]): number;
253
+ /**
254
+ * Compute yearly progress for a package given its monthly history.
255
+ * `monthlyHistory` maps month keys ("2026-01") to MonthlyAggregate.
256
+ */
257
+ declare function computeYearlyProgress(name: string, registry: string, monthlyHistory: Record<string, MonthlyAggregate>): YearlyProgress;
258
+ /**
259
+ * Compute a health score (0-100) for a package based on its 30-day series.
260
+ * Grade scale: A (80-100), B (60-79), C (40-59), D (20-39), F (0-19).
261
+ */
262
+ declare function computeHealthScore(name: string, registry: string, series: number[] | null, momentum: number): PackageHealthScore;
263
+ /**
264
+ * Generate specific, actionable advice with severity and urgency levels.
265
+ * More detailed than `generateRecommendations` — includes concrete steps.
266
+ */
267
+ declare function generateActionableAdvice(packages: PackageInference[], healthScores: PackageHealthScore[], opts?: {
268
+ gini?: number;
269
+ npmPct?: number;
270
+ totalWeekly?: number;
271
+ }): ActionableAdvice[];
272
+ /**
273
+ * Generate automated recommendations based on portfolio analysis.
274
+ */
275
+ declare function generateRecommendations(packages: PackageInference[], opts?: {
276
+ gini?: number;
277
+ npmPct?: number;
278
+ totalWeekly?: number;
279
+ }): Recommendation[];
280
+ /**
281
+ * Run full inference pipeline on a leaderboard dataset.
282
+ * This is the main entry point called from fetch-stats.mjs.
283
+ */
284
+ declare function inferPortfolio(leaderboard: Array<{
285
+ name: string;
286
+ registry: string;
287
+ week: number;
288
+ range30?: number[] | null;
289
+ trendPct?: number | null;
290
+ }>, opts?: {
291
+ gini?: number;
292
+ npmPct?: number;
293
+ totalWeekly?: number;
294
+ }): PortfolioInference;
295
+
119
296
  declare function createCache(): StatsCache;
120
297
 
121
298
  declare function registerProvider(provider: RegistryProvider): void;
@@ -130,4 +307,4 @@ declare namespace stats {
130
307
  }) => Promise<PackageStats[]>;
131
308
  }
132
309
 
133
- export { type ChartData, type ComparisonResult, type Config, type DailyDownloads, type PackageConfig, type PackageStats, type RateLimitConfig, RegistryError, type RegistryName, type RegistryProvider, type ServerOptions, type StatsCache, type StatsOptions, calc, createCache, createHandler, defaultConfig, loadConfig, registerProvider, serve, starterConfig, stats };
310
+ export { type ActionableAdvice, type Anomaly, type ChartData, type ComparisonResult, type Config, type DailyDownloads, type ForecastPoint, type MonthlyAggregate, type PackageConfig, type PackageHealthScore, type PackageInference, type PackageStats, type PortfolioInference, type RateLimitConfig, type Recommendation, RegistryError, type RegistryName, type RegistryProvider, type ServerOptions, type StatsCache, type StatsOptions, type TrendSegment, type YearlyProgress, calc, computeHealthScore, computeMomentum, computeYearlyProgress, createCache, createHandler, defaultConfig, detectAnomalies, detectSeasonality, forecast, generateActionableAdvice, generateRecommendations, inferPortfolio, loadConfig, registerProvider, segmentTrends, serve, starterConfig, stats };
package/dist/index.d.ts CHANGED
@@ -116,6 +116,183 @@ declare function createHandler(opts?: StatsOptions): Handler;
116
116
  /** Starts an HTTP server. Returns the server instance. */
117
117
  declare function serve(opts?: ServerOptions): node_http.Server<typeof IncomingMessage, typeof ServerResponse>;
118
118
 
119
+ /**
120
+ * AI Inference Module — statistical forecasting, anomaly detection, and recommendations.
121
+ *
122
+ * Zero dependencies. Pure math on time-series data arrays.
123
+ * Designed to run at build-time in the fetch-stats pipeline.
124
+ */
125
+ interface ForecastPoint {
126
+ day: number;
127
+ predicted: number;
128
+ lower: number;
129
+ upper: number;
130
+ }
131
+ interface Anomaly {
132
+ day: number;
133
+ value: number;
134
+ expected: number;
135
+ zscore: number;
136
+ type: 'spike' | 'drop';
137
+ }
138
+ interface TrendSegment {
139
+ start: number;
140
+ end: number;
141
+ direction: 'up' | 'down' | 'flat';
142
+ slope: number;
143
+ magnitude: number;
144
+ }
145
+ interface Recommendation {
146
+ type: 'growth' | 'risk' | 'opportunity' | 'attention';
147
+ priority: 'high' | 'medium' | 'low';
148
+ title: string;
149
+ detail: string;
150
+ metric?: string;
151
+ }
152
+ interface MonthlyAggregate {
153
+ week: number;
154
+ month: number;
155
+ total: number;
156
+ lastUpdated: string;
157
+ }
158
+ interface YearlyProgress {
159
+ name: string;
160
+ registry: string;
161
+ currentYearTotal: number;
162
+ previousYearTotal: number | null;
163
+ yoyGrowthPct: number | null;
164
+ projectedYearEnd: number;
165
+ monthlyTotals: Array<{
166
+ month: string;
167
+ downloads: number;
168
+ }>;
169
+ bestMonth: {
170
+ month: string;
171
+ downloads: number;
172
+ } | null;
173
+ milestones: Array<{
174
+ threshold: number;
175
+ crossed: boolean;
176
+ crossedAt?: string;
177
+ }>;
178
+ }
179
+ interface PackageHealthScore {
180
+ name: string;
181
+ registry: string;
182
+ score: number;
183
+ grade: 'A' | 'B' | 'C' | 'D' | 'F';
184
+ components: {
185
+ activity: number;
186
+ consistency: number;
187
+ growth: number;
188
+ stability: number;
189
+ };
190
+ }
191
+ interface ActionableAdvice {
192
+ type: 'growth' | 'risk' | 'opportunity' | 'attention' | 'milestone';
193
+ severity: 'critical' | 'warning' | 'info' | 'success';
194
+ urgency: 'immediate' | 'this-week' | 'this-month' | 'informational';
195
+ title: string;
196
+ detail: string;
197
+ action: string;
198
+ metric?: string;
199
+ packages?: string[];
200
+ }
201
+ interface PackageInference {
202
+ name: string;
203
+ registry: string;
204
+ forecast7: ForecastPoint[];
205
+ anomalies: Anomaly[];
206
+ trendSegments: TrendSegment[];
207
+ seasonality: {
208
+ dayOfWeek: number[];
209
+ peakDay: string;
210
+ } | null;
211
+ momentum: number;
212
+ }
213
+ interface PortfolioInference {
214
+ packages: PackageInference[];
215
+ recommendations: Recommendation[];
216
+ forecastTotal7: number[];
217
+ riskScore: number;
218
+ diversityTrend: 'improving' | 'stable' | 'declining';
219
+ portfolioMomentum: number;
220
+ healthScores: PackageHealthScore[];
221
+ actionableAdvice: ActionableAdvice[];
222
+ }
223
+ /**
224
+ * Forecast next N days using weighted linear regression on recent data.
225
+ * Uses the last 14 days with exponential weighting (recent days matter more).
226
+ * Returns predictions with 80% confidence intervals.
227
+ */
228
+ declare function forecast(series: number[], days?: number): ForecastPoint[];
229
+ /**
230
+ * Detect anomalies using adaptive z-score with rolling baseline.
231
+ * More sophisticated than simple global z-score — uses a 14-day rolling
232
+ * window so seasonal patterns don't trigger false positives.
233
+ */
234
+ declare function detectAnomalies(series: number[], threshold?: number): Anomaly[];
235
+ /**
236
+ * Segment a time series into directional trend segments.
237
+ * Uses a simple piecewise linear approach with minimum segment length.
238
+ */
239
+ declare function segmentTrends(series: number[], minSegmentLength?: number): TrendSegment[];
240
+ /**
241
+ * Detect day-of-week seasonality patterns.
242
+ * Requires at least 14 days of data to identify weekly cycles.
243
+ */
244
+ declare function detectSeasonality(series: number[], startDaysAgo: number): {
245
+ dayOfWeek: number[];
246
+ peakDay: string;
247
+ } | null;
248
+ /**
249
+ * Compute a composite momentum score (-100 to +100).
250
+ * Combines: short-term trend, acceleration, volume, and consistency.
251
+ */
252
+ declare function computeMomentum(series: number[]): number;
253
+ /**
254
+ * Compute yearly progress for a package given its monthly history.
255
+ * `monthlyHistory` maps month keys ("2026-01") to MonthlyAggregate.
256
+ */
257
+ declare function computeYearlyProgress(name: string, registry: string, monthlyHistory: Record<string, MonthlyAggregate>): YearlyProgress;
258
+ /**
259
+ * Compute a health score (0-100) for a package based on its 30-day series.
260
+ * Grade scale: A (80-100), B (60-79), C (40-59), D (20-39), F (0-19).
261
+ */
262
+ declare function computeHealthScore(name: string, registry: string, series: number[] | null, momentum: number): PackageHealthScore;
263
+ /**
264
+ * Generate specific, actionable advice with severity and urgency levels.
265
+ * More detailed than `generateRecommendations` — includes concrete steps.
266
+ */
267
+ declare function generateActionableAdvice(packages: PackageInference[], healthScores: PackageHealthScore[], opts?: {
268
+ gini?: number;
269
+ npmPct?: number;
270
+ totalWeekly?: number;
271
+ }): ActionableAdvice[];
272
+ /**
273
+ * Generate automated recommendations based on portfolio analysis.
274
+ */
275
+ declare function generateRecommendations(packages: PackageInference[], opts?: {
276
+ gini?: number;
277
+ npmPct?: number;
278
+ totalWeekly?: number;
279
+ }): Recommendation[];
280
+ /**
281
+ * Run full inference pipeline on a leaderboard dataset.
282
+ * This is the main entry point called from fetch-stats.mjs.
283
+ */
284
+ declare function inferPortfolio(leaderboard: Array<{
285
+ name: string;
286
+ registry: string;
287
+ week: number;
288
+ range30?: number[] | null;
289
+ trendPct?: number | null;
290
+ }>, opts?: {
291
+ gini?: number;
292
+ npmPct?: number;
293
+ totalWeekly?: number;
294
+ }): PortfolioInference;
295
+
119
296
  declare function createCache(): StatsCache;
120
297
 
121
298
  declare function registerProvider(provider: RegistryProvider): void;
@@ -130,4 +307,4 @@ declare namespace stats {
130
307
  }) => Promise<PackageStats[]>;
131
308
  }
132
309
 
133
- export { type ChartData, type ComparisonResult, type Config, type DailyDownloads, type PackageConfig, type PackageStats, type RateLimitConfig, RegistryError, type RegistryName, type RegistryProvider, type ServerOptions, type StatsCache, type StatsOptions, calc, createCache, createHandler, defaultConfig, loadConfig, registerProvider, serve, starterConfig, stats };
310
+ export { type ActionableAdvice, type Anomaly, type ChartData, type ComparisonResult, type Config, type DailyDownloads, type ForecastPoint, type MonthlyAggregate, type PackageConfig, type PackageHealthScore, type PackageInference, type PackageStats, type PortfolioInference, type RateLimitConfig, type Recommendation, RegistryError, type RegistryName, type RegistryProvider, type ServerOptions, type StatsCache, type StatsOptions, type TrendSegment, type YearlyProgress, calc, computeHealthScore, computeMomentum, computeYearlyProgress, createCache, createHandler, defaultConfig, detectAnomalies, detectSeasonality, forecast, generateActionableAdvice, generateRecommendations, inferPortfolio, loadConfig, registerProvider, segmentTrends, serve, starterConfig, stats };