Agent skill · software engineering · rtk-ai
rtk-tdd
Enforces TDD (Red-Green-Refactor) for Rust development. Auto-triggers on implementation, testing, refactoring, and bug fixing tasks. Provides Rust-idiomatic testing patterns with anyhow/thiserror, cfg(test), and Arrange-Act-Assert workflow.
Why this skill is useful
Provides Rust-specific TDD patterns and a structured workflow that the AI wouldn't reliably generate on its own.
What it needs
Requires cargo installed locally. About 2k tokens when loaded. Last updated 2026-08-06. 75,070 stars on the source repository.
What this skill does
Rust TDD Workflow Three Laws of TDD 1. Do NOT write production code without a failing test 2. Write only enough test to fail (including compilation failure) 3. Write only enough production code to pass the failing test Cycle: RED (test fails) -> GREEN (minimum to pass) -> REFACTOR (cleanup, cargo test) Red-Green-Refactor Steps Never skip step 2. If the test passes immediately, it tests nothing. Idiomatic Rust Test Patterns Pattern Usage When --------- ------- ------ Arrange-Act-Assert Base structure for every test Always asserteq! / assert! Direct comparison / booleans Deterministic values assert!(result.iserr()) Error path testing Invalid inputs Result<()> return type Tests with ? operator Fallible functions #[shouldpanic] Expected panic Invariants, preconditions tempfile::NamedTempFile File/I/O tests Filesystem-dependent code Patterns by Code Type Code Type Test Pattern Example ----------- ------------- --------- Pure function (str -> str) Input literal -> assert output asserteq!(truncate("hello", 3), "...") Parsing/filtering Raw string -> filter -> contains/not-contains assert!(filter(raw).contains("expected")) Validation/security Boundary inputs -> assert bool assert!(!isvalid("../etc/passwd")) Error handling Bad input -> iserr() assert!(parse("garbage").iserr()) Struct/enum roundtrip Construct -> serialize -> deserialize -> eq asserteq!(fromstr(tostr(x)), x) Naming Convention Examples: testtruncateedgecase, testparseinvalidinput, testfilteremptystring When NOT to Use Pure TDD Functions calling Command::new() -> test the parser, not the execution std::process::exit() -> refactor to Result first, then test the Result Direct I/O (SQLite, network) -> use tempfile/mock or test the pure logic separately Main/CLI wiring -> covered by integration/smoke tests Pre-Commit Gate All 3 must pass. No exceptions. No #[allow(...)] without documented justification.
How to use it
Reference it in AdaL, Claude Code, Cursor or any coding agent — nothing to install:
@skills rtk-ai/rtk-tdd