xtrm-tools 2.3.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +132 -111
- package/cli/dist/index.cjs +142 -53
- package/cli/dist/index.cjs.map +1 -1
- package/cli/package.json +1 -1
- package/config/pi/extensions/beads.ts +24 -0
- package/hooks/beads-gate-core.mjs +6 -4
- package/hooks/beads-memory-gate.mjs +12 -5
- package/hooks/hooks.json +126 -0
- package/package.json +3 -1
- package/skills/test-planning/SKILL.md +208 -0
- package/skills/test-planning/evals/evals.json +23 -0
- package/skills/using-xtrm/SKILL.md +5 -27
- package/project-skills/tdd-guard/.claude/hooks/tdd-guard-pretool-bridge.cjs +0 -103
- package/project-skills/tdd-guard/.claude/settings.json +0 -38
- package/project-skills/tdd-guard/.claude/skills/using-tdd-guard/SKILL.md +0 -79
- package/project-skills/tdd-guard/CLAUDE.md +0 -98
- package/project-skills/tdd-guard/CONTRIBUTING.md +0 -38
- package/project-skills/tdd-guard/DEVELOPMENT.md +0 -127
- package/project-skills/tdd-guard/LICENSE +0 -21
- package/project-skills/tdd-guard/README.md +0 -398
- package/project-skills/tdd-guard/docs/adr/001-claude-session-subdirectory.md +0 -52
- package/project-skills/tdd-guard/docs/adr/002-secure-claude-binary-path.md +0 -56
- package/project-skills/tdd-guard/docs/adr/003-remove-configurable-data-directory.md +0 -56
- package/project-skills/tdd-guard/docs/adr/004-monorepo-architecture.md +0 -64
- package/project-skills/tdd-guard/docs/adr/005-claude-project-dir-support.md +0 -55
- package/project-skills/tdd-guard/docs/adr/006-phpunit-separate-repository.md +0 -93
- package/project-skills/tdd-guard/docs/adr/007-golangci-lint-path-support.md +0 -83
- package/project-skills/tdd-guard/docs/adr/008-storybook-reporter-design.md +0 -182
- package/project-skills/tdd-guard/docs/assets/tdd-guard-demo-screenshot.gif +0 -0
- package/project-skills/tdd-guard/docs/config-migration.md +0 -143
- package/project-skills/tdd-guard/docs/configuration.md +0 -137
- package/project-skills/tdd-guard/docs/custom-instructions.md +0 -43
- package/project-skills/tdd-guard/docs/enforcement.md +0 -46
- package/project-skills/tdd-guard/docs/ignore-patterns.md +0 -81
- package/project-skills/tdd-guard/docs/linting.md +0 -109
- package/project-skills/tdd-guard/docs/quick-commands.md +0 -52
- package/project-skills/tdd-guard/docs/session-management.md +0 -75
- package/project-skills/tdd-guard/docs/storybook-vitest-addon.md +0 -120
- package/project-skills/tdd-guard/docs/validation-model.md +0 -63
- package/project-skills/tdd-guard/eslint.config.mjs +0 -140
- package/project-skills/tdd-guard/package-lock.json +0 -16937
- package/project-skills/tdd-guard/package.json +0 -102
- package/project-skills/tdd-guard/reporters/go/README.md +0 -67
- package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main.go +0 -127
- package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main_test.go +0 -280
- package/project-skills/tdd-guard/reporters/go/go.mod +0 -3
- package/project-skills/tdd-guard/reporters/go/go.sum +0 -0
- package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter.go +0 -126
- package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter_test.go +0 -264
- package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader.go +0 -26
- package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader_test.go +0 -37
- package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader.go +0 -94
- package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader_test.go +0 -198
- package/project-skills/tdd-guard/reporters/go/internal/parser/parser.go +0 -245
- package/project-skills/tdd-guard/reporters/go/internal/parser/parser_test.go +0 -547
- package/project-skills/tdd-guard/reporters/go/internal/storage/storage.go +0 -35
- package/project-skills/tdd-guard/reporters/go/internal/storage/storage_test.go +0 -113
- package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer.go +0 -103
- package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer_test.go +0 -303
- package/project-skills/tdd-guard/reporters/jest/README.md +0 -102
- package/project-skills/tdd-guard/reporters/jest/package.json +0 -38
- package/project-skills/tdd-guard/reporters/jest/src/JestReporter.test-data.ts +0 -199
- package/project-skills/tdd-guard/reporters/jest/src/JestReporter.test.ts +0 -302
- package/project-skills/tdd-guard/reporters/jest/src/JestReporter.ts +0 -201
- package/project-skills/tdd-guard/reporters/jest/src/index.ts +0 -4
- package/project-skills/tdd-guard/reporters/jest/src/types.ts +0 -42
- package/project-skills/tdd-guard/reporters/jest/tsconfig.json +0 -11
- package/project-skills/tdd-guard/reporters/phpunit/.php-cs-fixer.php +0 -28
- package/project-skills/tdd-guard/reporters/phpunit/README.md +0 -97
- package/project-skills/tdd-guard/reporters/phpunit/SYNC_README.md +0 -29
- package/project-skills/tdd-guard/reporters/phpunit/composer.json +0 -55
- package/project-skills/tdd-guard/reporters/phpunit/phpunit.xml.dist +0 -19
- package/project-skills/tdd-guard/reporters/phpunit/psalm.xml +0 -44
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/ErroredTestSubscriber.php +0 -28
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/FailedTestSubscriber.php +0 -28
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/IncompleteTestSubscriber.php +0 -28
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/PassedTestSubscriber.php +0 -27
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/SkippedTestSubscriber.php +0 -28
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/TestRunnerFinishedSubscriber.php +0 -24
- package/project-skills/tdd-guard/reporters/phpunit/src/PathValidator.php +0 -88
- package/project-skills/tdd-guard/reporters/phpunit/src/Storage.php +0 -26
- package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardExtension.php +0 -33
- package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardListener.php +0 -158
- package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardSubscriber.php +0 -35
- package/project-skills/tdd-guard/reporters/phpunit/src/TestResultCollector.php +0 -105
- package/project-skills/tdd-guard/reporters/phpunit/tests/PathValidatorTest.php +0 -74
- package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionFailedTest.php +0 -241
- package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionTest.php +0 -84
- package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardStorageLocationTest.php +0 -71
- package/project-skills/tdd-guard/reporters/pytest/README.md +0 -77
- package/project-skills/tdd-guard/reporters/pytest/pyproject.toml +0 -43
- package/project-skills/tdd-guard/reporters/pytest/pytest.ini.example +0 -7
- package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/__init__.py +0 -1
- package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/pytest_reporter.py +0 -134
- package/project-skills/tdd-guard/reporters/pytest/tests/__init__.py +0 -1
- package/project-skills/tdd-guard/reporters/pytest/tests/conftest.py +0 -3
- package/project-skills/tdd-guard/reporters/pytest/tests/helpers.py +0 -293
- package/project-skills/tdd-guard/reporters/pytest/tests/test_config_option.py +0 -38
- package/project-skills/tdd-guard/reporters/pytest/tests/test_path_validation.py +0 -59
- package/project-skills/tdd-guard/reporters/pytest/tests/test_plugin_config.py +0 -32
- package/project-skills/tdd-guard/reporters/pytest/tests/test_project_root.py +0 -296
- package/project-skills/tdd-guard/reporters/pytest/tests/test_pytest_reporter.py +0 -137
- package/project-skills/tdd-guard/reporters/rspec/Gemfile +0 -3
- package/project-skills/tdd-guard/reporters/rust/Cargo.lock +0 -458
- package/project-skills/tdd-guard/reporters/rust/Cargo.toml +0 -33
- package/project-skills/tdd-guard/reporters/rust/Makefile.example +0 -95
- package/project-skills/tdd-guard/reporters/rust/README.md +0 -88
- package/project-skills/tdd-guard/reporters/rust/src/error_parser.rs +0 -309
- package/project-skills/tdd-guard/reporters/rust/src/main.rs +0 -464
- package/project-skills/tdd-guard/reporters/rust/src/parser.rs +0 -225
- package/project-skills/tdd-guard/reporters/rust/src/transformer.rs +0 -409
- package/project-skills/tdd-guard/reporters/storybook/README.md +0 -108
- package/project-skills/tdd-guard/reporters/storybook/package-lock.json +0 -9482
- package/project-skills/tdd-guard/reporters/storybook/package.json +0 -43
- package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test-data.ts +0 -22
- package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test.ts +0 -190
- package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.ts +0 -88
- package/project-skills/tdd-guard/reporters/storybook/src/index.ts +0 -12
- package/project-skills/tdd-guard/reporters/storybook/src/types.ts +0 -37
- package/project-skills/tdd-guard/reporters/storybook/tsconfig.json +0 -11
- package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/go.mod +0 -3
- package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/single_failing_test.go +0 -13
- package/project-skills/tdd-guard/reporters/test/artifacts/go/import/go.mod +0 -3
- package/project-skills/tdd-guard/reporters/test/artifacts/go/import/single_import_error_test.go +0 -17
- package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/go.mod +0 -3
- package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/single_passing_test.go +0 -13
- package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-failing.test.js +0 -5
- package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-import-error.test.js +0 -8
- package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-passing.test.js +0 -5
- package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleFailingTest.php +0 -11
- package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleImportErrorTest.php +0 -14
- package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SinglePassingTest.php +0 -11
- package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_failing.py +0 -3
- package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_import_error.py +0 -6
- package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_passing.py +0 -3
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.lock +0 -7
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.toml +0 -4
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/src/lib.rs +0 -14
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.lock +0 -7
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.toml +0 -4
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/src/lib.rs +0 -13
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.lock +0 -7
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.toml +0 -4
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/src/lib.rs +0 -14
- package/project-skills/tdd-guard/reporters/test/artifacts/storybook/Calculator.js +0 -4
- package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-failing.stories.js +0 -15
- package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-import-error.stories.js +0 -14
- package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-passing.stories.js +0 -15
- package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-failing.test.js +0 -7
- package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-import-error.test.js +0 -9
- package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-passing.test.js +0 -7
- package/project-skills/tdd-guard/reporters/test/factories/go.ts +0 -59
- package/project-skills/tdd-guard/reporters/test/factories/helpers.ts +0 -48
- package/project-skills/tdd-guard/reporters/test/factories/index.ts +0 -7
- package/project-skills/tdd-guard/reporters/test/factories/jest.ts +0 -51
- package/project-skills/tdd-guard/reporters/test/factories/phpunit.ts +0 -63
- package/project-skills/tdd-guard/reporters/test/factories/pytest.ts +0 -41
- package/project-skills/tdd-guard/reporters/test/factories/rust.ts +0 -158
- package/project-skills/tdd-guard/reporters/test/factories/storybook.ts +0 -198
- package/project-skills/tdd-guard/reporters/test/factories/vitest.ts +0 -51
- package/project-skills/tdd-guard/reporters/test/reporters.integration.test.ts +0 -735
- package/project-skills/tdd-guard/reporters/test/types.ts +0 -28
- package/project-skills/tdd-guard/reporters/vitest/README.md +0 -64
- package/project-skills/tdd-guard/reporters/vitest/package.json +0 -35
- package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.test-data.ts +0 -85
- package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.test.ts +0 -446
- package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.ts +0 -110
- package/project-skills/tdd-guard/reporters/vitest/src/index.ts +0 -4
- package/project-skills/tdd-guard/reporters/vitest/src/types.ts +0 -39
- package/project-skills/tdd-guard/reporters/vitest/tsconfig.json +0 -11
- package/project-skills/tdd-guard/src/cli/buildContext.test.ts +0 -200
- package/project-skills/tdd-guard/src/cli/buildContext.ts +0 -48
- package/project-skills/tdd-guard/src/cli/tdd-guard.test.ts +0 -159
- package/project-skills/tdd-guard/src/cli/tdd-guard.ts +0 -48
- package/project-skills/tdd-guard/src/config/Config.test.ts +0 -538
- package/project-skills/tdd-guard/src/config/Config.ts +0 -172
- package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.test.ts +0 -58
- package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.ts +0 -8
- package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.test.ts +0 -347
- package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.ts +0 -61
- package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.test.ts +0 -24
- package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.ts +0 -7
- package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.test.ts +0 -377
- package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.ts +0 -75
- package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.test.ts +0 -563
- package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.ts +0 -140
- package/project-skills/tdd-guard/src/contracts/types/ClientType.ts +0 -1
- package/project-skills/tdd-guard/src/contracts/types/ConfigOptions.ts +0 -12
- package/project-skills/tdd-guard/src/contracts/types/Context.ts +0 -16
- package/project-skills/tdd-guard/src/contracts/types/ModelClient.ts +0 -3
- package/project-skills/tdd-guard/src/contracts/types/ValidationResult.ts +0 -6
- package/project-skills/tdd-guard/src/guard/GuardManager.test.ts +0 -336
- package/project-skills/tdd-guard/src/guard/GuardManager.ts +0 -83
- package/project-skills/tdd-guard/src/hooks/HookEvents.test.ts +0 -107
- package/project-skills/tdd-guard/src/hooks/HookEvents.ts +0 -39
- package/project-skills/tdd-guard/src/hooks/fileTypeDetection.ts +0 -16
- package/project-skills/tdd-guard/src/hooks/postToolLint.test.ts +0 -327
- package/project-skills/tdd-guard/src/hooks/postToolLint.ts +0 -165
- package/project-skills/tdd-guard/src/hooks/processHookData.test.ts +0 -465
- package/project-skills/tdd-guard/src/hooks/processHookData.ts +0 -203
- package/project-skills/tdd-guard/src/hooks/sessionHandler.test.ts +0 -136
- package/project-skills/tdd-guard/src/hooks/sessionHandler.ts +0 -31
- package/project-skills/tdd-guard/src/hooks/userPromptHandler.test.ts +0 -131
- package/project-skills/tdd-guard/src/hooks/userPromptHandler.ts +0 -55
- package/project-skills/tdd-guard/src/index.ts +0 -19
- package/project-skills/tdd-guard/src/linters/Linter.ts +0 -5
- package/project-skills/tdd-guard/src/linters/eslint/ESLint.test.ts +0 -183
- package/project-skills/tdd-guard/src/linters/eslint/ESLint.ts +0 -82
- package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.test.ts +0 -170
- package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.ts +0 -148
- package/project-skills/tdd-guard/src/processors/index.ts +0 -1
- package/project-skills/tdd-guard/src/processors/lintProcessor.ts +0 -77
- package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.test.ts +0 -303
- package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.ts +0 -255
- package/project-skills/tdd-guard/src/providers/LinterProvider.test.ts +0 -43
- package/project-skills/tdd-guard/src/providers/LinterProvider.ts +0 -20
- package/project-skills/tdd-guard/src/providers/ModelClientProvider.test.ts +0 -68
- package/project-skills/tdd-guard/src/providers/ModelClientProvider.ts +0 -22
- package/project-skills/tdd-guard/src/storage/FileStorage.test.ts +0 -76
- package/project-skills/tdd-guard/src/storage/FileStorage.ts +0 -108
- package/project-skills/tdd-guard/src/storage/MemoryStorage.ts +0 -57
- package/project-skills/tdd-guard/src/storage/Storage.test.ts +0 -227
- package/project-skills/tdd-guard/src/storage/Storage.ts +0 -17
- package/project-skills/tdd-guard/src/validation/context/context.test.ts +0 -364
- package/project-skills/tdd-guard/src/validation/context/context.ts +0 -155
- package/project-skills/tdd-guard/src/validation/models/AnthropicApi.test.ts +0 -171
- package/project-skills/tdd-guard/src/validation/models/AnthropicApi.ts +0 -49
- package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.test.ts +0 -167
- package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.ts +0 -54
- package/project-skills/tdd-guard/src/validation/models/ClaudeCli.test.ts +0 -239
- package/project-skills/tdd-guard/src/validation/models/ClaudeCli.ts +0 -57
- package/project-skills/tdd-guard/src/validation/prompts/file-types.ts +0 -52
- package/project-skills/tdd-guard/src/validation/prompts/operations/edit.ts +0 -58
- package/project-skills/tdd-guard/src/validation/prompts/operations/multi-edit.ts +0 -54
- package/project-skills/tdd-guard/src/validation/prompts/operations/write.ts +0 -54
- package/project-skills/tdd-guard/src/validation/prompts/response.ts +0 -40
- package/project-skills/tdd-guard/src/validation/prompts/rules.ts +0 -51
- package/project-skills/tdd-guard/src/validation/prompts/system-prompt.ts +0 -10
- package/project-skills/tdd-guard/src/validation/prompts/tools/lint-results.ts +0 -15
- package/project-skills/tdd-guard/src/validation/prompts/tools/test-output.ts +0 -14
- package/project-skills/tdd-guard/src/validation/prompts/tools/todos.ts +0 -9
- package/project-skills/tdd-guard/src/validation/validator.test.ts +0 -268
- package/project-skills/tdd-guard/src/validation/validator.ts +0 -159
- package/project-skills/tdd-guard/test/artifacts/go/.golangci.yml +0 -6
- package/project-skills/tdd-guard/test/artifacts/go/with-issues/file-with-issues.go +0 -12
- package/project-skills/tdd-guard/test/artifacts/go/with-issues/go.mod +0 -3
- package/project-skills/tdd-guard/test/artifacts/go/without-issues/file-without-issues.go +0 -7
- package/project-skills/tdd-guard/test/artifacts/go/without-issues/go.mod +0 -3
- package/project-skills/tdd-guard/test/artifacts/javascript/eslint.config.js +0 -20
- package/project-skills/tdd-guard/test/artifacts/javascript/file-with-issues.js +0 -12
- package/project-skills/tdd-guard/test/artifacts/javascript/file-without-issues.js +0 -10
- package/project-skills/tdd-guard/test/hooks/fileTypeDetection.test.ts +0 -26
- package/project-skills/tdd-guard/test/hooks/processHookData.fileType.test.ts +0 -46
- package/project-skills/tdd-guard/test/hooks/processHookData.python.test.ts +0 -68
- package/project-skills/tdd-guard/test/integration/test-context.test.ts +0 -66
- package/project-skills/tdd-guard/test/integration/validator.core.test.ts +0 -96
- package/project-skills/tdd-guard/test/integration/validator.scenarios.test.ts +0 -497
- package/project-skills/tdd-guard/test/utils/assertions.ts +0 -29
- package/project-skills/tdd-guard/test/utils/factories/contextFactory.ts +0 -30
- package/project-skills/tdd-guard/test/utils/factories/editFactory.ts +0 -82
- package/project-skills/tdd-guard/test/utils/factories/helpers.test.ts +0 -46
- package/project-skills/tdd-guard/test/utils/factories/helpers.ts +0 -46
- package/project-skills/tdd-guard/test/utils/factories/lintFactory.ts +0 -352
- package/project-skills/tdd-guard/test/utils/factories/modelClientProviderFactory.ts +0 -21
- package/project-skills/tdd-guard/test/utils/factories/multiEditFactory.ts +0 -79
- package/project-skills/tdd-guard/test/utils/factories/operations.ts +0 -57
- package/project-skills/tdd-guard/test/utils/factories/reporterFactory.ts +0 -55
- package/project-skills/tdd-guard/test/utils/factories/scenarios/index.ts +0 -22
- package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/python.ts +0 -745
- package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/typescript.ts +0 -767
- package/project-skills/tdd-guard/test/utils/factories/scenarios/types.ts +0 -77
- package/project-skills/tdd-guard/test/utils/factories/scenarios/utils.ts +0 -15
- package/project-skills/tdd-guard/test/utils/factories/sessionStartFactory.ts +0 -36
- package/project-skills/tdd-guard/test/utils/factories/testDefaults.ts +0 -90
- package/project-skills/tdd-guard/test/utils/factories/testResultsFactory.ts +0 -234
- package/project-skills/tdd-guard/test/utils/factories/todoFactory.ts +0 -99
- package/project-skills/tdd-guard/test/utils/factories/userPromptSubmitFactory.ts +0 -39
- package/project-skills/tdd-guard/test/utils/factories/writeFactory.ts +0 -70
- package/project-skills/tdd-guard/test/utils/index.ts +0 -131
- package/project-skills/tdd-guard/tsconfig.build.json +0 -16
- package/project-skills/tdd-guard/tsconfig.eslint.json +0 -17
- package/project-skills/tdd-guard/tsconfig.json +0 -32
- package/project-skills/tdd-guard/tsconfig.node.json +0 -10
- package/project-skills/tdd-guard/vitest.config.ts +0 -85
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
declare(strict_types=1);
|
|
4
|
-
|
|
5
|
-
namespace TddGuard\PHPUnit\Tests;
|
|
6
|
-
|
|
7
|
-
use PHPUnit\Framework\TestCase;
|
|
8
|
-
use Symfony\Component\Filesystem\Filesystem;
|
|
9
|
-
|
|
10
|
-
final class TddGuardExtensionTest extends TestCase
|
|
11
|
-
{
|
|
12
|
-
private string $tempDir;
|
|
13
|
-
private Filesystem $filesystem;
|
|
14
|
-
|
|
15
|
-
protected function setUp(): void
|
|
16
|
-
{
|
|
17
|
-
$this->filesystem = new Filesystem();
|
|
18
|
-
$this->tempDir = sys_get_temp_dir() . '/tdd-guard-test-' . uniqid();
|
|
19
|
-
$this->filesystem->mkdir($this->tempDir);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
protected function tearDown(): void
|
|
23
|
-
{
|
|
24
|
-
$this->filesystem->remove($this->tempDir);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public function testExtensionCapturesPassingTest(): void
|
|
28
|
-
{
|
|
29
|
-
// Given: A test file that will pass
|
|
30
|
-
$testFile = $this->tempDir . '/ExampleTest.php';
|
|
31
|
-
file_put_contents($testFile, '<?php
|
|
32
|
-
use PHPUnit\Framework\TestCase;
|
|
33
|
-
class ExampleTest extends TestCase {
|
|
34
|
-
public function testPassing(): void {
|
|
35
|
-
$this->assertTrue(true);
|
|
36
|
-
}
|
|
37
|
-
}');
|
|
38
|
-
|
|
39
|
-
$phpunitXml = $this->tempDir . '/phpunit.xml';
|
|
40
|
-
file_put_contents($phpunitXml, '<?xml version="1.0" encoding="UTF-8"?>
|
|
41
|
-
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
42
|
-
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
|
|
43
|
-
bootstrap="' . dirname(__DIR__) . '/vendor/autoload.php">
|
|
44
|
-
<testsuites>
|
|
45
|
-
<testsuite name="Example">
|
|
46
|
-
<file>' . $testFile . '</file>
|
|
47
|
-
</testsuite>
|
|
48
|
-
</testsuites>
|
|
49
|
-
<extensions>
|
|
50
|
-
<bootstrap class="TddGuard\PHPUnit\TddGuardExtension">
|
|
51
|
-
<parameter name="projectRoot" value="' . $this->tempDir . '"/>
|
|
52
|
-
</bootstrap>
|
|
53
|
-
</extensions>
|
|
54
|
-
</phpunit>');
|
|
55
|
-
|
|
56
|
-
// When: We run PHPUnit with our extension
|
|
57
|
-
$command = sprintf(
|
|
58
|
-
'cd %s && php %s/vendor/bin/phpunit -c %s 2>&1',
|
|
59
|
-
escapeshellarg($this->tempDir),
|
|
60
|
-
escapeshellarg(dirname(__DIR__)),
|
|
61
|
-
escapeshellarg($phpunitXml)
|
|
62
|
-
);
|
|
63
|
-
exec($command, $output, $returnCode);
|
|
64
|
-
|
|
65
|
-
// Then: The test should pass and results should be saved
|
|
66
|
-
$this->assertEquals(0, $returnCode, 'PHPUnit should exit with 0. Output: ' . implode("\n", $output));
|
|
67
|
-
$jsonPath = $this->tempDir . '/.claude/tdd-guard/data/test.json';
|
|
68
|
-
$this->assertFileExists($jsonPath);
|
|
69
|
-
$data = json_decode(file_get_contents($jsonPath), true);
|
|
70
|
-
$this->assertArrayHasKey('testModules', $data);
|
|
71
|
-
$this->assertCount(1, $data['testModules']);
|
|
72
|
-
$this->assertArrayHasKey('reason', $data);
|
|
73
|
-
$this->assertEquals('passed', $data['reason']);
|
|
74
|
-
|
|
75
|
-
$module = $data['testModules'][0];
|
|
76
|
-
$this->assertStringContainsString('ExampleTest.php', $module['moduleId']);
|
|
77
|
-
$this->assertCount(1, $module['tests']);
|
|
78
|
-
|
|
79
|
-
$test = $module['tests'][0];
|
|
80
|
-
$this->assertEquals('testPassing', $test['name']);
|
|
81
|
-
$this->assertEquals('ExampleTest::testPassing', $test['fullName']);
|
|
82
|
-
$this->assertEquals('passed', $test['state']);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
declare(strict_types=1);
|
|
4
|
-
|
|
5
|
-
namespace TddGuard\PHPUnit\Tests;
|
|
6
|
-
|
|
7
|
-
use PHPUnit\Framework\TestCase;
|
|
8
|
-
use Symfony\Component\Filesystem\Filesystem;
|
|
9
|
-
use TddGuard\PHPUnit\Storage;
|
|
10
|
-
|
|
11
|
-
final class TddGuardStorageLocationTest extends TestCase
|
|
12
|
-
{
|
|
13
|
-
private string $tempDir;
|
|
14
|
-
private Filesystem $filesystem;
|
|
15
|
-
private string $originalCwd;
|
|
16
|
-
|
|
17
|
-
protected function setUp(): void
|
|
18
|
-
{
|
|
19
|
-
$this->filesystem = new Filesystem();
|
|
20
|
-
$this->tempDir = sys_get_temp_dir() . '/tdd-guard-test-' . uniqid();
|
|
21
|
-
$this->filesystem->mkdir($this->tempDir);
|
|
22
|
-
$this->originalCwd = getcwd();
|
|
23
|
-
chdir($this->tempDir);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
protected function tearDown(): void
|
|
27
|
-
{
|
|
28
|
-
chdir($this->originalCwd);
|
|
29
|
-
$this->filesystem->remove($this->tempDir);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
public function testStorageSavesToCorrectLocation(): void
|
|
33
|
-
{
|
|
34
|
-
// Given: A storage configured with a specific project root
|
|
35
|
-
$storage = new Storage($this->tempDir);
|
|
36
|
-
|
|
37
|
-
// When: We save test results
|
|
38
|
-
$testData = '{"testModules": []}';
|
|
39
|
-
$storage->saveTest($testData);
|
|
40
|
-
|
|
41
|
-
// Then: The file should be saved in the correct TDD Guard location
|
|
42
|
-
$expectedPath = $this->tempDir . '/.claude/tdd-guard/data/test.json';
|
|
43
|
-
$this->assertFileExists($expectedPath);
|
|
44
|
-
$this->assertEquals($testData, file_get_contents($expectedPath));
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
public function testStorageRespectsEnvironmentVariable(): void
|
|
48
|
-
{
|
|
49
|
-
// Given: Environment variable is set
|
|
50
|
-
$originalEnv = getenv('TDD_GUARD_PROJECT_ROOT');
|
|
51
|
-
putenv('TDD_GUARD_PROJECT_ROOT=' . $this->tempDir);
|
|
52
|
-
|
|
53
|
-
try {
|
|
54
|
-
// When: Storage is created without explicit project root
|
|
55
|
-
$storage = new Storage('');
|
|
56
|
-
$testData = '{"testModules": []}';
|
|
57
|
-
$storage->saveTest($testData);
|
|
58
|
-
|
|
59
|
-
// Then: It should use the environment variable location
|
|
60
|
-
$expectedPath = $this->tempDir . '/.claude/tdd-guard/data/test.json';
|
|
61
|
-
$this->assertFileExists($expectedPath);
|
|
62
|
-
|
|
63
|
-
} finally {
|
|
64
|
-
if ($originalEnv !== false) {
|
|
65
|
-
putenv('TDD_GUARD_PROJECT_ROOT=' . $originalEnv);
|
|
66
|
-
} else {
|
|
67
|
-
putenv('TDD_GUARD_PROJECT_ROOT');
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
# TDD Guard Pytest Reporter
|
|
2
|
-
|
|
3
|
-
Pytest plugin that captures test results for TDD Guard validation.
|
|
4
|
-
|
|
5
|
-
## Requirements
|
|
6
|
-
|
|
7
|
-
- Python 3.8+
|
|
8
|
-
- pytest 6.0+
|
|
9
|
-
- [TDD Guard](https://github.com/nizos/tdd-guard) installed globally
|
|
10
|
-
|
|
11
|
-
## Installation
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
pip install tdd-guard-pytest
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
The plugin activates automatically when installed.
|
|
18
|
-
|
|
19
|
-
## Configuration
|
|
20
|
-
|
|
21
|
-
### Project Root Configuration
|
|
22
|
-
|
|
23
|
-
Set `tdd_guard_project_root` to your project root using any ONE of these methods:
|
|
24
|
-
|
|
25
|
-
**Option 1: pyproject.toml**
|
|
26
|
-
|
|
27
|
-
```toml
|
|
28
|
-
[tool.pytest.ini_options]
|
|
29
|
-
tdd_guard_project_root = "/absolute/path/to/project/root"
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
**Option 2: pytest.ini**
|
|
33
|
-
|
|
34
|
-
```ini
|
|
35
|
-
[pytest]
|
|
36
|
-
tdd_guard_project_root = /absolute/path/to/project/root
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**Option 3: setup.cfg**
|
|
40
|
-
|
|
41
|
-
```ini
|
|
42
|
-
[tool:pytest]
|
|
43
|
-
tdd_guard_project_root = /absolute/path/to/project/root
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
### Configuration Rules
|
|
47
|
-
|
|
48
|
-
- Path must be absolute
|
|
49
|
-
- Current directory must be within the configured project root
|
|
50
|
-
- Falls back to current directory if configuration is invalid
|
|
51
|
-
|
|
52
|
-
## Development
|
|
53
|
-
|
|
54
|
-
When developing the pytest reporter, you need to configure the project root to ensure test results are saved to the correct location:
|
|
55
|
-
|
|
56
|
-
1. Copy the example configuration:
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
cp pytest.ini.example pytest.ini
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
2. Edit `pytest.ini` and set the absolute path to your TDD Guard project root:
|
|
63
|
-
```ini
|
|
64
|
-
[pytest]
|
|
65
|
-
tdd_guard_project_root = /absolute/path/to/tdd-guard
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
**Note:** `pytest.ini` is gitignored to avoid committing machine-specific paths.
|
|
69
|
-
|
|
70
|
-
## More Information
|
|
71
|
-
|
|
72
|
-
- Test results are saved to `.claude/tdd-guard/data/test.json`
|
|
73
|
-
- See [TDD Guard documentation](https://github.com/nizos/tdd-guard) for complete setup
|
|
74
|
-
|
|
75
|
-
## License
|
|
76
|
-
|
|
77
|
-
MIT
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
[project]
|
|
2
|
-
name = "tdd-guard-pytest"
|
|
3
|
-
version = "0.1.2"
|
|
4
|
-
description = "Pytest plugin for TDD Guard - enforces Test-Driven Development principles"
|
|
5
|
-
authors = [{name = "Nizar Selander"}, {name = "Durafen"}]
|
|
6
|
-
license = "MIT"
|
|
7
|
-
readme = "README.md"
|
|
8
|
-
keywords = ["tdd", "test-driven-development", "testing", "pytest", "claude"]
|
|
9
|
-
classifiers = [
|
|
10
|
-
"Development Status :: 4 - Beta",
|
|
11
|
-
"Framework :: Pytest",
|
|
12
|
-
"Intended Audience :: Developers",
|
|
13
|
-
"Programming Language :: Python :: 3",
|
|
14
|
-
"Programming Language :: Python :: 3.8",
|
|
15
|
-
"Programming Language :: Python :: 3.9",
|
|
16
|
-
"Programming Language :: Python :: 3.10",
|
|
17
|
-
"Programming Language :: Python :: 3.11",
|
|
18
|
-
"Programming Language :: Python :: 3.12",
|
|
19
|
-
"Programming Language :: Python :: 3.13",
|
|
20
|
-
"Topic :: Software Development :: Testing",
|
|
21
|
-
"Topic :: Software Development :: Quality Assurance",
|
|
22
|
-
]
|
|
23
|
-
requires-python = ">=3.8"
|
|
24
|
-
dependencies = [
|
|
25
|
-
"pytest>=6.0",
|
|
26
|
-
]
|
|
27
|
-
|
|
28
|
-
[project.urls]
|
|
29
|
-
"Homepage" = "https://github.com/nizos/tdd-guard"
|
|
30
|
-
"Repository" = "https://github.com/nizos/tdd-guard"
|
|
31
|
-
"Bug Tracker" = "https://github.com/nizos/tdd-guard/issues"
|
|
32
|
-
"Documentation" = "https://github.com/nizos/tdd-guard/tree/main/reporters/pytest"
|
|
33
|
-
|
|
34
|
-
[project.entry-points."pytest11"]
|
|
35
|
-
tdd-guard = "tdd_guard_pytest.pytest_reporter"
|
|
36
|
-
|
|
37
|
-
[build-system]
|
|
38
|
-
requires = ["setuptools>=45", "wheel"]
|
|
39
|
-
build-backend = "setuptools.build_meta"
|
|
40
|
-
|
|
41
|
-
[tool.pytest.ini_options]
|
|
42
|
-
testpaths = ["tests"]
|
|
43
|
-
python_files = ["test_*.py", "*_test.py"]
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
# Example pytest configuration for TDD Guard development
|
|
2
|
-
# Copy this file to pytest.ini and adjust the path to your project root
|
|
3
|
-
|
|
4
|
-
[pytest]
|
|
5
|
-
# Set this to the absolute path of your tdd-guard project root
|
|
6
|
-
# This ensures test results are saved to the correct location
|
|
7
|
-
tdd_guard_project_root = /path/to/tdd-guard
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"""TDD Guard pytest plugin for capturing test results."""
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
TDD Guard pytest plugin - captures test results for TDD validation.
|
|
3
|
-
|
|
4
|
-
This plugin automatically activates when tdd-guard-pytest is installed.
|
|
5
|
-
No configuration needed - it registers via the pytest11 entry point.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import json
|
|
9
|
-
import os
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
import pytest
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
# Default storage directory relative to project root
|
|
15
|
-
DEFAULT_DATA_DIR = Path('.claude/tdd-guard/data')
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class TDDGuardPytestPlugin:
|
|
19
|
-
"""Pytest plugin that captures test results for TDD Guard"""
|
|
20
|
-
|
|
21
|
-
def __init__(self, config=None, cwd=None):
|
|
22
|
-
self.test_results = []
|
|
23
|
-
self.storage_dir = self._determine_storage_dir(config, cwd)
|
|
24
|
-
|
|
25
|
-
def _determine_storage_dir(self, config, cwd):
|
|
26
|
-
"""Determine the storage directory based on config and current working directory."""
|
|
27
|
-
current_dir = cwd if cwd is not None else Path.cwd()
|
|
28
|
-
|
|
29
|
-
# Try to get project root from config
|
|
30
|
-
project_root = self._get_project_root_from_config(config)
|
|
31
|
-
if not project_root:
|
|
32
|
-
return DEFAULT_DATA_DIR
|
|
33
|
-
|
|
34
|
-
# Validate that it's an absolute path
|
|
35
|
-
if not os.path.isabs(project_root):
|
|
36
|
-
return DEFAULT_DATA_DIR
|
|
37
|
-
|
|
38
|
-
# Validate that cwd is within project root
|
|
39
|
-
if self._is_cwd_within_project_root(current_dir, project_root):
|
|
40
|
-
return Path(project_root) / DEFAULT_DATA_DIR
|
|
41
|
-
else:
|
|
42
|
-
return DEFAULT_DATA_DIR
|
|
43
|
-
|
|
44
|
-
def _get_project_root_from_config(self, config):
|
|
45
|
-
"""Extract project root from config if available."""
|
|
46
|
-
if config and hasattr(config, 'getini'):
|
|
47
|
-
return config.getini('tdd_guard_project_root')
|
|
48
|
-
return None
|
|
49
|
-
|
|
50
|
-
def _is_cwd_within_project_root(self, cwd, project_root):
|
|
51
|
-
"""Check if current working directory is within the project root."""
|
|
52
|
-
try:
|
|
53
|
-
cwd.relative_to(Path(project_root))
|
|
54
|
-
return True
|
|
55
|
-
except ValueError:
|
|
56
|
-
return False
|
|
57
|
-
|
|
58
|
-
def pytest_collectreport(self, report):
|
|
59
|
-
"""Capture collection errors (import failures, etc.)"""
|
|
60
|
-
if report.failed:
|
|
61
|
-
# Create a synthetic test result for collection failures
|
|
62
|
-
test_result = {
|
|
63
|
-
'name': f"collection_error_{report.nodeid or 'unknown'}",
|
|
64
|
-
'fullName': report.nodeid or 'collection_error',
|
|
65
|
-
'state': 'failed',
|
|
66
|
-
'errors': [{'message': str(report.longrepr)}]
|
|
67
|
-
}
|
|
68
|
-
self.test_results.append(test_result)
|
|
69
|
-
|
|
70
|
-
def pytest_runtest_logreport(self, report):
|
|
71
|
-
"""Collect test results during pytest execution."""
|
|
72
|
-
if report.when == 'call': # Only capture the main test execution phase
|
|
73
|
-
test_result = {
|
|
74
|
-
'name': report.nodeid.split('::')[-1] if '::' in report.nodeid else report.nodeid,
|
|
75
|
-
'fullName': report.nodeid,
|
|
76
|
-
'state': 'passed' if report.passed else ('failed' if report.failed else 'skipped')
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if report.failed and hasattr(report, 'longrepr') and report.longrepr:
|
|
80
|
-
test_result['errors'] = [{'message': str(report.longrepr)}]
|
|
81
|
-
|
|
82
|
-
self.test_results.append(test_result)
|
|
83
|
-
|
|
84
|
-
def pytest_sessionfinish(self, session, exitstatus):
|
|
85
|
-
"""Save results to TDD Guard storage - equivalent to VitestReporter.onTestRunEnd()"""
|
|
86
|
-
# Group tests by module (same format as VitestReporter)
|
|
87
|
-
modules_map = {}
|
|
88
|
-
for test in self.test_results:
|
|
89
|
-
module_path = test['fullName'].split('::')[0]
|
|
90
|
-
if module_path not in modules_map:
|
|
91
|
-
modules_map[module_path] = {
|
|
92
|
-
'moduleId': module_path,
|
|
93
|
-
'tests': []
|
|
94
|
-
}
|
|
95
|
-
modules_map[module_path]['tests'].append(test)
|
|
96
|
-
|
|
97
|
-
output = {
|
|
98
|
-
'testModules': list(modules_map.values())
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
# Save to TDD Guard storage (same as VitestReporter.storage.saveTest())
|
|
102
|
-
# Create directory recursively like FileStorage.ensureDirectory()
|
|
103
|
-
self.storage_dir.mkdir(parents=True, exist_ok=True)
|
|
104
|
-
|
|
105
|
-
# Save as JSON (matching FileStorage.saveTest format)
|
|
106
|
-
storage_path = self.storage_dir / 'test.json'
|
|
107
|
-
with open(storage_path, 'w') as f:
|
|
108
|
-
json.dump(output, f, indent=2)
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
# Stash key for storing our plugin instance
|
|
112
|
-
tdd_guard_stash_key = pytest.StashKey[TDDGuardPytestPlugin]()
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def pytest_addoption(parser):
|
|
116
|
-
"""Register configuration options"""
|
|
117
|
-
parser.addini(
|
|
118
|
-
"tdd_guard_project_root",
|
|
119
|
-
help="Absolute path to project root for TDD Guard storage",
|
|
120
|
-
default=""
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
def pytest_configure(config):
|
|
124
|
-
"""Register and configure the plugin"""
|
|
125
|
-
plugin = TDDGuardPytestPlugin(config)
|
|
126
|
-
config.stash[tdd_guard_stash_key] = plugin
|
|
127
|
-
config.pluginmanager.register(plugin)
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def pytest_unconfigure(config):
|
|
131
|
-
"""Unregister the plugin"""
|
|
132
|
-
plugin = config.stash.get(tdd_guard_stash_key, None)
|
|
133
|
-
if plugin is not None:
|
|
134
|
-
config.pluginmanager.unregister(plugin)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"""Tests for TDD Guard pytest reporter."""
|