FAQ
tdder is a Claude Code plugin with 14 hand-picked skills for development work, indexed on Flowy. Install it with the command on its page. It includes app, clean-code, github-safety. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
> /plugin marketplace add t1/tdder> /plugin install tdder@t1
Repo: t1/tdder
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!
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 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) | β | β | Injects default MLX repetition settings via before_provider_request; auto-recovers when the local model leaks tool-call XML into its thinking output and stalls |
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 , |
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 portquarkus β startingβ¦ β dev mode bootingquarkus β crashed β process exited unexpectedly/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 |
mcp-tools | List all tools advertised by the MCP server (output sent to LLM) |
In multi-module Maven repos, /quarkus status scans all discovered Quarkus services and overlays their runtime state
from the managed-instance list, so stopped services are shown too. /quarkus start uses the same discovery and supports
an optional positional module/path plus --profiles=dev,foo (no spaces). Other instance-scoped subcommands (stop,
logs, restart, open, devui, info, test-affected, test-all) no longer blindly assume the cwd is the target;
they prompt when needed and also accept a positional module/path. search-tools keeps its positional query argument, so
its target is inferred or picked rather than passed explicitly.
Dispatch strategy: direct subcommands call the MCP tool immediately and show the result as a
notification. On failure, the error output is automatically forwarded to the LLM with
"what went wrong and how should I fix it?". update, test-affected, and test-all always route through the LLM
because their output is analytical rather than a simple pass/fail signal.
Implements the Unfolding Specs workflow: the orchestrator owns the top-level PO task, while specialist roles delegate work through runtime-managed live tasks and explicit checkpoints.
Warning: /connect-session opens a fresh pi --session process. It does not currently
guarantee the same extension set or the same nono sandbox as the session you launched it from.
For command usage, task tools, coordination protocol, recovery behavior, rollback mechanics, role/commissioner rules, and extension-specific test instructions, see:
Structured Maven execution with test report parsing, compilation error extraction, Maven Central version lookup, and Adoptium Java release lookup.
pi extension: registers maven_run, maven_project_info, maven_lookup_version, and
maven_available_java_versions tools
plus a /maven slash command with live progress widget.
CLI (tdder-maven): the same functionality as a standalone command, usable from any agent
that has shell access (Claude Code, OpenCode, Cursor, terminal, β¦). Requires
tsx on your PATH. Run tdder-maven help for usage.
All commands output structured JSON to stdout. Non-zero exit code on failure.
Integrates the official JetBrains MCP Server plugin into pi so the LLM can use IntelliJ IDEA's PSI, inspections, refactorings, and debugger without leaving the chat.
Auto-activation: the extension is always loaded but lazy-connects to the IDE's MCP endpoint
(default http://127.0.0.1:64342/sse). On every probe it sends a cheap project-scoped call
(e.g. get_project_modules) with projectPath = pi's CWD. Three outcomes drive the footer:
idea β β IDE reachable and pi's CWD is open as a projectidea β not open β IDE reachable, but pi's CWD isn't one of the open projects (tools are hidden;
the list of currently open projects is surfaced for diagnosis)projectPath injection: every JetBrains MCP tool takes an optional projectPath. The extension
always injects pi's CWD on every forwarded call, overriding whatever the LLM tries to pass.
The LLM should never think about projectPath β same way it doesn't think about filesystem roots.
Modes of operation (vocabulary): tools are tagged with a 2Γ3 lens so the LLM can pick the
right family for the task. This vocabulary is documented per-tool in the extension's tool
descriptions; it may later be promoted to a dedicated idea skill if cross-tool patterns emerge.
| code (static) | runtime (dynamic) | session (IDE / env) | |
|---|---|---|---|
| explore | search symbols, get inspections, project model | debugger inspect, app logs / metrics / traces | which files are open, IDE version |
| modify | edit, rename, reformat | set breakpoint, set variable, run, hot-reload | open file in editor, switch project |
Available tools β tagged with the 2Γ3 modes vocabulary above (31 total):
| Modes | Tools |
|---|---|
| explore/code | search_symbol, get_symbol_info, search_in_files_by_regex, find_files_by_glob, list_directory_tree, get_project_modules, read_file, get_file_problems, get_project_dependencies, get_file_text_by_path, get_repositories |
| explore/session | get_all_open_file_paths |
| modify/session | open_file_in_editor |
| modify/code | rename_refactoring, reformat_file |
| modify/runtime | build_project, get_run_configurations, execute_run_configuration |
| explore/runtime + modify/runtime | xdebug_get_stack, xdebug_get_frame_values, xdebug_get_threads, xdebug_evaluate_expression, xdebug_get_value_by_path, xdebug_get_debugger_status, xdebug_list_breakpoints, xdebug_set_breakpoint, xdebug_remove_breakpoint, xdebug_set_variable, xdebug_run_to_line, xdebug_control_session, xdebug_start_debugger_session |
Explicitly out of scope (duplicates of pi built-ins):
replace_text_in_file, create_new_file β use pi's edit / writefind_files_by_name_keyword β use find_files_by_globsearch_file, search_text, search_regex, search_in_files_by_text β use search_in_files_by_regexexecute_terminal_command β redundant with pi's bash| Agent | Purpose |
|---|---|
clean-code-reviewer | Autonomous code review during refactor phases |
The Claude Code plugin includes a PreToolUse hook that reminds the agent to load language/build-system skills
before editing matching files:
| File pattern | Skill reminded |
|---|---|
*.java | java |
pom.xml | maven |
If no settings file exists, the TDD skill will ask on first use and persist your choice.
You can also create .claude/tdder.local.md manually in your project root:
---
hitl: every-phase
---
| Level | Behavior |
|---|---|
every-phase | Stop after every Red, Green, Refactor phase |
end-of-cycle | Stop after each complete Red-Green-Refactor cycle |
off | Run autonomously, report at end |
Install the tdder package, which registers all skills and extensions automatically:
pi install git:github.com/t1/tdder
The quarkus extension activates automatically in Quarkus projects (requires
jbang on your PATH).
The idea extension activates when the IntelliJ IDEA MCP Server plugin is reachable
on 127.0.0.1:64342 and the current pi working directory matches an open IDE project.
Add this repo as a marketplace, then install the plugin:
/plugin marketplace add t1/tdder
/plugin install tdder@t1
Note that the official docs are not very clear about this, but you actually need a marketplace.json,
even if you have only a single plugin.
Add tdder to the plugin array in your opencode.json (global or project-level):
{
"plugin": ["tdder@git+https://github.com/t1/tdder.git"]
}
Restart OpenCode. The plugin auto-installs and registers all skills.
Development currently requires tsx to be installed and available on your
PATH, because repo utility scripts use a #!/usr/bin/env tsx shebang.
For example:
npm install -g tsx
Separately released pi extension packages in this repo vendor shared TypeScript from
elsewhere in this repo during a sync step instead of publishing a separate shared
package. In this setup, pretest and prepack are only safety nets: after every edit
to shared code or to a consumer of that shared code, run npm run sync-extensions
immediately so development, tests, and packaging all see the same files.
External runtime npm dependencies must be vendored the same way: extend the extension's
sync script to copy the package into vendor/, import it from there, and declare it as
a dependencies entry (not devDependencies β pi update installs with --omit=dev,
and install-time sync must still find the package in node_modules). An extension may
only bare-import node:* builtins and pi-bundled packages (@earendil-works/*,
typebox); the consumer's node_modules is not guaranteed reachable (e.g. under nono
sandboxes, or when the extension is installed under ~/.pi).
As of Claude Code v2.1.44, it's not an easy task to update the plugin; even uninstalling and reinstalling doesn't help.
The problem is that the marketplace is checked out to ~/.claude/plugins/marketplaces/t1/,
while the plugins are cached in ~/.claude/plugins/cache/t1/tdder/.
So to update to a new version of the plugin, you'll have to do this:
cd ~/.claude/plugins/marketplaces/t1/ && git pull && rm -r ~/.claude/plugins/cache/t1/tdder/ && cd -
tdder updates automatically when you restart OpenCode.
To add a new language or build system, create skills/<name>/SKILL.md with the relevant conventions
(testing framework, naming, commands, etc.).
The skill triggers automatically when working in projects with matching files.
.claude/
.claude-plugin/
marketplace.json
plugin.json
settings.json
tdder.local.md
.gitignore
.opencode/
agents/
clean-code-reviewer.md
plugins/
tdder.js
agents/
AGENTS.md
clean-code-reviewer.md
unfolding-api-designer.md
unfolding-architect.md
unfolding-coder.md
unfolding-po.md
unfolding-ui-expert.md
unfolding-ux-designer.md
CLAUDE.md
commands/
pmw.md
unfold.md
docs/
adr/
0001-agentic-coding-client.md
images/
pi-maven.png
extensions/
AGENTS.md
hygiene/
index.ts
package.json
test/
skill-reminders.test.ts
idea/
AGENTS.md
decisions/
debugger.md
e2e-testing.md
mcp-indexing.md
mcp-probing.md
search-symbol.md
idea-client.ts
index.ts
package-lock.json
package.json
README.md
render-helpers.ts
sse-parser.ts
sse-transport.ts
test/
e2e/
idea.e2e.ts
idea-client.test.ts
mcp-client.test.ts
render-helpers.test.ts
sse-parser.test.ts
sse-transport.test.ts
tool-specs.test.ts
tool-specs.ts
tsconfig.json
vitest.e2e.config.ts
jdtls/
code-action.ts
diagnostics-collector.ts
index.ts
jdtls-server.ts
lsp-format.ts
lsp-transport.ts
package-lock.json
package.json
README.md
test/
code-action.test.ts
diagnostics-collector.test.ts
index-activation.test.ts
jdtls-server-crash.test.ts
jdtls-server.test.ts
lsp-format.test.ts
lsp-transport.test.ts
workspace-edit.test.ts
tsconfig.json
workspace-edit.ts
maven/
.npmignore
cli
cli.ts
formatter.ts
guidance.ts
index.ts
jar-skills.ts
java-version-lookup.ts
log-store.ts
maven-project.ts
maven-run.ts
package-lock.json
package.json
progress-widget.ts
project-info.ts
README.md
renderer.ts
report-collector.ts
report-parser.ts
run-result-renderer.ts
test/
cli-unknown-flags.test.ts
fixtures/
console-output/
build-setup-failure.txt
compilation-failure.txt
dependency-resolution-failure.txt
test-failure-incomplete-report.txt
metadata/
assertj-core.xml
latest-is-rc.xml
latest-is-snapshot.xml
no-release-element.xml
projects/
cucumber/
expected-reports/
TEST-com.example.RunCucumberTest.xml
pom.xml
src/
test/
java/
com/
example/
RunCucumberTest.java
StepDefinitions.java
resources/
com/
example/
sample.feature
flat-multi-module/
module-a/
pom.xml
module-b/
pom.xml
pom.xml
junit-java/
expected-reports/
TEST-com.example.SampleTest.xml
TEST-com.example.SampleTest$InnerContext.xml
pom.xml
src/
test/
java/
com/
example/
SampleTest.java
junit-kotlin/
expected-reports/
TEST-com.example.SampleTest.xml
TEST-com.example.SampleTest$inner context.xml
TEST-RootPackageTest.xml
pom.xml
src/
test/
kotlin/
com/
example/
SampleTest.kt
RootPackageTest.kt
label-cases/
custom-artifactid/
pom.xml
different-group/
pom.xml
different-version/
pom.xml
pom.xml
nested-multi-module/
pom.xml
services/
pom.xml
service-a/
pom.xml
single-module/
pom.xml
with-wrapper/
mvnw
pom.xml
reports/
TEST-error.xml
TEST-failing.xml
TEST-IT-passing.xml
TEST-nested-kotlin.xml
TEST-no-tests.xml
TEST-passing.xml
jar-skills.test.ts
log-store.test.ts
maven-run-command.test.ts
offline-fallback.test.ts
pi-integration.test.ts
progress-widget.test.ts
project-info.test.ts
renderer.test.ts
report-collector.test.ts
report-parser.test.ts
run-result-limit.test.ts
run-result-renderer.test.ts
surefire-report-format.test.ts
version-lookup.test.ts
tool-types.ts
tsconfig.json
version-lookup.ts
mlx/
index.ts
package-lock.json
package.json
plan.md
README.md
test/
index.test.ts
tsconfig.json
quarkus/
bootstrap.ts
index.ts
mcp-client.ts
package.json
README.md
supported-jdk.ts
test/
bootstrap.test.ts
call-direct-signal.test.ts
crash-startup-output.test.ts
ensure-client.test.ts
filter-log-since.test.ts
footer-multi-instance.test.ts
instance-targeting.test.ts
manual-lifecycle-awareness.test.ts
mcp-client-close-listener.test.ts
mcp-restart-cache-evict.test.ts
missing-tool-warning.test.ts
quarkus-1-0-12.test.ts
quarkus-1-0-13.test.ts
quarkus-1-1-0.test.ts
registered-set.test.ts
stop-multi-module.test.ts
supported-jdk.test.ts
test-subcommands.test.ts
vendor-yaml.test.ts
utils.ts
shared/
context-filter.test.ts
context-filter.ts
duration-format.test.ts
duration-format.ts
jsonrpc-session.test.ts
jsonrpc-session.ts
maven-project-tree.ts
maven-version-lookup.ts
mcp-client.test.ts
mcp-client.ts
package-lock.json
package.json
quarkus-project.ts
spawn-safe.ts
tool-activation.test.ts
tool-activation.ts
tsconfig.json
unfolding/
abort-flow.ts
ask-sensei.ts
child-output.ts
child-task-tools.ts
connect-session.ts
cost-ledger.ts
debug-export.ts
delegation-policy.ts
display-only.ts
fatal-error.ts
git-task-state.ts
index.ts
package.json
README.md
roles/
api-designer.md
architect.md
clean-code-reviewer.md
coder.md
po.md
ui-expert.md
ux-designer.md
session-common.ts
session-factory.ts
session-restore.ts
task-delegate-tool.ts
task-delegate.ts
task-resume.ts
task-store.ts
task-summary.ts
task-tools.ts
test/
abort-flow.test.ts
checkpoint-recovery-delivery.test.ts
checkpoint-recovery-retry.test.ts
child-commissioner.test.ts
connect-session.test.ts
cost-ledger.test.ts
faux-provider.ts
git-task-state.test.ts
index-tools.test.ts
integration.test.ts
real-unfold.integration.test.ts
rpc-faux-provider.ts
session-factory.test.ts
src-helpers.ts
task-delegate.test.ts
task-resume.test.ts
task-store.test.ts
task-tools.test.ts
test-git-repo.ts
test-temp.ts
tool-wiring.test.ts
unfold-command.test.ts
unfold-helpers.ts
hooks/
hooks.json
LICENSE
package-lock.json
package.json
README.md
renovate.json
scripts/
shared.ts
sync-extensions.sh
sync-root-deps.ts
skills/
app/
SKILL.md
clean-code/
checklist.md
SKILL.md
github-safety/
SKILL.md
grill-po/
bounded-context-format.md
dmd-format.md
SKILL.md
integration-architecture/
SKILL.md
java/
SKILL.md
maven/
claude.md
pi.md
SKILL.md
nested-fixture-pattern/
SKILL.md
project-hygiene/
SKILL.md
prove-me-wrong/
SKILL.md
quarkus/
dev-mode.md
SKILL.md
tdd/
failure-modes.md
SKILL.md
unfolding-architecture/
decision-checklist.md
SKILL.md
unfolding-orchestrator/
claude.md
pi.md
SKILL.md
unfolding-specs-overview.mdΒ© 2026 Flowy Β· Free and open source
Built for Claude Code Β· Not affiliated with Anthropic
task_listtask_read