diff --git a/.claude/skills/setup-agent-team/discovery.sh b/.claude/skills/setup-agent-team/discovery.sh index b927b12fb..4ad54e3d6 100755 --- a/.claude/skills/setup-agent-team/discovery.sh +++ b/.claude/skills/setup-agent-team/discovery.sh @@ -201,12 +201,23 @@ For each candidate, verify: - Has affordable CPU instances (pay-per-hour or pay-per-second pricing) - Is actually available (not waitlisted/invite-only) -**MANDATORY: Add new clouds to the test infrastructure.** When adding a new cloud, you MUST also update: -1. `test/record.sh` — add the cloud to `ALL_RECORDABLE_CLOUDS`, add a case in `get_endpoints()` with the cloud's GET endpoints, add a case in `get_auth_env_var()`, add a case in `call_api()`, and add a `_live_{cloud}()` function for create/delete fixture recording -2. `test/mock.sh` — add a URL-stripping case in the curl mock so the cloud's API base URL is recognized (look for the `case "$URL" in` block near line 133) -3. `test/record.sh` `has_api_error()` — add error detection for the cloud's API error format +**MANDATORY: Add new clouds to the test infrastructure.** When adding a new cloud, you MUST also update ALL of these files: -Without these, the new cloud will have no test coverage and the QA cycle will skip it entirely. +**`test/record.sh`** (fixture recording): +1. Add the cloud to `ALL_RECORDABLE_CLOUDS` +2. Add a case in `get_endpoints()` with the cloud's GET-only API endpoints +3. Add a case in `get_auth_env_var()` mapping the cloud to its auth env var +4. Add a case in `call_api()` to dispatch to the cloud's API function +5. Add a case in `has_api_error()` for the cloud's error response format +6. Add a `_live_{cloud}()` function for create/delete server fixture recording + +**`test/mock.sh`** (mock test infrastructure — ALL of these): +1. **URL stripping**: Add a case in `_strip_api_base()` to recognize the cloud's API base URL (e.g., `https://api.newcloud.com/v1*`). Without this, mock curl logs `UNHANDLED_URL` warnings. +2. **Body validation**: Add a case in `_validate_body()` with the cloud's server creation endpoint and required POST body fields +3. **Cloud API assertions**: Add a case in `assert_cloud_api_calls()` with the cloud's expected API calls (SSH key fetch endpoint + server create endpoint) +4. **Environment setup**: Add a case in `setup_env_for_cloud()` with the cloud's test env vars (API token, server name, plan, region, etc.) + +Without ALL of these, the new cloud will have no test coverage, body validation will be missing, and the QA cycle will skip it entirely. ### Agent Scout (spawn 1, only if justified) Research new AI agents, BUT only add one if there's REAL community demand: @@ -474,9 +485,13 @@ providers — container platforms, budget VPS providers, or regional clouds with REST APIs. We need affordable instances for running agents that use remote API inference, NOT GPU clouds. Create lib/common.sh, add to manifest, implement 2-3 agents, add "missing" entries for the rest. -MANDATORY: When adding a new cloud, also add it to the test infrastructure: +MANDATORY: When adding a new cloud, also update the test infrastructure: 1. test/record.sh — add to ALL_RECORDABLE_CLOUDS, get_endpoints(), get_auth_env_var(), call_api(), has_api_error(), and add a _live_{cloud}() function -2. test/mock.sh — add a URL-stripping case in the curl mock (case "$URL" in block) +2. test/mock.sh — add ALL of these: + - _strip_api_base(): URL-stripping case for the cloud's API base URL + - _validate_body(): body validation case with server creation endpoint + required fields + - assert_cloud_api_calls(): expected API calls (SSH key fetch + server create) + - setup_env_for_cloud(): test env vars (API token, server name, plan, region) Only add a new AGENT if you find one with real community buzz: - 1000+ GitHub stars diff --git a/CLAUDE.md b/CLAUDE.md index fd323e42a..982713dfb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -55,9 +55,9 @@ We bias heavily toward adding more clouds/sandboxes over more agents. To add one 3. Add `"missing"` entries to the matrix for every existing agent 4. Implement at least 2-3 agent scripts to prove the lib works 5. Update the cloud's `README.md` -6. **Add test coverage** (mandatory): +6. **Add test coverage** (mandatory — see "Mock Test Infrastructure" section below for full details): - `test/record.sh` — add to `ALL_RECORDABLE_CLOUDS`, add cases in `get_endpoints()`, `get_auth_env_var()`, `call_api()`, `has_api_error()`, and add a `_live_{cloud}()` function - - `test/mock.sh` — add a URL-stripping case in the curl mock (`case "$URL" in` block) + - `test/mock.sh` — add cases in `_strip_api_base()`, `_validate_body()`, `assert_cloud_api_calls()`, and `setup_env_for_cloud()` **Good candidate clouds (cheap CPU compute for agents using remote API inference):** - Container/sandbox platforms (fast spin-up, developer-friendly) @@ -244,6 +244,29 @@ macOS ships bash 3.2. All scripts MUST work on it: - Run tests with `bun test` - Use `import { describe, it, expect, beforeEach, afterEach, mock, spyOn } from "bun:test"` +### Mock Test Infrastructure (MANDATORY for new clouds) + +When adding a new cloud provider, you **MUST** update all of these in `test/mock.sh`: + +| Function | What to add | +|---|---| +| `_strip_api_base()` | URL pattern to strip the cloud's API base (e.g., `https://api.newcloud.com/v1*`) | +| `_validate_body()` | Server creation endpoint + required POST fields | +| `assert_cloud_api_calls()` | Expected API calls (SSH key fetch + server create endpoints) | +| `setup_env_for_cloud()` | Test env vars (API token, server name, plan, region) | + +And in `test/record.sh`: + +| Function | What to add | +|---|---| +| `ALL_RECORDABLE_CLOUDS` | Cloud name to the list | +| `get_endpoints()` | GET-only API endpoints for fixture recording | +| `get_auth_env_var()` | Auth env var name mapping | +| `call_api()` | API function dispatcher | +| `has_api_error()` | Error response detection for the cloud's API | + +Without these, the cloud has **no test coverage**, body validation is missing, mock tests log `UNHANDLED_URL` warnings, and the QA cycle skips the cloud entirely. + ## CLI Version Management **CRITICAL: Bump the version on every CLI change!**