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,152 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ PreToolUse hook: skill activator.
4
+
5
+ Fires before Read, Write, Edit, Glob, Grep, or Bash operations.
6
+ Checks whether the operation touches a registered service territory.
7
+ If it does, injects additionalContext telling Claude to load the skill
8
+ before proceeding — ensuring expert knowledge is always applied.
9
+
10
+ Configured in .claude/settings.json PreToolUse hook.
11
+ Must be fast: pure file I/O + string matching, no subprocess.
12
+ """
13
+
14
+ import fnmatch
15
+ import json
16
+ import sys
17
+ from pathlib import Path
18
+
19
+ BOOTSTRAP_DIR = Path(__file__).parent.parent.parent / "creating-service-skills" / "scripts"
20
+ sys.path.insert(0, str(BOOTSTRAP_DIR))
21
+
22
+ from bootstrap import RootResolutionError, get_project_root, load_registry # noqa: E402
23
+
24
+
25
+ def match_territory(file_path: str, territory: list[str], project_root: Path) -> bool:
26
+ """Check if a file path matches any territory glob pattern."""
27
+ # Normalize to relative path
28
+ fp = Path(file_path)
29
+ if fp.is_absolute():
30
+ try:
31
+ fp = fp.relative_to(project_root)
32
+ except ValueError:
33
+ return False
34
+ rel = str(fp)
35
+
36
+ for pattern in territory:
37
+ # fnmatch handles * and ?, but not ** — handle ** manually
38
+ if "**" in pattern:
39
+ # Split on **/ and check prefix + suffix
40
+ parts = pattern.split("**/")
41
+ if len(parts) == 2:
42
+ prefix, suffix = parts
43
+ rel_check = rel[len(prefix) :] if rel.startswith(prefix) else rel
44
+ if fnmatch.fnmatch(rel_check, suffix) or fnmatch.fnmatch(
45
+ rel, f"{prefix}*/{suffix}"
46
+ ):
47
+ return True
48
+ # Also check if file is anywhere under the prefix dir
49
+ if prefix and rel.startswith(prefix.rstrip("/")):
50
+ return True
51
+ else:
52
+ if fnmatch.fnmatch(rel, pattern):
53
+ return True
54
+ # Direct prefix match for broad patterns
55
+ base = pattern.split("/*")[0].split("/**")[0]
56
+ if base and (rel.startswith(base + "/") or rel == base):
57
+ return True
58
+
59
+ return False
60
+
61
+
62
+ def find_service_for_file(
63
+ file_path: str, services: dict, project_root: Path
64
+ ) -> tuple[str, dict] | None:
65
+ """Return (service_id, service_data) if file is in any territory, else None."""
66
+ for service_id, data in services.items():
67
+ if match_territory(file_path, data.get("territory", []), project_root):
68
+ return service_id, data
69
+ return None
70
+
71
+
72
+ def find_service_for_command(command: str, services: dict) -> tuple[str, dict] | None:
73
+ """Return (service_id, service_data) if command mentions a service name."""
74
+ cmd_lower = command.lower()
75
+ for service_id, data in services.items():
76
+ # Match service_id directly or as a container name in docker commands
77
+ if service_id in cmd_lower:
78
+ return service_id, data
79
+ # Match the container name pattern (service name with dashes/underscores)
80
+ if data.get("name") and data.get("name", "").lower().replace(" ", "-") in cmd_lower:
81
+ return service_id, data
82
+ return None
83
+
84
+
85
+ def build_context(service_id: str, data: dict) -> str:
86
+ skill_path = data.get("skill_path", f".claude/skills/{service_id}/SKILL.md")
87
+ desc = data.get("description", "")
88
+ desc_line = f"\n What it covers: {desc}" if desc else ""
89
+
90
+ return (
91
+ f"[Service Skill] You are about to work with the '{service_id}' service territory."
92
+ f"{desc_line}\n"
93
+ f" Load the expert skill before proceeding: Read {skill_path}\n"
94
+ f" The skill contains: operational knowledge, failure modes, diagnostic scripts, "
95
+ f"and the correct methods for managing this service.\n"
96
+ f" Do not use ad-hoc approaches (raw SQL, improvised docker commands) "
97
+ f"when the skill defines the correct method."
98
+ )
99
+
100
+
101
+ def main() -> None:
102
+ try:
103
+ data = json.load(sys.stdin)
104
+ except (json.JSONDecodeError, EOFError):
105
+ sys.exit(0)
106
+
107
+ tool_name = data.get("tool_name", "")
108
+ tool_input = data.get("tool_input", {})
109
+
110
+ try:
111
+ project_root = Path(get_project_root())
112
+ services = load_registry()
113
+ except (RootResolutionError, Exception):
114
+ sys.exit(0)
115
+
116
+ if not services:
117
+ sys.exit(0)
118
+
119
+ match = None
120
+
121
+ # File-based tools: check file_path against territory
122
+ if tool_name in ("Read", "Write", "Edit", "Glob", "Grep", "NotebookRead", "NotebookEdit"):
123
+ file_path = (
124
+ tool_input.get("file_path")
125
+ or tool_input.get("path")
126
+ or tool_input.get("notebook_path")
127
+ or ""
128
+ )
129
+ if file_path:
130
+ match = find_service_for_file(file_path, services, project_root)
131
+
132
+ # Bash: check command string for service names
133
+ elif tool_name == "Bash":
134
+ command = tool_input.get("command", "")
135
+ if command:
136
+ match = find_service_for_command(command, services)
137
+
138
+ if match:
139
+ service_id, service_data = match
140
+ output = {
141
+ "hookSpecificOutput": {
142
+ "hookEventName": "PreToolUse",
143
+ "additionalContext": build_context(service_id, service_data),
144
+ }
145
+ }
146
+ print(json.dumps(output))
147
+
148
+ sys.exit(0)
149
+
150
+
151
+ if __name__ == "__main__":
152
+ main()
@@ -0,0 +1,93 @@
1
+ # Service Skills Set
2
+
3
+ **Service Skills** give Claude persistent, project-specific operational knowledge about your Docker services. Instead of re-explaining your architecture every session, each service gets a dedicated skill package that Claude loads on demand.
4
+
5
+ ## What It Does
6
+
7
+ ### Three Workflow Skills (Trinity)
8
+
9
+ | Skill | Role | Invocation |
10
+ |-------|------|------------|
11
+ | `creating-service-skills` | Builds new skill packages via 3-phase workflow | `/creating-service-skills` |
12
+ | `using-service-skills` | Discovers and activates expert personas | Auto (SessionStart hook) |
13
+ | `updating-service-skills` | Detects drift when code changes | Auto (PostToolUse hook) |
14
+
15
+ ### Five Hooks
16
+
17
+ | Hook | Type | Trigger | Effect |
18
+ |------|------|---------|--------|
19
+ | `SessionStart` | Claude Code | Session opens | Injects service catalog (~150 tokens) |
20
+ | `PreToolUse` | Claude Code | Read/Write/Edit/Grep/Glob/Bash | Checks service territory, activates skills |
21
+ | `PostToolUse` | Claude Code | Write/Edit | Detects drift, notifies to sync docs |
22
+ | `pre-commit` | Git | `git commit` | Warns if source changed without SSOT update |
23
+ | `pre-push` | Git | `git push` | Warns if service skills are stale |
24
+
25
+ ## Installation
26
+
27
+ ```bash
28
+ # From your project directory
29
+ xtrm install project service-skills-set
30
+ ```
31
+
32
+ **Post-install:** The Service Skills Set requires Python scripts to be executable. The installer will:
33
+ 1. Copy skills to `.claude/skills/`
34
+ 2. Wire `settings.json` hooks
35
+ 3. Activate git hooks (`pre-commit`, `pre-push`)
36
+
37
+ ## Creating a Service Skill
38
+
39
+ After installation, invoke the skill in Claude Code:
40
+
41
+ ```bash
42
+ /creating-service-skills
43
+ ```
44
+
45
+ This runs a 3-phase workflow:
46
+
47
+ ### Phase 1: Automated Skeleton
48
+ - Reads `docker-compose*.yml`, `Dockerfile`, dependency files
49
+ - Produces `SKILL.md` with `[PENDING RESEARCH]` markers
50
+ - Generates script stubs in `scripts/`
51
+ - Creates entry in `.claude/skills/service-registry.json`
52
+
53
+ ### Phase 2: Agentic Deep Dive
54
+ - Uses Serena LSP for codebase research (75-80% token savings)
55
+ - Fills `[PENDING RESEARCH]` markers with actual knowledge
56
+ - Sources troubleshooting tables from real failure modes
57
+
58
+ ### Phase 3: Hook Registration
59
+ - Verifies `PreToolUse` hook in `settings.json`
60
+ - Confirms service territory globs in registry
61
+ - Skill now auto-activates on territory file access
62
+
63
+ ## Generated Skill Structure
64
+
65
+ ```
66
+ .claude/skills/<service-name>/
67
+ ├── SKILL.md — architecture, failure modes, operations
68
+ ├── scripts/
69
+ │ ├── health_probe.py — container status check
70
+ │ ├── log_hunter.py — log pattern analysis
71
+ │ ├── data_explorer.py — read-only DB inspection
72
+ │ └── <specialist>.py — service-type inspector
73
+ └── references/
74
+ ├── deep_dive.md — Phase 2 research notes
75
+ └── architecture_ssot.md — link to project SSOT
76
+ ```
77
+
78
+ ## Auto-Activation
79
+
80
+ Skills activate automatically when Claude:
81
+ - Operates on files matching territory globs (e.g., `src/auth/**/*.py`)
82
+ - Runs Bash commands mentioning service/container name
83
+
84
+ ## Requirements
85
+
86
+ - Python 3.8+
87
+ - Git repository
88
+ - Docker Compose project
89
+
90
+ ## Documentation
91
+
92
+ - Full guide: `.claude/docs/service-skills-set-readme.md`
93
+ - Original: `project-skills/service-skills-set/service-skills-readme.md`
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Install the Service Skill Trinity into the current project.
4
+
5
+ Run from inside your target project directory:
6
+ python3 /path/to/jaggers-agent-tools/project-skills/install-service-skills.py
7
+
8
+ Installs:
9
+ .claude/skills/creating-service-skills/ — scaffold new service skills
10
+ .claude/skills/using-service-skills/ — session-start catalog injection
11
+ .claude/skills/updating-service-skills/ — drift detection on file writes
12
+ .claude/skills/scoping-service-skills/ — task intake and service routing
13
+ .claude/settings.json — SessionStart + PostToolUse hooks
14
+ .githooks/pre-commit — doc-reminder (non-blocking)
15
+ .githooks/pre-push — skill-staleness (non-blocking)
16
+ .git/hooks/pre-commit + pre-push — activated
17
+
18
+ Idempotent. Safe to re-run.
19
+ """
20
+
21
+ import json
22
+ import shutil
23
+ import subprocess
24
+ import sys
25
+ from pathlib import Path
26
+
27
+ SCRIPT_DIR = Path(__file__).parent.resolve() # project-skills/service-skills-set/
28
+ REPO_ROOT = SCRIPT_DIR.parent.parent.resolve() # jaggers-agent-tools/
29
+ SKILLS_SRC = SCRIPT_DIR / ".claude" # service-skills-set/.claude/<skill>/
30
+ GIT_HOOKS = SKILLS_SRC / "git-hooks" # service-skills-set/.claude/git-hooks/
31
+
32
+ GREEN = "\033[0;32m"
33
+ YELLOW = "\033[1;33m"
34
+ NC = "\033[0m"
35
+
36
+ TRINITY = ["creating-service-skills", "using-service-skills", "updating-service-skills", "scoping-service-skills"]
37
+
38
+ SETTINGS_HOOKS = {
39
+ "SessionStart": [
40
+ {"hooks": [{"type": "command",
41
+ "command": "python3 \"$CLAUDE_PROJECT_DIR/.claude/skills/using-service-skills/scripts/cataloger.py\""}]}
42
+ ],
43
+ "PreToolUse": [
44
+ {"matcher": "Read|Write|Edit|Glob|Grep|Bash",
45
+ "hooks": [{"type": "command",
46
+ "command": "python3 \"$CLAUDE_PROJECT_DIR/.claude/skills/using-service-skills/scripts/skill_activator.py\""}]}
47
+ ],
48
+ "PostToolUse": [
49
+ {"matcher": "Write|Edit",
50
+ "hooks": [{"type": "command",
51
+ "command": "python3 \"$CLAUDE_PROJECT_DIR/.claude/skills/updating-service-skills/scripts/drift_detector.py\" check-hook",
52
+ "timeout": 10}]}
53
+ ]
54
+ }
55
+
56
+ MARKER_DOC = "# [jaggers] doc-reminder"
57
+ MARKER_STALENESS = "# [jaggers] skill-staleness"
58
+
59
+
60
+ def get_project_root() -> Path:
61
+ try:
62
+ r = subprocess.run(["git", "rev-parse", "--show-toplevel"],
63
+ capture_output=True, text=True, check=True, timeout=5)
64
+ root = Path(r.stdout.strip())
65
+ if root == REPO_ROOT:
66
+ print("Error: run this from inside your TARGET project, not jaggers-agent-tools itself.")
67
+ sys.exit(1)
68
+ return root
69
+ except subprocess.CalledProcessError:
70
+ print("Error: not inside a git repository.")
71
+ sys.exit(1)
72
+
73
+
74
+ def install_skills(project_root: Path) -> None:
75
+ print("\n── Skills ──────────────────────────────")
76
+ for skill in TRINITY:
77
+ src = SKILLS_SRC / skill
78
+ dest = project_root / ".claude" / "skills" / skill
79
+ if dest.exists():
80
+ shutil.rmtree(dest)
81
+ shutil.copytree(src, dest, ignore=shutil.ignore_patterns("*.Zone.Identifier"))
82
+ print(f"{GREEN} ✓{NC} .claude/skills/{skill}/")
83
+
84
+
85
+ def install_settings(project_root: Path) -> None:
86
+ print("\n── settings.json ───────────────────────")
87
+ path = project_root / ".claude" / "settings.json"
88
+ path.parent.mkdir(parents=True, exist_ok=True)
89
+
90
+ existing = {}
91
+ if path.exists():
92
+ try:
93
+ existing = json.loads(path.read_text(encoding="utf-8"))
94
+ except json.JSONDecodeError:
95
+ pass
96
+
97
+ hooks = existing.setdefault("hooks", {})
98
+ for event, config in SETTINGS_HOOKS.items():
99
+ if event not in hooks:
100
+ hooks[event] = config
101
+ print(f"{GREEN} ✓{NC} added hook: {event}")
102
+ else:
103
+ print(f"{YELLOW} ○{NC} hook already present: {event} (not overwritten)")
104
+
105
+ path.write_text(json.dumps(existing, indent=2) + "\n", encoding="utf-8")
106
+
107
+
108
+ def install_git_hooks(project_root: Path) -> None:
109
+ print("\n── Git hooks ───────────────────────────")
110
+ doc_script = GIT_HOOKS / "doc_reminder.py"
111
+ staleness_script = GIT_HOOKS / "skill_staleness.py"
112
+
113
+ pre_commit = project_root / ".githooks" / "pre-commit"
114
+ pre_push = project_root / ".githooks" / "pre-push"
115
+
116
+ for hp in (pre_commit, pre_push):
117
+ if not hp.exists():
118
+ hp.parent.mkdir(parents=True, exist_ok=True)
119
+ hp.write_text("#!/usr/bin/env bash\n", encoding="utf-8")
120
+ hp.chmod(0o755)
121
+
122
+ snippets = [
123
+ (pre_commit, MARKER_DOC,
124
+ f"\n{MARKER_DOC}\nif command -v python3 &>/dev/null && [ -f \"{doc_script}\" ]; then\n python3 \"{doc_script}\" || true\nfi\n"),
125
+ (pre_push, MARKER_STALENESS,
126
+ f"\n{MARKER_STALENESS}\nif command -v python3 &>/dev/null && [ -f \"{staleness_script}\" ]; then\n python3 \"{staleness_script}\" || true\nfi\n"),
127
+ ]
128
+
129
+ changed = False
130
+ for hook_path, marker, snippet in snippets:
131
+ content = hook_path.read_text(encoding="utf-8")
132
+ if marker not in content:
133
+ hook_path.write_text(content + snippet, encoding="utf-8")
134
+ print(f"{GREEN} ✓{NC} {hook_path.relative_to(project_root)}")
135
+ changed = True
136
+ else:
137
+ print(f"{YELLOW} ○{NC} already installed: {hook_path.name}")
138
+
139
+ if changed:
140
+ git_dir = project_root / ".git" / "hooks"
141
+ git_dir.mkdir(parents=True, exist_ok=True)
142
+ for src, name in ((pre_commit, "pre-commit"), (pre_push, "pre-push")):
143
+ if src.exists():
144
+ dest = git_dir / name
145
+ shutil.copy2(src, dest)
146
+ dest.chmod(0o755)
147
+ print(f"{GREEN} ✓{NC} activated in .git/hooks/")
148
+
149
+
150
+ def main() -> None:
151
+ project_root = get_project_root()
152
+ print(f"Installing into: {project_root}")
153
+
154
+ install_skills(project_root)
155
+ install_settings(project_root)
156
+ install_git_hooks(project_root)
157
+
158
+ print(f"\n{GREEN}Done.{NC}")
159
+ print(f" Hooks active: SessionStart (catalog) · PreToolUse (skill activator) · PostToolUse (drift) · pre-commit · pre-push")
160
+
161
+
162
+ if __name__ == "__main__":
163
+ main()
@@ -0,0 +1,236 @@
1
+ # Service Skills
2
+
3
+ A system that gives Claude persistent, project-specific operational knowledge about your Docker services. Instead of re-explaining your architecture every session, each service has a dedicated skill package that Claude loads on demand.
4
+
5
+ ---
6
+
7
+ ## What It Does
8
+
9
+ **Three workflow skills** form the trinity:
10
+
11
+ | Skill | Role | When it runs |
12
+ |---|---|---|
13
+ | `creating-service-skills` | Builds new skill packages via 3-phase workflow (scaffold + Serena deep dive + hook registration) | Manually via `/creating-service-skills` |
14
+ | `using-service-skills` | Discovers and activates expert personas | Automatically at session start |
15
+ | `updating-service-skills` | Detects drift when code changes | Automatically on every file write |
16
+
17
+ **Five hooks** keep everything wired together:
18
+
19
+ | Hook | Type | Trigger | Effect |
20
+ |---|---|---|---|
21
+ | `SessionStart` | Claude Code | Session opens | Injects lightweight service catalog into context (~150 tokens) |
22
+ | `PreToolUse` | Claude Code | Any Read/Write/Edit/Grep/Glob/Bash | Checks if the operation touches a service territory; injects skill load reminder and enforcement |
23
+ | `PostToolUse` | Claude Code | Any Write/Edit | Checks if modified file belongs to a registered service; notifies Claude to sync docs |
24
+ | `pre-commit` | Git | `git commit` | Warns if source files changed without SSOT documentation update (non-blocking) |
25
+ | `pre-push` | Git | `git push` | Warns if service skills are older than the source files being pushed (non-blocking) |
26
+
27
+ **Each generated skill package** for a service contains:
28
+
29
+ ```
30
+ .claude/skills/<service-name>/
31
+ ├── SKILL.md — architecture, data flows, failure modes, common operations
32
+ ├── scripts/
33
+ │ ├── health_probe.py — container status + table freshness check
34
+ │ ├── log_hunter.py — service-specific log pattern analysis
35
+ │ ├── data_explorer.py — read-only DB inspection
36
+ │ └── <specialist>.py — service-type-specific inspector
37
+ └── references/
38
+ ├── deep_dive.md — Phase 2 research notes
39
+ └── architecture_ssot.md — link to project SSOT if available
40
+ ```
41
+
42
+ ---
43
+
44
+ ## Installation
45
+
46
+ Run once, from inside your target project directory:
47
+
48
+ ```bash
49
+ cd ~/projects/my-project
50
+ python3 /path/to/jaggers-agent-tools/project-skills/service-skills-set/install-service-skills.py
51
+ ```
52
+
53
+ This installs the three workflow skills, wires `settings.json` hooks, and activates git hooks. Idempotent — safe to re-run after updates.
54
+
55
+ ---
56
+
57
+ ## Creating a Service Skill
58
+
59
+ ```bash
60
+ # In Claude Code, invoke the skill:
61
+ /creating-service-skills
62
+ ```
63
+
64
+ The skill runs a **mandatory three-phase workflow**:
65
+
66
+ ### Phase 1 — Automated Skeleton
67
+
68
+ ```bash
69
+ python3 "$CLAUDE_PROJECT_DIR/.claude/skills/creating-service-skills/scripts/scaffolder.py" \
70
+ create <service-id> <territory-path> "<description>"
71
+ ```
72
+
73
+ Reads `docker-compose*.yml`, `Dockerfile`, and dependency files. Produces:
74
+ - `SKILL.md` with `[PENDING RESEARCH]` markers
75
+ - Script stubs in `scripts/`
76
+ - Official documentation links auto-detected from image tags and package files
77
+ - Entry in `.claude/skills/service-registry.json`
78
+
79
+ ### Phase 2 — Agentic Deep Dive
80
+
81
+ Claude reads the actual source code to fill every `[PENDING RESEARCH]` marker.
82
+ Uses Serena LSP tools (not raw file reads) for efficiency:
83
+
84
+ ```
85
+ get_symbols_overview → map module structure
86
+ find_symbol → read specific functions
87
+ search_for_pattern → find log strings, SQL queries, env vars
88
+ find_referencing_symbols → trace data flows
89
+ ```
90
+
91
+ ### Phase 3 — Hook Registration
92
+
93
+ After the deep dive is complete, Claude verifies the auto-activation infrastructure:
94
+
95
+ 1. Confirms the `PreToolUse` hook is present in `.claude/settings.json` (pointing to `skill_activator.py`)
96
+ 2. Verifies the service entry in `.claude/skills/service-registry.json` has territory globs set
97
+ 3. Informs you that the skill will now auto-activate whenever Claude:
98
+ - Operates on a file matching the service's territory globs
99
+ - Runs a Bash command that mentions the service name or container name
100
+
101
+ No manual registration step is needed — the installer wires the hooks at project setup time. Phase 3 is a verification and communication step only.
102
+
103
+ A skill is **complete** only when:
104
+ - No `[PENDING RESEARCH]` markers remain
105
+ - `health_probe.py` queries real tables with correct stale thresholds
106
+ - `log_hunter.py` patterns sourced from actual codebase error strings
107
+ - Troubleshooting table has ≥5 rows from real failure modes
108
+ - All scripts support `--json` output
109
+ - `PreToolUse` skill activator hook confirmed in `.claude/settings.json`
110
+ - Service territory globs verified in `.claude/skills/service-registry.json`
111
+ - You have been informed: skill auto-activates on territory file access and service-name commands
112
+
113
+ ---
114
+
115
+ ## Using a Service Skill
116
+
117
+ At session start, Claude receives:
118
+
119
+ ```xml
120
+ <project_service_catalog>
121
+ Available expert personas:
122
+ - db-expert: SQL & schema optimization (Path: .claude/skills/db-expert/SKILL.md)
123
+ - auth-service: JWT authentication expert (Path: .claude/skills/auth-service/SKILL.md)
124
+ </project_service_catalog>
125
+ ```
126
+
127
+ Claude automatically loads the relevant skill when you ask about a covered service. You can also invoke explicitly:
128
+
129
+ ```
130
+ Read .claude/skills/<service-name>/SKILL.md
131
+ ```
132
+
133
+ ### Auto-activation
134
+
135
+ Once a service skill is registered, you don't need to load it manually.
136
+ The `PreToolUse` hook (`skill_activator.py`) fires automatically whenever
137
+ Claude operates on a file in the service's territory or runs a Bash command
138
+ mentioning the service name. It injects:
139
+
140
+ ```
141
+ [Service Skill] You are about to work with the 'auth-service' service territory.
142
+ Load the expert skill before proceeding: Read .claude/skills/auth-service/SKILL.md
143
+ Do not use ad-hoc approaches (raw SQL, improvised docker commands) when the
144
+ skill defines the correct method.
145
+ ```
146
+
147
+ This enforces that Claude uses the skill's defined diagnostic scripts and
148
+ operational procedures rather than improvising — e.g. running `health_probe.py`
149
+ instead of issuing direct `psql` queries, or checking `log_hunter.py` patterns
150
+ before reading raw docker logs.
151
+
152
+ ### Run scripts directly
153
+
154
+ ```bash
155
+ python3 .claude/skills/<service-name>/scripts/health_probe.py
156
+ python3 .claude/skills/<service-name>/scripts/log_hunter.py --errors-only
157
+ python3 .claude/skills/<service-name>/scripts/data_explorer.py --limit 20 --json
158
+ ```
159
+
160
+ ---
161
+
162
+ ## Updating a Service Skill
163
+
164
+ When you modify service source code, the `PostToolUse` hook fires automatically and Claude sees:
165
+
166
+ ```
167
+ [Skill Sync]: Implementation drift detected in 'auth-service'.
168
+ File 'src/auth/jwt.py' was modified.
169
+ Use '/updating-service-skills' to sync the Auth Service documentation.
170
+ ```
171
+
172
+ To sync:
173
+
174
+ ```bash
175
+ /updating-service-skills
176
+ ```
177
+
178
+ To mark a service as synced after manual update:
179
+
180
+ ```bash
181
+ python3 .claude/skills/updating-service-skills/scripts/drift_detector.py sync <service-id>
182
+ ```
183
+
184
+ To scan all services for drift:
185
+
186
+ ```bash
187
+ python3 .claude/skills/updating-service-skills/scripts/drift_detector.py scan
188
+ ```
189
+
190
+ ---
191
+
192
+ ## Registry
193
+
194
+ `.claude/skills/service-registry.json` is the source of truth for registered services:
195
+
196
+ ```json
197
+ {
198
+ "services": {
199
+ "auth-service": {
200
+ "name": "Auth Service",
201
+ "territory": ["src/auth/**/*.py"],
202
+ "skill_path": ".claude/skills/auth-service/SKILL.md",
203
+ "description": "JWT authentication and session management",
204
+ "last_sync": "2026-02-23T19:00:00Z"
205
+ }
206
+ }
207
+ }
208
+ ```
209
+
210
+ The `territory` globs determine which file paths trigger drift detection and skill auto-activation.
211
+
212
+ ---
213
+
214
+ ## Project Structure
215
+
216
+ ```
217
+ project-skills/service-skills-set/ — this repository's source
218
+ ├── install-service-skills.py — installer (run from inside target project)
219
+ └── .claude/
220
+ ├── settings.json — settings template with all 3 hook events
221
+ ├── git-hooks/
222
+ │ ├── doc_reminder.py — pre-commit: SSOT reminder
223
+ │ └── skill_staleness.py — pre-push: stale skill warning
224
+ ├── creating-service-skills/ — workflow skill: build new service skills
225
+ ├── using-service-skills/ — workflow skill: catalog injection + skill activation
226
+ └── updating-service-skills/ — workflow skill: drift detection
227
+
228
+ .claude/ — installed into your project
229
+ ├── settings.json — SessionStart + PreToolUse + PostToolUse hooks
230
+ └── skills/
231
+ ├── service-registry.json
232
+ ├── creating-service-skills/
233
+ ├── using-service-skills/
234
+ ├── updating-service-skills/
235
+ └── <generated-service-skills>/
236
+ ```
@@ -0,0 +1,38 @@
1
+ {
2
+ "hooks": {
3
+ "PreToolUse": [
4
+ {
5
+ "matcher": "Write|Edit|MultiEdit|TodoWrite",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "tdd-guard",
10
+ "timeout": 30
11
+ }
12
+ ]
13
+ }
14
+ ],
15
+ "UserPromptSubmit": [
16
+ {
17
+ "hooks": [
18
+ {
19
+ "type": "command",
20
+ "command": "tdd-guard --prompt-check",
21
+ "timeout": 15
22
+ }
23
+ ]
24
+ }
25
+ ],
26
+ "SessionStart": [
27
+ {
28
+ "hooks": [
29
+ {
30
+ "type": "command",
31
+ "command": "tdd-guard --session-init",
32
+ "timeout": 5
33
+ }
34
+ ]
35
+ }
36
+ ]
37
+ }
38
+ }