chore: nettoyage racine du projet
- Suppression fichiers orphelins (task_plan, findings, progress, CHANGELOG) - Déplacement algorithmes.md → docs/algorithmes.md - CHANGELOG supprimé (doublon du README) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
3e485fd09b
commit
be2f7a4b9b
90
CHANGELOG.md
90
CHANGELOG.md
@ -1,90 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
|
|
||||||
## v1.1.6
|
|
||||||
|
|
||||||
### Mise à jour automatique
|
|
||||||
|
|
||||||
- **Migration electron-updater** : remplacement du système custom (download HTTP + script batch) par `electron-updater` (generic provider)
|
|
||||||
- Vérification sha512 automatique des mises à jour
|
|
||||||
- Installation NSIS native (plus de script batch hack)
|
|
||||||
- Restart automatique après installation
|
|
||||||
- Code simplifié (~60 lignes vs ~200)
|
|
||||||
- Compatible Gitea : découverte via API + `latest.yml` uploadé en asset de release
|
|
||||||
- Nouveau workflow de release : uploader le `.exe` ET `latest.yml` sur Gitea
|
|
||||||
|
|
||||||
### Architecture
|
|
||||||
|
|
||||||
- Migration complète vers une architecture DDD hexagonale (Vite + TypeScript)
|
|
||||||
- Couche **domain** : entités, value objects, services purs, ports
|
|
||||||
- Couche **application** : CQRS (CommandBus / QueryBus), handlers
|
|
||||||
- Couche **infrastructure** : LocalStorage, Electron notifications, WebAudio alarm
|
|
||||||
- Couche **presentation** : composants, helpers, UIState
|
|
||||||
- Suppression du monolithe legacy, Vite est désormais le seul build
|
|
||||||
- Setup Vitest avec alias de chemins (`@domain`, `@application`, etc.)
|
|
||||||
|
|
||||||
### Nouvelles fonctionnalités
|
|
||||||
|
|
||||||
- **Timer** : session robuste (pause/reprise fiable), alarme unique, ETA niveau 200
|
|
||||||
- **Accouplement** : images des dragodindes (66 races en base64), barre de recherche par nom, filtres par génération (AND logique)
|
|
||||||
- **Réapprovisionnement** : barre de recherche, sauvegarde de workflow depuis les résultats de calcul
|
|
||||||
- **Inventaire** : barre de recherche, simulation proportionnelle multi-générations, bouton sauvegarder le workflow
|
|
||||||
- **Workflows** : filtre par génération, barre de recherche sur les noms
|
|
||||||
- **Mises à jour en temps réel** : barres de progression du workflow, compteur DD en stock de l'inventaire — se mettent à jour pendant la frappe
|
|
||||||
|
|
||||||
### Corrections de bugs
|
|
||||||
|
|
||||||
- **Recette Ebène** : les parents étaient inversés (Amande et Rousse → corrigé en Amande et Dorée + Dorée et Rousse)
|
|
||||||
- **Simulation inventaire** : l'algorithme glouton épuisait tout le stock pour le premier croisement. Remplacé par une allocation proportionnelle dynamique (chaque parent est divisé équitablement entre les croisements qui l'utilisent)
|
|
||||||
- **Dirty flag** sur tous les écrans (accouplement, réappro, inventaire, workflows) : le rAF loop à 60fps reconstruisait le DOM à chaque frame, détruisant les event listeners et empêchant les clics/inputs de fonctionner
|
|
||||||
- **Persistance inventaire** : `update-settings` ne gérait pas le champ `inventaire` — le stock était perdu à chaque changement d'écran
|
|
||||||
- **Chargement inventaire** : `get-inventaire` retournait un résultat de simulation au lieu du stock brut — l'écran se chargeait avec des données corrompues
|
|
||||||
- **Comportement focus/blur des inputs** : uniformisé sur tous les écrans — focus vide le champ, blur sans valeur restaure l'ancienne, blur avec valeur applique la nouvelle
|
|
||||||
- **ReapproView** : constructeur corrigé (commandBus manquant), bouton save-workflow branché sur la commande
|
|
||||||
- **CSP** : ajout de `img-src 'self' data:` pour les images base64 des dragodindes
|
|
||||||
- **Inventaire** : import `RACES_DATA` manquant + type `CalcCrossing` → `SimulationCrossing` — l'écran ne s'affichait plus
|
|
||||||
- **Baffeur/Caresseur** : exclusion mutuelle (activer l'un désactive l'autre), bouton opposé grisé dans l'UI, contrainte de signe sur la cible sérénité (négatif pour baffeur, positif pour caresseur) — corrige le timer qui affichait "terminé" avec des cibles positives + baffeur
|
|
||||||
- **Paramètres** : écran refait à l'identique du monolithe (boutons compacts avec emojis, modal ntfy avec QR codes et génération automatique du topic)
|
|
||||||
- **Sons d'alarme** : fréquences et types d'oscillateurs corrigés pour correspondre au monolithe (arpège 440/554/659/880, fanfare triangle 6 notes, cloche 440/880/1320/1760, pulsation 5 pulses)
|
|
||||||
- **Bouton Test son** : ne fonctionnait pas (passait par IPC sans écouteur) — joue maintenant directement via WebAudio
|
|
||||||
- **CSP** : ajout de `img-src https://api.qrserver.com` pour les QR codes ntfy
|
|
||||||
|
|
||||||
### Tests
|
|
||||||
|
|
||||||
- Tests unitaires pour `StockSimulator` (simulation proportionnelle : 13 cas)
|
|
||||||
- Tests unitaires pour `SaveWorkflow` et `UpdateSettings` avec inventaire
|
|
||||||
- Tests de régression pour la simulation inventaire (scénario du monolithe)
|
|
||||||
- Test de la recette Ebène corrigée
|
|
||||||
- Mise à jour des tests `GetInventaire` (stock brut au lieu de résultat calculé)
|
|
||||||
|
|
||||||
### Refonte graphique "Obsidienne" (MD3)
|
|
||||||
|
|
||||||
- **Design system Obsidienne** : glassmorphism, tokens Material Design 3 (primary, secondary, surface, outline…), polices Manrope/Inter/Plus Jakarta Sans
|
|
||||||
- **Nouveau fichier `obsidienne.css`** (~2100 lignes) : design MD3 pour tous les composants
|
|
||||||
- **Migration emojis → Material Symbols Outlined** : toutes les icônes (stats, navigation, actions)
|
|
||||||
- **Variables CSS MD3** : 37 tokens ajoutés dans `variables.css` (`--md-primary`, `--md-surface-container`, etc.)
|
|
||||||
- **Sidebar** : refonte complète avec logo Obsidienne, sections organisées (Principal, Enclos, Outils, Paramètres), icônes Material Symbols, pastille de statut timer, version dans le footer — ouvert par défaut
|
|
||||||
- **App Shell** : nouveau layout `app-shell` (sidebar + main-area), header avec hamburger, suppression de l'overlay sidebar
|
|
||||||
- **Dashboard** : grille KPI (bébés, DD actives, couples, taux de réussite, races), bouton reset stats intégré, aperçu enclos
|
|
||||||
- **EnclosView** : barres de jauge visuelles avec gradient par tier, bouton timer Material (DÉMARRER/PAUSE/REPRENDRE), zone "Alarme dans" réorganisée, bouton reset timer ajouté
|
|
||||||
- **DragodindeCard** : stats avec icônes Material, jauge XP restructurée avec niveau + % + ETA
|
|
||||||
- **Accouplement** : refonte de wizard 3 étapes → layout single-page (Parent 1 | Coeur+inputs | Parent 2 + grille de races en dessous), glassmorphism, chips génération pill, preview du bébé au centre
|
|
||||||
- **UpdateBanner** : aligné sur le nouveau design MD3
|
|
||||||
- **Drag & drop accouplement** : les cartes de race sont glissables vers les zones Parent 1 / Parent 2, avec feedback visuel (halo violet), vérification de compatibilité partenaire au drop
|
|
||||||
- **Numérotation smart des enclos** : la création comble les trous (supprimer Enclos 2 puis créer → "Enclos 2" au lieu de "Enclos N+1")
|
|
||||||
- **Icône Windows native** : migration `icon.png` → `icon.ico` pour la fenêtre et la tray
|
|
||||||
- **10 tests de régression `level-target-timer`** : vérifient que `levelTarget` affecte correctement le countdown mangeoire, `enclosGlobalState`, `calcLevelEtaLive`, et le flag `done`
|
|
||||||
- **Auto-scroll drag & drop** : le conteneur remonte automatiquement quand on drag une race vers le haut de l'écran
|
|
||||||
- **Correction scroll petit écran** : compensation du zoom CSS pour que le scroll atteigne le bas de la grille
|
|
||||||
- Retrait des labels "MÂLE REQUIS" / "FEMELLE REQUISE" des panneaux parent
|
|
||||||
|
|
||||||
## v1.1.5
|
|
||||||
|
|
||||||
- Ajout de nouvelles features.
|
|
||||||
|
|
||||||
## v1.1.4
|
|
||||||
|
|
||||||
- Ajout de nouvelles features et correction de bugs.
|
|
||||||
|
|
||||||
## v1.1.3
|
|
||||||
|
|
||||||
- Correctif de bug mineur + features.
|
|
||||||
@ -7,7 +7,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|||||||
- **Toujours répondre et écrire en français**
|
- **Toujours répondre et écrire en français**
|
||||||
- **Ne jamais modifier les fichiers de tests sans le signaler explicitement** à l'utilisateur avant de le faire
|
- **Ne jamais modifier les fichiers de tests sans le signaler explicitement** à l'utilisateur avant de le faire
|
||||||
- **Toujours écrire des tests** (unitaires + fonctionnels/régression) lors de toute correction de bug ou ajout de feature — les tests font partie de la livraison, pas une étape optionnelle
|
- **Toujours écrire des tests** (unitaires + fonctionnels/régression) lors de toute correction de bug ou ajout de feature — les tests font partie de la livraison, pas une étape optionnelle
|
||||||
- **Toujours mettre à jour `algorithmes.md`** quand un algorithme ou une formule de calcul change
|
- **Toujours mettre à jour `docs/algorithmes.md`** quand un algorithme ou une formule de calcul change
|
||||||
- **Ne jamais utiliser de taux fixe pour les jauges** — toujours utiliser `gainedIn` / `timeToGain` avec traversée des tiers (erreur historique du monolithe)
|
- **Ne jamais utiliser de taux fixe pour les jauges** — toujours utiliser `gainedIn` / `timeToGain` avec traversée des tiers (erreur historique du monolithe)
|
||||||
- **Signaler explicitement** tout changement qui touche aux snapshots du timer (`snapGauges`, `snapStats`, `gaugeRecharges`) car cela peut affecter tous les calculs en cours de session
|
- **Signaler explicitement** tout changement qui touche aux snapshots du timer (`snapGauges`, `snapStats`, `gaugeRecharges`) car cela peut affecter tous les calculs en cours de session
|
||||||
- **Les tests ne tournent pas en WSL** — toujours rappeler à l'utilisateur de lancer `npm test` depuis un terminal Windows
|
- **Les tests ne tournent pas en WSL** — toujours rappeler à l'utilisateur de lancer `npm test` depuis un terminal Windows
|
||||||
|
|||||||
28
findings.md
28
findings.md
@ -1,28 +0,0 @@
|
|||||||
# Findings — Audit technique
|
|
||||||
|
|
||||||
## Variables CSS existantes (lignes 9-14)
|
|
||||||
```
|
|
||||||
--bg:#0b0b14 --bg2:#111120 --bg3:#181828 --bg4:#20203a
|
|
||||||
--border:#2a2a45 --text:#dddaf8 --muted:#6868a0
|
|
||||||
--ser:#c060ff --end:#f0bf30 --mat:#28c8f0 --amour:#ff5070 --xp:#ffa040
|
|
||||||
--ok:#28e888 --warn:#ff9820 --r:10px
|
|
||||||
```
|
|
||||||
La majorité du CSS utilise déjà `var()`, mais il y a ~320 occurrences de couleurs inline dans le JS (rgb/rgba dans les templates littéraux). Les couleurs de jauges (--ser, --end, etc.) devront rester saturées même en mode clair.
|
|
||||||
|
|
||||||
## Progression enclos — données disponibles
|
|
||||||
`enclosGlobalState(enc)` retourne `{globalMax, allDone, started, el, ddDone}`.
|
|
||||||
- `ddDone / enc.dragodindes.length` = % progression simple
|
|
||||||
- Fonctionne déjà, juste pas affiché visuellement sur les tabs
|
|
||||||
|
|
||||||
## Timer pause — détection retard
|
|
||||||
- `enc.timer.pausedAt` = timestamp de mise en pause
|
|
||||||
- `Date.now() - enc.timer.pausedAt` = durée de pause en ms
|
|
||||||
- Seuil suggéré : 5 minutes (300 000 ms)
|
|
||||||
|
|
||||||
## Raccourcis clavier
|
|
||||||
- Aucun listener keyboard existant
|
|
||||||
- Attention aux inputs focus : vérifier `document.activeElement.tagName !== 'INPUT'`
|
|
||||||
|
|
||||||
## Animations
|
|
||||||
- Transitions CSS existent sur tabs, gauges, pills (partielles)
|
|
||||||
- Aucune transition de contenu (#enclos-content) lors du changement d'onglet
|
|
||||||
12
progress.md
12
progress.md
@ -1,12 +0,0 @@
|
|||||||
# Progress Log
|
|
||||||
|
|
||||||
## Session 2026-03-26
|
|
||||||
- [x] Audit technique terminé
|
|
||||||
- [x] Plan rédigé et soumis à validation
|
|
||||||
- [ ] Phase 1.1 — Tooltips pills
|
|
||||||
- [ ] Phase 1.2 — Indication retard
|
|
||||||
- [ ] Phase 2.1 — Barre progression tabs
|
|
||||||
- [ ] Phase 2.2 — Animations transition
|
|
||||||
- [ ] Phase 4.1 — Raccourcis clavier
|
|
||||||
- [ ] Phase 3.1 — Thème clair/sombre
|
|
||||||
- [ ] Phase 5.1 — Planificateur journalier
|
|
||||||
114
task_plan.md
114
task_plan.md
@ -1,114 +0,0 @@
|
|||||||
# Plan — Polish UI & Features v1.2.0
|
|
||||||
|
|
||||||
## Vue d'ensemble
|
|
||||||
7 améliorations validées par l'utilisateur pour le Minuteur Dragodinde.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Phase 1 — Fondations visuelles (rapide, 0 risque)
|
|
||||||
|
|
||||||
### 1.1 Tooltips sur les pills de stats
|
|
||||||
- **Quoi** : Ajouter un `title="Sérénité"`, `title="Endurance"` etc. sur chaque pill
|
|
||||||
- **Impact** : Ligne ~1654 (PILL_DEFS forEach) — ajouter un champ `label` et l'injecter en `title=`
|
|
||||||
- **Complexité** : Très faible (~5 min)
|
|
||||||
- **Risque** : Aucun
|
|
||||||
|
|
||||||
### 1.2 Indication visuelle "en retard" (pause longue)
|
|
||||||
- **Quoi** : Si un timer est en pause depuis > 5 min, colorer le tab en orange/rouge
|
|
||||||
- **Impact** :
|
|
||||||
- Lignes 1386, 1985 (updateTabDots) — ajouter classe `.paused-long`
|
|
||||||
- Détection : `enc.timer.pausedAt && (Date.now() - enc.timer.pausedAt) > 300000`
|
|
||||||
- CSS : nouveau style `.tab.paused-long`
|
|
||||||
- **Complexité** : Faible (~15 min)
|
|
||||||
- **Risque** : Aucun
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Phase 2 — Barre de progression & animations (~1h)
|
|
||||||
|
|
||||||
### 2.1 Barre de progression sous chaque tab d'enclos
|
|
||||||
- **Quoi** : Fine barre colorée (3-4px) sous chaque onglet montrant le % d'avancement global
|
|
||||||
- **Impact** :
|
|
||||||
- Lignes 1341-1420 (renderTabs) — ajouter un `<div class="tab-progress">` dans chaque tab
|
|
||||||
- Lignes 1981-1986 (updateTabDots) — mettre à jour la largeur via `gel()`
|
|
||||||
- `enclosGlobalState()` fournit déjà `globalMax`, `allDone`, `ddDone`
|
|
||||||
- Calcul % : `ddDone / enc.dragodindes.length` ou basé sur le temps écoulé vs totalSec
|
|
||||||
- CSS : `.tab-progress { height:3px; background:var(--ok); transition:width .5s }`
|
|
||||||
- **Complexité** : Moyenne (~30 min)
|
|
||||||
- **Risque** : Faible — touche le rendu des tabs mais pas la logique
|
|
||||||
|
|
||||||
### 2.2 Animations de transition entre onglets
|
|
||||||
- **Quoi** : Fade-in quand on switch de tab (opacity 0→1)
|
|
||||||
- **Impact** :
|
|
||||||
- Ligne 40 : CSS `.enclos-content` — ajouter `transition: opacity .2s`
|
|
||||||
- Ligne 1465 (renderContent) — set opacity 0 avant innerHTML, puis 1 après un rAF
|
|
||||||
- Alternative plus simple : classe `.fade-in` avec animation CSS
|
|
||||||
- **Complexité** : Faible (~20 min)
|
|
||||||
- **Risque** : Faible — purement visuel, pas de logique métier
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Phase 3 — Thème clair/sombre (~1h30)
|
|
||||||
|
|
||||||
### 3.1 Système de thème
|
|
||||||
- **Quoi** : Toggle dans le header pour basculer entre dark (actuel) et light
|
|
||||||
- **Impact** :
|
|
||||||
- Lignes 9-14 : Dupliquer les variables dans `[data-theme="light"]` avec des couleurs claires
|
|
||||||
- ~320 occurrences de couleurs dans le fichier, MAIS la majorité utilise déjà `var(--xxx)`
|
|
||||||
- **Problème principal** : les couleurs inline dans le JS (ex: `style="color:rgb(192,96,255)"`) ne changent PAS avec les variables CSS
|
|
||||||
- Il faudra auditer les styles inline dans renderDDs, renderDashboard, etc.
|
|
||||||
- Sauvegarde du choix dans `S.theme` (persisté via save())
|
|
||||||
- Toggle : bouton 🌙/☀ dans le header
|
|
||||||
- **Complexité** : Moyenne-élevée (~1h30)
|
|
||||||
- **Risque** : Moyen — beaucoup de couleurs inline à vérifier, risque d'oublis visuels
|
|
||||||
- **Effet de bord** : Les couleurs des jauges (--ser, --end, --mat, --amour, --xp) doivent rester lisibles sur fond clair
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Phase 4 — Raccourcis clavier (~30 min)
|
|
||||||
|
|
||||||
### 4.1 Raccourcis globaux
|
|
||||||
- **Quoi** :
|
|
||||||
- `Espace` : Play/Pause le timer de l'enclos actif
|
|
||||||
- `1-6` : Switch vers l'enclos 1 à 6
|
|
||||||
- `D` : Dashboard
|
|
||||||
- `N` : Ajouter une DD dans l'enclos actif
|
|
||||||
- **Impact** :
|
|
||||||
- Ajouter un `document.addEventListener('keydown', ...)` en fin de fichier
|
|
||||||
- Vérifier que `document.activeElement` n'est pas un input (sinon les raccourcis interfèrent avec la saisie)
|
|
||||||
- **Complexité** : Faible (~30 min)
|
|
||||||
- **Risque** : Moyen — doit ignorer les frappes quand un input est focus
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Phase 5 — Planificateur journalier (~2h)
|
|
||||||
|
|
||||||
### 5.1 Objectifs du jour
|
|
||||||
- **Quoi** : Nouvel onglet "Objectifs" où l'utilisateur définit ce qu'il veut accomplir aujourd'hui
|
|
||||||
- Ex: "Monter 5 DD au level 34", "Baisser sérénité de 3 DD à -5000"
|
|
||||||
- Progression auto-calculée à partir des timers actifs
|
|
||||||
- Récap fin de journée
|
|
||||||
- **Impact** :
|
|
||||||
- Nouvel onglet dans SPECIAL_TABS
|
|
||||||
- Nouveau champ `S.dailyGoals` dans l'état
|
|
||||||
- Calcul de progression basé sur les stats actuelles vs objectifs
|
|
||||||
- Interface : liste d'objectifs avec barres de progression
|
|
||||||
- **Complexité** : Élevée (~2h)
|
|
||||||
- **Risque** : Moyen — nouvelle feature isolée, mais il faut définir précisément ce qu'est "faisable en une journée humaine" (calcul basé sur les taux de jauges)
|
|
||||||
- **Note utilisateur** : "il faut calculer ce qui est faisable et productible en une journée humaine"
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Ordre d'exécution recommandé
|
|
||||||
|
|
||||||
| Ordre | Phase | Temps estimé | Dépendances |
|
|
||||||
|-------|-------|-------------|-------------|
|
|
||||||
| 1 | 1.1 Tooltips pills | ~5 min | Aucune |
|
|
||||||
| 2 | 1.2 Indication retard | ~15 min | Aucune |
|
|
||||||
| 3 | 2.1 Barre progression tabs | ~30 min | Aucune |
|
|
||||||
| 4 | 2.2 Animations transition | ~20 min | Aucune |
|
|
||||||
| 5 | 4.1 Raccourcis clavier | ~30 min | Aucune |
|
|
||||||
| 6 | 3.1 Thème clair/sombre | ~1h30 | Phases 1-2 (pour vérifier le rendu) |
|
|
||||||
| 7 | 5.1 Planificateur journalier | ~2h | Aucune |
|
|
||||||
|
|
||||||
**Total estimé : ~5h**
|
|
||||||
Loading…
Reference in New Issue
Block a user