Skip to content

Sphere Navigator

A four-level overlay that lets you walk the needle dependency graph from the TUI without leaving it. Press g to open, g again to close. Sphere = a connected component of needles. Source: src/fcp_screen/components/sphere_nav.rs.

GALAXY
Top view. Every connected sphere in the project as a row, plus a trailing "isolated" entry if any needles stand alone. Cursor moves with j/k or arrow keys; Enter descends into the selected sphere.
sphere_nav.rs:32–36, 234 (default level), 506
SPHERE_DETAIL
All needles in one sphere. Shows the connected graph: each needle's edges, priority, status. Enter on a needle descends to NeedleDetail.
sphere_nav.rs:36, 252–303, 506
ISOLATED_LIST
Needles with no connections — one per row. Same navigation as SphereDetail. Reached from Galaxy by descending into the isolated entry when there is one.
sphere_nav.rs:38, 507
NEEDLE_DETAIL
Full metadata for a single needle: title, description, AC, priority, status, dependencies, blocks, tags. No cursor navigation in this view — it is a leaf. Escape back to the level you came from.
sphere_nav.rs:40, 307–382, 508
g Open / close the sphere navigator overlay
Option+G (©) Also opens the overlay (alias for g)
k / ↑ Move cursor up
j / ↓ Move cursor down (unless a joint is pending)
Enter Descend into the selected item (sphere → detail → needle)
j (with cursor on needle) Start or complete a joint — connects two needles as a new dependency edge
/ (slash) Enter search mode — type to filter, Enter to confirm, Esc to cancel
Backspace (search) Delete one character from the search input
Tab (search) Move to next match
Esc Cancel search or close overlay

Source: src/fcp_screen/action.rs:214 (g), :229 (Option+G), :243–260 (mode routing). Key handlers live in src/fcp_screen/app.rs:1086–1160.

What the "j" Key Actually Does

In SphereDetail and IsolatedList views, the j key is overloaded: without a pending joint it moves the cursor down (the usual vim binding); with a cursor on a needle it starts a "joint" — the first half of a dependency edge.

Press j on needle A. The navigator stores A as pending_joint and the cursor can move freely to needle B (note: j as "move down" is disabled while a joint is pending, per app.rs:1132). Press j on B to complete the joint — the navigator writes a new dependency edge from A to B into the needle store.

Source: sphere_nav.rs:57 (pending_joint field), app.rs:1133–1160 (joint handling). This is the one mutation path in the navigator — every other key is read-only.