paperclipai/paperclip · error · Error
`paperclipai connect` is interactive. For scripts, pass…
Error message
`paperclipai connect` is interactive. For scripts, pass --api-base/--api-key or use context set/token commands.
What it means
connectWizard requires a TTY for its prompts; when run without the non-interactive flag组合 (no --api-base/--api-key) it aborts because the wizard cannot prompt in a script context.
Solutions
- In scripts, pass --api-base/--api-key or configure the context with `paperclipai context set` / token commands.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at cli/src/commands/client/connect.ts:58 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@120ae5428f (2026-08-18).
Data as JSON: /api/errors/1181743c3b07ef49.
Report an issue: GitHub.
Appendix: source
Thrown at cli/src/commands/client/connect.ts:58
.command("connect")
.description("Interactively connect the CLI as a board operator or agent")
.option("--persona <persona>", "Persona to configure: board or agent")
.option("--api-key-env-var-name <name>", "Env var name to store in the profile", "PAPERCLIP_API_KEY")
.option("--token-name <name>", "Token label to create")
.action(async (opts: ConnectOptions) => {
try {
const result = await connectWizard(opts);
printOutput(result, { json: opts.json });
} catch (err) {
handleCommandError(err);
}
}),
);
}
async function connectWizard(opts: ConnectOptions) {
if (!process.stdin.isTTY || !process.stdout.isTTY) {
throw new Error("`paperclipai connect` is interactive. For scripts, pass --api-base/--api-key or use context set/token commands.");
}
p.intro(pc.bgCyan(pc.black(" paperclipai connect ")));
const context = readContext(opts.context);
const resolvedProfile = resolveProfile(context, opts.profile);
const initialApiBase = resolveApiBase(opts, resolvedProfile.profile);
const apiBaseInput = await p.text({
message: "Paperclip API base",
initialValue: initialApiBase,
placeholder: "http://localhost:3100",
});
assertNotCancelled(apiBaseInput);
const apiBase = normalizeApiBase(String(apiBaseInput || initialApiBase));
console.log(pc.dim(`Checking ${apiBase}/api/health ...`));
await verifyHealth(apiBase);
const boardLogin = await loginBoardCli({View on GitHub (pinned to 120ae5428f)