# Meal Setup

> Use when initializing the Meal OS project for the first time. Triggered by "/meal-setup" or "set up meal OS" or when any other meal skill fails because docs/ directories or canonical-ingredients.yaml are missing.

- Skill: `scurry/meal-setup` (Agent Skill)
- Install (CLI): `npx skillmds@latest add scurry/meal-setup`
- Raw SKILL.md: https://api.skillmd.com/api/skills/scurry/meal-setup/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: scurry (https://skillmd.com/u/scurry)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/scurry/meal-setup

---


# /meal-setup — Project Initialization

Create the Meal OS directory structure, seed `data/config.yaml` with household preferences, and seed `data/canonical-ingredients.yaml` with the core ingredient set.

**Announce at start:** "Setting up Meal OS project..."

## Step 1: Check Current State

Check what already exists to avoid overwriting:

```bash
ls data/ 2>/dev/null && echo "data exists" || echo "data missing"
ls data/config.yaml 2>/dev/null && echo "config exists" || echo "config missing"
ls data/canonical-ingredients.yaml 2>/dev/null && echo "yaml exists" || echo "yaml missing"
```

Report findings to the user before proceeding.

## Step 2: Create Directory Structure

Run:

```bash
mkdir -p data/recipes data/flyers data/meal-plans data/shopping-lists data/receipts/images/processed samples/flyers samples/meal-plans samples/shopping-lists samples/receipts
```

- `data/recipes/` holds family recipes (local household data, gitignored)
- `data/` directories are gitignored (local household data)
- `samples/` directories hold sanitized examples safe to commit

## Step 3: Create CLAUDE.md

**If `CLAUDE.md` already exists at repo root:** Skip this step — the user may have customized it.

If it does not exist, write `CLAUDE.md` at the project root:

```markdown
# Meal OS

Personal meal planning system for a family.

## Household Configuration

User-specific constraints (diet, excluded ingredients, stores, thresholds) live in `data/config.yaml`.
All skills read this file at startup. See `samples/config.sample.yaml` for the format and defaults.

If `data/config.yaml` is missing, run `/meal-setup` to create it.

## Directory Structure

### data/ — local household data (gitignored)
- data/config.yaml — household preferences (diet, stores, thresholds)
- data/recipes/ — one markdown file per recipe (from /meal-add)
- data/canonical-ingredients.yaml — authoritative ingredient normalization reference
- data/flyers/ — parsed weekly store flyers (from /meal-flyer)
- data/meal-plans/ — weekly meal plans (from /meal-plan)
- data/shopping-lists/ — aisle-grouped shopping lists (from /meal-plan)
- data/receipts/ — receipt images, price history ledger, and OCR aliases (from /meal-receipt)

### samples/ — sanitized examples (tracked in git)
- samples/flyers/, samples/meal-plans/, samples/shopping-lists/, samples/receipts/

## Skills
- /meal-add — recipe intake and normalization
- /meal-flyer — store flyer parsing + loss leader detection
- /meal-plan — weekly meal planning + shopping list generation
- /meal-receipt — receipt OCR, price tracking, and alias learning
```

## Step 4: Create config.yaml

**If the file already exists:** Ask — "data/config.yaml already exists. Overwrite with defaults (loses your customizations), or skip?"

If skip, go to Step 5.

If overwrite or creating new, ask the user these questions (use defaults if they say "use defaults"):
1. "What diet style? (e.g., mediterranean, whole30, paleo, keto, vegetarian, none)" — default: `mediterranean`
2. "Any ingredients to always exclude? (e.g., tuna, shellfish)" — default: none
3. "What grocery stores do you shop at?" — default: none (user must provide at least one)

Write `data/config.yaml` using the user's answers:

```yaml
# Meal OS — Household Configuration
# Edit this file to customize your meal planning preferences.

diet: [user's diet choice]

excluded_ingredients:
  - [user's excluded items, or omit section if none]

stores:
  - [user's stores]

rotation_target:
  min: 12
  max: 15

ingredient_thresholds:
  target: 18
  warning: 25
  too_complex: 35
```

## Step 5: Create canonical-ingredients.yaml

**If the file already exists:** Ask — "canonical-ingredients.yaml already exists. Overwrite with defaults (loses any custom entries), or skip?"

If skip, go to Step 6.

If overwrite or creating new, write `data/canonical-ingredients.yaml`:

```yaml
# Meal OS — Canonical Ingredient Reference
# Each entry: display_name, aisle, pantry_staple flag
# snake_case IDs are used in recipe files and flyer mappings.

proteins:
  chicken_thigh:
    display_name: Chicken Thighs
    aisle: Meat & Seafood
    pantry_staple: false
  salmon:
    display_name: Salmon
    aisle: Meat & Seafood
    pantry_staple: false
  shrimp:
    display_name: Shrimp
    aisle: Meat & Seafood
    pantry_staple: false
  chickpea:
    display_name: Chickpeas (canned)
    aisle: Canned & Dry Goods
    pantry_staple: false
  lentil:
    display_name: Lentils
    aisle: Canned & Dry Goods
    pantry_staple: true
  egg:
    display_name: Eggs
    aisle: Dairy & Eggs
    pantry_staple: false
  greek_yogurt:
    display_name: Greek Yogurt
    aisle: Dairy & Eggs
    pantry_staple: false
  white_bean:
    display_name: White Beans (canned)
    aisle: Canned & Dry Goods
    pantry_staple: false

vegetables:
  zucchini:
    display_name: Zucchini
    aisle: Produce
    pantry_staple: false
  bell_pepper:
    display_name: Bell Peppers
    aisle: Produce
    pantry_staple: false
  cherry_tomato:
    display_name: Cherry Tomatoes
    aisle: Produce
    pantry_staple: false
  cucumber:
    display_name: Cucumbers
    aisle: Produce
    pantry_staple: false
  spinach:
    display_name: Spinach / Baby Spinach
    aisle: Produce
    pantry_staple: false
  kale:
    display_name: Kale
    aisle: Produce
    pantry_staple: false
  green_bean:
    display_name: Green Beans
    aisle: Produce
    pantry_staple: false
  eggplant:
    display_name: Eggplant
    aisle: Produce
    pantry_staple: false
  potato:
    display_name: Potatoes
    aisle: Produce
    pantry_staple: false
  avocado:
    display_name: Avocado
    aisle: Produce
    pantry_staple: false

flavor_base:
  garlic:
    display_name: Garlic
    aisle: Produce
    pantry_staple: true
  lemon:
    display_name: Lemons
    aisle: Produce
    pantry_staple: false
  red_onion:
    display_name: Red Onion
    aisle: Produce
    pantry_staple: true
  olive_oil:
    display_name: Olive Oil
    aisle: Pantry
    pantry_staple: true

herbs_and_extras:
  feta:
    display_name: Feta Cheese
    aisle: Dairy & Eggs
    pantry_staple: false
  parsley:
    display_name: Fresh Parsley
    aisle: Produce
    pantry_staple: false
  oregano:
    display_name: Dried Oregano
    aisle: Pantry
    pantry_staple: true
  kalamata_olive:
    display_name: Kalamata Olives
    aisle: Canned & Dry Goods
    pantry_staple: false

grains:
  farro:
    display_name: Farro
    aisle: Grains & Pasta
    pantry_staple: true
  quinoa:
    display_name: Quinoa
    aisle: Grains & Pasta
    pantry_staple: true
  whole_wheat_pasta:
    display_name: Whole Wheat Pasta
    aisle: Grains & Pasta
    pantry_staple: true
  pita:
    display_name: Pita Bread
    aisle: Grains & Pasta
    pantry_staple: false
```

## Step 6: Confirm

Output:

```
Meal OS setup complete!

  CLAUDE.md: [created / skipped — already exists]
  Directories created:
  - data/recipes/         ← add recipes with /meal-add (local, gitignored)
  - data/flyers/          ← parsed flyers from /meal-flyer (local, gitignored)
  - data/meal-plans/      ← generated by /meal-plan (local, gitignored)
  - data/shopping-lists/  ← generated by /meal-plan (local, gitignored)
  - data/receipts/        ← receipt OCR and price tracking with /meal-receipt (local, gitignored)
  - samples/              ← sanitized examples (tracked in git)

  config.yaml: [created / skipped — already exists]
    Diet: [diet]
    Excluded: [list or "none"]
    Stores: [list]

  canonical-ingredients.yaml: [created with N ingredients / skipped — already exists]

Next steps:
  1. Run /meal-add to add your first recipe
  2. Run /meal-flyer to import this week's store flyer
  3. Run /meal-plan to generate your first weekly plan
  4. Edit data/config.yaml anytime to change your preferences
```

