TUI end-to-end cases — drive chat and the fleet hub through a real terminal (npm run tui:e2e)
Starts cyberine chat, cyberine agents and cyberine tui from this source tree inside a private tmux server, sends real keys, waits for what a person would see, and runs a UX invariant scan on every captured frame (leaked undefined / NaN / markup / escape codes / stack traces, lines wrapped past the width, a status line or banner drawn twice). It asserts behaviour, never exact glyphs, so it is not a snapshot suite.
npm run tui:e2e # every case that spends nothing
npm run tui:e2e -- --only chat. # one surface, by id prefix
npm run tui:e2e -- --only hub.help,chat.mode-cycle
npm run tui:e2e -- --live # also the cases that call the chat provider (metered)
npm run tui:e2e -- --list # the catalogueEach run writes .local/tui-e2e/<date-time>.<host>/: report.md (PASS / FAIL / SKIP with every failed expectation), index.html (every case with its intent and every captured frame rendered in colour, the review surface for UI/UX), and per-step .txt / .html captures. Exit 1 on any failure, 78 when tmux is missing.
Every case runs against its own scratch CYBERINE_HOME holding a mode-600 copy of ~/.cyberine/.env, deleted when the case ends, so /model, /settings and /config can never rewrite the real file; CYBERINE_NO_UPDATE_CHECK=1 and CYBERINE_OVERVIEW_PROBE=0 keep the hub offline.
Extend: add a case object to scripts/tui-e2e/cases/chat.ts or cases/hub.ts; scripts/tui-e2e/README.md has the shape, the tmux key names and the coverage matrix.
Known limitations: needs tmux; the hub cases read this repo's real run history (backfilled into the scratch registry) and so never press a key that stops, deletes, steers or dispatches; Shift+Enter, clipboard images, mouse, planner-driven dialogs (ask_user, present_plan), /compact and the hub -> chat handoff are not driven (see the README's coverage section). It is not part of npm run sweep or the push gate.
TUI — worker toast notifications
A small stack of status lines appears between the content area and the key-hint footer whenever a worker finishes or fails — so a state change is noticed without watching rows.
Workflow Monitor — live phase/agent drill-down (w)
Press w on a selected run (from the fleet list or from a run's detail screen) to open the Workflow Monitor for that run. It replaces the current screen; Esc returns you to where you came from...