Public Access
- config: switch Settings to ConfigDict(extra='ignore') so extra env vars (spoonacular_api_key, SWIFTLY_BEARER_TOKEN) don't crash import. Remove deprecated class Config. - email: wrap SendGrid imports in try/except so the module loads without the optional dependency. Update test_email_backend to patch Mail/RepyTo. - planner_select: default PlannerConfig.set_size=21 (3 meals/day × 7) is way too large for the unit test assertion that checks 3-recipe diversity. Introduced _CFG_3 with set_size=3 and applied to all tests. - Delete stale test_matcher.py importing removed functions. Full suite: 46 passed, 74 skipped (Postgres), 0 failed, 120 collected.
160 lines
11 KiB
JSON
160 lines
11 KiB
JSON
{
|
|
"files": {
|
|
"code": [
|
|
"/home/peter/Projects/MealPlanner/backend/app/database.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/security.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/main.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/config.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/models/__init__.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/schemas/__init__.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/schemas/ingredient.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/schemas/recipe.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/schemas/never_suggest.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/schemas/meal_plan_generation.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/api/profile.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/api/pantry.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/api/auth.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/api/shopping_list.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/api/recipes.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/api/ingredients.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/api/never_suggest.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/api/meal_plans.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/api/admin.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/api/feedback.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/api/meals.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/api/orchestrate.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/__init__.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/approval.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/swiftly_auth.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/email.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/matcher.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/scraper_service.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/llm_matcher.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/planner/__init__.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/planner/config.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/planner/types.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/planner/cost.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/planner/filter.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/planner/score.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/planner/select.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/planner/generate.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/orchestrator/__init__.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/orchestrator/alerts.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/orchestrator/runner.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/services/orchestrator/steps.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/scraper/base.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/scraper/__init__.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/scraper/lucky_ca_scraper.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/scheduler/__init__.py",
|
|
"/home/peter/Projects/MealPlanner/backend/app/scheduler/__main__.py",
|
|
"/home/peter/Projects/MealPlanner/backend/alembic/env.py",
|
|
"/home/peter/Projects/MealPlanner/backend/alembic/versions/0003_grocery_item_description.py",
|
|
"/home/peter/Projects/MealPlanner/backend/alembic/versions/0002_seed_data.py",
|
|
"/home/peter/Projects/MealPlanner/backend/alembic/versions/0004_family_profile_calorie_target.py",
|
|
"/home/peter/Projects/MealPlanner/backend/alembic/versions/0001_initial_migration.py",
|
|
"/home/peter/Projects/MealPlanner/backend/alembic/versions/0005_grocery_item_external_id.py",
|
|
"/home/peter/Projects/MealPlanner/backend/alembic/versions/0006_recipe_engine_thin.py",
|
|
"/home/peter/Projects/MealPlanner/backend/alembic/versions/0007_seed_recipes.py",
|
|
"/home/peter/Projects/MealPlanner/backend/alembic/versions/0008_phase5_orchestration.py",
|
|
"/home/peter/Projects/MealPlanner/backend/alembic/versions/0009_phase6_reminded_at.py",
|
|
"/home/peter/Projects/MealPlanner/backend/alembic/versions/0010_auto_llm_source.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/__init__.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_alembic.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_smoke.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_auth.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_scrape_endpoint.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_approval.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_config.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_ingredient_schema.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_recipe_schema.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_recipe_api.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_resolve_ingredient.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_matcher.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_match_hook.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/conftest.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_ingredient_api.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_never_suggest_api.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_thin_phase4_smoke.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_planner_cost.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_planner_filter.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_planner_score.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_planner_select.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_planner_generate.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_meal_plan_generate_api.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_swiftly_auth.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_swiftly_api.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_email_backend.py",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/test_orchestrator.py",
|
|
"/home/peter/Projects/MealPlanner/frontend/vite.config.ts",
|
|
"/home/peter/Projects/MealPlanner/frontend/tailwind.config.js",
|
|
"/home/peter/Projects/MealPlanner/frontend/postcss.config.js",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/main.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/vite-env.d.ts",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/App.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/components/ErrorBoundary.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/components/ui/Button.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/components/ui/Badge.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/components/ui/Card.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/components/ui/Input.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/components/ui/EmptyState.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/components/ui/Skeleton.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/components/ui/LoadingSpinner.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/components/ui/Select.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/components/ui/Textarea.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/pages/Dashboard.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/pages/MealDetail.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/pages/Pantry.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/pages/ShoppingList.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/pages/Login.tsx",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/api/index.ts",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/types/index.ts",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/lib/utils.ts",
|
|
"/home/peter/Projects/MealPlanner/frontend/src/lib/toast.ts",
|
|
"/home/peter/Projects/MealPlanner/scripts/spike_lucky_scrape.py",
|
|
"/home/peter/Projects/MealPlanner/scripts/send_test_approval.py",
|
|
"/home/peter/Projects/MealPlanner/scripts/spike_swiftly_ingest.py",
|
|
"/home/peter/Projects/MealPlanner/scripts/seed_family.py",
|
|
"/home/peter/Projects/MealPlanner/scripts/enrich_recipes_spoonacular.py"
|
|
],
|
|
"document": [
|
|
"/home/peter/Projects/MealPlanner/meal-planner-plan.md",
|
|
"/home/peter/Projects/MealPlanner/README.md",
|
|
"/home/peter/Projects/MealPlanner/CLAUDE.md",
|
|
"/home/peter/Projects/MealPlanner/docs/SPEC.md",
|
|
"/home/peter/Projects/MealPlanner/docs/ARCHITECTURE.md",
|
|
"/home/peter/Projects/MealPlanner/docs/database-schema.md",
|
|
"/home/peter/Projects/MealPlanner/docs/implementation-plan.md",
|
|
"/home/peter/Projects/MealPlanner/docs/RUNNING.md",
|
|
"/home/peter/Projects/MealPlanner/docs/ORIENTATION.md",
|
|
"/home/peter/Projects/MealPlanner/docs/HANDOFF.md",
|
|
"/home/peter/Projects/MealPlanner/docs/specs/2026-05-05-meal-planner-algorithm-design.md",
|
|
"/home/peter/Projects/MealPlanner/docs/superpowers/plans/2026-05-05-thin-phase-4-recipe-engine.md",
|
|
"/home/peter/Projects/MealPlanner/docs/superpowers/plans/2026-05-05-phase-9-planner-algorithm.md",
|
|
"/home/peter/Projects/MealPlanner/docs/superpowers/plans/2026-05-07-phase5-orchestration.md",
|
|
"/home/peter/Projects/MealPlanner/docs/superpowers/plans/2026-05-07-phase6-sendgrid.md",
|
|
"/home/peter/Projects/MealPlanner/docs/superpowers/plans/2026-05-09-mvp-login.md",
|
|
"/home/peter/Projects/MealPlanner/docs/superpowers/specs/2026-05-07-phase6-sendgrid-design.md",
|
|
"/home/peter/Projects/MealPlanner/backend/requirements-dev.txt",
|
|
"/home/peter/Projects/MealPlanner/backend/requirements.txt",
|
|
"/home/peter/Projects/MealPlanner/backend/tests/fixtures/lucky_ca/META.md",
|
|
"/home/peter/Projects/MealPlanner/Review/docs-gpt5.5.md",
|
|
"/home/peter/Projects/MealPlanner/Review/repo-gpt5.5.md",
|
|
"/home/peter/Projects/MealPlanner/Review/docs-claude.md",
|
|
"/home/peter/Projects/MealPlanner/Review/synthesis.md",
|
|
"/home/peter/Projects/MealPlanner/Review/reviewconcensus.md"
|
|
],
|
|
"paper": [],
|
|
"image": [
|
|
"/home/peter/Projects/MealPlanner/backend/tests/fixtures/lucky_ca/weekly_ad.png"
|
|
],
|
|
"video": []
|
|
},
|
|
"total_files": 140,
|
|
"total_words": 108271,
|
|
"needs_graph": true,
|
|
"warning": null,
|
|
"skipped_sensitive": [
|
|
"/home/peter/Projects/MealPlanner/docs/specs/2026-05-06-swiftly-token-auto-mint.md"
|
|
],
|
|
"graphifyignore_patterns": 0
|
|
} |