Hook Development
Освойте Claude Code с навыком Hook Development. Создавайте событийно-ориентированные автоматизации для проверки команд, применения политик и настройки рабочего процесса кодирования с ИИ.
Разрабатывайте мощные, управляемые событиями скрипты автоматизации (хуки) для настройки и защиты ваших рабочих процессов Claude Code. Этот навык предоставляет подробное руководство по созданию хуков, которые реагируют на события жизненного цикла, такие как использование инструментов, запуск сессии или завершение задачи. Научитесь реализовывать как командные хуки для детерминированных проверок, так и продвинутые, управляемые LLM, промпт-хуки для проверки и принятия решений с учетом контекста. Используйте хуки для контроля соблюдения стандартов кодирования, блокировки опасных команд, загрузки контекста, специфичного для проекта, и интеграции внешних инструментов, добавляя надежный уровень автоматизации и соблюдения политик в ваш процесс разработки.
Ключевые особенности
Варианты использования
| name | description | version |
|---|---|---|
Hook Development |
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API. |
0.1.0 |
Hooks are event-driven automation scripts that execute in response to Claude Code events. Use hooks to validate operations, enforce policies, add context, and integrate external tools into workflows.
Key capabilities:
- Validate tool calls before execution (PreToolUse)
- React to tool results (PostToolUse)
- Enforce completion standards (Stop, SubagentStop)
- Load project context (SessionStart)
- Automate workflows across the development lifecycle
Use LLM-driven decision making for context-aware validation:
{
"type": "prompt",
"prompt": "Evaluate if this tool use is appropriate: $TOOL_INPUT",
"timeout": 30
}Supported events: Stop, SubagentStop, UserPromptSubmit, PreToolUse
Benefits:
- Context-aware decisions based on natural language reasoning
- Flexible evaluation logic without bash scripting
- Better edge case handling
- Easier to maintain and extend
Execute bash commands for deterministic checks:
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh",
"timeout": 60
}Use for:
- Fast deterministic validations
- File system operations
- External tool integrations
- Performance-critical checks
For plugin hooks in hooks/hooks.json, use wrapper format:
{
"description": "Brief explanation of hooks (optional)",
"hooks": {
"PreToolUse": [...],
"Stop": [...],
"SessionStart": [...]
}
}Key points:
descriptionfield is optionalhooksfield is required wrapper containing actual hook events- This is the plugin-specific format
Example:
{
"description": "Validation hooks for code quality",
"hooks": {
"PreToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/validate.sh"
}
]
}
]
}
}For user settings in .claude/settings.json, use direct format:
{
"PreToolUse": [...],
"Stop": [...],
"SessionStart": [...]
}Key points:
- No wrapper - events directly at top level
- No description field
- This is the settings format
Important: The examples below show the hook event structure that goes inside either format. For plugin hooks.json, wrap these in {"hooks": {...}}.
Execute before any tool runs. Use to approve, deny, or modify tool calls.
Example (prompt-based):
{
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "prompt",
"prompt": "Validate file write safety. Check: system paths, credentials, path traversal, sensitive content. Return 'approve' or 'deny'."
}
]
}
]
}Output for PreToolUse:
{
"hookSpecificOutput": {
"permissionDecision": "allow|deny|ask",
"updatedInput": {"field": "modified_value"}
},
"systemMessage": "Explanation for Claude"
}Execute after tool completes. Use to react to results, provide feedback, or log.
Example:
{
"PostToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "prompt",
"prompt": "Analyze edit result for potential issues: syntax errors, security vulnerabilities, breaking changes. Provide feedback."
}
]
}
]
}Output behavior:
- Exit 0: stdout shown in transcript
- Exit 2: stderr fed back to Claude
- systemMessage included in context
Execute when main agent considers stopping. Use to validate completeness.
Example:
{
"Stop": [
{
"matcher": "*",
"hooks": [
{
"type": "prompt",
"prompt": "Verify task completion: tests run, build succeeded, questions answered. Return 'approve' to stop or 'block' with reason to continue."
}
]
}
]
}Decision output:
{
"decision": "approve|block",
"reason": "Explanation",
"systemMessage": "Additional context"
}Execute when subagent considers stopping. Use to ensure subagent completed its task.
Similar to Stop hook, but for subagents.
Execute when user submits a prompt. Use to add context, validate, or block prompts.
Example:
{
"UserPromptSubmit": [
{
"matcher": "*",
"hooks": [
{
"type": "prompt",
"prompt": "Check if prompt requires security guidance. If discussing auth, permissions, or API security, return relevant warnings."
}
]
}
]
}Execute when Claude Code session begins. Use to load context and set environment.
Example:
{
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/load-context.sh"
}
]
}
]
}Special capability: Persist environment variables using $CLAUDE_ENV_FILE:
echo "export PROJECT_TYPE=nodejs" >> "$CLAUDE_ENV_FILE"See examples/load-context.sh for complete example.
Execute when session ends. Use for cleanup, logging, and state preservation.
Execute before context compaction. Use to add critical information to preserve.
Execute when Claude sends notifications. Use to react to user notifications.
{
"continue": true,
"suppressOutput": false,
"systemMessage": "Message for Claude"
}continue: If false, halt processing (default true)suppressOutput: Hide output from transcript (default false)systemMessage: Message shown to Claude
0- Success (stdout shown in transcript)2- Blocking error (stderr fed back to Claude)- Other - Non-blocking error
All hooks receive JSON via stdin with common fields:
{
"session_id": "abc123",
"transcript_path": "/path/to/transcript.txt",
"cwd": "/current/working/dir",
"permission_mode": "ask|allow",
"hook_event_name": "PreToolUse"
}Event-specific fields:
- PreToolUse/PostToolUse:
tool_name,tool_input,tool_result - UserPromptSubmit:
user_prompt - Stop/SubagentStop:
reason
Access fields in prompts using $TOOL_INPUT, $TOOL_RESULT, $USER_PROMPT, etc.
Available in all command hooks:
$CLAUDE_PROJECT_DIR- Project root path$CLAUDE_PLUGIN_ROOT- Plugin directory (use for portable paths)$CLAUDE_ENV_FILE- SessionStart only: persist env vars here$CLAUDE_CODE_REMOTE- Set if running in remote context
Always use ${CLAUDE_PLUGIN_ROOT} in hook commands for portability:
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh"
}In plugins, define hooks in hooks/hooks.json:
{
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "prompt",
"prompt": "Validate file write safety"
}
]
}
],
"Stop": [
{
"matcher": "*",
"hooks": [
{
"type": "prompt",
"prompt": "Verify task completion"
}
]
}
],
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/load-context.sh",
"timeout": 10
}
]
}
]
}Plugin hooks merge with user's hooks and run in parallel.
Exact match:
"matcher": "Write"Multiple tools:
"matcher": "Read|Write|Edit"Wildcard (all tools):
"matcher": "*"Regex patterns:
"matcher": "mcp__.*__delete.*" // All MCP delete toolsNote: Matchers are case-sensitive.
// All MCP tools
"matcher": "mcp__.*"
// Specific plugin's MCP tools
"matcher": "mcp__plugin_asana_.*"
// All file operations
"matcher": "Read|Write|Edit"
// Bash commands only
"matcher": "Bash"Always validate inputs in command hooks:
#!/bin/bash
set -euo pipefail
input=$(cat)
tool_name=$(echo "$input" | jq -r '.tool_name')
# Validate tool name format
if [[ ! "$tool_name" =~ ^[a-zA-Z0-9_]+$ ]]; then
echo '{"decision": "deny", "reason": "Invalid tool name"}' >&2
exit 2
fiCheck for path traversal and sensitive files:
file_path=$(echo "$input" | jq -r '.tool_input.file_path')
# Deny path traversal
if [[ "$file_path" == *".."* ]]; then
echo '{"decision": "deny", "reason": "Path traversal detected"}' >&2
exit 2
fi
# Deny sensitive files
if [[ "$file_path" == *".env"* ]]; then
echo '{"decision": "deny", "reason": "Sensitive file"}' >&2
exit 2
fiSee examples/validate-write.sh and examples/validate-bash.sh for complete examples.
# GOOD: Quoted
echo "$file_path"
cd "$CLAUDE_PROJECT_DIR"
# BAD: Unquoted (injection risk)
echo $file_path
cd $CLAUDE_PROJECT_DIR{
"type": "command",
"command": "bash script.sh",
"timeout": 10
}Defaults: Command hooks (60s), Prompt hooks (30s)
All matching hooks run in parallel:
{
"PreToolUse": [
{
"matcher": "Write",
"hooks": [
{"type": "command", "command": "check1.sh"}, // Parallel
{"type": "command", "command": "check2.sh"}, // Parallel
{"type": "prompt", "prompt": "Validate..."} // Parallel
]
}
]
}Design implications:
- Hooks don't see each other's output
- Non-deterministic ordering
- Design for independence
- Use command hooks for quick deterministic checks
- Use prompt hooks for complex reasoning
- Cache validation results in temp files
- Minimize I/O in hot paths
Create hooks that activate conditionally by checking for a flag file or configuration:
Pattern: Flag file activation
#!/bin/bash
# Only active when flag file exists
FLAG_FILE="$CLAUDE_PROJECT_DIR/.enable-strict-validation"
if [ ! -f "$FLAG_FILE" ]; then
# Flag not present, skip validation
exit 0
fi
# Flag present, run validation
input=$(cat)
# ... validation logic ...Pattern: Configuration-based activation
#!/bin/bash
# Check configuration for activation
CONFIG_FILE="$CLAUDE_PROJECT_DIR/.claude/plugin-config.json"
if [ -f "$CONFIG_FILE" ]; then
enabled=$(jq -r '.strictMode // false' "$CONFIG_FILE")
if [ "$enabled" != "true" ]; then
exit 0 # Not enabled, skip
fi
fi
# Enabled, run hook logic
input=$(cat)
# ... hook logic ...Use cases:
- Enable strict validation only when needed
- Temporary debugging hooks
- Project-specific hook behavior
- Feature flags for hooks
Best practice: Document activation mechanism in plugin README so users know how to enable/disable temporary hooks.
Important: Hooks are loaded when Claude Code session starts. Changes to hook configuration require restarting Claude Code.
Cannot hot-swap hooks:
- Editing
hooks/hooks.jsonwon't affect current session - Adding new hook scripts won't be recognized
- Changing hook commands/prompts won't update
- Must restart Claude Code: exit and run
claudeagain
To test hook changes:
- Edit hook configuration or scripts
- Exit Claude Code session
- Restart:
claudeorcc - New hook configuration loads
- Test hooks with
claude --debug
Hooks are validated when Claude Code starts:
- Invalid JSON in hooks.json causes loading failure
- Missing scripts cause warnings
- Syntax errors reported in debug mode
Use /hooks command to review loaded hooks in current session.
claude --debugLook for hook registration, execution logs, input/output JSON, and timing information.
Test command hooks directly:
echo '{"tool_name": "Write", "tool_input": {"file_path": "/test"}}' | \
bash ${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh
echo "Exit code: $?"Ensure hooks output valid JSON:
output=$(./your-hook.sh < test-input.json)
echo "$output" | jq .| Event | When | Use For |
|---|---|---|
| PreToolUse | Before tool | Validation, modification |
| PostToolUse | After tool | Feedback, logging |
| UserPromptSubmit | User input | Context, validation |
| Stop | Agent stopping | Completeness check |
| SubagentStop | Subagent done | Task validation |
| SessionStart | Session begins | Context loading |
| SessionEnd | Session ends | Cleanup, logging |
| PreCompact | Before compact | Preserve context |
| Notification | User notified | Logging, reactions |
DO:
- ✅ Use prompt-based hooks for complex logic
- ✅ Use ${CLAUDE_PLUGIN_ROOT} for portability
- ✅ Validate all inputs in command hooks
- ✅ Quote all bash variables
- ✅ Set appropriate timeouts
- ✅ Return structured JSON output
- ✅ Test hooks thoroughly
DON'T:
- ❌ Use hardcoded paths
- ❌ Trust user input without validation
- ❌ Create long-running hooks
- ❌ Rely on hook execution order
- ❌ Modify global state unpredictably
- ❌ Log sensitive information
For detailed patterns and advanced techniques, consult:
references/patterns.md- Common hook patterns (8+ proven patterns)references/migration.md- Migrating from basic to advanced hooksreferences/advanced.md- Advanced use cases and techniques
Working examples in examples/:
validate-write.sh- File write validation examplevalidate-bash.sh- Bash command validation exampleload-context.sh- SessionStart context loading example
Development tools in scripts/:
validate-hook-schema.sh- Validate hooks.json structure and syntaxtest-hook.sh- Test hooks with sample input before deploymenthook-linter.sh- Check hook scripts for common issues and best practices
- Official Docs: https://docs.claude.com/en/docs/claude-code/hooks
- Examples: See security-guidance plugin in marketplace
- Testing: Use
claude --debugfor detailed logs - Validation: Use
jqto validate hook JSON output
To implement hooks in a plugin:
- Identify events to hook into (PreToolUse, Stop, SessionStart, etc.)
- Decide between prompt-based (flexible) or command (deterministic) hooks
- Write hook configuration in
hooks/hooks.json - For command hooks, create hook scripts
- Use ${CLAUDE_PLUGIN_ROOT} for all file references
- Validate configuration with
scripts/validate-hook-schema.sh hooks/hooks.json - Test hooks with
scripts/test-hook.shbefore deployment - Test in Claude Code with
claude --debug - Document hooks in plugin README
Focus on prompt-based hooks for most use cases. Reserve command hooks for performance-critical or deterministic checks.
📌 Что это
Hook Development — это навык (skill), предоставляющий расширенное руководство по созданию, настройке и отладке системы хуков (hooks) для плагинов Claude Code. Хуки — это событийно-управляемые скрипты, которые автоматически запускаются в ответ на действия пользователя, агента или внутренние события сессии. Они позволяют валидировать вызовы инструментов, блокировать опасные команды, добавлять контекст, интегрировать внешние проверки и автоматизировать сценарии рабочего процесса. Skill подходит для разработчиков плагинов, администраторов безопасности, DevOps-инженеров и всех, кто хочет гибко контролировать поведение Claude Code.
⚙️ Как работает
🏗️ Типы хуков
Skill выделяет два основных типа реализации хуков:
- Prompt-хуки (рекомендованные): Используют LLM для принятия решений на основе естественного языка. Они гибки, легко поддерживаются и способны обрабатывать сложные, неоднозначные ситуации. Конфигурируются полем
prompt, в котором можно обращаться к переменным вида$TOOL_INPUT,$TOOL_RESULT,$USER_PROMPT. - Command-хуки: Выполняют bash-скрипты для быстрых, детерминированных проверок (проверка файлов, вызов внешних инструментов, валидация). Подходят для чувствительных ко времени задач.
🔌 Форматы конфигурации
Skill объясняет два формата размещения хуков:
- Формат плагина (
hooks/hooks.json): Использует обёртку с полямиdescription(опционально) иhooks(обязательно), внутри которого перечислены события. Хуки плагина объединяются с пользовательскими и выполняются параллельно. - Формат настроек (
settings.json): Прямой формат без обёртки, события указываются на верхнем уровне. Используется в.claude/settings.json.
// Пример: command-хук с портабельным путём
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh",
"timeout": 60
}
🎯 События (Events)
Каждое событие запускает хуки в определённый момент жизненного цикла. Skill подробно описывает все поддерживаемые события:
PreToolUse— перед выполнением любого инструмента. Используется для разрешения (allow), запрета (deny) или модификации вызова. Может возвращатьpermissionDecisionиupdatedInput.PostToolUse— после выполнения инструмента. Анализирует результат, логирует, передаёт обратную связь черезsystemMessage.Stop— когда главный агент собирается завершить задачу. Проверяет полноту выполнения, возвращаетdecision(approve/block) иreason.SubagentStop— аналогичноStop, но для подчинённых агентов.UserPromptSubmit— при отправке пользователем запроса. Может добавить контекст, предупредить о рисках безопасности или заблокировать запрос.SessionStart— при старте сессии Claude Code. Идеален для загрузки контекста проекта, установки переменных окружения (через$CLAUDE_ENV_FILE).SessionEnd— при завершении сессии (очистка, сохранение состояния).PreCompact— перед сжатием контекста. Позволяет добавить критически важную информацию, которая не должна быть отброшена.Notification— когда Claude отправляет уведомления.
🔀 Матчеры (Matchers)
Skill описывает гибкую систему сопоставления с именем инструмента, чтобы хук срабатывал на нужные вызовы:
- Точное совпадение:
"matcher": "Write" - Несколько инструментов:
"matcher": "Read|Write|Edit" - Все инструменты (wildcard):
"matcher": "*" - Регулярные выражения:
"matcher": "mcp__plugin_asana_.*"(все инструменты Asana из MCP)
Важно: матчеры чувствительны к регистру.
📥 Входные и выходные данные
Каждый хук получает JSON через stdin с общими полями: session_id, transcript_path, cwd, permission_mode, hook_event_name и специфическими для события (tool_name, user_prompt, reason и т.д.).
Стандартный вывод хука (JSON в stdout):
{
"continue": true,
"suppressOutput": false,
"systemMessage": "Message for Claude"
}
continue: еслиfalse— обработка останавливается.suppressOutput: скрыть вывод из транскрипта.systemMessage: сообщение, которое увидит Claude.
Коды выхода: 0 — успех, 2 — блокирующая ошибка (stderr передаётся Claude), другие коды — неблокирующие.
🛡️ Безопасность
Skill уделяет большое внимание безопасности:
- Валидация входных данных — проверка формата имени инструмента, пути к файлам (запрет path traversal, защита
.env-файлов). - Обёртка всех переменных в кавычки в bash-скриптах (
echo "$file_path"вместоecho $file_path). - Установка таймаутов (по умолчанию 30 с для prompt-хуков, 60 с для command).
Пример валидации в command-хуке:
#!/bin/bash
set -euo pipefail
input=$(cat)
file_path=$(echo "$input" | jq -r '.tool_input.file_path')
# Deny path traversal
if [[ "$file_path" == *".."* ]]; then
echo '{"decision": "deny", "reason": "Path traversal detected"}' >&2
exit 2
fi
🧪 Отладка и тестирование
- Запуск с флагом
claude --debugдля просмотра регистрации хуков, входных/выходных JSON и таймингов. - Тестирование command-хуков напрямую:
echo '{"tool_name":"Write"}' | bash ${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh - Валидация JSON-вывода с помощью
jq. - Встроенные утилиты:
validate-hook-schema.sh,test-hook.sh,hook-linter.sh.
💡 Когда использовать
- 🔹 Валидация операций — блокировать запись в критичные системные пути или редактирование конфиденциальных файлов.
- 🔹 Контроль качества — проверять, что после редактирования кода не появились синтаксические ошибки или уязвимости.
- 🔹 Загрузка контекста — при старте сессии загружать переменные окружения, конфигурацию проекта, подключать базы знаний.
- 🔹 Автоматизация рабочего процесса — добавлять обязательные проверки перед завершением задачи (
Stop/SubagentStop), направлять суб-агентов. - 🔹 Временные хуки — активировать строгую валидацию только при наличии флагового файла (например, для режима CI/CD).
⚠️ Важно знать
- Хуки загружаются один раз при старте сессии. Изменения в
hooks.jsonили скриптах не применяются до перезапуска Claude Code. - Все подходящие хуки выполняются параллельно, без гарантии порядка и без возможности обмена данными друг с другом. Каждый хук должен быть самодостаточным.
- Не создавайте долгоиграющие хуки — это заблокирует работу агента.
- Не используйте хардкод путей — всегда используйте
$CLAUDE_PLUGIN_ROOTдля портабельности. - Не полагайтесь на порядок выполнения хуков и не изменяйте глобальное состояние непредсказуемым образом.
- Не логируйте конфиденциальные данные (токены, пароли).
📂 Эталонные файлы и примеры
Skill ссылается на вспомогательные материалы, которые идут в составе плагина:
references/patterns.md— 8+ проверенных шаблонов хуков.references/migration.md— миграция от базовых к продвинутым хукам.references/advanced.md— сложные кейсы (условная активация, интеграция с внешними API).examples/validate-write.sh,examples/load-context.sh— рабочие примеры скриптов.
Внешняя документация: docs.claude.com
📋 Быстрая шпаргалка по событиям
| Событие | Когда | Для чего |
|---|---|---|
PreToolUse |
Перед инструментом | Валидация, модификация |
PostToolUse |
После инструмента | Анализ, логирование |
UserPromptSubmit |
Ввод пользователя | Контекст, валидация |
Stop |
Остановка агента | Проверка завершённости |
SubagentStop |
Остановка суб-агента | Валидация задачи |
SessionStart |
Начало сессии | Загрузка контекста |
SessionEnd |
Конец сессии | Очистка, логи |
PreCompact |
Перед сжатием | Сохранение контекста |
Notification |
Уведомление | Логирование |
🧭 Рекомендованный workflow для внедрения
- Определите, на какие события нужно реагировать.
- Выберите тип: prompt (гибкость) или command (производительность).
- Напишите конфигурацию в
hooks/hooks.json(плагин) илиsettings.json(пользователь). - Для command-хуков создайте скрипты, используя
$CLAUDE_PLUGIN_ROOT. - Проверьте конфигурацию утилитой
validate-hook-schema.sh. - Протестируйте хуки через
test-hook.sh. - Запустите Claude Code с флагом
--debugдля финальной проверки. - Опишите хуки в README плагина.
Что делает навык Hook Development?
Этот навык позволяет создавать мощные, управляемые событиями скрипты автоматизации (хуки), которые настраивают и контролируют поведение Claude Code. Вы можете использовать их для проверки операций, соблюдения политик проекта и интеграции собственной логики непосредственно в ваш рабочий процесс разработки с ИИ.
Можно ли создавать хуки, которыми легко делиться?
Да. Используя портативные переменные окружения, такие как ${CLAUDE_PLUGIN_ROOT} в командах хуков, вы можете создавать самодостаточные скрипты внутри плагина, делая ваши пользовательские автоматизации и правила проверки легко распространяемыми и повторно используемыми в разных проектах.
Как этот навык улучшает мой рабочий процесс?
Он улучшает ваш рабочий процесс, добавляя уровни безопасности и автоматизации. Хуки сокращают ручной контроль, предотвращают распространенные ошибки, обеспечивают соблюдение стандартов проекта и адаптируют среду Claude к вашим конкретным потребностям, делая ваши сеансы ИИ-кодирования более эффективными, надежными и безопасными.
Когда следует использовать этот навык?
Используйте этот навык, когда вам нужно автоматически блокировать опасные команды, соблюдать стандарты кодирования, загружать пользовательский контекст проекта в начале сеанса или проверять, что задача полностью выполнена, прежде чем Claude завершит работу. Он идеально подходит для добавления безопасности, согласованности и автоматизации в сложных задачах.
Каковы основные возможности хуков Claude Code?
Вы можете создавать два основных типа хуков: управляемые LLM хуки «prompt» для принятия решений с учетом контекста и хуки «command» для выполнения детерминированных скриптов оболочки. Они могут запускаться по таким событиям, как PreToolUse (перед выполнением инструмента), SessionStart (для настройки окружения) и Stop (для проверки завершения задачи).
Синхронизировать навыки с Claude Cowork, Claude Code, Codex и другими.
Установите одной командой.
npx skillfish add anthropics/claude-code hook-developmentИсточник: https://mcpmarket.com/tools/skills/hook-development-1
Комментарии
Комментариев пока нет. Будьте первым.