@mcptoolshop/registry-stats 2.3.0 → 3.1.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/README.ja.md CHANGED
@@ -1,15 +1,15 @@
1
- <p align="center">
2
- <a href="README.md">English</a> | <a href="README.zh.md">中文</a> | <a href="README.es.md">Español</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.it.md">Italiano</a> | <a href="README.pt-BR.md">Português (BR)</a>
3
- </p>
4
-
1
+ <p align="center">
2
+ <a href="README.md">English</a> | <a href="README.zh.md">中文</a> | <a href="README.es.md">Español</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.it.md">Italiano</a> | <a href="README.pt-BR.md">Português (BR)</a>
3
+ </p>
4
+
5
5
  <p align="center">
6
6
  <img src="https://raw.githubusercontent.com/mcp-tool-shop-org/brand/main/logos/registry-stats/readme.png" alt="registry-stats logo" width="400" />
7
7
  </p>
8
-
8
+
9
9
  <p align="center">
10
10
  Five registries. One engine. Dashboard included.
11
11
  </p>
12
-
12
+
13
13
  <p align="center">
14
14
  <a href="https://github.com/mcp-tool-shop-org/registry-stats/actions/workflows/pages.yml"><img src="https://github.com/mcp-tool-shop-org/registry-stats/actions/workflows/pages.yml/badge.svg" alt="CI"></a>
15
15
  <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="MIT License"></a>
@@ -17,7 +17,7 @@
17
17
  <a href="https://mcp-tool-shop-org.github.io/registry-stats/dashboard/"><img src="https://img.shields.io/badge/Dashboard-live-green" alt="Dashboard"></a>
18
18
  <a href="https://mcp-tool-shop-org.github.io/registry-stats/"><img src="https://img.shields.io/badge/Landing_Page-live-blue" alt="Landing Page"></a>
19
19
  </p>
20
-
20
+
21
21
  <p align="center">
22
22
  <a href="#dashboard">Dashboard</a> &middot;
23
23
  <a href="#desktop-app">Desktop App</a> &middot;
@@ -28,57 +28,60 @@
28
28
  <a href="#config-file">Config</a> &middot;
29
29
  <a href="#license">License</a>
30
30
  </p>
31
-
31
+
32
32
  ---
33
-
34
- npm、PyPI、NuGet、Visual Studio Code Marketplace、Docker Hub などのプラットフォームに公開できます。現在、「私のパッケージの状況はどうなっているか?」を知るには、5つの異なるサイトを確認する必要があります。**registry-stats** は、それらを統合したプラットフォームです。TypeScript で構築されたエンジン(CLI + API + REST サーバー)、リアルタイムの Web ダッシュボード、そしてネイティブの Windows デスクトップ アプリケーション。これらはすべて、1つのリポジトリから提供されます。
35
-
36
- 実行時の依存関係はありません。ネイティブの `fetch()` を使用します。Node 18 以降が必要です。
37
-
38
- ## 構成要素
39
-
40
- | レイヤー | 機能 |
41
- |-------|-------------|
42
- | **Engine** | TypeScript ライブラリ + CLI + REST サーバー。1つのインターフェースで、5つのレジストリをクエリできます。npm で `@mcptoolshop/registry-stats` として公開されています。 |
43
- | **Dashboard** | Astro で構築された Web アプリケーション。AI チャットアシスタント、6つのインタラクティブチャート、スマート成長エンジン、タブ付きヘルプガイド。毎週、CI によって再構築されます。 |
44
- | **Desktop** | WinUI 3 + WebView2 を使用したネイティブ Windows アプリケーション。ダッシュボードをオフラインで利用できるようにバンドルし、必要に応じてリアルタイムの統計情報を取得します。 |
45
-
46
- ## ダッシュボード
47
-
48
- 自己更新型の統計ダッシュボードは、[`/dashboard/`](https://mcp-tool-shop-org.github.io/registry-stats/dashboard/) にあります。
49
-
50
- - **タブインターフェース** — Home、Analytics、Leaderboard、Help タブ
51
- - **AI チャットアシスタント** — Ollama を使用した Registry Assistant。RAG コンテキスト注入、ストリーミング応答、モデルセレクター、会話メモリ
52
- - **エグゼクティブスナップショット** — ヘルススコア(0100)、多様性インデックス、週次変動、全レジストリの合計ダウンロード数
53
- - **6つのインタラクティブチャート** — 30日トレンド(合計 / レジストリ別 / トップ5切り替え)、レジストリシェア(ポーラーエリア)、ポートフォリオリスク(分布ヒストグラム + Gini & P90)、トップ10モメンタム、スパークライン付きベロシティトラッカー、30日ヒートマップ(スパイク検出 >2σ)
54
- - **スマート成長エンジン** — 小さな分母の歪みを処理。ベースライン閾値、パーセンテージキャップ、減衰ベロシティ式
55
- - **アクション可能なインサイト** — 自動生成された推奨事項と減少パッケージの注意アラート
56
- - **ランキング** — 全パッケージを週次ダウンロード数でランク付け、30日スパークラインとスマートトレンドバッジ付き
57
- - **セットアップページ** — ポートフォリオエディター、バリデーション、registry-sync コンパニオンセクション、パイプライン概要
58
- - **ヘルプタブ** 各タブ、キーコンセプト、AI アシスタントの使い方、データパイプライン、便利なリンクをカバーする人間に優しいガイド
59
- - **テーマ** — システム設定に従って、ダークモードまたはライトモードを切り替え。
60
-
61
- データはビルド時に取得され、毎週 CI によって再構築されます(月曜日 06:00 UTC)。追跡するパッケージは、`site/src/data/packages.json` で設定します。
62
-
63
- ## デスクトップ アプリケーション
64
-
65
- ダッシュボードをローカルの WebView2 シェルでラップした、ネイティブの Windows アプリケーションです。
66
-
67
- - **オフライン対応**:HTML/CSS/JS がバンドルされているため、インターネット接続なしで動作します。
68
- - **リアルタイム更新**:GitHub Pages から `stats.json` をオンデマンドで取得します。
69
- - **CSV エクスポート**:ランキングデータをワンクリックで CSV 形式でエクスポートできます。
70
- - **MSIX パッケージ**:CI で `desktop-ci.yml` を使用してビルドおよび署名されます。
71
-
72
- デスクトップアプリケーションのソースコードは、`desktop/` にあります。 .NET 10 MAUI を使用して、WinUI 3 をターゲットに構築されています。
73
-
74
- ## インストール
75
-
33
+
34
+ npm、PyPI、NuGet、Visual Studio Code Marketplace、Docker Hub などのプラットフォームに公開できます。現在、「私のパッケージの状況はどうなっているか?」を知るには、5つの異なるサイトを確認する必要があります。**registry-stats** は、それらを統合したプラットフォームです。TypeScript で構築されたエンジン(CLI + API + REST サーバー)、リアルタイムの Web ダッシュボード、そしてネイティブの Windows デスクトップ アプリケーション。これらはすべて、1つのリポジトリから提供されます。
35
+
36
+ 実行時の依存関係はありません。ネイティブの `fetch()` を使用します。Node 18 以降が必要です。
37
+
38
+ ## 構成要素
39
+
40
+ | レイヤー | 機能 |
41
+ |-------|-------------|
42
+ | **Engine** | TypeScript ライブラリ + CLI + REST サーバー。1つのインターフェースで、5つのレジストリをクエリできます。npm で `@mcptoolshop/registry-stats` として公開されています。 |
43
+ | **Dashboard** | Astroで構築されたウェブアプリケーションで、Pulse AIのコパイロット機能(ストリーミング音声、ウェブ検索、フルスクリーン表示、GitHubデータ連携)、インタラクティブなグラフ6種類、リアルタイム更新、レポートのエクスポート機能(PDF/JSONL/Markdown)、タブ形式のヘルプガイドを備えています。毎週CIによって再構築され、必要に応じて更新できます。 |
44
+ | **Desktop** | WinUI 3 + WebView2 を使用したネイティブ Windows アプリケーション。ダッシュボードをオフラインで利用できるようにバンドルし、必要に応じてリアルタイムの統計情報を取得します。 |
45
+
46
+ ## ダッシュボード
47
+
48
+ 自己更新型の統計ダッシュボードは、[`/dashboard/`](https://mcp-tool-shop-org.github.io/registry-stats/dashboard/) にあります。
49
+
50
+ - **タブインターフェース**:ホーム、分析、ランキング、ヘルプのタブ
51
+ - **Pulse AIコパイロット**:Ollamaを搭載した会話アシスタント。ストリーミング音声合成(LLMが生成するテキストをリアルタイムで読み上げます。4種類の音声を利用可能。[mcp-voice-soundboard](https://github.com/mcp-tool-shop-org/mcp-voice-soundboard))、ウェブ検索(Wikipedia + オプションでSearXNG)、自動音声再生、フルスクリーンモード、GitHub組織のデータ連携、モデル選択機能、会話履歴
52
+ - **概要**:ヘルススコア(0100)、多様性指標、週間変化、すべてのレジストリにおける合計ダウンロード数
53
+ - **インタラクティブなグラフ6種類**:30日間のトレンド(集計/レジストリ別/上位5件の切り替え)、レジストリのシェア(極座標グラフ)、ポートフォリオのリスク(ヒストグラム + Gini係数 & P90)、上位10件の動向、速度トラッカー(スパークライン付き)、30日間のヒートマップ(異常値検出(>2σ))
54
+ - **スマート成長エンジン**:少数のデータによる歪みを、基準値の閾値、割合の上限、減衰速度の計算式で補正
55
+ - **アクション可能なインサイト**:パッケージのパフォーマンス低下に対する自動生成された推奨事項と注意喚起
56
+ - **Pulseパネル**:ダウンロード数が多いパッケージ(週50件以上)と、新興・新規パッケージを分割表示。インラインで7日間のスパークライン、絶対値と割合の変化、基準値、そして簡潔な概要を表示
57
+ - **リアルタイム更新**:npmとPyPIのAPIからクライアント側でデータを取得し、進捗状況を表示。取得したデータはsessionStorageにキャッシュされ(5分間のTTL)、タブの切り替えを高速化
58
+ - **レポートのエクスポート**:更新ボタンの隣にあるドロップダウンメニューから、以下の3つの形式でレポートをエクスポートできます:**Exec PDF**(jsPDFを使用)、**LLM JSONL**(AIによる解析に適したデータ形式)、**Dev Markdown**(GFMテーブル)
59
+ - **ランキング**:132のパッケージを、週間ダウンロード数でランキング。インラインで30日間のスパークラインと、スマートなトレンドバッジを表示
60
+ - **設定ページ**:ポートフォリオエディタ(検証機能付き)、レジストリとの同期機能、パイプラインの概要
61
+ - **ヘルプ**:すべてのタブ、主要な概念、AIアシスタントのヒント、データパイプライン、役立つリンクなどを網羅した、ユーザーフレンドリーなガイド
62
+ - **テーマ**:システムのデフォルト設定に従います(ダーク/ライト)
63
+
64
+ データはビルド時に取得され、毎週月曜日の午前6時(UTC)にCIによって再構築されます。リアルタイム更新は、レジストリのAPIから最新のデータを直接取得します。追跡するパッケージは、`site/src/data/packages.json`で設定します(5つのレジストリに合計132のパッケージ)。
65
+
66
+ ## デスクトップ アプリケーション
67
+
68
+ ダッシュボードをローカルの WebView2 シェルでラップした、ネイティブの Windows アプリケーションです。
69
+
70
+ - **オフライン対応**:HTML/CSS/JS がバンドルされているため、インターネット接続なしで動作します。
71
+ - **リアルタイム更新**:GitHub Pages から `stats.json` をオンデマンドで取得します。
72
+ - **CSV エクスポート**:ランキングデータをワンクリックで CSV 形式でエクスポートできます。
73
+ - **MSIX パッケージ**:CI で `desktop-ci.yml` を使用してビルドおよび署名されます。
74
+
75
+ デスクトップアプリケーションのソースコードは、`desktop/` にあります。 .NET 10 MAUI を使用して、WinUI 3 をターゲットに構築されています。
76
+
77
+ ## インストール
78
+
76
79
  ```bash
77
80
  npm install @mcptoolshop/registry-stats
78
81
  ```
79
-
80
- ## CLI (コマンドラインインターフェース)
81
-
82
+
83
+ ## CLI (コマンドラインインターフェース)
84
+
82
85
  ```bash
83
86
  # Query a single registry
84
87
  registry-stats express -r npm
@@ -116,11 +119,11 @@ registry-stats express -r npm --range 2025-01-01:2025-06-30 --format chart
116
119
  # Start a REST API server
117
120
  registry-stats serve --port 3000
118
121
  ```
119
-
120
- ## 設定ファイル
121
-
122
- プロジェクトのルートディレクトリに`registry-stats.config.json`を作成します(または、`registry-stats --init`を実行します)。
123
-
122
+
123
+ ## 設定ファイル
124
+
125
+ プロジェクトのルートディレクトリに`registry-stats.config.json`を作成します(または、`registry-stats --init`を実行します)。
126
+
124
127
  ```json
125
128
  {
126
129
  "registries": ["npm", "pypi", "nuget", "vscode", "docker"],
@@ -139,11 +142,11 @@ registry-stats serve --port 3000
139
142
  "concurrency": 5
140
143
  }
141
144
  ```
142
-
143
- 設定されたすべてのパッケージの統計情報を取得するには、引数なしで`registry-stats`を実行します。CLIは、現在の作業ディレクトリから上位のディレクトリを検索し、最も近い設定ファイルを見つけます。
144
-
145
- 設定ファイルは、プログラム的に利用することも可能です。
146
-
145
+
146
+ 設定されたすべてのパッケージの統計情報を取得するには、引数なしで`registry-stats`を実行します。CLIは、現在の作業ディレクトリから上位のディレクトリを検索し、最も近い設定ファイルを見つけます。
147
+
148
+ 設定ファイルは、プログラム的に利用することも可能です。
149
+
147
150
  ```typescript
148
151
  import { loadConfig, defaultConfig, starterConfig } from '@mcptoolshop/registry-stats';
149
152
 
@@ -151,9 +154,9 @@ const config = loadConfig(); // finds nearest config file, or null
151
154
  const defaults = defaultConfig(); // returns default Config object
152
155
  const template = starterConfig(); // returns starter JSON string
153
156
  ```
154
-
155
- ## プログラムAPI
156
-
157
+
158
+ ## プログラムAPI
159
+
157
160
  ```typescript
158
161
  import { stats, calc, createCache } from '@mcptoolshop/registry-stats';
159
162
 
@@ -194,41 +197,41 @@ const cache = createCache();
194
197
  await stats('npm', 'express', { cache }); // fetches
195
198
  await stats('npm', 'express', { cache }); // cache hit
196
199
  ```
197
-
198
- ## レジストリのサポート
199
-
200
- | レジストリ | パッケージ形式 | 時系列データ | 利用可能なデータ |
201
- |----------|---------------|-------------|----------------|
202
- | `npm` | `express`, `@scope/pkg` | はい (549日間) | lastDay (直近1日), lastWeek (直近1週間), lastMonth (直近1ヶ月) |
203
- | `pypi` | `requests` | はい (180日間) | lastDay (直近1日), lastWeek (直近1週間), lastMonth (直近1ヶ月), total (合計) |
204
- | `nuget` | `Newtonsoft.Json` | No | total (合計) |
205
- | `vscode` | `publisher.extension` | No | total (インストール数), rating (評価), trends (傾向) |
206
- | `docker` | `namespace/repo` | No | total (ダウンロード数), stars (スター数) |
207
-
208
- ## 組み込みの信頼性
209
-
210
- - 429/5xxエラーが発生した場合、指数関数的なバックオフによる自動再試行
211
- - `Retry-After`ヘッダーを尊重
212
- - 大量リクエストに対する同時実行数の制限
213
- - オプションのTTLキャッシュ (プラグイン可能。`StatsCache`インターフェースを通じて、独自のRedis/ファイルバックエンドを提供)
214
-
215
- ## REST APIサーバー
216
-
217
- マイクロサービスとして実行するか、独自のサーバーに組み込むことができます。
218
-
200
+
201
+ ## レジストリのサポート
202
+
203
+ | レジストリ | パッケージ形式 | 時系列データ | 利用可能なデータ |
204
+ |----------|---------------|-------------|----------------|
205
+ | `npm` | `express`, `@scope/pkg` | はい (549日間) | lastDay (直近1日), lastWeek (直近1週間), lastMonth (直近1ヶ月) |
206
+ | `pypi` | `requests` | はい (180日間) | lastDay (直近1日), lastWeek (直近1週間), lastMonth (直近1ヶ月), total (合計) |
207
+ | `nuget` | `Newtonsoft.Json` | No | total (合計) |
208
+ | `vscode` | `publisher.extension` | No | total (インストール数), rating (評価), trends (傾向) |
209
+ | `docker` | `namespace/repo` | No | total (ダウンロード数), stars (スター数) |
210
+
211
+ ## 組み込みの信頼性
212
+
213
+ - 429/5xxエラーが発生した場合、指数関数的なバックオフによる自動再試行
214
+ - `Retry-After`ヘッダーを尊重
215
+ - 大量リクエストに対する同時実行数の制限
216
+ - オプションのTTLキャッシュ (プラグイン可能。`StatsCache`インターフェースを通じて、独自のRedis/ファイルバックエンドを提供)
217
+
218
+ ## REST APIサーバー
219
+
220
+ マイクロサービスとして実行するか、独自のサーバーに組み込むことができます。
221
+
219
222
  ```bash
220
223
  registry-stats serve --port 3000
221
224
  ```
222
-
225
+
223
226
  ```
224
227
  GET /stats/:package # all registries
225
228
  GET /stats/:registry/:package # single registry
226
229
  GET /compare/:package?registries=npm,pypi
227
230
  GET /range/:registry/:package?start=YYYY-MM-DD&end=YYYY-MM-DD&format=json|csv|chart
228
231
  ```
229
-
230
- カスタムサーバーまたはサーバーレス環境でのプログラム的な利用方法。
231
-
232
+
233
+ カスタムサーバーまたはサーバーレス環境でのプログラム的な利用方法。
234
+
232
235
  ```typescript
233
236
  import { createHandler, serve } from '@mcptoolshop/registry-stats';
234
237
 
@@ -240,9 +243,9 @@ import { createServer } from 'node:http';
240
243
  const handler = createHandler();
241
244
  createServer(handler).listen(3000);
242
245
  ```
243
-
244
- ## カスタムレジストリ
245
-
246
+
247
+ ## カスタムレジストリ
248
+
246
249
  ```typescript
247
250
  import { registerProvider, type RegistryProvider } from '@mcptoolshop/registry-stats';
248
251
 
@@ -263,9 +266,9 @@ const cargo: RegistryProvider = {
263
266
  registerProvider(cargo);
264
267
  await stats('cargo', 'serde');
265
268
  ```
266
-
267
- ## リポジトリの構成
268
-
269
+
270
+ ## リポジトリの構成
271
+
269
272
  ```
270
273
  registry-stats/
271
274
  ├── src/ # TypeScript engine (published to npm)
@@ -273,9 +276,9 @@ registry-stats/
273
276
  ├── desktop/ # WinUI 3 desktop app (.NET 10 MAUI)
274
277
  └── test/ # Library tests (vitest)
275
278
  ```
276
-
277
- ## 開発
278
-
279
+
280
+ ## 開発
281
+
279
282
  ```bash
280
283
  # Engine
281
284
  npm install && npm run build && npm test
@@ -286,36 +289,36 @@ npm run site:dev
286
289
  # Dashboard (production build)
287
290
  npm run site:build
288
291
  ```
289
-
290
- ## セキュリティとデータ範囲
291
-
292
- | 側面 | 詳細 |
293
- |--------|--------|
294
- | **Data touched** | npm、PyPI、NuGet、Visual Studio Code Marketplace、Docker Hub から取得する公開ダウンロード統計。オプションで、メモリ内キャッシュを使用します。 |
295
- | **Data NOT touched** | テレメトリー、分析、認証情報の保存、ユーザーデータ、ファイル書き込みは一切行いません。 |
296
- | **Permissions** | 読み込み:HTTPS を使用した公開レジストリ API。書き込み:標準出力/標準エラー出力のみ。 |
297
- | **Network** | HTTPS を使用して公開レジストリ API にアクセスします。オプションで、ローカルの REST サーバーを使用します。 |
298
- | **Telemetry** | 収集または送信されるデータはありません。 |
299
-
300
- 脆弱性に関する報告については、[SECURITY.md](SECURITY.md) を参照してください。
301
-
302
- ## スコアカード
303
-
304
- | カテゴリ | スコア |
305
- |----------|-------|
306
- | A. セキュリティ | 10 |
307
- | B. エラー処理 | 10 |
308
- | C. 運用ドキュメント | 10 |
309
- | D. ソフトウェアの品質 | 10 |
310
- | E. 識別情報(重要度:低) | 10 |
311
- | **Overall** | **50/50** |
312
-
313
- 詳細な監査:[SHIP_GATE.md](SHIP_GATE.md) · [SCORECARD.md](SCORECARD.md)
314
-
315
- ## ライセンス
316
-
317
- MIT
318
-
292
+
293
+ ## セキュリティとデータ範囲
294
+
295
+ | 側面 | 詳細 |
296
+ |--------|--------|
297
+ | **Data touched** | npm、PyPI、NuGet、Visual Studio Code Marketplace、Docker Hub から取得する公開ダウンロード統計。オプションで、メモリ内キャッシュを使用します。 |
298
+ | **Data NOT touched** | テレメトリー、分析、認証情報の保存、ユーザーデータ、ファイル書き込みは一切行いません。 |
299
+ | **Permissions** | 読み込み:HTTPS を使用した公開レジストリ API。書き込み:標準出力/標準エラー出力のみ。 |
300
+ | **Network** | HTTPS を使用して公開レジストリ API にアクセスします。オプションで、ローカルの REST サーバーを使用します。 |
301
+ | **Telemetry** | 収集または送信されるデータはありません。 |
302
+
303
+ 脆弱性に関する報告については、[SECURITY.md](SECURITY.md) を参照してください。
304
+
305
+ ## スコアカード
306
+
307
+ | カテゴリ | スコア |
308
+ |----------|-------|
309
+ | A. セキュリティ | 10 |
310
+ | B. エラー処理 | 10 |
311
+ | C. 運用ドキュメント | 10 |
312
+ | D. ソフトウェアの品質 | 10 |
313
+ | E. 識別情報(重要度:低) | 10 |
314
+ | **Overall** | **50/50** |
315
+
316
+ 詳細な監査:[SHIP_GATE.md](SHIP_GATE.md) · [SCORECARD.md](SCORECARD.md)
317
+
318
+ ## ライセンス
319
+
320
+ MIT
321
+
319
322
  ---
320
-
321
- <a href="https://mcp-tool-shop.github.io/">MCP Tool Shop</a>によって作成されました。
323
+
324
+ <a href="https://mcp-tool-shop.github.io/">MCP Tool Shop</a>によって作成されました。
package/README.md CHANGED
@@ -39,8 +39,8 @@ Zero runtime dependencies. Uses native `fetch()`. Node 18+.
39
39
 
40
40
  | Layer | What it does |
41
41
  |-------|-------------|
42
- | **Engine** | TypeScript library + CLI + REST server. Query five registries with one interface. Published to npm as `@mcptoolshop/registry-stats`. |
43
- | **Dashboard** | Astro-powered web app with AI chat assistant, six interactive charts, live refresh, export reports (PDF / JSONL / Markdown), and tabbed Help guide. Rebuilt weekly by CI; refreshable on demand. |
42
+ | **Engine** | TypeScript library + CLI + REST server + AI inference. Query five registries with one interface. Published to npm as `@mcptoolshop/registry-stats`. |
43
+ | **Dashboard** | Astro-powered web app with AI inference panel, Pulse AI co-pilot (streaming voice, web search, fullscreen, GitHub data connectors), six interactive charts, live refresh, export reports (PDF / JSONL / Markdown), and tabbed Help guide. Rebuilt daily by CI; refreshable on demand. |
44
44
  | **Desktop** | WinUI 3 + WebView2 native Windows app. Bundles the dashboard offline, fetches live stats on demand. |
45
45
 
46
46
  ## Dashboard
@@ -48,20 +48,60 @@ Zero runtime dependencies. Uses native `fetch()`. Node 18+.
48
48
  A self-updating stats dashboard lives at [`/dashboard/`](https://mcp-tool-shop-org.github.io/registry-stats/dashboard/).
49
49
 
50
50
  - **Tabbed interface** — Home, Analytics, Leaderboard, and Help tabs
51
- - **AI chat assistant** — Ollama-powered Registry Assistant with RAG context, streaming responses, model selector, and conversation memory
51
+ - **Pulse AI co-pilot** — Ollama-powered conversational assistant with streaming voice synthesis (speaks as the LLM streams, 4 voices via [mcp-voice-soundboard](https://github.com/mcp-tool-shop-org/mcp-voice-soundboard)), web search (Wikipedia + optional SearXNG), auto-speak, fullscreen mode, GitHub org data connector, model selector, and conversation memory
52
52
  - **Executive snapshot** — health score (0–100), diversity index, weekly change, total downloads across all registries
53
53
  - **Six interactive charts** — 30-day trend (aggregate / per-registry / top-5 toggles), registry share (polar area), portfolio risk (histogram + Gini & P90), top-10 momentum, velocity tracker with sparklines, and 30-day heatmap with spike detection (>2σ)
54
54
  - **Smart growth engine** — handles small-denominator distortion with baseline threshold, percentage cap, and damped velocity formula
55
+ - **AI Inference Panel** — portfolio momentum (-100 to +100), risk score, 7-day forecast with confidence intervals, and automated recommendations (growth, risk, opportunity, attention)
55
56
  - **Actionable insights** — auto-generated recommendations and attention alerts for declining packages
56
57
  - **Pulse panel** — split view of Established Movers (≥ 50 downloads/wk) and Emerging & New packages, with inline 7-day sparklines, absolute + percentage deltas, baseline context, and a one-line executive summary
57
58
  - **Live refresh** — on-demand client-side fetch from npm and PyPI APIs with progress indicator; results cached in sessionStorage (5 min TTL) so tab switches are instant
58
59
  - **Export reports** — dropdown next to the Refresh button offering three formats: **Exec PDF** (via jsPDF), **LLM JSONL** (typed records for AI ingestion), and **Dev Markdown** (GFM tables)
59
60
  - **Leaderboard** — 132 packages ranked by weekly downloads with inline 30-day sparklines and smart trend badges
60
61
  - **Setup page** — portfolio editor with validation, registry-sync companion section, and pipeline overview
61
- - **Help tab** — human-friendly guide covering every tab, key concepts, AI assistant tips, data pipeline, and useful links
62
+ - **Leaderboard search** — instant text filter for finding packages by name or registry
63
+ - **Keyboard navigation** — arrow keys to cycle between tabs
64
+ - **Help tab** — human-friendly guide covering every tab, key concepts, AI inference engine, data pipeline, and useful links
62
65
  - **Dark / light theme** — follows system preference
66
+ - **Mobile responsive** — hamburger menu for small screens
63
67
 
64
- Data is fetched at build time and rebuilt weekly by CI (Mondays 06:00 UTC). Live refresh pulls the latest numbers directly from registry APIs. Configure tracked packages in `site/src/data/packages.json` (132 packages across 5 registries).
68
+ Data is fetched at build time and rebuilt daily by CI (06:00 UTC). Live refresh pulls the latest numbers directly from registry APIs. Configure tracked packages in `site/src/data/packages.json`.
69
+
70
+ ## AI Inference Engine
71
+
72
+ Zero-dependency, pure-math inference that runs at build time — no ML runtime, no external APIs.
73
+
74
+ ```typescript
75
+ import {
76
+ forecast, detectAnomalies, segmentTrends,
77
+ detectSeasonality, computeMomentum,
78
+ generateRecommendations, inferPortfolio,
79
+ } from '@mcptoolshop/registry-stats';
80
+
81
+ // 7-day forecast with 80% confidence intervals
82
+ const predictions = forecast(dailySeries, 7);
83
+ // → [{ day: 1, predicted: 142, lower: 98, upper: 186 }, ...]
84
+
85
+ // Anomaly detection (adaptive rolling z-score, 14-day window)
86
+ const anomalies = detectAnomalies(dailySeries);
87
+ // → [{ day: 20, value: 1500, expected: 120, zscore: 4.2, type: 'spike' }]
88
+
89
+ // Composite momentum score (-100 to +100)
90
+ const momentum = computeMomentum(dailySeries);
91
+
92
+ // Full portfolio analysis
93
+ const result = inferPortfolio(leaderboard, { gini: 0.6, npmPct: 85 });
94
+ // → { packages, forecastTotal7, riskScore, portfolioMomentum, recommendations }
95
+ ```
96
+
97
+ | Capability | Method | What it does |
98
+ |-----------|--------|-------------|
99
+ | **Forecast** | Weighted linear regression | Exponential recency bias, 80% CI that widens over time |
100
+ | **Anomaly detection** | Adaptive rolling z-score | 14-day baseline window, detects spikes and drops |
101
+ | **Trend segmentation** | Piecewise linear | Identifies up/down/flat segments in time series |
102
+ | **Seasonality** | Day-of-week decomposition | Detects weekly patterns, reports peak day |
103
+ | **Momentum** | Composite score | Direction + acceleration + consistency + volume |
104
+ | **Recommendations** | Rule engine | Growth, risk, opportunity, and attention categories |
65
105
 
66
106
  ## Desktop App
67
107
 
@@ -212,8 +252,10 @@ await stats('npm', 'express', { cache }); // cache hit
212
252
 
213
253
  - Automatic retry with exponential backoff on 429/5xx errors
214
254
  - Respects `Retry-After` headers
255
+ - 30-second request timeouts via `AbortSignal.timeout`
215
256
  - Concurrency limiting for bulk requests
216
257
  - Optional TTL cache (pluggable — bring your own Redis/file backend via `StatsCache` interface)
258
+ - SHA-pinned GitHub Actions for supply chain security
217
259
 
218
260
  ## REST API Server
219
261