plandex-ai/plandex · error
error prompting pin: %v
Error message
error prompting pin: %v
What it means
After a successful CreateEmailVerification on a non-local host, verifyEmail prompts for the 6-character emailed pin via term.GetUserPasswordInput and wraps prompt failure as 'error prompting pin: %v'. It is a client-side input failure (non-interactive stdin, empty input, or abort) and notably does not occur in local mode, which skips the pin prompt entirely.
Source
Thrown at app/cli/auth/account.go:229
if apiErr != nil {
return nil, fmt.Errorf("error creating email verification: %v", apiErr.Msg)
}
if res.IsLocalMode {
return &verifyEmailRes{
hasAccount: res.HasAccount,
isLocalMode: true,
pin: "",
}, nil
}
fmt.Println("✉️ You'll now receive a 6 character pin by email. It will be valid for 5 minutes.")
pin, err := term.GetUserPasswordInput("Please enter your pin:")
if err != nil {
return nil, fmt.Errorf("error prompting pin: %v", err)
}
return &verifyEmailRes{
hasAccount: res.HasAccount,
isLocalMode: false,
pin: pin,
}, nil
}
func signIn(email, pin, host string) error {
term.StartSpinner("")
res, apiErr := apiClient.SignIn(shared.SignInRequest{
Email: email,
Pin: pin,
}, host)
term.StopSpinner()
if apiErr != nil {View on GitHub (pinned to e2d772072e)
Solutions
- Run the command in an interactive terminal so the hidden password-style input works.
- Wait for the pin email (valid 5 minutes) before starting the prompt, or re-run to get a fresh pin.
- In Docker/CI, attach a TTY (docker run -it) or pre-authenticate interactively first.
- Re-run the auth flow if the prompt was aborted; the pin is re-requested on the next attempt.
Example fix
// before (no TTY) echo pin | plandex auth // after plandex auth # interactive prompt, enter pin when asked
Defensive patterns
Strategy: validation
Validate before calling
// require an interactive terminal before the hidden pin prompt
if stat, _ := os.Stdin.Stat(); stat == nil || (stat.Mode()&os.ModeCharDevice) == 0 {
return fmt.Errorf("pin prompt requires an interactive terminal")
} Try / catch
pin, err := term.GetUserPasswordInput("Please enter your pin:")
if err != nil {
return fmt.Errorf("pin entry aborted (%v); re-run auth in an interactive terminal and enter the pin within 5 minutes", err)
} Prevention
- Run sign-in in a real TTY; the pin input is a hidden password-style prompt.
- Wait for the pin email before starting the prompt — it is valid for only 5 minutes.
- In containers/CI, use -it or pre-authenticate interactively beforehand.
- Note local mode skips the pin prompt entirely; prefer it when running locally.
When it happens
Trigger: term.GetUserPasswordInput("Please enter your pin:") errors: stdin is not a TTY (CI/scripts), the user aborts the prompt, or input collection fails before the pin is sent to the server.
Common situations: Running the sign-in inside CI or a container without a TTY; piping input in ways the password prompt rejects; user hits Ctrl-C while waiting for the pin email to arrive.
Related errors
- error selecting sign in option: %v
- error confirming update and rebuild: %v
- error selecting or signing in to account: %v
- error prompting host: %v
- error prompting email: %v
AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05).
Data as JSON: /api/errors/143c5a34d00fb72c.
Report an issue: GitHub.