test
npx machina-cli add skill brsbl/ottonomous/test --openclawArguments: $ARGUMENTS
| Command | Behavior |
|---|---|
run | Lint + type check + run tests |
write | Generate tests, then run pipeline |
browser | Visual verification |
all | run + browser combined |
Scope (optional, default: branch):
| Scope | Command |
|---|---|
branch | git diff main...HEAD --name-only |
staged | git diff --cached --name-only |
Run Mode
1. Detect Tools
| Config | Tool | Command |
|---|---|---|
package.json + vitest | Vitest | npx vitest run |
package.json + jest | Jest | npx jest |
package.json + "test" | npm | npm test |
pyproject.toml | pytest | pytest |
Cargo.toml | cargo | cargo test |
go.mod | go | go test ./... |
.eslintrc* / eslint.config.* | ESLint | npx eslint . |
biome.json | Biome | npx biome check . |
tsconfig.json | TypeScript | npx tsc --noEmit |
2. Setup (if missing)
# JS/TS test runner
npm install -D vitest
# JS/TS linter
npm install -D eslint @eslint/js
# JS/TS types
npm install -D typescript && npx tsc --init
# Python
pip install pytest ruff mypy
3. Run Pipeline
# 1. Lint
npx eslint . --fix # or: npx biome check . --write
# 2. Type check
npx tsc --noEmit # or: mypy .
# 3. Test
npx vitest run # or: pytest, cargo test, go test ./...
Fix errors, re-run until all pass.
Write Mode
1. Get Changed Files
git diff main...HEAD --name-only # branch scope
git diff --cached --name-only # staged scope
Filter to source files (exclude tests, configs, docs).
2. Launch Test Writers
Hand off files to test-writer subagents. They determine testability and write tests.
| Files | Subagents |
|---|---|
| 1-3 | 1 |
| 4-8 | 2-3 |
| 9+ | 3-5 |
// Task tool
{
subagent_type: "test-writer",
prompt: "Write tests for: [file list]. Runner: vitest. Convention: *.test.ts"
}
3. Run Pipeline
Same as Run Mode step 3.
Browser Mode
Visual verification using browser automation. See /browser skill for full API.
import { connect, waitForPageLoad } from '../otto/lib/browser/client.js'
const client = await connect({ headless: true })
const page = await client.page('test')
// Determine URL from package.json scripts or running processes
await page.goto(url) // e.g., http://localhost:5173
await waitForPageLoad(page)
await page.screenshot({ path: '.otto/test-screenshots/page.png' })
// Interact using ARIA snapshot refs
const snapshot = await client.getAISnapshot('test')
const btn = await client.selectSnapshotRef('test', 'e3')
await btn.click()
await client.disconnect()
After completing browser verification, remove screenshots:
rm -rf .otto/test-screenshots
All Mode
- Run Mode (lint, type check, test)
- Browser Mode (visual verification)
- Report results
Overview
The test skill orchestrates linting, type checking, tests, and optional visual verification across Run, Write, Browser, and All modes. It auto-detects the project tooling (Vitest, Jest, pytest, cargo, ESLint, and more) and runs the appropriate commands.
How This Skill Works
It inspects config files (e.g., package.json, pyproject.toml, tsconfig.json) to pick a test runner, installs missing tooling per Setup, and then executes lint, type check, and tests in order. In Browser mode, it uses a browser client to perform visual checks and capture snapshots; in Write mode, it hands off changed files to test-writer subagents before running the pipeline.
When to Use It
- After making code changes, run lint, type checks, and tests to validate impact.
- Use Write mode to generate tests with test-writer subagents.
- Use Browser mode for visual verification of UI flows.
- Use All mode to run lint, type check, tests, and browser checks in one pass.
- Validate multi-language projects by auto-detecting appropriate tools (JS/TS, Python, Rust, Go).
Quick Start
- Step 1: Detect tooling in your repo (package.json, pyproject.toml, tsconfig.json).
- Step 2: Run the desired mode (e.g., Run: lint + type check + tests; Write: generate tests; Browser: visual checks).
- Step 3: Review results; in Write mode, hand files to test-writers and re-run.
Best Practices
- Ensure the repository contains known configs (e.g., vitest, pytest, eslint, tsconfig.json) so tools can be auto-detected.
- Install missing tooling as shown in the Setup section before running.
- Run lint with --fix where possible (npx eslint . --fix or biome check . --write).
- Separate lint, type check, and tests during development to reduce feedback time.
- For Browser mode, prepare and review ARIA snapshot refs and UI interactions.
Example Use Cases
- Node/TS project using Vitest, ESLint, and TypeScript
- Python project with pytest, ruff, and mypy
- Rust project with cargo test
- Go project with go test ./...
- JS project using Jest and TypeScript type checks