尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗MVP Next.js per un planner alimentare assistito da logica locale deterministica.
npm install
npm run dev
npm test # Vitest: unit (src), API route (tests/api), componenti jsdom (tests/components)
npm run test:unit
npm run test:api
npm run test:components
npm run test:ai-eval
npm run test:e2e # Playwright pubblico + autenticato (se E2E_TEST_EMAIL/PASSWORD presenti)
npm run test:e2e:production # smoke contro https://dietsprintai.com (o PLAYWRIGHT_BASE_URL)
npm run lint
npm run build
npm run db:backup
Il progetto Supabase originale non esiste piu': la procedura per ricrearlo, riapplicare lo schema e riallineare le variabili Vercel e' in docs/supabase-restore.md. Finche' non viene ripristinato, registrazione, login e salvataggio piani in produzione non funzionano; planner e risultati Free restano operativi.
//onboarding/planner/results/pricing/register/login/forgot-password/account/account/privacy/admin/users/admin/privacy/admin/templates/legal/disclaimerIl comportamento con condizioni mediche selezionate nel planner e' controllato da NEXT_PUBLIC_MEDICAL_SCREENING_MODE:
warn (default): il piano viene generato come bozza con un avviso di review medica in cima.block: planner, salvataggio (POST /api/plans) e generazione AI (POST /api/plans/generate) rifiutano il profilo con errore 422.La decisione definitiva va presa con legale e nutrizionista; la checklist di go-live e' in docs/go-live-checklist.md.
Le sessioni dell'app sono gestite da Auth.js (next-auth@5) con strategia JWT. Supabase Auth continua a gestire utenti, password, conferma email e recupero password. Il token Supabase resta nel cookie cifrato Auth.js e viene usato lato server per rispettare le policy RLS.
Genera e configura un segreto server-only:
AUTH_SECRET=
Non esporre il magic link come metodo di login.
In Supabase vai su Authentication > Providers > Email e abilita:
Per conferma account, in Confirm signup usa:
<a href="{{ .SiteURL }}/auth/confirm?token_hash={{ .TokenHash }}&type=signup">Conferma account</a>
Per recupero password, in Reset password usa:
<a href="{{ .SiteURL }}/auth/confirm?token_hash={{ .TokenHash }}&type=recovery&next=/account/password">Reimposta password</a>
In Authentication > URL Configuration imposta:
https://dietsprintai.comhttps://dietsprintai.com/auth/confirmhttps://www.dietsprintai.com/auth/confirmhttps://appdietasprint.vercel.app/auth/confirmhttp://127.0.0.1:3000/auth/confirmIl progetto usa database e autenticazione Supabase quando le variabili pubbliche Supabase sono configurate.
Le email applicative usano Resend lato server. Le email di conferma account e recupero password usano Resend tramite il custom SMTP di Supabase Auth.
Configurazione SMTP Supabase:
Host: smtp.resend.com
Porta: 465
Username: resend
Mittente: Diet Sprint AI <[email protected]>
La password SMTP e' una API key Resend con permesso di invio sul dominio dietsprintai.com. Non salvarla nel repository.
Variabili server-only:
RESEND_API_KEY=
RESEND_FROM_EMAIL="Diet Sprint AI <[email protected]>"
PRIVACY_NOTIFICATION_EMAIL=
Lo snapshot iniziale vive in supabase/schema.sql. Le migrazioni versionate vivono in supabase/migrations.
La procedura operativa per backup e restore vive in docs/backup-restore-runbook.md.
La procedura preview/staging vive in docs/preview-staging.md.
La checklist security, accessibilita e performance vive in docs/security-accessibility-performance.md.
Le tabelle MVP sono:
user_profilesmeal_plansprivacy_consentsdata_subject_requestsstripe_purchasesdata_subject_request_audit_eventsadmin_meal_templatesTutte hanno Row Level Security attiva. Le policy consentono agli utenti autenticati di accedere solo ai propri dati.
Comandi database:
npm run db:backup
npm run db:restore -- backups/supabase-YYYY-MM-DD.dump
Il backlog interno vive su /admin/backlog ed e' protetto lato server. La voce di menu appare solo agli utenti admin.
La sorgente dati della UI backlog e' src/lib/productBacklog.ts; il riepilogo markdown unico vive in PROJECT_SUMMARY_AND_BACKLOG.md.
Pannelli admin disponibili:
/admin/users: ricerca utenti e sblocco Free/Premium per supporto./admin/privacy: coda richieste GDPR con audit trail append-only./admin/templates: catalogo template pasti e CRUD dei template gestiti in database.Per creare l'admin rdladmin:
Opzione consigliata, script locale:
set NEXT_PUBLIC_SUPABASE_URL=https://PROJECT_REF.supabase.co
set SUPABASE_SERVICE_ROLE_KEY=service-role-key
set [email protected]
set ADMIN_USERNAME=rdladmin
npm run admin:create
Lo script chiedera' la password senza salvarla nel repository. In PowerShell usa $env:NOME_VARIABILE="valore" al posto di set.
Opzione manuale:
{
"username": "rdladmin",
"role": "admin"
}
[email protected]
ADMIN_USERNAMES=rdladmin
Non salvare password admin in codice, README o variabili pubbliche NEXT_PUBLIC_*.
Premium usa Stripe Checkout in modalita pagamento una tantum. Il bottone su /pricing crea una sessione server-side per utenti autenticati e il webhook sblocca Premium aggiornando gli app metadata Supabase (plan=premium, tier=premium, accessLevel=premium) e registrando l'acquisto in stripe_purchases.
Variabili server-only:
STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET=
STRIPE_PREMIUM_PRICE_ID=
Endpoint webhook da configurare in Stripe:
https://dietsprintai.com/api/stripe/webhook
Eventi necessari:
checkout.session.completedcheckout.session.async_payment_succeededPer staging o sblocco manuale resta disponibile il fallback via app metadata Supabase (plan=premium, tier=premium o accessLevel=premium) oppure con la variabile server-only PREMIUM_EMAILS.
Il layer AI (src/lib/ai/provider.ts) e' indipendente dal provider: con AI_PROVIDER=auto usa Anthropic se ANTHROPIC_API_KEY e' presente, altrimenti OpenAI se OPENAI_API_KEY e' presente, altrimenti il fallback deterministico locale.
/api/coach: coach per utenti Premium autenticati. Il prompt resta server-side e passa dai guardrail salute prima e dopo la generazione./api/plans/generate: generazione piano AI per utenti Premium. La risposta del modello viene validata contro lo schema del planner (slot pasto, calorie entro il 12%, ingredienti esclusi, claim medici) e in caso di dubbio si torna al generatore deterministico; il campo source dice se il piano e' ai o fallback.Variabili server-only:
AI_PROVIDER=auto
ANTHROPIC_API_KEY=
ANTHROPIC_MODEL=claude-opus-5-5
OPENAI_API_KEY=
OPENAI_MODEL=gpt-5.4-mini
Il dataset di regressione vive in tests/evals/ai-coach-cases.json e si esegue con:
npm run test:ai-eval