Sépare la notion de Durée (paramètre configuré) de Temps réalisé (résultat
mesuré au chronomètre), renomme le champ « Temps par défaut (s) » en
« Durée par défaut (s) » dans la bibliothèque d'exercices, et limite
l'exécution à un seul chrono visible à la fois. Le mode Score chrono est
conservé tel quel comme mode du score.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merge de la branche feature/ticket91-wear-os-watch-sync dans develop :
bridge de données partagé, service Android Data Layer, routage des
commandes montre vers les cas d'usage de session, et app compagnon
Wear OS (UX + client bridge).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
file_picker's android/build.gradle guards `apply plugin:
'org.jetbrains.kotlin.android'` behind a runtime AGP-version check that
is false on this project's AGP 9 (it assumes AGP's built-in Kotlin
support is active instead). Flutter's own FlutterPluginUtils only
scans the file's text for that apply statement to decide whether to
auto-apply Kotlin itself, so it is fooled by the same guarded line and
skips applying it too. With android.builtInKotlin=false (needed for
other plugins like audioplayers_android), no Kotlin plugin ever runs
for file_picker, so its Kotlin sources -- including FilePickerPlugin --
never compile, breaking `flutter build apk --release` with:
cannot find symbol: class FilePickerPlugin
Force-apply org.jetbrains.kotlin.android for the file_picker subproject
once AGP's library plugin is present, and pin its Kotlin compile
jvmTarget to 17 (file_picker's own jvmTarget setup is behind the same
dead guard, so it would otherwise default to the running JDK's target
and conflict with the javac target). Verified with a full
`flutter build apk --release`.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- F1: "Sauvegarde locale" panel in Profil (both signed-out/signed-in
states, positioned per UX cadrage), "Exporter mes données" calling
DataExportUseCase.exportAll() then handing the file to the system
share sheet, with the exact UX success/error snackbars.
- F2: "Importer des données" picks a file, previews it, then confirms
with the exact UX dialogs: simplified single-choice when there is no
local data yet, Fusionner/Remplacer tout (with a destructive second
confirmation) otherwise. All typed LocalBackupValidationError cases
are mapped to their dedicated dialog copy, including the active
workout session block.
Thin pass-through to the existing LocalDataBackupRepository.hasAnyUserData()
port, needed by F2 to decide whether the import confirmation can be
simplified per UX cadrage (#84) when the device has no local data yet.
Add Drift-level tests that go through the real codec (export -> encode
-> decode -> import) for both merge and replaceAll modes across two
independent databases, plus a test proving a failure mid-import rolls
back all mutations within the transaction.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Add coverage for invalidFile/incompatibleFormat/corrupted detection,
importFailedNoMutation wrapping of unexpected repository failures, and
missingMediaCount reflecting actual restore/checksum outcomes.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Import result missingMediaCount compared restored assets against the
backup's declared media file list, so an embedded file that failed
sha256 verification was still treated as present. Compute it from the
actually restored files instead.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Lot frontend F1+F2 : composant library_tags.dart (filtre/suggestions de tags), intégration dans exercise_library_screen, program_screen et workout_template_screen (tags + action duplication rapide), tests associés.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Lot backend (tags + duplication) commité et vérifié (110 tests, 1 échec préexistant sans rapport). Lot frontend F1/F2 à venir avant clôture.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Le ticket #82 était resté au statut open malgré le travail terminé (édition manuelle précédente insuffisante) ; clôturé proprement via l'API IdeA.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Refonte de workout_execution_screen.dart cadrée UX+Architect ; résout au passage la dette de tests du ticket #90 (3 échecs préexistants désormais verts).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ticket #92 (ne pas couper la musique avec les chronos de step) validé GO par QA, passé en statut closed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Le son joué aux 3 dernières secondes d'un chrono de step n'interrompt plus la musique de l'utilisateur en cours de lecture.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Métadonnées de suivi IdeA : ticket #82 (statistiques de progression) passé à closed après validation QA GO, ajout des nouveaux tickets #92 et #93 non encore traités.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Lots F1+F2 : écran progression_screen.dart, intégration home/history/navigation, tests associés (193 tests suite complète, 4 échecs préexistants sans rapport confirmés).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Corrige le décodage des timestamps issus des customSelect (secondes vs millisecondes) et le tri des options d'exercice pour privilégier les exercices actifs avant les archivés, avec tie-breakers (ticket #82).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Lots B1+B2+B3 : schéma/domaine, requêtes d'agrégation et ports/use cases pour les statistiques de progression, avec tests associés.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Met à jour les métadonnées IdeA (statut closed, carnets de suivi) suite à
la livraison et au merge sur develop du code des tickets #80 (bibliothèque
de drills basket de démarrage) et #81 (dernière performance / meilleur
score à l'exécution).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Affiche la dernière performance et le meilleur score par exercice
pendant l'exécution de séance (écran d'exécution), ainsi que les
points d'accès associés dans l'accueil, la séance-modèle et
l'historique, en s'appuyant sur ExercisePerformanceReferenceUseCase.
Validé GO par Main : dart analyze propre, 178 tests (4 échecs
préexistants sans rapport, identiques à ceux déjà documentés sur #80).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ajoute la migration Drift v17 (colonne sourceExerciseIdSnapshot sur
workout_history_set_results et workout_history_step_results, index
associés), le port ExercisePerformanceReferenceRepository et son
implémentation Drift, et le use case
ExercisePerformanceReferenceUseCase (dernière performance + meilleur
score par métrique active pour un exercice donné).
Validé GO par Main : dart analyze propre (1 lint mineur de style),
178 tests (4 échecs préexistants sans rapport avec ce lot).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ajoute le badge "Exemple" (example_badge.dart) affiché sur les
exercices/programmes/séances-modèles seedés, le filtrage par catégorie
dans la bibliothèque d'exercices et les états vides dédiés. Préserve
isExample lors de l'édition d'un programme ou d'une séance-modèle
existants (ProgramUseCases/WorkoutTemplateUseCases).
Validé GO par Main : dart analyze propre, 173 tests (4 échecs
préexistants sans rapport avec ce lot).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ajoute la migration Drift v16 (enum ExerciseCategory, champ isExample sur
exercises/programs/workout_templates, table local_seed_metadata), le
contenu seed basket déterministe (21 exercices, 1 programme, 1 séance-
modèle) dans lib/application/starter_content/, les ports
StarterSeedStateRepository/StarterContentRepository et le use case
SeedStarterContentUseCase branché dans AppBootstrap.create().
Validé GO par QA/Main : dart analyze propre, suite complète 167 tests
(4 échecs préexistants sans rapport avec ce lot), 4 nouveaux tests seed
tous verts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Réorganise l'écran d'exécution autour d'une carte "Exercice actif" sous
le compteur SÉRIE X/Y (nom, médias, temps de série, action "Démarrer
l'exercice"). Le timer de série devient un état persistant dédié (plus
un DateTime UI volatile), pause-aware, et "Démarrer l'exercice" lance
en une action tous les chronos qui doivent démarrer en début de série
(série, première étape temps, score chrono si stopwatch).
Implémentation restée non commitée depuis sa réalisation ; QA a validé
les vérifications statiques exécutables en sandbox (dart analyze,
git diff --check). flutter analyze / flutter test restent à relancer
dans un environnement avec cache Flutter SDK accessible.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Rattrapage de l'état runtime IdeA (nouveaux tickets #80-#91, agents
coach/commercial, skills, permissions MCP) resté non commité depuis la
clôture du ticket #79.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fusionne feature/step-chaining-79-qa — analyze propre (mêmes infos
préexistantes), 154/154 tests verts, build APK debug validé. Aucun
bug de production trouvé en QA, couverture de test supplémentaire
uniquement (reprise après kill d'app, enchaînement désactivé).
Clôture le chantier "auto-enchaînement des chronos d'étapes" (#73,
tickets #75 à #79).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>