From 0f4abeec8e0a5bb54e0f08d671a9e1b86fa62453 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Mon, 24 Aug 2026 19:46:02 +0200 Subject: [PATCH] Wait for the keypress ourselves instead of asking gum to (backport of #8082) Backport of the keypress fix (PR #8082, merged to quattro as 5d3299fb) onto the v4-0-1 release branch. gum 2.0 runs a spun command without the terminal attached, so the gum spin -- read -n 1 that held the presentation terminal open returned at once. Every menu command that ended in a failure took its window down with it before the error could be read, which is how a failed update looked like a terminal that just quit. Read the key directly. gum's own terminal query replies are still sitting on the tty when the spinner stops, so drain those first or they answer the prompt on the user's behalf. The /dev/tty node is there whether or not a terminal is behind it, so open it rather than test for it -- the existence check passed on a headless run and left both reads failing with "No such device or address" -- and prompt on the terminal rather than stdout, so a caller that redirects us does not leave the user waiting on a prompt they were never shown. The green dot reads better than the globe did, so the provisioning notice uses it too and drops its spinner along the way. Clean cherry-pick: both files are byte-identical to quattro, so merging v4-0-1 into quattro resolves without a conflict. Exercised against the installed gum 2.0.0: headless it exits 0 at once, and on a pty it prints the prompt and returns on one keypress. test/shell (186 files) and test/cli pass. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_018DEMYa9UWtroz93DhMTtcV --- bin/omarchy-provision-owner | 3 ++- bin/omarchy-show-done | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/bin/omarchy-provision-owner b/bin/omarchy-provision-owner index ac4b90c1..c27de22c 100755 --- a/bin/omarchy-provision-owner +++ b/bin/omarchy-provision-owner @@ -141,7 +141,8 @@ say() { notice() { clear_logo echo - gum spin --spinner "pulse" --title "$1" -- sleep "${2:-2}" + printf '%*s\033[32m● \033[0m%s\n' "$PADDING_LEFT" '' "$1" + sleep "${2:-2}" echo } diff --git a/bin/omarchy-show-done b/bin/omarchy-show-done index 60741076..d5d8ccde 100755 --- a/bin/omarchy-show-done +++ b/bin/omarchy-show-done @@ -1,6 +1,18 @@ #!/bin/bash -# omarchy:summary=Display a "Done!" message with a spinner and wait for user to press any key. +# omarchy:summary=Display a "Done!" message and wait for user to press any key. -echo -gum spin --spinner "globe" --title "Done! Press any key to close..." -- bash -c 'read -n 1 -s' +# The device node is there whether or not a terminal is behind it, so opening +# it is the only test that means anything. +: 2>/dev/null <>/dev/tty || exit 0 + +# gum 2.0 no longer lets a spun command read the terminal, so the wait has to +# happen here. Its own query replies are still queued on the tty; drop those or +# they answer the keypress for the user. +while read -rsn 1 -t 0.1 _ /dev/tty +read -rsn 1 /dev/tty