From a82dffe959e3501dae55da8a19107572987eb66a Mon Sep 17 00:00:00 2001 From: jmartin Date: Fri, 12 Jun 2026 11:45:12 +0200 Subject: [PATCH] =?UTF-8?q?Ajoute=20le=20brief=20Cursor=20pour=20le=20d?= =?UTF-8?q?=C3=A9veloppement=20mobile.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Document de passation avec prompt, décisions produit et références au prototype web. --- README.md | 1 + docs/CONTEXTE_CURSOR.md | 305 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 306 insertions(+) create mode 100644 docs/CONTEXTE_CURSOR.md diff --git a/README.md b/README.md index 9cbb4ff..7c38e50 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ Le développement mobile se fera dans un workspace Cursor dédié, branche ou do | Fichier | Contenu | |---------|---------| +| [CONTEXTE_CURSOR.md](docs/CONTEXTE_CURSOR.md) | **Brief pour un agent Cursor** (prompt + contexte complet) | | [CAHIER_DES_CHARGES_APP_ANDROID.md](docs/CAHIER_DES_CHARGES_APP_ANDROID.md) | Spec produit commercial v0.2 | | [GOOGLE_HOME.md](docs/GOOGLE_HOME.md) | Notes intégration Nest (abandonnée) | diff --git a/docs/CONTEXTE_CURSOR.md b/docs/CONTEXTE_CURSOR.md new file mode 100644 index 0000000..170c54a --- /dev/null +++ b/docs/CONTEXTE_CURSOR.md @@ -0,0 +1,305 @@ +# Contexte Cursor — App mobile Bons Points + +> **Usage :** ouvrir ce dépôt dans un workspace Cursor dédié (`mobile/`), coller la section **« Prompt de démarrage »** dans le premier message, puis référencer ce fichier avec `@docs/CONTEXTE_CURSOR.md`. + +--- + +## Prompt de démarrage (à copier-coller) + +``` +Tu travailles sur le projet Bons Points — app Android Flutter commerciale, 100 % locale. + +Dépôt : https://git.ptits-pas.fr/jmartin/bonpoint +Clone : git clone ssh://git@git.ptits-pas.fr:2222/jmartin/bonpoint.git + +Structure : +- docs/ → cahier des charges et ce fichier +- web/ → prototype Node.js (référence métier + UI, NE PAS modifier sauf demande) +- mobile/ → app Flutter à créer et développer ICI + +Lis en priorité : +1. docs/CONTEXTE_CURSOR.md +2. docs/CAHIER_DES_CHARGES_APP_ANDROID.md +3. web/src/db.js (schéma SQLite, règles par défaut, logique scores) + +Vision : +- App Play Store freemium (1 enfant gratuit + AdMob, Premium IAP ~3–5 €) +- Données famille UNIQUEMENT sur le téléphone (SQLite), pas de backend SaaS +- Pas de login compte ; PIN parent local +- Français uniquement en v1 + +Hors périmètre (ne pas implémenter) : +- OK Google / Nest / Dialogflow / voix +- Sync cloud temps réel +- iOS +- Confusion avec P'titsPas (app.ptits-pas.fr = autre produit pro) + +Stack imposée : Flutter + drift ou sqflite + Riverpod ou Bloc. + +Commence par : flutter create dans mobile/ (org fr.ptitspas.bonpoint), reprendre le modèle de données de web/src/db.js, écran onboarding sans compte. +``` + +--- + +## 1. Identité du projet + +| | | +|--|--| +| **Nom produit** | Bons Points / Bonpoint | +| **Type** | App Android familiale — système de bons points pour enfants | +| **Objectif business** | App **publique** Play Store, **monétisée** (freemium), pas un outil perso famille seul | +| **Argument marketing** | « 100 % local, zéro cloud, zéro compte — vos données restent sur votre téléphone » | +| **Prototype** | `web/` + site `https://bonpoint.ptits-pas.fr` (labo UX + règles métier) | +| **À développer** | `mobile/` — Flutter from scratch | + +### Ce n’est PAS + +- **P’titsPas** (`app.ptits-pas.fr`) — SaaS garde d’enfants / collectivités, login, autre codebase (`/home/deploy/dev/ptitspas-app`). +- Une app avec serveur backend pour les données enfants. +- Un projet vocal Nest / Google Home (abandonné, voir `docs/GOOGLE_HOME.md`). + +--- + +## 2. Dépôt Git + +| | | +|--|--| +| **Web** | https://git.ptits-pas.fr/jmartin/bonpoint | +| **SSH (PC / clé jmartin)** | `ssh://git@git.ptits-pas.fr:2222/jmartin/bonpoint.git` | +| **SSH (serveur deploy)** | `gitea-jmartin:jmartin/bonpoint.git` (alias dans `~/.ssh/config`) | +| **Branche principale** | `main` | +| **État mobile** | `mobile/` = placeholder (`README.md` seulement), **pas encore de projet Flutter** | + +```bash +git clone ssh://git@git.ptits-pas.fr:2222/jmartin/bonpoint.git +cd bonpoint +``` + +--- + +## 3. Structure du dépôt + +``` +bonpoint/ +├── README.md +├── .gitignore +├── docs/ +│ ├── CONTEXTE_CURSOR.md ← ce fichier +│ ├── CAHIER_DES_CHARGES_APP_ANDROID.md ← spec produit v0.2 +│ └── GOOGLE_HOME.md ← archive (Nest abandonné) +├── web/ ← NE PAS casser ; référence uniquement +│ ├── src/ +│ │ ├── db.js ← ★ source de vérité métier + seed règles +│ │ ├── server.js +│ │ ├── auth.js ← PIN bcrypt +│ │ └── routes/ +│ ├── public/ ← maquettes HTML/CSS (inspiration UI) +│ ├── docker-compose.yml +│ └── package.json +└── mobile/ ← ★ TRAVAILLER ICI + └── README.md +``` + +--- + +## 4. Décisions produit (validées) + +| Sujet | Décision | +|-------|----------| +| Plateforme | Android seulement (pas iOS v1) | +| Framework | **Flutter** | +| Données | **SQLite locale** (drift ou sqflite) | +| Réseau usage quotidien | **Aucun** (mode avion OK) | +| Authentification | **Pas de compte** ; **PIN parent** hashé local | +| Monétisation | **Freemium** : 1 enfant + pubs / Premium IAP (multi-enfants, sans pub, édition complète) | +| Pubs | AdMob **Families-compliant** (child-directed, rating G) | +| Sauvegarde | Export/import fichier JSON (obligatoire v1) | +| Voix / Nest / TV | **Abandonné** | +| Langue | Français | + +--- + +## 5. Modèle freemium (cible — à affiner) + +| | Gratuit | Premium (IAP unique ~2,99–4,99 €) | +|--|---------|-----------------------------------| +| Enfants | 1 max | Plusieurs (ex. 8 max) | +| Règles / récompenses | Pack défaut + édition limitée | Édition complète | +| Publicités | Bandeau AdMob (hors espace parent) | Aucune | +| Historique | 30 jours (proposition) | Illimité | +| Export sauvegarde | Oui | Oui | + +--- + +## 6. Règles métier (à porter à l’identique) + +Source : `web/src/db.js` + +1. **Score entier**, affiché tel quel. +2. **Plancher à 0** : `nouveauScore = max(0, score + delta)` — le delta enregistré dans `mouvements` est le **delta réel** appliqué. +3. **Mouvement** = toute action (règle appliquée, achat boutique, annulation). +4. **Annulation** = inverse le delta (respect plancher 0) — voir `annulerMouvement()`. +5. **Boutique** : achat si `score >= cout_points`, sinon erreur `pas_assez_de_points`. + +### Familles de règles (seed) + +| Clé | Libellé | +|-----|---------| +| MAISON | 🏠 Maison & rangement | +| ROUTINE | ⏰ Matin, soir & école | +| FRATRIE | 👫 Fratrie & entraide | +| RESPECT | 🙏 Respect & écoute | +| ECRANS | 📱 Écrans | +| BONUS | 🌟 Bonus | + +~36 règles dans `REGLES_DEFAUT` (version `famille-v5`) — **à généraliser** pour l’app publique (retirer références « Ariana 7h20 » etc. ou les garder comme exemples modifiables). + +11 récompenses dans `RECOMPENSES_DEFAUT` (version `famille-v2`). + +--- + +## 7. Schéma SQLite (référence) + +```sql +enfants (id, prenom, date_naissance, score, couleur, ordre) +regles (id, libelle, points, icone, actif, ordre, famille, famille_ordre) +mouvements (id, enfant_id, regle_id?, delta, note?, cree_le) +recompenses (id, libelle, cout_points, icone, actif, ordre) +config (cle, valeur) -- ex. pin_hash, regles_version, premium_unlocked +``` + +**PIN :** bcrypt du PIN parent dans `config.pin_hash` (voir `web/src/auth.js`). + +--- + +## 8. Écrans MVP (v1.0) + +| Écran | Accès | Description | +|-------|-------|-------------| +| Onboarding | 1er lancement | Bienvenue → créer 1er enfant → PIN → importer règles défaut | +| Tableau de bord | Tous | Liste enfants + scores ; lien espace parent | +| Fiche enfant | Tous | Photo, score, historique, bouton boutique | +| Boutique | Tous | Liste récompenses, achat | +| Espace parent | PIN | Multi-sélection, grille règles, historique + annulation | +| Réglages | Parent | Export/import, premium, politique confidentialité | +| Premium | Parent | Achat IAP, restauration | + +Inspiration UI : `web/public/*.html` + `web/public/css/style.css` (couleurs, cartes, avatars ronds). + +--- + +## 9. Stack technique recommandée + +| Couche | Choix | +|--------|--------| +| UI | Flutter + Material 3 | +| État | Riverpod **ou** Bloc | +| BDD | drift **ou** sqflite | +| IAP | `in_app_purchase` | +| Pub | `google_mobile_ads` (tag child-directed) | +| PIN | `bcrypt` ou package hash équivalent | +| Export | JSON + checksum ; chiffrement AES optionnel (mot de passe parent) | +| Tests | `flutter test` + tests unitaires logique scores | + +**Package Android :** `fr.ptitspas.bonpoint` (proposition). + +--- + +## 10. Réseau (minimal) + +| Cas | Réseau ? | +|-----|----------| +| Scores, règles, historique | Non | +| AdMob | Oui | +| Play Billing (IAP) | Oui | +| Envoi données enfants vers serveur | **Jamais** | + +Landing marketing future (hors app) : `bonpoint.ptits-pas.fr/download` → redirect Play Store + QR cartons. + +--- + +## 11. Play Store (contraintes) + +- Compte développeur ~25 € (une fois). +- Compte **personnel récent** : test fermé **12 testeurs** × **14 jours** consécutifs avant production. +- Déclaration **Families** obligatoire (app pour enfants). +- Politique de confidentialité (URL statique). +- App **non répertoriée** possible en test interne. + +--- + +## 12. Points NON tranchés (demander au porteur de projet) + +| # | Question | +|---|----------| +| 1 | Nom Play Store : « Bons Points » ou « Bonpoint » ? | +| 2 | Prix IAP : 2,99 / 3,99 / 4,99 € ? | +| 3 | Limite enfants premium : illimité ou plafond (6 / 8) ? | +| 4 | Compte Play : perso ou micro-entreprise ? | +| 5 | Édition règles en gratuit : lecture seule ou N règles custom ? | +| 6 | Historique gratuit : 30 j / 50 mouvements / illimité ? | +| 7 | Riverpod ou Bloc ? drift ou sqflite ? | + +**Ne pas inventer** — proposer une valeur par défaut raisonnable et la documenter si bloqué. + +--- + +## 13. Conventions de développement + +- **UI / textes utilisateur :** français. +- **Code :** anglais (noms de classes, fichiers, variables) — cohérent avec l’écosystème Flutter. +- **Commits :** messages en français, concis. +- **Scope :** travailler dans `mobile/` ; ne pas modifier `web/` ni `infra_v2` sans demande explicite. +- **Pas de sur-ingénierie :** MVP d’abord, premium/AdMob en phase 4. +- **Ne pas commit** `.env`, clés AdMob, fichiers `google-services.json` de prod dans le dépôt public. + +--- + +## 14. Ordre de développement suggéré + +1. `flutter create` dans `mobile/` (org `fr.ptitspas.bonpoint`) +2. Modèle de données + migrations SQLite +3. Seed règles/récompenses (porter depuis `web/src/db.js`) +4. Onboarding + tableau de bord + 1 enfant +5. Espace parent (PIN, appliquer règle, annulation) +6. Fiche enfant + boutique +7. Export/import sauvegarde +8. IAP Premium + AdMob +9. Polish, légal, build release + +--- + +## 15. Fichiers clés à lire en premier + +| Fichier | Pourquoi | +|---------|----------| +| `docs/CAHIER_DES_CHARGES_APP_ANDROID.md` | Spec complète v0.2 | +| `web/src/db.js` | Schéma, seed, `appliquerRegle`, `acheterRecompense`, `annulerMouvement` | +| `web/src/auth.js` | Vérification PIN | +| `web/public/index.html` | Accueil | +| `web/public/parent.html` | Espace parent | +| `web/public/boutique.html` | Boutique | +| `web/public/css/style.css` | Charte visuelle | + +--- + +## 16. Historique projet (éviter de refaire les erreurs) + +| Tentative | Résultat | +|-----------|----------| +| Dialogflow + webhook | OK en simulateur, **inutilisable** sur Nest/téléphone (Conversational Actions mortes depuis 06/2023) | +| Smart Home Google | Répond « batterie » au lieu de « bons points » — **abandonné** | +| PWA / Cast TV | Affichage possible, pas de voix custom — **hors scope** | +| App Nest installée | **Impossible** (pas de store sur Nest Hub) | + +--- + +## 17. Contacts & infra (info) + +- **Prototype web prod :** https://bonpoint.ptits-pas.fr (Docker sur infra OVH, `/home/deploy/infra_v2/apps/bonpoint` — legacy, le dépôt canonique est maintenant `git.ptits-pas.fr/jmartin/bonpoint`) +- **Porteur projet :** Julien Martin (`jmartin@ptits-pas.fr`) +- **Gitea :** self-hosted `git.ptits-pas.fr` + +--- + +*Dernière mise à jour : juin 2026 — aligné sur CDC v0.2 et dépôt `main`.*