)
* fix(tui): make the wizard palette follow the terminal, not a design mock
The Redesign v5 tokens were a 10-step hex grey ramp drawn against a
#08080a mock and hardcoded. Measured against a translucent terminal
(effective background lifted to ~#2b4247 by the wallpaper behind it),
the bottom half of that ramp collapsed into the background:
cDim3 #3f3f46 -> 1.0:1 cDim2 #52525b -> 1.4:1
cDim4 #3a3a41 -> 1.1:1 cFaint #2e2e34 -> 1.3:1
1.0:1 is the background's own luminance — no terminal can draw that as
visible text. Pending pipeline rows, sidebar counts and the status-bar
key hints were simply gone. (Rolling back would not have helped: v0.63's
own greys measure 1.1:1 / 1.4:1 / 1.9:1 on the same terminal. It only
looked better because it left most text at the terminal's default
foreground — which is exactly the property being restored here.)
The text ramp is now the terminal's own ANSI palette (15 emphasis /
7 body / 8 decorative), which the user's theme guarantees is legible
against the background they actually chose. Brand and status hues stay
hex — they measure 4.4-6.1:1 on the same terminal and they're the
product's identity.
Two follow-ons from the same rule:
- pipeline rows keep a readable label; the glyph and its hue carry the
state. A label faded toward the background reads as missing, not as
pending.
- hover uses reverse video instead of a painted background. Any colour
we picked would be a guess about theirs; the design's #3d3d4a sat at
1.2:1, so the highlight was a no-op exactly where it was needed.
A test pins the ramp to ANSI indices so a hex grey can't creep back in.
* refactor(tui): the wizard plans, the scrollback shows the install
The v5 redesign unified the scattered planning prompts into one
full-screen flow — that part was right, and stays. It then carried on and
made the *apply* full-screen too, which was wrong: an alt-screen install
takes its own output with it when it exits.
Measured on a real run: 24 lines of live install detail on screen, and
after the program exits, a blank terminal. Twenty minutes and forty-eight
packages, and the only remaining trace of which three failed is a log file.
The footer's "everything is logged to ~/.openboot/logs" was not a
convenience — it was the design apologising for having thrown the record
away. openboot is a command you run once per machine, not an app you live
in; its output belongs in the scrollback, where it can be scrolled back,
copied into an issue, and piped.
So the wizard now stops at the plan. Confirm returns the reviewed
InstallPlan, the alt-screen tears down, and the CLI applies it via
installer.ApplyReviewedPlan on the normal terminal — ConsoleReporter and
the sticky progress bar, which pins the current package to the bottom
while results scroll past above it. Live progress and a permanent record,
which is what the pre-v5 flow got right.
Falling out of it, all of which were alt-screen workarounds:
- plan.Silent is no longer forced on. It only existed to keep huh prompts
from painting over the TUI, and it gated out the npm-retry confirm and
the screen-recording reminder as collateral. They work inline again.
- post-install runs in place as Step 8 with its own preview and confirm.
splitPostInstall / RunPostInstallAfterTUI are gone.
- ShowScreenRecordingReminderAfterTUI is gone: showCompletionFromPlan
already does it, and now it's reached.
- the "What was installed" breakdown is back. The wizard's log dropped
Header/Info lines, so it had never been visible there.
- RunPipeline, PhasesForPlan, PlanForConfig and the whole progress-event
bridge (~650 lines) are gone with the screen they fed. The wizard no
longer imports the install engine at all — only brew/npm's read-only
probes for the boot scan.
StickyProgress keeps the abort lifecycle the wizard had earned, instead of
reverting to its old os.Exit(130) from a signal goroutine: the first ctrl+c
stops the bar and lets the cancelled context unwind the install (ApplyContext
gates every remaining step on it), and only a second one force-quits — which
must stay reachable, because signal.NotifyContext swallows later SIGINTs
once it has fired.