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

5.9 KiB
Raw Blame History

Positionai Platform & Incense App (v1.0) 技術仕様書

本ドキュメントは、日本酒アプリ (Sake App) の成功を基に、共通基盤 (Posimai Core) を構築し、第二弾としてお香アプリ (Incense App) を開発するための技術仕様書です。

1. ディレクトリ構成戦略: "Posimai Core"

モノレポ構成を採用し、共通コードと各アプリ固有のコードを明確に分離します。

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 を継承します。

@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軸を採用します。

@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 に渡すお香専用プロンプトです。

あなたは「香司(こうし)」と呼ばれるお香の専門家です。
添付の「お香のパッケージ画像」と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.dartmain_incense.dart を作成し、起動設定を分離。
  3. Model Impl: IncenseItemScentStats を実装。
  4. UI Clone & Adapt: 日本酒アプリのHome画面をコピーし、お香用に「パラメータ名」と「Zen Modeスイッチ」を変更。

このプランにより、既存の安定したコードベースを破壊することなく、最短で Incense App (v1.0) をリリース可能です。