xtrm-tools 2.3.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 (284) hide show
  1. package/README.md +127 -111
  2. package/cli/dist/index.cjs +107 -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,28 +0,0 @@
1
- export interface TestScenarios {
2
- singlePassing: string
3
- singleFailing: string
4
- singleImportError: string
5
- }
6
-
7
- export interface ReporterConfig {
8
- name: string
9
- testScenarios: TestScenarios
10
- run: (tempDir: string, scenario: keyof TestScenarios) => void | Promise<void>
11
- }
12
-
13
- export interface TestResultData {
14
- testModules: Array<{
15
- moduleId: string
16
- tests: Array<{
17
- name: string
18
- fullName: string
19
- state: string
20
- errors?: Array<{
21
- message: string
22
- expected?: string
23
- actual?: string
24
- }>
25
- }>
26
- }>
27
- reason: string
28
- }
@@ -1,64 +0,0 @@
1
- # TDD Guard Vitest Reporter
2
-
3
- Vitest reporter that captures test results for TDD Guard validation.
4
-
5
- ## Requirements
6
-
7
- - Node.js 18+
8
- - Vitest 3.2.0+
9
- - [TDD Guard](https://github.com/nizos/tdd-guard) installed globally
10
-
11
- ## Installation
12
-
13
- ```bash
14
- npm install --save-dev tdd-guard-vitest
15
- ```
16
-
17
- ## Configuration
18
-
19
- ### Vitest Configuration
20
-
21
- Add the reporter to your `vitest.config.ts`:
22
-
23
- ```typescript
24
- import { defineConfig } from 'vitest/config'
25
- import { VitestReporter } from 'tdd-guard-vitest'
26
-
27
- export default defineConfig({
28
- test: {
29
- reporters: ['default', new VitestReporter()],
30
- },
31
- })
32
- ```
33
-
34
- ### Workspace/Monorepo Configuration
35
-
36
- For workspaces or monorepos, pass the project root path to the reporter:
37
-
38
- ```typescript
39
- // vitest.config.ts in project root
40
- import { defineConfig } from 'vitest/config'
41
- import { VitestReporter } from 'tdd-guard-vitest'
42
- import path from 'path'
43
-
44
- export default defineConfig({
45
- test: {
46
- reporters: ['default', new VitestReporter(path.resolve(__dirname))],
47
- },
48
- })
49
- ```
50
-
51
- If your vitest config is in a workspace subdirectory, pass the absolute path to your project root:
52
-
53
- ```typescript
54
- new VitestReporter('/Users/username/projects/my-app')
55
- ```
56
-
57
- ## More Information
58
-
59
- - Test results are saved to `.claude/tdd-guard/data/test.json`
60
- - See [TDD Guard documentation](https://github.com/nizos/tdd-guard) for complete setup
61
-
62
- ## License
63
-
64
- MIT
@@ -1,35 +0,0 @@
1
- {
2
- "name": "tdd-guard-vitest",
3
- "version": "0.1.6",
4
- "description": "Vitest reporter for TDD Guard",
5
- "author": "Nizar Selander",
6
- "license": "MIT",
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://github.com/nizos/tdd-guard.git",
10
- "directory": "reporters/vitest"
11
- },
12
- "main": "dist/index.js",
13
- "types": "dist/index.d.ts",
14
- "files": [
15
- "dist",
16
- "!dist/*.tsbuildinfo",
17
- "!dist/*.test-data.*"
18
- ],
19
- "scripts": {
20
- "build": "tsc --build",
21
- "test": "vitest run",
22
- "typecheck": "tsc --noEmit"
23
- },
24
- "dependencies": {
25
- "tdd-guard": "^1.1.0"
26
- },
27
- "peerDependencies": {
28
- "vitest": ">=3.2.4"
29
- },
30
- "devDependencies": {
31
- "@types/node": "^24.1.0",
32
- "typescript": "^5.8.3",
33
- "vitest": "^3.2.4"
34
- }
35
- }
@@ -1,85 +0,0 @@
1
- import type { TestModule, TestCase, TestResult } from 'vitest/node'
2
- import type { SerializedError } from '@vitest/utils'
3
-
4
- const DEFAULT_MODULE_ID = '/test/example.test.ts'
5
- const DEFAULT_TEST_NAME = 'should pass'
6
- const DEFAULT_TEST_FULL_NAME = 'Example Suite > should pass'
7
-
8
- // Helper to create a valid TestResult for a given state
9
- export function createTestResult(state: TestResult['state']): TestResult {
10
- switch (state) {
11
- case 'failed':
12
- return { state: 'failed', errors: [] }
13
- case 'passed':
14
- return { state: 'passed', errors: undefined }
15
- case 'skipped':
16
- return { state: 'skipped', errors: undefined, note: undefined }
17
- case 'pending':
18
- return { state: 'pending', errors: undefined }
19
- }
20
- }
21
-
22
- // Creates a minimal TestModule mock for testing
23
- function createTestModule(props: {
24
- moduleId: string
25
- errors?: () => SerializedError[]
26
- }): TestModule {
27
- return {
28
- moduleId: props.moduleId,
29
- errors: props.errors ?? ((): SerializedError[] => []),
30
- } as TestModule
31
- }
32
-
33
- export function testModule(overrides?: {
34
- moduleId?: string
35
- errors?: () => SerializedError[]
36
- }): TestModule {
37
- return createTestModule({
38
- moduleId: overrides?.moduleId ?? DEFAULT_MODULE_ID,
39
- errors: overrides?.errors,
40
- })
41
- }
42
-
43
- export function createTestCase(overrides?: Partial<TestCase>): TestCase {
44
- const defaultModule = createTestModule({ moduleId: DEFAULT_MODULE_ID })
45
-
46
- return {
47
- name: DEFAULT_TEST_NAME,
48
- fullName: DEFAULT_TEST_FULL_NAME,
49
- module: defaultModule,
50
- result: () => ({ state: 'passed', errors: [] }) as TestResult,
51
- ...overrides,
52
- } as TestCase
53
- }
54
-
55
- export function failedTestCase(overrides?: Partial<TestCase>): TestCase {
56
- return createTestCase({
57
- name: 'should fail',
58
- fullName: 'Example Suite > should fail',
59
- result: () =>
60
- ({
61
- state: 'failed',
62
- errors: [
63
- {
64
- message: 'expected 2 to be 3',
65
- stack: 'Error: expected 2 to be 3\n at test.ts:7:19',
66
- expected: '3',
67
- actual: '2',
68
- },
69
- ],
70
- }) as TestResult,
71
- ...overrides,
72
- })
73
- }
74
-
75
- export function createUnhandledError(
76
- overrides: Partial<SerializedError> = {}
77
- ): SerializedError {
78
- return {
79
- name: 'Error',
80
- message: 'Cannot find module "./helpers"',
81
- stack:
82
- "Error: Cannot find module './helpers' imported from '/src/example.test.ts'",
83
- ...overrides,
84
- }
85
- }
@@ -1,446 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest'
2
- import type { TestModule, TestCase } from 'vitest/node'
3
- import { VitestReporter } from './VitestReporter'
4
- import {
5
- MemoryStorage,
6
- FileStorage,
7
- Storage,
8
- Config,
9
- DEFAULT_DATA_DIR,
10
- isFailingTest,
11
- isPassingTest,
12
- TestResult,
13
- Test,
14
- } from 'tdd-guard'
15
- import {
16
- testModule,
17
- failedTestCase,
18
- createTestCase,
19
- createUnhandledError,
20
- createTestResult,
21
- } from './VitestReporter.test-data'
22
- import type { FormattedError } from './types'
23
- import { rmSync, mkdtempSync } from 'node:fs'
24
- import { tmpdir } from 'node:os'
25
- import { join } from 'node:path'
26
-
27
- describe('VitestReporter', () => {
28
- let sut: Awaited<ReturnType<typeof setupVitestReporter>>
29
- const module = testModule()
30
- const passedTest = createTestCase()
31
- const failedTest = failedTestCase()
32
-
33
- beforeEach(() => {
34
- sut = setupVitestReporter()
35
- })
36
-
37
- afterEach(() => {
38
- sut.cleanup()
39
- })
40
-
41
- it('uses FileStorage by default', () => {
42
- const reporter = new VitestReporter()
43
- expect(reporter['storage']).toBeInstanceOf(FileStorage)
44
- })
45
-
46
- it('uses FileStorage when no storage provided', async () => {
47
- const localSut = setupVitestReporter({ type: 'file' })
48
-
49
- expect(localSut.reporter['storage']).toBeInstanceOf(FileStorage)
50
-
51
- const result = await localSut.collectAndGetSaved([
52
- testModule(),
53
- createTestCase(),
54
- ])
55
-
56
- expect(result).toBeTruthy()
57
- expect(result).toContain('testModules')
58
-
59
- localSut.cleanup()
60
- })
61
-
62
- it('accepts Storage instance in constructor', () => {
63
- const storage = new MemoryStorage()
64
- const reporter = new VitestReporter(storage)
65
- expect(reporter['storage']).toBe(storage)
66
- })
67
-
68
- it('accepts root path string in constructor', () => {
69
- const rootPath = '/some/project/root'
70
- const reporter = new VitestReporter(rootPath)
71
- expect(reporter['storage']).toBeInstanceOf(FileStorage)
72
- // Verify the storage is configured with the correct path
73
- const fileStorage = reporter['storage'] as FileStorage
74
- const config = fileStorage['config'] as Config
75
- const expectedDataDir = join(rootPath, ...DEFAULT_DATA_DIR.split('/'))
76
- expect(config.dataDir).toBe(expectedDataDir)
77
- })
78
-
79
- describe('when collecting test data', () => {
80
- beforeEach(async () => {
81
- sut.reporter.onTestModuleCollected(module)
82
- sut.reporter.onTestCaseResult(passedTest)
83
- sut.reporter.onTestCaseResult(failedTest)
84
- await sut.reporter.onTestRunEnd()
85
- })
86
-
87
- it('saves output as valid JSON', async () => {
88
- const parsed = await sut.getParsedData()
89
- expect(parsed).toBeDefined()
90
- })
91
-
92
- it('includes test modules', async () => {
93
- const parsed = await sut.getParsedData()
94
-
95
- expect(parsed).not.toBeNull()
96
- expect(parsed?.testModules).toHaveLength(1)
97
- expect(parsed?.testModules[0].moduleId).toBe(module.moduleId)
98
- })
99
-
100
- it('includes test cases', async () => {
101
- const tests = await sut.getTests()
102
- expect(tests).toHaveLength(2)
103
- })
104
-
105
- it('captures test states', async () => {
106
- const passedTests = await sut.getPassedTests()
107
- const failedTests = await sut.getFailedTests()
108
-
109
- expect(passedTests).toHaveLength(1)
110
- expect(failedTests).toHaveLength(1)
111
- })
112
-
113
- it('includes error information for failed tests', async () => {
114
- const failedTests = await sut.getFailedTests()
115
- const failedTestData = failedTests[0]
116
-
117
- expect(failedTestData).toBeDefined()
118
- expect(failedTestData.state).toBe('failed')
119
- expect(failedTestData.errors).toBeDefined()
120
- expect(failedTestData.errors?.length).toBeGreaterThan(0)
121
- })
122
- })
123
-
124
- describe('test state mapping', () => {
125
- it.each([
126
- ['passed', 'passed'],
127
- ['failed', 'failed'],
128
- ['skipped', 'skipped'],
129
- ['pending', 'skipped'], // pending gets mapped to skipped
130
- ] as const)('maps %s to %s', async (vitestState, expected) => {
131
- // Given a test with the specified state
132
- const testCase = createTestCase({
133
- result: () => createTestResult(vitestState),
134
- })
135
-
136
- // When we process the test
137
- sut.reporter.onTestModuleCollected(module)
138
- sut.reporter.onTestCaseResult(testCase)
139
- await sut.reporter.onTestRunEnd()
140
-
141
- // Then it should be mapped correctly
142
- const tests = await sut.getTests()
143
- expect(tests[0]?.state).toBe(expected)
144
- })
145
- })
146
-
147
- describe('error expected and actual values', () => {
148
- let error: FormattedError | undefined
149
-
150
- beforeEach(async () => {
151
- // Given a test with an assertion error
152
- sut.reporter.onTestModuleCollected(module)
153
- sut.reporter.onTestCaseResult(failedTest)
154
- await sut.reporter.onTestRunEnd()
155
-
156
- // When we get the failed test errors
157
- const failedTests = await sut.getFailedTests()
158
- error = failedTests[0]?.errors?.[0]
159
- })
160
-
161
- it('includes expected value in error when available', () => {
162
- expect(error).toHaveProperty('expected')
163
- expect(error?.expected).toBe('3')
164
- })
165
-
166
- it('includes actual value in error when available', () => {
167
- expect(error).toHaveProperty('actual')
168
- expect(error?.actual).toBe('2')
169
- })
170
- })
171
-
172
- it('handles empty test runs', async () => {
173
- // When no tests are collected
174
- await sut.reporter.onTestRunEnd()
175
-
176
- // Then output should be valid JSON with empty modules
177
- const parsed = await sut.getParsedData()
178
-
179
- expect(parsed).not.toBeNull()
180
- expect(parsed).toEqual({ testModules: [], unhandledErrors: [] })
181
- })
182
-
183
- describe('storage integration', () => {
184
- it('saves test output to storage', async () => {
185
- const result = await sut.collectAndGetSaved([
186
- testModule(),
187
- createTestCase(),
188
- ])
189
-
190
- expect(result).toBeTruthy()
191
- expect(result).toContain('testModules')
192
- expect(result).toContain('passed')
193
- })
194
-
195
- it('accumulates multiple test results in storage', async () => {
196
- const result = await sut.collectAndGetSaved([
197
- module,
198
- passedTest,
199
- failedTest,
200
- ])
201
-
202
- const parsed = JSON.parse(result!)
203
- expect(parsed.testModules[0].tests).toHaveLength(2)
204
- })
205
- })
206
-
207
- describe('stores import errors as unhandled errors', () => {
208
- let parsed: TestResult | null
209
-
210
- beforeEach(async () => {
211
- // Given a module that was collected but has no tests due to import error
212
- const moduleWithImportError = testModule({
213
- moduleId: '/src/example.test.ts',
214
- errors: () => [createUnhandledError()],
215
- })
216
-
217
- // When the test run ends
218
- sut.reporter.onTestModuleCollected(moduleWithImportError)
219
- await sut.reporter.onTestRunEnd()
220
-
221
- parsed = await sut.getParsedData()
222
- })
223
-
224
- it('includes the module in test modules', () => {
225
- expect(parsed?.testModules).toHaveLength(1)
226
- })
227
-
228
- it('shows module with one synthetic failed test', () => {
229
- expect(parsed?.testModules[0].tests).toHaveLength(1)
230
- expect(parsed?.testModules[0].tests[0].state).toBe('failed')
231
- })
232
-
233
- it('uses module filename as test name', () => {
234
- const syntheticTest = parsed?.testModules[0].tests[0]
235
- expect(syntheticTest?.name).toBe('example.test.ts')
236
- expect(syntheticTest?.fullName).toBe('/src/example.test.ts')
237
- })
238
-
239
- it('includes import error details in synthetic test', () => {
240
- const syntheticTest = parsed?.testModules[0].tests[0]
241
- expect(syntheticTest?.errors).toHaveLength(1)
242
- expect(syntheticTest?.errors?.[0].message).toBe(
243
- 'Cannot find module "./helpers"'
244
- )
245
- })
246
-
247
- it('includes empty unhandled errors', () => {
248
- expect(parsed?.unhandledErrors).toHaveLength(0)
249
- })
250
-
251
- it('preserves error message in synthetic test', () => {
252
- const error = parsed?.testModules[0].tests[0].errors?.[0]
253
- expect(error?.message).toBe('Cannot find module "./helpers"')
254
- })
255
-
256
- it('preserves error stack trace in synthetic test', () => {
257
- expect(parsed?.testModules[0].tests[0].errors?.[0].stack).toContain(
258
- 'imported from'
259
- )
260
- })
261
- })
262
-
263
- describe('handles module errors from testModule.errors()', () => {
264
- it('creates synthetic test when module has errors', async () => {
265
- // Given a module with its own errors (like import errors)
266
- const moduleWithErrors = testModule({
267
- moduleId: '/src/import-error.test.ts',
268
- errors: () => [createUnhandledError()],
269
- })
270
-
271
- // When the test run ends
272
- sut.reporter.onTestModuleCollected(moduleWithErrors)
273
- await sut.reporter.onTestRunEnd([], [], 'failed')
274
-
275
- // Then a synthetic failed test should be created
276
- const parsed = await sut.getParsedData()
277
- expect(parsed?.testModules[0].tests).toHaveLength(1)
278
- expect(parsed?.testModules[0].tests[0].state).toBe('failed')
279
- })
280
- })
281
-
282
- describe('handles testModules parameter', () => {
283
- it('receives test modules in onTestRunEnd', async () => {
284
- const module1 = testModule({ moduleId: '/test1.ts' })
285
- const module2 = testModule({ moduleId: '/test2.ts' })
286
-
287
- await sut.reporter.onTestRunEnd([module1, module2])
288
-
289
- const parsed = await sut.getParsedData()
290
- expect(parsed?.testModules).toEqual([]) // Empty because we didn't collect them
291
- })
292
- })
293
-
294
- describe('handles unhandled errors', () => {
295
- it('includes unhandled errors in output when provided', async () => {
296
- const unhandledError = createUnhandledError({
297
- message: 'Connection failed',
298
- name: 'NetworkError',
299
- })
300
-
301
- await sut.reporter.onTestRunEnd([], [unhandledError])
302
-
303
- const parsed = await sut.getParsedData()
304
- expect(parsed?.unhandledErrors).toEqual([
305
- expect.objectContaining({
306
- message: 'Connection failed',
307
- name: 'NetworkError',
308
- }),
309
- ])
310
- })
311
-
312
- it('returns empty array when no errors provided', async () => {
313
- await sut.reporter.onTestRunEnd()
314
-
315
- const parsed = await sut.getParsedData()
316
- expect(parsed?.unhandledErrors).toEqual([])
317
- })
318
- })
319
-
320
- describe('when test run ends with reason', () => {
321
- it('captures "failed" reason in output', async () => {
322
- const moduleWithImportError = testModule({
323
- moduleId: '/src/linters/eslint/helpers.test.ts',
324
- })
325
-
326
- sut.reporter.onTestModuleCollected(moduleWithImportError)
327
- await sut.reporter.onTestRunEnd([], [], 'failed')
328
-
329
- const parsed = await sut.getParsedData()
330
-
331
- expect(parsed?.reason).toBe('failed')
332
- // When no errors are provided, module should have no tests
333
- expect(parsed?.testModules[0].tests).toHaveLength(0)
334
- })
335
-
336
- it('creates synthetic test when module fails with errors', async () => {
337
- const moduleWithImportError = testModule({
338
- moduleId: '/src/failing.test.ts',
339
- errors: () => [createUnhandledError()],
340
- })
341
-
342
- sut.reporter.onTestModuleCollected(moduleWithImportError)
343
- await sut.reporter.onTestRunEnd([], [], 'failed')
344
-
345
- const parsed = await sut.getParsedData()
346
-
347
- expect(parsed?.reason).toBe('failed')
348
- expect(parsed?.testModules[0].tests).toHaveLength(1)
349
- expect(parsed?.testModules[0].tests[0].state).toBe('failed')
350
- })
351
-
352
- it('captures "interrupted" reason in output', async () => {
353
- await sut.reporter.onTestRunEnd([], [], 'interrupted')
354
-
355
- const parsed = await sut.getParsedData()
356
- expect(parsed?.reason).toBe('interrupted')
357
- })
358
-
359
- it('captures "passed" reason in output', async () => {
360
- sut.reporter.onTestModuleCollected(module)
361
- sut.reporter.onTestCaseResult(passedTest)
362
- await sut.reporter.onTestRunEnd([], [], 'passed')
363
-
364
- const parsed = await sut.getParsedData()
365
- expect(parsed?.reason).toBe('passed')
366
- })
367
- })
368
- })
369
-
370
- function setupVitestReporter(options?: { type: 'file' | 'memory' }) {
371
- const { storage, cleanup } = createTestStorage(options?.type)
372
- const reporter = new VitestReporter(storage)
373
-
374
- const collectAndGetSaved = async (
375
- items: Array<TestModule | TestCase>
376
- ): Promise<string | null> => {
377
- collectTestData(reporter, items)
378
- await reporter.onTestRunEnd()
379
- return storage.getTest()
380
- }
381
-
382
- const getParsedData = async (): Promise<TestResult | null> => {
383
- const content = await storage.getTest()
384
- return content ? JSON.parse(content) : null
385
- }
386
-
387
- const getTests = async (): Promise<Test[]> => {
388
- return getTestsFromStorage(storage)
389
- }
390
-
391
- const getPassedTests = async (): Promise<(Test & { state: 'passed' })[]> => {
392
- const tests = await getTests()
393
- return tests.filter(isPassingTest)
394
- }
395
-
396
- const getFailedTests = async (): Promise<(Test & { state: 'failed' })[]> => {
397
- const tests = await getTests()
398
- return tests.filter(isFailingTest)
399
- }
400
-
401
- return {
402
- reporter,
403
- storage,
404
- collectAndGetSaved,
405
- getParsedData,
406
- getTests,
407
- getPassedTests,
408
- getFailedTests,
409
- cleanup,
410
- }
411
- }
412
-
413
- function createTestStorage(type: 'file' | 'memory' = 'memory'): {
414
- storage: Storage
415
- cleanup: () => void
416
- } {
417
- if (type === 'file') {
418
- const projectRoot = mkdtempSync(join(tmpdir(), 'vitest-reporter-test-'))
419
- const config = new Config({ projectRoot })
420
- const storage = new FileStorage(config)
421
- const cleanup = () => rmSync(projectRoot, { recursive: true, force: true })
422
- return { storage, cleanup }
423
- }
424
-
425
- return { storage: new MemoryStorage(), cleanup: () => {} }
426
- }
427
-
428
- function collectTestData(
429
- reporter: VitestReporter,
430
- items: Array<TestModule | TestCase>
431
- ): void {
432
- for (const item of items) {
433
- if ('moduleId' in item && !('module' in item)) {
434
- reporter.onTestModuleCollected(item as TestModule)
435
- } else {
436
- reporter.onTestCaseResult(item as TestCase)
437
- }
438
- }
439
- }
440
-
441
- async function getTestsFromStorage(storage: Storage): Promise<Test[]> {
442
- const content = await storage.getTest()
443
- if (!content) return []
444
- const parsed: TestResult = JSON.parse(content)
445
- return parsed.testModules[0]?.tests ?? []
446
- }