spawn/manifest.json
L b6ee6b6ab1
Add guardrails: CLAUDE.md rules, hooks, pre-commit validation (#33)
* feat: add gptme agent to spawn matrix

Add gptme (https://github.com/gptme/gptme) - a personal AI agent in the
terminal with tools for code editing, terminal commands, web browsing,
and more. Natively supports OpenRouter via OPENROUTER_API_KEY.

- Add gptme agent entry to manifest.json with OpenRouter env vars
- Implement sprite/gptme.sh deployment script
- Implement hetzner/gptme.sh deployment script
- Add "missing" matrix entries for remaining 8 clouds
- Update README.md with usage instructions for Sprite and Hetzner

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

* feat: add Fly.io cloud provider with claude and aider agents

Add Fly.io as a new cloud provider using the Machines REST API for
provisioning and flyctl CLI for SSH access. Docker-based machines
with pay-per-second pricing.

- Create fly/lib/common.sh with Fly.io Machines API integration
- Implement fly/claude.sh for Claude Code deployment
- Implement fly/aider.sh for Aider deployment
- Update README.md with Fly.io usage instructions and env vars

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

* feat: add gemini, amazonq, cline, gptme to Fly.io

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

* feat: add openclaw, nanoclaw, goose, codex, interpreter to Fly.io

Implements 5 new agent scripts for the Fly.io cloud provider:
- fly/openclaw.sh: OpenClaw with gateway + TUI, model selection, config
- fly/nanoclaw.sh: NanoClaw WhatsApp agent with .env configuration
- fly/goose.sh: Block's Goose agent with OpenRouter provider
- fly/codex.sh: OpenAI Codex CLI with OpenRouter base URL override
- fly/interpreter.sh: Open Interpreter with OpenRouter base URL override

All scripts follow the Fly.io pattern (flyctl-based, no IP args for
run_server/interactive_session) and use upload_file for env injection.

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

* feat: add gptme agent to 8 remaining clouds

Implement gptme agent scripts for digitalocean, vultr, linode, lambda,
aws-lightsail, gcp, e2b, and modal. Each script follows the exact
pattern of that cloud's existing aider.sh, adapted for gptme's install
and launch commands. Updates manifest.json matrix entries from "missing"
to "implemented".

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

* Add guardrails from insights: CLAUDE.md rules, hooks, pre-commit

Based on usage insights analysis:

CLAUDE.md:
- Shell script rules: curl|bash compat, macOS bash 3.x compat
- Autonomous loop rules: test after each iteration, never revert fixes
- Git workflow rules: always use feature branches

.claude/settings.json:
- PostToolUse hook validates .sh files on every Write/Edit:
  syntax check, no relative source, no echo -e, no set -u

.githooks/pre-commit:
- Blocks commits with: syntax errors, relative sources, echo -e,
  set -euo, references to deleted functions
- Install: git config core.hooksPath .githooks

README.md:
- Added developer setup section with hook installation

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

---------

Co-authored-by: Sprite <noreply@sprite.dev>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-07 20:02:19 -08:00

470 lines
17 KiB
JSON

{
"agents": {
"claude": {
"name": "Claude Code",
"description": "Anthropic's CLI coding agent",
"url": "https://claude.ai",
"install": "curl -fsSL https://claude.ai/install.sh | bash",
"launch": "claude",
"env": {
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}",
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
"ANTHROPIC_AUTH_TOKEN": "${OPENROUTER_API_KEY}",
"ANTHROPIC_API_KEY": "",
"CLAUDE_CODE_SKIP_ONBOARDING": "1",
"CLAUDE_CODE_ENABLE_TELEMETRY": "0"
},
"config_files": {
"~/.claude/settings.json": {
"theme": "dark",
"permissions": {
"defaultMode": "bypassPermissions",
"dangerouslySkipPermissions": true
}
},
"~/.claude.json": {
"hasCompletedOnboarding": true,
"bypassPermissionsModeAccepted": true
}
}
},
"openclaw": {
"name": "OpenClaw",
"description": "OpenRouter's agent framework with gateway + TUI",
"url": "https://github.com/OpenRouterTeam/openclaw",
"install": "bun install -g openclaw",
"launch": "openclaw tui",
"pre_launch": "nohup openclaw gateway > /tmp/openclaw-gateway.log 2>&1 &",
"env": {
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}",
"ANTHROPIC_API_KEY": "${OPENROUTER_API_KEY}",
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api"
},
"interactive_prompts": {
"model_id": {
"prompt": "Enter model ID",
"default": "openrouter/auto"
}
}
},
"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"],
"env": {
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}",
"ANTHROPIC_API_KEY": "${OPENROUTER_API_KEY}",
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api"
},
"dotenv": {
"path": "~/nanoclaw/.env",
"values": {
"ANTHROPIC_API_KEY": "${OPENROUTER_API_KEY}"
}
},
"notes": "Requires WhatsApp QR code scan for authentication"
},
"aider": {
"name": "Aider",
"description": "AI pair programming in the terminal",
"url": "https://github.com/paul-gauthier/aider",
"install": "pip install aider-chat",
"launch": "aider --model openrouter/${MODEL_ID}",
"env": {
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
},
"interactive_prompts": {
"model_id": {
"prompt": "Enter model ID",
"default": "openrouter/auto"
}
},
"notes": "Natively supports OpenRouter via OPENROUTER_API_KEY and --model openrouter/... flag"
},
"goose": {
"name": "Goose",
"description": "Block's open-source AI coding agent",
"url": "https://github.com/block/goose",
"install": "CONFIGURE=false curl -fsSL https://github.com/block/goose/releases/latest/download/download_cli.sh | bash",
"launch": "goose",
"env": {
"GOOSE_PROVIDER": "openrouter",
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
},
"notes": "Model-agnostic agent by Block (formerly Square), supports OpenRouter as a provider"
},
"codex": {
"name": "Codex CLI",
"description": "OpenAI's open-source coding agent",
"url": "https://github.com/openai/codex",
"install": "npm install -g @openai/codex",
"launch": "codex",
"env": {
"OPENAI_API_KEY": "${OPENROUTER_API_KEY}",
"OPENAI_BASE_URL": "https://openrouter.ai/api/v1",
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
},
"notes": "Works with OpenRouter via OPENAI_BASE_URL override pointing to openrouter.ai/api/v1"
},
"interpreter": {
"name": "Open Interpreter",
"description": "Natural language interface for computer control",
"url": "https://github.com/OpenInterpreter/open-interpreter",
"install": "pip install open-interpreter",
"launch": "interpreter",
"env": {
"OPENAI_API_KEY": "${OPENROUTER_API_KEY}",
"OPENAI_BASE_URL": "https://openrouter.ai/api/v1",
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
},
"notes": "Works with OpenRouter via OPENAI_BASE_URL override"
},
"gemini": {
"name": "Gemini CLI",
"description": "Google's open-source coding agent",
"url": "https://github.com/google-gemini/gemini-cli",
"install": "npm install -g @google/gemini-cli",
"launch": "gemini",
"env": {
"GEMINI_API_KEY": "${OPENROUTER_API_KEY}",
"OPENAI_API_KEY": "${OPENROUTER_API_KEY}",
"OPENAI_BASE_URL": "https://openrouter.ai/api/v1",
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
},
"notes": "Works with OpenRouter via OPENAI_BASE_URL override and GEMINI_API_KEY"
},
"amazonq": {
"name": "Amazon Q CLI",
"description": "AWS's AI coding assistant CLI",
"url": "https://aws.amazon.com/q/developer/",
"install": "curl -fsSL https://desktop-release.q.us-east-1.amazonaws.com/latest/amazon-q-cli-install.sh | bash",
"launch": "q chat",
"env": {
"OPENAI_API_KEY": "${OPENROUTER_API_KEY}",
"OPENAI_BASE_URL": "https://openrouter.ai/api/v1",
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
},
"notes": "Works with OpenRouter via OPENAI_BASE_URL override"
},
"cline": {
"name": "Cline",
"description": "Open-source AI coding agent for the terminal",
"url": "https://github.com/cline/cline",
"install": "npm install -g cline",
"launch": "cline",
"env": {
"OPENAI_API_KEY": "${OPENROUTER_API_KEY}",
"OPENAI_BASE_URL": "https://openrouter.ai/api/v1",
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
},
"notes": "Works with OpenRouter via OPENAI_BASE_URL override"
},
"gptme": {
"name": "gptme",
"description": "Personal AI agent in the terminal with tools for code, terminal, browser, and more",
"url": "https://github.com/gptme/gptme",
"install": "pip install gptme",
"launch": "gptme -m openrouter/${MODEL_ID}",
"env": {
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
},
"interactive_prompts": {
"model_id": {
"prompt": "Enter model ID",
"default": "openrouter/auto"
}
},
"notes": "Natively supports OpenRouter via OPENROUTER_API_KEY and -m openrouter/... flag"
}
},
"clouds": {
"sprite": {
"name": "Sprite",
"description": "Sprites.dev managed VMs with CLI",
"url": "https://sprites.dev",
"type": "cli",
"auth": "sprite login",
"provision_method": "sprite create",
"exec_method": "sprite exec",
"interactive_method": "sprite exec -tty"
},
"hetzner": {
"name": "Hetzner Cloud",
"description": "Hetzner Cloud servers via REST API",
"url": "https://www.hetzner.com/cloud/",
"type": "api",
"auth": "HCLOUD_TOKEN",
"provision_method": "POST /v1/servers with cloud-init",
"exec_method": "ssh root@IP",
"interactive_method": "ssh -t root@IP",
"defaults": {
"server_type": "cx22",
"location": "fsn1",
"image": "ubuntu-24.04"
}
},
"digitalocean": {
"name": "DigitalOcean",
"description": "DigitalOcean Droplets via REST API",
"url": "https://www.digitalocean.com/",
"type": "api",
"auth": "DO_API_TOKEN",
"provision_method": "POST /v2/droplets with user_data",
"exec_method": "ssh root@IP",
"interactive_method": "ssh -t root@IP",
"defaults": {
"size": "s-2vcpu-2gb",
"region": "nyc3",
"image": "ubuntu-24-04-x64"
}
},
"vultr": {
"name": "Vultr",
"description": "Vultr Cloud Compute instances via REST API",
"url": "https://www.vultr.com/",
"type": "api",
"auth": "VULTR_API_KEY",
"provision_method": "POST /v2/instances with user_data (base64)",
"exec_method": "ssh root@IP",
"interactive_method": "ssh -t root@IP",
"defaults": {
"plan": "vc2-1c-2gb",
"region": "ewr",
"os_id": 2284
}
},
"linode": {
"name": "Linode (Akamai)",
"description": "Linode instances via REST API",
"url": "https://www.linode.com/",
"type": "api",
"auth": "LINODE_API_TOKEN",
"provision_method": "POST /v4/linode/instances with metadata.user_data",
"exec_method": "ssh root@IP",
"interactive_method": "ssh -t root@IP",
"defaults": {
"type": "g6-standard-1",
"region": "us-east",
"image": "linode/ubuntu24.04"
}
},
"lambda": {
"name": "Lambda Cloud",
"description": "Lambda GPU Cloud instances via REST API",
"url": "https://lambdalabs.com/",
"type": "api",
"auth": "LAMBDA_API_KEY",
"provision_method": "POST /v1/instance-operations/launch",
"exec_method": "ssh ubuntu@IP",
"interactive_method": "ssh -t ubuntu@IP",
"defaults": {
"instance_type": "gpu_1x_a10",
"region": "us-east-1"
},
"notes": "GPU cloud, uses 'ubuntu' user. Manual tool install (no cloud-init)."
},
"aws-lightsail": {
"name": "AWS Lightsail",
"description": "AWS Lightsail instances via AWS CLI",
"url": "https://aws.amazon.com/lightsail/",
"type": "cli",
"auth": "aws configure (AWS credentials)",
"provision_method": "aws lightsail create-instances with --user-data",
"exec_method": "ssh ubuntu@IP",
"interactive_method": "ssh -t ubuntu@IP",
"defaults": {
"bundle": "medium_3_0",
"region": "us-east-1",
"blueprint": "ubuntu_24_04"
},
"notes": "Uses 'ubuntu' user instead of 'root'. Requires AWS CLI installed and configured."
},
"gcp": {
"name": "GCP Compute Engine",
"description": "Google Cloud Compute Engine instances via gcloud CLI",
"url": "https://cloud.google.com/compute",
"type": "cli",
"auth": "gcloud auth login",
"provision_method": "gcloud compute instances create with --metadata startup-script",
"exec_method": "ssh user@IP",
"interactive_method": "ssh -t user@IP",
"defaults": {
"machine_type": "e2-medium",
"zone": "us-central1-a",
"image_family": "ubuntu-2404-lts-amd64"
},
"notes": "Uses current username for SSH. Requires gcloud CLI installed and configured."
},
"e2b": {
"name": "E2B",
"description": "E2B sandboxed cloud containers via CLI/SDK",
"url": "https://e2b.dev",
"type": "sandbox",
"auth": "E2B_API_KEY",
"provision_method": "e2b sandbox create",
"exec_method": "e2b sandbox exec",
"interactive_method": "e2b sandbox exec (PTY)",
"defaults": {
"template": "base"
},
"notes": "No SSH — uses E2B CLI for exec. Sandboxes start in ~150ms. Requires npm install -g @e2b/cli."
},
"modal": {
"name": "Modal",
"description": "Modal sandboxed containers via Python SDK",
"url": "https://modal.com",
"type": "sandbox",
"auth": "modal setup",
"provision_method": "modal.Sandbox.create() via Python SDK",
"exec_method": "sandbox.exec() via Python SDK",
"interactive_method": "sandbox.exec(pty=True)",
"defaults": {
"image": "debian_slim"
},
"notes": "No SSH — uses Modal Python SDK for exec. Sub-second cold starts. Requires pip install modal."
},
"fly": {
"name": "Fly.io",
"description": "Fly.io Machines via REST API and flyctl CLI",
"url": "https://fly.io",
"type": "api+cli",
"auth": "FLY_API_TOKEN",
"provision_method": "POST /v1/apps + POST /v1/apps/{app}/machines",
"exec_method": "fly ssh console -C",
"interactive_method": "fly ssh console",
"defaults": {
"region": "iad",
"vm_size": "shared-cpu-1x",
"vm_memory": 1024,
"image": "ubuntu:24.04"
},
"notes": "Uses Machines API for provisioning and flyctl SSH for exec. Docker-based, pay-per-second pricing. Requires flyctl CLI."
}
},
"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/aider": "implemented",
"hetzner/aider": "implemented",
"digitalocean/aider": "implemented",
"sprite/goose": "implemented",
"hetzner/goose": "implemented",
"digitalocean/goose": "implemented",
"vultr/claude": "implemented",
"vultr/openclaw": "implemented",
"vultr/nanoclaw": "implemented",
"vultr/aider": "implemented",
"vultr/goose": "implemented",
"sprite/codex": "implemented",
"hetzner/codex": "implemented",
"digitalocean/codex": "implemented",
"vultr/codex": "implemented",
"linode/claude": "implemented",
"linode/openclaw": "implemented",
"linode/nanoclaw": "implemented",
"linode/aider": "implemented",
"linode/goose": "implemented",
"linode/codex": "implemented",
"sprite/interpreter": "implemented",
"hetzner/interpreter": "implemented",
"digitalocean/interpreter": "implemented",
"vultr/interpreter": "implemented",
"linode/interpreter": "implemented",
"aws-lightsail/claude": "implemented",
"aws-lightsail/openclaw": "implemented",
"aws-lightsail/nanoclaw": "implemented",
"aws-lightsail/aider": "implemented",
"aws-lightsail/goose": "implemented",
"aws-lightsail/codex": "implemented",
"aws-lightsail/interpreter": "implemented",
"sprite/gemini": "implemented",
"hetzner/gemini": "implemented",
"digitalocean/gemini": "implemented",
"vultr/gemini": "implemented",
"linode/gemini": "implemented",
"aws-lightsail/gemini": "implemented",
"lambda/claude": "implemented",
"lambda/openclaw": "implemented",
"lambda/nanoclaw": "implemented",
"lambda/aider": "implemented",
"lambda/goose": "implemented",
"lambda/codex": "implemented",
"lambda/interpreter": "implemented",
"lambda/gemini": "implemented",
"sprite/amazonq": "implemented",
"hetzner/amazonq": "implemented",
"digitalocean/amazonq": "implemented",
"vultr/amazonq": "implemented",
"linode/amazonq": "implemented",
"lambda/amazonq": "implemented",
"aws-lightsail/amazonq": "implemented",
"sprite/cline": "implemented",
"hetzner/cline": "implemented",
"digitalocean/cline": "implemented",
"vultr/cline": "implemented",
"linode/cline": "implemented",
"lambda/cline": "implemented",
"aws-lightsail/cline": "implemented",
"gcp/claude": "implemented",
"gcp/openclaw": "implemented",
"gcp/nanoclaw": "implemented",
"gcp/aider": "implemented",
"gcp/goose": "implemented",
"gcp/codex": "implemented",
"gcp/interpreter": "implemented",
"gcp/gemini": "implemented",
"gcp/amazonq": "implemented",
"gcp/cline": "implemented",
"e2b/claude": "implemented",
"e2b/openclaw": "implemented",
"e2b/nanoclaw": "implemented",
"e2b/aider": "implemented",
"e2b/goose": "implemented",
"e2b/codex": "implemented",
"e2b/interpreter": "implemented",
"e2b/gemini": "implemented",
"e2b/amazonq": "implemented",
"e2b/cline": "implemented",
"modal/claude": "implemented",
"modal/openclaw": "implemented",
"modal/nanoclaw": "implemented",
"modal/aider": "implemented",
"modal/goose": "implemented",
"modal/codex": "implemented",
"modal/interpreter": "implemented",
"modal/gemini": "implemented",
"modal/amazonq": "implemented",
"modal/cline": "implemented",
"sprite/gptme": "implemented",
"hetzner/gptme": "implemented",
"digitalocean/gptme": "implemented",
"vultr/gptme": "implemented",
"linode/gptme": "implemented",
"lambda/gptme": "implemented",
"aws-lightsail/gptme": "implemented",
"gcp/gptme": "implemented",
"e2b/gptme": "implemented",
"modal/gptme": "implemented",
"fly/claude": "implemented",
"fly/aider": "implemented",
"fly/openclaw": "implemented",
"fly/nanoclaw": "implemented",
"fly/goose": "implemented",
"fly/codex": "implemented",
"fly/interpreter": "implemented",
"fly/gemini": "implemented",
"fly/amazonq": "implemented",
"fly/cline": "implemented",
"fly/gptme": "implemented"
}
}