An open API service indexing awesome lists of open source software.

https://github.com/cyberwo1f/trend-aggregator

ユーザー定義カテゴリのトレンドを Web 検索で収集し、Claude が要約・整理するローカル単一ユーザー向け Electron デスクトップアプリ
https://github.com/cyberwo1f/trend-aggregator

ai anthropic claude desktop-app electron react sqlite typescript vite

Last synced: 9 days ago
JSON representation

ユーザー定義カテゴリのトレンドを Web 検索で収集し、Claude が要約・整理するローカル単一ユーザー向け Electron デスクトップアプリ

Awesome Lists containing this project

README

          

# Trend Aggregator

[![CI](https://github.com/cyberwo1f/trend-aggregator/actions/workflows/ci.yml/badge.svg)](https://github.com/cyberwo1f/trend-aggregator/actions/workflows/ci.yml)

ユーザー定義のカテゴリごとに Web 上のトレンドを収集し、**AI(Claude)が記事を要約・整理**して一覧表示するローカル単一ユーザー向けデスクトップアプリです。お気に入り・後で見る・既読/未読の管理に対応し、再収集してもストックした記事は失われません。

> ステータス: 🚧 開発中(雛形・データモデル・リポジトリ層テスト・**収集/要約(Claude Agent SDK)の実装と実 API での実機検証**まで完了。認証の両対応化・API キーの安全保管・UX 改善が今後の予定)

---

## 主な機能

| 機能 | 説明 |
| --- | --- |
| 🏷 **ユーザー定義カテゴリ** | トレンドを追うカテゴリを自分で作成。各カテゴリに「調査目的」を設定でき、AI 要約・整理の方向付けに使う |
| ⭐ **お気に入り** | 残しておきたいアイテムを保持。再収集の影響を受けない |
| 🔖 **後で見る** | 未読のストック。再収集の影響を受けない |
| 👁 **既読 / 未読** | アイテムごとに閲覧状態を管理し、未読を見分けやすくする |
| 🔄 **再収集時のクリア挙動** | 再収集すると一覧リストはクリアされるが、**お気に入り・後で見るは保持**([詳細](./doc/data-model.md#再収集時のクリア挙動重要な仕様)) |
| 🤖 **AI 要約・整理** | 記事本文やカテゴリの目的に沿って、Claude が要約・重要度付け・整理を行う |

技術スタックは **Electron + React 19 + Vite + `node:sqlite` + Claude Agent SDK**。詳細と選定根拠は [doc/architecture.md](./doc/architecture.md)。

---

## クイックスタート

前提: **Node.js `20.19+` / `22.12+`**(Node 24 で動作確認済み)。

```bash
npm install # ネイティブビルドは不要(DB は node:sqlite)
cp .env.example .env # ANTHROPIC_API_KEY を設定(スタブの間は未設定でも起動可)
npm run dev # 開発起動
npm test # テスト(Vitest)
```

> カテゴリの作成・選択、フィルタ(すべて/未読/お気に入り/後で見る)、再収集、各アイテムの既読・お気に入り・後で見るトグルが動作します。収集・要約は Claude Agent SDK で実装済みですが、**実 API 呼び出しは `ANTHROPIC_API_KEY` を設定して実機検証が必要**です。

開発の詳細・スクリプト・**TDD ワークフロー**は [doc/development.md](./doc/development.md)。

---

## ドキュメント

| ドキュメント | 内容 |
| --- | --- |
| [doc/architecture.md](./doc/architecture.md) | 技術スタック・選定根拠(ADR 的)・アーキテクチャ図・レイヤ責務・収集/要約フロー・ディレクトリ構成 |
| [doc/data-model.md](./doc/data-model.md) | SQLite スキーマ・状態フラグ・再収集クリア挙動 |
| [doc/ai-auth.md](./doc/ai-auth.md) | AI 認証方針(API キー / サブスク)・コスト目安・鍵の保管 |
| [doc/development.md](./doc/development.md) | セットアップ・スクリプト・**TDD ワークフロー**・テスト方針・コーディング規約 |

> ⚠️ **開発方針**: 本プロジェクトは **TDD(テストファースト)** で開発します。変更は失敗するテストを先に書き、コミット前に `npm run typecheck` と `npm test` を green に保ってください([詳細](./doc/development.md#tdd-ワークフロー))。

---

## ロードマップ / 今後の検討事項

- [x] デスクトップシェルの決定 → **Electron** を採用(Tauri は軽量代替案)
- [x] AI 認証方式の決定 → **API キー(従量課金)を採用**
- [x] DB の決定 → **`node:sqlite`** を採用(better-sqlite3 は Electron 42 でビルド不可)
- [x] 雛形の初期化(electron-vite + React + node:sqlite + IPC + データモデル)— typecheck / build / DB 挙動を検証済み
- [x] リポジトリ層のユニットテスト(Vitest)— 再収集クリア保持 / 重複排除 / フィルタを回帰テスト化
- [x] **収集・要約の実装**:`electron/agent/` を Claude Agent SDK 化(プロンプト構築・JSON 解析は TDD でテスト済み、SDK 呼び出しは `client.ts` に隔離)
- [x] **収集・要約の実機検証**:実 API で収集→要約→JSON 解析を確認(5 件取得・所要 ~100 秒)。あわせて収集モデルの UI 切替(Haiku / Sonnet / Opus)・収集中の進捗表示・検索/ターン上限・全体タイムアウト(180 秒)を追加
- [ ] 🔔 **【2026-06-15 以降】認証の両対応化**:API キー + サブスクの Agent SDK クレジット(`CLAUDE_CODE_OAUTH_TOKEN` / `claude setup-token`)へ拡張
- [ ] API キーの安全な保管(Electron `safeStorage` / OS キーチェーン)
- [ ] 収集スケジューリング(手動更新のみ / 定期自動収集)
- [ ] 重複排除・差分更新の詳細仕様(下記「マーク済み記事を再取得しない」を含む)
- [ ] 要約のキャッシュとコスト最適化
- [ ] エクスポート(Markdown / JSON)
- [ ] **UI アイコンのデザイン**:ナビ・ボタン・タグなど UI 内で使うアイコン群を整備し、`DESIGN.md` のアイコン規約に沿って統一する

### 次の仕様変更(UX・収集モデルの見直し)

> ⚠️ 以下は**現行の仕様・不変条件を変更**する。実装時は TDD に従い、該当テスト(主に `electron/db/repository.test.ts`)と本 README「主な機能」表・[doc/data-model.md](./doc/data-model.md)・`CLAUDE.md` の不変条件を**先に新仕様へ更新**してから着手すること。

- [ ] **元記事はデフォルトブラウザで開く**:一覧の記事リンクを Electron ウィンドウ内ではなく OS のデフォルトブラウザで開く(`shell.openExternal` を IPC 経由で。現状は ``)。
- [ ] **「後で見る」をリスト廃止しフラグ化**:「後で見る」フィルタ(一覧表示)を廃止し、「再収集で消えないようにする」保護フラグとしてのみ残す。フィルタは「すべて / お気に入り」に縮小。
- [ ] **既読 / 未読機能の廃止**:`is_read` フラグと関連 UI・フィルタ・トグル・未読アクセントを削除する。
- [ ] **取得件数の最小・最大を設定可能に**:収集する記事件数の min / max をユーザー設定にし、収集プロンプト・件数制御へ反映する(※ Web 検索の性質上、min は「目標」であり件数保証ではない点に留意)。
- [ ] **マーク済み記事を再取得しない**:お気に入り・後で見るが付いた記事(URL)を、再収集時にフェッチ・要約の対象から除外する(既知 URL をエージェントに渡してスキップさせる)。現状は保存時の `INSERT OR IGNORE` による重複排除のみで、フェッチ自体は走っている。

---

## 注意事項

- 本アプリはローカル単一ユーザー利用を前提とします。
- API キーなどの認証情報は環境変数で管理し、コミット・ログ出力しないこと。
- 外部サイトの収集は各サイトの利用規約・robots.txt を尊重すること。