Skip to content

Delete the curses TUI — after parity, never before #541

Description

@eaitbrahim

Spec: docs/superpowers/specs/2026-08-23-web-ui-rewrite-design.md § What this deletes.

Depends on #537 (parity) and #540. Last issue in the milestone, deliberately.

Removes keel/commands/tui.py (5,063 lines) and tests/commands/test_tui.py (4,369) — ~9,432 lines, which answers #525 ("keel/commands/ is 23,188 lines — larger than the engine it drives") directly.

"But SSH" is not a reason, and keel's own documentation refutes it three ways

  1. There is no server deployment profile. The four profiles are trading profiles — live, paper, paper-hourly, paper-equities — not topologies.
  2. A headless live cycle already fails closed. Confirm mode "waits for a typed y at a terminal" (docs/operator-runbook.md:365).
  3. No remote surface exists at all"Notify-only, by design. There is no remote control surface — no command, query or capability arrives through notifications, ever" (docs/operator-runbook.md:864).

And granting a headless host anyway, ssh -L 8765:127.0.0.1:8765 host forwards the web interface to a local browser: full UI, encrypted by SSH, still a secure context because it is localhost at the reading end, no curses anywhere. keel status covers the rest from a plain shell. windows-curses is unmaintained besides — the desktop PRD already noted D2 would remove the need for it.

Why deletion is safe structurally

tui.py imports from keel.commands.{activity,admission,status} — it is a front-end over the shared report builders, not their owner. Removing it never touches what the web UI reads.

Two gates, and they are why this is last

Gate 1 — parity. D2 (#435) requires parity with the TUI's read surface before the write surface widens. tests/commands/test_tui.py is the specification of what is being ported: it records what each screen shows and when. #537's PR carries the parity checklist against it; this issue verifies against that checklist, not against memory.

Gate 2 — nobody gets stranded. Once the TUI is gone the browser is the only interactive surface. Everything previously reachable only through it must be reachable through the browser — with the #436 GUI human gate where a capability increases — or deliberately CLI-only. Otherwise a non-technical user hits a step that needs a terminal, which undoes the point of the exercise.

Enumerate against keel capabilities and confirm coverage. Do not assume it.

Also removed

help_console.py's glossary reader, once #539 has moved documentation to outbound links and the TUI is no longer a consumer.

Acceptance

Metadata

Metadata

Assignees

Labels

toolingDev/release tooling (Docs, CI & tooling)

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions