Skip to content

The dependency-graph view, where a client beats a terminal - #39

Merged
Reim-developer merged 1 commit into
masterfrom
dev
Oct 10, 2026
Merged

Reim-developer merged 1 commit into
masterfrom
dev

Conversation

@Reim-developer

Copy link
Copy Markdown
Owner

What this is

The third and last view: the dependency graph. This is the one where a graphical client genuinely earns its keep.

The CLI can print a blast radius and stop. It cannot let a reader click a dependent and ask the same question about that file -- which is how a radius is actually explored. Every row here is a button that makes the row the new target, and a walk accumulates backwards through the ones already taken, with a Back button that follows it.

The count shown is the list's length, not the node's

A target's imported_by_count is the in-degree over the whole tree, which includes paths the reverse traversal never reaches. Showing it would claim a radius larger than the report's, so the header states the list length instead. The difference is not papered over -- it is the reason the header says what it says.

Unresolved-local is coloured because it qualifies the answer

unresolved_local_edges is the number of local-looking paths the resolver could not place. A non-zero value means the radius understates, and a reader scanning six figures should not have to remember which one was the caveat -- so it is coloured in the summary rather than explained in a footnote.

The types matched the Rust, which needed checking

The TypeScript interfaces were written in round 1 from a guess at the shape. Every field was wrong in some way:

  • nodes had an is_test that does not exist
  • language was non-nullable, and is Option<&str> in Rust
  • GraphEdge was missing cfg_gated entirely

They now mirror sephera_graph::types exactly, and the local_gap comment carries the reason it is a separate field from !resolved -- which is the distinction the corpus exists to catch. This is the risk of a hand-written boundary with no generator, and the contract tests in crates/sephera_gui are what make a rename fail loudly instead of silently.

A dead placeholder removed

NotBuilt and labelFor existed only to render the tab that was not built yet. With the third view landing they are gone, along with the Separator.Root that was rendering display: none -- an element whose only purpose was to justify an import.

One .gitignore entry removed rather than kept

The gui/nul line is gone, for the reason in the commit message: an entry for a file that cannot be deleted belongs in .gitignore; an entry for a file git cannot see does not.

$ git add gui/nul
fatal: pathspec 'gui/nul' did not match any files

nul is a reserved DOS device name, so git resolves the path to the device rather than to a file. The entry was ignoring nothing, and the comment explaining it was mojibake from a PowerShell here-string.

The artefact is still on disk -- os.remove, cmd /c del and the \\?\ prefix all refuse it -- but it is invisible to git, so it is harmless. What replaces the entry is not creating it: the SCSS compile check now writes to a real path in the temp directory.

Verified

11 gates, 798 tests, clippy clean, tsc --noEmit clean, the production bundle at 284 kB JS and 8.1 kB CSS, and all five SCSS partials compiling through a real temp path.

The third and last view. The CLI can print a blast radius and stop; it cannot let
a reader click a dependent and ask the same question about *that* file, which is
how a radius is actually explored. Every row here is a button that makes the row
the new target, and a walk accumulates backwards through the ones already taken.

## The count shown is the list's length, not the node's

A target's `imported_by_count` is the in-degree over the whole tree, which
includes paths the reverse traversal never reaches. Showing it would claim a
radius larger than the report's, so the header states the list length instead and
the difference is not papered over.

## Unresolved-local is coloured because it qualifies the answer

`unresolved_local_edges` is the number of local-looking paths the resolver could
not place. A non-zero value means the radius understates, and a reader scanning
six figures should not have to remember which one was the caveat -- so it is
coloured in the summary rather than explained in a footnote.

## The types matched the Rust, which needed checking

The TypeScript interfaces were written before this view in round 1, from a guess
at the shape. Every field was wrong in some way: `nodes` had an `is_test` that
does not exist, `language` was non-nullable, and `GraphEdge` was missing
`cfg_gated`. The interfaces now mirror `sephera_graph::types` exactly, and the
`local_gap` comment carries the reason it is a separate field from `!resolved` --
which is the distinction the corpus exists to catch.

## A dead placeholder removed

`NotBuilt` and `labelFor` existed only to render the tab that was not built yet.
With the third view landing they are gone, along with the `Separator.Root` that
was rendering `display: none` -- an element whose only purpose was to justify an
import.

## One `.gitignore` entry removed rather than kept

The `gui/nul` line is gone. An entry for a file that cannot be deleted belongs in
`.gitignore`; an entry for a file git cannot see does not. `git add gui/nul` fails
with `pathspec did not match any files`, because `nul` is a reserved DOS device
name and git resolves the path to the device rather than to a file. The entry was
ignoring nothing, and the comment explaining it was mojibake from a PowerShell
here-string.

The artefact itself is still on disk -- `os.remove`, `cmd /c del` and the `\\?\`
prefix all refuse it -- but it is also invisible to git, so it is harmless. What
replaces the ignore entry is not creating it: the SCSS compile check now writes to
a real path in the temp directory instead of `nul`.

## Verified

11 gates, 798 tests, clippy clean, `tsc --noEmit` clean, the production bundle
building at 284 kB JS and 8.1 kB CSS, and all five SCSS partials compiling.
@vercel

vercel Bot commented Oct 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
sephera Ready Ready Preview Oct 10, 2026 7:13am UTC

@coderabbitai

coderabbitai Bot commented Oct 10, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 33 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 1b69350f-c729-4eb6-9165-c243e475bfc1

📥 Commits

Reviewing files that changed from the base of the PR and between a6acb20 and 46c18b8.


📒 Files selected for processing (5)
  • .gitignore
  • gui/src/App.tsx
  • gui/src/lib/ipc.ts
  • gui/src/styles/views.module.scss
  • gui/src/views/DependenciesView.tsx

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

Coverage and benchmarks

Line coverage: 91.77% (15,687/17,093 lines)

Benchmarks (5 measured runs per command)

dataset files mean median min max
small 65 0.002s 0.002s 0.002s 0.002s
medium 282 0.004s 0.004s 0.004s 0.004s
large 898 0.011s 0.012s 0.011s 0.012s

Benchmark numbers come from a shared runner and compare within a run, not across runs.

@Reim-developer
Reim-developer merged commit df8220e into master Oct 10, 2026
31 checks passed

This branch was successfully deployed

1 active deployment
Preview — 46c18b8b Deployed Oct 10, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant