Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 22 additions & 7 deletions .claude/skills/setup-agent-team/discovery.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand DownExpand Up@@ -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
Expand Down
27 changes: 25 additions & 2 deletions CLAUDE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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)
Expand DownExpand Up@@ -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!**
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 22 additions & 7 deletions .claude/skills/setup-agent-team/discovery.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand DownExpand Up@@ -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
Expand Down
27 changes: 25 additions & 2 deletions CLAUDE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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)
Expand DownExpand Up@@ -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!**
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 22 additions & 7 deletions .claude/skills/setup-agent-team/discovery.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand DownExpand Up@@ -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
Expand Down
27 changes: 25 additions & 2 deletions CLAUDE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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)
Expand DownExpand Up@@ -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!**
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 22 additions & 7 deletions .claude/skills/setup-agent-team/discovery.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand DownExpand Up@@ -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
Expand Down
27 changes: 25 additions & 2 deletions CLAUDE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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)
Expand DownExpand Up@@ -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!**
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 22 additions & 7 deletions .claude/skills/setup-agent-team/discovery.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand DownExpand Up@@ -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
Expand Down
27 changes: 25 additions & 2 deletions CLAUDE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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)
Expand DownExpand Up@@ -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!**
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 22 additions & 7 deletions .claude/skills/setup-agent-team/discovery.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand DownExpand Up@@ -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
Expand Down
27 changes: 25 additions & 2 deletions CLAUDE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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)
Expand DownExpand Up@@ -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!**
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 22 additions & 7 deletions .claude/skills/setup-agent-team/discovery.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand DownExpand Up@@ -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
Expand Down
27 changes: 25 additions & 2 deletions CLAUDE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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)
Expand DownExpand Up@@ -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!**
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 22 additions & 7 deletions .claude/skills/setup-agent-team/discovery.sh
Original file line numberDiff line numberDiff line change
Expand Up@@ -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:
Expand DownExpand Up@@ -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
Expand Down
27 changes: 25 additions & 2 deletions CLAUDE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -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)
Expand DownExpand Up@@ -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!**
Expand Down