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:
parent
c4ebb5b2d8
commit
a82dffe959
@ -34,6 +34,7 @@ Le développement mobile se fera dans un workspace Cursor dédié, branche ou do
|
|||||||
|
|
||||||
| Fichier | Contenu |
|
| 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 |
|
| [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) |
|
| [GOOGLE_HOME.md](docs/GOOGLE_HOME.md) | Notes intégration Nest (abandonnée) |
|
||||||
|
|
||||||
|
|||||||
305
docs/CONTEXTE_CURSOR.md
Normal file
305
docs/CONTEXTE_CURSOR.md
Normal 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 ~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`.*
|
||||||
Loading…
x
Reference in New Issue
Block a user