Files
collective-lists/graphify-out/cache/d20d48632351cfd713e03137835d57e3c3b23d1120867dcac2c859133fe39e6a.json
Oier Bravo Urtasun b660ead40d chore(graphify): knowledge graph of the repo (1398 nodes, 1627 edges)
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>
2026-04-21 16:25:53 +02:00

1 line
17 KiB
JSON

{"nodes": [{"id": "claudemd_project_status", "label": "Project Status: Fase 0-7 complete", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Project Status", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_documentation_map", "label": "Documentation Map", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Documentation Map", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_code_language_english", "label": "All code must be in English", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Code Language", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_etc_hosts_keycloak", "label": "Required /etc/hosts entry: 127.0.0.1 keycloak", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Local Dev", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_auth_architecture_option_b", "label": "Auth Architecture: Keycloak -> GoTrue (OIDC proxy) -> Supabase", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Auth Architecture", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_self_registration_enabled", "label": "Self-registration enabled in Keycloak", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Auth Architecture", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_invitations_link_only", "label": "Invitations link-only (no email)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Auth Architecture", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_multi_collective_per_user", "label": "Multiple collectives per user supported", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Auth Architecture", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_sync_strategy", "label": "Sync Strategy: WS / SSE / polling tiers", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Sync Strategy", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_offline_first", "label": "Offline-first with last-write-wins", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Sync Strategy", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_domain_model", "label": "Collective-centric domain model", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Domain Model", "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": "Domain Model", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_paraglide_i18n", "label": "Paraglide JS (en/es) for i18n", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Internationalisation", "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": "Dev Test Users", "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": "Gotchas/Auth", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_openid_scope", "label": "Gotcha: Custom openid scope required on colectivo-web", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Auth", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_disable_signup_false", "label": "Gotcha: GOTRUE_DISABLE_SIGNUP must be false", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Auth", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_auth_users_preseeded", "label": "Gotcha: auth.users pre-seeded with Keycloak UUIDs", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Auth", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_kong_env_var_substitution", "label": "Gotcha: Kong does not interpolate ${VAR}; kong-start.sh perl", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Auth", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_gotrue_empty_role_aud", "label": "Gotcha: GoTrue v2.158.1 empty role/aud, migration 013 fix", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Auth", "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": "Gotchas/SvelteKit", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_onauthstatechange_initial_session", "label": "Gotcha: onAuthStateChange fires INITIAL_SESSION", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/SvelteKit", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_css_rgb_triplets", "label": "Gotcha: CSS tokens are RGB triplets \u2014 use rgb()", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/SvelteKit", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_settimeout_loadcollectives", "label": "Gotcha: defer queries inside onAuthStateChange with setTimeout", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/SvelteKit", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_generateid_not_crypto_randomuuid", "label": "Gotcha: use generateId() not crypto.randomUUID", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/SvelteKit", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_pwa_sw_filename", "label": "Gotcha: PWA injectManifest + service-worker.ts blocked", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/PWA", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_pwa_auto_register", "label": "Gotcha: @vite-pwa/sveltekit does not auto-register SW", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/PWA", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_injectmanifest_hardcoded_filename", "label": "Gotcha: injectManifest hardcodes SW filename", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/PWA", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_playwright_live_login", "label": "Gotcha: Playwright live login per test (no storageState cache)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Testing", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_playwright_baseurl_localhost", "label": "Gotcha: Playwright baseURL is localhost:5173", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Testing", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_realtime_waitfor_10s", "label": "Gotcha: Realtime waitFor timeout 10s", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Testing", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_kong_strip_path", "label": "Gotcha: Kong strip_path=true strips too much on full-table route", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Backend", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_kong_plugins_list", "label": "Gotcha: KONG_PLUGINS must list all used plugins", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Backend", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_insert_select_rls", "label": "Gotcha: .insert().select() evaluates SELECT RLS on returned row", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Backend", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_postgres_internal_roles", "label": "Gotcha: supabase/postgres fresh volume lacks internal roles", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Deploy", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_gotcha_docker_exec_drains_heredoc", "label": "Gotcha: docker compose exec -T drains heredoc stdin", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Gotchas/Deploy", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_platform_ios_safari", "label": "Critical Platform: iOS Safari / PWA", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Critical Platform", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_platform_nginx_websocket", "label": "nginx Realtime block requirements (proxy_read_timeout 3600s)", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Critical Platform", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_platform_keycloak_nginx_headers", "label": "Keycloak behind nginx needs X-Forwarded-Host/Port", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Critical Platform", "source_url": null, "captured_at": null, "author": null, "contributor": null}, {"id": "claudemd_platform_realtime_selfhosted", "label": "Supabase Realtime self-hosted limits", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "Critical Platform", "source_url": null, "captured_at": null, "author": null, "contributor": null}], "edges": [{"source": "claudemd_documentation_map", "target": "readme_development_plan", "relation": "cites", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Documentation Map", "weight": 1.0}, {"source": "claudemd_documentation_map", "target": "analisisfuncional_modulo_colectivo_miembros", "relation": "cites", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Documentation Map", "weight": 1.0}, {"source": "claudemd_documentation_map", "target": "design_monolith_editorial", "relation": "cites", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Documentation Map", "weight": 1.0}, {"source": "claudemd_auth_architecture_option_b", "target": "readme_decision_option_b_gotrue_proxy", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Auth Architecture", "weight": 1.0}, {"source": "claudemd_self_registration_enabled", "target": "readme_decision_selfregistration_keycloak", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Auth Architecture", "weight": 1.0}, {"source": "claudemd_invitations_link_only", "target": "readme_decision_invitations_link_only", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Auth Architecture", "weight": 1.0}, {"source": "claudemd_domain_model", "target": "analisisfuncional_concepto_colectivo", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Domain Model", "weight": 1.0}, {"source": "claudemd_roles_admin_member_guest", "target": "analisisfuncional_roles_colectivo", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Domain Model", "weight": 1.0}, {"source": "claudemd_sync_strategy", "target": "analisisfuncional_sync_realtime_ws", "relation": "implements", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Sync Strategy", "weight": 1.0}, {"source": "claudemd_offline_first", "target": "analisisfuncional_estrategia_offline_first", "relation": "implements", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Sync Strategy", "weight": 1.0}, {"source": "claudemd_gotcha_pwa_sw_filename", "target": "claudemd_gotcha_injectmanifest_hardcoded_filename", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Gotchas/PWA", "weight": 1.0}, {"source": "claudemd_gotcha_injectmanifest_hardcoded_filename", "target": "readme_stack_vite_pwa", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Gotchas/PWA", "weight": 1.0}, {"source": "claudemd_gotcha_colectivo_web_confidential", "target": "claudemd_auth_architecture_option_b", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Gotchas/Auth", "weight": 1.0}, {"source": "claudemd_gotcha_openid_scope", "target": "claudemd_auth_architecture_option_b", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Gotchas/Auth", "weight": 1.0}, {"source": "claudemd_gotcha_auth_users_preseeded", "target": "claudemd_auth_architecture_option_b", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Gotchas/Auth", "weight": 1.0}, {"source": "claudemd_gotcha_gotrue_empty_role_aud", "target": "claudemd_gotcha_auth_users_preseeded", "relation": "conceptually_related_to", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Gotchas/Auth", "weight": 1.0}, {"source": "claudemd_gotcha_kong_env_var_substitution", "target": "readme_stack_supabase_selfhosted", "relation": "references", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Gotchas/Auth", "weight": 1.0}, {"source": "claudemd_gotcha_realtime_waitfor_10s", "target": "readme_stack_realtime_websocket", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 0.9, "source_file": "CLAUDE.md", "source_location": "Gotchas/Testing", "weight": 1.0}, {"source": "claudemd_platform_nginx_websocket", "target": "readme_stack_realtime_websocket", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Critical Platform", "weight": 1.0}, {"source": "claudemd_etc_hosts_keycloak", "target": "claudemd_auth_architecture_option_b", "relation": "rationale_for", "confidence": "EXTRACTED", "confidence_score": 1.0, "source_file": "CLAUDE.md", "source_location": "Local Dev", "weight": 1.0}], "hyperedges": [{"id": "auth_flow_keycloak_gotrue_supabase", "label": "Keycloak -> GoTrue -> Supabase OIDC proxy flow (Option B)", "nodes": ["claudemd_auth_architecture_option_b", "claudemd_gotcha_colectivo_web_confidential", "claudemd_gotcha_openid_scope", "claudemd_gotcha_disable_signup_false", "claudemd_gotcha_auth_users_preseeded", "claudemd_gotcha_gotrue_empty_role_aud", "readme_decision_option_b_gotrue_proxy"], "relation": "participate_in", "confidence": "EXTRACTED", "confidence_score": 0.95, "source_file": "CLAUDE.md"}, {"id": "pwa_ios_install_surface", "label": "PWA iOS install surface (meta tags + icons + SW strategy)", "nodes": ["apphtml_ios_pwa_meta_tags", "iconsreadme_placeholders", "claudemd_gotcha_injectmanifest_hardcoded_filename", "claudemd_platform_ios_safari", "readme_stack_vite_pwa"], "relation": "implement", "confidence": "EXTRACTED", "confidence_score": 0.9, "source_file": "CLAUDE.md"}]}