100 Commits
Author SHA1 Message Date
davideandClaude Sonnet 5 7c6cf6fd78 docs: riorganizza README con flusso guidato prima-volta/build/lancio
Aggiunge una guida rapida in cima che rimanda a requisiti, installazione,
sviluppo e build nell'ordine in cui vanno seguiti, e documenta il fix per
i file lasciati di proprietà root da una build Docker precedente.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-16 14:12:00 +02:00
davideandClaude Sonnet 5 65d0eb461c docs: guida step-by-step per testare l'APK di debug su emulatore
Aggiunge in README.md la procedura completa (avvio emulatore, adb
install, avvio app, log, disinstallazione) e corregge l'App ID
riportato in docker/README.md, disallineato dal valore reale in
android/app/build.gradle.kts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-13 18:48:14 +02:00
davideandClaude Sonnet 5 494c0fdbd4 docs: aggiorna CLAUDE.md con conteggio test, coverage e insidie note
184 test, coverage ~93%; documenta il coverage helper e il vincolo
sul caricamento async dei provider nei widget test.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 20:38:57 +02:00
davideandClaude Sonnet 5 57f522e3a2 fix(test): corregge i fallimenti emersi alla prima esecuzione
- update_service_test: il fake HttpClientResponse tipizza lo stream
  come Stream<List<int>> (utf8.encode ritorna Uint8List)
- guide/info_bottom_sheet test: i titoli delle _DocCard sono resi
  con toUpperCase(), i finder ora cercano il testo maiuscolo
- converter_page_test e app_test: loadDb()/load() dei provider
  spostati nel setUp — chiamarli nel body di testWidgets (zona
  FakeAsync) bloccava la suite fino al timeout di 10 minuti

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 20:38:57 +02:00
davideandClaude Sonnet 5 d94bd5fdf7 test: widget test per il layer di presentazione
Prima era esercitato solo dall'integration test su emulatore:

- converter_page: ricerca, stati vuoti, selezione, calcolo, swap, reset
- shopping_list_page: aggiunta, contatore, sezione completati, dialog svuota
- meal_planner_page: 7 card, giorno espanso, genera lista, dialog svuota,
  stato del pulsante Condividi
- qr_share_sheet: QR per piano valido, errore oltre il limite, chiusura
- app (BitePlanApp): navigazione fra i tab, bottom sheet informazioni
- guide_page e info_bottom_sheet: contenuti e navigazione alla guida
- empty_state: icona, titolo, sottotitolo opzionale
- coverage_helper: importa tutta lib/ così lcov include anche i file
  non toccati da alcun test

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 20:08:49 +02:00
davideandClaude Sonnet 5 9384bd6117 test: colma i buchi negli unit test esistenti
- UpdateService.checkUpdate() coperto via HttpOverrides con fake
  HttpClient: versione più recente/uguale/più vecchia, status != 200,
  body malformato, errore di rete
- ConverterProvider.loadDb() con l'asset reale + validazione che ogni
  voce di conversions.json abbia yield positivo
- MealPlannerProvider.removeItem() sui rami colazione e cena
  (prima era coperto solo pranzo)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 20:08:32 +02:00
davideandClaude Sonnet 5 e494855fe6 docs: guida passo passo per emulatore e requisiti host nel README
Aggiunge requisiti (Linux x86_64, KVM, Java 17+) e installazione
completa di Flutter, Android SDK cmdline-tools e AVD dedicato;
ignora coverage/ generata da flutter test --coverage.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 20:08:17 +02:00
davideandClaude Sonnet 5 45d53c1bd1 docs: aggiorna CLAUDE.md al nuovo workflow e aggiunge ruolo esperto
Riflette lo sviluppo su host + emulatore (comandi, sezione "Sviluppo
locale"), condensa architettura/testing sui contenuti non deducibili
dal codice, e aggiunge il flusso atteso per le richieste di modifica:
analisi critica → implementazione → test suggeriti (non scritti salvo
richiesta esplicita).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 19:30:51 +02:00
davideandClaude Sonnet 5 0d3943f9f9 chore: rimuove sop.md, non più necessario
Documento di pianificazione iniziale, ormai obsoleto e superato dal
codice e dalla documentazione attuale (CLAUDE.md, README.md).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 19:30:44 +02:00
davideandClaude Sonnet 5 6f82aa0225 docs: aggiorna README e docker/README al nuovo workflow di sviluppo
Sostituisce le istruzioni per il container dev con Flutter host +
emulatore Android; aggiorna i path docker/build/build.sh → docker/build.sh.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 19:30:34 +02:00
davideandClaude Sonnet 5 59c4915847 chore: rimuove i vecchi path docker/build/ (spostati in docker/)
Completa il flattening di docker/build/ in docker/.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 19:29:56 +02:00
davideandClaude Sonnet 5 ed4422ef93 refactor: appiattisce docker/build/ in docker/
Con la rimozione di docker/dev/ non serve più distinguere due
container: Dockerfile e build.sh salgono di un livello, con i path
relativi (PROJECT_ROOT, keystore) aggiornati di conseguenza.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 19:29:40 +02:00
davideandClaude Sonnet 5 9c4f460c9b chore: rimuove il container Docker per il dev
Lo sviluppo passa da hot reload via Docker/web a Flutter installato
sull'host con emulatore Android dedicato (vedi CLAUDE.md).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-12 19:29:18 +02:00
davideandClaude Sonnet 4.6 cd82edd8d3 chore: bump versione a 2.1.0 e aggiorna CLAUDE.md
versionCode 10300 → 10400. CLAUDE.md aggiornato con i nuovi servizi
shared (UpdateService, UrlLauncherService, update_dialog), il
MethodChannel in MainActivity.kt e il pattern di mock per widget test.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 08:55:23 +02:00
davideandClaude Sonnet 4.6 ea0ed719bb chore: aggiunge sezione 2.1.0 al changelog
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 08:52:34 +02:00
davideandClaude Sonnet 4.6 ab1a7c18cd docs: documenta update checker nella guida utente e nella guida in-app
Aggiunge sezione "Aggiornamenti" in docs/guida-utente.md con rimando
dalla sezione "Informazioni app". Aggiunge TipCard nella tab Pasti
della guida in-app che descrive il controllo automatico all'avvio.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 08:50:57 +02:00
davideandClaude Sonnet 4.6 6e79e4d79f feat: update checker — controllo aggiornamenti all'avvio
Merge branch 'update-checker'

All'avvio l'app confronta silenziosamente la versione installata con
l'ultima release GitHub. Se disponibile una versione più recente,
mostra un dialog con pulsante "Scarica" che apre releases/latest
nel browser. Testato su device fisico Android.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 08:44:16 +02:00
davideandClaude Sonnet 4.6 2e67e5dd4e chore: ignora test/widget_test.dart generato da flutter create
File boilerplate generato automaticamente dal dev container, non
appartiene al progetto e fallirebbe (referenzia MyApp inesistente).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 08:06:42 +02:00
davideandClaude Sonnet 4.6 1f4f374f6f docs: aggiorna README e CLAUDE.md per funzionalità update checker
Aggiunge sezione "Controllo aggiornamenti" nelle funzionalità del README.
Aggiorna struttura test in README e CLAUDE.md con le nuove cartelle
shared/services e shared/widgets. Contatore test 110 → 130.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 16:28:27 +02:00
davideandClaude Sonnet 4.6 b391199bce test: aggiungi test parsing JSON e widget test del dialog
parseTagName: v-prefix, body senza prefisso, JSON malformato, tag_name
assente, body vuoto. Widget test del dialog: titolo, versione nel testo,
pulsanti Più tardi e Scarica, chiusura dialog, chiamata MethodChannel
verificata con mock. 130/130 test passati.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 16:28:21 +02:00
davideandClaude Sonnet 4.6 3da8ccc4d3 refactor: estrai showUpdateDialog e parseTagName in file dedicati
Sposta la logica del dialog in lib/shared/widgets/update_dialog.dart
per renderla importabile nei test senza duplicare il codice.
Estrae parseTagName come metodo @visibleForTesting in UpdateService
isolando il parsing JSON dalla chiamata HTTP. app.dart semplificato
di conseguenza.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 16:28:13 +02:00
davideandClaude Sonnet 4.6 9486a70f1f test: aggiungi unit test per UpdateService
Copre parseVersion (semver standard, parti mancanti, valori non numerici)
e isNewer (patch/minor/major bump, versione uguale, versione più vecchia,
componenti multi-cifra come 2.0.10 > 2.0.9). 10/10 test passati su ARM64.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 16:18:00 +02:00
davideandClaude Sonnet 4.6 296a622d82 feat: aggiungi controllo aggiornamenti con dialog all'avvio
All'avvio l'app chiama l'API GitHub releases per confrontare la versione
installata con l'ultima disponibile (comparazione semantica major.minor.patch).
Se esiste una versione più recente, mostra un AlertDialog con i pulsanti
"Più tardi" e "Scarica" — quest'ultimo apre releases/latest nel browser.
Il controllo è silenzioso in caso di assenza di rete o errori, e disabilitato
su Flutter web (dart:io non disponibile).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 16:17:53 +02:00
davideandClaude Sonnet 4.6 0f1f585b4a feat(android): aggiungi permesso INTERNET e canale nativo per aprire URL
Aggiunge INTERNET permission e la query ACTION_VIEW/https richiesta da
Android 11+ per la package visibility. Espone il MethodChannel
'com.davide.biteplan/launcher' che lancia un Intent.ACTION_VIEW con
l'URL ricevuto, senza dipendere da plugin Flutter esterni.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 16:17:43 +02:00
davideandClaude Sonnet 4.6 481ca86487 data: correggi yield bollitura per bieta, cavolfiore, finocchi e agretti
Valori aggiornati da misurazioni dirette (Muzzone 2024 + INRAN via matematicaincucina),
più accurati rispetto al proxy CREA kcal crudo/cotto usato in precedenza.
bieta 0.83→0.86 · cavolfiore 0.97→0.93 · finocchi 0.88→0.86 · agretti 0.88→0.86

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 00:06:15 +02:00
davideandClaude Sonnet 4.6 48e15caf91 docs: aggiorna CLAUDE.md con build riproducibile e firma release
Aggiunge sezione "Build e firma" con: versione Flutter pinnata,
Gradle cache isolata, enforce-lockfile, gestione keystore/password,
vincolo applicationId e regola versionCode crescente.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 22:25:58 +02:00
davideandClaude Sonnet 4.6 c36fe32580 docs: aggiungi versione 2.0.0 al changelog e aggiorna conversioni.md
- Changelog: documenta la migrazione completa da Vue 3 + Capacitor a Flutter
- conversioni.md: corregge il path del file dati da src/data/ ad assets/data/

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 22:18:15 +02:00
davideandClaude Sonnet 4.6 3055b2a665 chore: rimuovi fallback flutter create e chiarisci gestione keystore
- Rimuove il blocco flutter create da build.sh: android/ è ora versionata
  con la configurazione corretta (com.davide.biteplan), il fallback era
  diventato codice morto con un --org errato
- Aggiorna docker/README.md: distingue collaboratore (riceve keystore
  dall'autore) da fork/uso personale (genera keystore proprio), spiega
  l'impatto sulla compatibilità degli aggiornamenti sui dispositivi

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 22:13:54 +02:00
davideandClaude Sonnet 4.6 72b50b4b3c chore: versiona cartella android/ e pubspec.lock
Rende il repo clonabile e buildabile da chiunque senza passi manuali:
- android/ rimosso da .gitignore: contiene applicationId, label, icone
  e MainActivity con il package corretto (com.davide.biteplan)
- pubspec.lock aggiunto: necessario per --enforce-lockfile nella build
- File generati/macchina-specifici già esclusi da android/.gitignore
  (.gradle/, local.properties, GeneratedPluginRegistrant.java)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 22:05:51 +02:00
davideandClaude Sonnet 4.6 518c1d74a7 chore: allinea identità app Android alla v1.2.1 per aggiornamento diretto
- applicationId e namespace: com.biteplan.biteplan → com.davide.biteplan
- android🏷️ biteplan → BitePlan
- MainActivity.kt spostato nel package com.davide.biteplan
- versionCode: 1 → 10300 (superiore al 10201 della v1.2.1 Capacitor)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 22:04:11 +02:00
davideandClaude Sonnet 4.6 85f62a8d66 build: correggi firma APK release non-interattiva
- Valida BITEPLAN_KEYSTORE_PASS prima della build e stampa istruzioni chiare
- Passa --ks-pass a apksigner tramite env var (stdin era chiuso nel container)
- Aggiunge rm -f su biteplan-aligned.apk prima di zipalign per evitare errori
  su run consecutive
- Documenta export BITEPLAN_KEYSTORE_PASS nel docker/README.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 22:04:00 +02:00
davideandClaude Sonnet 4.6 5c871f247d build: rendi la build Docker riproducibile
- Pinna Flutter a 3.41.9 (ARG FLUTTER_VERSION) in entrambi i Dockerfile
- Aggiunge /opt/android-sdk/build-tools/34.0.0 al PATH (zipalign era missing)
- Sostituisce mount ${HOME}/.gradle con named volume gradle-cache
- Aggiunge --enforce-lockfile a flutter pub get per bloccare le dipendenze
- Aggiunge .flutter-version con la versione Flutter attesa

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 22:03:51 +02:00
davideandClaude Sonnet 4.6 0e4925e61d refactor: riscrivi app in Flutter (da branch flutter)
Migrazione completa da Vue 3 + Vite a Flutter:
- rimossa sorgente Vue 3/Vite/Playwright
- app riscritta in Flutter con Material 3, Provider, SharedPreferences
- aggiunto supporto QR code per condivisione piano pasti
- aggregazione duplicati nella lista della spesa
- guida utente con 3 tab (Pasti, Converti, Spesa)
- containerizzazione Docker per dev e build APK
- suite di 110 test (unit + widget)
- ottimizzazioni APK: spazio e allocazioni a runtime

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 21:06:30 +02:00
davideandClaude Sonnet 4.6 8d25f63f24 perf: riduci spazio APK e allocazioni a runtime
- Comprimi icon-only.png da 5.2 MB a 72 KB (512×512, quantizzazione 256 colori)
- Rimuovi setState() ridondante in ConverterPage.onChanged: search() chiama già notifyListeners()
- Cattura pendingItems/checkedItems in variabili locali nel build di ShoppingListPage per evitare filtraggio ripetuto a ogni paint

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 00:01:49 +02:00
davideandClaude Sonnet 4.6 ca875d29c4 docs: allinea CLAUDE.md, README e docker/README al codice reale
CLAUDE.md: rimossi riferimenti a noVNC/Vue3/sop.md, aggiornata
architettura reale (features/*/presentation/), rimossi file fantasma
(checkbox_item.dart, conversion_service.dart), aggiunta feature guide,
corretta struttura test, aggiornati comandi Docker.

README.md: riscritto per Flutter (rimosso stack Vue3/Node.js), aggiunta
sezione test con comandi e struttura cartelle, link docs/.

docker/README.md: aggiunta sezione test completa con comandi per tutti
i test, singolo file e singola feature; aggiornato flusso completo.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 23:39:00 +02:00
davideandClaude Sonnet 4.6 65214ac34e test: espandi copertura a 110 test e organizza in gruppi
- Aggiunto converter_provider_test.dart (nuovo): stato iniziale, select,
  setGrams, result, swapDirection, reset, search
- Aggiunto qr_test.dart (nuovo): buildQrPayload e parseMealPlanFromQr
  con round-trip e casi di errore
- meal_planner_provider_test: group(), importPlan(), fallback JSON corrotto
- shopping_list_provider_test: group(), addAll con aggregazione quantity,
  fallback JSON corrotto
- shopping_item_test: campi quantity (default, copyWith, JSON round-trip)
- shopping_item_tile_test: group(), visualizzazione (xN)
- conversion_entry_test: caso limite yieldFactor=0
- meal_card_test: group()
- Rimosso widget_test.dart (boilerplate obsoleto)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 23:27:19 +02:00
davideandClaude Sonnet 4.6 9fcaae9687 fix(shopping_list): genera ID univoci in ShoppingListProvider
add() usava millisecondsSinceEpoch come ID: chiamate ravvicinate nello
stesso millisecondo producevano ID identici, causando toggle e remove
incorretti su più elementi. Introdotto _idSeq come contatore progressivo,
allineato all'approccio già usato in addAll().

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 23:27:04 +02:00
davideandClaude Sonnet 4.6 49e7bcdbfa refactor(meal_planner): estrai logica QR in qr_codec.dart
buildQrPayload e parseMealPlanFromQr erano metodi privati non testabili.
Estratti in un modulo dedicato e importati da qr_share_sheet e qr_scan_page.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 23:26:55 +02:00
davideandClaude Sonnet 4.6 9c24651ec2 fix: aggiungi permesso CAMERA e correggi sed in AndroidManifest.xml
build.sh: il permesso CAMERA viene iniettato dentro il container
Docker subito dopo flutter create (sed gira come root, evita il
problema di permessi su android/ owned by root).

entrypoint.sh: stesso approccio, sed eseguito già dentro il container.

Il sed inserisce <uses-permission android:name="android.permission.CAMERA" />
prima di <application>, posizione corretta nel manifest Android.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 23:09:26 +02:00
davideandClaude Sonnet 4.6 cebeaf889a feat: condivisione piano pasti via QR code
Porta la funzionalità QR code dalla versione Vue a Flutter.

Condividi: pulsante in fondo alla tab Pasti (attivo solo con piano
non vuoto) → bottom sheet con QR code generato da qr_flutter.
Payload: { "v": 1, "meals": { ... } }, limite 2953 byte.

Ricevi: pulsante sempre visibile → QrScanPage full-screen con
fotocamera via mobile_scanner, cornice di mira, validazione
struttura JSON e importazione via MealPlannerProvider.importPlan().

Nuovi package: qr_flutter ^4.1.0, mobile_scanner ^5.0.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 23:09:16 +02:00
davideandClaude Sonnet 4.6 404a5f44ac feat: aggrega duplicati nella lista della spesa con quantità
Quando si genera la lista dal piano pasti, gli alimenti ripetuti in
più giorni o slot vengono aggregati in un unico elemento con contatore.
Es. zucchine lunedì + mercoledì → "zucchine (x2)".

- ShoppingItem: aggiunto campo quantity (default 1, persistito in JSON)
- ShoppingListProvider.addAll: conta le occorrenze per nome
  (case-insensitive) e crea un ShoppingItem con quantity = conteggio
- ShoppingItemTile: mostra "(xN)" colorato in primary quando quantity > 1,
  diventa muted insieme al nome quando l'elemento è completato

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 18:54:22 +02:00
davideandClaude Sonnet 4.6 cba83c9559 feat: aggiungi guida utente e icona launcher
Guida utente:
- Pulsante info nell'AppBar principale
- InfoBottomSheet: icona app, versione, autore, licenza, link alla guida
- GuidePage: tre tab (Pasti / Converti / Spesa) con card e step numerati,
  portata dalla DocsPanel Vue originale

AppBar globale in app.dart con titolo dinamico per tab corrente.

Icona launcher:
- flutter_launcher_icons eseguito in build.sh prima di flutter build apk
  (sia debug che release) per applicare assets/icon-only.png all'APK.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 18:38:02 +02:00
davideandClaude Sonnet 4.6 36e8034efd feat: aggiungi container Docker dev e build per Flutter
docker/build/: build headless APK Android
- Dockerfile: Ubuntu 22.04 + Java 17 + Flutter stable + Android SDK
- build.sh: genera android/ automaticamente se mancante, poi
  flutter build apk; --release aggiunge zipalign + apksigner

docker/dev/: ambiente di sviluppo web con hot reload
- Dockerfile: Ubuntu 22.04 + Flutter stable (solo web, senza Android SDK)
- docker-compose.yml: espone porta 5173, monta il progetto come volume
- entrypoint.sh: inizializza web/ se mancante, flutter pub get,
  flutter run -d web-server su 0.0.0.0:5173

docker/README.md: documentazione aggiornata per entrambi i container;
rimossi Dockerfile e build.sh Vue/Capacitor non più usati.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 18:25:48 +02:00
davideandClaude Sonnet 4.6 aa88e2095b 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>
2026-05-16 17:41:45 +02:00
davideandClaude Sonnet 4.6 9a865a1479 test: aggiungi suite di test Flutter
Struttura specchia lib/features/:
- test/features/meal_planner/ — unit (DayPlan, MealPlan, provider) + widget (MealCard)
- test/features/converter/ — unit (ConversionEntry, formule rawToCooked/cookedToRaw)
- test/features/shopping_list/ — unit (ShoppingItem, provider) + widget (ShoppingItemTile)
- test/helpers/pump_app.dart — estensione PumpApp condivisa tra widget test
- integration_test/app_test.dart — e2e navigazione, shopping list, convertitore, meal planner

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 17:41:38 +02:00
davideandClaude Sonnet 4.6 eb7912421c feat: riscrivi app in Flutter
Riscrittura completa da Vue 3 + Capacitor a Flutter/Dart.

Architettura feature-based (lib/features/):
- meal_planner: modello MealPlan/DayPlan, provider, pagina e widget
- converter: modello ConversionEntry, provider con ricerca, pagina
- shopping_list: modello ShoppingItem, provider con deduplicazione, pagina e widget

Core:
- Material 3 con seed color #2d6a4f
- NavigationBar + IndexedStack (preserva stato dei tab)
- Portrait lock via SystemChrome
- Persistenza con shared_preferences
- 50+ alimenti × metodi cottura in assets/data/conversions.json

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 17:41:26 +02:00
davideandClaude Sonnet 4.6 d49b31f21d chore: rimuovi sorgente Vue 3, Vite e Playwright
Il progetto viene riscritto in Flutter. Eliminati tutti i file
Vue 3 (src/, tests/, public/), le configurazioni Vite/Vitest e
i test Playwright che non saranno più mantenuti.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 17:41:14 +02:00
davideandClaude Sonnet 4.6 3f79e30ecd chore: aggiorna SOP e CLAUDE.md per migrazione a Flutter
Riscritto sop.md con stack Flutter + Docker (container dev noVNC +
container build headless). Aggiornato CLAUDE.md con roadmap, architettura
target e mapping Vue→Flutter come riferimento per la riscrittura.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 16:43:26 +02:00
davideandClaude Sonnet 4.6 6293743fa1 chore: aggiungi CLAUDE.md e rimuovi skill UX locale
Aggiunta documentazione per Claude Code (comandi, architettura, testing,
pipeline Android). Rimossa la skill UX da .claude/skills/ non più necessaria.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 16:38:23 +02:00
davideandClaude Sonnet 4.6 febf2efb86 chore: bump version a 1.2.1 e aggiorna changelog
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:47:11 +02:00
davideandClaude Sonnet 4.6 47f4bcba28 feat: blocca orientamento in portrait su APK e browser
- Dockerfile: aggiunge android:screenOrientation="portrait" all'activity
  in AndroidManifest.xml per bloccare il portrait nativamente sull'APK
- App.vue: fixOrientation() rileva il landscape tramite dimensioni viewport
  e applica un counter-rotate CSS in modo che l'app rimanga visivamente
  in portrait anche da browser mobile (dev server)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:41:22 +02:00
davideandClaude Sonnet 4.6 3bd2b04a06 chore: bump version to 1.2.0 e aggiorna changelog
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 16:32:45 +02:00
davideandClaude Sonnet 4.6 f1bfa9a88c feat: aggiungi pulsante svuota piano settimanale
- Sposta .btn-clear da ShoppingList.vue (scoped) a style.css (globale)
- Aggiunge hasMeals, clearAll e btn-clear in MealPlanner.vue
- Aggiunge 4 test di integrazione per il nuovo pulsante

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 16:28:07 +02:00
davideandClaude Sonnet 4.6 cc866ae78c fix: aggiorna vite a 6.4.2 (path traversal, arbitrary file read)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 16:27:52 +02:00
davide 36cd84f32e chore: bump version to 1.1.0 e aggiorna documentazione
- package.json: versione 1.0.0 → 1.1.0
- CHANGELOG.md: aggiunta sezione [1.1.0]
- docs/guida-utente.md: aggiunte sezioni QR code condivisione/ricezione
- src/components/DocsPanel.vue: aggiunte card condivisione e ricezione piano
2026-04-02 23:06:32 +02:00
davide d79ce06278 feat: condivisione piano pasti via QR code
Merge branch 'qrcode'
2026-03-31 10:44:54 +02:00
davide 55257f849d fix: aggiungi permesso CAMERA all'AndroidManifest.xml generato da Capacitor 2026-03-31 10:44:09 +02:00
davideandClaude Sonnet 4.6 7dd1bce80f chore: merge main nel branch qrcode (fix vulnerabilità npm)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 10:20:03 +02:00
davideandClaude Sonnet 4.6 9b099dac83 fix: risolvi 6 vulnerabilità npm aggiornando vite e vitest
- Upgrade vite 5 → 6 (fix GHSA-67mh-4wv8-2f99: esbuild CORS dev server)
- Upgrade vitest 2 → 3 e @vitest/coverage-v8 2 → 3
- Rinomina vite.config.js → vite.config.mjs (richiesto da vite 6 ESM)
- Aggiorna requisito Node.js in README: 18.x → >= 20.x LTS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 10:15:55 +02:00
davideandClaude Sonnet 4.6 8685ea0aca feat: condivisione piano pasti via QR code
Aggiunge due pulsanti in fondo alla schermata Piano Pasti:
- "Condividi": genera un QR code con i dati della settimana
- "Ricevi": apre la fotocamera per scansionare il QR e importare il piano

Dipendenze aggiunte: qrcode, jsqr

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 23:13:21 +02:00
davideandClaude Sonnet 4.6 7a63706af5 chore: aggiorna versione a 1.0.0 e CHANGELOG
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 12:16:45 +01:00
davideandClaude Sonnet 4.6 5df7956069 fix: crea dist/ prima del docker run per evitare ownership root
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 11:57:33 +01:00
davideandClaude Sonnet 4.6 76cf672d80 fix: APK con --head ora copiato in dist/ invece di andare perso nella tmpdir
Con --head la DIST_DIR puntava alla directory temporanea che veniva cancellata
dal trap EXIT prima che l'utente potesse recuperare l'APK. L'APK viene ora
copiato esplicitamente in PROJECT_ROOT/dist/ dopo il docker run.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 11:50:55 +01:00
davideandClaude Sonnet 4.6 96f75df6f2 feat: supporto build APK release firmato nella pipeline Docker
- Dockerfile: CMD condizionale su BUILD_TYPE (debug default, release con
  assembleRelease + zipalign + apksigner)
- build.sh: flag --release, richiesta password interattiva, mount keystore
  come volume read-only (mai nell'immagine)
- .gitignore: aggiunto *.jks
- docker/README.md: documentazione build debug/release, keytool, flag combinabili

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 10:10:43 +01:00
davideandClaude Sonnet 4.6 0c2a227be2 chore: aggiorna versione a 0.9.1 e CHANGELOG
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 14:47:57 +01:00
davideandClaude Sonnet 4.6 e10bb2df4c test: aggiungi suite completa unit, integration ed e2e
- Unit (12+9): conversion.js (rawToCooked/cookedToRaw, edge case, inversa)
  e storage.js (save/load, round-trip, default fallback)
- Integration (17+12+14): Converter (ricerca, selezione, calcolo, swap, reset),
  MealPlanner (rendering, add/remove, generateShopping, deduplicazione),
  ShoppingList (add, toggle, remove, clearAll, contatore)
- E2E Playwright (6+6+7+10): navigation, meal-planner, converter, shopping-list
- Configurazione: vitest.config.js + playwright.config.js + tests/setup.js
- Script: test, test:coverage, test:e2e, test:e2e:ui

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 14:45:31 +01:00
davideandClaude Sonnet 4.6 09c9706938 docs: aggiungi requisiti di sviluppo al README
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 14:35:11 +01:00
davideandClaude Sonnet 4.6 ecbae836b3 feat: guida utente in-app e fix grafici Convertitore
- DocsPanel: pannello documentazione slide-from-right con nav a pill,
  IntersectionObserver per sezione attiva, card con step numerati e callout tip
- InfoPanel: bottone "Guida" emette open-docs invece di aprire link esterno
- App: integra DocsPanel con v-model showDocs
- Converter: fix capitalize food names (capFirst invece di text-transform),
  simmetria visiva input/output (stesso underline e font-size 1.6rem),
  rimosso CSS morto (doppio align-items, doppio background, visibility hack)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 14:32:36 +01:00
davideandClaude Sonnet 4.6 f24e591ca0 docs: riscrivi guida utente allineata allo stato attuale dell'app
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 14:10:00 +01:00
davide eef38a74cc Merge branch 'new-logo' 2026-03-27 14:07:32 +01:00
davide c44fc6b4ec chore: aggiorna icona app e favicon circolare con sfondo trasparente 2026-03-27 13:31:14 +01:00
davideandClaude Sonnet 4.6 32d8a267b9 chore: aggiorna CHANGELOG per v0.9.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 10:39:39 +01:00
davideandClaude Sonnet 4.6 74084767af fix docs: correggi percorso APK da output/ a dist/ in docker/README.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 10:24:49 +01:00
davideandClaude Sonnet 4.6 d2e6ac9186 docs: riscrivi README con funzionalità aggiornate e accesso da mobile
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 10:24:42 +01:00
davide 91e2bf5664 chore: aggiorna versione a 0.9.0 2026-03-27 09:58:25 +01:00
davideandClaude Sonnet 4.6 b12ab225cd fix Converter: sentence case per metodo di cottura
Sostituisce text-transform:capitalize (che maiuscolava ogni parola)
con capFirst() — solo la prima lettera del metodo è maiuscola.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 09:55:06 +01:00
davideandClaude Sonnet 4.6 bf18165dd5 espandi metodi di cottura per tutte le verdure
Aggiunge forno e friggitrice ad aria a ogni voce verdura dove
applicabile; aggiunge padella alle verdure che ne erano prive.
Documenta ogni valore derivato con metodologia e k-factor.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 09:54:58 +01:00
davideandClaude Sonnet 4.6 864d004cbd aggiungi generazione lista spesa dal piano pasti
Bottone "Genera lista della spesa" in fondo alla pagina Piano Pasti:
- raccoglie tutti gli item da tutti i giorni e pasti
- deduplica (case-insensitive) e salta item già presenti in lista
- aggiunge come non spuntati alla lista esistente
- naviga automaticamente alla tab Lista della spesa

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 23:35:14 +01:00
davideandClaude Sonnet 4.6 a3726ae3cc dev: esponi server Vite sulla rete locale (--host)
Permette di connettersi da altri dispositivi sulla stessa rete
tramite http://<ip>:5173 durante lo sviluppo.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 19:51:00 +01:00
davideandClaude Sonnet 4.6 414153f7d3 fix App.vue: usa safe-area-inset-top per btn-info su telefoni con notch
Su dispositivi con status bar alta o notch il bottone info finiva
sotto l'area di sistema e non era toccabile. Aggiunto env(safe-area-inset-top)
per posizionarlo sempre nell'area visibile.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 19:48:07 +01:00
davideandClaude Sonnet 4.6 79ecbb0729 aggiorna conversioni: dati reali con fonti verificate, aggiunge friggitrice ad aria
- docs/conversioni.md: sostituisce coefficienti placeholder con dati da fonti
  ufficiali (SINU, Istituto Muzzone, AEMMEDI, Nutrizionistadoc); aggiunge
  sezione friggitrice ad aria con regola derivata dal forno; nuovi alimenti:
  orzo, riso (4 varietà), spigola, sogliola, vitello, uova, verdure miste
- src/data/conversions.json: allineato al documento, include metodi friggitrice
  ad aria per pollo, tacchino, pesce, verdure e tuberi

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 19:41:52 +01:00
davideandClaude Sonnet 4.6 13ae623531 aggiorna docs/conversioni: dati reali da alimentinutrizione.it
- Sostituisce coefficienti placeholder con dati verificati (39 voci)
- Riorganizza in 5 categorie: cereali e pasta, legumi, verdure, carne, pesce
- Patate e funghi inclusi in Verdure
- Fonte: https://www.alimentinutrizione.it/presentazione-dati

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 13:45:45 +01:00
davideandClaude Sonnet 4.6 0e78955fe4 aggiungi documentazione e changelog
- README.md: panoramica app, stack, avvio dev, build APK, link docs
- CHANGELOG.md: standard Keep a Changelog, release 0.1.0-alpha completa
- docs/guida-utente.md: istruzioni Piano Pasti, Convertitore, Lista spesa
- docs/conversioni.md: tabella coefficienti con fonte alimentinutrizione.it

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 14:53:32 +01:00
davide 053c84aaa0 Merge branch 'wip-docker-build'
Aggiunge pipeline Docker per build APK Android:
- Dockerfile con Java 21, Android SDK 34, ImageMagick per icone
- build.sh con flag --head per build da ultimo commit
- Icone generate da assets/icon-only.png via ImageMagick
- Fix kotlin-stdlib conflict e versione da package.json
2026-03-25 12:30:20 +01:00
davide 595fe4310f fix Dockerfile: icone custom e versione da package.json
- Rimuove mipmap-anydpi-v26 per usare i PNG custom al posto delle
  adaptive icons di default; semplifica il loop con bash parameter
  expansion e cp invece di doppio convert
- Patcha android/app/build.gradle con versionName/versionCode letti
  da package.json prima della compilazione Gradle
2026-03-25 12:29:07 +01:00
davideandClaude Sonnet 4.6 083a38f858 fix Dockerfile: usa ImageMagick per icone Android invece di @capacitor/assets
@capacitor/assets usa sharp (nativo Node.js) che falliva silenziosamente
nel container Docker. ImageMagick è più affidabile e senza dipendenze native.
Genera ic_launcher.png e ic_launcher_round.png per tutte le densità mipmap.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 11:49:26 +01:00
davideandClaude Sonnet 4.6 51ad99d8c0 fix Dockerfile: genera icone Android da assets/icon-only.png
Aggiunge COPY assets/ e npx @capacitor/assets generate --android
per popolare i mipmap Android prima della build Gradle.
Senza questo step l'app mostrava l'icona di default di Capacitor.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 11:27:18 +01:00
davide e499ce6945 fix docker: APK in dist/ invece di output/
Rimuove la cartella output/ e monta dist/ in lettura/scrittura
così l'APK viene scritto direttamente in dist/biteplan.apk
2026-03-25 11:25:22 +01:00
davide 0516d1e819 fix Dockerfile: risolvi conflitto kotlin-stdlib duplicato
Kotlin 1.8+ incorpora jdk7/jdk8 nel main stdlib; Capacitor generava
un conflitto tra kotlin-stdlib:1.8.22 e kotlin-stdlib-jdk8:1.6.21.
Aggiunge una resolutionStrategy Gradle per forzare tutte le varianti
stdlib alla versione 1.8.22 dopo `npx cap add android`
2026-03-25 11:17:00 +01:00
davideandClaude Sonnet 4.6 a4e605d914 fix Dockerfile: cambia base image per Java 21
node:20-slim (Debian Bookworm) non ha openjdk-21 nei repo.
Usa eclipse-temurin:21-jdk-jammy (Adoptium/Ubuntu) come base
e installa Node.js 20 via NodeSource.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 11:02:51 +01:00
davideandClaude Sonnet 4.6 32c535410c fix Dockerfile: aggiorna Java 17 → 21 per Capacitor Android
Capacitor Android richiede source release 21, OpenJDK 17 causava
"error: invalid source release: 21" durante compileDebugJavaWithJavac.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 11:01:36 +01:00
davideandClaude Sonnet 4.6 674e8ecd31 fix build.sh: esegue npm ci prima del build Vite
Senza node_modules installati (host fresh) vite non era nel PATH.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 10:27:50 +01:00
davideandClaude Sonnet 4.6 d1b0cdd8e0 aggiungi setup Docker per build APK Android
- docker/Dockerfile: ambiente Node 20 + OpenJDK 17 + Android SDK 34
  dist/ ricevuto come volume montato dall'host (non buildata nel container)
- docker/build.sh: esegue npm run build locale poi lancia il container
  flag --head per buildare da HEAD ignorando modifiche non committate
- docker/README.md: requisiti host (x86_64 obbligatorio), utilizzo,
  pipeline e note su prima build (~10-15 min)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 10:24:19 +01:00
davideandClaude Sonnet 4.6 644ae01f7e aggiungi icona app a favicon e pannello info
- index.html: favicon PNG dal file assets/icon-only.png
- InfoPanel: sostituisce placeholder "B" con immagine reale dell'icona
- InfoPanel: pulizia CSS .app-icon (rimossi stili da div, aggiunto object-fit)
- public/favicon.png: copia dell'icona servita staticamente da Vite

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 09:47:31 +01:00
davideandClaude Sonnet 4.6 023a938872 aggiungi icona sorgente per Capacitor Assets
- assets/icon-only.png: icona 1024×1024 da usare con
  npx @capacitor/assets generate per generare le icone Android/iOS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 09:42:29 +01:00
davideandClaude Sonnet 4.6 0c15ea71d7 Ristruttura InfoPanel: rimuove duplicati, layout professionale
- Rimuove versione duplicata (era nell'header e nella lista)
- Rimuove descrizione ridondante e bottone Chiudi full-width
- Aggiunge icona app (quadrato verde con iniziale B)
- X per chiudere in alto a destra, tap overlay per dismissione
- Righe info in card con bordo, pattern iOS/Android settings

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 08:43:20 +01:00
davideandClaude Sonnet 4.6 f8ce9b859f Aggiunge pannello info app (bottom sheet)
- InfoPanel.vue: bottom sheet con nome, versione (da package.json),
  autore (Davide Grilli), licenza EUPL v1.2 e link documentazione
- App.vue: bottone info fisso in alto a destra, visibile da tutte
  le pagine, con animazione slide-up sul pannello

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 08:38:47 +01:00
davideandClaude Sonnet 4.6 d14f56cced Migliora header pagine e ridisegna Convertitore
MealPlanner:
- Titolo "Piano Pasti" (più breve e da app)
- Sottotitolo "Oggi, mercoledì 25 marzo" con data completa formattata

Converter:
- Layout calcolatrice: input sinistra | swap | risultato destra
- Card unificata con header alimento e footer fattore di resa
- Icona ricerca nell'input, stato iniziale con hint
- Titolo "Convertitore", sottotitolo descrittivo
- Tasto swap per invertire direzione invece del toggle

MealCard:
- Fix emoji pranzo 🌤️🍽️ (rendering universale)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 08:33:10 +01:00
davideandClaude Sonnet 4.6 76135e404a Migliora UI: design moderno, accordion pasti, fix UX
- style.css: shadows, transizioni, variabili --radius-sm/full,
  --color-primary-muted, --color-danger-muted
- BottomNav: icone SVG cross-platform, indicatore pill attivo,
  shadow verso l'alto
- MealCard: accordion (solo oggi aperto di default), badge voci
  quando chiusa, icone pasto, fix touch target btn-remove
- MealPlanner: rileva giorno corrente, mostra come sottotitolo
- Converter: chip alimento selezionato, result box con formula
  (es. 140g x 0.75 = 105g), layout migliorato
- ShoppingList: contatore X/Y completati, sezione separata voci
  spuntate, btn-clear ghost invece di solid rosso, empty state
- CheckboxItem: touch target 44px garantito, transizione checked,
  icona SVG per rimuovere, fix plurale "1 voce / N voci"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 08:20:57 +01:00
davideandClaude Sonnet 4.6 4413c8e7b6 Aggiunge skill /ux per frontend e UX design
Slash command che attiva il profilo senior frontend/UX designer.
Include checklist di revisione (touch, accessibilità, CSS, Vue 3)
e pattern di riferimento con le variabili CSS e componenti del progetto.
Formato SKILL.md conforme alla documentazione ufficiale Claude Code.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 00:10:09 +01:00