Generated via /graphify over the full tree (177 files, ~320k words). Produces graph.html, graph.json, GRAPH_REPORT.md plus per-file extraction cache so incremental --update runs reuse prior results. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 line
19 KiB
JSON
1 line
19 KiB
JSON
{"nodes": [{"id": "claudemd_project_guide", "label": "CLAUDE.md project guide", "file_type": "document", "source_file": "CLAUDE.md", "source_location": null, "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_auth_architecture", "label": "Auth Architecture (Keycloak -> GoTrue -> Supabase)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L34-L44", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_option_b_oidc_proxy", "label": "Option B: GoTrue as OIDC proxy", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L36-L37", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_self_registration", "label": "Keycloak self-registration enabled", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L40", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_link_only_invitations", "label": "Link-only invitations (no email)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L41", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_multi_collective", "label": "Multiple collectives per user", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L42", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_rp_initiated_logout", "label": "RP-initiated logout flow", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L44", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_islogging_out_flag", "label": "isLoggingOut module flag", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L44", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_logged_out_route", "label": "/logged-out public route", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L44", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_sync_strategy", "label": "Sync Strategy (Realtime/SSE/Polling)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L46-L54", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_offline_first", "label": "Offline-first with IndexedDB + LWW conflict", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L54", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_domain_model", "label": "Domain Model (Collective-centric)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L56-L70", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_roles_admin_member_guest", "label": "Roles: admin / member / guest", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L60", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_core_entities", "label": "Core entities: Collective, ShoppingList, Task, Note", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L62", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_business_rules", "label": "Business rules (single active session, trash 7d, sole-admin promotion)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L66-L70", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_i18n_paraglide", "label": "Paraglide JS internationalisation", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L72-L81", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_typescript_types", "label": "TypeScript types generation (database.ts / domain.ts)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L83-L85", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_dev_test_users", "label": "Dev test users (ana/borja/carmen/david/eva)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L87-L97", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_colectivo_web_confidential", "label": "Gotcha: colectivo-web is confidential client", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L103", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_openid_scope", "label": "Gotcha: custom openid client scope in Keycloak", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L105", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_disable_signup", "label": "Gotcha: GOTRUE_DISABLE_SIGNUP must be false", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L107", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_auth_users_seed", "label": "Gotcha: auth.users pre-seeded with Keycloak UUIDs", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L109", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_kong_env_sub", "label": "Gotcha: Kong env var substitution via kong-start.sh", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L111", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_gotrue_empty_role", "label": "Gotcha: GoTrue empty role/aud on INSERT + UPDATE clobber (migrations 013/014)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L113", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_no_getsession_in_load", "label": "Gotcha: do not call getSession() in SvelteKit load()", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L117", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_initial_session_event", "label": "Gotcha: onAuthStateChange fires INITIAL_SESSION not SIGNED_IN", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L119", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_rgb_not_hsl", "label": "Gotcha: CSS custom properties use rgb() not hsl()", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L121", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_auth_lock_deadlock", "label": "Gotcha: Supabase onAuthStateChange query deadlock (setTimeout + pass-through lock)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L123", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_logout_pkce_race", "label": "Gotcha: logout must be RP-initiated + guard $effect (PKCE race)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L125", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_crypto_randomuuid", "label": "Gotcha: never call crypto.randomUUID() directly, use generateId()", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L127", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_pwa_service_worker_filename", "label": "Gotcha: PWA SW filename (use src/sw.ts not src/service-worker.ts)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L131", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_pwa_no_auto_register", "label": "Gotcha: @vite-pwa/sveltekit does not auto-register SW", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L133", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_injectmanifest_hardcoded", "label": "Gotcha: injectManifest hardcodes filename -> use generateSW", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L135", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_no_storagestate", "label": "Gotcha: Playwright must use live Keycloak login, not storageState", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L139", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_playwright_baseurl", "label": "Gotcha: Playwright baseURL hardcoded to localhost:5173", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L141", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_realtime_waitfor_timeout", "label": "Gotcha: Realtime waitFor timeout 10s not 5s", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L143", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_kong_strip_path", "label": "Gotcha: Kong strip_path: true on full-table route strips too much", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L147", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_kong_plugins_list", "label": "Gotcha: KONG_PLUGINS must list every plugin used", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L149", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_select_after_insert_rls", "label": "Gotcha: .select() after .insert() evaluates SELECT RLS policy", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L151", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_supabase_roles_bootstrap", "label": "Gotcha: supabase/postgres v15.1.1.78 does not bootstrap internal roles", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L155", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_docker_exec_stdin_drain", "label": "Gotcha: docker compose exec -T drains surrounding heredoc", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L157", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_ios_safari_platform", "label": "iOS Safari / PWA platform notes", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L161-L166", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_nginx_realtime_config", "label": "nginx (prod) Realtime WebSocket config", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L168-L171", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_keycloak_behind_nginx", "label": "Keycloak behind nginx (X-Forwarded headers)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L173-L174", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_supabase_realtime_selfhosted", "label": "Supabase Realtime self-hosted config", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L176-L178", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "claudemd_project_guide", "target": "development_doc", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L12", "weight": 1.0}, {"source": "claudemd_project_guide", "target": "fase8_doc", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L15", "weight": 1.0}, {"source": "claudemd_auth_architecture", "target": "claudemd_option_b_oidc_proxy", "relation": "implements", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L36", "weight": 1.0}, {"source": "claudemd_auth_architecture", "target": "claudemd_self_registration", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L40", "weight": 1.0}, {"source": "claudemd_auth_architecture", "target": "claudemd_link_only_invitations", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L41", "weight": 1.0}, {"source": "claudemd_auth_architecture", "target": "claudemd_multi_collective", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L42", "weight": 1.0}, {"source": "claudemd_auth_architecture", "target": "claudemd_rp_initiated_logout", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L44", "weight": 1.0}, {"source": "claudemd_rp_initiated_logout", "target": "claudemd_islogging_out_flag", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L44", "weight": 1.0}, {"source": "claudemd_rp_initiated_logout", "target": "claudemd_logged_out_route", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L44", "weight": 1.0}, {"source": "claudemd_rp_initiated_logout", "target": "fase8_rp_initiated_fix", "relation": "rationale_for", "confidence": "INFERRED", "confidence_score": 0.9, "source_file": "CLAUDE.md", "source_location": "L44", "weight": 1.0}, {"source": "claudemd_domain_model", "target": "claudemd_roles_admin_member_guest", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L60", "weight": 1.0}, {"source": "claudemd_domain_model", "target": "claudemd_core_entities", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L62", "weight": 1.0}, {"source": "claudemd_domain_model", "target": "claudemd_business_rules", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L66-L70", "weight": 1.0}, {"source": "claudemd_sync_strategy", "target": "claudemd_offline_first", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L54", "weight": 1.0}, {"source": "claudemd_sync_strategy", "target": "claudemd_supabase_realtime_selfhosted", "relation": "conceptually_related_to", "confidence": "INFERRED", "confidence_score": 0.85, "source_file": "CLAUDE.md", "source_location": "L50,L176", "weight": 1.0}, {"source": "claudemd_gotcha_gotrue_empty_role", "target": "fase8_bug1_empty_role", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L113", "weight": 1.0}, {"source": "claudemd_gotcha_logout_pkce_race", "target": "fase8_bug2_logout_pkce", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L125", "weight": 1.0}, {"source": "claudemd_gotcha_logout_pkce_race", "target": "fase8_auth_ts", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L125", "weight": 1.0}, {"source": "claudemd_gotcha_logout_pkce_race", "target": "fase8_app_layout_svelte", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L125", "weight": 1.0}, {"source": "claudemd_gotcha_auth_lock_deadlock", "target": "claudemd_gotcha_no_getsession_in_load", "relation": "conceptually_related_to", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "CLAUDE.md", "source_location": "L117,L123", "weight": 1.0}, {"source": "claudemd_gotcha_logout_pkce_race", "target": "claudemd_gotcha_initial_session_event", "relation": "conceptually_related_to", "confidence": "INFERRED", "confidence_score": 0.7, "source_file": "CLAUDE.md", "source_location": "L119,L125", "weight": 1.0}, {"source": "claudemd_gotcha_injectmanifest_hardcoded", "target": "claudemd_gotcha_pwa_service_worker_filename", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "L135", "weight": 1.0}, {"source": "claudemd_gotcha_pwa_no_auto_register", "target": "claudemd_gotcha_pwa_service_worker_filename", "relation": "conceptually_related_to", "confidence": "INFERRED", "confidence_score": 0.8, "source_file": "CLAUDE.md", "source_location": "L131,L133", "weight": 1.0}, {"source": "claudemd_gotcha_colectivo_web_confidential", "target": "claudemd_gotcha_openid_scope", "relation": "conceptually_related_to", "confidence": "INFERRED", "confidence_score": 0.8, "source_file": "CLAUDE.md", "source_location": "L103,L105", "weight": 1.0}, {"source": "claudemd_gotcha_auth_users_seed", "target": "claudemd_gotcha_gotrue_empty_role", "relation": "conceptually_related_to", "confidence": "INFERRED", "confidence_score": 0.8, "source_file": "CLAUDE.md", "source_location": "L109,L113", "weight": 1.0}, {"source": "claudemd_dev_test_users", "target": "claudemd_gotcha_auth_users_seed", "relation": "conceptually_related_to", "confidence": "INFERRED", "confidence_score": 0.8, "source_file": "CLAUDE.md", "source_location": "L89,L109", "weight": 1.0}, {"source": "claudemd_ios_safari_platform", "target": "claudemd_gotcha_logout_pkce_race", "relation": "conceptually_related_to", "confidence": "INFERRED", "confidence_score": 0.6, "source_file": "CLAUDE.md", "source_location": "L162,L125", "weight": 1.0}, {"source": "claudemd_nginx_realtime_config", "target": "claudemd_sync_strategy", "relation": "shares_data_with", "confidence": "INFERRED", "confidence_score": 0.75, "source_file": "CLAUDE.md", "source_location": "L168,L50", "weight": 1.0}, {"source": "claudemd_keycloak_behind_nginx", "target": "claudemd_auth_architecture", "relation": "shares_data_with", "confidence": "INFERRED", "confidence_score": 0.8, "source_file": "CLAUDE.md", "source_location": "L173,L34", "weight": 1.0}, {"source": "claudemd_gotcha_crypto_randomuuid", "target": "claudemd_ios_safari_platform", "relation": "semantically_similar_to", "confidence": "INFERRED", "confidence_score": 0.65, "source_file": "CLAUDE.md", "source_location": "L127,L161", "weight": 1.0}, {"source": "claudemd_gotcha_no_storagestate", "target": "claudemd_gotcha_auth_lock_deadlock", "relation": "semantically_similar_to", "confidence": "INFERRED", "confidence_score": 0.7, "source_file": "CLAUDE.md", "source_location": "L139,L123", "weight": 1.0}], "hyperedges": [{"id": "keycloak_gotrue_supabase_flow", "label": "Keycloak -> GoTrue -> Supabase auth flow", "nodes": ["claudemd_auth_architecture", "claudemd_option_b_oidc_proxy", "claudemd_gotcha_colectivo_web_confidential", "claudemd_gotcha_openid_scope", "claudemd_gotcha_auth_users_seed", "claudemd_keycloak_behind_nginx"], "relation": "form", "confidence": "EXTRACTED", "confidence_score": 0.9, "source_file": "CLAUDE.md"}]} |