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).
87 lines
4.9 KiB
Markdown
87 lines
4.9 KiB
Markdown
# 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** (chantier ACTIF depuis 2026-05-24) — plan
|
|
technique complet dans `docs/watchos-live-workout-plan.md`. Handoff pour
|
|
Claude Code Mac dans `HANDOFF-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).
|