Repository navigation
0.2.0
The headline change is a second view on the canvas. Toggle "Shared state" at the top and you get a bipartite graph where nodes are @Shared storage keys (.appStorage, .inMemory, .fileStorage) and edges connect them to every reducer whose State binds them. The parser normalizes each @Shared descriptor into a canonical (kind, key) pair and aggregates references across the codebase, exposed as a new sharedStorages array on the graph JSON. Click a storage and the drawer shows its kind, key, raw descriptor, and the list of referencing reducers — click any reference to jump back to the reducer graph centered on that feature. If the reducer's module is currently filtered out, the click auto-restores the filter so you don't land on an empty canvas.
The sidebar is mode-aware now. In reducer mode you get the existing edge-kind and module chips; in shared-state mode those swap for storage-kind chips, a key substring filter, and a "hide single-reference storages" toggle for when you only care about actual coupling. Module filter is shared across both modes.
Added a small collapsible "What's what" section at the bottom of the sidebar that explains edge colors, line styles, and state-chip meanings (green = embedded child state, red = @Presents modal / sheet). Content is mode-aware: reducer-kind swatches on the main graph, storage-kind swatches on the shared view.
Stripped the per-edge text labels from the reducer graph. Edge color already encodes the kind and the target node name shows the destination, so the extra "ifLet scanner" / "scope profile" strings were just visual noise at 30+ edges. Full statePath / actionPath is still visible in the drawer's Graph tab when a node is selected.
A few bugs from code review were fixed along the way: navigation from a shared-storage drawer to a reducer now preserves the selection instead of clearing it when the mode flips; the reducer drawer always receives reducer-composition edges even when opened from the shared view (previously it showed synthetic storage edges as "parents" in the Graph tab); and clicking a reference whose module is filtered out auto-restores the module before centering. Plus two visual cleanups — shared-storage borders now match their kind color instead of being random hashes that accidentally collided with the semantic red/green used for @Presents and child-state chips on reducer cards, and shared-view edges are uniformly solid because React Flow's smoothstep routing had a phase-dependent rendering quirk where some dashed segments would fall entirely inside a single dash cycle and look solid.
The graph JSON schema gains a sharedStorages: [] array alongside the existing nodes and edges. Old consumers that don't know about it keep working unchanged.
Install from source:
git clone https://github.com/tornikegomareli/tca-graph.git
cd tca-graph
(cd viewer && npm install && npm run build)
swift build -c release
./.build/release/tca-graph serve ~/path/to/TCAProject