chore: aggiorna .gitignore e CLAUDE.md per Flutter

.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>
This commit is contained in:
2026-05-16 17:41:45 +02:00
parent 9a865a1479
commit aa88e2095b
2 changed files with 62 additions and 27 deletions
+19
View File
@@ -2,3 +2,22 @@ node_modules/
dist/ dist/
.DS_Store .DS_Store
*.jks *.jks
# Flutter — output e scaffold generati da flutter create / flutter build
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
/build/
*.g.dart
pubspec.lock
# Scaffold generato da flutter create (creato nel container, non versionare)
/android/
/ios/
/linux/
/macos/
/windows/
/web/
/.idea/
*.iml
.metadata
+43 -27
View File
@@ -8,32 +8,43 @@ BitePlan è un'app Android per meal planning, conversione crudo/cotto e lista de
## Stato attuale ## Stato attuale
Il codice Vue 3 esistente (`src/`, `tests/`, `vite.config.mjs`, ecc.) è il riferimento funzionale da portare in Flutter — non va esteso. Il nuovo codice Flutter va creato da zero seguendo `sop.md`. 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) ## Roadmap (da sop.md)
1. Struttura progetto Flutter (`lib/`, `pubspec.yaml`, asset JSON) 1. Struttura progetto Flutter (`lib/`, `pubspec.yaml`, `assets/data/conversions.json`)
2. Container dev: Docker + Xvfb + noVNC su porta 6080 (`docker/dev/`) 2. `StorageService`, `ConversionService`, modelli dati
3. Container build headless APK (`docker/build/`) 3. ✅ Tutte e 3 le pagine + widget + provider
4. `StorageService` — persistenza con `shared_preferences` 4. `BottomNavigationBar`, portrait lock, Material 3
5. `ConversionService` — rawToCooked / cookedToRaw + asset `lib/data/conversions.json` 5. Container dev: Docker + Xvfb + noVNC (`docker/dev/`)
6. Modelli dati: `MealPlan`, `DayPlan`, `ShoppingItem` 6. ✅ Container build headless APK (`docker/build/`)
7. Pagina Meal Planner (accordion per giorno, 3 pasti, add/remove voci) 7. ⬜ Eseguire `flutter create .` nel container + `flutter pub get`
8. Pagina Converter (ricerca alimento → selezione metodo → calcolo bidirezionale) 8. ⬜ Configurare icona con `flutter pub run flutter_launcher_icons`
9. Pagina Shopping List (checklist, import da meal planner, svuota)
10. `BottomNavigationBar` (Pasti | Converti | Spesa), portrait lock, Material 3
## Comandi (quando il progetto Flutter esisterà) ## Comandi
```bash ```bash
# Sviluppo via container noVNC # Avvia container dev con GUI noVNC
cd docker/dev && docker compose up cd docker/dev && docker compose up
# → http://localhost:6080 (desktop GUI nel browser) # → http://localhost:6080/vnc.html
# Nel terminale noVNC: cd /workspace && flutter pub get && flutter run
# Build APK # Prima volta nel container (dal terminale noVNC):
bash docker/build/build.sh # debug flutter create --project-name biteplan --org com.biteplan .
bash docker/build/build.sh --release # release firmato → dist/ 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) ## Architettura target (Flutter)
@@ -64,13 +75,18 @@ lib/
**Conversione**: `rawToCooked(raw, yield) = raw * yield` / `cookedToRaw(cooked, yield) = cooked / yield`. **Conversione**: `rawToCooked(raw, yield) = raw * yield` / `cookedToRaw(cooked, yield) = cooked / yield`.
**UI**: Material 3, seed color `Color(0xFF2d6a4f)`, touch target minimo 48×48 dp. **UI**: Material 3, seed color `Color(0xFF2d6a4f)`, touch target minimo 48×48 dp.
## Riferimento funzionale (Vue → Flutter) ## Testing
| Vue (attuale) | Flutter (target) | ```
|---|---| test/
| `src/pages/MealPlanner.vue` | `lib/pages/meal_planner_page.dart` | ├── unit/
| `src/pages/Converter.vue` | `lib/pages/converter_page.dart` | │ ├── models/ # DayPlan, MealPlan, ConversionEntry, ShoppingItem
| `src/pages/ShoppingList.vue` | `lib/pages/shopping_list_page.dart` | │ └── providers/ # MealPlannerProvider, ShoppingListProvider
| `src/utils/storage.js` | `lib/services/storage_service.dart` | └── widget/ # MealCard, ShoppingItemTile
| `src/utils/conversion.js` | `lib/services/conversion_service.dart` |
| `src/data/conversions.json` | `lib/data/conversions.json` (asset) | integration_test/
└── app_test.dart # navigazione, shopping list, converter, meal planner
```
- **Unit/widget**: `flutter test` — non richiedono dispositivo, usano `SharedPreferences.setMockInitialValues({})` per isolare lo storage
- **Integration**: `flutter test integration_test/` — richiedono emulatore o device fisico