Commit graph

1598 commits

Author SHA1 Message Date
A
00f1bfe862
feat: Add nanoclaw on FluidStack (#262)
Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 15:23:39 -08:00
A
9fa80b9253
feat: Add Cline on Render (#261)
Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 15:23:32 -08:00
A
100bcc60fd
feat: Add opencode on Railway (#260)
Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 15:23:26 -08:00
A
9ac200f9e3
feat: Add openclaw on GitHub Codespaces (#258)
Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 15:23:03 -08:00
A
e198c0a8dc
feat: Add openclaw on FluidStack (#259)
Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 15:22:55 -08:00
A
23fa0d2630
feat: Add Amazon Q CLI on Render (#257)
Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 15:22:49 -08:00
A
4774e523cb
feat: Add kilocode on Railway (#256)
Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 15:22:44 -08:00
B
2061c3d22d docs: Sync README matrix with manifest.json
Agent: team-lead
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 23:19:58 +00:00
B
85e7e7b9f5 docs: Document streaming architecture and Sprite lifecycle in SKILL.md
Add sections covering:
- Output streaming behavior and why it keeps Sprites alive
- Bun idleTimeout gotcha (10s default, server.timeout(req, 0) fix)
- HTTP/1.1 requirement for long-lived chunked responses
- Updated workflow template with streaming curl flags
- New troubleshooting entries for curl errors 92, 18, and Sprite pause

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 23:18:56 +00:00
B
d4b8e5025a fix: Disable Bun idle timeout for streaming requests via server.timeout(req, 0)
Per Bun docs, server.timeout(req, 0) disables the idle timeout
entirely for a specific request. This is the proper API for long-lived
streaming connections — no more fighting the 255s cap.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 23:16:35 +00:00
A
2b1944ee1c
fix: Show cloud type and agent notes in info commands (#255)
cmdAgentInfo now displays the cloud type (api, cli, sandbox, etc.) next
to each cloud provider, helping users understand what kind of
infrastructure they're choosing. Also shows agent notes when present.

cmdCloudInfo now shows the cloud type beneath the description for
quick reference.

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 15:11:06 -08:00
A
2b9005f0a5
test: Add 420 bash -n syntax validation tests for all shell scripts (#254)
Runs `bash -n` on every shell script in the repo:
- shared/common.sh (core library)
- All 21 cloud lib/common.sh files
- All 264+ implemented agent scripts

This is the automated equivalent of the CLAUDE.md rule:
"Run bash -n on every changed .sh file before committing."

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 15:10:43 -08:00
A
29b6a0e7b9
refactor: simplify CLI command dispatch with lookup tables (#253)
Extract duplicated agent/cloud lookup logic into showInfoOrError() and
replace repetitive switch cases with dispatch tables, reducing main()
from 85 to 65 lines and handleDefaultCommand() from 52 to 16 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-10 15:10:04 -08:00
B
f2ef7623fb fix: Set Bun idleTimeout to 255s and heartbeat to 15s
Bun.serve defaults to 10s idleTimeout, which kills the streaming
connection before the heartbeat even fires during Claude's startup
silence. Set to 255s (max allowed) and tighten heartbeat to 15s.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 22:56:15 +00:00
B
200b6dc5b2 fix: Force HTTP/1.1 for streaming to avoid HTTP/2 stream errors
HTTP/2 has strict stream lifecycle management that doesn't play well
with long-lived chunked responses — curl exits with error 92
(stream not closed cleanly: INTERNAL_ERROR). HTTP/1.1 handles
persistent streaming connections natively.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 22:51:35 +00:00
A
f39ffd6e24
fix: Prevent shell/Python injection in Codespaces, Render, and FluidStack (#252)
GitHub Codespaces scripts embedded API keys directly into heredocs sent
over SSH, allowing single-quote breakout for command injection. Fixed by
adding upload_file/run_server/inject_env_vars helpers to Codespaces lib
and using safe temp-file-upload pattern (matching Railway/Render).

Render claude.sh and openclaw.sh built JSON config via unescaped heredocs.
Fixed by using shared setup_claude_code_config/setup_openclaw_config
helpers which properly json_escape values.

FluidStack had triple-quote injection in SSH key registration (pub_key
embedded in Python triple-quotes) and missing single-quote validation in
create_server env var checks. Fixed by reading values via stdin/argv
instead of string interpolation, and added single-quote to validation.

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 14:14:41 -08:00
A
281ea2a74f
test: Add 43 tests for display command output (cmdAgentInfo, cmdList, cmdAgents, cmdClouds, cmdHelp, cmdUpdate) (#251)
Cover previously untested happy paths for user-facing display commands:
- cmdAgentInfo: agent details, available clouds, no-clouds fallback, many clouds
- cmdList: matrix table rendering, implemented counts, edge cases
- cmdAgents: agent listing with cloud counts, singular/plural, descriptions
- cmdClouds: cloud listing with agent counts, singular/plural, descriptions
- cmdHelp: all sections (USAGE, EXAMPLES, AUTHENTICATION, TROUBLESHOOTING, INSTALL)
- cmdUpdate: version match, fetch failure, non-ok response

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 14:12:31 -08:00
A
16cabed6d8
feat: detect unknown flags and show actionable error (#250)
Previously, unknown flags like --json or --verbose were silently ignored
or misinterpreted as positional arguments (agent/cloud names), leading to
confusing error messages. Now the CLI detects unrecognized flags and shows
a clear error listing the supported flags.

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 14:12:20 -08:00
A
2635ba22a1
refactor: Decompose create_server in UpCloud and AWS Lightsail (#249)
Extract helper functions to reduce complexity:
- UpCloud: Extract _build_upcloud_server_body() from create_server (Python JSON body builder)
- AWS Lightsail: Extract _wait_for_lightsail_instance() from create_server (polling loop)

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 14:11:54 -08:00
A
efec4ac8ca
feat: Add FluidStack GPU cloud provider with claude, aider, and gptme agents (#247)
FluidStack is a cost-effective GPU cloud provider offering A100s and H100s
starting at $1.35/hr (up to 70% cheaper than hyperscalers). Features:

- Simple REST API with Python SDK
- SSH access with automatic key registration
- Zero egress fees
- GPU types: RTX_4090 (default), A100, H100

Implemented agents:
- Claude Code (fluidstack/claude.sh)
- Aider (fluidstack/aider.sh)
- gptme (fluidstack/gptme.sh)

Added fluidstack/lib/common.sh with provisioning primitives.
Updated manifest.json with cloud entry and matrix entries (3 implemented, 11 missing).

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 14:09:25 -08:00
A
cde9f586d8
feat: Add GitHub Codespaces cloud provider with claude, aider, gptme (#248)
Add GitHub Codespaces as a new cloud provider via gh CLI:
- github-codespaces/lib/common.sh - provisioning primitives via gh CLI
- github-codespaces/claude.sh - Claude Code implementation
- github-codespaces/aider.sh - Aider implementation
- github-codespaces/gptme.sh - gptme implementation
- github-codespaces/README.md - usage documentation
- manifest.json - added cloud entry and matrix entries

Pricing: Pay-as-you-go starting at $0.18/hr (2 core, 4GB RAM)
Free tier available for personal accounts.

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 12:58:33 -08:00
A
0e1d748597
feat: Add Open Interpreter agent support to Railway (#246)
Implements railway/interpreter.sh using Railway's CLI primitives:
- Creates Railway project and Ubuntu container
- Installs Open Interpreter via pip
- Injects OPENAI_BASE_URL=https://openrouter.ai/api/v1 and OPENROUTER_API_KEY
- Launches interactive interpreter session via railway shell

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:56:02 -08:00
A
f421b76f5f
feat: Add render/goose.sh (#245)
Implements Goose agent on Render with:
- Direct install via Block's download_cli.sh script
- Native OpenRouter support via GOOSE_PROVIDER env var
- Simple environment configuration
- Interactive session launch

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:55:16 -08:00
A
d883c77524
feat: Add Cline support for Railway (#244)
Implement railway/cline.sh following the standard Railway pattern:
- Install cline via npm
- Inject OPENAI_API_KEY and OPENAI_BASE_URL for OpenRouter compatibility
- Launch with 'cline' command

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:54:42 -08:00
A
6556e65c50
feat: Add render/gemini implementation (#243)
- Create render/gemini.sh with Render CLI provisioning
- Install Gemini CLI via npm on Render service
- Inject OpenRouter credentials via OPENAI_BASE_URL and GEMINI_API_KEY
- Update manifest.json matrix entry to "implemented"
- Update render/README.md with Gemini usage instructions

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:54:36 -08:00
A
47ad090745
feat: Add Codex CLI agent support to Railway (#240)
Implements railway/codex.sh using Railway's CLI primitives:
- Creates Railway project and Ubuntu container
- Installs Node.js and npm via NodeSource
- Installs Codex CLI via npm (@openai/codex)
- Injects OPENAI_BASE_URL=https://openrouter.ai/api/v1 and OPENROUTER_API_KEY
- Launches interactive Codex session via railway shell

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:54:18 -08:00
A
cccbdc077f
feat: Add gptme agent for Northflank (#242)
Implements northflank/gptme.sh with:
- gptme installation via pip
- OpenRouter API key injection (OAuth or env)
- Interactive model selection prompt
- Native gptme OpenRouter support (openrouter/MODEL_ID)
- Installation verification

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:54:09 -08:00
A
3d5b3e447c
feat: Add render/nanoclaw.sh (#241)
Implements NanoClaw agent on Render with:
- Node.js and tsx installation
- Clone and build nanoclaw from GitHub
- OpenRouter integration via .env file
- WhatsApp QR code authentication flow
- Interactive dev mode session

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:54:04 -08:00
A
a150912a99
feat: Add render/interpreter implementation (#238)
- Create render/interpreter.sh with Render CLI provisioning
- Install Open Interpreter via pip on Render service
- Inject OpenRouter credentials via OPENAI_BASE_URL override
- Update manifest.json matrix entry to "implemented"
- Update render/README.md with interpreter usage instructions

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:53:33 -08:00
A
89e213e6f9
feat: Add Amazon Q CLI support for Railway (#239)
Implement railway/amazonq.sh following the standard Railway pattern:
- Install Amazon Q CLI via AWS installer script
- Inject OPENAI_API_KEY and OPENAI_BASE_URL for OpenRouter compatibility
- Launch with 'q chat' command

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:53:24 -08:00
A
ca476aff39
feat: Add Cline agent for Northflank (#237)
Implements northflank/cline.sh with:
- Cline installation via npm
- OpenRouter API key injection (OAuth or env)
- OPENAI_BASE_URL override for OpenRouter compatibility
- Interactive cline session

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:53:08 -08:00
A
1e63eb817d
feat: Add Goose agent support to Railway (#233)
Implements railway/goose.sh using Railway's CLI primitives:
- Creates Railway project and Ubuntu container
- Installs Goose via official download script
- Injects GOOSE_PROVIDER=openrouter and OPENROUTER_API_KEY
- Launches interactive Goose session via railway shell

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:52:40 -08:00
A
3388bf7ab0
feat: Add render/openclaw.sh (#236)
Implements OpenClaw agent on Render with:
- Bun installation for openclaw
- Multi-channel gateway in background
- Interactive TUI session
- OpenRouter integration with model selection
- Config file generation with API key and model

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:52:38 -08:00
A
cbba92c3c0
fix: Validate issue param and fix Render JSON injection + Hyperstack API bug (#234)
- Validate SPAWN_ISSUE is a positive integer in both trigger-server.ts
  and refactor.sh to prevent command injection via crafted issue params
- Use Python json.dumps for Render _render_create_service JSON body
  instead of string interpolation (prevents JSON injection)
- Remove erroneous "api_key" 6th argument in Hyperstack generic_cloud_api
  call that was being interpreted as max_retries, breaking all API calls

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 12:52:23 -08:00
A
f559af0152
feat: Add Amazon Q agent for Northflank (#232)
Implements northflank/amazonq.sh with:
- Amazon Q CLI installation from AWS
- OpenRouter API key injection (OAuth or env)
- OPENAI_BASE_URL override for OpenRouter compatibility
- Interactive q chat session

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:52:15 -08:00
A
7f49b234c4
feat: Add render/codex implementation (#235)
- Create render/codex.sh with Render CLI provisioning
- Install Codex CLI via npm on Render service
- Inject OpenRouter credentials via OPENAI_BASE_URL override
- Update manifest.json matrix entry to "implemented"
- Update render/README.md with Codex usage instructions

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:52:11 -08:00
A
a7e2e6e0e6
feat: Add Gemini CLI support for Railway (#231)
Implement railway/gemini.sh following the standard Railway pattern:
- Install @google/gemini-cli via npm
- Inject GEMINI_API_KEY, OPENAI_API_KEY, and OPENAI_BASE_URL
- Launch with OpenRouter compatibility

Agent: gap-filler

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 12:52:06 -08:00
A
8ea28e1d07
test: Add 28 tests for index.ts main() routing (zero prior coverage) (#230)
Tests the actual CLI entry point through subprocess execution:
- help/version command routing (help, --help, -h, version, --version, -v, -V)
- Subcommand --help routing (list --help, agents --help, clouds --help, etc.)
- ls alias routing
- Non-TTY mode behavior (shows help when no args)
- handleError formatting for invalid identifiers
- extractFlagValue in actual CLI (--prompt/--prompt-file missing values)
- --prompt and --prompt-file mutual exclusion
- --prompt-file with nonexistent file
- Prompt-only-without-cloud error messaging

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 12:49:50 -08:00
A
06091864af
fix: Show unified agent+cloud suggestions for unknown single-arg commands (#229)
Previously, `spawn hetzne` (typo of cloud name "hetzner") would show
"Unknown agent: hetzne" with no useful suggestion, because it only
searched agent names for typo matches. Now when a single argument
matches neither an agent nor a cloud, the error searches both pools
and shows "Did you mean hetzner (cloud)?" — guiding the user to the
right command.

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 12:49:44 -08:00
B
d94cbfb7de docs: Sync README matrix with manifest.json
Agent: team-lead
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 20:49:34 +00:00
A
0826005239
refactor: Decompose long functions in Vultr and OVH providers (#228)
Vultr create_server (93 lines) decomposed into:
- _vultr_build_instance_body: builds JSON request body
- _wait_for_vultr_instance: polls until instance is active
Also fixed bash 3.x compat issue: ((attempt++)) -> attempt=$((attempt + 1))

OVH create_ovh_instance (80 lines) decomposed into:
- _ovh_resolve_resources: resolves image/flavor/SSH key IDs
- _ovh_build_instance_body: builds JSON request body

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 12:48:39 -08:00
A
1f3bc21d3d
test: Add 24 tests for cmdCloudInfo (zero prior coverage) (#227)
- Test happy paths: cloud name/description, available agents, launch hints
- Test cloud notes display and no-agents fallback message
- Test error paths: unknown cloud, typo suggestions, invalid identifiers
- Test security: path traversal, shell metacharacters, length limits
- Fix manifest.json: mark railway/gptme as implemented (script exists)

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 12:36:05 -08:00
A
79562bbfcf
fix: Fix broken gptme script and update READMEs for Railway, Northflank, Hyperstack (#226)
- Fix railway/gptme.sh calling nonexistent inject_env_vars_railway (should be inject_env_vars)
- Railway README: add missing NanoClaw and gptme agent entries
- Northflank README: add missing NanoClaw, Goose, Codex CLI, Open Interpreter, Gemini CLI agent entries and Environment Variables table
- Hyperstack README: restructure to match standard format with Agents section, use openrouter.ai/lab/spawn URLs instead of raw GitHub URLs, add 6 missing agents (Amazon Q, Cline, gptme, OpenCode, Plandex, Kilo Code), add Environment Variables table and Non-Interactive Mode section

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 12:35:56 -08:00
A
f88807ecd6
fix: Prevent shell injection in Railway env var injection and file upload (#222)
Railway's inject_env_vars passed user-controlled values (e.g. OPENROUTER_API_KEY)
through bash -c without proper escaping, allowing shell injection. Replace with
the safe file-based pattern used by other providers (write to temp file, upload,
append to .bashrc).

Also add remote_path validation to Railway and Modal upload_file functions to
prevent single-quote breakout injection, matching the pattern already used by
Koyeb. Fix gptme.sh reference to non-existent inject_env_vars_railway function.

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 12:34:13 -08:00
A
8afb9c2cee
feat: Add Render cloud provider (#225)
Implement Render cloud integration with CLI and API support:
- render/lib/common.sh with provider primitives (auth, provision, SSH, upload)
- render/claude.sh for Claude Code deployment
- render/aider.sh for Aider deployment
- Updated manifest.json with Render cloud and 14 matrix entries
- Created README.md with usage documentation

Render offers a developer-first platform with free tier, Docker support,
and SSH access via render CLI. All scripts support OpenRouter integration.

Agent: cloud-scout-1

Co-authored-by: B <6723574+louisgv@users.noreply.github.com>
2026-02-10 12:34:04 -08:00
A
531c61ec1f
fix: Fix broken Railway gptme script and update provider READMEs (#224)
- Fix railway/gptme.sh calling nonexistent inject_env_vars_railway (should be inject_env_vars)
- Fix northflank claude/openclaw/aider using inject_env_vars_local (only writes .zshrc)
  instead of inject_env_vars_northflank (writes both .bashrc and .zshrc)
- Update Railway README to list NanoClaw and gptme agents
- Update Northflank README to list all 8 implemented agents and add env var table
- Mark railway/gptme as implemented in manifest.json

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 12:34:02 -08:00
A
35b322b320
test: Add cmdCloudInfo test coverage (23 tests) (#223)
cmdCloudInfo was the only major command function with zero test coverage.
Tests cover happy paths, cloud notes display, empty agents state, error
paths (invalid identifiers, unknown clouds), and typo suggestions.

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 12:33:51 -08:00
A
116305f32c
fix: Secure upload_file() against command injection in Railway, Modal, and Koyeb (#221)
Railway: Missing base64 -w0 caused newline injection; unescaped remote_path
in single quotes allowed single-quote breakout command injection. Now uses
base64 -w0 with macOS fallback, printf '%q' for path escaping, and routes
through run_server instead of direct railway run bash -c.

Modal: Remote path was embedded in single quotes without escaping, allowing
single-quote breakout. Now uses printf '%q' for safe path escaping.

Koyeb: Used fragile deny-list validation for remote_path (rejecting specific
characters) and base64 without -w0 flag. Replaced with printf '%q' escaping
and added base64 -w0 with macOS fallback.

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 12:33:15 -08:00
B
3199aecb7d fix: Remove hard timeout from discovery cycles
The timeout wrapper was killing cycles prematurely. The trigger
server's RUN_TIMEOUT_MS (75 min) is the safety net if something
truly hangs — no need for a second timeout layer in the script.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-10 20:33:02 +00:00
A
aac47f1823
refactor: Decompose long functions in Railway and Northflank providers (#220)
Railway create_server (76 lines) split into:
- _railway_create_project: project init and linking
- _railway_deploy_container: Dockerfile creation and deploy
- _railway_wait_for_deployment: deployment readiness polling

Northflank ensure_northflank_token (59 lines) split into:
- _northflank_login: CLI authentication wrapper
- _load_northflank_config: config file loading and validation
- _save_northflank_token: token persistence

Northflank create_server (54 lines): extracted
- _northflank_wait_for_service: service readiness polling

No function exceeds 42 lines after decomposition.

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