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

11 KiB
Raw Permalink Blame History

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

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.