fix: terminal hangs, right arrow blocking, and runaway iris processes (#142)

closes #137

- right arrow consumed the escape sequence without forwarding it, so the
cursor couldn't move back right after moving left (60149a2)
- p10k's instant prompt redirects stdout to a temp file that exec iris
inherits, sending the overlay there instead of the terminal and looking
like a dead keyboard. Reopens /dev/tty when stdout isn't a terminal
(7ebbb0c)
- zsh/bash autostart lacked the interactivity check fish already had, so
agentic tools sourcing your rc file spawned a rogue iris that seized
/dev/tty (5fe58be)
This commit is contained in:
VERSE
2026-08-13 10:54:12 +07:00
committed by GitHub
parent 0f25a4c26b
commit 45d182f072
4 changed files with 131 additions and 2 deletions
+51
View File
@@ -4,6 +4,8 @@ import (
"os"
"path/filepath"
"testing"
"golang.org/x/term"
)
func wantDir(t *testing.T, path string) string {
@@ -24,6 +26,55 @@ func currentDir(t *testing.T) string {
return wantDir(t, cwd)
}
func TestRestoreStdoutTTYRedirectsFileStdoutToTerminal(t *testing.T) {
tty, err := os.OpenFile("/dev/tty", os.O_WRONLY, 0)
if err != nil {
t.Skip("no controlling terminal available")
}
_ = tty.Close()
// stand in for the temp file powerlevel10k's instant prompt leaves on stdout
redirected, err := os.CreateTemp(t.TempDir(), "instant-prompt-output")
if err != nil {
t.Fatal(err)
}
defer func() { _ = redirected.Close() }()
original := os.Stdout
os.Stdout = redirected
t.Cleanup(func() { os.Stdout = original })
restoreStdoutTTY()
if os.Stdout == redirected {
t.Fatal("restoreStdoutTTY left stdout pointing at the redirected file")
}
if !term.IsTerminal(int(os.Stdout.Fd())) {
t.Fatal("restoreStdoutTTY did not leave stdout on a terminal")
}
_ = os.Stdout.Close()
}
func TestRestoreStdoutTTYKeepsExistingTerminal(t *testing.T) {
tty, err := os.OpenFile("/dev/tty", os.O_WRONLY, 0)
if err != nil {
t.Skip("no controlling terminal available")
}
original := os.Stdout
os.Stdout = tty
t.Cleanup(func() {
os.Stdout = original
_ = tty.Close()
})
restoreStdoutTTY()
if os.Stdout != tty {
t.Fatal("restoreStdoutTTY reopened stdout that was already a terminal")
}
}
func TestSyncProcessCWDFollowsShell(t *testing.T) {
shellDir := t.TempDir()
t.Chdir(t.TempDir())