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
- Run `goose configure` as a separate step in a real terminal after installation
- For automation, write ~/.config/goose/config.yaml and export env vars directly instead of using the wizard
- 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
- Never launch interactive wizards from piped installers
- Provision config via file + env vars in automation
- Use pseudo-TTY wrappers (script/tmux) only as a deliberate choice
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
- TLS was requested but no TLS backend is enabled. Enable the
- Failed to create provider for OAuth: {}
- invalid thinking effort
- Failed to store secret
- Invalid editor command: unmatched quotes in '{editor_cmd}'
AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16).
Data as JSON: /api/errors/21d7c049c2131d39.
Report an issue: GitHub.