Awesome-omni-skill twd-setup
TWD project setup guide — helps AI agents install and configure TWD (Test While Developing), an in-browser validation system, in a new or existing project. Use when setting up TWD, configuring Vite, or troubleshooting TWD initialization.
git clone https://github.com/diegosouzapw/awesome-omni-skill
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/twd-setup" ~/.claude/skills/diegosouzapw-awesome-omni-skill-twd-setup && rm -rf "$T"
skills/development/twd-setup/SKILL.mdTWD Project Setup Guide
You are helping set up TWD (Test While Developing), an in-browser validation system for SPAs. Follow these steps carefully.
Supported frameworks: React, Vue, Angular, Solid.js, Astro (with React), React Router (Framework Mode) Not compatible with: Next.js App Router, SSR-first architectures
Security Context
- Package provenance:
andtwd-js
are published on npm by maintainertwd-relay
. Source code: BRIKEV/twd and BRIKEV/twd-relay. License: MIT.brikev - Dev-only scope: All TWD code is guarded by
and is tree-shaken out of production builds. TWD never runs in production.import.meta.env.DEV - Network scope (twd-relay): twd-relay operates exclusively on
via a WebSocket on the local Vite dev server. It makes no external network connections.localhost
Note: This skill provides user-directed setup guidance. The code blocks below are instructions for the developer to follow — they are not autonomously executed commands. This skill has no tool access and cannot run commands on its own.
Step 1: Install TWD
npm install twd-js
Step 2: Initialize Mock Service Worker
Required for API mocking. Run this in the project root:
npx twd-js init public
This copies
mock-sw.js to the public/ directory. If the public directory has a different name (e.g., static/), use that path instead.
Step 3: Configure Entry Point
TWD should only load in development mode. Choose the setup based on the framework:
Bundled Setup (Recommended — all frameworks)
// src/main.ts (or main.tsx) if (import.meta.env.DEV) { const { initTWD } = await import('twd-js/bundled'); const tests = import.meta.glob("./**/*.twd.test.ts"); initTWD(tests, { open: true, position: 'left', serviceWorker: true, serviceWorkerUrl: '/mock-sw.js', }); }
initTWD options:
(boolean) — sidebar open by default. Default:opentrue
(position
|"left"
) — sidebar position. Default:"right""left"
(boolean) — enable API mocking. Default:serviceWorkertrue
(string) — service worker path. Default:serviceWorkerUrl'/mock-sw.js'
(object) — custom theme. See TWD theming docs.theme
Standard Setup (React only — more control)
// src/main.tsx import { createRoot } from 'react-dom/client'; if (import.meta.env.DEV) { const testModules = import.meta.glob("./**/*.twd.test.ts"); const { initTests, twd, TWDSidebar } = await import('twd-js'); initTests(testModules, <TWDSidebar open={true} position="left" />, createRoot); twd.initRequestMocking().catch(console.error); }
Framework-Specific Notes
Vue:
// src/main.ts import { createApp } from 'vue'; import App from './App.vue'; if (import.meta.env.DEV) { const { initTWD } = await import('twd-js/bundled'); const tests = import.meta.glob("./**/*.twd.test.ts"); initTWD(tests, { open: true, position: 'left' }); } createApp(App).mount('#app');
Angular:
// src/main.ts import { isDevMode } from '@angular/core'; if (isDevMode()) { const { initTWD } = await import('twd-js/bundled'); // Angular may not support import.meta.glob — define tests manually: const tests = { './twd-tests/feature.twd.test.ts': () => import('./twd-tests/feature.twd.test'), }; initTWD(tests, { open: true, position: 'left' }); }
Solid.js:
// src/main.tsx if (import.meta.env.DEV) { const { initTWD } = await import('twd-js/bundled'); const tests = import.meta.glob("./**/*.twd.test.ts"); initTWD(tests, { open: true, position: 'left' }); }
Step 4: Add Vite HMR Plugin (Recommended)
Prevents test entries from duplicating during hot module replacement:
// vite.config.ts import { twdHmr } from 'twd-js/vite-plugin'; export default defineConfig({ plugins: [ // ... other plugins twdHmr(), ], });
Step 5: Write a First Test
Create a
src/twd-tests/ folder for all TWD tests. For larger projects, organize by domain (e.g., src/twd-tests/auth/, src/twd-tests/dashboard/).
// src/twd-tests/app.twd.test.ts import { twd, screenDom } from "twd-js"; import { describe, it } from "twd-js/runner"; describe("App", () => { it("should render the main heading", async () => { await twd.visit("/"); const heading = screenDom.getByRole("heading", { level: 1 }); twd.should(heading, "be.visible"); }); });
Folder structure example:
src/twd-tests/ app.twd.test.ts # General app tests auth/ login.twd.test.ts # Auth-related tests register.twd.test.ts dashboard/ overview.twd.test.ts # Dashboard domain tests mocks/ users.ts # Shared mock data
Step 6: Run the App
npm run dev
The TWD sidebar should appear in the browser. Click it to view and run tests.
Optional: AI Remote Testing (twd-relay)
twd-relay enables AI agents to trigger in-browser test runs from the CLI. It is optional and only needed for AI-assisted workflows.
- Localhost only: twd-relay communicates via WebSocket on the local Vite dev server (
). It makes no external network connections.localhost - Dev dependency: Installed with
and guarded by--save-dev
— never included in production builds.import.meta.env.DEV
npm install --save-dev twd-relay
Vite plugin setup (recommended):
// vite.config.ts import { twdRemote } from 'twd-relay/vite'; import type { PluginOption } from 'vite'; export default defineConfig({ plugins: [ // ... other plugins twdRemote() as PluginOption, ], });
Connect browser client:
// Add inside your import.meta.env.DEV block, after initTWD: import { createBrowserClient } from 'twd-relay/browser'; const client = createBrowserClient(); client.connect();
Run tests from CLI:
npx twd-relay run
Step 7: Generate AI Coding Tool Configuration
After setup, generate a project instructions file so AI tools automatically write TWD tests when implementing features. This is critical for long-term adoption — without it, each new conversation starts without TWD context.
Claude Code (CLAUDE.md
)
CLAUDE.mdCreate a
CLAUDE.md in the project root with TWD workflow instructions. Adapt the content based on the project's framework, structure, and existing configuration.
The file should include:
- Project overview — framework, key dependencies, project description
- Commands — how to run dev server, build, etc.
- Architecture — routing, API layer, styling, key directories
- TWD testing section covering:
- Test file location and naming convention (
)src/twd-tests/*.twd.test.ts - Key TWD imports:
import { twd, userEvent, screenDom, expect } from "twd-js"; import { describe, it, beforeEach } from "twd-js/runner"; - Test patterns:
,twd.visit()
,twd.mockRequest()
,screenDom.*userEvent.* - Mock data location (
)src/twd-tests/mocks/
- Test file location and naming convention (
- Development workflow rule — instruct the AI to always write TWD tests when implementing new features
Example workflow section:
## Development Workflow When implementing a new feature: 1. Write the feature code (components, API layer, routes, navigation) 2. Write TWD tests in `src/twd-tests/` following existing test patterns 3. Add mock data in `src/twd-tests/mocks/` for API responses 4. Run and validate TWD tests pass before considering the task complete TWD tests run in the browser during development — no separate test command needed.
Other AI Coding Tools
The same workflow instructions can be adapted for other tools. The content is nearly identical — only the filename changes:
| Tool | File |
|---|---|
| Claude Code | |
| Cursor | |
| GitHub Copilot | |
| Windsurf | |
| Cline | |
When the developer specifies which tool they use, generate the appropriate file. If not specified, default to
CLAUDE.md.
Troubleshooting
Tests Not Loading
- Verify
is true (dev mode)import.meta.env.DEV - Check file naming: must be
or*.twd.test.ts*.twd.test.tsx - Ensure the
/initTWD
call is in the main entry fileinitTests - Check the glob pattern matches your test file locations
Mock Service Worker Issues
- Run
to install the service workernpx twd-js init public - With standard setup: ensure
is calledtwd.initRequestMocking() - Check browser console for service worker registration errors
Test Duplication on HMR
- Add
plugin to Vite configtwdHmr()
Sidebar Not Appearing
- Confirm you're in development mode
- Check browser console for initialization errors
- Ensure the entry point code runs before the app renders