skills/tdd-strict/SKILL.md
Erzwingt striktes Test-Driven Development mit Red-Green-Refactor Zyklus. Blockiert Code-Generierung ohne vorherige Tests. Dokumentiert 13 ungueltige Rationalisierungen. Aktivieren bei neuen Features, Bug Fixes, Refactoring.
npx skillsauth add svenja-dev/claude-code-skills tdd-strictInstall 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.
Dieser Skill erzwingt TDD-Praktiken basierend auf dem Kernprinzip:
"If you didn't watch the test fail, you don't know if it tests the right thing."
// ZUERST: Test schreiben
describe('calculateOEE', () => {
it('should return 0 when availability is 0', () => {
const result = calculateOEE({ availability: 0, performance: 100, quality: 100 });
expect(result).toBe(0);
});
});
// Test MUSS fehlschlagen:
// Error: calculateOEE is not defined
// ODER
// Error: Expected 0 but received undefined
Wichtig: Der Test MUSS aus dem richtigen Grund fehlschlagen:
// DANACH: Minimaler Code
export function calculateOEE(params: OEEParams): number {
if (params.availability === 0) return 0;
// Weitere Logik kommt spaeter durch weitere Tests
return 0;
}
Regel: Schreibe den EINFACHSTEN Code der den Test besteht.
// Nach mehreren gruenen Tests: Refactoring erlaubt
export function calculateOEE({ availability, performance, quality }: OEEParams): number {
return (availability * performance * quality) / 10000;
}
Regeln fuer Refactoring:
Diese Ausreden sind NIEMALS akzeptabel:
Realitaet: Einfacher Code braucht einfache Tests. 1 Zeile Test ist okay.
it('should add two numbers', () => {
expect(add(2, 3)).toBe(5);
});
Realitaet: "Spaeter" bedeutet "nie". TDD bedeutet Test ZUERST.
Realitaet: Manuelle Tests sind nicht reproduzierbar und skalieren nicht.
Realitaet: Tests sparen Zeit bei Debugging und verhindern Regressionen.
Realitaet: Teste das Verhalten durch Public APIs. Wenn nicht testbar: Refactor.
Realitaet: React Testing Library, Playwright, Storybook existieren genau dafuer.
Realitaet: Triviale Logik aendert sich. Tests dokumentieren erwartetes Verhalten.
Realitaet: QA findet Bugs spaeter und teurer. TDD verhindert Bugs von Anfang an.
Realitaet: Temporaerer Code lebt oft Jahre. Tests sichern auch temporaeren Code ab.
Realitaet: TDD beschleunigt langfristig durch weniger Debugging und Regressionen.
Realitaet: Charakterisierungstests vor Aenderungen schreiben. Schrittweise verbessern.
Realitaet: Teste DEINE Nutzung des Frameworks, nicht das Framework selbst.
Realitaet: Wenn Mocking zu komplex ist, ist das Design zu komplex. Refactor.
Vor jedem Commit MUSS gelten:
should [erwartetes Ergebnis] when [Bedingung]skip oder only Tests im Commit# Fuer neue Funktion in src/utils/oee.ts
touch src/utils/oee.test.ts
// src/utils/oee.test.ts
import { describe, it, expect } from 'vitest';
import { calculateOEE } from './oee';
describe('calculateOEE', () => {
it('should return 85 for sample manufacturing data', () => {
const result = calculateOEE({
availability: 90,
performance: 95,
quality: 99
});
expect(result).toBeCloseTo(84.645, 2);
});
});
npm run test -- --run src/utils/oee.test.ts
# Erwartete Ausgabe:
# Error: Cannot find module './oee'
# ODER nach Stub:
# Error: Expected 84.645 but received undefined
// src/utils/oee.ts
export interface OEEParams {
availability: number;
performance: number;
quality: number;
}
export function calculateOEE(params: OEEParams): number {
return (params.availability * params.performance * params.quality) / 10000;
}
npm run test -- --run src/utils/oee.test.ts
# Erwartete Ausgabe:
# PASS src/utils/oee.test.ts
it('should throw when values exceed 100', () => {
expect(() => calculateOEE({
availability: 101,
performance: 100,
quality: 100
})).toThrow('Values must be between 0 and 100');
});
Zurueck zu Schritt 3 (RED) -> Schritt 4 (GREEN) -> Repeat.
// FALSCH: Code zuerst geschrieben
function add(a: number, b: number): number {
return a + b;
}
// Dann erst Test geschrieben - UNGUELTIG!
// Du weisst nicht ob der Test das richtige testet
// FALSCH: Komplette Klasse ohne Tests implementiert
class UserService {
async create(user: User) { ... }
async update(id: string, data: Partial<User>) { ... }
async delete(id: string) { ... }
async findById(id: string) { ... }
async findAll(filters: FilterOptions) { ... }
}
// RICHTIG: Eine Methode nach der anderen mit TDD
// FALSCH: Test geaendert weil Implementation anders ist
// Vorher: expect(result).toBe(100);
// Nachher: expect(result).toBe(99.5); // "Weil die Formel das so ausgibt"
// RICHTIG: Implementation korrigieren ODER Anforderungen klaeren
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
describe('LoginButton', () => {
it('should show loading spinner when clicked', async () => {
render(<LoginButton onLogin={vi.fn()} />);
await userEvent.click(screen.getByRole('button', { name: /login/i }));
expect(screen.getByRole('progressbar')).toBeInTheDocument();
});
});
import request from 'supertest';
import { app } from '../app';
describe('POST /api/analyze', () => {
it('should return 401 without authentication', async () => {
const response = await request(app)
.post('/api/analyze')
.send({ data: 'test' });
expect(response.status).toBe(401);
expect(response.body.error).toBe('Unauthorized');
});
});
describe('fetchUserData', () => {
it('should retry 3 times on network failure', async () => {
const mockFetch = vi.fn()
.mockRejectedValueOnce(new Error('Network'))
.mockRejectedValueOnce(new Error('Network'))
.mockResolvedValueOnce({ id: 1, name: 'Test' });
const result = await fetchUserData(1, { fetch: mockFetch });
expect(mockFetch).toHaveBeenCalledTimes(3);
expect(result.name).toBe('Test');
});
});
# Einzelnen Test laufen lassen (RED pruefen)
npm run test -- --run path/to/file.test.ts
# Alle Tests (vor Commit)
npm run test
# Coverage Report
npm run test:coverage
# Watch Mode (waehrend Entwicklung)
npm run test -- --watch
development
Protects design and theme files from unintended changes. Locks tailwind.config, global CSS, and theme variables. Requires explicit confirmation before modifying UI components. Activate on changes to CSS, theme config, or layout components.
tools
Proactive token budget assessment and task chunking strategy. Use this skill when queries involve multiple large file uploads, requests for comprehensive multi-document analysis, complex multi-step workflows with heavy research (10+ tool calls), phrases like "complete analysis", "full audit", "thorough review", "deep dive", or tasks combining extensive research with large output artifacts. This skill helps assess token consumption risk early and recommend chunking strategies before beginning work.
development
Enforces TypeScript best practices when writing code. Automatically enables strict typing for TypeScript projects, prevents `any` usage, and recommends generic constraints. Activate on TS/TSX files, new features, code reviews.
development
Erarbeitet mit dem User eine Spezifikation bevor Code geschrieben oder an CC/Sonnet delegiert wird. Prueft Kontext, Ziel, Abnahmekriterien, Constraints. Erzeugt SPEC.md oder CC-Prompt mit Self-Fix-Protokoll. Triggern bei: Spec, Spezifikation, SPEC.md, CC-Prompt, Sonnet-Prompt, "delegate an CC", "was brauchst du noch", "plan das erstmal", "bevor du loslegst", groessere Features, mehrstufige Aufgaben, unklare Abnahmekriterien. Im Zweifel User fragen. Ersetzt cc-prompt-builder.