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,42 +0,0 @@
|
|
|
1
|
-
import type { Storage } from 'tdd-guard'
|
|
2
|
-
|
|
3
|
-
export interface TDDGuardReporterOptions {
|
|
4
|
-
storage?: Storage
|
|
5
|
-
projectRoot?: string
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export interface CapturedError {
|
|
9
|
-
message: string
|
|
10
|
-
actual?: string
|
|
11
|
-
expected?: string
|
|
12
|
-
showDiff?: boolean
|
|
13
|
-
operator?: string
|
|
14
|
-
diff?: string
|
|
15
|
-
name?: string
|
|
16
|
-
ok?: boolean
|
|
17
|
-
stack?: string
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface CapturedTest {
|
|
21
|
-
name: string
|
|
22
|
-
fullName: string
|
|
23
|
-
state: string
|
|
24
|
-
errors?: CapturedError[]
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface CapturedModule {
|
|
28
|
-
moduleId: string
|
|
29
|
-
tests: CapturedTest[]
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface CapturedUnhandledError {
|
|
33
|
-
message: string
|
|
34
|
-
name: string
|
|
35
|
-
stack?: string
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface CapturedTestRun {
|
|
39
|
-
testModules: CapturedModule[]
|
|
40
|
-
unhandledErrors?: CapturedUnhandledError[]
|
|
41
|
-
reason?: 'passed' | 'failed' | 'interrupted'
|
|
42
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../tsconfig.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"composite": true,
|
|
5
|
-
"outDir": "./dist",
|
|
6
|
-
"rootDir": "./src",
|
|
7
|
-
"tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo"
|
|
8
|
-
},
|
|
9
|
-
"include": ["src/**/*"],
|
|
10
|
-
"exclude": ["**/*.test.ts", "**/*.spec.ts"]
|
|
11
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
$finder = PhpCsFixer\Finder::create()
|
|
4
|
-
->in(__DIR__ . '/src')
|
|
5
|
-
->in(__DIR__ . '/tests')
|
|
6
|
-
->exclude('vendor');
|
|
7
|
-
|
|
8
|
-
$config = new PhpCsFixer\Config();
|
|
9
|
-
return $config->setRules([
|
|
10
|
-
'@PSR12' => true,
|
|
11
|
-
'array_syntax' => ['syntax' => 'short'],
|
|
12
|
-
'ordered_imports' => ['sort_algorithm' => 'alpha'],
|
|
13
|
-
'no_unused_imports' => true,
|
|
14
|
-
'single_quote' => true,
|
|
15
|
-
'trailing_comma_in_multiline' => true,
|
|
16
|
-
'phpdoc_scalar' => true,
|
|
17
|
-
'unary_operator_spaces' => true,
|
|
18
|
-
'binary_operator_spaces' => true,
|
|
19
|
-
'blank_line_before_statement' => [
|
|
20
|
-
'statements' => ['break', 'continue', 'declare', 'return', 'throw', 'try'],
|
|
21
|
-
],
|
|
22
|
-
'phpdoc_single_line_var_spacing' => true,
|
|
23
|
-
'phpdoc_var_without_name' => true,
|
|
24
|
-
'method_argument_space' => [
|
|
25
|
-
'on_multiline' => 'ensure_fully_multiline',
|
|
26
|
-
],
|
|
27
|
-
])
|
|
28
|
-
->setFinder($finder);
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
# TDD Guard PHPUnit Reporter
|
|
2
|
-
|
|
3
|
-
PHPUnit reporter that captures test results for TDD Guard validation.
|
|
4
|
-
|
|
5
|
-
## Requirements
|
|
6
|
-
|
|
7
|
-
- PHP 8.1+
|
|
8
|
-
- PHPUnit 9.0+ or 10.0+ or 11.0+ or 12.0+
|
|
9
|
-
- [TDD Guard](https://github.com/nizos/tdd-guard) installed globally
|
|
10
|
-
|
|
11
|
-
## Installation
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
composer require --dev tdd-guard/phpunit
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Configuration
|
|
18
|
-
|
|
19
|
-
### PHPUnit 10+ Configuration
|
|
20
|
-
|
|
21
|
-
Add the extension to your `phpunit.xml`:
|
|
22
|
-
|
|
23
|
-
```xml
|
|
24
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
25
|
-
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
26
|
-
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
|
|
27
|
-
bootstrap="vendor/autoload.php">
|
|
28
|
-
<testsuites>
|
|
29
|
-
<testsuite name="Application Test Suite">
|
|
30
|
-
<directory>tests</directory>
|
|
31
|
-
</testsuite>
|
|
32
|
-
</testsuites>
|
|
33
|
-
|
|
34
|
-
<extensions>
|
|
35
|
-
<bootstrap class="TddGuard\PHPUnit\TddGuardExtension">
|
|
36
|
-
<parameter name="projectRoot" value="/absolute/path/to/project/root"/>
|
|
37
|
-
</bootstrap>
|
|
38
|
-
</extensions>
|
|
39
|
-
</phpunit>
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### PHPUnit 9.x Configuration
|
|
43
|
-
|
|
44
|
-
Add the listener to your `phpunit.xml`:
|
|
45
|
-
|
|
46
|
-
```xml
|
|
47
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
48
|
-
<phpunit bootstrap="vendor/autoload.php">
|
|
49
|
-
<testsuites>
|
|
50
|
-
<testsuite name="Application Test Suite">
|
|
51
|
-
<directory>tests</directory>
|
|
52
|
-
</testsuite>
|
|
53
|
-
</testsuites>
|
|
54
|
-
|
|
55
|
-
<listeners>
|
|
56
|
-
<listener class="TddGuard\PHPUnit\TddGuardListener">
|
|
57
|
-
<arguments>
|
|
58
|
-
<string>/absolute/path/to/project/root</string>
|
|
59
|
-
</arguments>
|
|
60
|
-
</listener>
|
|
61
|
-
</listeners>
|
|
62
|
-
</phpunit>
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### Project Root Configuration
|
|
66
|
-
|
|
67
|
-
Set the project root using any ONE of these methods:
|
|
68
|
-
|
|
69
|
-
**Option 1: PHPUnit Configuration (Recommended)**
|
|
70
|
-
|
|
71
|
-
Use the `projectRoot` parameter in your `phpunit.xml` (see examples above).
|
|
72
|
-
|
|
73
|
-
**Option 2: Environment Variable**
|
|
74
|
-
|
|
75
|
-
```bash
|
|
76
|
-
export TDD_GUARD_PROJECT_ROOT=/absolute/path/to/project/root
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
**Option 3: Automatic Detection**
|
|
80
|
-
|
|
81
|
-
If not configured, the reporter will:
|
|
82
|
-
- Use the directory containing `phpunit.xml`
|
|
83
|
-
- Fall back to current working directory
|
|
84
|
-
|
|
85
|
-
### Configuration Rules
|
|
86
|
-
|
|
87
|
-
- Path must be absolute
|
|
88
|
-
- Falls back to current directory if configuration is invalid
|
|
89
|
-
|
|
90
|
-
## More Information
|
|
91
|
-
|
|
92
|
-
- Test results are saved to `.claude/tdd-guard/data/test.json`
|
|
93
|
-
- See [TDD Guard documentation](https://github.com/nizos/tdd-guard) for complete setup
|
|
94
|
-
|
|
95
|
-
## License
|
|
96
|
-
|
|
97
|
-
MIT
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# TDD Guard PHPUnit Reporter
|
|
2
|
-
|
|
3
|
-
This repository is automatically synchronized from the main [TDD Guard monorepo](https://github.com/nizos/tdd-guard).
|
|
4
|
-
|
|
5
|
-
## Important Notice
|
|
6
|
-
|
|
7
|
-
**This is a read-only mirror.** Please do not submit pull requests here.
|
|
8
|
-
|
|
9
|
-
- **Source code**: https://github.com/nizos/tdd-guard/tree/main/reporters/phpunit
|
|
10
|
-
- **Issues**: https://github.com/nizos/tdd-guard/issues
|
|
11
|
-
- **Pull requests**: https://github.com/nizos/tdd-guard/pulls
|
|
12
|
-
|
|
13
|
-
## Installation
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
composer require --dev tdd-guard/phpunit
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Why a Separate Repository?
|
|
20
|
-
|
|
21
|
-
Packagist requires composer.json to be at the root of the repository. Since TDD Guard is a monorepo containing multiple packages (npm, Python, PHP), we maintain this synchronized copy specifically for Packagist distribution.
|
|
22
|
-
|
|
23
|
-
## Synchronization
|
|
24
|
-
|
|
25
|
-
This repository is automatically updated whenever changes are pushed to the `reporters/phpunit` directory in the main repository.
|
|
26
|
-
|
|
27
|
-
## License
|
|
28
|
-
|
|
29
|
-
MIT - See the main repository for details.
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "tdd-guard/phpunit",
|
|
3
|
-
"description": "PHPUnit reporter for TDD Guard",
|
|
4
|
-
"version": "0.1.3",
|
|
5
|
-
"type": "library",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"authors": [
|
|
8
|
-
{
|
|
9
|
-
"name": "Wolfgang Klinger",
|
|
10
|
-
"email": "hello@wolfgang-klinger.dev"
|
|
11
|
-
}
|
|
12
|
-
],
|
|
13
|
-
"keywords": [
|
|
14
|
-
"tdd",
|
|
15
|
-
"test-driven-development",
|
|
16
|
-
"testing",
|
|
17
|
-
"phpunit",
|
|
18
|
-
"claude"
|
|
19
|
-
],
|
|
20
|
-
"homepage": "https://github.com/nizos/tdd-guard",
|
|
21
|
-
"support": {
|
|
22
|
-
"issues": "https://github.com/nizos/tdd-guard/issues",
|
|
23
|
-
"source": "https://github.com/nizos/tdd-guard/tree/main/reporters/phpunit"
|
|
24
|
-
},
|
|
25
|
-
"require": {
|
|
26
|
-
"php": ">=8.1",
|
|
27
|
-
"phpunit/phpunit": "^9.0 || ^10.0 || ^11.0 || ^12.0"
|
|
28
|
-
},
|
|
29
|
-
"require-dev": {
|
|
30
|
-
"symfony/filesystem": "^5.4 || ^6.0 || ^7.0",
|
|
31
|
-
"friendsofphp/php-cs-fixer": "^3.40",
|
|
32
|
-
"vimeo/psalm": "^5.0"
|
|
33
|
-
},
|
|
34
|
-
"autoload": {
|
|
35
|
-
"psr-4": {
|
|
36
|
-
"TddGuard\\PHPUnit\\": "src/"
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
"autoload-dev": {
|
|
40
|
-
"psr-4": {
|
|
41
|
-
"TddGuard\\PHPUnit\\Tests\\": "tests/"
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
"scripts": {
|
|
45
|
-
"test": "vendor/bin/phpunit",
|
|
46
|
-
"test:coverage": "vendor/bin/phpunit --coverage-text",
|
|
47
|
-
"format": "vendor/bin/php-cs-fixer fix",
|
|
48
|
-
"format:check": "vendor/bin/php-cs-fixer fix --dry-run --diff",
|
|
49
|
-
"lint": "vendor/bin/psalm",
|
|
50
|
-
"lint:check": "vendor/bin/psalm --no-progress"
|
|
51
|
-
},
|
|
52
|
-
"config": {
|
|
53
|
-
"sort-packages": true
|
|
54
|
-
}
|
|
55
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
3
|
-
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
|
|
4
|
-
bootstrap="vendor/autoload.php"
|
|
5
|
-
colors="true"
|
|
6
|
-
failOnRisky="true"
|
|
7
|
-
failOnWarning="true">
|
|
8
|
-
<testsuites>
|
|
9
|
-
<testsuite name="TDD Guard PHPUnit Reporter">
|
|
10
|
-
<directory>tests</directory>
|
|
11
|
-
</testsuite>
|
|
12
|
-
</testsuites>
|
|
13
|
-
|
|
14
|
-
<source>
|
|
15
|
-
<include>
|
|
16
|
-
<directory>src</directory>
|
|
17
|
-
</include>
|
|
18
|
-
</source>
|
|
19
|
-
</phpunit>
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0"?>
|
|
2
|
-
<psalm
|
|
3
|
-
errorLevel="3"
|
|
4
|
-
resolveFromConfigFile="true"
|
|
5
|
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
6
|
-
xmlns="https://getpsalm.org/schema/config"
|
|
7
|
-
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
|
|
8
|
-
findUnusedBaselineEntry="true"
|
|
9
|
-
findUnusedCode="false"
|
|
10
|
-
>
|
|
11
|
-
<projectFiles>
|
|
12
|
-
<directory name="src" />
|
|
13
|
-
<directory name="tests" />
|
|
14
|
-
<ignoreFiles>
|
|
15
|
-
<directory name="vendor" />
|
|
16
|
-
</ignoreFiles>
|
|
17
|
-
</projectFiles>
|
|
18
|
-
|
|
19
|
-
<issueHandlers>
|
|
20
|
-
<!-- Suppress for test files only -->
|
|
21
|
-
<PropertyNotSetInConstructor>
|
|
22
|
-
<errorLevel type="suppress">
|
|
23
|
-
<directory name="tests" />
|
|
24
|
-
</errorLevel>
|
|
25
|
-
</PropertyNotSetInConstructor>
|
|
26
|
-
<MissingConstructor>
|
|
27
|
-
<errorLevel type="suppress">
|
|
28
|
-
<directory name="tests" />
|
|
29
|
-
</errorLevel>
|
|
30
|
-
</MissingConstructor>
|
|
31
|
-
<UnusedClass>
|
|
32
|
-
<errorLevel type="suppress">
|
|
33
|
-
<directory name="tests" />
|
|
34
|
-
</errorLevel>
|
|
35
|
-
</UnusedClass>
|
|
36
|
-
|
|
37
|
-
<!-- PHPUnit 9.x compatibility - TestListener interface was removed in PHPUnit 10 -->
|
|
38
|
-
<UndefinedClass>
|
|
39
|
-
<errorLevel type="suppress">
|
|
40
|
-
<referencedClass name="PHPUnit\Framework\TestListener" />
|
|
41
|
-
</errorLevel>
|
|
42
|
-
</UndefinedClass>
|
|
43
|
-
</issueHandlers>
|
|
44
|
-
</psalm>
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
declare(strict_types=1);
|
|
4
|
-
|
|
5
|
-
namespace TddGuard\PHPUnit\Event;
|
|
6
|
-
|
|
7
|
-
use PHPUnit\Event\Test\Errored;
|
|
8
|
-
use PHPUnit\Event\Test\ErroredSubscriber;
|
|
9
|
-
use TddGuard\PHPUnit\TestResultCollector;
|
|
10
|
-
|
|
11
|
-
final class ErroredTestSubscriber implements ErroredSubscriber
|
|
12
|
-
{
|
|
13
|
-
private TestResultCollector $collector;
|
|
14
|
-
|
|
15
|
-
public function __construct(TestResultCollector $collector)
|
|
16
|
-
{
|
|
17
|
-
$this->collector = $collector;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public function notify(Errored $event): void
|
|
21
|
-
{
|
|
22
|
-
$this->collector->addTestResult(
|
|
23
|
-
$event->test(),
|
|
24
|
-
'errored',
|
|
25
|
-
$event->throwable()->message()
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
declare(strict_types=1);
|
|
4
|
-
|
|
5
|
-
namespace TddGuard\PHPUnit\Event;
|
|
6
|
-
|
|
7
|
-
use PHPUnit\Event\Test\Failed;
|
|
8
|
-
use PHPUnit\Event\Test\FailedSubscriber;
|
|
9
|
-
use TddGuard\PHPUnit\TestResultCollector;
|
|
10
|
-
|
|
11
|
-
final class FailedTestSubscriber implements FailedSubscriber
|
|
12
|
-
{
|
|
13
|
-
private TestResultCollector $collector;
|
|
14
|
-
|
|
15
|
-
public function __construct(TestResultCollector $collector)
|
|
16
|
-
{
|
|
17
|
-
$this->collector = $collector;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public function notify(Failed $event): void
|
|
21
|
-
{
|
|
22
|
-
$this->collector->addTestResult(
|
|
23
|
-
$event->test(),
|
|
24
|
-
'failed',
|
|
25
|
-
$event->throwable()->message()
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
declare(strict_types=1);
|
|
4
|
-
|
|
5
|
-
namespace TddGuard\PHPUnit\Event;
|
|
6
|
-
|
|
7
|
-
use PHPUnit\Event\Test\MarkedIncomplete;
|
|
8
|
-
use PHPUnit\Event\Test\MarkedIncompleteSubscriber;
|
|
9
|
-
use TddGuard\PHPUnit\TestResultCollector;
|
|
10
|
-
|
|
11
|
-
final class IncompleteTestSubscriber implements MarkedIncompleteSubscriber
|
|
12
|
-
{
|
|
13
|
-
private TestResultCollector $collector;
|
|
14
|
-
|
|
15
|
-
public function __construct(TestResultCollector $collector)
|
|
16
|
-
{
|
|
17
|
-
$this->collector = $collector;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public function notify(MarkedIncomplete $event): void
|
|
21
|
-
{
|
|
22
|
-
$this->collector->addTestResult(
|
|
23
|
-
$event->test(),
|
|
24
|
-
'skipped',
|
|
25
|
-
'Incomplete: ' . $event->throwable()->message()
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
declare(strict_types=1);
|
|
4
|
-
|
|
5
|
-
namespace TddGuard\PHPUnit\Event;
|
|
6
|
-
|
|
7
|
-
use PHPUnit\Event\Test\Passed;
|
|
8
|
-
use PHPUnit\Event\Test\PassedSubscriber;
|
|
9
|
-
use TddGuard\PHPUnit\TestResultCollector;
|
|
10
|
-
|
|
11
|
-
final class PassedTestSubscriber implements PassedSubscriber
|
|
12
|
-
{
|
|
13
|
-
private TestResultCollector $collector;
|
|
14
|
-
|
|
15
|
-
public function __construct(TestResultCollector $collector)
|
|
16
|
-
{
|
|
17
|
-
$this->collector = $collector;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public function notify(Passed $event): void
|
|
21
|
-
{
|
|
22
|
-
$this->collector->addTestResult(
|
|
23
|
-
$event->test(),
|
|
24
|
-
'passed'
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
declare(strict_types=1);
|
|
4
|
-
|
|
5
|
-
namespace TddGuard\PHPUnit\Event;
|
|
6
|
-
|
|
7
|
-
use PHPUnit\Event\Test\Skipped;
|
|
8
|
-
use PHPUnit\Event\Test\SkippedSubscriber;
|
|
9
|
-
use TddGuard\PHPUnit\TestResultCollector;
|
|
10
|
-
|
|
11
|
-
final class SkippedTestSubscriber implements SkippedSubscriber
|
|
12
|
-
{
|
|
13
|
-
private TestResultCollector $collector;
|
|
14
|
-
|
|
15
|
-
public function __construct(TestResultCollector $collector)
|
|
16
|
-
{
|
|
17
|
-
$this->collector = $collector;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public function notify(Skipped $event): void
|
|
21
|
-
{
|
|
22
|
-
$this->collector->addTestResult(
|
|
23
|
-
$event->test(),
|
|
24
|
-
'skipped',
|
|
25
|
-
$event->message()
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
}
|
package/project-skills/tdd-guard/reporters/phpunit/src/Event/TestRunnerFinishedSubscriber.php
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
declare(strict_types=1);
|
|
4
|
-
|
|
5
|
-
namespace TddGuard\PHPUnit\Event;
|
|
6
|
-
|
|
7
|
-
use PHPUnit\Event\TestRunner\Finished;
|
|
8
|
-
use PHPUnit\Event\TestRunner\FinishedSubscriber;
|
|
9
|
-
use TddGuard\PHPUnit\TestResultCollector;
|
|
10
|
-
|
|
11
|
-
final class TestRunnerFinishedSubscriber implements FinishedSubscriber
|
|
12
|
-
{
|
|
13
|
-
private TestResultCollector $collector;
|
|
14
|
-
|
|
15
|
-
public function __construct(TestResultCollector $collector)
|
|
16
|
-
{
|
|
17
|
-
$this->collector = $collector;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public function notify(Finished $event): void
|
|
21
|
-
{
|
|
22
|
-
$this->collector->saveResults();
|
|
23
|
-
}
|
|
24
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
declare(strict_types=1);
|
|
4
|
-
|
|
5
|
-
namespace TddGuard\PHPUnit;
|
|
6
|
-
|
|
7
|
-
final class PathValidator
|
|
8
|
-
{
|
|
9
|
-
public static function resolveProjectRoot(string $configuredRoot): string
|
|
10
|
-
{
|
|
11
|
-
if ($configuredRoot !== '') {
|
|
12
|
-
$validated = self::validateProjectRoot($configuredRoot);
|
|
13
|
-
if ($validated === null) {
|
|
14
|
-
throw new \InvalidArgumentException('Configured project root is invalid');
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
return $validated;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
$envRoot = getenv('TDD_GUARD_PROJECT_ROOT');
|
|
21
|
-
if ($envRoot !== false && $envRoot !== '') {
|
|
22
|
-
$validated = self::validateProjectRoot($envRoot);
|
|
23
|
-
if ($validated === null) {
|
|
24
|
-
throw new \InvalidArgumentException('TDD_GUARD_PROJECT_ROOT is invalid');
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return $validated;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return getcwd();
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
private static function validateProjectRoot(string $path): ?string
|
|
34
|
-
{
|
|
35
|
-
if ($path === '') {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (!self::isAbsolutePath($path)) {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (strpos($path, '..') !== false) {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (!is_dir($path)) {
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
$normalizedPath = realpath($path);
|
|
52
|
-
if ($normalizedPath === false) {
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
$cwd = realpath(getcwd());
|
|
57
|
-
if ($cwd === false) {
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (!self::isAncestorOrSame($normalizedPath, $cwd)) {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return $normalizedPath;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
private static function isAncestorOrSame(string $potentialAncestor, string $path): bool
|
|
69
|
-
{
|
|
70
|
-
$potentialAncestor = rtrim($potentialAncestor, DIRECTORY_SEPARATOR);
|
|
71
|
-
$path = rtrim($path, DIRECTORY_SEPARATOR);
|
|
72
|
-
|
|
73
|
-
if ($potentialAncestor === $path) {
|
|
74
|
-
return true;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return strpos($path, $potentialAncestor . DIRECTORY_SEPARATOR) === 0;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
private static function isAbsolutePath(string $path): bool
|
|
81
|
-
{
|
|
82
|
-
if (PHP_OS_FAMILY === 'Windows') {
|
|
83
|
-
return preg_match('/^[a-zA-Z]:[\\\\\\/]/', $path) === 1;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return strpos($path, '/') === 0;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
declare(strict_types=1);
|
|
4
|
-
|
|
5
|
-
namespace TddGuard\PHPUnit;
|
|
6
|
-
|
|
7
|
-
final class Storage
|
|
8
|
-
{
|
|
9
|
-
private string $projectRoot;
|
|
10
|
-
|
|
11
|
-
public function __construct(string $projectRoot = '')
|
|
12
|
-
{
|
|
13
|
-
$this->projectRoot = PathValidator::resolveProjectRoot($projectRoot);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
public function saveTest(string $content): void
|
|
17
|
-
{
|
|
18
|
-
$dataDir = $this->projectRoot . '/.claude/tdd-guard/data';
|
|
19
|
-
|
|
20
|
-
if (!is_dir($dataDir)) {
|
|
21
|
-
mkdir($dataDir, 0755, true);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
file_put_contents($dataDir . '/test.json', $content);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
<?php
|
|
2
|
-
|
|
3
|
-
declare(strict_types=1);
|
|
4
|
-
|
|
5
|
-
namespace TddGuard\PHPUnit;
|
|
6
|
-
|
|
7
|
-
use PHPUnit\Runner\Extension\Extension;
|
|
8
|
-
use PHPUnit\Runner\Extension\Facade;
|
|
9
|
-
use PHPUnit\Runner\Extension\ParameterCollection;
|
|
10
|
-
use PHPUnit\TextUI\Configuration\Configuration;
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* @psalm-api
|
|
14
|
-
*/
|
|
15
|
-
final class TddGuardExtension implements Extension
|
|
16
|
-
{
|
|
17
|
-
public function bootstrap(Configuration $configuration, Facade $facade, ParameterCollection $parameters): void
|
|
18
|
-
{
|
|
19
|
-
$projectRoot = $this->getProjectRoot($parameters);
|
|
20
|
-
|
|
21
|
-
$subscriber = new TddGuardSubscriber($projectRoot);
|
|
22
|
-
foreach ($subscriber->getSubscribers() as $eventSubscriber) {
|
|
23
|
-
$facade->registerSubscriber($eventSubscriber);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
private function getProjectRoot(ParameterCollection $parameters): string
|
|
28
|
-
{
|
|
29
|
-
$configuredRoot = $parameters->has('projectRoot') ? $parameters->get('projectRoot') : '';
|
|
30
|
-
|
|
31
|
-
return PathValidator::resolveProjectRoot($configuredRoot);
|
|
32
|
-
}
|
|
33
|
-
}
|