add claude
This commit is contained in:
285
docs/AI_CONTEXT.md
Normal file
285
docs/AI_CONTEXT.md
Normal file
@@ -0,0 +1,285 @@
|
||||
# AI Context Document - ai.card プロジェクト
|
||||
|
||||
> **重要**: このドキュメントは、将来のAI開発者(Claude Code等)が迅速にプロジェクトを理解し、作業を継続できるよう設計されています。
|
||||
|
||||
## 🎯 プロジェクト概要
|
||||
|
||||
**ai.card** は、atprotoベースの分散型カードゲームです。ユーザーがデータを所有し、世界で一人だけが持てるuniqueカードが存在する革新的なシステムです。
|
||||
|
||||
### 中核思想
|
||||
- **存在子理論**: 世界の最小単位(ai)の探求がテーマ
|
||||
- **yui system**: 現実の個人とゲーム要素の1:1紐付け
|
||||
- **データ主権**: atproto PDSでユーザーがカードデータを所有
|
||||
- **現実の反映**: ゲームがプレイヤーの現実と連動
|
||||
|
||||
## 🏗️ システム構成
|
||||
|
||||
```
|
||||
[iOS App] ←→ [Web App] ←→ [FastAPI API] ←→ [PostgreSQL]
|
||||
↕
|
||||
[atproto PDS]
|
||||
↕
|
||||
[ai.verse(将来)]
|
||||
```
|
||||
|
||||
### 技術スタック(2025年6月1日現在)
|
||||
- **Backend**: Python 3.11 + FastAPI + PostgreSQL + Docker
|
||||
- **Frontend**: React 18 + TypeScript + Vite + Framer Motion
|
||||
- **Mobile**: SwiftUI + Combine + iOS 16.0+
|
||||
- **Identity**: atproto DID + JWT
|
||||
- **Infrastructure**: Docker Compose + Cloudflare Tunnel + Supabase
|
||||
|
||||
## 💎 uniqueカードシステム(最重要概念)
|
||||
|
||||
### 概念
|
||||
```
|
||||
通常のガチャ → キラカード(0.1%) → uniqueカード(0.0001%)
|
||||
↑表 ↑隠し機能
|
||||
ユーザーの目標 偶然の幸運
|
||||
```
|
||||
|
||||
### 実装
|
||||
- **確率**: 0.0001%(10万分の1)
|
||||
- **唯一性**: カードID 0-15の各種類につき、世界で1人のみ所有可能
|
||||
- **検証**: `unique_card_registry`テーブル + atproto PDS両方でチェック
|
||||
- **エフェクト**: 虹色オーラ + パーティクル + 特別UI
|
||||
|
||||
### データフロー
|
||||
```
|
||||
ガチャ実行 → レアリティ判定 → unique可能性チェック →
|
||||
atomic操作で確保 → DB保存 → atproto PDS同期 → アニメーション表示
|
||||
```
|
||||
|
||||
## 🔐 atproto統合
|
||||
|
||||
### 認証フロー
|
||||
```
|
||||
ユーザー: ハンドル + アプリパスワード
|
||||
↓
|
||||
atproto PDS認証
|
||||
↓
|
||||
JWT発行 → セッション管理
|
||||
↓
|
||||
API呼び出し認証
|
||||
```
|
||||
|
||||
### データ同期
|
||||
```
|
||||
カード取得 → DB保存 → atproto collection record作成
|
||||
↓
|
||||
レキシコン: ai.card.collection
|
||||
↓
|
||||
ユーザーPDSにデータ保存(ユーザーがデータ所有)
|
||||
```
|
||||
|
||||
## 📁 重要なファイル構造
|
||||
|
||||
### Backend(最重要)
|
||||
```
|
||||
api/app/
|
||||
├── models/card.py # カードデータ定義
|
||||
├── services/gacha.py # ガチャロジック(uniqueカード生成)
|
||||
├── services/atproto.py # atproto統合
|
||||
├── services/card_sync.py # PDS同期
|
||||
├── repositories/card.py # カードデータアクセス
|
||||
├── routes/auth.py # 認証API
|
||||
├── routes/cards.py # カードAPI
|
||||
└── db/models.py # データベースモデル
|
||||
```
|
||||
|
||||
### Frontend
|
||||
```
|
||||
web/src/
|
||||
├── components/Card.tsx # カード表示(エフェクト付き)
|
||||
├── components/GachaAnimation.tsx # ガチャ演出
|
||||
├── services/auth.ts # 認証管理
|
||||
└── services/api.ts # API通信
|
||||
|
||||
ios/AiCard/AiCard/
|
||||
├── Views/GachaView.swift # ガチャ画面
|
||||
├── Views/CardView.swift # カード表示
|
||||
├── Services/APIClient.swift # API通信
|
||||
└── Services/AuthManager.swift # 認証管理
|
||||
```
|
||||
|
||||
## 🎮 ゲーム仕様
|
||||
|
||||
### カードマスター(16種類)
|
||||
```json
|
||||
{
|
||||
"0": {"name": "アイ", "color": "fff700", "description": "世界の最小単位"},
|
||||
"1": {"name": "夢幻", "color": "b19cd9", "description": "意識が物質を作る"},
|
||||
...
|
||||
"15": {"name": "世界", "color": "54a0ff", "description": "存在と世界は同じもの"}
|
||||
}
|
||||
```
|
||||
|
||||
### レアリティ確率
|
||||
```
|
||||
Normal: 99.789% → グレー系
|
||||
Rare: 0.1% → ブルー系
|
||||
Super Rare: 0.01% → パープル系
|
||||
Kira: 0.1% → ゴールド系(スパークル)
|
||||
Unique: 0.0001% → マゼンタ系(オーラ)
|
||||
```
|
||||
|
||||
## 🚀 開発環境セットアップ
|
||||
|
||||
### 1. 基本起動
|
||||
```bash
|
||||
git clone [repository]
|
||||
cd ai.card
|
||||
|
||||
# Docker環境起動
|
||||
docker-compose up -d
|
||||
|
||||
# データベース初期化
|
||||
docker-compose exec api python init_db.py
|
||||
|
||||
# Web開発サーバー
|
||||
cd web && npm install && npm run dev
|
||||
|
||||
# iOS(Xcodeで開く)
|
||||
open ios/AiCard/AiCard.xcodeproj
|
||||
```
|
||||
|
||||
### 2. 環境変数設定(.env)
|
||||
```bash
|
||||
# PostgreSQL
|
||||
DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/aicard
|
||||
|
||||
# atproto(テスト用)
|
||||
ATPROTO_HANDLE=test.bsky.social
|
||||
ATPROTO_PASSWORD=your-app-password
|
||||
|
||||
# JWT
|
||||
SECRET_KEY=your-secret-key
|
||||
```
|
||||
|
||||
### 3. atprotoアカウント準備
|
||||
1. Blueskyアカウント作成
|
||||
2. アプリパスワード生成(https://bsky.app/settings/app-passwords)
|
||||
3. 環境変数に設定
|
||||
|
||||
## 🔧 よくある実装パターン
|
||||
|
||||
### 1. 新しいAPIエンドポイント追加
|
||||
```python
|
||||
# 1. routes/に新しいルート定義
|
||||
@router.post("/new-endpoint")
|
||||
async def new_endpoint(db: AsyncSession = Depends(get_db)):
|
||||
# ロジック
|
||||
|
||||
# 2. main.pyにルーター追加
|
||||
app.include_router(new_router, prefix=settings.api_v1_prefix)
|
||||
```
|
||||
|
||||
### 2. データベーステーブル追加
|
||||
```python
|
||||
# 1. db/models.pyに新しいモデル
|
||||
class NewModel(Base):
|
||||
__tablename__ = "new_table"
|
||||
# フィールド定義
|
||||
|
||||
# 2. Alembicマイグレーション
|
||||
alembic revision --autogenerate -m "add new table"
|
||||
alembic upgrade head
|
||||
```
|
||||
|
||||
### 3. atproto新機能追加
|
||||
```python
|
||||
# services/atproto.pyに新しいメソッド
|
||||
async def new_atproto_feature(self, did: str, data: dict):
|
||||
# atproto SDK使用
|
||||
return self.client.some_new_api(data)
|
||||
```
|
||||
|
||||
## 🎨 UI/UXパターン
|
||||
|
||||
### カードエフェクト実装
|
||||
```typescript
|
||||
// Web(React + Framer Motion)
|
||||
<motion.div
|
||||
className={`card ${getRarityClass()}`}
|
||||
animate={isRevealing ? { rotateY: 0 } : {}}
|
||||
transition={{ duration: 0.8 }}
|
||||
>
|
||||
```
|
||||
|
||||
```swift
|
||||
// iOS(SwiftUI)
|
||||
CardView(card: card)
|
||||
.rotation3DEffect(.degrees(isRevealing ? 0 : 180), axis: (0, 1, 0))
|
||||
.animation(.easeInOut(duration: 0.8), value: isRevealing)
|
||||
```
|
||||
|
||||
## ⚠️ 重要な注意点
|
||||
|
||||
### 1. uniqueカードの整合性
|
||||
- **必須**: atomic操作でのunique確保
|
||||
- **必須**: DB + atproto PDS両方での検証
|
||||
- **注意**: レース条件の回避
|
||||
|
||||
### 2. atproto連携
|
||||
- **メインパスワード禁止**: 必ずアプリパスワード使用
|
||||
- **セッション管理**: JWTトークンの適切な管理
|
||||
- **エラーハンドリング**: atproto PDS接続失敗時の処理
|
||||
|
||||
### 3. 確率システム
|
||||
- **透明性**: 確率は隠さず設定ファイルで管理
|
||||
- **公平性**: サーバーサイドでの確率計算必須
|
||||
- **監査**: ガチャ履歴の完全記録
|
||||
|
||||
## 🔮 将来の拡張ポイント
|
||||
|
||||
### Phase 1: 運用安定化
|
||||
- 統合テスト自動化
|
||||
- モニタリング・アラート
|
||||
- パフォーマンス最適化
|
||||
|
||||
### Phase 2: 機能拡張
|
||||
- カード交換システム
|
||||
- プッシュ通知
|
||||
- リアルタイム同期
|
||||
|
||||
### Phase 3: エコシステム統合
|
||||
- ai.gpt連携(AI人格とカード連動)
|
||||
- ai.verse連携(3Dゲーム世界でunique skill)
|
||||
- 分散SNS連携
|
||||
|
||||
## 📋 デバッグ・トラブルシューティング
|
||||
|
||||
### よくある問題
|
||||
1. **ガチャでカードが生成されない**
|
||||
→ `services/gacha.py`のエラーログ確認
|
||||
|
||||
2. **atproto認証失敗**
|
||||
→ アプリパスワードとハンドルの確認
|
||||
|
||||
3. **uniqueカード重複**
|
||||
→ `unique_card_registry`テーブルの整合性チェック
|
||||
|
||||
4. **データベース接続失敗**
|
||||
→ Docker Composeの起動状態確認
|
||||
|
||||
### ログ確認
|
||||
```bash
|
||||
# API ログ
|
||||
docker-compose logs -f api
|
||||
|
||||
# データベース状態
|
||||
docker-compose exec postgres psql -U postgres -d aicard -c "SELECT * FROM unique_card_registry;"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 推奨読み込み順序(AI向け)
|
||||
|
||||
1. **このドキュメント全体** - プロジェクト概要把握
|
||||
2. **CLAUDE.md** - 哲学・思想の理解
|
||||
3. **IMPLEMENTATION_SUMMARY.md** - 具体的実装詳細
|
||||
4. **API.md** - APIエンドポイント仕様
|
||||
5. **DATABASE.md** - データベース設計
|
||||
6. **ATPROTO.md** - atproto連携詳細
|
||||
|
||||
新しいAI開発者は、この順序で読むことで迅速にプロジェクトを理解し、作業を開始できます。
|
102
docs/API.md
Normal file
102
docs/API.md
Normal file
@@ -0,0 +1,102 @@
|
||||
# ai.card API Documentation
|
||||
|
||||
## Base URL
|
||||
```
|
||||
http://localhost:8000/api/v1
|
||||
```
|
||||
|
||||
## Endpoints
|
||||
|
||||
### Draw Card
|
||||
カードを抽選します。
|
||||
|
||||
```
|
||||
POST /cards/draw
|
||||
```
|
||||
|
||||
#### Request Body
|
||||
```json
|
||||
{
|
||||
"user_did": "did:plc:example123",
|
||||
"is_paid": false
|
||||
}
|
||||
```
|
||||
|
||||
#### Response
|
||||
```json
|
||||
{
|
||||
"card": {
|
||||
"id": 0,
|
||||
"cp": 88,
|
||||
"status": "normal",
|
||||
"skill": null,
|
||||
"owner_did": "did:plc:example123",
|
||||
"obtained_at": "2025-01-01T00:00:00",
|
||||
"is_unique": false,
|
||||
"unique_id": null
|
||||
},
|
||||
"is_new": true,
|
||||
"animation_type": "normal"
|
||||
}
|
||||
```
|
||||
|
||||
### Get User Cards
|
||||
ユーザーの所有カード一覧を取得します。
|
||||
|
||||
```
|
||||
GET /cards/user/{user_did}
|
||||
```
|
||||
|
||||
#### Response
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": 0,
|
||||
"cp": 88,
|
||||
"status": "normal",
|
||||
"skill": null,
|
||||
"owner_did": "did:plc:example123",
|
||||
"obtained_at": "2025-01-01T00:00:00",
|
||||
"is_unique": false,
|
||||
"unique_id": null
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
### Get Unique Cards
|
||||
全てのuniqueカード一覧を取得します。
|
||||
|
||||
```
|
||||
GET /cards/unique
|
||||
```
|
||||
|
||||
#### Response
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": 8,
|
||||
"cp": 500,
|
||||
"status": "unique",
|
||||
"skill": "skill_8_unique",
|
||||
"owner_did": "did:plc:example123",
|
||||
"obtained_at": "2025-01-01T00:00:00",
|
||||
"is_unique": true,
|
||||
"unique_id": "550e8400-e29b-41d4-a716-446655440000"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## Card Rarity
|
||||
|
||||
- `normal`: 通常カード (99.789%)
|
||||
- `rare`: レアカード (0.1%)
|
||||
- `super_rare`: スーパーレアカード (0.01%)
|
||||
- `kira`: キラカード (0.1%)
|
||||
- `unique`: ユニークカード (0.0001%)
|
||||
|
||||
## Animation Types
|
||||
|
||||
- `normal`: 通常演出
|
||||
- `rare`: レア演出
|
||||
- `kira`: キラカード演出
|
||||
- `unique`: ユニークカード演出(特別演出)
|
146
docs/ATPROTO.md
Normal file
146
docs/ATPROTO.md
Normal file
@@ -0,0 +1,146 @@
|
||||
# atproto連携ガイド
|
||||
|
||||
## 概要
|
||||
|
||||
ai.cardは、atproto(AT Protocol)と完全に統合されており、以下の機能を提供します:
|
||||
|
||||
1. **atproto認証**: DIDベースの分散型認証
|
||||
2. **データ主権**: カードデータをユーザーのPDSに保存
|
||||
3. **相互運用性**: 他のatproto対応アプリとの連携
|
||||
|
||||
## 認証フロー
|
||||
|
||||
### 1. ログイン
|
||||
|
||||
```javascript
|
||||
// フロントエンド
|
||||
const response = await authService.login(identifier, password);
|
||||
// identifier: ハンドル(user.bsky.social)またはDID
|
||||
// password: アプリパスワード(メインパスワードではない)
|
||||
```
|
||||
|
||||
### 2. アプリパスワードの作成
|
||||
|
||||
1. https://bsky.app/settings/app-passwords にアクセス
|
||||
2. 新しいアプリパスワードを作成
|
||||
3. ai.cardでそのパスワードを使用
|
||||
|
||||
### 3. セッション管理
|
||||
|
||||
- JWTトークンで24時間有効
|
||||
- Cookieとヘッダーの両方をサポート
|
||||
- 自動更新機能なし(再ログインが必要)
|
||||
|
||||
## データ保存
|
||||
|
||||
### カードコレクションのLexicon
|
||||
|
||||
```json
|
||||
{
|
||||
"lexicon": 1,
|
||||
"id": "ai.card.collection",
|
||||
"defs": {
|
||||
"main": {
|
||||
"type": "record",
|
||||
"record": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"cardId": { "type": "integer" },
|
||||
"cp": { "type": "integer" },
|
||||
"status": { "type": "string" },
|
||||
"skill": { "type": "string" },
|
||||
"obtainedAt": { "type": "string" },
|
||||
"isUnique": { "type": "boolean" },
|
||||
"uniqueId": { "type": "string" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### データ同期
|
||||
|
||||
```bash
|
||||
# カードをPDSに同期
|
||||
POST /api/v1/sync/cards
|
||||
{
|
||||
"atproto_session": "session-string-from-login"
|
||||
}
|
||||
|
||||
# PDSからインポート
|
||||
POST /api/v1/sync/import
|
||||
|
||||
# PDSにエクスポート
|
||||
POST /api/v1/sync/export
|
||||
```
|
||||
|
||||
## セキュリティ
|
||||
|
||||
### 1. 認証情報の取り扱い
|
||||
|
||||
- **メインパスワードは使用しない**: 必ずアプリパスワードを使用
|
||||
- **セッション文字列の保護**: atprotoセッションは暗号化して保存
|
||||
- **HTTPS必須**: 本番環境では必ずHTTPS経由で通信
|
||||
|
||||
### 2. データ検証
|
||||
|
||||
- サーバー側でカードデータの整合性をチェック
|
||||
- uniqueカードはグローバルレジストリで重複防止
|
||||
- PDSのデータも信頼せず、常に検証
|
||||
|
||||
### 3. 権限管理
|
||||
|
||||
現在の制限:
|
||||
- ユーザーはPDSのデータを自由に編集可能
|
||||
- OAuth 2.1 scope実装待ち
|
||||
|
||||
対策:
|
||||
- サーバー側検証で不正データを無効化
|
||||
- ゲームプレイ時は常にサーバーチェック
|
||||
|
||||
## APIエンドポイント
|
||||
|
||||
### 認証
|
||||
|
||||
```
|
||||
POST /api/v1/auth/login - ログイン
|
||||
POST /api/v1/auth/logout - ログアウト
|
||||
GET /api/v1/auth/verify - セッション確認
|
||||
POST /api/v1/auth/verify-did - DID検証(公開)
|
||||
```
|
||||
|
||||
### 同期
|
||||
|
||||
```
|
||||
POST /api/v1/sync/cards - 双方向同期
|
||||
POST /api/v1/sync/export - PDSへエクスポート
|
||||
POST /api/v1/sync/import - PDSからインポート
|
||||
GET /api/v1/sync/verify/:id - カード所有確認
|
||||
```
|
||||
|
||||
## トラブルシューティング
|
||||
|
||||
### ログインできない
|
||||
|
||||
1. アプリパスワードを使用しているか確認
|
||||
2. ハンドルまたはDIDが正しいか確認
|
||||
3. PDSが稼働しているか確認
|
||||
|
||||
### データが同期されない
|
||||
|
||||
1. atprotoセッションが有効か確認
|
||||
2. PDSの容量制限を確認
|
||||
3. ネットワーク接続を確認
|
||||
|
||||
### カードが表示されない
|
||||
|
||||
1. `/api/v1/sync/import`でPDSからインポート
|
||||
2. ブラウザキャッシュをクリア
|
||||
3. 再ログイン
|
||||
|
||||
## 今後の予定
|
||||
|
||||
1. **OAuth 2.1対応**: より細かい権限管理
|
||||
2. **リアルタイム同期**: WebSocketでの即時反映
|
||||
3. **他アプリ連携**: atprotoエコシステムとの統合
|
102
docs/DATABASE.md
Normal file
102
docs/DATABASE.md
Normal file
@@ -0,0 +1,102 @@
|
||||
# データベース設定ガイド
|
||||
|
||||
## ローカル開発(Docker Compose)
|
||||
|
||||
### 1. 起動
|
||||
```bash
|
||||
# データベースとAPIを起動
|
||||
docker-compose up -d
|
||||
|
||||
# ログを確認
|
||||
docker-compose logs -f
|
||||
```
|
||||
|
||||
### 2. データベース初期化
|
||||
```bash
|
||||
# APIコンテナに入る
|
||||
docker-compose exec api bash
|
||||
|
||||
# マイグレーション実行
|
||||
alembic upgrade head
|
||||
|
||||
# マスタデータ投入
|
||||
python init_db.py
|
||||
```
|
||||
|
||||
## Supabase連携
|
||||
|
||||
### 1. Supabaseプロジェクト作成
|
||||
1. [Supabase](https://supabase.com)でプロジェクト作成
|
||||
2. Settings > Database から接続情報を取得
|
||||
|
||||
### 2. 環境変数設定
|
||||
```bash
|
||||
# .env
|
||||
DATABASE_URL_SUPABASE=postgresql+asyncpg://postgres.[project-ref]:[password]@aws-0-[region].pooler.supabase.com:5432/postgres
|
||||
USE_SUPABASE=true
|
||||
```
|
||||
|
||||
### 3. テーブル作成
|
||||
Supabase SQL Editorで以下を実行:
|
||||
|
||||
```sql
|
||||
-- Alembicのマイグレーションを実行
|
||||
-- または直接SQLでテーブル作成
|
||||
```
|
||||
|
||||
## Cloudflare Tunnel設定
|
||||
|
||||
### 1. トンネル作成
|
||||
```bash
|
||||
# Cloudflareダッシュボードでトンネル作成
|
||||
# トークンを取得
|
||||
```
|
||||
|
||||
### 2. 環境変数設定
|
||||
```bash
|
||||
# .env
|
||||
CLOUDFLARE_TUNNEL_TOKEN=your-tunnel-token
|
||||
```
|
||||
|
||||
### 3. 起動
|
||||
```bash
|
||||
# tunnelプロファイルを含めて起動
|
||||
docker-compose --profile tunnel up -d
|
||||
```
|
||||
|
||||
## データベーススキーマ
|
||||
|
||||
### users
|
||||
- ユーザー情報(DID、ハンドル)
|
||||
|
||||
### card_master
|
||||
- カードマスタデータ(16種類)
|
||||
|
||||
### user_cards
|
||||
- ユーザー所有カード
|
||||
- uniqueカードフラグ付き
|
||||
|
||||
### unique_card_registry
|
||||
- グローバルuniqueカード登録
|
||||
- 各カードIDにつき1人のみ所有可能
|
||||
|
||||
### draw_history
|
||||
- ガチャ履歴
|
||||
|
||||
### gacha_pools
|
||||
- ピックアップガチャ設定
|
||||
|
||||
## バックアップ
|
||||
|
||||
### ローカル
|
||||
```bash
|
||||
# バックアップ
|
||||
docker-compose exec postgres pg_dump -U postgres aicard > backup.sql
|
||||
|
||||
# リストア
|
||||
docker-compose exec -T postgres psql -U postgres aicard < backup.sql
|
||||
```
|
||||
|
||||
### Supabase
|
||||
- 自動バックアップが有効
|
||||
- ダッシュボードからダウンロード可能
|
124
docs/DEVELOPMENT.md
Normal file
124
docs/DEVELOPMENT.md
Normal file
@@ -0,0 +1,124 @@
|
||||
# 開発ガイド
|
||||
|
||||
## セットアップ
|
||||
|
||||
### 1. API (FastAPI)
|
||||
|
||||
```bash
|
||||
cd api
|
||||
|
||||
# 仮想環境作成
|
||||
python -m venv venv
|
||||
source venv/bin/activate # macOS/Linux
|
||||
# or
|
||||
venv\Scripts\activate # Windows
|
||||
|
||||
# 依存関係インストール
|
||||
pip install -r requirements.txt
|
||||
|
||||
# 環境変数設定
|
||||
cp .env.example .env
|
||||
# .envを編集
|
||||
|
||||
# 開発サーバー起動
|
||||
uvicorn app.main:app --reload
|
||||
```
|
||||
|
||||
APIは http://localhost:8000 で起動します。
|
||||
APIドキュメントは http://localhost:8000/docs で確認できます。
|
||||
|
||||
### 2. Web (React + Vite)
|
||||
|
||||
```bash
|
||||
cd web
|
||||
|
||||
# 依存関係インストール
|
||||
npm install
|
||||
|
||||
# 開発サーバー起動
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Webアプリは http://localhost:3000 で起動します。
|
||||
|
||||
## プロジェクト構造
|
||||
|
||||
```
|
||||
ai.card/
|
||||
├── api/ # FastAPI backend
|
||||
│ ├── app/
|
||||
│ │ ├── core/ # 設定、共通処理
|
||||
│ │ ├── models/ # Pydanticモデル
|
||||
│ │ ├── routes/ # APIエンドポイント
|
||||
│ │ ├── services/ # ビジネスロジック
|
||||
│ │ └── main.py # アプリケーションエントリ
|
||||
│ └── requirements.txt
|
||||
│
|
||||
├── web/ # React frontend
|
||||
│ ├── src/
|
||||
│ │ ├── components/ # Reactコンポーネント
|
||||
│ │ ├── services/ # API通信
|
||||
│ │ ├── styles/ # CSS
|
||||
│ │ ├── types/ # TypeScript型定義
|
||||
│ │ └── App.tsx # メインコンポーネント
|
||||
│ └── package.json
|
||||
│
|
||||
├── ios/ # iOS app (今後実装)
|
||||
└── docs/ # ドキュメント
|
||||
```
|
||||
|
||||
## 技術スタック
|
||||
|
||||
### Backend
|
||||
- Python 3.9+
|
||||
- FastAPI
|
||||
- Pydantic
|
||||
- SQLAlchemy (今後実装)
|
||||
- atproto SDK
|
||||
|
||||
### Frontend
|
||||
- React 18
|
||||
- TypeScript
|
||||
- Vite
|
||||
- Framer Motion (アニメーション)
|
||||
- Axios
|
||||
|
||||
## 開発のポイント
|
||||
|
||||
### 1. カードデータ
|
||||
カードは0-15のIDを持ち、ai.jsonの定義に基づいています。
|
||||
|
||||
### 2. レアリティシステム
|
||||
- 通常のガチャではキラカードが最高レア
|
||||
- uniqueカードは隠し要素として実装
|
||||
- 確率は設定ファイルで調整可能
|
||||
|
||||
### 3. atproto連携
|
||||
- ユーザー認証はatproto OAuth(今後実装)
|
||||
- カードデータはユーザーのPDSに保存(今後実装)
|
||||
- 現在はローカルストレージのみ
|
||||
|
||||
### 4. アニメーション
|
||||
- ガチャ演出はレアリティに応じて変化
|
||||
- uniqueカードは特別な演出
|
||||
- Framer Motionで実装
|
||||
|
||||
## 今後の実装予定
|
||||
|
||||
1. **データベース連携**
|
||||
- SQLAlchemyでのモデル定義
|
||||
- ユーザーごとのカード管理
|
||||
|
||||
2. **atproto統合**
|
||||
- OAuth認証
|
||||
- PDSへのデータ保存
|
||||
- DID検証
|
||||
|
||||
3. **uniqueカード検証**
|
||||
- グローバルレジストリ
|
||||
- 重複チェック
|
||||
- ai.verse連携
|
||||
|
||||
4. **iOS app**
|
||||
- SwiftUIで実装
|
||||
- 共通APIを使用
|
267
docs/IMPLEMENTATION_SUMMARY.md
Normal file
267
docs/IMPLEMENTATION_SUMMARY.md
Normal file
@@ -0,0 +1,267 @@
|
||||
# ai.card 実装完了サマリー
|
||||
|
||||
## 作業日: 2025年6月1日
|
||||
|
||||
### 📋 今日実装した内容
|
||||
|
||||
## 1. データベース実装(PostgreSQL + Supabase)
|
||||
|
||||
### 完成機能
|
||||
- **PostgreSQLスキーマ設計**: 7つのテーブル(users, card_master, user_cards, unique_card_registry等)
|
||||
- **Docker Compose環境**: 開発・本番両対応
|
||||
- **Supabase連携**: 環境変数で切り替え可能
|
||||
- **リポジトリパターン**: BaseRepository + 専用Repository
|
||||
- **マイグレーション**: Alembic設定 + 初期データ投入
|
||||
- **データ同期**: ガチャ時の自動データベース保存
|
||||
|
||||
### 重要ファイル
|
||||
```
|
||||
api/app/db/models.py # SQLAlchemyモデル
|
||||
api/app/repositories/ # リポジトリパターン実装
|
||||
api/init_db.py # データベース初期化
|
||||
docker-compose.yml # 開発環境
|
||||
docker-compose.production.yml # 本番環境
|
||||
```
|
||||
|
||||
## 2. atproto連携機能
|
||||
|
||||
### 完成機能
|
||||
- **認証システム**: DID/ハンドルログイン + JWTトークン
|
||||
- **PDSデータ保存**: カードをユーザーのPDSに自動同期
|
||||
- **Lexicon定義**: `ai.card.collection` スキーマ
|
||||
- **同期API**: 双方向同期・インポート・エクスポート
|
||||
- **データ検証**: サーバー側整合性チェック
|
||||
|
||||
### 重要ファイル
|
||||
```
|
||||
api/app/services/atproto.py # atproto統合サービス
|
||||
api/app/services/card_sync.py # カード同期サービス
|
||||
api/app/routes/auth.py # 認証API
|
||||
api/app/routes/sync.py # 同期API
|
||||
api/app/auth/dependencies.py # 認証依存関係
|
||||
```
|
||||
|
||||
## 3. iOS App完全実装
|
||||
|
||||
### 完成機能
|
||||
- **SwiftUI + MVVM**: Combineを使ったリアクティブアーキテクチャ
|
||||
- **認証画面**: atprotoログイン(アプリパスワード対応)
|
||||
- **ガチャシステム**: 通常・プレミアムガチャ + リッチアニメーション
|
||||
- **カードコレクション**: グリッド表示・検索・フィルタ・詳細画面
|
||||
- **プロフィール**: ユーザー情報・統計・設定
|
||||
- **視覚エフェクト**: レアリティ別アニメーション・3Dフリップ
|
||||
|
||||
### 重要ファイル
|
||||
```
|
||||
ios/AiCard/AiCard/
|
||||
├── Models/Card.swift # カードデータモデル
|
||||
├── Services/APIClient.swift # API通信(Combine使用)
|
||||
├── Services/AuthManager.swift # 認証管理
|
||||
├── Services/CardManager.swift # カード管理
|
||||
├── Views/LoginView.swift # ログイン画面
|
||||
├── Views/GachaView.swift # ガチャ画面
|
||||
├── Views/CollectionView.swift # コレクション画面
|
||||
├── Views/CardView.swift # カード表示コンポーネント
|
||||
└── Views/GachaAnimationView.swift # ガチャアニメーション
|
||||
```
|
||||
|
||||
## 4. プロジェクト統合
|
||||
|
||||
### アーキテクチャ概要
|
||||
```
|
||||
[iOS App] ←→ [Web App] ←→ [FastAPI] ←→ [PostgreSQL]
|
||||
↕
|
||||
[atproto PDS]
|
||||
```
|
||||
|
||||
### データフロー
|
||||
1. **ガチャ**: iOS/Web → API → DB保存 → atproto PDS同期
|
||||
2. **認証**: atproto DID → JWT → セッション管理
|
||||
3. **同期**: DB ↔ atproto PDS双方向同期
|
||||
|
||||
## 📊 実装済み機能一覧
|
||||
|
||||
### ✅ Backend (FastAPI)
|
||||
- [x] PostgreSQL + Supabase対応
|
||||
- [x] atproto認証・同期
|
||||
- [x] ガチャシステム(確率・unique管理)
|
||||
- [x] カードCRUD API
|
||||
- [x] Docker環境(開発・本番)
|
||||
- [x] リポジトリパターン
|
||||
- [x] データベースマイグレーション
|
||||
|
||||
### ✅ Frontend (React)
|
||||
- [x] atproto認証UI
|
||||
- [x] ガチャアニメーション(Framer Motion)
|
||||
- [x] カード表示・コレクション
|
||||
- [x] レスポンシブデザイン
|
||||
- [x] TypeScript対応
|
||||
|
||||
### ✅ Mobile (iOS)
|
||||
- [x] SwiftUI + MVVM + Combine
|
||||
- [x] atproto認証
|
||||
- [x] ガチャ(通常・プレミアム)
|
||||
- [x] カードコレクション(検索・フィルタ)
|
||||
- [x] リッチアニメーション
|
||||
- [x] iOS 16.0+ 対応
|
||||
|
||||
### ✅ DevOps
|
||||
- [x] Docker Compose
|
||||
- [x] Cloudflare Tunnel対応
|
||||
- [x] 環境別設定
|
||||
- [x] ヘルスチェック
|
||||
|
||||
## 🔧 技術スタック
|
||||
|
||||
### Backend
|
||||
- **Language**: Python 3.11
|
||||
- **Framework**: FastAPI 0.104.1
|
||||
- **Database**: PostgreSQL + SQLAlchemy
|
||||
- **ORM**: SQLAlchemy 2.0 (async)
|
||||
- **Migration**: Alembic
|
||||
- **Cloud**: Supabase対応
|
||||
- **atproto**: atproto SDK 0.0.46
|
||||
|
||||
### Frontend (Web)
|
||||
- **Language**: TypeScript
|
||||
- **Framework**: React 18 + Vite
|
||||
- **Animation**: Framer Motion
|
||||
- **HTTP**: Axios
|
||||
- **Styling**: CSS Modules
|
||||
|
||||
### Mobile (iOS)
|
||||
- **Language**: Swift 5.7+
|
||||
- **Framework**: SwiftUI
|
||||
- **Architecture**: MVVM + Combine
|
||||
- **HTTP**: URLSession
|
||||
- **Minimum**: iOS 16.0
|
||||
|
||||
### Infrastructure
|
||||
- **Container**: Docker + Docker Compose
|
||||
- **Proxy**: Nginx
|
||||
- **Tunnel**: Cloudflare Tunnel
|
||||
- **Database**: PostgreSQL 16
|
||||
|
||||
## 🎯 unique カードシステムの実装
|
||||
|
||||
### 概念
|
||||
- **確率**: 0.0001%(10万分の1)
|
||||
- **唯一性**: 各カードID(0-15)につき世界で1人のみ所有可能
|
||||
- **検証**: サーバー側 + atproto PDS両方でチェック
|
||||
- **将来**: ai.verse unique skillとの連携予定
|
||||
|
||||
### 実装詳細
|
||||
- `unique_card_registry`テーブルでグローバル管理
|
||||
- ガチャ時にatomic操作で重複防止
|
||||
- atproto PDSにも同期保存
|
||||
- Web/iOSで特別なエフェクト表示
|
||||
|
||||
## 🚀 デプロイメント準備
|
||||
|
||||
### 開発環境起動
|
||||
```bash
|
||||
# 全体起動
|
||||
docker-compose up -d
|
||||
|
||||
# データベース初期化
|
||||
docker-compose exec api python init_db.py
|
||||
|
||||
# Web開発サーバー
|
||||
cd web && npm run dev
|
||||
|
||||
# iOS(Xcodeで開く)
|
||||
open ios/AiCard/AiCard.xcodeproj
|
||||
```
|
||||
|
||||
### 本番環境起動
|
||||
```bash
|
||||
# 本番設定で起動
|
||||
docker-compose -f docker-compose.production.yml up -d
|
||||
```
|
||||
|
||||
## 📝 重要な設定ファイル
|
||||
|
||||
### 環境変数(.env)
|
||||
```bash
|
||||
# Database
|
||||
DATABASE_URL=postgresql+asyncpg://postgres:postgres@localhost:5432/aicard
|
||||
DATABASE_URL_SUPABASE=postgresql+asyncpg://...
|
||||
USE_SUPABASE=false
|
||||
|
||||
# atproto
|
||||
ATPROTO_HANDLE=your.bsky.social
|
||||
ATPROTO_PASSWORD=your-app-password
|
||||
|
||||
# Security
|
||||
SECRET_KEY=your-secret-key
|
||||
|
||||
# Cloudflare Tunnel
|
||||
CLOUDFLARE_TUNNEL_TOKEN=your-tunnel-token
|
||||
```
|
||||
|
||||
### API設定
|
||||
- **開発**: `http://localhost:8000`
|
||||
- **本番**: `https://api.card.syui.ai`
|
||||
- **認証**: Bearer JWT token
|
||||
- **CORS**: Web/iOS対応
|
||||
|
||||
## 🔮 今後の実装候補
|
||||
|
||||
### Phase 1: 運用準備
|
||||
- [ ] 統合テスト(全システム連携)
|
||||
- [ ] パフォーマンス最適化
|
||||
- [ ] モニタリング・ログ
|
||||
- [ ] セキュリティ監査
|
||||
|
||||
### Phase 2: 機能拡張
|
||||
- [ ] カード交換システム
|
||||
- [ ] プッシュ通知(iOS)
|
||||
- [ ] リアルタイム同期(WebSocket)
|
||||
- [ ] バックアップ・復元
|
||||
|
||||
### Phase 3: エコシステム統合
|
||||
- [ ] ai.gpt連携
|
||||
- [ ] ai.verse unique skill連携
|
||||
- [ ] yui system実装
|
||||
- [ ] 分散SNS連携
|
||||
|
||||
## 🎮 ゲーム仕様
|
||||
|
||||
### カードシステム
|
||||
- **種類**: 16種類(ai, 夢幻, 光彩, 中性子, 太陽, 夜空, 雪, 雷, 超究, 剣, 破壊, 地球, 天の川, 創造, 超新星, 世界)
|
||||
- **CP**: 1-999(レアリティでボーナス)
|
||||
- **レアリティ**: 5段階(normal, rare, super_rare, kira, unique)
|
||||
|
||||
### ガチャ確率
|
||||
- **Normal**: 99.789%
|
||||
- **Rare**: 0.1%
|
||||
- **Super Rare**: 0.01%
|
||||
- **Kira**: 0.1%
|
||||
- **Unique**: 0.0001%(隠し機能)
|
||||
|
||||
### 演出
|
||||
- **Web**: CSS + Framer Motion
|
||||
- **iOS**: SwiftUI Animation + Particle Effects
|
||||
- **レアリティ別**: 色・エフェクト・音(予定)
|
||||
|
||||
---
|
||||
|
||||
## 💡 AI向けメモ
|
||||
|
||||
### プロジェクト理解のキーポイント
|
||||
1. **存在子理論**: 最小単位の意識がゲーム世界の根幹
|
||||
2. **yui system**: 現実の個人とゲーム内要素の1:1紐付け
|
||||
3. **データ主権**: atproto PDSでユーザーがデータを所有
|
||||
4. **uniqueカード**: NFT的だがブロックチェーン不使用
|
||||
|
||||
### 重要な実装パターン
|
||||
- **リポジトリパターン**: データアクセス層の抽象化
|
||||
- **atproto同期**: ガチャ時の自動PDS保存
|
||||
- **レアリティシステム**: 確率とエフェクトの連動
|
||||
- **認証フロー**: DID → JWT → セッション管理
|
||||
|
||||
### 次回作業時の注意点
|
||||
- 環境変数の設定確認
|
||||
- データベースの初期化
|
||||
- atprotoアカウントの準備
|
||||
- Docker環境の起動確認
|
Reference in New Issue
Block a user