Skip to content

feat(core): add aggregate task summary status bar to TUI#35653

Draft
leosvelperez wants to merge 3 commits into
masterfrom
nxc-3076
Draft

feat(core): add aggregate task summary status bar to TUI#35653
leosvelperez wants to merge 3 commits into
masterfrom
nxc-3076

Conversation

@leosvelperez
Copy link
Copy Markdown
Member

Current Behavior

The TUI's bottom row only shows keyboard shortcuts and (when present) a Cloud message. There's no run-wide aggregate of task status — users can't see at a glance how many tasks have completed, failed, are running, or are pending without scanning the table.

Expected Behavior

A global bottom status bar that always shows X/Y done plus per-status chips (✔ N, ✖ N, ⠋ N, · N, ⏭ N, ◼ N) on the left and keyboard shortcuts on the right. The Cloud message, when present, renders on its own row immediately above the bar.

The bar is width-aware: at narrower terminals, items drop via a single actions-first priority ladder so that critical status information survives longer than non-critical keyboard hints:

  1. zero-count chips (eager)
  2. [N cached] bracket sub-count
  3. pin output: 1 or 2
  4. navigate: ↑ ↓
  5. filter: /
  6. show output: <enter>
  7. · pending
  8. ⏭ skipped / ◼ stopped
  9. ✔ passed
  10. ⠋ running
    11-13. sticky: ✖ failed, X/Y done, quit: q / help: ?
  11. compress sticky labels at extreme widths

Strict-priority backward-optimize: a lower-priority item is never preserved while a higher-priority one remains dropped. Bar stays visible whether the task list is shown or hidden — when hidden, the help slot adds show task list: b.

Implementation Details

New StatusBar component (packages/nx/src/native/tui/components/status_bar.rs) implementing the Component trait. Lives at app level so it renders independently of task-list visibility. App snapshots aggregate counts from tasks_list.task_lookup each frame and passes them in.

Cleanup in tasks_list.rs: removes BottomLayoutMode + the three-mode branching, render_help_text / render_cloud_message, the four bottom-row width constants, and the Action::UpdateCloudMessage handler (consumed by StatusBar now). Filter line stays in the task-list area. Deletes the now-orphaned HelpText component.

Coverage: 40 new unit tests in status_bar covering counts mapping, the ladder algorithm at canonical widths, drop-order invariants, and 18 insta snapshots locking in exact rendered output across width scenarios, run states, cloud cascade, and hidden-task-list state.

@leosvelperez leosvelperez self-assigned this May 12, 2026
@netlify
Copy link
Copy Markdown

netlify Bot commented May 12, 2026

Deploy Preview for nx-docs ready!

Name Link
🔨 Latest commit 764847b
🔍 Latest deploy log https://app.netlify.com/projects/nx-docs/deploys/6a0480c0167e470008d5de86
😎 Deploy Preview https://deploy-preview-35653--nx-docs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@netlify
Copy link
Copy Markdown

netlify Bot commented May 12, 2026

Deploy Preview for nx-dev ready!

Name Link
🔨 Latest commit 764847b
🔍 Latest deploy log https://app.netlify.com/projects/nx-dev/deploys/6a0480c0ced48c0008506957
😎 Deploy Preview https://deploy-preview-35653--nx-dev.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@nx-cloud
Copy link
Copy Markdown
Contributor

nx-cloud Bot commented May 12, 2026

View your CI Pipeline Execution ↗ for commit 3685c55

Command Status Duration Result
nx affected --targets=lint,test,build,e2e,e2e-c... ✅ Succeeded 18m 3s View ↗
nx run-many -t check-imports check-lock-files c... ✅ Succeeded 5s View ↗
nx-cloud record -- pnpm nx-cloud conformance:check ✅ Succeeded 15s View ↗
nx build workspace-plugin ✅ Succeeded <1s View ↗
nx-cloud record -- nx sync:check ✅ Succeeded 18s View ↗
nx-cloud record -- nx format:check ✅ Succeeded <1s View ↗

☁️ Nx Cloud last updated this comment at 2026-05-13 14:08:21 UTC

nx-cloud[bot]

This comment was marked as outdated.

Add a global bottom bar showing X/Y done, per-status chips, and
keyboard shortcuts. Cloud message renders on its own row above when
present.

Bar uses an actions-first drop ladder: non-critical actions (pin,
navigate, filter, show output) drop before any chip including pending.
Failed, X/Y done, and quit/help are sticky. Strict-priority backward
optimize never un-drops a lower-priority item while a higher-priority
one remains dropped.

New StatusBar component lives at app level, visible whether the task
list is shown or hidden (adds `show task list: b` when hidden).

Removes BottomLayoutMode + inline cloud/help rendering from tasks_list
(now table + filter only); deletes the obsolete HelpText component.
…tate

- resize PTYs on bar-height change (cloud-message set/clear) — fixes stale pane dimensions until the next user-driven resize
- exclude CachedBracket from fit-pass separator count — it attaches inline to PassedChip, was over-charging 2 cells
- collapse cloud message to a single source of truth in TuiState; remove the downcast and Action::UpdateCloudMessage variant
- drop \`filter: /\` shortcut when task list is hidden (contextual relevance)
- add fit-pass vs renderer width parity test that would have caught the CachedBracket bug
Copy link
Copy Markdown
Contributor

@nx-cloud nx-cloud Bot left a comment

Choose a reason for hiding this comment

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

Nx Cloud has identified a flaky task in your failed CI:

🔂 Since the failure was identified as flaky, we triggered a CI rerun by adding an empty commit to this branch.

Nx Cloud View detailed reasoning in Nx Cloud ↗


🎓 Learn more about Self-Healing CI on nx.dev

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