hooks
13
总安装量
13
周安装量
#24298
全站排名
安装命令
npx skills add https://github.com/kimny1143/claude-code-template --skill hooks
Agent 安装分布
claude-code
11
gemini-cli
10
opencode
9
github-copilot
9
codex
9
kimi-cli
8
Skill 文档
hooks – Claude Code Hooks
Claude Code ã® Hook 使ã»ç®¡çã¬ã¤ãã
æ¦è¦
Hooks ã¯ãã¼ã«å®è¡ã®åå¾ã«èªåã§å®è¡ãããã¹ã¯ãªããã
| ã¿ã¤ã | ã¿ã¤ãã³ã° | ç¨é |
|---|---|---|
| PreToolUse | ãã¼ã«å®è¡å | æ¤è¨¼ãå±éºæä½ããã㯠|
| PostToolUse | ãã¼ã«å®è¡å¾ | ææ¡ããã°è¨é² |
| Stop | ä¼è©±çµäºæ | ã¯ãªã¼ã³ã¢ãã |
Hook 使
1. ã¹ã¯ãªãã使
#!/bin/bash
# .claude/hooks/my-hook.sh
# ç°å¢å¤æ°
# TOOL_NAME: ãã¼ã«å (Write, Edit, Bash, etc.)
# TOOL_INPUT: JSONå½¢å¼ã®å
¥åãã©ã¡ã¼ã¿
# çµäºã³ã¼ã
# 0: æåï¼è¨±å¯ï¼
# 1: è¦åï¼è¨±å¯ãã¡ãã»ã¼ã¸è¡¨ç¤ºï¼
# 2: ãããã¯ï¼å®è¡ã忢ï¼
# ä¾: å±éºãªã³ãã³ãããããã¯
if echo "$TOOL_INPUT" | grep -q "rm -rf /"; then
echo "ð« å±éºãªã³ãã³ãããããã¯ãã¾ãã" >&2
exit 2
fi
exit 0
2. å®è¡æ¨©éä»ä¸
chmod +x .claude/hooks/my-hook.sh
3. è¨å®ãã¡ã¤ã«ã«ç»é²
// .claude/settings.local.json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "/path/to/project/.claude/hooks/my-hook.sh"
}
]
}
]
}
}
å®ç¨ç㪠Hook ä¾
PreToolUse: å±éºæä½ãããã¯
#!/bin/bash
# validate-dangerous-ops.sh
case "$TOOL_NAME" in
"Bash")
COMMAND=$(echo "$TOOL_INPUT" | jq -r '.command // empty')
# force push ããããã¯
if echo "$COMMAND" | grep -qE 'git push.*(--force|-f).*(main|master)'; then
echo "ð« main/master ã¸ã® force push ã¯ç¦æ¢ã§ã" >&2
exit 2
fi
;;
"Write"|"Edit")
FILE_PATH=$(echo "$TOOL_INPUT" | jq -r '.file_path // empty')
# .env ãã¡ã¤ã«ç·¨éãè¦å
if echo "$FILE_PATH" | grep -qE '\.env'; then
echo "â ï¸ ç°å¢å¤æ°ãã¡ã¤ã«ãç·¨éãããã¨ãã¦ãã¾ã" >&2
exit 1 # è¦åã®ã¿
fi
;;
esac
exit 0
PostToolUse: ã³ãããå¾ã®ææ¡
#!/bin/bash
# suggest-after-commit.sh
# git commit å¾ã®ã¿çºç«
if ! echo "$TOOL_INPUT" | grep -q "git commit"; then
exit 0
fi
# 夿´ãã¡ã¤ã«ããã§ãã¯
CHANGED=$(git diff-tree --no-commit-id --name-only -r HEAD 2>/dev/null)
if echo "$CHANGED" | grep -q "schema"; then
echo "" >&2
echo "ð¡ ã¹ãã¼ãã夿´ããã¾ãã" >&2
echo " ãã¤ã°ã¬ã¼ã·ã§ã³ãã¡ã¤ã«ã®ä½æãæ¤è¨ãã¦ãã ãã" >&2
exit 1
fi
exit 0
Stop: ã»ãã·ã§ã³çµäºæã¯ãªã¼ã³ã¢ãã
#!/bin/bash
# cleanup-on-stop.sh
# ãã¼ã¸æ¸ã¿ãã©ã³ãã®ç¢ºèª
MERGED=$(git branch --merged main | grep -v main | grep -v '\*')
if [ -n "$MERGED" ]; then
echo "" >&2
echo "ð§¹ ãã¼ã¸æ¸ã¿ãã©ã³ããããã¾ã:" >&2
echo "$MERGED" >&2
echo " åé¤ãæ¤è¨ãã¦ãã ãã: git branch -d <branch>" >&2
exit 1
fi
exit 0
è¨å®æ§é
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit|Bash", // æ£è¦è¡¨ç¾ã§ããã
"hooks": [
{ "type": "command", "command": "/path/to/hook.sh" }
]
}
],
"PostToolUse": [
{
"hooks": [
{ "type": "command", "command": "/path/to/hook.sh" }
]
}
],
"Stop": [
{
"hooks": [
{ "type": "command", "command": "/path/to/hook.sh" }
]
}
]
}
}
ãããã°
# ç´æ¥å®è¡ãã¦ãã¹ã
TOOL_NAME="Bash" TOOL_INPUT='{"command":"git push --force main"}' ./my-hook.sh
echo $? # çµäºã³ã¼ã確èª
ãã¹ããã©ã¯ãã£ã¹
- éããããã³ã°: é·æéå¦çã¯é¿ãã
- stderr ã«åºå: stdout ã§ã¯ãªã stderr ã«åºå
- ææ¡ã®ã¿: èªåå®è¡ããã人éã«å¤æãå§ãã
- jq ã§ãã¼ã¹: JSON ãã¼ã¹ã«ã¯ jq ã使ç¨
- ãã§ã¤ã«ã»ã¼ã: jq ããªãå ´åã¯è¨±å¯ï¼exit 0ï¼