tdd — Claude Code skill: what it does, how to install
Guides the red-green TDD loop: ensures tests are written first, keep them at public interfaces, and avoid coupling to implementation details.
- Author Matt Pocock
- License MIT
- GitHub ★ 302,251
- Installs 1,141,062
- Updated 2026-10-22
- Source shown below
What tdd does
The skill sets the rules for test-driven development in the red → green format. Tests verify behavior through public interfaces, stay out of implementation, and survive refactoring. Each cycle is one test, one minimal implementation that passes it. The skill requires agreeing on seams up front — the boundaries where tests check behavior, because you can't cover everything.
Inside are three anti-patterns: implementation-coupled (test breaks on refactor though behavior hasn't changed), tautological (assertion recomputes the expected value the way the code does), horizontal slicing (all tests first, then code — tests verify shape, not behavior). The skill references tests.md and mocking.md from the same repository, reads the project's GLOSSARY.md so test names match domain language.
This is for teams that build features through TDD, not write tests after the fact. If the project doesn't agree on seams up front, the skill adds overhead without benefit.
What it helps with
- write tests before code in red-green loop
- keep tests at public interfaces without coupling to implementation
- agree on seams before writing the first test
- avoid tautological assertions and horizontal slicing
- read GLOSSARY.md so test names match domain language
How to install tdd
Command from the source
/plugin marketplace add mattpocock/skillsCommand from the source
/plugin install mattpocock-skills@mattpocockCommand from the source
npx skills add mattpocock/skills --skill tdd -a claude-codeWith the Skills CLI (Vercel)
npx skills add mattpocock/skills --skill tdd -a claude-codeManually
~/.claude/skills/tdd/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/tdd/
Manually
.agents/skills/tdd/SKILL.mdFor all projects use ~/.agents/skills/
Manually
.cursor/skills/tdd/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
GitHub CLI (gh ≥ 2.90)
gh skill install mattpocock/skills tddManually
.github/skills/tdd/SKILL.mdGemini CLI
gemini skills install https://github.com/mattpocock/skills --path skills/engineering/tddManually
.devin/skills/tdd/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
How to use it: example prompts
- Write a test for checkout with valid cart, then implement minimal code
- Check seams for auth module, which interfaces do we test
- Add integration test for API endpoint through public interface
Source text
SKILL.md · MIT
--- name: tdd description: Test-driven development. Use when the user wants to build features or fix bugs test-first, mentions "red-green-refactor", or wants integration tests. --- # Test-Driven Development TDD is the red → green loop. This skill is the reference that makes that loop produce tests worth keeping: what a good test is, where tests go, the anti-patterns, and the rules of the loop. Every section applies on every cycle: consult them before and during the loop, not after. When exploring the codebase, read `GLOSSARY.md` (if it exists) so test names and interface vocabulary match the project's domain language, and respect ADRs in the area you're touching. ## What a good test is Tests verify behavior through public interfaces, not implementation details. Code can change entirely; tests shouldn't. A good test reads like a specification: "user can checkout with valid cart" tells you exactly what capability exists, and it survives refactors because it doesn't care about internal structure. See [tests.md](tests.md) for examples and [mocking.md](mocking.md) for mocking guidelines. ## Seams: where tests go A **seam** is the public boundary you test at: the interface where you observe behavior without reaching inside. Tests live at seams, never against internals. **Test only at pre-agreed seams.** Before writing any test, write down the seams under test and confirm them with the user. No test is written at an unconfirmed seam. You can't test everything, so agreeing the seams up front is how testing effort lands on the critical paths and complex logic instead of every edge case. Ask: "What's the public interface, and which seams should we test?" Give each proposed seam a one-line note on what it catches and what it misses. When the shape of that interface is itself in question (how deep the module is, where the seam belongs, what the interface should expose), call the Skill tool with "codebase-design" for the vocabulary. It is the shared source of the module, interface, depth, seam, adapter, leverage and locality terms, and it is a reference to consult, not a session to run. ## Anti-patterns - **Implementation-coupled**: mocks internal collaborators, tests private methods, or verifies through a side channel (querying the database instead of using the interface). The tell: the test breaks when you refactor but behavior hasn't changed. - **Tautological**: the assertion recomputes the expected value the way the code does (`expect(add(a, b)).toBe(a + b)`, a snapshot derived by hand the same way, a constant asserted equal to itself), so it passes by construction and can never disagree with the code. Expected values must come from an independent source of truth: a known-good literal, a worked example, the spec. - **Horizontal slicing**: writing all tests first, then all implementation. Bulk tests verify _imagined_ behavior: you test the _shape_ of things rather than user-facing behavior, the tests go insensitive to real changes, and you commit to test structure before understanding the implementation. Work in **vertical slices** instead: one test → one implementation → repeat, each test a **tracer bullet** that responds to what the last cycle taught you. ## Rules of the loop - **Red before green.** Write the failing test first, then only enough code to pass it. Don't anticipate future tests or add speculative features. - **One slice at a time.** One seam, one test, one minimal implementation per cycle. - **Refactoring is not part of the loop.** It belongs to the review stage (see the `code-review` skill), not the red → green implementation cycle.
© Matt Pocock · MIT · mattpocock/skills
Questions about tdd
How to install tdd in Claude Code?
npx skills add mattpocock/skills --skill tdd -a claude-code, the skill file will be in ~/.claude/skills/tdd/SKILL.md.
What does the tdd skill do?
Guides the red-green TDD loop: tests are written first, verify behavior through public interfaces, don't couple to implementation. Requires agreeing on seams up front — the boundaries where tests check behavior.
What is a seam in tdd context?
A public boundary where a test verifies behavior without reaching inside. The skill requires agreeing on seams before the first test, because you can't cover everything and testing effort should land on critical paths, not every edge case.