diff --git a/README.md b/README.md index c76487c8..87d22146 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ export OPENROUTER_API_KEY=sk-or-v1-xxxxx # Cloud-specific credentials (varies by provider) export SPRITE_API_KEY=... # For Sprite export HCLOUD_TOKEN=... # For Hetzner -export DIGITALOCEAN_TOKEN=... # For DigitalOcean +export DO_API_TOKEN=... # For DigitalOcean # Run non-interactively spawn claude sprite diff --git a/aws-lightsail/README.md b/aws-lightsail/README.md index 3b60b3c2..5251c646 100644 --- a/aws-lightsail/README.md +++ b/aws-lightsail/README.md @@ -66,6 +66,24 @@ bash <(curl -fsSL https://openrouter.ai/lab/spawn/aws-lightsail/amazonq.sh) bash <(curl -fsSL https://openrouter.ai/lab/spawn/aws-lightsail/cline.sh) ``` +#### gptme + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/aws-lightsail/gptme.sh) +``` + +#### OpenCode + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/aws-lightsail/opencode.sh) +``` + +#### Plandex + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/aws-lightsail/plandex.sh) +``` + ## Non-Interactive Mode ```bash diff --git a/civo/README.md b/civo/README.md index c3d1f4ad..628a53dc 100644 --- a/civo/README.md +++ b/civo/README.md @@ -10,18 +10,78 @@ Civo cloud-native instances via REST API. [Civo](https://www.civo.com/) bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/claude.sh) ``` +#### OpenClaw + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/openclaw.sh) +``` + +#### NanoClaw + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/nanoclaw.sh) +``` + #### Aider ```bash bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/aider.sh) ``` +#### Goose + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/goose.sh) +``` + #### Codex CLI ```bash bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/codex.sh) ``` +#### Open Interpreter + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/interpreter.sh) +``` + +#### Gemini CLI + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/gemini.sh) +``` + +#### Amazon Q CLI + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/amazonq.sh) +``` + +#### Cline + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/cline.sh) +``` + +#### gptme + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/gptme.sh) +``` + +#### OpenCode + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/opencode.sh) +``` + +#### Plandex + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/civo/plandex.sh) +``` + ## Non-Interactive Mode ```bash diff --git a/cli/src/index.ts b/cli/src/index.ts index 512033ae..4e9ff3b6 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -56,23 +56,33 @@ async function main(): Promise { let prompt: string | undefined; let filteredArgs = [...args]; - const promptIndex = args.findIndex(arg => arg === "--prompt" || arg === "-p"); - if (promptIndex !== -1 && args[promptIndex + 1]) { - prompt = args[promptIndex + 1]; + const promptIndex = filteredArgs.findIndex(arg => arg === "--prompt" || arg === "-p"); + if (promptIndex !== -1) { + if (!filteredArgs[promptIndex + 1] || filteredArgs[promptIndex + 1].startsWith("-")) { + console.error(`Error: ${filteredArgs[promptIndex]} requires a value`); + console.error(`\nUsage: spawn ${filteredArgs[promptIndex]} "your prompt here"`); + process.exit(1); + } + prompt = filteredArgs[promptIndex + 1]; // Remove --prompt and its value from args filteredArgs.splice(promptIndex, 2); } // Extract --prompt-file flag - const promptFileIndex = args.findIndex(arg => arg === "--prompt-file"); - if (promptFileIndex !== -1 && args[promptFileIndex + 1]) { + const promptFileIndex = filteredArgs.findIndex(arg => arg === "--prompt-file"); + if (promptFileIndex !== -1) { + if (!filteredArgs[promptFileIndex + 1] || filteredArgs[promptFileIndex + 1].startsWith("-")) { + console.error(`Error: --prompt-file requires a file path`); + console.error(`\nUsage: spawn --prompt-file instructions.txt`); + process.exit(1); + } const { readFileSync } = await import("fs"); try { - prompt = readFileSync(args[promptFileIndex + 1], "utf-8"); + prompt = readFileSync(filteredArgs[promptFileIndex + 1], "utf-8"); // Remove --prompt-file and its value from args filteredArgs.splice(promptFileIndex, 2); } catch (err) { - console.error(`Error reading prompt file '${args[promptFileIndex + 1]}': ${err && typeof err === "object" && "message" in err ? err.message : String(err)}`); + console.error(`Error reading prompt file '${filteredArgs[promptFileIndex + 1]}': ${err && typeof err === "object" && "message" in err ? err.message : String(err)}`); console.error(`\nMake sure the file exists and is readable.`); process.exit(1); } diff --git a/digitalocean/README.md b/digitalocean/README.md index fdf1877f..61abe9ca 100644 --- a/digitalocean/README.md +++ b/digitalocean/README.md @@ -64,6 +64,24 @@ bash <(curl -fsSL https://openrouter.ai/lab/spawn/digitalocean/amazonq.sh) bash <(curl -fsSL https://openrouter.ai/lab/spawn/digitalocean/cline.sh) ``` +#### gptme + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/digitalocean/gptme.sh) +``` + +#### OpenCode + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/digitalocean/opencode.sh) +``` + +#### Plandex + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/digitalocean/plandex.sh) +``` + ## Non-Interactive Mode ```bash diff --git a/e2b/README.md b/e2b/README.md index 5c26a57f..56e81c5c 100644 --- a/e2b/README.md +++ b/e2b/README.md @@ -66,6 +66,24 @@ bash <(curl -fsSL https://openrouter.ai/lab/spawn/e2b/amazonq.sh) bash <(curl -fsSL https://openrouter.ai/lab/spawn/e2b/cline.sh) ``` +#### gptme + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/e2b/gptme.sh) +``` + +#### OpenCode + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/e2b/opencode.sh) +``` + +#### Plandex + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/e2b/plandex.sh) +``` + ## Non-Interactive Mode ```bash diff --git a/fly/lib/common.sh b/fly/lib/common.sh index e6bc2472..f7d2e6d6 100644 --- a/fly/lib/common.sh +++ b/fly/lib/common.sh @@ -123,8 +123,8 @@ ensure_fly_token() { # 4. Prompt and validate echo "" log_warn "Fly.io API Token Required" - echo -e "${YELLOW}Get your token by running: fly tokens deploy${NC}" - echo -e "${YELLOW}Or create one at: https://fly.io/dashboard → Tokens${NC}" + printf '%b\n' "${YELLOW}Get your token by running: fly tokens deploy${NC}" + printf '%b\n' "${YELLOW}Or create one at: https://fly.io/dashboard → Tokens${NC}" echo "" local token diff --git a/gcp/README.md b/gcp/README.md index 87425352..f6070bfc 100644 --- a/gcp/README.md +++ b/gcp/README.md @@ -66,6 +66,24 @@ bash <(curl -fsSL https://openrouter.ai/lab/spawn/gcp/amazonq.sh) bash <(curl -fsSL https://openrouter.ai/lab/spawn/gcp/cline.sh) ``` +#### gptme + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/gcp/gptme.sh) +``` + +#### OpenCode + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/gcp/opencode.sh) +``` + +#### Plandex + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/gcp/plandex.sh) +``` + ## Non-Interactive Mode ```bash diff --git a/hetzner/README.md b/hetzner/README.md index 205b68e3..352fab00 100644 --- a/hetzner/README.md +++ b/hetzner/README.md @@ -64,6 +64,24 @@ bash <(curl -fsSL https://openrouter.ai/lab/spawn/hetzner/amazonq.sh) bash <(curl -fsSL https://openrouter.ai/lab/spawn/hetzner/cline.sh) ``` +#### gptme + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/hetzner/gptme.sh) +``` + +#### OpenCode + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/hetzner/opencode.sh) +``` + +#### Plandex + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/hetzner/plandex.sh) +``` + ## Non-Interactive Mode ```bash diff --git a/lambda/README.md b/lambda/README.md index 6534664d..00d1eeca 100644 --- a/lambda/README.md +++ b/lambda/README.md @@ -66,6 +66,24 @@ bash <(curl -fsSL https://openrouter.ai/lab/spawn/lambda/amazonq.sh) bash <(curl -fsSL https://openrouter.ai/lab/spawn/lambda/cline.sh) ``` +#### gptme + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/lambda/gptme.sh) +``` + +#### OpenCode + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/lambda/opencode.sh) +``` + +#### Plandex + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/lambda/plandex.sh) +``` + ## Non-Interactive Mode ```bash diff --git a/linode/README.md b/linode/README.md index 4cd319fd..7f2c3134 100644 --- a/linode/README.md +++ b/linode/README.md @@ -64,6 +64,24 @@ bash <(curl -fsSL https://openrouter.ai/lab/spawn/linode/amazonq.sh) bash <(curl -fsSL https://openrouter.ai/lab/spawn/linode/cline.sh) ``` +#### gptme + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/linode/gptme.sh) +``` + +#### OpenCode + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/linode/opencode.sh) +``` + +#### Plandex + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/linode/plandex.sh) +``` + ## Non-Interactive Mode ```bash diff --git a/modal/README.md b/modal/README.md index 1efe04c7..7847709b 100644 --- a/modal/README.md +++ b/modal/README.md @@ -66,6 +66,24 @@ bash <(curl -fsSL https://openrouter.ai/lab/spawn/modal/amazonq.sh) bash <(curl -fsSL https://openrouter.ai/lab/spawn/modal/cline.sh) ``` +#### gptme + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/modal/gptme.sh) +``` + +#### OpenCode + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/modal/opencode.sh) +``` + +#### Plandex + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/modal/plandex.sh) +``` + ## Non-Interactive Mode ```bash diff --git a/sprite/README.md b/sprite/README.md index 8885417d..6477ba4e 100644 --- a/sprite/README.md +++ b/sprite/README.md @@ -64,6 +64,24 @@ bash <(curl -fsSL https://openrouter.ai/lab/spawn/sprite/amazonq.sh) bash <(curl -fsSL https://openrouter.ai/lab/spawn/sprite/cline.sh) ``` +#### gptme + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/sprite/gptme.sh) +``` + +#### OpenCode + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/sprite/opencode.sh) +``` + +#### Plandex + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/sprite/plandex.sh) +``` + ## Non-Interactive Mode ```bash diff --git a/vultr/README.md b/vultr/README.md index 713c7dc3..b52e2236 100644 --- a/vultr/README.md +++ b/vultr/README.md @@ -64,6 +64,24 @@ bash <(curl -fsSL https://openrouter.ai/lab/spawn/vultr/amazonq.sh) bash <(curl -fsSL https://openrouter.ai/lab/spawn/vultr/cline.sh) ``` +#### gptme + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/vultr/gptme.sh) +``` + +#### OpenCode + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/vultr/opencode.sh) +``` + +#### Plandex + +```bash +bash <(curl -fsSL https://openrouter.ai/lab/spawn/vultr/plandex.sh) +``` + ## Non-Interactive Mode ```bash