feat(watch): routine quotidienne cochable sur l'Apple Watch

Pendant natif du backend coach_sportif (commit 772385b, déjà en prod).

- CoachRoutineBridge (target App) : pousse blocs + état du jour vers la Watch
  via updateApplicationContext, relaie les coches Watch vers /api/routine/day
  puis notifie la WebView (event routineUpdated)
- CoachWatch/RoutineStore : état persisté en UserDefaults, reset au changement
  de jour. Les blocs viennent de l'iPhone — rien codé en dur côté watchOS, donc
  modifier la routine côté web ne demande aucun rebuild
- CoachWatch/RoutineView : liste cochable, progression, haptique, bouton de
  renvoi si la synchro a échoué
- ConnectivityManager (watch) : sendRoutine() en sendMessage avec repli
  transferUserInfo (coche faite iPhone hors de portée -> livraison différée)

⚠️ CoachLiveBridge touché : routeIfNotLiveSample() aiguille les messages
routineDone vers NotificationCenter. WCSession.delegate est unique côté iPhone,
impossible d'en ajouter un second. Le flux live workout n'est pas modifié mais
doit être re-vérifié au build.

Les 3 nouveaux fichiers sont référencés dans project.pbxproj (bonne target) :
aucun "Add Files" à faire sur le Mac. Runbook : docs/routine-watch-runbook-mac.md

NON COMPILÉ — nécessite une session Xcode sur le Mac mini.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Sylvain Bettinelli
2026-08-03 14:22:33 +00:00
parent 5f8f3edcd9
commit caeac37f38
10 changed files with 639 additions and 0 deletions

View File

@@ -30,6 +30,27 @@ Les deux ne communiquent **que via git + ce fichier**. ⚠️ La mémoire de cha
- Watch : `CoachWidgetBridge.pushToWatch` (WCSession) → `CoachWatch/ConnectivityManager` reçoit → App Group montre + reload. Complications `CoachWatchWidgets/CoachWatchComplications.swift` (Forme circular/corner, Séance rectangular/inline). **Nouvelle target widget watchOS à créer dans Xcode.**
- ⚠️ Étapes Mac obligatoires (App Group portail + capabilities + Target Membership + target Watch + build) : **TOUT est détaillé dans `docs/widgets-runbook-mac.md`.**
## 🆕 Routine quotidienne sur la Watch (2026-08-03, dev — non compilé)
Nouveau chantier, code complet côté dev, **build Mac requis**. Tout est détaillé
dans **`docs/routine-watch-runbook-mac.md`** (archi, étapes, débogage).
- **Nouveaux fichiers, DÉJÀ référencés dans `project.pbxproj`** (aucun « Add
Files » à faire) : `App/CoachRoutineBridge.swift` (target App),
`CoachWatch/RoutineStore.swift` + `CoachWatch/RoutineView.swift` (target
CoachWatch). Backup : `project.pbxproj.bak-routine`.
- **Modifs** : `MainViewController.capacitorDidLoad()` enregistre
`CoachRoutineBridgePlugin` ; `CoachWatch/ContentView` ouvre `RoutineView` en
sheet ; `ConnectivityManager` (watch) gagne `sendRoutine()` + réception du
`routineSnapshot`.
- ⚠️ **`CoachLiveBridge` touché** — un seul ajout : `routeIfNotLiveSample()`
aiguille les messages `routineDone` vers `NotificationCenter` au lieu de les
émettre comme samples. Le délégué `WCSession` est unique côté iPhone, on ne
pouvait pas en ajouter un second. **À re-vérifier au build** que le live
workout (validé E2E le 31/05) fonctionne toujours.
- Côté backend `coach_sportif` : **déjà en prod** (`/api/routine`,
`/api/routine/check`, `/api/routine/day`, `data/routine_log.json`).
## 👉 À reprendre
-**Phase 4 login — FAIT & DÉPLOYÉ** (révocation Apple à la suppression de compte) : code complet côté backend `coach_sportif` (commit `5ae6e2d`) + clé `.p8` déployée sur le VPS prod (vérifié 2026-06-26). Rien à coder. Détails : `coach_sportif/COWORK.md`.
- **iOS — bloqué Mac** : builder + uploader TestFlight le natif accumulé (login Apple+Google natif, watchOS live, HeartRateRangeAlert). Sur le Mac : `cd ~/coach-ios && git pull && npm install && npx cap sync ios && open ios/App/App.xcworkspace` → Clean Build Folder → Archive → Upload.