Claude Code Plugins

Community-maintained marketplace

Feedback

Test-Driven Development workflow. Auto-activates when creating new JS/TS files. Advisory mode suggests tests first; strict mode requires them.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name tdd
description Test-Driven Development workflow. Auto-activates when creating new JS/TS files. Advisory mode suggests tests first; strict mode requires them.
allowed-tools Read, Write, Edit, Glob, Grep, Bash

Test-Driven Development Skill

Enforce test-first development workflow for JavaScript and TypeScript files.

Activation Rules

This skill auto-activates when:

  • Creating a NEW JavaScript/TypeScript file (not editing existing)
  • File is in a testable location (src/, lib/, components/, scripts/, services/, api/)

This skill stays SILENT when:

  • Editing an existing file (test reminder only if test is missing)
  • File is a config file (*.config.js, *.config.ts)
  • File is in skip locations (see Skip Detection)
  • Session has prototyping mode enabled (/tdd off)
  • File is generated code (.generated., *.g.ts)

Mode Configuration

Mode Behavior Default
Advisory Suggests writing tests first, provides guidance, never blocks Yes
Strict Blocks implementation until test file exists Opt-in

Advisory Mode (Default)

  • Reminds to write tests first
  • Provides test file path suggestion
  • Shows skeleton test template
  • Allows proceeding without tests

Strict Mode (Opt-in)

  • Checks for test file existence before allowing implementation
  • If test missing: outputs blocking message, suggests test file creation
  • Composes with testing skill to scaffold test

TDD Workflow

1. THINK: Define what the code should do
       |
2. TEST: Write a failing test first
       |
3. CODE: Write minimal code to pass
       |
4. REFACTOR: Clean up while tests pass
       |
5. REPEAT: Add next test case

The cycle in short:

RED -> GREEN -> REFACTOR -> REPEAT
 |       |          |
 |       |          +-- Clean up code, tests still pass
 |       +-- Write minimal code to pass test
 +-- Write a failing test first

Test File Location Convention

Source File Test File
src/foo.js test/foo.test.js
src/utils/bar.ts test/utils/bar.test.ts
src/components/Card.js test/components/Card.test.js
src/services/user.js test/services/user.test.js
.claude/scripts/tool.js .claude/test/validators/tool.test.js

Compose With Testing Skills

Based on file location, auto-compose with appropriate testing skill:

Pattern Testing Skill Why
src/components/* unit-testing Component logic tests
src/services/* backend-testing Service layer tests
src/api/*, src/routes/* backend-testing API endpoint tests
.claude/scripts/* unit-testing CLI tool tests
e2e/*, tests/* e2e-testing Browser tests
Vite project detected vitest Vite-native testing

Skip Detection

Automatic Skips

Condition Reason
Config files *.config.js, vite.config.ts, etc.
Generated files *.generated.*, *.g.ts, dist/
Type declarations *.d.ts
Documentation *.md in docs/
Test files themselves *.test.js, *.spec.ts
Fixture files fixtures/, __mocks__/
Simple renames Git rename operation detected
Entry points index.js, main.js

Session-Based Skips

When prototyping mode is active (/tdd off), TDD checks are suspended.

Red Flags

Situation Advisory Strict
Implementation before test Reminder Block
Test file path mismatch Suggest fix Suggest fix
No assertions in test Warn Warn
Test imports missing module Expected during TDD Expected

Quick Start Template

When creating a test first, use this skeleton:

import { describe, it } from 'node:test';
import assert from 'node:assert';

describe('ModuleName', () => {
  describe('functionName', () => {
    it('should handle expected input', () => {
      // Arrange
      const input = 'test';

      // Act
      const result = functionUnderTest(input);

      // Assert
      assert.strictEqual(result, expected);
    });

    it('should handle edge case', () => {
      // Test edge case
    });

    it('should throw on invalid input', () => {
      assert.throws(() => {
        functionUnderTest(null);
      });
    });
  });
});

Mode Toggle Commands

Command Effect
/tdd advisory Suggest tests (default, never blocks)
/tdd strict Require tests before implementation
/tdd off Disable for this session (prototyping)
/tdd status Show current mode

Configuration

Project defaults in .claude/config/tdd.json:

{
  "mode": "advisory",
  "testDirectory": "test",
  "testSuffix": ".test"
}

Integration Points

Pre-Flight Check

TDD adds to JavaScript pre-flight checklist:

  • Test file exists or will be created first
  • Test covers the behavior being implemented

Completion Check

Before marking JS/TS file complete:

  • Corresponding test file exists
  • Tests pass: npm test

Related Skills

  • unit-testing - Node.js native test runner patterns
  • backend-testing - API and database testing
  • vitest - Vite-based project testing
  • e2e-testing - Playwright browser testing
  • pre-flight-check - Git workflow and approach validation
  • javascript-author - JavaScript coding patterns