Commit graph

553 commits

Author SHA1 Message Date
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
A
d3da0c8dd5
feat: Implement civo/continue.sh script (#336)
Adds Continue CLI integration on Civo cloud platform using:
- Bun install for @continuedev/cli
- OpenRouter API key injection via OAuth
- Config file at ~/.continue/config.json with OpenRouter provider
- Interactive TUI launch via 'cn' command

Agent: gap-filler-civo-continue

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 19:18:22 -08:00
A
c3f4e09f6a
feat: Add Continue agent support for Daytona (#332)
Implements daytona/continue.sh script following the standard pattern:
- Sources daytona/lib/common.sh for cloud-specific primitives
- Installs Continue CLI via npm
- Injects OPENROUTER_API_KEY into shell environment
- Creates ~/.continue/config.json with OpenRouter provider
- Launches Continue TUI via interactive session

Updates manifest.json matrix entry to "implemented".

Agent: gap-filler-daytona-continue

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 19:17:31 -08:00
A
f74b23d679
feat: Implement ovh/continue.sh script (#333)
Add Continue CLI agent deployment script for OVHcloud. Uses OVH's Public
Cloud API for provisioning, installs Continue CLI via npm, and configures
OpenRouter integration with ~/.continue/config.json.

Agent: gap-filler-ovh-continue

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 19:17:15 -08:00
A
ffb6b70579
feat: Add BinaryLane Continue deployment script (#330)
Implements binarylane/continue.sh to run Continue CLI on BinaryLane servers.

- Uses BinaryLane REST API to provision Ubuntu 24.04 server
- Installs Node.js via NVM and Continue CLI (@continuedev/cli)
- Configures OpenRouter integration in ~/.continue/config.json
- Launches interactive TUI mode (cn command)

Agent: gap-filler-binarylane-continue

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 19:17:07 -08:00
A
769510ec14
feat: Implement fly/continue.sh script (#334)
Adds Continue CLI support on Fly.io by combining Fly.io's Machines API
primitives with Continue's setup steps. Includes OpenRouter config injection
via ~/.continue/config.json.

Agent: gap-filler-fly-continue

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 19:16:51 -08:00
A
9e774d431e
feat: Implement scaleway/continue.sh (#331)
Add Continue agent script for Scaleway cloud provider.

Uses scaleway/lib/common.sh primitives for provisioning and SSH connectivity.
Installs Continue CLI via npm, creates OpenRouter config at ~/.continue/config.json,
and launches interactive TUI mode via cn command.

Agent: gap-filler-scaleway-continue

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 19:16:45 -08:00
A
58dda2a3a0
feat: Implement latitude/continue.sh (#328)
Add Continue agent support for Latitude.sh cloud provider.

- Install Continue CLI via npm
- Configure OpenRouter API key
- Create ~/.continue/config.json with OpenRouter provider
- Launch interactive TUI mode

Agent: gap-filler-latitude-continue

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 19:16:44 -08:00
A
187cfafd71
feat: Add upcloud/continue.sh implementation (#327)
Implements Continue.dev CLI agent on UpCloud cloud platform:
- Uses UpCloud REST API to provision server
- Installs Continue CLI via npm
- Injects OpenRouter API key into environment
- Creates ~/.continue/config.json with OpenRouter provider
- Launches Continue in TUI mode

Agent: gap-filler-upcloud-continue

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 19:16:42 -08:00
B
83b60439d1 docs: Sync README matrix with manifest.json 2026-02-11 03:14:40 +00:00
A
d574d5541e
test: Add CLI entry point edge case tests (46 tests) (#326)
Covers untested paths in index.ts and commands.ts:
- Error output formatting for injection attacks (semicolons, $, backticks)
- Flag ordering edge cases (--prompt before/between/after positional args)
- Unknown flags with subcommands (--json, --format, --dry-run)
- --prompt interaction with subcommands (list, agents, clouds)
- Version flag variants (-v, -V, --version, version)
- Non-TTY behavior (help output when stdin is not TTY)
- Command aliases (ls -> list)
- --prompt-file error handling with real filesystem
- Agent/cloud display name resolution in cmdRun
- Subcommand output format verification
- Fuzzy matching edge cases in showInfoOrError
- SPAWN_NO_UNICODE and SPAWN_NO_UPDATE_CHECK env vars

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 19:04:23 -08:00
A
ca335aabdc
refactor: Extract helpers from start_oauth_server and ensure_sprite_installed (#325)
- start_oauth_server (68 -> 17 lines): Extract Node.js script generation
  into _generate_oauth_server_script helper
- ensure_sprite_installed (62 -> 49 lines): Extract duplicated version
  check-and-log pattern into _log_sprite_found helper

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 19:01:56 -08:00
A
9fc89d91f7
fix: Improve error messages and spinner feedback in CLI (#324)
- Spinner completion messages now show "done" state instead of repeating
  the in-progress message (e.g., "Loading manifest" instead of "Loading manifest...")
- Script failures show actionable troubleshooting (missing credentials,
  rate limits, dependencies) instead of generic "Script exited with code N"
- Ctrl+C (exit code 130) exits silently instead of showing an error
- Fuzzy matching for unknown agents/clouds now also searches display names,
  so "Hetzner" suggests "hetzner" even when the key doesn't fuzzy-match

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 19:00:56 -08:00
A
6c211588ce
refactor: Extract helpers from IONOS create_server (192 -> 82 lines) (#321)
Break down the 192-line create_server() into focused helpers:
- ionos_parse_api_error: centralize error message extraction (used 7x)
- ionos_check_api_error: centralize error check + log pattern (used 7x)
- _ionos_find_ubuntu_image: Ubuntu image lookup
- _ionos_create_boot_volume: volume creation + wait loop
- _ionos_wait_for_server_ip: IP address polling loop

No behavior changes. All bash -n and bun tests pass.

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 18:58:39 -08:00
A
9123528653
test: Add cmdRun display name resolution and validateImplementation tests (#322)
Cover untested integration paths: cmdRun resolving case-insensitive
display names with "Resolved" log messages, validateImplementation
showing ">3 clouds" hint and "no cloud providers" fallback, and
launch message formatting with/without prompt.

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 18:58:35 -08:00
A
d2103fa90c
fix: Prevent team lead session from exiting after spawning agents (#323)
Root cause: `claude -p` (print mode) terminates the session when the
model produces a text response with no tool call. The team lead would
spawn 6 agents, output "I'll wait for messages", and the session would
end — orphaning all agents.

Fix: the prompt now explains the technical constraint (must always
include a tool call) and prescribes an active polling loop using
TaskList + `sleep 30` + gh pr list to stay alive while waiting for
teammate messages, instead of passively waiting.

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 18:56:42 -08:00
B
ca26349bdd feat: Add activity watchdog to discovery cycles (from refactor.sh)
Replaces the naive `claude | tee` pipe with a background process +
watchdog loop that monitors log file growth every 10 seconds.

If no output is produced for 10 minutes (IDLE_TIMEOUT=600s), the
watchdog kills the hung process. This catches stuck API calls,
network hangs, and the team lead silently exiting while teammates
are orphaned — much faster than waiting for the 75min RUN_TIMEOUT_MS.

Team cycle: 10min idle timeout, 60min hard wall-clock timeout
Single cycle: 10min idle timeout, 35min hard wall-clock timeout

The next cron trigger starts a fresh cycle automatically.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-11 02:11:48 +00:00
A
895ef08deb
feat: Add Continue agent for 8 clouds (digitalocean, vultr, linode, aws-lightsail, gcp, github-codespaces, e2b, modal) (#316)
Implements Continue CLI agent on 8 cloud providers:
- digitalocean/continue.sh
- vultr/continue.sh
- linode/continue.sh
- aws-lightsail/continue.sh
- gcp/continue.sh
- github-codespaces/continue.sh
- e2b/continue.sh
- modal/continue.sh

All scripts follow the standard pattern:
1. Source cloud lib/common.sh with local/remote fallback
2. Authenticate with cloud provider
3. Provision server/sandbox
4. Install Continue CLI via npm
5. Inject OPENROUTER_API_KEY env var
6. Create ~/.continue/config.json with OpenRouter provider
7. Launch interactive TUI session with 'cn' command

Updated manifest.json to mark all 8 combinations as "implemented".

Agent: gap-filler-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 18:01:08 -08:00
A
56778b89e0
feat: Add Continue agent for 7 clouds (Kamatera, Cherry, Oracle, Koyeb, Northflank, Railway, Render) (#314)
Implemented Continue CLI TUI mode on:
- kamatera/continue.sh
- cherry/continue.sh
- oracle/continue.sh
- koyeb/continue.sh
- northflank/continue.sh
- railway/continue.sh
- render/continue.sh

All scripts follow the standard pattern:
1. Source cloud-specific lib/common.sh
2. Authenticate with cloud provider
3. Provision server/container
4. Install Continue CLI via npm
5. Inject OpenRouter API key
6. Create ~/.continue/config.json with OpenRouter provider
7. Launch interactive TUI session with 'cn' command

Agent: gap-filler-3

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 18:00:42 -08:00
A
12c2f7a8cf
feat: Add 12 missing IONOS agent scripts (#317)
Implemented the following IONOS cloud combinations:
- ionos/openclaw
- ionos/nanoclaw
- ionos/codex
- ionos/interpreter
- ionos/gemini
- ionos/amazonq
- ionos/cline
- ionos/gptme
- ionos/opencode
- ionos/plandex
- ionos/kilocode
- ionos/continue

All scripts follow the standard IONOS pattern:
1. Source ionos/lib/common.sh with local/remote fallback
2. Resolve IONOS credentials (IONOS_USERNAME, IONOS_PASSWORD)
3. Generate SSH key
4. Create server with cloud-init
5. Wait for SSH and cloud-init completion
6. Install agent (npm, pip, or curl installer)
7. Get OpenRouter API key via OAuth
8. Inject environment variables
9. Launch interactive session

Updated manifest.json to mark all 12 combinations as implemented.

Agent: gap-filler-4

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 18:00:35 -08:00
A
ab89ffb90d
fix: Improve compact list view clarity and help text formatting (#313)
- Rename "Missing" column to "Not available on" to avoid confusion
- Change "all clouds" to "-- all clouds supported" for full coverage agents
- Only show +/- grid legend in grid view (not compact view)
- Fix help text alignment for "spawn list" 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 18:00:17 -08:00
A
bca768ecd2
test: Add E2E tests for cmdRun argument resolution and swapping (#311)
Tests 5 critical untested paths in commands.ts and index.ts:
- Argument swapping detection (spawn cloud agent -> spawn agent cloud)
- Display name resolution (Claude Code -> claude, Hetzner Cloud -> hetzner)
- Case-insensitive key resolution (CLAUDE -> claude, Sprite -> sprite)
- showInfoOrError display name resolution for single-arg mode
- Did-you-mean suggestions for typos in agent/cloud names

27 new tests, all passing.

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 18:00:14 -08:00