tdd'er
A plugin for pi, Claude Code, and OpenCode that guides AI agents through disciplined Test-Driven Development
and Clean Code practices.
Note that currently this is WORK IN PROGRESS! I'm not even trying to keep it stable or tested.
At the moment, I'm writing it only for my personal use; it may also work for you, but be ready to have issues;
I'd be happy to hear about them!
Features
- TDD discipline: Strict Red-Green-Refactor cycles with baby steps and guessing game
- Clean Code review: Automated code review during refactor phases via subagent
- APP mass calculations: Objective code complexity measurement
- Language-agnostic core: TDD and Clean Code principles work with any language
- Extensible: Add language skills (Java, TypeScript, ...) and build-system skills (Maven, npm, ...)
- Unfolding Architecture: Progressive architectural decisions — start simple, add complexity only when it reduces
complexity
- Unfolding Specs: Orchestrated feature development — orchestrator launches the top-level PO task, while specialist
roles coordinate through runtime-managed delegated tasks
- Configurable human-in-the-loop: Control how often the AI pauses for your input
Skills
Language-agnostic core skills work with any language. Language and build-system skills complement them automatically
when matching files are detected.
| Skill | Purpose |
|---|
tdd | Core TDD process (Red-Green-Refactor, baby steps, guessing game) |
clean-code | Clean Code principles (naming, SOLID, smells, method design) |
app | Absolute Priority Premise mass calculations |
java | Java-specific conventions (var, BDD testing, static imports) |
unfolding-architecture | Progressive architectural decisions (start simple, unfold on demand) |
integration-architecture | Integration messaging patterns (commands vs events, push vs pull, reliability) |
maven | Maven-specific conventions (test execution, project structure) |
nested-fixture-pattern | JUnit nested fixture pattern for layered test preconditions |
grill-po | Requirements grilling session with a PO: sharpens terminology, documents features as Gherkin, updates bounded-context files and ADRs inline |
project-hygiene | Interaction style, commit conventions, documentation discipline |
github-safety | Prompt-injection defense for GitHub issues and pull requests |
prove-me-wrong | Devil's advocate mode: finds the strongest objections to the user's position |
Extensions
Extensions add active behaviour beyond passive skills — they register commands, tools, and UI components
directly into the coding agent.
The sections below already document the larger extensions in detail. To avoid duplicating that prose,
here is a compact overview of what each extension contributes:
| Extension | Commands | Tools | Other behaviour |
|---|
hygiene | — | — | Injects prompt reminders to load project-hygiene, java, and github-safety when detected |
idea (pi only) | — | JetBrains MCP-backed idea_* tools for code exploration, refactoring, build/run, and debugging | Lazy-connects to IntelliJ IDEA and shows footer status |
jdtls (pi only) | — | jdtls_get_file_problems, jdtls_search_symbol, jdtls_get_symbol_info, jdtls_rename_refactoring, jdtls_reformat_file, jdtls_get_project_modules, jdtls_code_action, jdtls_read_file | Starts Eclipse JDT Language Server lazily for Java projects |
maven | /maven | maven_project_info, maven_run, maven_lookup_version, maven_available_java_versions | Also ships the standalone tdder-maven CLI |
mlx (pi only) | — | — | Auto-recovers when the local model leaks tool-call XML into its thinking output and stalls (repetition defaults are now configured natively via pi's samplingParams) |
quarkus (pi only) | /quarkus | Dynamic quarkus_* tools mirrored from quarkus-agent-mcp | Detects Quarkus projects, starts MCP lazily, and shows footer status |
shared | — | — | Shared code used by other extensions; no end-user tools |
unfolding (pi only) | /unfold, /connect-session | ask_sensei, delete, task_delegate, task_continue, task_accept, task_reopen, task_unblock, task_rollback | Child sessions additionally use task_finished and task_block; root sessions can diagnose with task_list, task_read |
quarkus (pi only)
Integrates quarkus-agent-mcp into
pi so the LLM can manage Quarkus dev-mode
applications without leaving the chat.
Auto-activation: the extension detects whether the current directory is a Quarkus project
(contains a pom.xml or build.gradle referencing quarkus) and starts the MCP server lazily
in the background. All quarkus-agent-mcp tools (quarkus_start, quarkus_stop, quarkus_status,
quarkus_skills, quarkus_searchDocs, quarkus_callTool, …) are registered as native pi tools
and become available to the LLM automatically.
Footer status: a live status indicator in the pi footer shows the running app state:
quarkus ● :8080 — running on the detected port
quarkus ◌ starting… — dev mode booting
quarkus ⚠ crashed — process exited unexpectedly
- (blank) — stopped / not started
/quarkus command: a unified slash command for common Quarkus actions.
With no argument it opens an interactive selector; with an argument it dispatches directly.
Tab-completion lists all subcommands.
| Subcommand | Behaviour |
|---|
status | Show the state of all discovered Quarkus services; with an arg, show just that module (direct, LLM on failure) |
start | Start a discovered Quarkus service in dev mode; with multiple services it picks, and supports --profiles=dev,foo (LLM on failure) |
stop | Stop one or more managed apps; with no args opens a picker, args can be module names (direct, LLM on failure) |
logs | Show recent log output (direct, LLM on failure) |
list | List all managed Quarkus instances (direct, LLM on failure) |
agent-log | Read the MCP server's own log file (direct, LLM on failure) |
restart | Hot-reload the app (direct, LLM on failure) |
open | Open the app in the browser |
devui | Open the Quarkus Dev UI in the browser |
info | Show app status, endpoints, and dev services (requires dev mode) |
skills | Manage community skills: list installed, delete, browse and install new ones |
update | Check for Quarkus updates — output always sent to LLM for analysis |
search-tools | Discover Dev MCP tools on the running app — output sent to LLM for analysis |
test-affected | Run tests affected by recent changes — results always sent to LLM for analysis |
test-all | Run the full test suite — results always sent to LLM for analysis |
mcp-restart | Restart the quarkus-agent-mcp server process itself |