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,74 @@
1
+ #!/usr/bin/env python3
2
+ import sys
3
+ import os
4
+
5
+ # Add script directory to path to allow importing shared modules
6
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
7
+ from agent_context import AgentContext
8
+
9
+ def get_skill_reminder(agent_type):
10
+ folder = f".{agent_type}"
11
+ return f"""
12
+ *** MANDATORY SKILL: Using Serena LSP ***
13
+ You are REQUIRED to use semantic tools for all code interactions to ensure safety and token efficiency.
14
+
15
+ RULES:
16
+ 1. READING: NEVER read full code files >300 lines.
17
+ - START with `get_symbols_overview(depth=1)` to map the file.
18
+ - READ specific parts with `find_symbol(include_body=True)`.
19
+ 2. EDITING: NEVER use the generic `Edit` or `replace` tool on code.
20
+ - USE `replace_symbol_body` for atomic updates.
21
+ - USE `insert_after_symbol` / `insert_before_symbol` for additions.
22
+ - ALWAYS run `find_referencing_symbols` before changing signatures.
23
+ 3. SEARCH: USE `search_for_pattern` instead of grep/find.
24
+
25
+ Ref: ~/{folder}/skills/using-serena-lsp/SKILL.md
26
+ """
27
+
28
+ CODE_EXTENSIONS = {'.py', '.ts', '.js', '.jsx', '.tsx', '.go', '.rs', '.java', '.cpp', '.c', '.h'}
29
+
30
+ def count_lines(filepath):
31
+ try:
32
+ with open(filepath, 'r') as f:
33
+ return sum(1 for _ in f)
34
+ except:
35
+ return 0
36
+
37
+ try:
38
+ ctx = AgentContext()
39
+ event = ctx.event
40
+
41
+ if event == 'SessionStart':
42
+ ctx.allow(additional_context=get_skill_reminder(ctx.agent_type))
43
+
44
+ elif event in ['PreToolUse', 'BeforeTool']:
45
+ tool_name = ctx.tool_name
46
+
47
+ # Rule 1: Block Reading Large Code Files
48
+ if tool_name in ['Read', 'read_file']:
49
+ file_path = ctx.get_file_path()
50
+ _, ext = os.path.splitext(file_path)
51
+ if ext in CODE_EXTENSIONS:
52
+ loc = count_lines(file_path)
53
+ if loc > 300:
54
+ ctx.block(
55
+ reason=f"VIOLATION: Reading full file of {loc} lines is forbidden. Use 'get_symbols_overview' and 'find_symbol' to save tokens.",
56
+ system_message="⚠️ Blocked inefficient file read. Use Serena semantic tools."
57
+ )
58
+
59
+ # Rule 2: Block Generic Edits on Code
60
+ if tool_name in ['Edit', 'replace']:
61
+ file_path = ctx.get_file_path()
62
+ _, ext = os.path.splitext(file_path)
63
+ if ext in CODE_EXTENSIONS:
64
+ ctx.block(
65
+ reason=f"VIOLATION: Generic '{tool_name}' is unsafe for code. Use 'replace_symbol_body' or 'insert_after_symbol' for surgical edits.",
66
+ system_message="⚠️ Blocked unsafe edit. Use Serena semantic tools."
67
+ )
68
+
69
+ ctx.fail_open()
70
+
71
+ except Exception as e:
72
+ # Fail safe: log error but allow operation
73
+ print(f"Hook Error: {e}", file=sys.stderr)
74
+ sys.exit(0)
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env python3
2
+ import json
3
+ import sys
4
+ import os
5
+ import re
6
+
7
+ # Add script directory to path to allow importing shared modules
8
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
9
+ from agent_context import AgentContext
10
+
11
+ def get_first_sentence(text):
12
+ if not text:
13
+ return ""
14
+ # Remove newlines and extra spaces
15
+ text = re.sub(r'\s+', ' ', text).strip()
16
+ # Find the first period followed by a space or end of string
17
+ match = re.search(r'^(.*?)[.!?](\s|$)', text)
18
+ if match:
19
+ return match.group(0).strip()
20
+ return text
21
+
22
+ def parse_skill_md(file_path):
23
+ try:
24
+ with open(file_path, 'r') as f:
25
+ content = f.read()
26
+
27
+ # Extract YAML frontmatter
28
+ match = re.search(r'^---\s*\n(.*?)\n---\s*\n', content, re.DOTALL)
29
+ if match:
30
+ frontmatter_raw = match.group(1)
31
+ # Basic YAML-like parsing using regex to avoid external dependency (PyYAML)
32
+ name_match = re.search(r'^name:\s*(.*)$', frontmatter_raw, re.MULTILINE)
33
+ desc_match = re.search(r'^description:\s*(?:>-\s*)?\n?\s*(.*)$', frontmatter_raw, re.MULTILINE | re.DOTALL)
34
+
35
+ name = name_match.group(1).strip() if name_match else os.path.basename(os.path.dirname(file_path))
36
+ description = ""
37
+
38
+ if desc_match:
39
+ desc_raw = desc_match.group(1).strip()
40
+ # If it was a folded scalar, it might have multiple lines
41
+ if '\n' in desc_raw:
42
+ # Capture until next YAML key or end
43
+ description = desc_raw.split('\n')[0].strip()
44
+ else:
45
+ description = desc_raw
46
+
47
+ return name, get_first_sentence(description)
48
+ except Exception as e:
49
+ print(f"Error parsing {file_path}: {e}", file=sys.stderr)
50
+ return None
51
+
52
+ def main():
53
+ try:
54
+ ctx = AgentContext()
55
+ project_dir = os.environ.get('GEMINI_PROJECT_DIR', os.getcwd())
56
+ skills_root = os.path.join(project_dir, 'skills')
57
+
58
+ if not os.path.exists(skills_root):
59
+ ctx.fail_open()
60
+
61
+ available_skills = []
62
+ for skill_dir in os.listdir(skills_root):
63
+ skill_path = os.path.join(skills_root, skill_dir)
64
+ if os.path.isdir(skill_path):
65
+ skill_md = os.path.join(skill_path, 'SKILL.md')
66
+ if os.path.exists(skill_md):
67
+ result = parse_skill_md(skill_md)
68
+ if result:
69
+ name, desc = result
70
+ available_skills.append(f"- {name}: {desc}")
71
+
72
+ if not available_skills:
73
+ ctx.fail_open()
74
+
75
+ context_msg = "## Available Local Agent Skills\n"
76
+ context_msg += "The following specialized skills are available in this repository. Use them when appropriate:\n"
77
+ context_msg += "\n".join(sorted(available_skills))
78
+ context_msg += "\n\nYou can activate a skill using `activate_skill(name='skill-name')`."
79
+
80
+ ctx.allow(
81
+ system_message="🚀 Loaded available local skills into context.",
82
+ additional_context=context_msg
83
+ )
84
+
85
+ except Exception as e:
86
+ print(f"Hook failed: {e}", file=sys.stderr)
87
+ sys.exit(0)
88
+
89
+ if __name__ == "__main__":
90
+ main()
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env python3
2
+ import sys
3
+ import os
4
+ import re
5
+
6
+ # Add script directory to path to allow importing shared modules
7
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
8
+ from agent_context import AgentContext
9
+
10
+ # Configuration
11
+ ORCHESTRATION_PATTERNS = [
12
+ r"review.*(code|security|quality)|code.*(review|audit)",
13
+ r"security.*(audit|review|scan)",
14
+ r"implement.*(feature|endpoint|api)|build.*feature",
15
+ r"(debug|investigate|root.*cause|crash|fix.*unknown)",
16
+ r"(refactor.*sprint|major.*refactor|migration|technical.*debt)",
17
+ r"validate.*(commit|staged)|pre.*commit",
18
+ ]
19
+
20
+ CCS_PATTERNS = [
21
+ r"(fix|correggi|risolvi).*typo",
22
+ r"(fix|correggi).*spelling",
23
+ r"(add|aggiungi|crea|create).*test",
24
+ r"(genera|generate).*(test|unit|case)",
25
+ r"(estrai|extract).*(function|method|funzione|metodo)",
26
+ r"rename.*variable|rinomina.*variabile",
27
+ r"(add|aggiungi).*(doc|docstring|comment)",
28
+ r"(aggiorna|update).*comment",
29
+ r"(format|formatta|lint|indenta|indent)",
30
+ r"(add|aggiungi).*(type|typing|hint)",
31
+ r"(rimuovi|remove|elimina|delete).*(import|unused)",
32
+ r"(modifica|modify|cambia|change).*(name|nome)"
33
+ ]
34
+
35
+ P_PATTERNS = [
36
+ r"analiz|analyz|esamina|studia|review|rivedi",
37
+ r"implementa|implement|create|crea",
38
+ r"spiega|explain|descri|describe",
39
+ r"^(come|how|what|cosa|perch|why)"
40
+ ]
41
+
42
+ EXCLUDE_PATTERNS = [
43
+ r"archit|design|progett",
44
+ r"(add|implement|fix|patch).*(security|auth|oauth)|security.*(vuln|fix|patch)",
45
+ r"bug|debug|investig|indaga",
46
+ r"performance|ottimizz|optim",
47
+ r"migra|breaking.*change",
48
+ r"complex|compless"
49
+ ]
50
+
51
+ CONVERSATIONAL_PATTERNS = [
52
+ r"^(ciao|hi|hello|hey|buongiorno|buonasera|salve)([!.]|$)",
53
+ r"^(good morning|good afternoon|good evening)([!.]|$)",
54
+ r"^(grazie|thanks|thank you|merci|thx)([!.]|$)",
55
+ r"^(grazie mille|thanks a lot|many thanks)([!.]|$)",
56
+ r"^(ok|okay|va bene|perfetto|perfect|fine|d'accordo|agreed?)([!.]|$)",
57
+ r"^(si|sì|yes|no|nope|yeah|yep)([!.]|$)",
58
+ r"^(arrivederci|addio|ciao|bye|goodbye|see you|ci vediamo)([!.]|$)",
59
+ r"^come stai\?$|^how are you\?$|^come va\?$",
60
+ r"^tutto bene\?$|^all good\?$|^everything ok\?$"
61
+ ]
62
+
63
+ def matches(text, patterns):
64
+ for pattern in patterns:
65
+ if re.search(pattern, text, re.IGNORECASE):
66
+ return True
67
+ return False
68
+
69
+ try:
70
+ ctx = AgentContext()
71
+ prompt = ctx.prompt
72
+
73
+ if not prompt:
74
+ ctx.fail_open()
75
+
76
+ ccs_available = not bool(os.environ.get('CLAUDECODE'))
77
+ ccs_hint = "CCS backend" if ccs_available else "Gemini or Qwen directly (CCS unavailable inside Claude Code)"
78
+
79
+ # 1. Check Exclusions
80
+ if matches(prompt, EXCLUDE_PATTERNS) or matches(prompt, CONVERSATIONAL_PATTERNS):
81
+ ctx.fail_open()
82
+
83
+ agent_name = ctx.agent_type.capitalize()
84
+
85
+ # 2. Check Explicit Delegation
86
+ if re.search(r'delegate', prompt, re.IGNORECASE):
87
+ ctx.allow(system_message=f"💡 {agent_name} Internal Reminder: User mentioned 'delegate'. Consider using the /delegating skill to offload this task.")
88
+
89
+ # 3. Check CCS Delegation (Simple Tasks)
90
+ if matches(prompt, CCS_PATTERNS):
91
+ ctx.allow(system_message=f"💡 {agent_name} Internal Reminder: This appears to be a simple, deterministic task (typo/test/format/doc). Consider using the /delegating skill ({ccs_hint}) for cost-optimized execution.")
92
+
93
+ # 4. Check Orchestration (Complex Tasks)
94
+ elif matches(prompt, ORCHESTRATION_PATTERNS) and not matches(prompt, EXCLUDE_PATTERNS):
95
+ ctx.allow(system_message=f"💡 {agent_name} Internal Reminder: This looks like a multi-agent task (review/implement/debug). Consider using the /delegating skill (Gemini+Qwen orchestration) instead of handling in main session.")
96
+
97
+ # 5. Check Prompt Improving (/p)
98
+ word_count = len(prompt.split())
99
+ is_vague = matches(prompt, P_PATTERNS)
100
+
101
+ # Heuristic for very short command-like prompts
102
+ if word_count < 6 and not is_vague:
103
+ if matches(prompt, [r"(creare|create|fare|do|aggiungere|add|modificare|modify|controllare|check|verificare|verify|testare|test)"]):
104
+ is_vague = True
105
+
106
+ if is_vague:
107
+ ctx.allow(system_message=f"💡 {agent_name} Internal Reminder: This prompt appears vague or could benefit from structure. Consider using the /prompt-improving skill to add XML structure, examples, and thinking space before proceeding.")
108
+
109
+ ctx.fail_open()
110
+
111
+ except Exception:
112
+ sys.exit(0)
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env python3
2
+ """Test AgentContext hook output formatting"""
3
+ import json
4
+ import sys
5
+ from io import StringIO
6
+
7
+ # Mock sys.stdin and sys.exit for testing
8
+ class MockExit(Exception):
9
+ pass
10
+
11
+ def test_hook_output(event_name, method_name, *args, **kwargs):
12
+ """Test a specific hook method and return its JSON output"""
13
+ import agent_context
14
+
15
+ # Prepare mock input
16
+ mock_input = {
17
+ "hook_event_name": event_name,
18
+ "tool_name": "Read",
19
+ "tool_input": {"file_path": "/test/file.txt"}
20
+ }
21
+
22
+ # Mock stdin
23
+ original_stdin = sys.stdin
24
+ original_exit = sys.exit
25
+ sys.stdin = StringIO(json.dumps(mock_input))
26
+
27
+ # Capture stdout
28
+ output_buffer = StringIO()
29
+ original_stdout = sys.stdout
30
+ sys.stdout = output_buffer
31
+
32
+ try:
33
+ ctx = agent_context.AgentContext()
34
+
35
+ # Call the method
36
+ method = getattr(ctx, method_name)
37
+ try:
38
+ method(*args, **kwargs)
39
+ except SystemExit:
40
+ pass # Expected
41
+
42
+ # Get output
43
+ output = output_buffer.getvalue().strip()
44
+ return json.loads(output) if output else {}
45
+
46
+ finally:
47
+ sys.stdin = original_stdin
48
+ sys.stdout = original_stdout
49
+ sys.exit = original_exit
50
+
51
+ def main():
52
+ print("Testing AgentContext hook output formats...\n")
53
+
54
+ # Test 1: PreToolUse allow() with systemMessage
55
+ print("Test 1: PreToolUse allow() with systemMessage")
56
+ output = test_hook_output("PreToolUse", "allow", system_message="Test message")
57
+ print(f"Output: {json.dumps(output, indent=2)}")
58
+ assert "systemMessage" in output, "Should have systemMessage"
59
+ assert output["hookSpecificOutput"]["hookEventName"] == "PreToolUse"
60
+ assert output["hookSpecificOutput"]["permissionDecision"] == "allow"
61
+ assert "decision" not in output, "Should NOT have top-level 'decision'"
62
+ print("✓ PASS\n")
63
+
64
+ # Test 2: PreToolUse allow() with additionalContext
65
+ print("Test 2: PreToolUse allow() with additionalContext")
66
+ output = test_hook_output("PreToolUse", "allow", additional_context="Extra context")
67
+ print(f"Output: {json.dumps(output, indent=2)}")
68
+ assert output["hookSpecificOutput"]["permissionDecision"] == "allow"
69
+ assert output["hookSpecificOutput"]["additionalContext"] == "Extra context"
70
+ print("✓ PASS\n")
71
+
72
+ # Test 3: UserPromptSubmit allow() with systemMessage (no permissionDecision)
73
+ print("Test 3: UserPromptSubmit allow() with systemMessage")
74
+ output = test_hook_output("UserPromptSubmit", "allow", system_message="Reminder")
75
+ print(f"Output: {json.dumps(output, indent=2)}")
76
+ assert "systemMessage" in output
77
+ assert "permissionDecision" not in output.get("hookSpecificOutput", {}), \
78
+ "UserPromptSubmit should NOT have permissionDecision"
79
+ print("✓ PASS\n")
80
+
81
+ # Test 4: UserPromptSubmit allow() with additionalContext
82
+ print("Test 4: UserPromptSubmit allow() with additionalContext")
83
+ output = test_hook_output("UserPromptSubmit", "allow", additional_context="Context")
84
+ print(f"Output: {json.dumps(output, indent=2)}")
85
+ assert output["hookSpecificOutput"]["additionalContext"] == "Context"
86
+ assert "permissionDecision" not in output["hookSpecificOutput"]
87
+ print("✓ PASS\n")
88
+
89
+ # Test 5: PreToolUse block()
90
+ print("Test 5: PreToolUse block()")
91
+ output = test_hook_output("PreToolUse", "block", "Dangerous operation")
92
+ print(f"Output: {json.dumps(output, indent=2)}")
93
+ assert output["hookSpecificOutput"]["permissionDecision"] == "deny"
94
+ assert output["hookSpecificOutput"]["permissionDecisionReason"] == "Dangerous operation"
95
+ assert "decision" not in output, "Should NOT have top-level 'decision'"
96
+ print("✓ PASS\n")
97
+
98
+ # Test 6: UserPromptSubmit block() (should use continue: false)
99
+ print("Test 6: UserPromptSubmit block()")
100
+ output = test_hook_output("UserPromptSubmit", "block", "Blocked")
101
+ print(f"Output: {json.dumps(output, indent=2)}")
102
+ assert output.get("continue") == False, "Should have continue: false"
103
+ assert output.get("stopReason") == "Blocked"
104
+ assert "permissionDecision" not in output.get("hookSpecificOutput", {})
105
+ print("✓ PASS\n")
106
+
107
+ print("=" * 50)
108
+ print("All tests passed! ✓")
109
+ print("=" * 50)
110
+
111
+ if __name__ == "__main__":
112
+ main()
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env python3
2
+ import sys
3
+ import os
4
+ import subprocess
5
+
6
+ # Add script directory to path to allow importing shared modules
7
+ sys.path.append(os.path.dirname(os.path.abspath(__file__)))
8
+ from agent_context import AgentContext
9
+
10
+ # Configuration
11
+ STRICT_DIRS = ["mcp_server"]
12
+ WARN_DIRS = ["scripts"]
13
+ PROJECT_ROOT = os.environ.get('GEMINI_PROJECT_DIR', os.environ.get('CLAUDE_PROJECT_DIR', os.getcwd()))
14
+ VENV_PATH = os.path.join(PROJECT_ROOT, ".venv")
15
+
16
+ # Colors
17
+ RED = '\033[0;31m'
18
+ YELLOW = '\033[1;33m'
19
+ GREEN = '\033[0;32m'
20
+ CYAN = '\033[0;36m'
21
+ NC = '\033[0m'
22
+
23
+ def is_strict_path(file_path):
24
+ rel_path = os.path.relpath(file_path, PROJECT_ROOT)
25
+ for d in STRICT_DIRS:
26
+ if rel_path.startswith(d):
27
+ return True
28
+ return False
29
+
30
+ def run_mypy(target, is_strict):
31
+ if not os.path.exists(os.path.join(VENV_PATH, "bin", "activate")):
32
+ print(f"{YELLOW}⚠️ Venv not found at {VENV_PATH}, skipping check{NC}")
33
+ return True
34
+
35
+ cmd = f"source {VENV_PATH}/bin/activate && python -m mypy {target} --explicit-package-bases"
36
+
37
+ try:
38
+ result = subprocess.run(cmd, shell=True, executable="/bin/bash", capture_output=True, text=True)
39
+
40
+ if result.returncode != 0:
41
+ if is_strict:
42
+ print(f"{RED}❌ MYPY FAILED (STRICT MODE){NC}", file=sys.stderr)
43
+ print(result.stdout, file=sys.stderr)
44
+ print(f"\n{RED}🚫 COMMIT BLOCKED: Fix type errors in {target}{NC}", file=sys.stderr)
45
+ print(f"{CYAN}💡 Run: source .venv/bin/activate && python -m mypy {target}{NC}", file=sys.stderr)
46
+ return False
47
+ else:
48
+ print(f"{YELLOW}⚠️ MYPY WARNING (LENIENT MODE){NC}", file=sys.stderr)
49
+ print("\n".join(result.stdout.splitlines()[:20]), file=sys.stderr)
50
+ print(f"\n{YELLOW}⚡ Type errors exist in {target} (commit allowed){NC}", file=sys.stderr)
51
+ return True
52
+ else:
53
+ print(f"{GREEN}✅ MYPY PASSED: {target}{NC}", file=sys.stderr)
54
+ return True
55
+
56
+ except Exception as e:
57
+ print(f"Error running mypy: {e}", file=sys.stderr)
58
+ return True # Fail open
59
+
60
+ try:
61
+ ctx = AgentContext()
62
+
63
+ # 1. Check Git Commits (Shell tools)
64
+ if ctx.is_shell_tool():
65
+ command = ctx.get_command()
66
+ if 'git commit' in command:
67
+ print(f"{CYAN}🔍 TYPE SAFETY CHECK: Validating staged Python files...{NC}", file=sys.stderr)
68
+
69
+ # Get staged files
70
+ try:
71
+ staged = subprocess.check_output(
72
+ "git diff --cached --name-only --diff-filter=ACM | grep '\.py$'",
73
+ shell=True, cwd=PROJECT_ROOT
74
+ ).decode().strip().splitlines()
75
+ except subprocess.CalledProcessError:
76
+ staged = []
77
+
78
+ if not staged:
79
+ print(f"{GREEN}✅ No Python files staged{NC}", file=sys.stderr)
80
+ ctx.allow()
81
+
82
+ failed = False
83
+
84
+ # Check individual files
85
+ for f in staged:
86
+ full_path = os.path.join(PROJECT_ROOT, f)
87
+ if is_strict_path(full_path):
88
+ if not run_mypy(full_path, True):
89
+ failed = True
90
+
91
+ # If failed, block the tool
92
+ if failed:
93
+ ctx.block(reason="Type safety violations in strict directory.")
94
+
95
+ ctx.allow()
96
+
97
+ # 2. Check Edits (Write/Edit tools)
98
+ elif ctx.is_write_tool() or ctx.is_edit_tool():
99
+ file_path = ctx.get_file_path()
100
+ if file_path.endswith('.py') and is_strict_path(file_path):
101
+ ctx.allow(system_message=f"""{YELLOW}⚠️ EDITING STRICT TYPE-SAFE FILE{NC}
102
+ This file is in a STRICT zone ({', '.join(STRICT_DIRS)}).
103
+ Any type errors will BLOCK commits.
104
+ """)
105
+
106
+ except Exception:
107
+ sys.exit(0)
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "xtrm-tools",
3
+ "version": "2.0.0",
4
+ "description": "Claude Code tools installer (skills, hooks, MCP servers)",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "xtrm": "./cli/dist/index.cjs"
9
+ },
10
+ "files": [
11
+ "README.md",
12
+ "CHANGELOG.md",
13
+ "cli/dist",
14
+ "cli/package.json",
15
+ "config",
16
+ "hooks",
17
+ "skills",
18
+ "project-skills"
19
+ ],
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/Jaggerxtrm/xtrm-tools.git"
26
+ },
27
+ "homepage": "https://github.com/Jaggerxtrm/xtrm-tools#readme",
28
+ "bugs": {
29
+ "url": "https://github.com/Jaggerxtrm/xtrm-tools/issues"
30
+ },
31
+ "scripts": {
32
+ "build": "npm run build --prefix cli",
33
+ "start": "node cli/dist/index.cjs",
34
+ "lint": "echo 'No linting configured'",
35
+ "test": "echo 'No tests configured'"
36
+ },
37
+ "engines": {
38
+ "node": ">=18.0.0"
39
+ },
40
+ "dependencies": {
41
+ "comment-json": "^4.2.3",
42
+ "conf": "^12.0.0",
43
+ "dotenv": "^17.3.1",
44
+ "fs-extra": "^11.2.0",
45
+ "kleur": "^4.1.5",
46
+ "prompts": "^2.4.2"
47
+ }
48
+ }