# 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)` をリリース可能です。