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,43 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Example PreToolUse hook for validating Bash commands
|
|
3
|
+
# This script demonstrates bash command validation patterns
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# Read input from stdin
|
|
8
|
+
input=$(cat)
|
|
9
|
+
|
|
10
|
+
# Extract command
|
|
11
|
+
command=$(echo "$input" | jq -r '.tool_input.command // empty')
|
|
12
|
+
|
|
13
|
+
# Validate command exists
|
|
14
|
+
if [ -z "$command" ]; then
|
|
15
|
+
echo '{"continue": true}' # No command to validate
|
|
16
|
+
exit 0
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
# Check for obviously safe commands (quick approval)
|
|
20
|
+
if [[ "$command" =~ ^(ls|pwd|echo|date|whoami)(\s|$) ]]; then
|
|
21
|
+
exit 0
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# Check for destructive operations
|
|
25
|
+
if [[ "$command" == *"rm -rf"* ]] || [[ "$command" == *"rm -fr"* ]]; then
|
|
26
|
+
echo '{"hookSpecificOutput": {"permissionDecision": "deny"}, "systemMessage": "Dangerous command detected: rm -rf"}' >&2
|
|
27
|
+
exit 2
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# Check for other dangerous commands
|
|
31
|
+
if [[ "$command" == *"dd if="* ]] || [[ "$command" == *"mkfs"* ]] || [[ "$command" == *"> /dev/"* ]]; then
|
|
32
|
+
echo '{"hookSpecificOutput": {"permissionDecision": "deny"}, "systemMessage": "Dangerous system operation detected"}' >&2
|
|
33
|
+
exit 2
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
# Check for privilege escalation
|
|
37
|
+
if [[ "$command" == sudo* ]] || [[ "$command" == su* ]]; then
|
|
38
|
+
echo '{"hookSpecificOutput": {"permissionDecision": "ask"}, "systemMessage": "Command requires elevated privileges"}' >&2
|
|
39
|
+
exit 2
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
# Approve the operation
|
|
43
|
+
exit 0
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Example PreToolUse hook for validating Write/Edit operations
|
|
3
|
+
# This script demonstrates file write validation patterns
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# Read input from stdin
|
|
8
|
+
input=$(cat)
|
|
9
|
+
|
|
10
|
+
# Extract file path and content
|
|
11
|
+
file_path=$(echo "$input" | jq -r '.tool_input.file_path // empty')
|
|
12
|
+
|
|
13
|
+
# Validate path exists
|
|
14
|
+
if [ -z "$file_path" ]; then
|
|
15
|
+
echo '{"continue": true}' # No path to validate
|
|
16
|
+
exit 0
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
# Check for path traversal
|
|
20
|
+
if [[ "$file_path" == *".."* ]]; then
|
|
21
|
+
echo '{"hookSpecificOutput": {"permissionDecision": "deny"}, "systemMessage": "Path traversal detected in: '"$file_path"'"}' >&2
|
|
22
|
+
exit 2
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# Check for system directories
|
|
26
|
+
if [[ "$file_path" == /etc/* ]] || [[ "$file_path" == /sys/* ]] || [[ "$file_path" == /usr/* ]]; then
|
|
27
|
+
echo '{"hookSpecificOutput": {"permissionDecision": "deny"}, "systemMessage": "Cannot write to system directory: '"$file_path"'"}' >&2
|
|
28
|
+
exit 2
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
# Check for sensitive files
|
|
32
|
+
if [[ "$file_path" == *.env ]] || [[ "$file_path" == *secret* ]] || [[ "$file_path" == *credentials* ]]; then
|
|
33
|
+
echo '{"hookSpecificOutput": {"permissionDecision": "ask"}, "systemMessage": "Writing to potentially sensitive file: '"$file_path"'"}' >&2
|
|
34
|
+
exit 2
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# Approve the operation
|
|
38
|
+
exit 0
|
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
# Advanced Hook Use Cases
|
|
2
|
+
|
|
3
|
+
This reference covers advanced hook patterns and techniques for sophisticated automation workflows.
|
|
4
|
+
|
|
5
|
+
## Multi-Stage Validation
|
|
6
|
+
|
|
7
|
+
Combine command and prompt hooks for layered validation:
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"PreToolUse": [
|
|
12
|
+
{
|
|
13
|
+
"matcher": "Bash",
|
|
14
|
+
"hooks": [
|
|
15
|
+
{
|
|
16
|
+
"type": "command",
|
|
17
|
+
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/quick-check.sh",
|
|
18
|
+
"timeout": 5
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"type": "prompt",
|
|
22
|
+
"prompt": "Deep analysis of bash command: $TOOL_INPUT",
|
|
23
|
+
"timeout": 15
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Use case:** Fast deterministic checks followed by intelligent analysis
|
|
32
|
+
|
|
33
|
+
**Example quick-check.sh:**
|
|
34
|
+
```bash
|
|
35
|
+
#!/bin/bash
|
|
36
|
+
input=$(cat)
|
|
37
|
+
command=$(echo "$input" | jq -r '.tool_input.command')
|
|
38
|
+
|
|
39
|
+
# Immediate approval for safe commands
|
|
40
|
+
if [[ "$command" =~ ^(ls|pwd|echo|date|whoami)$ ]]; then
|
|
41
|
+
exit 0
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
# Let prompt hook handle complex cases
|
|
45
|
+
exit 0
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The command hook quickly approves obviously safe commands, while the prompt hook analyzes everything else.
|
|
49
|
+
|
|
50
|
+
## Conditional Hook Execution
|
|
51
|
+
|
|
52
|
+
Execute hooks based on environment or context:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
#!/bin/bash
|
|
56
|
+
# Only run in CI environment
|
|
57
|
+
if [ -z "$CI" ]; then
|
|
58
|
+
echo '{"continue": true}' # Skip in non-CI
|
|
59
|
+
exit 0
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
# Run validation logic in CI
|
|
63
|
+
input=$(cat)
|
|
64
|
+
# ... validation code ...
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Use cases:**
|
|
68
|
+
- Different behavior in CI vs local development
|
|
69
|
+
- Project-specific validation
|
|
70
|
+
- User-specific rules
|
|
71
|
+
|
|
72
|
+
**Example: Skip certain checks for trusted users:**
|
|
73
|
+
```bash
|
|
74
|
+
#!/bin/bash
|
|
75
|
+
# Skip detailed checks for admin users
|
|
76
|
+
if [ "$USER" = "admin" ]; then
|
|
77
|
+
exit 0
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
# Full validation for other users
|
|
81
|
+
input=$(cat)
|
|
82
|
+
# ... validation code ...
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Hook Chaining via State
|
|
86
|
+
|
|
87
|
+
Share state between hooks using temporary files:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Hook 1: Analyze and save state
|
|
91
|
+
#!/bin/bash
|
|
92
|
+
input=$(cat)
|
|
93
|
+
command=$(echo "$input" | jq -r '.tool_input.command')
|
|
94
|
+
|
|
95
|
+
# Analyze command
|
|
96
|
+
risk_level=$(calculate_risk "$command")
|
|
97
|
+
echo "$risk_level" > /tmp/hook-state-$$
|
|
98
|
+
|
|
99
|
+
exit 0
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# Hook 2: Use saved state
|
|
104
|
+
#!/bin/bash
|
|
105
|
+
risk_level=$(cat /tmp/hook-state-$$ 2>/dev/null || echo "unknown")
|
|
106
|
+
|
|
107
|
+
if [ "$risk_level" = "high" ]; then
|
|
108
|
+
echo "High risk operation detected" >&2
|
|
109
|
+
exit 2
|
|
110
|
+
fi
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Important:** This only works for sequential hook events (e.g., PreToolUse then PostToolUse), not parallel hooks.
|
|
114
|
+
|
|
115
|
+
## Dynamic Hook Configuration
|
|
116
|
+
|
|
117
|
+
Modify hook behavior based on project configuration:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
#!/bin/bash
|
|
121
|
+
cd "$CLAUDE_PROJECT_DIR" || exit 1
|
|
122
|
+
|
|
123
|
+
# Read project-specific config
|
|
124
|
+
if [ -f ".claude-hooks-config.json" ]; then
|
|
125
|
+
strict_mode=$(jq -r '.strict_mode' .claude-hooks-config.json)
|
|
126
|
+
|
|
127
|
+
if [ "$strict_mode" = "true" ]; then
|
|
128
|
+
# Apply strict validation
|
|
129
|
+
# ...
|
|
130
|
+
else
|
|
131
|
+
# Apply lenient validation
|
|
132
|
+
# ...
|
|
133
|
+
fi
|
|
134
|
+
fi
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Example .claude-hooks-config.json:**
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"strict_mode": true,
|
|
141
|
+
"allowed_commands": ["ls", "pwd", "grep"],
|
|
142
|
+
"forbidden_paths": ["/etc", "/sys"]
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Context-Aware Prompt Hooks
|
|
147
|
+
|
|
148
|
+
Use transcript and session context for intelligent decisions:
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"Stop": [
|
|
153
|
+
{
|
|
154
|
+
"matcher": "*",
|
|
155
|
+
"hooks": [
|
|
156
|
+
{
|
|
157
|
+
"type": "prompt",
|
|
158
|
+
"prompt": "Review the full transcript at $TRANSCRIPT_PATH. Check: 1) Were tests run after code changes? 2) Did the build succeed? 3) Were all user questions answered? 4) Is there any unfinished work? Return 'approve' only if everything is complete."
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
}
|
|
162
|
+
]
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
The LLM can read the transcript file and make context-aware decisions.
|
|
167
|
+
|
|
168
|
+
## Performance Optimization
|
|
169
|
+
|
|
170
|
+
### Caching Validation Results
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
#!/bin/bash
|
|
174
|
+
input=$(cat)
|
|
175
|
+
file_path=$(echo "$input" | jq -r '.tool_input.file_path')
|
|
176
|
+
cache_key=$(echo -n "$file_path" | md5sum | cut -d' ' -f1)
|
|
177
|
+
cache_file="/tmp/hook-cache-$cache_key"
|
|
178
|
+
|
|
179
|
+
# Check cache
|
|
180
|
+
if [ -f "$cache_file" ]; then
|
|
181
|
+
cache_age=$(($(date +%s) - $(stat -f%m "$cache_file" 2>/dev/null || stat -c%Y "$cache_file")))
|
|
182
|
+
if [ "$cache_age" -lt 300 ]; then # 5 minute cache
|
|
183
|
+
cat "$cache_file"
|
|
184
|
+
exit 0
|
|
185
|
+
fi
|
|
186
|
+
fi
|
|
187
|
+
|
|
188
|
+
# Perform validation
|
|
189
|
+
result='{"decision": "approve"}'
|
|
190
|
+
|
|
191
|
+
# Cache result
|
|
192
|
+
echo "$result" > "$cache_file"
|
|
193
|
+
echo "$result"
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Parallel Execution Optimization
|
|
197
|
+
|
|
198
|
+
Since hooks run in parallel, design them to be independent:
|
|
199
|
+
|
|
200
|
+
```json
|
|
201
|
+
{
|
|
202
|
+
"PreToolUse": [
|
|
203
|
+
{
|
|
204
|
+
"matcher": "Write",
|
|
205
|
+
"hooks": [
|
|
206
|
+
{
|
|
207
|
+
"type": "command",
|
|
208
|
+
"command": "bash check-size.sh", // Independent
|
|
209
|
+
"timeout": 2
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"type": "command",
|
|
213
|
+
"command": "bash check-path.sh", // Independent
|
|
214
|
+
"timeout": 2
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"type": "prompt",
|
|
218
|
+
"prompt": "Check content safety", // Independent
|
|
219
|
+
"timeout": 10
|
|
220
|
+
}
|
|
221
|
+
]
|
|
222
|
+
}
|
|
223
|
+
]
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
All three hooks run simultaneously, reducing total latency.
|
|
228
|
+
|
|
229
|
+
## Cross-Event Workflows
|
|
230
|
+
|
|
231
|
+
Coordinate hooks across different events:
|
|
232
|
+
|
|
233
|
+
**SessionStart - Set up tracking:**
|
|
234
|
+
```bash
|
|
235
|
+
#!/bin/bash
|
|
236
|
+
# Initialize session tracking
|
|
237
|
+
echo "0" > /tmp/test-count-$$
|
|
238
|
+
echo "0" > /tmp/build-count-$$
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**PostToolUse - Track events:**
|
|
242
|
+
```bash
|
|
243
|
+
#!/bin/bash
|
|
244
|
+
input=$(cat)
|
|
245
|
+
tool_name=$(echo "$input" | jq -r '.tool_name')
|
|
246
|
+
|
|
247
|
+
if [ "$tool_name" = "Bash" ]; then
|
|
248
|
+
command=$(echo "$input" | jq -r '.tool_result')
|
|
249
|
+
if [[ "$command" == *"test"* ]]; then
|
|
250
|
+
count=$(cat /tmp/test-count-$$ 2>/dev/null || echo "0")
|
|
251
|
+
echo $((count + 1)) > /tmp/test-count-$$
|
|
252
|
+
fi
|
|
253
|
+
fi
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**Stop - Verify based on tracking:**
|
|
257
|
+
```bash
|
|
258
|
+
#!/bin/bash
|
|
259
|
+
test_count=$(cat /tmp/test-count-$$ 2>/dev/null || echo "0")
|
|
260
|
+
|
|
261
|
+
if [ "$test_count" -eq 0 ]; then
|
|
262
|
+
echo '{"decision": "block", "reason": "No tests were run"}' >&2
|
|
263
|
+
exit 2
|
|
264
|
+
fi
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
## Integration with External Systems
|
|
268
|
+
|
|
269
|
+
### Slack Notifications
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
#!/bin/bash
|
|
273
|
+
input=$(cat)
|
|
274
|
+
tool_name=$(echo "$input" | jq -r '.tool_name')
|
|
275
|
+
decision="blocked"
|
|
276
|
+
|
|
277
|
+
# Send notification to Slack
|
|
278
|
+
curl -X POST "$SLACK_WEBHOOK" \
|
|
279
|
+
-H 'Content-Type: application/json' \
|
|
280
|
+
-d "{\"text\": \"Hook ${decision} ${tool_name} operation\"}" \
|
|
281
|
+
2>/dev/null
|
|
282
|
+
|
|
283
|
+
echo '{"decision": "deny"}' >&2
|
|
284
|
+
exit 2
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Database Logging
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
#!/bin/bash
|
|
291
|
+
input=$(cat)
|
|
292
|
+
|
|
293
|
+
# Log to database
|
|
294
|
+
psql "$DATABASE_URL" -c "INSERT INTO hook_logs (event, data) VALUES ('PreToolUse', '$input')" \
|
|
295
|
+
2>/dev/null
|
|
296
|
+
|
|
297
|
+
exit 0
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Metrics Collection
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
#!/bin/bash
|
|
304
|
+
input=$(cat)
|
|
305
|
+
tool_name=$(echo "$input" | jq -r '.tool_name')
|
|
306
|
+
|
|
307
|
+
# Send metrics to monitoring system
|
|
308
|
+
echo "hook.pretooluse.${tool_name}:1|c" | nc -u -w1 statsd.local 8125
|
|
309
|
+
|
|
310
|
+
exit 0
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## Security Patterns
|
|
314
|
+
|
|
315
|
+
### Rate Limiting
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
#!/bin/bash
|
|
319
|
+
input=$(cat)
|
|
320
|
+
command=$(echo "$input" | jq -r '.tool_input.command')
|
|
321
|
+
|
|
322
|
+
# Track command frequency
|
|
323
|
+
rate_file="/tmp/hook-rate-$$"
|
|
324
|
+
current_minute=$(date +%Y%m%d%H%M)
|
|
325
|
+
|
|
326
|
+
if [ -f "$rate_file" ]; then
|
|
327
|
+
last_minute=$(head -1 "$rate_file")
|
|
328
|
+
count=$(tail -1 "$rate_file")
|
|
329
|
+
|
|
330
|
+
if [ "$current_minute" = "$last_minute" ]; then
|
|
331
|
+
if [ "$count" -gt 10 ]; then
|
|
332
|
+
echo '{"decision": "deny", "reason": "Rate limit exceeded"}' >&2
|
|
333
|
+
exit 2
|
|
334
|
+
fi
|
|
335
|
+
count=$((count + 1))
|
|
336
|
+
else
|
|
337
|
+
count=1
|
|
338
|
+
fi
|
|
339
|
+
else
|
|
340
|
+
count=1
|
|
341
|
+
fi
|
|
342
|
+
|
|
343
|
+
echo "$current_minute" > "$rate_file"
|
|
344
|
+
echo "$count" >> "$rate_file"
|
|
345
|
+
|
|
346
|
+
exit 0
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Audit Logging
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
#!/bin/bash
|
|
353
|
+
input=$(cat)
|
|
354
|
+
tool_name=$(echo "$input" | jq -r '.tool_name')
|
|
355
|
+
timestamp=$(date -Iseconds)
|
|
356
|
+
|
|
357
|
+
# Append to audit log
|
|
358
|
+
echo "$timestamp | $USER | $tool_name | $input" >> ~/.claude/audit.log
|
|
359
|
+
|
|
360
|
+
exit 0
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### Secret Detection
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
#!/bin/bash
|
|
367
|
+
input=$(cat)
|
|
368
|
+
content=$(echo "$input" | jq -r '.tool_input.content')
|
|
369
|
+
|
|
370
|
+
# Check for common secret patterns
|
|
371
|
+
if echo "$content" | grep -qE "(api[_-]?key|password|secret|token).{0,20}['\"]?[A-Za-z0-9]{20,}"; then
|
|
372
|
+
echo '{"decision": "deny", "reason": "Potential secret detected in content"}' >&2
|
|
373
|
+
exit 2
|
|
374
|
+
fi
|
|
375
|
+
|
|
376
|
+
exit 0
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## Testing Advanced Hooks
|
|
380
|
+
|
|
381
|
+
### Unit Testing Hook Scripts
|
|
382
|
+
|
|
383
|
+
```bash
|
|
384
|
+
# test-hook.sh
|
|
385
|
+
#!/bin/bash
|
|
386
|
+
|
|
387
|
+
# Test 1: Approve safe command
|
|
388
|
+
result=$(echo '{"tool_input": {"command": "ls"}}' | bash validate-bash.sh)
|
|
389
|
+
if [ $? -eq 0 ]; then
|
|
390
|
+
echo "✓ Test 1 passed"
|
|
391
|
+
else
|
|
392
|
+
echo "✗ Test 1 failed"
|
|
393
|
+
fi
|
|
394
|
+
|
|
395
|
+
# Test 2: Block dangerous command
|
|
396
|
+
result=$(echo '{"tool_input": {"command": "rm -rf /"}}' | bash validate-bash.sh)
|
|
397
|
+
if [ $? -eq 2 ]; then
|
|
398
|
+
echo "✓ Test 2 passed"
|
|
399
|
+
else
|
|
400
|
+
echo "✗ Test 2 failed"
|
|
401
|
+
fi
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### Integration Testing
|
|
405
|
+
|
|
406
|
+
Create test scenarios that exercise the full hook workflow:
|
|
407
|
+
|
|
408
|
+
```bash
|
|
409
|
+
# integration-test.sh
|
|
410
|
+
#!/bin/bash
|
|
411
|
+
|
|
412
|
+
# Set up test environment
|
|
413
|
+
export CLAUDE_PROJECT_DIR="/tmp/test-project"
|
|
414
|
+
export CLAUDE_PLUGIN_ROOT="$(pwd)"
|
|
415
|
+
mkdir -p "$CLAUDE_PROJECT_DIR"
|
|
416
|
+
|
|
417
|
+
# Test SessionStart hook
|
|
418
|
+
echo '{}' | bash hooks/session-start.sh
|
|
419
|
+
if [ -f "/tmp/session-initialized" ]; then
|
|
420
|
+
echo "✓ SessionStart hook works"
|
|
421
|
+
else
|
|
422
|
+
echo "✗ SessionStart hook failed"
|
|
423
|
+
fi
|
|
424
|
+
|
|
425
|
+
# Clean up
|
|
426
|
+
rm -rf "$CLAUDE_PROJECT_DIR"
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
## Best Practices for Advanced Hooks
|
|
430
|
+
|
|
431
|
+
1. **Keep hooks independent**: Don't rely on execution order
|
|
432
|
+
2. **Use timeouts**: Set appropriate limits for each hook type
|
|
433
|
+
3. **Handle errors gracefully**: Provide clear error messages
|
|
434
|
+
4. **Document complexity**: Explain advanced patterns in README
|
|
435
|
+
5. **Test thoroughly**: Cover edge cases and failure modes
|
|
436
|
+
6. **Monitor performance**: Track hook execution time
|
|
437
|
+
7. **Version configuration**: Use version control for hook configs
|
|
438
|
+
8. **Provide escape hatches**: Allow users to bypass hooks when needed
|
|
439
|
+
|
|
440
|
+
## Common Pitfalls
|
|
441
|
+
|
|
442
|
+
### ❌ Assuming Hook Order
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
# BAD: Assumes hooks run in specific order
|
|
446
|
+
# Hook 1 saves state, Hook 2 reads it
|
|
447
|
+
# This can fail because hooks run in parallel!
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### ❌ Long-Running Hooks
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
# BAD: Hook takes 2 minutes to run
|
|
454
|
+
sleep 120
|
|
455
|
+
# This will timeout and block the workflow
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### ❌ Uncaught Exceptions
|
|
459
|
+
|
|
460
|
+
```bash
|
|
461
|
+
# BAD: Script crashes on unexpected input
|
|
462
|
+
file_path=$(echo "$input" | jq -r '.tool_input.file_path')
|
|
463
|
+
cat "$file_path" # Fails if file doesn't exist
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### ✅ Proper Error Handling
|
|
467
|
+
|
|
468
|
+
```bash
|
|
469
|
+
# GOOD: Handles errors gracefully
|
|
470
|
+
file_path=$(echo "$input" | jq -r '.tool_input.file_path')
|
|
471
|
+
if [ ! -f "$file_path" ]; then
|
|
472
|
+
echo '{"continue": true, "systemMessage": "File not found, skipping check"}' >&2
|
|
473
|
+
exit 0
|
|
474
|
+
fi
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
## Conclusion
|
|
478
|
+
|
|
479
|
+
Advanced hook patterns enable sophisticated automation while maintaining reliability and performance. Use these techniques when basic hooks are insufficient, but always prioritize simplicity and maintainability.
|
|
480
|
+
|
|
481
|
+
## Agent-Based Hooks
|
|
482
|
+
|
|
483
|
+
Instead of using a simple `prompt` type, you can trigger a full `agent` to evaluate complex scenarios. This is useful when the validation itself requires tool usage (e.g., searching codebase, reading external logs).
|
|
484
|
+
|
|
485
|
+
```json
|
|
486
|
+
{
|
|
487
|
+
"PreToolUse": [
|
|
488
|
+
{
|
|
489
|
+
"matcher": "Bash",
|
|
490
|
+
"hooks": [
|
|
491
|
+
{
|
|
492
|
+
"type": "agent",
|
|
493
|
+
"agent": "security-reviewer",
|
|
494
|
+
"prompt": "Review this bash command for security issues: $TOOL_INPUT",
|
|
495
|
+
"timeout": 120
|
|
496
|
+
}
|
|
497
|
+
]
|
|
498
|
+
}
|
|
499
|
+
]
|
|
500
|
+
}
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
## HTTP Webhooks (HTTP Hooks)
|
|
504
|
+
|
|
505
|
+
You can trigger remote services directly via HTTP endpoints instead of using Bash `curl`. Useful for CI/CD integrations or remote logging.
|
|
506
|
+
|
|
507
|
+
```json
|
|
508
|
+
{
|
|
509
|
+
"PostToolUse": [
|
|
510
|
+
{
|
|
511
|
+
"matcher": "Bash",
|
|
512
|
+
"hooks": [
|
|
513
|
+
{
|
|
514
|
+
"type": "http",
|
|
515
|
+
"url": "https://api.your-monitoring.com/events",
|
|
516
|
+
"method": "POST",
|
|
517
|
+
"headers": {
|
|
518
|
+
"Authorization": "Bearer ${MONITORING_TOKEN}"
|
|
519
|
+
},
|
|
520
|
+
"body": "{\"event\": \"tool_use\", \"tool\": \"$TOOL_NAME\", \"cwd\": \"$CWD\"}",
|
|
521
|
+
"timeout": 10
|
|
522
|
+
}
|
|
523
|
+
]
|
|
524
|
+
}
|
|
525
|
+
]
|
|
526
|
+
}
|
|
527
|
+
```
|