AI/skills/tdd-workflow/SKILL.md
Proactively use this skill when implementing features, fixing bugs, or refactoring code. Enforces test-driven development with 80%+ coverage including unit, integration, and E2E tests.
npx skillsauth add thesimonho/dotfiles tdd-workflowInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill ensures all code development follows TDD principles with comprehensive test coverage.
ALWAYS write tests first, then implement code to make tests pass.
As a [role], I want to [action], so that [benefit]
Example:
As a user, I want to search for markets semantically,
so that I can find relevant markets even without exact keywords.
For each user journey, create critical test cases:
describe("Semantic Search", () => {
it("returns relevant markets for query", async () => {
// Test implementation
});
it("handles empty query gracefully", async () => {
// Test edge case
});
it("sorts results by similarity score", async () => {
// Test sorting logic
});
});
npm test
# Tests should fail - we haven't implemented yet
Write minimal code to make tests pass:
// Implementation guided by tests
export async function searchMarkets(query: string) {
// Implementation here
}
npm test
# Tests should now pass
Improve code quality while keeping tests green:
npm run test:coverage
# Verify 80%+ coverage achieved
import { render, screen, fireEvent } from '@testing-library/react'
import { Button } from './Button'
describe('Button Component', () => {
it('renders with correct text', () => {
render(<Button>Click me</Button>)
expect(screen.getByText('Click me')).toBeInTheDocument()
})
it('calls onClick when clicked', () => {
const handleClick = jest.fn()
render(<Button onClick={handleClick}>Click</Button>)
fireEvent.click(screen.getByRole('button'))
expect(handleClick).toHaveBeenCalledTimes(1)
})
it('is disabled when disabled prop is true', () => {
render(<Button disabled>Click</Button>)
expect(screen.getByRole('button')).toBeDisabled()
})
})
import { NextRequest } from "next/server";
import { GET } from "./route";
describe("GET /api/markets", () => {
it("returns markets successfully", async () => {
const request = new NextRequest("http://localhost/api/markets");
const response = await GET(request);
const data = await response.json();
expect(response.status).toBe(200);
expect(data.success).toBe(true);
expect(Array.isArray(data.data)).toBe(true);
});
it("validates query parameters", async () => {
const request = new NextRequest(
"http://localhost/api/markets?limit=invalid",
);
const response = await GET(request);
expect(response.status).toBe(400);
});
it("handles database errors gracefully", async () => {
// Mock database failure
const request = new NextRequest("http://localhost/api/markets");
// Test error handling
});
});
import { test, expect } from "@playwright/test";
test("user can search and filter markets", async ({ page }) => {
// Navigate to markets page
await page.goto("/");
await page.click('a[href="/markets"]');
// Verify page loaded
await expect(page.locator("h1")).toContainText("Markets");
// Search for markets
await page.fill('input[placeholder="Search markets"]', "election");
// Wait for debounce and results
await page.waitForTimeout(600);
// Verify search results displayed
const results = page.locator('[data-testid="market-card"]');
await expect(results).toHaveCount(5, { timeout: 5000 });
// Verify results contain search term
const firstResult = results.first();
await expect(firstResult).toContainText("election", { ignoreCase: true });
// Filter by status
await page.click('button:has-text("Active")');
// Verify filtered results
await expect(results).toHaveCount(3);
});
test("user can create a new market", async ({ page }) => {
// Login first
await page.goto("/creator-dashboard");
// Fill market creation form
await page.fill('input[name="name"]', "Test Market");
await page.fill('textarea[name="description"]', "Test description");
await page.fill('input[name="endDate"]', "2025-12-31");
// Submit form
await page.click('button[type="submit"]');
// Verify success message
await expect(page.locator("text=Market created successfully")).toBeVisible();
// Verify redirect to market page
await expect(page).toHaveURL(/\/markets\/test-market/);
});
npm run test:coverage
{
"jest": {
"coverageThresholds": {
"global": {
"branches": 80,
"functions": 80,
"lines": 80,
"statements": 80
}
}
}
}
development
Review recently changed code with three separate read-only agents for reuse, quality, and efficiency, then return prioritized issue lists. Use after implementing changes, before verification or commit, or when the user asks to simplify, clean up, reduce duplication, or review recent changes.
development
Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my site against best practices".
development
A checklist of post-work verification steps. Use proactively after completing a feature or significant code change; before creating a PR; when you want to ensure quality gates pass or after refactoring. Do NOT run for documentation-only changes.
development
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.