From arc
Creates test plans covering unit, integration, and E2E tests using specialist agents. Runs and fixes vitest, Jest, Playwright tests with Clerk/WorkOS auth guidance.
npx claudepluginhub howells/arc --plugin arcThis skill uses the workspace's default tool permissions.
<tool_restrictions>
Provides Ktor server patterns for routing DSL, plugins (auth, CORS, serialization), Koin DI, WebSockets, services, and testApplication testing.
Conducts multi-source web research with firecrawl and exa MCPs: searches, scrapes pages, synthesizes cited reports. For deep dives, competitive analysis, tech evaluations, or due diligence.
Provides demand forecasting, safety stock optimization, replenishment planning, and promotional lift estimation for multi-location retailers managing 300-800 SKUs.
<tool_restrictions>
AskUserQuestion — Preserve the one-question-at-a-time interaction pattern. In Claude Code, use the tool. In Codex, ask one concise plain-text question at a time unless a structured question tool is actually available in the current mode. Do not narrate missing tools or fallbacks to the user.EnterPlanMode — BANNED. Do NOT call this tool. This skill has its own structured testing workflow. Execute it directly.ExitPlanMode — BANNED. You are never in plan mode.
</tool_restrictions><arc_runtime>
This workflow requires the full Arc bundle, not a prompts-only install.
Resolve the Arc install root from this skill's location and refer to it as ${ARC_ROOT}.
Use ${ARC_ROOT}/... for Arc-owned files such as references/, disciplines/, agents/, templates/, and scripts/.
Use project-local paths such as .ruler/ or rules/ for the user's repository.
</arc_runtime>
Create comprehensive test strategies covering the full test pyramid. Execute with specialist agents.
<required_reading> Read before planning:
${ARC_ROOT}/references/testing-patterns.md — Test philosophy, vitest/playwright patternsrules/testing.md — Project conventions${ARC_ROOT}/references/llm-api-testing.md — If testing LLM integrations${ARC_ROOT}/disciplines/change-impact-testing.md — Blast radius analysis for code changes
</required_reading>This skill uses 3 writers + 2 runners:
| Agent | Model | Purpose | Framework |
|---|---|---|---|
unit-test-writer | sonnet | Write unit tests | vitest |
integration-test-writer | sonnet | Write integration tests (API, auth) | vitest + MSW |
e2e-test-writer | opus | Write E2E tests | Playwright |
test-runner | haiku | Run vitest, analyze failures | vitest |
e2e-runner | opus | Run Playwright, fix issues, iterate | Playwright |
Test Pyramid:
/\
/ \ E2E (few)
/────\ - Critical user journeys
/ \ - Auth flows
/────────\ Integration (some)
/ \ - API interactions
/────────────\ - Component + state
/ \ Unit (many)
/────────────────\- Pure functions
- Isolated components
<rules_context> Check for project testing rules:
Use Glob tool: .ruler/testing.md
If exists, read for MUST/SHOULD/NEVER constraints.
Detect test framework:
| File | Framework |
|---|---|
vitest.config.* | vitest (unit + integration) |
playwright.config.* | Playwright (E2E) |
| </rules_context> |
AskUserQuestion:
question: "What would you like to do?"
header: "Testing Intent"
options:
- label: "Create test strategy"
description: "Full test plan across unit, integration, and E2E — then dispatch agents"
- label: "Run tests"
description: "Execute existing tests with the appropriate runner"
- label: "Fix failing tests"
description: "Dispatch debugger or e2e-runner to fix broken tests"
- label: "Review coverage"
description: "Analyze gaps in test coverage and recommend improvements"
Gather context:
For each feature, plan across all levels:
## Test Plan: [Feature Name]
### Risk Assessment
- **Criticality**: [high/medium/low]
- **Has Auth**: [yes/no — Clerk/WorkOS/custom]
- **Has API Calls**: [yes/no]
- **User-Facing**: [yes/no]
### Unit Tests (vitest)
**Agent:** unit-test-writer
| Test Case | What it Verifies |
|-----------|------------------|
| `should [behavior]` | [Pure function/component behavior] |
| `should [behavior]` | [Edge case handling] |
| `should [behavior]` | [Error throwing] |
**Files to create:**
- `src/[path]/[module].test.ts`
### Integration Tests (vitest + MSW)
**Agent:** integration-test-writer
| Test Case | What it Verifies |
|-----------|------------------|
| `should [behavior]` | [Component + API interaction] |
| `should [behavior]` | [Auth state handling] |
| `should [behavior]` | [Error from API] |
**Mocking required:**
- API endpoints: [list]
- Auth: [Clerk/WorkOS mock setup]
**Files to create:**
- `src/[path]/[feature].integration.test.ts`
### E2E Tests (Playwright)
**Agent:** e2e-test-writer
| Test Case | What it Verifies |
|-----------|------------------|
| `should [complete flow]` | [Happy path journey] |
| `should [handle error]` | [User-visible error] |
| `should [auth flow]` | [Login/logout if applicable] |
**Auth setup required:**
- Provider: [Clerk/WorkOS/none]
- Test user: [env var names]
**Files to create:**
- `tests/[feature].spec.ts`
- `tests/auth.setup.ts` (if auth needed)
Dispatch specialists in order:
1. Unit tests first (fastest feedback):
Task [unit-test-writer] model: sonnet: "Write unit tests for [feature].
Test cases from plan:
[paste unit test cases]
Files to create: [paths]
Follow vitest patterns from testing-patterns.md"
2. Integration tests second:
Task [integration-test-writer] model: sonnet: "Write integration tests for [feature].
Test cases from plan:
[paste integration test cases]
Auth: [Clerk/WorkOS/none]
API mocking: [endpoints to mock]
Files to create: [paths]"
3. E2E tests last:
Task [e2e-test-writer] model: opus: "Write E2E tests for [feature].
Test cases from plan:
[paste e2e test cases]
Auth: [Clerk/WorkOS/none]
Fixtures needed: [list]
Files to create: [paths]"
Unit + Integration (inline):
pnpm vitest run
E2E (background agent — avoids terminal issues):
Task [e2e-runner] model: opus: "Run E2E tests and fix any failures.
Test files: [list]
Iterate until green or report blockers."
Integration tests (vitest):
useAuth and useUser hooksgetToken for API callsE2E tests (Playwright):
tests/auth.setup.ts for login flowplaywright/.auth/user.jsonstorageState in playwright.config.tsCommon issues:
isLoaded: false stategetToken mock)Integration tests (vitest):
getUser from @workos-inc/authkit-nextjsorganizationId, role, permissionsE2E tests (Playwright):
/api/auth/test-login for faster auth (test env only)Common issues:
organizationId in mock (required for org-level features)For faster E2E tests, create a test-only auth endpoint:
// app/api/auth/test-login/route.ts
// ONLY available in test/development
export async function POST(request: Request) {
if (process.env.NODE_ENV === "production") {
return new Response("Not found", { status: 404 });
}
// Create session directly without SSO flow
}
| Level | Test | Don't Test |
|---|---|---|
| Unit | Pure functions, isolated components, hooks | API calls, multi-component flows |
| Integration | Component + API, auth states, form submissions | Full user journeys |
| E2E | Critical paths, auth flows, checkout/signup | Every possible input |
| Feature Type | Unit | Integration | E2E |
|---|---|---|---|
| Utility functions | ✅ heavy | ❌ none | ❌ none |
| UI components | ✅ rendering | ✅ with state | ❌ only if critical |
| Forms | ✅ validation | ✅ submission | ✅ critical forms |
| API routes | ✅ handlers | ✅ with mocking | ❌ via E2E |
| Auth flows | ❌ none | ✅ mock states | ✅ real flow |
| Checkout/payment | ✅ calculations | ✅ flow | ✅ full journey |
Tests must fail fast. Never:
Playwright config:
export default defineConfig({
timeout: 30_000, // 30s max per test
expect: {
timeout: 5_000, // 5s for assertions
},
use: {
actionTimeout: 10_000, // 10s per action
},
});
<progress_append> After creating test strategy or running tests:
## YYYY-MM-DD HH:MM — /arc:testing
**Task:** [Create strategy / Run tests / Fix failing]
**Feature:** [What was tested]
**Coverage:**
- Unit: [N] tests
- Integration: [N] tests
- E2E: [N] tests
**Auth:** [Clerk/WorkOS/none]
**Result:** [All passing / X failing]
**Next:** [Fix failures / Done]
---
</progress_append>
<success_criteria> Test strategy is complete when: