Préparation du chantier watchOS Live Workout (live FC/calories/distance
sur l'iPhone pendant que Sylvain fait du sport sur l'Apple Watch).
Décision archi : la phase native Swift/watchOS nécessite Xcode + Apple
Watch device, indispo dans la session Linux où ces docs ont été écrites.
D'où le handoff vers Claude Code lancé sur le Mac mini Sylvain.
Fichiers ajoutés :
- `docs/watchos-live-workout-plan.md` (444 lignes)
Plan technique complet en 5 phases :
1. Création target watchOS Xcode + entitlements
2. Code Swift watchOS (4 fichiers : CoachWatchApp, WorkoutManager,
ConnectivityManager, ContentView)
3. Plugin Capacitor iOS (CoachLiveBridge.swift) qui reçoit les samples
WCSession et les publie au JS via notifyListeners
4. Route web /live + template (squelette prêt à coller dans
coach_sportif/web/)
5. Tests device + TestFlight internal
Inclut décisions d'archi (HKLiveWorkoutBuilder, sendMessage avec
fallback transferUserInfo, pas de Live Activity V1), pseudocode Swift,
estimation effort 12-20h sur 3-5 jours, et risques + mitigations.
- `HANDOFF-WATCHOS.md` (181 lignes)
Instructions étape par étape pour Claude Code Mac. Liste les memories
à charger (project_coach_watchos_live, project_coach_ios,
project_coach_app_commercial, user_sante_cardio,
feedback_inline_display_none_toggle), workflow Step 1..6 (setup env,
création target, lecture docs Apple, implémentation Swift, route web,
tests device), garde-fous et règle "qui possède quoi" pendant le
chantier (Mac = Swift natif, Linux = backend Python).
- `CLAUDE.md` (1ère commit, fichier existait en local non-tracked)
Pointeur ajouté dans la section Backlog vers les 2 nouveaux fichiers.
Aucun fichier Swift n'a été écrit ici (décision conjointe avec Sylvain
pour ne pas risquer du code à l'aveugle sans Xcode pour valider les
APIs HealthKit/WCSession à jour).
4.9 KiB
4.9 KiB
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.chdans une WebView - Pas de code web embarqué —
server.urldanscapacitor.config.tspointe 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(renommagecoach-mobileà faire) ; fichiercoach-ios.local.jsonconservé 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
- 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). - Cookie inject AppDelegate (iOS) : mécanisme critique pour l'auth WKWebView. Toute modif
AppDelegate.swiftdoit préserver ce flux. - Health Connect Android : nécessite la privacy policy URL dans le manifest (validation Play Console).
- Pas d'extrapolation : root cause vérifiable avant tout fix natif. iOS+Android = doubles surfaces de bug.
- Default yes : décider et exécuter (sauf actions destructives).
- Pousser après commit :
git pushsystématique. - 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.swiftavant de toucher au flow HealthKit
Code Kotlin / Android
compose-state-hoisting— si plugin Capacitor custom avec UI Composekotlin-coroutines-structured-concurrency— appels Health Connect asynckotlin-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 surcoach.hypnotruck.ch(le contenu réel de la WebView)cso— audit signatures, entitlements, secrets danscoach-ios.local.jsonship— workflow PR (mais les releases App Store/Play Store restent manuelles depuis Mac mini)
📂 Conventions code
- iOS natif :
ios/App/App/*.swiftAppDelegate.swift— bootstrap + cookie inject (NE PAS CASSER)MainViewController.swift— WKWebView configCoachAuth.swift.example→ copier enCoachAuth.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é versios/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 (chantier ACTIF depuis 2026-05-24) — plan
technique complet dans
docs/watchos-live-workout-plan.md. Handoff pour Claude Code Mac dansHANDOFF-WATCHOS.md(à lire en 1er si tu reprends ce chantier). - 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).