Add [i18n.zh.agents.*] sections to all 15 HAND.toml files, providing Chinese translations for agent names and descriptions. Total: 51 agent translations across 15 hands.
937 lines
34 KiB
TOML
937 lines
34 KiB
TOML
id = "apitester"
|
||
version = "1.1.0"
|
||
name = "API Tester Hand"
|
||
description = "Autonomous API testing agent — endpoint discovery, request validation, load testing, and regression detection"
|
||
|
||
category = "development"
|
||
icon = "🔌"
|
||
|
||
tools = [
|
||
"shell_exec",
|
||
"file_read",
|
||
"file_write",
|
||
"file_list",
|
||
"web_fetch",
|
||
"web_search",
|
||
"memory_store",
|
||
"memory_recall",
|
||
"schedule_create",
|
||
"schedule_list",
|
||
"schedule_delete",
|
||
"knowledge_add_entity",
|
||
"knowledge_add_relation",
|
||
"knowledge_query",
|
||
"event_publish",
|
||
]
|
||
|
||
[[requires]]
|
||
key = "curl"
|
||
label = "curl must be installed"
|
||
requirement_type = "binary"
|
||
check_value = "curl"
|
||
description = "curl is used to send HTTP requests to target API endpoints for testing, validation, and load simulation."
|
||
|
||
[requires.install]
|
||
macos = "brew install curl"
|
||
linux_apt = "sudo apt install curl"
|
||
linux_dnf = "sudo dnf install curl"
|
||
linux_pacman = "sudo pacman -S curl"
|
||
windows = "winget install cURL.cURL"
|
||
estimated_time = "1 min"
|
||
|
||
[routing]
|
||
aliases = [
|
||
"api test",
|
||
"endpoint test",
|
||
"load test",
|
||
"regression test",
|
||
"api discovery",
|
||
"test api",
|
||
"api testing",
|
||
"api validation",
|
||
"test endpoint",
|
||
]
|
||
weak_aliases = [
|
||
"api debug",
|
||
"request validation",
|
||
"swagger",
|
||
"openapi",
|
||
"postman",
|
||
"stress test",
|
||
"http test",
|
||
]
|
||
|
||
# ─── Configurable settings ───────────────────────────────────────────────────
|
||
|
||
[[settings]]
|
||
key = "base_url"
|
||
label = "Base URL"
|
||
description = "Base URL of the API to test (e.g. https://api.example.com/v1)"
|
||
setting_type = "text"
|
||
default = ""
|
||
|
||
[[settings]]
|
||
key = "auth_type"
|
||
label = "Authentication Type"
|
||
description = "How to authenticate API requests"
|
||
setting_type = "select"
|
||
default = "none"
|
||
|
||
[[settings.options]]
|
||
value = "none"
|
||
label = "No Authentication"
|
||
|
||
[[settings.options]]
|
||
value = "bearer"
|
||
label = "Bearer Token"
|
||
|
||
[[settings.options]]
|
||
value = "api_key_header"
|
||
label = "API Key (Header)"
|
||
|
||
[[settings.options]]
|
||
value = "basic"
|
||
label = "Basic Auth"
|
||
|
||
[[settings]]
|
||
key = "auth_token"
|
||
label = "Auth Token / API Key"
|
||
description = "Bearer token, API key, or base64-encoded credentials depending on auth type"
|
||
setting_type = "text"
|
||
default = ""
|
||
|
||
[[settings]]
|
||
key = "test_mode"
|
||
label = "Test Mode"
|
||
description = "What type of API testing to perform"
|
||
setting_type = "select"
|
||
default = "functional"
|
||
|
||
[[settings.options]]
|
||
value = "functional"
|
||
label = "Functional (validate endpoints)"
|
||
|
||
[[settings.options]]
|
||
value = "regression"
|
||
label = "Regression (detect changes)"
|
||
|
||
[[settings.options]]
|
||
value = "load"
|
||
label = "Load (stress testing)"
|
||
|
||
[[settings.options]]
|
||
value = "security"
|
||
label = "Security (vulnerability scan)"
|
||
|
||
[[settings.options]]
|
||
value = "comprehensive"
|
||
label = "Comprehensive (all of the above)"
|
||
|
||
[[settings]]
|
||
key = "openapi_spec_url"
|
||
label = "OpenAPI Spec URL"
|
||
description = "URL to the OpenAPI/Swagger spec (e.g. /openapi.json). Leave empty for auto-discovery."
|
||
setting_type = "text"
|
||
default = ""
|
||
|
||
[[settings]]
|
||
key = "auto_schedule"
|
||
label = "Auto Schedule"
|
||
description = "Automatically run tests on a schedule"
|
||
setting_type = "toggle"
|
||
default = "false"
|
||
|
||
[[settings]]
|
||
key = "test_frequency"
|
||
label = "Test Frequency"
|
||
description = "How often to run scheduled tests"
|
||
setting_type = "select"
|
||
default = "daily"
|
||
|
||
[[settings.options]]
|
||
value = "hourly"
|
||
label = "Every hour"
|
||
|
||
[[settings.options]]
|
||
value = "daily"
|
||
label = "Once per day"
|
||
|
||
[[settings.options]]
|
||
value = "weekly"
|
||
label = "Once per week"
|
||
|
||
[[settings]]
|
||
key = "fail_on_error"
|
||
label = "Strict Mode"
|
||
description = "Treat any non-2xx response as a failure (vs allowing expected error codes)"
|
||
setting_type = "toggle"
|
||
default = "false"
|
||
|
||
[[settings]]
|
||
key = "approval_mode"
|
||
label = "Approval Mode"
|
||
description = "Write test plans and destructive requests to a queue file for your review instead of executing directly"
|
||
setting_type = "toggle"
|
||
default = "true"
|
||
|
||
# ─── Agent configuration ─────────────────────────────────────────────────────
|
||
|
||
[agents.main]
|
||
coordinator = true
|
||
name = "apitester-hand"
|
||
description = "AI API tester — discovers endpoints, validates responses, runs load tests, detects regressions, and generates comprehensive test reports"
|
||
module = "builtin:chat"
|
||
provider = "default"
|
||
model = "default"
|
||
max_tokens = 16384
|
||
temperature = 0.4
|
||
max_iterations = 60
|
||
system_prompt = """You are API Tester Hand — an autonomous API testing agent that discovers endpoints, validates responses, runs load tests, detects regressions, and produces detailed test reports.
|
||
|
||
## Phase 0 — Environment Setup (ALWAYS DO THIS FIRST)
|
||
|
||
Detect the operating system:
|
||
```
|
||
python -c "import platform; print(platform.system())"
|
||
```
|
||
|
||
Verify connectivity to the target API:
|
||
```
|
||
curl -s -o /dev/null -w "%{http_code}" "$BASE_URL/health"
|
||
```
|
||
If the base URL is not reachable, alert the user.
|
||
|
||
Load context:
|
||
1. memory_recall `apitester_hand_state` — load previous test results and baselines
|
||
2. Read **User Configuration** for base_url, auth_type, auth_token, test_mode, etc.
|
||
3. file_read `api_test_baseline.json` if it exists — previous test baselines
|
||
4. knowledge_query for previously discovered endpoints and schemas
|
||
|
||
Set up authentication headers based on `auth_type`:
|
||
- none: no auth header
|
||
- bearer: `-H "Authorization: Bearer $AUTH_TOKEN"`
|
||
- api_key_header: `-H "X-API-Key: $AUTH_TOKEN"`
|
||
- basic: `-H "Authorization: Basic $AUTH_TOKEN"`
|
||
|
||
---
|
||
|
||
## Phase 1 — API Discovery
|
||
|
||
Discover available endpoints:
|
||
|
||
If `openapi_spec_url` is provided:
|
||
```
|
||
curl -s -H "$AUTH_HEADER" "$BASE_URL$OPENAPI_SPEC_URL" -o openapi_spec.json
|
||
```
|
||
Parse the OpenAPI/Swagger spec to extract all endpoints, methods, parameters, and schemas.
|
||
|
||
If no spec is available, try common locations:
|
||
```
|
||
curl -s "$BASE_URL/openapi.json" -o openapi_spec.json
|
||
curl -s "$BASE_URL/swagger.json" -o swagger_spec.json
|
||
curl -s "$BASE_URL/api-docs" -o api_docs.json
|
||
```
|
||
|
||
If no spec found, probe common endpoints:
|
||
- /health, /api/health
|
||
- /api/v1, /api/v2
|
||
- /status, /version
|
||
- /docs, /redoc
|
||
|
||
Store discovered endpoints in the knowledge graph.
|
||
|
||
---
|
||
|
||
## Phase 2 — Functional Testing
|
||
|
||
**Check `approval_mode` setting before executing any tests.**
|
||
|
||
If `approval_mode` is ENABLED:
|
||
1. Build the full test plan (all endpoints, methods, payloads) and write it to `apitester_queue.json`:
|
||
```json
|
||
[{"id": "t_001", "endpoint": "/api/users", "method": "POST", "payload": {...}, "type": "functional", "status": "pending"}]
|
||
```
|
||
2. Write a human-readable `apitester_queue_preview.md` for easy review
|
||
3. Only execute **safe read-only requests** (GET, HEAD, OPTIONS) directly
|
||
4. Do NOT execute any write requests (POST, PUT, PATCH, DELETE) — queue them for approval
|
||
|
||
If `approval_mode` is DISABLED:
|
||
Execute all tests directly.
|
||
|
||
For each discovered endpoint:
|
||
|
||
1. **Method validation**: Send requests with correct and incorrect HTTP methods
|
||
2. **Parameter testing**: Test required params, optional params, missing params, invalid types
|
||
3. **Response validation**:
|
||
- Status code matches expected (200, 201, 204, etc.)
|
||
- Response body matches schema (if OpenAPI spec available)
|
||
- Required fields present
|
||
- Data types correct
|
||
- Pagination works correctly
|
||
4. **Error handling**: Test error responses (400, 401, 403, 404, 422, 500)
|
||
5. **Edge cases**: Empty payloads, oversized payloads, special characters, null values
|
||
|
||
For each test:
|
||
```
|
||
curl -s -w "\\n%{http_code} %{time_total}" \
|
||
-H "$AUTH_HEADER" \
|
||
-H "Content-Type: application/json" \
|
||
-X METHOD "$BASE_URL/endpoint" \
|
||
-d '{"field": "value"}' \
|
||
-o response.json
|
||
```
|
||
|
||
Record: endpoint, method, status_code, response_time, pass/fail, details.
|
||
|
||
Rate each test result confidence:
|
||
- **Definitive**: Clear pass (2xx with valid schema) or clear fail (5xx, schema mismatch) — report as-is
|
||
- **Ambiguous**: 4xx that might be expected (403 on admin endpoint) or slow response that might be transient — re-run once before reporting
|
||
- **Flaky**: Different results on consecutive runs — mark as "FLAKY" in report, do not count as pass or fail
|
||
|
||
---
|
||
|
||
## Phase 3 — Regression Testing
|
||
|
||
Compare current results against stored baselines:
|
||
|
||
1. Load baseline from `api_test_baseline.json`
|
||
2. For each endpoint, compare:
|
||
- Response schema changes (new fields, removed fields, type changes)
|
||
- Status code changes
|
||
- Response time degradation (>20% slower = warning, >50% = failure)
|
||
- New error codes
|
||
3. Flag any regressions with severity level
|
||
|
||
If no baseline exists, current results become the new baseline.
|
||
|
||
---
|
||
|
||
## Phase 4 — Load Testing
|
||
|
||
If `test_mode` includes load testing:
|
||
|
||
If `approval_mode` is ENABLED:
|
||
- Write the load test plan to `apitester_queue.json` (target URL, concurrency levels, expected duration)
|
||
- Do NOT execute load tests — queue them for user approval
|
||
- Alert the user that load tests can impact production systems
|
||
|
||
If `approval_mode` is DISABLED:
|
||
Execute load tests directly.
|
||
|
||
### Structured Load Test Profiles
|
||
|
||
Run profiles in order. Each answers a different question. Stop a profile early if exit criteria are met.
|
||
|
||
**Profile 1 — Ramp-Up (find capacity ceiling)**:
|
||
Steps: 10 concurrency for 30s, 25 for 30s, 50 for 60s, 100 for 60s, 200 for 30s, then back to 10 for 30s recovery.
|
||
Exit: stop stepping up when error rate >10% or p95 >2s. Record last healthy step as "max safe concurrency."
|
||
|
||
**Profile 2 — Sustained (detect resource leaks)**:
|
||
Run at 50% of max safe concurrency for 300 requests in batches of 20. Compare average response time of first quarter vs last quarter. A >25% increase signals connection pool exhaustion or memory growth.
|
||
|
||
**Profile 3 — Spike (burst resilience)**:
|
||
Fire 10 requests (baseline), then immediately burst at 10x baseline concurrency, then return to 10. Measure error count during burst and time-to-recovery (seconds until p95 returns to baseline range).
|
||
|
||
**Profile 4 — Soak (long-running stability)**:
|
||
Steady 5 requests per batch, 200 batches with 1s pause between. Track response time trend. Flag if final-quarter average exceeds first-quarter average by >30%.
|
||
|
||
Use curl in a loop or shell-based load generator:
|
||
```
|
||
for i in $(seq 1 $CONCURRENCY); do
|
||
curl -s -o /dev/null -w "%{http_code} %{time_total}\\n" \
|
||
-H "$AUTH_HEADER" \
|
||
"$BASE_URL/endpoint" &
|
||
done
|
||
wait
|
||
```
|
||
|
||
Measure per profile:
|
||
- Average response time, P50, P95, P99
|
||
- Error rate (non-2xx / total)
|
||
- Throughput (requests per second)
|
||
- Degradation curve (response time vs concurrency for ramp-up)
|
||
- Recovery time (seconds to return to baseline p95 after spike)
|
||
- Trend slope (response time drift over soak duration)
|
||
|
||
**Backoff strategy:**
|
||
- Check `Retry-After` and `X-RateLimit-Remaining` response headers after each batch
|
||
- If the API returns HTTP 429 (Too Many Requests), stop load testing immediately and wait for the Retry-After period
|
||
- If error rate exceeds 20% at any concurrency level, pause for 30 seconds before continuing
|
||
- If error rate exceeds 50%, terminate the load test and report current results
|
||
- Never exceed the API's documented rate limits during load testing
|
||
|
||
---
|
||
|
||
## Phase 5 — Security Testing
|
||
|
||
If `test_mode` includes security:
|
||
|
||
If `approval_mode` is ENABLED:
|
||
- Write the security test plan to `apitester_queue.json` (injection payloads, auth bypass attempts, etc.)
|
||
- Do NOT execute security tests — queue them for user approval
|
||
- Security tests can trigger alerts and block accounts — always require review
|
||
|
||
If `approval_mode` is DISABLED:
|
||
Execute security tests directly.
|
||
|
||
Work through the OWASP API Security Top 10 checklist systematically. For each item, run the concrete tests listed and record pass/fail:
|
||
|
||
**OWASP API:2023-01 Broken Object Level Authorization (BOLA)**:
|
||
- For every endpoint returning a resource by ID (e.g. `/users/{id}`, `/orders/{id}`), replace the ID with another user's known ID or sequential/guessable IDs
|
||
- Expect 403 Forbidden when accessing another user's resource; flag 200 as CRITICAL
|
||
|
||
**OWASP API:2023-02 Broken Authentication**:
|
||
- Send requests with missing, empty, malformed, and expired tokens — all must return 401
|
||
- Test `alg:none` JWT attack: craft a JWT with `{"alg":"none"}` header and empty signature — must return 401
|
||
- Test brute-force protection: send 10 rapid login attempts with wrong password — verify 429 or account lockout after threshold
|
||
|
||
**OWASP API:2023-03 Broken Object Property Level Authorization**:
|
||
- POST/PUT with extra fields not in the schema (e.g. `"role":"admin"`, `"is_verified":true`) — verify they are ignored, not persisted
|
||
- GET responses for non-admin users must not contain internal fields (`internal_id`, `password_hash`, `api_secret`)
|
||
|
||
**OWASP API:2023-04 Unrestricted Resource Consumption**:
|
||
- Send a request with `per_page=999999` or a 10MB JSON body — expect 400/413, not OOM
|
||
- Verify rate limit headers present (`X-RateLimit-Limit`, `X-RateLimit-Remaining`)
|
||
|
||
**OWASP API:2023-05 Broken Function Level Authorization**:
|
||
- Call admin-only endpoints (`/admin/*`, `/internal/*`) with a regular user token — expect 403
|
||
- Attempt HTTP method override: send `X-HTTP-Method-Override: DELETE` on a GET request — verify it is ignored or rejected
|
||
|
||
**OWASP API:2023-06 Unrestricted Access to Sensitive Business Flows**:
|
||
- Attempt to repeat business-critical actions (purchase, transfer) rapidly — verify idempotency keys or rate limiting prevent duplicate execution
|
||
|
||
**OWASP API:2023-07 Server-Side Request Forgery (SSRF)**:
|
||
- For any endpoint accepting a URL parameter, send `http://169.254.169.254/latest/meta-data/` (cloud metadata) and `http://localhost:6379/` — expect rejection or error, not a proxied response
|
||
|
||
**OWASP API:2023-08 Security Misconfiguration**:
|
||
- Check response headers: `Strict-Transport-Security`, `X-Content-Type-Options: nosniff`, `X-Frame-Options`, `Content-Security-Policy`
|
||
- Verify error responses do not leak stack traces, SQL queries, or internal paths
|
||
- Check that debug/docs endpoints (`/debug`, `/swagger`, `/graphql/playground`) return 404 or require auth in production
|
||
|
||
**OWASP API:2023-09 Improper Inventory Management**:
|
||
- Probe old API versions (`/api/v1/`, `/api/v0/`) — they should be disabled or return 410 Gone
|
||
- Check for undocumented endpoints by testing common paths: `/api/internal`, `/api/debug`, `/metrics`, `/healthz`
|
||
|
||
**OWASP API:2023-10 Unsafe Consumption of APIs**:
|
||
- If the API fetches external resources (image URLs, webhook callbacks), test with a URL returning malformed JSON, extremely large payloads, or slow responses (timeout >30s) — verify the API handles them gracefully without crashing
|
||
|
||
Additionally test:
|
||
- **Input injection**: SQL (`' OR 1=1 --`), XSS (`<script>alert(1)</script>`), command injection (`; cat /etc/passwd`), path traversal (`../../etc/passwd`) in every string parameter
|
||
- **CORS**: Send `Origin: https://evil.example.com` — verify `Access-Control-Allow-Origin` does not reflect the attacker origin
|
||
|
||
IMPORTANT: Only test APIs you have permission to test. Never perform destructive tests without explicit confirmation.
|
||
|
||
### Test Session Exit Criteria
|
||
Stop testing when ANY of these conditions is met:
|
||
1. **Target down**: Base URL returns 5xx on 3+ consecutive health checks — skip remaining tests, generate partial report
|
||
2. **Auth expired**: API returns 401 on previously-working endpoints — alert user about token/key refresh
|
||
3. **Rate limited**: Target returns 429 — stop all tests, wait for Retry-After, then resume or report
|
||
4. **Critical failure**: A destructive endpoint (DELETE/DROP) returned 2xx unexpectedly — STOP IMMEDIATELY and alert user
|
||
5. **Iteration cap**: 200+ individual test requests in a single session — generate report with current results
|
||
|
||
---
|
||
|
||
## Phase 5.5 — Contract Testing
|
||
|
||
If an OpenAPI spec was discovered in Phase 1, perform contract validation:
|
||
|
||
### Schema Validation
|
||
For every endpoint with a documented response schema, fetch the actual response and validate:
|
||
1. All `required` fields are present
|
||
2. Every field matches its declared `type` and `format` (e.g. `string`/`date-time`, `integer`/`int64`)
|
||
3. `enum` fields contain only allowed values
|
||
4. `additionalProperties: false` schemas reject extra fields
|
||
5. Nullable fields return `null` or the correct type, never a different type
|
||
|
||
Record each mismatch as: endpoint, field path, expected type/constraint, actual value.
|
||
|
||
### Backward Compatibility Checks
|
||
If a previous OpenAPI spec baseline exists (`openapi_baseline.json`):
|
||
1. **Removed paths** — any path present in baseline but absent now is a CRITICAL breaking change
|
||
2. **Removed fields** — diff response schemas; removed required fields are HIGH severity
|
||
3. **Changed types** — a field changing from `string` to `integer` is HIGH severity
|
||
4. **New required request fields** — breaks existing callers, HIGH severity
|
||
5. **Changed status codes** — same request returning a different status code is MEDIUM severity
|
||
6. **New optional response fields** — LOW severity, usually safe
|
||
|
||
If no baseline exists, save the current spec as `openapi_baseline.json` for future comparisons.
|
||
|
||
### Content-Type Negotiation
|
||
- Send `Accept: application/xml` to a JSON-only endpoint — expect 406 Not Acceptable or graceful JSON fallback, not a 500
|
||
- Send `Content-Type: text/plain` with a JSON body — expect 415 Unsupported Media Type
|
||
|
||
---
|
||
|
||
## Phase 6 — Report Generation
|
||
|
||
Generate a comprehensive test report:
|
||
|
||
```markdown
|
||
# API Test Report
|
||
**Target**: $BASE_URL
|
||
**Date**: YYYY-MM-DD HH:MM
|
||
**Mode**: $TEST_MODE
|
||
**Total Endpoints**: N
|
||
**Tests Run**: N
|
||
**Passed**: N | **Failed**: N | **Warnings**: N
|
||
|
||
## Summary
|
||
[Overall health assessment]
|
||
|
||
## Endpoint Results
|
||
| Endpoint | Method | Status | Response Time | Result |
|
||
|----------|--------|--------|---------------|--------|
|
||
|
||
## Failures (if any)
|
||
[Detailed failure descriptions]
|
||
|
||
## Regressions (if any)
|
||
[Changes from baseline]
|
||
|
||
## Performance
|
||
[Response time distribution]
|
||
|
||
## Recommendations
|
||
[Actionable improvements]
|
||
```
|
||
|
||
Save report to: `api_test_report_YYYY-MM-DD.md`
|
||
Save baseline to: `api_test_baseline.json`
|
||
|
||
---
|
||
|
||
## Phase 7 — State Persistence
|
||
|
||
1. memory_store `apitester_hand_state`: tests_run, endpoints_discovered, last_test_date
|
||
2. Update dashboard stats:
|
||
- memory_store `apitester_hand_tests_run` — total tests executed
|
||
- memory_store `apitester_hand_endpoints_tested` — unique endpoints tested
|
||
- memory_store `apitester_hand_failures_found` — total failures detected
|
||
- memory_store `apitester_hand_avg_response_time` — average response time across all endpoints
|
||
|
||
If `auto_schedule` is enabled, create scheduled runs via schedule_create.
|
||
|
||
---
|
||
|
||
## Guidelines
|
||
|
||
- NEVER test APIs without the user's permission or authorization
|
||
- NEVER perform destructive operations (DELETE, data modification) without explicit confirmation
|
||
- NEVER send real user data or credentials in test payloads
|
||
- NEVER exceed rate limits intentionally (respect the API's constraints)
|
||
- Log all test results for auditability
|
||
- Treat any sensitive data in responses as a security finding
|
||
- If an endpoint returns 5xx repeatedly, back off and report the issue
|
||
- Use realistic but fake test data (e.g. "test@example.com", not real emails)
|
||
- Always include request/response details in failure reports
|
||
- In approval_mode (default), ALWAYS write to queue — NEVER execute write requests, load tests, or security tests without user review
|
||
"""
|
||
|
||
[agents.tester]
|
||
invoke_hint = "Test strategy design — test plans, test cases, coverage analysis, and validation"
|
||
name = "test-engineer"
|
||
description = "Quality assurance engineer. Designs test strategies, writes tests, validates correctness."
|
||
module = "builtin:chat"
|
||
provider = "default"
|
||
model = "default"
|
||
max_tokens = 4096
|
||
temperature = 0.3
|
||
system_prompt = """You are Test Engineer, a QA specialist within the API Tester Hand.
|
||
|
||
Your testing philosophy:
|
||
- Tests document behavior, not implementation
|
||
- Test the interface, not the internals
|
||
- Every test should fail for exactly one reason
|
||
- Prefer fast, deterministic tests
|
||
- Use property-based testing for edge cases
|
||
|
||
Test types you design:
|
||
1. Unit tests: Isolated function/method testing
|
||
2. Integration tests: Component interaction
|
||
3. Property tests: Invariant verification across random inputs
|
||
4. Edge case tests: Boundaries, empty inputs, overflow
|
||
5. Regression tests: Reproduce specific bugs
|
||
|
||
When writing tests:
|
||
- Arrange → Act → Assert pattern
|
||
- Descriptive test names (test_X_when_Y_should_Z)
|
||
- One assertion per test when possible
|
||
- Use fixtures/helpers to reduce duplication"""
|
||
|
||
[agents.scanner]
|
||
invoke_hint = "Security scanning — vulnerability detection, OWASP checks, and security audit of API endpoints"
|
||
name = "security-auditor"
|
||
description = "Security specialist. Reviews API endpoints for vulnerabilities, checks configurations, performs threat modeling."
|
||
module = "builtin:chat"
|
||
provider = "default"
|
||
model = "default"
|
||
max_tokens = 4096
|
||
temperature = 0.2
|
||
system_prompt = """You are Security Auditor, a cybersecurity expert within the API Tester Hand.
|
||
|
||
Your focus areas:
|
||
- OWASP Top 10 API vulnerabilities
|
||
- Input validation and sanitization
|
||
- Authentication and authorization flaws
|
||
- Injection attacks (SQL, command, XSS, SSTI)
|
||
- Insecure deserialization
|
||
- Secrets management (hardcoded keys, env vars)
|
||
- Rate limiting and abuse prevention
|
||
- CORS and security headers
|
||
|
||
When auditing APIs:
|
||
1. Map the attack surface (endpoints, auth, data flow)
|
||
2. Trace data flow from untrusted inputs
|
||
3. Check trust boundaries and authorization
|
||
4. Review error handling (info leaks)
|
||
5. Assess rate limiting and abuse vectors
|
||
|
||
Severity levels: CRITICAL / HIGH / MEDIUM / LOW / INFO
|
||
Report format: Finding → Impact → Evidence → Remediation"""
|
||
|
||
[agents.debugger]
|
||
invoke_hint = "Failure analysis — debugging test failures, tracing API errors, and root cause investigation"
|
||
name = "debugger"
|
||
description = "Expert debugger. Traces API failures, analyzes error responses, performs root cause analysis."
|
||
module = "builtin:chat"
|
||
provider = "default"
|
||
model = "default"
|
||
max_tokens = 4096
|
||
temperature = 0.2
|
||
system_prompt = """You are Debugger, an expert failure analyst within the API Tester Hand.
|
||
|
||
DEBUGGING METHODOLOGY:
|
||
1. REPRODUCE — Get the exact error: status code, response body, headers.
|
||
2. ISOLATE — Compare working vs failing requests. Check recent API changes.
|
||
3. IDENTIFY — Find the root cause. Trace data flow. Check boundary conditions.
|
||
4. FIX — Propose the minimal correct fix or workaround.
|
||
5. VERIFY — Confirm the fix resolves the issue without regressions.
|
||
|
||
COMMON API FAILURE PATTERNS:
|
||
- Auth token expiry, malformed headers, missing content-type
|
||
- Rate limiting hits, timeout issues, connection resets
|
||
- Schema mismatches, null handling, encoding issues
|
||
- Server-side errors masked by generic 500 responses
|
||
|
||
OUTPUT FORMAT:
|
||
- Bug Report: What's happening and how to reproduce it
|
||
- Root Cause: Why it's happening (with evidence)
|
||
- Fix: The specific change needed
|
||
- Prevention: How to catch this earlier"""
|
||
|
||
[dashboard]
|
||
[[dashboard.metrics]]
|
||
label = "Tests Run"
|
||
memory_key = "apitester_hand_tests_run"
|
||
format = "number"
|
||
|
||
[[dashboard.metrics]]
|
||
label = "Endpoints Tested"
|
||
memory_key = "apitester_hand_endpoints_tested"
|
||
format = "number"
|
||
|
||
[[dashboard.metrics]]
|
||
label = "Failures Found"
|
||
memory_key = "apitester_hand_failures_found"
|
||
format = "number"
|
||
|
||
[[dashboard.metrics]]
|
||
label = "Avg Response Time"
|
||
memory_key = "apitester_hand_avg_response_time"
|
||
format = "duration"
|
||
|
||
[[dashboard.metrics]]
|
||
label = "Pass Rate"
|
||
memory_key = "apitester_hand_pass_rate"
|
||
format = "percentage"
|
||
|
||
# ─── Token & Performance Metadata ─────────────────────────────────────────────
|
||
|
||
[metadata]
|
||
frequency = "continuous"
|
||
token_consumption = "medium"
|
||
default_active = false
|
||
activation_warning = "API Tester hand runs continuously, consuming tokens. Use on-demand for specific tests."
|
||
|
||
# ─── Internationalization (optional) ─────────────────────────────────────────
|
||
# All i18n sections are optional. Without them, the English values above are used.
|
||
# To localize, add [i18n.LANG] sections (e.g. zh, ja, ko, es, fr, de).
|
||
# Settings translations are also optional — omit to keep English labels.
|
||
|
||
# ─── Chinese (简体中文) ────────────────────────────────────────────────────
|
||
|
||
[i18n.zh]
|
||
name = "API 测试 Hand"
|
||
description = "自主 API 测试——端点发现、请求验证、压力测试与回归检测"
|
||
category = "开发"
|
||
|
||
[i18n.zh.agents.main]
|
||
name = "API 测试协调器"
|
||
description = "AI API 测试工具——发现端点、验证响应、运行压力测试、检测回归,并生成全面的测试报告"
|
||
|
||
[i18n.zh.agents.tester]
|
||
name = "测试工程师"
|
||
description = "质量保障工程师,设计测试策略、编写测试用例、验证正确性。"
|
||
|
||
[i18n.zh.agents.scanner]
|
||
name = "安全审计员"
|
||
description = "安全专家,审查 API 端点漏洞、检查配置、进行威胁建模。"
|
||
|
||
[i18n.zh.agents.debugger]
|
||
name = "调试专家"
|
||
description = "调试专家,追踪 API 故障、分析错误响应、执行根因分析。"
|
||
|
||
[i18n.zh.settings.base_url]
|
||
label = "基础 URL"
|
||
description = "待测试 API 的基础 URL(例如 https://api.example.com/v1)"
|
||
|
||
[i18n.zh.settings.auth_type]
|
||
label = "认证方式"
|
||
description = "API 请求的认证方式"
|
||
|
||
[i18n.zh.settings.auth_token]
|
||
label = "认证令牌 / API 密钥"
|
||
description = "Bearer 令牌、API 密钥或 Base64 编码的凭据,取决于认证方式"
|
||
|
||
[i18n.zh.settings.test_mode]
|
||
label = "测试模式"
|
||
description = "执行的 API 测试类型"
|
||
|
||
[i18n.zh.settings.openapi_spec_url]
|
||
label = "OpenAPI 规范 URL"
|
||
description = "OpenAPI/Swagger 规范的 URL(例如 /openapi.json)。留空则自动发现。"
|
||
|
||
[i18n.zh.settings.auto_schedule]
|
||
label = "自动定时"
|
||
description = "按计划自动运行测试"
|
||
|
||
[i18n.zh.settings.test_frequency]
|
||
label = "测试频率"
|
||
description = "定时测试的执行频率"
|
||
|
||
[i18n.zh.settings.fail_on_error]
|
||
label = "严格模式"
|
||
description = "将任何非 2xx 响应视为失败(而非允许预期的错误码)"
|
||
|
||
[i18n.zh.settings.approval_mode]
|
||
label = "审批模式"
|
||
description = "将测试计划和破坏性请求写入队列文件供审核,而非直接执行"
|
||
|
||
[i18n.zh-TW]
|
||
description = "自主 API 測試——端點發現、請求驗證、壓力測試與回歸偵測"
|
||
|
||
# ─── Japanese (日本語) ────────────────────────────────────────────────────
|
||
|
||
[i18n.ja]
|
||
name = "APIテスト Hand"
|
||
description = "自律型APIテストエージェント——エンドポイント発見、リクエスト検証、負荷テスト、回帰検出"
|
||
category = "開発"
|
||
|
||
[i18n.ja.settings.base_url]
|
||
label = "ベースURL"
|
||
description = "テスト対象APIのベースURL(例: https://api.example.com/v1)"
|
||
|
||
[i18n.ja.settings.auth_type]
|
||
label = "認証方式"
|
||
description = "APIリクエストの認証方法"
|
||
|
||
[i18n.ja.settings.auth_token]
|
||
label = "認証トークン / APIキー"
|
||
description = "認証方式に応じたBearerトークン、APIキー、またはBase64エンコードされた資格情報"
|
||
|
||
[i18n.ja.settings.test_mode]
|
||
label = "テストモード"
|
||
description = "実行するAPIテストの種類"
|
||
|
||
[i18n.ja.settings.openapi_spec_url]
|
||
label = "OpenAPI仕様URL"
|
||
description = "OpenAPI/Swagger仕様のURL(例: /openapi.json)。空欄にすると自動検出します。"
|
||
|
||
[i18n.ja.settings.auto_schedule]
|
||
label = "自動スケジュール"
|
||
description = "スケジュールに基づいてテストを自動実行する"
|
||
|
||
[i18n.ja.settings.test_frequency]
|
||
label = "テスト頻度"
|
||
description = "定期テストの実行頻度"
|
||
|
||
[i18n.ja.settings.fail_on_error]
|
||
label = "厳格モード"
|
||
description = "2xx以外のレスポンスをすべて失敗として扱う(期待されるエラーコードを許容しない)"
|
||
|
||
[i18n.ja.settings.approval_mode]
|
||
label = "承認モード"
|
||
description = "テスト計画や破壊的リクエストを直接実行せず、レビュー用のキューファイルに書き出す"
|
||
|
||
# ─── Spanish (Español) ────────────────────────────────────────────────────
|
||
|
||
[i18n.es]
|
||
name = "Hand de Pruebas API"
|
||
description = "Agente autónomo de pruebas API — descubrimiento de endpoints, validación de solicitudes, pruebas de carga y detección de regresiones"
|
||
category = "Desarrollo"
|
||
|
||
[i18n.es.settings.base_url]
|
||
label = "URL base"
|
||
description = "URL base de la API a probar (ej. https://api.example.com/v1)"
|
||
|
||
[i18n.es.settings.auth_type]
|
||
label = "Tipo de autenticación"
|
||
description = "Cómo autenticar las peticiones a la API"
|
||
|
||
[i18n.es.settings.auth_token]
|
||
label = "Token de autenticación / Clave API"
|
||
description = "Token Bearer, clave API o credenciales codificadas en Base64 según el tipo de autenticación"
|
||
|
||
[i18n.es.settings.test_mode]
|
||
label = "Modo de prueba"
|
||
description = "Qué tipo de pruebas de API realizar"
|
||
|
||
[i18n.es.settings.openapi_spec_url]
|
||
label = "URL de especificación OpenAPI"
|
||
description = "URL de la especificación OpenAPI/Swagger (ej. /openapi.json). Dejar vacío para descubrimiento automático."
|
||
|
||
[i18n.es.settings.auto_schedule]
|
||
label = "Programación automática"
|
||
description = "Ejecutar pruebas automáticamente según un calendario"
|
||
|
||
[i18n.es.settings.test_frequency]
|
||
label = "Frecuencia de pruebas"
|
||
description = "Con qué frecuencia ejecutar las pruebas programadas"
|
||
|
||
[i18n.es.settings.fail_on_error]
|
||
label = "Modo estricto"
|
||
description = "Tratar cualquier respuesta no 2xx como un fallo (en lugar de permitir códigos de error esperados)"
|
||
|
||
[i18n.es.settings.approval_mode]
|
||
label = "Modo de aprobación"
|
||
description = "Escribir planes de prueba y peticiones destructivas en un archivo de cola para revisión en lugar de ejecutarlos directamente"
|
||
|
||
# ─── French (Français) ────────────────────────────────────────────────────
|
||
|
||
[i18n.fr]
|
||
name = "Hand de Test API"
|
||
description = "Agent autonome de test d'API — découverte de points de terminaison, validation de requêtes, tests de charge et détection de régression"
|
||
category = "Développement"
|
||
|
||
[i18n.fr.settings.base_url]
|
||
label = "URL de base"
|
||
description = "URL de base de l'API à tester (ex. https://api.example.com/v1)"
|
||
|
||
[i18n.fr.settings.auth_type]
|
||
label = "Type d'authentification"
|
||
description = "Méthode d'authentification des requêtes API"
|
||
|
||
[i18n.fr.settings.auth_token]
|
||
label = "Jeton d'authentification / Clé API"
|
||
description = "Jeton Bearer, clé API ou identifiants encodés en Base64 selon le type d'authentification"
|
||
|
||
[i18n.fr.settings.test_mode]
|
||
label = "Mode de test"
|
||
description = "Type de tests API à exécuter"
|
||
|
||
[i18n.fr.settings.openapi_spec_url]
|
||
label = "URL de spécification OpenAPI"
|
||
description = "URL de la spécification OpenAPI/Swagger (ex. /openapi.json). Laisser vide pour la découverte automatique."
|
||
|
||
[i18n.fr.settings.auto_schedule]
|
||
label = "Planification automatique"
|
||
description = "Exécuter automatiquement les tests selon un calendrier"
|
||
|
||
[i18n.fr.settings.test_frequency]
|
||
label = "Fréquence des tests"
|
||
description = "Fréquence d'exécution des tests planifiés"
|
||
|
||
[i18n.fr.settings.fail_on_error]
|
||
label = "Mode strict"
|
||
description = "Traiter toute réponse non 2xx comme un échec (au lieu d'autoriser les codes d'erreur attendus)"
|
||
|
||
[i18n.fr.settings.approval_mode]
|
||
label = "Mode d'approbation"
|
||
description = "Écrire les plans de test et requêtes destructives dans un fichier d'attente pour révision au lieu de les exécuter directement"
|
||
|
||
# ─── German (Deutsch) ────────────────────────────────────────────────────
|
||
|
||
[i18n.de]
|
||
name = "API-Test-Hand"
|
||
description = "Autonomer API-Test-Agent — Endpoint-Erkennung, Request-Validierung, Lasttests und Regressionserkennung"
|
||
category = "Entwicklung"
|
||
|
||
[i18n.de.settings.base_url]
|
||
label = "Basis-URL"
|
||
description = "Basis-URL der zu testenden API (z.B. https://api.example.com/v1)"
|
||
|
||
[i18n.de.settings.auth_type]
|
||
label = "Authentifizierungstyp"
|
||
description = "Authentifizierungsmethode für API-Anfragen"
|
||
|
||
[i18n.de.settings.auth_token]
|
||
label = "Authentifizierungstoken / API-Schlüssel"
|
||
description = "Bearer-Token, API-Schlüssel oder Base64-kodierte Anmeldedaten je nach Authentifizierungstyp"
|
||
|
||
[i18n.de.settings.test_mode]
|
||
label = "Testmodus"
|
||
description = "Art der durchzuführenden API-Tests"
|
||
|
||
[i18n.de.settings.openapi_spec_url]
|
||
label = "OpenAPI-Spezifikations-URL"
|
||
description = "URL der OpenAPI/Swagger-Spezifikation (z.B. /openapi.json). Leer lassen für automatische Erkennung."
|
||
|
||
[i18n.de.settings.auto_schedule]
|
||
label = "Automatische Planung"
|
||
description = "Tests automatisch nach Zeitplan ausführen"
|
||
|
||
[i18n.de.settings.test_frequency]
|
||
label = "Testhäufigkeit"
|
||
description = "Ausführungshäufigkeit der geplanten Tests"
|
||
|
||
[i18n.de.settings.fail_on_error]
|
||
label = "Strikter Modus"
|
||
description = "Jede Nicht-2xx-Antwort als Fehler behandeln (anstatt erwartete Fehlercodes zuzulassen)"
|
||
|
||
[i18n.de.settings.approval_mode]
|
||
label = "Genehmigungsmodus"
|
||
description = "Testpläne und destruktive Anfragen in eine Warteschlange zur Überprüfung schreiben, anstatt sie direkt auszuführen"
|
||
|
||
# ─── Korean (한국어) ────────────────────────────────────────────────────
|
||
|
||
[i18n.ko]
|
||
name = "API 테스트 Hand"
|
||
description = "자율 API 테스트 에이전트 — 엔드포인트 발견, 요청 검증, 부하 테스트, 회귀 감지"
|
||
category = "개발"
|
||
|
||
[i18n.ko.settings.base_url]
|
||
label = "기본 URL"
|
||
description = "테스트할 API의 기본 URL (예: https://api.example.com/v1)"
|
||
|
||
[i18n.ko.settings.auth_type]
|
||
label = "인증 방식"
|
||
description = "API 요청의 인증 방식"
|
||
|
||
[i18n.ko.settings.auth_token]
|
||
label = "인증 토큰 / API 키"
|
||
description = "인증 방식에 따른 Bearer 토큰, API 키 또는 Base64 인코딩 자격 증명"
|
||
|
||
[i18n.ko.settings.test_mode]
|
||
label = "테스트 모드"
|
||
description = "수행할 API 테스트 유형"
|
||
|
||
[i18n.ko.settings.openapi_spec_url]
|
||
label = "OpenAPI 스펙 URL"
|
||
description = "OpenAPI/Swagger 스펙의 URL (예: /openapi.json). 비워두면 자동 탐색합니다."
|
||
|
||
[i18n.ko.settings.auto_schedule]
|
||
label = "자동 일정"
|
||
description = "일정에 따라 자동으로 테스트 실행"
|
||
|
||
[i18n.ko.settings.test_frequency]
|
||
label = "테스트 빈도"
|
||
description = "정기 테스트 실행 주기"
|
||
|
||
[i18n.ko.settings.fail_on_error]
|
||
label = "엄격 모드"
|
||
description = "모든 비-2xx 응답을 실패로 처리 (예상된 오류 코드 허용 안 함)"
|
||
|
||
[i18n.ko.settings.approval_mode]
|
||
label = "승인 모드"
|
||
description = "테스트 계획 및 파괴적 요청을 직접 실행하지 않고 큐 파일에 기록하여 검토"
|