feat: preferences, exclusion-aware planner, /onboarding (PRD §5.1, §3)
Preferences (PRD §5.1)
- @ketopath/shared: zod schemas + EXCLUSION_GROUPS, CUISINE_TAGS,
COOKING_TIMES, FASTING_PROTOCOL_VALUES
- apps/api: GET/PATCH /me/preferences (exclusions, cuisinePreferences,
cookingTime, fastingProtocol)
- apps/web: PreferencesForm chip-based + PreferencesSection wired into
/profile so existing users can edit
- Plan generation now aggregates Ingredient.exclusionGroups → Recipe
exclusionTags so matchMeals filters out excluded recipes
Onboarding (PRD §3)
- /onboarding multi-step (profile → preferences → done) with smart-jump:
starts at the first incomplete step
- ProfileForm gains optional onSaved/saveLabel for reuse outside /profile
- Redirect chain updated: /welcome accept → /onboarding (was /profile);
/plan, /tracking, /shopping redirect missing profiles to /onboarding
- /profile remains the editing surface for returning users
i18n
- New Onboarding + Preferences namespaces (it)
Smoke tested end-to-end: selected fish exclusion, regenerated the plan,
verified Salmone/Branzino/Tonno are filtered out and unaffected recipes
(Frittata, Pollo, Mandorle, Polpette) remain.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>