尚未检测到更新。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