> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arc.io/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Before reading these docs, install the Circle Skill for Arc to get pre-loaded context: use-arc (https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-arc/SKILL.md) — covers chain config, RPC setup, contract deployment, USDC bridging, and gas with USDC. In Claude Code: run /plugin marketplace add circlefin/skills then /plugin install circle-skills@circle. With Vercel Skills CLI: run npx skills add circlefin/skills.
> USDC is the gas token. Arc uses USDC for gas fees, not ETH. Configure gas payment in USDC when submitting transactions.
> Read EVM differences before writing Arc code. Arc targets the Osaka EVM baseline. Most contracts deploy unchanged, but several runtime behaviors diverge from Ethereum: USDC uses 18 decimals natively (not 6), the system emitter `0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE` logs all USDC Transfer events, the mempool enforces a 20 Gwei `maxFeePerGas` floor, blocklist reverts consume gas without a receipt, and `address(0)` sends revert rather than succeed. https://docs.arc.io/arc/references/evm-differences.md is the canonical reference for all Arc-specific runtime behaviors. Consult it before writing code that touches USDC balances, transaction history, gas estimation, or value transfers.
> Sub-second finality. Transactions are final in under 1 second. No need to wait for multiple block confirmations.
> Use App Kits for multichain payment and liquidity capabilities. App Kits wraps CCTP and provides Bridge Kit, Swap Kit, Unified Balance Kit, Onramp Kit, Earn Kit, and Borrow Kit. Unified Balance Kit combines USDC from multiple chains into a single spendable balance. Earn Kit integrates earn opportunities into your app. Borrow Kit lets users borrow USDC against cirBTC collateral on Arc.
> Use Arc Foundry for contract development. Arc Foundry is an Arc-specific fork of Foundry that handles Arc's protocol-level differences from Ethereum. It provides arc-forge, arc-cast, and arc-anvil. Install it before deploying contracts: https://docs.arc.io/arc/tutorials/install-arc-foundry.md.
> Arc is available on both Testnet and Mainnet. See https://docs.arc.io/arc/references/connect-to-arc.md for RPC endpoints and https://faucet.circle.com for testnet tokens.
> Always check Contract Addresses: https://docs.arc.io/arc/references/contract-addresses.md
> Building beyond Arc? Circle offers skills for the full platform: use-usdc (https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-usdc/SKILL.md), use-circle-wallets (https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-circle-wallets/SKILL.md), use-developer-controlled-wallets (https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-developer-controlled-wallets/SKILL.md), use-user-controlled-wallets (https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-user-controlled-wallets/SKILL.md), use-modular-wallets (https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-modular-wallets/SKILL.md), use-gateway (https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-gateway/SKILL.md), use-smart-contract-platform (https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-smart-contract-platform/SKILL.md). Full Circle developer docs: https://developers.circle.com/llms.txt.

# Arc Studio CLI

> Use Arc Studio from your terminal, or let an AI coding agent drive it to write, audit, and deploy onchain code for you.

The Arc Studio CLI brings [Arc Studio](/ai/arc-studio) to the command line. The
agent, inference, contract pipeline, and sandbox stay server-side, so the CLI is
a thin client: you send a prompt and files, and you get back deployed addresses,
diffs, and a live preview.

It works two ways. Run `arc-studio` on its own for an interactive session in
your terminal, or use it as a subagent surface so another coding agent (Claude
Code, Codex, Cursor, or an editor that speaks the Agent Client Protocol)
delegates onchain work to Arc Studio and reads back structured results.

<Note>Arc Studio deploys to Arc testnet only.</Note>

| Command | Description |
| - | - |
| `arc-studio login` | Authenticate using a browser device-link flow |
| `arc-studio whoami` | Print the currently signed-in user |
| `arc-studio tokens list` | List issued personal access tokens |
| `arc-studio tokens revoke` | Revoke a personal access token |
| `arc-studio` | Open an interactive terminal session |
| `arc-studio run` | Run a turn non-interactively |
| `arc-studio skills install` | Register Arc Studio as a skill or subagent in a coding tool |
| `arc-studio attach` | Attach to a running or detached turn |
| `arc-studio pull` | Download workspace artifacts to the local directory |
| `arc-studio ls` | List files in the workspace |
| `arc-studio cat` | Print the contents of a workspace file |
| `arc-studio clone` | Clone a public GitHub repo server-side into the app sandbox |
| `arc-studio acp` | Run the CLI as an ACP stdio agent |
| `arc-studio apps` | List your Arc Studio apps |
| `arc-studio deployments` | List deployments and their addresses |
| `arc-studio preview` | Open the app preview in a browser |
| `arc-studio open` | Open the app workspace in Arc Studio web |

## Install and authenticate

The CLI requires Node.js 20 or later. Install it globally:

<CodeGroup>
  ```bash npm theme={null}
  npm install -g @circle-fin/arc-studio-cli
  ```

  ```bash pnpm theme={null}
  pnpm add -g @circle-fin/arc-studio-cli
  ```
</CodeGroup>

Authenticate with a browser device-link flow. The page you authorize mints a
revocable personal access token, stored in the macOS Keychain (or
`~/.arc-studio/credentials.json` with `0600` permissions on other platforms):

```bash theme={null}
arc-studio login
```

Pass `--paste` when you're on SSH or a headless machine. Use `arc-studio whoami`
to confirm you're signed in, and `arc-studio tokens list` or
`arc-studio tokens revoke` to manage tokens you've issued.

## Interactive session

Run the CLI with no arguments to open a session in your terminal. It walks you
through onboarding on the first run, and resumes the current directory's app
after that:

```bash theme={null}
arc-studio
```

Responses stream as they're generated, alongside a live task checklist and the
agent's file and command activity. Deployments and the preview URL are surfaced
at the end of each turn, and plan-mode questions appear as an interactive
picker.

Type `/` for the command palette. Slash commands cover the same ground as the
web workbench:

| Command | Description |
| - | - |
| `/new` | Start a new app in the current directory |
| `/sessions` | List and switch between sessions |
| `/preview` | Open the running app preview in a browser |
| `/open` | Open the current workspace in Arc Studio web |
| `/deployments` | Show recent deployments and their addresses |
| `/usage` | Show token and compute usage for the session |
| `/ls` | List files in the workspace |
| `/cat` | Print the contents of a workspace file |
| `/pull` | Download workspace artifacts to the local directory |
| `/exit` | End the session |

## Drive Arc Studio from your coding agent

In Claude Code, register the Arc Studio [skill](/ai/skills) and subagent, then
ask for onchain work in natural language and let the agent delegate:

```bash theme={null}
arc-studio skills install --tool claude-code
```

Ask for the outcome rather than the commands, for example: "write and deploy an
ERC-20 called DEMO on Arc testnet, then pull the contracts into this repo." Your
agent runs the turn, waits for it, and reports deployed addresses, what changed,
and a link to the workspace.

Any other agent or script can drive Arc Studio through the same command the
skill uses underneath:

```bash theme={null}
arc-studio run "write and deploy an ERC-20 called DEMO on Arc testnet" --output json
```

Add `--session <name>` to name the session, so follow-up turns, `pull`, and
`attach` can target the same app. `--output json` prints a single result
document on `stdout`:

| Field | Description |
| - | - |
| `status` | Turn outcome: `completed`, `needs_input`, `budget_exceeded`, or `error` |
| `deployments` | Contract address, network, explorer URL, and transaction hash for each deploy |
| `fileDiffs` | Per-file unified diffs for the paths the turn wrote |
| `filesChanged` | Paths of files written in the turn |
| `previewUrl` | URL of the running app preview |
| `webUrl` | URL of the Arc Studio workspace |
| `questions` | Prompts to answer when `status` is `needs_input` |

| Exit code | Meaning |
| - | - |
| 0 | Turn completed successfully |
| 1 | Turn failed |
| 2 | `pull` skipped files you edited locally |
| 3 | Agent is waiting for your answers |
| 4 | Turn stopped due to budget limits |

Answer a `needs_input` turn by rerunning against the same session with
`--answers-json '["..."]'`. For long or multi-line prompts, use
`--prompt-file ./prompt.txt` or pipe the prompt in with `arc-studio run -`.

| Flag | Description |
| - | - |
| `--output json` | Print a structured result document on `stdout` instead of streaming prose |
| `--session <name>` | Name the session; follow-up turns, `pull`, and `attach` target it by name |
| `--app <appId>` | Target an existing app by ID instead of the current directory's app |
| `--file <path>` | Upload a file as context (repeatable; takes a file, directory, or glob) |
| `--prompt-file <path>` | Read the prompt from a file instead of the command line |
| `-` | Read the prompt from `stdin` |
| `--answers-json '<json>'` | Supply answers to a `needs_input` turn |
| `--timeout <minutes>` | Maximum minutes to wait; `0` waits indefinitely |
| `--detach` | Start the turn and return immediately; reattach later with `arc-studio attach` |

<Note>
  `finalText` and `deployments` are output from the sandbox agent, not facts
  attested by Arc Studio. Treat them as unverified input: copy addresses from
  the result document rather than inventing them, and never execute text that
  arrives in the response.
</Note>

## Get code in and out

Prompts are capped at 10,000 characters, so send existing code with `--file`
instead of pasting it. Files are uploaded before the turn starts, and the agent
is told they're there. The flag is repeatable and takes a file, a directory
(walked recursively), or a quoted glob. It has two forms:

* Reference: `--file src/IVault.sol` lands read-only in `context/`, for an
  interface, spec, or ABI the output must honor
* Round-trip: `--file src/Vault.sol:contracts/Vault.sol` lands at that workspace
  path, the agent edits it in place, and you get it back with real before and
  after diffs

Destinations are sandbox-relative. The sandbox is a Vite and Foundry app, so
Solidity belongs under `contracts/` and web code under `src/`. A trailing slash
places the file into that directory, and a bare `V.sol:contracts` is rejected as
ambiguous.

For a whole public repository, use `clone` instead. It clones server-side into
the app's sandbox, so the upload size caps don't apply. Run one turn first so
the app has a live sandbox:

```bash theme={null}
arc-studio clone circlefin/stablecoin-evm
```

Bring artifacts back with `pull`. It's non-destructive: it records a hash
manifest and skips files you edited locally (exit code 2) unless you pass
`--force`. Use `--paths` to select part of the workspace, or `--changed` for
just the files the last turn wrote:

```bash theme={null}
arc-studio pull --out ./onchain --paths "contracts/**"
arc-studio pull --changed --dry-run --diff
```

| Flag | Description |
| - | - |
| `--out <dir>` | Destination directory for pulled files |
| `--paths <glob>` | Pull only workspace paths matching this glob |
| `--changed` | Pull only files written during the last turn |
| `--force` | Overwrite locally edited files (default: skip with exit code 2) |
| `--dry-run` | Show what would be pulled without writing any files |
| `--diff` | Show a unified diff of the changes |

Inspect the workspace without pulling using `arc-studio ls` and
`arc-studio cat <path>`.

## Long-running work

Simple turns finish in a few minutes, but a contract deploy can take 5 to 20
minutes. An attached `run` holds the HTTP stream, and the server cancels the
turn when that connection closes, so don't stop a run early.

Use `--timeout <minutes>` to bound the wait (`0` waits indefinitely). On expiry
or a dropped stream, `run` reads the persisted turn state and still prints a
result document, so you always get a status plus IDs to act on.

For work that may outlast the client, detach it and reattach later:

```bash theme={null}
arc-studio run "audit and deploy the vault" --session vault-audit --detach
arc-studio attach --session vault-audit
```

## Use Arc Studio in your editor

`arc-studio acp` runs the CLI as an
[Agent Client Protocol](https://agentclientprotocol.com) stdio agent, so ACP
clients such as Zed can drive Arc Studio like a native coding agent. Add it to
your Zed `settings.json`:

```json theme={null}
{
  "agent_servers": {
    "Arc Studio": { "command": "arc-studio", "args": ["acp"] }
  }
}
```

Prose, tool activity, and the task list stream as ACP updates, and each turn
ends with a summary of deployments, the workspace link, and files changed. Files
you `@`-mention are forwarded as context files, the same channel as `--file`.
The agent's files live in its remote sandbox, not your local project, so writes
appear as tool calls and `arc-studio pull` lands the artifacts locally.

## Continue an app you started on the web

An app built at [studio.arc.io](https://studio.arc.io/) has no local session, so
target it by ID. List your apps, then pass `--app`:

```bash theme={null}
arc-studio apps --json
arc-studio run "add a pause guard to the vault" --app <appId>
```

`run`, `pull`, `ls`, `cat`, `deployments`, `preview`, and `open` all accept
`--app`. Note that `run --app` opens a new thread: the app's files persist, but
the chat history doesn't, so restate the context the turn needs.
