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,102 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "tdd-guard",
|
|
3
|
-
"version": "1.1.0",
|
|
4
|
-
"description": "Automated Test-Driven Development enforcement for Claude Code",
|
|
5
|
-
"author": "Nizar Selander",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"repository": {
|
|
8
|
-
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/nizos/tdd-guard.git"
|
|
10
|
-
},
|
|
11
|
-
"keywords": [
|
|
12
|
-
"tdd",
|
|
13
|
-
"test-driven-development",
|
|
14
|
-
"claude",
|
|
15
|
-
"claude-code",
|
|
16
|
-
"hooks",
|
|
17
|
-
"testing",
|
|
18
|
-
"ai-tools",
|
|
19
|
-
"code-quality",
|
|
20
|
-
"linting"
|
|
21
|
-
],
|
|
22
|
-
"engines": {
|
|
23
|
-
"node": ">=22.0.0"
|
|
24
|
-
},
|
|
25
|
-
"workspaces": [
|
|
26
|
-
"reporters/vitest",
|
|
27
|
-
"reporters/jest",
|
|
28
|
-
"reporters/storybook"
|
|
29
|
-
],
|
|
30
|
-
"main": "dist/index.js",
|
|
31
|
-
"types": "dist/index.d.ts",
|
|
32
|
-
"bin": {
|
|
33
|
-
"tdd-guard": "dist/cli/tdd-guard.js"
|
|
34
|
-
},
|
|
35
|
-
"files": [
|
|
36
|
-
"dist",
|
|
37
|
-
"!dist/*.tsbuildinfo",
|
|
38
|
-
"README.md",
|
|
39
|
-
"LICENSE"
|
|
40
|
-
],
|
|
41
|
-
"scripts": {
|
|
42
|
-
"build:workspaces": "npm run build --workspaces --if-present",
|
|
43
|
-
"build": "tsc --build tsconfig.build.json && npm run build:workspaces",
|
|
44
|
-
"test": "vitest run --project default --project golangci-lint",
|
|
45
|
-
"test:unit": "vitest run --project unit --project golangci-lint",
|
|
46
|
-
"test:integration": "vitest run --project integration",
|
|
47
|
-
"pretest:reporters": "npx playwright install chromium --only-shell 2>/dev/null || true",
|
|
48
|
-
"test:reporters": "vitest run --project reporters",
|
|
49
|
-
"test:coverage": "vitest run --coverage",
|
|
50
|
-
"lint": "npm run build:workspaces && eslint . --fix --report-unused-disable-directives --max-warnings 0",
|
|
51
|
-
"lint:check": "npm run build:workspaces && eslint . --report-unused-disable-directives --max-warnings 0",
|
|
52
|
-
"format": "prettier --write .",
|
|
53
|
-
"format:check": "prettier --check .",
|
|
54
|
-
"typecheck": "npm run build:workspaces && tsc --noEmit",
|
|
55
|
-
"checks": "npm run typecheck && npm run lint && npm run format && npm run test",
|
|
56
|
-
"pre-commit": "npm run format:check && npm run lint:check && npm run typecheck && npm run test:unit",
|
|
57
|
-
"prepare": "husky"
|
|
58
|
-
},
|
|
59
|
-
"dependencies": {
|
|
60
|
-
"@anthropic-ai/claude-agent-sdk": "^0.2.25",
|
|
61
|
-
"@anthropic-ai/sdk": "^0.72.1",
|
|
62
|
-
"@types/uuid": "^10.0.0",
|
|
63
|
-
"dotenv": "^17.2.3",
|
|
64
|
-
"minimatch": "^10.0.3",
|
|
65
|
-
"uuid": "^13.0.0",
|
|
66
|
-
"zod": "^4.3.6"
|
|
67
|
-
},
|
|
68
|
-
"lint-staged": {
|
|
69
|
-
"*.{js,jsx,ts,tsx}": [
|
|
70
|
-
"prettier --write",
|
|
71
|
-
"eslint --fix"
|
|
72
|
-
],
|
|
73
|
-
"*.{json,md,css,yml,yaml}": [
|
|
74
|
-
"prettier --write"
|
|
75
|
-
]
|
|
76
|
-
},
|
|
77
|
-
"devDependencies": {
|
|
78
|
-
"@commitlint/cli": "^20.4.2",
|
|
79
|
-
"@commitlint/config-conventional": "^20.4.2",
|
|
80
|
-
"@eslint/js": "^10.0.1",
|
|
81
|
-
"@types/node": "^25.1.0",
|
|
82
|
-
"@typescript-eslint/eslint-plugin": "^8.56.0",
|
|
83
|
-
"@typescript-eslint/parser": "^8.56.0",
|
|
84
|
-
"@vitest/coverage-v8": "^3.2.4",
|
|
85
|
-
"eslint": "^10.0.1",
|
|
86
|
-
"eslint-plugin-sonarjs": "^4.0.0",
|
|
87
|
-
"get-port": "^7.1.0",
|
|
88
|
-
"globals": "^17.2.0",
|
|
89
|
-
"husky": "^9.1.7",
|
|
90
|
-
"lint-staged": "^16.2.7",
|
|
91
|
-
"prettier": "^3.8.1",
|
|
92
|
-
"tdd-guard-vitest": "*",
|
|
93
|
-
"tsx": "^4.21.0",
|
|
94
|
-
"typescript": "^5.9.3",
|
|
95
|
-
"vitest": "^3.2.4"
|
|
96
|
-
},
|
|
97
|
-
"overrides": {
|
|
98
|
-
"js-yaml": "^4.1.1",
|
|
99
|
-
"minimatch": "$minimatch",
|
|
100
|
-
"test-exclude@^6.0.0": "^7.0.2"
|
|
101
|
-
}
|
|
102
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
# TDD Guard Go Reporter
|
|
2
|
-
|
|
3
|
-
Go test reporter that captures test results for TDD Guard validation.
|
|
4
|
-
|
|
5
|
-
## Requirements
|
|
6
|
-
|
|
7
|
-
- Go 1.24+
|
|
8
|
-
- [TDD Guard](https://github.com/nizos/tdd-guard) installed globally
|
|
9
|
-
|
|
10
|
-
## Installation
|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
go install github.com/nizos/tdd-guard/reporters/go/cmd/tdd-guard-go@latest
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Configuration
|
|
17
|
-
|
|
18
|
-
### Basic Usage
|
|
19
|
-
|
|
20
|
-
Pipe `go test -json` output to the reporter:
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
go test -json ./... 2>&1 | tdd-guard-go
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### Project Root Configuration
|
|
27
|
-
|
|
28
|
-
For projects where tests run in subdirectories, specify the project root:
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
go test -json ./... 2>&1 | tdd-guard-go -project-root /absolute/path/to/project/root
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### Configuration Rules
|
|
35
|
-
|
|
36
|
-
- Path must be absolute when using `-project-root` flag
|
|
37
|
-
- Current directory must be within the configured project root
|
|
38
|
-
- Falls back to current directory if not specified
|
|
39
|
-
|
|
40
|
-
### Makefile Integration
|
|
41
|
-
|
|
42
|
-
Add to your `Makefile`:
|
|
43
|
-
|
|
44
|
-
```makefile
|
|
45
|
-
test:
|
|
46
|
-
go test -json ./... 2>&1 | tdd-guard-go -project-root /absolute/path/to/project/root
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## How It Works
|
|
50
|
-
|
|
51
|
-
The reporter acts as a filter that:
|
|
52
|
-
|
|
53
|
-
1. Reads `go test -json` output from stdin
|
|
54
|
-
2. Passes the output through to stdout unchanged
|
|
55
|
-
3. Parses test results and transforms them to TDD Guard format
|
|
56
|
-
4. Saves results to `.claude/tdd-guard/data/test.json`
|
|
57
|
-
|
|
58
|
-
This design allows it to be inserted into existing test pipelines without disrupting output.
|
|
59
|
-
|
|
60
|
-
## More Information
|
|
61
|
-
|
|
62
|
-
- Test results are saved to `.claude/tdd-guard/data/test.json`
|
|
63
|
-
- See [TDD Guard documentation](https://github.com/nizos/tdd-guard) for complete setup
|
|
64
|
-
|
|
65
|
-
## License
|
|
66
|
-
|
|
67
|
-
MIT
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
package main
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"bufio"
|
|
5
|
-
"bytes"
|
|
6
|
-
"encoding/json"
|
|
7
|
-
"errors"
|
|
8
|
-
"flag"
|
|
9
|
-
"fmt"
|
|
10
|
-
"io"
|
|
11
|
-
"os"
|
|
12
|
-
"path/filepath"
|
|
13
|
-
"strings"
|
|
14
|
-
|
|
15
|
-
"github.com/nizos/tdd-guard/reporters/go/internal/formatter"
|
|
16
|
-
tddio "github.com/nizos/tdd-guard/reporters/go/internal/io"
|
|
17
|
-
"github.com/nizos/tdd-guard/reporters/go/internal/parser"
|
|
18
|
-
"github.com/nizos/tdd-guard/reporters/go/internal/storage"
|
|
19
|
-
"github.com/nizos/tdd-guard/reporters/go/internal/transformer"
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
func main() {
|
|
23
|
-
var projectRoot string
|
|
24
|
-
flag.StringVar(&projectRoot, "project-root", "", "Project root directory (absolute path)")
|
|
25
|
-
flag.Parse()
|
|
26
|
-
|
|
27
|
-
if err := process(os.Stdin, projectRoot, os.Stdout); err != nil {
|
|
28
|
-
os.Exit(1)
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
func process(input io.Reader, projectRoot string, output io.Writer) error {
|
|
33
|
-
if err := validateProjectRoot(projectRoot); err != nil {
|
|
34
|
-
return err
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Buffer to collect input
|
|
38
|
-
buffer := &bytes.Buffer{}
|
|
39
|
-
teeReader := tddio.NewTeeReader(input, buffer)
|
|
40
|
-
|
|
41
|
-
// Read all input to buffer
|
|
42
|
-
io.ReadAll(teeReader)
|
|
43
|
-
|
|
44
|
-
// Format and output
|
|
45
|
-
formatAndOutput(bytes.NewReader(buffer.Bytes()), output)
|
|
46
|
-
|
|
47
|
-
// Parse test output from buffer
|
|
48
|
-
mixedReader := parser.NewMixedReader(buffer)
|
|
49
|
-
results, p, err := parseTestResults(mixedReader)
|
|
50
|
-
if err != nil {
|
|
51
|
-
return err
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Add synthetic test for compilation errors
|
|
55
|
-
if shouldAddCompilationError(results, mixedReader.CompilationError) {
|
|
56
|
-
addCompilationError(results, mixedReader.CompilationError)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Transform and save results
|
|
60
|
-
t := transformer.NewTransformer()
|
|
61
|
-
result := t.Transform(results, p, mixedReader.CompilationError)
|
|
62
|
-
|
|
63
|
-
s := storage.NewStorage(projectRoot)
|
|
64
|
-
return s.Save(result)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
func formatAndOutput(input io.Reader, output io.Writer) {
|
|
68
|
-
f := formatter.NewFormatter()
|
|
69
|
-
scanner := bufio.NewScanner(input)
|
|
70
|
-
|
|
71
|
-
for scanner.Scan() {
|
|
72
|
-
line := scanner.Text()
|
|
73
|
-
|
|
74
|
-
// Try to parse as JSON
|
|
75
|
-
var event parser.TestEvent
|
|
76
|
-
if err := json.Unmarshal([]byte(line), &event); err == nil {
|
|
77
|
-
// It's JSON - format it
|
|
78
|
-
formatted := f.Format(event)
|
|
79
|
-
if formatted != "" {
|
|
80
|
-
fmt.Fprintln(output, formatted)
|
|
81
|
-
}
|
|
82
|
-
} else {
|
|
83
|
-
// Not JSON - pass through as-is
|
|
84
|
-
fmt.Fprintln(output, line)
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
func validateProjectRoot(projectRoot string) error {
|
|
90
|
-
if projectRoot == "" {
|
|
91
|
-
return nil
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if !filepath.IsAbs(projectRoot) {
|
|
95
|
-
return errors.New("project root must be an absolute path")
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
cwd, _ := os.Getwd()
|
|
99
|
-
if !strings.HasPrefix(cwd, projectRoot) {
|
|
100
|
-
return errors.New("current directory must be within project root")
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return nil
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
func parseTestResults(mixedReader *parser.MixedReader) (parser.Results, *parser.Parser, error) {
|
|
107
|
-
p := parser.NewParser()
|
|
108
|
-
|
|
109
|
-
jsonInput := strings.Join(mixedReader.JSONLines, "\n")
|
|
110
|
-
if jsonInput != "" {
|
|
111
|
-
if err := p.Parse(strings.NewReader(jsonInput)); err != nil {
|
|
112
|
-
return nil, nil, err
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
return p.GetResults(), p, nil
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
func shouldAddCompilationError(results parser.Results, compilationError *parser.CompilationError) bool {
|
|
120
|
-
return len(results) == 0 && compilationError != nil
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
func addCompilationError(results parser.Results, compilationError *parser.CompilationError) {
|
|
124
|
-
results[compilationError.Package] = parser.PackageResults{
|
|
125
|
-
"CompilationError": parser.StateFailed,
|
|
126
|
-
}
|
|
127
|
-
}
|
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
package main
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"bytes"
|
|
5
|
-
"io"
|
|
6
|
-
"os"
|
|
7
|
-
"path/filepath"
|
|
8
|
-
"testing"
|
|
9
|
-
|
|
10
|
-
"github.com/nizos/tdd-guard/reporters/go/internal/storage"
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
func TestProcess(t *testing.T) {
|
|
14
|
-
// Setup temp directory for all tests
|
|
15
|
-
oldWd, _ := os.Getwd()
|
|
16
|
-
tempDir := t.TempDir()
|
|
17
|
-
os.Chdir(tempDir)
|
|
18
|
-
t.Cleanup(func() {
|
|
19
|
-
os.Chdir(oldWd)
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
t.Run("without project root", func(t *testing.T) {
|
|
23
|
-
t.Run("creates output file", func(t *testing.T) {
|
|
24
|
-
runProcess(t, "")
|
|
25
|
-
assertFileExists(t, tempDir)
|
|
26
|
-
})
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
t.Run("with valid project root", func(t *testing.T) {
|
|
30
|
-
t.Run("uses provided project root", func(t *testing.T) {
|
|
31
|
-
runProcess(t, tempDir)
|
|
32
|
-
assertFileExists(t, tempDir)
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
t.Run("parses and transforms input", func(t *testing.T) {
|
|
36
|
-
input := `{"Action":"pass","Package":"example.com/pkg","Test":"TestExample"}`
|
|
37
|
-
data := processAndReadOutput(t, input, tempDir)
|
|
38
|
-
|
|
39
|
-
// Check it contains expected transformed data
|
|
40
|
-
if !bytes.Contains(data, []byte(`"state":"passed"`)) {
|
|
41
|
-
t.Fatalf("Expected output to contain transformed test state, got: %s", data)
|
|
42
|
-
}
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
t.Run("accepts project root equal to current directory", func(t *testing.T) {
|
|
46
|
-
cwd, _ := os.Getwd()
|
|
47
|
-
|
|
48
|
-
err := runProcess(t, cwd)
|
|
49
|
-
if err != nil {
|
|
50
|
-
t.Fatalf("Expected no error when project root equals cwd, got: %v", err)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
assertFileExists(t, cwd)
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
t.Run("accepts project root as ancestor of current directory", func(t *testing.T) {
|
|
57
|
-
// Create a subdirectory and change to it
|
|
58
|
-
subDir := filepath.Join(tempDir, "subdir")
|
|
59
|
-
os.MkdirAll(subDir, 0755)
|
|
60
|
-
oldCwd, _ := os.Getwd()
|
|
61
|
-
os.Chdir(subDir)
|
|
62
|
-
defer os.Chdir(oldCwd)
|
|
63
|
-
|
|
64
|
-
// Use tempDir (parent) as project root
|
|
65
|
-
err := runProcess(t, tempDir)
|
|
66
|
-
if err != nil {
|
|
67
|
-
t.Fatalf("Expected no error when project root is ancestor, got: %v", err)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
assertFileExists(t, tempDir)
|
|
71
|
-
})
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
t.Run("project root validation", func(t *testing.T) {
|
|
75
|
-
t.Run("rejects relative project root", func(t *testing.T) {
|
|
76
|
-
err := runProcess(t, "../relative/path")
|
|
77
|
-
assertErrorContains(t, err, "project root must be an absolute path")
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
t.Run("rejects project root outside current directory", func(t *testing.T) {
|
|
81
|
-
outsideRoot := filepath.Join(filepath.Dir(tempDir), "outside")
|
|
82
|
-
os.MkdirAll(outsideRoot, 0755)
|
|
83
|
-
|
|
84
|
-
err := runProcess(t, outsideRoot)
|
|
85
|
-
assertErrorContains(t, err, "current directory must be within project root")
|
|
86
|
-
})
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
t.Run("formatted output", func(t *testing.T) {
|
|
90
|
-
t.Run("formats package pass event", func(t *testing.T) {
|
|
91
|
-
input := `{"Action":"pass","Package":"example.com/pkg","Elapsed":0.003}`
|
|
92
|
-
output := &bytes.Buffer{}
|
|
93
|
-
|
|
94
|
-
err := process(bytes.NewReader([]byte(input)), tempDir, output)
|
|
95
|
-
if err != nil {
|
|
96
|
-
t.Fatalf("Expected no error, got: %v", err)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
expected := "ok \texample.com/pkg\t0.003s\n"
|
|
100
|
-
if output.String() != expected {
|
|
101
|
-
t.Errorf("Expected formatted output '%s', got '%s'", expected, output.String())
|
|
102
|
-
}
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
t.Run("passes through compilation errors", func(t *testing.T) {
|
|
106
|
-
input := "# command-line-arguments"
|
|
107
|
-
output := &bytes.Buffer{}
|
|
108
|
-
|
|
109
|
-
err := process(bytes.NewReader([]byte(input)), tempDir, output)
|
|
110
|
-
if err != nil {
|
|
111
|
-
t.Fatalf("Expected no error, got: %v", err)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
expected := "# command-line-arguments\n"
|
|
115
|
-
if output.String() != expected {
|
|
116
|
-
t.Errorf("Expected '%s', got '%s'", expected, output.String())
|
|
117
|
-
}
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
t.Run("filters out JSON start events", func(t *testing.T) {
|
|
121
|
-
input := `{"Action":"start","Package":"example.com/pkg"}`
|
|
122
|
-
output := &bytes.Buffer{}
|
|
123
|
-
|
|
124
|
-
err := process(bytes.NewReader([]byte(input)), tempDir, output)
|
|
125
|
-
if err != nil {
|
|
126
|
-
t.Fatalf("Expected no error, got: %v", err)
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
if output.String() != "" {
|
|
130
|
-
t.Errorf("Expected empty output for start event, got '%s'", output.String())
|
|
131
|
-
}
|
|
132
|
-
})
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
t.Run("compilation error handling", func(t *testing.T) {
|
|
136
|
-
t.Run("handles JSON-only build failure correctly", func(t *testing.T) {
|
|
137
|
-
// This simulates a build failure that produces JSON output
|
|
138
|
-
// The package fails but has no test entries
|
|
139
|
-
input := `{"Action":"fail","Package":"example.com/pkg","Elapsed":0}`
|
|
140
|
-
data := processAndReadOutput(t, input, tempDir)
|
|
141
|
-
|
|
142
|
-
// Should mark as failed
|
|
143
|
-
if !bytes.Contains(data, []byte(`"reason":"failed"`)) {
|
|
144
|
-
t.Fatalf("Expected reason to be 'failed' for build failure, got: %s", data)
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Should add CompilationError test entry
|
|
148
|
-
if !bytes.Contains(data, []byte(`"CompilationError"`)) {
|
|
149
|
-
t.Fatalf("Expected CompilationError test entry for JSON-only failure, got: %s", data)
|
|
150
|
-
}
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
t.Run("captures each compilation error as separate error entry", func(t *testing.T) {
|
|
154
|
-
// Multiple error lines should each be a separate error in the errors array
|
|
155
|
-
input := `# example.com/pkg
|
|
156
|
-
example.go:9:8: undefined: NewFormatter
|
|
157
|
-
example.go:10:12: undefined: TestEvent
|
|
158
|
-
{"Action":"fail","Package":"example.com/pkg","Elapsed":0}`
|
|
159
|
-
data := processAndReadOutput(t, input, tempDir)
|
|
160
|
-
|
|
161
|
-
// Check for separate error entries in the JSON structure
|
|
162
|
-
if !bytes.Contains(data, []byte(`"message":"example.go:9:8: undefined: NewFormatter"`)) {
|
|
163
|
-
t.Fatalf("Expected first error as separate entry, got: %s", data)
|
|
164
|
-
}
|
|
165
|
-
if !bytes.Contains(data, []byte(`"message":"example.go:10:12: undefined: TestEvent"`)) {
|
|
166
|
-
t.Fatalf("Expected second error as separate entry, got: %s", data)
|
|
167
|
-
}
|
|
168
|
-
// Ensure they're not concatenated
|
|
169
|
-
if bytes.Contains(data, []byte(`NewFormatter\nexample.go`)) {
|
|
170
|
-
t.Fatalf("Errors should not be concatenated, got: %s", data)
|
|
171
|
-
}
|
|
172
|
-
})
|
|
173
|
-
|
|
174
|
-
t.Run("produces non-empty output for compilation error", func(t *testing.T) {
|
|
175
|
-
input := `# command-line-arguments`
|
|
176
|
-
data := processAndReadOutput(t, input, tempDir)
|
|
177
|
-
|
|
178
|
-
if bytes.Contains(data, []byte(`"testModules":[]`)) {
|
|
179
|
-
t.Fatalf("Expected non-empty testModules, got: %s", data)
|
|
180
|
-
}
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
t.Run("only adds synthetic test for lines starting with #", func(t *testing.T) {
|
|
184
|
-
input := `some random error text`
|
|
185
|
-
data := processAndReadOutput(t, input, tempDir)
|
|
186
|
-
|
|
187
|
-
if !bytes.Contains(data, []byte(`"testModules":[]`)) {
|
|
188
|
-
t.Fatalf("Expected empty testModules for non-# input, got: %s", data)
|
|
189
|
-
}
|
|
190
|
-
})
|
|
191
|
-
|
|
192
|
-
t.Run("uses package name from compilation error", func(t *testing.T) {
|
|
193
|
-
input := `# command-line-arguments`
|
|
194
|
-
data := processAndReadOutput(t, input, tempDir)
|
|
195
|
-
|
|
196
|
-
if !bytes.Contains(data, []byte("command-line-arguments")) {
|
|
197
|
-
t.Fatalf("Expected command-line-arguments in output, got: %s", data)
|
|
198
|
-
}
|
|
199
|
-
})
|
|
200
|
-
|
|
201
|
-
t.Run("names the test CompilationError", func(t *testing.T) {
|
|
202
|
-
input := `# command-line-arguments`
|
|
203
|
-
data := processAndReadOutput(t, input, tempDir)
|
|
204
|
-
|
|
205
|
-
if !bytes.Contains(data, []byte("CompilationError")) {
|
|
206
|
-
t.Fatalf("Expected CompilationError in output, got: %s", data)
|
|
207
|
-
}
|
|
208
|
-
})
|
|
209
|
-
|
|
210
|
-
t.Run("includes compilation error message", func(t *testing.T) {
|
|
211
|
-
input := `# command-line-arguments
|
|
212
|
-
single_import_error_test.go:5:2: no required module`
|
|
213
|
-
data := processAndReadOutput(t, input, tempDir)
|
|
214
|
-
|
|
215
|
-
if !bytes.Contains(data, []byte("single_import_error_test.go:5:2")) {
|
|
216
|
-
t.Fatalf("Expected error message in output, got: %s", data)
|
|
217
|
-
}
|
|
218
|
-
})
|
|
219
|
-
|
|
220
|
-
t.Run("uses actual error message from input", func(t *testing.T) {
|
|
221
|
-
input := `# command-line-arguments
|
|
222
|
-
main.go:10:5: undefined: SomeFunction`
|
|
223
|
-
data := processAndReadOutput(t, input, tempDir)
|
|
224
|
-
|
|
225
|
-
if !bytes.Contains(data, []byte("main.go:10:5: undefined: SomeFunction")) {
|
|
226
|
-
t.Fatalf("Expected actual error message in output, got: %s", data)
|
|
227
|
-
}
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
t.Run("does not add CompilationError for passing package with no tests", func(t *testing.T) {
|
|
231
|
-
// Package passes but has no tests (like an empty test file)
|
|
232
|
-
input := `{"Action":"pass","Package":"example.com/pkg","Elapsed":0}`
|
|
233
|
-
data := processAndReadOutput(t, input, tempDir)
|
|
234
|
-
|
|
235
|
-
if bytes.Contains(data, []byte(`"CompilationError"`)) {
|
|
236
|
-
t.Fatalf("Should not add CompilationError for passing package, got: %s", data)
|
|
237
|
-
}
|
|
238
|
-
if !bytes.Contains(data, []byte(`"reason":"passed"`)) {
|
|
239
|
-
t.Fatalf("Expected reason to be 'passed' for empty passing package, got: %s", data)
|
|
240
|
-
}
|
|
241
|
-
})
|
|
242
|
-
})
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// Test helpers
|
|
246
|
-
func runProcess(t *testing.T, projectRoot string) error {
|
|
247
|
-
t.Helper()
|
|
248
|
-
json := `{"Action":"pass","Package":"example.com/pkg","Test":"TestExample"}`
|
|
249
|
-
return process(bytes.NewReader([]byte(json)), projectRoot, io.Discard)
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
func assertFileExists(t *testing.T, projectRoot string) {
|
|
253
|
-
t.Helper()
|
|
254
|
-
expectedPath := getTestFilePath(projectRoot)
|
|
255
|
-
if _, err := os.Stat(expectedPath); os.IsNotExist(err) {
|
|
256
|
-
t.Fatal("Expected output file to be created")
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
func assertErrorContains(t *testing.T, err error, expected string) {
|
|
261
|
-
t.Helper()
|
|
262
|
-
if err == nil || err.Error() != expected {
|
|
263
|
-
t.Fatalf("Expected error '%s', got: %v", expected, err)
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
func getTestFilePath(projectRoot string) string {
|
|
268
|
-
parts := append([]string{projectRoot}, storage.TestResultsPath...)
|
|
269
|
-
return filepath.Join(parts...)
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
func processAndReadOutput(t *testing.T, input string, projectRoot string) []byte {
|
|
273
|
-
t.Helper()
|
|
274
|
-
err := process(bytes.NewReader([]byte(input)), projectRoot, io.Discard)
|
|
275
|
-
if err != nil {
|
|
276
|
-
t.Fatal(err)
|
|
277
|
-
}
|
|
278
|
-
data, _ := os.ReadFile(getTestFilePath(projectRoot))
|
|
279
|
-
return data
|
|
280
|
-
}
|
|
File without changes
|