Propose puis mis de cote aujourd'hui. Ce qui est consigne, c'est l'etat verifie dans le code, pour que la reprise ne recommence pas l'enquete. Les complications portent deja un widgetURL, mais CoachWatch n'implemente aucun onOpenURL : le tap ouvre l'app sur le choix d'activite, pas sur la seance. Et la donnee est deja sur la montre - CoachWidgetSnapshot.TodaySession y arrive par WCSession, l'app ne la lit simplement pas. Le travail se reduit donc a lire l'URL entrante et mapper le sport vers le HKWorkoutActivityType, environ 1 h. La limite qui cadre le sujet : une complication ne peut pas ouvrir l'app Exercice d'Apple sur une seance programmee, il n'existe aucune URL publique pour ca. Le fractionne structure envoye par WorkoutKit se lancera toujours a la main depuis Exercice > Programmees. Reimplementer le guidage d'intervalles chez nous doublonnerait ce qu'Apple fait deja bien. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
6.1 KiB
6.1 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 — Phases 1-3 RÉALISÉES (2026-05-25, sur
main) : targetCoachWatch+ 4 fichiers Swift watchOS + plugin CapacitorCoachLiveBridge. Builds verts (watchsimulator + App embed), UI validée sur sim. Reste : test device + TestFlight. Détails et deltas watchOS 26 dansdocs/watchos-live-workout-plan.md(section "Avancement réel"). - Push workouts vers Apple Watch (HKWorkoutPlan) / Polar (Training Targets API) / Garmin — backlog 2026-05-12
- Lancer la séance du jour depuis la complication Watch — proposé et mis de
côté le 2026-08-11. État vérifié ce jour :
- les complications portent déjà un
widgetURL(/forme,/calendar), maisCoachWatchn'implémente aucunonOpenURL→ un tap ouvre l'app surActivityPickerView, pas sur la séance ; - la donnée est déjà sur la montre :
CoachWidgetSnapshot.TodaySession(sport, titre, durée) y arrive par WCSession, l'app ne s'en sert pas ; - travail estimé ~1 h : lire l'URL entrante, mapper
TodaySession.sportvers leHKWorkoutActivityTypecorrespondant (les 4 activités deActivityPickerView), ouvrir l'écran de démarrage pré-rempli. - ⚠️ Limite Apple : une complication ne peut PAS ouvrir l'app Exercice d'Apple sur une séance programmée précise — aucune URL publique. Le fractionné structuré envoyé par WorkoutKit se lancera toujours à la main depuis Exercice → Programmées. Guider les intervalles dans notre app Watch serait un chantier d'1 à 2 jours qui doublonnerait l'app d'Apple.
- les complications portent déjà un
⚠️ 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).