# CLAUDE.md — coach-ios (wrapper mobile Capacitor) Instructions pour Claude Code sur ce projet. Lis ce fichier en début de session. ## 🎯 Contexte projet - **Nature** : wrapper Capacitor 8 (iOS + Android) qui charge `https://coach.hypnotruck.ch` dans une WebView - **Pas de code web embarqué** — `server.url` dans `capacitor.config.ts` pointe vers la prod → déploiement web = mise à jour app sans review Apple/Google - **Bundle ID** : `ch.hypnotruck.coach` (iOS + Android) - **Repo Gitea** : encore nommé `coach-ios` (renommage `coach-mobile` à faire) ; fichier `coach-ios.local.json` conservé pour ne pas casser les refs Swift - **Plateformes** : iOS 13+ et Android 8.0+ (API 26+, requis par Health Connect) - **Build iOS** : nécessite le Mac mini (macOS 13+, Xcode 15+). Pas de Mac cloud nécessaire. - **État** : iOS prêt (HealthKit + cookie inject AppDelegate). Android prêt. Bloqué externe : upgrade macOS 26 pour build iOS + Play Console $25 ~3-5j. ## 🔒 Règles non négociables 1. **Le code web n'est PAS ici** — pour modifier l'UI/UX, c'est `coach_sportif/web/`. Ce repo ne touche QUE le natif (Swift, Kotlin, plugins Capacitor, config). 2. **Cookie inject AppDelegate** (iOS) : mécanisme critique pour l'auth WKWebView. Toute modif `AppDelegate.swift` doit préserver ce flux. 3. **Health Connect Android** : nécessite la privacy policy URL dans le manifest (validation Play Console). 4. **Pas d'extrapolation** : root cause vérifiable avant tout fix natif. iOS+Android = doubles surfaces de bug. 5. **Default yes** : décider et exécuter (sauf actions destructives). 6. **Pousser après commit** : `git push` systématique. 7. **Descriptions Info.plist en FR** (NSHealthShareUsageDescription etc.) — App Store FR. ## 🛠️ Workflow par phase ### Avant toute feature native - `brainstorming` — explorer l'intent (souvent : "ce truc marche sur web, comment le porter en natif ?") - `grill-with-docs` — challenger : est-ce vraiment du natif ou du web qui marcherait via WebView ? ### Code Swift / iOS - `swiftui-pro` — quand le chantier **watchOS live workout** démarrera (HKWorkoutPlan + WatchConnectivity) - Vérifier `CoachHealthRoute.swift`, `CoachWorkoutKit.swift`, `CoachWorkoutObserver.swift` avant de toucher au flow HealthKit ### Code Kotlin / Android - `compose-state-hoisting` — si plugin Capacitor custom avec UI Compose - `kotlin-coroutines-structured-concurrency` — appels Health Connect async - `kotlin-flow-state-event-modeling` — observations Health Connect ### Bug / régression natif - `investigate` — root cause discipline (cassures fréquentes : permissions, signatures, entitlements) - `diagnose` — reproduire sur device réel, pas juste simulator ### QA / ship - `qa` (gstack) — l'app pointant vers la prod web, tester le web couvre 80% - `webapp-testing` — Playwright sur `coach.hypnotruck.ch` (le contenu réel de la WebView) - `cso` — audit signatures, entitlements, secrets dans `coach-ios.local.json` - `ship` — workflow PR (mais les releases App Store/Play Store restent manuelles depuis Mac mini) ## 📂 Conventions code - **iOS natif** : `ios/App/App/*.swift` - `AppDelegate.swift` — bootstrap + cookie inject (NE PAS CASSER) - `MainViewController.swift` — WKWebView config - `CoachAuth.swift.example` → copier en `CoachAuth.swift` (gitignored, contient secret partagé) - `CoachHealthRoute.swift` / `CoachWorkoutKit.swift` / `CoachWorkoutObserver.swift` — pont HealthKit ↔ web - **Android natif** : `android/app/src/main/java/ch/...` - **Config Capacitor** : `capacitor.config.ts` (TS, source de vérité) → généré vers `ios/App/App/capacitor.config.json` - **Resources** : `resources/` → assets (icons, splash) générés par `@capacitor/assets` ## 🔗 Plugins Capacitor utilisés - `@capacitor/push-notifications` - `@capacitor/local-notifications` - `@capacitor/geolocation` - `@capgo/capacitor-health` — HealthKit (iOS) / Health Connect (Android) - `@capacitor/splash-screen` - `@capacitor/status-bar` - `@capacitor/haptics` ## 🚧 Backlog notable - Renommer le repo Gitea `coach-ios` → `coach-mobile` - Upgrade macOS 26 sur Mac mini pour reprendre les builds iOS - Play Console validation (~3-5j, $25 one-shot) pour upload Android - **watchOS live workout compagnon** — Phases 1-3 RÉALISÉES (2026-05-25, sur `main`) : target `CoachWatch` + 4 fichiers Swift watchOS + plugin Capacitor `CoachLiveBridge`. Builds verts (watchsimulator + App embed), UI validée sur sim. **Reste : test device + TestFlight.** Détails et deltas watchOS 26 dans `docs/watchos-live-workout-plan.md` (section "Avancement réel"). - Push workouts vers Apple Watch (HKWorkoutPlan) / Polar (Training Targets API) / Garmin — backlog 2026-05-12 ## ⚠️ Limites connues sync - **Apple Watch sync** : impossible via API tierce — le wrapper HealthKit dans cette app est obligatoire pour récupérer les données Watch. - **Polar AccessLink** : pas d'historique pré-enregistrement (limitation API). - **Push training-targets vers Polar** : nécessiterait migration AccessLink v4 (backlog).