Commit Graph

203 Commits

Author SHA1 Message Date
53b4957bc6 docs(ideai): mémoire client online, clôture ticket #64, cadrage #65-#70
Ajoute les notes mémoire d'architecture, de philosophie de la couche
online et d'UX pour le client online, clôture le ticket #64, reflète
les tickets #46/#54/#57/#62, ajoute le cadrage des tickets #65 à #70.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 21:25:57 +02:00
e60c8bbdb8 feat(online): session compte, stockage sécurisé et adapter API (ticket #64)
Ajoute l'adapter API distant (infrastructure/remote/auth_api.dart,
http_api_client.dart) et le stockage sécurisé du token d'auth
(infrastructure/security/secure_storage_auth_token_store.dart), câblés
dans app_bootstrap.dart. Étend le modèle Drift (migration
schemaVersion 9→10) et la couche application (ports, use cases,
entités) pour la session de compte. flutter pub get OK (ajout http,
flutter_secure_storage), build_runner OK, dart format appliqué,
analyze propre (mêmes infos préexistantes), 109/109 tests verts,
build APK debug validé. Premier ticket du chantier "Ajouter les
features serveur au client" (#63).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 21:25:49 +02:00
a557708273 merge(main): validation exercices à étapes, persistance et historique (ticket #62)
Fusionne feature/exercise-steps-62-qa — analyze propre (mêmes infos
préexistantes), 103/103 tests verts, build APK debug validé. Corrige
un vrai bug trouvé en QA (suppression d'exercice cascadant à tort
vers les programmes) et le texte de confirmation UI devenu incohérent
avec ce fix. Clôture le chantier "Exercice à plusieurs étapes" (#54,
tickets #56/#58/#59/#60/#61/#62).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:56:42 +02:00
bd2e28490d docs(ideai): met à jour le ticket #61 — chantier exercices à étapes clos
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:56:34 +02:00
b7ba885b07 fix(exercice): suppression d'exercice ne casse plus les programmes (ticket #62)
Corrige ExerciseUseCases.delete() qui cascadait à tort vers les
ProgramExercise référents, violant le pattern snapshot (un exercice
supprimé ne doit jamais affecter les programmes déjà composés). Ajoute
le test de régression associé. Met à jour le texte de confirmation
_confirmDelete dans exercise_library_screen.dart, devenu incohérent
avec ce fix (il affirmait à tort que la suppression retirerait
l'exercice des programmes). Trouvé pendant la QA finale du chantier
"Exercice à plusieurs étapes" (#54). flutter analyze propre (mêmes
infos préexistantes), 103/103 tests verts, build APK debug validé.
Dernier ticket du chantier (#56/#58/#59/#60/#61/#62 tous faits).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:56:28 +02:00
fa3beb05d4 merge(main): plan de séance et historique avec résultats d'étapes (ticket #61)
Fusionne feature/exercise-steps-61-plan-history — pub get OK, dart
format appliqué, analyze propre (mêmes infos préexistantes), 102/102
tests verts, build APK debug validé. Dernier ticket UI du chantier
"Exercice à plusieurs étapes" (#54) — il ne reste que la QA finale
(#62).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:19:14 +02:00
21e0e5b079 docs(ideai): met à jour le ticket #60 après plan de séance et historique
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:19:06 +02:00
8bf4f89276 feat(exercice): plan de séance et historique avec résultats d'étapes (ticket #61)
Affiche le plan de séance et l'historique avec les résultats par
étape sur workout_execution_screen.dart et history_screen.dart.
flutter pub get OK, dart format appliqué (3 fichiers reformatés),
analyze propre (mêmes infos préexistantes), 102/102 tests verts,
build APK debug validé. Dernier ticket UI du chantier "Exercice à
plusieurs étapes" (#54) — il ne reste que la QA finale (#62).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:19:01 +02:00
cdaf45646c merge(main): exécution de séance avec module séquence et bips (ticket #60)
Fusionne feature/exercise-steps-60-execution-ui — pub get OK, analyze
propre (mêmes infos préexistantes + 2 nouvelles
use_build_context_synchronously non bloquantes), 100/100 tests verts,
build APK debug validé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:08:42 +02:00
8ac86c066f fix(exercice): reprise du timer d'étape après restauration de séance (ticket #60)
Relance le timer de l'étape en cours si son état restauré est en
pause, au lieu de rester bloqué en pause après une reprise de séance.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:08:30 +02:00
37fb50e15e docs(ideai): met à jour les tickets #58/#59 après l'exécution avec bips
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:08:05 +02:00
6947cee30c feat(exercice): exécution de séance avec module séquence et bips (ticket #60)
Ajoute le lecteur de bips d'étapes (presentation/exercise_step_audio.dart,
port ExerciseStepAudioCuePlayer injectable en test, jamais le vrai
audioplayers en test) et les fichiers audio associés
(assets/audio/step_countdown_short.wav, step_completion_long.wav).
Câble ActiveExerciseStepUseCases dans app_bootstrap.dart et l'expose à
WorkoutExecutionScreen. Les appels audio réels sont protégés par un
try/catch qui log sans jamais bloquer la progression d'étape. flutter
pub get OK (ajout audioplayers), analyze propre (mêmes infos
préexistantes + 2 nouvelles use_build_context_synchronously, non
bloquantes), 100/100 tests verts, build APK debug validé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:07:56 +02:00
83c87d9a42 merge(main): exécution persistante des étapes et éditeur d'étapes (tickets #58, #59)
Fusionne feature/exercise-steps-58-execution-persistence — pub get
OK, build_runner OK, analyze propre (mêmes infos préexistantes),
93/93 tests verts, build APK debug validé. Tickets #58 (DevBackend)
et #59 (DevFrontend) développés dans le même worktree partagé ;
feature/exercise-steps-59-editor-ui restée vide, jamais divergée.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 19:53:17 +02:00
ae1104ce01 docs(ideai): met à jour les tickets après persistance des étapes et éditeur
Clôture/actualise les tickets #24, #29, #32, #33, #41, #42, #43, #44,
#45, #56, #63 et reflète l'avancement des tickets #58/#59.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 19:53:06 +02:00
ebba22db56 feat(exercice): exécution persistante des étapes et éditeur d'étapes (tickets #58, #59)
Ajoute la persistance de l'exécution par étapes avec résultats par
passage (ports, use cases, entités, modèle Drift avec migration) et
l'éditeur d'exercice avec séquence d'étapes sur
exercise_library_screen.dart. Développés dans le même worktree
partagé par DevBackend et DevFrontend ; commit combiné plutôt que
séparé car les fakes de repository de test corrigés (nouvelles
interfaces #58) touchent plusieurs écrans sans lien avec l'éditeur
lui-même (historique, accueil, exécution, séance-modèle). Corrige au
passage un ListTile sans ancêtre Material dans le nouvel éditeur
d'étapes (Material(type: MaterialType.transparency)). flutter pub get
OK, build_runner OK, analyze propre (mêmes infos préexistantes),
93/93 tests verts, build APK debug validé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 19:52:43 +02:00
4731a257a1 merge(main): modèle domain + Drift pour exercices à étapes (ticket #56)
Fusionne feature/exercise-steps-56-domain-drift — pub get OK,
build_runner OK (migration schemaVersion 7→8), analyze propre (mêmes
8 infos préexistantes), 87/87 tests verts, build APK debug validé.
Premier ticket du chantier "Exercice à plusieurs étapes" (#54).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 19:32:48 +02:00
733b7bb597 docs(ideai): mémoire, sprint et tickets du chantier exercices à étapes
Ajoute les notes mémoire d'architecture et UX pour les exercices à
étapes, un nouveau sprint, clôture le ticket #56 et reflète les
tickets #46/#53, ajoute le cadrage des tickets #57 à #63.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 19:32:33 +02:00
b1182db32e feat(exercice): modèle domain + Drift pour exercices à étapes (ticket #56)
Étend le modèle Drift (tables.dart, app_database.dart/.g.dart,
migration schemaVersion 7→8) et la couche application (entités, use
cases, repositories) pour supporter des exercices composés de
plusieurs étapes. flutter pub get OK, build_runner OK, flutter
analyze propre (mêmes 8 infos préexistantes), 87/87 tests verts,
build APK debug validé. Premier ticket du chantier "Exercice à
plusieurs étapes" (#54).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 19:32:24 +02:00
73d01371d4 merge(main): tests API, contrats OpenAPI et vérification d'intégration (ticket #53)
Fusionne feature/server-53-openapi-tests — dart analyze clean, dart
test 29/29 vert. openapi.yaml vérifié contre les endpoints réels du
serveur. Clôture le chantier serveur (tickets #47 à #53).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 15:56:39 +02:00
80430d6d8a docs(ideai): met à jour le ticket #52 et le ticket #54 — chantier serveur clos
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 15:56:34 +02:00
c1dce3cae7 feat(server): tests API, contrats OpenAPI et vérification d'intégration (ticket #53)
Ajoute la spécification openapi.yaml documentant les 12 endpoints
réels du serveur (health, auth, sync, shares), les tests API auth
(test/auth_api_test.dart couvrant register/login/logout) et la
checklist de vérification d'intégration (docs/integration-checklist.md).
dart analyze clean, dart test 29/29 vert. Dernier ticket du chantier
serveur (#47 à #53), tous terminés.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 15:56:29 +02:00
00c83921c9 merge(main): packaging Docker Compose et push Gitea Registry (ticket #52)
Fusionne feature/server-52-docker-packaging — dart analyze clean,
dart test 24/24 vert, docker compose config valide. Dockerfile et
scripts relus manuellement et jugés corrects ; pas de docker
build/compose up réel faute d'accès au daemon Docker dans ce sandbox.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:40:20 +02:00
68085348d6 docs(ideai): met à jour le ticket #51 après le packaging Docker
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:40:16 +02:00
f03dead3e4 feat(server): packaging Docker Compose et push Gitea Registry (ticket #52)
Ajoute le Dockerfile multi-stage (build dart:stable, runtime
debian:bookworm-slim avec ca-certificates, exécutable AOT compilé), le
docker-compose.yaml (API + Postgres avec healthcheck et
depends_on: service_healthy), .env.example, .dockerignore et les
scripts scripts/docker-entrypoint.sh (migration au démarrage) et
scripts/push-gitea-image.sh (aucun identifiant en dur, mot de passe
via --password-stdin). dart analyze clean, dart test 24/24 vert,
`docker compose config` valide (syntaxe, interpolation de variables,
healthcheck). Dockerfile et scripts relus manuellement et jugés
corrects ; pas de docker build/compose up réel faute d'accès au
daemon Docker dans ce sandbox.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:40:11 +02:00
14e04784ed merge(main): partage ciblé de programmes et séances entre comptes (ticket #51)
Fusionne feature/server-51-sharing — dart analyze clean, dart test
24/24 vert. Use case d'acceptation relu manuellement et jugé correct ;
pas de test de bout en bout contre un vrai PostgreSQL faute d'accès
Docker dans ce sandbox.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:34:19 +02:00
d1b3f21d68 docs(ideai): met à jour sprints et tickets après le partage de programmes/séances
Ajoute un sprint, clôture le ticket #50, ajoute le cadrage du ticket #54.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:34:15 +02:00
db6e84be06 feat(server): partage ciblé de programmes et séances entre comptes (ticket #51)
Ajoute l'endpoint api/share_api.dart, les use cases de partage
(application/share_use_cases.dart) et l'adapter Postgres
(infrastructure/postgres/share_repository.dart). L'acceptation d'un
partage crée une nouvelle ressource synced_resources avec de nouveaux
IDs pour le destinataire, sans jamais modifier la ressource source de
l'émetteur ; gestion des conflits révoqué/déjà répondu. dart pub get
OK, dart analyze clean, dart test 24/24 vert. Use case d'acceptation
relu manuellement et jugé correct ; pas de test de bout en bout contre
un vrai PostgreSQL faute d'accès Docker dans ce sandbox.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:34:09 +02:00
c232bdcec1 merge(main): API de synchronisation incrémentale LWW (ticket #50)
Fusionne feature/server-50-sync-api — dart analyze clean, dart test
15/15 vert. SQL d'upsert LWW atomique relu manuellement et jugé
correct ; pas de test de bout en bout contre un vrai PostgreSQL faute
d'accès Docker dans ce sandbox.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:23:46 +02:00
e63b0185ef docs(ideai): met à jour le ticket #48 après l'API de synchronisation
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:23:42 +02:00
60912ebde4 feat(server): API de synchronisation incrémentale LWW (ticket #50)
Ajoute l'endpoint api/sync_api.dart, les use cases de synchronisation
(application/sync_use_cases.dart) et l'adapter Postgres
(infrastructure/postgres/synced_resource_repository.dart) implémentant
un upsert LWW atomique via CTE (INSERT ... ON CONFLICT ... WHERE
client_updated_at < EXCLUDED.client_updated_at, avec fallback UNION
ALL pour le cas ignoré). dart pub get OK, dart analyze clean, dart
test 15/15 vert. SQL d'upsert relu manuellement et jugé correct ; pas
de test de bout en bout contre un vrai PostgreSQL faute d'accès
Docker dans ce sandbox.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:23:36 +02:00
66d5c9a173 merge(main): auth comptes utilisateurs et tokens API (ticket #48)
Fusionne feature/server-48-auth — dart analyze clean, dart test
10/10 vert (test PostgreSQL réel skip faute de Docker disponible).
Endpoints HTTP register/login/logout non exercés de bout en bout
faute de vrai PostgreSQL local ; logique d'auth et middleware validés
via repositories fake en mémoire.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:15:48 +02:00
d6ca54174f docs(ideai): met à jour les tickets #47/#49 après l'auth serveur
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:15:40 +02:00
7b122d03da feat(server): auth comptes utilisateurs et tokens API (ticket #48)
Ajoute la couche application (ports, use cases), les entités du
domaine, l'endpoint api/auth_api.dart (register/login/logout) et son
câblage dans le router, le hashing de mot de passe et le service de
token (infrastructure/security), et l'adapter Postgres des repositories
d'auth s'appuyant sur la table users du ticket #49. dart pub get OK,
dart analyze clean, dart test 10/10 vert (test PostgreSQL réel skip
faute de Docker disponible dans ce sandbox). Logique d'auth et
middleware testés via repositories fake en mémoire ; les endpoints
HTTP register/login/logout n'ont pas pu être exercés de bout en bout
faute d'accès à un vrai PostgreSQL local.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:15:34 +02:00
c10e8f9085 merge(main): schéma PostgreSQL sync-ready (ticket #49)
Fusionne feature/server-49-postgres-schema — dart analyze clean, dart
test vert (test PostgreSQL réel skip faute de Docker disponible ; SQL
de migration revu manuellement). Posé avant #48 pour que son adapter
d'auth s'appuie sur la table users déjà en place.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:05:28 +02:00
79d994bdd7 feat(server): schéma PostgreSQL sync-ready (ticket #49)
Ajoute la migration initiale (migrations/0001_initial_schema.sql,
incluant la table users nécessaire à l'adapter d'auth du ticket #48),
le runner de migration (bin/migrate.dart) et l'accès Postgres
(infrastructure/postgres/postgres_database.dart). dart pub get OK,
dart analyze clean, dart test vert (le test PostgreSQL réel est skip
faute de TEST_DATABASE_URL/Docker disponible dans ce sandbox ; SQL de
migration revu manuellement).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 10:05:24 +02:00
e06de40428 merge(main): scaffolding du serveur Dart headless hexagonal (ticket #47)
Fusionne feature/server-47-scaffolding — dart analyze clean, dart
test 1/1 vert, serveur démarré et GET /health validé (200
{"status":"ok"}). Premier ticket du chantier serveur (#47 à #53).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 00:04:44 +02:00
c3158f665e docs(ideai): mémoire architecture serveur, tickets #44/#45 en QA, cadrage #47-#53
Ajoute la note mémoire d'architecture serveur (sync/sharing), passe les
tickets #44/#45 en QA, ajoute le cadrage du chantier serveur (tickets
#47 à #53).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 00:04:40 +02:00
cc1388cc9e feat(server): scaffolding du serveur Dart headless hexagonal (ticket #47)
Ajoute le nouveau paquet server/ (architecture hexagonale : api,
domain, application, infrastructure/postgres, infrastructure/security,
migrations, scripts) avec un premier endpoint GET /health. dart pub
get OK, dart analyze clean, dart test 1/1 vert, serveur démarré
manuellement et validé (GET /health -> 200 {"status":"ok"}).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 00:04:34 +02:00
8d9d4f0cd3 merge(main): score par défaut à 0 et affichage des répétitions en séance (tickets #44, #45)
Fusionne feature/bugsprint-score-zero-reps-display — analyze propre
(mêmes 8 infos préexistantes), 79/79 tests verts, build APK debug
validé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 22:36:03 +02:00
80e6f8558e docs(ideai): passe les tickets #41/#42/#43 en QA
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 22:35:59 +02:00
1aa2304328 fix(exercice): score par défaut à 0 et affichage des répétitions en séance (tickets #44, #45)
Autorise un score par défaut à 0 (#44) et corrige l'affichage des
répétitions à 0 pendant l'exécution au lieu de la vraie cible (#45),
sur exercise_library_screen.dart et workout_execution_screen.dart,
avec les ajustements domain/use cases associés. flutter analyze
propre (mêmes 8 infos préexistantes), 79/79 tests verts, build APK
debug validé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 22:35:52 +02:00
d3b93cb131 merge(main): correctifs carrousel de médias et chrono du score (tickets #41, #42, #43)
Fusionne feature/bugsprint-medias-chrono — analyze propre, 77/77
tests verts (plus aucun hang), pub get résolu avec video_player 2.13.0,
build APK validé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 22:29:02 +02:00
1c5f2d50ee docs(ideai): met à jour les tickets après le correctif médias/chrono
Clôture les tickets #41, #42, #43, ajoute le cadrage des tickets
#44/#45/#46.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 22:28:58 +02:00
3605b3d99a fix(execution): carrousel de médias et chrono du score (tickets #41, #42, #43)
Corrige l'affichage des images (#41) et de la vidéo (#42) dans le
carrousel de médias, et le format du chrono de score qui n'affichait
que les secondes (#43) sur workout_execution_screen.dart. Ajoute la
dépendance video_player (2.13.0) pour la lecture vidéo. Ajuste
home_screen.dart, history_screen.dart et workout_template_screen.dart
en conséquence. flutter analyze propre, flutter test 77/77 vert (plus
aucun hang), pub get résolu.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 22:28:52 +02:00
1489db6a18 merge(main): affichage du chrono de score dans le plan et l'historique (ticket #28)
Fusionne feature/#28-affichage-chrono-plan-historique — analyze
propre, 77/77 tests verts, build APK debug validé. Dernier ticket du
backlog, clôture aussi le ticket parent #18 (score chronométré).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 14:40:49 +02:00
fef5c78b0d docs(ideai): met à jour les tickets #18/#28 — score chronométré clos, backlog terminé
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 14:40:43 +02:00
1a315d586f feat(ui): affichage du chrono de score dans le plan et l'historique (ticket #28)
Affiche le chrono du score chronométré sur workout_execution_screen.dart
(plan de séance) et history_screen.dart (historique). flutter analyze
propre, 77/77 tests verts, build APK debug validé. Dernier ticket du
backlog — clôture aussi le ticket parent #18 (score chronométré).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 14:40:37 +02:00
a1b27fdcbc merge(main): chrono du score chronométré en exécution (ticket #27)
Fusionne feature/#27-chrono-score-execution — analyze propre, 75/75
tests verts, build APK debug validé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 14:34:44 +02:00
bfca201f7a docs(ideai): met à jour le ticket #27 après le chrono en exécution
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 14:34:40 +02:00
cdcb0beead feat(exécution): chrono du score chronométré pendant la séance (ticket #27)
Ajoute le chrono du score chronométré (fondation domain/config des
tickets #25/#26) sur workout_execution_screen.dart, avec les use
cases associés. flutter analyze propre, 75/75 tests verts, build APK
debug validé.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 14:34:36 +02:00