Repository navigation
Add nitro agent task graph view - #10339
michaelstaib wants to merge 82 commits into
Conversation
Patch coverage94.8% of changed lines covered (3128/3300) +48 more changed files; see the JSON below for uncovered lines. Uncovered changed lines (JSON){
"sha": "a8e515eda05045e3c669f458e1fa3509f06ca716",
"files": [
{ "path": "src/Nitro/CommandLine/src/CommandLine/ThrowHelper.cs", "ranges": [[28, 28], [31, 31]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Input/TuiMessage.cs", "ranges": [[36, 36], [41, 41], [46, 46], [51, 51], [56, 56], [61, 61], [66, 66], [71, 71], [76, 76]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/CanvasCell.cs", "ranges": [[8, 8]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/GraphRenderFooter.cs", "ranges": [[16, 16]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/CellOwners.cs", "ranges": [[13, 13], [19, 19], [31, 31], [39, 39]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/TreeView/GraphTreeView.cs", "ranges": [[56, 57], [59, 65], [67, 72], [137, 139], [188, 189], [380, 380], [417, 419], [445, 446], [455, 456], [497, 515]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphFilterForm.cs", "ranges": [[19, 23]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/CanvasView/GraphCanvasText.cs", "ranges": [[14, 15], [41, 42], [52, 53]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/LayoutVertex.cs", "ranges": [[22, 22]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/GraphWaveRenderer.cs", "ranges": [[45, 46], [72, 74]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphMode.cs", "ranges": [[175, 177], [192, 193], [316, 316], [467, 470], [472, 476], [479, 481], [484, 485], [487, 487], [509, 510], [527, 528], [543, 544], [551, 552], [556, 557], [571, 571], [573, 573], [644, 645], [682, 682]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Shell/TuiShell.cs", "ranges": [[777, 779], [1218, 1219], [1428, 1430]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/CellBuffer.cs", "ranges": [[30, 31], [47, 48], [90, 91], [111, 112], [136, 137], [291, 292], [299, 300], [303, 303]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/CanvasView/GraphCanvasView.cs", "ranges": [[227, 229], [244, 246], [269, 270], [296, 297], [302, 303], [314, 315], [362, 362]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphDataLoader.cs", "ranges": [[45, 46]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Widgets/TaskBadge.cs", "ranges": [[176, 177]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/GraphEdgeRouter.cs", "ranges": [[97, 99], [295, 295], [654, 654], [656, 656], [707, 708]] },
{ "path": "src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/GraphLayout.cs", "ranges": [[33, 34], [38, 39], [195, 195]] }
]
}Project coverage: 58.1% (290643/500663 lines) |
🎬 Nitro CLI E2E snapshots changedThese flow recordings differ from Run 34450315530 · full set in the nitro-e2e-snapshots artifact. |
board, board-maximize, search, detail, mail-board, and agents each grew the new Graph tab in the shared tab strip. Re-record their goldens and GIFs to match; no other output changed.
run.sh publishes a linux-x64 nitro binary and mounts it into the pinned multi-arch VHS image, but let docker pick the host's native platform. On an arm64 host (Apple Silicon Docker Desktop) that resolves to an arm64 container, so the x64 binary can't exec and every flow FAILs at recording with no hint why. Pin the docker run to --platform linux/amd64 and document the emulation cost on arm64 hosts in the README.
board.column.status.closed moves from Grey70+Dim to Grey84 (no decoration), since the Graph canvas already dims terminal-status nodes itself and stacking a second Dim on top of Grey70 made the Closed column and closed graph nodes too dark to read on dark terminals. board.column.status.closed.focused moves from Grey+Bold to Grey93+Bold so focusing the Closed column brightens it like every other column instead of dimming it.
Extract the board's blocked/deferred/ready semantics into a pure TaskBoardStatus.Resolve helper reused by both BoardDataLoader and the new GraphDataLoader.BoardStatus stamp, so GraphCanvasNodeRenderer keys border and glyph color on the same computed status the Board uses (unmet dependencies, epics with open children, future DeferUntil) instead of the task's raw status field.
TaskBadge.Render truncated only the title, so a long id (or the fixed prefix/glyph/type/priority segments alone) could still produce a line wider than maxWidth, which Spectre then folded onto an extra row the board panel never budgeted for. Render now guarantees the plain-text width of the returned line never exceeds maxWidth, measuring and truncating in terminal cells (Segment.CellCount / Segment.Truncate) rather than chars: truncate the title, then drop it once its budget falls below 2 cells, then truncate the id (keeping its leading characters), then drop the priority and type code in turn if the row is still too narrow. ColumnPane.Render also sets Overflow.Ellipsis on each row's Markup as a safety net against a caller passing an already-overlong line.
DependencyTreeViewTests' width:10 breadcrumb-header oracle assumed TaskBadge silently overflowed its width budget; now that TaskBadge.Render actually respects maxWidth, the row shrinks to its own truncated width so headerBudget narrows by one more character (aaa... z -> aa... z). BoardModeTests.Render_Should_KeepEveryColumnFrameIntact_When_LongIdsAtNarrowWidth only checked frame height and overall line width, which a folded row could still satisfy by eating blank padding. Added a per-panel check that exactly one interior row is non-blank and that the task row ends in an ellipsis, which fails against the pre-fix code and passes at HEAD.
Bold box-drawing glyphs draw with the terminal's bold font face, whose corner/edge metrics can drift from the regular face, breaking a focused pane's frame in some terminals. Focus is now shown by box weight (BoxBorder.Heavy vs Rounded, via the shared PaneBorders rule) and a bold header title, never by bolding the border style itself, across every focus-switched pane in the shell: board columns, the mail Workspace list, and the task/mail/memory/agent detail panes and search results pane. DependencyTreeView has no sibling pane to lose focus to, so it keeps Rounded always. Removed Decoration.Bold from the six *.focused theme tokens that carried it and added a regression test asserting no *.focused border/status token ever does again.
board-maximize, search, mail-board, and agents show a focused pane whose border changed from rounded to heavy. Refresh their goldens and GIFs from the CI recording. board-flow.tape synced on the rounded top border of the focused Ready column, so it timed out; anchor it on the heavy border instead. The board golden follows once CI records it.
Last of the flows that drift from the heavy focused pane border; the tape sync fix in the previous commit let CI record it.
There was a problem hiding this comment.
🟡 Changes recommended
The new graph footer metrics renderer will print several placeholders literally due to missing string interpolation, and needs a small correctness fix before approval.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR adds a new Graph tab to Nitro’s agent TUI, including a graph data/model pipeline and canvas/tree rendering, while also standardizing the shell’s focus language (heavy vs rounded borders + bold header text) and tightening width/Unicode safety in TUI rendering.
Changes:
- Add a new Graph tab (Shift+G) with graph loading, reduction, layout, and rendering primitives.
- Standardize pane focus visuals via
PaneBordersand update multiple modes/views to use heavy/rounded borders + header bolding without bolding box glyphs. - Improve determinism and correctness around narrow widths/Unicode (task row truncation, footer width budgeting, and End-to-bottom navigation), with expanded tests and updated E2E golden recordings.
File summaries
| File | Description |
|---|---|
| src/Nitro/CommandLine/test/e2e/search-flow.golden.txt | Updates golden recording to include Graph tab and new border glyphs. |
| src/Nitro/CommandLine/test/e2e/run.sh | Forces amd64 platform for VHS container to match published linux-x64 binary. |
| src/Nitro/CommandLine/test/e2e/README.md | Documents amd64 container emulation implication on arm64 hosts. |
| src/Nitro/CommandLine/test/e2e/mail-board-flow.golden.txt | Updates golden recording for Graph tab and focus border language. |
| src/Nitro/CommandLine/test/e2e/detail-flow.golden.txt | Updates golden recording for Graph tab presence. |
| src/Nitro/CommandLine/test/e2e/board-maximize-flow.golden.txt | Updates golden recording for Graph tab and heavy/rounded frames. |
| src/Nitro/CommandLine/test/e2e/board-flow.tape | Sync point updated for focused heavy border glyphs. |
| src/Nitro/CommandLine/test/e2e/board-flow.golden.txt | Updates golden recording for Graph tab and heavy/rounded frames. |
| src/Nitro/CommandLine/test/e2e/agents-flow.golden.txt | Updates golden recording for Graph tab and focus border language. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Widgets/TaskBadgeTests.cs | Adds truncation/width-safety tests for TaskBadge.Render (cell-accurate). |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Widgets/ColumnPaneTests.cs | Expands tests around heavy/rounded borders and bold header behavior. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Tree/FakeTaskStore.cs | Implements GetTaskLabelsAsync for tree test store. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Tree/DependencyTreeViewTests.cs | Adds border behavior test for dependency tree view. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Theming/DefaultThemeTests.cs | Guards against bold decorations on focused border/status tokens. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Shell/TuiTabTests.cs | Adds coverage for resuming a suspended mode without re-entering it. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Shell/TuiShellTests.cs | Extends footer rendering tests (ordering, Unicode, toast replacement). |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Shell/TuiShellTabsTests.cs | Adds Graph tab switching + Graph detail stack/state behavior tests. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Shell/TabSwitchKeysTests.cs | Removes mnemonic collision tests (replaced by broader launcher coverage). |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Shell/FakeTuiMode.cs | Adds FooterStatus support for shell footer tests. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Shell/FakeTaskStore.cs | Adds dependency edges, query count, bulk label support for shell tests. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Search/SearchModeTests.cs | Tests focused/unfocused Results frame rendering (heavy vs rounded). |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Search/FakeTaskStore.cs | Implements GetTaskLabelsAsync for search test store. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Memory/MemoryModeTests.cs | Adds focused detail frame rendering test (heavy border). |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Memory/MemoryKeyMapTests.cs | Verifies End-to-bottom and Shift+G unbound in memory keymap. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Mail/MailModeTests.cs | Tightens focus rendering expectations for workspace mailbox pane. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Mail/MailKeyMapTests.cs | Verifies End-to-bottom and Shift+G unbound in mail keymap. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Mail/MailDetailViewTests.cs | Tests shared focus language (heavy vs rounded) for mail detail frame. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Input/KeyMapTests.cs | Updates global edge navigation: End for bottom, Shift+G unbound. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Graph/Render/CellBufferTests.cs | Adds tests for graph canvas cell buffer segmenting/ownership/priority. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Graph/GraphSearchProjectionContextTests.cs | Tests representative mapping stability/perf for graph search projection. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Graph/GraphParentMapTests.cs | Tests deterministic parent selection and cycle detachment. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Graph/GraphKeyMapTests.cs | Adds graph keymap uniqueness/collision tests and dispatch precedence. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Graph/GraphDataLoaderTests.cs | Tests graph loading semantics, archived visibility, and bulk label reads. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Graph/CanvasView/GraphCanvasTextTests.cs | Tests canvas text encoding/truncation for Unicode/non-cell-width runes. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Editing/FakeTaskStore.cs | Implements GetTaskLabelsAsync for editing test store. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Details/TaskDetailViewTests.cs | Tests shared focus language for task detail sidebar frame. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Details/FakeTaskStore.cs | Adds bulk GetTaskLabelsAsync implementation for details tests. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Board/TaskBoardStatusTests.cs | Pins TaskBoardStatus.Resolve behavior against board semantics. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Board/FakeTaskStore.cs | Adds bulk label API + dependency edges stub for board tests. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Board/BoardModeTests.cs | Adds focused/unfocused border/header assertions and narrow-width regression test. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Agents/FakeTaskStore.cs | Implements GetTaskLabelsAsync for agents test store. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Tui/Agents/AgentsModeTests.cs | Tests heavy detail frame rendering when the detail pane is focused. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Commands/Agent/Tasks/TaskStoreTests.cs | Adds coverage for label grouping/ordering in new bulk label query. |
| src/Nitro/CommandLine/test/CommandLine.Tests/Commands/Agent/AgentTuiLauncherTests.cs | Updates tab order test to include Graph and adds key-chord collision guard. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Widgets/TaskBadge.cs | Reworks truncation to be cell-width aware and guarantees max-width compliance. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Widgets/PaneBorders.cs | Introduces shared focus language (heavy/rounded border + bold header text). |
| src/Nitro/CommandLine/src/CommandLine/Tui/Widgets/ColumnPane.cs | Applies PaneBorders and forces ellipsis overflow to prevent row wrapping. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Tree/DependencyTreeView.cs | Uses PaneBorders-compatible border selection for tree mode. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Theming/DefaultTheme.cs | Removes bold decoration from focused border/status tokens; adjusts closed colors. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Shell/TuiTab.cs | Adds ResumeSuspendedMode to pop without re-entering. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Shell/TuiShell.cs | Adds Graph integration, per-tab detail mode stack, and Unicode/cell-width footer formatting + inline status support. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Shell/TabSwitchKeys.cs | Updates documentation for new Shift+G mnemonic. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Shell/ITuiMode.cs | Adds FooterStatus contract for mode-owned inline footer status text. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Search/SearchMode.cs | Uses PaneBorders focus language for Results/Detail frames. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Memory/MemoryKeyMap.cs | Moves bottom-edge binding from Shift+G to End. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Memory/MemoryDetailView.cs | Uses PaneBorders focus language for memory detail frame. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Mail/MailMode.cs | Applies shared focus language to mailbox list frame while keeping accent selection. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Mail/MailKeyMap.cs | Moves bottom-edge binding from Shift+G to End. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Mail/MailDetailView.cs | Uses PaneBorders focus language for mail detail frame. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Input/TuiMessage.cs | Adds graph-related TUI messages (projection toggles, filters, epic collapse/expand). |
| src/Nitro/CommandLine/src/CommandLine/Tui/Input/KeyMap.cs | Moves global bottom-edge binding from Shift+G to End; updates docs. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/TreeView/GraphTreeRow.cs | Defines rows for graph tree projection (connectors + relationship summaries). |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/TreeView/GraphHierarchyNode.cs | Defines hierarchy node structure for tree projection. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/TreeView/GraphHierarchy.cs | Builds parent/child hierarchy deterministically from graph model. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/GraphWaveRenderer.cs | Renders wave headers/separators for graph layout layers. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/GraphRenderResult.cs | Captures rendered canvas + route geometry for metrics and interactions. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/GraphRenderFooter.cs | Adds graph canvas metrics footer line (currently has interpolation bug). |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/GraphEdgeStyles.cs | Centralizes edge styling and selection styling. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/GraphEdgeRoute.cs | Models routed edge span points for hit-testing/selection. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/GraphEdgeRenderOptions.cs | Defines edge rendering configuration (styles + filter toggles). |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/CellOwners.cs | Provides allocation-light ownership tracking for buffer cells. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/CellBuffer.cs | Implements a styled 2D cell buffer with ownership + priority rules and segment rendering. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/CanvasViewport.cs | Defines rectangular viewport for cell-buffer rendering. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/CanvasDirections.cs | Defines line-stroke direction flags for cell connectivity. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Render/CanvasCell.cs | Defines the rendered glyph/style/owners at one canvas coordinate. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/OrderedCoordinateAssigner.cs | Assigns node coordinates while preserving layer order. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/LongestPathLayering.cs | Assigns layers using longest-path approach with stability hints. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/LayoutVertex.cs | Defines layout vertices (real nodes + dummies) for ordering/minimization. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/LayoutSegment.cs | Defines adjacent-layer segments used by crossing minimization. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/LayoutArc.cs | Defines directed arcs through the layout pipeline (supports reversal). |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/IGraphLayeringStrategy.cs | Interface for layer assignment strategies. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/IGraphCoordinateAssigner.cs | Interface for cell coordinate assignment strategies. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/GraphNodeSize.cs | Models node size normalization prior to placement. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/GraphLayoutResult.cs | Captures one full layout frame (nodes + edge spans + metrics). |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/GraphLayoutPoint.cs | Represents integer layout coordinates. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/GraphLayoutNode.cs | Captures placed node geometry and ordering. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/GraphLayoutMetrics.cs | Captures crossing-minimization metrics/observations for verification. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/GraphLayoutEdgeSpan.cs | Models adjacent-layer edge spans after layering. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/GraphLayoutCandidateObservation.cs | Records before/after candidate changes for testing/diagnostics. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/Layout/GraphCycleGuard.cs | Makes graph acyclic for layout by deterministically reversing DFS back edges. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphSearchProjectionContext.cs | Maps visible matches to reduced/canvas representatives deterministically. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphReductionOptions.cs | Defines hide/label/epic/collapse options and caps for graph reduction. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphReducer.cs | Implements filtering, epic collapsing, node caps, and reversed-edge marking. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphParentMap.cs | Builds canonical parent map with deterministic cycle detachment. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphNode.cs | Defines graph node representation with board-status coloring semantics. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphModel.cs | Defines the deterministic graph model shape. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphKeyMap.cs | Adds graph-specific key bindings layered ahead of global bindings. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphFilterForm.cs | Adds label/epic filter form UI for the graph tab. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphEdgeKind.cs | Defines graph edge kinds (Blocks vs ParentChild). |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphEdge.cs | Defines directed edge model with reversal flag. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/GraphDataLoader.cs | Loads tasks/dependencies/labels/blocked map into a graph model. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/CanvasView/GraphCanvasText.cs | Encodes/truncates text to single-cell characters for canvas rendering. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Graph/CanvasView/GraphCanvasNodeRenderer.cs | Measures/renders nodes in boxed/compact styles into the cell buffer. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Details/TaskDetailView.cs | Applies PaneBorders focus language to task detail sidebar/body frames. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Board/TaskBoardStatus.cs | Extracts board column resolution logic into a shared helper. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Board/ColumnDefinition.cs | Updates docs to reflect focus language and style responsibilities. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Board/BoardMode.cs | Relies on border style reassignment to recolor header; avoids bold borders. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Board/BoardDataLoader.cs | Uses TaskBoardStatus.Resolve and avoids redundant blocked fetch for Deferred. |
| src/Nitro/CommandLine/src/CommandLine/Tui/Agents/AgentDetailView.cs | Applies PaneBorders focus language to agent detail frame. |
| src/Nitro/CommandLine/src/CommandLine/ThrowHelper.cs | Adds ThrowHelper helpers for graph layout spacing argument validation. |
| src/Nitro/CommandLine/src/CommandLine/Services/Tasks/TaskStore.cs | Adds bulk GetTaskLabelsAsync query returning grouped labels per task. |
| src/Nitro/CommandLine/src/CommandLine/Services/Tasks/TaskLabels.cs | Adds DTO for grouped labels per task id. |
| src/Nitro/CommandLine/src/CommandLine/Services/Tasks/ITaskStore.cs | Adds GetTaskLabelsAsync API to support bulk label reads. |
| src/Nitro/CommandLine/src/CommandLine/Commands/Agent/AgentTuiLauncher.cs | Adds Graph tab to the unified agent TUI launcher and updates docs. |
Review details
- Files reviewed: 126/132 changed files
- Comments generated: 3
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| var lines = TrimTrailingNewline(console.Output.Split('\n')); | ||
| Assert.Equal(height, lines.Length); | ||
| Assert.Contains('╰', lines[^1]); | ||
| Assert.All(lines, line => Assert.True( | ||
| line.Length <= width, $"Expected row width <= {width} but was {line.Length}: '{line}'")); |
| // assert: a heavier box, not bold text, is what marks focus - see | ||
| // https://github.com/ (hc-11-04h): bold box-drawing glyphs render | ||
| // misaligned in some terminals. |












No description provided.