bonpoint/docs/CONTEXTE_CURSOR.md
jmartin a82dffe959 Ajoute le brief Cursor pour le développement mobile.
Document de passation avec prompt, décisions produit et références au prototype web.
2026-06-12 11:45:12 +02:00

306 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 ~35 €)
- 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 nest PAS
- **PtitsPas** (`app.ptits-pas.fr`) — SaaS garde denfants / 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,994,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 à lidentique)
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 lapp 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 dabord, 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`.*