Files
FamilyMealPlanner/CLAUDE.md
T
alexandrev-tibco 6c7e12b41f 1.0.4: Smarter auto-assign, quick dish entry, calendar fix, frictionless onboarding
- AutocompleteEngine: no-repeat rule now applies to all dishes (not just tagless ones); fallback still allows repeats when no alternative exists
- CalendarService: update existing events instead of delete+create to prevent duplicates; fix weekStartDate using plan date instead of currentWeekStart
- DishFormView: form stays open after saving in create mode for quick multi-dish entry; Done button to close; saved feedback banner
- OnboardingViewModel/FirstDishesStepView: dishes are now optional during onboarding; Finish button always enabled
- AnalyticsService: new events — onboarding_step_viewed(step) and auto_assign_used(filled, unfilled)
- Localization: dish_done and first_dishes_optional_hint added in 6 languages; release notes updated in all 6 languages
- Version bump: 1.0.3 → 1.0.4 (build 19)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 11:35:50 +02:00

64 lines
2.5 KiB
Markdown

# MealMood — Project Context for Claude Code
## App
- **Name**: MealMood: Family Meal Planner
- **Bundle ID**: com.alexandrevazquez.mealmood
- **Platform**: iOS/iPadOS (also runs as iOS app on Mac)
- **Current version**: 1.0.4
- **Main branch**: `1.0.1` (production), feature branches named after versions
## Credentials — all managed via `pass` (GPG-encrypted, syncs to Gitea)
Never hardcode credentials. Always read from `pass`:
```bash
# Apple
pass show apple/mealmood/apple-id # alexandre.vazquez@gmail.com
pass show apple/mealmood/developer-team-id # 2825Q76T7H
pass show apple/mealmood/appstore-connect-team-id # 128443966
pass show apple/mealmood/app-store-app-id # 6759255553
pass show apple/mealmood/app-specific-password-fastlane # for fastlane uploads
# Firebase
pass show firebase/mealmood/api-key
pass show firebase/mealmood/project-id
pass show firebase/mealmood/google-app-id
# AdMob
pass show admob/mealmood/app-id
pass show admob/mealmood/banner-home-unit-id
```
### TestFlight upload
```bash
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=$(pass show apple/mealmood/app-specific-password-fastlane)
fastlane beta
```
## Stack
- SwiftUI + SwiftData (iOS 17+)
- Firebase Analytics (`AnalyticsService.swift`)
- Google AdMob (banner, free tier only, hidden on Mac)
- StoreKit 2 (subscription `com.mealmood.premium.monthly`)
- iCloud KV sync (`ICloudSyncService.swift`) — does NOT sync `isPremium`
- Widget extension (`MealMoodWidget/`) — requires App Group `group.com.alexandrevazquez.mealmood`
- Fastlane for CI/CD
## Premium logic
- `PremiumSyncService` is the source of truth for premium state transitions
- `isPremium` is determined **only** by StoreKit — never by iCloud sync
- `Transaction.updates` listener in `ContentView` catches purchases in real-time
- Tests: `MealMoodTests/PremiumSyncServiceTests.swift`
## Key files
| File | Purpose |
|------|---------|
| `MealMood/ContentView.swift` | App root, premium sync, Transaction.updates listener |
| `MealMood/Services/PremiumSyncService.swift` | Premium state machine (testable) |
| `MealMood/Services/StoreManager.swift` | StoreKit 2 purchase/restore |
| `MealMood/Services/ICloudSyncService.swift` | Cross-device sync (dishes, tags, plans — NOT isPremium) |
| `MealMood/Views/Home/WeekPlanShareView.swift` | Export styles (default, school, vertical A4) |
| `MealMoodWidget/MealMoodWidget.swift` | Home screen widget |
| `fastlane/Fastfile` | `beta` and `release` lanes |
| `fastlane/metadata/` | App Store metadata in 6 languages |