xtrm-tools 2.0.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 (447) hide show
  1. package/CHANGELOG.md +496 -0
  2. package/README.md +762 -0
  3. package/cli/dist/index.cjs +55245 -0
  4. package/cli/dist/index.cjs.map +1 -0
  5. package/cli/dist/index.d.cts +2 -0
  6. package/cli/package.json +43 -0
  7. package/config/.env.example +40 -0
  8. package/config/hooks.json +36 -0
  9. package/config/mcp_servers.json +46 -0
  10. package/config/mcp_servers_optional.json +53 -0
  11. package/config/settings.json +70 -0
  12. package/hooks/README.md +156 -0
  13. package/hooks/__pycache__/agent_context.cpython-314.pyc +0 -0
  14. package/hooks/agent_context.py +105 -0
  15. package/hooks/gitnexus/gitnexus-hook.cjs +133 -0
  16. package/hooks/serena-workflow-reminder.py +74 -0
  17. package/hooks/skill-discovery.py +90 -0
  18. package/hooks/skill-suggestion.py +112 -0
  19. package/hooks/test_agent_context.py +112 -0
  20. package/hooks/type-safety-enforcement.py +107 -0
  21. package/package.json +48 -0
  22. package/project-skills/main-guard/.claude/hooks/main-guard.cjs +188 -0
  23. package/project-skills/main-guard/.claude/settings.json +16 -0
  24. package/project-skills/main-guard/.claude/skills/using-main-guard/SKILL.md +135 -0
  25. package/project-skills/main-guard/README.md +163 -0
  26. package/project-skills/py-quality-gate/.claude/hooks/quality-check.py +311 -0
  27. package/project-skills/py-quality-gate/.claude/settings.json +16 -0
  28. package/project-skills/py-quality-gate/.claude/skills/using-py-quality-gate/SKILL.md +112 -0
  29. package/project-skills/py-quality-gate/README.md +147 -0
  30. package/project-skills/service-skills-set/.claude/git-hooks/__pycache__/doc_reminder.cpython-314.pyc +0 -0
  31. package/project-skills/service-skills-set/.claude/git-hooks/__pycache__/skill_staleness.cpython-314.pyc +0 -0
  32. package/project-skills/service-skills-set/.claude/git-hooks/doc_reminder.py +67 -0
  33. package/project-skills/service-skills-set/.claude/git-hooks/skill_staleness.py +194 -0
  34. package/project-skills/service-skills-set/.claude/service-registry.json +4 -0
  35. package/project-skills/service-skills-set/.claude/settings.json +37 -0
  36. package/project-skills/service-skills-set/.claude/skills/creating-service-skills/SKILL.md +433 -0
  37. package/project-skills/service-skills-set/.claude/skills/creating-service-skills/references/script_quality_standards.md +412 -0
  38. package/project-skills/service-skills-set/.claude/skills/creating-service-skills/references/service_skill_system_guide.md +264 -0
  39. package/project-skills/service-skills-set/.claude/skills/creating-service-skills/scripts/bootstrap.py +308 -0
  40. package/project-skills/service-skills-set/.claude/skills/creating-service-skills/scripts/deep_dive.py +304 -0
  41. package/project-skills/service-skills-set/.claude/skills/creating-service-skills/scripts/scaffolder.py +482 -0
  42. package/project-skills/service-skills-set/.claude/skills/scoping-service-skills/SKILL.md +231 -0
  43. package/project-skills/service-skills-set/.claude/skills/scoping-service-skills/scripts/scope.py +74 -0
  44. package/project-skills/service-skills-set/.claude/skills/updating-service-skills/SKILL.md +136 -0
  45. package/project-skills/service-skills-set/.claude/skills/updating-service-skills/scripts/__pycache__/drift_detector.cpython-314.pyc +0 -0
  46. package/project-skills/service-skills-set/.claude/skills/updating-service-skills/scripts/drift_detector.py +222 -0
  47. package/project-skills/service-skills-set/.claude/skills/using-service-skills/SKILL.md +108 -0
  48. package/project-skills/service-skills-set/.claude/skills/using-service-skills/scripts/__pycache__/cataloger.cpython-314.pyc +0 -0
  49. package/project-skills/service-skills-set/.claude/skills/using-service-skills/scripts/__pycache__/skill_activator.cpython-314.pyc +0 -0
  50. package/project-skills/service-skills-set/.claude/skills/using-service-skills/scripts/cataloger.py +74 -0
  51. package/project-skills/service-skills-set/.claude/skills/using-service-skills/scripts/skill_activator.py +152 -0
  52. package/project-skills/service-skills-set/README.md +93 -0
  53. package/project-skills/service-skills-set/__pycache__/install-service-skills.cpython-314.pyc +0 -0
  54. package/project-skills/service-skills-set/install-service-skills.py +163 -0
  55. package/project-skills/service-skills-set/service-skills-readme.md +236 -0
  56. package/project-skills/tdd-guard/.claude/settings.json +38 -0
  57. package/project-skills/tdd-guard/.claude/skills/using-tdd-guard/SKILL.md +74 -0
  58. package/project-skills/tdd-guard/CLAUDE.md +98 -0
  59. package/project-skills/tdd-guard/CONTRIBUTING.md +38 -0
  60. package/project-skills/tdd-guard/DEVELOPMENT.md +127 -0
  61. package/project-skills/tdd-guard/LICENSE +21 -0
  62. package/project-skills/tdd-guard/README.md +396 -0
  63. package/project-skills/tdd-guard/docs/adr/001-claude-session-subdirectory.md +52 -0
  64. package/project-skills/tdd-guard/docs/adr/002-secure-claude-binary-path.md +56 -0
  65. package/project-skills/tdd-guard/docs/adr/003-remove-configurable-data-directory.md +56 -0
  66. package/project-skills/tdd-guard/docs/adr/004-monorepo-architecture.md +64 -0
  67. package/project-skills/tdd-guard/docs/adr/005-claude-project-dir-support.md +55 -0
  68. package/project-skills/tdd-guard/docs/adr/006-phpunit-separate-repository.md +93 -0
  69. package/project-skills/tdd-guard/docs/adr/007-golangci-lint-path-support.md +83 -0
  70. package/project-skills/tdd-guard/docs/adr/008-storybook-reporter-design.md +182 -0
  71. package/project-skills/tdd-guard/docs/assets/tdd-guard-demo-screenshot.gif +0 -0
  72. package/project-skills/tdd-guard/docs/config-migration.md +143 -0
  73. package/project-skills/tdd-guard/docs/configuration.md +137 -0
  74. package/project-skills/tdd-guard/docs/custom-instructions.md +43 -0
  75. package/project-skills/tdd-guard/docs/enforcement.md +46 -0
  76. package/project-skills/tdd-guard/docs/ignore-patterns.md +81 -0
  77. package/project-skills/tdd-guard/docs/linting.md +109 -0
  78. package/project-skills/tdd-guard/docs/quick-commands.md +52 -0
  79. package/project-skills/tdd-guard/docs/session-management.md +75 -0
  80. package/project-skills/tdd-guard/docs/storybook-vitest-addon.md +120 -0
  81. package/project-skills/tdd-guard/docs/validation-model.md +63 -0
  82. package/project-skills/tdd-guard/eslint.config.mjs +140 -0
  83. package/project-skills/tdd-guard/package-lock.json +16937 -0
  84. package/project-skills/tdd-guard/package.json +102 -0
  85. package/project-skills/tdd-guard/reporters/go/README.md +67 -0
  86. package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main.go +127 -0
  87. package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main_test.go +280 -0
  88. package/project-skills/tdd-guard/reporters/go/go.mod +3 -0
  89. package/project-skills/tdd-guard/reporters/go/go.sum +0 -0
  90. package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter.go +126 -0
  91. package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter_test.go +264 -0
  92. package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader.go +26 -0
  93. package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader_test.go +37 -0
  94. package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader.go +94 -0
  95. package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader_test.go +198 -0
  96. package/project-skills/tdd-guard/reporters/go/internal/parser/parser.go +245 -0
  97. package/project-skills/tdd-guard/reporters/go/internal/parser/parser_test.go +547 -0
  98. package/project-skills/tdd-guard/reporters/go/internal/storage/storage.go +35 -0
  99. package/project-skills/tdd-guard/reporters/go/internal/storage/storage_test.go +113 -0
  100. package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer.go +103 -0
  101. package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer_test.go +303 -0
  102. package/project-skills/tdd-guard/reporters/jest/README.md +102 -0
  103. package/project-skills/tdd-guard/reporters/jest/package.json +38 -0
  104. package/project-skills/tdd-guard/reporters/phpunit/.php-cs-fixer.php +28 -0
  105. package/project-skills/tdd-guard/reporters/phpunit/README.md +97 -0
  106. package/project-skills/tdd-guard/reporters/phpunit/SYNC_README.md +29 -0
  107. package/project-skills/tdd-guard/reporters/phpunit/composer.json +55 -0
  108. package/project-skills/tdd-guard/reporters/phpunit/phpunit.xml.dist +19 -0
  109. package/project-skills/tdd-guard/reporters/phpunit/psalm.xml +44 -0
  110. package/project-skills/tdd-guard/reporters/phpunit/src/Event/ErroredTestSubscriber.php +28 -0
  111. package/project-skills/tdd-guard/reporters/phpunit/src/Event/FailedTestSubscriber.php +28 -0
  112. package/project-skills/tdd-guard/reporters/phpunit/src/Event/IncompleteTestSubscriber.php +28 -0
  113. package/project-skills/tdd-guard/reporters/phpunit/src/Event/PassedTestSubscriber.php +27 -0
  114. package/project-skills/tdd-guard/reporters/phpunit/src/Event/SkippedTestSubscriber.php +28 -0
  115. package/project-skills/tdd-guard/reporters/phpunit/src/Event/TestRunnerFinishedSubscriber.php +24 -0
  116. package/project-skills/tdd-guard/reporters/phpunit/src/PathValidator.php +88 -0
  117. package/project-skills/tdd-guard/reporters/phpunit/src/Storage.php +26 -0
  118. package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardExtension.php +33 -0
  119. package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardListener.php +158 -0
  120. package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardSubscriber.php +35 -0
  121. package/project-skills/tdd-guard/reporters/phpunit/src/TestResultCollector.php +105 -0
  122. package/project-skills/tdd-guard/reporters/phpunit/tests/PathValidatorTest.php +74 -0
  123. package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionFailedTest.php +241 -0
  124. package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionTest.php +84 -0
  125. package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardStorageLocationTest.php +71 -0
  126. package/project-skills/tdd-guard/reporters/pytest/README.md +77 -0
  127. package/project-skills/tdd-guard/reporters/pytest/pyproject.toml +43 -0
  128. package/project-skills/tdd-guard/reporters/pytest/pytest.ini.example +7 -0
  129. package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/__init__.py +1 -0
  130. package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/pytest_reporter.py +134 -0
  131. package/project-skills/tdd-guard/reporters/pytest/tests/__init__.py +1 -0
  132. package/project-skills/tdd-guard/reporters/pytest/tests/conftest.py +3 -0
  133. package/project-skills/tdd-guard/reporters/pytest/tests/helpers.py +293 -0
  134. package/project-skills/tdd-guard/reporters/pytest/tests/test_config_option.py +38 -0
  135. package/project-skills/tdd-guard/reporters/pytest/tests/test_path_validation.py +59 -0
  136. package/project-skills/tdd-guard/reporters/pytest/tests/test_plugin_config.py +32 -0
  137. package/project-skills/tdd-guard/reporters/pytest/tests/test_project_root.py +296 -0
  138. package/project-skills/tdd-guard/reporters/pytest/tests/test_pytest_reporter.py +137 -0
  139. package/project-skills/tdd-guard/reporters/rspec/Gemfile +3 -0
  140. package/project-skills/tdd-guard/reporters/rust/Cargo.lock +458 -0
  141. package/project-skills/tdd-guard/reporters/rust/Cargo.toml +33 -0
  142. package/project-skills/tdd-guard/reporters/rust/Makefile.example +95 -0
  143. package/project-skills/tdd-guard/reporters/rust/README.md +88 -0
  144. package/project-skills/tdd-guard/reporters/rust/src/error_parser.rs +309 -0
  145. package/project-skills/tdd-guard/reporters/rust/src/main.rs +464 -0
  146. package/project-skills/tdd-guard/reporters/rust/src/parser.rs +225 -0
  147. package/project-skills/tdd-guard/reporters/rust/src/transformer.rs +409 -0
  148. package/project-skills/tdd-guard/reporters/storybook/README.md +108 -0
  149. package/project-skills/tdd-guard/reporters/storybook/package-lock.json +9482 -0
  150. package/project-skills/tdd-guard/reporters/storybook/package.json +43 -0
  151. package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test-data.ts +22 -0
  152. package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test.ts +190 -0
  153. package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.ts +88 -0
  154. package/project-skills/tdd-guard/reporters/storybook/src/index.ts +12 -0
  155. package/project-skills/tdd-guard/reporters/storybook/src/types.ts +37 -0
  156. package/project-skills/tdd-guard/reporters/storybook/tsconfig.json +11 -0
  157. package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/go.mod +3 -0
  158. package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/single_failing_test.go +13 -0
  159. package/project-skills/tdd-guard/reporters/test/artifacts/go/import/go.mod +3 -0
  160. package/project-skills/tdd-guard/reporters/test/artifacts/go/import/single_import_error_test.go +17 -0
  161. package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/go.mod +3 -0
  162. package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/single_passing_test.go +13 -0
  163. package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-failing.test.js +5 -0
  164. package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-import-error.test.js +8 -0
  165. package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-passing.test.js +5 -0
  166. package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleFailingTest.php +11 -0
  167. package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleImportErrorTest.php +14 -0
  168. package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SinglePassingTest.php +11 -0
  169. package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_failing.py +3 -0
  170. package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_import_error.py +6 -0
  171. package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_passing.py +3 -0
  172. package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.lock +7 -0
  173. package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.toml +4 -0
  174. package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/src/lib.rs +14 -0
  175. package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.lock +7 -0
  176. package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.toml +4 -0
  177. package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/src/lib.rs +13 -0
  178. package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.lock +7 -0
  179. package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.toml +4 -0
  180. package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/src/lib.rs +14 -0
  181. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/Calculator.js +4 -0
  182. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-failing.stories.js +15 -0
  183. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-import-error.stories.js +14 -0
  184. package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-passing.stories.js +15 -0
  185. package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-failing.test.js +7 -0
  186. package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-import-error.test.js +9 -0
  187. package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-passing.test.js +7 -0
  188. package/project-skills/tdd-guard/reporters/test/factories/go.ts +59 -0
  189. package/project-skills/tdd-guard/reporters/test/factories/helpers.ts +48 -0
  190. package/project-skills/tdd-guard/reporters/test/factories/index.ts +7 -0
  191. package/project-skills/tdd-guard/reporters/test/factories/jest.ts +51 -0
  192. package/project-skills/tdd-guard/reporters/test/factories/phpunit.ts +63 -0
  193. package/project-skills/tdd-guard/reporters/test/factories/pytest.ts +41 -0
  194. package/project-skills/tdd-guard/reporters/test/factories/rust.ts +158 -0
  195. package/project-skills/tdd-guard/reporters/test/factories/storybook.ts +198 -0
  196. package/project-skills/tdd-guard/reporters/test/factories/vitest.ts +51 -0
  197. package/project-skills/tdd-guard/reporters/test/reporters.integration.test.ts +735 -0
  198. package/project-skills/tdd-guard/reporters/test/types.ts +28 -0
  199. package/project-skills/tdd-guard/reporters/vitest/README.md +64 -0
  200. package/project-skills/tdd-guard/reporters/vitest/package.json +35 -0
  201. package/project-skills/tdd-guard/src/cli/buildContext.test.ts +200 -0
  202. package/project-skills/tdd-guard/src/cli/buildContext.ts +48 -0
  203. package/project-skills/tdd-guard/src/cli/tdd-guard.test.ts +159 -0
  204. package/project-skills/tdd-guard/src/cli/tdd-guard.ts +48 -0
  205. package/project-skills/tdd-guard/src/config/Config.test.ts +538 -0
  206. package/project-skills/tdd-guard/src/config/Config.ts +172 -0
  207. package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.test.ts +58 -0
  208. package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.ts +8 -0
  209. package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.test.ts +347 -0
  210. package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.ts +61 -0
  211. package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.test.ts +24 -0
  212. package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.ts +7 -0
  213. package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.test.ts +377 -0
  214. package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.ts +75 -0
  215. package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.test.ts +563 -0
  216. package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.ts +140 -0
  217. package/project-skills/tdd-guard/src/contracts/types/ClientType.ts +1 -0
  218. package/project-skills/tdd-guard/src/contracts/types/ConfigOptions.ts +12 -0
  219. package/project-skills/tdd-guard/src/contracts/types/Context.ts +16 -0
  220. package/project-skills/tdd-guard/src/contracts/types/ModelClient.ts +3 -0
  221. package/project-skills/tdd-guard/src/contracts/types/ValidationResult.ts +6 -0
  222. package/project-skills/tdd-guard/src/guard/GuardManager.test.ts +336 -0
  223. package/project-skills/tdd-guard/src/guard/GuardManager.ts +83 -0
  224. package/project-skills/tdd-guard/src/hooks/HookEvents.test.ts +107 -0
  225. package/project-skills/tdd-guard/src/hooks/HookEvents.ts +39 -0
  226. package/project-skills/tdd-guard/src/hooks/fileTypeDetection.ts +16 -0
  227. package/project-skills/tdd-guard/src/hooks/postToolLint.test.ts +327 -0
  228. package/project-skills/tdd-guard/src/hooks/postToolLint.ts +165 -0
  229. package/project-skills/tdd-guard/src/hooks/processHookData.test.ts +465 -0
  230. package/project-skills/tdd-guard/src/hooks/processHookData.ts +203 -0
  231. package/project-skills/tdd-guard/src/hooks/sessionHandler.test.ts +136 -0
  232. package/project-skills/tdd-guard/src/hooks/sessionHandler.ts +31 -0
  233. package/project-skills/tdd-guard/src/hooks/userPromptHandler.test.ts +131 -0
  234. package/project-skills/tdd-guard/src/hooks/userPromptHandler.ts +55 -0
  235. package/project-skills/tdd-guard/src/index.ts +19 -0
  236. package/project-skills/tdd-guard/src/linters/Linter.ts +5 -0
  237. package/project-skills/tdd-guard/src/linters/eslint/ESLint.test.ts +183 -0
  238. package/project-skills/tdd-guard/src/linters/eslint/ESLint.ts +82 -0
  239. package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.test.ts +170 -0
  240. package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.ts +148 -0
  241. package/project-skills/tdd-guard/src/processors/index.ts +1 -0
  242. package/project-skills/tdd-guard/src/processors/lintProcessor.ts +77 -0
  243. package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.test.ts +303 -0
  244. package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.ts +255 -0
  245. package/project-skills/tdd-guard/src/providers/LinterProvider.test.ts +43 -0
  246. package/project-skills/tdd-guard/src/providers/LinterProvider.ts +20 -0
  247. package/project-skills/tdd-guard/src/providers/ModelClientProvider.test.ts +68 -0
  248. package/project-skills/tdd-guard/src/providers/ModelClientProvider.ts +22 -0
  249. package/project-skills/tdd-guard/src/storage/FileStorage.test.ts +76 -0
  250. package/project-skills/tdd-guard/src/storage/FileStorage.ts +108 -0
  251. package/project-skills/tdd-guard/src/storage/MemoryStorage.ts +57 -0
  252. package/project-skills/tdd-guard/src/storage/Storage.test.ts +227 -0
  253. package/project-skills/tdd-guard/src/storage/Storage.ts +17 -0
  254. package/project-skills/tdd-guard/src/validation/context/context.test.ts +364 -0
  255. package/project-skills/tdd-guard/src/validation/context/context.ts +155 -0
  256. package/project-skills/tdd-guard/src/validation/models/AnthropicApi.test.ts +171 -0
  257. package/project-skills/tdd-guard/src/validation/models/AnthropicApi.ts +49 -0
  258. package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.test.ts +167 -0
  259. package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.ts +54 -0
  260. package/project-skills/tdd-guard/src/validation/models/ClaudeCli.test.ts +239 -0
  261. package/project-skills/tdd-guard/src/validation/models/ClaudeCli.ts +57 -0
  262. package/project-skills/tdd-guard/src/validation/prompts/file-types.ts +52 -0
  263. package/project-skills/tdd-guard/src/validation/prompts/operations/edit.ts +58 -0
  264. package/project-skills/tdd-guard/src/validation/prompts/operations/multi-edit.ts +54 -0
  265. package/project-skills/tdd-guard/src/validation/prompts/operations/write.ts +54 -0
  266. package/project-skills/tdd-guard/src/validation/prompts/response.ts +40 -0
  267. package/project-skills/tdd-guard/src/validation/prompts/rules.ts +51 -0
  268. package/project-skills/tdd-guard/src/validation/prompts/system-prompt.ts +10 -0
  269. package/project-skills/tdd-guard/src/validation/prompts/tools/lint-results.ts +15 -0
  270. package/project-skills/tdd-guard/src/validation/prompts/tools/test-output.ts +14 -0
  271. package/project-skills/tdd-guard/src/validation/prompts/tools/todos.ts +9 -0
  272. package/project-skills/tdd-guard/src/validation/validator.test.ts +268 -0
  273. package/project-skills/tdd-guard/src/validation/validator.ts +159 -0
  274. package/project-skills/tdd-guard/test/artifacts/go/.golangci.yml +6 -0
  275. package/project-skills/tdd-guard/test/artifacts/go/with-issues/file-with-issues.go +12 -0
  276. package/project-skills/tdd-guard/test/artifacts/go/with-issues/go.mod +3 -0
  277. package/project-skills/tdd-guard/test/artifacts/go/without-issues/file-without-issues.go +7 -0
  278. package/project-skills/tdd-guard/test/artifacts/go/without-issues/go.mod +3 -0
  279. package/project-skills/tdd-guard/test/artifacts/javascript/eslint.config.js +20 -0
  280. package/project-skills/tdd-guard/test/artifacts/javascript/file-with-issues.js +12 -0
  281. package/project-skills/tdd-guard/test/artifacts/javascript/file-without-issues.js +10 -0
  282. package/project-skills/tdd-guard/test/hooks/fileTypeDetection.test.ts +26 -0
  283. package/project-skills/tdd-guard/test/hooks/processHookData.fileType.test.ts +46 -0
  284. package/project-skills/tdd-guard/test/hooks/processHookData.python.test.ts +68 -0
  285. package/project-skills/tdd-guard/test/integration/test-context.test.ts +66 -0
  286. package/project-skills/tdd-guard/test/integration/validator.core.test.ts +96 -0
  287. package/project-skills/tdd-guard/test/integration/validator.scenarios.test.ts +497 -0
  288. package/project-skills/tdd-guard/test/utils/assertions.ts +29 -0
  289. package/project-skills/tdd-guard/test/utils/factories/contextFactory.ts +30 -0
  290. package/project-skills/tdd-guard/test/utils/factories/editFactory.ts +82 -0
  291. package/project-skills/tdd-guard/test/utils/factories/helpers.test.ts +46 -0
  292. package/project-skills/tdd-guard/test/utils/factories/helpers.ts +46 -0
  293. package/project-skills/tdd-guard/test/utils/factories/lintFactory.ts +352 -0
  294. package/project-skills/tdd-guard/test/utils/factories/modelClientProviderFactory.ts +21 -0
  295. package/project-skills/tdd-guard/test/utils/factories/multiEditFactory.ts +79 -0
  296. package/project-skills/tdd-guard/test/utils/factories/operations.ts +57 -0
  297. package/project-skills/tdd-guard/test/utils/factories/reporterFactory.ts +55 -0
  298. package/project-skills/tdd-guard/test/utils/factories/scenarios/index.ts +22 -0
  299. package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/python.ts +745 -0
  300. package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/typescript.ts +767 -0
  301. package/project-skills/tdd-guard/test/utils/factories/scenarios/types.ts +77 -0
  302. package/project-skills/tdd-guard/test/utils/factories/scenarios/utils.ts +15 -0
  303. package/project-skills/tdd-guard/test/utils/factories/sessionStartFactory.ts +36 -0
  304. package/project-skills/tdd-guard/test/utils/factories/testDefaults.ts +90 -0
  305. package/project-skills/tdd-guard/test/utils/factories/testResultsFactory.ts +234 -0
  306. package/project-skills/tdd-guard/test/utils/factories/todoFactory.ts +99 -0
  307. package/project-skills/tdd-guard/test/utils/factories/userPromptSubmitFactory.ts +39 -0
  308. package/project-skills/tdd-guard/test/utils/factories/writeFactory.ts +70 -0
  309. package/project-skills/tdd-guard/test/utils/index.ts +131 -0
  310. package/project-skills/tdd-guard/tsconfig.build.json +16 -0
  311. package/project-skills/tdd-guard/tsconfig.eslint.json +17 -0
  312. package/project-skills/tdd-guard/tsconfig.json +32 -0
  313. package/project-skills/tdd-guard/tsconfig.node.json +10 -0
  314. package/project-skills/tdd-guard/vitest.config.ts +85 -0
  315. package/project-skills/ts-quality-gate/.claude/hooks/hook-config.json +66 -0
  316. package/project-skills/ts-quality-gate/.claude/hooks/quality-check.cjs +1251 -0
  317. package/project-skills/ts-quality-gate/.claude/settings.json +16 -0
  318. package/project-skills/ts-quality-gate/.claude/skills/using-ts-quality-gate/SKILL.md +81 -0
  319. package/project-skills/ts-quality-gate/README.md +115 -0
  320. package/skills/README.txt +31 -0
  321. package/skills/clean-code/SKILL.md +201 -0
  322. package/skills/delegating/SKILL.md +196 -0
  323. package/skills/delegating/config.yaml +210 -0
  324. package/skills/delegating/references/orchestration-protocols.md +41 -0
  325. package/skills/docker-expert/SKILL.md +409 -0
  326. package/skills/documenting/CHANGELOG.md +23 -0
  327. package/skills/documenting/README.md +148 -0
  328. package/skills/documenting/SKILL.md +113 -0
  329. package/skills/documenting/examples/example_pattern.md +70 -0
  330. package/skills/documenting/examples/example_reference.md +70 -0
  331. package/skills/documenting/examples/example_ssot_analytics.md +64 -0
  332. package/skills/documenting/examples/example_workflow.md +141 -0
  333. package/skills/documenting/references/changelog-format.md +97 -0
  334. package/skills/documenting/references/metadata-schema.md +136 -0
  335. package/skills/documenting/references/taxonomy.md +81 -0
  336. package/skills/documenting/references/versioning-rules.md +78 -0
  337. package/skills/documenting/scripts/__pycache__/drift_detector.cpython-314.pyc +0 -0
  338. package/skills/documenting/scripts/__pycache__/orchestrator.cpython-314.pyc +0 -0
  339. package/skills/documenting/scripts/__pycache__/validate_metadata.cpython-314.pyc +0 -0
  340. package/skills/documenting/scripts/bump_version.sh +60 -0
  341. package/skills/documenting/scripts/changelog/__init__.py +0 -0
  342. package/skills/documenting/scripts/changelog/__pycache__/__init__.cpython-314.pyc +0 -0
  343. package/skills/documenting/scripts/changelog/__pycache__/add_entry.cpython-314.pyc +0 -0
  344. package/skills/documenting/scripts/changelog/__pycache__/bump_release.cpython-314.pyc +0 -0
  345. package/skills/documenting/scripts/changelog/__pycache__/validate_changelog.cpython-314.pyc +0 -0
  346. package/skills/documenting/scripts/changelog/add_entry.py +216 -0
  347. package/skills/documenting/scripts/changelog/bump_release.py +117 -0
  348. package/skills/documenting/scripts/changelog/init_changelog.py +54 -0
  349. package/skills/documenting/scripts/changelog/validate_changelog.py +128 -0
  350. package/skills/documenting/scripts/drift_detector.py +266 -0
  351. package/skills/documenting/scripts/generate_template.py +311 -0
  352. package/skills/documenting/scripts/list_by_category.sh +84 -0
  353. package/skills/documenting/scripts/orchestrator.py +255 -0
  354. package/skills/documenting/scripts/validate_metadata.py +242 -0
  355. package/skills/documenting/templates/CHANGELOG.md.template +13 -0
  356. package/skills/documenting/tests/__pycache__/test_changelog.cpython-314-pytest-9.0.2.pyc +0 -0
  357. package/skills/documenting/tests/__pycache__/test_drift_detector.cpython-314-pytest-9.0.2.pyc +0 -0
  358. package/skills/documenting/tests/__pycache__/test_orchestrator.cpython-314-pytest-9.0.2.pyc +0 -0
  359. package/skills/documenting/tests/__pycache__/test_validate_metadata.cpython-314-pytest-9.0.2.pyc +0 -0
  360. package/skills/documenting/tests/integration_test.sh +70 -0
  361. package/skills/documenting/tests/test_changelog.py +201 -0
  362. package/skills/documenting/tests/test_drift_detector.py +80 -0
  363. package/skills/documenting/tests/test_orchestrator.py +52 -0
  364. package/skills/documenting/tests/test_validate_metadata.py +64 -0
  365. package/skills/find-skills/SKILL.md +133 -0
  366. package/skills/gitnexus-debugging/SKILL.md +85 -0
  367. package/skills/gitnexus-exploring/SKILL.md +75 -0
  368. package/skills/gitnexus-impact-analysis/SKILL.md +94 -0
  369. package/skills/gitnexus-refactoring/SKILL.md +113 -0
  370. package/skills/hook-development/SKILL.md +797 -0
  371. package/skills/hook-development/examples/load-context.sh +55 -0
  372. package/skills/hook-development/examples/quality-check.js +1168 -0
  373. package/skills/hook-development/examples/validate-bash.sh +43 -0
  374. package/skills/hook-development/examples/validate-write.sh +38 -0
  375. package/skills/hook-development/references/advanced.md +527 -0
  376. package/skills/hook-development/references/migration.md +369 -0
  377. package/skills/hook-development/references/patterns.md +412 -0
  378. package/skills/hook-development/scripts/README.md +164 -0
  379. package/skills/hook-development/scripts/hook-linter.sh +153 -0
  380. package/skills/hook-development/scripts/test-hook.sh +252 -0
  381. package/skills/hook-development/scripts/validate-hook-schema.sh +159 -0
  382. package/skills/obsidian-cli/SKILL.md +106 -0
  383. package/skills/orchestrating-agents/SKILL.md +135 -0
  384. package/skills/orchestrating-agents/config.yaml +45 -0
  385. package/skills/orchestrating-agents/references/agent-context-integration.md +37 -0
  386. package/skills/orchestrating-agents/references/examples.md +45 -0
  387. package/skills/orchestrating-agents/references/handover-protocol.md +31 -0
  388. package/skills/orchestrating-agents/references/workflows.md +42 -0
  389. package/skills/orchestrating-agents/scripts/detect_neighbors.py +23 -0
  390. package/skills/prompt-improving/README.md +162 -0
  391. package/skills/prompt-improving/SKILL.md +74 -0
  392. package/skills/prompt-improving/references/analysis_commands.md +24 -0
  393. package/skills/prompt-improving/references/chain_of_thought.md +24 -0
  394. package/skills/prompt-improving/references/mcp_definitions.md +20 -0
  395. package/skills/prompt-improving/references/multishot.md +23 -0
  396. package/skills/prompt-improving/references/xml_core.md +60 -0
  397. package/skills/python-testing/SKILL.md +815 -0
  398. package/skills/senior-backend/SKILL.md +209 -0
  399. package/skills/senior-backend/references/api_design_patterns.md +103 -0
  400. package/skills/senior-backend/references/backend_security_practices.md +103 -0
  401. package/skills/senior-backend/references/database_optimization_guide.md +103 -0
  402. package/skills/senior-backend/scripts/api_load_tester.py +114 -0
  403. package/skills/senior-backend/scripts/api_scaffolder.py +114 -0
  404. package/skills/senior-backend/scripts/database_migration_tool.py +114 -0
  405. package/skills/senior-data-scientist/SKILL.md +226 -0
  406. package/skills/senior-data-scientist/references/experiment_design_frameworks.md +80 -0
  407. package/skills/senior-data-scientist/references/feature_engineering_patterns.md +80 -0
  408. package/skills/senior-data-scientist/references/statistical_methods_advanced.md +80 -0
  409. package/skills/senior-data-scientist/scripts/experiment_designer.py +100 -0
  410. package/skills/senior-data-scientist/scripts/feature_engineering_pipeline.py +100 -0
  411. package/skills/senior-data-scientist/scripts/model_evaluation_suite.py +100 -0
  412. package/skills/senior-devops/SKILL.md +209 -0
  413. package/skills/senior-devops/references/cicd_pipeline_guide.md +103 -0
  414. package/skills/senior-devops/references/deployment_strategies.md +103 -0
  415. package/skills/senior-devops/references/infrastructure_as_code.md +103 -0
  416. package/skills/senior-devops/scripts/deployment_manager.py +114 -0
  417. package/skills/senior-devops/scripts/pipeline_generator.py +114 -0
  418. package/skills/senior-devops/scripts/terraform_scaffolder.py +114 -0
  419. package/skills/senior-security/SKILL.md +209 -0
  420. package/skills/senior-security/references/cryptography_implementation.md +103 -0
  421. package/skills/senior-security/references/penetration_testing_guide.md +103 -0
  422. package/skills/senior-security/references/security_architecture_patterns.md +103 -0
  423. package/skills/senior-security/scripts/pentest_automator.py +114 -0
  424. package/skills/senior-security/scripts/security_auditor.py +114 -0
  425. package/skills/senior-security/scripts/threat_modeler.py +114 -0
  426. package/skills/skill-creator/LICENSE.txt +202 -0
  427. package/skills/skill-creator/SKILL.md +479 -0
  428. package/skills/skill-creator/agents/analyzer.md +274 -0
  429. package/skills/skill-creator/agents/comparator.md +202 -0
  430. package/skills/skill-creator/agents/grader.md +223 -0
  431. package/skills/skill-creator/assets/eval_review.html +146 -0
  432. package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  433. package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  434. package/skills/skill-creator/references/schemas.md +430 -0
  435. package/skills/skill-creator/scripts/__init__.py +0 -0
  436. package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  437. package/skills/skill-creator/scripts/generate_report.py +326 -0
  438. package/skills/skill-creator/scripts/improve_description.py +248 -0
  439. package/skills/skill-creator/scripts/package_skill.py +136 -0
  440. package/skills/skill-creator/scripts/quick_validate.py +103 -0
  441. package/skills/skill-creator/scripts/run_eval.py +310 -0
  442. package/skills/skill-creator/scripts/run_loop.py +332 -0
  443. package/skills/skill-creator/scripts/utils.py +47 -0
  444. package/skills/using-TDD/SKILL.md +410 -0
  445. package/skills/using-serena-lsp/README.md +8 -0
  446. package/skills/using-serena-lsp/REFERENCE.md +194 -0
  447. package/skills/using-serena-lsp/SKILL.md +82 -0
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "tdd-guard-storybook",
3
+ "version": "0.1.0",
4
+ "description": "Storybook test-runner reporter for TDD Guard",
5
+ "author": "Tony Kornmeier",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/nizos/tdd-guard.git",
10
+ "directory": "reporters/storybook"
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
+ "@storybook/test-runner": ">=0.19.0"
29
+ },
30
+ "devDependencies": {
31
+ "@storybook/react-vite": "^8.4.7",
32
+ "@storybook/test": "^8.4.7",
33
+ "@storybook/test-runner": "^0.19.1",
34
+ "@types/node": "^24.1.0",
35
+ "@types/react": "^18.3.18",
36
+ "react": "^18.3.1",
37
+ "react-dom": "^18.3.1",
38
+ "storybook": "^8.4.7",
39
+ "typescript": "^5.8.3",
40
+ "vite": "^6.0.11",
41
+ "vitest": "^3.2.4"
42
+ }
43
+ }
@@ -0,0 +1,22 @@
1
+ import type { TestContext } from './types'
2
+
3
+ const DEFAULT_STORY_ID = 'button--primary'
4
+ const DEFAULT_STORY_TITLE = 'Button'
5
+ const DEFAULT_STORY_NAME = 'Primary'
6
+
7
+ export function createStoryContext(
8
+ overrides?: Partial<TestContext>
9
+ ): TestContext {
10
+ return {
11
+ id: DEFAULT_STORY_ID,
12
+ title: DEFAULT_STORY_TITLE,
13
+ name: DEFAULT_STORY_NAME,
14
+ ...overrides,
15
+ }
16
+ }
17
+
18
+ // Convenience aliases for createStoryContext
19
+ export const passedStoryContext = createStoryContext
20
+ export const failedStoryContext = createStoryContext
21
+ export const skippedStoryContext = createStoryContext
22
+ export const renderErrorContext = createStoryContext
@@ -0,0 +1,190 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest'
2
+ import { StorybookReporter } from './StorybookReporter'
3
+ import { MemoryStorage, FileStorage, Config, DEFAULT_DATA_DIR } from 'tdd-guard'
4
+ import {
5
+ createStoryContext,
6
+ passedStoryContext,
7
+ failedStoryContext,
8
+ } from './StorybookReporter.test-data'
9
+ import { join } from 'node:path'
10
+ import type { StoryTest } from './types'
11
+
12
+ describe('StorybookReporter', () => {
13
+ it('uses FileStorage by default', () => {
14
+ const reporter = new StorybookReporter()
15
+ expect(reporter['storage']).toBeInstanceOf(FileStorage)
16
+ })
17
+
18
+ it('accepts Storage instance in constructor', () => {
19
+ const storage = new MemoryStorage()
20
+ const reporter = new StorybookReporter(storage)
21
+ expect(reporter['storage']).toBe(storage)
22
+ })
23
+
24
+ it('accepts root path string in constructor', () => {
25
+ const rootPath = '/some/project/root'
26
+ const reporter = new StorybookReporter(rootPath)
27
+ expect(reporter['storage']).toBeInstanceOf(FileStorage)
28
+ const fileStorage = reporter['storage'] as FileStorage
29
+ const config = fileStorage['config'] as Config
30
+ const expectedDataDir = join(rootPath, ...DEFAULT_DATA_DIR.split('/'))
31
+ expect(config.dataDir).toBe(expectedDataDir)
32
+ })
33
+
34
+ describe('when collecting story results', () => {
35
+ let storage: MemoryStorage
36
+ let reporter: StorybookReporter
37
+
38
+ beforeEach(() => {
39
+ storage = new MemoryStorage()
40
+ reporter = new StorybookReporter(storage)
41
+ })
42
+
43
+ it('saves output as valid JSON', async () => {
44
+ const context = passedStoryContext()
45
+ await reporter.onStoryResult(context)
46
+ await reporter.onComplete()
47
+
48
+ const saved = await storage.getTest()
49
+ expect(saved).toBeTruthy()
50
+ const parsed = JSON.parse(saved!)
51
+ expect(parsed).toBeDefined()
52
+ })
53
+
54
+ it('includes test modules', async () => {
55
+ const context = passedStoryContext()
56
+ await reporter.onStoryResult(context)
57
+ await reporter.onComplete()
58
+
59
+ const saved = await storage.getTest()
60
+ const parsed = JSON.parse(saved!)
61
+ expect(parsed.testModules).toHaveLength(1)
62
+ })
63
+
64
+ it('includes test cases', async () => {
65
+ const context1 = passedStoryContext()
66
+ const context2 = passedStoryContext({
67
+ storyExport: { name: 'Secondary' },
68
+ })
69
+ await reporter.onStoryResult(context1)
70
+ await reporter.onStoryResult(context2)
71
+ await reporter.onComplete()
72
+
73
+ const saved = await storage.getTest()
74
+ const parsed = JSON.parse(saved!)
75
+ expect(parsed.testModules[0].tests).toHaveLength(2)
76
+ })
77
+
78
+ it('captures test states (passed/failed)', async () => {
79
+ const passedContext = passedStoryContext()
80
+ const failedContext = failedStoryContext()
81
+ await reporter.onStoryResult(passedContext, 'passed')
82
+ await reporter.onStoryResult(failedContext, 'failed', [
83
+ {
84
+ message: 'expected button to have aria-label',
85
+ stack:
86
+ 'Error: expected button to have aria-label\n at test.ts:7:19',
87
+ },
88
+ ])
89
+ await reporter.onComplete()
90
+
91
+ const saved = await storage.getTest()
92
+ const parsed = JSON.parse(saved!)
93
+ const tests = parsed.testModules[0].tests as StoryTest[]
94
+ expect(tests.find((t) => t.state === 'passed')).toBeDefined()
95
+ expect(tests.find((t) => t.state === 'failed')).toBeDefined()
96
+ })
97
+
98
+ it('includes error information for failed tests', async () => {
99
+ const context = failedStoryContext()
100
+ await reporter.onStoryResult(context, 'failed', [
101
+ {
102
+ message: 'expected button to have aria-label',
103
+ stack:
104
+ 'Error: expected button to have aria-label\n at test.ts:7:19',
105
+ },
106
+ ])
107
+ await reporter.onComplete()
108
+
109
+ const saved = await storage.getTest()
110
+ const parsed = JSON.parse(saved!)
111
+ const failedTest = parsed.testModules[0].tests[0]
112
+ expect(failedTest.state).toBe('failed')
113
+ expect(failedTest.errors).toBeDefined()
114
+ expect(failedTest.errors.length).toBeGreaterThan(0)
115
+ })
116
+ })
117
+
118
+ describe('test state mapping', () => {
119
+ let storage: MemoryStorage
120
+ let reporter: StorybookReporter
121
+
122
+ beforeEach(() => {
123
+ storage = new MemoryStorage()
124
+ reporter = new StorybookReporter(storage)
125
+ })
126
+
127
+ it.each([
128
+ ['passed', 'passed'],
129
+ ['failed', 'failed'],
130
+ ['skipped', 'skipped'],
131
+ ] as const)('maps %s to %s', async (status, expected) => {
132
+ const context = createStoryContext()
133
+ await reporter.onStoryResult(context, status)
134
+ await reporter.onComplete()
135
+
136
+ const saved = await storage.getTest()
137
+ const parsed = JSON.parse(saved!)
138
+ expect(parsed.testModules[0].tests[0].state).toBe(expected)
139
+ })
140
+ })
141
+
142
+ it('handles empty test runs', async () => {
143
+ const storage = new MemoryStorage()
144
+ const reporter = new StorybookReporter(storage)
145
+
146
+ await reporter.onComplete()
147
+
148
+ const saved = await storage.getTest()
149
+ const parsed = JSON.parse(saved!)
150
+ expect(parsed).toEqual({ testModules: [], unhandledErrors: [] })
151
+ })
152
+
153
+ describe('overall test run status', () => {
154
+ let storage: MemoryStorage
155
+ let reporter: StorybookReporter
156
+
157
+ beforeEach(() => {
158
+ storage = new MemoryStorage()
159
+ reporter = new StorybookReporter(storage)
160
+ })
161
+
162
+ it('reports "passed" when all tests pass', async () => {
163
+ const context = passedStoryContext()
164
+ await reporter.onStoryResult(context)
165
+ await reporter.onComplete()
166
+
167
+ const saved = await storage.getTest()
168
+ const parsed = JSON.parse(saved!)
169
+ expect(parsed.reason).toBe('passed')
170
+ })
171
+
172
+ it('reports "failed" when any test fails', async () => {
173
+ const passedContext = passedStoryContext()
174
+ const failedContext = failedStoryContext()
175
+ await reporter.onStoryResult(passedContext, 'passed')
176
+ await reporter.onStoryResult(failedContext, 'failed', [
177
+ {
178
+ message: 'expected button to have aria-label',
179
+ stack:
180
+ 'Error: expected button to have aria-label\n at test.ts:7:19',
181
+ },
182
+ ])
183
+ await reporter.onComplete()
184
+
185
+ const saved = await storage.getTest()
186
+ const parsed = JSON.parse(saved!)
187
+ expect(parsed.reason).toBe('failed')
188
+ })
189
+ })
190
+ })
@@ -0,0 +1,88 @@
1
+ import { Storage, FileStorage, Config } from 'tdd-guard'
2
+ import type {
3
+ TestContext,
4
+ TestRunOutput,
5
+ StoryTest,
6
+ StoryModule,
7
+ StoryError,
8
+ } from './types'
9
+
10
+ export class StorybookReporter {
11
+ private readonly storage: Storage
12
+ private readonly collectedTests: Map<string, StoryTest[]> = new Map()
13
+
14
+ constructor(storageOrRoot?: Storage | string) {
15
+ this.storage = this.initializeStorage(storageOrRoot)
16
+ }
17
+
18
+ private initializeStorage(storageOrRoot?: Storage | string): Storage {
19
+ if (!storageOrRoot) {
20
+ return new FileStorage()
21
+ }
22
+
23
+ if (typeof storageOrRoot === 'string') {
24
+ const config = new Config({ projectRoot: storageOrRoot })
25
+ return new FileStorage(config)
26
+ }
27
+
28
+ return storageOrRoot
29
+ }
30
+
31
+ async onStoryResult(
32
+ context: TestContext,
33
+ status: 'passed' | 'failed' | 'skipped' = 'passed',
34
+ errors?: unknown[]
35
+ ): Promise<void> {
36
+ const moduleId = context.id
37
+ const test: StoryTest = {
38
+ name: context.name,
39
+ fullName: `${context.title} > ${context.name}`,
40
+ state: status,
41
+ }
42
+
43
+ // Add errors if present
44
+ if (errors && errors.length > 0) {
45
+ test.errors = errors.map((err: unknown): StoryError => {
46
+ const errorObj = err as Record<string, unknown>
47
+ const message = errorObj.message
48
+ return {
49
+ message: typeof message === 'string' ? message : String(err),
50
+ stack: errorObj.stack as string | undefined,
51
+ }
52
+ })
53
+ }
54
+
55
+ if (!this.collectedTests.has(moduleId)) {
56
+ this.collectedTests.set(moduleId, [])
57
+ }
58
+ this.collectedTests.get(moduleId)!.push(test)
59
+ }
60
+
61
+ async onComplete(): Promise<void> {
62
+ const testModules: StoryModule[] = Array.from(
63
+ this.collectedTests.entries()
64
+ ).map(([moduleId, tests]) => ({
65
+ moduleId,
66
+ tests,
67
+ }))
68
+
69
+ const output: TestRunOutput = {
70
+ testModules,
71
+ unhandledErrors: [],
72
+ reason: this.determineReason(testModules),
73
+ }
74
+
75
+ await this.storage.saveTest(JSON.stringify(output, null, 2))
76
+ }
77
+
78
+ private determineReason(
79
+ testModules: StoryModule[]
80
+ ): 'passed' | 'failed' | undefined {
81
+ const allTests = testModules.flatMap((m) => m.tests)
82
+ if (allTests.length === 0) {
83
+ return undefined
84
+ }
85
+ const hasFailures = allTests.some((t) => t.state === 'failed')
86
+ return hasFailures ? 'failed' : 'passed'
87
+ }
88
+ }
@@ -0,0 +1,12 @@
1
+ import { StorybookReporter } from './StorybookReporter'
2
+
3
+ export { StorybookReporter }
4
+ export default StorybookReporter
5
+ export type {
6
+ StorybookReporterOptions,
7
+ StoryError,
8
+ StoryTest,
9
+ StoryModule,
10
+ TestRunOutput,
11
+ TestContext,
12
+ } from './types'
@@ -0,0 +1,37 @@
1
+ import type { Storage } from 'tdd-guard'
2
+
3
+ export interface StorybookReporterOptions {
4
+ storage?: Storage
5
+ projectRoot?: string
6
+ }
7
+
8
+ export interface StoryError {
9
+ message: string
10
+ stack?: string
11
+ expected?: unknown
12
+ actual?: unknown
13
+ }
14
+
15
+ export interface StoryTest {
16
+ name: string
17
+ fullName: string
18
+ state: 'passed' | 'failed' | 'skipped'
19
+ errors?: StoryError[]
20
+ }
21
+
22
+ export interface StoryModule {
23
+ moduleId: string
24
+ tests: StoryTest[]
25
+ }
26
+
27
+ export interface TestRunOutput {
28
+ testModules: StoryModule[]
29
+ unhandledErrors: unknown[]
30
+ reason?: 'passed' | 'failed' | 'interrupted'
31
+ }
32
+
33
+ export interface TestContext {
34
+ id: string
35
+ title: string
36
+ name: string // Story name comes directly from context, not nested in storyExport
37
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "composite": true,
5
+ "outDir": "./dist",
6
+ "rootDir": "./src",
7
+ "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo"
8
+ },
9
+ "include": ["src/**/*"],
10
+ "exclude": ["**/*.test.ts", "**/*.spec.ts"]
11
+ }
@@ -0,0 +1,3 @@
1
+ module singleFailingTestModule
2
+
3
+ go 1.24
@@ -0,0 +1,13 @@
1
+ package singleFailingTestModule
2
+
3
+ import "testing"
4
+
5
+ func TestCalculator(t *testing.T) {
6
+ t.Run("TestShouldAddNumbersCorrectly", func(t *testing.T) {
7
+ result := 2 + 3
8
+ expected := 6
9
+ if result != expected {
10
+ t.Errorf("Expected %d but got %d", expected, result)
11
+ }
12
+ })
13
+ }
@@ -0,0 +1,3 @@
1
+ module missingImportModule
2
+
3
+ go 1.24
@@ -0,0 +1,17 @@
1
+ package missingImportModule
2
+
3
+ import (
4
+ "github.com/non-existent/module"
5
+ "testing"
6
+ )
7
+
8
+ func TestCalculator(t *testing.T) {
9
+ t.Run("TestShouldAddNumbersCorrectly", func(t *testing.T) {
10
+ module.NonExistentFunction()
11
+ result := 2 + 3
12
+ expected := 5
13
+ if result != expected {
14
+ t.Errorf("Expected %d but got %d", expected, result)
15
+ }
16
+ })
17
+ }
@@ -0,0 +1,3 @@
1
+ module singlePassingTestModule
2
+
3
+ go 1.24
@@ -0,0 +1,13 @@
1
+ package singlePassingTestModule
2
+
3
+ import "testing"
4
+
5
+ func TestCalculator(t *testing.T) {
6
+ t.Run("TestShouldAddNumbersCorrectly", func(t *testing.T) {
7
+ result := 2 + 3
8
+ expected := 5
9
+ if result != expected {
10
+ t.Errorf("Expected %d but got %d", expected, result)
11
+ }
12
+ })
13
+ }
@@ -0,0 +1,5 @@
1
+ describe('Calculator', () => {
2
+ test('should add numbers correctly', () => {
3
+ expect(2 + 3).toBe(6)
4
+ })
5
+ })
@@ -0,0 +1,8 @@
1
+ const { nonExistentFunction } = require('./non-existent-module')
2
+
3
+ describe('Calculator', () => {
4
+ test('should add numbers correctly', () => {
5
+ nonExistentFunction()
6
+ expect(2 + 3).toBe(5)
7
+ })
8
+ })
@@ -0,0 +1,5 @@
1
+ describe('Calculator', () => {
2
+ test('should add numbers correctly', () => {
3
+ expect(2 + 3).toBe(5)
4
+ })
5
+ })
@@ -0,0 +1,11 @@
1
+ <?php
2
+
3
+ use PHPUnit\Framework\TestCase;
4
+
5
+ class SingleFailingTest extends TestCase
6
+ {
7
+ public function testShouldAddNumbersCorrectly(): void
8
+ {
9
+ $this->assertEquals(6, 2 + 3);
10
+ }
11
+ }
@@ -0,0 +1,14 @@
1
+ <?php
2
+
3
+ use PHPUnit\Framework\TestCase;
4
+ use NonExistent\Module\SomeClass;
5
+
6
+ class SingleImportErrorTest extends TestCase
7
+ {
8
+ public function testShouldAddNumbersCorrectly(): void
9
+ {
10
+ // This should cause a fatal error due to the non-existent class
11
+ $instance = new SomeClass();
12
+ $this->assertEquals(5, 2 + 3);
13
+ }
14
+ }
@@ -0,0 +1,11 @@
1
+ <?php
2
+
3
+ use PHPUnit\Framework\TestCase;
4
+
5
+ class SinglePassingTest extends TestCase
6
+ {
7
+ public function testShouldAddNumbersCorrectly(): void
8
+ {
9
+ $this->assertEquals(5, 2 + 3);
10
+ }
11
+ }
@@ -0,0 +1,3 @@
1
+ class TestCalculator:
2
+ def test_should_add_numbers_correctly(self):
3
+ assert 2 + 3 == 6
@@ -0,0 +1,6 @@
1
+ from non_existent_module import non_existent_function
2
+
3
+ class TestCalculator:
4
+ def test_should_add_numbers_correctly(self):
5
+ non_existent_module()
6
+ assert 2 + 3 == 5
@@ -0,0 +1,3 @@
1
+ class TestCalculator:
2
+ def test_should_add_numbers_correctly(self):
3
+ assert 2 + 3 == 5
@@ -0,0 +1,7 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "single_failing"
7
+ version = "0.1.0"
@@ -0,0 +1,4 @@
1
+ [package]
2
+ name = "single_failing"
3
+ version = "0.1.0"
4
+ edition = "2021"
@@ -0,0 +1,14 @@
1
+ pub fn add(left: u64, right: u64) -> u64 {
2
+ left + right
3
+ }
4
+
5
+ #[cfg(test)]
6
+ mod calculator_tests {
7
+ use super::*;
8
+
9
+ #[test]
10
+ fn should_add_numbers_correctly() {
11
+ let result = add(2, 3);
12
+ assert_eq!(result, 6); // This will fail: 2 + 3 != 6
13
+ }
14
+ }
@@ -0,0 +1,7 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "single_import_error"
7
+ version = "0.1.0"
@@ -0,0 +1,4 @@
1
+ [package]
2
+ name = "single_import_error"
3
+ version = "0.1.0"
4
+ edition = "2021"
@@ -0,0 +1,13 @@
1
+ use non_existent_module::Calculator; // This will fail to compile
2
+
3
+ #[cfg(test)]
4
+ mod calculator_tests {
5
+ use super::*;
6
+
7
+ #[test]
8
+ fn should_add_numbers_correctly() {
9
+ let calc = Calculator::new();
10
+ let result = calc.add(2, 3);
11
+ assert_eq!(result, 5);
12
+ }
13
+ }
@@ -0,0 +1,7 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "single_passing"
7
+ version = "0.1.0"
@@ -0,0 +1,4 @@
1
+ [package]
2
+ name = "single_passing"
3
+ version = "0.1.0"
4
+ edition = "2021"
@@ -0,0 +1,14 @@
1
+ pub fn add(left: u64, right: u64) -> u64 {
2
+ left + right
3
+ }
4
+
5
+ #[cfg(test)]
6
+ mod calculator_tests {
7
+ use super::*;
8
+
9
+ #[test]
10
+ fn should_add_numbers_correctly() {
11
+ let result = add(2, 3);
12
+ assert_eq!(result, 5);
13
+ }
14
+ }
@@ -0,0 +1,4 @@
1
+ // Simple calculator module for testing
2
+ export const Calculator = {
3
+ add: (a, b) => a + b,
4
+ }
@@ -0,0 +1,15 @@
1
+ import { expect } from '@storybook/test'
2
+ import { Calculator } from './Calculator'
3
+
4
+ export default {
5
+ title: 'Calculator',
6
+ render: () => null, // No UI component, just testing logic
7
+ }
8
+
9
+ export const Primary = {
10
+ name: 'should add numbers correctly',
11
+ play: async () => {
12
+ const result = Calculator.add(2, 3)
13
+ await expect(result).toBe(6) // Intentionally wrong - 2 + 3 = 5, not 6
14
+ },
15
+ }