テック技報最新号へ →
AIコーディング

Claude Code: prompt hook は「指示文」で書ける(Stop で早期終了を防ぐ)

hooks の type: "prompt" は、シェルスクリプトの代わりに「〜ならブロック」「テストが全部通っていること」といった自然文の条件を小さなモデルに判定させる。Stop に付ければ「まだ終わってないのに止まる」を防げる。

@keitaro_aigc · 2026-10-09
#ai-coding#claude-code#hooks#品質ゲート

どんな時に使う?

  • 「ビルドが壊れていたら止まらずに続けて」「.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秒。

出典

X の元の投稿を開く