diff --git a/README.md b/README.md index 79f48b6c..2c40a45b 100644 --- a/README.md +++ b/README.md @@ -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) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | diff --git a/aws/nanoclaw.sh b/aws/nanoclaw.sh deleted file mode 100755 index b2875a68..00000000 --- a/aws/nanoclaw.sh +++ /dev/null @@ -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" diff --git a/aws/zeroclaw.sh b/aws/zeroclaw.sh new file mode 100644 index 00000000..000b2454 --- /dev/null +++ b/aws/zeroclaw.sh @@ -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" diff --git a/cli/package.json b/cli/package.json index 008df248..a7ad4ba9 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@openrouter/spawn", - "version": "0.5.8", + "version": "0.5.10", "type": "module", "bin": { "spawn": "cli.js" diff --git a/daytona/nanoclaw.sh b/daytona/nanoclaw.sh deleted file mode 100644 index 3090692b..00000000 --- a/daytona/nanoclaw.sh +++ /dev/null @@ -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" diff --git a/daytona/zeroclaw.sh b/daytona/zeroclaw.sh new file mode 100644 index 00000000..ad9ada28 --- /dev/null +++ b/daytona/zeroclaw.sh @@ -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" diff --git a/digitalocean/nanoclaw.sh b/digitalocean/nanoclaw.sh deleted file mode 100755 index 8e403c79..00000000 --- a/digitalocean/nanoclaw.sh +++ /dev/null @@ -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" diff --git a/digitalocean/zeroclaw.sh b/digitalocean/zeroclaw.sh new file mode 100644 index 00000000..5e1007fb --- /dev/null +++ b/digitalocean/zeroclaw.sh @@ -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" diff --git a/fly/nanoclaw.sh b/fly/nanoclaw.sh deleted file mode 100644 index 6a37aa61..00000000 --- a/fly/nanoclaw.sh +++ /dev/null @@ -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" diff --git a/fly/zeroclaw.sh b/fly/zeroclaw.sh new file mode 100644 index 00000000..0c6411d4 --- /dev/null +++ b/fly/zeroclaw.sh @@ -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" diff --git a/gcp/nanoclaw.sh b/gcp/nanoclaw.sh deleted file mode 100755 index 913ac37a..00000000 --- a/gcp/nanoclaw.sh +++ /dev/null @@ -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" diff --git a/gcp/zeroclaw.sh b/gcp/zeroclaw.sh new file mode 100644 index 00000000..8c21e325 --- /dev/null +++ b/gcp/zeroclaw.sh @@ -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" diff --git a/hetzner/nanoclaw.sh b/hetzner/nanoclaw.sh deleted file mode 100755 index 0edefc0e..00000000 --- a/hetzner/nanoclaw.sh +++ /dev/null @@ -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" diff --git a/hetzner/zeroclaw.sh b/hetzner/zeroclaw.sh new file mode 100644 index 00000000..1f551a8a --- /dev/null +++ b/hetzner/zeroclaw.sh @@ -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" diff --git a/local/nanoclaw.sh b/local/nanoclaw.sh deleted file mode 100644 index a004bf71..00000000 --- a/local/nanoclaw.sh +++ /dev/null @@ -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" diff --git a/local/zeroclaw.sh b/local/zeroclaw.sh new file mode 100644 index 00000000..b9e66780 --- /dev/null +++ b/local/zeroclaw.sh @@ -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" diff --git a/manifest.json b/manifest.json index 64d27487..8bbcf711 100644 --- a/manifest.json +++ b/manifest.json @@ -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" } } diff --git a/sprite/nanoclaw.sh b/sprite/nanoclaw.sh deleted file mode 100644 index b1e73fc9..00000000 --- a/sprite/nanoclaw.sh +++ /dev/null @@ -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" diff --git a/sprite/zeroclaw.sh b/sprite/zeroclaw.sh new file mode 100644 index 00000000..61dede5a --- /dev/null +++ b/sprite/zeroclaw.sh @@ -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" diff --git a/test/mock-curl-script.sh b/test/mock-curl-script.sh index 443885cc..2e56bdf5 100644 --- a/test/mock-curl-script.sh +++ b/test/mock-curl-script.sh @@ -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' diff --git a/test/mock.sh b/test/mock.sh index 475440de..c21a1b7b 100644 --- a/test/mock.sh +++ b/test/mock.sh @@ -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