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.
- package/CHANGELOG.md +496 -0
- package/README.md +762 -0
- package/cli/dist/index.cjs +55245 -0
- package/cli/dist/index.cjs.map +1 -0
- package/cli/dist/index.d.cts +2 -0
- package/cli/package.json +43 -0
- package/config/.env.example +40 -0
- package/config/hooks.json +36 -0
- package/config/mcp_servers.json +46 -0
- package/config/mcp_servers_optional.json +53 -0
- package/config/settings.json +70 -0
- package/hooks/README.md +156 -0
- package/hooks/__pycache__/agent_context.cpython-314.pyc +0 -0
- package/hooks/agent_context.py +105 -0
- package/hooks/gitnexus/gitnexus-hook.cjs +133 -0
- package/hooks/serena-workflow-reminder.py +74 -0
- package/hooks/skill-discovery.py +90 -0
- package/hooks/skill-suggestion.py +112 -0
- package/hooks/test_agent_context.py +112 -0
- package/hooks/type-safety-enforcement.py +107 -0
- package/package.json +48 -0
- package/project-skills/main-guard/.claude/hooks/main-guard.cjs +188 -0
- package/project-skills/main-guard/.claude/settings.json +16 -0
- package/project-skills/main-guard/.claude/skills/using-main-guard/SKILL.md +135 -0
- package/project-skills/main-guard/README.md +163 -0
- package/project-skills/py-quality-gate/.claude/hooks/quality-check.py +311 -0
- package/project-skills/py-quality-gate/.claude/settings.json +16 -0
- package/project-skills/py-quality-gate/.claude/skills/using-py-quality-gate/SKILL.md +112 -0
- package/project-skills/py-quality-gate/README.md +147 -0
- package/project-skills/service-skills-set/.claude/git-hooks/__pycache__/doc_reminder.cpython-314.pyc +0 -0
- package/project-skills/service-skills-set/.claude/git-hooks/__pycache__/skill_staleness.cpython-314.pyc +0 -0
- package/project-skills/service-skills-set/.claude/git-hooks/doc_reminder.py +67 -0
- package/project-skills/service-skills-set/.claude/git-hooks/skill_staleness.py +194 -0
- package/project-skills/service-skills-set/.claude/service-registry.json +4 -0
- package/project-skills/service-skills-set/.claude/settings.json +37 -0
- package/project-skills/service-skills-set/.claude/skills/creating-service-skills/SKILL.md +433 -0
- package/project-skills/service-skills-set/.claude/skills/creating-service-skills/references/script_quality_standards.md +412 -0
- package/project-skills/service-skills-set/.claude/skills/creating-service-skills/references/service_skill_system_guide.md +264 -0
- package/project-skills/service-skills-set/.claude/skills/creating-service-skills/scripts/bootstrap.py +308 -0
- package/project-skills/service-skills-set/.claude/skills/creating-service-skills/scripts/deep_dive.py +304 -0
- package/project-skills/service-skills-set/.claude/skills/creating-service-skills/scripts/scaffolder.py +482 -0
- package/project-skills/service-skills-set/.claude/skills/scoping-service-skills/SKILL.md +231 -0
- package/project-skills/service-skills-set/.claude/skills/scoping-service-skills/scripts/scope.py +74 -0
- package/project-skills/service-skills-set/.claude/skills/updating-service-skills/SKILL.md +136 -0
- package/project-skills/service-skills-set/.claude/skills/updating-service-skills/scripts/__pycache__/drift_detector.cpython-314.pyc +0 -0
- package/project-skills/service-skills-set/.claude/skills/updating-service-skills/scripts/drift_detector.py +222 -0
- package/project-skills/service-skills-set/.claude/skills/using-service-skills/SKILL.md +108 -0
- package/project-skills/service-skills-set/.claude/skills/using-service-skills/scripts/__pycache__/cataloger.cpython-314.pyc +0 -0
- package/project-skills/service-skills-set/.claude/skills/using-service-skills/scripts/__pycache__/skill_activator.cpython-314.pyc +0 -0
- package/project-skills/service-skills-set/.claude/skills/using-service-skills/scripts/cataloger.py +74 -0
- package/project-skills/service-skills-set/.claude/skills/using-service-skills/scripts/skill_activator.py +152 -0
- package/project-skills/service-skills-set/README.md +93 -0
- package/project-skills/service-skills-set/__pycache__/install-service-skills.cpython-314.pyc +0 -0
- package/project-skills/service-skills-set/install-service-skills.py +163 -0
- package/project-skills/service-skills-set/service-skills-readme.md +236 -0
- package/project-skills/tdd-guard/.claude/settings.json +38 -0
- package/project-skills/tdd-guard/.claude/skills/using-tdd-guard/SKILL.md +74 -0
- package/project-skills/tdd-guard/CLAUDE.md +98 -0
- package/project-skills/tdd-guard/CONTRIBUTING.md +38 -0
- package/project-skills/tdd-guard/DEVELOPMENT.md +127 -0
- package/project-skills/tdd-guard/LICENSE +21 -0
- package/project-skills/tdd-guard/README.md +396 -0
- package/project-skills/tdd-guard/docs/adr/001-claude-session-subdirectory.md +52 -0
- package/project-skills/tdd-guard/docs/adr/002-secure-claude-binary-path.md +56 -0
- package/project-skills/tdd-guard/docs/adr/003-remove-configurable-data-directory.md +56 -0
- package/project-skills/tdd-guard/docs/adr/004-monorepo-architecture.md +64 -0
- package/project-skills/tdd-guard/docs/adr/005-claude-project-dir-support.md +55 -0
- package/project-skills/tdd-guard/docs/adr/006-phpunit-separate-repository.md +93 -0
- package/project-skills/tdd-guard/docs/adr/007-golangci-lint-path-support.md +83 -0
- package/project-skills/tdd-guard/docs/adr/008-storybook-reporter-design.md +182 -0
- package/project-skills/tdd-guard/docs/assets/tdd-guard-demo-screenshot.gif +0 -0
- package/project-skills/tdd-guard/docs/config-migration.md +143 -0
- package/project-skills/tdd-guard/docs/configuration.md +137 -0
- package/project-skills/tdd-guard/docs/custom-instructions.md +43 -0
- package/project-skills/tdd-guard/docs/enforcement.md +46 -0
- package/project-skills/tdd-guard/docs/ignore-patterns.md +81 -0
- package/project-skills/tdd-guard/docs/linting.md +109 -0
- package/project-skills/tdd-guard/docs/quick-commands.md +52 -0
- package/project-skills/tdd-guard/docs/session-management.md +75 -0
- package/project-skills/tdd-guard/docs/storybook-vitest-addon.md +120 -0
- package/project-skills/tdd-guard/docs/validation-model.md +63 -0
- package/project-skills/tdd-guard/eslint.config.mjs +140 -0
- package/project-skills/tdd-guard/package-lock.json +16937 -0
- package/project-skills/tdd-guard/package.json +102 -0
- package/project-skills/tdd-guard/reporters/go/README.md +67 -0
- package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main.go +127 -0
- package/project-skills/tdd-guard/reporters/go/cmd/tdd-guard-go/main_test.go +280 -0
- package/project-skills/tdd-guard/reporters/go/go.mod +3 -0
- package/project-skills/tdd-guard/reporters/go/go.sum +0 -0
- package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter.go +126 -0
- package/project-skills/tdd-guard/reporters/go/internal/formatter/formatter_test.go +264 -0
- package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader.go +26 -0
- package/project-skills/tdd-guard/reporters/go/internal/io/tee_reader_test.go +37 -0
- package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader.go +94 -0
- package/project-skills/tdd-guard/reporters/go/internal/parser/mixed_reader_test.go +198 -0
- package/project-skills/tdd-guard/reporters/go/internal/parser/parser.go +245 -0
- package/project-skills/tdd-guard/reporters/go/internal/parser/parser_test.go +547 -0
- package/project-skills/tdd-guard/reporters/go/internal/storage/storage.go +35 -0
- package/project-skills/tdd-guard/reporters/go/internal/storage/storage_test.go +113 -0
- package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer.go +103 -0
- package/project-skills/tdd-guard/reporters/go/internal/transformer/transformer_test.go +303 -0
- package/project-skills/tdd-guard/reporters/jest/README.md +102 -0
- package/project-skills/tdd-guard/reporters/jest/package.json +38 -0
- package/project-skills/tdd-guard/reporters/phpunit/.php-cs-fixer.php +28 -0
- package/project-skills/tdd-guard/reporters/phpunit/README.md +97 -0
- package/project-skills/tdd-guard/reporters/phpunit/SYNC_README.md +29 -0
- package/project-skills/tdd-guard/reporters/phpunit/composer.json +55 -0
- package/project-skills/tdd-guard/reporters/phpunit/phpunit.xml.dist +19 -0
- package/project-skills/tdd-guard/reporters/phpunit/psalm.xml +44 -0
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/ErroredTestSubscriber.php +28 -0
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/FailedTestSubscriber.php +28 -0
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/IncompleteTestSubscriber.php +28 -0
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/PassedTestSubscriber.php +27 -0
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/SkippedTestSubscriber.php +28 -0
- package/project-skills/tdd-guard/reporters/phpunit/src/Event/TestRunnerFinishedSubscriber.php +24 -0
- package/project-skills/tdd-guard/reporters/phpunit/src/PathValidator.php +88 -0
- package/project-skills/tdd-guard/reporters/phpunit/src/Storage.php +26 -0
- package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardExtension.php +33 -0
- package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardListener.php +158 -0
- package/project-skills/tdd-guard/reporters/phpunit/src/TddGuardSubscriber.php +35 -0
- package/project-skills/tdd-guard/reporters/phpunit/src/TestResultCollector.php +105 -0
- package/project-skills/tdd-guard/reporters/phpunit/tests/PathValidatorTest.php +74 -0
- package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionFailedTest.php +241 -0
- package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardExtensionTest.php +84 -0
- package/project-skills/tdd-guard/reporters/phpunit/tests/TddGuardStorageLocationTest.php +71 -0
- package/project-skills/tdd-guard/reporters/pytest/README.md +77 -0
- package/project-skills/tdd-guard/reporters/pytest/pyproject.toml +43 -0
- package/project-skills/tdd-guard/reporters/pytest/pytest.ini.example +7 -0
- package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/__init__.py +1 -0
- package/project-skills/tdd-guard/reporters/pytest/tdd_guard_pytest/pytest_reporter.py +134 -0
- package/project-skills/tdd-guard/reporters/pytest/tests/__init__.py +1 -0
- package/project-skills/tdd-guard/reporters/pytest/tests/conftest.py +3 -0
- package/project-skills/tdd-guard/reporters/pytest/tests/helpers.py +293 -0
- package/project-skills/tdd-guard/reporters/pytest/tests/test_config_option.py +38 -0
- package/project-skills/tdd-guard/reporters/pytest/tests/test_path_validation.py +59 -0
- package/project-skills/tdd-guard/reporters/pytest/tests/test_plugin_config.py +32 -0
- package/project-skills/tdd-guard/reporters/pytest/tests/test_project_root.py +296 -0
- package/project-skills/tdd-guard/reporters/pytest/tests/test_pytest_reporter.py +137 -0
- package/project-skills/tdd-guard/reporters/rspec/Gemfile +3 -0
- package/project-skills/tdd-guard/reporters/rust/Cargo.lock +458 -0
- package/project-skills/tdd-guard/reporters/rust/Cargo.toml +33 -0
- package/project-skills/tdd-guard/reporters/rust/Makefile.example +95 -0
- package/project-skills/tdd-guard/reporters/rust/README.md +88 -0
- package/project-skills/tdd-guard/reporters/rust/src/error_parser.rs +309 -0
- package/project-skills/tdd-guard/reporters/rust/src/main.rs +464 -0
- package/project-skills/tdd-guard/reporters/rust/src/parser.rs +225 -0
- package/project-skills/tdd-guard/reporters/rust/src/transformer.rs +409 -0
- package/project-skills/tdd-guard/reporters/storybook/README.md +108 -0
- package/project-skills/tdd-guard/reporters/storybook/package-lock.json +9482 -0
- package/project-skills/tdd-guard/reporters/storybook/package.json +43 -0
- package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test-data.ts +22 -0
- package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.test.ts +190 -0
- package/project-skills/tdd-guard/reporters/storybook/src/StorybookReporter.ts +88 -0
- package/project-skills/tdd-guard/reporters/storybook/src/index.ts +12 -0
- package/project-skills/tdd-guard/reporters/storybook/src/types.ts +37 -0
- package/project-skills/tdd-guard/reporters/storybook/tsconfig.json +11 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/go.mod +3 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/go/failing/single_failing_test.go +13 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/go/import/go.mod +3 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/go/import/single_import_error_test.go +17 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/go.mod +3 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/go/passing/single_passing_test.go +13 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-failing.test.js +5 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-import-error.test.js +8 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/jest/single-passing.test.js +5 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleFailingTest.php +11 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SingleImportErrorTest.php +14 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/phpunit/SinglePassingTest.php +11 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_failing.py +3 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_import_error.py +6 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/pytest/test_single_passing.py +3 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.lock +7 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/Cargo.toml +4 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/failing/src/lib.rs +14 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.lock +7 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/Cargo.toml +4 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/import/src/lib.rs +13 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.lock +7 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/Cargo.toml +4 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/rust/passing/src/lib.rs +14 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/storybook/Calculator.js +4 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-failing.stories.js +15 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-import-error.stories.js +14 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/storybook/single-passing.stories.js +15 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-failing.test.js +7 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-import-error.test.js +9 -0
- package/project-skills/tdd-guard/reporters/test/artifacts/vitest/single-passing.test.js +7 -0
- package/project-skills/tdd-guard/reporters/test/factories/go.ts +59 -0
- package/project-skills/tdd-guard/reporters/test/factories/helpers.ts +48 -0
- package/project-skills/tdd-guard/reporters/test/factories/index.ts +7 -0
- package/project-skills/tdd-guard/reporters/test/factories/jest.ts +51 -0
- package/project-skills/tdd-guard/reporters/test/factories/phpunit.ts +63 -0
- package/project-skills/tdd-guard/reporters/test/factories/pytest.ts +41 -0
- package/project-skills/tdd-guard/reporters/test/factories/rust.ts +158 -0
- package/project-skills/tdd-guard/reporters/test/factories/storybook.ts +198 -0
- package/project-skills/tdd-guard/reporters/test/factories/vitest.ts +51 -0
- package/project-skills/tdd-guard/reporters/test/reporters.integration.test.ts +735 -0
- package/project-skills/tdd-guard/reporters/test/types.ts +28 -0
- package/project-skills/tdd-guard/reporters/vitest/README.md +64 -0
- package/project-skills/tdd-guard/reporters/vitest/package.json +35 -0
- package/project-skills/tdd-guard/src/cli/buildContext.test.ts +200 -0
- package/project-skills/tdd-guard/src/cli/buildContext.ts +48 -0
- package/project-skills/tdd-guard/src/cli/tdd-guard.test.ts +159 -0
- package/project-skills/tdd-guard/src/cli/tdd-guard.ts +48 -0
- package/project-skills/tdd-guard/src/config/Config.test.ts +538 -0
- package/project-skills/tdd-guard/src/config/Config.ts +172 -0
- package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.test.ts +58 -0
- package/project-skills/tdd-guard/src/contracts/schemas/guardSchemas.ts +8 -0
- package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.test.ts +347 -0
- package/project-skills/tdd-guard/src/contracts/schemas/lintSchemas.ts +61 -0
- package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.test.ts +24 -0
- package/project-skills/tdd-guard/src/contracts/schemas/pytestSchemas.ts +7 -0
- package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.test.ts +377 -0
- package/project-skills/tdd-guard/src/contracts/schemas/reporterSchemas.ts +75 -0
- package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.test.ts +563 -0
- package/project-skills/tdd-guard/src/contracts/schemas/toolSchemas.ts +140 -0
- package/project-skills/tdd-guard/src/contracts/types/ClientType.ts +1 -0
- package/project-skills/tdd-guard/src/contracts/types/ConfigOptions.ts +12 -0
- package/project-skills/tdd-guard/src/contracts/types/Context.ts +16 -0
- package/project-skills/tdd-guard/src/contracts/types/ModelClient.ts +3 -0
- package/project-skills/tdd-guard/src/contracts/types/ValidationResult.ts +6 -0
- package/project-skills/tdd-guard/src/guard/GuardManager.test.ts +336 -0
- package/project-skills/tdd-guard/src/guard/GuardManager.ts +83 -0
- package/project-skills/tdd-guard/src/hooks/HookEvents.test.ts +107 -0
- package/project-skills/tdd-guard/src/hooks/HookEvents.ts +39 -0
- package/project-skills/tdd-guard/src/hooks/fileTypeDetection.ts +16 -0
- package/project-skills/tdd-guard/src/hooks/postToolLint.test.ts +327 -0
- package/project-skills/tdd-guard/src/hooks/postToolLint.ts +165 -0
- package/project-skills/tdd-guard/src/hooks/processHookData.test.ts +465 -0
- package/project-skills/tdd-guard/src/hooks/processHookData.ts +203 -0
- package/project-skills/tdd-guard/src/hooks/sessionHandler.test.ts +136 -0
- package/project-skills/tdd-guard/src/hooks/sessionHandler.ts +31 -0
- package/project-skills/tdd-guard/src/hooks/userPromptHandler.test.ts +131 -0
- package/project-skills/tdd-guard/src/hooks/userPromptHandler.ts +55 -0
- package/project-skills/tdd-guard/src/index.ts +19 -0
- package/project-skills/tdd-guard/src/linters/Linter.ts +5 -0
- package/project-skills/tdd-guard/src/linters/eslint/ESLint.test.ts +183 -0
- package/project-skills/tdd-guard/src/linters/eslint/ESLint.ts +82 -0
- package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.test.ts +170 -0
- package/project-skills/tdd-guard/src/linters/golangci/GolangciLint.ts +148 -0
- package/project-skills/tdd-guard/src/processors/index.ts +1 -0
- package/project-skills/tdd-guard/src/processors/lintProcessor.ts +77 -0
- package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.test.ts +303 -0
- package/project-skills/tdd-guard/src/processors/testResults/TestResultsProcessor.ts +255 -0
- package/project-skills/tdd-guard/src/providers/LinterProvider.test.ts +43 -0
- package/project-skills/tdd-guard/src/providers/LinterProvider.ts +20 -0
- package/project-skills/tdd-guard/src/providers/ModelClientProvider.test.ts +68 -0
- package/project-skills/tdd-guard/src/providers/ModelClientProvider.ts +22 -0
- package/project-skills/tdd-guard/src/storage/FileStorage.test.ts +76 -0
- package/project-skills/tdd-guard/src/storage/FileStorage.ts +108 -0
- package/project-skills/tdd-guard/src/storage/MemoryStorage.ts +57 -0
- package/project-skills/tdd-guard/src/storage/Storage.test.ts +227 -0
- package/project-skills/tdd-guard/src/storage/Storage.ts +17 -0
- package/project-skills/tdd-guard/src/validation/context/context.test.ts +364 -0
- package/project-skills/tdd-guard/src/validation/context/context.ts +155 -0
- package/project-skills/tdd-guard/src/validation/models/AnthropicApi.test.ts +171 -0
- package/project-skills/tdd-guard/src/validation/models/AnthropicApi.ts +49 -0
- package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.test.ts +167 -0
- package/project-skills/tdd-guard/src/validation/models/ClaudeAgentSdk.ts +54 -0
- package/project-skills/tdd-guard/src/validation/models/ClaudeCli.test.ts +239 -0
- package/project-skills/tdd-guard/src/validation/models/ClaudeCli.ts +57 -0
- package/project-skills/tdd-guard/src/validation/prompts/file-types.ts +52 -0
- package/project-skills/tdd-guard/src/validation/prompts/operations/edit.ts +58 -0
- package/project-skills/tdd-guard/src/validation/prompts/operations/multi-edit.ts +54 -0
- package/project-skills/tdd-guard/src/validation/prompts/operations/write.ts +54 -0
- package/project-skills/tdd-guard/src/validation/prompts/response.ts +40 -0
- package/project-skills/tdd-guard/src/validation/prompts/rules.ts +51 -0
- package/project-skills/tdd-guard/src/validation/prompts/system-prompt.ts +10 -0
- package/project-skills/tdd-guard/src/validation/prompts/tools/lint-results.ts +15 -0
- package/project-skills/tdd-guard/src/validation/prompts/tools/test-output.ts +14 -0
- package/project-skills/tdd-guard/src/validation/prompts/tools/todos.ts +9 -0
- package/project-skills/tdd-guard/src/validation/validator.test.ts +268 -0
- package/project-skills/tdd-guard/src/validation/validator.ts +159 -0
- package/project-skills/tdd-guard/test/artifacts/go/.golangci.yml +6 -0
- package/project-skills/tdd-guard/test/artifacts/go/with-issues/file-with-issues.go +12 -0
- package/project-skills/tdd-guard/test/artifacts/go/with-issues/go.mod +3 -0
- package/project-skills/tdd-guard/test/artifacts/go/without-issues/file-without-issues.go +7 -0
- package/project-skills/tdd-guard/test/artifacts/go/without-issues/go.mod +3 -0
- package/project-skills/tdd-guard/test/artifacts/javascript/eslint.config.js +20 -0
- package/project-skills/tdd-guard/test/artifacts/javascript/file-with-issues.js +12 -0
- package/project-skills/tdd-guard/test/artifacts/javascript/file-without-issues.js +10 -0
- package/project-skills/tdd-guard/test/hooks/fileTypeDetection.test.ts +26 -0
- package/project-skills/tdd-guard/test/hooks/processHookData.fileType.test.ts +46 -0
- package/project-skills/tdd-guard/test/hooks/processHookData.python.test.ts +68 -0
- package/project-skills/tdd-guard/test/integration/test-context.test.ts +66 -0
- package/project-skills/tdd-guard/test/integration/validator.core.test.ts +96 -0
- package/project-skills/tdd-guard/test/integration/validator.scenarios.test.ts +497 -0
- package/project-skills/tdd-guard/test/utils/assertions.ts +29 -0
- package/project-skills/tdd-guard/test/utils/factories/contextFactory.ts +30 -0
- package/project-skills/tdd-guard/test/utils/factories/editFactory.ts +82 -0
- package/project-skills/tdd-guard/test/utils/factories/helpers.test.ts +46 -0
- package/project-skills/tdd-guard/test/utils/factories/helpers.ts +46 -0
- package/project-skills/tdd-guard/test/utils/factories/lintFactory.ts +352 -0
- package/project-skills/tdd-guard/test/utils/factories/modelClientProviderFactory.ts +21 -0
- package/project-skills/tdd-guard/test/utils/factories/multiEditFactory.ts +79 -0
- package/project-skills/tdd-guard/test/utils/factories/operations.ts +57 -0
- package/project-skills/tdd-guard/test/utils/factories/reporterFactory.ts +55 -0
- package/project-skills/tdd-guard/test/utils/factories/scenarios/index.ts +22 -0
- package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/python.ts +745 -0
- package/project-skills/tdd-guard/test/utils/factories/scenarios/languages/typescript.ts +767 -0
- package/project-skills/tdd-guard/test/utils/factories/scenarios/types.ts +77 -0
- package/project-skills/tdd-guard/test/utils/factories/scenarios/utils.ts +15 -0
- package/project-skills/tdd-guard/test/utils/factories/sessionStartFactory.ts +36 -0
- package/project-skills/tdd-guard/test/utils/factories/testDefaults.ts +90 -0
- package/project-skills/tdd-guard/test/utils/factories/testResultsFactory.ts +234 -0
- package/project-skills/tdd-guard/test/utils/factories/todoFactory.ts +99 -0
- package/project-skills/tdd-guard/test/utils/factories/userPromptSubmitFactory.ts +39 -0
- package/project-skills/tdd-guard/test/utils/factories/writeFactory.ts +70 -0
- package/project-skills/tdd-guard/test/utils/index.ts +131 -0
- package/project-skills/tdd-guard/tsconfig.build.json +16 -0
- package/project-skills/tdd-guard/tsconfig.eslint.json +17 -0
- package/project-skills/tdd-guard/tsconfig.json +32 -0
- package/project-skills/tdd-guard/tsconfig.node.json +10 -0
- package/project-skills/tdd-guard/vitest.config.ts +85 -0
- package/project-skills/ts-quality-gate/.claude/hooks/hook-config.json +66 -0
- package/project-skills/ts-quality-gate/.claude/hooks/quality-check.cjs +1251 -0
- package/project-skills/ts-quality-gate/.claude/settings.json +16 -0
- package/project-skills/ts-quality-gate/.claude/skills/using-ts-quality-gate/SKILL.md +81 -0
- package/project-skills/ts-quality-gate/README.md +115 -0
- package/skills/README.txt +31 -0
- package/skills/clean-code/SKILL.md +201 -0
- package/skills/delegating/SKILL.md +196 -0
- package/skills/delegating/config.yaml +210 -0
- package/skills/delegating/references/orchestration-protocols.md +41 -0
- package/skills/docker-expert/SKILL.md +409 -0
- package/skills/documenting/CHANGELOG.md +23 -0
- package/skills/documenting/README.md +148 -0
- package/skills/documenting/SKILL.md +113 -0
- package/skills/documenting/examples/example_pattern.md +70 -0
- package/skills/documenting/examples/example_reference.md +70 -0
- package/skills/documenting/examples/example_ssot_analytics.md +64 -0
- package/skills/documenting/examples/example_workflow.md +141 -0
- package/skills/documenting/references/changelog-format.md +97 -0
- package/skills/documenting/references/metadata-schema.md +136 -0
- package/skills/documenting/references/taxonomy.md +81 -0
- package/skills/documenting/references/versioning-rules.md +78 -0
- package/skills/documenting/scripts/__pycache__/drift_detector.cpython-314.pyc +0 -0
- package/skills/documenting/scripts/__pycache__/orchestrator.cpython-314.pyc +0 -0
- package/skills/documenting/scripts/__pycache__/validate_metadata.cpython-314.pyc +0 -0
- package/skills/documenting/scripts/bump_version.sh +60 -0
- package/skills/documenting/scripts/changelog/__init__.py +0 -0
- package/skills/documenting/scripts/changelog/__pycache__/__init__.cpython-314.pyc +0 -0
- package/skills/documenting/scripts/changelog/__pycache__/add_entry.cpython-314.pyc +0 -0
- package/skills/documenting/scripts/changelog/__pycache__/bump_release.cpython-314.pyc +0 -0
- package/skills/documenting/scripts/changelog/__pycache__/validate_changelog.cpython-314.pyc +0 -0
- package/skills/documenting/scripts/changelog/add_entry.py +216 -0
- package/skills/documenting/scripts/changelog/bump_release.py +117 -0
- package/skills/documenting/scripts/changelog/init_changelog.py +54 -0
- package/skills/documenting/scripts/changelog/validate_changelog.py +128 -0
- package/skills/documenting/scripts/drift_detector.py +266 -0
- package/skills/documenting/scripts/generate_template.py +311 -0
- package/skills/documenting/scripts/list_by_category.sh +84 -0
- package/skills/documenting/scripts/orchestrator.py +255 -0
- package/skills/documenting/scripts/validate_metadata.py +242 -0
- package/skills/documenting/templates/CHANGELOG.md.template +13 -0
- package/skills/documenting/tests/__pycache__/test_changelog.cpython-314-pytest-9.0.2.pyc +0 -0
- package/skills/documenting/tests/__pycache__/test_drift_detector.cpython-314-pytest-9.0.2.pyc +0 -0
- package/skills/documenting/tests/__pycache__/test_orchestrator.cpython-314-pytest-9.0.2.pyc +0 -0
- package/skills/documenting/tests/__pycache__/test_validate_metadata.cpython-314-pytest-9.0.2.pyc +0 -0
- package/skills/documenting/tests/integration_test.sh +70 -0
- package/skills/documenting/tests/test_changelog.py +201 -0
- package/skills/documenting/tests/test_drift_detector.py +80 -0
- package/skills/documenting/tests/test_orchestrator.py +52 -0
- package/skills/documenting/tests/test_validate_metadata.py +64 -0
- package/skills/find-skills/SKILL.md +133 -0
- package/skills/gitnexus-debugging/SKILL.md +85 -0
- package/skills/gitnexus-exploring/SKILL.md +75 -0
- package/skills/gitnexus-impact-analysis/SKILL.md +94 -0
- package/skills/gitnexus-refactoring/SKILL.md +113 -0
- package/skills/hook-development/SKILL.md +797 -0
- package/skills/hook-development/examples/load-context.sh +55 -0
- package/skills/hook-development/examples/quality-check.js +1168 -0
- package/skills/hook-development/examples/validate-bash.sh +43 -0
- package/skills/hook-development/examples/validate-write.sh +38 -0
- package/skills/hook-development/references/advanced.md +527 -0
- package/skills/hook-development/references/migration.md +369 -0
- package/skills/hook-development/references/patterns.md +412 -0
- package/skills/hook-development/scripts/README.md +164 -0
- package/skills/hook-development/scripts/hook-linter.sh +153 -0
- package/skills/hook-development/scripts/test-hook.sh +252 -0
- package/skills/hook-development/scripts/validate-hook-schema.sh +159 -0
- package/skills/obsidian-cli/SKILL.md +106 -0
- package/skills/orchestrating-agents/SKILL.md +135 -0
- package/skills/orchestrating-agents/config.yaml +45 -0
- package/skills/orchestrating-agents/references/agent-context-integration.md +37 -0
- package/skills/orchestrating-agents/references/examples.md +45 -0
- package/skills/orchestrating-agents/references/handover-protocol.md +31 -0
- package/skills/orchestrating-agents/references/workflows.md +42 -0
- package/skills/orchestrating-agents/scripts/detect_neighbors.py +23 -0
- package/skills/prompt-improving/README.md +162 -0
- package/skills/prompt-improving/SKILL.md +74 -0
- package/skills/prompt-improving/references/analysis_commands.md +24 -0
- package/skills/prompt-improving/references/chain_of_thought.md +24 -0
- package/skills/prompt-improving/references/mcp_definitions.md +20 -0
- package/skills/prompt-improving/references/multishot.md +23 -0
- package/skills/prompt-improving/references/xml_core.md +60 -0
- package/skills/python-testing/SKILL.md +815 -0
- package/skills/senior-backend/SKILL.md +209 -0
- package/skills/senior-backend/references/api_design_patterns.md +103 -0
- package/skills/senior-backend/references/backend_security_practices.md +103 -0
- package/skills/senior-backend/references/database_optimization_guide.md +103 -0
- package/skills/senior-backend/scripts/api_load_tester.py +114 -0
- package/skills/senior-backend/scripts/api_scaffolder.py +114 -0
- package/skills/senior-backend/scripts/database_migration_tool.py +114 -0
- package/skills/senior-data-scientist/SKILL.md +226 -0
- package/skills/senior-data-scientist/references/experiment_design_frameworks.md +80 -0
- package/skills/senior-data-scientist/references/feature_engineering_patterns.md +80 -0
- package/skills/senior-data-scientist/references/statistical_methods_advanced.md +80 -0
- package/skills/senior-data-scientist/scripts/experiment_designer.py +100 -0
- package/skills/senior-data-scientist/scripts/feature_engineering_pipeline.py +100 -0
- package/skills/senior-data-scientist/scripts/model_evaluation_suite.py +100 -0
- package/skills/senior-devops/SKILL.md +209 -0
- package/skills/senior-devops/references/cicd_pipeline_guide.md +103 -0
- package/skills/senior-devops/references/deployment_strategies.md +103 -0
- package/skills/senior-devops/references/infrastructure_as_code.md +103 -0
- package/skills/senior-devops/scripts/deployment_manager.py +114 -0
- package/skills/senior-devops/scripts/pipeline_generator.py +114 -0
- package/skills/senior-devops/scripts/terraform_scaffolder.py +114 -0
- package/skills/senior-security/SKILL.md +209 -0
- package/skills/senior-security/references/cryptography_implementation.md +103 -0
- package/skills/senior-security/references/penetration_testing_guide.md +103 -0
- package/skills/senior-security/references/security_architecture_patterns.md +103 -0
- package/skills/senior-security/scripts/pentest_automator.py +114 -0
- package/skills/senior-security/scripts/security_auditor.py +114 -0
- package/skills/senior-security/scripts/threat_modeler.py +114 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +479 -0
- package/skills/skill-creator/agents/analyzer.md +274 -0
- package/skills/skill-creator/agents/comparator.md +202 -0
- package/skills/skill-creator/agents/grader.md +223 -0
- package/skills/skill-creator/assets/eval_review.html +146 -0
- package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/skill-creator/references/schemas.md +430 -0
- package/skills/skill-creator/scripts/__init__.py +0 -0
- package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/skill-creator/scripts/generate_report.py +326 -0
- package/skills/skill-creator/scripts/improve_description.py +248 -0
- package/skills/skill-creator/scripts/package_skill.py +136 -0
- package/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/skills/skill-creator/scripts/run_eval.py +310 -0
- package/skills/skill-creator/scripts/run_loop.py +332 -0
- package/skills/skill-creator/scripts/utils.py +47 -0
- package/skills/using-TDD/SKILL.md +410 -0
- package/skills/using-serena-lsp/README.md +8 -0
- package/skills/using-serena-lsp/REFERENCE.md +194 -0
- 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
|