Let AI agents complete setup wizards, OAuth flows, and interactive installers autonomously.
How it works
Just prefix your command with noninteractive. It launches a detached daemon that runs it inside a real pseudo-terminal. The child process sees isTTY=true — ANSI colors, select menus, and raw terminal mode all work.
The daemon listens on a socket at ~/.noninteractive/sessions/<name>.sock. No ports, no HTTP — just fast, local IPC with JSON messages.
The agent sends keystrokes with --wait and blocks until new output appears. No polling loops — one call per interaction. It completes the entire flow autonomously.
Built for agents
Go-based PTY bridge allocates a real pseudo-terminal. Programs that check isTTY, render @clack/prompts menus, or use raw mode all work correctly. Output is returned as clean text with ANSI codes stripped — ready for agents to parse.
No native deps, no Python, no Docker. Just npx noninteractive and it works. Ships cross-compiled binaries for macOS and Linux.
WorkOS, Vercel, Supabase, Stripe — any CLI that uses interactive prompts. If it runs in a terminal, noninteractive can drive it.
Sessions persist as background daemons. Start a flow, read it later, send input when ready. The process keeps running even if the agent disconnects.
| <tool> [args] | Start a session — runs npx <tool> in a background PTY |
| send <session> <text> --wait | Send keystrokes and wait for new output — one call instead of polling |
| read <session> --wait | Block until new output appears (for OAuth flows, long operations) |
| stop <session> | Stop a running session |
Every devtool has a getting-started flow. Most of them are interactive. If an AI agent can't navigate your setup wizard, it can't use your product.
As agents become first-class users of developer tools, the gap between "has a CLI" and "works with agents" is just a PTY bridge away. noninteractive closes that gap.
Agent Skill
noninteractive ships with an Agent Skill — a SKILL.md file that gives AI agents the knowledge to use it correctly. No more guessing about commands or confusing it with built-in flags.