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

  1. 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)