Mirobody
인간 건강의 표준 레지스트리, 약 2천 개 임상·생활 지표를 하나의 언어로 정리
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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