tdd-strict
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.
What this skill does
# Striktes Test-Driven Development
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."**
## Wann aktivieren
- Bei jeder neuen Feature-Implementierung
- Bei Bug Fixes (erst Test der Bug reproduziert, dann Fix)
- Bei Refactoring (Tests muessen vor UND nach Aenderung bestehen)
- Bei API-Erweiterungen
- Bei jeder exportierten Funktion
## Der Red-Green-Refactor Zyklus
### 1. RED: Test schreiben der fehlschlaegt
```typescript
// 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:
- Funktion existiert nicht
- Funktion gibt falsches Ergebnis zurueck
- NICHT: Syntaxfehler im Test selbst
### 2. GREEN: Minimaler Code der Test besteht
```typescript
// 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.
- Keine Optimierungen
- Keine zusaetzlichen Features
- Keine "offensichtlichen" Erweiterungen
### 3. REFACTOR: Bereinigen ohne neues Verhalten
```typescript
// Nach mehreren gruenen Tests: Refactoring erlaubt
export function calculateOEE({ availability, performance, quality }: OEEParams): number {
return (availability * performance * quality) / 10000;
}
```
**Regeln fuer Refactoring**:
- Alle bestehenden Tests MUESSEN bestehen bleiben
- KEIN neues Verhalten hinzufuegen
- Nur Code-Struktur verbessern
- Nach jedem Refactoring-Schritt: Tests laufen lassen
## Die 13 ungueltigen Rationalisierungen
Diese Ausreden sind NIEMALS akzeptabel:
### 1. "Zu einfach zum Testen"
**Realitaet**: Einfacher Code braucht einfache Tests. 1 Zeile Test ist okay.
```typescript
it('should add two numbers', () => {
expect(add(2, 3)).toBe(5);
});
```
### 2. "Ich teste spaeter"
**Realitaet**: "Spaeter" bedeutet "nie". TDD bedeutet Test ZUERST.
### 3. "Bereits manuell getestet"
**Realitaet**: Manuelle Tests sind nicht reproduzierbar und skalieren nicht.
### 4. "Zeitdruck erlaubt keine Tests"
**Realitaet**: Tests sparen Zeit bei Debugging und verhindern Regressionen.
### 5. "Private Methoden muss man nicht testen"
**Realitaet**: Teste das Verhalten durch Public APIs. Wenn nicht testbar: Refactor.
### 6. "UI-Code kann man nicht testen"
**Realitaet**: React Testing Library, Playwright, Storybook existieren genau dafuer.
### 7. "Die Logik ist trivial"
**Realitaet**: Triviale Logik aendert sich. Tests dokumentieren erwartetes Verhalten.
### 8. "Wir haben einen QA-Prozess"
**Realitaet**: QA findet Bugs spaeter und teurer. TDD verhindert Bugs von Anfang an.
### 9. "Der Code ist nur temporaer"
**Realitaet**: Temporaerer Code lebt oft Jahre. Tests sichern auch temporaeren Code ab.
### 10. "Tests verlangsamen die Entwicklung"
**Realitaet**: TDD beschleunigt langfristig durch weniger Debugging und Regressionen.
### 11. "Legacy Code hat keine Tests"
**Realitaet**: Charakterisierungstests vor Aenderungen schreiben. Schrittweise verbessern.
### 12. "Das Framework/die Library testet das schon"
**Realitaet**: Teste DEINE Nutzung des Frameworks, nicht das Framework selbst.
### 13. "Mocking ist zu aufwaendig"
**Realitaet**: Wenn Mocking zu komplex ist, ist das Design zu komplex. Refactor.
## Verification Checklist
Vor jedem Commit MUSS gelten:
- [ ] Jede exportierte Funktion hat mindestens einen Test
- [ ] Jeder Test ist VOR der Implementation fehlgeschlagen (RED beobachtet)
- [ ] Jeder Test prueft genau EINE Sache (Single Assertion Principle)
- [ ] Minimaler Code pro Test (kein Over-Engineering)
- [ ] Edge Cases abgedeckt:
- [ ] Null/Undefined Inputs
- [ ] Leere Arrays/Strings
- [ ] Grenzwerte (0, MAX_INT, negative Zahlen)
- [ ] Fehlerhafte Inputs (TypeError erwartet)
- [ ] Test-Namen beschreiben Verhalten: `should [erwartetes Ergebnis] when [Bedingung]`
- [ ] Keine `skip` oder `only` Tests im Commit
- [ ] Coverage mindestens 80% fuer neuen Code
## TDD-Workflow in der Praxis
### Schritt 1: Test-Datei erstellen
```bash
# Fuer neue Funktion in src/utils/oee.ts
touch src/utils/oee.test.ts
```
### Schritt 2: Minimaler fehlschlagender Test
```typescript
// 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);
});
});
```
### Schritt 3: Test laufen lassen (MUSS fehlschlagen)
```bash
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
```
### Schritt 4: Minimale Implementation
```typescript
// 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;
}
```
### Schritt 5: Test laufen lassen (MUSS bestehen)
```bash
npm run test -- --run src/utils/oee.test.ts
# Erwartete Ausgabe:
# PASS src/utils/oee.test.ts
```
### Schritt 6: Naechster Test fuer Edge Case
```typescript
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.
## Anti-Patterns erkennen
### VERBOTEN: Test nach Code
```typescript
// 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
```
### VERBOTEN: Zu viel Code auf einmal
```typescript
// 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
```
### VERBOTEN: Tests anpassen damit sie bestehen
```typescript
// 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
```
## Framework-spezifische Patterns
### React Components (Vitest + Testing Library)
```typescript
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();
});
});
```
### API Endpoints (Supertest)
```typescript
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');
});
});
```
### Async Code
```typescript
describe('fetchUserData', () => {
it('should retry 3 times on network failure', asyncRelated in Code Review
gstack
IncludedFast headless browser for QA testing and site dogfooding. Navigate pages, interact with elements, verify state, diff before/after, take annotated screenshots, test responsive layouts, forms, uploads, dialogs, and capture bug evidence. Use when asked to open or test a site, verify a deployment, dogfood a user flow, or file a bug with screenshots. (gstack)
startup-due-diligence
IncludedLegal due diligence review for seed-stage and Series A startups (US, Delaware C-Corp focus). Supports both investor and founder perspectives. Capabilities include: (1) Interactive document review and issue spotting; (2) Document request list generation; (3) Cap table and SAFE/convertible note analysis; (4) Red flag identification with severity ratings; (5) Diligence report generation. TRIGGERS: due diligence, DD, startup investment, cap table review, Series A, seed round, investor diligence, legal review startup, SAFE analysis, convertible note, 409A, founder vesting.
interview-master
IncludedThis skill should be used when the user asks to "generate interview questions", "prepare for interview", "optimize resume", "conduct mock interview", "analyze git commits for resume", "generate resume from code", "review my resume", or mentions interview preparation, career assistance, or extracting project experience from git history. Provides comprehensive interview and career development guidance for both job seekers and interviewers.
fix-issue
IncludedFixes GitHub issues using parallel analysis agents for root cause investigation, code exploration, and regression detection. Reads issue context from gh CLI, searches codebase and memory for related patterns, generates a fix with tests, and links the resolution back to the issue via PR. Includes prevention analysis to avoid recurrence. Use when debugging errors, resolving regressions, fixing bugs, or triaging issues.
sf-apex
IncludedGenerates and reviews Salesforce Apex code with 150-point scoring. TRIGGER when: user writes, reviews, or fixes Apex classes, triggers, test classes, batch/queueable/schedulable jobs, or touches .cls/.trigger files. DO NOT TRIGGER when: LWC JavaScript (use sf-lwc), Flow XML (use sf-flow), SOQL-only queries (use sf-soql), or non-Salesforce code.
swift-development
IncludedComprehensive Swift development for building, testing, and deploying iOS/macOS applications. Use when Claude needs to: (1) Build Swift packages or Xcode projects from command line, (2) Run tests with XCTest or Swift Testing framework, (3) Manage iOS simulators with simctl, (4) Handle code signing, provisioning profiles, and app distribution, (5) Format or lint Swift code with SwiftFormat/SwiftLint, (6) Work with Swift Package Manager (SPM), (7) Implement Swift 6 concurrency patterns (async/await, actors, Sendable), (8) Create SwiftUI views with MVVM architecture, (9) Set up Core Data or SwiftData persistence, or any other Swift/iOS/macOS development tasks.