feat: reorder agents and remove NanoClaw (#1477)

* feat: add ZeroClaw agent (14.9k stars, native OpenRouter support)

Add ZeroClaw — a Rust-based autonomous AI assistant framework by
Harvard/MIT/Sundai.Club communities — across all 8 clouds.

Scripts: local, hetzner, digitalocean, fly, aws, gcp, daytona, sprite
Install: bootstrap.sh with --install-rust + --install-system-deps
Config:  zeroclaw onboard --provider openrouter (via agent_configure)
Env:     OPENROUTER_API_KEY + ZEROCLAW_PROVIDER=openrouter (native support)
Launch:  zeroclaw agent

Note: ZeroClaw compiles from Rust source (~5-10 min build time).
A build-time warning is shown to set expectations.

Also update test/mock-curl-script.sh to stub zeroclaw install URLs and
add zeroclaw to mock agent binaries in test/mock.sh.

Bump CLI version 0.5.8 → 0.5.9.

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

* feat: reorder agents and remove NanoClaw

New agent order: claude → openclaw → zeroclaw → codex → opencode → kilocode

- Remove NanoClaw (8 scripts + manifest entry + matrix entries + README row)
- Reorder manifest.json agents section to match new order
- Reorder matrix entries by cloud (local/hetzner/fly/aws/daytona/digitalocean/gcp/sprite)
  with agents in new order within each cloud block
- Update README matrix table row order
- Update test/mock.sh mock agent binary list to match
- Bump CLI version 0.5.9 → 0.5.10

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

---------

Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
L 2026-02-19 14:39:03 -05:00 committed by GitHub
parent f7458952b0
commit a67d83ed38
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 360 additions and 406 deletions

View file

@ -164,7 +164,7 @@ If an agent fails to install or launch on a cloud:
|---|---|---|---|---|---|---|---|---|
| [**Claude Code**](https://claude.ai) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| [**OpenClaw**](https://github.com/OpenRouterTeam/openclaw) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| [**NanoClaw**](https://github.com/gavrielc/nanoclaw) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| [**ZeroClaw**](https://github.com/zeroclaw-labs/zeroclaw) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| [**Codex CLI**](https://github.com/openai/codex) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| [**OpenCode**](https://github.com/opencode-ai/opencode) | | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| [**Kilo Code**](https://github.com/Kilo-Org/kilocode) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |

View file

@ -1,38 +0,0 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
# shellcheck source=aws/lib/common.sh
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/aws/lib/common.sh)"
fi
log_info "NanoClaw on AWS Lightsail"
echo ""
agent_install() {
log_step "Installing Docker (required by NanoClaw on Linux)..."
cloud_run "command -v docker >/dev/null || (curl -fsSL https://get.docker.com | sudo sh && sudo usermod -aG docker \$(whoami))"
log_step "Installing tsx..."
cloud_run "source ~/.bashrc && bun install -g tsx"
log_step "Cloning and building nanoclaw..."
cloud_run "git clone https://github.com/gavrielc/nanoclaw.git ~/nanoclaw && cd ~/nanoclaw && npm install && npm run build"
log_info "NanoClaw installed"
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_BASE_URL=https://openrouter.ai/api"
}
agent_configure() {
local dotenv_content
dotenv_content=$(printf 'ANTHROPIC_API_KEY=%s\nANTHROPIC_BASE_URL=https://openrouter.ai/api\n' "${OPENROUTER_API_KEY}")
upload_config_file cloud_upload cloud_run "${dotenv_content}" "\$HOME/nanoclaw/.env"
}
agent_launch_cmd() { echo 'cd ~/nanoclaw && source ~/.zshrc && npm run dev'; }
spawn_agent "NanoClaw"

37
aws/zeroclaw.sh Normal file
View file

@ -0,0 +1,37 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/aws/lib/common.sh)"
fi
log_info "ZeroClaw on AWS Lightsail"
echo ""
log_warn "Note: ZeroClaw is built from Rust source and may take 5-10 minutes to compile."
echo ""
agent_install() {
install_agent "ZeroClaw" \
"curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/main/scripts/install.sh | bash -s -- --install-rust --install-system-deps" \
cloud_run
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ZEROCLAW_PROVIDER=openrouter"
}
agent_configure() {
cloud_run 'source ~/.spawnrc 2>/dev/null; export PATH="$HOME/.cargo/bin:$PATH"; zeroclaw onboard --api-key "${OPENROUTER_API_KEY}" --provider openrouter'
}
agent_launch_cmd() {
echo 'source ~/.cargo/env 2>/dev/null; source ~/.spawnrc 2>/dev/null; zeroclaw agent'
}
spawn_agent "ZeroClaw"

View file

@ -1,6 +1,6 @@
{
"name": "@openrouter/spawn",
"version": "0.5.8",
"version": "0.5.10",
"type": "module",
"bin": {
"spawn": "cli.js"

View file

@ -1,47 +0,0 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/daytona/lib/common.sh)"
fi
log_info "NanoClaw on Daytona"
echo ""
agent_install() {
log_step "Installing Docker (required by NanoClaw on Linux)..."
cloud_run "command -v docker >/dev/null || (curl -fsSL https://get.docker.com | sudo sh && sudo usermod -aG docker \$(whoami))"
log_step "Installing tsx..."
cloud_run "source ~/.bashrc && bun install -g tsx"
log_step "Cloning and building nanoclaw..."
cloud_run "git clone https://github.com/gavrielc/nanoclaw.git ~/nanoclaw && cd ~/nanoclaw && npm install && npm run build"
log_info "NanoClaw installed"
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_BASE_URL=https://openrouter.ai/api"
}
agent_configure() {
local dotenv_content
dotenv_content=$(printf 'ANTHROPIC_API_KEY=%s\nANTHROPIC_BASE_URL=https://openrouter.ai/api\n' "${OPENROUTER_API_KEY}")
upload_config_file cloud_upload cloud_run "${dotenv_content}" "\$HOME/nanoclaw/.env"
}
agent_launch_cmd() {
echo 'cd ~/nanoclaw && source ~/.zshrc && npm run dev'
}
agent_pre_launch() {
log_info "You will need to scan a WhatsApp QR code to authenticate."
echo ""
}
spawn_agent "NanoClaw"

37
daytona/zeroclaw.sh Normal file
View file

@ -0,0 +1,37 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/daytona/lib/common.sh)"
fi
log_info "ZeroClaw on Daytona"
echo ""
log_warn "Note: ZeroClaw is built from Rust source and may take 5-10 minutes to compile."
echo ""
agent_install() {
install_agent "ZeroClaw" \
"curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/main/scripts/install.sh | bash -s -- --install-rust --install-system-deps" \
cloud_run
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ZEROCLAW_PROVIDER=openrouter"
}
agent_configure() {
cloud_run 'source ~/.spawnrc 2>/dev/null; export PATH="$HOME/.cargo/bin:$PATH"; zeroclaw onboard --api-key "${OPENROUTER_API_KEY}" --provider openrouter'
}
agent_launch_cmd() {
echo 'source ~/.cargo/env 2>/dev/null; source ~/.spawnrc 2>/dev/null; zeroclaw agent'
}
spawn_agent "ZeroClaw"

View file

@ -1,38 +0,0 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
# shellcheck source=digitalocean/lib/common.sh
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/digitalocean/lib/common.sh)"
fi
log_info "NanoClaw on DigitalOcean"
echo ""
agent_install() {
log_step "Installing Docker (required by NanoClaw on Linux)..."
cloud_run "command -v docker >/dev/null || (curl -fsSL https://get.docker.com | sh)"
log_step "Installing tsx..."
cloud_run "source ~/.bashrc && bun install -g tsx"
log_step "Cloning and building nanoclaw..."
cloud_run "git clone https://github.com/gavrielc/nanoclaw.git ~/nanoclaw && cd ~/nanoclaw && npm install && npm run build"
log_info "NanoClaw installed"
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_BASE_URL=https://openrouter.ai/api"
}
agent_configure() {
local dotenv_content
dotenv_content=$(printf 'ANTHROPIC_API_KEY=%s\nANTHROPIC_BASE_URL=https://openrouter.ai/api\n' "${OPENROUTER_API_KEY}")
upload_config_file cloud_upload cloud_run "${dotenv_content}" "\$HOME/nanoclaw/.env"
}
agent_launch_cmd() { echo 'cd ~/nanoclaw && source ~/.zshrc && npm run dev'; }
spawn_agent "NanoClaw"

37
digitalocean/zeroclaw.sh Normal file
View file

@ -0,0 +1,37 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/digitalocean/lib/common.sh)"
fi
log_info "ZeroClaw on DigitalOcean"
echo ""
log_warn "Note: ZeroClaw is built from Rust source and may take 5-10 minutes to compile."
echo ""
agent_install() {
install_agent "ZeroClaw" \
"curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/main/scripts/install.sh | bash -s -- --install-rust --install-system-deps" \
cloud_run
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ZEROCLAW_PROVIDER=openrouter"
}
agent_configure() {
cloud_run 'source ~/.spawnrc 2>/dev/null; export PATH="$HOME/.cargo/bin:$PATH"; zeroclaw onboard --api-key "${OPENROUTER_API_KEY}" --provider openrouter'
}
agent_launch_cmd() {
echo 'source ~/.cargo/env 2>/dev/null; source ~/.spawnrc 2>/dev/null; zeroclaw agent'
}
spawn_agent "ZeroClaw"

View file

@ -1,47 +0,0 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
if [[ -f "$SCRIPT_DIR/lib/common.sh" ]]; then
source "$SCRIPT_DIR/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/fly/lib/common.sh)"
fi
log_info "NanoClaw on Fly.io"
echo ""
agent_install() {
log_step "Installing Docker (required by NanoClaw on Linux)..."
cloud_run "command -v docker >/dev/null || (curl -fsSL https://get.docker.com | sh)"
log_step "Installing tsx..."
cloud_run "source ~/.bashrc && bun install -g tsx"
log_step "Cloning and building nanoclaw..."
cloud_run "git clone https://github.com/gavrielc/nanoclaw.git ~/nanoclaw && cd ~/nanoclaw && npm install && npm run build"
log_info "NanoClaw installed"
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_BASE_URL=https://openrouter.ai/api"
}
agent_configure() {
local dotenv_content
dotenv_content=$(printf 'ANTHROPIC_API_KEY=%s\nANTHROPIC_BASE_URL=https://openrouter.ai/api\n' "${OPENROUTER_API_KEY}")
upload_config_file cloud_upload cloud_run "${dotenv_content}" "\$HOME/nanoclaw/.env"
}
agent_launch_cmd() {
echo 'cd ~/nanoclaw && source ~/.zshrc && npm run dev'
}
agent_pre_launch() {
log_info "You will need to scan a WhatsApp QR code to authenticate."
echo ""
}
spawn_agent "NanoClaw"

37
fly/zeroclaw.sh Normal file
View file

@ -0,0 +1,37 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
if [[ -f "$SCRIPT_DIR/lib/common.sh" ]]; then
source "$SCRIPT_DIR/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/fly/lib/common.sh)"
fi
log_info "ZeroClaw on Fly.io"
echo ""
log_warn "Note: ZeroClaw is built from Rust source and may take 5-10 minutes to compile."
echo ""
agent_install() {
install_agent "ZeroClaw" \
"curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/main/scripts/install.sh | bash -s -- --install-rust --install-system-deps" \
cloud_run
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ZEROCLAW_PROVIDER=openrouter"
}
agent_configure() {
cloud_run 'source ~/.spawnrc 2>/dev/null; export PATH="$HOME/.cargo/bin:$PATH"; zeroclaw onboard --api-key "${OPENROUTER_API_KEY}" --provider openrouter'
}
agent_launch_cmd() {
echo 'source ~/.cargo/env 2>/dev/null; source ~/.spawnrc 2>/dev/null; zeroclaw agent'
}
spawn_agent "ZeroClaw"

View file

@ -1,38 +0,0 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
# shellcheck source=gcp/lib/common.sh
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/gcp/lib/common.sh)"
fi
log_info "NanoClaw on GCP Compute Engine"
echo ""
agent_install() {
log_step "Installing Docker (required by NanoClaw on Linux)..."
cloud_run "command -v docker >/dev/null || (curl -fsSL https://get.docker.com | sudo sh && sudo usermod -aG docker \$(whoami))"
log_step "Installing tsx..."
cloud_run "source ~/.bashrc && bun install -g tsx"
log_step "Cloning and building nanoclaw..."
cloud_run "git clone https://github.com/gavrielc/nanoclaw.git ~/nanoclaw && cd ~/nanoclaw && npm install && npm run build"
log_info "NanoClaw installed"
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_BASE_URL=https://openrouter.ai/api"
}
agent_configure() {
local dotenv_content
dotenv_content=$(printf 'ANTHROPIC_API_KEY=%s\nANTHROPIC_BASE_URL=https://openrouter.ai/api\n' "${OPENROUTER_API_KEY}")
upload_config_file cloud_upload cloud_run "${dotenv_content}" "\$HOME/nanoclaw/.env"
}
agent_launch_cmd() { echo 'cd ~/nanoclaw && source ~/.zshrc && npm run dev'; }
spawn_agent "NanoClaw"

37
gcp/zeroclaw.sh Normal file
View file

@ -0,0 +1,37 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/gcp/lib/common.sh)"
fi
log_info "ZeroClaw on GCP Compute Engine"
echo ""
log_warn "Note: ZeroClaw is built from Rust source and may take 5-10 minutes to compile."
echo ""
agent_install() {
install_agent "ZeroClaw" \
"curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/main/scripts/install.sh | bash -s -- --install-rust --install-system-deps" \
cloud_run
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ZEROCLAW_PROVIDER=openrouter"
}
agent_configure() {
cloud_run 'source ~/.spawnrc 2>/dev/null; export PATH="$HOME/.cargo/bin:$PATH"; zeroclaw onboard --api-key "${OPENROUTER_API_KEY}" --provider openrouter'
}
agent_launch_cmd() {
echo 'source ~/.cargo/env 2>/dev/null; source ~/.spawnrc 2>/dev/null; zeroclaw agent'
}
spawn_agent "ZeroClaw"

View file

@ -1,38 +0,0 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
# shellcheck source=hetzner/lib/common.sh
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/hetzner/lib/common.sh)"
fi
log_info "NanoClaw on Hetzner Cloud"
echo ""
agent_install() {
log_step "Installing Docker (required by NanoClaw on Linux)..."
cloud_run "command -v docker >/dev/null || (curl -fsSL https://get.docker.com | sh)"
log_step "Installing tsx..."
cloud_run "source ~/.bashrc && bun install -g tsx"
log_step "Cloning and building nanoclaw..."
cloud_run "git clone https://github.com/gavrielc/nanoclaw.git ~/nanoclaw && cd ~/nanoclaw && npm install && npm run build"
log_info "NanoClaw installed"
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_BASE_URL=https://openrouter.ai/api"
}
agent_configure() {
local dotenv_content
dotenv_content=$(printf 'ANTHROPIC_API_KEY=%s\nANTHROPIC_BASE_URL=https://openrouter.ai/api\n' "${OPENROUTER_API_KEY}")
upload_config_file cloud_upload cloud_run "${dotenv_content}" "\$HOME/nanoclaw/.env"
}
agent_launch_cmd() { echo 'cd ~/nanoclaw && source ~/.zshrc && npm run dev'; }
spawn_agent "NanoClaw"

38
hetzner/zeroclaw.sh Normal file
View file

@ -0,0 +1,38 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
# shellcheck source=hetzner/lib/common.sh
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/hetzner/lib/common.sh)"
fi
log_info "ZeroClaw on Hetzner Cloud"
echo ""
log_warn "Note: ZeroClaw is built from Rust source and may take 5-10 minutes to compile."
echo ""
agent_install() {
install_agent "ZeroClaw" \
"curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/main/scripts/install.sh | bash -s -- --install-rust --install-system-deps" \
cloud_run
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ZEROCLAW_PROVIDER=openrouter"
}
agent_configure() {
cloud_run 'source ~/.spawnrc 2>/dev/null; export PATH="$HOME/.cargo/bin:$PATH"; zeroclaw onboard --api-key "${OPENROUTER_API_KEY}" --provider openrouter'
}
agent_launch_cmd() {
echo 'source ~/.cargo/env 2>/dev/null; source ~/.spawnrc 2>/dev/null; zeroclaw agent'
}
spawn_agent "ZeroClaw"

View file

@ -1,45 +0,0 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/local/lib/common.sh)"
fi
log_info "NanoClaw on local machine"
echo ""
agent_install() {
log_step "Installing tsx..."
cloud_run "command -v bun &>/dev/null && bun install -g tsx || npm install -g tsx"
log_step "Cloning and building nanoclaw..."
cloud_run "test -d ~/nanoclaw || (git clone https://github.com/gavrielc/nanoclaw.git ~/nanoclaw && cd ~/nanoclaw && npm install && npm run build)"
log_info "NanoClaw installed"
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_BASE_URL=https://openrouter.ai/api"
}
agent_configure() {
local dotenv_content
dotenv_content=$(printf 'ANTHROPIC_API_KEY=%s\nANTHROPIC_BASE_URL=https://openrouter.ai/api\n' "${OPENROUTER_API_KEY}")
upload_config_file cloud_upload cloud_run "${dotenv_content}" "\$HOME/nanoclaw/.env"
}
agent_launch_cmd() {
echo 'cd ~/nanoclaw && source ~/.zshrc 2>/dev/null; npm run dev'
}
agent_pre_launch() {
log_info "You will need to scan a WhatsApp QR code to authenticate."
echo ""
}
spawn_agent "NanoClaw"

42
local/zeroclaw.sh Normal file
View file

@ -0,0 +1,42 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/local/lib/common.sh)"
fi
log_info "ZeroClaw on local machine"
echo ""
log_warn "Note: ZeroClaw is built from Rust source and may take 5-10 minutes to compile."
echo ""
agent_install() {
install_agent "ZeroClaw" \
"curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/main/scripts/install.sh | bash -s -- --install-rust" \
cloud_run
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ZEROCLAW_PROVIDER=openrouter"
}
agent_configure() {
cloud_run 'source ~/.spawnrc 2>/dev/null; export PATH="$HOME/.cargo/bin:$PATH"; zeroclaw onboard --api-key "${OPENROUTER_API_KEY}" --provider openrouter'
}
agent_launch_cmd() {
if [[ -n "${SPAWN_PROMPT:-}" ]]; then
local escaped; escaped=$(printf '%q' "${SPAWN_PROMPT}")
printf 'source ~/.cargo/env 2>/dev/null; source ~/.spawnrc 2>/dev/null; zeroclaw agent -m %s' "${escaped}"
else
echo 'source ~/.cargo/env 2>/dev/null; source ~/.spawnrc 2>/dev/null; zeroclaw agent'
fi
}
spawn_agent "ZeroClaw"

View file

@ -49,28 +49,18 @@
},
"featured_cloud": ["fly"]
},
"nanoclaw": {
"name": "NanoClaw",
"description": "WhatsApp-based AI agent",
"url": "https://github.com/gavrielc/nanoclaw",
"install": "git clone https://github.com/gavrielc/nanoclaw.git ~/nanoclaw && cd ~/nanoclaw && npm install && npm run build",
"launch": "cd ~/nanoclaw && npm run dev",
"deps": [
"tsx"
],
"zeroclaw": {
"name": "ZeroClaw",
"description": "Fast, small, fully autonomous AI assistant infrastructure — deploy anywhere, swap anything",
"url": "https://github.com/zeroclaw-labs/zeroclaw",
"install": "curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/main/scripts/install.sh | bash -s -- --install-rust --install-system-deps",
"launch": "zeroclaw agent",
"env": {
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}",
"ANTHROPIC_API_KEY": "${OPENROUTER_API_KEY}",
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api"
"ZEROCLAW_PROVIDER": "openrouter"
},
"dotenv": {
"path": "~/nanoclaw/.env",
"values": {
"ANTHROPIC_API_KEY": "${OPENROUTER_API_KEY}"
}
},
"notes": "Requires WhatsApp QR code scan for authentication",
"featured_cloud": ["fly"]
"notes": "Rust-based agent framework built by Harvard/MIT/Sundai.Club communities. Natively supports OpenRouter via OPENROUTER_API_KEY + ZEROCLAW_PROVIDER=openrouter. Requires compilation from source (~5-10 min).",
"featured_cloud": ["hetzner", "fly"]
},
"codex": {
"name": "Codex CLI",
@ -232,53 +222,53 @@
}
},
"matrix": {
"sprite/claude": "implemented",
"sprite/openclaw": "implemented",
"sprite/nanoclaw": "implemented",
"hetzner/claude": "implemented",
"hetzner/openclaw": "implemented",
"hetzner/nanoclaw": "implemented",
"digitalocean/claude": "implemented",
"digitalocean/openclaw": "implemented",
"digitalocean/nanoclaw": "implemented",
"sprite/codex": "implemented",
"hetzner/codex": "implemented",
"digitalocean/codex": "implemented",
"aws/claude": "implemented",
"aws/openclaw": "implemented",
"aws/nanoclaw": "implemented",
"aws/codex": "implemented",
"gcp/claude": "implemented",
"gcp/openclaw": "implemented",
"gcp/nanoclaw": "implemented",
"gcp/codex": "implemented",
"fly/claude": "implemented",
"fly/openclaw": "implemented",
"fly/nanoclaw": "implemented",
"fly/codex": "implemented",
"sprite/opencode": "implemented",
"hetzner/opencode": "implemented",
"digitalocean/opencode": "implemented",
"aws/opencode": "implemented",
"gcp/opencode": "implemented",
"fly/opencode": "implemented",
"daytona/claude": "implemented",
"daytona/openclaw": "implemented",
"daytona/nanoclaw": "implemented",
"daytona/codex": "implemented",
"daytona/opencode": "implemented",
"sprite/kilocode": "implemented",
"hetzner/kilocode": "implemented",
"digitalocean/kilocode": "implemented",
"aws/kilocode": "implemented",
"gcp/kilocode": "implemented",
"fly/kilocode": "implemented",
"daytona/kilocode": "implemented",
"local/claude": "implemented",
"local/openclaw": "implemented",
"local/nanoclaw": "implemented",
"local/zeroclaw": "implemented",
"local/codex": "implemented",
"local/opencode": "missing",
"local/kilocode": "implemented"
"local/kilocode": "implemented",
"hetzner/claude": "implemented",
"hetzner/openclaw": "implemented",
"hetzner/zeroclaw": "implemented",
"hetzner/codex": "implemented",
"hetzner/opencode": "implemented",
"hetzner/kilocode": "implemented",
"fly/claude": "implemented",
"fly/openclaw": "implemented",
"fly/zeroclaw": "implemented",
"fly/codex": "implemented",
"fly/opencode": "implemented",
"fly/kilocode": "implemented",
"aws/claude": "implemented",
"aws/openclaw": "implemented",
"aws/zeroclaw": "implemented",
"aws/codex": "implemented",
"aws/opencode": "implemented",
"aws/kilocode": "implemented",
"daytona/claude": "implemented",
"daytona/openclaw": "implemented",
"daytona/zeroclaw": "implemented",
"daytona/codex": "implemented",
"daytona/opencode": "implemented",
"daytona/kilocode": "implemented",
"digitalocean/claude": "implemented",
"digitalocean/openclaw": "implemented",
"digitalocean/zeroclaw": "implemented",
"digitalocean/codex": "implemented",
"digitalocean/opencode": "implemented",
"digitalocean/kilocode": "implemented",
"gcp/claude": "implemented",
"gcp/openclaw": "implemented",
"gcp/zeroclaw": "implemented",
"gcp/codex": "implemented",
"gcp/opencode": "implemented",
"gcp/kilocode": "implemented",
"sprite/claude": "implemented",
"sprite/openclaw": "implemented",
"sprite/zeroclaw": "implemented",
"sprite/codex": "implemented",
"sprite/opencode": "implemented",
"sprite/kilocode": "implemented"
}
}

View file

@ -1,47 +0,0 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/sprite/lib/common.sh)"
fi
log_info "NanoClaw on Sprite"
echo ""
agent_install() {
log_step "Installing Docker (required by NanoClaw on Linux)..."
cloud_run "command -v docker >/dev/null || (curl -fsSL https://get.docker.com | sh)"
log_step "Installing tsx..."
cloud_run "source ~/.bashrc && bun install -g tsx"
log_step "Cloning and building nanoclaw..."
cloud_run "git clone https://github.com/gavrielc/nanoclaw.git ~/nanoclaw && cd ~/nanoclaw && npm install && npm run build"
log_info "NanoClaw installed"
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_API_KEY=${OPENROUTER_API_KEY}" \
"ANTHROPIC_BASE_URL=https://openrouter.ai/api"
}
agent_configure() {
local dotenv_content
dotenv_content=$(printf 'ANTHROPIC_API_KEY=%s\nANTHROPIC_BASE_URL=https://openrouter.ai/api\n' "${OPENROUTER_API_KEY}")
upload_config_file cloud_upload cloud_run "${dotenv_content}" "\$HOME/nanoclaw/.env"
}
agent_launch_cmd() {
echo 'cd ~/nanoclaw && source ~/.zshrc && npm run dev'
}
agent_pre_launch() {
log_info "You will need to scan a WhatsApp QR code to authenticate."
echo ""
}
spawn_agent "NanoClaw"

37
sprite/zeroclaw.sh Normal file
View file

@ -0,0 +1,37 @@
#!/bin/bash
set -eo pipefail
# Source common functions - try local file first, fall back to remote
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)"
if [[ -f "${SCRIPT_DIR}/lib/common.sh" ]]; then
source "${SCRIPT_DIR}/lib/common.sh"
else
eval "$(curl -fsSL https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/sprite/lib/common.sh)"
fi
log_info "ZeroClaw on Sprite"
echo ""
log_warn "Note: ZeroClaw is built from Rust source and may take 5-10 minutes to compile."
echo ""
agent_install() {
install_agent "ZeroClaw" \
"curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/main/scripts/install.sh | bash -s -- --install-rust --install-system-deps" \
cloud_run
}
agent_env_vars() {
generate_env_config \
"OPENROUTER_API_KEY=${OPENROUTER_API_KEY}" \
"ZEROCLAW_PROVIDER=openrouter"
}
agent_configure() {
cloud_run 'source ~/.spawnrc 2>/dev/null; export PATH="$HOME/.cargo/bin:$PATH"; zeroclaw onboard --api-key "${OPENROUTER_API_KEY}" --provider openrouter'
}
agent_launch_cmd() {
echo 'source ~/.cargo/env 2>/dev/null; source ~/.spawnrc 2>/dev/null; zeroclaw agent'
}
spawn_agent "ZeroClaw"

View file

@ -34,7 +34,7 @@ _parse_args() {
_maybe_inject_error() {
[ -n "${MOCK_ERROR_SCENARIO:-}" ] || return 1
case "$URL" in
*openrouter.ai*|*raw.githubusercontent.com*|*claude.ai/install*|*bun.sh*|*nodesource*|*opencode*|*pip.pypa.io*|*get.docker.com*|*npmjs.org*|*github.com/*/releases*)
*openrouter.ai*|*raw.githubusercontent.com*|*claude.ai/install*|*bun.sh*|*nodesource*|*opencode*|*zeroclaw*|*pip.pypa.io*|*get.docker.com*|*npmjs.org*|*github.com/*/releases*)
return 1 ;;
esac
case "${MOCK_ERROR_SCENARIO}" in
@ -65,7 +65,7 @@ _maybe_inject_error() {
_handle_special_urls() {
case "$URL" in
*claude.ai/install*|*bun.sh*|*nodesource*|*opencode*install*|\
*claude.ai/install*|*bun.sh*|*nodesource*|*opencode*install*|*zeroclaw*install*|\
*pip.pypa.io*|*get.docker.com*|*install.python-poetry.org*|\
*npmjs.org*|*deb.nodesource.com*|*github.com/*/releases*|*cli.github.com*)
printf '#!/bin/bash\nexit 0\n'

View file

@ -243,7 +243,7 @@ MOCK
setup_mock_agents() {
# Agent binaries
_create_logging_mock claude codex opencode kilocode openclaw nanoclaw q
_create_logging_mock claude openclaw zeroclaw codex opencode kilocode q
# Tools used during agent install and file upload
_create_logging_mock pip pip3 npm npx bun node openssl shred cargo go git base64