Skip to content

feat: mise en œuvre des six améliorations prévues (mode guidé, historique, statistiques, partage, rappels, FR/EN) - #4

Merged
felkhayer merged 15 commits into
mainfrom
ccr-dae162bc-xstxqb
Oct 30, 2026
Merged

felkhayer merged 15 commits into
mainfrom
ccr-dae162bc-xstxqb

Conversation

@felkhayer

@felkhayer felkhayer commented Oct 30, 2026 •

Copy link
Copy Markdown
Owner

Résumé

Mise en œuvre des six « Améliorations possibles » de doc/ARCHITECTURE.md, selon le plan doc/PLAN-AMELIORATIONS.md (conception, ordre des vagues, règles communes, bilan).

Fonctionnalité Ce qui change
Mode guidé Séquences Détente, Endormissement et Concentration, qui enchaînent plusieurs rythmes. Le changement de rythme a lieu en fin de cycle. L'affichage et le son programmé à l'avance utilisent les mêmes fonctions (stepAt / catchUp), donc ils restent synchrones même écran éteint.
Historique respiration-history (500 séances au plus, séances d'au moins 30 s). Liste des 10 dernières séances, effacement après confirmation. Une séance guidée est affichée sous le nom de sa séquence.
Statistiques Séances, minutes, série de jours consécutifs, 7 derniers jours, et graphique SVG accessible sur 14 jours. Les jours sont comptés en heure locale, y compris au changement d'heure.
Partage Lien #r=inh,hold1,exh,hold2,total, partagé via navigator.share ou le presse-papiers. À l'ouverture, les valeurs sont validées, bornées puis appliquées.
Rappels Fichier agenda .ics (RFC 5545) avec un événement quotidien et une alarme. Ce choix remplace les notifications, irréalisables de façon fiable sans serveur (justification dans ARCHITECTURE).
Internationalisation Français et anglais : détection automatique, préférence respiration-lang, changement immédiat même en séance. Les dates, décimales, pluriels, libellés ARIA et le .ics suivent la langue.

Fondations communes : événements de séance on() / emit(), zone de statut accessible say(), emplacements réservés par fonctionnalité, et npm run test:mutants-check, qui vérifie instantanément que chaque mutant trouve encore son texte dans le code.

Correction d'un défaut existant

À la fin automatique d'une séance, le cycle qui se terminait pile à l'arrêt n'était pas compté (1 min en 4 – 6 affichait 5 cycles au lieu de 6). Après un écran éteint, le compteur gardait même la valeur d'avant la mise en veille. frame() rattrape désormais les cycles jusqu'à l'instant de fin, à l'écran comme dans l'historique (a898d2b).

Tests

  • Suite Playwright : 126 → 258 tests, tous verts.
  • Mutants : 147 → 209, tous valides.
  • Campagne finale sur le code fusionné : les 59 mutants des nouvelles fonctionnalités sont tous détectés. Un test des rappels, rendu inopérant par le partage, a été corrigé (voir le commentaire de la PR). Les 6 mutants de la correction des cycles (3 nouveaux, 3 réécrits) sont détectés.
  • playwright.config.js fixe la locale fr-FR, car les tests existants décrivent l'interface française. tests/internationalisation.spec.js couvre l'anglais.

Limites connues

  • Choisir une séquence guidée pendant une séance l'applique selon le temps déjà écoulé, et remplace la durée réglée.
  • manifest.json reste en français.

🤖 Generated with Claude Code

https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW

claude added 14 commits October 30, 2026 09:27
Plan de conception (doc/PLAN-AMELIORATIONS.md), événements de séance
on/emit, zone de statut accessible, ancres par fonctionnalité et
vérification rapide des mutants (npm run test:mutants-check).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW
Le bouton « Partager ces réglages » construit un lien <page>#r=inh,hold1,exh,hold2,total
(ex. #r=4,0,6,0,5), partagé par navigator.share ou copié dans le presse-papiers.
À l'ouverture d'un lien #r=…, les cinq valeurs sont validées, arrondies au pas du champ
et bornées, puis appliquées et enregistrées ; le fragment est ensuite retiré de l'adresse.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW
Section repliable « Rappel quotidien » : heure mémorisée (respiration-reminder, 08:00 par défaut)
et téléchargement de respirer-rappel.ics (VEVENT quotidien, heure locale flottante, VALARM).
Tests, 10 mutants et documentation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW
Enregistre chaque séance d'au moins 30 s dans le stockage local
(respiration-history, 500 entrées au plus) via on('start') / on('stop'),
et affiche les 10 dernières dans une section repliable « Historique »
avec effacement confirmé. loadHistory() renvoie toujours un tableau valide
et renderHistory() est le point de rafraîchissement pour les statistiques.

Tests : tests/historique.spec.js (24 tests), 10 mutants hist-*.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW
…ment, Concentration)

- Fonction pure stepAt() : l'étape d'un cycle dépend de son instant de début ; le rythme change
  à la fin du premier cycle qui atteint ou dépasse la limite, la séance dure le total de la séquence.
- catchUp() (sans effet de bord) partagé par frame() et schedule() : l'affichage et le son
  programmé à l'avance changent d'étape aux mêmes instants, même après un gel de l'affichage.
- phases(r) accepte un rythme ; cycleList() donne les phases d'un cycle selon l'étape.
- Choix mémorisé (cfg.guide, absent hors mode guidé) ; préréglage, bouton − / + ou second appui
  quittent le mode guidé ; étape affichée (« Étape 2 / 3 · 4 – 6 », aria-live).
- Tests : tests/mode-guide.spec.js (16 tests), 10 mutants, tous détectés ; mutants existants
  adaptés au nouveau texte de frame() / phases().
- Documentation : README, tests/README.md, ARCHITECTURE.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW
… de 14 jours)

Bloc « Progression » dans le <details> de l'historique : 4 indicateurs et graphique SVG
accessible. Jours identifiés par (année, mois, jour) locaux, donc corrects aux changements
d'heure. Recalcul à chaque renderHistory() et à l'ouverture du <details>.
Tests statistiques.spec.js, 9 mutants stat-*.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW
Dictionnaires I18N.fr / I18N.en et t(clé, paramètres) avec interpolation et
pluriels ; langue mémorisée dans la clé dédiée respiration-lang, sinon détectée
via navigator.language ; sélecteur FR / EN dans les réglages, appliqué
immédiatement (même en séance) via l'événement 'lang'. Dates (Intl), séparateur
décimal, messages, confirm(), partage et fichier .ics suivent la langue.
Le format #r=… et les clés de stockage sont inchangés ; manifest.json reste en
français (limite documentée).

Tests : tests/internationalisation.spec.js (27 tests), locale fr-FR fixée dans
playwright.config.js ; 18 mutants réécrits, 10 mutants i18n ajoutés.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW
… reste dans l'adresse

Depuis le partage, un lien #r=… est retiré au chargement : le test des rappels
ne vérifiait plus rien et le mutant ics-url-hash survivait.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW

Copy link
Copy Markdown
Owner Author

Campagne de mutation finale sur le code fusionné

J'ai relancé les 59 mutants des nouvelles fonctionnalités (mode guidé, partage, historique, statistiques, rappels, i18n) sur le code fusionné : 58 sont détectés et 1 survivait, ics-url-hash.

Cause. Le test des rappels ouvrait la page avec #r=4,0,6,0,5 pour vérifier que l'URL du .ics ne contient pas de fragment. Or, depuis la fusion du partage, un lien #r=… est retiré de l'adresse dès le chargement. Le test n'exerçait donc plus ce cas. L'application elle-même n'avait pas de défaut.

Correction (2142c76). Le test utilise maintenant un fragment sans rapport avec le partage (#autre), qui reste dans l'adresse. Il vérifie aussi que ce fragment est bien présent. ics-url-hash et ics-no-fold sont détectés, et il n'y a plus aucun survivant.


Generated by Claude Code

À la fin automatique, frame() arrêtait la séance avant de rattraper les
phases écoulées : le dernier cycle n'était pas compté (5 au lieu de 6 pour
1 min en 4 – 6), et après un écran éteint le compteur gardait sa valeur
d'avant la veille. Les cycles sont désormais rattrapés jusqu'à l'instant
de fin, à l'écran comme dans l'historique.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW
@felkhayer
felkhayer merged commit df69b11 into main Oct 30, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants