aaif-goose/goose · error

goose configure requires an interactive terminal. If you ins

Error message

goose configure requires an interactive terminal.
If you installed via 'curl ... | bash', run 'goose configure' separately after installation.

What it means

`goose configure` is a fully interactive wizard (cliclack prompts, cursor control). It checks `stdin().is_terminal()` up front and refuses to run when stdin is a pipe or file — exactly the condition produced by one-line installers like `curl ... | bash` that try to launch the wizard inline.

Source

Thrown at crates/goose-cli/src/commands/configure.rs:147

                unreachable!("Search entry is not added to the results list")
            }
        }
    }
}

struct CursorRestoreGuard;

impl Drop for CursorRestoreGuard {
    fn drop(&mut self) {
        let mut stdout = std::io::stdout().lock();
        let _ = stdout.write_all(SHOW_CURSOR);
        let _ = stdout.flush();
    }
}

pub async fn handle_configure() -> anyhow::Result<()> {
    if !std::io::stdin().is_terminal() {
        anyhow::bail!(
            "goose configure requires an interactive terminal.\n\
             If you installed via 'curl ... | bash', run 'goose configure' separately after installation."
        );
    }

    let _cursor_restore = CursorRestoreGuard;
    let config = Config::global();

    if !config.exists() {
        handle_first_time_setup(config).await
    } else {
        handle_existing_config().await
    }
}

#[cfg(feature = "telemetry")]
pub fn configure_telemetry_consent_dialog() -> anyhow::Result<bool> {
    let config = Config::global();

View on GitHub (pinned to 3810898a74)

Solutions

  1. Run `goose configure` as a separate step in a real terminal after installation
  2. For automation, write ~/.config/goose/config.yaml and export env vars directly instead of using the wizard
  3. Wrap in a pseudo-TTY when unavoidable: `script -qec 'goose configure' /dev/null`

Example fix

# before
curl -sSL https://... | bash    # installer runs configure inside the pipe -> bails

# after
curl -sSL https://... | bash
# then, in your terminal:
goose configure
Defensive patterns

Strategy: validation

Validate before calling

# Only attempt the wizard when stdin is a TTY
if [ -t 0 ]; then
  goose configure
else
  echo 'configure skipped: no interactive terminal' >&2
fi

Prevention

When it happens

Trigger: `curl -sSL https://... | bash` where the piped script calls `goose configure`; `goose configure < /dev/null` in CI; running configure over SSH with no TTY or from a non-interactive service context.

Common situations: One-line installer scripts; Docker/CI containers; scheduled tasks; `su`/`sudo` invocations that detach the TTY.

Related errors


AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16). Data as JSON: /api/errors/21d7c049c2131d39. Report an issue: GitHub.