Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,6 @@ If an agent fails to install or launch on a cloud:
|---|---|---|---|---|---|---|
| [**Claude Code**](https://claude.ai) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| [**OpenClaw**](https://github.com/openclaw/openclaw) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| [**ZeroClaw**](https://github.com/zeroclaw-labs/zeroclaw) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| [**Codex CLI**](https://github.com/openai/codex) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| [**OpenCode**](https://github.com/sst/opencode) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| [**Kilo Code**](https://github.com/Kilo-Org/kilocode) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Expand Down
4 changes: 0 additions & 4 deletions assets/agents/.sources.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,6 @@
"url": "https://openclaw.ai/apple-touch-icon.png",
"ext": "png"
},
"zeroclaw": {
"url": "https://avatars.githubusercontent.com/u/261820148?s=200&v=4",
"ext": "png"
},
"codex": {
"url": "https://avatars.githubusercontent.com/u/14957082?s=200&v=4",
"ext": "png"
Expand Down
52 changes: 0 additions & 52 deletions manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -89,52 +89,6 @@
"gateway"
]
},
"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/a117be64fdaa31779204beadf2942c8aef57d0e5/scripts/bootstrap.sh | bash -s -- --install-rust --install-system-deps --prefer-prebuilt",
"launch": "zeroclaw agent",
"env": {
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}",
"ZEROCLAW_PROVIDER": "openrouter"
},
"config_files": {
"~/.zeroclaw/config.toml": {
"security": {
"autonomy": "full",
"supervised": false,
"allow_destructive": true
},
"shell": {
"policy": "allow_all"
}
}
},
"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).",
"icon": "https://raw.githubusercontent.com/OpenRouterTeam/spawn/main/assets/agents/zeroclaw.png",
"featured_cloud": [
"digitalocean",
"sprite"
],
"creator": "Sundai.Club",
"repo": "zeroclaw-labs/zeroclaw",
"license": "Apache-2.0",
"created": "2026-02",
"added": "2025-12",
"github_stars": 28521,
"stars_updated": "2026-03-23",
"language": "Rust",
"runtime": "binary",
"category": "cli",
"tagline": "Fast, small, fully autonomous AI infrastructure — deploy anywhere, swap anything",
"tags": [
"coding",
"terminal",
"rust",
"autonomous"
]
},
"codex": {
"name": "Codex CLI",
"description": "OpenAI's open-source coding agent",
Expand Down Expand Up @@ -453,37 +407,31 @@
"matrix": {
"local/claude": "implemented",
"local/openclaw": "implemented",
"local/zeroclaw": "implemented",
"local/codex": "implemented",
"local/opencode": "implemented",
"local/kilocode": "implemented",
"hetzner/claude": "implemented",
"hetzner/openclaw": "implemented",
"hetzner/zeroclaw": "implemented",
"hetzner/codex": "implemented",
"hetzner/opencode": "implemented",
"hetzner/kilocode": "implemented",
"aws/claude": "implemented",
"aws/openclaw": "implemented",
"aws/zeroclaw": "implemented",
"aws/codex": "implemented",
"aws/opencode": "implemented",
"aws/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",
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@openrouter/spawn",
"version": "0.29.1",
"version": "0.29.2",
"type": "module",
"bin": {
"spawn": "cli.js"
Expand Down
11 changes: 0 additions & 11 deletions packages/cli/src/__tests__/agent-setup-cov.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -191,12 +191,6 @@ describe("createCloudAgents", () => {
"ANTHROPIC_BASE_URL",
],
],
[
"zeroclaw",
[
"ZEROCLAW_PROVIDER=openrouter",
],
],
[
"hermes",
[
Expand Down Expand Up @@ -228,11 +222,6 @@ describe("createCloudAgents", () => {
}
});

it("zeroclaw agent configure calls runServer", async () => {
await result.agents.zeroclaw.configure?.("sk-or-v1-test", undefined, new Set());
expect(runner.runServer).toHaveBeenCalled();
});

it("all agents have launchCmd returning non-empty string", () => {
for (const agent of Object.values(result.agents)) {
const cmd = agent.launchCmd();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,6 @@ describe("validateLaunchCmd", () => {
"source ~/.spawnrc 2>/dev/null; export PATH=$HOME/.npm-global/bin:$HOME/.bun/bin:$HOME/.local/bin:$PATH; openclaw tui",
"source ~/.spawnrc 2>/dev/null; source ~/.zshrc 2>/dev/null; opencode",
"source ~/.spawnrc 2>/dev/null; source ~/.zshrc 2>/dev/null; kilocode",
"export PATH=$HOME/.cargo/bin:$PATH; source ~/.cargo/env 2>/dev/null; source ~/.spawnrc 2>/dev/null; zeroclaw agent",
"source ~/.spawnrc 2>/dev/null; hermes",
"claude",
"aider",
Expand Down
8 changes: 0 additions & 8 deletions packages/cli/src/__tests__/spawn-skill.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,6 @@ describe("getSpawnSkillPath", () => {
"openclaw",
"~/.openclaw/skills/spawn/SKILL.md",
],
[
"zeroclaw",
"~/.zeroclaw/workspace/AGENTS.md",
],
[
"opencode",
"~/.config/opencode/AGENTS.md",
Expand Down Expand Up @@ -67,7 +63,6 @@ describe("isAppendMode", () => {
"claude",
"codex",
"openclaw",
"zeroclaw",
"opencode",
"kilocode",
"junie",
Expand All @@ -85,7 +80,6 @@ describe("getSkillContent", () => {
"claude",
"codex",
"openclaw",
"zeroclaw",
"opencode",
"kilocode",
"hermes",
Expand Down Expand Up @@ -114,7 +108,6 @@ describe("getSkillContent", () => {
}

for (const agent of [
"zeroclaw",
"opencode",
"kilocode",
"junie",
Expand Down Expand Up @@ -184,7 +177,6 @@ describe("injectSpawnSkill", () => {
"claude",
"codex",
"openclaw",
"zeroclaw",
"opencode",
"kilocode",
"hermes",
Expand Down
3 changes: 1 addition & 2 deletions packages/cli/src/commands/link.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ function defaultSshCommand(host: string, user: string, keyOpts: string[], cmd: s
const KNOWN_AGENTS = [
"claude",
"openclaw",
"zeroclaw",
"codex",
"opencode",
"kilocode",
Expand All @@ -79,7 +78,7 @@ type KnownAgent = (typeof KNOWN_AGENTS)[number];
function detectAgent(host: string, user: string, keyOpts: string[], runCmd: SshCommandFn): string | null {
// First: check running processes
const psCmd =
"ps aux 2>/dev/null | grep -oE 'claude(-code)?|openclaw|zeroclaw|codex|opencode|kilocode|hermes|junie' | grep -v grep | head -1 || true";
"ps aux 2>/dev/null | grep -oE 'claude(-code)?|openclaw|codex|opencode|kilocode|hermes|junie' | grep -v grep | head -1 || true";
const psOut = runCmd(host, user, keyOpts, psCmd);
if (psOut) {
const match = KNOWN_AGENTS.find((b: KnownAgent) => psOut.includes(b));
Expand Down
1 change: 0 additions & 1 deletion packages/cli/src/digitalocean/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ const MARKETPLACE_IMAGES: Record<string, string> = {
openclaw: "openrouter-spawnopenclaw",
opencode: "openrouter-spawnopencode",
kilocode: "openrouter-spawnkilocode",
zeroclaw: "openrouter-spawnzeroclaw",
hermes: "openrouter-spawnhermes",
junie: "openrouter-spawnjunie",
};
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/security.ts
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ export function validateLaunchCmd(cmd: string): void {
"Invalid launch command in history: invalid agent invocation\n\n" +
`Command: "${cmd}"\n` +
`Rejected segment: "${lastSegment}"\n\n` +
"The final segment must be a simple binary name (e.g., 'claude', 'zeroclaw agent').\n\n" +
"The final segment must be a simple binary name (e.g., 'claude', 'hermes').\n\n" +
"Your spawn history file may be corrupted or tampered with.\n" +
`To fix: run 'spawn list --clear' to reset history`,
);
Expand Down
93 changes: 0 additions & 93 deletions packages/cli/src/shared/agent-setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -592,51 +592,6 @@ export async function startGateway(runner: CloudRunner): Promise<void> {
logInfo("OpenClaw gateway started");
}

// ─── ZeroClaw Config ─────────────────────────────────────────────────────────

async function setupZeroclawConfig(runner: CloudRunner, _apiKey: string): Promise<void> {
logStep("Configuring ZeroClaw for autonomous operation...");

// Remove any pre-existing config (e.g. from Docker image extraction) before
// running onboard, which generates a fresh config with the correct API key.
await runner.runServer("rm -f ~/.zeroclaw/config.toml");

// Run onboard first to set up provider/key
await runner.runServer(
`source ~/.spawnrc 2>/dev/null; export PATH="$HOME/.local/bin:$HOME/.cargo/bin:$PATH"; zeroclaw onboard --api-key "\${OPENROUTER_API_KEY}" --provider openrouter`,
);

// Patch autonomy settings in-place. `zeroclaw onboard` already generates
// [security] and [shell] sections — so we sed the values instead of
// appending duplicate sections.
const patchScript = [
"cd ~/.zeroclaw",
// Update existing security values (or append section if missing)
'if grep -q "^\\[security\\]" config.toml 2>/dev/null; then',
" sed -i 's/^autonomy = .*/autonomy = \"full\"/' config.toml",
" sed -i 's/^supervised = .*/supervised = false/' config.toml",
" sed -i 's/^allow_destructive = .*/allow_destructive = true/' config.toml",
"else",
" printf '\\n[security]\\nautonomy = \"full\"\\nsupervised = false\\nallow_destructive = true\\n' >> config.toml",
"fi",
// Update existing shell policy (or append section if missing)
'if grep -q "^\\[shell\\]" config.toml 2>/dev/null; then',
" sed -i 's/^policy = .*/policy = \"allow_all\"/' config.toml",
"else",
" printf '\\n[shell]\\npolicy = \"allow_all\"\\n' >> config.toml",
"fi",
// Force native runtime (no Docker) — zeroclaw auto-detects Docker and
// launches in a container otherwise, which hangs the interactive session.
'if grep -q "^\\[runtime\\]" config.toml 2>/dev/null; then',
" sed -i 's/^adapter = .*/adapter = \"native\"/' config.toml",
"else",
" printf '\\n[runtime]\\nadapter = \"native\"\\n' >> config.toml",
"fi",
].join("\n");
await runner.runServer(patchScript);
logInfo("ZeroClaw configured for autonomous operation");
}

// ─── OpenCode Install Command ────────────────────────────────────────────────

function openCodeInstallCmd(): string {
Expand Down Expand Up @@ -894,10 +849,6 @@ export async function setupAutoUpdate(runner: CloudRunner, agentName: string, up

// ─── Default Agent Definitions ───────────────────────────────────────────────

// Last zeroclaw release that shipped Linux prebuilt binaries (v0.1.9a has none).
// Used for direct binary install to avoid a Rust source build timeout.
const ZEROCLAW_PREBUILT_TAG = "v0.1.7-beta.30";

function createAgents(runner: CloudRunner): Record<string, AgentConfig> {
return {
claude: {
Expand Down Expand Up @@ -1011,50 +962,6 @@ function createAgents(runner: CloudRunner): Record<string, AgentConfig> {
"npm install -g ${_NPM_G_FLAGS:-} @kilocode/cli@latest",
},

zeroclaw: {
name: "ZeroClaw",
cloudInitTier: "minimal",
modelEnvVar: "ZEROCLAW_MODEL",
preProvision: detectGithubAuth,
install: async () => {
// Direct binary install from pinned release (v0.1.9a "latest" has no assets,
// causing the bootstrap --prefer-prebuilt path to 404-fail and fall back to
// a Rust source build that exceeds the 600s install timeout).
const directInstallCmd =
`_ZC_ARCH="$(uname -m)"; ` +
`if [ "$_ZC_ARCH" = "x86_64" ]; then _ZC_TARGET="x86_64-unknown-linux-gnu"; ` +
`elif [ "$_ZC_ARCH" = "aarch64" ] || [ "$_ZC_ARCH" = "arm64" ]; then _ZC_TARGET="aarch64-unknown-linux-gnu"; ` +
`else echo "Unsupported arch: $_ZC_ARCH" >&2; exit 1; fi; ` +
`_ZC_URL="https://github.com/zeroclaw-labs/zeroclaw/releases/download/${ZEROCLAW_PREBUILT_TAG}/zeroclaw-\${_ZC_TARGET}.tar.gz"; ` +
`_ZC_TMP="$(mktemp -d)"; ` +
`curl --proto '=https' -fsSL "$_ZC_URL" -o "$_ZC_TMP/zeroclaw.tar.gz" && ` +
`tar -xzf "$_ZC_TMP/zeroclaw.tar.gz" -C "$_ZC_TMP" && ` +
`{ mkdir -p "$HOME/.local/bin" && install -m 755 "$_ZC_TMP/zeroclaw" "$HOME/.local/bin/zeroclaw"; } && ` +
`rm -rf "$_ZC_TMP"`;
await installAgent(runner, "ZeroClaw", directInstallCmd, 120);
},
envVars: (apiKey) => [
`OPENROUTER_API_KEY=${apiKey}`,
"ZEROCLAW_PROVIDER=openrouter",
"ZEROCLAW_RUNTIME=native",
],
configure: (apiKey) => setupZeroclawConfig(runner, apiKey),
launchCmd: () =>
"export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH; source ~/.spawnrc 2>/dev/null; zeroclaw agent",
updateCmd:
'export PATH="$HOME/.local/bin:$HOME/.cargo/bin:$PATH"; ' +
`_ZC_ARCH="$(uname -m)"; ` +
`if [ "$_ZC_ARCH" = "x86_64" ]; then _ZC_TARGET="x86_64-unknown-linux-gnu"; ` +
`elif [ "$_ZC_ARCH" = "aarch64" ] || [ "$_ZC_ARCH" = "arm64" ]; then _ZC_TARGET="aarch64-unknown-linux-gnu"; ` +
"else exit 1; fi; " +
`_ZC_URL="https://github.com/zeroclaw-labs/zeroclaw/releases/latest/download/zeroclaw-\${_ZC_TARGET}.tar.gz"; ` +
`_ZC_TMP="$(mktemp -d)"; ` +
`curl --proto '=https' -fsSL "$_ZC_URL" -o "$_ZC_TMP/zeroclaw.tar.gz" && ` +
`tar -xzf "$_ZC_TMP/zeroclaw.tar.gz" -C "$_ZC_TMP" && ` +
`install -m 755 "$_ZC_TMP/zeroclaw" "$HOME/.local/bin/zeroclaw" && ` +
`rm -rf "$_ZC_TMP"`,
},

hermes: {
name: "Hermes Agent",
cloudInitTier: "minimal",
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/shared/orchestrate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ export async function runOrchestration(

// Skip cloud-init for minimal-tier agents when using tarballs or snapshots.
// Ubuntu 24.04 base images already have curl + git, so minimal agents (claude,
// opencode, zeroclaw, hermes) don't need the cloud-init package install step.
// opencode, hermes) don't need the cloud-init package install step.
// This saves ~30-60s by just waiting for SSH instead of polling for cloud-init completion.
if (
cloud.cloudName !== "local" &&
Expand Down
9 changes: 2 additions & 7 deletions packages/cli/src/shared/spawn-skill.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ You have the \`spawn\` CLI installed. Use it to provision cloud VMs with AI agen
spawn <agent> <cloud> --headless --output json --prompt "task description"
\`\`\`

**Agents:** claude, codex, cursor, openclaw, zeroclaw, opencode, kilocode, hermes, junie
**Agents:** claude, codex, cursor, openclaw, opencode, kilocode, hermes, junie
**Clouds:** hetzner, digitalocean, aws, gcp, sprite

Returns JSON: \`{"status":"success","ip_address":"...","ssh_user":"root","server_id":"..."}\`
Expand Down Expand Up @@ -74,7 +74,7 @@ const HERMES_SNIPPET = `

You have the \`spawn\` CLI for creating child cloud VMs with AI agents.
Use \`spawn <agent> <cloud> --headless --output json --prompt "task"\` to delegate work.
Available agents: claude, codex, cursor, openclaw, zeroclaw, opencode, kilocode, hermes, junie.
Available agents: claude, codex, cursor, openclaw, opencode, kilocode, hermes, junie.
Cloud credentials are pre-configured. Run \`spawn list --json\` to see children.
\`--headless\` only provisions. To run a prompt on the child: \`ssh root@<ip> "bash -lc 'claude -p --dangerously-skip-permissions \\"prompt\\"'"\`. Always use \`bash -lc\` (binaries are in ~/.local/bin/).
`;
Expand Down Expand Up @@ -104,11 +104,6 @@ const AGENT_SKILLS: Record<string, SkillConfig> = {
content: SKILL_FRONTMATTER + SKILL_BODY,
append: false,
},
zeroclaw: {
remotePath: "~/.zeroclaw/workspace/AGENTS.md",
content: SKILL_BODY,
append: false,
},
opencode: {
remotePath: "~/.config/opencode/AGENTS.md",
content: SKILL_BODY,
Expand Down
7 changes: 0 additions & 7 deletions packer/agents.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,6 @@
"mkdir -p ~/.npm-global/bin && npm install -g --prefix ~/.npm-global @kilocode/cli"
]
},
"zeroclaw": {
"tier": "minimal",
"install": [
"if [ ! -f /swapfile ]; then fallocate -l 4G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile; fi",
"curl -LsSf https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/a117be64fdaa31779204beadf2942c8aef57d0e5/scripts/bootstrap.sh | bash -s -- --install-rust --install-system-deps --prefer-prebuilt"
]
},
"hermes": {
"tier": "minimal",
"install": [
Expand Down
Loading
Loading