Claude Code: prompt hook は「指示文」で書ける(Stop で早期終了を防ぐ)
hooks の type: "prompt" は、シェルスクリプトの代わりに「〜ならブロック」「テストが全部通っていること」といった自然文の条件を小さなモデルに判定させる。Stop に付ければ「まだ終わってないのに止まる」を防げる。
どんな時に使う?
- 「ビルドが壊れていたら止まらずに続けて」「
.envを読むコマンドはブロック」など、正規表現では書きにくい条件 - CLAUDE.md に書いても守られないルールを、毎回必ず評価させたいとき
手順
.claude/settings.json:
json
{
"hooks": {
"Stop": [
{ "hooks": [ {
"type": "prompt",
"prompt": "Claude が止まってよいか判定: $ARGUMENTS 。ビルドとテストが通っていなければ ok:false にして理由を返す"
} ] }
],
"PreToolUse": [
{ "matcher": "Bash", "hooks": [ {
"type": "prompt",
"prompt": "Block any Bash command that reads .env files",
"continueOnBlock": true
} ] }
]
}
}- 判定モデルは
{"ok": bool, "reason": "...", "impossible": bool}を返す - Stop / SubagentStop で
ok:false→ 理由が次の指示として Claude に渡り、作業続行 - PreToolUse で
ok:false→ そのツール呼び出しは拒否。continueOnBlock: trueなら理由を返して続行させる
注意点
- 2.1.294 未満は要更新: 指示文で書いた prompt/agent hook が、ブロックすべき操作を許可してしまう不具合があった(2026-10-08 修正)。
claude --versionで確認。 - 書いただけでは効いているか分からない。止めたいコマンドを1つ流して、本当に止まるかテストするまでが設定。
- 判定に LLM を使うので確実性は command hook に劣る。絶対に止めたいもの(
rm -rfなど)はpermissions.denyや command hook と併用。 - 既定のタイムアウトは30秒。
出典
- @keitaro_aigc · 2026-10-09
- @oikon48 CHANGELOG 要約 2026-10-08: @oikon48 · 2026-10-08
- 公式: code.claude.com (Prompt-based hooks)
- 関連: Claude Code: 「〜したら〜して」はルールではなく hooks(settings.json)に書く