5.5 KiB
5.5 KiB
COWORK — coordination multi-Claude (coach-ios)
Ce repo est travaillé en parallèle par 2 instances de Claude :
- Claude « dev » (serveur Linux, sans Xcode) : écrit le code (Swift des plugins, config projet) + le backend/web (repo
coach_sportif). Ne peut PAS builder iOS (pas de Xcode). - Claude « Cowork » (app Claude sur le Mac mini de Sylvain) : fait les builds Xcode, la signature, les tests sur device. → C'est toi si tu lis ça depuis le Mac.
Les deux ne communiquent que via git + ce fichier. ⚠️ La mémoire de chaque Claude est locale à sa machine (non partagée) → l'état partagé, c'est CE fichier : tiens-le à jour.
🔑 Règles d'or (pour ne pas se bloquer)
git pullAVANT de toucher au projet ;git pushaprès chaque changement.- ⚠️ Ne jamais laisser Xcode ouvert pendant un
git pull— Xcode garde/réécrit lepbxprojen mémoire → fichiers Swift non compilés + conflits (ça nous a bloqués 2× le 2026-06-05). Quitter Xcode (Cmd+Q), pull, rouvrir. - Après toute modif faite dans Xcode (package SPM, capability, signing) → commit + push
project.pbxproj(+Package.resolved) immédiatement, sinon le prochaingit pullest bloqué par les modifs locales. - Zone sensible =
ios/App/App.xcodeproj/project.pbxproj: le Claude dev y ajoute les fichiers Swift (entrées manuelles), le Claude Mac y ajoute les packages SPM. → committer de suite limite les collisions.
🛠️ Workflow type « le dev a poussé du code natif, build-le »
- Quitter Xcode.
git pull- Nouveau
*.swift? vérifier qu'il est dans le projet :grep -c <Nom>.swift ios/App/App.xcodeproj/project.pbxproj(doit être ≠ 0). Si Xcode ne le voit pas après ouverture → clic droit dossier App → Add Files to "App"… (décocher Copy items, cocher target App). - Ouvrir Xcode → Clean Build Folder (
Cmd+Shift+K) → Run (Cmd+R) sur l'iPhone. - Erreurs → corriger, committer le fix, push.
- Diagnostic plugins : Safari → Développement → iPhone → coach.hypnotruck.ch → console →
Object.keys(Capacitor.Plugins).filter(k=>k.indexOf('Coach')===0).
📍 État natif actuel (2026-06-05)
- Capacitor 8 n'auto-découvre PAS les plugins in-app → tous enregistrés dans
MainViewController.capacitorDidLoad(): CoachWorkoutKit, CoachHealthRoute, CoachWorkoutObserver, CoachLiveBridge, CoachAppleAuth, CoachGoogleAuth. - Login natif Apple + Google = OK, validé device. Apple via
AuthenticationServices(intégré). Google via SDK GoogleSignIn (SPM, lié à la target App) +GIDClientID/URL scheme dans Info.plist. Les deux POSTent l'id_token sur/auth/apple|google/web(backend) → cookie de session. - watchOS
CoachWatch+ Live Activity en place (chantiers antérieurs, cf.HANDOFF-WATCHOS.md). - Widgets natifs iPhone + complication Watch (2026-06-29) : code écrit côté dev, reste le câblage Mac.
- iPhone : plugin
CoachWidgetBridge(enregistré danscapacitorDidLoad()), modèle partagéCoachWidgetSnapshot.swift, widgetsCoachWidgets.swift(Séance du jour + Score de forme) dans l'extensionCoachLiveActivity. App Groupgroup.ch.hypnotruck.coach. Hook web déjà en prod (widget-bridge.js). - Watch :
CoachWidgetBridge.pushToWatch(WCSession) →CoachWatch/ConnectivityManagerreçoit → App Group montre + reload. ComplicationsCoachWatchWidgets/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.
- iPhone : plugin
👉 À reprendre
- ✅ Phase 4 login — FAIT & DÉPLOYÉ (révocation Apple à la suppression de compte) : code complet côté backend
coach_sportif(commit5ae6e2d) + clé.p8dé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.- ⚠️ Fixes robustesse 2026-07-01 (dev, non compilés) à valider au prochain build :
CoachWidgetBridge(score lu enNSNumber.intValue→ corrige un score float perdu ;saverenvoie Bool →call.rejectsi App Group KO),CoachAppleAuth(double-tap : rejette l'ancienpendingCall; erreur testée par domaineASAuthorizationError). Swift pur, aucun nouveau fichier ni capability. - ⚠️ Checklist pré-App-Store (audit sécu 2026-07-01) :
ios/App/App/App.entitlementsaaps-environment = development. Pour la soumission App Store/TestFlight, l'APNs prod exigeproduction. NON changé côté dev (casserait le push en dev device — arbitrage de signing à faire sur Mac : soit basculerproductionavant l'archive de distribution, soit laisser Xcode le gérer via le profil de distribution auto). À trancher/tester au moment du build release.
- ⚠️ Fixes robustesse 2026-07-01 (dev, non compilés) à valider au prochain build :
- watchOS — bloqué Mac : test device + TestFlight de la cible
CoachWatch(Phases 1-3 réalisées, build vert sim). Cf.HANDOFF-WATCHOS.md. - Android — bloqué externe : Play Console ($25 validé), upload AAB + Internal Testing depuis machine avec Android SDK.
- Backend/web : voir
coach_sportif/COWORK.md.