From 2893013093d416e5019b1d0d3d95c303c685c506 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?POL=20Micka=C3=ABl?= Date: Mon, 6 Apr 2026 05:43:38 +0200 Subject: [PATCH] docs: README, CLAUDE.md, changelog, plans de conception MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - README : fonctionnalités, installation, build, tests (302 + 20 E2E), couverture 94%, workflow mise à jour latest.yml, changelog v1.1.6 - CLAUDE.md : règles de collaboration, architecture, conventions - Plans de conception : DDD, electron-updater, accouplement, toast Co-Authored-By: Claude Opus 4.6 --- .gitignore | 12 + CHANGELOG.md | 90 + CLAUDE.md | 101 +- README.md | 173 +- algorithmes.md | 316 ++- docs/fonctionnalites-par-ecran.md | 335 +++ .../plans/2026-03-27-ddd-architecture-plan.md | 2113 +++++++++++++++++ .../plans/2026-04-04-accouplement-redesign.md | 920 +++++++ .../2026-04-04-electron-updater-design.md | 62 + ...6-04-04-electron-updater-implementation.md | 390 +++ .../2026-04-05-toast-notifications-design.md | 55 + .../2026-04-05-toast-notifications-plan.md | 440 ++++ 12 files changed, 4911 insertions(+), 96 deletions(-) mode change 100644 => 100755 .gitignore create mode 100644 CHANGELOG.md mode change 100644 => 100755 README.md create mode 100644 docs/fonctionnalites-par-ecran.md create mode 100644 docs/plans/2026-03-27-ddd-architecture-plan.md create mode 100644 docs/plans/2026-04-04-accouplement-redesign.md create mode 100644 docs/plans/2026-04-04-electron-updater-design.md create mode 100644 docs/plans/2026-04-04-electron-updater-implementation.md create mode 100644 docs/plans/2026-04-05-toast-notifications-design.md create mode 100644 docs/plans/2026-04-05-toast-notifications-plan.md diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index ec523d1..3a6ab0c --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,17 @@ node_modules/ dist/ +dist-vite/ +dist-electron/ +dist-ts/ *.log +*.bak +plans-dragodinde-*.json .DS_Store Thumbs.db +# Playwright E2E +.e2e-userdata/ +.e2e-userdata-persistence/ +test-results/ +playwright-report/ +# Coverage +coverage/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a252473 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,90 @@ +# 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. diff --git a/CLAUDE.md b/CLAUDE.md index 341f479..50ba9ec 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,37 +2,81 @@ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. +## Règles de collaboration + +- **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 +- **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 +- **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 +- **Les tests ne tournent pas en WSL** — toujours rappeler à l'utilisateur de lancer `npm test` depuis un terminal Windows + ## Project Overview -Minuteur Dragodinde is a Windows desktop app (Electron) for managing Dragodinde breeding timers in Dofus 3. French-language UI. +Minuteur Dragodinde is a Windows desktop app (Electron + Vite + TypeScript) for managing Dragodinde breeding timers in Dofus 3. French-language UI. ## Commands -- **Dev**: `npm start` (runs `electron .`) -- **Build**: `npm run build` (produces NSIS installer in `dist/`) +- **Dev**: `npm start` (runs Vite dev server + Electron via `vite-plugin-electron`) +- **Build**: `npm run build` (Vite build + electron-builder → NSIS installer in `dist/`) +- **Test**: `npm test` (Vitest, run from Windows — native bindings incompatible with WSL) +- **Test watch**: `npm run test:watch` - **Build scripts**: `build.bat` (auto-elevates to admin) or `build.ps1` for Windows -No test framework or linter is configured. - ## Architecture -**Single-page Electron app with no bundler.** All source code lives in 4 files: +**DDD hexagonal architecture** with Vite + TypeScript. Four layers: -- `main.js` — Electron main process: window management, system tray, native notifications, ntfy push notifications (mobile), auto-update via Gitea Releases API, IPC handlers -- `preload.js` — Context bridge exposing `window.electronAPI` (alarm, notifications, ntfy, version, update channels) -- `src/index.html` — **Monolithic ~2200-line file** containing all HTML, CSS, and JS in one file. This is the entire renderer process. -- `icon.png` — App icon (256x256) +``` +src/ + domain/ — Entities, value objects, domain services (pure TS, no deps) + application/ — Command handlers, query handlers, CommandBus/QueryBus + infrastructure/ — LocalStorageRepository, ElectronNotification, WebAudioAlarm + presentation/ — Components, helpers, UIState, entry point (index.ts) +``` -### Renderer architecture (src/index.html) +### Domain layer -All application logic is in `