Pont WebView→App Group→WidgetKit : - CoachWidgetSnapshot.swift : modèle partagé App↔extension (App Group group.ch.hypnotruck.coach) - CoachWidgetBridge.swift : plugin Capacitor setSnapshot/clear + WidgetCenter.reloadAllTimelines - CoachWidgets.swift : 2 widgets (TimelineProvider + vues SwiftUI, small/medium) - bundle + enregistrement plugin + entitlements App Group (App + CoachLiveActivity) ⚠️ Reste câblage Mac (App Group portail + capability + Target Membership) : docs/widgets-runbook-mac.md. Hook web côté coach_sportif. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.4 KiB
4.4 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 (2026-06-29) : code écrit côté dev, reste le câblage Mac. Plugin
CoachWidgetBridge(à enregistrer — DÉJÀ ajouté danscapacitorDidLoad()), modèle partagéCoachWidgetSnapshot.swift, widgetsCoachWidgets.swift(Séance du jour + Score de forme) dans l'extensionCoachLiveActivity. App Groupgroup.ch.hypnotruck.coach(entitlements écrits). Hook web déjà en prod (widget-bridge.js). ⚠️ Étapes Mac obligatoires : créer l'App Group sur le portail + activer la capability sur App ET CoachLiveActivity + Target Membership des 3 nouveaux fichiers. Tout est détaillé dansdocs/widgets-runbook-mac.md.
👉 À 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. - 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.