ponshu-room-lite/docs/architecture/archive/technical_spec_incense_v1.md

136 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Positionai Platform & Incense App (v1.0) 技術仕様書
本ドキュメントは、日本酒アプリ (`Sake App`) の成功を基に、共通基盤 (`Posimai Core`) を構築し、第二弾としてお香アプリ (`Incense App`) を開発するための技術仕様書です。
## 1. ディレクトリ構成戦略: "Posimai Core"
モノレポ構成を採用し、共通コードと各アプリ固有のコードを明確に分離します。
```text
lib/
├── core/ # [共通] 全アプリで共有する基盤コード
│ ├── services/
│ │ ├── gemini_service.dart # AI解析 (プロンプトを引数化)
│ │ ├── camera_service.dart # カメラ・ギャラリー操作
│ │ ├── database_helper.dart # Hive Box管理の抽象基盤
│ │ └── gamification_core.dart # バッジ・レベル計算の抽象クラス
│ ├── models/
│ │ └── base_item.dart # ID, ImagePath, CreatedAtなどを定義
│ └── widgets/
│ └── attribute_radar_chart.dart # 汎用レーダーチャート (ラベル可変)
├── features/ # [共通] 特定機能のウィジェット群
│ ├── settings/ # アプリ設定、バックアップ画面
│ └── onboarding/ # 初回起動画面
└── apps/ # [固有] 各アプリの実装
├── sake/ # 日本酒アプリ
│ ├── main_sake.dart # エントリーポイント
│ ├── models/ # SakeItem, TasteStats
│ └── screens/ # Home, Detail (Sake ver)
└── incense/ # お香アプリ (New!)
├── main_incense.dart
├── models/ # IncenseItem, ScentStats
└── screens/ # Home (Zen Mode対応), Detail
```
---
## 2. データモデル定義 (Incense App)
日本酒アプリの `SakeItem` に相当する、お香アプリ専用のモデル定義です。
### 2.1 `IncenseItem`
`core/models/base_item.dart` を継承します。
```dart
@HiveType(typeId: 20) // TypeIDは日本酒(0-10)と被らないように付与
class IncenseItem extends HiveObject {
@HiveField(0)
final String id; // UUID
@HiveField(1)
final IncenseDisplayData displayData;
@HiveField(2)
final IncenseSpecs specs; // 香りの詳細データ
@HiveField(3)
final IncenseMetadata metadata;
}
```
### 2.2 `ScentStats` (香りのパラメータ)
五味甘辛酸苦鹹は難解なため、現代的な5軸を採用します。
```dart
@HiveType(typeId: 22)
class ScentStats {
@HiveField(0) final int sweet; // 甘さ (Fruity/Sweet)
@HiveField(1) final int spicy; // スパイシー (Clove/Cinnamon)
@HiveField(2) final int fresh; // 爽やかさ (Pine/Mint)
@HiveField(3) final int calm; // 落ち着き (Woody/Earthy)
@HiveField(4) final int traditional; // 伝統感 (Sandalwood/Aloeswood)
// 0-5 で評価
const ScentStats({this.sweet = 3, ...});
}
```
---
## 3. AI解析プロンプト (Incense Prompt)
`GeminiService` に渡すお香専用プロンプトです。
```text
あなたは「香司(こうし)」と呼ばれるお香の専門家です。
添付の「お香のパッケージ画像」とOCRテキストを分析し、以下の情報をJSON形式で抽出してください。
【出力要件】
1. name: 商品名(例: "春の夜", "堀川"
2. brand: メーカー・ブランド名(例: "松栄堂", "日本香堂"
3. scentType: 香りの系統を一言で(例: "白檀ベース", "フローラル系"
4. description: 香りのイメージや焚くのに適した情景を100文字以内で魅力的に説明してください。
5. stats: 5段階評価 (1-5)
- sweet (甘さ)
- spicy (スパイシーさ)
- fresh (爽やか・清涼感)
- calm (ウッディ・落ち着き)
- traditional (古典的・和風)
【注意点】
OCRテキストに誤りがある場合は、画像情報を正として補正してください。
情報がパッケージに記載されていない場合は、パッケージの色やデザイン、商品名から香りの傾向を推測してください。
```
---
## 4. ゲーミフィケーション実装 ("Quiet Achiever")
お香アプリの特性に合わせ、2つのモードを実装します。
### モード定義 (`UserPreference`)
* `GameMode.collector`: 従来通り。数値・バッジ・レベルを表示。
* `GameMode.zen`: **静寂モード**
### Zen Mode の挙動仕様
| 項目 | Collector Mode | Zen Mode |
| :--- | :--- | :--- |
| **ホーム画面** | 現在のレベル、次のレベルまでのEXPバーを表示 | 香炉と煙のアニメーションのみ表示(バーは非表示) |
| **登録完了時** | "EXP +10! Level Up!" の派手なスナックバー | "香りの記憶を留めました。" と質素な通知のみ |
| **レベルアップ** | ファンファーレ音 + ダイアログ | アニメーションの煙が少し高くなる / 花が一輪増える (環境変化) |
| **バッジ** | バッジ一覧画面でコレクションを確認 | (機能自体を非表示、または「足跡」としてテキストのみ表示) |
---
## 5. 開発ロードマップ (最短経路)
1. **Core Refactoring**: `lib/core` フォルダを作成し、`GeminiService` を移動・汎用化(プロンプトを引数化)。
2. **Flavor Setup**: `main_sake.dart``main_incense.dart` を作成し、起動設定を分離。
3. **Model Impl**: `IncenseItem``ScentStats` を実装。
4. **UI Clone & Adapt**: 日本酒アプリのHome画面をコピーし、お香用に「パラメータ名」と「Zen Modeスイッチ」を変更。
このプランにより、既存の安定したコードベースを破壊することなく、最短で `Incense App (v1.0)` をリリース可能です。