Relationships
#3504 swamp update: a slicker, colorful download progress bar that ends with a newline
Opened by zack · 10/15/2026· Shipped 10/15/2026
Problem
The download progress swamp update shows on a terminal is a spinner whose message is plain text: Downloading update 12.3 MB / 98.1 MB (12%) · 4.2 MB/s (DownloadProgressFormatter in src/presentation/renderers/update_check.ts, drawn by Spinner in src/presentation/spinner.ts). It works, but there is no bar to show how far along the download is, and only the spinner frame has color.
When the update finishes, the next output does not start on a new line: it continues on the row the progress was drawn on.
Proposal
- A real progress bar. When the total size is known, draw a bar that fills (for example
━━━━━━━━━╸──────) next to the percentage, bytes, speed and an ETA. When the total is unknown, keep the spinner. - Color. Color the bar and its parts in the style of the terminal-output design system: the filled part in the accent color, the empty part dim, speed and ETA dim, and a green check plus the new version on success. Respect
NO_COLORand non-TTY output. Non-terminal and-qbehavior stays as it is today (periodic plain lines, or none). - End with a newline. When the progress finishes, leave the cursor at the start of a fresh line, so the next text (skill sync messages, warnings, "Updated to …") starts on its own line and never on the progress row.
Notes
The spinner starts at src/cli/commands/update.ts:624 and stops at :689. Skill sync and the autoupdate re-registration run, and can log, while it is still drawing. That may be why later text lands on the progress row (not verified). Spinner.stop() clears the row with \r\x1b[K but writes no newline.
The bar should keep the existing fit-to-terminal-width truncation, so a narrow terminal does not wrap the line and leave copies behind.
Shipped
Click a lifecycle step above to view its details.
Sign in to post a ripple.