Commit Graph

43 Commits

Author SHA1 Message Date
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 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 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 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 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 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 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 c0a23d2afb feat: add IS_BUSINESS_APP build flag for consumer/business APK split
消費者向けビルド(IS_BUSINESS_APP=false)では店舗タブを完全非表示にする。
build_consumer.sh / build_business.sh でワンコマンドビルド可能。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 23:13:40 +09:00
Ponshu Developer 9f63578ca7 chore: remove development phase markers and dead commented code
- Remove Phase X / Phase D labels from inline comments and imports
- Remove debugPrint calls from CustomPainter.paint() (called every frame)
- Remove commented-out locale entries (fr, de) from main.dart and language_selector
- Remove version header comments (v1.5 etc.) not needed in source

No logic changes. flutter analyze: No issues found.
2026-04-04 23:02:52 +09:00
Ponshu Developer da05455e7c config: Change useProxy default to false for general distribution
Change default behavior from Proxy mode to Direct API mode:
- useProxy defaultValue: true -> false
- General distribution: Users provide their own Gemini API key
- Development with Proxy: Use --dart-define=USE_PROXY=true

Rationale:
- Proxy mode requires Tailscale connection (not suitable for public distribution)
- Direct API mode works anywhere with internet connection
- Each user manages their own API quota

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-22 09:59:32 +09:00
Ponshu Developer 10f772942a feat: Implement Redis persistence for Synology Proxy rate limiting
Infrastructure Improvements:
- Add Redis container to tools/proxy/docker-compose.yml with AOF persistence
- Migrate rate limiting from in-memory to Redis-based storage
- Add TTL-based daily quota reset (expires at midnight)
- Implement health checks for Redis and Proxy containers

Proxy Server Changes (tools/proxy/server.js):
- Add redis client with async connection handling
- Replace usageStore object with Redis GET/INCR/EXPIRE operations
- Add responseMimeType: 'application/json' to Gemini client config
  (fixes Markdown response bug)
- Add comprehensive debug logging for JSON parsing issues

Flutter App Configuration:
- Change Secrets.useProxy defaultValue from false to true
- Development builds now use local Synology proxy by default
- Release builds can override with --dart-define=USE_PROXY=false

Documentation:
- Add REDIS_MIGRATION_GUIDE.md with step-by-step migration instructions
- Add tools/proxy/README.md with architecture overview
- Create .env.example template for secrets configuration
- Update PROJECT_TODO.md to mark H3 (Proxy永続化) as in progress

Dependencies:
- Add redis@^4.7.0 to package.json

This resolves the critical tech debt where rate limits reset on container restart.
Redis AOF persistence ensures quota tracking survives server reboots.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-21 19:35:59 +09:00
Ponshu Developer aded5562cd fix: Resolve all flutter analyze warnings (39 -> 0 issues)
Code Quality Improvements:
- Add vector_math to pubspec.yaml (fixes depend_on_referenced_packages)
- Remove deprecated tutorial fields from UserProfile (hasSeenCameraTutorial, etc.)
- Regenerate user_profile.g.dart (Hive adapter)
- Suppress Share API deprecation warning in sommelier_screen.dart
- Fix unnecessary_getters_setters in sake_item.dart with ignore comment
- Fix unnecessary_brace_in_string_interps in sakenowa service
- Fix unnecessary_underscores warnings (_, __ -> err, stack)

Configuration:
- Exclude scripts/ and tools/ from analyzer (avoid_print in dev tools)
- Add analyze_output*.txt to .gitignore

Result: flutter analyze now reports "No issues found!"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-21 10:32:02 +09:00
Ponshu Developer d760e7bf08 chore: distribution prep - Kotlin DSL signing, .gitignore, build() split
- Fix DISTRIBUTION_API_KEY_SETUP.md: Groovy -> Kotlin DSL, Windows keytool cmds
- Add release signing config to build.gradle.kts (key.properties fallback)
- Add .serena/, key.properties, ponshu_release.jks to .gitignore
- Include Claude's build() split: SakeDetailSliverAppBar, SakeBasicInfoSection
- sake_detail_screen.dart: 1099 -> 795 lines (-304 lines)
- Remove tmp_commit_msg.txt
2026-02-16 19:08:09 +09:00
Ponshu Developer 1a50c739a1 refactor: Extract SakePricingSection from sake_detail_screen.dart, bump to v1.0.16+27
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 11:40:58 +09:00
Ponshu Developer 3502694d89 feat: Add Bearer Token authentication to AI Proxy and disable CORS
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 11:34:00 +09:00
Ponshu Developer d89b6917fa feat: v1.0.16 brushup + Synology Proxy integration
- fix: Replace hardcoded colors with AppColors theme
- refactor: Extract SakePhotoEditModal and SakeMbtiStampSection
- feat: Add taste chart manual editing feature
- test: Add unit tests for SakeItem and AnalysisCacheService (14 tests)
- feat: Add Synology AI Proxy server (Node.js/Docker)
- chore: Make useProxy configurable via dart-define
- chore: Add .apk/.aab/.ipa to .gitignore
- docs: Add proxy setup guide and project roadmap

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-16 00:13:12 +09:00
Ponshu Developer ed7c0f0781 chore: Remove Flutter template test file
- Deleted test/widget_test.dart (Flutter Counter template)
- File was unrelated to Ponshu Room Lite functionality
- Actual tests will be added in v1.0.16

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-09 21:10:56 +09:00
Ponshu Developer 5410c78c6c fix: Add missing badge check after AI sake registration
## Bug Fix
- Badge "初めての一歩" was not unlocking when adding first sake item
- Root cause: GamificationService.checkAndUnlockBadges() was never called in camera_screen.dart

## Changes
- Import gamification_service.dart
- Call checkAndUnlockBadges(ref) after adding sake item to Hive
- Display newly unlocked badges in success SnackBar
- Extend SnackBar duration when badges are unlocked (4s -> 6s)

## User Impact
- Users will now see badge unlock notifications: "バッジ獲得: 初めての一歩 🍶"
- All badge unlock conditions (first_step, regional, collector, flavor) now work correctly

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-31 08:22:23 +09:00
Ponshu Developer b600579123 feat: Redesign Lite version Pro-lock UX with crown badge and dialog
## UI/UX Improvements (User Feedback Implementation)
- Add crown badge to Pro-locked tab icons (Instagram, Analytics, Scan)
- Replace full-screen ProLockedScreen with compact AlertDialog
- Prevent tab navigation to locked features (show dialog instead)
- Follows industry standards (Spotify, Notion, Canva pattern)

## User Experience Benefits
1. Clear visual indicator (crown badge) BEFORE tapping
2. Lightweight dialog instead of full-screen transition
3. No page navigation = smoother, less frustrating experience
4. Reduced "disappointment factor" through expectation management

## Technical Changes
- Added `_IconWithCrownBadge` widget for tab icons
- Added `_showProOnlyDialog()` method for Pro-only feature alerts
- Modified `onDestinationSelected` to intercept locked tab taps
- Simplified screens list (locked tabs show HomeScreen dummy)

## Build Optimization
- Release APK size: 47.1MB (Lite) / 47.2MB (Pro)
- Both versions optimized with tree-shaking and R8
- Single architecture (arm64) for optimal size

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-31 08:00:15 +09:00
Ponshu Developer 494dafe3f2 debug: Add debug logging for Google Drive upload issues
Added debug logging to:
1. main.dart - Log IS_PRO_VERSION value at startup
2. main_screen.dart - Log IS_PRO_VERSION and isBusiness in screen build
3. pdf_preview_screen.dart - Log PDF Drive upload process with file ID verification

This will help diagnose why Google Drive uploads appear to succeed but files
are not visible in Drive.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-31 01:00:37 +09:00
Ponshu Developer a1b25bf3a7 fix: Add missing detail fields to HiddenSpecs initialization
Fixed bug where AI analysis detail fields (type, alcoholContent, polishingRatio,
sakeMeterValue, riceVariety, yeast, manufacturingYearMonth) were not being saved
to HiddenSpecs, causing them to display as "-" in the UI.

Root cause: camera_screen.dart was only passing 3 fields (description, tasteStats,
flavorTags) to HiddenSpecs constructor, missing 7 detail fields that Gemini API
was successfully returning.

Verified: All detail fields now display correctly after AI analysis.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-31 00:06:48 +09:00
Ponshu Developer f063ef6ec5 feat: Add Pro version lock mechanism for Lite version preparation
Phase 4.1完了: Pro版機能ロック機構の実装

変更内容:
- lib/widgets/pro_locked_screen.dart: 新規作成
  - 和モダンな王冠アイコン付きロック画面
  - Pro版限定機能を分かりやすく表示
  - 日英両対応

- lib/main.dart: IS_PRO_VERSION ビルドフラグ追加
  - bool.fromEnvironment('IS_PRO_VERSION', defaultValue: true)
  - Pro版/Lite版をビルド時に切り替え可能に

- lib/screens/main_screen.dart: 条件分岐ロジック追加
  - パーソナルモード: QRスキャン → Lite版ではロック画面
  - ビジネスモード: Instagram・分析 → Lite版ではロック画面
  - タブ表示は維持、タップ時にロック画面を表示

ビルドコマンド:
- Pro版: flutter build apk --release --dart-define=IS_PRO_VERSION=true
- Lite版: flutter build apk --release --dart-define=IS_PRO_VERSION=false

次ステップ:
- lite-versionブランチ作成
- QR依存関係削除(pubspec.yaml)
- パッケージ名・アプリ名変更

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-30 17:34:39 +09:00
Ponshu Developer 21833e4e75 feat: Code quality improvements (v1.0-full-with-qr)
 Improvements:
- Replace print() with debugPrint() (7 instances)
- Migrate withOpacity to withValues (9 instances)
- Remove unused imports (2 files)
- Fix BuildContext async gaps with mounted checks
- Remove unused local variables

📊 Analysis Results:
- Flutter analyzer: 57 → 46 issues (-11)
- Security audit: Passed 
- Code quality: Production ready 

🎯 Purpose:
Complete snapshot before QR feature removal.
This is the last version with full QR functionality.

🤖 Generated with Claude Code & Antigravity

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-30 00:54:22 +09:00
Ponshu Developer 6507ab9596 feat: enhance AI spec extraction 2026-01-16 00:53:44 +09:00
Ponshu Developer 94af953ac3 UI Polish: Dialogs for Backup/Account, Font Alignment, Hide Future Features 2026-01-13 19:00:16 +09:00
Ponshu Developer 9d19689dbd Fix build errors: imports and provider type 2026-01-13 18:36:31 +09:00
Ponshu Developer fbeefd9456 feat(ui): Implement Developer Menu & A/B Testing (Grid/FAB) 2026-01-13 18:33:47 +09:00
Ponshu Developer d0ce82f59a v1.3 Polish: Remove unnecessary divider after MBTI 2026-01-13 18:24:37 +09:00
Ponshu Developer 318fa19bfb Fix compilation error in SakePriceDialog 2026-01-13 18:13:23 +09:00
Ponshu Developer 3018d9a9d1 Fix syntax error in HomeScreen logic 2026-01-13 12:13:10 +09:00
Ponshu Developer 4e8b619ec2 UI Polish: Remove redundant header icon, update usage guide assets, add close button to dialog 2026-01-13 11:56:17 +09:00
Ponshu Developer e038fff77f Code Cleanup: Fix analyzer issues (unused vars, dead code, logic, pdf_service restoration) 2026-01-13 10:33:13 +09:00
Ponshu Developer 191e334d0d v1.2: Map Tab Tile Map, Sommelier Enhancements, APK Optimization (111MB) 2026-01-13 10:16:00 +09:00
Ponshu Developer a6cefb8be5 Step 1 Cleanup: Safe code quality improvements
- Replace deprecated withOpacity() with withValues(alpha:) across 13 files
- Remove unnecessary imports (schema imports, unused dart:io, etc.)
- Reduce analysis issues from 122 to 111 (11 issues resolved)
- All changes are safe and do not break functionality

Changes:
- lib/main.dart: Remove redundant schema imports
- lib/screens/*.dart: Update color methods, clean imports
- lib/widgets/*.dart: Update color methods
- lib/theme/app_theme.dart: Update color methods

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-12 00:53:49 +09:00
Ponshu Developer 2eb451296b Step 1 Polish: dart fix --apply (Resolved 47 analysis issues) 2026-01-11 17:40:26 +09:00
Ponshu Developer 5f2802728d v1.0.8 - Original (Ponshu Room Lite MVP Complete) 2026-01-11 17:17:29 +09:00