Commit Graph

95 Commits

Author SHA1 Message Date
Ponshu Developer 7a20f161dd fix: replace WebClient with curl.exe for APK upload (5min timeout)
WebClient.UploadData() has no configurable timeout and was silently
timing out on 89MB uploads over Tailscale. curl.exe (built-in on
Windows 10+) is used instead with --max-time 300 (5 minutes).

Made-with: Cursor
2026-04-12 10:08:19 +09:00
Ponshu Developer 2890b6cb6f refactor: replace disk cache with in-memory session cache (v1.0.33)
Analysis cache redesign:
- Remove Hive persistence from AnalysisCacheService entirely
- Use Map<String, SakeAnalysisResult> in-memory instead of Hive boxes
- Cache now lives only for the duration of an app session; restart always
  produces a fresh analysis — no stale misidentifications can persist
- Remove Hive init(), TTL/cleanupExpired(), getCachedByBrand() dead code
- API surface unchanged: callers (gemini_service, dev_menu) need no edits
- main.dart: delete legacy Hive boxes (analysis_cache_v1, brand_index_v1)
  from disk on startup for existing users
- dev_menu_screen: update cache description text to reflect new behavior

Rationale:
- Camera captures always produce unique files -> cache hit rate was ~0%
- Each user supplies their own Gemini API key -> no shared cost benefit
- Persistent wrong results (e.g. misrecognized brand names) could survive
  up to 30 days under the old design
- Different sake editions photographed separately have different hashes
  and were never affected by the cache in the first place

Made-with: Cursor
2026-04-12 08:13:18 +09:00
Ponshu Developer 3d934deb56 fix: address remaining code audit findings and bump to v1.0.32
- migration_service: runMigration() now returns bool; main.dart only
  advances migration_version when migration succeeds
- sakenowa_service: add 30s timeout to all 6 http.get calls
- gemini_service: add 60s timeout to Direct API generateContent call
- gemini_service: guard response.body error log with kDebugMode
- Remove emoji from debugPrint in core service/screen files
  (gemini_service, analysis_cache_service, network_service,
   draft_service, camera_screen)

Made-with: Cursor
2026-04-12 07:25:24 +09:00
Ponshu Developer cb71ab91de fix: handle Vercel CLI stderr as ErrorRecord in release script
- Set ErrorActionPreference to Continue before vercel commands to prevent
  PowerShell from treating Vercel CLI stderr output (version banner) as
  a terminating error and jumping to the catch block prematurely
- Strip ANSI cursor-movement escape codes from output before regex matching
  the Production URL (--no-color does not remove cursor movement sequences)
- Convert all 2>&1 output to strings via .ToString() before processing

Made-with: Cursor
2026-04-12 00:39:35 +09:00
Ponshu Developer c8ffe2626f refactor: apply critical code review fixes
- draft_service: GeminiService is now passed as a required parameter
  to analyzeDraft/analyzeAllDrafts instead of being directly instantiated,
  ensuring consistent Riverpod-managed injection
- gemini_provider: correct misleading comment (rate limiting is due to
  static field, not Provider; Provider enables future safe refactoring)
- analysis_cache_service: cleanupExpired now also removes orphaned brand
  index entries from _brandIndexBox after deleting expired _box entries
- analysis_cache_service: keysToDelete type corrected from List<dynamic>
  to List<String>, removing unnecessary as String cast
- analysis_cache_service: _normalizeBrandName comment clarified to note
  that .toLowerCase() only affects ASCII characters, not Japanese text
- camera_screen: add explicit ignore comment with rationale for
  showDialog after async gap (mounted check immediately precedes it)
- camera_screen: remove leaked Cursor instruction comment from line 96

Made-with: Cursor
2026-04-12 00:24:57 +09:00
Ponshu Developer 94f7ee20ea refactor: code quality improvements based on critical review
Made-with: Cursor
2026-04-12 00:09:09 +09:00
Ponshu Developer 2074f85da8 fix: show correct file size (decimal) on download page
Made-with: Cursor
2026-04-11 22:39:11 +09:00
Ponshu Developer d688dfa5bd chore: bump version to 1.0.30+37
Made-with: Cursor
2026-04-11 15:47:00 +09:00
Ponshu Developer cd57171670 fix: strengthen AI label recognition prompt and repo cleanup
Made-with: Cursor
2026-04-11 15:46:44 +09:00
Ponshu Developer 4096c67356 chore: update download page and add build script for v1.0.29
Made-with: Cursor
2026-04-11 15:13:04 +09:00
Ponshu Developer cccea8dd7a chore: bump version to 1.0.29+36
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 12:19:11 +09:00
Ponshu Developer f8ceb0bf02 fix: ソムリエ画面UIを統一 — カードスタイル・padding・重複ヘッダー削除
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 12:11:21 +09:00
Ponshu Developer ba5660c1cb fix: release_to_gitea.ps1にAPKバージョン一致チェックを追加
pubspec.yamlのversionとAPKの埋め込みversionNameが異なる場合は
エラーで中断する。「バージョン上げ前ビルド→リリース」ミスを防ぐ。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 09:45:16 +09:00
Ponshu Developer 402c6b6448 chore: update download page to v1.0.28
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 09:19:31 +09:00
Ponshu Developer 675e67e3c1 refactor: デッドコード削除 — analyzeSakeHybrid/analyzeSakeText
- gemini_service.dart: 未使用の analyzeSakeHybrid / analyzeSakeText を削除
  (どこからも呼ばれておらず、画像直接解析 analyzeSakeLabel のみ使用中)
- main.dart: isProVersion を「現在未使用」コメントに更新
- version: 1.0.28+35

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 09:19:03 +09:00
Ponshu Developer c7168e831c chore: update download page to v1.0.27
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 08:58:42 +09:00
Ponshu Developer d23ee8ed77 fix: AI解析プロンプトの銘柄名補完バグを修正
- 銘柄名(name)と蔵元名(brand)はラベルの文字をそのまま使うよう明示
  「東魁」→「東魁盛」のような知識補完を禁止する指示を追加
- 全3プロンプト(画像解析・ハイブリッド・テキストのみ)に適用
- version: 1.0.27+34

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 08:58:02 +09:00
Ponshu Developer f3d6a92799 chore: v1.0.26 リリース完了 — APKアップロード・ダウンロードページ更新
- releases.json: v1.0.26 のダウンロードURLに更新
- release_to_gitea.ps1: consumer命名に統一 (lite/pro分割廃止)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 08:23:10 +09:00
Ponshu Developer f229ff6b4b fix: 外部コードレビュー指摘の修正4件
device_service.dart:
- iOS device_idをSharedPreferencesにUUID永続化(identifierForVendor廃止)
  → 全ベンダーアプリ削除後の再インストール後もライセンスが継続する
- fallback device_idもSharedPreferencesに永続化
  → アプリ再起動のたびにIDが変わるバグを修正

license_service.dart:
- revokedキャッシュが24h後にfreeに降格するバグを修正
  → proとrevokedはキャッシュ有効期限の対象外にする

sake_mbti_stamp_section.dart / sake_detail_screen.dart:
- isProVersion(コンパイル時) → isProProvider(実行時ライセンス)に移行
  → ライセンス購入後にアプリ再起動なしでMBTIスタンプが有効になる

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 08:14:37 +09:00
Ponshu Developer 7b3249791e fix: セルフコードレビュー修正 — ライセンス管理バグ4件
- license_service.dart: オフライン時にProキャッシュを上書きしないよう修正
  (offline statusを受け取ったらキャッシュフォールバックを使う)
- license_service.dart: activate()でoffline状態を明示的にハンドル
  (「キーが見つかりません」ではなく「接続できません」と表示)
- license_service.dart: ライセンスキーのバイト数コメントを修正 (16→6バイト)
- license_screen.dart: Pro画面の誤ったテキスト修正
  (「AI解析無制限」→「すべてのPro機能」)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 06:42:35 +09:00
Ponshu Developer 659e81628a chore: v1.0.26 — Pro版ライセンス管理リリース
- pubspec.yaml: 1.0.21+32 -> 1.0.26+33
- home_screen.dart: 不正な ';' を削除(構文エラー修正)
- releases.json: v1.0.26 に更新

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 00:23:36 +09:00
Ponshu Developer 5311241fe5 feat: ライセンス検証をVPSエンドポイントへ移行
- secrets.dart: posimaiBaseUrl を追加 (https://api.soar-enrich.com)
- license_service.dart: 検証URLをproxyから /api/ponshu/license/validate へ変更
  + LicenseStatus.trialExpired 参照バグを修正
  + _cachedTrialInfo 残骸変数参照を削除
- proxy/server.js: /license/validate と /admin/license/revoke を削除
  (ライセンス管理はPostgreSQL + VPS server.js が担当)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 00:16:52 +09:00
Ponshu Developer d47bb201ac feat: ライセンス管理システムを追加(Pro機能解放型)
- LicenseService / LicenseProvider / LicenseScreen を追加
- main_screen.dart: isProVersion(ビルド時)→ isProProvider(ランタイム)に変更
  ライセンスキー購入後にARスキャン・Analytics・Instagram支援が解放される
- home_screen.dart: 不要なTrialStatusBannerを削除(AI解析は常時無制限)
- proxy/server.js: トライアル回数制限・Stripe/Resendコードを削除(整理)
- proxy/package.json: stripe/resend依存を削除
- .github/workflows/ios_build.yml: iOS CI追加
- scripts/deploy_android.ps1: Android配布スクリプト追加

AI解析(1日50回)はLite版でも制限なし
Proライセンス購入でARスキャン・Analytics・Instagram支援を解放

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-11 00:05:53 +09:00
Ponshu Developer 2b90756417 chore: update download page to v1.0.25 2026-04-10 16:39:40 +09:00
Ponshu Developer fedfc6fa62 fix: code review fixes — data integrity, safety, architecture
C-2: draft_service — $i+1 → ${i+1} 文字列補間バグ修正
C-1: sake_item — setter内の unawaited save() を削除(呼び出し元で明示的に await)
H-2: sake_detail_screen — 再解析前に実ファイル存在チェック追加
M-4: gemini_exceptions.dart 新規作成、[CONGESTION]文字列マッチ→型チェックに変更
C-4: main.dart — migration_completed フラグ→ migration_version 番号管理に移行
     既存ユーザーのデータは migration_version=1 扱いで安全に互換維持

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 08:26:53 +09:00
Ponshu Developer 30c15b553d chore: update download page to v1.0.24 2026-04-09 19:32:07 +09:00
Ponshu Developer 7844fc314d fix: UI tweaks — alcohol unit, title card layout, stats card
- sake_detail_specs: アルコール分チラ見せを % → 度 に統一
- level_title_card: Lv.バッジを「現在の称号」行右寄せに移動、称号名36→26px・1行制限
- activity_stats: 小カード(お気に入り・撮影日数)を横並びレイアウトに変更

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 19:27:25 +09:00
Ponshu Developer 3cbd9bad2c chore: update download page to v1.0.23 2026-04-09 19:22:21 +09:00
Ponshu Developer 182e498188 fix: save as draft when Gemini 503 exhausts all retries
When API congestion persists after 3 retries + fallback:
- Mark exception with [CONGESTION] tag
- camera_screen catches it and calls DraftService.saveDraft()
- Shows orange snackbar (same UX as offline) instead of red error

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 19:17:30 +09:00
Ponshu Developer b3d07f8794 chore: update download page to v1.0.22 2026-04-09 19:12:25 +09:00
Ponshu Developer 0d741c4cb0 fix: add retry + fallback for Gemini 503 UNAVAILABLE errors
- Retry up to 3 times with exponential backoff on 503/UNAVAILABLE
- Fall back to gemini-2.0-flash on final attempt
- Replace raw JSON error with user-friendly Japanese message

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 19:04:40 +09:00
Ponshu Developer d1a41b4d3b chore: update download page to v1.0.21 2026-04-06 17:14:29 +09:00
Ponshu Developer 9587991999 feat(ponshu-room): Phase 3 UI — Bento Grid stats + progress bar animation
- activity_stats: Bento Grid layout (大カード×1 + 小カード×2) with AppColors tokens
- level_title_card: TweenAnimationBuilder progress bar (0→value, 900ms easeOutCubic)
- version bump: 1.0.20+31 → 1.0.21+32

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 17:04:20 +09:00
Ponshu Developer db4af36f8b fix: grid item separator / → · (consistent with list and detail screen)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 16:50:51 +09:00
Ponshu Developer c5cb02f9ac chore: update download page to v1.0.20
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 09:16:58 +09:00
Ponshu Developer 6c96eaf01b chore: bump version to 1.0.20+31
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 09:15:57 +09:00
Ponshu Developer a691be07fa feat: simplify list item — accurate info only, remove AI-inferred tags
- 酒蔵 · 都道府県: / → · 区切りに変更(詳細画面と統一)
- フレーバータグ削除: AI推測精度が低いため一覧から除去(詳細画面のみ)
- 特定名称 + アルコール度数を追加: ラベル直読みの正確な情報のみ表示
  (どちらか一方のみの場合も対応、両方ない場合は行自体を非表示)
- セット商品の説明文は維持(ユーザー入力のため)
- お気に入りアイコンは現状(右上)のまま維持

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 09:12:59 +09:00
Ponshu Developer 818f8862a1 feat: detail screen UI polish — badge merge, clean typography, spec peek, no dividers
変更1: AI確信度 + MBTI相性バッジを横並び1行に統合(Wrap)
変更2: 銘柄名・酒蔵から常時表示の鉛筆アイコンを除去、区切りを / → · に変更
       キャッチコピーを銘柄名直下に移動、タグをpill形状(radius:20)に変更
変更3: スペック詳細アコーディオンのタイトルにアルコール度数・精米歩合をチラ見せ
変更4: Divider 4本 → SizedBox(height:32) に置換
       おすすめ見出しカラーを colorScheme.onSurface → appColors.textPrimary に統一

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 14:55:21 +09:00
Ponshu Developer 4758aa5c9c fix: remove Pro-only placeholder in consumer APK, fix A-1/A-3 visibility
- sake_detail_screen: hide SakeMbtiStampSection when isProVersion=false
  (consumer APK no longer shows Pro版限定 placeholder at card bottom)
- sake_grid_item / sake_list_item: apply Pressable to actual tap targets
  (grid/list cards now animate on press instead of non-interactive LevelTitleCard)
- soul_screen / sommelier_screen: ambient glow alpha 0.07→0.12 for visibility

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 14:33:40 +09:00
Ponshu Developer 17e8d52a67 chore: bump version to 1.0.19+30, update download page to v1.0.19
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 13:44:22 +09:00
Ponshu Developer a14dae1afb feat: UI modernization Phase 2 — micro-animation, typography, ambient glow
A-1 Micro-animation: Pressable wrapper widget (AnimatedScale 0.97 on tap)
    applied to LevelTitleCard

A-2 Bold Typography: LevelTitleCard title font 28→36px, 現在の称号 label
    demoted to bodySmall for stronger visual contrast

A-3 Ambient Glow: RadialGradient circle behind My Page (top-left, brandPrimary)
    and Sommelier screen (top-right, brandAccent) via Stack + IgnorePointer

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 13:35:03 +09:00
Ponshu Developer 1741e74639 feat: restructure My Page and Sommelier screen layouts
My Page:
- LevelTitleCard: show nickname above title when set
- Add section header 成長記録 above gamification widgets
- Split profile card: basic info (nickname/gender) and sake character
  (MBTI/sake persona) are now separate named sections

Sommelier:
- Add section headers テイストプロフィール / MBTI風診断 / さけのわ おすすめ
- Widen share button to full width with rounded rect shape
- Remove Dividers between sections, use SizedBox(32) spacing instead

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 13:32:52 +09:00
Ponshu Developer 7797f4eed7 feat: hide business mode toggle in consumer APK, update 4-variant build script
- soul_screen.dart: pass showBusinessMode: isBusinessApp to OtherSettingsSection
  so the toggle is hidden when built with IS_BUSINESS_APP=false
- build_4_apks.sh: rewrite for current strategy (consumer/business x maita/eiji)
  Pro variants removed; set_lite_app_id() restores gradle before each build

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 10:11:54 +09:00
Ponshu Developer 4db63eb05a fix: fix download page overlay not closing when pro APK is absent, rename Maita to Mai
releases.json に pro キーがないとき apks.pro.url 参照でJSエラーが発生し
hideUserSelect() が実行されず画面が切り替わらないバグを修正。
pro が存在しない場合はカードを非表示にする。
Maita 表記を Mai に変更。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 09:50:16 +09:00
Ponshu Developer 5dde69788b chore: update releases.json to v1.0.18
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 07:34:16 +09:00
Ponshu Developer 4eaa292b02 chore: bump version to 1.0.18+29
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 07:30:33 +09:00
Ponshu Developer d61427d7f6 feat: add grid text toggle to display settings (promoted from DevMenu)
一覧テキスト表示のON/OFFをSoulScreenの表示設定から操作可能に。
DevMenuのままだった機能を正式設定として昇格。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 07:26:42 +09:00
Ponshu Developer b6163e8efe chore: guard DevMenu in release build, clean up Phase/TODO comments
- DevMenu: kReleaseModeのときonTap=nullでリリースビルドから完全無効化
- Phase N マーカーを全ファイルから削除(実装済みのため歴史的コメントを除去)
- analysis_cache_service TODOを具体的な記述に改善

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 03:02:01 +09:00
Ponshu Developer 426697403e fix: add maxLines/overflow to MBTI subtitle in soul_screen
長いMBTIタイトルがListTile内でUI崩れを起こす可能性があったため対処。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 02:51:42 +09:00
Ponshu Developer 57a2cf89bb feat: bump v1.0.17 consumer build, update download links
IS_BUSINESS_APP=false の消費者向けAPKを v1.0.17+28 としてリリース。
releases.json を新URLに更新(pro欄削除、consumer命名に変更)。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 23:47:19 +09:00