ããã¯ããªã«ãããããŠæžãããã®ïŒ
Claude Codeã®ãŠãŒã¶ãŒãæ¡åŒµã§ããæ©èœãèŠãŠãã£ãŠã¿ããããšãããé¡ã®ã²ãšã€ã§ãã
ä»åã¯ããã¯ã«ã€ããŠèŠãŠãããŸãã
æ¯åºŠããªãã¿ã§ãããGeminiã®ç¡æçã§Claude Codeã䜿ãããšãããšã¬ãŒããªãããçã«å³ããã£ãã§ãã
ããã¯
ããã¯ã¯ãClaude Codeã®åäœæã®æ§ã
ãªãã€ã³ãã«çµã¿èŸŒããã³ãŒã«ããã¯ã®ä»çµã¿ã§ããå®éã«ã¯ã·ã§ã«ã³ãã³ãã
åäœããŸãã
Get started with Claude Code hooks - Claude Code Docs
ãªãã¡ã¬ã³ã¹ã¯ãã¡ãã
Hooks reference - Claude Code Docs
ããã¯ã¯ãµããšãŒãžã§ã³ããã¹ãã«ãªã©ãšç°ãªããLLMã«ãã倿ã«äŸåããã«å®è¡ãããŸãããã£ãŠãClaude Codeã
ããåŠçãè¡ã£ãåŸã«ç¹å®ã®åäœã確å®ã«è¡ãããããã«ãªããŸãã
ãã£ãŠçšéã¯ä»¥äžã®ãããªãã®ã«ãªããŸãã
- éç¥
- ãã©ãŒããã¿ãŒã®é©çš
- ãã°ã®èšé²
- ãã£ãŒãããã¯
ããã¯ã¯Claude Codeãå®è¡ããŠãããŠãŒã¶ãŒã®æš©éã§åäœãããããçŸåšã®ç°å¢ã®èªèšŒæ
å ±ãªã©ã®æš©éããã®ãŸãŸ
䜿ãããšã«æ³šæããå¿
èŠããããŸãã
ããã¯å¯èœãªã€ãã³ãã¯ãã¡ãã
- PreToolUse ⊠ããŒã«åŒã³åºãã®åïŒãããã¯å¯èœïŒ
- PermissionRequest ⊠䜿çšèš±å¯ãæ±ããæïŒèš±å¯ãŸãã¯æåŠãå¯èœïŒ
- PostToolUse ⊠ããŒã«åŒã³åºãã®å®äºåŸ
- UserPromptSubmit ⊠ãŠãŒã¶ãŒãããã³ãããåŒã³åºããClaudeãåŠçããå
- Notification ⊠Claude Codeãéç¥ãéä¿¡ããæ
- Stop ⊠Claude Codeãå¿çãçµäºããæ
- SubagentStop ⊠ãµããšãŒãžã§ã³ããã¿ã¹ã¯ãå®äºããæ
- PreCompact ⊠Claude CodeãCompactionãå®è¡ããå
- SessionStart ⊠Claude Codeãæ°ããã»ãã·ã§ã³ãéå§ããããæ¢åã®ã»ãã·ã§ã³ãåéããæ
- SessionEnd ⊠Claude Codeãã»ãã·ã§ã³ãçµäºããæ
Get started with Claude Code hooks / Hook Events Overview
ããã¯ãäœæããã«ã¯/hooksã¹ã©ãã·ã¥ã³ãã³ãã䜿ãããã§ãã
Get started with Claude Code hooks / Quickstart
ããšã¯ããã¯ã®äŸãç¶ããŸããããšãã°ããŒã«ã®å®è¡ã³ãã³ããšèª¬æããã°ã«ä¿åããããã¯ã
{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "jq -r '\"\\(.tool_input.command) - \\(.tool_input.description // \"No description\")\"' >> ~/.claude/bash-command-log.txt" } ] } ] } }
ã§ãããã«ã¹ã¿ã ã¹ã©ãã·ã¥ã³ãã³ããªã©ã«æ¯ã¹ããšãå°ã説æãèãã§ããã
ãªãã¡ã¬ã³ã¹ãèŠãŠãããŸãããã
Hooks reference - Claude Code Docs
ããã¯ã¯settings.jsonã«æžãããã§ãããããã¯ã®æå¹ãªã¹ã³ãŒããåãã«ãªããŸãã
$HOME/.claude/settings.json⊠ãŠãŒã¶ãŒãæäœã§ãããããžã§ã¯ãå šäœã§å ±éã®ããã¯.claude/settings.json⊠ãããžã§ã¯ãåäœã®ããŒã ã§å ±æã§ããããã¯.claude/settings.local.json⊠ãããžã§ã¯ãåäœã ããå人ã§å©çšããããã¯- ãšã³ã¿ãŒãã©ã€ãºç®¡çããªã·ãŒã§ã®èšå®
Hooks reference / Configuration
ããã¯ã®å®çŸ©æ¹æ³ã¯ãããªæãã§ãããhooksé
äžã«é¢å¿ã®ããã€ãã³ããæžããŠããããã§ãã
{ "hooks": { "EventName": [ { "matcher": "ToolPattern", "hooks": [ { "type": "command", "command": "your-command-here" } ] } ] } }
å ·äœäŸã
{ "hooks": { "PostToolUse": [ { "matcher": "Write|Edit", "hooks": [ { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/check-style.sh" } ] } ] } }
å°ãèŠçŽ ãèŠãŠãããŸãã
- matcher ⊠ããŒã«åã«äžèŽãããã¿ãŒã³ãPreToolUseãPostToolUseãPermissionRequestã®ã¿ã«æäŸ
- åçŽãªæååã«ããå®å
šäžèŽãæ£èŠè¡šçŸã®å©çšãå¯èœã
*ãšæžããšãã¹ãŠã®ããŒã«ã«äžèŽãã
- åçŽãªæååã«ããå®å
šäžèŽãæ£èŠè¡šçŸã®å©çšãå¯èœã
- hooks ⊠ãã¿ãŒã³ãäžèŽããæã«å®è¡ããããã¯ã®é
å
- type ⊠ããã¯å®è¡ã¿ã€ããBashã³ãã³ãïŒ
commandïŒãŸãã¯LLMããŒã¹ã®è©äŸ¡çšã®ããã³ããïŒpromptïŒãæå®ãã - command ⊠typeã
commandã®å Žåã«å®è¡ããã³ãã³ããç°å¢å€æ°$CLAUDE_PROJECT_DIRãå©çšå¯èœ - prompt ⊠typeã
promptã®å Žåã«ãè©äŸ¡çšã«LLMã«éä¿¡ããããã³ãã - timeout ⊠ïŒãªãã·ã§ã³ïŒç¹å®ã®ããã¯ããã£ã³ã»ã«ãããŸã§ã®ã¿ã€ã ã¢ãŠã
- type ⊠ããã¯å®è¡ã¿ã€ããBashã³ãã³ãïŒ
typeãpromptã®å Žåã®äŸãããã¯Claudeãçµäºããæã«ã¿ã¹ã¯ã®å
容ããã¹ãŠå®äºãããŠããããã§ãã¯ããããã³ããã®
ããã§ãã
{ "hooks": { "Stop": [ { "hooks": [ { "type": "prompt", "prompt": "Evaluate if Claude should stop: $ARGUMENTS. Check if all tasks are complete." } ] } ] } }
ããã¯ããã³ããããŒã¹ã®ããã¯ãšåŒã°ããããã§ãã
Hooks reference / Prompt-Based Hooks
æåã®èª¬æãèŠããšãStopãšSubagentStopã€ãã³ãã®ã¿ã§äœ¿ããããã¯ã®ããã«æžãããŠããã®ã§ããã
Prompt-based hooks are currently only supported for Stop and SubagentStop hooks, where they enable intelligent, context-aware decisions.
ãã®åŸã®èª¬æãèŠããšãã©ã®ããã¯ã€ãã³ãã§ã䜿ããŸãããã¿ãããªããšãæžãããŠããŸããã©ã£ã¡ã§ãããâŠïŒ
Prompt-based hooks work with any hook event, but are most useful for:
Hooks reference / Prompt-Based Hooks / Supported hook events
bashã³ãã³ãã§ã®ããã¯ãšã®äœ¿ãåãã¯ãã¡ãã
Hooks reference / Prompt-Based Hooks / Comparison with bash command hooks
決ãŸã£ãããšãé«éã«å®è¡ãããå Žåã¯bashã³ãã³ãã§ã®ããã¯ã§ããã
åããã¯ã€ãã³ãã®è©³çްãã©ã®ãããªmatcherãæå®å¯èœããæžãããŠããŸãã
MCPã«å¯Ÿããmatcherãæžããããã§ãã
Hooks reference / Working with MCP Tools
ããã¯ã®å ¥åã«ã€ããŠã
ããã¯ã«ã¯ãã»ãã·ã§ã³æ å ±ãšã€ãã³ãåºæã®ããŒã¿ãå«ãJSONãæž¡ãããããã§ãã
{ // Common fields session_id: string transcript_path: string // Path to conversation JSON cwd: string // The current working directory when the hook is invoked permission_mode: string // Current permission mode: "default", "plan", "acceptEdits", or "bypassPermissions" // Event-specific fields hook_event_name: string ... }
ããšãã°PreToolUseã€ãã³ãã ãšããã®ãããªJSONã«ãªãããã§ãã
{ "session_id": "abc123", "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl", "cwd": "/Users/...", "permission_mode": "default", "hook_event_name": "PreToolUse", "tool_name": "Write", "tool_input": { "file_path": "/path/to/file.txt", "content": "file content" }, "tool_use_id": "toolu_01ABC123..." }
ããã¯ã®åºåã«ã€ããŠãããã¯ã«ãã£ãŠèµ·åãããbashã³ãã³ãã¯ãçµäºã³ãŒããæšæºåºåãæšæºãšã©ãŒåºåã®å
容ã§
Claude Codeã«ãã£ãŒãããã¯ããããã§ãã
ããã³ããããŒã¹ã®ããã¯ã®å Žåã¯ãŸãéãããã§ãã
Hooks reference / Prompt-Based Hooks / Response schema
bashã³ãã³ãã§ã®ããã¯ã«ã€ããŠèŠãŠãããŸãããã
ãŸãã¯çµäºã³ãŒãã®æ±ãããã
- çµäºã³ãŒãã0 ⊠æå
- æšæºåºåã®å 容ãClaude Codeã®ã³ã³ããã¹ãã«è¿œå ããã
- JSONåºåãè¿ãããšã§ãã詳现ã«å¶åŸ¡ãããããšãã§ãã
- çµäºã³ãŒãã2 ⊠ããããã³ã°ãšã©ãŒ
- ãã£ãŒãããã¯ã«ã¯æšæºãšã©ãŒåºåã®ã¿ã䜿ãããã圢åŒã¯
[command]: {stderr} - JSONåºåã¯äœ¿ãããªã
- ãã£ãŒãããã¯ã«ã¯æšæºãšã©ãŒåºåã®ã¿ã䜿ãããã圢åŒã¯
- ãã以å€ã®çµäºã³ãŒã ⊠éããããã³ã°ãšã©ãŒ
- æšæºãšã©ãŒåºåã®å
容ãããŠãŒã¶ãŒã«
Failed with non-blocking status code: {stderr}ãšãã圢åŒã§è¡šç€ºããã - æšæºãšã©ãŒåºåã«æžãåºããªãã£ãå Žåã¯ããŠãŒã¶ãŒã«ã¯
No stderr outputãšè¡šç€ºããã
- æšæºãšã©ãŒåºåã®å
容ãããŠãŒã¶ãŒã«
Hooks reference / Hook Output / Simple: Exit Code
çµäºã³ãŒãã0以å€ã®æã«ã¯ãæšæºåºåã¯èªãŸããªãããšã«æ³šæãå¿ èŠã§ããã
çµäºã³ãŒã2ãè¿ããæã®åäœã¯ãã¡ããããšãã°PreToolUseã§ã¯ããŒã«ã®åŒã³åºãããããã¯ããPermissionRequestã§ã¯
æš©éãæåŠããŸãã
Hooks reference / Hook Output / Simple: Exit Code / Exit Code 2 Behavior
JSONåºåããå Žåã®å 容ã¯ãã¡ãã
Hooks reference / Hook Output / Advanced: JSON Output
ã€ãã³ãã®çš®é¡ã«ããããå ±éã®ãã£ãŒã«ãã¯ãã¡ãã
{ "continue": true, // Whether Claude should continue after hook execution (default: true) "stopReason": "string", // Message shown when continue is false "suppressOutput": true, // Hide stdout from transcript mode (default: false) "systemMessage": "string" // Optional warning message shown to the user }
continueãfalseã®å Žåã¯ãClaudeã¯ããã¯å®è¡åŸã«åŠçã忢ããŸããstopReasonã¯continueãfalseã®æã«æå¹ã§ã
ãŠãŒã¶ãŒã«ã¯è¡šç€ºããClaudeã«ã¯è¡šç€ºãããªã忢çç±ãå
¥ããŸãã
suppressOutputã¯trueã«ãããšãã©ã³ã¹ã¯ãªããã¢ãŒãã®æã«æšæºåºåãå«ããªãããã«ãããã®ã§ãsystemMessageã¯
ãªãã·ã§ã³ã®ãŠãŒã¶ãŒã«è¡šç€ºããèŠåã¡ãã»ãŒãžãšãããã®ã®ããã§ãã
ããšã¯ã€ãã³ãåºæã®åºåãããããã§ãã
ããšãã°PreToolUseã
{ "hookSpecificOutput": { "hookEventName": "PreToolUse", "permissionDecision": "allow" "permissionDecisionReason": "My reason here", "updatedInput": { "field_to_modify": "new value" } } }
ãã®ãããã¯åã€ãã³ãã®å 容ãèŠãŠãããŸãããã
ããšã¯ã»ãã¥ãªãã£ãŒã«é¢ããæ³šæäºé ãããã¯ã®å®è¡ã«é¢ãã詳现ããããã°æ¹æ³ãªã©ãæžãããŠããŸãã
- Hooks reference / Security Considerations
- Hooks reference / Hook Execution Details
- Hooks reference / Debugging
ç¹ã«ã»ãã¥ãªãã£ãŒãŸããã¯èŠãŠãããæ¹ãããã§ãããããã³ãã³ãã¯å®è¡ããŠããOSãŠãŒã¶ãŒã®æš©éã§åäœããŸããã
ãã¡ã€ã«ã¢ã¯ã»ã¹ãªã©ãããã¯ã®å®çŸ©å
容ã«å®å
šã«äŸåããŸãããŸãå
¥åå€ãããªããŒã·ã§ã³ããµãã¿ã€ãºããã
ãã£ã¬ã¯ããªãŒãã©ããŒãµã«ã®ãããªè匱æ§ãäœã蟌ãŸãªãããã«æ³šæãå¿
èŠã§ãã
åçŽã«ã³ãã³ããå®è¡ããŠããã ãã ãšæãã®ã§åœããåãšããã°åœããåã§ãããããã¯ãåŒã³åºãå
ã«ãªãããŒã¿ã¯
LLMãæ±ºå®ããã®ã§ããããã€ã³ããªãã§ããããã
å®è¡ã®è©³çްã«ã€ããŠã¯ãããã©ã«ãã§ã¿ã€ã ã¢ãŠãã60ç§ã ã£ãããããã¯ã¯äžŠåå®è¡ãããããšãªã©ããã€ã³ãã§ããã
ã§ã¯ãããã¯ã䜿ã£ãŠã¿ãŸããããClaude CodeïŒClaude Code RouterïŒGeminiïŒã§è©ŠããŸãã
ç°å¢
ä»åã®ç°å¢ã¯ãã¡ãã
$ claude --version 2.0.53 (Claude Code) $ ccr version claude-code-router version: 1.0.71
Claude Code Routerã¯Geminiã䜿ãããã«èšå®ããŠããŸãã
$HOME/.claude-code-router/config.json
{ "PORT": 3456, "Providers": [ { "name": "gemini", "api_base_url": "https://generativelanguage.googleapis.com/v1beta/models/", "api_key": "xxxxx", "models": ["gemini-2.5-flash", "gemini-2.5-flash-lite", "gemini-2.5-pro"], "transformer": { "use": ["gemini"] } } ], "Router": { "default": "gemini,gemini-2.5-flash", "think": "gemini,gemini-2.5-flash", "webSearch": "gemini,gemini-2.5-flash" } }
èµ·åã
$ ccr code
ããã¯ã䜿ã£ãŠã¿ã
ãŸãã¯åŒã°ãããã©ãããããããã¯ãäœã£ãŠã¿ãŸãããã
.claude/settings.json
{ "hooks": { "PreToolUse": [ { "matcher": "Read|Edit|Write", "hooks": [ { "type": "command", "command": "cat >> log.txt" } ] } ] } }
> greeting.txtãäœæããŠãã ãããäžèº«ã¯ ããã«ã¡ã¯ ãšæžããŠãã ããã â Write(greeting.txt) â¿ Â Wrote 1 lines to greeting.txt ããã«ã¡ã¯ â greeting.txt ãäœæãããå 容ãšããŠãããã«ã¡ã¯ããæžã蟌ãŸããŸããã
ãã°ãèŠãŠã¿ãŸãããã
log.txt
{"session_id":"bf5df2eb-5cdb-48d2-a6fd-5ea043e58dfe","transcript_path":"/home/user/.claude/projects/-home-user-project/bf5df2eb-5cdb-48d2-a6fd-5ea043e58dfe.jsonl","cwd":"/home/user/project","permission_mode":"default","hook_event_name":"PreToolUse","tool_name":"Write","tool_input":{"file_path":"greeting.txt","content":"ããã«ã¡ã¯"},"tool_use_id":"ccr_tool_uc482hl90ya"}
èšé²ãããŠããŸããã
ä»åºŠã¯ãã¡ã€ã«ãèªã¿èŸŒãŸããŠã¿ãŸãã
> @greeting.txt â¿ Â Read greeting.txt (1 lines) â Read(greeting.txt) â¿ Â Read 1 line â 1âããã«ã¡ã¯
ãã°ã«è¿œèšãããŸãããããæ¹è¡ãå ¥ããã¹ãã§ããâŠã
log.txt
{"session_id":"bf5df2eb-5cdb-48d2-a6fd-5ea043e58dfe","transcript_path":"/home/user/.claude/projects/-home-user-project/bf5df2eb-5cdb-48d2-a6fd-5ea043e58dfe.jsonl","cwd":"/home/user/project","permission_mode":"default","hook_event_name":"PreToolUse","tool_name":"Write","tool_input":{"file_path":"greeting.txt","content":"ããã«ã¡ã¯"},"tool_use_id":"ccr_tool_uc482hl90ya"}{"session_id":"bf5df2eb-5cdb-48d2-a6fd-5ea043e58dfe","transcript_path":"/home/user/.claude/projects/-home-user-project/bf5df2eb-5cdb-48d2-a6fd-5ea043e58dfe.jsonl","cwd":"/home/user/project","permission_mode":"default","hook_event_name":"PreToolUse","tool_name":"Read","tool_input":{"file_path":"greeting.txt"},"tool_use_id":"ccr_tool_vzenmmxczmj"}
ã¡ãã£ãšãã©ãŒãããããŠã¿ãŸãããã
{ "session_id": "bf5df2eb-5cdb-48d2-a6fd-5ea043e58dfe", "transcript_path": "/home/user/.claude/projects/-home-user-project/bf5df2eb-5cdb-48d2-a6fd-5ea043e58dfe.jsonl", "cwd": "/home/user/project", "permission_mode": "default", "hook_event_name": "PreToolUse", "tool_name": "Write", "tool_input": { "file_path": "greeting.txt", "content": "ããã«ã¡ã¯" }, "tool_use_id": "ccr_tool_uc482hl90ya" } { "session_id": "bf5df2eb-5cdb-48d2-a6fd-5ea043e58dfe", "transcript_path": "/home/user/.claude/projects/-home-user-project/bf5df2eb-5cdb-48d2-a6fd-5ea043e58dfe.jsonl", "cwd": "/home/user/project", "permission_mode": "default", "hook_event_name": "PreToolUse", "tool_name": "Read", "tool_input": { "file_path": "greeting.txt" }, "tool_use_id": "ccr_tool_vzenmmxczmj" }
ãã¡ããšèŠæ¯ã¹ããšé°å²æ°ãããããŸããã
Hooks reference / Hook Input / PreToolUse Input
次ã¯ãQuickstartã®ãµã³ãã«ã䜿ã£ãŠã¿ãŸãããã
Get started with Claude Code hooks / Quickstart
matcherã«Bashã远å ã
.claude/settings.json
{ "hooks": { "PreToolUse": [ { "matcher": "Read|Edit|Write", "hooks": [ { "type": "command", "command": "cat >> log.txt" } ] }, { "matcher": "Bash", "hooks": [ { "type": "command", "command": "jq -r '\"\\(.tool_input.command) - \\(.tool_input.description // \"No description\")\"' >> bash-command-log.txt" } ] } ] } }
åŒã³åºããã³ãã³ããšdescriptionãèšé²ãããã¯ãã§ãã
確èªããŠã¿ãŸãããã
> çŸåšã®ç°å¢ã®Pythonã®ããŒãžã§ã³ãæããŠãã ãã â¿ Â Error: Exit code 127 /bin/bash: è¡ 1: python: ã³ãã³ããèŠã€ãããŸãã â Bash(python3 --version) â¿ Â Python 3.12.3 â çŸåšã®ç°å¢ã®Pythonã®ããŒãžã§ã³ã¯3.12.3ã§ãã
çµæã
bash-command-log.txt
python --version - Get Python version python3 --version - Get Python 3 version
OKã§ããã
é°å²æ°ã¯ããã£ãæ°ãããŸãã
ãããã«
Claude Codeã®ããã¯ã詊ããŠã¿ãŸããã
ä»åã¯ããã¥ã¡ã³ããèªããšã ãããããã£ãæ°ãããŸãããåçŽã«ç¹å®ã®ã€ãã³ãã«å¯Ÿããã³ãŒã«ããã¯ã®ä»çµã¿ãªã®ã§ã
ãã ãããã§ãã¬ãŒããªãããã«ããã£ã¡ã ãåŒã£ãããã®ã¯çžå€ããããªã®ã§ããã