8훅 하나 거는 순서 4/7
스크립트를 써요
훅은 표준입력으로 JSON을 받고, PreToolUse라면 tool_input.command에 실행하려는 명령이 들어 있어요. 아무것도 찍지 않고 끝나면 평소처럼 실행돼요. 아래 예시는 Chrome을 끄려는 명령이 오면 사람에게 묻는 훅을 짧게 줄인 코드예요.
# Chrome을 끄는 명령이면 실행 전에 사람에게 묻는다(ask)
import json, re, sys
data = json.load(sys.stdin)
cmd = str((data.get("tool_input") or {}).get("command", ""))
kill_chrome = [
r"taskkill\b.*?/+im\s+\"?chrome", # taskkill /IM chrome.exe
r"stop-process\b.*?-name\s+\"?chrome", # Stop-Process -Name chrome
r"\b(pkill|killall)\b.*chrome",
]
if any(re.search(p, cmd, re.I) for p in kill_chrome):
print(json.dumps({"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "ask",
"permissionDecisionReason": "Chrome을 끄는 명령이에요. 사람이 직접 시킨 경우에만 승인하세요."
}}, ensure_ascii=False))
permissionDecision에 deny를 넣으면 막기, ask면 묻기예요. 막을 때는 이유와 대안을 permissionDecisionReason에 꼭 적어요. Claude가 그 글을 읽고 다른 방법을 찾아요. 종료 코드 2로 끝내도 막히지만, 이유를 함께 넘기려면 JSON이 편해요.