2026-05-16 16:38:23 +02:00
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
2026-05-16 16:43:26 +02:00
BitePlan è un'app Android per meal planning, conversione crudo/cotto e lista della spesa. Il progetto è in **riscrittura completa da Vue 3 + Capacitor a Flutter ** . Segui `sop.md` come piano di lavoro: ogni sezione del SOP corrisponde a una fase da completare in ordine. L'obiettivo finale è un APK Android buildabile via Docker. Tutta la UI e la UX sono in **italiano ** .
2026-05-16 16:38:23 +02:00
2026-05-16 16:43:26 +02:00
## Stato attuale
2026-05-16 16:38:23 +02:00
2026-05-16 17:41:45 +02:00
Il codice Dart Flutter è stato scritto e si trova in `lib/` . Il codice Vue 3 è stato rimosso.
**Passo successivo obbligatorio ** : eseguire `flutter create .` nel container dev (noVNC) per generare lo scaffolding Android (`android/` , `ios/` , `test/` ). Senza questo passo il progetto non è buildabile.
2026-05-16 16:38:23 +02:00
2026-05-16 16:43:26 +02:00
## Roadmap (da sop.md)
2026-05-16 16:38:23 +02:00
2026-05-16 17:41:45 +02:00
1. ✅ Struttura progetto Flutter (`lib/` , `pubspec.yaml` , `assets/data/conversions.json` )
2. ✅ `StorageService` , `ConversionService` , modelli dati
3. ✅ Tutte e 3 le pagine + widget + provider
4. ✅ `BottomNavigationBar` , portrait lock, Material 3
5. ✅ Container dev: Docker + Xvfb + noVNC (`docker/dev/` )
6. ✅ Container build headless APK (`docker/build/` )
7. ⬜ Eseguire `flutter create .` nel container + `flutter pub get`
8. ⬜ Configurare icona con `flutter pub run flutter_launcher_icons`
2026-05-16 16:38:23 +02:00
2026-05-16 17:41:45 +02:00
## Comandi
2026-05-16 16:38:23 +02:00
2026-05-16 16:43:26 +02:00
``` bash
2026-05-16 17:41:45 +02:00
# Avvia container dev con GUI noVNC
2026-05-16 16:43:26 +02:00
cd docker/dev && docker compose up
2026-05-16 17:41:45 +02:00
# → http://localhost:6080/vnc.html
# Prima volta nel container (dal terminale noVNC):
flutter create --project-name biteplan --org com.biteplan .
flutter pub get && flutter pub run flutter_launcher_icons
# Sviluppo nel container:
flutter run -d linux # app desktop nella GUI
flutter run -d chrome # app web
# Test (nel container o con Flutter installato localmente):
flutter test # unit + widget
flutter test integration_test/ # e2e (richiede device/emulatore)
2026-05-16 16:43:26 +02:00
2026-05-16 17:41:45 +02:00
# Build APK (headless, da host):
bash docker/build/build.sh # debug → dist/biteplan-debug.apk
bash docker/build/build.sh --release # release firmato → dist/biteplan-release.apk
2026-05-16 16:38:23 +02:00
```
2026-05-16 16:43:26 +02:00
## Architettura target (Flutter)
2026-05-16 16:38:23 +02:00
2026-05-16 16:43:26 +02:00
```
lib/
├── main.dart
├── app.dart # MaterialApp, routing, BottomNavigationBar
├── pages/
│ ├── meal_planner_page.dart
│ ├── converter_page.dart
│ └── shopping_list_page.dart
├── widgets/
│ ├── meal_card.dart
│ └── checkbox_item.dart
├── models/
│ ├── meal_plan.dart
│ └── shopping_item.dart
├── services/
│ ├── storage_service.dart
│ └── conversion_service.dart
└── data/
└── conversions.json # 50+ alimenti × metodi cottura, yield = cotto/crudo
```
2026-05-16 16:38:23 +02:00
2026-05-16 16:43:26 +02:00
**Stato ** : Provider o Riverpod (nessuno store esterno pesante).
**Persistenza ** : `shared_preferences` , chiavi `meals` e `shopping_list` (JSON serializzato).
**Conversione ** : `rawToCooked(raw, yield) = raw * yield` / `cookedToRaw(cooked, yield) = cooked / yield` .
**UI ** : Material 3, seed color `Color(0xFF2d6a4f)` , touch target minimo 48× 48 dp.
2026-05-16 17:41:45 +02:00
## Testing
```
test/
├── unit/
│ ├── models/ # DayPlan, MealPlan, ConversionEntry, ShoppingItem
│ └── providers/ # MealPlannerProvider, ShoppingListProvider
└── widget/ # MealCard, ShoppingItemTile
integration_test/
└── app_test.dart # navigazione, shopping list, converter, meal planner
```
2026-05-16 16:43:26 +02:00
2026-05-16 17:41:45 +02:00
- **Unit/widget**: `flutter test` — non richiedono dispositivo, usano `SharedPreferences.setMockInitialValues({})` per isolare lo storage
- **Integration**: `flutter test integration_test/` — richiedono emulatore o device fisico