Ajoute le brief Cursor pour le développement mobile.

Document de passation avec prompt, décisions produit et références au prototype web.
This commit is contained in:
jmartin 2026-06-12 11:45:12 +02:00
parent c4ebb5b2d8
commit a82dffe959
2 changed files with 306 additions and 0 deletions

View File

@ -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) |

305
docs/CONTEXTE_CURSOR.md Normal file
View File

@ -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 ~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`.*