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