スキル一覧に戻る

rustfeed-architecture

ereferen / rustfeed

0🍴 0📅 2026年1月15日

rustfeed プロジェクトのCargoワークスペース構成、クレート間の依存関係、データベーススキーマ、新機能追加時の配置ルールについて説明します。アーキテクチャに関する質問や新機能追加時に使用します。

read, grep, glob

SKILL.md

---
name: rustfeed-architecture
description: rustfeed プロジェクトのCargoワークスペース構成、クレート間の依存関係、データベーススキーマ、新機能追加時の配置ルールについて説明します。アーキテクチャに関する質問や新機能追加時に使用します。
allowed-tools: Read, Grep, Glob
user-invocable: false
---

# Rustfeed アーキテクチャガイド

このスキルは rustfeed プロジェクトのアーキテクチャと構造について説明します。

## Cargoワークスペース構成

```
rustfeed/
├── Cargo.toml              # ワークスペース定義
├── rustfeed-core/          # 共有ライブラリ
│   └── src/
│       ├── lib.rs
│       ├── models/         # データモデル (Feed, Article)
│       ├── db/             # データベース操作
│       ├── feed/           # フィード取得・パース
│       └── config/         # 設定管理
├── rustfeed-cli/           # CLIバイナリ
│   └── src/
│       ├── main.rs
│       └── commands/       # CLIコマンド実装
└── rustfeed-tui/           # TUIバイナリ
    └── src/
        ├── main.rs
        ├── app.rs          # アプリケーション状態
        ├── ui.rs           # UI描画
        └── event.rs        # イベント処理
```

## クレート間の依存関係

```
rustfeed-cli ──────┐
                   ├──► rustfeed-core
rustfeed-tui ──────┘
```

**重要な原則**:
- `rustfeed-core` は他のクレートに依存しない
- `rustfeed-cli` と `rustfeed-tui` は `rustfeed-core` に依存
- CLI/TUI 間で直接の依存関係は持たない

## 新機能追加時の配置ルール

| 機能の種類 | 配置先 |
|-----------|--------|
| データモデル | `rustfeed-core/src/models/` |
| データベース操作 | `rustfeed-core/src/db/` |
| フィード処理 | `rustfeed-core/src/feed/` |
| 設定関連 | `rustfeed-core/src/config/` |
| CLIコマンド | `rustfeed-cli/src/commands/` |
| TUI画面/コンポーネント | `rustfeed-tui/src/` |

### 判断基準

- **両方のUIで使う** → `rustfeed-core`
- **CLIのみで使う** → `rustfeed-cli`
- **TUIのみで使う** → `rustfeed-tui`

## データベーススキーマ

**feeds table**:
- `id`: INTEGER PRIMARY KEY
- `url`: TEXT NOT NULL UNIQUE
- `title`: TEXT
- `description`: TEXT
- `created_at`: TEXT NOT NULL
- `updated_at`: TEXT NOT NULL

**articles table**:
- `id`: INTEGER PRIMARY KEY
- `feed_id`: INTEGER NOT NULL (FOREIGN KEY)
- `title`: TEXT NOT NULL
- `url`: TEXT NOT NULL UNIQUE
- `content`: TEXT
- `published_at`: TEXT
- `is_read`: INTEGER NOT NULL DEFAULT 0
- `is_favorite`: INTEGER NOT NULL DEFAULT 0
- `created_at`: TEXT NOT NULL

### スキーマ変更時のルール

1. `rustfeed-core/src/db/mod.rs` の `init_db()` を更新
2. 既存データとの互換性を考慮
3. マイグレーションが必要な場合は別途検討
4. スキーマ変更後は `CLAUDE.md` のスキーマセクションも更新

## 依存関係管理

### 追加前の確認事項

- 必要最小限の依存に留める
- 既存の依存で代替できないか検討
- ライセンスの確認(MIT/Apache-2.0推奨)
- メンテナンス状況の確認

### features指定の方針

```toml
# 良い例:必要な機能のみ
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }

# 悪い例:不要な機能も含む
tokio = { version = "1", features = ["full"] }
```

### クレート別の依存追加方針

- **rustfeed-core**: 依存追加は慎重に(CLI/TUI両方に影響)
- **rustfeed-cli**: CLI固有の依存のみ
- **rustfeed-tui**: TUI固有の依存(ratatui等)

## 主要な依存クレート

| クレート | 用途 | 配置 |
|---------|------|------|
| `tokio` | 非同期ランタイム | core |
| `anyhow` | エラーハンドリング | core |
| `rusqlite` | SQLiteデータベース | core |
| `feed-rs` | RSS/Atomパース | core |
| `reqwest` | HTTP通信 | core |
| `chrono` | 日時処理 | core |
| `clap` | CLIパーサー | cli |
| `ratatui` | TUIフレームワーク | tui |
| `colored` | ターミナル出力色付け | cli |

## 非同期処理の方針

- I/O操作(ネットワーク、ファイル)は非同期
- データベース操作は同期(rusqliteの制約)
- `tokio::spawn` でバックグラウンド処理
- `async` 関数は `_async` サフィックスを付けない

## ファイル検索のヒント

新機能実装時に参考にすべきファイル:

```bash
# データモデルの確認
rustfeed-core/src/models/

# データベース操作の参考
rustfeed-core/src/db/mod.rs

# 既存CLIコマンドの参考
rustfeed-cli/src/commands/

# フィード処理の実装
rustfeed-core/src/feed/
```