Commit graph

733 commits

Author SHA1 Message Date
A
c8d7ea23e6
refactor: simplify BinaryLane wait loop and fix log_warn in 7 cloud polling loops (#538)
Replace 25-line custom _binarylane_wait_for_active with 4-line
generic_wait_for_instance call, matching the pattern used by 7 other
clouds (DigitalOcean, Vultr, Linode, etc).

Change log_warn to log_step for status/progress messages in polling
loops across 7 cloud providers (aws-lightsail, exoscale, fly, kamatera,
latitude, ovh, scaleway). These are normal status updates, not warnings.

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 14:59:51 -08:00
A
8ad9f8bd2c
fix: improve CLI UX for list filters, dry-run URLs, history, and matrix display (#537)
- Resolve display names in `spawn list -a/-c` filters (e.g., "Claude Code" -> "claude")
- Fix dry-run preview to show GitHub raw URL instead of non-existent openrouter.ai/lab URL
- Cap history at 100 entries to prevent unbounded growth
- Rename compact matrix "Missing" column to "Not yet available" for clarity
- Escape double quotes in rerun prompt suggestions to produce valid shell commands

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 14:59:31 -08:00
A
0bbba737a5
test: add 40 tests for get_validated_server_name and API retry logic (#536)
Cover critical untested code from PRs #535 and #533:
- get_validated_server_name: env var reading, validation, injection prevention, boundary cases (15 tests)
- _api_should_retry_on_error: retry decision logic and log output (8 tests)
- _cloud_api_retry_loop: success, network errors, 429/503 handling, non-retryable errors, mixed scenarios (17 tests)

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 14:57:56 -08:00
A
be5f9f1087
refactor: extract get_validated_server_name to eliminate 18 duplicate get_server_name functions (#535)
18 cloud lib/common.sh files had identical 7-line get_server_name()
functions (get_resource_name + validate_server_name + echo). Added a
shared get_validated_server_name helper to shared/common.sh and replaced
all duplicates with one-line delegations. Net -110 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 14:42:09 -08:00
A
0835b35a36
fix: use log_step (cyan) for progress messages instead of log_warn (yellow) (#534)
~1500 progress messages across 481 files were using log_warn (yellow)
for normal status updates like "Installing...", "Setting up...",
"Creating server...", etc. This made users think something was wrong
when everything was proceeding normally.

Changes:
- Replace log_warn with log_step for all progress/status messages
- Keep log_warn only for actual warnings (errors, remediation hints)
- Remove emoji from 3 sprite completion messages

Agent: ux-engineer

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
2026-02-11 14:37:43 -08:00
A
800e9ed564 refactor: Automated improvements
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 22:31:01 +00:00
A
a9fae77c1f
refactor: simplify API retry logic and dispatchCommand (#533)
Remove 2 unnecessary indirection layers (_handle_api_transient_error and
_api_handle_transient_http_error) from the cloud API retry infrastructure.
The old _handle_api_transient_error had a bug where "network" was passed
as the attempt parameter to _api_should_retry_on_error, which expects a
numeric value. The retry logic is now inlined directly in
_cloud_api_retry_loop, calling _api_should_retry_on_error with the
correct arguments.

Also extract duplicated help-flag checking in dispatchCommand into a
hasTrailingHelpFlag helper, reducing nesting and removing repeated code.

Net: -72 lines, 2 fewer functions, 1 bug fix.

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 14:29:37 -08:00
A
5866f7e2de
test: add cmdList integration tests through real exported function (#532)
Add 26 tests covering the cmdList pipeline through the actual
exported function with mock.module for @clack/prompts. Tests the
full path from history file through rendering: empty history,
table rendering with display names, agent/cloud filtering,
prompt display, manifest fallback, footer formatting.

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 14:23:46 -08:00
A
07bc681437
feat: make spawn list interactive -- browse and rerun past spawns (#531)
When run in a TTY, `spawn list` (or `spawn ls`) now shows an interactive
picker using @clack/prompts select. Users can navigate the list with
arrow keys and press Enter to immediately rerun a previous spawn.

Non-TTY environments (piped output, CI) continue to show the static
table as before.

Fixes #492

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 14:23:42 -08:00
A
888e1528e2
feat: implement ramnode/cline agent script (#530)
Add Cline agent support for RamNode Cloud via OpenStack API.
Uses npm install -g cline, injects OpenRouter credentials via
OPENAI_API_KEY and OPENAI_BASE_URL env vars.

Agent: ramnode-gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-11 14:21:12 -08:00
A
c7d41a93b2
feat: Add opencode support for Netcup cloud (#529)
Agent: netcup-gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 14:16:13 -08:00
A
6fa3d21ad0
feat: implement local/continue.sh for Continue CLI (#528)
Add local machine support for Continue (31K+ GitHub stars).
Installs @continuedev/cli via npm and configures OpenRouter.

Agent: local-gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-11 14:16:02 -08:00
A
22cda7d103
feat: implement ramnode/continue agent script (#527)
Add Continue.dev agent support for RamNode Cloud via OpenStack API.
Uses npm install -g @continuedev/cli, creates ~/.continue/config.json
with OpenRouter provider configuration.

Agent: ramnode-gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-11 14:15:55 -08:00
A
98eefc9d5f
test: Add cmdRun happy-path pipeline integration tests (#526)
Tests the complete cmdRun success flow: primary/fallback download,
history recording during execScript, SPAWN_PROMPT/SPAWN_MODE env var
passing to bash, dry-run skip, and script content validation.

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 14:10:58 -08:00
A
2fc7a959da
refactor: reduce complexity in getScriptFailureGuidance and generic_wait_for_instance (#525)
Extract duplicated credential-hint logic from case 1/default into
credentialHint() helper, and flatten nested if-blocks in
generic_wait_for_instance using early-continue.

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 14:07:01 -08:00
A
c16f09a010
fix: use log_step for progress messages in recent scripts (#524)
Replace log_warn (yellow) with log_step (cyan) for progress messages
like "Installing...", "Setting up environment variables...", and
"Starting..." in recently-added scripts. Yellow warnings should be
reserved for actual warnings, not normal progress output.

Also fix bare `clear` calls to use `clear 2>/dev/null || true` for
robustness on minimal terminals, and improve the misleading
"Appending environment variables to ~/.zshrc..." message in local
scripts to the standard "Setting up environment variables..." phrasing.

Files: local/gptme.sh, local/aider.sh, ramnode/openclaw.sh,
ramnode/gptme.sh, netcup/gptme.sh

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 14:04:14 -08:00
A
bad99b4108
feat: Add local/gptme script for local execution (#521)
Implements local/gptme.sh for running gptme on the local machine without cloud provisioning.

Agent: gap-filler-local-2

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 13:48:40 -08:00
A
1992cc5d50
feat: Add ramnode/openclaw script (#519)
Implements OpenClaw deployment on RamNode Cloud using OpenStack API primitives.

Agent: gap-filler-ramnode-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 13:48:35 -08:00
A
c248db0d86
feat: add local/aider script (#523)
Implements local/aider for running Aider AI pair programming tool on local machine.

Agent: gap-filler-local-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 13:48:32 -08:00
A
85b7e1bcb0
feat: Add netcup/gptme script (#522)
Implements gptme agent on Netcup VPS using netcup lib primitives.

Agent: gap-filler-netcup

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 13:48:30 -08:00
A
1f2bbbbe3e
feat: Add ramnode/gptme script (#520)
Implements gptme agent on RamNode Cloud using OpenStack primitives.

Agent: gap-filler-ramnode-2

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 13:48:26 -08:00
A
096e238a91
fix: show specific auth env vars in script failure error messages (#518)
When a spawn script fails with exit code 1 (the most common failure),
the error message now shows which specific environment variables are
needed (e.g., "need HCLOUD_TOKEN + OPENROUTER_API_KEY") instead of
the generic "run spawn <cloud> for setup" which required a second
command to discover the needed credentials.

Also adds a "Retry:" hint with the exact rerun command at the end of
all script failure error messages.

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 13:46:29 -08:00
A
14cef89c60
refactor: extract helpers from cmdMatrix, cmdList, and checkEntity (#517)
Extract renderMatrixFooter, renderListTable, and suggestTypoCorrection
to reduce function complexity and improve readability.

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 13:29:03 -08:00
A
2ee7c0cef5
fix: handle common verb aliases (run, launch, start, deploy, exec) in CLI (#516)
Users coming from Docker, kubectl, or other CLIs naturally try
"spawn run claude sprite" or "spawn launch aider hetzner". Previously
these would show a confusing "Unknown command: run" error. Now the CLI
transparently strips these verb prefixes and forwards to the correct
agent/cloud handler. Bare verbs like "spawn run" show a helpful message
explaining the correct syntax.

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 13:26:25 -08:00
A
9a5502906d
test: add 34 tests for cmdList table rendering and resolveDisplayName (#515)
Cover the integration of cmdList with manifest-resolved display names,
table header/separator rendering, prompt preview truncation in rows
vs footer, filtered result counts, timestamp formatting, and the
resolveDisplayName exported utility.

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 13:26:21 -08:00
A
66b890493a
fix: improve CLI display for matrix title, compact view header, and list history (#514)
- Add "Availability Matrix (N agents, M clouds)" title to spawn matrix output
- Shorten compact view column header from "Not available on" to "Missing"
- Show display names (e.g. "Claude Code") instead of raw keys in 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-11 13:10:45 -08:00
A
52ef444006
test: fix failing assertion and add checkEntity message output tests (#513)
Fix agent-config-setup test that expected "does not run correctly" but
shared/common.sh now says "returned an error". Add 25 new tests verifying
checkEntity's user-facing messages for wrong-type detection, same-kind
fuzzy match, cross-kind fuzzy match (PR #510), and no-match fallback.

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 13:08:45 -08:00
A
f3b0a4d622
test: add 46 tests for list display helpers and unknown command error (#512)
Cover recently extracted helpers from PR #506 that had zero direct tests:
- suggestFilterCorrection: agent/cloud filter typo suggestions (9 tests)
- showEmptyListMessage: empty list messaging with filters (11 tests)
- showListFooter: rerun hints, prompt truncation, filter info (14 tests)
- showUnknownCommandError: fuzzy match suggestions for bad commands (12 tests)

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 12:54:52 -08:00
A
7ba3559773
refactor: extract helpers from test_shared_common to reduce complexity (#511)
Break the 415-line test_shared_common() function in test/run.sh into
7 focused sub-functions grouped by feature:
- _test_model_validation (validate_model_id tests)
- _test_json_ssh_utils (json_escape, SSH key ops)
- _test_syntax_and_logging (syntax check, logging functions)
- _test_browser_and_cloud_init (open_browser, cloud-init, connectivity)
- _test_oauth_functions (wait_for_oauth_code, cleanup_oauth_session)
- _test_ssh_wait (generic_ssh_wait success/failure)
- _test_input_and_server_validation (safe_read, validate_server_name)

Also add assert_common_succeeds and assert_common_fails helpers to
eliminate repeated test boilerplate for simple pass/fail assertions.

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 12:53:40 -08:00
A
ff13a5fda9
fix: suggest cross-kind fuzzy matches when args may be swapped with typos (#510)
When a user types `spawn htzner claude` (cloud name typo as first arg),
checkEntity now detects that "htzner" is close to cloud "hetzner" and
suggests the user may have swapped agent and cloud arguments. Previously,
this only worked for exact cloud names; typos would produce a generic
"Unknown agent" error with no helpful suggestion.

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 12:47:53 -08:00
A
9458836ca1
refactor: extract helpers from showDryRunPreview and cmdUpdate to reduce complexity (#509)
- showDryRunPreview: extract printDryRunSection, buildAgentLines, buildCloudLines
  helpers to eliminate repeated header/body/blank-line pattern across 5 sections
- cmdUpdate: extract fetchRemoteVersion and performUpdate helpers to flatten
  nested try/catch, deduplicate install command string into INSTALL_CMD constant

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 12:34:51 -08:00
A
948197aa05
fix: correct README describing spawn list as matrix view (#508)
The README incorrectly described `spawn list` as "Full agent x cloud
matrix" in two places. `spawn list` actually shows spawn history
(previously launched spawns). The matrix is shown by `spawn matrix`.

This fixes the Usage section and Commands table to accurately reflect
the CLI behavior, preventing confusion for first-time users.

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 12:29:58 -08:00
A
138fe91333
test: add 25 tests for cloud/agent Quick start and Not-yet-available display (#507)
Cover untested code paths in cmdCloudInfo and cmdAgentInfo:
- printCloudQuickStart with multi-auth env vars (e.g., UPCLOUD_USERNAME + UPCLOUD_PASSWORD)
- printCloudQuickStart URL hint only shown on first auth var (not repeated)
- printCloudQuickStart with OAuth auth (no parseable env vars)
- printCloudQuickStart with "none" auth (no extra export lines)
- printCloudQuickStart when no implemented agents (no example command)
- printAgentList "Not yet available" shown when missingAgents <= 5
- printAgentList "Not yet available" hidden when missingAgents > 5
- printAgentList boundary at exactly 5 missing agents
- cmdAgentInfo Quick start with multi-auth cloud as first available
- cmdAgentInfo Quick start with "none" auth cloud
- cmdAgentInfo no Quick start when no clouds implemented

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 12:28:43 -08:00
A
c7a3532825
refactor: extract helpers from cmdList and showInfoOrError to reduce complexity (#506)
cmdList (88 -> 28 lines): Extract suggestFilterCorrection, showEmptyListMessage,
and showListFooter as focused helpers.

showInfoOrError (44 -> 15 lines): Extract showUnknownCommandError for the
fuzzy-match suggestion display 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 12:15:11 -08:00
A
dd2e79ed9f
test: add 47 tests for cmdList filter suggestions and cmdMatrix view modes (#505)
Cover the previously untested cmdList fuzzy suggestion path (when filters
don't match, the CLI loads the manifest and suggests corrections via
resolveAgentKey/resolveCloudKey/findClosestKeyByNameOrKey) and cmdMatrix
compact vs grid view selection based on terminal width.

Tests added:
- cmdList agent/cloud filter typo correction suggestions (7 tests)
- cmdList manifest-unavailable graceful fallback (1 test)
- cmdList empty history edge cases (2 tests)
- cmdList prompt display and truncation in output (5 tests)
- cmdList rerun hint with/without prompt (2 tests)
- cmdMatrix grid view rendering (2 tests)
- cmdMatrix compact view rendering with narrow terminal (4 tests)
- cmdMatrix total count and launch hints (3 tests)
- calculateColumnWidth helper (7 tests)
- getMissingClouds helper (5 tests)
- getImplementedClouds helper (5 tests)
- getTerminalWidth helper (3 tests)

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 12:09:30 -08:00
A
984a4371ad
fix: add ENVIRONMENT VARIABLES section to spawn help text (#504)
Users had no way to discover SPAWN_HOME, SPAWN_DEBUG, or SPAWN_UNICODE
env vars without reading source code. The help text now documents all
SPAWN_* environment variables in a dedicated section between
TROUBLESHOOTING and MORE INFO.

Also bumps CLI version to 0.2.50.

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 12:08:32 -08:00
A
e620e47c7e
test: add 40 tests for agent config setup and verification functions (#503)
Covers previously untested bash functions in shared/common.sh:
- verify_agent_installed: command existence, version check, error messages
- upload_config_file: temp file creation, content preservation, callbacks
- setup_claude_code_config: settings.json, .claude.json, json_escape security
- setup_openclaw_config: openclaw.json, gateway token, model ID
- setup_continue_config: config.json, OpenRouter model config

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 11:57:20 -08:00
A
53aa27b598
refactor: extract _log_diagnostic helper and flatten get_openrouter_api_key_oauth (#502)
Reduce complexity in the two most verbose functions in shared/common.sh:

- verify_agent_installed(): Extract repeated "Possible causes" / "How to fix"
  error blocks into a reusable _log_diagnostic() helper, reducing 22 lines of
  duplicated log_error calls to 2 structured calls.

- get_openrouter_api_key_oauth(): Flatten nested if/else by testing the
  rejection case first (early return), eliminating the else branch and reducing
  nesting depth.

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 11:53:47 -08:00
A
f244a4278e
fix: add fuzzy suggestions and filter context to spawn list (#501)
When `spawn list -a/-c` filter returns no results, suggest corrections
using the same fuzzy matching used elsewhere in the CLI. Also show total
history count so users know other entries exist.

When filter matches results, show "Showing X of Y spawns" with a
"Clear filter" hint instead of the default footer.

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 11:53:44 -08:00
A
9e4ea1e474
test: add 31 tests for cmdList prompt display and suggestCloudsForPrompt (#500)
Cover untested prompt-related display paths in commands.ts and index.ts:
- cmdList prompt preview truncation at 40 chars in record rows
- cmdList rerun hint truncation at 30 chars for long prompts
- cmdList records with/without prompts showing correct output
- suggestCloudsForPrompt cloud suggestions with overflow (>5 limit)
- suggestCloudsForPrompt error messages and agent resolution paths

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 11:25:32 -08:00
A
34985e01f6
fix: add timeout to script downloads and validate list filter flags (#499)
- Add FETCH_TIMEOUT (10s) to script download fetches in
  downloadScriptWithFallback, preventing indefinite hangs when the
  server is unresponsive
- Show actionable error when `spawn list -a` or `spawn list -c` is
  used without a value, instead of silently showing unfiltered results
- Bump CLI version to 0.2.48

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 11:23:57 -08:00
A
ea645fa064
fix: prevent infinite loop on API key input I/O error (#498)
safe_read() now propagates read command failures instead of masking
them with the always-successful echo on the last line. Also adds a
3-attempt limit to get_openrouter_api_key_manual() as defense-in-depth.

Fixes #494

Agent: issue-fixer

Co-authored-by: A <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 11:12:32 -08:00
A
28cb923e53
refactor: remove dead commands-logic.ts and unused errorMessage (#497)
commands-logic.ts (140 lines) duplicated functions already in commands.ts
and was never imported by the application. Its test file (275 lines) tested
these unused duplicates. The errorMessage function in commands.ts was defined
but never called. Total: 420 lines of dead code removed.

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 11:03:17 -08:00
A
19948d3ad5
test: add 55 tests for checkEntity validation function (#496)
checkEntity is a critical function in the run pipeline (commands.ts:182-206)
that validates user-provided agent/cloud names. It had zero test coverage
despite complex branching logic for wrong-type detection, fuzzy matching,
and error messaging.

Tests cover: valid entities, wrong-type detection (cloud-as-agent and
agent-as-cloud), non-existent entities, fuzzy match typos, empty/boundary
inputs, minimal manifests, kind parameter consistency, bulk validation
of all manifest entries, and overlapping key 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 11:01:52 -08:00
B
e07a78bed7 docs: Sync README matrix with manifest.json
Agent: team-lead
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 18:55:19 +00:00
A
b4398d1bc7
feat: Add codex on local (#493)
Agent: gap-filler-5

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 10:50:56 -08:00
A
fa516bad89
fix: improve spawn list and clouds UX (#491)
- Show prompt preview in `spawn list` history for prompted runs
- Include prompt in rerun hint when last spawn used --prompt
- Show auth requirements in `spawn clouds` listing
- Change swap detection from warn to info (auto-correcting, not a warning)
- Update `spawn clouds` help text: "for setup instructions" instead of "for details"

Bump CLI version to 0.2.46.

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 10:34:28 -08:00
A
bc89a2821b
test: add 43 tests for list display logic (formatTimestamp, parseListFilters, cmdList) (#489)
Cover the history list feature display layer added in PRs #486-#488:
- formatTimestamp: valid ISO, invalid dates, edge cases (epoch, far future)
- parseListFilters: -a/-c flag extraction, missing values, duplicates, ordering
- cmdList output: table headers, rerun hint, count summary, filter messages,
  newest-first ordering, singular/plural, corrupted history resilience

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 10:29:50 -08:00
A
6c0e9116a5
fix: show spawn history newest-first with rerun hint (#488)
`spawn list` now shows records in reverse chronological order (newest
first), matching the convention of git log, shell history, and docker ps.
Adds a "Rerun last" hint showing the command to repeat the most recent spawn.

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 10:11:50 -08:00
A
783cba86d5
test: add 34 tests for history module (loadHistory, saveSpawnRecord, filterHistory) (#487)
The history.ts module had zero test coverage. This adds comprehensive tests for:
- getSpawnDir: SPAWN_HOME env var and ~/.spawn fallback
- getHistoryPath: correct path composition
- loadHistory: missing file, valid data, invalid JSON, non-array JSON, empty file
- saveSpawnRecord: directory creation, append, prompt field, pretty JSON, corruption recovery
- filterHistory: agent/cloud/combined filters, case-insensitivity, no-match cases

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 10:10:12 -08:00