diff --git a/COWORK.md b/COWORK.md index 9ac3435..a425151 100644 --- a/COWORK.md +++ b/COWORK.md @@ -76,9 +76,42 @@ ouvrait Safari**, où le cookie d'auth injecté dans la WKWebView n'existe pas : `CoachLiveView` s'ouvre d'elle-même (le JS de `/live` appelle `openNativeLive`). C'est le point d'entrée qui manquait. +## 🆕 Moteur d'intervalles (2026-08-20, dev — non câblé, non compilé) + +Branche **`feat/watch-outdoor`** (poussée sur Gitea le 2026-08-20), commit +`f2fa3cc`. `IntervalEngine` guide les intervalles d'une séance au poignet. + +**Pourquoi ce code existe** : WorkoutKit ne sait pas exécuter une séance +structurée dans une app tierce — son seul point d'exécution public est +`WorkoutPlan.openInWorkoutApp()`, qui ouvre l'app Exercice d'Apple. Il faut donc +écrire la machine à états nous-mêmes. + +**Le moteur est volontairement pur** : aucun HealthKit, aucun timer, aucune +horloge interne. Il répond à « où en sommes-nous ? » à partir du temps et de la +distance qu'on lui pousse. Le temps de référence est `elapsedTime` du builder, +qui exclut déjà les pauses. + +✅ **42 tests Swift verts sur Linux** (`./tests-linux/run.sh`, toolchain +`~/workspace/toolchains/bin`), dont les 17 d'`IntervalEngine`. La logique est +donc validée — ce qui reste est l'intégration, que Linux ne peut pas compiler. + +⚠️ **ÉTAPE MAC OBLIGATOIRE — le fichier n'est PAS dans le projet Xcode.** +Vérifié le 2026-08-20 : `grep -c "IntervalEngine" ios/App/App.xcodeproj/project.pbxproj` +rend **0**. Xcode l'ignore donc totalement, et **ça compile très bien sans lui** — +même piège que `VmaTestView.swift`. À faire : + +1. `cp ios/App/App.xcodeproj/project.pbxproj ios/App/App.xcodeproj/project.pbxproj.bak-interval` +2. Clic droit sur le dossier **CoachWatch** → *Add Files to "App"…* → + `ios/App/CoachWatch/IntervalEngine.swift` + — **décocher** « Copy items if needed », **cocher la cible `CoachWatch`**. +3. Contrôle : `grep -c "IntervalEngine.swift in Sources" ios/App/App.xcodeproj/project.pbxproj` + doit rendre **1**. +4. Commit + push du `pbxproj` immédiatement (règle 3 de ce fichier). + ## 👉 À 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. +- **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.xcodeproj` → Clean Build Folder → Archive → Upload. + - ⚠️ **Corrigé le 2026-08-20** : cette ligne disait `open ios/App/App.xcworkspace`. **Ce fichier n'existe pas** (vérifié : le dépôt ne contient que `App.xcodeproj`). Depuis **Capacitor 8, les dépendances passent par SPM** et il n'y a plus de workspace CocoaPods. La commande échouait donc telle quelle. - ⚠️ **Fixes robustesse 2026-07-01 (dev, non compilés)** à valider au prochain build : `CoachWidgetBridge` (score lu en `NSNumber.intValue` → corrige un score float perdu ; `save` renvoie Bool → `call.reject` si App Group KO), `CoachAppleAuth` (double-tap : rejette l'ancien `pendingCall` ; erreur testée par domaine `ASAuthorizationError`). Swift pur, aucun nouveau fichier ni capability. - ⚠️ **Checklist pré-App-Store (audit sécu 2026-07-01)** : `ios/App/App/App.entitlements` a `aps-environment = development`. Pour la soumission **App Store/TestFlight**, l'APNs prod exige `production`. NON changé côté dev (casserait le push en dev device — arbitrage de signing à faire sur Mac : soit basculer `production` avant l'archive de distribution, soit laisser Xcode le gérer via le profil de distribution auto). À trancher/tester au moment du build release. - **watchOS — bloqué Mac** : test device + TestFlight de la cible `CoachWatch` (Phases 1-3 réalisées, build vert sim). Cf. `HANDOFF-WATCHOS.md`.