TDD Guard grew into Probity: the same TDD enforcement, now for Claude Code, Codex, and GitHub Copilot CLI, with more reliable validation and no test reporters to set up. New projects should start there.
> /plugin marketplace add nizos/tdd-guard> /plugin install tdd-guard@tdd-guard
Repo: nizos/tdd-guard
What's inside
[!IMPORTANT] TDD Guard grew into Probity: the same TDD enforcement, now for Claude Code, Codex, and GitHub Copilot CLI, with more reliable validation and no test reporters to set up. New projects should start there. TDD Guard remains maintained for the projects that rely on it.
Automated Test-Driven Development enforcement for Claude Code.
TDD Guard ensures Claude Code follows Test-Driven Development principles. When your agent tries to skip tests or over-implement, TDD Guard blocks the action and explains what needs to happen instead.
Open Claude Code in your project and run:
/plugin marketplace add nizos/tdd-guard/plugin install tdd-guard@tdd-guard/tdd-guard:setupThis adds the marketplace, installs the plugin, and configures the test reporter for your project. You may need to restart your terminal session or IDE extension for the setup skill to appear. For manual installation and configuration, see the installation guide.
TDD Guard hooks run with your user permissions. We maintain automated security scanning, dependency audits, and welcome source code review. See Claude Code's security considerations for more on hook safety.
Contributions are welcome! See the contributing guidelines to get started.
Contributors:
.claude-plugin/
marketplace.json
.claudeignore
.commitlintrc.json
.devcontainer/
devcontainer.json
Dockerfile
README.md
scripts/
init-firewall.sh
setup-dev-environment.sh
.env.example
.github/
workflows/
ci.yml
security.yml
.gitignore
.husky/
commit-msg
pre-commit
.npmignore
.prettierignore
.prettierrc
CLAUDE.md
CONTRIBUTING.md
DEVELOPMENT.md
docs/
adr/
001-claude-session-subdirectory.md
002-secure-claude-binary-path.md
003-remove-configurable-data-directory.md
004-monorepo-architecture.md
005-claude-project-dir-support.md
006-phpunit-separate-repository.md
007-golangci-lint-path-support.md
008-storybook-reporter-design.md
009-relax-reporter-project-root-validation.md
010-standardize-project-root-env-var.md
assets/
tdd-guard-demo.gif
config-migration.md
configuration.md
custom-instructions.md
enforcement.md
ignore-patterns.md
installation.md
linting.md
quick-commands.md
session-management.md
storybook-vitest-addon.md
validation-model.md
eslint.config.mjs
LICENSE
package-lock.json
package.json
plugin/
.claude-plugin/
plugin.json
hooks/
hooks.json
LICENSE
README.md
skills/
setup/
SKILL.md
README.md
reporters/
go/
cmd/
tdd-guard-go/
main_test.go
main.go
go.mod
go.sum
internal/
formatter/
formatter_test.go
formatter.go
io/
tee_reader_test.go
tee_reader.go
parser/
mixed_reader_test.go
mixed_reader.go
parser_test.go
parser.go
storage/
storage_test.go
storage.go
transformer/
transformer_test.go
transformer.go
README.md
jest/
.npmignore
package.json
README.md
src/
index.ts
JestReporter.test-data.ts
JestReporter.test.ts
JestReporter.ts
types.ts
tsconfig.json
junit5/
.gitignore
build.gradle.kts
gradle/
wrapper/
gradle-wrapper.jar
gradle-wrapper.properties
gradlew
gradlew.bat
README.md
settings.gradle.kts
src/
main/
java/
io/
github/
nizos/
tddguard/
junit5/
CompilationErrorHandler.java
model/
TestCase.java
TestError.java
TestModule.java
TestResult.java
UnhandledError.java
ProjectRootResolver.java
StackFilter.java
TddGuardListener.java
TddGuardPlugin.java
TestJsonReader.java
TestJsonWriter.java
TestResultCollector.java
resources/
META-INF/
services/
org.junit.platform.launcher.TestExecutionListener
test/
java/
io/
github/
nizos/
tddguard/
junit5/
CompilationErrorHandlerTest.java
fixtures/
AbortedContainerFixture.java
AfterAllFailingFixture.java
DisabledClassFixture.java
DynamicTestsFixture.java
TwoTestsFixture.java
LauncherIntegrationTest.java
ProjectRootResolverTest.java
StackFilterTest.java
TddGuardListenerTest.java
TddGuardPluginTest.java
TestJsonReaderTest.java
TestJsonWriterTest.java
TestResultCollectorTest.java
UnhandledErrorsIntegrationTest.java
minitest/
.gitignore
Gemfile
lib/
minitest/
tdd_guard_plugin.rb
tdd_guard_minitest/
autorun.rb
reporter.rb
README.md
spec/
helpers.rb
load_error_integration_spec.rb
reporter_spec.rb
spec_helper.rb
unhandled_errors_integration_spec.rb
tdd_guard_minitest.gemspec
phpunit/
.gitignore
.php-cs-fixer.php
composer.json
phpunit.xml.dist
psalm.xml
README.md
src/
Event/
ErroredTestSubscriber.php
FailedTestSubscriber.php
IncompleteTestSubscriber.php
PassedTestSubscriber.php
SkippedTestSubscriber.php
TestRunnerFinishedSubscriber.php
PathValidator.php
Storage.php
TddGuardExtension.php
TddGuardListener.php
TddGuardSubscriber.php
TestResultCollector.php
SYNC_README.md
tests/
PathValidatorTest.php
TddGuardExtensionFailedTest.php
TddGuardExtensionTest.php
TddGuardStorageLocationTest.php
TestResultCollectorTest.php
pytest/
pyproject.toml
pytest.ini.example
README.md
tdd_guard_pytest/
__init__.py
pytest_reporter.py
tests/
__init__.py
conftest.py
helpers.py
test_config_option.py
test_path_validation.py
test_plugin_config.py
test_project_root.py
test_pytest_reporter.py
rspec/
.gitignore
Gemfile
lib/
tdd_guard_rspec/
formatter.rb
README.md
spec/
formatter_spec.rb
helpers.rb
interrupted_integration_spec.rb
spec_helper.rb
unhandled_errors_integration_spec.rb
tdd_guard_rspec.gemspec
rust/
Cargo.lock
Cargo.toml
Makefile.example
README.md
src/
error_parser.rs
main.rs
parser.rs
transformer.rs
storybook/
package.json
README.md
src/
index.ts
StorybookReporter.test-data.ts
StorybookReporter.test.ts
StorybookReporter.ts
types.ts
tsconfig.json
test/
artifacts/
go/
failing/
go.mod
single_failing_test.go
import/
go.mod
single_import_error_test.go
passing/
go.mod
single_passing_test.go
jest/
single-failing.test.js
single-import-error.test.js
single-passing.test.js
junit5/
failing/
build.gradle.kts
settings.gradle.kts
src/
test/
java/
SingleFailingTest.java
import/
build.gradle.kts
settings.gradle.kts
src/
test/
java/
SingleImportErrorTest.java
passing/
build.gradle.kts
settings.gradle.kts
src/
test/
java/
SinglePassingTest.java
minitest/
after_run_error_test.rb
single_failing_test.rb
single_import_error_test.rb
single_passing_test.rb
phpunit/
SingleFailingTest.php
SingleImportErrorTest.php
SinglePassingTest.php
pytest/
test_single_failing.py
test_single_import_error.py
test_single_passing.py
rspec/
single_failing_spec.rb
single_import_error_spec.rb
single_passing_spec.rb
rust/
failing/
Cargo.lock
Cargo.toml
src/
lib.rs
import/
Cargo.lock
Cargo.toml
src/
lib.rs
passing/
Cargo.lock
Cargo.toml
src/
lib.rs
storybook/
Calculator.js
single-failing.stories.js
single-import-error.stories.js
single-passing.stories.js
vitest/
single-failing.test.js
single-import-error.test.js
single-passing.test.js
factories/
go.ts
helpers.ts
index.ts
jest.ts
junit5.ts
minitest.ts
phpunit.ts
pytest.ts
rspec.ts
rust.ts
storybook.ts
vitest.ts
reporters.integration.test.ts
types.ts
vitest/
.npmignore
package.json
README.md
src/
index.ts
types.ts
VitestReporter.test-data.ts
VitestReporter.test.ts
VitestReporter.ts
tsconfig.json
src/
cli/
buildContext.test.ts
buildContext.ts
tdd-guard.test.ts
tdd-guard.ts
config/
Config.test.ts
Config.ts
contracts/
schemas/
guardSchemas.test.ts
guardSchemas.ts
lintSchemas.test.ts
lintSchemas.ts
pytestSchemas.test.ts
pytestSchemas.ts
reporterSchemas.test.ts
reporterSchemas.ts
toolSchemas.test.ts
toolSchemas.ts
types/
ClientType.ts
ConfigOptions.ts
Context.ts
ModelClient.ts
ValidationResult.ts
validationResults.test.ts
validationResults.ts
guard/
GuardManager.test.ts
GuardManager.ts
hooks/
fileTypeDetection.ts
HookEvents.test.ts
... 131 moreFAQ
tdd-guard is a Claude Code plugin with 1 hand-picked skill for testing work, indexed on Flowy. Install it with the command on its page. It includes setup. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.