The code graph produced disconnected "islands" because:
1. No Contains edges were created between File/Module nodes and their
children (functions, classes, structs), leaving file nodes isolated
2. Cross-file call resolution was too strict — calls like
`crate::config::load` failed to resolve to `src/config.rs::load`
Fix:
- After resolving explicit parser edges, synthesise Contains edges by
walking each node's qualified-name hierarchy and linking to the
closest ancestor that exists in the node map
- Improve edge resolution with module-path matching: strip Rust
prefixes (crate::, super::, self::) and try progressively shorter
suffix matches for cross-file calls
Adds 4 new tests covering Contains edge synthesis, dedup with existing
edges, cross-file module path resolution, and parent qname lookup.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds code inspector, file tree components, graph visualization JS,
graph API handlers, sidebar navigation updates, and misc improvements.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add DAST scanning and code knowledge graph features across the stack:
- compliance-dast and compliance-graph workspace crates
- Agent API handlers and routes for DAST targets/scans and graph builds
- Core models and traits for DAST and graph domains
- Dashboard pages for DAST targets/findings/overview and graph explorer/impact
- Toast notification system with auto-dismiss for async action feedback
- Button click animations and disabled states for better UX
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>