xtrm-tools 2.2.0 → 2.4.0

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 (286) hide show
  1. package/README.md +127 -104
  2. package/cli/dist/index.cjs +1078 -970
  3. package/cli/dist/index.cjs.map +1 -1
  4. package/cli/package.json +1 -1
  5. package/config/pi/extensions/beads.ts +33 -5
  6. package/config/pi/extensions/service-skills.ts +17 -9
  7. package/config/pi/install-schema.json +2 -1
  8. package/hooks/beads-gate-core.mjs +6 -4
  9. package/hooks/beads-memory-gate.mjs +12 -5
  10. package/hooks/hooks.json +126 -0
  11. package/package.json +3 -1
  12. package/skills/test-planning/SKILL.md +208 -0
  13. package/skills/test-planning/evals/evals.json +23 -0
  14. package/skills/using-xtrm/SKILL.md +5 -27
  15. package/project-skills/tdd-guard/.claude/hooks/tdd-guard-pretool-bridge.cjs +0 -103
  16. package/project-skills/tdd-guard/.claude/settings.json +0 -38
  17. package/project-skills/tdd-guard/.claude/skills/using-tdd-guard/SKILL.md +0 -79
  18. package/project-skills/tdd-guard/CLAUDE.md +0 -98
  19. package/project-skills/tdd-guard/CONTRIBUTING.md +0 -38
  20. package/project-skills/tdd-guard/DEVELOPMENT.md +0 -127
  21. package/project-skills/tdd-guard/LICENSE +0 -21
  22. package/project-skills/tdd-guard/README.md +0 -398
  23. package/project-skills/tdd-guard/docs/adr/001-claude-session-subdirectory.md +0 -52
  24. package/project-skills/tdd-guard/docs/adr/002-secure-claude-binary-path.md +0 -56
  25. package/project-skills/tdd-guard/docs/adr/003-remove-configurable-data-directory.md +0 -56
  26. package/project-skills/tdd-guard/docs/adr/004-monorepo-architecture.md +0 -64
  27. package/project-skills/tdd-guard/docs/adr/005-claude-project-dir-support.md +0 -55
  28. package/project-skills/tdd-guard/docs/adr/006-phpunit-separate-repository.md +0 -93
  29. package/project-skills/tdd-guard/docs/adr/007-golangci-lint-path-support.md +0 -83
  30. package/project-skills/tdd-guard/docs/adr/008-storybook-reporter-design.md +0 -182
  31. package/project-skills/tdd-guard/docs/assets/tdd-guard-demo-screenshot.gif +0 -0
  32. package/project-skills/tdd-guard/docs/config-migration.md +0 -143
  33. package/project-skills/tdd-guard/docs/configuration.md +0 -137
  34. package/project-skills/tdd-guard/docs/custom-instructions.md +0 -43
  35. package/project-skills/tdd-guard/docs/enforcement.md +0 -46
  36. package/project-skills/tdd-guard/docs/ignore-patterns.md +0 -81
  37. package/project-skills/tdd-guard/docs/linting.md +0 -109
  38. package/project-skills/tdd-guard/docs/quick-commands.md +0 -52
  39. package/project-skills/tdd-guard/docs/session-management.md +0 -75
  40. package/project-skills/tdd-guard/docs/storybook-vitest-addon.md +0 -120
  41. package/project-skills/tdd-guard/docs/validation-model.md +0 -63
  42. package/project-skills/tdd-guard/eslint.config.mjs +0 -140
  43. package/project-skills/tdd-guard/package-lock.json +0 -16937
  44. package/project-skills/tdd-guard/package.json +0 -102
  45. package/project-skills/tdd-guard/reporters/go/README.md +0 -67
  46. package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main.go +0 -127
  47. package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main_test.go +0 -280
  48. package/project-skills/tdd-guard/reporters/go/go.mod +0 -3
  49. package/project-skills/tdd-guard/reporters/go/go.sum +0 -0
  50. package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter.go +0 -126
  51. package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter_test.go +0 -264
  52. package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader.go +0 -26
  53. package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader_test.go +0 -37
  54. package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader.go +0 -94
  55. package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader_test.go +0 -198
  56. package/project-skills/tdd-guard/reporters/go/internal/parser/parser.go +0 -245
  57. package/project-skills/tdd-guard/reporters/go/internal/parser/parser_test.go +0 -547
  58. package/project-skills/tdd-guard/reporters/go/internal/storage/storage.go +0 -35
  59. package/project-skills/tdd-guard/reporters/go/internal/storage/storage_test.go +0 -113
  60. package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer.go +0 -103
  61. package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer_test.go +0 -303
  62. package/project-skills/tdd-guard/reporters/jest/README.md +0 -102
  63. package/project-skills/tdd-guard/reporters/jest/package.json +0 -38
  64. package/project-skills/tdd-guard/reporters/jest/src/JestReporter.test-data.ts +0 -199
  65. package/project-skills/tdd-guard/reporters/jest/src/JestReporter.test.ts +0 -302
  66. package/project-skills/tdd-guard/reporters/jest/src/JestReporter.ts +0 -201
  67. package/project-skills/tdd-guard/reporters/jest/src/index.ts +0 -4
  68. package/project-skills/tdd-guard/reporters/jest/src/types.ts +0 -42
  69. package/project-skills/tdd-guard/reporters/jest/tsconfig.json +0 -11
  70. package/project-skills/tdd-guard/reporters/phpunit/.php-cs-fixer.php +0 -28
  71. package/project-skills/tdd-guard/reporters/phpunit/README.md +0 -97
  72. package/project-skills/tdd-guard/reporters/phpunit/SYNC_README.md +0 -29
  73. package/project-skills/tdd-guard/reporters/phpunit/composer.json +0 -55
  74. package/project-skills/tdd-guard/reporters/phpunit/phpunit.xml.dist +0 -19
  75. package/project-skills/tdd-guard/reporters/phpunit/psalm.xml +0 -44
  76. package/project-skills/tdd-guard/reporters/phpunit/src/Event/ErroredTestSubscriber.php +0 -28
  77. package/project-skills/tdd-guard/reporters/phpunit/src/Event/FailedTestSubscriber.php +0 -28
  78. package/project-skills/tdd-guard/reporters/phpunit/src/Event/IncompleteTestSubscriber.php +0 -28
  79. package/project-skills/tdd-guard/reporters/phpunit/src/Event/PassedTestSubscriber.php +0 -27
  80. package/project-skills/tdd-guard/reporters/phpunit/src/Event/SkippedTestSubscriber.php +0 -28
  81. package/project-skills/tdd-guard/reporters/phpunit/src/Event/TestRunnerFinishedSubscriber.php +0 -24
  82. package/project-skills/tdd-guard/reporters/phpunit/src/PathValidator.php +0 -88
  83. package/project-skills/tdd-guard/reporters/phpunit/src/Storage.php +0 -26
  84. package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardExtension.php +0 -33
  85. package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardListener.php +0 -158
  86. package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardSubscriber.php +0 -35
  87. package/project-skills/tdd-guard/reporters/phpunit/src/TestResultCollector.php +0 -105
  88. package/project-skills/tdd-guard/reporters/phpunit/tests/PathValidatorTest.php +0 -74
  89. package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionFailedTest.php +0 -241
  90. package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionTest.php +0 -84
  91. package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardStorageLocationTest.php +0 -71
  92. package/project-skills/tdd-guard/reporters/pytest/README.md +0 -77
  93. package/project-skills/tdd-guard/reporters/pytest/pyproject.toml +0 -43
  94. package/project-skills/tdd-guard/reporters/pytest/pytest.ini.example +0 -7
  95. package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/__init__.py +0 -1
  96. package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/pytest_reporter.py +0 -134
  97. package/project-skills/tdd-guard/reporters/pytest/tests/__init__.py +0 -1
  98. package/project-skills/tdd-guard/reporters/pytest/tests/conftest.py +0 -3
  99. package/project-skills/tdd-guard/reporters/pytest/tests/helpers.py +0 -293
  100. package/project-skills/tdd-guard/reporters/pytest/tests/test_config_option.py +0 -38
  101. package/project-skills/tdd-guard/reporters/pytest/tests/test_path_validation.py +0 -59
  102. package/project-skills/tdd-guard/reporters/pytest/tests/test_plugin_config.py +0 -32
  103. package/project-skills/tdd-guard/reporters/pytest/tests/test_project_root.py +0 -296
  104. package/project-skills/tdd-guard/reporters/pytest/tests/test_pytest_reporter.py +0 -137
  105. package/project-skills/tdd-guard/reporters/rspec/Gemfile +0 -3
  106. package/project-skills/tdd-guard/reporters/rust/Cargo.lock +0 -458
  107. package/project-skills/tdd-guard/reporters/rust/Cargo.toml +0 -33
  108. package/project-skills/tdd-guard/reporters/rust/Makefile.example +0 -95
  109. package/project-skills/tdd-guard/reporters/rust/README.md +0 -88
  110. package/project-skills/tdd-guard/reporters/rust/src/error_parser.rs +0 -309
  111. package/project-skills/tdd-guard/reporters/rust/src/main.rs +0 -464
  112. package/project-skills/tdd-guard/reporters/rust/src/parser.rs +0 -225
  113. package/project-skills/tdd-guard/reporters/rust/src/transformer.rs +0 -409
  114. package/project-skills/tdd-guard/reporters/storybook/README.md +0 -108
  115. package/project-skills/tdd-guard/reporters/storybook/package-lock.json +0 -9482
  116. package/project-skills/tdd-guard/reporters/storybook/package.json +0 -43
  117. package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test-data.ts +0 -22
  118. package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test.ts +0 -190
  119. package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.ts +0 -88
  120. package/project-skills/tdd-guard/reporters/storybook/src/index.ts +0 -12
  121. package/project-skills/tdd-guard/reporters/storybook/src/types.ts +0 -37
  122. package/project-skills/tdd-guard/reporters/storybook/tsconfig.json +0 -11
  123. package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/go.mod +0 -3
  124. package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/single_failing_test.go +0 -13
  125. package/project-skills/tdd-guard/reporters/test/artifacts/go/import/go.mod +0 -3
  126. package/project-skills/tdd-guard/reporters/test/artifacts/go/import/single_import_error_test.go +0 -17
  127. package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/go.mod +0 -3
  128. package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/single_passing_test.go +0 -13
  129. package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-failing.test.js +0 -5
  130. package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-import-error.test.js +0 -8
  131. package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-passing.test.js +0 -5
  132. package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleFailingTest.php +0 -11
  133. package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleImportErrorTest.php +0 -14
  134. package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SinglePassingTest.php +0 -11
  135. package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_failing.py +0 -3
  136. package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_import_error.py +0 -6
  137. package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_passing.py +0 -3
  138. package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.lock +0 -7
  139. package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.toml +0 -4
  140. package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/src/lib.rs +0 -14
  141. package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.lock +0 -7
  142. package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.toml +0 -4
  143. package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/src/lib.rs +0 -13
  144. package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.lock +0 -7
  145. package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.toml +0 -4
  146. package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/src/lib.rs +0 -14
  147. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/Calculator.js +0 -4
  148. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-failing.stories.js +0 -15
  149. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-import-error.stories.js +0 -14
  150. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-passing.stories.js +0 -15
  151. package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-failing.test.js +0 -7
  152. package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-import-error.test.js +0 -9
  153. package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-passing.test.js +0 -7
  154. package/project-skills/tdd-guard/reporters/test/factories/go.ts +0 -59
  155. package/project-skills/tdd-guard/reporters/test/factories/helpers.ts +0 -48
  156. package/project-skills/tdd-guard/reporters/test/factories/index.ts +0 -7
  157. package/project-skills/tdd-guard/reporters/test/factories/jest.ts +0 -51
  158. package/project-skills/tdd-guard/reporters/test/factories/phpunit.ts +0 -63
  159. package/project-skills/tdd-guard/reporters/test/factories/pytest.ts +0 -41
  160. package/project-skills/tdd-guard/reporters/test/factories/rust.ts +0 -158
  161. package/project-skills/tdd-guard/reporters/test/factories/storybook.ts +0 -198
  162. package/project-skills/tdd-guard/reporters/test/factories/vitest.ts +0 -51
  163. package/project-skills/tdd-guard/reporters/test/reporters.integration.test.ts +0 -735
  164. package/project-skills/tdd-guard/reporters/test/types.ts +0 -28
  165. package/project-skills/tdd-guard/reporters/vitest/README.md +0 -64
  166. package/project-skills/tdd-guard/reporters/vitest/package.json +0 -35
  167. package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.test-data.ts +0 -85
  168. package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.test.ts +0 -446
  169. package/project-skills/tdd-guard/reporters/vitest/src/VitestReporter.ts +0 -110
  170. package/project-skills/tdd-guard/reporters/vitest/src/index.ts +0 -4
  171. package/project-skills/tdd-guard/reporters/vitest/src/types.ts +0 -39
  172. package/project-skills/tdd-guard/reporters/vitest/tsconfig.json +0 -11
  173. package/project-skills/tdd-guard/src/cli/buildContext.test.ts +0 -200
  174. package/project-skills/tdd-guard/src/cli/buildContext.ts +0 -48
  175. package/project-skills/tdd-guard/src/cli/tdd-guard.test.ts +0 -159
  176. package/project-skills/tdd-guard/src/cli/tdd-guard.ts +0 -48
  177. package/project-skills/tdd-guard/src/config/Config.test.ts +0 -538
  178. package/project-skills/tdd-guard/src/config/Config.ts +0 -172
  179. package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.test.ts +0 -58
  180. package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.ts +0 -8
  181. package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.test.ts +0 -347
  182. package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.ts +0 -61
  183. package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.test.ts +0 -24
  184. package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.ts +0 -7
  185. package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.test.ts +0 -377
  186. package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.ts +0 -75
  187. package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.test.ts +0 -563
  188. package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.ts +0 -140
  189. package/project-skills/tdd-guard/src/contracts/types/ClientType.ts +0 -1
  190. package/project-skills/tdd-guard/src/contracts/types/ConfigOptions.ts +0 -12
  191. package/project-skills/tdd-guard/src/contracts/types/Context.ts +0 -16
  192. package/project-skills/tdd-guard/src/contracts/types/ModelClient.ts +0 -3
  193. package/project-skills/tdd-guard/src/contracts/types/ValidationResult.ts +0 -6
  194. package/project-skills/tdd-guard/src/guard/GuardManager.test.ts +0 -336
  195. package/project-skills/tdd-guard/src/guard/GuardManager.ts +0 -83
  196. package/project-skills/tdd-guard/src/hooks/HookEvents.test.ts +0 -107
  197. package/project-skills/tdd-guard/src/hooks/HookEvents.ts +0 -39
  198. package/project-skills/tdd-guard/src/hooks/fileTypeDetection.ts +0 -16
  199. package/project-skills/tdd-guard/src/hooks/postToolLint.test.ts +0 -327
  200. package/project-skills/tdd-guard/src/hooks/postToolLint.ts +0 -165
  201. package/project-skills/tdd-guard/src/hooks/processHookData.test.ts +0 -465
  202. package/project-skills/tdd-guard/src/hooks/processHookData.ts +0 -203
  203. package/project-skills/tdd-guard/src/hooks/sessionHandler.test.ts +0 -136
  204. package/project-skills/tdd-guard/src/hooks/sessionHandler.ts +0 -31
  205. package/project-skills/tdd-guard/src/hooks/userPromptHandler.test.ts +0 -131
  206. package/project-skills/tdd-guard/src/hooks/userPromptHandler.ts +0 -55
  207. package/project-skills/tdd-guard/src/index.ts +0 -19
  208. package/project-skills/tdd-guard/src/linters/Linter.ts +0 -5
  209. package/project-skills/tdd-guard/src/linters/eslint/ESLint.test.ts +0 -183
  210. package/project-skills/tdd-guard/src/linters/eslint/ESLint.ts +0 -82
  211. package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.test.ts +0 -170
  212. package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.ts +0 -148
  213. package/project-skills/tdd-guard/src/processors/index.ts +0 -1
  214. package/project-skills/tdd-guard/src/processors/lintProcessor.ts +0 -77
  215. package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.test.ts +0 -303
  216. package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.ts +0 -255
  217. package/project-skills/tdd-guard/src/providers/LinterProvider.test.ts +0 -43
  218. package/project-skills/tdd-guard/src/providers/LinterProvider.ts +0 -20
  219. package/project-skills/tdd-guard/src/providers/ModelClientProvider.test.ts +0 -68
  220. package/project-skills/tdd-guard/src/providers/ModelClientProvider.ts +0 -22
  221. package/project-skills/tdd-guard/src/storage/FileStorage.test.ts +0 -76
  222. package/project-skills/tdd-guard/src/storage/FileStorage.ts +0 -108
  223. package/project-skills/tdd-guard/src/storage/MemoryStorage.ts +0 -57
  224. package/project-skills/tdd-guard/src/storage/Storage.test.ts +0 -227
  225. package/project-skills/tdd-guard/src/storage/Storage.ts +0 -17
  226. package/project-skills/tdd-guard/src/validation/context/context.test.ts +0 -364
  227. package/project-skills/tdd-guard/src/validation/context/context.ts +0 -155
  228. package/project-skills/tdd-guard/src/validation/models/AnthropicApi.test.ts +0 -171
  229. package/project-skills/tdd-guard/src/validation/models/AnthropicApi.ts +0 -49
  230. package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.test.ts +0 -167
  231. package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.ts +0 -54
  232. package/project-skills/tdd-guard/src/validation/models/ClaudeCli.test.ts +0 -239
  233. package/project-skills/tdd-guard/src/validation/models/ClaudeCli.ts +0 -57
  234. package/project-skills/tdd-guard/src/validation/prompts/file-types.ts +0 -52
  235. package/project-skills/tdd-guard/src/validation/prompts/operations/edit.ts +0 -58
  236. package/project-skills/tdd-guard/src/validation/prompts/operations/multi-edit.ts +0 -54
  237. package/project-skills/tdd-guard/src/validation/prompts/operations/write.ts +0 -54
  238. package/project-skills/tdd-guard/src/validation/prompts/response.ts +0 -40
  239. package/project-skills/tdd-guard/src/validation/prompts/rules.ts +0 -51
  240. package/project-skills/tdd-guard/src/validation/prompts/system-prompt.ts +0 -10
  241. package/project-skills/tdd-guard/src/validation/prompts/tools/lint-results.ts +0 -15
  242. package/project-skills/tdd-guard/src/validation/prompts/tools/test-output.ts +0 -14
  243. package/project-skills/tdd-guard/src/validation/prompts/tools/todos.ts +0 -9
  244. package/project-skills/tdd-guard/src/validation/validator.test.ts +0 -268
  245. package/project-skills/tdd-guard/src/validation/validator.ts +0 -159
  246. package/project-skills/tdd-guard/test/artifacts/go/.golangci.yml +0 -6
  247. package/project-skills/tdd-guard/test/artifacts/go/with-issues/file-with-issues.go +0 -12
  248. package/project-skills/tdd-guard/test/artifacts/go/with-issues/go.mod +0 -3
  249. package/project-skills/tdd-guard/test/artifacts/go/without-issues/file-without-issues.go +0 -7
  250. package/project-skills/tdd-guard/test/artifacts/go/without-issues/go.mod +0 -3
  251. package/project-skills/tdd-guard/test/artifacts/javascript/eslint.config.js +0 -20
  252. package/project-skills/tdd-guard/test/artifacts/javascript/file-with-issues.js +0 -12
  253. package/project-skills/tdd-guard/test/artifacts/javascript/file-without-issues.js +0 -10
  254. package/project-skills/tdd-guard/test/hooks/fileTypeDetection.test.ts +0 -26
  255. package/project-skills/tdd-guard/test/hooks/processHookData.fileType.test.ts +0 -46
  256. package/project-skills/tdd-guard/test/hooks/processHookData.python.test.ts +0 -68
  257. package/project-skills/tdd-guard/test/integration/test-context.test.ts +0 -66
  258. package/project-skills/tdd-guard/test/integration/validator.core.test.ts +0 -96
  259. package/project-skills/tdd-guard/test/integration/validator.scenarios.test.ts +0 -497
  260. package/project-skills/tdd-guard/test/utils/assertions.ts +0 -29
  261. package/project-skills/tdd-guard/test/utils/factories/contextFactory.ts +0 -30
  262. package/project-skills/tdd-guard/test/utils/factories/editFactory.ts +0 -82
  263. package/project-skills/tdd-guard/test/utils/factories/helpers.test.ts +0 -46
  264. package/project-skills/tdd-guard/test/utils/factories/helpers.ts +0 -46
  265. package/project-skills/tdd-guard/test/utils/factories/lintFactory.ts +0 -352
  266. package/project-skills/tdd-guard/test/utils/factories/modelClientProviderFactory.ts +0 -21
  267. package/project-skills/tdd-guard/test/utils/factories/multiEditFactory.ts +0 -79
  268. package/project-skills/tdd-guard/test/utils/factories/operations.ts +0 -57
  269. package/project-skills/tdd-guard/test/utils/factories/reporterFactory.ts +0 -55
  270. package/project-skills/tdd-guard/test/utils/factories/scenarios/index.ts +0 -22
  271. package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/python.ts +0 -745
  272. package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/typescript.ts +0 -767
  273. package/project-skills/tdd-guard/test/utils/factories/scenarios/types.ts +0 -77
  274. package/project-skills/tdd-guard/test/utils/factories/scenarios/utils.ts +0 -15
  275. package/project-skills/tdd-guard/test/utils/factories/sessionStartFactory.ts +0 -36
  276. package/project-skills/tdd-guard/test/utils/factories/testDefaults.ts +0 -90
  277. package/project-skills/tdd-guard/test/utils/factories/testResultsFactory.ts +0 -234
  278. package/project-skills/tdd-guard/test/utils/factories/todoFactory.ts +0 -99
  279. package/project-skills/tdd-guard/test/utils/factories/userPromptSubmitFactory.ts +0 -39
  280. package/project-skills/tdd-guard/test/utils/factories/writeFactory.ts +0 -70
  281. package/project-skills/tdd-guard/test/utils/index.ts +0 -131
  282. package/project-skills/tdd-guard/tsconfig.build.json +0 -16
  283. package/project-skills/tdd-guard/tsconfig.eslint.json +0 -17
  284. package/project-skills/tdd-guard/tsconfig.json +0 -32
  285. package/project-skills/tdd-guard/tsconfig.node.json +0 -10
  286. 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
- }