TDD
pietheinstrengholt/rssmonster
Test-driven development. An agent skill from pietheinstrengholt/rssmonster.
Implement changes using Test-Driven Development (Red-Green-Refactor).
$ npx skills add kdlbs/kandev --skill tdd -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install kdlbs/kandev 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/kdlbs/kandev.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/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/kdlbs/kandev/tree/main/.agents/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/kdlbs/kandev/tree/main/.agents/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 kdlbs/kandev --skill tdd -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install kdlbs/kandev tdd --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kdlbs/kandev.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/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/kdlbs/kandev/tree/main/.agents/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 kdlbs/kandev --skill tdd -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install kdlbs/kandev tdd --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kdlbs/kandev.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/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/kdlbs/kandev/tree/main/.agents/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/kdlbs/kandev.git --path .agents/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 kdlbs/kandev --skill tdd -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install kdlbs/kandev tdd --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kdlbs/kandev.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/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/kdlbs/kandev/tree/main/.agents/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 kdlbs/kandev 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 kdlbs/kandev --skill tdd -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/kdlbs/kandev.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/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/kdlbs/kandev/tree/main/.agents/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 kdlbs/kandev --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 kdlbs/kandev tdd --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kdlbs/kandev.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/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/kdlbs/kandev/tree/main/.agents/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.
tddImplement changes using Test-Driven Development (Red-Green-Refactor).
TDD is an agent skill from kdlbs/kandev. Implement changes using Test-Driven Development (Red-Green-Refactor). Use for code changes that need coverage or requested test-value audits.
Its SKILL.md is about 4.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/backend-tests.md` and `references/test-audit.md`).
It sits in Testing & QA, covering Test-driven development. The repository describes itself as: AI Kanban & Development Environment. Orchestrate multiple agents, review changes, open PRs. Multi-provider, self-hostable, no telemetry. The licence is AGPL-3.0.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b734113. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gopnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm, 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 4.2k tokens when it runs, and up to ~7k if it reads all its reference files. Until then it costs about 36 tokens; SKILL.md has 2,385 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); files beside SKILL.md are not scanned.
The full file from kdlbs/kandev at commit b734113, republished under its AGPL-3.0 licence (© kdlbs). 2,385 words, ~4,179 tokens.
.claude/skills/tdd/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Use this procedure directly in the primary conversation for every code change, regardless of size. The user may switch that conversation to the lower-cost implementation model before beginning the Red-Green-Refactor cycle.
Implement code changes using strict Red-Green-Refactor. Iron law: no production code without a failing test first.
Wrote code before a test? Delete it. Start over from a failing test.
/e2e — Follow this procedure when the current task needs Playwright E2E coverage./pr-fixup — After the task-defined checks pass and the PR opens, use it
only for CI or actionable reviewer findings.Skip for: pure UI components (we don't test React components), config files, generated code.
For UI rendering bugs, prefer extracting or using a pure helper and testing that helper. Add Playwright only when the behavior is truly visual or integration-level. Avoid adding React component tests just to assert DOM output; that does not match this project's testing convention.
Before adding or changing a test, answer these questions:
Resolve a missing answer before writing the test. Prefer extending an existing case over repeating the same contract. Give each contract a primary test owner at the boundary that can expose its failure. Keep additional layers for distinct transport, lifecycle, platform, or input-handler risks.
For test-only seams, first look for proof through an existing production boundary. Keep necessary performance instrumentation only with a named invariant and no simpler proof.
For a requested test audit or consolidation, load test-audit.md. Do not start a broad cleanup as part of ordinary TDD.
When implementing a UI work order, read its ASCII UI preview and linked plan
before changing the surface. Use the structural requirements to guide the
existing rendered checks; do not test ASCII whitespace or treat it as exact
pixel geometry. Keep any design revisions synchronized through
docs/specs/guide/plans-and-work-orders.md#ascii-ui-previews.
apps/backend/): test file next to source as *_test.go. Run:cd apps/backend && go test -v -run TestName ./internal/path/to/package/...apps/web/lib/): test file next to source as *.test.ts. Run:cd apps && pnpm --filter @kandev/web test -- --run path/to/file.test.tsapps/web/e2e/): follow /e2e when the current task needs Playwright tests.For Go test fixtures, load backend-tests.md.
Choose the right level:
/e2e.Prefer state/output assertions over interaction assertions. Mock only slow, nondeterministic, or external boundaries; use real implementations or fakes when they keep the test deterministic.
When one behavior has separate wheel, keyboard, touch, or pointer handlers, inventory and test every handler with distinct branching. For input at a hard boundary where the underlying position cannot change, dispatch the input event or gesture directly. Cover the eligible direction at the boundary, the wrong direction or off-boundary no-op, one physical gesture firing at most once, and listener cleanup when the change adds subscriptions. An E2E case for one input modality does not cover the other handler paths.
When a work order names an AC-* acceptance criterion, keep the mapping visible
in the test name or a nearby @covers AC-... comment. Do not copy the complete
requirement into the test.
For failure-path tests, inject the error at the boundary the production code claims to handle and exercise the real downstream call chain; do not short-circuit by mocking the handler under test. When production code has a defensive nil/fallback branch or sanitizes an internal error into a public error, inject that alternate return at the interface boundary and assert the public result plus absence of internal details or sensitive content. For a test asserting that a side effect does not occur, enable every prerequisite that would otherwise cause it and add a positive control with the same setup to prove the side effect is reachable. Observe the actual side effect, not a proxy that can remain unchanged.
For parser, canonicalization, or sanitization tests, build fixtures from the producer's exact serialized shape. Include boundary cases such as optional whitespace, adjacent records, terminators without a newline, and malformed or unclosed input; assert that untrusted content is removed or fails closed while independent following content is preserved. A test-only normalized fixture can pass while the real wire framing still fails.
When adding or renaming a field that crosses backend, WebSocket, and frontend
boundaries, use rg to trace every producer, DTO, store upsert or partial
merge, reconnect/readiness handler, and consumer before editing. Add focused
coverage at the affected boundaries, including refresh/reconnect and an update
that omits the field, so a partial payload cannot silently discard an existing
value.
For MCP/API tool registration or mode-gated catalogs, add positive tests for
intended modes and negative tests asserting tool absence in every excluded mode.
For opt-in or feature-flagged implementations, exercise both the explicit
enabled path and the disabled/default path; default-path coverage alone does
not prove that the opt-in implementation is wired.
When production behavior depends on an optional interface or type assertion, a pass-through fake that omits that capability is invalid coverage. Use the real implementation or a capability-complete fake, and assert the exact accepted content and trusted context at persistence and dispatch, including empty expansions and delayed or created-session paths.
When content passes through multiple canonicalizers or a delayed/created-session path, test each handoff with distinct sentinels and assert exact equality at persistence and dispatch. Carry the exact value produced at acceptance through later stages instead of re-deriving it from mutable source data at launch.
Test ordering-sensitive behavior with channels, barriers, or controllable fakes;
do not use sleeps to create a race, except for a bounded, named delay that
models a known poll-loop schedule when synchronization would alter that
relationship. Pause at the ownership boundary, start the
competing operation, then release. Exercise the real delivery path where
practical, and prove the old interleaving fails before the fix. Assert both the
winner state and the untouched replacement state, including relevant buffers,
signals, or queue ownership. Cover stale events acting after a replacement
operation begins, stale-owner handoffs plus same-owner invalidation/no-replay,
cancellation/retry ownership, and at-most-once delivery when they apply. Run
affected Go packages with -race.
When a source can deliver either a complete snapshot or a partial event, define the omission semantics and test both forms. Capture a request-start revision or epoch before every asynchronous request, inventory all callers, and use deferred response/event tests to prove ordering. React loading state does not serialize same-tick callbacks; use an immediate ref or shared in-flight promise when request identity must be single-flight.
For fetch effects that depend on live store values such as message count, a dependency rerender is not lifecycle invalidation. Do not let an effect-local cleanup boolean be the only ownership guard: capture a session, connection, or attempt generation for response writes and loading finalization, and invalidate that generation only on the corresponding session/connection change or unmount. Add a red test that defers the response, triggers a same-session live-row rerender, and proves the pending state settles without overwriting newer UI.
For hooks writing shared workspace or global caches, test the ownership matrix: a second consumer preserves valid cached data; an initiator unmount before a deferred response still reaches terminal state; the latest same-key response wins over stale completion; and workspace/key switches remain isolated.
During cancellation or recovery, do not broadly suppress stream frames. Suppress only allowlisted cancellation acknowledgements with immutable operation identity; same-identity message, thinking, and tool frames remain authoritative activity. Add a negative regression for each activity class and a transport-boundary test when ordering depends on subscriber processing.
When delayed state has a lifecycle owner, pair the boundary tests: disposal before the threshold must cancel timers and emit nothing later; disposal or replacement after publication must immediately clear externally observable state; and stale callbacks must not mutate the replacement.
When setup can finish before hydration or restoration, test both readiness states. Cover state that is ready at setup and state that becomes ready after listener registration. Drive the readiness transition explicitly and dispose each added subscription.
When logic rejects ambiguous candidates, filter invalid candidates before the cardinality check. Cover zero valid candidates, one valid candidate mixed with invalid candidates, and multiple valid candidates.
For behavior described as remaining reactive, updating, or responding after initialization, test both the initial state and a deterministic post-initialization transition. An initial snapshot test cannot prove that a subscription, watcher, or reconciliation path remains active; trigger a state, event, or input change and assert the updated outcome. If no public API exposes publication or render counts, a controlled boundary fake may instrument those events, but retain an observable state assertion as the proof of behavior.
For bug fixes, use the Prove-It Pattern: reproduce the bug with a failing test before changing production code. A fix without a regression test is not complete unless the change is explicitly untestable and you say why.
describe/it blocks (TS), remove duplicationIn tests, prefer DAMP over DRY: each test should read like a small specification. Shared helpers are fine when they remove noise, but not when they hide the scenario. For fixture setup that needs a canonicalized identifier, use the production helper instead of copying its algorithm. Keep expected values literal and independent; if a test needs an independent oracle, keep it local and explain why.
Return to step 1 for the next behavior or edge case. Continue until the feature or fix is complete.
Run the targeted tests named in the task file and report their results. Commit and open the PR after all affected task checks pass; do not add broad local verification by default.
After the final production-code edit, rerun every new or changed regression test and report the exact command and result. A prior green run does not cover a later patch.
Don't test implementation details:
Don't test mock behavior:
*-mock test ID, mock return value), you're testing the mock, not the code. Test real behavior or don't mock it.Don't add test-only methods to production code:
destroy(), reset(), _testHelper() that only tests call — put these in test utilities, not production classes.Mock minimally and understand dependencies:
Don't use incomplete mocks:
vi.mock() factories and add the export to each factory. Focused tests can
pass while a full suite fails on an out-of-date module shape.rg to
find every affected vi.mock() factory and stubbed consumer, update each
mock for every consumed field, then run the full owning package test command
and the nearest real component or consumer test; typecheck alone does not
catch an omitted runtime field.Never swallow errors in tests:
try/catch that silently ignores failures in test helpers or setup — these hide real failures.Don't repeat unchanged passing commands for reassurance:
© kdlbs, AGPL-3.0. 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 2 other files (references) in .agents/skills/tdd of kdlbs/kandev.
Open the folder on GitHubat commit b734113
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 skillkdlbs/kandev | 909 | — | ~4.2k | Automated safety check: Pass | AGPL-3.0 | |
| TDDpietheinstrengholt/rssmonster | 564 | 30 repos | ~906 | Automated safety check: Pass | MIT | |
| 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 | 51 repos | ~2.5k | Automated safety check: Pass | MIT | |
| Tapd Story PipelineTencentBlueKing/bk-bcs | 840 | — | ~2.6k | Automated safety check: Pass | Custom licence |
pietheinstrengholt/rssmonster
Test-driven development. An agent skill from pietheinstrengholt/rssmonster.
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…
kdlbs/kandev
Generate a single-file HTML walkthrough that explains a PR's purpose, user impact, interface changes, compatibility risks, and implementation.
kdlbs/kandev
Diagnose Kandev bugs, running-instance issues, UI/browser failures, and runtime behavior.
kdlbs/kandev
Improve Kandev's AI harness from session learnings or explicit requests.
kdlbs/kandev
Create branded architecture, IT current-state, flowchart, sequence, state machine, ER/data model, timeline, swimlane, quadrant, radar/spider, polar chart (polar/radial lollipop), loop/flywheel…
kdlbs/kandev
Run a broad local verification audit only when the user explicitly requests it or PR/CI remediation requires it.
kdlbs/kandev
Debug an ACP agent CLI by spawning it, speaking raw JSON-RPC, and capturing every frame to a JSONL file.
Categories
Implement changes using Test-Driven Development (Red-Green-Refactor). TDD is an agent skill from kdlbs/kandev. Implement changes using Test-Driven Development (Red-Green-Refactor).
TDD fits situations like: code changes that need coverage; requested test-value audits.
Run `npx skills add kdlbs/kandev --skill tdd -a claude-code`. Or copy the skill folder (.agents/skills/tdd in kdlbs/kandev) into .claude/skills/tdd in your project. Claude Code loads it when a task matches its description.
Run `npx skills add kdlbs/kandev --skill tdd -a codex`. Or copy the skill folder (.agents/skills/tdd in kdlbs/kandev) 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 kdlbs/kandev --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 the command-line tools its instructions call (go and pnpm).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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. Review the folder before installing.
TDD is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.2k tokens (SKILL.md is roughly 17k 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 2.8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with TDD: TDD (pietheinstrengholt/rssmonster, 564 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.
kdlbs (a GitHub organization) maintains it in kdlbs/kandev, which has 909 GitHub stars. The repository holds 45 skills in this directory. The repository was last updated on October 8, 2026.
Source: kdlbs/kandev on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.