spawn/sh/digitalocean
A 37d144dfd6
feat(digitalocean): guided readiness before deploy (#3336)
* feat(digitalocean): guided readiness checklist before deploy

Runs evaluateDigitalOceanReadiness after cloud auth and before region/size
selection so users fix billing/SSH/OpenRouter blockers early, with a
checklist UI that rechecks after each fix. Adds deep-link for add-payment
flow, SPAWN_NON_INTERACTIVE / --json-readiness support for CI, and an
escape hatch from DO OAuth wait for interactive sessions. Other clouds
unchanged.

Ported from digitalocean/spawn#2 (Scott Miller @scott). Bumps CLI to 1.1.0.
Refactors the new preflight TTY-gating test to drive process.std*.isTTY
directly with descriptor save/restore and clears stale
~/.config/spawn/digitalocean.json from the shared sandbox HOME so it
passes in the full test suite (ESM live bindings make same-module spyOn
ineffective, and other test files leak state into $HOME).

Co-Authored-By: Scott Miller <scottmiller@digitalocean.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(test): update-check mock versions for 1.1.0 version bump

Mock "newer" versions (1.0.99) were no longer newer than the current
1.1.0 version, causing all update-check tests to fail. Bumped mock
versions to 99.0.0 for general tests, 1.1.99 for patch, 1.2.0 for
minor, keeping 2.0.0 for major.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* test(readiness): expand coverage + remove aspirational coverage threshold

- Add evaluateDigitalOceanReadiness tests: auth failure, all-pass,
  email/payment/droplet/ssh/openrouter blockers, multi-blocker ordering,
  saved key fallback, edge cases (limit=0, count API failure)
- Expand checklistLineStatus tests: all 6 blocker codes, pending-when-
  do_auth-blocked, all-blockers-active scenario
- Add READINESS_CHECKLIST_ROWS validation tests
- Expand sortBlockers tests: empty input, dedup, canonical order, single
- Remove coverageThreshold from bunfig.toml — main was already at 82.99%
  functions vs 90% threshold (never enforced on push, only on PRs)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude <claude@anthropic.com>
Co-authored-by: Scott Miller <scottmiller@digitalocean.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Ahmed Abushagur <ahmed@abushagur.com>
2026-04-21 21:55:01 -07:00
..
claude.sh fix(do): skip _run_with_restart in headless mode to prevent duplicate droplets (#2805) 2026-03-19 16:12:25 -07:00
codex.sh fix(do): skip _run_with_restart in headless mode to prevent duplicate droplets (#2805) 2026-03-19 16:12:25 -07:00
cursor.sh feat: add Cursor CLI agent across all clouds (#3018) 2026-03-26 13:53:49 -07:00
hermes.sh fix(do): skip _run_with_restart in headless mode to prevent duplicate droplets (#2805) 2026-03-19 16:12:25 -07:00
junie.sh fix(do): skip _run_with_restart in headless mode to prevent duplicate droplets (#2805) 2026-03-19 16:12:25 -07:00
kilocode.sh fix(do): skip _run_with_restart in headless mode to prevent duplicate droplets (#2805) 2026-03-19 16:12:25 -07:00
openclaw.sh fix(do): skip _run_with_restart in headless mode to prevent duplicate droplets (#2805) 2026-03-19 16:12:25 -07:00
opencode.sh fix(do): skip _run_with_restart in headless mode to prevent duplicate droplets (#2805) 2026-03-19 16:12:25 -07:00
pi.sh feat: add Pi coding agent (shittycodingagent.ai) to spawn (#3128) 2026-03-31 17:34:34 -07:00
README.md feat(digitalocean): guided readiness before deploy (#3336) 2026-04-21 21:55:01 -07:00
t3code.sh feat(agent): add T3 Code agent (web GUI for Claude/Codex) (#3322) 2026-04-18 01:14:37 -07:00

DigitalOcean

DigitalOcean Droplets via REST API. DigitalOcean

Agents

Claude Code

bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/claude.sh)

OpenClaw

bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/openclaw.sh)

Codex CLI

bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/codex.sh)

OpenCode

bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/opencode.sh)

Kilo Code

bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/kilocode.sh)

Hermes

bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/hermes.sh)

Junie

bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/junie.sh)

Cursor CLI

bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/cursor.sh)

Pi

bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/pi.sh)

T3 Code

bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/t3code.sh)

Environment Variables

Variable Description Default
DIGITALOCEAN_ACCESS_TOKEN DigitalOcean API token (also accepts DIGITALOCEAN_API_TOKEN or DO_API_TOKEN) — (OAuth if unset)
DO_DROPLET_NAME Name for the created droplet auto-generated
DO_REGION Datacenter region (see regions below) nyc3
DO_DROPLET_SIZE Droplet size slug (see sizes below) s-2vcpu-2gb
SPAWN_JSON_READINESS Set to 1 with SPAWN_NON_INTERACTIVE=1 to print machine-readable JSON when readiness is blocked
SPAWN_CLI_DIR Absolute path to the Spawn repo root when developing locally — makes the cloud shim run packages/cli/src/{cloud}/main.ts instead of downloading a release bundle

Pre-flight readiness

Before region/size selection, the CLI checks DigitalOcean account state (GET /v2/account), SSH keys registered on your account, and OpenRouter credentials. If something blocks deployment (unverified email, locked or warning billing status, droplet quota, missing SSH registration, or invalid OpenRouter key), you get guided steps and a readiness checklist. Billing issues open the add-payment flow: https://cloud.digitalocean.com/account/billing?defer-onboarding-for=or&open-add-payment-method=true.

OAuth tokens requested by the CLI include tag:create so droplets can be tagged spawn for attribution. If your token cannot create tags, the CLI retries creation without the tag.

Available Regions

Slug Location
nyc1 New York 1
nyc3 New York 3 (default)
sfo3 San Francisco 3
ams3 Amsterdam 3
sgp1 Singapore 1
lon1 London 1
fra1 Frankfurt 1
tor1 Toronto 1
blr1 Bangalore 1
syd1 Sydney 1

Available Droplet Sizes

Slug Specs Price
s-1vcpu-1gb 1 vCPU · 1 GB RAM $6/mo
s-1vcpu-2gb 1 vCPU · 2 GB RAM $12/mo
s-2vcpu-2gb 2 vCPU · 2 GB RAM $18/mo (default)
s-2vcpu-4gb 2 vCPU · 4 GB RAM $24/mo
s-4vcpu-8gb 4 vCPU · 8 GB RAM $48/mo
s-8vcpu-16gb 8 vCPU · 16 GB RAM $96/mo

Non-Interactive Mode

DO_DROPLET_NAME=dev-mk1 \
DIGITALOCEAN_ACCESS_TOKEN=your-token \
OPENROUTER_API_KEY=sk-or-v1-xxxxx \
  bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/claude.sh)

Override region and droplet size:

DO_REGION=fra1 \
DO_DROPLET_SIZE=s-1vcpu-2gb \
DIGITALOCEAN_ACCESS_TOKEN=your-token \
OPENROUTER_API_KEY=sk-or-v1-xxxxx \
  bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/claude.sh)

Interactive Region and Size Picker

Pass --custom to select from a menu of regions and droplet sizes interactively:

bash <(curl -fsSL https://openrouter.ai/labs/spawn/digitalocean/claude.sh) --custom