Use when implementing any feature or bugfix where correctness matters - before writing implementation code.
64%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./skills/tdd/SKILL.mdImplement the feature using strict TDD methodology.
Target: $ARGUMENTS
╔══════════════════════════════════════════════════════════════╗
║ NO IMPLEMENTATION CODE WITHOUT A FAILING TEST FIRST ║
╚══════════════════════════════════════════════════════════════╝For each behavior to implement:
┌───────┐ ┌───────┐ ┌──────────┐
│ RED │ ───► │ GREEN │ ───► │ REFACTOR │
└───────┘ └───────┘ └──────────┘Auto-detect the project's test runner before starting:
# Detect test runner from package.json or config files
if [ -f "vitest.config.ts" ] || [ -f "vitest.config.js" ] || grep -q '"vitest"' package.json 2>/dev/null; then
TEST_CMD="npx vitest run"
TEST_FILTER="--testNamePattern"
elif [ -f "jest.config.ts" ] || [ -f "jest.config.js" ] || grep -q '"jest"' package.json 2>/dev/null; then
TEST_CMD="npx jest"
TEST_FILTER="--testNamePattern"
elif [ -f "playwright.config.ts" ] || [ -f "playwright.config.js" ]; then
TEST_CMD="npx playwright test"
TEST_FILTER="--grep"
elif grep -q '"mocha"' package.json 2>/dev/null; then
TEST_CMD="npx mocha"
TEST_FILTER="--grep"
else
TEST_CMD="npm test --"
TEST_FILTER="--testNamePattern"
fi
echo "Test runner: $TEST_CMD"Use the detected $TEST_CMD and $TEST_FILTER throughout all cycles.
it('should [expected behavior] when [condition]', () => {
// Arrange
const input = ...;
// Act
const result = functionUnderTest(input);
// Assert
expect(result).toBe(expected);
});$TEST_CMD $TEST_FILTER="[test name]"Write minimum code to pass:
Run test:
$TEST_CMD $TEST_FILTER="[test name]"Verify PASSES - Capture output showing success
BLOCKED if test fails (fix before continuing)
Improve code quality:
Run ALL tests:
$TEST_CMDVerify ALL PASS
Check coverage change (if coverage tool is available):
$TEST_CMD --coverage 2>/dev/null | grep -A 5 "Stmts\|Lines\|%" || trueCommit cycle:
git add -A && git commit -m "feat: [behavior] (TDD cycle N)"Continue cycles until feature is complete.
Every test run must be captured:
──── RED Phase ────
Test: should calculate discount for valid coupon
Running: npm test -- --testNamePattern="calculate discount"
Output:
FAIL src/discount.test.ts
✕ should calculate discount for valid coupon
Expected: 90
Received: undefined
Status: FAIL ✓ - Proceeding to GREEN
──── GREEN Phase ────
Running: npm test -- --testNamePattern="calculate discount"
Output:
PASS src/discount.test.ts
✓ should calculate discount for valid coupon
Status: PASS ✓ - Proceeding to REFACTOR──── /tdd ────
Feature: [name]
Cycle #1: [behavior]
RED: Test written, FAIL ✓
GREEN: Implemented, PASS ✓
REFACTOR: Cleaned, PASS ✓
Cycle #2: [behavior]
RED: Test written, FAIL ✓
GREEN: Implemented, PASS ✓
REFACTOR: Cleaned, PASS ✓
──── TDD Summary ────
Cycles completed: 2
Tests added: 2
All tests passing: ✓
Coverage: [if available]| Excuse | Reality |
|---|---|
| "I know it works, no need to test first" | Write the test. If it works, RED phase takes 30 seconds. |
| "This is too simple for TDD" | Simple code has simple tests. No excuse to skip. |
| "I'll write tests after" | Tests written after implementation verify your bias, not correctness. |
| "The test framework isn't set up" | Set it up. That's part of the task. |
| "Just this once I'll skip RED" | "Just this once" is how every shortcut becomes a habit. |
| "The existing tests are enough" | Enough for what? New behavior needs new tests. Existing tests verify old assumptions. |
| "I'll test the integration, not the unit" | Integration tests verify wiring. Unit tests verify logic. You need both. Start with unit. |
fernandezbaptiste/specialist-agent
cd716d9
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.