Repository navigation
feat: mise en œuvre des six améliorations prévues (mode guidé, historique, statistiques, partage, rappels, FR/EN) - #4
Conversation
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
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
|
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, Cause. Le test des rappels ouvrait la page avec Correction (2142c76). Le test utilise maintenant un fragment sans rapport avec le partage ( 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
Résumé
Mise en œuvre des six « Améliorations possibles » de
doc/ARCHITECTURE.md, selon le plandoc/PLAN-AMELIORATIONS.md(conception, ordre des vagues, règles communes, bilan).stepAt/catchUp), donc ils restent synchrones même écran éteint.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.#r=inh,hold1,exh,hold2,total, partagé vianavigator.shareou le presse-papiers. À l'ouverture, les valeurs sont validées, bornées puis appliquées..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).respiration-lang, changement immédiat même en séance. Les dates, décimales, pluriels, libellés ARIA et le.icssuivent la langue.Fondations communes : événements de séance
on()/emit(), zone de statut accessiblesay(), emplacements réservés par fonctionnalité, etnpm 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
playwright.config.jsfixe la localefr-FR, car les tests existants décrivent l'interface française.tests/internationalisation.spec.jscouvre l'anglais.Limites connues
manifest.jsonreste en français.🤖 Generated with Claude Code
https://claude.ai/code/session_01MxgyvWNqEsK9hqWnGozdWW