From 1ed55d053b7c02371a8716cef37b8c2cb058fd74 Mon Sep 17 00:00:00 2001 From: 7ttp <117663341+7ttp@users.noreply.github.com> Date: Thu, 22 Jan 2026 11:40:35 +0530 Subject: [PATCH 1/2] fix: write interactive prompts to stderr when stdout is redirected --- internal/utils/flags/project_ref.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/internal/utils/flags/project_ref.go b/internal/utils/flags/project_ref.go index fab292001..0e47b96ec 100644 --- a/internal/utils/flags/project_ref.go +++ b/internal/utils/flags/project_ref.go @@ -22,7 +22,9 @@ func ParseProjectRef(ctx context.Context, fsys afero.Fs) error { } // Prompt as the last resort if term.IsTerminal(int(os.Stdin.Fd())) { - return PromptProjectRef(ctx, "Select a project:") + // Interactive prompts should always be written to stderr + opts := []tea.ProgramOption{tea.WithOutput(os.Stderr)} + return PromptProjectRef(ctx, "Select a project:", opts...) } return errors.New(utils.ErrNotLinked) } From f8833977de090e16152cabf46a2489bf58d7272f Mon Sep 17 00:00:00 2001 From: Qiao Han Date: Mon, 2 Feb 2026 22:12:42 +0800 Subject: [PATCH 2/2] fix: always use stderr when prompt choice --- internal/utils/flags/project_ref.go | 4 +--- internal/utils/prompt.go | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/internal/utils/flags/project_ref.go b/internal/utils/flags/project_ref.go index 0e47b96ec..fab292001 100644 --- a/internal/utils/flags/project_ref.go +++ b/internal/utils/flags/project_ref.go @@ -22,9 +22,7 @@ func ParseProjectRef(ctx context.Context, fsys afero.Fs) error { } // Prompt as the last resort if term.IsTerminal(int(os.Stdin.Fd())) { - // Interactive prompts should always be written to stderr - opts := []tea.ProgramOption{tea.WithOutput(os.Stderr)} - return PromptProjectRef(ctx, "Select a project:", opts...) + return PromptProjectRef(ctx, "Select a project:") } return errors.New(utils.ErrNotLinked) } diff --git a/internal/utils/prompt.go b/internal/utils/prompt.go index 3e121f092..ae2dedf2a 100644 --- a/internal/utils/prompt.go +++ b/internal/utils/prompt.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "io" + "os" "strings" "github.com/charmbracelet/bubbles/list" @@ -123,6 +124,8 @@ func PromptChoice(ctx context.Context, title string, items []PromptItem, opts .. // Create our model ctx, cancel := context.WithCancel(ctx) initial := model{cancel: cancel, list: l} + // Interactive prompts should always be written to stderr + opts = append(opts, tea.WithOutput(os.Stderr)) prog := tea.NewProgram(initial, opts...) state, err := prog.Run() if err != nil {