Commit graph

574 commits

Author SHA1 Message Date
A
6debf956a3
refactor: Extract helpers from complex OVH and Latitude functions (#384)
OVH: Extract _ovh_extract_public_ipv4() and _ovh_extract_status() from
wait_for_ovh_instance() to reduce inline Python and improve readability.

Latitude: Extract _latitude_extract_error(), _latitude_get_ssh_key_ids(),
and _latitude_build_server_body() from create_server() and
latitude_register_ssh_key(). Deduplicates error extraction logic used in
two places.

Agent: complexity-hunter

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-02-11 01:00:42 -08:00
A
928062b0f8
feat: Add local cloud provider for running agents on local machine (#383)
Adds a "local" cloud provider that installs and runs agents directly on the
user's machine without any cloud provisioning. This is useful for local
development and testing.

- local/lib/common.sh: Cloud lib with local execution functions
- local/claude.sh: Claude Code agent script
- local/openclaw.sh: OpenClaw agent script
- local/nanoclaw.sh: NanoClaw agent script
- manifest.json: Added local cloud + matrix entries
- test/: Updated record.sh and mock.sh for local cloud support

Fixes #378

Agent: issue-fixer

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:52:57 -08:00
A
b96243904c
feat: Add Contabo gemini support (#380)
Agent: gap-filler-contabo-2

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 00:51:09 -08:00
A
5181f28704
feat: Add local cloud provider for running agents on local machine (#381)
Adds a "local" cloud provider that installs and runs agents directly on the
user's machine without any cloud provisioning. This is useful for local
development and testing.

- local/lib/common.sh: Cloud lib with local execution functions
- local/claude.sh: Claude Code agent script
- local/openclaw.sh: OpenClaw agent script
- local/nanoclaw.sh: NanoClaw agent script
- manifest.json: Added local cloud + matrix entries
- test/: Updated record.sh and mock.sh for local cloud support

Fixes #378

Agent: issue-fixer

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:50:05 -08:00
B
3cba5223b0 docs: Sync README matrix with manifest.json
Agent: team-lead
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 08:49:16 +00:00
A
fecd95ff13
feat: Add Hostinger nanoclaw support (#379)
Agent: gap-filler-hostinger

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 00:36:22 -08:00
A
cf33813acb
test: Add 36 tests for cmdList grid view and cmdClouds type grouping (#377)
Cover previously untested rendering paths in commands.ts:
- cmdList grid view: header, separator, matrix rows (+/-), legend, footer counts
- cmdList edge cases: all-implemented, all-missing, single agent/cloud manifests
- cmdClouds type grouping: clouds grouped by type field (vm, cloud, container, sandbox)
- cmdClouds: type header ordering, agent count ratio, total count in header

Agent: test-engineer

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-02-11 00:33:55 -08:00
A
53bd5cc620
refactor: Extract sub-functions from oracle and ionos create_server() (#376)
Oracle create_server (60 lines -> 32 lines):
- _encode_userdata_b64: base64-encode cloud-init data
- _launch_oci_instance: OCI CLI launch call + shape config + error handling

IONOS create_server (53 lines -> 47 lines):
- _ionos_build_server_body: build JSON request body for server creation
- _ionos_launch_and_attach: API call + volume attachment logic

Agent: complexity-hunter

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-02-11 00:32:34 -08:00
A
18242a6741
fix: Show loading spinner for single-arg commands (spawn <agent>, spawn <cloud>) (#375)
The showInfoOrError function loaded the manifest without a spinner,
causing no visual feedback on cold cache. Now uses loadManifestWithSpinner
so users see a loading indicator while the manifest fetches.

Agent: ux-engineer

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 00:32:25 -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
9fd35a77b7
feat: Add quick-start section to cloud and agent info views (#373)
Show actionable auth setup commands in `spawn <cloud>` and `spawn <agent>`
output so users can get started immediately without reading README docs.

For clouds with env var auth (e.g. Hetzner), shows exact export commands:
  Quick start:
    export HCLOUD_TOKEN=your-hcloud-token-here
    spawn claude hetzner

For agents, shows OpenRouter API key and example launch command:
  Quick start:
    export OPENROUTER_API_KEY=sk-or-v1-...
    spawn claude sprite

Also adds parseAuthEnvVars() utility with 6 tests and 8 quick-start
integration tests.

Agent: ux-engineer

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:15 -08:00
A
cff08eb624
test: Add 49 tests for command utility functions (commands-utils.test.ts) (#372)
Export and test 7 previously-unexported utility functions from commands.ts:
getTerminalWidth, getMissingClouds, getImplementedAgents, getImplementedClouds,
getErrorMessage, calculateColumnWidth, getStatusDescription.

Agent: test-engineer

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:10:04 -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
B
8945e8162b docs: Sync README matrix with manifest.json
Agent: team-lead
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 07:54:08 +00:00
A
2668d6da27
test: Add 26 tests for cmdCloudInfo/cmdAgentInfo untested display branches (#370)
Cover previously untested code paths:
- cmdCloudInfo "Not yet available" missing agents text (<=5 threshold)
- cmdCloudInfo setup URL and auth field display
- cmdCloudInfo agent count (N of M) format
- cmdAgentInfo URL and notes display
- cmdAgentInfo cloud count and type grouping

Agent: test-engineer

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-02-10 23:47:36 -08:00
A
48262d96e5
refactor: Extract sub-functions from longest create_server functions (#369)
Split the two longest functions in the codebase into focused sub-functions:

Contabo create_server (108 -> 52 lines):
- _contabo_get_ssh_secret_ids: fetch SSH secret IDs from API
- _contabo_build_instance_body: construct API request JSON
- _contabo_wait_for_instance: poll until instance is running

Genesis Cloud create_server (91 -> 42 lines):
- _genesis_get_ssh_key_ids: fetch SSH key IDs from API
- _genesis_build_instance_body: construct API request JSON
- _genesis_wait_for_instance: poll until instance is active

No behavioral changes - pure restructuring for readability.

Agent: complexity-hunter

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-02-10 23:46:24 -08:00
A
bb84cb073a
fix: Improve error messages with actionable troubleshooting guidance (#368)
- Manifest load failure now shows specific troubleshooting steps including
  cache directory path for manual cleanup
- Non-TTY mode explains why interactive picker is unavailable and suggests
  the direct launch syntax instead of silently falling through to help
- `spawn update` network failure now includes recovery steps and manual
  update command

Agent: ux-engineer

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 23:45:20 -08:00
A
78fe6a0f2b
feat: Add Contabo NanoClaw deployment script (#367)
Implement contabo/nanoclaw.sh with WhatsApp-based AI agent support.

- Uses Contabo VPS provisioning via OAuth API
- Installs tsx, clones nanoclaw repo, builds with npm
- Configures OpenRouter API credentials via env vars and .env file
- Launches interactive session with WhatsApp QR code auth

Agent: gap-filler-contabo-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 23:32:21 -08:00
A
6319b6ba74
feat: Add contabo/amazonq.sh script (#366)
Implement Amazon Q CLI on Contabo VPS. Uses OAuth password grant auth, provisions V45 instance with cloud-init, installs Amazon Q CLI, injects OpenRouter env vars (OPENAI_API_KEY, OPENAI_BASE_URL), and launches interactive Q chat session.

Agent: gap-filler-contabo-2

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 23:32:11 -08:00
A
e34fb655ff
feat: Add contabo/kilocode.sh script (#365)
Implements Kilo Code deployment on Contabo VPS:
- Uses Contabo OAuth API for server provisioning
- Installs @kilocode/cli via npm
- Injects OpenRouter API key as KILO_OPEN_ROUTER_API_KEY
- Sets KILO_PROVIDER_TYPE=openrouter for native OpenRouter support
- Launches interactive Kilo Code CLI session

Agent: gap-filler-remaining

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 23:32:08 -08:00
B
f5da7ae43e docs: Sync README matrix with manifest.json
- Update stats from 27→29 clouds, 393→411 combinations
- Add Contabo and Hostinger columns to matrix
- Fix Civo and Scaleway showing as missing (they're implemented)
- Reflect current 411/435 matrix coverage (94.5%)

Agent: team-lead
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 07:30:24 +00:00
A
835ccc7522
fix: Improve CLI info pages with counts and type grouping (#364)
- Agent info (spawn <agent>) now shows "X of Y" cloud count and groups
  clouds by type (api, cli, sandbox) for easier scanning
- Cloud info (spawn <cloud>) now shows "X of Y" agent count, auth method,
  and lists missing agents when there are 5 or fewer
- Cloud listing (spawn clouds) groups providers by type with X/Y ratio
  counts instead of singular/plural text
- Remove unused TYPE_COLUMN_WIDTH constant
- Bump CLI version to 0.2.26

Agent: ux-engineer

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 23:25:03 -08:00
A
d681c93a67
test: Add exhaustive shell script convention tests for all 411 scripts (#363)
Validates ALL implemented scripts against CLAUDE.md shell script rules,
covering shebang, set -eo pipefail, lib/common.sh sourcing, macOS bash
3.x compatibility (no echo -e, no source <(), no set -u), and remote
fallback patterns. Unlike manifest-integrity.test.ts which samples 20
scripts, this checks every implemented script exhaustively.

Agent: test-engineer

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
2026-02-10 23:20:49 -08:00
A
d9da7eac1e
refactor: Reduce complexity in kamatera and modal cloud libraries (#362)
Extract helper functions from the two longest create_server() functions:

kamatera/lib/common.sh (73 -> 21 lines):
- _read_ssh_public_key: reads SSH public key file
- _build_kamatera_init_script: builds cloud-init heredoc
- _submit_and_wait_kamatera_server: API call, command parsing, wait loop

modal/lib/common.sh (67 -> 23 lines):
- _validate_modal_params: validates image name and sandbox name
- _invoke_modal_create: runs Python SDK sandbox creation
- _report_modal_create_error: troubleshooting guidance output

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-10 23:19:42 -08:00
A
75e3703c55
fix: Validate env var inputs in Hostinger and Contabo create_server (#361)
Hostinger: HOSTINGER_OS_TEMPLATE was interpolated into Python code
without validation, allowing Python code injection via env var.
Added validate_resource_name check.

Contabo: CONTABO_PRODUCT_ID, CONTABO_REGION, CONTABO_IMAGE_ID were
interpolated into Python strings without validation. CONTABO_PERIOD
was interpolated as bare Python (not even quoted), allowing arbitrary
code execution. Added validate_resource_name, validate_region_name,
and integer validation checks.

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-10 23:18:35 -08:00
A
66f71d7d4d
test: Add tests for display-name suggestion paths in validateAgent/validateCloud (#360)
Cover the previously untested branch in validateAgent (lines 150-158) and
validateCloud (lines 186-194) where findClosestMatch against display names
is used when key-based suggestion fails. Also tests findClosestMatch with
display name arrays and end-to-end through cmdRun/cmdAgentInfo/cmdCloudInfo.

22 new tests, all pass.

Agent: test-engineer

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 22:49:45 -08:00
A
4c00f3781e
refactor: Reduce complexity in cherry and contabo cloud libraries (#359)
Cherry Servers (cherry/lib/common.sh):
- Replace 59-line ensure_ssh_key with ensure_ssh_key_with_provider (1 line)
- Replace 22-line verify_server_connectivity with generic_ssh_wait (1 line)
- Replace 18-line ensure_cherry_token with ensure_api_token_with_provider (5 lines)
- Replace raw curl calls with cherry_api wrapper using generic_cloud_api
- Use $SSH_OPTS instead of hardcoded SSH options in run_server/upload_file/interactive_session
- Change exit 1 to return 1 for testability and consistency
- Remove unused _cherry_find_key_by_fingerprint helper

Contabo (contabo/lib/common.sh):
- Replace 47-line contabo_api (separate GET/POST/DELETE branches) with
  generic_cloud_api (5-line wrapper, gains automatic retry with backoff)
- Extract 54-line ensure_contabo_credentials into helpers:
  _load_contabo_config, _prompt_contabo_cred, _save_contabo_config
- Fix config save to use json_escape instead of raw variable interpolation
- Add check_python_available and environment variable fast-path

Net: -73 lines, 2 files changed

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-10 22:49:41 -08:00
A
adab8511f5
fix: Improve CLI info pages and error messages (#358)
- Show agent/cloud URLs in info pages (spawn <agent>, spawn <cloud>)
- Add setup instructions link to cloud info pages
- Suggest available clouds when --prompt is used without a cloud arg
- Fix help text alignment for spawn list

Agent: ux-engineer

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 22:48:22 -08:00
A
00cb355ce0
fix: Only grep new log content for result event, not old cycles (#357)
The log file is cumulative — result events from previous cycles persist.
The watchdog was grepping the entire file, so every new cycle immediately
matched an old result event and killed itself after 13 seconds.

Now records log file size at cycle start (LOG_START_SIZE) and only
searches content written since then via `tail -c +OFFSET | grep`.

Applied to both refactor.sh and discovery.sh.

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 22:35:17 -08:00
Sprite
dbd9980ebc test: Update README matrix after QA cycle
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 06:34:06 +00:00
A
a1416fa078
fix: Apply reliable process kill and result detection to discovery.sh (#356)
Ports the same three improvements from refactor.sh (#340, #355):
1. Capture claude's actual PID via subshell wrapper (not tee's)
2. Detect stream-json "result" event and exit in 30s instead of 10min
3. kill_claude() kills the full process tree (TERM→5s→KILL)

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 21:15:39 -08:00
A
d5ff7fbeef
fix: Kill claude process tree reliably via captured PID (#355)
* refactor: Automated improvements

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix: Kill claude process tree reliably via captured PID

The watchdog was killing tee (last in the pipe), not claude. Killing
tee doesn't propagate — claude and its agent subprocesses stay alive
as zombies, blocking the trigger server slot.

Now captures claude's actual PID via a subshell wrapper and kills the
full tree: SIGTERM children → SIGTERM claude → 5s grace → SIGKILL.

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

---------

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 21:06:23 -08:00
A
7b3ad8fa75
feat: Add Hostinger cloud provider with 3 agent implementations (#354)
Add Hostinger VPS hosting as a new cloud provider with REST API
provisioning and cloud-init support. Budget VPS starting at $4.95/mo
with hourly billing.

Implementation:
- hostinger/lib/common.sh: Full API wrapper with auth, provisioning,
  SSH management, and cleanup functions
- hostinger/claude.sh: Claude Code on Hostinger VPS
- hostinger/aider.sh: Aider on Hostinger VPS
- hostinger/openclaw.sh: OpenClaw on Hostinger VPS
- hostinger/README.md: Complete usage documentation

Added to manifest.json:
- New cloud entry with API details and defaults
- 15 matrix entries (hostinger/claude through hostinger/continue)
- 3 implemented, 12 marked as "missing"

Agent: cloud-scout-2

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 20:42:54 -08:00
A
ed4d37d0fa
feat: Add Contabo cloud provider with claude, aider, openclaw (#353)
Contabo is a budget European VPS provider with affordable CPU instances
starting at $4.95/month. Ideal for AI agents using remote API inference.

Key features:
- Budget-friendly pricing ($4.95-$59/mo)
- Full REST API with OAuth2 authentication
- Cloud-init/user_data support for provisioning
- Full root access via SSH
- European data centers (GDPR-friendly)
- Unlimited traffic included

Implementation:
- contabo/lib/common.sh: OAuth2 token flow, instance provisioning, SSH access
- contabo/claude.sh: Claude Code deployment (implemented)
- contabo/aider.sh: Aider deployment (implemented)
- contabo/openclaw.sh: OpenClaw deployment (implemented)
- manifest.json: Added Contabo cloud + 15 matrix entries (3 implemented)
- contabo/README.md: Complete usage guide with API setup

Authentication uses OAuth2 password grant requiring 4 credentials from
https://my.contabo.com/api/details: Client ID, Client Secret, API User,
API Password.

Agent: cloud-scout-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 20:40:42 -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
B
c780bb4816 docs: Sync README matrix with manifest.json
Agent: team-lead
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 04:32:24 +00:00
A
0ab5dd0887
fix: Detect stream-json result event and exit cleanly instead of waiting (#340)
After `claude -p` emits the stream-json "result" event, the session is
complete but the process hangs waiting for agent subprocesses. The
watchdog was waiting 10 min of silence before killing — wasting time.

Now the watchdog greps for `"type":"result"` in the log every 10s.
Once detected: 30s grace for cleanup, then kill. Also treats
SESSION_ENDED as success for checkpoint creation.

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 19:58:01 -08:00
Ahmed Abushagur
8b9f9a0e5a
QA-Bot setup (#335)
* feat: testing

* feat: auto-fix dead apis

* fix: mock works

* feat: new fixtures

* fix: more clouds tested

* fix: dry run fix

* fix: civo valid size

* fix: civo result wait

* feat: fixtures

* feat: per cloud agent
2026-02-10 19:51:07 -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