.gitignore: aggiunti scaffold Flutter (/android/, /ios/, /web/, ecc.), file IDE (/.idea/, *.iml), .metadata; corretto /build/ (solo root). CLAUDE.md: aggiornato con architettura Flutter, comandi dev/build/test e stato avanzamento roadmap (checklist SOP). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
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.
Stato attuale
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.
Roadmap (da sop.md)
- ✅ Struttura progetto Flutter (
lib/,pubspec.yaml,assets/data/conversions.json) - ✅
StorageService,ConversionService, modelli dati - ✅ Tutte e 3 le pagine + widget + provider
- ✅
BottomNavigationBar, portrait lock, Material 3 - ✅ Container dev: Docker + Xvfb + noVNC (
docker/dev/) - ✅ Container build headless APK (
docker/build/) - ⬜ Eseguire
flutter create .nel container +flutter pub get - ⬜ Configurare icona con
flutter pub run flutter_launcher_icons
Comandi
# Avvia container dev con GUI noVNC
cd docker/dev && docker compose up
# → 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)
# 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
Architettura target (Flutter)
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
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.
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
- Unit/widget:
flutter test— non richiedono dispositivo, usanoSharedPreferences.setMockInitialValues({})per isolare lo storage - Integration:
flutter test integration_test/— richiedono emulatore o device fisico