#!/usr/bin/env bash set -euo pipefail # Register a Claude subscription OAuth token with OneCLI — the *only* auth # path that needs a TTY break in the flow. Paste-based paths (existing # OAuth token / API key) are handled in-process by setup/auto.ts using # clack prompts, then onecli secrets create is invoked directly from TS. # # Flow: # 1. Run `claude setup-token` under a PTY (via script(1)) so the browser # OAuth dance works and its token is captured into a tempfile. # 2. Regex the sk-ant-oat…AA token out of the ANSI-stripped capture. # 3. Register it with OneCLI. # # Env overrides: # SECRET_NAME OneCLI secret name (default: Anthropic) # HOST_PATTERN OneCLI host pattern (default: api.anthropic.com) # Prefer bash 4+ (for `read -e -i` readline preload). macOS ships 3.2 in # /bin/bash, but Homebrew users usually have 5.x first on PATH. The # readline preload is optional — on 3.x we fall back to a plain prompt. SECRET_NAME="${SECRET_NAME:-Anthropic}" HOST_PATTERN="${HOST_PATTERN:-api.anthropic.com}" command -v onecli >/dev/null \ || { echo "onecli not found. Install it first (see /setup §4)." >&2; exit 1; } command -v claude >/dev/null \ || { echo "claude CLI not found. Install from https://claude.ai/download" >&2; exit 1; } command -v script >/dev/null \ || { echo "script(1) is required for PTY capture." >&2; exit 1; } tmpfile=$(mktemp -t claude-setup-token.XXXXXX) trap 'rm -f "$tmpfile"' EXIT cat <<'EOF' A browser window will open for you to sign in with your Claude account. When you finish, we'll save the token to your OneCLI vault automatically. Press Enter to continue, or edit the command first. EOF cmd="claude setup-token" if [ "${BASH_VERSINFO[0]:-0}" -ge 4 ]; then # bash 4+: pre-fill the readline buffer so Enter literally submits. read -r -e -i "$cmd" -p "$ " cmd /dev/null | grep -q util-linux; then script -q -c "$cmd" "$tmpfile" else # BSD script: command is argv after the file, so let it word-split. # shellcheck disable=SC2086 script -q "$tmpfile" $cmd fi # Strip ANSI codes + newlines (TTY wraps the token mid-string), then match # the sk-ant-oat…AA token. perl because BSD grep caps {n,m} at 255. token=$(sed $'s/\x1b\\[[0-9;]*[a-zA-Z]//g' "$tmpfile" \ | tr -d '\n\r' \ | perl -ne 'print "$1\n" while /(sk-ant-oat[A-Za-z0-9_-]{80,500}AA)/g' \ | tail -1 || true) if [ -z "$token" ]; then keep=$(mktemp -t claude-setup-token-log.XXXXXX) cp "$tmpfile" "$keep" echo >&2 echo "No sk-ant-oat…AA token found. Raw log: $keep" >&2 exit 1 fi echo echo "Got token: ${token:0:16}…${token: -4}" echo "Saving it to your OneCLI vault as '${SECRET_NAME}' (host: ${HOST_PATTERN})…" onecli secrets create \ --name "$SECRET_NAME" \ --type anthropic \ --value "$token" \ --host-pattern "$HOST_PATTERN" echo "Done."