Skip to content

refactor(pipeline-server): redesign pipeline detail UI#562

Merged
luxass merged 20 commits intomainfrom
codex/pipeline-ui-improvements
Mar 24, 2026
Merged

refactor(pipeline-server): redesign pipeline detail UI#562
luxass merged 20 commits intomainfrom
codex/pipeline-ui-improvements

Conversation

@luxass
Copy link
Member

@luxass luxass commented Mar 21, 2026

Summary

  • Redesign the pipeline detail experience with a clearer overview grid and stronger visual hierarchy
  • Simplify header, tabs, execution surfaces, and overview sections to reduce duplicated chrome and nested panel patterns
  • Fold route-focused overview content into structure-oriented components and tighten wording around cacheable behavior

Testing

  • Not run (not requested)

Summary by CodeRabbit

  • New Features

    • Added structured inspection tabs for pipeline routes, transforms, and outputs with dedicated detail pages.
    • Added definition graph visualization for pipeline structure.
    • Added per-source execution activity charts and status overview.
  • Improvements

    • Refactored execution table with responsive design (mobile cards, desktop table).
    • Enhanced source switcher with filterable popover UI.
    • Unified status badge styling across the application.
  • Changes

    • Restructured pipeline inspection navigation and layout.
    • Moved version selection to centralized localStorage management.
    • Updated execution details presentation with activity metrics.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 21, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 88757c80-66d3-4df1-b6aa-d758d1b51868

📥 Commits

Reviewing files that changed from the base of the PR and between 75f222c and ca9cd49.

📒 Files selected for processing (96)
  • packages/pipelines/pipeline-server/src/client/components/app/pipeline-sidebar.tsx
  • packages/pipelines/pipeline-server/src/client/components/app/source-file-list.tsx
  • packages/pipelines/pipeline-server/src/client/components/app/source-switcher.tsx
  • packages/pipelines/pipeline-server/src/client/components/execution/execution-table.tsx
  • packages/pipelines/pipeline-server/src/client/components/execution/status-badge.tsx
  • packages/pipelines/pipeline-server/src/client/components/graph/graph-utils.ts
  • packages/pipelines/pipeline-server/src/client/components/graph/nodes.tsx
  • packages/pipelines/pipeline-server/src/client/components/graph/pipeline-graph.tsx
  • packages/pipelines/pipeline-server/src/client/components/home/sources-panel.tsx
  • packages/pipelines/pipeline-server/src/client/components/inspect/definition-graph.tsx
  • packages/pipelines/pipeline-server/src/client/components/inspect/definition-node.tsx
  • packages/pipelines/pipeline-server/src/client/components/inspect/inspect-sidebar.tsx
  • packages/pipelines/pipeline-server/src/client/components/inspect/list/sidebar-outputs-list.tsx
  • packages/pipelines/pipeline-server/src/client/components/inspect/list/sidebar-routes-list.tsx
  • packages/pipelines/pipeline-server/src/client/components/inspect/list/sidebar-shared.tsx
  • packages/pipelines/pipeline-server/src/client/components/inspect/list/sidebar-transforms-list.tsx
  • packages/pipelines/pipeline-server/src/client/components/inspect/route-dependencies-section.tsx
  • packages/pipelines/pipeline-server/src/client/components/inspect/route-flow-section.tsx
  • packages/pipelines/pipeline-server/src/client/components/inspect/route-outputs-section.tsx
  • packages/pipelines/pipeline-server/src/client/components/inspect/route-transforms-section.tsx
  • packages/pipelines/pipeline-server/src/client/components/overview/activity-chart.tsx
  • packages/pipelines/pipeline-server/src/client/components/overview/shared.ts
  • packages/pipelines/pipeline-server/src/client/components/overview/status-overview-panel.tsx
  • packages/pipelines/pipeline-server/src/client/components/pipeline/latest-execution.tsx
  • packages/pipelines/pipeline-server/src/client/components/pipeline/pipeline-header.tsx
  • packages/pipelines/pipeline-server/src/client/components/pipeline/pipeline-structure.tsx
  • packages/pipelines/pipeline-server/src/client/components/pipeline/pipeline-summary.tsx
  • packages/pipelines/pipeline-server/src/client/components/pipeline/pipeline-tabs.tsx
  • packages/pipelines/pipeline-server/src/client/components/pipeline/quick-actions-card.tsx
  • packages/pipelines/pipeline-server/src/client/components/pipeline/route-structure-metrics.tsx
  • packages/pipelines/pipeline-server/src/client/components/pipeline/version-selector.tsx
  • packages/pipelines/pipeline-server/src/client/components/source/pipeline-file-card.tsx
  • packages/pipelines/pipeline-server/src/client/components/source/pipeline-file-row.tsx
  • packages/pipelines/pipeline-server/src/client/components/source/source-file-card.tsx
  • packages/pipelines/pipeline-server/src/client/components/source/source-issues-dialog.tsx
  • packages/pipelines/pipeline-server/src/client/hooks/use-inspect-data.ts
  • packages/pipelines/pipeline-server/src/client/hooks/use-pipeline-versions.ts
  • packages/pipelines/pipeline-server/src/client/lib/graph-layout.ts
  • packages/pipelines/pipeline-server/src/client/lib/graph-utils.ts
  • packages/pipelines/pipeline-server/src/client/lib/last-active-source.ts
  • packages/pipelines/pipeline-server/src/client/queries/overview.ts
  • packages/pipelines/pipeline-server/src/client/queries/source-overview.ts
  • packages/pipelines/pipeline-server/src/client/routeTree.gen.ts
  • packages/pipelines/pipeline-server/src/client/routes/index.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/executions/$executionId/graph.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/executions/$executionId/index.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/executions/index.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/graphs.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/index.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/index.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/outputs/$outputKey.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/outputs/index.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/route.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/routes/$routeId.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/routes/index.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/transforms/$transformName.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/transforms/index.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/route.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/index.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/index.tsx
  • packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/route.tsx
  • packages/pipelines/pipeline-server/src/server/app.ts
  • packages/pipelines/pipeline-server/src/server/routes/index.ts
  • packages/pipelines/pipeline-server/src/server/routes/sources.overview.ts
  • packages/pipelines/pipeline-server/test/browser/components/app/pipeline-sidebar-source-file-list.test.tsx
  • packages/pipelines/pipeline-server/test/browser/components/app/pipeline-sidebar.test.tsx
  • packages/pipelines/pipeline-server/test/browser/components/app/source-switcher.test.tsx
  • packages/pipelines/pipeline-server/test/browser/components/execution/execution-table.test.tsx
  • packages/pipelines/pipeline-server/test/browser/components/home/activity-chart.test.tsx
  • packages/pipelines/pipeline-server/test/browser/components/home/sources-panel.test.tsx
  • packages/pipelines/pipeline-server/test/browser/components/home/status-overview-panel.test.tsx
  • packages/pipelines/pipeline-server/test/browser/components/pipeline/pipeline-header.test.tsx
  • packages/pipelines/pipeline-server/test/browser/components/pipeline/quick-actions-card.test.tsx
  • packages/pipelines/pipeline-server/test/browser/components/pipeline/version-selector.test.tsx
  • packages/pipelines/pipeline-server/test/browser/components/source/source-file-card.test.tsx
  • packages/pipelines/pipeline-server/test/browser/hooks/use-pipeline-versions.test.tsx
  • packages/pipelines/pipeline-server/test/browser/route-test-utils.tsx
  • packages/pipelines/pipeline-server/test/browser/router-test-utils.tsx
  • packages/pipelines/pipeline-server/test/browser/routes/index.test.tsx
  • packages/pipelines/pipeline-server/test/browser/routes/pipeline-command-palette.test.tsx
  • packages/pipelines/pipeline-server/test/browser/routes/root-error.test.tsx
  • packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId.executions.$executionId.graph.test.tsx
  • packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId.executions.$executionId.index.test.tsx
  • packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId.executions.index.test.tsx
  • packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId.index.test.tsx
  • packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId.inspect.index.test.tsx
  • packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId.inspect.outputs.test.tsx
  • packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId.inspect.transforms.test.tsx
  • packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.index.test.tsx
  • packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.index.test.tsx
  • packages/pipelines/pipeline-server/test/server/graph-definition-utils.test.ts
  • packages/pipelines/pipeline-server/test/server/graph-layout.test.ts
  • packages/pipelines/pipeline-server/test/server/overview.test.ts
  • packages/pipelines/pipeline-server/vitest.config.ts
  • packages/shared-ui/src/ui/sidebar.tsx

📝 Walkthrough

Walkthrough

This PR restructures the pipeline-server frontend's navigation and inspection system, moving from query-parameter-based routing to nested file-based routes, refactoring sidebar UI to conditionally show pipeline navigation or source files, extracting graph utilities to shared modules, and replacing a centralized inspect data hook with prop-driven components. Server-side overview endpoint moved from global to per-source scope. Multiple components removed or redesigned; new route detail pages and layout components added. Extensive test updates.

Changes

Cohort / File(s) Summary
Pipeline Sidebar & Source Navigation
pipeline-sidebar.tsx, source-file-list.tsx, source-switcher.tsx
Sidebar now conditionally renders pipeline navigation section (with back link, overview/inspect/executions nav, execute button) when all route params present, or source file list otherwise. Source switcher replaced dropdown with custom popover UI, added client-side filtering, removed "All Sources" option. File list refactored tree node rendering, replaced Route icon with Workflow.
Inspect Route Restructuring
inspect/definition-graph.tsx, inspect/definition-node.tsx, inspect/inspect-sidebar.tsx, inspect/list/sidebar-*.tsx, inspect/route-*.tsx
Replaced single query-param-based inspect page with nested route structure. Added new DefinitionGraph component and definition-based node renderers. Created InspectSidebar with tabbed route/transform/output lists. Refactored route detail sections (dependencies, outputs, transforms) from centralized useInspectData to prop-driven components. Removed RouteFlowSection.
Execution & Status Components
execution/execution-table.tsx, execution/status-badge.tsx, pipeline/pipeline-header.tsx, pipeline/latest-execution.tsx
Execution table refactored to responsive mobile/desktop layout with new ExecutionTableActions helper. Status badges standardized styling via STATUS_BADGE_STYLES map. Pipeline header removed execute/version controls, changed to breadcrumb-based with source link. Added LatestExecution component showing execution details and graph link.
Pipeline Overview & Structure
pipeline/pipeline-structure.tsx, pipeline/pipeline-summary.tsx, pipeline/route-structure-metrics.tsx, pipeline/quick-actions-card.tsx, pipeline/pipeline-tabs.tsx, pipeline/version-selector.tsx
Added PipelineStructure and PipelineSummary components. Added RouteStructureMetrics for metric display. Removed QuickActionsCard and PipelineTabs. VersionSelector refactored from external state management to storageKey-based localStorage persistence with custom events for cross-tab sync.
Source & File Components
source/pipeline-file-card.tsx, source/pipeline-file-row.tsx, source/source-file-card.tsx, source/source-issues-dialog.tsx
Added PipelineFileCard and PipelineFileRow components for pipeline display. Removed SourceFileCard. Updated SourceIssuesDialog to use only SourceResponse errors (removed SourceSummary errors union).
Graph Utilities Migration
lib/graph-layout.ts, lib/graph-utils.ts, components/graph/graph-utils.ts, components/graph/nodes.tsx, components/graph/pipeline-graph.tsx
Moved graph utilities from local components to shared lib: created new applyLayeredLayout and graph-utils modules. Updated graph components to import from #lib instead of local files. Removed local graph-utils.ts. Updated node renderers to use FlowNode instead of PipelineFlowNode.
Home & Overview
routes/index.tsx, components/home/sources-panel.tsx, queries/overview.ts, queries/source-overview.ts, components/overview/activity-chart.tsx, components/overview/status-overview-panel.tsx, components/overview/shared.ts
Removed SourcesPanel component and global overview query. Replaced home page with redirect logic using getLastActiveSource or first source. Added sourceOverviewQueryOptions for per-source overview data. Moved overview types to #shared/schemas/overview. Added compact flags to activity/status components.
Route Pages Restructuring
routes/s.$sourceId/$sourceFileId/$pipelineId/inspect.tsx, routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/ (multiple new files), routes/s.$sourceId/$sourceFileId/$pipelineId/graphs.tsx, routes/s.$sourceId/$sourceFileId/$pipelineId/index.tsx, routes/s.$sourceId/$sourceFileId/index.tsx
Deleted old inspect and graphs routes. Added nested inspect route structure with separate detail pages for routes, transforms, outputs. Modified pipeline overview page to use new LatestExecution, PipelineSummary, PipelineStructure. Removed source file route, redirect to source page instead. Updated root route to use beforeLoad redirect logic.
Execution Routes & Graph Routes
routes/s.$sourceId/$sourceFileId/$pipelineId/executions/index.tsx, routes/s.$sourceId/$sourceFileId/$pipelineId/executions/$executionId/index.tsx, routes/s.$sourceId/$sourceFileId/$pipelineId/executions/$executionId/graph.tsx
Added header UI, navigation buttons (Logs, Executions) to execution graph page. Refactored execution detail page header to show shortened execution ID with status badge. Updated executions list page to show pipeline name alongside execution count. Adjusted execution data fetching limits.
Hooks & Utilities
hooks/use-inspect-data.ts, hooks/use-pipeline-versions.ts, lib/last-active-source.ts
Removed useInspectData hook entirely (replaced by prop-driven route components). Refactored usePipelineVersions from pipelineId/override state to storageKey-based localStorage with useSyncExternalStore for cross-tab sync. Added getLastActiveSource/setLastActiveSource utilities.
Server Routes
server/app.ts, server/routes/index.ts, server/routes/sources.overview.ts
Replaced overviewRouter endpoint at /api/overview with sourcesOverviewRouter at /api/sources/:sourceId/overview. Updated queries to filter executions by sourceId.
Test Infrastructure & Utils
test/browser/route-test-utils.tsx, test/browser/router-test-utils.tsx, vitest.config.ts
Updated renderFileRoute signature to accept React element + options object instead of path string. Added initialLocation parameter. Removed renderWithQuickActionsRouter. Added Vite plugin config for TanStack Router to vitest.config.ts.
Test Files - Removed
test/browser/components/home/sources-panel.test.tsx, test/browser/components/pipeline/quick-actions-card.test.tsx, test/browser/components/source/source-file-card.test.tsx, test/browser/routes/index.test.tsx, test/browser/routes/s.$sourceId.$sourceFileId.index.test.tsx, test/server/overview.test.ts, test/browser/router-test-utils.tsx
Removed test suites for deleted components and routes (SourcesPanel, QuickActionsCard, SourceFileCard, home index, file detail route, server overview endpoint).
Test Files - Updated
test/browser/components/ (multiple), test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId/ (multiple), test/browser/routes/s.$sourceId/index.test.tsx
Updated test imports and assertions for moved components. Changed renderFileRoute invocations to new signature. Converted many tests to it.todo(). Updated MSW mocking patterns. Added mockPipelineApi helpers. Updated assertions to match new UI structure.
Test Files - New
test/server/graph-definition-utils.test.ts, test/server/graph-layout.test.ts
Added comprehensive test suites for new definitionGraphToFlow, filterToNeighbors, applyDefinitionLayout and applyLayeredLayout utilities.
Minor Changes
shared-ui/src/ui/sidebar.tsx, routeTree.gen.ts
Removed comment from sidebar. Updated generated route tree to reflect new inspect route structure with nested routes and removed graphs route.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • PR #477: Adopts new @ucdjs-internal/shared-ui package with integrated component exports
  • PR #561: Overlaps on inspect components and routes, useInspectData refactoring
  • PR #558: Modifies pipeline-sidebar.tsx with test helpers/data-testid attributes

Suggested labels

area: ui, area: routing, pkg: components, type: refactor, test-updates

Poem

🐰 Inspect routes hop to nested paths so fine,
Graph utilities now share, their code align,
Sidebars dance with source and pipeline views,
No more query strings—just routes we choose!
Execute with grace, the UI takes a bow~ 🎭

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/pipeline-ui-improvements

@github-actions
Copy link
Contributor

github-actions bot commented Mar 21, 2026

🌏 Preview Deployments

Note

No deployable apps affected by changes in this PR.

Built from commit: ca9cd493c6c84f38fe9309714a8c65b3c21319cf


🤖 This comment will be updated automatically when you push new commits to this PR.

@luxass luxass changed the title Refactor(pipeline-server): redesign pipeline detail UI refactor(pipeline-server): redesign pipeline detail UI Mar 21, 2026
luxass and others added 16 commits March 21, 2026 08:54
…o source

Remove the global overview API endpoint, query, and dashboard components
that are superseded by per-source overview. The home route now redirects
to the last active source (or the first available source).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rewrite the source page with a Vercel-inspired dashboard layout:
- Left column: activity chart, status overview, compact recent executions
- Right column: search toolbar with list/grid view toggle, pipeline files
- Error banner below header for source issues
- New PipelineFileRow (expandable list) and PipelineFileCard (grid) components
- Recent executions as a compact stacked list instead of a wide table

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…eline layouts

Streamline the sidebar by removing inline source queries, simplify the
source file list and switcher components, and clean up pipeline header
and summary layouts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The home/ folder was a leftover from the removed dashboard. These
components (activity-chart, status-overview-panel, shared) are now
used on the source overview page, so the folder name should reflect
that.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When navigating into a pipeline, the sidebar now transforms from the
file tree into pipeline-specific navigation: back link, pipeline
identity, Overview/Inspect/Executions nav links, pipeline info stats,
and an Execute button. This replaces the tab bar that was previously
in the main content area.

- Remove PipelineTabs component (navigation moved to sidebar)
- Simplify PipelineHeader (remove version selector and execute button)
- Add context-aware rendering to PipelineSidebar

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Introduced new routes for inspecting pipeline outputs, transforms, and routes.
- Implemented detailed pages for each output and transform, including navigation and filtering capabilities.
- Added a sidebar for easy navigation between different inspection tabs.
- Enhanced user experience with informative messages when no outputs or transforms are found.
- Implemented redirection for routes and outputs when no outputs or transforms are defined in the pipeline.
- Improved UI elements for better accessibility and user experience.
- Added detailed sections for dependencies, transforms, and outputs in the route details.
- Introduced new routes for inspecting outputs and transforms within the pipeline.
- Created `OutputDetailPage` to display details of specific outputs.
- Added `RouteDetailPage` for inspecting individual routes, including dependencies and transforms.
- Updated route tree to include new routes for outputs and transforms.
- Enhanced the existing transforms index to redirect to the first transform's detail page.
…ate files

Move routes, transforms, and outputs list components from the monolithic
inspect-sidebar into individual files under inspect/list/. Each list
component now derives its own data internally instead of receiving
pre-computed data from the parent. Remove unnecessary useMemo wrappers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Updated output key generation to use index directly for better clarity.
- Enhanced layout of the `OutputsSection` and `TransformDetailPage` for improved readability and consistency.
…e utils

Introduce a single FlowNodeData discriminated union type used by both
the execution graph and definition graph. Move all graph utility code
(layout, conversion, filtering) into lib/graph-utils.ts and
lib/graph-layout.ts, eliminating duplicated layout algorithms.

Merge route detail into a single card with output nodes in the
neighbor graph that navigate to output detail pages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ail pages

Merge transform and output detail pages into single-card layouts with
divide-y sections, matching the route detail pattern. Consistent
bg-muted/5 header styling across all three detail views.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@luxass luxass deployed to apps-approval March 22, 2026 05:34 — with GitHub Actions Active
luxass and others added 3 commits March 22, 2026 06:37
Rewrite renderFileRoute to accept a React element + options with
initialLocation, matching the renderWithFileRoutes pattern. All route
tests now use renderFileRoute(<div />, { initialLocation: "..." }).

Rewrite inspect route tests for the new sub-route architecture
(routes/$routeId, transforms/$transformName, outputs/$outputKey).

Add graph-layout and graph-definition-utils unit tests. Fix pre-existing
type errors in execution-table, use-pipeline-versions, and execution
detail page.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…r tests

Split TreeNode into FolderNode/FileNode to fix conditional useCallback
hook call. Update use-pipeline-versions tests to match new hook API.
Fix browser test assertions to match current UI (multiple elements,
changed text). Mark complex tests as todo for later. Refactor
renderFileRoute to accept React element + options.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@luxass luxass marked this pull request as ready for review March 24, 2026 05:26
Copilot AI review requested due to automatic review settings March 24, 2026 05:26
@luxass luxass merged commit 2f1b125 into main Mar 24, 2026
28 of 29 checks passed
@luxass luxass deleted the codex/pipeline-ui-improvements branch March 24, 2026 05:26
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors the pipeline-server UI around a redesigned pipeline detail/inspect experience, shifting overview content into more structure-oriented components, updating routing, and adjusting both client/server “overview” APIs and tests accordingly.

Changes:

  • Replace the workspace-level overview page/API with source-scoped overview (/api/sources/:sourceId/overview) and redirect / into a source (using a “last active source” hint).
  • Redesign pipeline detail pages: new summary/structure/latest-execution sections, new inspect layout + sidebar, and new definition graph utilities/layout.
  • Update Vitest browser project config to enable TanStack Router route-tree generation and adjust/trim browser & server test suites.

Reviewed changes

Copilot reviewed 96 out of 96 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
packages/shared-ui/src/ui/sidebar.tsx Removes an inline comment in sidebar gap markup.
packages/pipelines/pipeline-server/vitest.config.ts Adds Vite plugins for router + React in browser tests and path refactor.
packages/pipelines/pipeline-server/test/server/overview.test.ts Removes old /api/overview server test.
packages/pipelines/pipeline-server/test/server/graph-layout.test.ts Adds tests for new layered layout helper.
packages/pipelines/pipeline-server/test/server/graph-definition-utils.test.ts Adds tests for new definition graph utilities.
packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.index.test.tsx Updates source route test + stubs new source overview API.
packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.index.test.tsx Removes source-file index route test (route now redirects).
packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId.inspect.transforms.test.tsx Updates transforms inspect tests for new nested routes.
packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId.index.test.tsx Updates pipeline overview route test assertions and execution pagination stubs.
packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId.executions.index.test.tsx Updates executions list route test for new header/links.
packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId.executions.$executionId.index.test.tsx Marks detailed execution tests as it.todo and updates render helper usage.
packages/pipelines/pipeline-server/test/browser/routes/s.$sourceId.$sourceFileId.$pipelineId.executions.$executionId.graph.test.tsx Updates execution graph route tests and stubs executions API.
packages/pipelines/pipeline-server/test/browser/routes/root-error.test.tsx Updates render helper signature usage.
packages/pipelines/pipeline-server/test/browser/routes/pipeline-command-palette.test.tsx Updates render helper signature usage.
packages/pipelines/pipeline-server/test/browser/routes/index.test.tsx Removes old home route test (home now redirects).
packages/pipelines/pipeline-server/test/browser/router-test-utils.tsx Removes bespoke router test helper.
packages/pipelines/pipeline-server/test/browser/route-test-utils.tsx Refactors file-route rendering helper signature and wrapper usage.
packages/pipelines/pipeline-server/test/browser/hooks/use-pipeline-versions.test.tsx Updates tests for new select/deselect semantics.
packages/pipelines/pipeline-server/test/browser/components/source/source-file-card.test.tsx Removes tests for removed SourceFileCard.
packages/pipelines/pipeline-server/test/browser/components/pipeline/version-selector.test.tsx Updates tests for new dropdown-based version selector + storage key.
packages/pipelines/pipeline-server/test/browser/components/pipeline/quick-actions-card.test.tsx Removes tests for removed QuickActionsCard.
packages/pipelines/pipeline-server/test/browser/components/pipeline/pipeline-header.test.tsx Switches header tests to route-level rendering; marks as todo.
packages/pipelines/pipeline-server/test/browser/components/home/status-overview-panel.test.tsx Updates import path after moving overview components.
packages/pipelines/pipeline-server/test/browser/components/home/sources-panel.test.tsx Removes tests for removed SourcesPanel.
packages/pipelines/pipeline-server/test/browser/components/home/activity-chart.test.tsx Updates import path after moving overview components.
packages/pipelines/pipeline-server/test/browser/components/execution/execution-table.test.tsx Loosens some assertions and updates “View graph” selection.
packages/pipelines/pipeline-server/test/browser/components/app/source-switcher.test.tsx Updates assertions to match new switcher behavior/labels.
packages/pipelines/pipeline-server/test/browser/components/app/pipeline-sidebar.test.tsx Marks sidebar tests as todo.
packages/pipelines/pipeline-server/test/browser/components/app/pipeline-sidebar-source-file-list.test.tsx Marks file list test as todo.
packages/pipelines/pipeline-server/src/server/routes/sources.overview.ts Introduces source-scoped overview route + sourceId validation.
packages/pipelines/pipeline-server/src/server/routes/index.ts Exports sourcesOverviewRouter.
packages/pipelines/pipeline-server/src/server/app.ts Mounts source-scoped overview under /api/sources.
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/route.tsx Stores “last active source” in loader.
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/index.tsx Redirects source-file index back to source route.
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/route.tsx Prefetches executions and simplifies header wrapper.
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/transforms/index.tsx Adds transforms index that redirects to first transform.
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/routes/index.tsx Adds routes index (graph + redirect to first route).
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/route.tsx Adds inspect layout with sticky sidebar.
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/outputs/index.tsx Adds outputs index that redirects to first output.
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/outputs/$outputKey.tsx Adds output detail page with navigation and metadata.
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/inspect/index.tsx Redirects /inspect to /inspect/routes.
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/index.tsx Redesigns pipeline overview UI (latest execution, summary, structure, executions card).
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/graphs.tsx Removes graphs listing page.
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/executions/index.tsx Redesigns executions list page header + layout.
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/executions/$executionId/index.tsx Redesigns execution detail header and summary line.
packages/pipelines/pipeline-server/src/client/routes/s.$sourceId/$sourceFileId/$pipelineId/executions/$executionId/graph.tsx Redesigns execution graph page with new header and empty state.
packages/pipelines/pipeline-server/src/client/routes/index.tsx Replaces home overview with redirect-to-source + empty state.
packages/pipelines/pipeline-server/src/client/queries/source-overview.ts Adds source-scoped overview query.
packages/pipelines/pipeline-server/src/client/queries/overview.ts Removes workspace-level overview query.
packages/pipelines/pipeline-server/src/client/lib/last-active-source.ts Adds localStorage helper for last active source.
packages/pipelines/pipeline-server/src/client/lib/graph-utils.ts Adds shared flow conversion, filtering, and layout entrypoints.
packages/pipelines/pipeline-server/src/client/lib/graph-layout.ts Adds generic layered layout implementation.
packages/pipelines/pipeline-server/src/client/hooks/use-pipeline-versions.ts Reworks selection persistence with useSyncExternalStore.
packages/pipelines/pipeline-server/src/client/hooks/use-inspect-data.ts Removes inspect search-param based navigation hook.
packages/pipelines/pipeline-server/src/client/components/source/source-issues-dialog.tsx Tightens issue typing and updates dialog sizing classes.
packages/pipelines/pipeline-server/src/client/components/source/source-file-card.tsx Removes old source file card component.
packages/pipelines/pipeline-server/src/client/components/source/pipeline-file-row.tsx Adds expandable file row UI for source pages.
packages/pipelines/pipeline-server/src/client/components/source/pipeline-file-card.tsx Adds file card UI for source pages.
packages/pipelines/pipeline-server/src/client/components/pipeline/version-selector.tsx Replaces button list with dropdown + internal storage-backed hook.
packages/pipelines/pipeline-server/src/client/components/pipeline/route-structure-metrics.tsx Adds reusable metrics strip component.
packages/pipelines/pipeline-server/src/client/components/pipeline/quick-actions-card.tsx Removes old quick actions card.
packages/pipelines/pipeline-server/src/client/components/pipeline/pipeline-tabs.tsx Removes old pipeline tab strip.
packages/pipelines/pipeline-server/src/client/components/pipeline/pipeline-summary.tsx Adds pipeline summary card.
packages/pipelines/pipeline-server/src/client/components/pipeline/pipeline-structure.tsx Adds structure card with deep links into inspect.
packages/pipelines/pipeline-server/src/client/components/pipeline/pipeline-header.tsx Simplifies header to breadcrumb + description + file path.
packages/pipelines/pipeline-server/src/client/components/pipeline/latest-execution.tsx Adds latest execution card with links to logs/graph.
packages/pipelines/pipeline-server/src/client/components/overview/status-overview-panel.tsx Moves types to shared schemas + adds compact mode.
packages/pipelines/pipeline-server/src/client/components/overview/shared.ts Moves overview types to shared schemas.
packages/pipelines/pipeline-server/src/client/components/overview/activity-chart.tsx Moves overview types to shared schemas + adds compact mode.
packages/pipelines/pipeline-server/src/client/components/inspect/route-transforms-section.tsx Converts transform navigation to route-based links.
packages/pipelines/pipeline-server/src/client/components/inspect/route-outputs-section.tsx Converts outputs section to route-based links + card UI.
packages/pipelines/pipeline-server/src/client/components/inspect/route-flow-section.tsx Removes old upstream/downstream flow section.
packages/pipelines/pipeline-server/src/client/components/inspect/route-dependencies-section.tsx Converts dependency navigation to route-based links + card UI.
packages/pipelines/pipeline-server/src/client/components/inspect/list/sidebar-transforms-list.tsx Adds sidebar transforms list with filtering.
packages/pipelines/pipeline-server/src/client/components/inspect/list/sidebar-shared.tsx Adds shared derivation helpers for sidebar lists.
packages/pipelines/pipeline-server/src/client/components/inspect/list/sidebar-routes-list.tsx Adds sidebar routes list with rich filtering.
packages/pipelines/pipeline-server/src/client/components/inspect/list/sidebar-outputs-list.tsx Adds sidebar outputs list with filtering.
packages/pipelines/pipeline-server/src/client/components/inspect/inspect-sidebar.tsx Adds inspect sidebar with tabs and search.
packages/pipelines/pipeline-server/src/client/components/inspect/definition-node.tsx Adds custom ReactFlow node renderers for definition graph.
packages/pipelines/pipeline-server/src/client/components/inspect/definition-graph.tsx Adds definition graph component (layout + selection + minimap).
packages/pipelines/pipeline-server/src/client/components/home/sources-panel.tsx Removes old sources panel component.
packages/pipelines/pipeline-server/src/client/components/graph/pipeline-graph.tsx Switches execution graph utilities to shared #lib/graph-utils.
packages/pipelines/pipeline-server/src/client/components/graph/nodes.tsx Updates node types + dimensions to shared graph utils.
packages/pipelines/pipeline-server/src/client/components/graph/graph-utils.ts Removes old graph utility implementation.
packages/pipelines/pipeline-server/src/client/components/execution/status-badge.tsx Updates badge styling and adds centralized style map.
packages/pipelines/pipeline-server/src/client/components/app/source-switcher.tsx Replaces DropdownMenu with custom searchable popover.
packages/pipelines/pipeline-server/src/client/components/app/source-file-list.tsx Refactors tree node rendering and file row toggling behavior.
Comments suppressed due to low confidence (1)

packages/pipelines/pipeline-server/src/server/routes/sources.overview.ts:30

  • The overview API was moved to /api/sources/:sourceId/overview and now validates sourceId, but there’s no corresponding server test coverage (the previous /api/overview test was removed). Adding a sources.overview route test would help prevent regressions in windowing/zero-fill logic and the 400/404 behaviors.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

style={{ width: OUTPUT_NODE_WIDTH, minHeight: OUTPUT_NODE_HEIGHT }}
className="cursor-pointer rounded-lg border border-dashed border-border bg-card px-3 py-1.5 shadow-sm transition-shadow hover:shadow-md"
>
<Handle type="target" position={Position.Left} className="h-2! w-2! border-none! bg-muted-foreground!" />
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tailwind’s important modifier is written as !h-2 / !w-2 (prefix), not h-2!. This handle uses the unsupported suffix form, so the intended sizing/styling may not be applied.

Copilot uses AI. Check for mistakes.
Comment on lines +7 to 10
const pipelineServerRoot = fileURLToPath(new URL("./", import.meta.url));

const browserSetupFile = `${pipelineServerRoot}/test/browser/setup.ts`;

Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pipelineServerRoot is a platform-specific filesystem path; building child paths via template strings with /... can produce mixed separators on Windows. Prefer new URL("test/browser/setup.ts", import.meta.url) + fileURLToPath, or path.join(pipelineServerRoot, "test", ...), for cross-platform correctness.

Copilot uses AI. Check for mistakes.
Comment on lines +64 to +76
for (let i = 0; i < queue.length; i += 1) {
const nodeId = queue[i];
if (!nodeId) continue;

const layer = layers.get(nodeId) ?? 0;

for (const childId of graphIndex.outgoing.get(nodeId) ?? []) {
const nextLayer = layer + 1;
if (nextLayer > (layers.get(childId) ?? -1)) {
layers.set(childId, nextLayer);
}
queue.push(childId);
}
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assignLayers pushes every child onto queue unconditionally. If the graph contains a cycle, layers will keep increasing and the queue will grow without bound (effectively an infinite loop / OOM). Even for DAGs, this can create a lot of duplicate work. Consider only enqueueing when a node’s layer actually increases and/or add explicit cycle detection / max-iterations guard so malformed graphs can’t hang the UI.

Copilot uses AI. Check for mistakes.
</div>
</div>

<Handle type="source" position={Position.Right} className="h-2! w-2! border-none! bg-muted-foreground!" />
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tailwind’s important modifier is written as !h-2 / !w-2 (prefix), not h-2!. This handle uses the unsupported suffix form, so the intended sizing/styling may not be applied.

Copilot uses AI. Check for mistakes.
Comment on lines 90 to 92
<DialogContent
className="grid-rows-[auto_auto_minmax(0,1fr)_auto] h-[90vh] !w-[72rem] !max-w-[calc(100vw-2rem)] overflow-hidden p-0"
className="grid-rows-[auto_auto_minmax(0,1fr)_auto] h-[90vh] w-6xl! max-w-[calc(100vw-2rem)]! overflow-hidden p-0"
data-testid="source-issues-dialog"
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The class string uses w-6xl! / max-w-[...]!, but Tailwind’s important modifier is prefix-based (e.g. !w-6xl, !max-w-[...]). As written these utilities likely won’t be generated/applied, which may regress the dialog sizing.

Copilot uses AI. Check for mistakes.
Comment on lines +80 to 110
<div ref={containerRef} className="relative">
<SidebarMenuButton
data-testid="source-switcher-trigger"
size="lg"
className="w-full data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground"
data-state={open ? "open" : "closed"}
onClick={() => setOpen((prev) => !prev)}
>
<DropdownMenuItem
data-testid="source-switcher-option:all"
onSelect={(event) => {
event.preventDefault();
handleSelect(null);
}}
onClick={() => handleSelect(null)}
className={currentSourceId == null ? "bg-accent text-accent-foreground" : undefined}
<div className="bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg">
<GitBranch className="size-4" />
</div>
<div className="flex flex-col gap-0.5 leading-none min-w-0">
<span className="font-semibold truncate">
{currentSource ? currentSource.label : sources[0]?.label ?? "No sources"}
</span>
{currentSource && (
<span className="text-xs text-muted-foreground">
{currentSource.fileCount}
{" "}
{currentSource.fileCount === 1 ? "file" : "files"}
</span>
)}
</div>
<ChevronsUpDown className="ml-auto size-4 shrink-0 text-muted-foreground" />
</SidebarMenuButton>

{open && (
<div
data-testid="source-switcher-popup"
className="absolute left-0 right-0 top-full z-50 mt-1 overflow-hidden rounded-lg border border-border/60 bg-popover text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 slide-in-from-top-2 duration-100"
>
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SourceSwitcher replaced the shared DropdownMenu with a custom popover, but the new markup lacks common accessibility hooks (e.g. aria-expanded, aria-controls, aria-haspopup on the trigger; role="listbox"/"menu" + roving focus / arrow-key navigation for options). Consider reusing the shared dropdown/menu primitives (or adding the missing ARIA + keyboard support) to avoid regressing keyboard/screen-reader usability.

Copilot uses AI. Check for mistakes.
Comment on lines +30 to +33
function Wrapper({ children }: { children: React.ReactNode }) {
// @ts-expect-error - the router provider types don't allow for the full flexibility of our router options, but in practice this works fine
return <RouterProvider router={router}>{children}</RouterProvider>;
}
Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test helper currently relies on @ts-expect-error to pass children into RouterProvider. This is brittle (and the suppression reason doesn’t match the actual type error). Consider rendering <RouterProvider router={router} /> directly (and removing the unused ui parameter), or wrap RouterProvider in a separate wrapper component that doesn’t require invalid props, so tests don’t depend on suppressed type errors.

Copilot uses AI. Check for mistakes.
Comment on lines +22 to +23
<Handle type="target" position={Position.Left} className="h-2! w-2! border-none! bg-muted-foreground!" />

Copy link

Copilot AI Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tailwind’s important modifier is written as !h-2 / !w-2 (prefix), not h-2!. As written, these classes likely won’t apply, which can break handle sizing/styling in the graph. Please switch to the supported ! syntax (or remove the modifier if not needed).

Copilot uses AI. Check for mistakes.
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.

2 participants