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.
Files changed (284) hide show
  1. package/README.md +132 -111
  2. package/cli/dist/index.cjs +142 -53
  3. package/cli/dist/index.cjs.map +1 -1
  4. package/cli/package.json +1 -1
  5. package/config/pi/extensions/beads.ts +24 -0
  6. package/hooks/beads-gate-core.mjs +6 -4
  7. package/hooks/beads-memory-gate.mjs +12 -5
  8. package/hooks/hooks.json +126 -0
  9. package/package.json +3 -1
  10. package/skills/test-planning/SKILL.md +208 -0
  11. package/skills/test-planning/evals/evals.json +23 -0
  12. package/skills/using-xtrm/SKILL.md +5 -27
  13. package/project-skills/tdd-guard/.claude/hooks/tdd-guard-pretool-bridge.cjs +0 -103
  14. package/project-skills/tdd-guard/.claude/settings.json +0 -38
  15. package/project-skills/tdd-guard/.claude/skills/using-tdd-guard/SKILL.md +0 -79
  16. package/project-skills/tdd-guard/CLAUDE.md +0 -98
  17. package/project-skills/tdd-guard/CONTRIBUTING.md +0 -38
  18. package/project-skills/tdd-guard/DEVELOPMENT.md +0 -127
  19. package/project-skills/tdd-guard/LICENSE +0 -21
  20. package/project-skills/tdd-guard/README.md +0 -398
  21. package/project-skills/tdd-guard/docs/adr/001-claude-session-subdirectory.md +0 -52
  22. package/project-skills/tdd-guard/docs/adr/002-secure-claude-binary-path.md +0 -56
  23. package/project-skills/tdd-guard/docs/adr/003-remove-configurable-data-directory.md +0 -56
  24. package/project-skills/tdd-guard/docs/adr/004-monorepo-architecture.md +0 -64
  25. package/project-skills/tdd-guard/docs/adr/005-claude-project-dir-support.md +0 -55
  26. package/project-skills/tdd-guard/docs/adr/006-phpunit-separate-repository.md +0 -93
  27. package/project-skills/tdd-guard/docs/adr/007-golangci-lint-path-support.md +0 -83
  28. package/project-skills/tdd-guard/docs/adr/008-storybook-reporter-design.md +0 -182
  29. package/project-skills/tdd-guard/docs/assets/tdd-guard-demo-screenshot.gif +0 -0
  30. package/project-skills/tdd-guard/docs/config-migration.md +0 -143
  31. package/project-skills/tdd-guard/docs/configuration.md +0 -137
  32. package/project-skills/tdd-guard/docs/custom-instructions.md +0 -43
  33. package/project-skills/tdd-guard/docs/enforcement.md +0 -46
  34. package/project-skills/tdd-guard/docs/ignore-patterns.md +0 -81
  35. package/project-skills/tdd-guard/docs/linting.md +0 -109
  36. package/project-skills/tdd-guard/docs/quick-commands.md +0 -52
  37. package/project-skills/tdd-guard/docs/session-management.md +0 -75
  38. package/project-skills/tdd-guard/docs/storybook-vitest-addon.md +0 -120
  39. package/project-skills/tdd-guard/docs/validation-model.md +0 -63
  40. package/project-skills/tdd-guard/eslint.config.mjs +0 -140
  41. package/project-skills/tdd-guard/package-lock.json +0 -16937
  42. package/project-skills/tdd-guard/package.json +0 -102
  43. package/project-skills/tdd-guard/reporters/go/README.md +0 -67
  44. package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main.go +0 -127
  45. package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main_test.go +0 -280
  46. package/project-skills/tdd-guard/reporters/go/go.mod +0 -3
  47. package/project-skills/tdd-guard/reporters/go/go.sum +0 -0
  48. package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter.go +0 -126
  49. package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter_test.go +0 -264
  50. package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader.go +0 -26
  51. package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader_test.go +0 -37
  52. package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader.go +0 -94
  53. package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader_test.go +0 -198
  54. package/project-skills/tdd-guard/reporters/go/internal/parser/parser.go +0 -245
  55. package/project-skills/tdd-guard/reporters/go/internal/parser/parser_test.go +0 -547
  56. package/project-skills/tdd-guard/reporters/go/internal/storage/storage.go +0 -35
  57. package/project-skills/tdd-guard/reporters/go/internal/storage/storage_test.go +0 -113
  58. package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer.go +0 -103
  59. package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer_test.go +0 -303
  60. package/project-skills/tdd-guard/reporters/jest/README.md +0 -102
  61. package/project-skills/tdd-guard/reporters/jest/package.json +0 -38
  62. package/project-skills/tdd-guard/reporters/jest/src/JestReporter.test-data.ts +0 -199
  63. package/project-skills/tdd-guard/reporters/jest/src/JestReporter.test.ts +0 -302
  64. package/project-skills/tdd-guard/reporters/jest/src/JestReporter.ts +0 -201
  65. package/project-skills/tdd-guard/reporters/jest/src/index.ts +0 -4
  66. package/project-skills/tdd-guard/reporters/jest/src/types.ts +0 -42
  67. package/project-skills/tdd-guard/reporters/jest/tsconfig.json +0 -11
  68. package/project-skills/tdd-guard/reporters/phpunit/.php-cs-fixer.php +0 -28
  69. package/project-skills/tdd-guard/reporters/phpunit/README.md +0 -97
  70. package/project-skills/tdd-guard/reporters/phpunit/SYNC_README.md +0 -29
  71. package/project-skills/tdd-guard/reporters/phpunit/composer.json +0 -55
  72. package/project-skills/tdd-guard/reporters/phpunit/phpunit.xml.dist +0 -19
  73. package/project-skills/tdd-guard/reporters/phpunit/psalm.xml +0 -44
  74. package/project-skills/tdd-guard/reporters/phpunit/src/Event/ErroredTestSubscriber.php +0 -28
  75. package/project-skills/tdd-guard/reporters/phpunit/src/Event/FailedTestSubscriber.php +0 -28
  76. package/project-skills/tdd-guard/reporters/phpunit/src/Event/IncompleteTestSubscriber.php +0 -28
  77. package/project-skills/tdd-guard/reporters/phpunit/src/Event/PassedTestSubscriber.php +0 -27
  78. package/project-skills/tdd-guard/reporters/phpunit/src/Event/SkippedTestSubscriber.php +0 -28
  79. package/project-skills/tdd-guard/reporters/phpunit/src/Event/TestRunnerFinishedSubscriber.php +0 -24
  80. package/project-skills/tdd-guard/reporters/phpunit/src/PathValidator.php +0 -88
  81. package/project-skills/tdd-guard/reporters/phpunit/src/Storage.php +0 -26
  82. package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardExtension.php +0 -33
  83. package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardListener.php +0 -158
  84. package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardSubscriber.php +0 -35
  85. package/project-skills/tdd-guard/reporters/phpunit/src/TestResultCollector.php +0 -105
  86. package/project-skills/tdd-guard/reporters/phpunit/tests/PathValidatorTest.php +0 -74
  87. package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionFailedTest.php +0 -241
  88. package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionTest.php +0 -84
  89. package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardStorageLocationTest.php +0 -71
  90. package/project-skills/tdd-guard/reporters/pytest/README.md +0 -77
  91. package/project-skills/tdd-guard/reporters/pytest/pyproject.toml +0 -43
  92. package/project-skills/tdd-guard/reporters/pytest/pytest.ini.example +0 -7
  93. package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/__init__.py +0 -1
  94. package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/pytest_reporter.py +0 -134
  95. package/project-skills/tdd-guard/reporters/pytest/tests/__init__.py +0 -1
  96. package/project-skills/tdd-guard/reporters/pytest/tests/conftest.py +0 -3
  97. package/project-skills/tdd-guard/reporters/pytest/tests/helpers.py +0 -293
  98. package/project-skills/tdd-guard/reporters/pytest/tests/test_config_option.py +0 -38
  99. package/project-skills/tdd-guard/reporters/pytest/tests/test_path_validation.py +0 -59
  100. package/project-skills/tdd-guard/reporters/pytest/tests/test_plugin_config.py +0 -32
  101. package/project-skills/tdd-guard/reporters/pytest/tests/test_project_root.py +0 -296
  102. package/project-skills/tdd-guard/reporters/pytest/tests/test_pytest_reporter.py +0 -137
  103. package/project-skills/tdd-guard/reporters/rspec/Gemfile +0 -3
  104. package/project-skills/tdd-guard/reporters/rust/Cargo.lock +0 -458
  105. package/project-skills/tdd-guard/reporters/rust/Cargo.toml +0 -33
  106. package/project-skills/tdd-guard/reporters/rust/Makefile.example +0 -95
  107. package/project-skills/tdd-guard/reporters/rust/README.md +0 -88
  108. package/project-skills/tdd-guard/reporters/rust/src/error_parser.rs +0 -309
  109. package/project-skills/tdd-guard/reporters/rust/src/main.rs +0 -464
  110. package/project-skills/tdd-guard/reporters/rust/src/parser.rs +0 -225
  111. package/project-skills/tdd-guard/reporters/rust/src/transformer.rs +0 -409
  112. package/project-skills/tdd-guard/reporters/storybook/README.md +0 -108
  113. package/project-skills/tdd-guard/reporters/storybook/package-lock.json +0 -9482
  114. package/project-skills/tdd-guard/reporters/storybook/package.json +0 -43
  115. package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test-data.ts +0 -22
  116. package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test.ts +0 -190
  117. package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.ts +0 -88
  118. package/project-skills/tdd-guard/reporters/storybook/src/index.ts +0 -12
  119. package/project-skills/tdd-guard/reporters/storybook/src/types.ts +0 -37
  120. package/project-skills/tdd-guard/reporters/storybook/tsconfig.json +0 -11
  121. package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/go.mod +0 -3
  122. package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/single_failing_test.go +0 -13
  123. package/project-skills/tdd-guard/reporters/test/artifacts/go/import/go.mod +0 -3
  124. package/project-skills/tdd-guard/reporters/test/artifacts/go/import/single_import_error_test.go +0 -17
  125. package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/go.mod +0 -3
  126. package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/single_passing_test.go +0 -13
  127. package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-failing.test.js +0 -5
  128. package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-import-error.test.js +0 -8
  129. package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-passing.test.js +0 -5
  130. package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleFailingTest.php +0 -11
  131. package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleImportErrorTest.php +0 -14
  132. package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SinglePassingTest.php +0 -11
  133. package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_failing.py +0 -3
  134. package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_import_error.py +0 -6
  135. package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_passing.py +0 -3
  136. package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.lock +0 -7
  137. package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.toml +0 -4
  138. package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/src/lib.rs +0 -14
  139. package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.lock +0 -7
  140. package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.toml +0 -4
  141. package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/src/lib.rs +0 -13
  142. package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.lock +0 -7
  143. package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.toml +0 -4
  144. package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/src/lib.rs +0 -14
  145. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/Calculator.js +0 -4
  146. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-failing.stories.js +0 -15
  147. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-import-error.stories.js +0 -14
  148. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-passing.stories.js +0 -15
  149. package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-failing.test.js +0 -7
  150. package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-import-error.test.js +0 -9
  151. package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-passing.test.js +0 -7
  152. package/project-skills/tdd-guard/reporters/test/factories/go.ts +0 -59
  153. package/project-skills/tdd-guard/reporters/test/factories/helpers.ts +0 -48
  154. package/project-skills/tdd-guard/reporters/test/factories/index.ts +0 -7
  155. package/project-skills/tdd-guard/reporters/test/factories/jest.ts +0 -51
  156. package/project-skills/tdd-guard/reporters/test/factories/phpunit.ts +0 -63
  157. package/project-skills/tdd-guard/reporters/test/factories/pytest.ts +0 -41
  158. package/project-skills/tdd-guard/reporters/test/factories/rust.ts +0 -158
  159. package/project-skills/tdd-guard/reporters/test/factories/storybook.ts +0 -198
  160. package/project-skills/tdd-guard/reporters/test/factories/vitest.ts +0 -51
  161. package/project-skills/tdd-guard/reporters/test/reporters.integration.test.ts +0 -735
  162. package/project-skills/tdd-guard/reporters/test/types.ts +0 -28
  163. package/project-skills/tdd-guard/reporters/vitest/README.md +0 -64
  164. package/project-skills/tdd-guard/reporters/vitest/package.json +0 -35
  165. package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.test-data.ts +0 -85
  166. package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.test.ts +0 -446
  167. package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.ts +0 -110
  168. package/project-skills/tdd-guard/reporters/vitest/src/index.ts +0 -4
  169. package/project-skills/tdd-guard/reporters/vitest/src/types.ts +0 -39
  170. package/project-skills/tdd-guard/reporters/vitest/tsconfig.json +0 -11
  171. package/project-skills/tdd-guard/src/cli/buildContext.test.ts +0 -200
  172. package/project-skills/tdd-guard/src/cli/buildContext.ts +0 -48
  173. package/project-skills/tdd-guard/src/cli/tdd-guard.test.ts +0 -159
  174. package/project-skills/tdd-guard/src/cli/tdd-guard.ts +0 -48
  175. package/project-skills/tdd-guard/src/config/Config.test.ts +0 -538
  176. package/project-skills/tdd-guard/src/config/Config.ts +0 -172
  177. package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.test.ts +0 -58
  178. package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.ts +0 -8
  179. package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.test.ts +0 -347
  180. package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.ts +0 -61
  181. package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.test.ts +0 -24
  182. package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.ts +0 -7
  183. package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.test.ts +0 -377
  184. package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.ts +0 -75
  185. package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.test.ts +0 -563
  186. package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.ts +0 -140
  187. package/project-skills/tdd-guard/src/contracts/types/ClientType.ts +0 -1
  188. package/project-skills/tdd-guard/src/contracts/types/ConfigOptions.ts +0 -12
  189. package/project-skills/tdd-guard/src/contracts/types/Context.ts +0 -16
  190. package/project-skills/tdd-guard/src/contracts/types/ModelClient.ts +0 -3
  191. package/project-skills/tdd-guard/src/contracts/types/ValidationResult.ts +0 -6
  192. package/project-skills/tdd-guard/src/guard/GuardManager.test.ts +0 -336
  193. package/project-skills/tdd-guard/src/guard/GuardManager.ts +0 -83
  194. package/project-skills/tdd-guard/src/hooks/HookEvents.test.ts +0 -107
  195. package/project-skills/tdd-guard/src/hooks/HookEvents.ts +0 -39
  196. package/project-skills/tdd-guard/src/hooks/fileTypeDetection.ts +0 -16
  197. package/project-skills/tdd-guard/src/hooks/postToolLint.test.ts +0 -327
  198. package/project-skills/tdd-guard/src/hooks/postToolLint.ts +0 -165
  199. package/project-skills/tdd-guard/src/hooks/processHookData.test.ts +0 -465
  200. package/project-skills/tdd-guard/src/hooks/processHookData.ts +0 -203
  201. package/project-skills/tdd-guard/src/hooks/sessionHandler.test.ts +0 -136
  202. package/project-skills/tdd-guard/src/hooks/sessionHandler.ts +0 -31
  203. package/project-skills/tdd-guard/src/hooks/userPromptHandler.test.ts +0 -131
  204. package/project-skills/tdd-guard/src/hooks/userPromptHandler.ts +0 -55
  205. package/project-skills/tdd-guard/src/index.ts +0 -19
  206. package/project-skills/tdd-guard/src/linters/Linter.ts +0 -5
  207. package/project-skills/tdd-guard/src/linters/eslint/ESLint.test.ts +0 -183
  208. package/project-skills/tdd-guard/src/linters/eslint/ESLint.ts +0 -82
  209. package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.test.ts +0 -170
  210. package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.ts +0 -148
  211. package/project-skills/tdd-guard/src/processors/index.ts +0 -1
  212. package/project-skills/tdd-guard/src/processors/lintProcessor.ts +0 -77
  213. package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.test.ts +0 -303
  214. package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.ts +0 -255
  215. package/project-skills/tdd-guard/src/providers/LinterProvider.test.ts +0 -43
  216. package/project-skills/tdd-guard/src/providers/LinterProvider.ts +0 -20
  217. package/project-skills/tdd-guard/src/providers/ModelClientProvider.test.ts +0 -68
  218. package/project-skills/tdd-guard/src/providers/ModelClientProvider.ts +0 -22
  219. package/project-skills/tdd-guard/src/storage/FileStorage.test.ts +0 -76
  220. package/project-skills/tdd-guard/src/storage/FileStorage.ts +0 -108
  221. package/project-skills/tdd-guard/src/storage/MemoryStorage.ts +0 -57
  222. package/project-skills/tdd-guard/src/storage/Storage.test.ts +0 -227
  223. package/project-skills/tdd-guard/src/storage/Storage.ts +0 -17
  224. package/project-skills/tdd-guard/src/validation/context/context.test.ts +0 -364
  225. package/project-skills/tdd-guard/src/validation/context/context.ts +0 -155
  226. package/project-skills/tdd-guard/src/validation/models/AnthropicApi.test.ts +0 -171
  227. package/project-skills/tdd-guard/src/validation/models/AnthropicApi.ts +0 -49
  228. package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.test.ts +0 -167
  229. package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.ts +0 -54
  230. package/project-skills/tdd-guard/src/validation/models/ClaudeCli.test.ts +0 -239
  231. package/project-skills/tdd-guard/src/validation/models/ClaudeCli.ts +0 -57
  232. package/project-skills/tdd-guard/src/validation/prompts/file-types.ts +0 -52
  233. package/project-skills/tdd-guard/src/validation/prompts/operations/edit.ts +0 -58
  234. package/project-skills/tdd-guard/src/validation/prompts/operations/multi-edit.ts +0 -54
  235. package/project-skills/tdd-guard/src/validation/prompts/operations/write.ts +0 -54
  236. package/project-skills/tdd-guard/src/validation/prompts/response.ts +0 -40
  237. package/project-skills/tdd-guard/src/validation/prompts/rules.ts +0 -51
  238. package/project-skills/tdd-guard/src/validation/prompts/system-prompt.ts +0 -10
  239. package/project-skills/tdd-guard/src/validation/prompts/tools/lint-results.ts +0 -15
  240. package/project-skills/tdd-guard/src/validation/prompts/tools/test-output.ts +0 -14
  241. package/project-skills/tdd-guard/src/validation/prompts/tools/todos.ts +0 -9
  242. package/project-skills/tdd-guard/src/validation/validator.test.ts +0 -268
  243. package/project-skills/tdd-guard/src/validation/validator.ts +0 -159
  244. package/project-skills/tdd-guard/test/artifacts/go/.golangci.yml +0 -6
  245. package/project-skills/tdd-guard/test/artifacts/go/with-issues/file-with-issues.go +0 -12
  246. package/project-skills/tdd-guard/test/artifacts/go/with-issues/go.mod +0 -3
  247. package/project-skills/tdd-guard/test/artifacts/go/without-issues/file-without-issues.go +0 -7
  248. package/project-skills/tdd-guard/test/artifacts/go/without-issues/go.mod +0 -3
  249. package/project-skills/tdd-guard/test/artifacts/javascript/eslint.config.js +0 -20
  250. package/project-skills/tdd-guard/test/artifacts/javascript/file-with-issues.js +0 -12
  251. package/project-skills/tdd-guard/test/artifacts/javascript/file-without-issues.js +0 -10
  252. package/project-skills/tdd-guard/test/hooks/fileTypeDetection.test.ts +0 -26
  253. package/project-skills/tdd-guard/test/hooks/processHookData.fileType.test.ts +0 -46
  254. package/project-skills/tdd-guard/test/hooks/processHookData.python.test.ts +0 -68
  255. package/project-skills/tdd-guard/test/integration/test-context.test.ts +0 -66
  256. package/project-skills/tdd-guard/test/integration/validator.core.test.ts +0 -96
  257. package/project-skills/tdd-guard/test/integration/validator.scenarios.test.ts +0 -497
  258. package/project-skills/tdd-guard/test/utils/assertions.ts +0 -29
  259. package/project-skills/tdd-guard/test/utils/factories/contextFactory.ts +0 -30
  260. package/project-skills/tdd-guard/test/utils/factories/editFactory.ts +0 -82
  261. package/project-skills/tdd-guard/test/utils/factories/helpers.test.ts +0 -46
  262. package/project-skills/tdd-guard/test/utils/factories/helpers.ts +0 -46
  263. package/project-skills/tdd-guard/test/utils/factories/lintFactory.ts +0 -352
  264. package/project-skills/tdd-guard/test/utils/factories/modelClientProviderFactory.ts +0 -21
  265. package/project-skills/tdd-guard/test/utils/factories/multiEditFactory.ts +0 -79
  266. package/project-skills/tdd-guard/test/utils/factories/operations.ts +0 -57
  267. package/project-skills/tdd-guard/test/utils/factories/reporterFactory.ts +0 -55
  268. package/project-skills/tdd-guard/test/utils/factories/scenarios/index.ts +0 -22
  269. package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/python.ts +0 -745
  270. package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/typescript.ts +0 -767
  271. package/project-skills/tdd-guard/test/utils/factories/scenarios/types.ts +0 -77
  272. package/project-skills/tdd-guard/test/utils/factories/scenarios/utils.ts +0 -15
  273. package/project-skills/tdd-guard/test/utils/factories/sessionStartFactory.ts +0 -36
  274. package/project-skills/tdd-guard/test/utils/factories/testDefaults.ts +0 -90
  275. package/project-skills/tdd-guard/test/utils/factories/testResultsFactory.ts +0 -234
  276. package/project-skills/tdd-guard/test/utils/factories/todoFactory.ts +0 -99
  277. package/project-skills/tdd-guard/test/utils/factories/userPromptSubmitFactory.ts +0 -39
  278. package/project-skills/tdd-guard/test/utils/factories/writeFactory.ts +0 -70
  279. package/project-skills/tdd-guard/test/utils/index.ts +0 -131
  280. package/project-skills/tdd-guard/tsconfig.build.json +0 -16
  281. package/project-skills/tdd-guard/tsconfig.eslint.json +0 -17
  282. package/project-skills/tdd-guard/tsconfig.json +0 -32
  283. package/project-skills/tdd-guard/tsconfig.node.json +0 -10
  284. package/project-skills/tdd-guard/vitest.config.ts +0 -85
@@ -1,158 +0,0 @@
1
- <?php
2
-
3
- declare(strict_types=1);
4
-
5
- namespace TddGuard\PHPUnit;
6
-
7
- use PHPUnit\Framework\AssertionFailedError;
8
- use PHPUnit\Framework\Test;
9
- use PHPUnit\Framework\TestCase;
10
- use PHPUnit\Framework\TestListener;
11
- use PHPUnit\Framework\TestListenerDefaultImplementation;
12
- use PHPUnit\Framework\TestSuite;
13
- use PHPUnit\Framework\Warning;
14
- use Throwable;
15
-
16
- /**
17
- * @psalm-api
18
- */
19
- final class TddGuardListener implements TestListener
20
- {
21
- use TestListenerDefaultImplementation;
22
-
23
- private array $testResults = [];
24
- private string $projectRoot;
25
-
26
- public function __construct(string $projectRoot = '')
27
- {
28
- $this->projectRoot = PathValidator::resolveProjectRoot($projectRoot);
29
- }
30
-
31
- public function startTest(Test $test): void
32
- {
33
- }
34
-
35
- public function endTest(Test $test, float $time): void
36
- {
37
- if (!$test instanceof TestCase) {
38
- return;
39
- }
40
-
41
- $fullName = $test->toString();
42
-
43
- foreach ($this->testResults as $result) {
44
- if ($result['test']['fullName'] === $fullName) {
45
- return;
46
- }
47
- }
48
-
49
- $this->addTestResult($test, 'passed');
50
- }
51
-
52
- public function addError(Test $test, Throwable $t, float $time): void
53
- {
54
- $this->addTestResult($test, 'failed', $t->getMessage());
55
- }
56
-
57
- public function addFailure(Test $test, AssertionFailedError $e, float $time): void
58
- {
59
- $this->addTestResult($test, 'failed', $e->getMessage());
60
- }
61
-
62
- public function addWarning(Test $test, Warning $e, float $time): void
63
- {
64
- $this->addTestResult($test, 'failed', 'Warning: ' . $e->getMessage());
65
- }
66
-
67
- public function addIncompleteTest(Test $test, Throwable $t, float $time): void
68
- {
69
- $this->addTestResult($test, 'skipped', 'Incomplete: ' . $t->getMessage());
70
- }
71
-
72
- public function addRiskyTest(Test $test, Throwable $t, float $time): void
73
- {
74
- $this->addTestResult($test, 'failed', 'Risky: ' . $t->getMessage());
75
- }
76
-
77
- public function addSkippedTest(Test $test, Throwable $t, float $time): void
78
- {
79
- $this->addTestResult($test, 'skipped', $t->getMessage());
80
- }
81
-
82
- private function addTestResult(Test $test, string $state, ?string $message = null): void
83
- {
84
- if (!$test instanceof TestCase) {
85
- return;
86
- }
87
-
88
- $testName = $test->getName();
89
- $className = get_class($test);
90
- $fullName = $test->toString();
91
-
92
- $result = [
93
- 'name' => $testName,
94
- 'fullName' => $fullName,
95
- 'state' => $state,
96
- ];
97
-
98
- if ($message !== null && $state === 'failed') {
99
- $result['errors'] = [
100
- ['message' => $message],
101
- ];
102
- }
103
-
104
- try {
105
- $reflection = new \ReflectionClass($className);
106
- $moduleId = $this->getRelativePath($reflection->getFileName());
107
- } catch (\ReflectionException $e) {
108
- $moduleId = str_replace('\\', '/', $className) . '.php';
109
- }
110
-
111
- $this->testResults[] = [
112
- 'test' => $result,
113
- 'module' => $moduleId,
114
- ];
115
- }
116
-
117
- private function getRelativePath(string $absolutePath): string
118
- {
119
- if (str_starts_with($absolutePath, $this->projectRoot)) {
120
- $relativePath = substr($absolutePath, strlen($this->projectRoot) + 1);
121
-
122
- return str_replace(DIRECTORY_SEPARATOR, '/', $relativePath);
123
- }
124
-
125
- return basename($absolutePath);
126
- }
127
-
128
- public function endTestSuite(TestSuite $suite): void
129
- {
130
- if (empty($this->testResults)) {
131
- return;
132
- }
133
-
134
- $this->saveResults();
135
- }
136
-
137
- private function saveResults(): void
138
- {
139
- $modules = [];
140
- foreach ($this->testResults as $item) {
141
- $moduleId = $item['module'];
142
- if (!isset($modules[$moduleId])) {
143
- $modules[$moduleId] = [
144
- 'moduleId' => $moduleId,
145
- 'tests' => [],
146
- ];
147
- }
148
- $modules[$moduleId]['tests'][] = $item['test'];
149
- }
150
-
151
- $output = [
152
- 'testModules' => array_values($modules),
153
- ];
154
-
155
- $reporter = new Storage($this->projectRoot);
156
- $reporter->saveTest(json_encode($output, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
157
- }
158
- }
@@ -1,35 +0,0 @@
1
- <?php
2
-
3
- declare(strict_types=1);
4
-
5
- namespace TddGuard\PHPUnit;
6
-
7
- use TddGuard\PHPUnit\Event\ErroredTestSubscriber;
8
- use TddGuard\PHPUnit\Event\FailedTestSubscriber;
9
- use TddGuard\PHPUnit\Event\IncompleteTestSubscriber;
10
- use TddGuard\PHPUnit\Event\PassedTestSubscriber;
11
- use TddGuard\PHPUnit\Event\SkippedTestSubscriber;
12
- use TddGuard\PHPUnit\Event\TestRunnerFinishedSubscriber;
13
-
14
- final class TddGuardSubscriber
15
- {
16
- private TestResultCollector $collector;
17
-
18
- public function __construct(string $projectRoot)
19
- {
20
- $storage = new Storage($projectRoot);
21
- $this->collector = new TestResultCollector($storage, $projectRoot);
22
- }
23
-
24
- public function getSubscribers(): array
25
- {
26
- return [
27
- new PassedTestSubscriber($this->collector),
28
- new FailedTestSubscriber($this->collector),
29
- new ErroredTestSubscriber($this->collector),
30
- new SkippedTestSubscriber($this->collector),
31
- new IncompleteTestSubscriber($this->collector),
32
- new TestRunnerFinishedSubscriber($this->collector),
33
- ];
34
- }
35
- }
@@ -1,105 +0,0 @@
1
- <?php
2
-
3
- declare(strict_types=1);
4
-
5
- namespace TddGuard\PHPUnit;
6
-
7
- final class TestResultCollector
8
- {
9
- private array $testResults = [];
10
- private Storage $storage;
11
- private string $projectRoot;
12
-
13
- public function __construct(Storage $storage, string $projectRoot)
14
- {
15
- $this->storage = $storage;
16
- $this->projectRoot = rtrim($projectRoot, DIRECTORY_SEPARATOR);
17
- }
18
-
19
- public function addTestResult($test, string $state, ?string $message = null): void
20
- {
21
- $testName = $test->name();
22
- $className = $test->className();
23
- $fullName = $className . '::' . $testName;
24
-
25
- $result = [
26
- 'name' => $testName,
27
- 'fullName' => $fullName,
28
- 'state' => $state,
29
- ];
30
-
31
- if ($message !== null && ($state === 'failed' || $state === 'errored')) {
32
- $result['errors'] = [
33
- ['message' => $message],
34
- ];
35
- }
36
-
37
- try {
38
- $reflection = new \ReflectionClass($className);
39
- $moduleId = $this->getRelativePath($reflection->getFileName());
40
- } catch (\ReflectionException $e) {
41
- $moduleId = str_replace('\\', '/', (string) $className) . '.php';
42
- }
43
-
44
- $this->testResults[] = [
45
- 'test' => $result,
46
- 'module' => $moduleId,
47
- ];
48
- }
49
-
50
- private function getRelativePath(string $absolutePath): string
51
- {
52
- if (str_starts_with($absolutePath, $this->projectRoot)) {
53
- $relativePath = substr($absolutePath, strlen($this->projectRoot) + 1);
54
-
55
- return str_replace(DIRECTORY_SEPARATOR, '/', $relativePath);
56
- }
57
-
58
- $cwd = getcwd();
59
- if (str_starts_with($absolutePath, $cwd)) {
60
- $relativePath = substr($absolutePath, strlen($cwd) + 1);
61
-
62
- return str_replace(DIRECTORY_SEPARATOR, '/', $relativePath);
63
- }
64
-
65
- return basename($absolutePath);
66
- }
67
-
68
- public function saveResults(): void
69
- {
70
- if (empty($this->testResults)) {
71
- return;
72
- }
73
-
74
- $modules = [];
75
- $hasFailures = false;
76
-
77
- foreach ($this->testResults as $item) {
78
- $moduleId = $item['module'];
79
- if (!isset($modules[$moduleId])) {
80
- $modules[$moduleId] = [
81
- 'moduleId' => $moduleId,
82
- 'tests' => [],
83
- ];
84
- }
85
-
86
- // Normalize 'errored' to 'failed'
87
- $test = $item['test'];
88
- if ($test['state'] === 'errored') {
89
- $test['state'] = 'failed';
90
- }
91
- $modules[$moduleId]['tests'][] = $test;
92
-
93
- if ($test['state'] === 'failed') {
94
- $hasFailures = true;
95
- }
96
- }
97
-
98
- $output = [
99
- 'testModules' => array_values($modules),
100
- 'reason' => $hasFailures ? 'failed' : 'passed',
101
- ];
102
-
103
- $this->storage->saveTest(json_encode($output, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
104
- }
105
- }
@@ -1,74 +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\PathValidator;
10
-
11
- final class PathValidatorTest 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-path-test-' . uniqid();
21
- $this->filesystem->mkdir($this->tempDir);
22
- $this->originalCwd = getcwd();
23
- }
24
-
25
- protected function tearDown(): void
26
- {
27
- chdir($this->originalCwd);
28
- $this->filesystem->remove($this->tempDir);
29
- }
30
-
31
- public function testRejectsPathTraversal(): void
32
- {
33
- // Given: A path with directory traversal
34
- $pathWithTraversal = $this->tempDir . '/../dangerous';
35
-
36
- // Then: Should throw exception
37
- $this->expectException(\InvalidArgumentException::class);
38
- $this->expectExceptionMessage('Configured project root is invalid');
39
-
40
- // When: Validating the path
41
- PathValidator::resolveProjectRoot($pathWithTraversal);
42
- }
43
-
44
- public function testAllowsAncestorOfCurrentDirectory(): void
45
- {
46
- // Given: Working in a subdirectory
47
- $subDir = $this->tempDir . '/subdir';
48
- $this->filesystem->mkdir($subDir);
49
- chdir($subDir);
50
-
51
- // When: Validating the parent directory
52
- $result = PathValidator::resolveProjectRoot($this->tempDir);
53
-
54
- // Then: Should return the validated path
55
- $this->assertEquals(realpath($this->tempDir), $result);
56
- }
57
-
58
- public function testRejectsNonAncestorDirectory(): void
59
- {
60
- // Given: Two sibling directories
61
- $dir1 = $this->tempDir . '/dir1';
62
- $dir2 = $this->tempDir . '/dir2';
63
- $this->filesystem->mkdir($dir1);
64
- $this->filesystem->mkdir($dir2);
65
- chdir($dir1);
66
-
67
- // Then: Should throw exception
68
- $this->expectException(\InvalidArgumentException::class);
69
- $this->expectExceptionMessage('Configured project root is invalid');
70
-
71
- // When: Trying to use sibling directory as project root
72
- PathValidator::resolveProjectRoot($dir2);
73
- }
74
- }
@@ -1,241 +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 TddGuardExtensionFailedTest 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 testExtensionCapturesFailedTest(): void
28
- {
29
- // Given: A test file with a failing test
30
- $testFile = $this->tempDir . '/FailingTest.php';
31
- file_put_contents($testFile, '<?php
32
- use PHPUnit\Framework\TestCase;
33
- class FailingTest extends TestCase {
34
- public function testFailing(): void {
35
- $this->assertEquals(5, 2 + 2, "Math is broken!");
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 fail and contain error details
66
- $this->assertNotEquals(0, $returnCode, 'PHPUnit should exit with non-zero');
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->assertArrayHasKey('reason', $data);
72
- $this->assertEquals('failed', $data['reason']);
73
-
74
- $module = $data['testModules'][0];
75
- $test = $module['tests'][0];
76
- $this->assertEquals('testFailing', $test['name']);
77
- $this->assertEquals('FailingTest::testFailing', $test['fullName']);
78
- $this->assertEquals('failed', $test['state']);
79
- $this->assertArrayHasKey('errors', $test);
80
- $this->assertStringContainsString('Math is broken!', $test['errors'][0]['message']);
81
- }
82
-
83
- public function testExtensionCapturesErroredTest(): void
84
- {
85
- // Given: A test file with a test that errors
86
- $testFile = $this->tempDir . '/ErroredTest.php';
87
- file_put_contents($testFile, '<?php
88
- use PHPUnit\Framework\TestCase;
89
- class ErroredTest extends TestCase {
90
- public function testWithError(): void {
91
- throw new \RuntimeException("Something went terribly wrong!");
92
- }
93
- }');
94
-
95
- $phpunitXml = $this->tempDir . '/phpunit.xml';
96
- file_put_contents($phpunitXml, '<?xml version="1.0" encoding="UTF-8"?>
97
- <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
98
- xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
99
- bootstrap="' . dirname(__DIR__) . '/vendor/autoload.php">
100
- <testsuites>
101
- <testsuite name="Example">
102
- <file>' . $testFile . '</file>
103
- </testsuite>
104
- </testsuites>
105
- <extensions>
106
- <bootstrap class="TddGuard\PHPUnit\TddGuardExtension">
107
- <parameter name="projectRoot" value="' . $this->tempDir . '"/>
108
- </bootstrap>
109
- </extensions>
110
- </phpunit>');
111
-
112
- // When: We run PHPUnit with our extension
113
- $command = sprintf(
114
- 'cd %s && php %s/vendor/bin/phpunit -c %s 2>&1',
115
- escapeshellarg($this->tempDir),
116
- escapeshellarg(dirname(__DIR__)),
117
- escapeshellarg($phpunitXml)
118
- );
119
- exec($command, $output, $returnCode);
120
-
121
- // Then: The test should error and reason should be failed
122
- $this->assertNotEquals(0, $returnCode, 'PHPUnit should exit with non-zero');
123
- $jsonPath = $this->tempDir . '/.claude/tdd-guard/data/test.json';
124
- $this->assertFileExists($jsonPath);
125
- $data = json_decode(file_get_contents($jsonPath), true);
126
- $this->assertArrayHasKey('reason', $data);
127
- $this->assertEquals('failed', $data['reason']);
128
-
129
- $module = $data['testModules'][0];
130
- $test = $module['tests'][0];
131
- $this->assertEquals('testWithError', $test['name']);
132
- $this->assertEquals('failed', $test['state']);
133
- $this->assertArrayHasKey('errors', $test);
134
- $this->assertStringContainsString('Something went terribly wrong!', $test['errors'][0]['message']);
135
- }
136
-
137
- public function testErroredStateIsNormalizedToFailed(): void
138
- {
139
- // This test ensures 'errored' states are normalized to 'failed' for TDD Guard compatibility
140
- // Prevents regression where errored states break schema validation
141
-
142
- // Given: A test file that will cause a PHP error
143
- $testFile = $this->tempDir . '/ErrorTest.php';
144
- file_put_contents($testFile, '<?php
145
- use PHPUnit\Framework\TestCase;
146
-
147
- class ErrorTest extends TestCase
148
- {
149
- public function testUndefinedMethod(): void
150
- {
151
- $this->nonExistentMethod(); // This will cause a PHP error
152
- }
153
- }
154
- ');
155
-
156
- // When: PHPUnit runs with TDD Guard extension
157
- $phpunitXml = $this->tempDir . '/phpunit.xml';
158
- file_put_contents($phpunitXml, '<?xml version="1.0" encoding="UTF-8"?>
159
- <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
160
- xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.0/phpunit.xsd"
161
- bootstrap="' . dirname(__DIR__) . '/vendor/autoload.php"
162
- colors="true">
163
- <extensions>
164
- <bootstrap class="TddGuard\\PHPUnit\\TddGuardExtension"/>
165
- </extensions>
166
- <testsuites>
167
- <testsuite name="test">
168
- <file>' . $testFile . '</file>
169
- </testsuite>
170
- </testsuites>
171
- </phpunit>');
172
-
173
- $command = sprintf(
174
- 'cd %s && php %s/vendor/bin/phpunit -c %s 2>&1',
175
- escapeshellarg($this->tempDir),
176
- escapeshellarg(dirname(__DIR__)),
177
- escapeshellarg($phpunitXml)
178
- );
179
- exec($command, $output, $returnCode);
180
-
181
- // Then: The errored test should be normalized to 'failed' state
182
- $this->assertNotEquals(0, $returnCode, 'PHPUnit should exit with non-zero');
183
- $jsonPath = $this->tempDir . '/.claude/tdd-guard/data/test.json';
184
- $this->assertFileExists($jsonPath);
185
- $data = json_decode(file_get_contents($jsonPath), true);
186
-
187
- $test = $data['testModules'][0]['tests'][0];
188
- $this->assertEquals('failed', $test['state'], 'Errored test should be normalized to failed state');
189
- $this->assertArrayHasKey('errors', $test, 'Failed test should have error details');
190
- }
191
-
192
- public function testExtensionCapturesSkippedTest(): void
193
- {
194
- // Given: A test file with a skipped test
195
- $testFile = $this->tempDir . '/SkippedTest.php';
196
- file_put_contents($testFile, '<?php
197
- use PHPUnit\Framework\TestCase;
198
- class SkippedTest extends TestCase {
199
- public function testSkipped(): void {
200
- $this->markTestSkipped("Not implemented yet");
201
- }
202
- }');
203
-
204
- $phpunitXml = $this->tempDir . '/phpunit.xml';
205
- file_put_contents($phpunitXml, '<?xml version="1.0" encoding="UTF-8"?>
206
- <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
207
- xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
208
- bootstrap="' . dirname(__DIR__) . '/vendor/autoload.php">
209
- <testsuites>
210
- <testsuite name="Example">
211
- <file>' . $testFile . '</file>
212
- </testsuite>
213
- </testsuites>
214
- <extensions>
215
- <bootstrap class="TddGuard\PHPUnit\TddGuardExtension">
216
- <parameter name="projectRoot" value="' . $this->tempDir . '"/>
217
- </bootstrap>
218
- </extensions>
219
- </phpunit>');
220
-
221
- // When: We run PHPUnit with our extension
222
- $command = sprintf(
223
- 'cd %s && php %s/vendor/bin/phpunit -c %s 2>&1',
224
- escapeshellarg($this->tempDir),
225
- escapeshellarg(dirname(__DIR__)),
226
- escapeshellarg($phpunitXml)
227
- );
228
- exec($command, $output, $returnCode);
229
-
230
- // Then: The skipped test should be recorded
231
- $jsonPath = $this->tempDir . '/.claude/tdd-guard/data/test.json';
232
- $this->assertFileExists($jsonPath);
233
- $data = json_decode(file_get_contents($jsonPath), true);
234
- $this->assertArrayHasKey('reason', $data);
235
- $this->assertEquals('passed', $data['reason']);
236
- $module = $data['testModules'][0];
237
- $test = $module['tests'][0];
238
- $this->assertEquals('testSkipped', $test['name']);
239
- $this->assertEquals('skipped', $test['state']);
240
- }
241
- }