AIに「.envには触らないで」と書いておいたのに、書き換えようとした――。CLAUDE.mdやAGENTS.mdに書いたルールは、AIへの「お願い」です。たいていは守られますが、必ず守られるわけではありません。
本記事では、Claude CodeとCodexの「フック(Hooks)」を解説します。フックは、道具を使う前・使った後・返事を終えるとき・通知のときといった、AIの作業の決まったタイミングで、自分のプログラムを必ず動かす仕組みです。設定の書き方、スクリプトに届くJSON、終了コードの意味(止めるのはexit 2で、1では止まらない)、.envを書き換えられると困る理由と秘密の情報の守り方を押さえたうえで、.envを守る・自動で整形する・待っていたら通知する・終わる前にテストする、という4つの実例を紹介します。Codexとの違い、CLAUDE.md・権限の設定・Gitのフックとの使い分け、セキュリティの注意点までまとめます。
情報は2026年10月5日時点のものです。料金・提供範囲・数値は変わることがあります。出典は記事末尾にまとめています。
- フックは、AIの作業の決まったタイミングで必ず動くプログラム。
- 止めたいときはexit 2で終える。exit 1では止まらない。
- 秘密の情報は、権限の設定とフックで、読ませない・書かせない。
- Codexにも同じ仕組みがある。他人のフックは中身を確かめてから使う。
基礎知識:コーディングエージェントの「フック」とは
Claude CodeやOpenAI Codexなどのコーディングエージェントでは、設定ファイル(CLAUDE.mdやAGENTS.md)に「.envファイルを編集しないこと」「変更後は必ずリンターとテストを実行すること」と書いておくのが一般的です。しかし、こうした指示は確率的に動くAIへの「お願い」にすぎず、長い作業や複雑な状況の中で見落とされる可能性をゼロにはできません。
そこで、AIの判断に任せず「決まったタイミングで必ずプログラムを実行する」ための仕組みが「フック(Hooks)」です。道具を使う直前(PreToolUse)、使った直後(PostToolUse)、返事を終えるとき(Stop)、入力や許可を待つとき(Notification)といった作業の節目に、開発者が用意したスクリプトやプログラムを割り込ませることができます。
たとえばPreToolUseのフックには、AIが使おうとしている道具の名前や対象のファイルの場所が、JSONの形でスクリプトに渡されます。スクリプトが、対象が.envや危険なコマンド(rm -rfなど)だと判断したら、終了コード2(または拒否を示すJSON)を返すことで、AIの道具の実行を止め、理由をAIに伝えて別の手順へ導けます。ただし、フックは完全な防御の境界ではありません(時間切れでは道具を止めない、@で指定したファイルの読み込みでは動かない、など)。単純な禁止は、権限の設定(permissions)のほうが確実です。
AIがルールを破るとき
AIが毎回読むルール(イメージ)
# 和菓子ECショップのルール
- .env はさわらない
- コードを直したら、整形する
- 終わる前に、テストを動かす
お店の注文サイトをAIのエージェントに直してもらうとき、CLAUDE.mdに「.envは触らない」「コードを直したら整形する」「終わる前にテストを動かす」と書いておいたとします。.envは、パスワードや鍵などの秘密の設定を入れておく大事なファイルです。
AIに注文サイトを直してもらう(イメージ)
ところが「注文ページを新しいデータベースにつないで」と頼むと、AIは「接続先を変えるため、.envを書き換えます」と言い出しました(イメージ)。AIは、ルールを読んでいても、悪気なくうっかりすることがあります。
ルールの文書は、あくまで「お願い」です。守るかどうかはAIの判断に委ねられます。[s2]そこで使うのが「フック」です。AIの作業の決まった場所に、自分のプログラムを引っかけておく仕組みで、Claude CodeにもCodexにもあります。[s1][s3]
AIに任せるときの3つの困りごと
AIに任せるときの3つの困りごと
うっかり
さわってほしくないファイルを変える
やり忘れ
整形やテストを、たまに飛ばす
気づかない
許可を待ったまま止まっている
AIに作業を任せるときの困りごとは、3つに分けられます。1つ目は、先ほどの.envのように、触ってほしくないファイルを変えてしまう「うっかり」。2つ目は、整形やテストをときどき飛ばす「やり忘れ」。3つ目は、AIが「実行していいか」と聞いたまま止まっているのに人が「気づかない」ことです。いずれも、AIの気分に任せずに毎回必ずやりたいことで、ここがフックの出番です。
フックとは何か
AIの作業の流れ(Claude Code)
AIの作業の流れ(Claude Code)
出典: Claude Code 公式ドキュメント(2026年10月)
AIは、指示を受け取ったあと、ファイルを書き換えたりコマンドを動かしたりといった「道具」を使う流れを、作業が終わるまで何度もくり返します。フックは、この流れの決まった場所に引っかけておけます。[s1]
たとえば道具を使う前の「PreToolUse」は、AIがファイルを書き換える直前に必ず動きます。道具を使った後は「PostToolUse」、返事を終えるときは「Stop」です。名前よりも、いつ動くかを押さえておけば十分です。[s1]
フックを付けられるタイミングの数
出典: 各社の公式ドキュメント(2026年10月5日時点)
フックを付けられるタイミングは、Claude Codeで33種類、Codexで12種類あります。[s1][s3]よく使うのは、この3つに通知を加えた4つほどです。
フックはどう動くのか
フックの設定は3段
フックの設定は3段
フックの設定に書くことは3つだけです。「いつ」(道具を使う前などのタイミング)、「どの道具のとき」(ファイルの編集だけ、のように絞り込む条件。matcherと呼ぶ)、そして「何を動かすか」(ふつうはコマンドやスクリプト)です。[s1][s3]
フックに届くJSON(イメージ)
{ "hook_event_name": "PreToolUse", "tool_name": "Edit", "tool_input": { "file_path": "/shop/.env", "old_string": "DB_HOST=old", "new_string": "DB_HOST=new" }
}
標準入力で届く(公式ドキュメントの形をもとにしたイメージ)
動かすスクリプトには、AIが何をしようとしているかがJSONの形で届きます。この例では、使う道具が「Edit」(ファイルの編集)で、書き換えようとしているファイルが.envであることが分かります。[s1]
終了コードの意味
終了コードの意味
出典: Claude Code 公式ドキュメント(Codex も exit 2 で止める)
止めるかどうかは、スクリプトの終わり方で伝えます。プログラムは終わるときに「終了コード」という番号を1つ返し、Claude Codeはその番号を見て次の動きを決めます。0は「問題なし」で、AIはそのまま作業を続けます。2は「止めて」で、作業を止め、スクリプトが書いた理由をAIに伝えます。[s1][s3]
止めるならexit 2
ここに落とし穴があります。1などそれ以外の番号は「フック自体が失敗した」と受け取られ、エラーが表示されるだけで、作業は続いてしまいます。[s1]止めたつもりで止まっていない、ということが起きるのです。止めたいときは、必ず2で終えることを覚えておきましょう。
.envを書き換えられると何が困るのか
.envを書き換えられると困ること
.envを書きかえられると困ること
サイトが止まる
接続先がずれて、注文を受けられない
元に戻せない
Gitに記録しないので、前の値が残らない
気づきにくい
画面に出ない設定なので、原因が見えない
.envには、データベースの場所と合言葉、支払いサービスの鍵といった秘密の情報が入っています(イメージ)。書き換えられると、まず、接続先や合言葉がずれて注文ページが動かなくなります。次に、.envはGitで記録しないことが多いため、前の値に戻せません。[s9]そして、画面に出ない設定なので、何が変わったのかに気づきにくいのです。
# 秘密の設定は記録しない
.env
.env.*
!.env.example
GitHub の Node.gitignore の見本より
大事なファイルなのにGitで記録しないのは、パスワードを、みんなが見るリポジトリに載せないためです。GitHubのNode向けの見本でも、.envは記録せず、書き方の見本(.env.example)だけを記録するようになっています。[s9]
秘密の情報をAIが扱う危険
秘密の情報をAIが扱う危険
外に送られる
読んだ中身はAIの会社へ
記録に残る
会話の記録に鍵が残る
書き写される
コードやコミットに入る
だまされる
隠れた命令で送らされる
秘密の情報は、AIに読ませるだけでも危険があります。AIが読んだ中身は会話と一緒にAIの会社のサーバーへ送られ、会話の記録はパソコンの中にもそのままの文字で残ります。[s6]AIが鍵をコードに書き写し、そのまま公開してしまうこともあります。[s10]さらに、読んだページに隠れた命令(プロンプトインジェクション)でAIがだまされ、鍵を外部に送るおそれもあり、どんな守りも完全ではありません。[s7]
秘密の情報の守り方
{ "permissions": { "deny": [ "Read(./.env)", "Read(./.env.*)", "Edit(./.env)" ] }
}
秘密の情報は、読ませない・書かせない・本物の鍵は渡さない、の3つで守るのが基本です。読ませないためには、権限の設定(permissionsのdeny)が確実で、公式も鍵を入れたファイルに使うよう勧めています。[s8]AIにはテスト用の鍵だけを渡し、もし漏れたらすぐに鍵を作り直しましょう。[s10]ここからは、このうち「書かせない」をフックで作ってみます。
実例① .envを守る(PreToolUse)
設定ファイル
{ "hooks": { "PreToolUse": [{ "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": "python3", "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/guard.py"] }] }] }
}
書かせないためのフックは、道具を使う前(PreToolUse)に付けます。プロジェクトの設定ファイルには、タイミングを「PreToolUse」、matcherを「Edit|Write」(ファイルを直すときと新しく作るとき)と書きます。動かすものは「guard.py」というPythonのスクリプトです。[s1][s2]スクリプトの場所に使う「$CLAUDE_PROJECT_DIR」は、プロジェクトの場所に置き換わる目印で、どこから動かしても同じファイルを指せます。[s1]
スクリプトの中身
import json, sys data = json.load(sys.stdin) # AIの予定を読む
path = data["tool_input"].get("file_path", "") if path.endswith(".env"): print("人が管理するファイルです", file=sys.stderr) sys.exit(2) # 2 で止める sys.exit(0) # ほかは続ける
スクリプトはわずか10行ほどです。届いたJSONを読み込み、書き換えようとしているファイルの場所を取り出し、それが.envなら理由を書いて2で終わります。それ以外なら0で終わり、作業を続けてもらいます。[s1][s2]
AIを動かす前に試す
$ echo '{"tool_input":{"file_path":"/shop/.env"}}' | python3 guard.py
人が管理するファイルです
$ echo $?
2
AIを動かす前に、見本のJSONを流し込んで終わり方を確かめることもできます。2で終われば、止まることが確認できます。[s2]
フックを入れたあと(イメージ)
フックを入れてから同じことを頼むと、AIが.envを書き換えようとした瞬間にフックが止めます。止めた理由はAIに届くため、AIはやり方を変え、人が変えるための手順を教えてくれます。[s2]しかも、この止めるフックは、確認なしですべて任せる設定でも効きます。[s2]
実例② 直したら自動で整形する(PostToolUse)
整形のコマンド
jq -r '.tool_input.file_path' | xargs npx prettier --write
2つ目は「やり忘れ」の対策で、ファイルを直したら必ず整形します。設定は先ほどとほぼ同じで、タイミングが「PostToolUse」に変わるだけです。動かすのは1行のコマンドで、jqという道具で届いたJSONから直したファイルの名前を取り出し、Prettierという整形の道具にそのまま渡します。[s2]
フックが整形した後
const price = { zunda: 300, kusa: 250, goma: 280 };
function total(items) { return items.reduce((s, i) => s + price[i], 0);
}
※イメージ
これで、AIが書いた詰まったコードも、直すたびに自動で読みやすい形に整います。AIが整形を忘れても、フックが毎回必ず動くので、「やり忘れ」は起きません。
時間のかかる処理は裏で動かす
"hooks": [{ "type": "command", "command": "bash .claude/hooks/run-tests.sh", "async": true
}]
テストのように時間がかかるものは、「async」を付けると裏で動かせます。AIは待たずに作業を続け、結果は次のやりとりでAIに届きます。ただし、裏で動くフックは作業を止めることはできません。[s1]
実例③ 待っていたら通知する(Notification)
通知のフック
{ "hooks": { "Notification": [{ "hooks": [{ "type": "command", "command": "osascript -e 'display notification \"AIが待っています\"'" }] }] }
}
3つ目は「気づかない」の対策です。「Notification」は、AIが入力や許可を待つときに動きます。[s2]これはホームの設定ファイルに書くと、すべてのプロジェクトで効きます。[s1]例ではMacの通知を出すコマンドを動かしており、WindowsやLinuxの通知のコマンドも公式の説明に載っています。[s2]
実例④ 終わる前にテストする(Stop)
止めすぎは8回まで
4つ目は「Stop」で、AIが返事を終えようとするときに動きます。ここで「まだ終わらないで」と返すと、AIは作業を続けます。[s1]ただし、いつでも止めるようにすると、AIは終わろうとするたびに戻されることになります。Claude Codeは、8回続けて止められたら、次は終わらせる仕組みになっています。[s1]
テストが失敗したときだけ止める
import json, subprocess, sys data = json.load(sys.stdin)
if data["stop_hook_active"]: # 一度 続けさせた後なら sys.exit(0) # 今回は終わってよい test = subprocess.run(["npm", "test"], capture_output=True)
if test.returncode != 0: # テストが通らないときだけ reason = "テストが失敗しています。直してください" print(json.dumps({"decision": "block", "reason": reason}))
正しい使い方は、テストが通らないときだけ止めることです。まず、すでに一度続けさせた後(stop_hook_activeが真のとき)なら、そこで終わってもらいます。そのうえでテストを動かし、失敗したときだけ、理由を付けて「まだ終わらないで」と返します。[s1][s2]
このStopフックの動き
テストが通る
そのまま終わる
テストが失敗
1回、直してから終わる
テストが通ればそのまま終わり、失敗したら1回直してから終わります。AIを休ませないための仕組みではなく、仕上げを確かめるための仕組みです。
Codexのフックとの違い
どちらでも動くスクリプトの例
import json, sys data = json.load(sys.stdin)
cmd = data["tool_input"].get("command", "") if "rm -rf" in cmd: print(json.dumps({"hookSpecificOutput": { "hookEventName": "PreToolUse", "permissionDecision": "deny", "permissionDecisionReason": "rm -rf は禁止です"}}))
Codexにも、ほとんど同じ形のフックがあります。書く場所は「hooks.json」か「config.toml」で、3段の形は同じです。[s3]この例は、フォルダを中身ごと消すコマンド「rm -rf」を止めるスクリプトで、見つけたらJSONで「deny」と返して止めます。この返し方は両方で同じなので、このスクリプトはどちらでも使えます。[s1][s3]
Claude CodeとCodexのフック
Claude Code と Codex のフック
| 項目 | Claude Code | Codex |
|---|---|---|
| 書く場所 | settings.json | hooks.json など |
| タイミング | 33種類 | 12種類 |
| 動かせるもの | コマンド・HTTPなど5種 | コマンドとMCPの2種 |
| 最初に動くまで | フォルダを信頼したら | フックごとに確認 |
| 止め方 | exit 2 か deny | exit 2 か deny |
| 裏で動かす | ○ | ○ |
出典: 各社の公式ドキュメント(2026年10月5日時点)
違いもあります。書く場所とタイミングの数が異なり(33種類と12種類)、動かせるものも、Claude Codeが5種類、Codexはコマンドとmcp_toolの2種類です。[s1][s3]Codexは、管理者のもの以外のフックを1つずつ確認して信頼するまで動かさず、中身が書き換わったフックも、確かめ直すまで動きません。[s3]止め方と、裏で動かす仕組みは、どちらにもあります。[s1][s3]
ファイル編集のJSONは違う
{ "tool_name": "apply_patch", "tool_input": { "command": "*** Update File: .env ..." }
}
Codex 公式ドキュメント:apply_patch の入力は tool_input.command
ただし、Codexのファイル編集は「apply_patch」という道具で行われ、JSONの形が違います。[s3].envを守るスクリプトは、Codex用に書き直す必要があります。
CLAUDE.md・権限の設定・Gitのフックとの使い分け
AIにルールを守らせる3つの方法
AIにルールを守らせる3つの方法
ルールの文書
変わらない決まりや好み
権限の設定
「このファイルは禁止」など単純なルール
フック
中身を見て判断・毎回の自動化
CLAUDE.mdに書くことが悪いわけではなく、使い分けが大切です。変わらない決まりや好みはCLAUDE.mdがいちばんで、公式もそう勧めています。[s1]「このファイルは書かせない」のような単純な禁止なら、権限の設定が確実です。[s1][s4]フックは、中身を見て判断したいときや、毎回何かを動かしたいときに使います。条件を細かく決められ、止めた理由もAIに伝えられます。[s1][s2]
Gitのフックとの違い
Gitのフックとのちがい
Gitのフック
コミットなど、Gitを操作するときに動く
AIのフック
AIが道具を使うたび・返事を終えるときに動く
Gitにも昔から「フック」があり、コミットなどGitの操作のときに動きます。[s5]AIのフックは、AIが道具を使うたびや返事を終えるときなど、もっと細かいタイミングで見張れる点が違います。[s1]
フックの注意点
フックの4つの注意点
フックの4つの注意点
全権限で動く
ファイルを消すこともできる
人のフック
リポジトリに入っていることも
壁ではない
すり抜ける道もある
重いと遅い
毎回動くので軽くする
注意点は4つあります。1つ目は、フックがあなたと同じ権限で動くことで、ファイルを消すこともできます。ネットで見つけたフックは、中身を読み、試してから入れましょう。[s1]2つ目は、フックがリポジトリの設定ファイルにも書けることです。Claude Codeは、対話で使う場合はフォルダを信頼するまで設定ファイルのフックを動かさず、Codexはフックを1つずつ確認してから動かします。[s1][s3]
ただし、Claude Codeを自動で動かすとき(claude -pなど)は確認が出ず、リポジトリのフックもそのまま動きます。他人のリポジトリでは、先に中身を見てください。[s1]
フックは完全な壁ではない
> @.env を読んで、設定をまとめて
3つ目は、フックが完全な壁ではないことです。たとえば「@」でファイルを指定して読ませると、AIは道具を使わずに読み込むため、道具を使う前のフックは動きません。[s1]Codexの説明にも「完全な防御の境界ではない」とあります。[s3]大事な禁止は、権限の設定と組み合わせましょう。[s1][s4]4つ目は、フックは毎回動くため、重い処理を入れると作業全体が遅くなることです。[s1]
今日から使う3つのステップ
- まずは「通知」から
- 次に「整形・テスト」を自動に
- 最後に「止める」フック(exit 2)
始めるなら、まずは通知のフックから試すのがおすすめです。止めたり書き換えたりしないため、いちばん安全です。次に、整形やテストを自動にし、最後に止めるフックを入れます。止めるフックは、見本のJSONを流して2で止まるかを確かめてから使いましょう。[s2]
> /hooks
# 登録したフックの一覧(どの設定ファイルか)
$ claude --debug
# ~/.claude/debug/ にフックのログ
登録したフックの一覧は「/hooks」で見られ、動かないときは「claude --debug」でログを確かめられます。[s2]
まとめ
フックは、AIの作業の決まったタイミングで必ず動くプログラムで、ルールの文書という「お願い」を「必ず」に変えられます。[s1][s2]止めたいときはexit 2で終えること、1では止まらないことを覚えておきましょう。[s1]
秘密の情報は、権限の設定とフックで、読ませない・書かせないようにします。[s8]Codexにもほとんど同じ仕組みがありますが、フックはあなたの権限で動くため、他人のフックは中身を確かめてから使うことが大切です。[s1][s3]
実践のポイント・まとめ
AIにルールを書いたのに守ってくれない
ルールの文書は「お願い」です。必ず守らせたいなら、道具を使う前に動くフック(PreToolUse)で、対象が.envなら理由を書いて終了コード2で終わるスクリプトを動かしましょう。1で終わると止まらないので注意してください。
AIの「フック」とは結局何か
AIの作業の決まったタイミングで、自分のプログラムを毎回必ず動かす仕組みです。ルールの文書は守るかどうかがAIしだいですが、フックは必ず動きます。Codexにもほとんど同じ仕組みがあります。
exit 1でAIは止まる?
止まりません。Claude Codeでは、1はフック自体の失敗として扱われ、エラーが表示されるだけで作業は続きます。止めるフックは必ず2で終わらせ、見本のJSONを流して確かめてから使いましょう。
AIを休ませないフックを作ったら
終わるたびに止めるStopフックを作ると、AIは延々と作業を続けさせられます(Claude Codeは8回続けて止められたら終わる)。テストが失敗したときだけ止め、一度続けさせた後はきちんと終わらせるのがコツです。
AIが待っているのに気づかなかった
AIが入力や許可を待つときに動く「Notification」のフックで、パソコンに通知を出せます。ホームの設定ファイルに書けば、すべてのプロジェクトで効きます。止めたり書き換えたりしないので、最初のフックにぴったりです。
出典・参考文献
- [s1] Anthropic「Hooks reference」Claude Code Docs ↗ code.claude.com
- [s2] Anthropic「Automate actions with hooks」Claude Code Docs ↗ code.claude.com
- [s3] OpenAI「Hooks」Codex Docs ↗ developers.openai.com
- [s4] Anthropic「Configure permissions」Claude Code Docs ↗ code.claude.com
- [s5] Git「githooks」Documentation ↗ git-scm.com
- [s6] Anthropic「Data usage」Claude Code Docs ↗ code.claude.com
- [s7] Anthropic「Security」Claude Code Docs ↗ code.claude.com
- [s8] Anthropic「Settings reference(permissions.deny)」Claude Code Docs ↗ code.claude.com
- [s9] GitHub「gitignore: Node.gitignore」 ↗ github.com
- [s10] GitHub Docs「Removing sensitive data from a repository」 ↗ docs.github.com
検証ファクト一覧を表示する(全52項目)
| ID | 確認した事実・仕様 | 出典 | 注意・補足 |
|---|---|---|---|
| F1 | フックは、Claude Code の作業の決まったタイミングで自動で動く、ユーザーが決めたシェルコマンド・HTTP・MCP ツール・プロンプト・サブエージェント | [s1] | |
| F2 | 目的は「決まった動き(deterministic control)」:LLM が実行するかどうかを選ぶのではなく、決まった動作が**必ず**起きる。プロジェクトのルールの強制、くり返し作業の自動化、既存のツールとの連携 | [s2] | |
| F3 | 設定は3段:①イベント(いつ)②matcher(どの道具のとき)③ハンドラー(何を動かす) | [s1] [s3] | |
| F4 | 置き場所(Claude Code):`~/.claude/settings.json`(自分の全プロジェクト)、`.claude/settings.json`(プロジェクト、リポジトリに入れて共有できる)、`.claude/settings.local.json`(自分だけ)、管理者の設定、プラグイン、スキル・サブエージェントの frontmatter | [s1] | |
| F5 | 同じイベントに合うフックは**全部、並列**に動く。同じものを2つのファイルに書いても1回だけ | [s1] | |
| F6 | Claude Code のイベントは33種類(2026年10月5日のドキュメントの一覧)。SessionStart、UserPromptSubmit、PreToolUse、PermissionRequest、PostToolUse、Notification、Stop、SubagentStart/Stop、PreCompact、FileChanged、SessionEnd など | [s1] | |
| F7 | 頻度:セッションごと(SessionStart・SessionEnd)、指示ごと(UserPromptSubmit・Stop)、道具を使うたび(PreToolUse・PostToolUse) | [s1] | |
| F8 | Codex のイベントは12種類:SessionStart、SessionEnd、UserPromptSubmit、PreToolUse、PermissionRequest、PostToolUse、PreCompact、PostCompact、SubagentStart、SubagentStop、Stop、Interrupt | [s3] | |
| F9 | Notification は、Claude が入力や許可を待っているときに出る | [s2] | |
| F10 | コマンドフックは、イベントの情報を JSON で標準入力から受け取る。共通の項目:session_id、transcript_path、cwd、hook_event_name など。道具のイベントでは tool_name(例 "Bash")と tool_input(例 command、file_path) | [s1] [s3] | |
| F11 | Claude Code の Write・Edit・Read の file_path は、いつも絶対パス(`~` や相対パスで回り道されない) | [s1] | |
| F12 | 終了コード:0=成功(続ける)。2=止める(PreToolUse なら道具の実行を止め、標準エラーの文が理由として Claude に伝わる)。**それ以外(1など)は止めない**(エラーとして表示されるだけで、作業は続く) | [s1] | |
| F13 | JSON の出力でもっと細かく:PreToolUse は permissionDecision(allow/deny/ask/defer)と理由、updatedInput(入力の書き換え)、additionalContext(Claude への補足) | [s1] | |
| F14 | deny のフックは、bypassPermissions(確認なしモード)でも道具を止める。逆に allow のフックは、設定の拒否ルールを越えられない(フックは「きびしくする」ことはできても「ゆるめる」ことはできない) | [s2] | |
| F15 | PostToolUse は道具を使った**あと**なので、取り消しはできない。decision: "block" と reason で Claude に伝える | [s1] [s2] | |
| F16 | Stop:Claude が返事を終えるときに動く。decision: "block" と reason で「まだ終わらないで」と続けさせられる。入力の stop_hook_active が true なら、すでに続けさせた後 | [s1] | |
| F17 | Claude Code は Stop フックが**8回続けて**止めたら、次は無視して終える(上限は環境変数で変えられる)。スクリプトは stop_hook_active を見て、無限に続けさせないようにする | [s1] [s2] | |
| F18 | SessionStart や UserPromptSubmit の標準出力(ふつうの文)は、Claude が読む情報(コンテキスト)に足される | [s1] | |
| F19 | 通知:Notification イベントで `osascript -e 'display notification ...'`(macOS) | [s2] | |
| F20 | 自動整形:PostToolUse・matcher "Edit\ | — | |
| F21 | 大事なファイルを守る:PreToolUse・matcher "Edit\ | — | |
| F22 | 危ないコマンドを止める:PreToolUse・matcher "Bash"、`if: "Bash(rm *)"` で絞り、`rm -rf` なら permissionDecision: "deny" | [s1] | |
| F23 | テストをバックグラウンドで:`async: true` で、Claude は待たずに作業を続け、結果は次のやりとりで伝わる。async のフックは止めたり決めたりはできない | [s1] | |
| F24 | 動作の確かめ方:サンプルの JSON をスクリプトに流して終了コードを見る(`echo '{"tool_name":"Bash",...}' \ | — | |
| F25 | コマンドフックは、あなたのユーザー権限そのもので動く。ファイルを変えたり消したりできる。入れる前に中身を読んで試す | [s1] | |
| F26 | Claude Code の信頼:対話のセッションでは、フォルダを信頼するまで設定ファイルのフックを動かさない。`-p`(自動実行)や SDK では信頼の確認が出ず、リポジトリの .claude/settings.json のフックも動く → 他人のリポジトリでは先に中身を見るか、`--settings '{"disableAllHooks": true}'` | [s1] | |
| F27 | 安全な書き方:入力を疑う、シェル変数は "$VAR" と引用、`..` を含むパスを止める、スクリプトは絶対パス、.env や .git/ や鍵をさわらない | [s1] | |
| F28 | タイムアウト:既定は command・http・mcp_tool が600秒(10分)、prompt 30秒、agent 60秒。PreToolUse のフックが時間切れになっても、道具は止まらない(止める門として当てにしない) | [s1] | |
| F29 | `@` でファイルを指定して読ませたときは、道具を使わないので PreToolUse は動かない → 読ませたくないファイルは権限の設定(Read の拒否)で止める | [s1] | 「完全な壁ではない」の例 |
| F30 | 全部止める:`"disableAllHooks": true` | [s1] | |
| F31 | 置き場所:`~/.codex/hooks.json`、`~/.codex/config.toml`、`<repo>/.codex/hooks.json`、`<repo>/.codex/config.toml`。複数あれば全部読む(上の層が下の層を消すわけではない) | [s3] | |
| F32 | 設定の形は「イベント → matcher → hooks」の3段で、JSON でも TOML(`[[hooks.PreToolUse]]`)でも書ける | [s3] | |
| F33 | 種類:command と mcp_tool が動く。prompt と agent は読み込むが**飛ばされる** | [s3] | |
| F34 | 管理者のもの以外のフックは、**中身を確認して信頼するまで動かない**。信頼はフックの中身のハッシュに記録され、新しいフック・変わったフックは確認し直し。CLI の `/hooks` で確認・信頼・個別に無効化 | [s3] | |
| F35 | PreToolUse で止める:`hookSpecificOutput.permissionDecision: "deny"`(古い decision: "block" も可)か、exit 2 と標準エラー。Bash の入力は tool_input.command | [s3] | |
| F36 | ファイルの編集は apply_patch という道具で、matcher には apply_patch・Edit・Write が使える。tool_input.command にパッチの中身が入る | [s3] | |
| F37 | タイムアウトは既定600秒。SessionEnd と Interrupt は1秒(最大3秒) | [s3] | |
| F38 | `async: true` でバックグラウンド実行(1セッションで同時に8個まで)。止めたり書き換えたりはできない | [s3] | |
| F39 | 無効にする:config.toml の `[features]` に `hooks = false`。フックは既定で有効 | [s3] | |
| F40 | Codex も「道具のフックは役に立つガードレールだが、完全な防御の境界ではない」と書いている | [s3] | |
| F41 | Codex は互換のために CLAUDE_PLUGIN_ROOT と CLAUDE_PLUGIN_DATA も設定する | [s3] | |
| F42 | CLAUDE.md(Codex は AGENTS.md):プロジェクトのルールを書いておく文書。毎回読み込まれるが、守るかどうかは AI の判断。変わらない決まりごとは CLAUDE.md がよい(フックは要らない) | [s1] | |
| F43 | 権限の設定(permissions):道具ごとに allow/ask/deny のルール。「このファイルは読ませない・書かせない」のような単純な禁止は、こちらが確実 | [s1] [s4] | |
| F44 | Git のフック(pre-commit など):コミットなど Git の操作のときにスクリプトを動かす仕組み。AI のフックは、AI が道具を使うたび・返事を終えるたびなど、もっと細かいタイミング | [s5] | |
| F45 | GitHub の Node 向けの .gitignore の見本は `.env` と `.env.*` を記録しない(`!.env.example` だけ記録する)。→ .env は Git に履歴が残らないことが多く、書きかえられると前の値に戻しにくい | [s9] | |
| F46 | Claude Code はローカルで動くが、モデルとやりとりするためにデータをネットワークで送る。送るのはユーザーのプロンプトとモデルの出力のすべて(通信は TLS で暗号化)。AIが読んだファイルの中身も会話の一部になる | [s6] | |
| F47 | サーバー側の保存期間:個人のプラン(Free・Pro・Max)は、モデル改善に使うのを許可すると5年、許可しないと30日。法人(Team・Enterprise・API)は標準30日 | [s6] | |
| F48 | Claude Code は会話の記録(トランスクリプト)を `~/.claude/projects/` に**平文で**既定30日保存する(再開のため) | [s6] | |
| F49 | プロンプトインジェクション:攻撃者が悪意のある文を入れて、AIの指示を上書き・操作する手法。Claude Code に対策はあるが「どんな仕組みも、すべての攻撃を完全には防げない」 | [s7] | |
| F50 | `permissions.deny` は API キー・秘密・環境変数のファイルに使うよう書かれている。一致するファイルは検索から外れ、読むのを拒否し、Edit・Write も止める。例:`Read(./.env)`、`Read(./.env.*)`。ただし `grep -r` のようにファイル名を書かずに読むコマンドには効かないので、OS レベルで守るならサンドボックス | [s8] | |
| F51 | 秘密(パスワード・トークン)がリポジトリに入ってしまったら、まず無効にする・作り直す(revoke / rotate)。そうすれば使えなくなる | [s10] | |
| F52 | Codex:大きすぎるフックの出力はディスクに保存されるので、フックの出力に秘密を入れない | [s3] |
※ 記事中のお店の注文サイトの例(.env を書き換えようとした、テストなど)のやりとりはイメージです。
※ 画面のコードは、Claude Code と Codex の公式ドキュメントの例をもとに、説明のために短くしたものです。.env を守る Python のスクリプトは、公式の bash の例を Python に書き直したものです。使う前に、ご自分の環境で試してください。
※ イベントの数(Claude Code 33種類・Codex 12種類)・タイムアウト・Stop フックの上限(8回)などの仕様は、2026年10月5日時点の公式ドキュメントによります。今後変わることがあります。
※ 画面に出した .env の中身はイメージで、本物の値ではありません。
※ ロボットのイラストはイメージで、特定の会社の製品やロゴとは関係ありません。