first commit

This commit is contained in:
2026-07-21 16:50:58 +02:00
commit 256599626e
407 changed files with 30489 additions and 0 deletions
+156
View File
@@ -0,0 +1,156 @@
# Ben-to
Constructeur de bento pixel-art, multi-plateforme (web + Android + iOS).
## Stack
- Web: SolidJS (Vite)
- Mobile: Capacitor
- Données: catalogue embarqué, progression locale (offline, sans compte cloud en V1)
- Qualité: Vitest + Playwright + Axe + Lighthouse
Partage des URLs recette (`/r/…`) et métadonnées Open Graph : voir [docs/seo-recipe-sharing.md](docs/seo-recipe-sharing.md).
Matomo (analytics + bandeau cookies) : voir [docs/matomo-analytics.md](docs/matomo-analytics.md) et `apps/web/.env.example`.
## Démarrage
```bash
npm install
npm run pipeline:recipes
npm run dev:web
```
Les **recettes** (fichiers `*.lang.bentext`), les **couvertures** (`ressources/public/`, placeholders dans `ressources/recipe-placeholder-covers/`), les **sprites ingrédients** (`ressources/public/ingredients.png`, `ingredient-sprites.bentext`, source Aseprite sous `ressources/source/`) sont **versionnés dans ce dépôt** — pas de synchronisation avec un serveur de contenus externe.
Après modification des sources, régénérer le catalogue :
```bash
npm run pipeline:recipes
```
Règles d’édition des fichiers bentext : `.cursor/rules/recipes-bentext.mdc`.
## Tester l'app web
À exécuter depuis la **racine** du dépôt.
**Même chaîne que la CI** (ESLint + TypeScript, Vitest avec **couverture** sur les packages métier, Playwright + Axe, pas de duplication unit/int séparée dans ce script) :
```bash
npm run pipeline:recipes # régénère le catalogue si besoin (dev / e2e)
npm run test:ci
```
Voir [CONTRIBUTING.md](CONTRIBUTING.md) (hook pre-commit, tickets, Gherkin `@int-*`).
Les **e2e** (`npm run test:e2e` ou via `test:ci`) sappuient sur `playwright.config.ts` : le serveur Vite est démarré avec `npm run dev:web` si aucun n’écoute déjà sur le port (voir `reuseExistingServer`).
Pour **régénérer les GIF** du tour daccueil (fichiers dans `apps/web/public/tour/`, hors `test:ci`) : `npm run tour:capture` — nécessite `ffmpeg` sur la machine (`playwright.tour-capture.config.ts`).
**Contrôles ciblés sur le paquet `apps/web`** (lint + types du front uniquement) :
```bash
npm run lint -w apps/web
npm run typecheck -w apps/web
```
**Build de production** du front :
```bash
npm run pipeline:recipes
npm run build:web
```
## Tester sur un téléphone Android (Capacitor)
Le shell natif est dans `**apps/mobile**` et embarque le build statique `**apps/web/dist**` (voir `apps/mobile/capacitor.config.ts`).
Un correctif **patch-package** (`patches/@capacitor-community+sqlite+8.1.0.patch`) remplace `proguard-android.txt` par `proguard-android-optimize.txt` dans le plugin SQLite (exigence R8 / AGP récents). Il est réappliqué à chaque `**npm install`** via le script `**postinstall`**.
**Important — répertoire courant** : `pipeline:recipes`, `build:web` et les scripts `mobile:`* sont définis dans le `**package.json` à la racine** du dépôt (`ben-to/`, là où se trouve ce README). Si vous lancez `npm run …` depuis `**apps/mobile`**, npm cherche ces scripts dans le workspace mobile et échoue (`Missing script`). Vérifiez avec `ls package.json` : vous devez voir le manifest racine, pas celui du sous-dossier.
### Prérequis
- [Android Studio](https://developer.android.com/studio) (SDK + outils plate-forme).
- Sur le téléphone : **Options pour les développeurs** activées, puis **Débogage USB** (câble USB) ou **Débogage sans fil** (WiFi) selon votre appareil.
### Première fois : ajouter la plateforme Android
Si le dossier `**apps/mobile/android/`** nexiste pas encore dans votre clone :
```bash
cd apps/mobile
npx cap add android
cd ../..
```
### Build du web, sync Capacitor, lancer sur lappareil
**Toujours depuis la racine du dépôt** (puis Android Studio souvre sur `apps/mobile/android`) :
```bash
npm install
npm run pipeline:recipes
npm run build:web
npm run mobile:sync
npm run mobile:open:android
```
(`mobile:sync` / `mobile:open:android` appellent le workspace `**@ben-to/mobile**` ; évite les erreurs du type `No workspaces found` si le flag `-w` ne cible pas le bon nom.)
Dans Android Studio : choisir votre téléphone comme cible, puis **Run** (▶).
En ligne de commande (appareil déjà autorisé / `adb devices` OK), **toujours depuis la racine** :
```bash
npm run mobile:run:android
```
### Modifier le front sans tout régénérer (optionnel)
Pour charger lUI depuis votre PC sur le réseau local (évite un `build:web` à chaque changement), vous pouvez temporairement renseigner dans `apps/mobile/capacitor.config.ts` un bloc `server: { url: "http://VOTRE_IP_LAN:3000", cleartext: true }` (à retirer avant release), puis lancer le front avec l’écoute réseau :
```bash
npm run dev:web -- --host 0.0.0.0
```
Adaptez le pare-feu / le même WiFi entre le PC et le téléphone.
## Qualité obligatoire
```bash
npm run check:quality
npm run test:unit
npm run test:integration
npm run test:e2e
```
## CI / Sécurité
- `.github/workflows/ci.yml` — qualité, couverture, e2e + artefacts qualité, Lighthouse, **assembleDebug Android**, rapport PR
- `.github/workflows/security.yml` — CodeQL, `npm audit`, Gitleaks ([activation upload SARIF](docs/CODE_SCANNING.md))
- `.github/workflows/dependency-review.yml` — revue des dépendances sur les PR (selon options du dépôt)
- `.github/workflows/mobile-release.yml`
## Publication V1 (web + Android)
Checklist gel release : [docs/V1_LAUNCH_CHECKLIST.md](docs/V1_LAUNCH_CHECKLIST.md).
## Déploiement CapRover
- Le dépôt contient `Dockerfile` et `captain-definition` pour un déploiement via CapRover (hors GitHub Actions).
## Ticketing GitHub
Création rapide des issues MVP :
```bash
./scripts/github/create-issues.sh kazerlelutin/ben-to
```
Tickets post-MVP (builder SOLID, suppression des barrels `index`, SEO OG recettes) : gabarits sous [.github/ISSUE_TEMPLATE/](.github/ISSUE_TEMPLATE/) (`04``06`), corps dans [docs/tickets/](docs/tickets/), création en masse après `gh auth login` :
```bash
./scripts/github/create-post-mvp-issues.sh
```