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,412 @@
1
+ # Common Hook Patterns
2
+
3
+ This reference provides common, proven patterns for implementing Claude Code hooks. Use these patterns as starting points for typical hook use cases.
4
+
5
+ ## Pattern 1: Security Validation
6
+
7
+ Block dangerous file writes using prompt-based hooks:
8
+
9
+ ```json
10
+ {
11
+ "PreToolUse": [
12
+ {
13
+ "matcher": "Write|Edit",
14
+ "hooks": [
15
+ {
16
+ "type": "prompt",
17
+ "prompt": "File path: $TOOL_INPUT.file_path. Verify: 1) Not in /etc or system directories 2) Not .env or credentials 3) Path doesn't contain '..' traversal. Return 'approve' or 'deny'."
18
+ }
19
+ ]
20
+ }
21
+ ]
22
+ }
23
+ ```
24
+
25
+ **Use for:** Preventing writes to sensitive files or system directories.
26
+
27
+ ## Pattern 2: Test Enforcement
28
+
29
+ Ensure tests run before stopping:
30
+
31
+ ```json
32
+ {
33
+ "Stop": [
34
+ {
35
+ "matcher": "*",
36
+ "hooks": [
37
+ {
38
+ "type": "prompt",
39
+ "prompt": "Review transcript. If code was modified (Write/Edit tools used), verify tests were executed. If no tests were run, block with reason 'Tests must be run after code changes'."
40
+ }
41
+ ]
42
+ }
43
+ ]
44
+ }
45
+ ```
46
+
47
+ **Use for:** Enforcing quality standards and preventing incomplete work.
48
+
49
+ ## Pattern 3: Context Loading
50
+
51
+ Load project-specific context at session start:
52
+
53
+ ```json
54
+ {
55
+ "SessionStart": [
56
+ {
57
+ "matcher": "*",
58
+ "hooks": [
59
+ {
60
+ "type": "command",
61
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/load-context.sh"
62
+ }
63
+ ]
64
+ }
65
+ ]
66
+ }
67
+ ```
68
+
69
+ **Example script (load-context.sh):**
70
+ ```bash
71
+ #!/bin/bash
72
+ cd "$CLAUDE_PROJECT_DIR" || exit 1
73
+
74
+ # Detect project type
75
+ if [ -f "package.json" ]; then
76
+ echo "📦 Node.js project detected"
77
+ echo "export PROJECT_TYPE=nodejs" >> "$CLAUDE_ENV_FILE"
78
+ elif [ -f "Cargo.toml" ]; then
79
+ echo "🦀 Rust project detected"
80
+ echo "export PROJECT_TYPE=rust" >> "$CLAUDE_ENV_FILE"
81
+ fi
82
+ ```
83
+
84
+ **Use for:** Automatically detecting and configuring project-specific settings.
85
+
86
+ ## Pattern 4: Notification Logging
87
+
88
+ Log all notifications for audit or analysis:
89
+
90
+ ```json
91
+ {
92
+ "Notification": [
93
+ {
94
+ "matcher": "*",
95
+ "hooks": [
96
+ {
97
+ "type": "command",
98
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/log-notification.sh"
99
+ }
100
+ ]
101
+ }
102
+ ]
103
+ }
104
+ ```
105
+
106
+ **Use for:** Tracking user notifications or integration with external logging systems.
107
+
108
+ ## Pattern 5: MCP Tool Monitoring
109
+
110
+ Monitor and validate MCP tool usage:
111
+
112
+ ```json
113
+ {
114
+ "PreToolUse": [
115
+ {
116
+ "matcher": "mcp__.*__delete.*",
117
+ "hooks": [
118
+ {
119
+ "type": "prompt",
120
+ "prompt": "Deletion operation detected. Verify: Is this deletion intentional? Can it be undone? Are there backups? Return 'approve' only if safe."
121
+ }
122
+ ]
123
+ }
124
+ ]
125
+ }
126
+ ```
127
+
128
+ **Use for:** Protecting against destructive MCP operations.
129
+
130
+ ## Pattern 6: Build Verification
131
+
132
+ Ensure project builds after code changes:
133
+
134
+ ```json
135
+ {
136
+ "Stop": [
137
+ {
138
+ "matcher": "*",
139
+ "hooks": [
140
+ {
141
+ "type": "prompt",
142
+ "prompt": "Check if code was modified. If Write/Edit tools were used, verify the project was built (npm run build, cargo build, etc). If not built, block and request build."
143
+ }
144
+ ]
145
+ }
146
+ ]
147
+ }
148
+ ```
149
+
150
+ **Use for:** Catching build errors before committing or stopping work.
151
+
152
+ ## Pattern 7: Permission Confirmation
153
+
154
+ Ask user before dangerous operations:
155
+
156
+ ```json
157
+ {
158
+ "PreToolUse": [
159
+ {
160
+ "matcher": "Bash",
161
+ "hooks": [
162
+ {
163
+ "type": "prompt",
164
+ "prompt": "Command: $TOOL_INPUT.command. If command contains 'rm', 'delete', 'drop', or other destructive operations, return 'ask' to confirm with user. Otherwise 'approve'."
165
+ }
166
+ ]
167
+ }
168
+ ]
169
+ }
170
+ ```
171
+
172
+ **Use for:** User confirmation on potentially destructive commands.
173
+
174
+ ## Pattern 8: Code Quality Checks
175
+
176
+ Run linters or formatters on file edits:
177
+
178
+ ```json
179
+ {
180
+ "PostToolUse": [
181
+ {
182
+ "matcher": "Write|Edit",
183
+ "hooks": [
184
+ {
185
+ "type": "command",
186
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/check-quality.sh"
187
+ }
188
+ ]
189
+ }
190
+ ]
191
+ }
192
+ ```
193
+
194
+ **Example script (check-quality.sh):**
195
+ ```bash
196
+ #!/bin/bash
197
+ input=$(cat)
198
+ file_path=$(echo "$input" | jq -r '.tool_input.file_path')
199
+
200
+ # Run linter if applicable
201
+ if [[ "$file_path" == *.js ]] || [[ "$file_path" == *.ts ]]; then
202
+ npx eslint "$file_path" 2>&1 || true
203
+ fi
204
+ ```
205
+
206
+ **Use for:** Automatic code quality enforcement.
207
+
208
+ ## Pattern Combinations
209
+
210
+ Combine multiple patterns for comprehensive protection:
211
+
212
+ ```json
213
+ {
214
+ "PreToolUse": [
215
+ {
216
+ "matcher": "Write|Edit",
217
+ "hooks": [
218
+ {
219
+ "type": "prompt",
220
+ "prompt": "Validate file write safety"
221
+ }
222
+ ]
223
+ },
224
+ {
225
+ "matcher": "Bash",
226
+ "hooks": [
227
+ {
228
+ "type": "prompt",
229
+ "prompt": "Validate bash command safety"
230
+ }
231
+ ]
232
+ }
233
+ ],
234
+ "Stop": [
235
+ {
236
+ "matcher": "*",
237
+ "hooks": [
238
+ {
239
+ "type": "prompt",
240
+ "prompt": "Verify tests run and build succeeded"
241
+ }
242
+ ]
243
+ }
244
+ ],
245
+ "SessionStart": [
246
+ {
247
+ "matcher": "*",
248
+ "hooks": [
249
+ {
250
+ "type": "command",
251
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/load-context.sh"
252
+ }
253
+ ]
254
+ }
255
+ ]
256
+ }
257
+ ```
258
+
259
+ This provides multi-layered protection and automation.
260
+
261
+ ## Pattern 9: Temporarily Active Hooks
262
+
263
+ Create hooks that only run when explicitly enabled via flag files:
264
+
265
+ ```bash
266
+ #!/bin/bash
267
+ # Hook only active when flag file exists
268
+ FLAG_FILE="$CLAUDE_PROJECT_DIR/.enable-security-scan"
269
+
270
+ if [ ! -f "$FLAG_FILE" ]; then
271
+ # Quick exit when disabled
272
+ exit 0
273
+ fi
274
+
275
+ # Flag present, run validation
276
+ input=$(cat)
277
+ file_path=$(echo "$input" | jq -r '.tool_input.file_path')
278
+
279
+ # Run security scan
280
+ security-scanner "$file_path"
281
+ ```
282
+
283
+ **Activation:**
284
+ ```bash
285
+ # Enable the hook
286
+ touch .enable-security-scan
287
+
288
+ # Disable the hook
289
+ rm .enable-security-scan
290
+ ```
291
+
292
+ **Use for:**
293
+ - Temporary debugging hooks
294
+ - Feature flags for development
295
+ - Project-specific validation that's opt-in
296
+ - Performance-intensive checks only when needed
297
+
298
+ **Note:** Must restart Claude Code after creating/removing flag files for hooks to recognize changes.
299
+
300
+ ## Pattern 10: Configuration-Driven Hooks
301
+
302
+ Use JSON configuration to control hook behavior:
303
+
304
+ ```bash
305
+ #!/bin/bash
306
+ CONFIG_FILE="$CLAUDE_PROJECT_DIR/.claude/my-plugin.local.json"
307
+
308
+ # Read configuration
309
+ if [ -f "$CONFIG_FILE" ]; then
310
+ strict_mode=$(jq -r '.strictMode // false' "$CONFIG_FILE")
311
+ max_file_size=$(jq -r '.maxFileSize // 1000000' "$CONFIG_FILE")
312
+ else
313
+ # Defaults
314
+ strict_mode=false
315
+ max_file_size=1000000
316
+ fi
317
+
318
+ # Skip if not in strict mode
319
+ if [ "$strict_mode" != "true" ]; then
320
+ exit 0
321
+ fi
322
+
323
+ # Apply configured limits
324
+ input=$(cat)
325
+ file_size=$(echo "$input" | jq -r '.tool_input.content | length')
326
+
327
+ if [ "$file_size" -gt "$max_file_size" ]; then
328
+ echo '{"decision": "deny", "reason": "File exceeds configured size limit"}' >&2
329
+ exit 2
330
+ fi
331
+ ```
332
+
333
+ **Configuration file (.claude/my-plugin.local.json):**
334
+ ```json
335
+ {
336
+ "strictMode": true,
337
+ "maxFileSize": 500000,
338
+ "allowedPaths": ["/tmp", "/home/user/projects"]
339
+ }
340
+ ```
341
+
342
+ **Use for:**
343
+ - User-configurable hook behavior
344
+ - Per-project settings
345
+ - Team-specific rules
346
+ - Dynamic validation criteria
347
+
348
+ ## 10. OS Notification on Idle (Prompt or Command)
349
+
350
+ A very common pattern is to notify the user when Claude is waiting for input (e.g., waiting for permission). Use the `Notification` event.
351
+
352
+ ### macOS (AppleScript)
353
+ ```json
354
+ {
355
+ "Notification": [
356
+ {
357
+ "matcher": "*",
358
+ "hooks": [
359
+ {
360
+ "type": "command",
361
+ "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"
362
+ }
363
+ ]
364
+ }
365
+ ]
366
+ }
367
+ ```
368
+
369
+ ### Linux (notify-send)
370
+ ```json
371
+ {
372
+ "Notification": [
373
+ {
374
+ "matcher": "*",
375
+ "hooks": [
376
+ {
377
+ "type": "command",
378
+ "command": "notify-send 'Claude Code' 'Claude Code needs your attention'"
379
+ }
380
+ ]
381
+ }
382
+ ]
383
+ }
384
+ ```
385
+
386
+ ## 11. Quality Gate / Linting (PostToolUse)
387
+
388
+ Run code quality checks immediately after Claude edits a file. If issues are found, the hook exits with `2` and outputs the errors to `stderr`. Claude sees these errors in the tool result and automatically attempts to fix them.
389
+
390
+ **Key Concepts for this Pattern:**
391
+ - Target only file modification tools: `"matcher": "Write|Edit|MultiEdit"`
392
+ - **Speed is critical:** Use caching (e.g., TSConfig hashing) because this hook runs on *every* edit. If it takes >1s, the agent loop feels sluggish.
393
+ - Exit code must be `2` to indicate a recoverable error to Claude.
394
+ - Output JSON on `stderr` containing the error details.
395
+
396
+ ```json
397
+ {
398
+ "PostToolUse": [
399
+ {
400
+ "matcher": "Write|Edit|MultiEdit",
401
+ "hooks": [
402
+ {
403
+ "type": "command",
404
+ "command": "node ${CLAUDE_PLUGIN_ROOT}/examples/quality-check.js"
405
+ }
406
+ ]
407
+ }
408
+ ]
409
+ }
410
+ ```
411
+
412
+ *See `examples/quality-check.js` for a real-world implementation of a fast, caching TypeScript/ESLint checker.*
@@ -0,0 +1,164 @@
1
+ # Hook Development Utility Scripts
2
+
3
+ These scripts help validate, test, and lint hook implementations before deployment.
4
+
5
+ ## validate-hook-schema.sh
6
+
7
+ Validates `hooks.json` configuration files for correct structure and common issues.
8
+
9
+ **Usage:**
10
+ ```bash
11
+ ./validate-hook-schema.sh path/to/hooks.json
12
+ ```
13
+
14
+ **Checks:**
15
+ - Valid JSON syntax
16
+ - Required fields present
17
+ - Valid hook event names
18
+ - Proper hook types (command/prompt)
19
+ - Timeout values in valid ranges
20
+ - Hardcoded path detection
21
+ - Prompt hook event compatibility
22
+
23
+ **Example:**
24
+ ```bash
25
+ cd my-plugin
26
+ ./validate-hook-schema.sh hooks/hooks.json
27
+ ```
28
+
29
+ ## test-hook.sh
30
+
31
+ Tests individual hook scripts with sample input before deploying to Claude Code.
32
+
33
+ **Usage:**
34
+ ```bash
35
+ ./test-hook.sh [options] <hook-script> <test-input.json>
36
+ ```
37
+
38
+ **Options:**
39
+ - `-v, --verbose` - Show detailed execution information
40
+ - `-t, --timeout N` - Set timeout in seconds (default: 60)
41
+ - `--create-sample <event-type>` - Generate sample test input
42
+
43
+ **Example:**
44
+ ```bash
45
+ # Create sample test input
46
+ ./test-hook.sh --create-sample PreToolUse > test-input.json
47
+
48
+ # Test a hook script
49
+ ./test-hook.sh my-hook.sh test-input.json
50
+
51
+ # Test with verbose output and custom timeout
52
+ ./test-hook.sh -v -t 30 my-hook.sh test-input.json
53
+ ```
54
+
55
+ **Features:**
56
+ - Sets up proper environment variables (CLAUDE_PROJECT_DIR, CLAUDE_PLUGIN_ROOT)
57
+ - Measures execution time
58
+ - Validates output JSON
59
+ - Shows exit codes and their meanings
60
+ - Captures environment file output
61
+
62
+ ## hook-linter.sh
63
+
64
+ Checks hook scripts for common issues and best practices violations.
65
+
66
+ **Usage:**
67
+ ```bash
68
+ ./hook-linter.sh <hook-script.sh> [hook-script2.sh ...]
69
+ ```
70
+
71
+ **Checks:**
72
+ - Shebang presence
73
+ - `set -euo pipefail` usage
74
+ - Stdin input reading
75
+ - Proper error handling
76
+ - Variable quoting (injection prevention)
77
+ - Exit code usage
78
+ - Hardcoded paths
79
+ - Long-running code detection
80
+ - Error output to stderr
81
+ - Input validation
82
+
83
+ **Example:**
84
+ ```bash
85
+ # Lint single script
86
+ ./hook-linter.sh ../examples/validate-write.sh
87
+
88
+ # Lint multiple scripts
89
+ ./hook-linter.sh ../examples/*.sh
90
+ ```
91
+
92
+ ## Typical Workflow
93
+
94
+ 1. **Write your hook script**
95
+ ```bash
96
+ vim my-plugin/scripts/my-hook.sh
97
+ ```
98
+
99
+ 2. **Lint the script**
100
+ ```bash
101
+ ./hook-linter.sh my-plugin/scripts/my-hook.sh
102
+ ```
103
+
104
+ 3. **Create test input**
105
+ ```bash
106
+ ./test-hook.sh --create-sample PreToolUse > test-input.json
107
+ # Edit test-input.json as needed
108
+ ```
109
+
110
+ 4. **Test the hook**
111
+ ```bash
112
+ ./test-hook.sh -v my-plugin/scripts/my-hook.sh test-input.json
113
+ ```
114
+
115
+ 5. **Add to hooks.json**
116
+ ```bash
117
+ # Edit my-plugin/hooks/hooks.json
118
+ ```
119
+
120
+ 6. **Validate configuration**
121
+ ```bash
122
+ ./validate-hook-schema.sh my-plugin/hooks/hooks.json
123
+ ```
124
+
125
+ 7. **Test in Claude Code**
126
+ ```bash
127
+ claude --debug
128
+ ```
129
+
130
+ ## Tips
131
+
132
+ - Always test hooks before deploying to avoid breaking user workflows
133
+ - Use verbose mode (`-v`) to debug hook behavior
134
+ - Check the linter output for security and best practice issues
135
+ - Validate hooks.json after any changes
136
+ - Create different test inputs for various scenarios (safe operations, dangerous operations, edge cases)
137
+
138
+ ## Common Issues
139
+
140
+ ### Hook doesn't execute
141
+
142
+ Check:
143
+ - Script has shebang (`#!/bin/bash`)
144
+ - Script is executable (`chmod +x`)
145
+ - Path in hooks.json is correct (use `${CLAUDE_PLUGIN_ROOT}`)
146
+
147
+ ### Hook times out
148
+
149
+ - Reduce timeout in hooks.json
150
+ - Optimize hook script performance
151
+ - Remove long-running operations
152
+
153
+ ### Hook fails silently
154
+
155
+ - Check exit codes (should be 0 or 2)
156
+ - Ensure errors go to stderr (`>&2`)
157
+ - Validate JSON output structure
158
+
159
+ ### Injection vulnerabilities
160
+
161
+ - Always quote variables: `"$variable"`
162
+ - Use `set -euo pipefail`
163
+ - Validate all input fields
164
+ - Run the linter to catch issues
@@ -0,0 +1,153 @@
1
+ #!/bin/bash
2
+ # Hook Linter
3
+ # Checks hook scripts for common issues and best practices
4
+
5
+ set -euo pipefail
6
+
7
+ # Usage
8
+ if [ $# -eq 0 ]; then
9
+ echo "Usage: $0 <hook-script.sh> [hook-script2.sh ...]"
10
+ echo ""
11
+ echo "Checks hook scripts for:"
12
+ echo " - Shebang presence"
13
+ echo " - set -euo pipefail usage"
14
+ echo " - Input reading from stdin"
15
+ echo " - Proper error handling"
16
+ echo " - Variable quoting"
17
+ echo " - Exit code usage"
18
+ echo " - Hardcoded paths"
19
+ echo " - Timeout considerations"
20
+ exit 1
21
+ fi
22
+
23
+ check_script() {
24
+ local script="$1"
25
+ local warnings=0
26
+ local errors=0
27
+
28
+ echo "🔍 Linting: $script"
29
+ echo ""
30
+
31
+ if [ ! -f "$script" ]; then
32
+ echo "❌ Error: File not found"
33
+ return 1
34
+ fi
35
+
36
+ # Check 1: Executable
37
+ if [ ! -x "$script" ]; then
38
+ echo "⚠️ Not executable (chmod +x $script)"
39
+ ((warnings++))
40
+ fi
41
+
42
+ # Check 2: Shebang
43
+ first_line=$(head -1 "$script")
44
+ if [[ ! "$first_line" =~ ^#!/ ]]; then
45
+ echo "❌ Missing shebang (#!/bin/bash)"
46
+ ((errors++))
47
+ fi
48
+
49
+ # Check 3: set -euo pipefail
50
+ if ! grep -q "set -euo pipefail" "$script"; then
51
+ echo "⚠️ Missing 'set -euo pipefail' (recommended for safety)"
52
+ ((warnings++))
53
+ fi
54
+
55
+ # Check 4: Reads from stdin
56
+ if ! grep -q "cat\|read" "$script"; then
57
+ echo "⚠️ Doesn't appear to read input from stdin"
58
+ ((warnings++))
59
+ fi
60
+
61
+ # Check 5: Uses jq for JSON parsing
62
+ if grep -q "tool_input\|tool_name" "$script" && ! grep -q "jq" "$script"; then
63
+ echo "⚠️ Parses hook input but doesn't use jq"
64
+ ((warnings++))
65
+ fi
66
+
67
+ # Check 6: Unquoted variables
68
+ if grep -E '\$[A-Za-z_][A-Za-z0-9_]*[^"]' "$script" | grep -v '#' | grep -q .; then
69
+ echo "⚠️ Potentially unquoted variables detected (injection risk)"
70
+ echo " Always use double quotes: \"\$variable\" not \$variable"
71
+ ((warnings++))
72
+ fi
73
+
74
+ # Check 7: Hardcoded paths
75
+ if grep -E '^[^#]*/home/|^[^#]*/usr/|^[^#]*/opt/' "$script" | grep -q .; then
76
+ echo "⚠️ Hardcoded absolute paths detected"
77
+ echo " Use \$CLAUDE_PROJECT_DIR or \$CLAUDE_PLUGIN_ROOT"
78
+ ((warnings++))
79
+ fi
80
+
81
+ # Check 8: Uses CLAUDE_PLUGIN_ROOT
82
+ if ! grep -q "CLAUDE_PLUGIN_ROOT\|CLAUDE_PROJECT_DIR" "$script"; then
83
+ echo "💡 Tip: Use \$CLAUDE_PLUGIN_ROOT for plugin-relative paths"
84
+ fi
85
+
86
+ # Check 9: Exit codes
87
+ if ! grep -q "exit 0\|exit 2" "$script"; then
88
+ echo "⚠️ No explicit exit codes (should exit 0 or 2)"
89
+ ((warnings++))
90
+ fi
91
+
92
+ # Check 10: JSON output for decision hooks
93
+ if grep -q "PreToolUse\|Stop" "$script"; then
94
+ if ! grep -q "permissionDecision\|decision" "$script"; then
95
+ echo "💡 Tip: PreToolUse/Stop hooks should output decision JSON"
96
+ fi
97
+ fi
98
+
99
+ # Check 11: Long-running commands
100
+ if grep -E 'sleep [0-9]{3,}|while true' "$script" | grep -v '#' | grep -q .; then
101
+ echo "⚠️ Potentially long-running code detected"
102
+ echo " Hooks should complete quickly (< 60s)"
103
+ ((warnings++))
104
+ fi
105
+
106
+ # Check 12: Error messages to stderr
107
+ if grep -q 'echo.*".*error\|Error\|denied\|Denied' "$script"; then
108
+ if ! grep -q '>&2' "$script"; then
109
+ echo "⚠️ Error messages should be written to stderr (>&2)"
110
+ ((warnings++))
111
+ fi
112
+ fi
113
+
114
+ # Check 13: Input validation
115
+ if ! grep -q "if.*empty\|if.*null\|if.*-z" "$script"; then
116
+ echo "💡 Tip: Consider validating input fields aren't empty"
117
+ fi
118
+
119
+ echo ""
120
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
121
+
122
+ if [ $errors -eq 0 ] && [ $warnings -eq 0 ]; then
123
+ echo "✅ No issues found"
124
+ return 0
125
+ elif [ $errors -eq 0 ]; then
126
+ echo "⚠️ Found $warnings warning(s)"
127
+ return 0
128
+ else
129
+ echo "❌ Found $errors error(s) and $warnings warning(s)"
130
+ return 1
131
+ fi
132
+ }
133
+
134
+ echo "🔎 Hook Script Linter"
135
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
136
+ echo ""
137
+
138
+ total_errors=0
139
+
140
+ for script in "$@"; do
141
+ if ! check_script "$script"; then
142
+ ((total_errors++))
143
+ fi
144
+ echo ""
145
+ done
146
+
147
+ if [ $total_errors -eq 0 ]; then
148
+ echo "✅ All scripts passed linting"
149
+ exit 0
150
+ else
151
+ echo "❌ $total_errors script(s) had errors"
152
+ exit 1
153
+ fi