Commit graph

16 commits

Author SHA1 Message Date
A
fdc5d5e58b
refactor: extract shared SSH helpers to eliminate ~410 lines of duplication (#429)
Add ssh_run_server, ssh_upload_file, ssh_interactive_session, and
ssh_verify_connectivity to shared/common.sh. These four functions
were copy-pasted identically across 21 cloud provider lib files,
differing only in SSH username (root vs ubuntu).

Providers now set SSH_USER and delegate to the shared helpers via
one-line wrappers, reducing each provider's lib by ~20 lines.

Agent: complexity-hunter

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-11 03:45:18 -08:00
A
81bab47a74
fix: Escape API keys in continue.sh JSON configs to prevent injection (#374)
Replace vulnerable heredoc patterns across 27 continue.sh scripts with
setup_continue_config() helper that uses json_escape() + upload_config_file()
to safely handle API keys containing special characters like quotes or braces.

Also fix _save_token_to_config() in shared/common.sh which had the same
unescaped heredoc vulnerability for local token storage.

Relates to #104

Agent: security-auditor

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-11 00:13:19 -08:00
A
b04ff38c70
refactor: Extract sub-functions from civo and exoscale create_server() (#371)
- Civo: Extract get_cloud_init_userdata() and _handle_civo_create_error()
  from create_server() (64 -> 38 lines, 40% reduction)
- Exoscale: Extract _write_cloud_init_tempfile() and
  _handle_exoscale_create_error() from create_server() (54 -> 39 lines,
  28% reduction)

Agent: complexity-hunter

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-11 00:09:59 -08:00
A
4528c11ebf
feat(exoscale): Add continue support (#349)
Implements exoscale/continue matrix entry using Exoscale cloud primitives
and Continue installation pattern from existing implementations.

Agent: gap-filler-exoscale-4

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:36:11 -08:00
A
21343b836a
feat(exoscale): Add codex support (#352)
Implements exoscale/codex matrix entry. Uses Exoscale's instance
primitives to deploy Codex CLI with OpenRouter integration.

Agent: gap-filler-exoscale-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:35:51 -08:00
A
9c431db647
feat(exoscale): Add amazonq support (#351)
Implements exoscale/amazonq matrix entry.

Agent: gap-filler-exoscale-2

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:35:49 -08:00
A
df157a401a
feat(exoscale): Add OpenCode support (#350)
Implements exoscale/opencode matrix entry.

Agent: gap-filler-exoscale-3

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:35:36 -08:00
A
e75764bb4d
feat(exoscale): Add kilocode support (#345)
Implements exoscale/kilocode matrix entry using Exoscale cloud primitives
and Kilo Code installation pattern from existing implementations.

Agent: gap-filler-exoscale-4

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:35:32 -08:00
A
834b0544ca
feat(exoscale): Add nanoclaw support (#348)
Implements exoscale/nanoclaw matrix entry. Uses Exoscale's instance
primitives to deploy NanoClaw with OpenRouter integration.

Agent: gap-filler-exoscale-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:35:08 -08:00
A
411c1fb399
feat(exoscale): Add gemini support (#347)
Implements exoscale/gemini matrix entry.

Agent: gap-filler-exoscale-2

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:35:04 -08:00
A
b18d71b191
feat(exoscale): Add gptme support (#346)
Implements exoscale/gptme matrix entry.

Agent: gap-filler-exoscale-3

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:34:59 -08:00
A
c60c92f0bf
feat(exoscale): Add openclaw support (#342)
Implements exoscale/openclaw matrix entry. Uses Exoscale's instance
primitives to deploy OpenClaw with OpenRouter integration.

Agent: gap-filler-exoscale-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:34:11 -08:00
A
8299147bf9
feat(exoscale): Add interpreter support (#344)
Implements exoscale/interpreter matrix entry.

Agent: gap-filler-exoscale-2

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:34:09 -08:00
A
38819575d9
feat(exoscale): Add plandex support (#343)
Implements exoscale/plandex matrix entry using Exoscale cloud primitives
and Plandex installation pattern from existing implementations.

Agent: gap-filler-exoscale-4

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:34:06 -08:00
A
0f7f9f47b6
feat(exoscale): Add Cline support (#341)
Implements exoscale/cline matrix entry.

Agent: gap-filler-exoscale-3

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:34:02 -08:00
A
b7e0c63bfc
feat: Add Exoscale cloud provider with 3 agent implementations (#338)
Add Exoscale as a new cloud provider to Spawn with:
- European cloud with per-second billing across 7 zones
- CLI-based provisioning via exo tool (auto-installed)
- SSH access with ubuntu user
- Implements claude, aider, and goose agents

Technical details:
- exoscale/lib/common.sh: Provider primitives using exo CLI
- Auto-installs exo CLI from GitHub releases (v1.90.1)
- Supports EXOSCALE_API_KEY + EXOSCALE_API_SECRET auth
- Default zone: ch-gva-2 (Geneva), configurable to 6 other zones
- Uses standard.small instance type by default
- Cloud-init support for agent setup
- Full OpenRouter integration for all agents

Matrix: Added 15 missing entries, implemented 3 (claude, aider, goose)

Agent: cloud-scout

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 19:24:05 -08:00