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,296 +0,0 @@
1
- """Integration tests for tdd_guard_project_root configuration.
2
-
3
- Tests the pytest reporter's ability to save test results at a configured
4
- project root directory, regardless of where pytest is executed from.
5
- """
6
-
7
- import textwrap
8
-
9
- import pytest
10
-
11
- from tdd_guard_pytest.pytest_reporter import DEFAULT_DATA_DIR
12
- from .helpers import (
13
- assert_json_file_exists,
14
- assert_json_file_not_exists,
15
- copy_project_and_update_root,
16
- create_multiple_test_files,
17
- create_project_structure,
18
- create_pytest_ini,
19
- create_simple_passing_test,
20
- create_test_file,
21
- extract_all_test_names,
22
- get_test_names_from_file,
23
- load_test_results,
24
- verify_test_results,
25
- )
26
-
27
-
28
- class TestProjectRootConfiguration:
29
- """Test suite for tdd_guard_project_root configuration feature."""
30
-
31
- def test_default_behavior_without_configuration(self, pytester):
32
- """When no project root is configured, saves to default relative path."""
33
- create_simple_passing_test(pytester)
34
-
35
- result = pytester.runpytest()
36
- result.assert_outcomes(passed=1)
37
-
38
- assert_json_file_exists(pytester.path)
39
-
40
- def test_relative_path_falls_back_to_default(self, pytester):
41
- """Relative paths in configuration are ignored, falling back to default."""
42
- create_pytest_ini(pytester, "./relative/path")
43
- create_simple_passing_test(pytester)
44
-
45
- result = pytester.runpytest()
46
- result.assert_outcomes(passed=1)
47
-
48
- # Should use default location, not the relative path
49
- assert_json_file_exists(pytester.path)
50
-
51
- def test_absolute_path_outside_current_directory(self, pytester, tmp_path):
52
- """Absolute path is rejected when current directory is not within it."""
53
- external_root = tmp_path / "external_project"
54
- external_root.mkdir()
55
-
56
- create_pytest_ini(pytester, external_root)
57
- create_simple_passing_test(pytester)
58
-
59
- result = pytester.runpytest()
60
- result.assert_outcomes(passed=1)
61
-
62
- # Should fall back to default location
63
- assert_json_file_exists(pytester.path)
64
-
65
- # Should NOT create file in the external root
66
- assert_json_file_not_exists(external_root)
67
-
68
- @pytest.mark.parametrize("config_file,content", [
69
- ("pyproject.toml", """
70
- [tool.pytest.ini_options]
71
- tdd_guard_project_root = "{root}"
72
- """),
73
- ("setup.cfg", """
74
- [tool:pytest]
75
- tdd_guard_project_root = {root}
76
- """),
77
- ("pytest.ini", """
78
- [pytest]
79
- tdd_guard_project_root = {root}
80
- """),
81
- ])
82
- def test_configuration_methods(self, pytester, tmp_path, config_file, content):
83
- """Project root can be configured via pyproject.toml, setup.cfg, or pytest.ini."""
84
- # Create external directory for testing fallback
85
- external_root = tmp_path / "external"
86
- external_root.mkdir()
87
-
88
- # Configure with external path (will fall back since cwd not within it)
89
- if config_file == "pyproject.toml":
90
- pytester.makefile(".toml", pyproject=content.format(root=external_root))
91
- else:
92
- config_content = textwrap.dedent(content.format(root=external_root)).strip()
93
- pytester.makeini(config_content)
94
-
95
- create_simple_passing_test(pytester)
96
-
97
- result = pytester.runpytest()
98
- result.assert_outcomes(passed=1)
99
-
100
- # Should use default since we're not within external_root
101
- assert_json_file_exists(pytester.path)
102
-
103
- def test_saves_to_project_root_from_subdirectory(self, pytester, tmp_path, monkeypatch):
104
- """When running from subdirectory, saves results at project root."""
105
- # Set up project with custom test content
106
- project_root = tmp_path / "my_project"
107
- structure = {
108
- "src": {"__init__.py": ""},
109
- "tests": {
110
- "unit": {
111
- "test_user_service.py": """
112
- def test_create_user():
113
- user = {"name": "Alice", "age": 30}
114
- assert user["name"] == "Alice"
115
-
116
- def test_validate_age():
117
- age = 25
118
- assert age >= 18, "User must be an adult"
119
- """.strip()
120
- }
121
- },
122
- "pytest.ini": f"""
123
- [pytest]
124
- tdd_guard_project_root = {project_root}
125
- """.strip()
126
- }
127
-
128
- project_root.mkdir()
129
- create_project_structure(project_root, structure)
130
-
131
- # Copy and update paths
132
- copied_project = copy_project_and_update_root(pytester, project_root)
133
-
134
- # Run pytest from subdirectory
135
- monkeypatch.chdir(copied_project / "tests" / "unit")
136
- result = pytester.runpytest("test_user_service.py")
137
- result.assert_outcomes(passed=2)
138
-
139
- # Verify file created at project root, not in subdirectory
140
- json_file = assert_json_file_exists(copied_project)
141
- assert_json_file_not_exists(copied_project / "tests" / "unit")
142
-
143
- # Verify JSON content
144
- verify_test_results(json_file, expected_tests=[
145
- ("test_create_user", "passed"),
146
- ("test_validate_age", "passed")
147
- ])
148
-
149
- def test_deeply_nested_directory_structure(self, pytester, tmp_path, monkeypatch):
150
- """Handles deeply nested directory structures correctly."""
151
- # Create complex project structure
152
- project_root = tmp_path / "complex_project"
153
- structure = {
154
- "test_integration.py": """
155
- def test_system_integration():
156
- components = ["auth", "database", "api"]
157
- assert len(components) == 3
158
- """.strip(),
159
- "src": {
160
- "components": {
161
- "widgets": {
162
- "tests": {
163
- "test_button_widget.py": """
164
- def test_button_click():
165
- clicked = True
166
- assert clicked
167
-
168
- def test_button_disabled_state():
169
- button = {"enabled": False}
170
- assert not button["enabled"]
171
- """.strip()
172
- }
173
- }
174
- }
175
- },
176
- "pytest.ini": f"""
177
- [pytest]
178
- tdd_guard_project_root = {project_root}
179
- """.strip()
180
- }
181
-
182
- project_root.mkdir()
183
- create_project_structure(project_root, structure)
184
-
185
- # Copy and update paths
186
- copied_project = copy_project_and_update_root(pytester, project_root)
187
-
188
- # Run from deep directory
189
- monkeypatch.chdir(copied_project / "src" / "components" / "widgets" / "tests")
190
- result = pytester.runpytest(str(copied_project))
191
- result.assert_outcomes(passed=3)
192
-
193
- # Verify results saved at project root
194
- json_file = assert_json_file_exists(copied_project)
195
-
196
- # Verify all tests are captured
197
- all_test_names = get_test_names_from_file(json_file)
198
- assert "test_system_integration" in all_test_names
199
- assert "test_button_click" in all_test_names
200
- assert "test_button_disabled_state" in all_test_names
201
-
202
- def test_current_directory_as_project_root(self, pytester):
203
- """Tests using '.' (current directory) as project root."""
204
- create_pytest_ini(pytester, ".")
205
- create_simple_passing_test(pytester)
206
-
207
- result = pytester.runpytest()
208
- result.assert_outcomes(passed=1)
209
-
210
- # "." should be treated as relative path and fall back to default
211
- assert_json_file_exists(pytester.path)
212
-
213
- def test_json_output_structure(self, pytester):
214
- """Verifies the JSON output format matches expected structure."""
215
- create_test_file(pytester) # Uses default pass/fail tests
216
-
217
- result = pytester.runpytest()
218
- result.assert_outcomes(passed=1, failed=1)
219
-
220
- json_file = assert_json_file_exists(pytester.path)
221
- data = load_test_results(json_file)
222
-
223
- # Verify structure
224
- assert "testModules" in data
225
- assert len(data["testModules"]) == 1
226
-
227
- module = data["testModules"][0]
228
- assert "moduleId" in module
229
- assert "tests" in module
230
- assert len(module["tests"]) == 2
231
-
232
- # Verify each test has required fields
233
- for test in module["tests"]:
234
- assert "name" in test
235
- assert "fullName" in test
236
- assert "state" in test
237
- assert test["state"] in ["passed", "failed"]
238
-
239
- if test["state"] == "failed":
240
- assert "errors" in test
241
- assert len(test["errors"]) > 0
242
- assert "message" in test["errors"][0]
243
-
244
- def test_multiple_test_modules(self, pytester):
245
- """Correctly handles multiple test modules in a single run."""
246
- # Create multiple test files
247
- create_multiple_test_files(pytester, {
248
- "test_auth": [
249
- ("test_login", 'len("abc123") > 0'),
250
- ("test_logout", 'not False')
251
- ],
252
- "test_database": [
253
- ("test_connection", 'True'),
254
- ("test_query_performance", '0.05 < 1.0')
255
- ]
256
- })
257
-
258
- result = pytester.runpytest()
259
- result.assert_outcomes(passed=4)
260
-
261
- json_file = pytester.path / DEFAULT_DATA_DIR / "test.json"
262
- data = load_test_results(json_file)
263
-
264
- # Should have 2 modules
265
- assert len(data["testModules"]) == 2
266
-
267
- # Verify all tests are present
268
- all_test_names = extract_all_test_names(data)
269
- assert len(all_test_names) == 4
270
- assert all(name in all_test_names for name in [
271
- "test_login", "test_logout", "test_connection", "test_query_performance"
272
- ])
273
-
274
- def test_clears_results_between_sessions(self, pytester):
275
- """Each test session should start fresh, not accumulate results."""
276
- # First test run
277
- create_simple_passing_test(pytester, "test_first_run")
278
-
279
- result = pytester.runpytest()
280
- result.assert_outcomes(passed=1)
281
-
282
- json_file = assert_json_file_exists(pytester.path)
283
- test_names = get_test_names_from_file(json_file)
284
- assert len(test_names) == 1
285
-
286
- # Second test run with different test
287
- create_simple_passing_test(pytester, "test_second_run")
288
-
289
- result = pytester.runpytest()
290
- result.assert_outcomes(passed=1)
291
-
292
- # Should only have the second test, not both
293
- test_names = get_test_names_from_file(json_file)
294
- assert len(test_names) == 1
295
- assert "test_second_run" in test_names
296
- assert "test_first_run" not in test_names
@@ -1,137 +0,0 @@
1
- """Tests for TDD Guard pytest reporter."""
2
-
3
- import json
4
- from unittest.mock import Mock, patch, mock_open
5
-
6
- from tdd_guard_pytest.pytest_reporter import TDDGuardPytestPlugin, DEFAULT_DATA_DIR
7
-
8
-
9
- class TestTDDGuardPytestPlugin:
10
- """Test the TDD Guard pytest plugin."""
11
-
12
- def test_init_creates_empty_test_results(self):
13
- """Plugin should initialize with empty test results."""
14
- plugin = TDDGuardPytestPlugin()
15
- assert plugin.test_results == []
16
- assert plugin.storage_dir == DEFAULT_DATA_DIR
17
-
18
- def test_pytest_runtest_logreport_captures_passed_test(self):
19
- """Should capture passed test results."""
20
- plugin = TDDGuardPytestPlugin()
21
- report = Mock()
22
- report.when = 'call'
23
- report.nodeid = 'test_module.py::test_example'
24
- report.passed = True
25
- report.failed = False
26
-
27
- plugin.pytest_runtest_logreport(report)
28
-
29
- assert len(plugin.test_results) == 1
30
- assert plugin.test_results[0] == {
31
- 'name': 'test_example',
32
- 'fullName': 'test_module.py::test_example',
33
- 'state': 'passed'
34
- }
35
-
36
- def test_pytest_runtest_logreport_captures_failed_test(self):
37
- """Should capture failed test results with error message."""
38
- plugin = TDDGuardPytestPlugin()
39
- report = Mock()
40
- report.when = 'call'
41
- report.nodeid = 'test_module.py::TestClass::test_method'
42
- report.passed = False
43
- report.failed = True
44
- report.longrepr = 'AssertionError: Expected True'
45
-
46
- plugin.pytest_runtest_logreport(report)
47
-
48
- assert len(plugin.test_results) == 1
49
- assert plugin.test_results[0] == {
50
- 'name': 'test_method',
51
- 'fullName': 'test_module.py::TestClass::test_method',
52
- 'state': 'failed',
53
- 'errors': [{'message': 'AssertionError: Expected True'}]
54
- }
55
-
56
- def test_pytest_runtest_logreport_ignores_non_call_phase(self):
57
- """Should only capture 'call' phase, not setup or teardown."""
58
- plugin = TDDGuardPytestPlugin()
59
- report = Mock()
60
- report.when = 'setup'
61
- report.nodeid = 'test_module.py::test_example'
62
-
63
- plugin.pytest_runtest_logreport(report)
64
-
65
- assert len(plugin.test_results) == 0
66
-
67
- def test_pytest_collectreport_captures_collection_errors(self):
68
- """Should capture import/collection failures."""
69
- plugin = TDDGuardPytestPlugin()
70
- report = Mock()
71
- report.failed = True
72
- report.nodeid = 'test_broken.py'
73
- report.longrepr = 'ImportError: No module named missing_module'
74
-
75
- plugin.pytest_collectreport(report)
76
-
77
- assert len(plugin.test_results) == 1
78
- assert plugin.test_results[0] == {
79
- 'name': 'collection_error_test_broken.py',
80
- 'fullName': 'test_broken.py',
81
- 'state': 'failed',
82
- 'errors': [{'message': 'ImportError: No module named missing_module'}]
83
- }
84
-
85
- @patch('builtins.open', new_callable=mock_open)
86
- @patch('pathlib.Path.mkdir')
87
- def test_pytest_sessionfinish_saves_results(self, mock_mkdir, mock_file):
88
- """Should save test results to JSON file in correct format."""
89
- plugin = TDDGuardPytestPlugin()
90
-
91
- # Add some test results
92
- plugin.test_results = [
93
- {
94
- 'name': 'test_one',
95
- 'fullName': 'test_module.py::test_one',
96
- 'state': 'passed'
97
- },
98
- {
99
- 'name': 'test_two',
100
- 'fullName': 'test_module.py::test_two',
101
- 'state': 'failed',
102
- 'errors': [{'message': 'Error'}]
103
- },
104
- {
105
- 'name': 'test_other',
106
- 'fullName': 'other_module.py::test_other',
107
- 'state': 'passed'
108
- }
109
- ]
110
-
111
- session = Mock()
112
- plugin.pytest_sessionfinish(session, 0)
113
-
114
- # Verify directory was created
115
- mock_mkdir.assert_called_once_with(parents=True, exist_ok=True)
116
-
117
- # Verify file was opened for writing
118
- mock_file.assert_called_once_with(DEFAULT_DATA_DIR / 'test.json', 'w')
119
-
120
- # Get the data that was written
121
- written_data = ''.join(call.args[0] for call in mock_file().write.call_args_list)
122
- parsed_data = json.loads(written_data)
123
-
124
- # Verify the structure matches what TDD Guard expects
125
- assert 'testModules' in parsed_data
126
- assert len(parsed_data['testModules']) == 2
127
-
128
- # Check first module
129
- module1 = next(m for m in parsed_data['testModules'] if m['moduleId'] == 'test_module.py')
130
- assert len(module1['tests']) == 2
131
- assert module1['tests'][0]['name'] == 'test_one'
132
- assert module1['tests'][1]['name'] == 'test_two'
133
-
134
- # Check second module
135
- module2 = next(m for m in parsed_data['testModules'] if m['moduleId'] == 'other_module.py')
136
- assert len(module2['tests']) == 1
137
- assert module2['tests'][0]['name'] == 'test_other'
@@ -1,3 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"