@descryy/viz
v0.5.6
Published
A query-driven graph visualizer over the existing query layer: search a symbol, render its bounded neighbourhood, inspect the evidence behind a node or an edge. Never the whole graph at once.
Readme
@descry/viz
A local, query-driven graph visualizer over an already-built graph. Search a symbol, see its bounded neighbourhood — never the whole graph at once.
descry viz [--port <number>] [repository-path]Run descry analyze first — this reads an existing graph, it does not build one.
What it does
Search returns a bounded neighbourhood, fitted to the canvas — this is the landing state, one hop, legible at a glance.
- Search by node / file / function; click a result to load its neighbourhood.
- Depth (1–4 hops), direction (upstream / downstream / both), and node-type / edge-type filter chips.
- Click a node for its file, line range, language, resolution, reliability class,
producedBy, andattrs. - Click an edge for its resolution, confidence,
producedBy, and a "why is this connected?" panel over the edge's ownattrs— the real evidence, or an honest statement that this edge carries none beyond its core provenance. - Upstream / downstream highlighting from any selected node, computed over the loaded view.
API_ENDPOINTnodes get a visual ring — the cross-languageUSES_API→API_ENDPOINT←SERVES_APIjoin is the hardest shape to verify by reading code, and the one most worth seeing.- Export the current scoped view as JSON.
The depth control doing real work — a wider neighbourhood scales to fit rather than running off the canvas.
"Why is this connected?" — no explicit reason field on this edge, so it says that, and shows the full attrs instead. This is the disclosure guarantee, made visible.
What it does not do
- No repository filter. No per-node
repositoryfield exists in the graph schema today — a node's id hashes the repository but never hands it back. The filter is visibly present and disabled, with that reason stated, rather than omitted or faked. - No force-directed layout, by choice. Nodes lay out in deterministic depth-ordered columns from the search seed. "A legible path, not a cloud" was the actual design constraint; a physics simulation fights it at any real fan-out.
- No saved or bookmarked views beyond the one-shot JSON export.
- Every edge renders dashed. Resolution 4 (
observed) is reserved for the runtime layer, which does not exist yet — nothing in a static-analysis graph can beresolution === 4, so the solid "observed" edge style is real but currently unreachable. It stays unreachable, honestly, untildescry-runtimeexists to produce it.
Reading the graph
Everything here goes through the existing query layer (openStore, createStoreProvider, findNodes, bfs) — no new SQL, no new store access path, no new IR vocabulary.
