From dev-server
Local testing setup - start dev server with mock Claude and run tests (unit tests, CLI E2E)
npx claudepluginhub vm0-ai/team-skills --plugin dev-serverThis skill uses the workspace's default tool permissions.
This skill documents how to properly set up a local development environment for testing, including running unit tests and CLI E2E tests with mock Claude.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
This skill documents how to properly set up a local development environment for testing, including running unit tests and CLI E2E tests with mock Claude.
# 1. Install dependencies
cd turbo && pnpm install
# 2. Run unit tests
cd turbo && pnpm vitest run
# 1. Start dev server with tunnel (required for webhooks)
/dev-server:start
# 2. Wait for server to be ready, then authenticate CLI
/dev-server:auth
# 3. Deploy runner (needed for vm0 run, takes several minutes)
/dev-server:runner
# 4. Run CLI E2E tests
VM0_API_URL=http://localhost:3000 USE_MOCK_CLAUDE=true BATS_TEST_TIMEOUT=60 \
./e2e/test/libs/bats/bin/bats -T ./e2e/tests/01-serial/*.bats
Ensure the following are set in turbo/apps/web/.env.local:
| Variable | Purpose | Required |
|---|---|---|
USE_MOCK_CLAUDE | Enable mock Claude for testing (set to true) | Yes for E2E |
CONCURRENT_RUN_LIMIT_CAP | Set to 0 to disable run limits during testing | Yes for E2E |
SECRETS_ENCRYPTION_KEY | Encryption key for secrets | Yes |
CLERK_SECRET_KEY | Clerk authentication | Yes |
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY | Clerk authentication | Yes |
If environment variables are missing, ask the user to run the sync script:
scripts/sync-env.sh
Note:
sync-env.shrequires 1Password authentication and can only be executed by the user directly. If you encounter missing environment variable errors, request the user to run this script.
# Add to turbo/apps/web/.env.local
echo "USE_MOCK_CLAUDE=true" >> turbo/apps/web/.env.local
echo "CONCURRENT_RUN_LIMIT_CAP=0" >> turbo/apps/web/.env.local
/dev-server:start
This will:
VM0_API_URL to the tunnel URLcd turbo && pnpm dev
Check for these indicators in the logs (/dev-server:logs):
[tunnel] Tunnel URL: https://xxx.trycloudflare.comReady in XXXms for each appImportant: The tunnel URL changes each time you restart. Sandbox webhooks use this URL to send events back to your local server.
Before running unit tests, ensure dependencies are installed:
cd turbo && pnpm install
cd turbo && pnpm vitest run
Expected output:
Test Files 173 passed (173)
Tests 2348 passed (2348)
cd turbo && pnpm vitest
cd turbo && pnpm vitest run apps/web/src/lib/__tests__/my-test.test.ts
cd turbo && pnpm vitest run --project @vm0/cli
cd turbo && pnpm vitest run --project web
e2e/tests/
├── 01-serial/ # Tests that MUST run serially (scope setup)
└── 03-runner/ # All parallel tests (runs on runner)
| Variable | Value | Purpose |
|---|---|---|
VM0_API_URL | http://localhost:3000 | API endpoint |
USE_MOCK_CLAUDE | true | Use mock Claude instead of real API |
BATS_TEST_TIMEOUT | 30 (serial) / 60 (parallel) | Per-test timeout in seconds |
VM0_API_URL=http://localhost:3000 \
USE_MOCK_CLAUDE=true \
BATS_TEST_TIMEOUT=30 \
./e2e/test/libs/bats/bin/bats -T ./e2e/tests/01-serial/*.bats
VM0_API_URL=http://localhost:3000 \
USE_MOCK_CLAUDE=true \
BATS_TEST_TIMEOUT=60 \
./e2e/test/libs/bats/bin/bats -T -j 10 --no-parallelize-within-files ./e2e/tests/03-runner/*.bats
VM0_API_URL=http://localhost:3000 \
USE_MOCK_CLAUDE=true \
BATS_TEST_TIMEOUT=60 \
./e2e/test/libs/bats/bin/bats -T ./e2e/tests/03-runner/t17-vm0-simplified-compose.bats
VM0_API_URL=http://localhost:3000 \
USE_MOCK_CLAUDE=true \
BATS_TEST_TIMEOUT=60 \
./e2e/test/libs/bats/bin/bats -T ./e2e/tests/03-runner/t17-vm0-simplified-compose.bats \
--filter "vm0 compose with both instructions and skills"
When USE_MOCK_CLAUDE=true:
run-agent.ts checks for USE_MOCK_CLAUDEclaude CLI, it runs the mock Claude scriptCause: Dependencies not installed or out of sync
Solution:
cd turbo && pnpm install
Solution:
cd turbo && pnpm install
cd turbo && pnpm vitest run
Cause: Sandbox cannot reach the tunnel URL (webhooks fail)
Solution:
/dev-server:logs tunnelcurl -v https://<tunnel-url>/api/webhooks/agent/events
/dev-server:stop
/dev-server:start
Cause: CONCURRENT_RUN_LIMIT_CAP not set or not 0
Solution:
echo "CONCURRENT_RUN_LIMIT_CAP=0" >> turbo/apps/web/.env.local
# Then restart dev server
Cause: vm0 run takes ~15-30 seconds per execution
Solution:
BATS_TEST_TIMEOUT is set appropriately (60s for parallel tests)/dev-server:logs error/dev-server:logs sandboxCause: Environment variables not synced from 1Password
Solution: Ask the user to run the sync script (requires 1Password authentication):
scripts/sync-env.sh
Note: This script can only be executed by the user directly as it requires interactive 1Password authentication.
Cause: CF_DNS_AND_TUNNEL_API_TOKEN not set. Caddy needs this to provision Let's Encrypt certificates via DNS-01 challenge.
Solution:
scripts/sync-env.sh
Cause: GNU Parallel not installed
Solution:
sudo apt-get install -y parallel
Solution:
# Kill processes on dev ports
fuser -k 3000/tcp 3001/tcp 3002/tcp 3003/tcp
# Or use dev-stop
/dev-server:stop
Cause: High concurrency causing request body truncation (local dev environment limitation)
Solution:
-j 4 instead of -j 10| Aspect | CI | Local |
|---|---|---|
| Server | Vercel Preview | localhost + tunnel |
| Tunnel | Not needed | Cloudflare tunnel required |
| Concurrency | High | May have issues with -j 10 |
| Timeouts | 8 min total | No global limit |
# Check dev server status
/dev-server:logs
# Filter logs by pattern
/dev-server:logs error
/dev-server:logs tunnel
/dev-server:logs sandbox
# Stop dev server
/dev-server:stop
# Authenticate CLI with local server
/dev-server:auth
# Check CLI auth status
vm0 auth status
# Manual test of vm0 run with mock Claude
vm0 run <agent-name> --artifact-name <artifact> "echo hello"
.claude/skills/cli-e2e-testing/skill.md.claude/skills/dev-server/skill.mdturbo/apps/web/src/lib/run/executors/runner-executor.ts