TDD
fossasia/eventyay-interpretation
Test-driven development. An agent skill from fossasia/eventyay-interpretation.
Write code through a disciplined, BDD-framed Test-Driven Development loop: build a behavior test list, then drive each behavior through red-green-refactor with an enforced observed-failure gate.
$ npx skills add testdouble/han --skill tdd -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install testdouble/han tdd --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .claude/skills && cp -r skills-src/han-coding/skills/tdd .claude/skills/tdd && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "tdd" agent skill from https://github.com/testdouble/han/tree/main/han-coding/skills/tdd into .claude/skills/tdd/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tdd", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/testdouble/han/tree/main/han-coding/skills/tddType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add testdouble/han --skill tdd -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install testdouble/han tdd --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .agents/skills && cp -r skills-src/han-coding/skills/tdd .agents/skills/tdd && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "tdd" agent skill from https://github.com/testdouble/han/tree/main/han-coding/skills/tdd into .agents/skills/tdd/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tdd", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add testdouble/han --skill tdd -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install testdouble/han tdd --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/han-coding/skills/tdd .cursor/skills/tdd && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "tdd" agent skill from https://github.com/testdouble/han/tree/main/han-coding/skills/tdd into .cursor/skills/tdd/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tdd", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/testdouble/han.git --path han-coding/skills/tdd--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add testdouble/han --skill tdd -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install testdouble/han tdd --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/han-coding/skills/tdd .gemini/skills/tdd && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "tdd" agent skill from https://github.com/testdouble/han/tree/main/han-coding/skills/tdd into .gemini/skills/tdd/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tdd", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install testdouble/han tddInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add testdouble/han --skill tdd -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .github/skills && cp -r skills-src/han-coding/skills/tdd .github/skills/tdd && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "tdd" agent skill from https://github.com/testdouble/han/tree/main/han-coding/skills/tdd into .github/skills/tdd/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tdd", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add testdouble/han --skill tdd -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install testdouble/han tdd --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/han-coding/skills/tdd .opencode/skills/tdd && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "tdd" agent skill from https://github.com/testdouble/han/tree/main/han-coding/skills/tdd into .opencode/skills/tdd/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tdd", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
tddWrite code through a disciplined, BDD-framed Test-Driven Development loop: build a behavior test list, then drive each behavior through red-green-refactor with an enforced observed-failure gate.
TDD is an agent skill from testdouble/han. Write code through a disciplined, BDD-framed Test-Driven Development loop: build a behavior test list, then drive each behavior through red-green-refactor with an enforced observed-failure gate. Use when the user wants to implement, build, or write code test-first, "do TDD", follow "red-green-refactor", drive code from tests, choose the next test by the Transformation Priority Premise (TPP) or ZOMBIES ordering, or grow a feature behavior-by-behavior with tests leading. This skill writes and changes code; it does…
Its SKILL.md is about 5.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including scripts and reference files (for example `references/bdd-framing.md`, `references/failure-modes.md` and `references/tdd-loop.md`).
It sits in Testing & QA, covering Test-driven development. The repository describes itself as: Han: AI skills and agents for "Solo" product engineers and small teams. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit abba73a. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadWriteEditGlobGrepAgentBash(git *)Bash(find *)Bash(npm *)Bash(npx *)…and 10 more on the same allowed-tools line.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
gitbashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
TDD loads about 5.6k tokens when it runs, and up to ~14k if it reads all its reference files. Until then it costs about 255 tokens; SKILL.md has 3,325 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from testdouble/han at commit abba73a, republished under its MIT licence (© testdouble). 3,325 words, ~5,622 tokens.
.claude/skills/tdd/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.which git 2>/dev/null || echo "not installed"git branch --show-current 2>/dev/null || echo unknownfind . -maxdepth 1 -name "CLAUDE.md" -type ffind . -maxdepth 3 -name "project-discovery.md" -type fbash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh" 2>/dev/null || echo "$HOME/.claude"cat .han/config.md 2>/dev/null || echo ""As your first action, use the Read tool on .han/config.md inside the personal config directory path above. A read
that returns no file is no personal configuration: continue silently. When that file or the project .han/config.md
probe supplies content, apply it per config-rule.md, which governs precedence
between the two files, relative-path resolution, and what to do with a file that reads but cannot be used.
This skill writes production and test code in your working tree. It is an execution skill, not a document generator. These constraints shape every step and override any instinct to move faster.
Resolve commands. Read CLAUDE.md's ## Project Discovery section for the test command (under
### Commands and Tests, not ### Frameworks and Tooling), the lint command, the build command, language, and
framework. If absent, fall back to project-discovery.md. If still absent, run
${CLAUDE_SKILL_DIR}/scripts/detect-tdd-context.sh and parse its output for git state and manifest-inferred commands.
Store the resolved test, lint, and build commands for use in every later step.
Resolve standards and decisions. Resolve the coding-standards directory and ADR directory the same way: read
CLAUDE.md's ## Project Discovery section; fall back to project-discovery.md; fall back to Glob defaults (docs/,
docs/adr/, docs/coding-standards/, docs/decisions/). Also check CLAUDE.md and AGENTS.md for inline standards.
Read the standards and ADRs whose titles, paths, or one-line summaries indicate they govern the area being built. Cap
at five documents; if more than five look relevant, list them and read only the five with the strongest apparent
relevance — defer the rest until refactor surfaces a need. These govern the green and refactor steps. If none exist,
state that plainly and plan to infer conventions from the surrounding code instead.
Resolve the scope boundary. Name, in files and directories, what this work is allowed to change, because the scope
gate tests every candidate edit against it. Inside the boundary: the files, directories, or module the request names,
plus the tests that cover them. Outside it: everything the named code merely reaches, meaning shared libraries, engines,
packages, and any code a second application or consumer also uses, plus code another team owns per CODEOWNERS. When
the request names no files, take the application or package the requested behavior lives in as the boundary and treat
its dependencies as outside it. Record the boundary; you will test list items and production edits against it.
Report scope, then proceed (no gate). This skill runs autonomously after the initial request: it does not stop for
confirmation. State to the user, in a few lines: the behavior or feature to be built, whether this is net-new behavior
or a fix to existing broken behavior (a reported bug, a failing case, a fix being driven back in after /investigate,
or code that already exhibits the error — recognize the fix case from those signals, not only from the word "bug"), the
scope boundary you just recorded, the resolved test/lint/build commands, the standards and ADRs found (or that none
were), the current branch, and that the skill will now write code in a red-green-refactor loop. If current branch from
Project Context is the repository's default branch (main or master), recommend working on a branch, but do not wait
for an answer. This is a report the user reads while the work runs, not a gate. Continue immediately to Step 2 without
waiting for a response.
The one exception. If the initial request or the provided context explicitly states the human wants to review, verify, or approve the plan or test list before implementation, then this becomes a gate: build the test list in Step 2, present it together with this scope report, and wait for approval before starting the Step 3 loop. Absent an explicit request like that, the skill runs to completion without further human input.
Two things can still block a run, both hard dependencies rather than discretionary checkpoints. A missing test command
is the first: if it could not be resolved from CLAUDE.md, project-discovery.md, the discovery script, or manifest
inference, ask the user for it, because TDD is impossible without a way to run tests. Exhaust inference before asking.
The second is the top rung of the scope gate's resolution ladder in Step 2, reached only when the requested behavior
cannot be delivered without an out-of-scope change.
Turn the requested feature or behavior into a test list (Kent Beck's "test list" pattern). Each item is one observable behavior, phrased as a behavior sentence, not as an implementation note. "Returns the unrounded fee for a sub-dollar charge" is a list item; "use a BigDecimal" is not. Follow references/bdd-framing.md for how to phrase and name behaviors, and which test-naming convention to adopt (the project's existing convention and any discovered coding standard win over a literal "should" default).
Fixing existing broken behavior is a regression test, not a bug-asserting test. When the work fixes broken behavior, the list item names the desired correct behavior, not the current broken one: "returns the rounded total for a refund" (red now because the bug is present, green once the fix lands), never "raises ArgumentError on a refund" — a test that asserts the error the bug produces passes while the bug is present and breaks when you fix it, locking the bug in. The regression test asserts what the code should do. The boundary: asserting that the code raises is the correct test when raising is the specified desired behavior (raise on invalid input); it is wrong only when the raised error is the bug being fixed.
Order the list outside-in by user value: the next item is the most important thing the system does not yet do. When one behavior expands into several candidate tests (the empty case, the single case, the many case, the boundaries), order those tests simplest-first — Zero → One → Many — so each test forces the smallest generalization of the code. The ranking behind that order is in references/test-selection.md; pull it when the order is not obvious. For an item that is user-observable behavior at a system boundary, write the outer acceptance test for it first (it will be red until its inner behaviors exist) and record it as the outer loop for that item. For internal or utility behavior with no meaningful system boundary, the outer acceptance test is optional; the inner loop alone is correct.
Apply YAGNI to the list itself. A scenario earns a place only with evidence it is needed now (a user-described need, a named dependency, an existing code path that breaks, a regulation, a real incident). Scenarios that fail the evidence test go to a deferred list with the trigger that would reopen them. Do not pad the list for symmetry or completeness.
Then apply the scope gate to the list. YAGNI asks whether a behavior has evidence it is needed. The scope gate asks
a question no amount of evidence answers: would making this test pass require changing a file outside the Step 1
boundary? Ask it of every item, and ask it hardest of items that arrived from a test plan, an analysis report, or an
agent finding carrying a severity label. A CRIT or HIGH label is evidence the finding is real. It is never evidence the
fix belongs to this ticket, and an item whose own text names a production change as a prerequisite ("this requires
first adding an explicit order") is that production change wearing a test's clothes.
The resolution ladder. Work it in order and stop at the first rung that resolves the item. Never skip to implementing the out-of-scope change.
Report the test list to the user, along with any item the scope gate moved and which rung resolved it. Unless the verify-plan exception from Step 1 applies, continue to Step 3 immediately without waiting for approval. When that exception applies, present the test list together with the Step 1 scope report and wait for approval before entering the loop.
Pick exactly one item from the list. Choose one that teaches you something and that you are confident you can implement in one cycle (Beck's "one step test"). When several items qualify, prefer the one whose passing requires the simplest transformation of the code: a test needing only a constant return comes before one forcing a conditional, and a conditional before a loop — the Transformation Priority Premise, made concrete by the ZOMBIES ordering, both in references/test-selection.md; pull that reference when the choice is not obvious. If every remaining item forces a big leap (a loop or recursion with no smaller test in between), a simpler test is missing: add it to the list and pick it. Then run these three phases in order. Do not collapse them.
Read once, don't reread. Within a single loop iteration, do not reread a file you have already read in this
iteration unless you have edited it. When grep returns a line number, use Read with offset and limit to read
20-40 lines around the target — not the entire file. Rereading whole source files between Red and Green of the same
behavior is overhead, not discipline.
Write exactly one test for the chosen behavior. Name it for the behavior in the project's convention. Assert an observable outcome through the public interface (Given = arrange the state before; When = the one action under test; Then = assert the observable result). Write no more of the test than is sufficient to fail; a compilation failure is a failure.
Before you run it, check the assertion direction for a fix to broken behavior. The assertion must target the desired correct result, so the red you are about to observe is "correct behavior not yet produced" — not "the error the bug raises was raised successfully." A test that asserts the buggy behavior either passes immediately or goes red for the wrong reason; both look like a satisfied gate and both lock the bug in. (Asserting a raise is still correct when raising is the specified desired behavior; the trap is asserting the error that is the bug.)
Run the resolved test command directly with Bash. Paste the failing assertion plus enough surrounding output (5-10 lines) to confirm the failure reason — the assertion text or the missing symbol you expect, not an unrelated error. If the test passed on its first run, paste only the runner's summary line and stop to diagnose: the observed-failure gate has tripped.
If the test passes on its first run, the observed-failure gate has tripped. Stop. Diagnose one of three causes: the test is not exercising the behavior; the behavior already exists; or — for a fix to broken behavior — the test is asserting the current broken behavior (the error the bug raises), which passes precisely because the bug is still present. If the behavior already exists, cross the item off and pick the next one. If the test is asserting the bug, do not cross the item off — rewrite it to assert the desired correct behavior, so it goes red until the fix lands. Do not write production code off an unobserved red.
With the red observed, check where green would land. Name the files you would edit to make this test pass, before you edit any of them. If one sits outside the Step 1 boundary, the scope gate has tripped: do not edit it, and work the resolution ladder from Step 2 instead. A genuine red says the behavior is missing. It does not say this build owns producing it, and this is the only check that asks. Shared or cross-application code is where the gate matters most, because the blast radius of an edit there reaches consumers nobody in this build is testing.
Write the minimum production code that makes this one test pass. Use the smallest gear that works: Obvious Implementation when you are certain, Fake It (return a constant, generalize later) when you are not, Triangulate (force the abstraction with a second example) only when you are really unsure. Gears are described in references/tdd-loop.md.
While going green, respect the coding standards and ADRs that govern correctness and architectural placement: where this code is allowed to live, which boundary or client it must go through, which contract it must honor. Violating an ADR boundary is not a sin you clean up later — it is the wrong code. Do not apply stylistic or structural polish here (naming sweeps, extraction, formatting passes). That is the refactor hat, and wearing it now violates "no more code than is sufficient to pass the test."
Run the full test suite with Bash. Paste the runner's summary line (pass and fail counts). Paste full output only if a previously passing test broke or something unexpected appears. The gate to leave green is: the new test passes and every previously passing test still passes. If a prior test broke, you are not green — fix it before refactoring.
Only with every test green. Neglecting this step is the most common way to ruin TDD, so it is not optional: either you change something, or you state explicitly "no duplication, structure, or standards issue this cycle" and move on.
Eliminate the duplication you just created. Bring the code into full conformance with the resolved coding standards and ADRs — this is the home for the stylistic and structural standards you deliberately skipped in green.
Apply YAGNI per ../../references/yagni-rule.md: remove duplication, do not add speculative abstraction. Defer speculative structure with the trigger that would reopen it; never add silently, never drop silently.
Change no behavior. Re-run the full suite after the refactor. Paste the runner's summary line — paste full output only if something unexpected appears. The suite must stay green. If a refactor reddened a test, revert it — a refactor that changes behavior is a defect, not a refactor.
Cross the completed item off the list. Append any scenarios you discovered while implementing (deferred, with their reopen trigger if speculative), but do not implement them now. If the open list has grown past roughly ten items, do not stop for input: flag it prominently as a scope warning, keep going, and record in the final summary that the work exceeded the recommended size and should be split next time. A runaway list is a scope signal, not a reason to pause for a human.
Running collaboratively. When the request asks to review each behavior as it lands, which is what pairing does
when it hands work here, stop at this point and hand control back instead of continuing. Present the stop in the shape
collaborative-stop-rule.md specifies. Absent such a request, continue as
below; an ordinary invocation is unchanged.
Return to the top of Step 3 with the next item. Continue until the list is empty.
For any item that had an outer acceptance test (Step 2), run that test now. It should pass only because its inner behaviors are all implemented with real code (not mocks). If it is still red, the gap is a missing inner behavior: add the missing scenario to the test list and return to Step 3. The acceptance test going green is the signal the user-facing behavior is actually delivered.
Run the full test suite, then the lint command, then the build command, using the resolved commands from Step 1. Paste the summary line from each. Paste full output only when one of them fails. If lint or build fails, that is in scope — fix it (a lint or build break is not a "pre-existing error" to wave off) and re-run.
Summarize for the user:
© testdouble, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (scripts, references) in han-coding/skills/tdd of testdouble/han.
Open the folder on GitHubat commit abba73a
TDD next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| TDD this skilltestdouble/han | 279 | — | ~5.6k | Automated safety check: Pass | MIT | |
| TDDfossasia/eventyay-interpretation | 1.6k | 28 repos | ~1.1k | Automated safety check: Pass | Apache-2.0 | |
| TDD WorkflowhellangleZ/burn-in-cceverywhere-ralph | 112 | 11 repos | ~2.4k | Automated safety check: Pass | None | |
| TDDsanity-io/sanity | 6.4k | 20 repos | ~1k | Automated safety check: Pass | MIT | |
| Test Driven Developmentfarm-fe/farm | 5.6k | 49 repos | ~2.5k | Automated safety check: Pass | MIT | |
| Tapd Story PipelineTencentBlueKing/bk-bcs | 840 | — | ~2.6k | Automated safety check: Pass | Custom licence |
fossasia/eventyay-interpretation
Test-driven development. An agent skill from fossasia/eventyay-interpretation.
hellangleZ/burn-in-cceverywhere-ralph
A skill your agent uses when writing new features, fixing bugs, or refactoring code.
sanity-io/sanity
Test-driven development with red-green-refactor loop. An agent skill from sanity-io/sanity.
farm-fe/farm
A skill your agent uses when implementing any feature or bugfix, before writing implementation code
TencentBlueKing/bk-bcs
单需求实现流水线——把一个 TAPD 需求从零推进到代码提交。自动串联技术澄清、 开发计划、任务拆分、TDD 实现、架构/安全校验、代码提交六个阶段。
maddhruv/absolute
One-time setup for absolute: interview how you want it to behave (output style, autonomy, TDD strictness, spec dir, families) + detect the stack once, then write .absolute.config.json (project…
testdouble/han
Convert a stakeholder summary markdown file into a single self-contained HTML executive report — bottom line and decision asks up front, supporting detail later — styled with a Test Double-derived…
testdouble/han
Update Han plugin documentation so every skill, agent, guidance doc, index, and cross-reference is current and accurate.
testdouble/han
Authoritative guidance for building Claude Code skills, agents, and plugins, plus init and update steps that install and refresh the plugin-building skills in the current repository.
testdouble/han
Cut a Han release: update CHANGELOG.md with the changes since the last release, bump and tag every plugin that changed as {plugin-name}--v{version} so a version-constrained dependency can resolve…
testdouble/han
Builds a feature implementation plan from an existing feature specification (or equivalent context) through a facilitated team conversation.
testdouble/han
Restructure existing code without changing its behavior, through a test-gated refactoring loop: a named target, a green suite over that target before any edit, a planned sequence of small named…
Categories
Write code through a disciplined, BDD-framed Test-Driven Development loop: build a behavior test list, then drive each behavior through red-green-refactor with an enforced observed-failure gate. TDD is an agent skill from testdouble/han. Write code through a disciplined, BDD-framed Test-Driven Development loop: build a behavior test list, then drive each behavior through red-green-refactor with an enforced observed-failure gate.
TDD fits situations like: the user wants to implement; write code test-first; follow red-green-refactor; drive code from tests.
Run `npx skills add testdouble/han --skill tdd -a claude-code`. Or copy the skill folder (han-coding/skills/tdd in testdouble/han) into .claude/skills/tdd in your project. Claude Code loads it when a task matches its description.
Run `npx skills add testdouble/han --skill tdd -a codex`. Or copy the skill folder (han-coding/skills/tdd in testdouble/han) into .agents/skills/tdd in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add testdouble/han --skill tdd -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/tdd, .gemini/skills/tdd, .github/skills/tdd and .opencode/skills/tdd in your project.
Going by SKILL.md and its folder, TDD needs a shell for the scripts in its folder and the command-line tools its instructions call (git and bash). Our summary lists: Python 3; Node.js; A Bash shell. Its frontmatter pre-approves these tools: Read, Write, Edit, Glob, Grep, Agent, Bash(git *), Bash(find *), Bash(npm *), Bash(npx *), Bash(pnpm *), Bash(yarn *), Bash(pytest *), Bash(python3 *), Bash(go *), Bash(cargo *), Bash(make *), Bash(bundle *), Bash(rake *), Bash(bash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh").
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
TDD is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.6k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 8.6k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with TDD: TDD (fossasia/eventyay-interpretation, 1.6k stars), TDD Workflow (hellangleZ/burn-in-cceverywhere-ralph, 112 stars), TDD (sanity-io/sanity, 6.4k stars) and Test Driven Development (farm-fe/farm, 5.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
testdouble (a GitHub organization) maintains it in testdouble/han, which has 279 GitHub stars. The repository holds 54 skills in this directory. The repository was last updated on October 1, 2026.
Source: testdouble/han on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.