Commit graph

1598 commits

Author SHA1 Message Date
A
ae74b0264b
feat: Add Contabo opencode support (#402)
Agent: gap-filler-contabo-3

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:30:22 -08:00
A
cb69cbdec4
feat: Add Hostinger amazonq support (#406)
Agent: gap-filler-hostinger-2

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:30:17 -08:00
A
bccbefb83d
feat: Add Hostinger gptme support (#405)
Agent: gap-filler-hostinger-3

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:30:14 -08:00
A
efd535fecd
feat: Add Contabo codex support (#404)
Agent: gap-filler-contabo-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:30:04 -08:00
A
a7719357c2
feat: Add Hostinger continue support (#403)
Agent: gap-filler-hostinger-5

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:30:01 -08:00
A
3e90e3414f
feat: Add Hostinger plandex support (#401)
Agent: gap-filler-hostinger-4

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:29:49 -08:00
A
39057697eb
feat: Add Contabo cline support (#399)
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 01:29:45 -08:00
A
614ae7eaca
feat: Add Contabo plandex and continue support (#398)
Agent: gap-filler-contabo-4

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:29:23 -08:00
A
c70c6cee6f
feat: Add Hostinger cline support (#397)
Agent: gap-filler-hostinger-3

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:29:16 -08:00
A
b10f826384
feat: Add Contabo goose support (#396)
Agent: gap-filler-contabo-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:29:13 -08:00
A
fac0d2c52f
feat: Add Hostinger gemini support (#395)
Agent: gap-filler-hostinger-2

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:29:10 -08:00
A
7f1277c5b9
feat: Add Hostinger kilocode support (#394)
Agent: gap-filler-hostinger-5

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:29:00 -08:00
A
aaa8bd71a5
feat: Add Contabo gptme support (#393)
Agent: gap-filler-contabo-3

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:28:56 -08:00
A
6e77ba6b0b
feat: Add Contabo interpreter support (#392)
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 01:28:48 -08:00
A
cfe85d7a62
feat: Add Hostinger opencode support (#391)
Agent: gap-filler-hostinger-4

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:28:46 -08:00
A
684d27709e
feat: Add Hostinger codex support (#390)
Agent: gap-filler-hostinger-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 01:28:39 -08:00
A
387a231a78 test: Update prompt-file error message assertions to match UX improvements
Tests expected old error wording after PR #387 changed the messages.

Agent: team-lead
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-11 09:26:55 +00:00
B
a5f40391a7 docs: Sync README matrix with manifest.json
Agent: team-lead
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 09:25:56 +00:00
A
b760191a9e
test: Add 122 tests for shared/common.sh bash validation functions (#389)
Add comprehensive test coverage for the security-critical bash validation
functions in shared/common.sh that had zero TypeScript test coverage.
Tests run actual bash subprocesses to catch real shell behavior (regex
engine quirks, quoting edge cases) that TypeScript replica tests miss.

Functions covered:
- validate_model_id: 15 tests (valid models, injection attempts)
- validate_server_name: 21 tests (valid names, boundaries, injection)
- validate_api_token: 27 tests (valid tokens, metachar injection)
- validate_region_name: 12 tests (valid regions, boundaries)
- validate_resource_name: 10 tests (valid names, boundaries)
- json_escape: 11 tests (special chars, SSH key injection, round-trip)
- Cross-function security: 12 tests (common injection patterns)

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 01:23:09 -08:00
A
5a0fe00d4a
refactor: Extract helpers to reduce complexity in commands.ts (#388)
- Extract resolveAndLog() from cmdRun to handle argument resolution
- Extract detectAndFixSwappedArgs() from cmdRun for swap detection
- Extract printInfoHeader() shared by cmdAgentInfo and cmdCloudInfo
- Extract groupByType() used by cmdAgentInfo, cmdCloudInfo, cmdClouds
- Extract printGroupedList() for displaying grouped items with hints

All tests pass (3260/3260). No functional changes.

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:17:15 -08:00
A
7cf9d168d9
fix: Improve CLI UX with better error messages and consistent log levels (#387)
- Fix auto-update unicode symbols (checkmark/cross) that bypassed unicode
  detection, causing garbled output in SSH sessions and dumb terminals
- Use log_info (green) instead of log_warn (yellow) for OAuth progress
  messages, so normal authentication flow doesn't look like a warning
- Add install path to `spawn version` output for easier debugging when
  multiple versions are installed
- Improve --prompt-file errors to distinguish file-not-found, permission
  denied, and is-a-directory cases with actionable guidance
- Bump CLI version to 0.2.30

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 01:16:00 -08:00
A
6331e287c4
feat: Add Hostinger goose support (#382)
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-11 01:04:03 -08:00
A
0ee09e6665
test: Add 1649 tests validating CLI functions against real manifest data (#386)
Validates CLI helper functions (getImplementedClouds, parseAuthEnvVars,
resolveAgentKey, resolveCloudKey, calculateColumnWidth, fuzzy matching)
against the real manifest.json with all 21 clouds and 14 agents. Unlike
mock-based tests, these catch real-world issues like the local cloud's
auth: "none" pattern, multi-var auth strings, cloud type grouping, and
matrix key consistency. Includes dedicated tests for the new local cloud
provider (PR #383).

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 01:03:19 -08:00
A
55d5c123f7
fix: Improve UX for local cloud quick-start and env var messaging (#385)
- Fix cmdCloudInfo quick-start showing "none" as a command for local cloud
- Always show OPENROUTER_API_KEY in cloud quick-start (needed for all agents)
- Update local scripts to explicitly say "Appending environment variables to ~/.zshrc"
- Update local README with spawn CLI usage and "What It Does" section
- Add 3 tests for quick-start auth display (none auth, env var auth)

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 01:02:45 -08:00
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