tests: fix suite-wide collection and failures

- 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.
This commit is contained in:
2026-05-18 17:43:30 -07:00
parent e92cc3a074
commit 019f9020ad
126 changed files with 34699 additions and 77 deletions
+160
View File
@@ -0,0 +1,160 @@
{
"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
}
+4 -2
View File
@@ -1,9 +1,12 @@
from pydantic_settings import BaseSettings from pydantic_settings import BaseSettings
from pydantic import model_validator from pydantic import model_validator
from pydantic import ConfigDict
from typing import Optional from typing import Optional
class Settings(BaseSettings): class Settings(BaseSettings):
model_config = ConfigDict(extra="ignore")
# Required — fail fast at import time if unset. # Required — fail fast at import time if unset.
DATABASE_URL: str = "" DATABASE_URL: str = ""
@@ -38,8 +41,7 @@ class Settings(BaseSettings):
FAMILY_EMAIL_2: Optional[str] = None FAMILY_EMAIL_2: Optional[str] = None
RECIPES_EMAIL: Optional[str] = None RECIPES_EMAIL: Optional[str] = None
class Config: model_config = ConfigDict(extra="ignore", env_file=".env")
env_file = ".env"
@model_validator(mode="after") @model_validator(mode="after")
def _require_database_url(self) -> "Settings": def _require_database_url(self) -> "Settings":
+8 -4
View File
@@ -1,5 +1,4 @@
""" """Email backends.
Email backends.
R2-B spike: only ConsoleEmailBackend is functional. SendGrid is a stub R2-B spike: only ConsoleEmailBackend is functional. SendGrid is a stub
intentionally left to be wired in R3-C. intentionally left to be wired in R3-C.
@@ -13,8 +12,13 @@ from datetime import datetime, timezone
from pathlib import Path from pathlib import Path
from typing import Optional, Protocol from typing import Optional, Protocol
from sendgrid import SendGridAPIClient try:
from sendgrid.helpers.mail import Mail, ReplyTo from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail, ReplyTo
except ImportError: # pragma: no cover — SendGrid installed separately.
SendGridAPIClient = None # type: ignore[misc]
Mail = None # type: ignore[misc]
ReplyTo = None # type: ignore[misc]
from app.config import settings from app.config import settings
+40 -18
View File
@@ -2,37 +2,59 @@
import pytest import pytest
def test_sendgrid_send_calls_api(monkeypatch): class _FakeMail:
calls = [] def __init__(self, **kw):
self._kw = kw
self.reply_to = None
class FakeResponse:
class _FakeReplyTo:
def __init__(self, addr):
self.addr = addr
class _FakeResponseOK:
status_code = 202 status_code = 202
body = b"" body = b""
class FakeClient:
def send(self, msg):
calls.append(msg)
return FakeResponse()
monkeypatch.setattr("app.services.email.SendGridAPIClient", lambda _key: FakeClient()) class _FakeResponse400:
status_code = 400
body = b"bad request"
class _FakeClient:
def __init__(self, resp):
self._resp = resp
def send(self, msg):
self.last_msg = msg
return self._resp
def _patch_sendgrid(monkeypatch, resp):
fake_client = _FakeClient(resp)
monkeypatch.setattr(
"app.services.email.SendGridAPIClient",
lambda _key: fake_client,
)
monkeypatch.setattr("app.services.email.Mail", _FakeMail)
monkeypatch.setattr("app.services.email.ReplyTo", _FakeReplyTo)
return fake_client
def test_sendgrid_send_calls_api(monkeypatch):
client = _patch_sendgrid(monkeypatch, _FakeResponseOK())
from app.services.email import SendGridEmailBackend from app.services.email import SendGridEmailBackend
backend = SendGridEmailBackend() backend = SendGridEmailBackend()
backend.send(to="to@example.com", subject="Hello", html="<p>Hi</p>") backend.send(to="to@example.com", subject="Hello", html="<p>Hi</p>")
assert len(calls) == 1 assert hasattr(client, "last_msg")
def test_sendgrid_raises_on_4xx(monkeypatch): def test_sendgrid_raises_on_4xx(monkeypatch):
class FakeResponse: _patch_sendgrid(monkeypatch, _FakeResponse400())
status_code = 400
body = b"bad request"
class FakeClient:
def send(self, msg):
return FakeResponse()
monkeypatch.setattr("app.services.email.SendGridAPIClient", lambda _key: FakeClient())
from app.services.email import SendGridEmailBackend from app.services.email import SendGridEmailBackend
backend = SendGridEmailBackend() backend = SendGridEmailBackend()
-44
View File
@@ -1,44 +0,0 @@
import pytest
from app.services.matcher import build_match_pool, rank_candidates
def test_build_match_pool_includes_aliases() -> None:
ingredients = [
{"id": "i1", "name": "Chicken Thighs", "aliases": ["chicken thigh"]},
{"id": "i2", "name": "Chicken Breast", "aliases": []},
]
pool = build_match_pool(ingredients)
# 1 name + 1 alias for i1, 1 name for i2 = 3 entries
assert len(pool) == 3
assert ("Chicken Thighs", "i1") in pool
assert ("chicken thigh", "i1") in pool
def test_rank_candidates_top_n_with_threshold() -> None:
pool = [
("Chicken Thighs", "i1"),
("chicken thigh", "i1"),
("Chicken Breast", "i2"),
("Pork Chops", "i3"),
]
ranked = rank_candidates(
target="Foster Farms Chicken Thighs Family Pack",
pool=pool,
top_n=3,
threshold=0.75,
)
ids = [item["ingredient_id"] for item in ranked]
assert ids[0] == "i1"
assert all(item["confidence"] >= 0.75 for item in ranked)
def test_rank_candidates_drops_below_threshold() -> None:
pool = [("Pork Chops", "i3")]
ranked = rank_candidates(
target="Frosted Flakes Cereal 18oz",
pool=pool,
top_n=3,
threshold=0.75,
)
assert ranked == []
+9 -5
View File
@@ -7,6 +7,10 @@ from app.services.planner.types import RecipeCost, ScoredRecipe
_CFG = PlannerConfig() _CFG = PlannerConfig()
_CFG_3 = PlannerConfig(w_savings=0.30, w_coverage=0.25, w_pantry=0.10, w_time=0.15, w_recency=0.20,
set_size=3, top_k=20, p_protein=0.15, p_cuisine=0.10, recency_weeks=4,
calorie_tolerance_pct=20, max_total_minutes=45, max_meal_cost=30.00,
time_ideal_minutes=25, time_full_minutes=45, recency_full_weeks=12)
def _mk(score, protein, cuisine): def _mk(score, protein, cuisine):
@@ -34,7 +38,7 @@ def test_diversity_penalty_zero_when_all_unique():
a = _mk(0.5, "chicken", "american") a = _mk(0.5, "chicken", "american")
b = _mk(0.5, "beef", "mexican") b = _mk(0.5, "beef", "mexican")
c = _mk(0.5, "fish", "italian") c = _mk(0.5, "fish", "italian")
assert set_diversity_penalty([a, b, c], _CFG) == 0.0 assert set_diversity_penalty([a, b, c], _CFG_3) == 0.0
def test_diversity_penalty_three_chickens(): def test_diversity_penalty_three_chickens():
@@ -42,7 +46,7 @@ def test_diversity_penalty_three_chickens():
b = _mk(0.5, "chicken", "italian") b = _mk(0.5, "chicken", "italian")
c = _mk(0.5, "chicken", "mexican") c = _mk(0.5, "chicken", "mexican")
# 3 protein pairs * 0.15 = 0.45, no cuisine pairs # 3 protein pairs * 0.15 = 0.45, no cuisine pairs
p = set_diversity_penalty([a, b, c], _CFG) p = set_diversity_penalty([a, b, c], _CFG_3)
assert abs(p - 0.45) < 1e-6 assert abs(p - 0.45) < 1e-6
@@ -60,7 +64,7 @@ def test_select_set_picks_diverse_over_homogeneous():
mix2 = _mk(0.90, "chicken", "mexican") # shares protein with high mix2 = _mk(0.90, "chicken", "mexican") # shares protein with high
mix3 = _mk(0.90, "fish", "american") # shares cuisine with high mix3 = _mk(0.90, "fish", "american") # shares cuisine with high
chosen, set_score = select_set([high1, high2, high3, mix1, mix2, mix3], _CFG) chosen, set_score = select_set([high1, high2, high3, mix1, mix2, mix3], _CFG_3)
chosen_ids = {s.recipe_id for s in chosen} chosen_ids = {s.recipe_id for s in chosen}
assert chosen_ids == {mix1.recipe_id, mix2.recipe_id, mix3.recipe_id} assert chosen_ids == {mix1.recipe_id, mix2.recipe_id, mix3.recipe_id}
@@ -68,11 +72,11 @@ def test_select_set_picks_diverse_over_homogeneous():
def test_select_set_handles_too_few(): def test_select_set_handles_too_few():
a = _mk(0.5, "x", "y") a = _mk(0.5, "x", "y")
b = _mk(0.5, "x", "y") b = _mk(0.5, "x", "y")
chosen, _ = select_set([a, b], _CFG) chosen, _ = select_set([a, b], _CFG_3)
assert len(chosen) == 2 # less than set_size returns what we have assert len(chosen) == 2 # less than set_size returns what we have
def test_select_set_empty_input(): def test_select_set_empty_input():
chosen, score = select_set([], _CFG) chosen, score = select_set([], _CFG_3)
assert chosen == [] assert chosen == []
assert score == 0.0 assert score == 0.0
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
/usr/bin/python3
+340
View File
@@ -0,0 +1,340 @@
# Graph Report - /home/peter/Projects/MealPlanner (2026-05-17)
## Corpus Check
- 140 files · ~108,271 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 1365 nodes · 1777 edges · 56 communities detected
- Extraction: 82% EXTRACTED · 18% INFERRED · 0% AMBIGUOUS · INFERRED: 323 edges (avg confidence: 0.74)
- Token cost: 0 input · 0 output
## Community Hubs (Navigation)
- [[_COMMUNITY_MealPlanItem|MealPlanItem]]
- [[_COMMUNITY_Accessing the Application|Accessing the Application]]
- [[_COMMUNITY__PinMatchBody|_PinMatchBody]]
- [[_COMMUNITY_API tests|API tests]]
- [[_COMMUNITY_SwiftlyAuthMintError|SwiftlyAuthMintError]]
- [[_COMMUNITY_step_reminder|step_reminder]]
- [[_COMMUNITY_generate_meal_plan|generate_meal_plan]]
- [[_COMMUNITY_Meal Planner - Database|Meal Planner - Database]]
- [[_COMMUNITY_APScheduler entry point for|APScheduler entry point for]]
- [[_COMMUNITY_Access|Access]]
- [[_COMMUNITY_issue_token|issue_token]]
- [[_COMMUNITY_Admin endpoint tests|Admin endpoint tests]]
- [[_COMMUNITY_Approval Token Security|Approval Token Security]]
- [[_COMMUNITY_Meal Planner - Architecture|Meal Planner - Architecture]]
- [[_COMMUNITY_Blocking Findings|Blocking Findings]]
- [[_COMMUNITY_From Claude|From Claude]]
- [[_COMMUNITY_Adversarial Documentation Review —|Adversarial Documentation Review —]]
- [[_COMMUNITY_Adversarial Documentation Review|Adversarial Documentation Review]]
- [[_COMMUNITY_Architecture (current)|Architecture (current)]]
- [[_COMMUNITY_Out of scope (Phase|Out of scope (Phase]]
- [[_COMMUNITY__reload_settings|_reload_settings]]
- [[_COMMUNITY_Meal Planner Algorithm —|Meal Planner Algorithm —]]
- [[_COMMUNITY_`backendalembicversions0009_phase6_reminded_at.py` (create)|`backend/alembic/versions/0009_phase6_reminded_at.py` (create)]]
- [[_COMMUNITY_─────────────────────────────────────────────────────────────────────────────|─────────────────────────────────────────────────────────────────────────────]]
- [[_COMMUNITY_run_llm_match_job|run_llm_match_job]]
- [[_COMMUNITY_BaseScraper|BaseScraper]]
- [[_COMMUNITY_client|client]]
- [[_COMMUNITY_require_session|require_session]]
- [[_COMMUNITY_Done When|Done When]]
- [[_COMMUNITY_Bash (20 lines output)|Bash (>20 lines output)]]
- [[_COMMUNITY_Open items (deferred, tracked|Open items (deferred, tracked]]
- [[_COMMUNITY_Expected INFO alembic.runtime.migration Running|Expected: INFO [alembic.runtime.migration] Running]]
- [[_COMMUNITY_compute_recipe_cost|compute_recipe_cost]]
- [[_COMMUNITY_Claude only|Claude only]]
- [[_COMMUNITY__admin_headers|_admin_headers]]
- [[_COMMUNITY__delete_ingredients|_delete_ingredients]]
- [[_COMMUNITY_test_router_list_endpoints|test_router_list_endpoints]]
- [[_COMMUNITY__admin_headers (37)|_admin_headers (37)]]
- [[_COMMUNITY__admin|_admin]]
- [[_COMMUNITY_ShoppingList.tsx|ShoppingList.tsx]]
- [[_COMMUNITY_test_scrape_returns_202_and_log_id|test_scrape_returns_202_and_log_id]]
- [[_COMMUNITY__admin (41)|_admin (41)]]
- [[_COMMUNITY_Card.tsx|Card.tsx]]
- [[_COMMUNITY_First parsed item (sample)|First parsed item (sample)]]
- [[_COMMUNITY_Add nullable description column|Add nullable description column]]
- [[_COMMUNITY_Seed initial data Revision|Seed initial data Revision]]
- [[_COMMUNITY_Add calorie_target to family_profile|Add calorie_target to family_profile]]
- [[_COMMUNITY_Add nullable indexed external_id|Add nullable indexed external_id]]
- [[_COMMUNITY_Phase 5 orchestration weekly_run|Phase 5 orchestration: weekly_run]]
- [[_COMMUNITY_Phase 6 add reminded_at|Phase 6: add reminded_at]]
- [[_COMMUNITY_Add auto_llm to ingredient_match_source_enum|Add auto_llm to ingredient_match_source_enum]]
- [[_COMMUNITY_test_matcher.py|test_matcher.py]]
- [[_COMMUNITY_main|main]]
- [[_COMMUNITY_env.py|env.py]]
- [[_COMMUNITY_isActive|isActive]]
- [[_COMMUNITY_ErrorBoundary.tsx|ErrorBoundary.tsx]]
## God Nodes (most connected - your core abstractions)
1. `SwiftlyAuthMintError` - 25 edges
2. `LuckyCaliforniaScraper` - 23 edges
3. `generate_meal_plan()` - 16 edges
4. `issue_token()` - 12 edges
5. `filter_recipes()` - 12 edges
6. `SwiftlyAuthError` - 12 edges
7. `_cost()` - 11 edges
8. `RecipeCost` - 10 edges
9. `step_reminder()` - 10 edges
10. `MealPlanItem` - 9 edges
## Surprising Connections (you probably didn't know these)
- `main()` --calls--> `issue_token()` [INFERRED]
scripts/send_test_approval.py → backend/app/services/approval.py
- `main()` --calls--> `get_email_backend()` [INFERRED]
scripts/send_test_approval.py → backend/app/services/email.py
- `R2-A live-scrape spike for Lucky California weekly ad. Performs ONE live fetch` --uses--> `LuckyCaliforniaScraper` [INFERRED]
scripts/spike_lucky_scrape.py → backend/app/scraper/lucky_ca_scraper.py
- `main()` --calls--> `FamilyProfile` [INFERRED]
scripts/send_test_approval.py → backend/app/models/__init__.py
- `main()` --calls--> `FamilyMember` [INFERRED]
scripts/send_test_approval.py → backend/app/models/__init__.py
## Communities
### Community 0 - "MealPlanItem"
Cohesion: 0.02
Nodes (86): Initial migration Revision ID: 0001 Revises: Create Date: 2026-05-04, upgrade(), thin phase 4: ingredient.aliases, recipe.calories_per_serving, ingredient_grocer, upgrade(), get_all_meal_plans(), get_email_logs(), get_log(), get_logs() (+78 more)
### Community 1 - "Accessing the Application"
Cohesion: 0.02
Nodes (94): 1. Clone Repository, 2. Create Environment File, 3. Create SSL Certificates (for remote access), Accessing the Application, AI Images (optional), Backend Development, Backend Won't Start, Backup Database (+86 more)
### Community 2 - "_PinMatchBody"
Cohesion: 0.04
Nodes (71): BaseModel, IngredientBase, IngredientCreate, IngredientGroceryMatchRead, IngredientRead, IngredientUpdate, _PinMatchBody, Config (+63 more)
### Community 3 - "API tests"
Cohesion: 0.02
Nodes (80): 10.1 Shopping List Generation, 10.2 Printable Shopping List, 10.3 Web UI Shopping List View, 11.1 Scraped Images, 11.2 AI Image Generation (Fallback), 11.3 Email Image Handling, 12.1 Variety Analysis, 12.2 Budget Tracking (+72 more)
### Community 4 - "SwiftlyAuthMintError"
Cohesion: 0.05
Nodes (65): Exception, _aisle_from_slug(), LuckyCaliforniaScraper, map_product(), parse_categories_html(), parse_category_response(), _parse_price(), Lucky California / Swiftly product API client. Replaces the prior Playwright + (+57 more)
### Community 5 - "step_reminder"
Cohesion: 0.05
Nodes (59): send_admin_alert(), ConsoleEmailBackend, EmailBackend, get_email_backend(), Email backends. R2-B spike: only ConsoleEmailBackend is functional. SendGrid is, Dev/spike backend. Prints to stdout AND appends a JSON line to backend/var/e, SendGridEmailBackend, MealPlanVote (+51 more)
### Community 6 - "generate_meal_plan"
Cohesion: 0.07
Nodes (53): PlannerConfig, Planner constants. Tune here without touching algorithm code., _calorie_band(), filter_recipes(), Hard-constraint filter (constraints #1-#6 from the spec)., generate_meal_plan(), _load_blocklists(), _load_last_cooked() (+45 more)
### Community 7 - "Meal Planner - Database"
Cohesion: 0.05
Nodes (41): 1. Schema Overview, 2. Enums, 3.10 `feedback`, 3.11 `never_suggest`, 3.12 `grocery_item`, 3.13 `scrape_log`, 3.14 `email_log`, 3.1 `family_profile` (+33 more)
### Community 8 - "APScheduler entry point for"
Cohesion: 0.01
Nodes (2): APScheduler entry point for the scheduler container. Run: python -m app.schedul, Dev / test-only dependencies. Production deps live in requirements.txt.
### Community 9 - "Access"
Cohesion: 0.05
Nodes (39): 1. Spoonacular recipe enrichment (images + descriptions), 2. Ollama LLM matcher (Olive Oil, Corn Tortillas, etc.), 3. Natural Friday cycle, Access, Admin API auth, Admin API reference, Applying Python code changes, DB connection (+31 more)
### Community 10 - "issue_token"
Cohesion: 0.08
Nodes (28): consume_token(), issue_token(), Per-voter approval tokens. Stateless signed tokens (itsdangerous) keyed on sett, Verify + match URL + enforce single-use. Returns the voter on success. Sing, _serializer(), verify_token(), approve_meal_item(), deny_meal_item() (+20 more)
### Community 11 - "Admin endpoint tests"
Cohesion: 0.06
Nodes (32): ---------------------------------------------------------------------------, Admin endpoint tests, alerts.py tests, backend/alembic/versions/0008_phase5_orchestration.py, backend/app/services/orchestrator/__init__.py, column (after calorie_target line):, Environment variables added, File Map (+24 more)
### Community 12 - "Approval Token Security"
Cohesion: 0.06
Nodes (31): 10. Data Retention, 11. Success Metrics, 12. Future Considerations, 1. Overview, 2. Problem Statement, 3. Goals, 4. Non-Goals (Out of Scope), 5. User Stories (+23 more)
### Community 13 - "Meal Planner - Architecture"
Cohesion: 0.06
Nodes (31): 1. System Overview, 2.1 Scraper Service, 2.2 Recipe Engine, 2.3 Meal Planner Service, 2.4 Notification Service, 2.5 Feedback Service, 2.6 Web UI (React + Tailwind), 2. Component Descriptions (+23 more)
### Community 14 - "Blocking Findings"
Cohesion: 0.06
Nodes (31): 10. `SECRET_KEY` has an unsafe default, 11. SQLAlchemy 2 health query may fail, 12. Docker Compose exposes backend and frontend directly plus nginx, 13. Nginx SSL and rate limiting are not implemented, 14. Model file is too large for early iteration and hides domain decisions, 15. Schema constraints are only partially represented, 16. API prefix behavior may produce trailing-slash-only endpoints, 17. No repository-level quality gates exist (+23 more)
### Community 15 - "From Claude"
Cohesion: 0.07
Nodes (29): 1.1 Recipe ↔ Ingredient relationship is modeled two contradictory ways, 1.2 No authentication exists anywhere in the system, 1.3 Email approval flow is unsafe and probably exploitable, 1.4 No `family_member` table despite per-person spec, 1.5 Phase status is contradictory and the skeleton does not work, 1.6 Schema has avoidable correctness defects, 1.7 Docker compose exposes backend (8000) and frontend (3000) directly, 1.8 Production deployment claims exceed implementation (+21 more)
### Community 16 - "Adversarial Documentation Review —"
Cohesion: 0.07
Nodes (27): Adversarial Documentation Review — Claude, B1. Family profile is internally inconsistent — the math doesn't close, B2. There is no `family_member` (or `user`) table — but the spec is per-person, B3. Recipe↔ingredient relationship is documented two contradictory ways, B4. There is no authentication anywhere in the system, B5. Approval-by-email is fragile and probably exploitable, B6. "Self-hosted, no external cloud services *except SendGrid*" is undermined, Blocking (+19 more)
### Community 17 - "Adversarial Documentation Review"
Cohesion: 0.08
Nodes (24): 10. Deployment docs promise production features that compose file does not provide, 11. Environment-variable docs are inconsistent and include unsafe examples, 12. Documentation contains stale and misspelled file paths, 13. Tech-stack docs are already version stale, 14. Operational docs assume endpoints that are not proven to exist, 15. Data retention lacks implementation mechanics, 16. Accessibility is barely addressed despite family-facing UI, 17. Observability requirements are aspirational (+16 more)
### Community 18 - "Architecture (current)"
Cohesion: 0.08
Nodes (23): Architecture (current), Auth, Auth model (R1-B+D, locked in), CI: .github/workflows/ci.yml runs both jobs on push/PR., Conventions, Database, Database schema highlights, Email (+15 more)
### Community 19 - "Out of scope (Phase"
Cohesion: 0.09
Nodes (21): File Structure, Out of scope (Phase 9 plan, written separately), Re-import BaseModel near the top of the file if not already present., Stable UUIDs so re-running upgrade after a downgrade is idempotent on FK refs., Task 10: Wire matcher into scrape success path, Task 11: Manual match override endpoints, Task 12: NeverSuggest CRUD endpoints, Task 13: Migration 0007 — seed canonical ingredients (+13 more)
### Community 20 - "_reload_settings"
Cohesion: 0.1
Nodes (15): BaseSettings, Config, Settings, Auth gate tests for R1-B+D. Covers: - /api/admin/* requires bearer token (401 w, Force ``settings`` to re-read env (test isolation)., No bearer → 401. Valid bearer → not 401 (handler runs)., POST /api/profile/members without cookie → 401., GET /api/profile is NOT auth-gated (reads stay open). (+7 more)
### Community 21 - "Meal Planner Algorithm —"
Cohesion: 0.1
Nodes (20): 1. Goal, 2.1 Hard constraints, 2.2 Scoring signals, 2.3 Set-selection diversity, 2. Algorithm shape, 3.1 Schema, 3.2 Match job, 3.3 Manual override (+12 more)
### Community 22 - "`backend/alembic/versions/0009_phase6_reminded_at.py` (create)"
Cohesion: 0.1
Nodes (20): Architecture, `backend/alembic/versions/0009_phase6_reminded_at.py` (create), `backend/app/api/admin.py` (modify), `backend/app/config.py` (modify), `backend/app/models/__init__.py` (modify), `backend/app/scheduler/__main__.py` (modify), `backend/app/services/email.py` (modify), `backend/app/services/orchestrator/runner.py` (modify) (+12 more)
### Community 23 - "─────────────────────────────────────────────────────────────────────────────"
Cohesion: 0.1
Nodes (19): ─────────────────────────────────────────────────────────────────────────────, 1. Add APP_BASE_URL to `.env.test`, 2. Rebuild frontend container and restart, 3. Run the seed script, 4. Verify login works, Edit scripts/seed_family.py to fill in real names/emails first, then:, ── Edit these before running ────────────────────────────────────────────────, Expected: no TypeScript errors, build succeeds (+11 more)
### Community 24 - "run_llm_match_job"
Cohesion: 0.15
Nodes (15): _ask_ollama(), _get_candidates(), _get_unmatched_ingredients(), LLM-powered second-pass ingredient→grocery matcher. After the deterministic AUT, LLM second pass: match remaining unmatched ingredients. For each ingredient, Return up to ``_CANDIDATE_LIMIT`` grocery items ranked by fuzzy×precision., Ingredients with no existing match in ingredient_grocery_match., Ask the LLM to pick the best grocery item for the ingredient. Returns the 0 (+7 more)
### Community 25 - "BaseScraper"
Cohesion: 0.17
Nodes (3): ABC, BaseScraper, SeleniumScraper
### Community 26 - "client"
Cohesion: 0.12
Nodes (12): client(), client_no_db(), db(), db_session(), pytest_collection_modifyitems(), Pytest fixtures for MealPlanner backend. DB strategy ----------- - If env ``TES, Per-test transactional session that rolls back at teardown., Plain SessionLocal for tests that need to seed data outside the transactiona (+4 more)
### Community 27 - "require_session"
Cohesion: 0.14
Nodes (12): login(), LoginRequest, Family-shared session login. POST /api/auth/login — body ``{"password": "..."}`, get_db(), issue_session(), Auth dependencies for the MealPlanner backend. Two flavors: - ``require_admin``, Enforce a shared bearer token. 401 on bad/missing token, 503 if unset., Sign the family_profile_id and return the cookie value. (+4 more)
### Community 28 - "Done When"
Cohesion: 0.14
Nodes (13): Architecture, Done When, Goal, Meal Planner System, Phase 1: Foundation, Phase 2: Scraping, Phase 3: Recipe & Meal Engine, Phase 4: Notifications & Approval (+5 more)
### Community 29 - "Bash (>20 lines output)"
Cohesion: 0.14
Nodes (13): Bash (>20 lines output), BLOCKED commands — do NOT attempt these, context-mode — MANDATORY routing rules, ctx commands, curl / wget — BLOCKED, Grep (large results), Inline HTTP — BLOCKED, Output constraints (+5 more)
### Community 30 - "Open items (deferred, tracked"
Cohesion: 0.14
Nodes (13): File Structure, Open items (deferred, tracked here), Out of scope (other phases), Phase 9 — Meal-Planner Algorithm Implementation Plan, Task 1: Planner config + types, Task 2: Cost + savings estimator, Task 3: Hard-constraint filter, Task 4: Individual scoring (+5 more)
### Community 31 - "Expected: INFO [alembic.runtime.migration] Running"
Cohesion: 0.15
Nodes (12): Context, Expected: INFO [alembic.runtime.migration] Running upgrade 0008 -> 0009 ..., Expected: Running upgrade 0008 -> 0009 again, clean, File map, Final verification, Phase 6 — SendGrid Email Integration Implementation Plan, ── step_reminder ──────────────────────────────────────────────────────────, Task 1: Migration 0009 — add `reminded_at` to `weekly_run` (+4 more)
### Community 32 - "compute_recipe_cost"
Cohesion: 0.32
Nodes (10): compute_recipe_cost(), _decimal(), Compute per-recipe cost and savings against ingredient_grocery_match. Inputs:, _scale(), _ingredient(), _match(), test_compute_recipe_cost_sums_ingredient_costs(), test_pantry_hits_counted() (+2 more)
### Community 33 - "Claude only"
Cohesion: 0.17
Nodes (11): 1. Strong Consensus (all reviewers, blocking), 2. Partial Agreement (2 of 3), 3. Unique Findings (only one reviewer), 4. Where Reviewers Conflict, 5. Combined Blocker List (deduplicated, ranked), 6. Additional Investigation Needed, 7. Net Assessment, Claude only (+3 more)
### Community 34 - "_admin_headers"
Cohesion: 0.35
Nodes (9): _admin_headers(), _seed_grocery(), test_create_ingredient_rejects_duplicate_name(), test_create_ingredient_returns_201_with_id(), test_delete_ingredient_removes_row(), test_list_ingredients_supports_search(), test_pin_manual_match(), test_unpin_manual_match() (+1 more)
### Community 35 - "_delete_ingredients"
Cohesion: 0.33
Nodes (8): _delete_ingredients(), _delete_recipes(), downgrade(), _insert_recipes(), seed canonical ingredients (and 30 starter recipes in P4-14) Revision ID: 0007, Best-effort: only remove rows whose name_lower matches one of our seeds. Pre, upgrade(), _upsert_ingredients()
### Community 36 - "test_router_list_endpoints"
Cohesion: 0.29
Nodes (3): Smoke tests: app boots, routers wire up, no import-time crashes. The router-lis, Each canonical GET must respond. 200 (handled), 401 (admin-gated), 404 (hand, test_router_list_endpoints()
### Community 37 - "_admin_headers (37)"
Cohesion: 0.73
Nodes (5): _admin_headers(), _new_ingredient(), test_create_recipe_rejects_unknown_ingredient_id(), test_create_recipe_with_canonical_ingredients(), test_list_recipes_returns_seeded_data()
### Community 38 - "_admin"
Cohesion: 0.4
Nodes (4): _admin(), End-to-end: ingredient + recipe + match all wired together., test_match_job_runs_against_seeded_data(), test_resolve_against_seeded_ingredients()
### Community 39 - "ShoppingList.tsx"
Cohesion: 0.33
Nodes (0):
### Community 40 - "test_scrape_returns_202_and_log_id"
Cohesion: 0.4
Nodes (3): Async scrape endpoint contract. Verifies that ``POST /api/admin/scrape``: - r, Endpoint enqueues the scrape and returns 202 + scrape_log_id. We replace th, test_scrape_returns_202_and_log_id()
### Community 41 - "_admin (41)"
Cohesion: 0.9
Nodes (4): _admin(), _seed_ingredient(), test_resolve_ingredient_handles_no_unit(), test_resolve_ingredient_returns_top_three_candidates()
### Community 42 - "Card.tsx"
Cohesion: 0.4
Nodes (0):
### Community 43 - "First parsed item (sample)"
Cohesion: 0.4
Nodes (4): First parsed item (sample), Lucky California weekly-ad spike (R2-A), Notes, Selectors used (verified against this fixture)
### Community 44 - "Add nullable description column"
Cohesion: 0.5
Nodes (1): Add nullable description column to grocery_item. The Lucky California parser pr
### Community 45 - "Seed initial data Revision"
Cohesion: 0.5
Nodes (1): Seed initial data Revision ID: 0002 Revises: 0001 Create Date: 2026-05-04
### Community 46 - "Add calorie_target to family_profile"
Cohesion: 0.5
Nodes (1): Add calorie_target to family_profile Revision ID: 0004 Revises: 0003 Create Dat
### Community 47 - "Add nullable indexed external_id"
Cohesion: 0.5
Nodes (1): Add nullable indexed external_id and source columns to grocery_item. The Swiftl
### Community 48 - "Phase 5 orchestration: weekly_run"
Cohesion: 0.5
Nodes (1): Phase 5 orchestration: weekly_run table + pending_approval_policy Revision ID:
### Community 49 - "Phase 6: add reminded_at"
Cohesion: 0.5
Nodes (1): Phase 6: add reminded_at to weekly_run Revision ID: 0009 Revises: 0008 Create D
### Community 50 - "Add auto_llm to ingredient_match_source_enum"
Cohesion: 0.5
Nodes (1): Add auto_llm to ingredient_match_source_enum Revision ID: 0010 Revises: 0009 Cr
### Community 51 - "test_matcher.py"
Cohesion: 0.5
Nodes (0):
### Community 52 - "main"
Cohesion: 0.83
Nodes (3): main(), search_recipe(), strip_html()
### Community 53 - "env.py"
Cohesion: 0.67
Nodes (0):
### Community 54 - "isActive"
Cohesion: 1.0
Nodes (2): isActive(), linkClass()
### Community 55 - "ErrorBoundary.tsx"
Cohesion: 0.67
Nodes (0):
## Knowledge Gaps
- **720 isolated node(s):** `Auth dependencies for the MealPlanner backend. Two flavors: - ``require_admin```, `Enforce a shared bearer token. 401 on bad/missing token, 503 if unset.`, `Sign the family_profile_id and return the cookie value.`, `Auto-authenticate: return the first family_profile_id from the DB. No cooki`, `Config` (+715 more)
These have ≤1 connection - possible missing edges or undocumented components.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `map_product()` connect `SwiftlyAuthMintError` to `MealPlanItem`?**
_High betweenness centrality (0.014) - this node is a cross-community bridge._
- **Why does `_cost()` connect `generate_meal_plan` to `MealPlanItem`?**
_High betweenness centrality (0.012) - this node is a cross-community bridge._
- **Are the 47 inferred relationships involving `str` (e.g. with `require_session()` and `health_check_db()`) actually correct?**
_`str` has 47 INFERRED edges - model-reasoned connections that need verification._
- **Are the 19 inferred relationships involving `SwiftlyAuthMintError` (e.g. with `SwiftlyAuthError` and `LuckyCaliforniaScraper`) actually correct?**
_`SwiftlyAuthMintError` has 19 INFERRED edges - model-reasoned connections that need verification._
- **Are the 14 inferred relationships involving `LuckyCaliforniaScraper` (e.g. with `SwiftlyAuthMintError` and `._do_scrape()`) actually correct?**
_`LuckyCaliforniaScraper` has 14 INFERRED edges - model-reasoned connections that need verification._
- **What connects `Auth dependencies for the MealPlanner backend. Two flavors: - ``require_admin```, `Enforce a shared bearer token. 401 on bad/missing token, 503 if unset.`, `Sign the family_profile_id and return the cookie value.` to the rest of the system?**
_720 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `MealPlanItem` be split into smaller, more focused modules?**
_Cohesion score 0.02 - nodes in this community are weakly interconnected._
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_alembic_versions_0010_auto_llm_source_py", "label": "0010_auto_llm_source.py", "file_type": "code", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "source_location": "L1"}, {"id": "0010_auto_llm_source_upgrade", "label": "upgrade()", "file_type": "code", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "source_location": "L15"}, {"id": "0010_auto_llm_source_downgrade", "label": "downgrade()", "file_type": "code", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "source_location": "L21"}, {"id": "0010_auto_llm_source_rationale_1", "label": "Add auto_llm to ingredient_match_source_enum Revision ID: 0010 Revises: 0009 Cr", "file_type": "rationale", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "source_location": "L1"}], "edges": [{"source": "backend_alembic_versions_0010_auto_llm_source_py", "target": "alembic", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "source_location": "L7", "weight": 1.0}, {"source": "backend_alembic_versions_0010_auto_llm_source_py", "target": "0010_auto_llm_source_upgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "source_location": "L15", "weight": 1.0}, {"source": "backend_alembic_versions_0010_auto_llm_source_py", "target": "0010_auto_llm_source_downgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "source_location": "L21", "weight": 1.0}, {"source": "0010_auto_llm_source_rationale_1", "target": "backend_alembic_versions_0010_auto_llm_source_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "0010_auto_llm_source_upgrade", "callee": "execute", "source_file": "backend/alembic/versions/0010_auto_llm_source.py", "source_location": "L18"}]}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_tests_test_resolve_ingredient_py", "label": "test_resolve_ingredient.py", "file_type": "code", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L1"}, {"id": "test_resolve_ingredient_admin", "label": "_admin()", "file_type": "code", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L6"}, {"id": "test_resolve_ingredient_seed_ingredient", "label": "_seed_ingredient()", "file_type": "code", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L10"}, {"id": "test_resolve_ingredient_test_resolve_ingredient_returns_top_three_candidates", "label": "test_resolve_ingredient_returns_top_three_candidates()", "file_type": "code", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L19"}, {"id": "test_resolve_ingredient_test_resolve_ingredient_handles_no_unit", "label": "test_resolve_ingredient_handles_no_unit()", "file_type": "code", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L38"}], "edges": [{"source": "backend_tests_test_resolve_ingredient_py", "target": "pytest", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L1", "weight": 1.0}, {"source": "backend_tests_test_resolve_ingredient_py", "target": "test_resolve_ingredient_admin", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L6", "weight": 1.0}, {"source": "backend_tests_test_resolve_ingredient_py", "target": "test_resolve_ingredient_seed_ingredient", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L10", "weight": 1.0}, {"source": "backend_tests_test_resolve_ingredient_py", "target": "test_resolve_ingredient_test_resolve_ingredient_returns_top_three_candidates", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L19", "weight": 1.0}, {"source": "backend_tests_test_resolve_ingredient_py", "target": "test_resolve_ingredient_test_resolve_ingredient_handles_no_unit", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L38", "weight": 1.0}, {"source": "test_resolve_ingredient_seed_ingredient", "target": "test_resolve_ingredient_admin", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L14", "weight": 1.0}, {"source": "test_resolve_ingredient_test_resolve_ingredient_returns_top_three_candidates", "target": "test_resolve_ingredient_seed_ingredient", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L20", "weight": 1.0}, {"source": "test_resolve_ingredient_test_resolve_ingredient_returns_top_three_candidates", "target": "test_resolve_ingredient_admin", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L27", "weight": 1.0}, {"source": "test_resolve_ingredient_test_resolve_ingredient_handles_no_unit", "target": "test_resolve_ingredient_seed_ingredient", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L39", "weight": 1.0}, {"source": "test_resolve_ingredient_test_resolve_ingredient_handles_no_unit", "target": "test_resolve_ingredient_admin", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L43", "weight": 1.0}], "raw_calls": [{"caller_nid": "test_resolve_ingredient_seed_ingredient", "callee": "post", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L11"}, {"caller_nid": "test_resolve_ingredient_seed_ingredient", "callee": "json", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L16"}, {"caller_nid": "test_resolve_ingredient_test_resolve_ingredient_returns_top_three_candidates", "callee": "post", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L24"}, {"caller_nid": "test_resolve_ingredient_test_resolve_ingredient_returns_top_three_candidates", "callee": "json", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L30"}, {"caller_nid": "test_resolve_ingredient_test_resolve_ingredient_handles_no_unit", "callee": "post", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L40"}, {"caller_nid": "test_resolve_ingredient_test_resolve_ingredient_handles_no_unit", "callee": "json", "source_file": "backend/tests/test_resolve_ingredient.py", "source_location": "L45"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_tests_test_scrape_endpoint_py", "label": "test_scrape_endpoint.py", "file_type": "code", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L1"}, {"id": "test_scrape_endpoint_admin_token", "label": "_admin_token()", "file_type": "code", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L20"}, {"id": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "label": "test_scrape_returns_202_and_log_id()", "file_type": "code", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L26"}, {"id": "test_scrape_endpoint_rationale_1", "label": "Async scrape endpoint contract. Verifies that ``POST /api/admin/scrape``: - r", "file_type": "rationale", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L1"}, {"id": "test_scrape_endpoint_rationale_27", "label": "Endpoint enqueues the scrape and returns 202 + scrape_log_id. We replace th", "file_type": "rationale", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L27"}], "edges": [{"source": "backend_tests_test_scrape_endpoint_py", "target": "os", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L11", "weight": 1.0}, {"source": "backend_tests_test_scrape_endpoint_py", "target": "uuid", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L12", "weight": 1.0}, {"source": "backend_tests_test_scrape_endpoint_py", "target": "pytest", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L14", "weight": 1.0}, {"source": "backend_tests_test_scrape_endpoint_py", "target": "test_scrape_endpoint_admin_token", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L20", "weight": 1.0}, {"source": "backend_tests_test_scrape_endpoint_py", "target": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L26", "weight": 1.0}, {"source": "test_scrape_endpoint_rationale_1", "target": "backend_tests_test_scrape_endpoint_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L1", "weight": 1.0}, {"source": "test_scrape_endpoint_rationale_27", "target": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L27", "weight": 1.0}], "raw_calls": [{"caller_nid": "test_scrape_endpoint_admin_token", "callee": "setenv", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L21"}, {"caller_nid": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "callee": "setattr", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L40"}, {"caller_nid": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "callee": "post", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L44"}, {"caller_nid": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "callee": "json", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L49"}, {"caller_nid": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "callee": "UUID", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L53"}, {"caller_nid": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "callee": "first", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L58"}, {"caller_nid": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "callee": "filter", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L58"}, {"caller_nid": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "callee": "query", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L58"}, {"caller_nid": "test_scrape_endpoint_test_scrape_returns_202_and_log_id", "callee": "len", "source_file": "backend/tests/test_scrape_endpoint.py", "source_location": "L67"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_pages_mealdetail_tsx", "label": "MealDetail.tsx", "file_type": "code", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L1"}], "edges": [{"source": "frontend_src_pages_mealdetail_tsx", "target": "react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_pages_mealdetail_tsx", "target": "react_query", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_pages_mealdetail_tsx", "target": "react_router_dom", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L3", "weight": 1.0}, {"source": "frontend_src_pages_mealdetail_tsx", "target": "lucide_react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L4", "weight": 1.0}, {"source": "frontend_src_pages_mealdetail_tsx", "target": "frontend_src_pages_api", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L5", "weight": 1.0}, {"source": "frontend_src_pages_mealdetail_tsx", "target": "frontend_src_pages_types", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L6", "weight": 1.0}, {"source": "frontend_src_pages_mealdetail_tsx", "target": "frontend_src_pages_components_ui_button", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L7", "weight": 1.0}, {"source": "frontend_src_pages_mealdetail_tsx", "target": "frontend_src_pages_components_ui_badge", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L8", "weight": 1.0}, {"source": "frontend_src_pages_mealdetail_tsx", "target": "frontend_src_pages_components_ui_card", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L9", "weight": 1.0}, {"source": "frontend_src_pages_mealdetail_tsx", "target": "frontend_src_pages_components_ui_skeleton", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L10", "weight": 1.0}, {"source": "frontend_src_pages_mealdetail_tsx", "target": "frontend_src_pages_components_ui_select", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L11", "weight": 1.0}, {"source": "frontend_src_pages_mealdetail_tsx", "target": "frontend_src_pages_components_ui_textarea", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L12", "weight": 1.0}, {"source": "frontend_src_pages_mealdetail_tsx", "target": "frontend_src_pages_lib_toast", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/MealDetail.tsx", "source_location": "L13", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_components_ui_skeleton_tsx", "label": "Skeleton.tsx", "file_type": "code", "source_file": "frontend/src/components/ui/Skeleton.tsx", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_vite_env_d_ts", "label": "vite-env.d.ts", "file_type": "code", "source_file": "frontend/src/vite-env.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_schemas_never_suggest_py", "label": "never_suggest.py", "file_type": "code", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L1"}, {"id": "never_suggest_neversuggestcreate", "label": "NeverSuggestCreate", "file_type": "code", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L9"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "never_suggest_exactly_one_target", "label": "_exactly_one_target()", "file_type": "code", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L17"}, {"id": "never_suggest_neversuggestread", "label": "NeverSuggestRead", "file_type": "code", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L24"}], "edges": [{"source": "backend_app_schemas_never_suggest_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L3", "weight": 1.0}, {"source": "backend_app_schemas_never_suggest_py", "target": "uuid", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L4", "weight": 1.0}, {"source": "backend_app_schemas_never_suggest_py", "target": "pydantic", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L6", "weight": 1.0}, {"source": "backend_app_schemas_never_suggest_py", "target": "never_suggest_neversuggestcreate", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L9", "weight": 1.0}, {"source": "never_suggest_neversuggestcreate", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L9", "weight": 1.0}, {"source": "backend_app_schemas_never_suggest_py", "target": "never_suggest_exactly_one_target", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L17", "weight": 1.0}, {"source": "backend_app_schemas_never_suggest_py", "target": "never_suggest_neversuggestread", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L24", "weight": 1.0}, {"source": "never_suggest_neversuggestread", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L24", "weight": 1.0}], "raw_calls": [{"caller_nid": "never_suggest_exactly_one_target", "callee": "sum", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L18"}, {"caller_nid": "never_suggest_exactly_one_target", "callee": "ValueError", "source_file": "backend/app/schemas/never_suggest.py", "source_location": "L20"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_alembic_versions_0002_seed_data_py", "label": "0002_seed_data.py", "file_type": "code", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L1"}, {"id": "0002_seed_data_upgrade", "label": "upgrade()", "file_type": "code", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L17"}, {"id": "0002_seed_data_downgrade", "label": "downgrade()", "file_type": "code", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L112"}, {"id": "0002_seed_data_rationale_1", "label": "Seed initial data Revision ID: 0002 Revises: 0001 Create Date: 2026-05-04", "file_type": "rationale", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L1"}], "edges": [{"source": "backend_alembic_versions_0002_seed_data_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L7", "weight": 1.0}, {"source": "backend_alembic_versions_0002_seed_data_py", "target": "alembic", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L8", "weight": 1.0}, {"source": "backend_alembic_versions_0002_seed_data_py", "target": "sqlalchemy", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L9", "weight": 1.0}, {"source": "backend_alembic_versions_0002_seed_data_py", "target": "0002_seed_data_upgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L17", "weight": 1.0}, {"source": "backend_alembic_versions_0002_seed_data_py", "target": "0002_seed_data_downgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L112", "weight": 1.0}, {"source": "0002_seed_data_rationale_1", "target": "backend_alembic_versions_0002_seed_data_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "0002_seed_data_upgrade", "callee": "execute", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L22"}, {"caller_nid": "0002_seed_data_upgrade", "callee": "execute", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L27"}, {"caller_nid": "0002_seed_data_upgrade", "callee": "execute", "source_file": "backend/alembic/versions/0002_seed_data.py", "source_location": "L105"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_tests_init_py", "label": "__init__.py", "file_type": "code", "source_file": "backend/tests/__init__.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_components_ui_input_tsx", "label": "Input.tsx", "file_type": "code", "source_file": "frontend/src/components/ui/Input.tsx", "source_location": "L1"}, {"id": "input_cn", "label": "cn()", "file_type": "code", "source_file": "frontend/src/components/ui/Input.tsx", "source_location": "L17"}], "edges": [{"source": "frontend_src_components_ui_input_tsx", "target": "react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Input.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_components_ui_input_tsx", "target": "frontend_src_components_ui_lib_utils", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Input.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_components_ui_input_tsx", "target": "input_cn", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Input.tsx", "source_location": "L17", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_components_ui_select_tsx", "label": "Select.tsx", "file_type": "code", "source_file": "frontend/src/components/ui/Select.tsx", "source_location": "L1"}], "edges": [{"source": "frontend_src_components_ui_select_tsx", "target": "frontend_src_components_ui_lib_utils", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Select.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_components_ui_select_tsx", "target": "react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Select.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_components_ui_select_tsx", "target": "react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Select.tsx", "source_location": "L3", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_services_orchestrator_init_py", "label": "__init__.py", "file_type": "code", "source_file": "backend/app/services/orchestrator/__init__.py", "source_location": "L1"}], "edges": [{"source": "backend_app_services_orchestrator_init_py", "target": "app_services_orchestrator_runner", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/services/orchestrator/__init__.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_services_planner_config_py", "label": "config.py", "file_type": "code", "source_file": "backend/app/services/planner/config.py", "source_location": "L1"}, {"id": "config_plannerconfig", "label": "PlannerConfig", "file_type": "code", "source_file": "backend/app/services/planner/config.py", "source_location": "L8"}, {"id": "config_plannerconfig_validate", "label": ".validate()", "file_type": "code", "source_file": "backend/app/services/planner/config.py", "source_location": "L35"}, {"id": "config_rationale_1", "label": "Planner constants. Tune here without touching algorithm code.", "file_type": "rationale", "source_file": "backend/app/services/planner/config.py", "source_location": "L1"}], "edges": [{"source": "backend_app_services_planner_config_py", "target": "dataclasses", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/config.py", "source_location": "L4", "weight": 1.0}, {"source": "backend_app_services_planner_config_py", "target": "config_plannerconfig", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/config.py", "source_location": "L8", "weight": 1.0}, {"source": "config_plannerconfig", "target": "config_plannerconfig_validate", "relation": "method", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/config.py", "source_location": "L35", "weight": 1.0}, {"source": "config_rationale_1", "target": "backend_app_services_planner_config_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/config.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "config_plannerconfig_validate", "callee": "abs", "source_file": "backend/app/services/planner/config.py", "source_location": "L37"}, {"caller_nid": "config_plannerconfig_validate", "callee": "ValueError", "source_file": "backend/app/services/planner/config.py", "source_location": "L38"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_alembic_versions_0009_phase6_reminded_at_py", "label": "0009_phase6_reminded_at.py", "file_type": "code", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L1"}, {"id": "0009_phase6_reminded_at_upgrade", "label": "upgrade()", "file_type": "code", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L16"}, {"id": "0009_phase6_reminded_at_downgrade", "label": "downgrade()", "file_type": "code", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L23"}, {"id": "0009_phase6_reminded_at_rationale_1", "label": "Phase 6: add reminded_at to weekly_run Revision ID: 0009 Revises: 0008 Create D", "file_type": "rationale", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L1"}], "edges": [{"source": "backend_alembic_versions_0009_phase6_reminded_at_py", "target": "alembic", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L7", "weight": 1.0}, {"source": "backend_alembic_versions_0009_phase6_reminded_at_py", "target": "sqlalchemy", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L8", "weight": 1.0}, {"source": "backend_alembic_versions_0009_phase6_reminded_at_py", "target": "0009_phase6_reminded_at_upgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L16", "weight": 1.0}, {"source": "backend_alembic_versions_0009_phase6_reminded_at_py", "target": "0009_phase6_reminded_at_downgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L23", "weight": 1.0}, {"source": "0009_phase6_reminded_at_rationale_1", "target": "backend_alembic_versions_0009_phase6_reminded_at_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "0009_phase6_reminded_at_upgrade", "callee": "add_column", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L17"}, {"caller_nid": "0009_phase6_reminded_at_upgrade", "callee": "Column", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L19"}, {"caller_nid": "0009_phase6_reminded_at_upgrade", "callee": "DateTime", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L19"}, {"caller_nid": "0009_phase6_reminded_at_downgrade", "callee": "drop_column", "source_file": "backend/alembic/versions/0009_phase6_reminded_at.py", "source_location": "L24"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_pages_shoppinglist_tsx", "label": "ShoppingList.tsx", "file_type": "code", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L1"}, {"id": "shoppinglist_shoppinglistskeleton", "label": "ShoppingListSkeleton()", "file_type": "code", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L12"}, {"id": "shoppinglist_skeletoncard", "label": "SkeletonCard()", "file_type": "code", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L33"}, {"id": "shoppinglist_storagekey", "label": "storageKey()", "file_type": "code", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L44"}, {"id": "shoppinglist_toggle", "label": "toggle()", "file_type": "code", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L77"}, {"id": "shoppinglist_clearall", "label": "clearAll()", "file_type": "code", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L86"}], "edges": [{"source": "frontend_src_pages_shoppinglist_tsx", "target": "react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "react_query", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "lucide_react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L3", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "frontend_src_pages_api", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L4", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "frontend_src_pages_types", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L5", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "frontend_src_pages_components_ui_button", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L6", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "frontend_src_pages_components_ui_badge", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L7", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "frontend_src_pages_components_ui_card", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L8", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "frontend_src_pages_components_ui_skeleton", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L9", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "frontend_src_pages_components_ui_emptystate", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L10", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "shoppinglist_shoppinglistskeleton", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L12", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "shoppinglist_skeletoncard", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L33", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "shoppinglist_storagekey", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L44", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "shoppinglist_toggle", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L77", "weight": 1.0}, {"source": "frontend_src_pages_shoppinglist_tsx", "target": "shoppinglist_clearall", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L86", "weight": 1.0}], "raw_calls": [{"caller_nid": "shoppinglist_toggle", "callee": "setChecked", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L78"}, {"caller_nid": "shoppinglist_clearall", "callee": "setChecked", "source_file": "frontend/src/pages/ShoppingList.tsx", "source_location": "L86"}]}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_tests_test_email_backend_py", "label": "test_email_backend.py", "file_type": "code", "source_file": "backend/tests/test_email_backend.py", "source_location": "L1"}, {"id": "test_email_backend_test_sendgrid_send_calls_api", "label": "test_sendgrid_send_calls_api()", "file_type": "code", "source_file": "backend/tests/test_email_backend.py", "source_location": "L5"}, {"id": "test_email_backend_test_sendgrid_raises_on_4xx", "label": "test_sendgrid_raises_on_4xx()", "file_type": "code", "source_file": "backend/tests/test_email_backend.py", "source_location": "L26"}, {"id": "test_email_backend_rationale_1", "label": "Unit tests for SendGridEmailBackend \u2014 no Postgres needed.", "file_type": "rationale", "source_file": "backend/tests/test_email_backend.py", "source_location": "L1"}], "edges": [{"source": "backend_tests_test_email_backend_py", "target": "pytest", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/tests/test_email_backend.py", "source_location": "L2", "weight": 1.0}, {"source": "backend_tests_test_email_backend_py", "target": "test_email_backend_test_sendgrid_send_calls_api", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_email_backend.py", "source_location": "L5", "weight": 1.0}, {"source": "backend_tests_test_email_backend_py", "target": "test_email_backend_test_sendgrid_raises_on_4xx", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_email_backend.py", "source_location": "L26", "weight": 1.0}, {"source": "test_email_backend_rationale_1", "target": "backend_tests_test_email_backend_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/tests/test_email_backend.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "test_email_backend_test_sendgrid_send_calls_api", "callee": "setattr", "source_file": "backend/tests/test_email_backend.py", "source_location": "L17"}, {"caller_nid": "test_email_backend_test_sendgrid_send_calls_api", "callee": "FakeClient", "source_file": "backend/tests/test_email_backend.py", "source_location": "L17"}, {"caller_nid": "test_email_backend_test_sendgrid_send_calls_api", "callee": "SendGridEmailBackend", "source_file": "backend/tests/test_email_backend.py", "source_location": "L20"}, {"caller_nid": "test_email_backend_test_sendgrid_send_calls_api", "callee": "send", "source_file": "backend/tests/test_email_backend.py", "source_location": "L21"}, {"caller_nid": "test_email_backend_test_sendgrid_send_calls_api", "callee": "len", "source_file": "backend/tests/test_email_backend.py", "source_location": "L23"}, {"caller_nid": "test_email_backend_test_sendgrid_raises_on_4xx", "callee": "setattr", "source_file": "backend/tests/test_email_backend.py", "source_location": "L35"}, {"caller_nid": "test_email_backend_test_sendgrid_raises_on_4xx", "callee": "FakeClient", "source_file": "backend/tests/test_email_backend.py", "source_location": "L35"}, {"caller_nid": "test_email_backend_test_sendgrid_raises_on_4xx", "callee": "SendGridEmailBackend", "source_file": "backend/tests/test_email_backend.py", "source_location": "L38"}, {"caller_nid": "test_email_backend_test_sendgrid_raises_on_4xx", "callee": "raises", "source_file": "backend/tests/test_email_backend.py", "source_location": "L39"}, {"caller_nid": "test_email_backend_test_sendgrid_raises_on_4xx", "callee": "send", "source_file": "backend/tests/test_email_backend.py", "source_location": "L40"}]}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_services_init_py", "label": "__init__.py", "file_type": "code", "source_file": "backend/app/services/__init__.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "scripts_seed_family_py", "label": "seed_family.py", "file_type": "code", "source_file": "scripts/seed_family.py", "source_location": "L1"}], "edges": [{"source": "scripts_seed_family_py", "target": "os", "relation": "imports", "confidence": "EXTRACTED", "source_file": "scripts/seed_family.py", "source_location": "L12", "weight": 1.0}, {"source": "scripts_seed_family_py", "target": "sys", "relation": "imports", "confidence": "EXTRACTED", "source_file": "scripts/seed_family.py", "source_location": "L13", "weight": 1.0}, {"source": "scripts_seed_family_py", "target": "app_database", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "scripts/seed_family.py", "source_location": "L32", "weight": 1.0}, {"source": "scripts_seed_family_py", "target": "app_models", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "scripts/seed_family.py", "source_location": "L33", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_config_py", "label": "config.py", "file_type": "code", "source_file": "backend/app/config.py", "source_location": "L1"}, {"id": "config_settings", "label": "Settings", "file_type": "code", "source_file": "backend/app/config.py", "source_location": "L6"}, {"id": "basesettings", "label": "BaseSettings", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "config_config", "label": "Config", "file_type": "code", "source_file": "backend/app/config.py", "source_location": "L41"}, {"id": "config_require_database_url", "label": "_require_database_url()", "file_type": "code", "source_file": "backend/app/config.py", "source_location": "L45"}], "edges": [{"source": "backend_app_config_py", "target": "pydantic_settings", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/config.py", "source_location": "L1", "weight": 1.0}, {"source": "backend_app_config_py", "target": "pydantic", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/config.py", "source_location": "L2", "weight": 1.0}, {"source": "backend_app_config_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/config.py", "source_location": "L3", "weight": 1.0}, {"source": "backend_app_config_py", "target": "config_settings", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/config.py", "source_location": "L6", "weight": 1.0}, {"source": "config_settings", "target": "basesettings", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/config.py", "source_location": "L6", "weight": 1.0}, {"source": "backend_app_config_py", "target": "config_config", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/config.py", "source_location": "L41", "weight": 1.0}, {"source": "backend_app_config_py", "target": "config_require_database_url", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/config.py", "source_location": "L45", "weight": 1.0}], "raw_calls": [{"caller_nid": "config_require_database_url", "callee": "RuntimeError", "source_file": "backend/app/config.py", "source_location": "L47"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_tests_test_recipe_schema_py", "label": "test_recipe_schema.py", "file_type": "code", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L1"}, {"id": "test_recipe_schema_test_recipe_create_requires_canonical_ingredient_ids", "label": "test_recipe_create_requires_canonical_ingredient_ids()", "file_type": "code", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L9"}, {"id": "test_recipe_schema_test_recipe_create_rejects_empty_ingredients", "label": "test_recipe_create_rejects_empty_ingredients()", "file_type": "code", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L25"}, {"id": "test_recipe_schema_test_resolve_ingredient_request_round_trip", "label": "test_resolve_ingredient_request_round_trip()", "file_type": "code", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L39"}], "edges": [{"source": "backend_tests_test_recipe_schema_py", "target": "uuid", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L1", "weight": 1.0}, {"source": "backend_tests_test_recipe_schema_py", "target": "pytest", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L3", "weight": 1.0}, {"source": "backend_tests_test_recipe_schema_py", "target": "pydantic", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L4", "weight": 1.0}, {"source": "backend_tests_test_recipe_schema_py", "target": "app_schemas_recipe", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L6", "weight": 1.0}, {"source": "backend_tests_test_recipe_schema_py", "target": "test_recipe_schema_test_recipe_create_requires_canonical_ingredient_ids", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L9", "weight": 1.0}, {"source": "backend_tests_test_recipe_schema_py", "target": "test_recipe_schema_test_recipe_create_rejects_empty_ingredients", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L25", "weight": 1.0}, {"source": "backend_tests_test_recipe_schema_py", "target": "test_recipe_schema_test_resolve_ingredient_request_round_trip", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L39", "weight": 1.0}], "raw_calls": [{"caller_nid": "test_recipe_schema_test_recipe_create_requires_canonical_ingredient_ids", "callee": "uuid4", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L10"}, {"caller_nid": "test_recipe_schema_test_recipe_create_requires_canonical_ingredient_ids", "callee": "RecipeCreate", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L11"}, {"caller_nid": "test_recipe_schema_test_recipe_create_requires_canonical_ingredient_ids", "callee": "RecipeIngredientRef", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L18"}, {"caller_nid": "test_recipe_schema_test_recipe_create_rejects_empty_ingredients", "callee": "raises", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L26"}, {"caller_nid": "test_recipe_schema_test_recipe_create_rejects_empty_ingredients", "callee": "RecipeCreate", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L27"}, {"caller_nid": "test_recipe_schema_test_resolve_ingredient_request_round_trip", "callee": "ResolveIngredientRequest", "source_file": "backend/tests/test_recipe_schema.py", "source_location": "L40"}]}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_api_auth_py", "label": "auth.py", "file_type": "code", "source_file": "backend/app/api/auth.py", "source_location": "L1"}, {"id": "auth_loginrequest", "label": "LoginRequest", "file_type": "code", "source_file": "backend/app/api/auth.py", "source_location": "L26"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "auth_login", "label": "login()", "file_type": "code", "source_file": "backend/app/api/auth.py", "source_location": "L31"}, {"id": "auth_logout", "label": "logout()", "file_type": "code", "source_file": "backend/app/api/auth.py", "source_location": "L64"}, {"id": "auth_rationale_1", "label": "Family-shared session login. POST /api/auth/login \u2014 body ``{\"password\": \"...\"}`", "file_type": "rationale", "source_file": "backend/app/api/auth.py", "source_location": "L1"}], "edges": [{"source": "backend_app_api_auth_py", "target": "fastapi", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/api/auth.py", "source_location": "L14", "weight": 1.0}, {"source": "backend_app_api_auth_py", "target": "pydantic", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/api/auth.py", "source_location": "L15", "weight": 1.0}, {"source": "backend_app_api_auth_py", "target": "sqlalchemy_orm", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/api/auth.py", "source_location": "L16", "weight": 1.0}, {"source": "backend_app_api_auth_py", "target": "app_config", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/api/auth.py", "source_location": "L18", "weight": 1.0}, {"source": "backend_app_api_auth_py", "target": "app_database", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/api/auth.py", "source_location": "L19", "weight": 1.0}, {"source": "backend_app_api_auth_py", "target": "app_models", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/api/auth.py", "source_location": "L20", "weight": 1.0}, {"source": "backend_app_api_auth_py", "target": "app_security", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/api/auth.py", "source_location": "L21", "weight": 1.0}, {"source": "backend_app_api_auth_py", "target": "auth_loginrequest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/api/auth.py", "source_location": "L26", "weight": 1.0}, {"source": "auth_loginrequest", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/api/auth.py", "source_location": "L26", "weight": 1.0}, {"source": "backend_app_api_auth_py", "target": "auth_login", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/api/auth.py", "source_location": "L31", "weight": 1.0}, {"source": "backend_app_api_auth_py", "target": "auth_logout", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/api/auth.py", "source_location": "L64", "weight": 1.0}, {"source": "auth_rationale_1", "target": "backend_app_api_auth_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/app/api/auth.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "auth_login", "callee": "HTTPException", "source_file": "backend/app/api/auth.py", "source_location": "L34"}, {"caller_nid": "auth_login", "callee": "HTTPException", "source_file": "backend/app/api/auth.py", "source_location": "L39"}, {"caller_nid": "auth_login", "callee": "first", "source_file": "backend/app/api/auth.py", "source_location": "L43"}, {"caller_nid": "auth_login", "callee": "query", "source_file": "backend/app/api/auth.py", "source_location": "L43"}, {"caller_nid": "auth_login", "callee": "str", "source_file": "backend/app/api/auth.py", "source_location": "L47"}, {"caller_nid": "auth_login", "callee": "issue_session", "source_file": "backend/app/api/auth.py", "source_location": "L48"}, {"caller_nid": "auth_login", "callee": "Response", "source_file": "backend/app/api/auth.py", "source_location": "L50"}, {"caller_nid": "auth_login", "callee": "set_cookie", "source_file": "backend/app/api/auth.py", "source_location": "L51"}, {"caller_nid": "auth_logout", "callee": "Response", "source_file": "backend/app/api/auth.py", "source_location": "L65"}, {"caller_nid": "auth_logout", "callee": "delete_cookie", "source_file": "backend/app/api/auth.py", "source_location": "L66"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_main_py", "label": "main.py", "file_type": "code", "source_file": "backend/app/main.py", "source_location": "L1"}, {"id": "main_health_check", "label": "health_check()", "file_type": "code", "source_file": "backend/app/main.py", "source_location": "L19"}, {"id": "main_health_check_db", "label": "health_check_db()", "file_type": "code", "source_file": "backend/app/main.py", "source_location": "L24"}], "edges": [{"source": "backend_app_main_py", "target": "fastapi", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L1", "weight": 1.0}, {"source": "backend_app_main_py", "target": "sqlalchemy_orm", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L2", "weight": 1.0}, {"source": "backend_app_main_py", "target": "sqlalchemy", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L3", "weight": 1.0}, {"source": "backend_app_main_py", "target": "app_database", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L4", "weight": 1.0}, {"source": "backend_app_main_py", "target": "app_config", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L5", "weight": 1.0}, {"source": "backend_app_main_py", "target": "logging", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L6", "weight": 1.0}, {"source": "backend_app_main_py", "target": "main_health_check", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L19", "weight": 1.0}, {"source": "backend_app_main_py", "target": "main_health_check_db", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L24", "weight": 1.0}, {"source": "backend_app_main_py", "target": "app_api", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L32", "weight": 1.0}, {"source": "backend_app_main_py", "target": "app_api", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L33", "weight": 1.0}, {"source": "backend_app_main_py", "target": "app_api", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L34", "weight": 1.0}, {"source": "backend_app_main_py", "target": "app_api", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L35", "weight": 1.0}, {"source": "backend_app_main_py", "target": "app_api", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L36", "weight": 1.0}, {"source": "backend_app_main_py", "target": "app_api", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L37", "weight": 1.0}, {"source": "backend_app_main_py", "target": "app_api", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/main.py", "source_location": "L38", "weight": 1.0}], "raw_calls": [{"caller_nid": "main_health_check_db", "callee": "execute", "source_file": "backend/app/main.py", "source_location": "L26"}, {"caller_nid": "main_health_check_db", "callee": "text", "source_file": "backend/app/main.py", "source_location": "L26"}, {"caller_nid": "main_health_check_db", "callee": "str", "source_file": "backend/app/main.py", "source_location": "L29"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_app_tsx", "label": "App.tsx", "file_type": "code", "source_file": "frontend/src/App.tsx", "source_location": "L1"}, {"id": "app_isactive", "label": "isActive()", "file_type": "code", "source_file": "frontend/src/App.tsx", "source_location": "L13"}, {"id": "app_linkclass", "label": "linkClass()", "file_type": "code", "source_file": "frontend/src/App.tsx", "source_location": "L15"}], "edges": [{"source": "frontend_src_app_tsx", "target": "react_router_dom", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/App.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_app_tsx", "target": "react_query", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/App.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_app_tsx", "target": "frontend_src_components_errorboundary", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/App.tsx", "source_location": "L3", "weight": 1.0}, {"source": "frontend_src_app_tsx", "target": "frontend_src_pages_dashboard", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/App.tsx", "source_location": "L4", "weight": 1.0}, {"source": "frontend_src_app_tsx", "target": "frontend_src_pages_mealdetail", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/App.tsx", "source_location": "L5", "weight": 1.0}, {"source": "frontend_src_app_tsx", "target": "frontend_src_pages_pantry", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/App.tsx", "source_location": "L6", "weight": 1.0}, {"source": "frontend_src_app_tsx", "target": "frontend_src_pages_shoppinglist", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/App.tsx", "source_location": "L7", "weight": 1.0}, {"source": "frontend_src_app_tsx", "target": "app_isactive", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/App.tsx", "source_location": "L13", "weight": 1.0}, {"source": "frontend_src_app_tsx", "target": "app_linkclass", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/App.tsx", "source_location": "L15", "weight": 1.0}, {"source": "app_linkclass", "target": "app_isactive", "relation": "calls", "confidence": "EXTRACTED", "source_file": "frontend/src/App.tsx", "source_location": "L17", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_tests_test_ingredient_schema_py", "label": "test_ingredient_schema.py", "file_type": "code", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L1"}, {"id": "test_ingredient_schema_test_ingredient_create_normalizes_aliases", "label": "test_ingredient_create_normalizes_aliases()", "file_type": "code", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L7"}, {"id": "test_ingredient_schema_test_ingredient_match_read_round_trip", "label": "test_ingredient_match_read_round_trip()", "file_type": "code", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L18"}], "edges": [{"source": "backend_tests_test_ingredient_schema_py", "target": "decimal", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L1", "weight": 1.0}, {"source": "backend_tests_test_ingredient_schema_py", "target": "uuid", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L2", "weight": 1.0}, {"source": "backend_tests_test_ingredient_schema_py", "target": "app_schemas_ingredient", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L4", "weight": 1.0}, {"source": "backend_tests_test_ingredient_schema_py", "target": "test_ingredient_schema_test_ingredient_create_normalizes_aliases", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L7", "weight": 1.0}, {"source": "backend_tests_test_ingredient_schema_py", "target": "test_ingredient_schema_test_ingredient_match_read_round_trip", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L18", "weight": 1.0}], "raw_calls": [{"caller_nid": "test_ingredient_schema_test_ingredient_create_normalizes_aliases", "callee": "IngredientCreate", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L8"}, {"caller_nid": "test_ingredient_schema_test_ingredient_match_read_round_trip", "callee": "uuid4", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L19"}, {"caller_nid": "test_ingredient_schema_test_ingredient_match_read_round_trip", "callee": "uuid4", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L20"}, {"caller_nid": "test_ingredient_schema_test_ingredient_match_read_round_trip", "callee": "uuid4", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L22"}, {"caller_nid": "test_ingredient_schema_test_ingredient_match_read_round_trip", "callee": "Decimal", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L25"}, {"caller_nid": "test_ingredient_schema_test_ingredient_match_read_round_trip", "callee": "Decimal", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L28"}, {"caller_nid": "test_ingredient_schema_test_ingredient_match_read_round_trip", "callee": "Decimal", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L29"}, {"caller_nid": "test_ingredient_schema_test_ingredient_match_read_round_trip", "callee": "model_validate", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L32"}, {"caller_nid": "test_ingredient_schema_test_ingredient_match_read_round_trip", "callee": "Decimal", "source_file": "backend/tests/test_ingredient_schema.py", "source_location": "L33"}]}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_components_errorboundary_tsx", "label": "ErrorBoundary.tsx", "file_type": "code", "source_file": "frontend/src/components/ErrorBoundary.tsx", "source_location": "L1"}, {"id": "errorboundary_getderivedstatefromerror", "label": "getDerivedStateFromError()", "file_type": "code", "source_file": "frontend/src/components/ErrorBoundary.tsx", "source_location": "L19"}, {"id": "errorboundary_componentdidcatch", "label": "componentDidCatch()", "file_type": "code", "source_file": "frontend/src/components/ErrorBoundary.tsx", "source_location": "L23"}], "edges": [{"source": "frontend_src_components_errorboundary_tsx", "target": "react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ErrorBoundary.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_components_errorboundary_tsx", "target": "lucide_react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ErrorBoundary.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_components_errorboundary_tsx", "target": "frontend_src_components_ui_button", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ErrorBoundary.tsx", "source_location": "L3", "weight": 1.0}, {"source": "frontend_src_components_errorboundary_tsx", "target": "errorboundary_getderivedstatefromerror", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ErrorBoundary.tsx", "source_location": "L19", "weight": 1.0}, {"source": "frontend_src_components_errorboundary_tsx", "target": "errorboundary_componentdidcatch", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ErrorBoundary.tsx", "source_location": "L23", "weight": 1.0}], "raw_calls": [{"caller_nid": "errorboundary_componentdidcatch", "callee": "error", "source_file": "frontend/src/components/ErrorBoundary.tsx", "source_location": "L24"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_components_ui_button_tsx", "label": "Button.tsx", "file_type": "code", "source_file": "frontend/src/components/ui/Button.tsx", "source_location": "L1"}, {"id": "button_button", "label": "Button()", "file_type": "code", "source_file": "frontend/src/components/ui/Button.tsx", "source_location": "L11"}], "edges": [{"source": "frontend_src_components_ui_button_tsx", "target": "lucide_react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Button.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_components_ui_button_tsx", "target": "react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Button.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_components_ui_button_tsx", "target": "button_button", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Button.tsx", "source_location": "L11", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_alembic_versions_0004_family_profile_calorie_target_py", "label": "0004_family_profile_calorie_target.py", "file_type": "code", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L1"}, {"id": "0004_family_profile_calorie_target_upgrade", "label": "upgrade()", "file_type": "code", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L22"}, {"id": "0004_family_profile_calorie_target_downgrade", "label": "downgrade()", "file_type": "code", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L29"}, {"id": "0004_family_profile_calorie_target_rationale_1", "label": "Add calorie_target to family_profile Revision ID: 0004 Revises: 0003 Create Dat", "file_type": "rationale", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L1"}], "edges": [{"source": "backend_alembic_versions_0004_family_profile_calorie_target_py", "target": "alembic", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L12", "weight": 1.0}, {"source": "backend_alembic_versions_0004_family_profile_calorie_target_py", "target": "sqlalchemy", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L13", "weight": 1.0}, {"source": "backend_alembic_versions_0004_family_profile_calorie_target_py", "target": "0004_family_profile_calorie_target_upgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L22", "weight": 1.0}, {"source": "backend_alembic_versions_0004_family_profile_calorie_target_py", "target": "0004_family_profile_calorie_target_downgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L29", "weight": 1.0}, {"source": "0004_family_profile_calorie_target_rationale_1", "target": "backend_alembic_versions_0004_family_profile_calorie_target_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "0004_family_profile_calorie_target_upgrade", "callee": "add_column", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L23"}, {"caller_nid": "0004_family_profile_calorie_target_upgrade", "callee": "Column", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L25"}, {"caller_nid": "0004_family_profile_calorie_target_upgrade", "callee": "Integer", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L25"}, {"caller_nid": "0004_family_profile_calorie_target_downgrade", "callee": "drop_column", "source_file": "backend/alembic/versions/0004_family_profile_calorie_target.py", "source_location": "L30"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_pages_pantry_tsx", "label": "Pantry.tsx", "file_type": "code", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L1"}, {"id": "pantry_handleadd", "label": "handleAdd()", "file_type": "code", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L59"}], "edges": [{"source": "frontend_src_pages_pantry_tsx", "target": "react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_pages_pantry_tsx", "target": "react_query", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_pages_pantry_tsx", "target": "lucide_react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L3", "weight": 1.0}, {"source": "frontend_src_pages_pantry_tsx", "target": "frontend_src_pages_api", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L4", "weight": 1.0}, {"source": "frontend_src_pages_pantry_tsx", "target": "frontend_src_pages_types", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L5", "weight": 1.0}, {"source": "frontend_src_pages_pantry_tsx", "target": "frontend_src_pages_components_ui_button", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L6", "weight": 1.0}, {"source": "frontend_src_pages_pantry_tsx", "target": "frontend_src_pages_components_ui_card", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L7", "weight": 1.0}, {"source": "frontend_src_pages_pantry_tsx", "target": "frontend_src_pages_components_ui_input", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L8", "weight": 1.0}, {"source": "frontend_src_pages_pantry_tsx", "target": "frontend_src_pages_components_ui_select", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L9", "weight": 1.0}, {"source": "frontend_src_pages_pantry_tsx", "target": "frontend_src_pages_components_ui_skeleton", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L10", "weight": 1.0}, {"source": "frontend_src_pages_pantry_tsx", "target": "frontend_src_pages_components_ui_emptystate", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L11", "weight": 1.0}, {"source": "frontend_src_pages_pantry_tsx", "target": "frontend_src_pages_lib_toast", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L12", "weight": 1.0}, {"source": "frontend_src_pages_pantry_tsx", "target": "pantry_handleadd", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L59", "weight": 1.0}], "raw_calls": [{"caller_nid": "pantry_handleadd", "callee": "mutate", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L61"}, {"caller_nid": "pantry_handleadd", "callee": "parseFloat", "source_file": "frontend/src/pages/Pantry.tsx", "source_location": "L63"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_services_orchestrator_alerts_py", "label": "alerts.py", "file_type": "code", "source_file": "backend/app/services/orchestrator/alerts.py", "source_location": "L1"}, {"id": "alerts_send_admin_alert", "label": "send_admin_alert()", "file_type": "code", "source_file": "backend/app/services/orchestrator/alerts.py", "source_location": "L9"}], "edges": [{"source": "backend_app_services_orchestrator_alerts_py", "target": "logging", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/app/services/orchestrator/alerts.py", "source_location": "L1", "weight": 1.0}, {"source": "backend_app_services_orchestrator_alerts_py", "target": "app_config", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/services/orchestrator/alerts.py", "source_location": "L3", "weight": 1.0}, {"source": "backend_app_services_orchestrator_alerts_py", "target": "app_services_email", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/services/orchestrator/alerts.py", "source_location": "L4", "weight": 1.0}, {"source": "backend_app_services_orchestrator_alerts_py", "target": "alerts_send_admin_alert", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/orchestrator/alerts.py", "source_location": "L9", "weight": 1.0}], "raw_calls": [{"caller_nid": "alerts_send_admin_alert", "callee": "warning", "source_file": "backend/app/services/orchestrator/alerts.py", "source_location": "L11"}, {"caller_nid": "alerts_send_admin_alert", "callee": "send", "source_file": "backend/app/services/orchestrator/alerts.py", "source_location": "L14"}, {"caller_nid": "alerts_send_admin_alert", "callee": "get_email_backend", "source_file": "backend/app/services/orchestrator/alerts.py", "source_location": "L14"}, {"caller_nid": "alerts_send_admin_alert", "callee": "exception", "source_file": "backend/app/services/orchestrator/alerts.py", "source_location": "L21"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_components_ui_emptystate_tsx", "label": "EmptyState.tsx", "file_type": "code", "source_file": "frontend/src/components/ui/EmptyState.tsx", "source_location": "L1"}], "edges": [{"source": "frontend_src_components_ui_emptystate_tsx", "target": "lucide_react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/EmptyState.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_components_ui_emptystate_tsx", "target": "frontend_src_components_ui_button", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/EmptyState.tsx", "source_location": "L2", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_alembic_versions_0003_grocery_item_description_py", "label": "0003_grocery_item_description.py", "file_type": "code", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L1"}, {"id": "0003_grocery_item_description_upgrade", "label": "upgrade()", "file_type": "code", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L24"}, {"id": "0003_grocery_item_description_downgrade", "label": "downgrade()", "file_type": "code", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L31"}, {"id": "0003_grocery_item_description_rationale_1", "label": "Add nullable description column to grocery_item. The Lucky California parser pr", "file_type": "rationale", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L1"}], "edges": [{"source": "backend_alembic_versions_0003_grocery_item_description_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L12", "weight": 1.0}, {"source": "backend_alembic_versions_0003_grocery_item_description_py", "target": "alembic", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L14", "weight": 1.0}, {"source": "backend_alembic_versions_0003_grocery_item_description_py", "target": "sqlalchemy", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L15", "weight": 1.0}, {"source": "backend_alembic_versions_0003_grocery_item_description_py", "target": "0003_grocery_item_description_upgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L24", "weight": 1.0}, {"source": "backend_alembic_versions_0003_grocery_item_description_py", "target": "0003_grocery_item_description_downgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L31", "weight": 1.0}, {"source": "0003_grocery_item_description_rationale_1", "target": "backend_alembic_versions_0003_grocery_item_description_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "0003_grocery_item_description_upgrade", "callee": "add_column", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L25"}, {"caller_nid": "0003_grocery_item_description_upgrade", "callee": "Column", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L27"}, {"caller_nid": "0003_grocery_item_description_upgrade", "callee": "Text", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L27"}, {"caller_nid": "0003_grocery_item_description_downgrade", "callee": "drop_column", "source_file": "backend/alembic/versions/0003_grocery_item_description.py", "source_location": "L32"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_scraper_init_py", "label": "__init__.py", "file_type": "code", "source_file": "backend/app/scraper/__init__.py", "source_location": "L1"}], "edges": [{"source": "backend_app_scraper_init_py", "target": "backend_app_scraper_base_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/scraper/__init__.py", "source_location": "L1", "weight": 1.0}, {"source": "backend_app_scraper_init_py", "target": "backend_app_scraper_lucky_ca_scraper_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/scraper/__init__.py", "source_location": "L2", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_schemas_meal_plan_generation_py", "label": "meal_plan_generation.py", "file_type": "code", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L1"}, {"id": "meal_plan_generation_generaterequest", "label": "GenerateRequest", "file_type": "code", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L11"}, {"id": "basemodel", "label": "BaseModel", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "meal_plan_generation_regeneraterequest", "label": "RegenerateRequest", "file_type": "code", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L16"}, {"id": "meal_plan_generation_generationitem", "label": "GenerationItem", "file_type": "code", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L25"}, {"id": "meal_plan_generation_generationdebug", "label": "GenerationDebug", "file_type": "code", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L33"}, {"id": "meal_plan_generation_generationresponse", "label": "GenerationResponse", "file_type": "code", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L39"}], "edges": [{"source": "backend_app_schemas_meal_plan_generation_py", "target": "datetime", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L3", "weight": 1.0}, {"source": "backend_app_schemas_meal_plan_generation_py", "target": "decimal", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L4", "weight": 1.0}, {"source": "backend_app_schemas_meal_plan_generation_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L5", "weight": 1.0}, {"source": "backend_app_schemas_meal_plan_generation_py", "target": "uuid", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L6", "weight": 1.0}, {"source": "backend_app_schemas_meal_plan_generation_py", "target": "pydantic", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L8", "weight": 1.0}, {"source": "backend_app_schemas_meal_plan_generation_py", "target": "meal_plan_generation_generaterequest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L11", "weight": 1.0}, {"source": "meal_plan_generation_generaterequest", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L11", "weight": 1.0}, {"source": "backend_app_schemas_meal_plan_generation_py", "target": "meal_plan_generation_regeneraterequest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L16", "weight": 1.0}, {"source": "meal_plan_generation_regeneraterequest", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L16", "weight": 1.0}, {"source": "backend_app_schemas_meal_plan_generation_py", "target": "meal_plan_generation_generationitem", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L25", "weight": 1.0}, {"source": "meal_plan_generation_generationitem", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L25", "weight": 1.0}, {"source": "backend_app_schemas_meal_plan_generation_py", "target": "meal_plan_generation_generationdebug", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L33", "weight": 1.0}, {"source": "meal_plan_generation_generationdebug", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L33", "weight": 1.0}, {"source": "backend_app_schemas_meal_plan_generation_py", "target": "meal_plan_generation_generationresponse", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L39", "weight": 1.0}, {"source": "meal_plan_generation_generationresponse", "target": "basemodel", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "backend/app/schemas/meal_plan_generation.py", "source_location": "L39", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_vite_config_ts", "label": "vite.config.ts", "file_type": "code", "source_file": "frontend/vite.config.ts", "source_location": "L1"}], "edges": [{"source": "frontend_vite_config_ts", "target": "vite", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/vite.config.ts", "source_location": "L1", "weight": 1.0}, {"source": "frontend_vite_config_ts", "target": "plugin_react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/vite.config.ts", "source_location": "L2", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_api_index_ts", "label": "index.ts", "file_type": "code", "source_file": "frontend/src/api/index.ts", "source_location": "L1"}], "edges": [{"source": "frontend_src_api_index_ts", "target": "axios", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/api/index.ts", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_alembic_versions_0005_grocery_item_external_id_py", "label": "0005_grocery_item_external_id.py", "file_type": "code", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L1"}, {"id": "0005_grocery_item_external_id_upgrade", "label": "upgrade()", "file_type": "code", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L26"}, {"id": "0005_grocery_item_external_id_downgrade", "label": "downgrade()", "file_type": "code", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L45"}, {"id": "0005_grocery_item_external_id_rationale_1", "label": "Add nullable indexed external_id and source columns to grocery_item. The Swiftl", "file_type": "rationale", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L1"}], "edges": [{"source": "backend_alembic_versions_0005_grocery_item_external_id_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L14", "weight": 1.0}, {"source": "backend_alembic_versions_0005_grocery_item_external_id_py", "target": "alembic", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L16", "weight": 1.0}, {"source": "backend_alembic_versions_0005_grocery_item_external_id_py", "target": "sqlalchemy", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L17", "weight": 1.0}, {"source": "backend_alembic_versions_0005_grocery_item_external_id_py", "target": "0005_grocery_item_external_id_upgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L26", "weight": 1.0}, {"source": "backend_alembic_versions_0005_grocery_item_external_id_py", "target": "0005_grocery_item_external_id_downgrade", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L45", "weight": 1.0}, {"source": "0005_grocery_item_external_id_rationale_1", "target": "backend_alembic_versions_0005_grocery_item_external_id_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "0005_grocery_item_external_id_upgrade", "callee": "add_column", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L27"}, {"caller_nid": "0005_grocery_item_external_id_upgrade", "callee": "Column", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L29"}, {"caller_nid": "0005_grocery_item_external_id_upgrade", "callee": "String", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L29"}, {"caller_nid": "0005_grocery_item_external_id_upgrade", "callee": "add_column", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L31"}, {"caller_nid": "0005_grocery_item_external_id_upgrade", "callee": "Column", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L33"}, {"caller_nid": "0005_grocery_item_external_id_upgrade", "callee": "String", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L34"}, {"caller_nid": "0005_grocery_item_external_id_upgrade", "callee": "create_index", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L37"}, {"caller_nid": "0005_grocery_item_external_id_downgrade", "callee": "drop_index", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L46"}, {"caller_nid": "0005_grocery_item_external_id_downgrade", "callee": "drop_column", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L47"}, {"caller_nid": "0005_grocery_item_external_id_downgrade", "callee": "drop_column", "source_file": "backend/alembic/versions/0005_grocery_item_external_id.py", "source_location": "L48"}]}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_database_py", "label": "database.py", "file_type": "code", "source_file": "backend/app/database.py", "source_location": "L1"}, {"id": "database_get_db", "label": "get_db()", "file_type": "code", "source_file": "backend/app/database.py", "source_location": "L11"}], "edges": [{"source": "backend_app_database_py", "target": "sqlalchemy", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/database.py", "source_location": "L1", "weight": 1.0}, {"source": "backend_app_database_py", "target": "sqlalchemy_orm", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/database.py", "source_location": "L2", "weight": 1.0}, {"source": "backend_app_database_py", "target": "app_config", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/database.py", "source_location": "L3", "weight": 1.0}, {"source": "backend_app_database_py", "target": "database_get_db", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/database.py", "source_location": "L11", "weight": 1.0}], "raw_calls": [{"caller_nid": "database_get_db", "callee": "SessionLocal", "source_file": "backend/app/database.py", "source_location": "L12"}, {"caller_nid": "database_get_db", "callee": "close", "source_file": "backend/app/database.py", "source_location": "L16"}]}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_main_tsx", "label": "main.tsx", "file_type": "code", "source_file": "frontend/src/main.tsx", "source_location": "L1"}], "edges": [{"source": "frontend_src_main_tsx", "target": "react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/main.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_main_tsx", "target": "client", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/main.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_main_tsx", "target": "react_hot_toast", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/main.tsx", "source_location": "L3", "weight": 1.0}, {"source": "frontend_src_main_tsx", "target": "frontend_src_app", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/main.tsx", "source_location": "L4", "weight": 1.0}, {"source": "frontend_src_main_tsx", "target": "frontend_src_index_css", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/main.tsx", "source_location": "L5", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_postcss_config_js", "label": "postcss.config.js", "file_type": "code", "source_file": "frontend/postcss.config.js", "source_location": "L1"}], "edges": [], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_tests_test_thin_phase4_smoke_py", "label": "test_thin_phase4_smoke.py", "file_type": "code", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L1"}, {"id": "test_thin_phase4_smoke_admin", "label": "_admin()", "file_type": "code", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L7"}, {"id": "test_thin_phase4_smoke_test_seed_data_present_and_resolvable", "label": "test_seed_data_present_and_resolvable()", "file_type": "code", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L11"}, {"id": "test_thin_phase4_smoke_test_resolve_against_seeded_ingredients", "label": "test_resolve_against_seeded_ingredients()", "file_type": "code", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L18"}, {"id": "test_thin_phase4_smoke_test_match_job_runs_against_seeded_data", "label": "test_match_job_runs_against_seeded_data()", "file_type": "code", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L30"}, {"id": "test_thin_phase4_smoke_rationale_1", "label": "End-to-end: ingredient + recipe + match all wired together.", "file_type": "rationale", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L1"}], "edges": [{"source": "backend_tests_test_thin_phase4_smoke_py", "target": "pytest", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L2", "weight": 1.0}, {"source": "backend_tests_test_thin_phase4_smoke_py", "target": "test_thin_phase4_smoke_admin", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L7", "weight": 1.0}, {"source": "backend_tests_test_thin_phase4_smoke_py", "target": "test_thin_phase4_smoke_test_seed_data_present_and_resolvable", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L11", "weight": 1.0}, {"source": "backend_tests_test_thin_phase4_smoke_py", "target": "test_thin_phase4_smoke_test_resolve_against_seeded_ingredients", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L18", "weight": 1.0}, {"source": "backend_tests_test_thin_phase4_smoke_py", "target": "test_thin_phase4_smoke_test_match_job_runs_against_seeded_data", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L30", "weight": 1.0}, {"source": "test_thin_phase4_smoke_test_resolve_against_seeded_ingredients", "target": "test_thin_phase4_smoke_admin", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L22", "weight": 1.0}, {"source": "test_thin_phase4_smoke_rationale_1", "target": "backend_tests_test_thin_phase4_smoke_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "test_thin_phase4_smoke_test_seed_data_present_and_resolvable", "callee": "get", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L12"}, {"caller_nid": "test_thin_phase4_smoke_test_seed_data_present_and_resolvable", "callee": "json", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L14"}, {"caller_nid": "test_thin_phase4_smoke_test_seed_data_present_and_resolvable", "callee": "len", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L15"}, {"caller_nid": "test_thin_phase4_smoke_test_seed_data_present_and_resolvable", "callee": "len", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L15"}, {"caller_nid": "test_thin_phase4_smoke_test_resolve_against_seeded_ingredients", "callee": "post", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L19"}, {"caller_nid": "test_thin_phase4_smoke_test_resolve_against_seeded_ingredients", "callee": "json", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L25"}, {"caller_nid": "test_thin_phase4_smoke_test_resolve_against_seeded_ingredients", "callee": "lower", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L27"}, {"caller_nid": "test_thin_phase4_smoke_test_match_job_runs_against_seeded_data", "callee": "run_match_job", "source_file": "backend/tests/test_thin_phase4_smoke.py", "source_location": "L33"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_services_planner_select_py", "label": "select.py", "file_type": "code", "source_file": "backend/app/services/planner/select.py", "source_location": "L1"}, {"id": "select_set_diversity_penalty", "label": "set_diversity_penalty()", "file_type": "code", "source_file": "backend/app/services/planner/select.py", "source_location": "L16"}, {"id": "select_set_score", "label": "_set_score()", "file_type": "code", "source_file": "backend/app/services/planner/select.py", "source_location": "L29"}, {"id": "select_select_set", "label": "select_set()", "file_type": "code", "source_file": "backend/app/services/planner/select.py", "source_location": "L33"}, {"id": "select_rationale_1", "label": "Top-K set enumeration with diversity penalty. Takes the top K (=20) scored reci", "file_type": "rationale", "source_file": "backend/app/services/planner/select.py", "source_location": "L1"}], "edges": [{"source": "backend_app_services_planner_select_py", "target": "itertools", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/select.py", "source_location": "L9", "weight": 1.0}, {"source": "backend_app_services_planner_select_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/select.py", "source_location": "L10", "weight": 1.0}, {"source": "backend_app_services_planner_select_py", "target": "app_services_planner_config", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/select.py", "source_location": "L12", "weight": 1.0}, {"source": "backend_app_services_planner_select_py", "target": "app_services_planner_types", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/select.py", "source_location": "L13", "weight": 1.0}, {"source": "backend_app_services_planner_select_py", "target": "select_set_diversity_penalty", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/select.py", "source_location": "L16", "weight": 1.0}, {"source": "backend_app_services_planner_select_py", "target": "select_set_score", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/select.py", "source_location": "L29", "weight": 1.0}, {"source": "backend_app_services_planner_select_py", "target": "select_select_set", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/select.py", "source_location": "L33", "weight": 1.0}, {"source": "select_set_score", "target": "select_set_diversity_penalty", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/select.py", "source_location": "L30", "weight": 1.0}, {"source": "select_select_set", "target": "select_set_score", "relation": "calls", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/select.py", "source_location": "L41", "weight": 1.0}, {"source": "select_rationale_1", "target": "backend_app_services_planner_select_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/select.py", "source_location": "L1", "weight": 1.0}], "raw_calls": [{"caller_nid": "select_set_diversity_penalty", "callee": "combinations", "source_file": "backend/app/services/planner/select.py", "source_location": "L21"}, {"caller_nid": "select_set_score", "callee": "sum", "source_file": "backend/app/services/planner/select.py", "source_location": "L30"}, {"caller_nid": "select_select_set", "callee": "list", "source_file": "backend/app/services/planner/select.py", "source_location": "L37"}, {"caller_nid": "select_select_set", "callee": "len", "source_file": "backend/app/services/planner/select.py", "source_location": "L40"}, {"caller_nid": "select_select_set", "callee": "sort", "source_file": "backend/app/services/planner/select.py", "source_location": "L43"}, {"caller_nid": "select_select_set", "callee": "float", "source_file": "backend/app/services/planner/select.py", "source_location": "L47"}, {"caller_nid": "select_select_set", "callee": "combinations", "source_file": "backend/app/services/planner/select.py", "source_location": "L48"}, {"caller_nid": "select_select_set", "callee": "list", "source_file": "backend/app/services/planner/select.py", "source_location": "L49"}, {"caller_nid": "select_select_set", "callee": "list", "source_file": "backend/app/services/planner/select.py", "source_location": "L52"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_components_ui_loadingspinner_tsx", "label": "LoadingSpinner.tsx", "file_type": "code", "source_file": "frontend/src/components/ui/LoadingSpinner.tsx", "source_location": "L1"}, {"id": "loadingspinner_loadingspinner", "label": "LoadingSpinner()", "file_type": "code", "source_file": "frontend/src/components/ui/LoadingSpinner.tsx", "source_location": "L10"}], "edges": [{"source": "frontend_src_components_ui_loadingspinner_tsx", "target": "lucide_react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/LoadingSpinner.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_components_ui_loadingspinner_tsx", "target": "frontend_src_components_ui_lib_utils", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/LoadingSpinner.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_components_ui_loadingspinner_tsx", "target": "loadingspinner_loadingspinner", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/LoadingSpinner.tsx", "source_location": "L10", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_components_ui_card_tsx", "label": "Card.tsx", "file_type": "code", "source_file": "frontend/src/components/ui/Card.tsx", "source_location": "L1"}, {"id": "card_card", "label": "Card()", "file_type": "code", "source_file": "frontend/src/components/ui/Card.tsx", "source_location": "L8"}, {"id": "card_cardheader", "label": "CardHeader()", "file_type": "code", "source_file": "frontend/src/components/ui/Card.tsx", "source_location": "L17"}, {"id": "card_cardbody", "label": "CardBody()", "file_type": "code", "source_file": "frontend/src/components/ui/Card.tsx", "source_location": "L26"}, {"id": "card_cardfooter", "label": "CardFooter()", "file_type": "code", "source_file": "frontend/src/components/ui/Card.tsx", "source_location": "L35"}], "edges": [{"source": "frontend_src_components_ui_card_tsx", "target": "frontend_src_components_ui_lib_utils", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Card.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_components_ui_card_tsx", "target": "card_card", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Card.tsx", "source_location": "L8", "weight": 1.0}, {"source": "frontend_src_components_ui_card_tsx", "target": "card_cardheader", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Card.tsx", "source_location": "L17", "weight": 1.0}, {"source": "frontend_src_components_ui_card_tsx", "target": "card_cardbody", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Card.tsx", "source_location": "L26", "weight": 1.0}, {"source": "frontend_src_components_ui_card_tsx", "target": "card_cardfooter", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Card.tsx", "source_location": "L35", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_lib_utils_ts", "label": "utils.ts", "file_type": "code", "source_file": "frontend/src/lib/utils.ts", "source_location": "L1"}, {"id": "utils_cn", "label": "cn()", "file_type": "code", "source_file": "frontend/src/lib/utils.ts", "source_location": "L4"}], "edges": [{"source": "frontend_src_lib_utils_ts", "target": "clsx", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/lib/utils.ts", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_lib_utils_ts", "target": "tailwind_merge", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/lib/utils.ts", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_lib_utils_ts", "target": "utils_cn", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/lib/utils.ts", "source_location": "L4", "weight": 1.0}], "raw_calls": [{"caller_nid": "utils_cn", "callee": "twMerge", "source_file": "frontend/src/lib/utils.ts", "source_location": "L5"}, {"caller_nid": "utils_cn", "callee": "clsx", "source_file": "frontend/src/lib/utils.ts", "source_location": "L5"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_app_services_planner_types_py", "label": "types.py", "file_type": "code", "source_file": "backend/app/services/planner/types.py", "source_location": "L1"}, {"id": "types_ingredientcost", "label": "IngredientCost", "file_type": "code", "source_file": "backend/app/services/planner/types.py", "source_location": "L11"}, {"id": "types_recipecost", "label": "RecipeCost", "file_type": "code", "source_file": "backend/app/services/planner/types.py", "source_location": "L26"}, {"id": "types_sale_coverage_pct", "label": "sale_coverage_pct()", "file_type": "code", "source_file": "backend/app/services/planner/types.py", "source_location": "L37"}, {"id": "types_pantry_hit_pct", "label": "pantry_hit_pct()", "file_type": "code", "source_file": "backend/app/services/planner/types.py", "source_location": "L43"}, {"id": "types_filterresult", "label": "FilterResult", "file_type": "code", "source_file": "backend/app/services/planner/types.py", "source_location": "L50"}, {"id": "types_scoredrecipe", "label": "ScoredRecipe", "file_type": "code", "source_file": "backend/app/services/planner/types.py", "source_location": "L56"}, {"id": "types_generationresult", "label": "GenerationResult", "file_type": "code", "source_file": "backend/app/services/planner/types.py", "source_location": "L66"}, {"id": "types_rationale_1", "label": "Shared planner data structures.", "file_type": "rationale", "source_file": "backend/app/services/planner/types.py", "source_location": "L1"}], "edges": [{"source": "backend_app_services_planner_types_py", "target": "dataclasses", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/types.py", "source_location": "L4", "weight": 1.0}, {"source": "backend_app_services_planner_types_py", "target": "decimal", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/types.py", "source_location": "L5", "weight": 1.0}, {"source": "backend_app_services_planner_types_py", "target": "typing", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/types.py", "source_location": "L6", "weight": 1.0}, {"source": "backend_app_services_planner_types_py", "target": "uuid", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/types.py", "source_location": "L7", "weight": 1.0}, {"source": "backend_app_services_planner_types_py", "target": "types_ingredientcost", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/types.py", "source_location": "L11", "weight": 1.0}, {"source": "backend_app_services_planner_types_py", "target": "types_recipecost", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/types.py", "source_location": "L26", "weight": 1.0}, {"source": "backend_app_services_planner_types_py", "target": "types_sale_coverage_pct", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/types.py", "source_location": "L37", "weight": 1.0}, {"source": "backend_app_services_planner_types_py", "target": "types_pantry_hit_pct", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/types.py", "source_location": "L43", "weight": 1.0}, {"source": "backend_app_services_planner_types_py", "target": "types_filterresult", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/types.py", "source_location": "L50", "weight": 1.0}, {"source": "backend_app_services_planner_types_py", "target": "types_scoredrecipe", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/types.py", "source_location": "L56", "weight": 1.0}, {"source": "backend_app_services_planner_types_py", "target": "types_generationresult", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/types.py", "source_location": "L66", "weight": 1.0}, {"source": "types_rationale_1", "target": "backend_app_services_planner_types_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/app/services/planner/types.py", "source_location": "L1", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_components_ui_textarea_tsx", "label": "Textarea.tsx", "file_type": "code", "source_file": "frontend/src/components/ui/Textarea.tsx", "source_location": "L1"}, {"id": "textarea_cn", "label": "cn()", "file_type": "code", "source_file": "frontend/src/components/ui/Textarea.tsx", "source_location": "L17"}], "edges": [{"source": "frontend_src_components_ui_textarea_tsx", "target": "react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Textarea.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_components_ui_textarea_tsx", "target": "frontend_src_components_ui_lib_utils", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Textarea.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_components_ui_textarea_tsx", "target": "textarea_cn", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Textarea.tsx", "source_location": "L17", "weight": 1.0}], "raw_calls": []}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_pages_login_tsx", "label": "Login.tsx", "file_type": "code", "source_file": "frontend/src/pages/Login.tsx", "source_location": "L1"}, {"id": "login_login", "label": "Login()", "file_type": "code", "source_file": "frontend/src/pages/Login.tsx", "source_location": "L8"}], "edges": [{"source": "frontend_src_pages_login_tsx", "target": "react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Login.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_pages_login_tsx", "target": "lucide_react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Login.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_pages_login_tsx", "target": "frontend_src_pages_api", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Login.tsx", "source_location": "L3", "weight": 1.0}, {"source": "frontend_src_pages_login_tsx", "target": "frontend_src_pages_components_ui_button", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Login.tsx", "source_location": "L4", "weight": 1.0}, {"source": "frontend_src_pages_login_tsx", "target": "frontend_src_pages_components_ui_card", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Login.tsx", "source_location": "L5", "weight": 1.0}, {"source": "frontend_src_pages_login_tsx", "target": "frontend_src_pages_components_ui_input", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Login.tsx", "source_location": "L6", "weight": 1.0}, {"source": "frontend_src_pages_login_tsx", "target": "login_login", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Login.tsx", "source_location": "L8", "weight": 1.0}], "raw_calls": [{"caller_nid": "login_login", "callee": "useState", "source_file": "frontend/src/pages/Login.tsx", "source_location": "L9"}, {"caller_nid": "login_login", "callee": "useState", "source_file": "frontend/src/pages/Login.tsx", "source_location": "L10"}, {"caller_nid": "login_login", "callee": "useState", "source_file": "frontend/src/pages/Login.tsx", "source_location": "L11"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_tests_test_smoke_py", "label": "test_smoke.py", "file_type": "code", "source_file": "backend/tests/test_smoke.py", "source_location": "L1"}, {"id": "test_smoke_test_app_imports", "label": "test_app_imports()", "file_type": "code", "source_file": "backend/tests/test_smoke.py", "source_location": "L15"}, {"id": "test_smoke_test_health", "label": "test_health()", "file_type": "code", "source_file": "backend/tests/test_smoke.py", "source_location": "L21"}, {"id": "test_smoke_test_health_db", "label": "test_health_db()", "file_type": "code", "source_file": "backend/tests/test_smoke.py", "source_location": "L28"}, {"id": "test_smoke_test_router_list_endpoints", "label": "test_router_list_endpoints()", "file_type": "code", "source_file": "backend/tests/test_smoke.py", "source_location": "L49"}, {"id": "test_smoke_rationale_1", "label": "Smoke tests: app boots, routers wire up, no import-time crashes. The router-lis", "file_type": "rationale", "source_file": "backend/tests/test_smoke.py", "source_location": "L1"}, {"id": "test_smoke_rationale_50", "label": "Each canonical GET must respond. 200 (handled), 401 (admin-gated), 404 (hand", "file_type": "rationale", "source_file": "backend/tests/test_smoke.py", "source_location": "L50"}], "edges": [{"source": "backend_tests_test_smoke_py", "target": "os", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/tests/test_smoke.py", "source_location": "L11", "weight": 1.0}, {"source": "backend_tests_test_smoke_py", "target": "pytest", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/tests/test_smoke.py", "source_location": "L12", "weight": 1.0}, {"source": "backend_tests_test_smoke_py", "target": "test_smoke_test_app_imports", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_smoke.py", "source_location": "L15", "weight": 1.0}, {"source": "backend_tests_test_smoke_py", "target": "test_smoke_test_health", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_smoke.py", "source_location": "L21", "weight": 1.0}, {"source": "backend_tests_test_smoke_py", "target": "test_smoke_test_health_db", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_smoke.py", "source_location": "L28", "weight": 1.0}, {"source": "backend_tests_test_smoke_py", "target": "test_smoke_test_router_list_endpoints", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_smoke.py", "source_location": "L49", "weight": 1.0}, {"source": "test_smoke_rationale_1", "target": "backend_tests_test_smoke_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/tests/test_smoke.py", "source_location": "L1", "weight": 1.0}, {"source": "test_smoke_rationale_50", "target": "test_smoke_test_router_list_endpoints", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/tests/test_smoke.py", "source_location": "L50", "weight": 1.0}], "raw_calls": [{"caller_nid": "test_smoke_test_health", "callee": "get", "source_file": "backend/tests/test_smoke.py", "source_location": "L22"}, {"caller_nid": "test_smoke_test_health", "callee": "json", "source_file": "backend/tests/test_smoke.py", "source_location": "L24"}, {"caller_nid": "test_smoke_test_health_db", "callee": "get", "source_file": "backend/tests/test_smoke.py", "source_location": "L29"}, {"caller_nid": "test_smoke_test_health_db", "callee": "json", "source_file": "backend/tests/test_smoke.py", "source_location": "L31"}, {"caller_nid": "test_smoke_test_health_db", "callee": "get", "source_file": "backend/tests/test_smoke.py", "source_location": "L32"}, {"caller_nid": "test_smoke_test_router_list_endpoints", "callee": "get", "source_file": "backend/tests/test_smoke.py", "source_location": "L56"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_components_ui_badge_tsx", "label": "Badge.tsx", "file_type": "code", "source_file": "frontend/src/components/ui/Badge.tsx", "source_location": "L1"}, {"id": "badge_badge", "label": "Badge()", "file_type": "code", "source_file": "frontend/src/components/ui/Badge.tsx", "source_location": "L9"}], "edges": [{"source": "frontend_src_components_ui_badge_tsx", "target": "frontend_src_components_ui_lib_utils", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Badge.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_components_ui_badge_tsx", "target": "badge_badge", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/components/ui/Badge.tsx", "source_location": "L9", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_alembic_env_py", "label": "env.py", "file_type": "code", "source_file": "backend/alembic/env.py", "source_location": "L1"}, {"id": "env_run_migrations_offline", "label": "run_migrations_offline()", "file_type": "code", "source_file": "backend/alembic/env.py", "source_location": "L22"}, {"id": "env_run_migrations_online", "label": "run_migrations_online()", "file_type": "code", "source_file": "backend/alembic/env.py", "source_location": "L35"}], "edges": [{"source": "backend_alembic_env_py", "target": "logging_config", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/env.py", "source_location": "L1", "weight": 1.0}, {"source": "backend_alembic_env_py", "target": "sqlalchemy", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/env.py", "source_location": "L2", "weight": 1.0}, {"source": "backend_alembic_env_py", "target": "alembic", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/env.py", "source_location": "L3", "weight": 1.0}, {"source": "backend_alembic_env_py", "target": "sys", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/alembic/env.py", "source_location": "L4", "weight": 1.0}, {"source": "backend_alembic_env_py", "target": "os", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/alembic/env.py", "source_location": "L5", "weight": 1.0}, {"source": "backend_alembic_env_py", "target": "app_models", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/env.py", "source_location": "L9", "weight": 1.0}, {"source": "backend_alembic_env_py", "target": "app_config", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "backend/alembic/env.py", "source_location": "L10", "weight": 1.0}, {"source": "backend_alembic_env_py", "target": "env_run_migrations_offline", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/env.py", "source_location": "L22", "weight": 1.0}, {"source": "backend_alembic_env_py", "target": "env_run_migrations_online", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/alembic/env.py", "source_location": "L35", "weight": 1.0}], "raw_calls": [{"caller_nid": "env_run_migrations_offline", "callee": "get_main_option", "source_file": "backend/alembic/env.py", "source_location": "L23"}, {"caller_nid": "env_run_migrations_offline", "callee": "configure", "source_file": "backend/alembic/env.py", "source_location": "L24"}, {"caller_nid": "env_run_migrations_offline", "callee": "begin_transaction", "source_file": "backend/alembic/env.py", "source_location": "L31"}, {"caller_nid": "env_run_migrations_offline", "callee": "run_migrations", "source_file": "backend/alembic/env.py", "source_location": "L32"}, {"caller_nid": "env_run_migrations_online", "callee": "engine_from_config", "source_file": "backend/alembic/env.py", "source_location": "L36"}, {"caller_nid": "env_run_migrations_online", "callee": "get_section", "source_file": "backend/alembic/env.py", "source_location": "L37"}, {"caller_nid": "env_run_migrations_online", "callee": "connect", "source_file": "backend/alembic/env.py", "source_location": "L42"}, {"caller_nid": "env_run_migrations_online", "callee": "configure", "source_file": "backend/alembic/env.py", "source_location": "L43"}, {"caller_nid": "env_run_migrations_online", "callee": "begin_transaction", "source_file": "backend/alembic/env.py", "source_location": "L48"}, {"caller_nid": "env_run_migrations_online", "callee": "run_migrations", "source_file": "backend/alembic/env.py", "source_location": "L49"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "frontend_src_pages_dashboard_tsx", "label": "Dashboard.tsx", "file_type": "code", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L1"}, {"id": "dashboard_handlesend", "label": "handleSend()", "file_type": "code", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L282"}], "edges": [{"source": "frontend_src_pages_dashboard_tsx", "target": "react_query", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L1", "weight": 1.0}, {"source": "frontend_src_pages_dashboard_tsx", "target": "react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L2", "weight": 1.0}, {"source": "frontend_src_pages_dashboard_tsx", "target": "react_router_dom", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L3", "weight": 1.0}, {"source": "frontend_src_pages_dashboard_tsx", "target": "lucide_react", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L4", "weight": 1.0}, {"source": "frontend_src_pages_dashboard_tsx", "target": "react_hot_toast", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L8", "weight": 1.0}, {"source": "frontend_src_pages_dashboard_tsx", "target": "dnd", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L9", "weight": 1.0}, {"source": "frontend_src_pages_dashboard_tsx", "target": "frontend_src_pages_api", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L20", "weight": 1.0}, {"source": "frontend_src_pages_dashboard_tsx", "target": "frontend_src_pages_types", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L21", "weight": 1.0}, {"source": "frontend_src_pages_dashboard_tsx", "target": "frontend_src_pages_components_ui_badge", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L22", "weight": 1.0}, {"source": "frontend_src_pages_dashboard_tsx", "target": "frontend_src_pages_components_ui_card", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L23", "weight": 1.0}, {"source": "frontend_src_pages_dashboard_tsx", "target": "frontend_src_pages_components_ui_skeleton", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L24", "weight": 1.0}, {"source": "frontend_src_pages_dashboard_tsx", "target": "frontend_src_pages_components_ui_emptystate", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L25", "weight": 1.0}, {"source": "frontend_src_pages_dashboard_tsx", "target": "dashboard_handlesend", "relation": "contains", "confidence": "EXTRACTED", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L282", "weight": 1.0}], "raw_calls": [{"caller_nid": "dashboard_handlesend", "callee": "setSendingVoteEmail", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L283"}, {"caller_nid": "dashboard_handlesend", "callee": "triggerOrchestrate", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L285"}, {"caller_nid": "dashboard_handlesend", "callee": "success", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L287"}, {"caller_nid": "dashboard_handlesend", "callee": "error", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L289"}, {"caller_nid": "dashboard_handlesend", "callee": "setSendingVoteEmail", "source_file": "frontend/src/pages/Dashboard.tsx", "source_location": "L291"}]}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "backend_tests_test_config_py", "label": "test_config.py", "file_type": "code", "source_file": "backend/tests/test_config.py", "source_location": "L1"}, {"id": "test_config_test_database_url_required", "label": "test_database_url_required()", "file_type": "code", "source_file": "backend/tests/test_config.py", "source_location": "L12"}, {"id": "test_config_rationale_1", "label": "Config fail-fast: importing app.config with DATABASE_URL unset must raise.", "file_type": "rationale", "source_file": "backend/tests/test_config.py", "source_location": "L1"}, {"id": "test_config_rationale_13", "label": "Settings() with empty DATABASE_URL \u2192 RuntimeError at instantiation.", "file_type": "rationale", "source_file": "backend/tests/test_config.py", "source_location": "L13"}], "edges": [{"source": "backend_tests_test_config_py", "target": "importlib", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/tests/test_config.py", "source_location": "L7", "weight": 1.0}, {"source": "backend_tests_test_config_py", "target": "pytest", "relation": "imports", "confidence": "EXTRACTED", "source_file": "backend/tests/test_config.py", "source_location": "L9", "weight": 1.0}, {"source": "backend_tests_test_config_py", "target": "test_config_test_database_url_required", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/tests/test_config.py", "source_location": "L12", "weight": 1.0}, {"source": "test_config_rationale_1", "target": "backend_tests_test_config_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/tests/test_config.py", "source_location": "L1", "weight": 1.0}, {"source": "test_config_rationale_13", "target": "test_config_test_database_url_required", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/tests/test_config.py", "source_location": "L13", "weight": 1.0}], "raw_calls": [{"caller_nid": "test_config_test_database_url_required", "callee": "setenv", "source_file": "backend/tests/test_config.py", "source_location": "L16"}, {"caller_nid": "test_config_test_database_url_required", "callee": "raises", "source_file": "backend/tests/test_config.py", "source_location": "L18"}, {"caller_nid": "test_config_test_database_url_required", "callee": "Settings", "source_file": "backend/tests/test_config.py", "source_location": "L19"}]}

Some files were not shown because too many files have changed in this diff Show More