511 lines
14 KiB
Markdown
511 lines
14 KiB
Markdown
# ぽんるーむ (Pon-Room) - 共通仕様書 v1.0
|
||
|
||
**作成日**: 2026-01-03
|
||
**対象**: AI開発エージェント(Cursor/Antigravity/Claude/Gemini)
|
||
**目的**: すべての開発者・AIエージェントが参照する唯一のバイブル
|
||
|
||
---
|
||
|
||
## 📋 1. プロジェクト概要
|
||
|
||
### 1.1 アプリケーション情報
|
||
- **アプリ名**: ぽんるーむ (Pon-Room)
|
||
- **コンセプト**: 日本酒の「記録・解析・循環」を支えるAIプラットフォーム
|
||
- **バージョン**: 1.0.9+47
|
||
- **最終更新**: 2026-01-03
|
||
|
||
### 1.2 ターゲットユーザー
|
||
- **B2C (Consumer Mode)**: 一般ユーザー
|
||
- 日本酒体験の記録・診断・共有
|
||
- ゲーミフィケーション(ポイント・バッジ・レベル)
|
||
- 「酒向(しゅこう)カード」による自己表現
|
||
|
||
- **B2B (Business Mode)**: 飲食店
|
||
- 自店の日本酒メニュー作成(PDF出力)
|
||
- QRコード自動埋め込み
|
||
- インスタ投稿支援
|
||
|
||
### 1.3 アプリの循環ロジック
|
||
```
|
||
[飲食店] PDF + QRメニュー作成
|
||
↓
|
||
[客] スキャンして詳細表示・ポイント獲得
|
||
↓
|
||
[客] 自分の記録が貯まる → 酒向カード生成
|
||
↓
|
||
[飲食店] 客の好みを理解してレコメンド
|
||
```
|
||
|
||
---
|
||
|
||
## 🛠️ 2. 技術スタック
|
||
|
||
### 2.1 フロントエンド
|
||
- **Framework**: Flutter 3.10.1
|
||
- **SDK**: Dart 3.10.1
|
||
- **対応プラットフォーム**: iOS, Android, Web
|
||
|
||
### 2.2 バックエンド・データベース
|
||
- **Database**: Cloud Firestore (Firebase)
|
||
- **Authentication**: Firebase Auth
|
||
- **Storage**: Firebase Storage (画像保存)
|
||
|
||
### 2.3 AI・機械学習
|
||
- **Local OCR**: Google ML Kit
|
||
- 用途: ラベルからのテキスト抽出
|
||
- メリット: 無料、高速、オフライン動作
|
||
|
||
- **LLM Analysis**: Gemini API
|
||
- モデル: `gemini-2.5-flash` / `gemini-3.0-flash`
|
||
- 用途: テキストの構造化、キャッチコピー生成
|
||
- 重要: 画像を直接送らず、OCRテキストのみ送信(トークン節約)
|
||
|
||
### 2.4 主要パッケージ
|
||
```yaml
|
||
dependencies:
|
||
# 画像・カメラ
|
||
image_picker: ^1.2.1
|
||
gal: ^2.3.0 # カメラロール保存
|
||
|
||
# PDF生成
|
||
pdf: ^3.10.0
|
||
printing: ^5.11.0
|
||
|
||
# QRコード
|
||
qr_flutter: ^4.1.0
|
||
mobile_scanner: ^3.5.0 # QRスキャン
|
||
|
||
# データベース
|
||
hive: ^2.2.3
|
||
hive_flutter: ^1.1.0
|
||
|
||
# AI
|
||
google_generative_ai: ^0.4.7
|
||
google_ml_kit: ^0.16.0 # OCR用
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 3. 共通データ構造(JSON Schema)
|
||
|
||
### 3.1 基本方針
|
||
- **display_data**: カードUIで表示する最小限の情報(シンプル維持)
|
||
- **hidden_specs**: 詳細画面・PDF・分析で使用する情報
|
||
- **badges**: ゲーミフィケーション要素
|
||
- **gamification**: ポイント・レベル・診断結果
|
||
- **user_data**: ユーザーの主観的情報
|
||
- **metadata**: システム管理用
|
||
|
||
### 3.2 SakeItem完全JSON構造
|
||
|
||
```json
|
||
{
|
||
"display_data": {
|
||
"name": "獺祭 純米大吟醸 磨き二割三分",
|
||
"catch_phrase": "華やかな香りと洗練された味わい",
|
||
"image_path": "path/to/image.jpg",
|
||
"rating": 4.5
|
||
},
|
||
|
||
"hidden_specs": {
|
||
"brewery": "旭酒造株式会社",
|
||
"prefecture": "山口県",
|
||
"type": "純米大吟醸",
|
||
"alcohol_content": 16.0,
|
||
"polishing_ratio": 23,
|
||
"sake_meter_value": 4.0,
|
||
"rice_variety": "山田錦",
|
||
"yeast": "自社酵母",
|
||
"manufacturing_year_month": "2024.10",
|
||
"qr_code_url": "https://pon-room.app/sake/abc123"
|
||
},
|
||
|
||
"badges": {
|
||
"is_recommended": false,
|
||
"is_seasonal": false,
|
||
"season_tag": "春限定"
|
||
},
|
||
|
||
"gamification": {
|
||
"pon_points": 10,
|
||
"sake_mbti_type": "フルーティー・モダン型",
|
||
"rarity_level": "レア"
|
||
},
|
||
|
||
"user_data": {
|
||
"is_favorite": false,
|
||
"is_wishlist": false,
|
||
"tags": ["甘口", "フルーティー", "冷酒向き"],
|
||
"memo": "お祝い事にぴったり。冷やして飲むのがおすすめ。",
|
||
"drink_location": "○○レストラン",
|
||
"companion": "△△さん",
|
||
"purchase_location": "××酒販店",
|
||
"price": 5000
|
||
},
|
||
|
||
"metadata": {
|
||
"created_at": "2026-01-03T12:34:56Z",
|
||
"updated_at": "2026-01-03T12:34:56Z",
|
||
"app_type": "sake",
|
||
"app_mode": "consumer",
|
||
"version": "1.0",
|
||
"scanned_count": 0
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🎨 4. UI構成ルール
|
||
|
||
### 4.1 タブ構成(5タブ制)
|
||
|
||
| タブ | Consumer Mode (B2C) | Business Mode (B2B) |
|
||
|------|---------------------|---------------------|
|
||
| **タブ1** | 日本酒カードリスト(自分の記録) | 日本酒カードリスト(店舗在庫) |
|
||
| **タブ2** | QRスキャン・AR情報表示 | PDFメニュー作成・QR埋め込み |
|
||
| **タブ3** | AIソムリエ・酒向カード診断 | インスタ投稿支援(AI文章生成) |
|
||
| **タブ4** | 酒蔵マップ(聖地巡礼) | 店舗設定・在庫管理 |
|
||
| **タブ5** | マイページ(レベル・バッジ・設定) | アナリティクス(スキャン統計) |
|
||
|
||
### 4.2 カード表示ルール(重要)
|
||
|
||
**表示項目(display_dataのみ):**
|
||
- 銘柄名 (`display_data.name`)
|
||
- 画像 (`display_data.image_path`)
|
||
- 評価 (`display_data.rating`) - 星表示
|
||
- バッジ (`badges`) - 店長推奨・季節限定アイコン
|
||
|
||
**非表示項目(詳細画面でのみ使用):**
|
||
- `hidden_specs` の全項目
|
||
- `user_data` の詳細情報
|
||
|
||
**理由:** シンプルなUIを維持し、挫折を防ぐ
|
||
|
||
### 4.3 詳細画面の表示項目
|
||
|
||
**全て表示:**
|
||
- `display_data` 全項目
|
||
- `hidden_specs` 全項目(スペック表として)
|
||
- `badges` (アイコン付き)
|
||
- `user_data` 全項目
|
||
|
||
### 4.4 PDF出力の表示項目
|
||
|
||
**主要項目:**
|
||
- `display_data.name`, `image_path`
|
||
- `hidden_specs` の以下:
|
||
- type, alcohol_content, polishing_ratio
|
||
- sake_meter_value, brewery, prefecture
|
||
- `badges` (アイコン付き)
|
||
- QRコード(`hidden_specs.qr_code_url` から生成)
|
||
|
||
---
|
||
|
||
## 🤖 5. AI解析フロー(Hybrid Analysis)
|
||
|
||
### 5.1 撮影から保存まで
|
||
|
||
```
|
||
1. 撮影
|
||
├─ ImagePicker or Camera パッケージ
|
||
└─ カメラロール自動保存(gal パッケージ使用)★重要
|
||
|
||
2. OCR(テキスト抽出)
|
||
├─ Google ML Kit(ローカル・無料)
|
||
├─ 画像 → 全テキスト抽出
|
||
└─ 抽出テキストのみを次へ
|
||
|
||
3. AI解析(構造化)
|
||
├─ 抽出テキストを Gemini API へ送信
|
||
├─ プロンプト: 「JSONフォーマットで返して」
|
||
└─ 上記のJSON構造で回答を取得
|
||
|
||
4. 保存
|
||
├─ Hive(ローカル)に即座保存
|
||
└─ Firebase(クラウド)に同期(将来実装)
|
||
```
|
||
|
||
### 5.2 AI解析プロンプト例
|
||
|
||
```
|
||
あなたは日本酒のラベル解析の専門家です。
|
||
以下のOCRテキストから、日本酒の情報を抽出してJSON形式で回答してください。
|
||
|
||
【OCRテキスト】
|
||
{ocrText}
|
||
|
||
【出力ルール】
|
||
1. display_data: 銘柄名と魅力的なキャッチコピー(あなたが生成)
|
||
2. hidden_specs: 詳細スペック(読み取れた範囲で)
|
||
3. 読み取れない項目はnullにする
|
||
4. JSONのみを返す(```jsonなどのマークダウン記法は不要)
|
||
5. キャッチコピーは20文字以内で簡潔に
|
||
|
||
【出力フォーマット】
|
||
{JSON構造をここに記載}
|
||
```
|
||
|
||
### 5.3 コスト最適化のポイント
|
||
|
||
**❌ NG: 画像を直接Geminiに送信**
|
||
- 高トークン消費
|
||
- エラー発生率が高い
|
||
|
||
**✅ OK: OCRテキストのみ送信**
|
||
- トークン消費70-90%削減
|
||
- 安定した動作
|
||
- 後から再解析が不要
|
||
|
||
---
|
||
|
||
## 🎮 6. ゲーミフィケーション機能
|
||
|
||
### 6.1 ポンポイント(仮称)
|
||
|
||
**獲得条件:**
|
||
- 日本酒を記録: +5pt
|
||
- QRスキャン: +10pt
|
||
- 酒蔵訪問: +30pt(位置情報連動)
|
||
- 評価・レビュー投稿: +3pt
|
||
|
||
**レベルシステム:**
|
||
```
|
||
0-49pt: 利き酒初心者
|
||
50-149pt: 日本酒愛好家
|
||
150-299pt: 酒豪
|
||
300-499pt: 利き酒師
|
||
500pt+: 酒マスター
|
||
```
|
||
|
||
### 6.2 酒向(しゅこう)カード
|
||
|
||
**概要:** MBTIライクな自己診断カード
|
||
|
||
**診断軸(レーダーチャート):**
|
||
1. 甘口 ←→ 辛口
|
||
2. 濃醇 ←→ 淡麗
|
||
3. フルーティー ←→ 米の旨味
|
||
4. 冷酒 ←→ 熱燗
|
||
|
||
**表示項目:**
|
||
- 診断タイプ(例: フルーティー・モダン型)
|
||
- レーダーチャート
|
||
- 好きな銘柄TOP3
|
||
- AIの一言コメント
|
||
|
||
**用途:**
|
||
- 店員に見せて好みを伝える
|
||
- SNSシェア(画像として保存)
|
||
|
||
---
|
||
|
||
## 📱 7. QR循環ロジック
|
||
|
||
### 7.1 BtoB: PDFメニュー作成時
|
||
|
||
```
|
||
1. 飲食店が店舗在庫を登録
|
||
2. PDFメニュー生成時、各銘柄にQRコード埋め込み
|
||
3. QRコード内容: https://pon-room.app/sake/{sakeId}
|
||
4. 印刷して店内に設置
|
||
```
|
||
|
||
### 7.2 BtoC: QRスキャン時
|
||
|
||
```
|
||
1. 客がアプリでQRスキャン
|
||
2. 銘柄詳細をAR風に表示(オーバーレイ)
|
||
3. 「記録する」ボタンで自分のリストに追加
|
||
4. ポンポイント+10pt獲得
|
||
5. 酒蔵リンクへの誘導
|
||
```
|
||
|
||
### 7.3 循環の価値
|
||
|
||
- **客**: スキャンする度にポイントが貯まる
|
||
- **店**: 客の興味データが蓄積(アナリティクス)
|
||
- **蔵元**: ECサイトへの誘導で売上向上
|
||
|
||
---
|
||
|
||
## 🎓 8. オンボーディング(使い方ガイド)
|
||
|
||
### 8.1 初回起動時
|
||
|
||
**4ステップガイド:**
|
||
1. ようこそ!日本酒の記録を始めよう
|
||
2. カメラで撮影するだけでAIが自動解析
|
||
3. お気に入りを記録して自分だけのコレクションを
|
||
4. 飲食店の方はBusinessモードへ切り替え可能
|
||
|
||
### 8.2 再表示機能
|
||
|
||
- 各画面右上の「?」アイコン
|
||
- タップでガイドを再表示
|
||
|
||
### 8.3 Businessモード専用ガイド
|
||
|
||
**3ステップ(モード切り替え時のみ表示):**
|
||
1. 店舗情報を設定しましょう
|
||
2. メニューを作成してPDF出力
|
||
3. QRコードで客とつながる
|
||
|
||
---
|
||
|
||
## 🚀 9. 開発優先順位(Phase別)
|
||
|
||
### Phase 0: 基盤整備 ✅
|
||
- [x] CommonSpecification.md 作成
|
||
- [ ] SakeItemモデルの拡張
|
||
|
||
### Phase 1: 安心の確保(1-2時間)
|
||
- [ ] カメラロール保存実装(gal)
|
||
- [ ] iOS/Android権限設定
|
||
- [ ] 撮影後の自動保存フロー
|
||
|
||
### Phase 2: BtoB機能完成(4-6時間)
|
||
- [ ] PDF + printing 実装
|
||
- [ ] モックアップ厳密再現
|
||
- [ ] QRコード埋め込み
|
||
- [ ] レイアウト定数化
|
||
|
||
### Phase 3: AI最適化(3-4時間)
|
||
- [ ] Google ML Kit 導入
|
||
- [ ] OCRテキスト抽出
|
||
- [ ] Gemini APIへのテキスト送信切り替え
|
||
|
||
### Phase 4: ゲーミフィケーション(後回しOK)
|
||
- [ ] ポンポイントシステム
|
||
- [ ] 酒向カード生成
|
||
- [ ] QRスキャン機能
|
||
|
||
---
|
||
|
||
## 📐 10. レイアウト定数(PDF用)
|
||
|
||
```dart
|
||
class PDFLayoutConstants {
|
||
// 余白
|
||
static const double pageMargin = 24.0;
|
||
static const double sectionSpacing = 20.0;
|
||
static const double itemSpacing = 12.0;
|
||
|
||
// フォントサイズ
|
||
static const double titleFontSize = 24.0;
|
||
static const double headingFontSize = 14.0;
|
||
static const double bodyFontSize = 11.0;
|
||
static const double labelFontSize = 9.0;
|
||
|
||
// 線の太さ
|
||
static const double borderWidthThin = 0.5;
|
||
static const double borderWidthMedium = 1.0;
|
||
static const double borderWidthThick = 2.0;
|
||
|
||
// 色(posimaiカラー)
|
||
static final PdfColor borderColor = PdfColor.fromHex('#E2E8F0');
|
||
static final PdfColor labelColor = PdfColor.fromHex('#64748B');
|
||
static final PdfColor accentColor = PdfColor.fromHex('#376495');
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🔐 11. セキュリティ・プライバシー
|
||
|
||
### 11.1 データ保存場所
|
||
|
||
**✅ ローカル保存:**
|
||
- Hive DB: アプリ専用ディレクトリ
|
||
- 写真: カメラロール(ユーザー端末)
|
||
|
||
**✅ 外部送信(一時的、保存されない):**
|
||
- Gemini API: OCRテキストのみ(画像は送らない)
|
||
|
||
**❌ 外部送信なし:**
|
||
- 個人情報の無断クラウド保存
|
||
- サードパーティへのデータ販売
|
||
|
||
### 11.2 将来のFirebase連携
|
||
|
||
- ユーザーが明示的に「同期」を選択した場合のみ
|
||
- 画像はFirebase Storageへ
|
||
- テキストデータはFirestoreへ
|
||
|
||
---
|
||
|
||
## 🎯 12. 量産対応(ワイン・ビールアプリへの展開)
|
||
|
||
### 12.1 拡張方法
|
||
|
||
`metadata.app_type` を変更するだけで転用可能:
|
||
- `sake` → 日本酒
|
||
- `wine` → ワイン
|
||
- `beer` → クラフトビール
|
||
- `whisky` → ウイスキー
|
||
|
||
### 12.2 共通化できる機能
|
||
|
||
- 撮影・OCR・AI解析フロー
|
||
- ポイントシステム
|
||
- PDF出力・QR循環
|
||
- マイページ・設定
|
||
|
||
### 12.3 差分化が必要な箇所
|
||
|
||
- JSONの `hidden_specs` フィールド
|
||
- ワイン: ぶどう品種、産地、ヴィンテージ
|
||
- ビール: ホップ、モルト、IBU値
|
||
- キャッチコピーのトーン
|
||
|
||
---
|
||
|
||
## 📝 13. AIエージェントへの指示
|
||
|
||
### 13.1 開発時の鉄則
|
||
|
||
1. **この仕様書を最優先のルール(バイブル)として参照せよ**
|
||
2. **display_data と hidden_specs を明確に分離せよ**
|
||
3. **カードUIはシンプルに保ち、display_dataのみ使用せよ**
|
||
4. **挫折防止のため、段階的に実装せよ(Phase順守)**
|
||
5. **モックアップがある場合は1px単位で厳密再現せよ**
|
||
|
||
### 13.2 コード生成時の注意
|
||
|
||
- null安全性を徹底
|
||
- エラーハンドリングを統一
|
||
- デバッグログを適切に配置
|
||
- コメントは日本語で簡潔に
|
||
|
||
### 13.3 質問・提案時のルール
|
||
|
||
- 仕様書と矛盾する提案をする場合は理由を明記
|
||
- 新機能追加時はPhaseを提案
|
||
- データ構造変更時はJSON例を提示
|
||
|
||
---
|
||
|
||
## 📞 14. サポート・連絡先
|
||
|
||
**プロジェクトオーナー**: posimai
|
||
**開発支援AI**: Claude (Anthropic), Gemini (Google AI), ChatGPT (OpenAI)
|
||
**バージョン管理**: Git (GitHub)
|
||
**CI/CD**: Vercel (Web), Firebase Hosting
|
||
|
||
---
|
||
|
||
## 🎉 15. 最後に
|
||
|
||
この仕様書は「挫折しない日本酒アプリ開発」のために、複数のAIの知恵を結集して作成されました。
|
||
|
||
**重要な心構え:**
|
||
- シンプルから始める
|
||
- データは豊富に持つが、表示は最小限に
|
||
- ユーザーが「楽しい」と感じる体験を最優先に
|
||
|
||
**Let's build the best sake app together! 🍶✨**
|
||
|
||
---
|
||
|
||
**End of CommonSpecification.md v1.0**
|