Hooks ãªãã¡ã¬ã³ã¹
Claude Code ã®ãã㯠ã€ãã³ããèšå®ã¹ããŒããJSON å ¥åºå圢åŒãçµäºã³ãŒããéåæããã¯ãHTTP ããã¯ãããã³ãã ããã¯ãMCP ããŒã« ããã¯ã®ãªãã¡ã¬ã³ã¹ã
äŸãå«ãã¯ã€ãã¯ã¹ã¿ãŒã ã¬ã€ãã«ã€ããŠã¯ãã¯ãŒã¯ãããŒãããã¯ã§èªååãããåç §ããŠãã ããã
ããã¯ã¯ãClaude Code ã®ã©ã€ããµã€ã¯ã«å ã®ç¹å®ã®ãã€ã³ãã§èªåçã«å®è¡ããããŠãŒã¶ãŒå®çŸ©ã®ã·ã§ã« ã³ãã³ããHTTP ãšã³ããã€ã³ãããŸã㯠LLM ããã³ããã§ãããã®ãªãã¡ã¬ã³ã¹ã䜿çšããŠãã€ãã³ã ã¹ããŒããèšå®ãªãã·ã§ã³ãJSON å ¥åºå圢åŒãéåæããã¯ãHTTP ããã¯ãMCP ããŒã« ããã¯ãªã©ã®é«åºŠãªæ©èœãæ€çŽ¢ããŠãã ãããåããŠããã¯ãèšå®ããå Žåã¯ã代ããã«ã¬ã€ãããå§ããŠãã ããã
ãã㯠ã©ã€ããµã€ã¯ã«
ããã¯ã¯ Claude Code ã»ãã·ã§ã³äžã®ç¹å®ã®ãã€ã³ãã§çºç«ããŸããã€ãã³ããçºç«ããŠãããã£ãŒãããããããšãClaude Code ã¯ã€ãã³ãã«é¢ãã JSON ã³ã³ããã¹ãããã㯠ãã³ãã©ãŒã«æž¡ããŸããã³ãã³ã ããã¯ã®å Žåãå
¥å㯠stdin ã«å°çããŸããHTTP ããã¯ã®å ŽåãPOST ãªã¯ãšã¹ãæ¬äœãšããŠå°çããŸãããã³ãã©ãŒã¯å
¥åãæ€æ»ããã¢ã¯ã·ã§ã³ãå®è¡ãããªãã·ã§ã³ã§æ±ºå®ãè¿ãããšãã§ããŸããã€ãã³ã㯠3 ã€ã®ã±ã€ãã³ã¹ã«åé¡ãããŸããã»ãã·ã§ã³ããšã« 1 åïŒSessionStartãSessionEndïŒãã¿ãŒã³ããšã« 1 åïŒUserPromptSubmitãStopãStopFailureïŒãagentic ã«ãŒãå
ã®ãã¹ãŠã®ããŒã«åŒã³åºãã§ïŒPreToolUseãPostToolUseïŒã§ãã
以äžã®è¡šã¯ãåã€ãã³ãããã€çºç«ãããããŸãšããŠããŸãããã㯠ã€ãã³ãã»ã¯ã·ã§ã³ã§ã¯ãåã€ãã³ãã®å®å šãªå ¥åã¹ããŒããšæ±ºå®å¶åŸ¡ãªãã·ã§ã³ã«ã€ããŠèª¬æããŠããŸãã
| Event | When it fires |
|---|---|
SessionStart |
When a session begins or resumes |
Setup |
When you start Claude Code with --init-only, or with --init or --maintenance in -p mode. For one-time preparation in CI or scripts |
UserPromptSubmit |
When you submit a prompt, before Claude processes it |
UserPromptExpansion |
When a user-typed command expands into a prompt, before it reaches Claude. Can block the expansion |
PreToolUse |
Before a tool call executes. Can block it |
PermissionRequest |
When a permission dialog appears |
PermissionDenied |
When a tool call is denied by the auto mode classifier. Return {retry: true} to tell the model it may retry the denied tool call |
PostToolUse |
After a tool call succeeds |
PostToolUseFailure |
After a tool call fails |
PostToolBatch |
After a full batch of parallel tool calls resolves, before the next model call |
Notification |
When Claude Code sends a notification |
SubagentStart |
When a subagent is spawned |
SubagentStop |
When a subagent finishes |
TaskCreated |
When a task is being created via TaskCreate |
TaskCompleted |
When a task is being marked as completed |
Stop |
When Claude finishes responding |
StopFailure |
When the turn ends due to an API error. Output and exit code are ignored |
TeammateIdle |
When an agent team teammate is about to go idle |
InstructionsLoaded |
When a CLAUDE.md or .claude/rules/*.md file is loaded into context. Fires at session start and when files are lazily loaded during a session |
ConfigChange |
When a configuration file changes during a session |
CwdChanged |
When the working directory changes, for example when Claude executes a cd command. Useful for reactive environment management with tools like direnv |
FileChanged |
When a watched file changes on disk. The matcher field specifies which filenames to watch |
WorktreeCreate |
When a worktree is being created via --worktree or isolation: "worktree". Replaces default git behavior |
WorktreeRemove |
When a worktree is being removed, either at session exit or when a subagent finishes |
PreCompact |
Before context compaction |
PostCompact |
After context compaction completes |
Elicitation |
When an MCP server requests user input during a tool call |
ElicitationResult |
After a user responds to an MCP elicitation, before the response is sent back to the server |
SessionEnd |
When a session terminates |
ããã¯ãã©ã®ããã«è§£æ±ºãããã
ãããã®éšåãã©ã®ããã«çµã¿åãããããçè§£ããããã«ãç Žå£çãªã·ã§ã« ã³ãã³ãããããã¯ãã PreToolUse ããã¯ãèããŠã¿ãŸããããmatcher 㯠Bash ããŒã«åŒã³åºãã«çµã蟌ã¿ãif æ¡ä»¶ã¯ rm * ã«ãããããã³ãã³ãã«ããã«çµã蟌ããããblock-rm.sh ã¯äž¡æ¹ã®ãã£ã«ã¿ãŒãããããããšãã®ã¿çæãããŸãã
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"if": "Bash(rm *)",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.sh",
"args": []
}
]
}
]
}
}
ã¹ã¯ãªãã㯠stdin ãã JSON å
¥åãèªã¿åããã³ãã³ããæœåºããrm -rf ãå«ãŸããŠããå Žå㯠permissionDecision ãšã㊠"deny" ãè¿ããŸãã
#!/bin/bash
# .claude/hooks/block-rm.sh
COMMAND=$(jq -r '.tool_input.command')
if echo "$COMMAND" | grep -q 'rm -rf'; then
jq -n '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: "Destructive command blocked by hook"
}
}'
else
exit 0 # allow the command
fi
ããã§ Claude Code ã Bash "rm -rf /tmp/build" ãå®è¡ããããšã«ãããšããŸãã以äžãèµ·ãããŸãã
ã€ãã³ããçºç«
PreToolUse ã€ãã³ããçºç«ããŸããClaude Code ã¯ããŒã«å
¥åã JSON ãšã㊠stdin ã®ããã¯ã«éä¿¡ããŸãã
{ "tool_name": "Bash", "tool_input": { "command": "rm -rf /tmp/build" }, ... }
ãããã£ãŒããã§ãã¯
ãããã£ãŒ "Bash" ãããŒã«åã«ãããããããããã®ãã㯠ã°ã«ãŒããã¢ã¯ãã£ãã«ãªããŸãããããã£ãŒãçç¥ããã "*" ã䜿çšãããšãã°ã«ãŒãã¯ã€ãã³ãã®ãã¹ãŠã®åºçŸã§ã¢ã¯ãã£ãã«ãªããŸãã
If æ¡ä»¶ããã§ãã¯
if æ¡ä»¶ "Bash(rm *)" 㯠rm -rf /tmp/build ã rm * ã«ããããããµãã³ãã³ãã§ãããããããããããããã®ãã³ãã©ãŒãçæãããŸããã³ãã³ãã npm test ã ã£ãå Žåãif ãã§ãã¯ã¯å€±æããblock-rm.sh ã¯å®è¡ããããããã»ã¹çæã®ãªãŒããŒããããåé¿ããŸããif ãã£ãŒã«ãã¯ãªãã·ã§ã³ã§ãããªããã°ããããããã°ã«ãŒãå
ã®ãã¹ãŠã®ãã³ãã©ãŒãå®è¡ãããŸãã
ãã㯠ãã³ãã©ãŒãå®è¡
ã¹ã¯ãªããã¯å®å
šãªã³ãã³ããæ€æ»ããrm -rf ãèŠã€ãããããstdout ã«æ±ºå®ãåºåããŸãã
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "Destructive command blocked by hook"
}
}
ã³ãã³ããå®å
šã ã£ãå ŽåïŒrm file.txt ãªã©ïŒãã¹ã¯ãªããã¯ä»£ããã« exit 0 ã«å°éãããã㯠Claude Code ã«ããŒã«åŒã³åºããèš±å¯ããããæç€ºããŸãã
Claude Code ãçµæã«åºã¥ããŠè¡å
Claude Code 㯠JSON 決å®ãèªã¿åããããŒã«åŒã³åºãããããã¯ããClaude ã«çç±ã衚瀺ããŸãã
以äžã®èšå®ã»ã¯ã·ã§ã³ã§ã¯å®å šãªã¹ããŒãã«ã€ããŠèª¬æããåãã㯠ã€ãã³ãã»ã¯ã·ã§ã³ã§ã¯ãã³ãã³ããåãåãå ¥åãšè¿ãããšãã§ããåºåã«ã€ããŠèª¬æããŠããŸãã
èšå®
ããã¯ã¯ JSON èšå®ãã¡ã€ã«ã§å®çŸ©ãããŸããèšå®ã«ã¯ 3 ã€ã®ãã¹ãã¬ãã«ããããŸãã
- å¿çãããã㯠ã€ãã³ããéžæããŸãïŒ
PreToolUseãStopãªã©ïŒ - çºç«ããã¿ã€ãã³ã°ããã£ã«ã¿ãªã³ã°ãããããã£ãŒ ã°ã«ãŒãã远å ããŸãïŒ'Bash ããŒã«ã®ã¿'ãªã©ïŒ
- ããããããšãã«å®è¡ãã 1 ã€ä»¥äžã®ãã㯠ãã³ãã©ãŒãå®çŸ©ããŸã
å®å šãªãŠã©ãŒã¯ã¹ã«ãŒãšæ³šéä»ãã®äŸã«ã€ããŠã¯ãäžèšã®ããã¯ãã©ã®ããã«è§£æ±ºãããããåç §ããŠãã ããã
ãã®ããŒãžã§ã¯åã¬ãã«ã«ç¹å®ã®çšèªã䜿çšããŠããŸãããã㯠ã€ãã³ãã¯ã©ã€ããµã€ã¯ã« ãã€ã³ãããããã£ãŒ ã°ã«ãŒãã¯ãã£ã«ã¿ãŒããã㯠ãã³ãã©ãŒã¯ã·ã§ã« ã³ãã³ããHTTP ãšã³ããã€ã³ããMCP ããŒã«ãããã³ããããŸãã¯å®è¡ããããšãŒãžã§ã³ãã§ãã'ããã¯'åç¬ã¯äžè¬çãªæ©èœãæããŸãã
ããã¯äœçœ®
ããã¯ãå®çŸ©ããå Žæã«ãã£ãŠããã®ã¹ã³ãŒããæ±ºãŸããŸãã
| äœçœ® | ã¹ã³ãŒã | å ±æå¯èœ |
|---|---|---|
~/.claude/settings.json |
ãã¹ãŠã®ãããžã§ã¯ã | ãããããã·ã³ã«ããŒã«ã« |
.claude/settings.json |
åäžãããžã§ã¯ã | ã¯ãããªããžããªã«ã³ãããå¯èœ |
.claude/settings.local.json |
åäžãããžã§ã¯ã | ããããgitignored |
| 管çããªã·ãŒèšå® | çµç¹å šäœ | ã¯ãã管çè ãå¶åŸ¡ |
ãã©ã°ã€ã³ hooks/hooks.json |
ãã©ã°ã€ã³ãæå¹ãªå Žå | ã¯ãããã©ã°ã€ã³ã«ãã³ãã« |
| ã¹ãã«ãŸãã¯ãšãŒãžã§ã³ãããã³ããã¿ãŒ | ã³ã³ããŒãã³ããã¢ã¯ãã£ããªå Žå | ã¯ããã³ã³ããŒãã³ã ãã¡ã€ã«ã§å®çŸ© |
èšå®ãã¡ã€ã«è§£æ±ºã®è©³çްã«ã€ããŠã¯ãèšå®ãåç
§ããŠãã ããããšã³ã¿ãŒãã©ã€ãºç®¡çè
㯠allowManagedHooksOnly ã䜿çšããŠããŠãŒã¶ãŒããããžã§ã¯ãããã©ã°ã€ã³ ããã¯ããããã¯ã§ããŸãã管çèšå®ã§ force-enabled ããããã©ã°ã€ã³ããã®ããã¯ã¯é€å€ãããããã管çè
ã¯çµç¹ããŒã±ãããã¬ã€ã¹ãéããŠæ€èšŒæžã¿ã®ããã¯ãé
åžã§ããŸããããã¯èšå®ãåç
§ããŠãã ããã
ãããã£ãŒ ãã¿ãŒã³
matcher ãã£ãŒã«ãã¯ãããã¯ãçºç«ããã¿ã€ãã³ã°ããã£ã«ã¿ãªã³ã°ããŸãããããã£ãŒã®è©äŸ¡æ¹æ³ã¯ãå«ãŸããŠããæåã«äŸåããŸãã
| ãããã£ãŒå€ | è©äŸ¡æ¹æ³ | äŸ |
|---|---|---|
"*"ã""ããŸãã¯çç¥ |
ãã¹ãŠã«ããã | ã€ãã³ãã®ãã¹ãŠã®åºçŸã§çºç« |
æåãæ°åã_ã| ã®ã¿ |
å®å
šäžèŽããŸã㯠| ã§åºåãããå®å
šäžèŽã®ãªã¹ã |
Bash 㯠Bash ããŒã«ã®ã¿ã«ããããEdit|Write ã¯ããããã®ããŒã«ã«å®å
šã«ããã |
| ãã®ä»ã®æåãå«ã | JavaScript æ£èŠè¡šçŸ | ^Notebook 㯠Notebook ã§å§ãŸãããŒã«ã«ããããmcp__memory__.* 㯠memory ãµãŒããŒã®ãã¹ãŠã®ããŒã«ã«ããã |
FileChanged ã€ãã³ãã¯ç£èŠãªã¹ããæ§ç¯ãããšãã«ãããã®ã«ãŒã«ã«åŸããŸãããFileChangedãåç
§ããŠãã ããã
åã€ãã³ã ã¿ã€ãã¯ç°ãªããã£ãŒã«ãã§ãããããŸãã
| ã€ãã³ã | ãããã£ãŒããã£ã«ã¿ãªã³ã°ãããã® | ãããã£ãŒå€ã®äŸ |
|---|---|---|
PreToolUseãPostToolUseãPostToolUseFailureãPermissionRequestãPermissionDenied |
ããŒã«å | BashãEdit|Writeãmcp__.* |
SessionStart |
ã»ãã·ã§ã³ã®éå§æ¹æ³ | startupãresumeãclearãcompact |
Setup |
ã»ããã¢ãããããªã¬ãŒãã CLI ãã©ã° | initãmaintenance |
SessionEnd |
ã»ãã·ã§ã³ãçµäºããçç± | clearãresumeãlogoutãprompt_input_exitãbypass_permissions_disabledãother |
Notification |
éç¥ã¿ã€ã | permission_promptãidle_promptãauth_successãelicitation_dialogãelicitation_completeãelicitation_response |
SubagentStart |
ãšãŒãžã§ã³ã ã¿ã€ã | general-purposeãExploreãPlanããŸãã¯ã«ã¹ã¿ã ãšãŒãžã§ã³ãå |
PreCompactãPostCompact |
ã³ã³ãã¯ã·ã§ã³ãããªã¬ãŒãããã® | manualãauto |
SubagentStop |
ãšãŒãžã§ã³ã ã¿ã€ã | SubagentStart ãšåãå€ |
ConfigChange |
èšå®ãœãŒã¹ | user_settingsãproject_settingsãlocal_settingsãpolicy_settingsãskills |
CwdChanged |
ãããã£ãŒ ãµããŒããªã | ãã¹ãŠã®ãã£ã¬ã¯ããªå€æŽã§åžžã«çºç« |
FileChanged |
ç£èŠãããªãã©ã« ãã¡ã€ã«åïŒFileChangedãåç §ïŒ | .envrc|.env |
StopFailure |
ãšã©ãŒ ã¿ã€ã | rate_limitãauthentication_failedãoauth_org_not_allowedãbilling_errorãinvalid_requestãserver_errorãmax_output_tokensãunknown |
InstructionsLoaded |
ããŒãçç± | session_startãnested_traversalãpath_glob_matchãincludeãcompact |
UserPromptExpansion |
ã³ãã³ãå | ã¹ãã«ãŸãã¯ã³ãã³ãå |
Elicitation |
MCP ãµãŒããŒå | èšå®ããã MCP ãµãŒããŒå |
ElicitationResult |
MCP ãµãŒããŒå | Elicitation ãšåãå€ |
UserPromptSubmitãPostToolBatchãStopãTeammateIdleãTaskCreatedãTaskCompletedãWorktreeCreateãWorktreeRemove |
ãããã£ãŒ ãµããŒããªã | ãã¹ãŠã®åºçŸã§åžžã«çºç« |
ãããã£ãŒã¯ãClaude Code ãããã¯ã« stdin ã§éä¿¡ããJSON å
¥åããã®ãã£ãŒã«ãã«å¯ŸããŠå®è¡ãããŸããããŒã« ã€ãã³ãã®å Žåããã®ãã£ãŒã«ã㯠tool_name ã§ããåãã㯠ã€ãã³ãã»ã¯ã·ã§ã³ã§ã¯ããããã£ãŒå€ã®å®å
šãªã»ãããšãã®ã€ãã³ãã®å
¥åã¹ããŒãããªã¹ãããŠããŸãã
ãã®äŸã¯ãClaude ããã¡ã€ã«ãæžã蟌ããŸãã¯ç·šéãããšãã«ã®ã¿ linting ã¹ã¯ãªãããå®è¡ããŸãã
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "/path/to/lint-check.sh"
}
]
}
]
}
}
UserPromptSubmitãPostToolBatchãStopãTeammateIdleãTaskCreatedãTaskCompletedãWorktreeCreateãWorktreeRemoveãCwdChanged ã¯ãããã£ãŒããµããŒãããããã¹ãŠã®åºçŸã§åžžã«çºç«ããŸãããããã®ã€ãã³ãã« matcher ãã£ãŒã«ãã远å ãããšããµã€ã¬ã³ãã«ç¡èŠãããŸãã
ããŒã« ã€ãã³ãã®å Žåãåå¥ã®ãã㯠ãã³ãã©ãŒã§ if ãã£ãŒã«ããèšå®ããããšã§ãããçããã£ã«ã¿ãªã³ã°ã§ããŸããif ã¯æš©éã«ãŒã«æ§æã䜿çšããŠããŒã«åãšåŒæ°ãäžç·ã«ãããããããã"Bash(git *)" 㯠git * ã«äžèŽãã Bash å
¥åã®ãµãã³ãã³ãã®ããããã«å¯ŸããŠå®è¡ããã"Edit(*.ts)" 㯠TypeScript ãã¡ã€ã«ã®ã¿ã«å¯ŸããŠå®è¡ãããŸãã
MCP ããŒã«ãããã
MCP ãµãŒã㌠ããŒã«ã¯ããŒã« ã€ãã³ãïŒPreToolUseãPostToolUseãPostToolUseFailureãPermissionRequestãPermissionDeniedïŒã§éåžžã®ããŒã«ãšããŠè¡šç€ºããããããä»ã®ããŒã«åãšåãæ¹æ³ã§ãããã§ããŸãã
MCP ããŒã«ã¯ mcp__<server>__<tool> ãšããåœåãã¿ãŒã³ã«åŸããŸããäŸãã°ã
mcp__memory__create_entities: Memory ãµãŒããŒã® create entities ããŒã«mcp__filesystem__read_file: Filesystem ãµãŒããŒã® read file ããŒã«mcp__github__search_repositories: GitHub ãµãŒããŒã® search ããŒã«
ãã¹ãŠã®ããŒã«ããµãŒããŒãããããããã«ã¯ããµãŒã㌠ãã¬ãã£ãã¯ã¹ã« .* ã远å ããŸãã.* ã¯å¿
é ã§ããmcp__memory ã®ãããªãããã£ãŒã¯æåãšã¢ã³ããŒã¹ã³ã¢ã®ã¿ãå«ããããå®å
šäžèŽãšããŠæ¯èŒãããããŒã«ã«ãããããŸããã
mcp__memory__.*ã¯memoryãµãŒããŒã®ãã¹ãŠã®ããŒã«ã«ãããmcp__.*__write.*ã¯ä»»æã®ãµãŒããŒãããwriteãã§å§ãŸãããŒã«ã«ããã
ãã®äŸã¯ããã¹ãŠã®ã¡ã¢ãª ãµãŒããŒæäœããã°ããä»»æã® MCP ãµãŒããŒããã®æžãèŸŒã¿æäœãæ€èšŒããŸãã
{
"hooks": {
"PreToolUse": [
{
"matcher": "mcp__memory__.*",
"hooks": [
{
"type": "command",
"command": "echo 'Memory operation initiated' >> ~/mcp-operations.log"
}
]
},
{
"matcher": "mcp__.*__write.*",
"hooks": [
{
"type": "command",
"command": "/home/user/scripts/validate-mcp-write.py"
}
]
}
]
}
}
ãã㯠ãã³ãã©ãŒ ãã£ãŒã«ã
å
åŽã® hooks é
åã®åãªããžã§ã¯ãã¯ãã㯠ãã³ãã©ãŒã§ãããããã£ãŒãããããããšãã«å®è¡ãããã·ã§ã« ã³ãã³ããHTTP ãšã³ããã€ã³ããMCP ããŒã«ãLLM ããã³ããããŸãã¯ãšãŒãžã§ã³ãã§ãã5 ã€ã®ã¿ã€ãããããŸãã
- ã³ãã³ã ãã㯠ïŒ
type: "command"ïŒ: ã·ã§ã« ã³ãã³ããå®è¡ããŸããã¹ã¯ãªããã¯ã€ãã³ãã®JSON å ¥åã stdin ã§åãåããçµäºã³ãŒããš stdout ãéããŠçµæãéä¿¡ããŸãã - HTTP ãã㯠ïŒ
type: "http"ïŒ: ã€ãã³ãã® JSON å ¥åã HTTP POST ãªã¯ãšã¹ããšã㊠URL ã«éä¿¡ããŸãããšã³ããã€ã³ãã¯ãã³ãã³ã ããã¯ãšåãJSON åºå圢åŒã䜿çšããŠãã¬ã¹ãã³ã¹æ¬äœãéããŠçµæãéä¿¡ããŸãã - MCP ããŒã« ãã㯠ïŒ
type: "mcp_tool"ïŒ: æ¢ã«æ¥ç¶ãããŠããMCP ãµãŒããŒäžã®ããŒã«ãåŒã³åºããŸããããŒã«ã®ããã¹ãåºåã¯ã³ãã³ã ãã㯠stdout ã®ããã«æ±ãããŸãã - ããã³ãã ãã㯠ïŒ
type: "prompt"ïŒ: Claude ã¢ãã«ã«ããã³ãããéä¿¡ããŠãåäžã¿ãŒã³ã®è©äŸ¡ãè¡ããŸããã¢ãã«ã¯ yes/no 決å®ã JSON ãšããŠè¿ããŸããããã³ãã ããŒã¹ã®ããã¯ãåç §ããŠãã ããã - ãšãŒãžã§ã³ã ãã㯠ïŒ
type: "agent"ïŒ: ReadãGrepãGlob ãªã©ã®ããŒã«ã䜿çšããŠæ¡ä»¶ãæ€èšŒããŠããæ±ºå®ãè¿ãããšãã§ãããµããšãŒãžã§ã³ããçæããŸãããšãŒãžã§ã³ã ããã¯ã¯å®éšçã§ããã倿Žãããå¯èœæ§ããããŸãããšãŒãžã§ã³ã ããŒã¹ã®ããã¯ãåç §ããŠãã ããã
å ±éãã£ãŒã«ã
ãããã®ãã£ãŒã«ãã¯ãã¹ãŠã®ãã㯠ã¿ã€ãã«é©çšãããŸãã
| ãã£ãŒã«ã | å¿ é | 説æ |
|---|---|---|
type |
ã¯ã | "command"ã"http"ã"mcp_tool"ã"prompt"ããŸã㯠"agent" |
if |
ããã | "Bash(git *)" ãŸã㯠"Edit(*.ts)" ãªã©ã®æš©éã«ãŒã«æ§æã䜿çšããŠãã®ããã¯ãå®è¡ãããã¿ã€ãã³ã°ããã£ã«ã¿ãªã³ã°ããŸããããŒã«åŒã³åºãããã¿ãŒã³ã«ãããããå Žåã®ã¿ãããã¯ãçæãããŸãããŸã㯠Bash ã³ãã³ããè§£æããã«ã¯è€éãããå ŽåãããŒã« ã€ãã³ãã§ã®ã¿è©äŸ¡ãããŸããPreToolUseãPostToolUseãPostToolUseFailureãPermissionRequestãPermissionDeniedãä»ã®ã€ãã³ãã§ã¯ãif ãèšå®ãããããã¯ã¯å®è¡ãããŸãããæš©éã«ãŒã«ãšåãæ§æã䜿çšããŸã |
timeout |
ããã | ãã£ã³ã»ã«ãŸã§ã®ç§æ°ãããã©ã«ã: commandãhttpãmcp_tool 㯠600ãprompt 㯠30ãagent 㯠60ãUserPromptSubmit 㯠commandãhttpãmcp_tool ã®ããã©ã«ãã 30 ã«äœäžãããŸã |
statusMessage |
ããã | ããã¯ã®å®è¡äžã«è¡šç€ºãããã«ã¹ã¿ã ã¹ãã㌠ã¡ãã»ãŒãž |
once |
ããã | true ã®å Žåãã»ãã·ã§ã³ããšã« 1 åã ãå®è¡ããŠããåé€ãããŸããã¹ãã« ããã³ããã¿ãŒã§ã®ã¿å°éãããŸããèšå®ãã¡ã€ã«ãšãšãŒãžã§ã³ã ããã³ããã¿ãŒã§ã¯ç¡èŠãããŸã |
if ãã£ãŒã«ãã¯æ£ç¢ºã« 1 ã€ã®æš©éã«ãŒã«ãä¿æããŸããã«ãŒã«ãçµã¿åãããããã® &&ã||ããŸãã¯ãªã¹ãæ§æã¯ãããŸãããè€æ°ã®æ¡ä»¶ãé©çšããã«ã¯ã忡件ã«å¯ŸããŠåå¥ã®ãã㯠ãã³ãã©ãŒãå®çŸ©ããŸããBash ã®å Žåãã«ãŒã«ã¯å
é ã® VAR=value å²ãåœãŠãåé€ãããåŸã®ããŒã«å
¥åã®åãµãã³ãã³ãã«å¯ŸããŠãããããããããif: "Bash(git push *)" 㯠FOO=bar git push ãš npm test && git push ã®äž¡æ¹ã«ãããããŸããã³ãã³ããè§£æããã«ã¯è€éãããå Žåãããããã®ãµãã³ãã³ããããããããšããŸãã¯ãã€ã§ãããã¯ãå®è¡ãããŸãã
ã³ãã³ã ãã㯠ãã£ãŒã«ã
å ±éãã£ãŒã«ãã«å ããŠãã³ãã³ã ããã¯ã¯ãããã®ãã£ãŒã«ããåãå ¥ããŸãã
| ãã£ãŒã«ã | å¿ é | 説æ |
|---|---|---|
command |
ã¯ã | å®è¡ããã·ã§ã« ã³ãã³ããargs ã䜿çšããå ŽåãçŽæ¥çæããå®è¡å¯èœãã¡ã€ã«ãExec ãã©ãŒã ãšã·ã§ã« ãã©ãŒã ãåç
§ããŠãã ãã |
args |
ããã | åŒæ°ãªã¹ããååšããå Žåãcommand ã¯å®è¡å¯èœãã¡ã€ã«ãšããŠè§£æ±ºãããargs ãåŒæ°ãã¯ãã«ãšããŠçŽæ¥çæãããŸããã·ã§ã«ã¯é¢äžããŸãããExec ãã©ãŒã ãšã·ã§ã« ãã©ãŒã ãåç
§ããŠãã ãã |
async |
ããã | true ã®å Žåããããã¯ããã«ããã¯ã°ã©ãŠã³ãã§å®è¡ãããŸããããã¯ã°ã©ãŠã³ãã§ããã¯ãå®è¡ãåç
§ããŠãã ãã |
asyncRewake |
ããã | true ã®å Žåãããã¯ã°ã©ãŠã³ãã§å®è¡ãããçµäºã³ãŒã 2 ã§ Claude ãèµ·åããŸããasync ãæé»çã«æå®ããŸããããã¯ã® stderrããŸã㯠stderr ã空ã®å Žå㯠stdout ããClaude ãã·ã¹ãã ãªãã€ã³ããŒãšããŠé·æéå®è¡ãããããã¯ã°ã©ãŠã³ã倱æã«åå¿ã§ããããã«è¡šç€ºãããŸã |
shell |
ããã | ãã®ããã¯ã«äœ¿çšããã·ã§ã«ã"bash"ïŒããã©ã«ãïŒãŸã㯠"powershell" ãåãå
¥ããŸãã"powershell" ãèšå®ãããšãWindows äžã§ PowerShell çµç±ã§ã³ãã³ããå®è¡ãããŸããCLAUDE_CODE_USE_POWERSHELL_TOOL ã¯äžèŠã§ããããã¯ã¯ PowerShell ãçŽæ¥çæãããããargs ãèšå®ãããŠããå Žåã¯ç¡èŠãããŸã |
Exec ãã©ãŒã ãšã·ã§ã« ãã©ãŒã
ã³ãã³ã ããã¯ã¯ args ãèšå®ãããŠããå Žå㯠exec ãã©ãŒã ã§å®è¡ãããargs ãçç¥ãããŠããå Žåã¯ã·ã§ã« ãã©ãŒã ã§å®è¡ãããŸããããã¯ããã¹ ãã¬ãŒã¹ãã«ããŒãåç
§ããå Žåã¯åžžã« args ãèšå®ããŠãã ãããåèŠçŽ ã¯åŒçšç¬Šãªãã§ 1 ã€ã®åŒæ°ãšããŠæž¡ãããããã§ãããã€ãã && ãªã©ã®ã·ã§ã«æ©èœãå¿
èŠãªå ŽåããŸãã¯äž¡æ¹ã®æžå¿µãé©çšãããªãå Žå㯠args ãçç¥ããŠãã ããã
Exec ãã©ãŒã 㯠args ãååšããå Žåã«å®è¡ãããŸããClaude Code 㯠command ã PATH äžã®å®è¡å¯èœãã¡ã€ã«ãšããŠè§£æ±ºããargs ãåŒæ°ãã¯ãã«ãšããŠçŽæ¥çæããŸããã·ã§ã«ããªããããå args èŠçŽ ã¯èšè¿°ããããšããã«æ£ç¢ºã« 1 ã€ã®åŒæ°ã§ããã${CLAUDE_PLUGIN_ROOT} ãªã©ã®ãã¹ ãã¬ãŒã¹ãã«ããŒã¯ command ãšå args èŠçŽ ã«ãã¬ãŒã³æååãšããŠçœ®æãããŸããã¢ãã¹ãããã£ã$ãããã¯ã¯ã©ãŒããªã©ã®ç¹æ®æåã¯ãã·ã§ã«ãè§£éããªãããããã®ãŸãŸæž¡ãããŸãããã©ãããã©ãŒã äžã§ã·ã§ã« ããŒã¯ã³åã¯çºçããŸããã
ã·ã§ã« ãã©ãŒã 㯠args ãååšããªãå Žåã«å®è¡ãããŸããcommand æååã¯ã·ã§ã«ã«æž¡ãããŸããmacOS ãš Linux ã§ã¯ sh -cãWindows ã§ã¯ Git BashããŸã㯠Git Bash ãã€ã³ã¹ããŒã«ãããŠããªãå Žå㯠PowerShellãshell ãã£ãŒã«ããèšå®ããŠæç€ºçã«éžæããŸããã·ã§ã«ã¯æååãããŒã¯ã³åãã倿°ãå±éãããã€ãã&&ããªãã€ã¬ã¯ããã°ãããè§£éããŸãã
Windows ã§ã¯ãexec ãã©ãŒã 㯠command ã .exe ãªã©ã®å®éã®å®è¡å¯èœãã¡ã€ã«ã«è§£æ±ºãããããšãå¿
èŠã§ããnpmãnpxãeslintãããã³ãã®ä»ã®ããŒã«ã node_modules/.bin ã«ã€ã³ã¹ããŒã«ãã .cmd ãš .bat ã·ã ã¯å®è¡å¯èœãã¡ã€ã«ã§ã¯ãªããã·ã§ã«ãªãã§çæããããšã¯ã§ããŸãããexec ãã©ãŒã ã§ããããå®è¡ããã«ã¯ãåºã«ãªãã¹ã¯ãªããã node ã§çŽæ¥åŒã³åºããŸããäŸãã° "command": "node", "args": ["${CLAUDE_PLUGIN_ROOT}/node_modules/eslint/bin/eslint.js"]ãnode ãã©ã¹ ã¹ã¯ãªãã ãã¹ ãã¿ãŒã³ã¯ãnode.exe ãå®éã®ãã€ããªã§ããããããã¹ãŠã®ãã©ãããã©ãŒã ã§æ©èœããŸãã.cmd ãŸã㯠.bat ã·ã ãååã§å®è¡ããã«ã¯ãã·ã§ã« ãã©ãŒã ã䜿çšããŸãã
ãã®äŸã¯ããã©ã°ã€ã³ã«ãã³ãã«ããã Node ã¹ã¯ãªãããå®è¡ããŸããExec ãã©ãŒã ã¯è§£æ±ºãããã¹ã¯ãªãã ãã¹ãåŒçšç¬Šãªãã§ 1 ã€ã®åŒæ°ãšããŠæž¡ããŸãã
{
"type": "command",
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/scripts/format.js", "--fix"]
}
åçã®ã·ã§ã« ãã©ãŒã ã¯ãã¹ããŒã¹ãŸãã¯ç¹æ®æåãå«ããã¹ãåŠçããããã«åŒçšç¬Šãå¿ èŠã§ãã
{
"type": "command",
"command": "node \"${CLAUDE_PLUGIN_ROOT}\"/scripts/format.js --fix"
}
äž¡æ¹ã®ãã©ãŒã ã¯åããã¹ ãã¬ãŒã¹ãã«ããŒããµããŒãããäž¡æ¹ãšãçæãããããã»ã¹ã§ç°å¢å€æ° CLAUDE_PROJECT_DIRãCLAUDE_PLUGIN_ROOTãCLAUDE_PLUGIN_DATA ãšããŠãšã¯ã¹ããŒããããããã¹ã¯ãªããã¯èµ·åæ¹æ³ã«é¢ä¿ãªã process.env.CLAUDE_PLUGIN_ROOT ãèªã¿åãããšãã§ããŸãããã©ã°ã€ã³ ããã¯ã¯è¿œå ã§ ${user_config.*} å€ã眮æããŸãããŠãŒã¶ãŒèšå®ãåç
§ããŠãã ããã
Exec ãã©ãŒã ã§ã¯ãcommand ã¯å®è¡å¯èœãã¡ã€ã«åãŸãã¯ãã¹ã®ã¿ã§ããcommand ã空çœãå«ããã¹åºåããªãã®ååã§ãããargs ãšäžç·ã«ç©ºçœãå«ãå ŽåãClaude Code ã¯èŠåããã°ããŸããçæã倱æããããã§ããnode script.js ãšããååã®å®è¡å¯èœãã¡ã€ã«ã¯ãããŸãããäœåãªããŒã¯ã³ã args ã«ç§»åããŸããC:\Program Files\nodejs\node.exe ãªã©ã®ã¹ããŒã¹ãå«ã絶察ãã¹ã¯ãåäžã®æå¹ãªå®è¡å¯èœãã¡ã€ã«ã§ãããèŠåãããªã¬ãŒããŸããã
HTTP ãã㯠ãã£ãŒã«ã
å ±éãã£ãŒã«ãã«å ããŠãHTTP ããã¯ã¯ãããã®ãã£ãŒã«ããåãå ¥ããŸãã
| ãã£ãŒã«ã | å¿ é | 説æ |
|---|---|---|
url |
ã¯ã | POST ãªã¯ãšã¹ããéä¿¡ãã URL |
headers |
ããã | ããŒå€ãã¢ãšããŠã®è¿œå HTTP ããããŒãå€ã¯ $VAR_NAME ãŸã㯠${VAR_NAME} æ§æã䜿çšããç°å¢å€æ°è£éããµããŒãããŸããallowedEnvVars ã«ãªã¹ããããŠãã倿°ã®ã¿ã解決ãããŸã |
allowedEnvVars |
ããã | ããããŒå€ã«è£éãããå¯èœæ§ã®ããç°å¢å€æ°åã®ãªã¹ãããªã¹ããããŠããªã倿°ãžã®åç §ã¯ç©ºã®æååã«çœ®ãæããããŸããç°å¢å€æ°è£éãæ©èœããããã«å¿ é |
Claude Code ã¯ããã¯ã®JSON å
¥åã Content-Type: application/json ã® POST ãªã¯ãšã¹ãæ¬äœãšããŠéä¿¡ããŸããã¬ã¹ãã³ã¹æ¬äœã¯ã³ãã³ã ããã¯ãšåãJSON åºå圢åŒã䜿çšããŸãã
ãšã©ãŒåŠçã¯ã³ãã³ã ããã¯ãšç°ãªããŸãã2xx 以å€ã®ã¬ã¹ãã³ã¹ãæ¥ç¶å€±æãã¿ã€ã ã¢ãŠãã¯ãã¹ãŠãå®è¡ãç¶è¡ã§ããéããããã³ã° ãšã©ãŒãçæããŸããããŒã«åŒã³åºãããããã¯ãŸãã¯æš©éãæåŠããã«ã¯ãdecision: "block" ãŸã㯠hookSpecificOutput ãå«ã permissionDecision: "deny" ãå«ã JSON æ¬äœãæã€ 2xx ã¬ã¹ãã³ã¹ãè¿ããŸãã
ãã®äŸã¯ PreToolUse ã€ãã³ããããŒã«ã«æ€èšŒãµãŒãã¹ã«éä¿¡ããMY_TOKEN ç°å¢å€æ°ããã®ããŒã¯ã³ã§èªèšŒããŸãã
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "http",
"url": "http://localhost:8080/hooks/pre-tool-use",
"timeout": 30,
"headers": {
"Authorization": "Bearer $MY_TOKEN"
},
"allowedEnvVars": ["MY_TOKEN"]
}
]
}
]
}
}
MCP ããŒã« ãã㯠ãã£ãŒã«ã
å ±éãã£ãŒã«ãã«å ããŠãMCP ããŒã« ããã¯ã¯ãããã®ãã£ãŒã«ããåãå ¥ããŸãã
| ãã£ãŒã«ã | å¿ é | 説æ |
|---|---|---|
server |
ã¯ã | èšå®ããã MCP ãµãŒããŒã®ååããµãŒããŒã¯æ¢ã«æ¥ç¶ãããŠããå¿ èŠããããŸããããã¯ã¯ OAuth ãŸãã¯æ¥ç¶ãããŒãããªã¬ãŒããŸãã |
tool |
ã¯ã | ãã®ãµãŒããŒäžã§åŒã³åºãããŒã«ã®åå |
input |
ããã | ããŒã«ã«æž¡ãããåŒæ°ãæååå€ã¯ãããã¯ã®JSON å
¥åãã ${path} 眮æããµããŒãããŸãïŒäŸïŒ"${tool_input.file_path}"ïŒ |
ããŒã«ã®ããã¹ã ã³ã³ãã³ãã¯ã³ãã³ã ãã㯠stdout ã®ããã«æ±ãããŸããæå¹ãªJSON åºåãšããŠè§£æãããå Žåãæ±ºå®ãšããŠåŠçãããŸããããã§ãªãå Žåã¯ããã¬ãŒã³ ããã¹ããšããŠè¡šç€ºãããŸããæå®ããããµãŒããŒãæ¥ç¶ãããŠããªãå ŽåããŸãã¯ããŒã«ã isError: true ãè¿ãå Žåãããã¯ã¯éããããã³ã° ãšã©ãŒãçæããå®è¡ã¯ç¶è¡ãããŸãã
MCP ããŒã« ããã¯ã¯ãClaude Code ã MCP ãµãŒããŒã«æ¥ç¶ããåŸããã¹ãŠã®ãã㯠ã€ãã³ãã§å©çšå¯èœã§ããSessionStart ãš Setup ã¯éåžžããµãŒããŒãæ¥ç¶ãå®äºããåã«çºç«ããããããããã®ã€ãã³ãäžã®ããã¯ã¯æåã®å®è¡æã«ãæ¥ç¶ãããŠããªãããšã©ãŒãäºæããå¿
èŠããããŸãã
ãã®äŸã¯ãå Write ãŸã㯠Edit ã®åŸãmy_server MCP ãµãŒããŒäžã® security_scan ããŒã«ãåŒã³åºããç·šéããããã¡ã€ã«ã®ãã¹ãæž¡ããŸãã
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "mcp_tool",
"server": "my_server",
"tool": "security_scan",
"input": { "file_path": "${tool_input.file_path}" }
}
]
}
]
}
}
ããã³ãã ããã¯ãšãšãŒãžã§ã³ã ãã㯠ãã£ãŒã«ã
å ±éãã£ãŒã«ãã«å ããŠãããã³ãã ããã¯ãšãšãŒãžã§ã³ã ããã¯ã¯ãããã®ãã£ãŒã«ããåãå ¥ããŸãã
| ãã£ãŒã«ã | å¿ é | 説æ |
|---|---|---|
prompt |
ã¯ã | ã¢ãã«ã«éä¿¡ããããã³ãã ããã¹ããããã¯å
¥å JSON ã®ãã¬ãŒã¹ãã«ããŒãšã㊠$ARGUMENTS ã䜿çšããŸã |
model |
ããã | è©äŸ¡ã«äœ¿çšããã¢ãã«ãããã©ã«ãã¯é«éã¢ãã« |
ãã¹ãŠã®ãããã³ã° ããã¯ã¯äžŠåã§å®è¡ãããåäžã®ãã³ãã©ãŒã¯èªåçã«éè€æé€ãããŸããã³ãã³ã ããã¯ã¯ã³ãã³ãæååãš args ã§éè€æé€ãããHTTP ããã¯ã¯ URL ã§éè€æé€ãããŸãããã³ãã©ãŒã¯ Claude Code ã®ç°å¢ãæã€çŸåšã®ãã£ã¬ã¯ããªã§å®è¡ãããŸãã$CLAUDE_CODE_REMOTE ç°å¢å€æ°ã¯ãªã¢ãŒã Web ç°å¢ã§ "true" ã«èšå®ãããããŒã«ã« CLI ã§ã¯èšå®ãããŸããã
ãã¹ã§ãã㯠ã¹ã¯ãªãããåç §
ããã¯ãå®è¡ããããšãã®äœæ¥ãã£ã¬ã¯ããªã«é¢ä¿ãªãããããžã§ã¯ããŸãã¯ãã©ã°ã€ã³ ã«ãŒããåºæºã«ããŠãã㯠ã¹ã¯ãªãããåç §ããã«ã¯ããããã®ãã¬ãŒã¹ãã«ããŒã䜿çšããŸãã
${CLAUDE_PROJECT_DIR}: ãããžã§ã¯ã ã«ãŒãã${CLAUDE_PLUGIN_ROOT}: ãã©ã°ã€ã³ã® ã€ã³ã¹ããŒã« ãã£ã¬ã¯ããªããã©ã°ã€ã³ã«ãã³ãã«ãããã¹ã¯ãªããçšããã©ã°ã€ã³æŽæ°æã«å€æŽãããŸãã${CLAUDE_PLUGIN_DATA}: ãã©ã°ã€ã³ã®æ°žç¶ããŒã¿ ãã£ã¬ã¯ããªããã©ã°ã€ã³æŽæ°ãéããŠåç¶ãã¹ãäŸåé¢ä¿ãšç¶æ çšã
ãã¹ ãã¬ãŒã¹ãã«ããŒãåç
§ããããã¯ã«ã¯exec ãã©ãŒã ãåªå
ããŠãã ãããExec ãã©ãŒã ã¯å args èŠçŽ ãåŒçšç¬Šãªãã§ 1 ã€ã®åŒæ°ãšããŠæž¡ããããã¹ããŒã¹ãŸãã¯ç¹æ®æåãå«ããã¹ã¯åŒçšç¬ŠãäžèŠã§ããã·ã§ã« ãã©ãŒã ã§ã¯ãåãã¬ãŒã¹ãã«ããŒãããã« ã¯ã©ãŒãã§å²ã¿ãŸãã
ãã®äŸã¯ ${CLAUDE_PROJECT_DIR} ã䜿çšããŠãWrite ãŸã㯠Edit ããŒã«åŒã³åºãã®åŸããããžã§ã¯ãã® .claude/hooks/ ãã£ã¬ã¯ããªããã¹ã¿ã€ã« ãã§ãã«ãŒãå®è¡ããŸãã
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/check-style.sh",
"args": []
}
]
}
]
}
}
hooks/hooks.json ã§ãã©ã°ã€ã³ ããã¯ãå®çŸ©ãããªãã·ã§ã³ã®ãããã¬ãã« description ãã£ãŒã«ãã䜿çšããŸãããã©ã°ã€ã³ãæå¹ãªå Žåããã®ããã¯ã¯ãŠãŒã¶ãŒããã³ãããžã§ã¯ã ããã¯ãšããŒãžãããŸãã
ãã®äŸã¯ããã©ã°ã€ã³ã«ãã³ãã«ããããã©ãŒããã ã¹ã¯ãªãããå®è¡ããŸãã
{
"description": "Automatic code formatting",
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/scripts/format.sh",
"args": [],
"timeout": 30
}
]
}
]
}
}
ãã©ã°ã€ã³ ããã¯ã®äœæã®è©³çްã«ã€ããŠã¯ããã©ã°ã€ã³ ã³ã³ããŒãã³ã ãªãã¡ã¬ã³ã¹ãåç §ããŠãã ããã
ã¹ãã«ãšãšãŒãžã§ã³ãã®ããã¯
èšå®ãã¡ã€ã«ãšãã©ã°ã€ã³ã«å ããŠãããã¯ã¯ã¹ãã«ãšãµããšãŒãžã§ã³ãã§ããã³ããã¿ãŒã䜿çšããŠçŽæ¥å®çŸ©ã§ããŸãããããã®ããã¯ã¯ã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã«ã¹ã³ãŒãããããã®ã³ã³ããŒãã³ããã¢ã¯ãã£ããªå Žåã«ã®ã¿å®è¡ãããŸãã
ãã¹ãŠã®ãã㯠ã€ãã³ãããµããŒããããŠããŸãããµããšãŒãžã§ã³ãã®å ŽåãStop ããã¯ã¯èªåçã« SubagentStop ã«å€æãããŸããããã¯ãµããšãŒãžã§ã³ããå®äºãããšãã«çºç«ããã€ãã³ãã§ãã
ããã¯ã¯èšå®ããŒã¹ã®ããã¯ãšåãèšå®åœ¢åŒã䜿çšããŸãããã³ã³ããŒãã³ãã®ã©ã€ãã¿ã€ã ã«ã¹ã³ãŒããããå®äºæã«ã¯ãªãŒã³ã¢ãããããŸãã
ãã®ã¹ãã«ã¯ãå Bash ã³ãã³ãã®åã«ã»ãã¥ãªãã£æ€èšŒã¹ã¯ãªãããå®è¡ãã PreToolUse ããã¯ãå®çŸ©ããŸãã
---
name: secure-operations
description: Perform operations with security checks
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/security-check.sh"
---
ãšãŒãžã§ã³ã㯠YAML ããã³ããã¿ãŒã§åã圢åŒã䜿çšããŸãã
/hooks ã¡ãã¥ãŒ
Claude Code ã§ /hooks ãšå
¥åããŠãèšå®ãããããã¯ã®èªã¿åãå°çšãã©ãŠã¶ãŒãéããŸããã¡ãã¥ãŒã¯ãã¹ãŠã®ãã㯠ã€ãã³ãã衚瀺ããèšå®ãããããã¯ã®æ°ã瀺ãããããã£ãŒã«ããªã«ããŠã³ã§ããåãã㯠ãã³ãã©ãŒã®å®å
šãªè©³çްã衚瀺ããŸããããã䜿çšããŠèšå®ãæ€èšŒããããã¯ãã©ã®èšå®ãã¡ã€ã«ããå®çŸ©ããããã確èªããããããã¯ã®ã³ãã³ããããã³ããããŸã㯠URL ãæ€æ»ããŸãã
ã¡ãã¥ãŒã¯ 5 ã€ã®ãã㯠ã¿ã€ãããã¹ãŠè¡šç€ºããŸããcommandãpromptãagentãhttpãmcp_toolãåããã¯ã«ã¯ããã®ãœãŒã¹ã瀺ã [type] ãã¬ãã£ãã¯ã¹ãšãœãŒã¹ ã©ãã«ãä»ããããŠããŸãã
User:~/.claude/settings.jsonããProject:.claude/settings.jsonããLocal:.claude/settings.local.jsonããPlugin: ãã©ã°ã€ã³ã®hooks/hooks.jsonããSession: çŸåšã®ã»ãã·ã§ã³çšã«ã¡ã¢ãªã«ç»é²Built-in: Claude Code ã«ãã£ãŠå éšçã«ç»é²
ããã¯ãéžæãããšã詳现ãã¥ãŒãéãããã®ã€ãã³ãããããã£ãŒãã¿ã€ãããœãŒã¹ ãã¡ã€ã«ãããã³å®å šãªã³ãã³ããããã³ããããŸã㯠URL ã衚瀺ãããŸããã¡ãã¥ãŒã¯èªã¿åãå°çšã§ããããã¯ã远å ã倿ŽããŸãã¯åé€ããã«ã¯ãèšå® JSON ãçŽæ¥ç·šéããããClaude ã«ãã®å€æŽãäŸé ŒããŠãã ããã
ããã¯ãç¡å¹åãŸãã¯åé€
ããã¯ãåé€ããã«ã¯ãèšå® JSON ãã¡ã€ã«ãããã®ãšã³ããªãåé€ããŸãã
ãã¹ãŠã®ããã¯ãåé€ããã«äžæçã«ç¡å¹åããã«ã¯ãèšå®ãã¡ã€ã«ã§ "disableAllHooks": true ãèšå®ããŸããåå¥ã®ããã¯ãèšå®ã«ä¿æãããŸãŸç¡å¹åããæ¹æ³ã¯ãããŸããã
disableAllHooks èšå®ã¯ç®¡çèšå®éå±€ãå°éããŸãã管çè
ã管çããªã·ãŒèšå®ãéããŠããã¯ãèšå®ããŠããå ŽåããŠãŒã¶ãŒããããžã§ã¯ãããŸãã¯ããŒã«ã«èšå®ã§èšå®ããã disableAllHooks ã¯ããããã®ç®¡çããã¯ãç¡å¹åã§ããŸããã管çèšå®ã¬ãã«ã§èšå®ããã disableAllHooks ã®ã¿ã管çããã¯ãç¡å¹åã§ããŸãã
èšå®ãã¡ã€ã«ã®ããã¯ãžã®çŽæ¥ç·šéã¯éåžžããã¡ã€ã« ãŠã©ããã£ãŒã«ãã£ãŠèªåçã«ååŸãããŸãã
ããã¯å ¥åºå
ã³ãã³ã ããã¯ã¯ stdin çµç±ã§ JSON ããŒã¿ãåãåããçµäºã³ãŒããstdoutãstderr ãéããŠçµæãéä¿¡ããŸããHTTP ããã¯ã¯åã JSON ããªã¯ãšã¹ãæ¬äœãšããŠåãåããHTTP ã¬ã¹ãã³ã¹æ¬äœãéããŠçµæãéä¿¡ããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ããã¹ãŠã®ã€ãã³ãã«å ±éãããã£ãŒã«ããšåäœã«ã€ããŠèª¬æããŸãããã㯠ã€ãã³ãã®åã»ã¯ã·ã§ã³ã«ã¯ããã®ç¹å®ã®å ¥åã¹ããŒããšæ±ºå®å¶åŸ¡ãªãã·ã§ã³ãå«ãŸããŠããŸãã
macOS ãš Linux ã§ã¯ãã³ãã³ã ããã¯ã¯ v2.1.139 以éãå¶åŸ¡ç«¯æ«ã®ãªãç¬èªã®ã»ãã·ã§ã³ã§å®è¡ãããŸãããã㯠ããã»ã¹ãšåããã»ã¹ã¯ /dev/tty ãéãããšãããšã¹ã±ãŒã ã·ãŒã±ã³ã¹ã Claude Code ã€ã³ã¿ãŒãã§ã€ã¹ã«çŽæ¥éä¿¡ããããšãã§ããŸãããWindows ã«ã¯ /dev/tty ããããŸãããä»»æã®ãã©ãããã©ãŒã ã§ãŠãŒã¶ãŒã«ã¡ãã»ãŒãžã衚瀺ããã«ã¯ãJSON åºåã§systemMessageãè¿ããŸãããã¹ã¯ãããéç¥ãããªã¬ãŒãããããŠã£ã³ã㊠ã¿ã€ãã«ãèšå®ãããããã«ã鳎ããããããã«ã¯ã代ããã«terminalSequenceãè¿ããŸãã
å ±éå ¥åãã£ãŒã«ã
ãã㯠ã€ãã³ãã¯ãåãã㯠ã€ãã³ãã»ã¯ã·ã§ã³ã§èª¬æãããŠããã€ãã³ãåºæã®ãã£ãŒã«ãã«å ããŠããããã®ãã£ãŒã«ãã JSON ãšããŠåãåããŸããã³ãã³ã ããã¯ã®å Žåããã® JSON 㯠stdin çµç±ã§å°çããŸããHTTP ããã¯ã®å ŽåãPOST ãªã¯ãšã¹ãæ¬äœãšããŠå°çããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
session_id |
çŸåšã®ã»ãã·ã§ã³èå¥å |
transcript_path |
äŒè©± JSON ãžã®ãã¹ |
cwd |
ããã¯ãåŒã³åºããããšãã®çŸåšã®äœæ¥ãã£ã¬ã¯ã㪠|
permission_mode |
çŸåšã®æš©éã¢ãŒã: "default"ã"plan"ã"acceptEdits"ã"auto"ã"dontAsk"ããŸã㯠"bypassPermissions"ããã¹ãŠã®ã€ãã³ãããã®ãã£ãŒã«ããåãåãããã§ã¯ãããŸãããåã€ãã³ãã® JSON äŸã確èªããŠãã ãã |
effort |
ã¢ã¯ãã£ããªåªåã¬ãã«ãä¿æãã level ãã£ãŒã«ããæã€ãªããžã§ã¯ããã¿ãŒã³ã®å Žå: "low"ã"medium"ã"high"ã"xhigh"ããŸã㯠"max"ããªã¯ãšã¹ããããåªåã¬ãã«ãçŸåšã®ã¢ãã«ããµããŒãããŠãããã®ãè¶
ããå Žåãããã¯ã¢ãã«ãå®éã«äœ¿çšããããŠã³ã°ã¬ãŒããããã¬ãã«ã§ããããªã¯ãšã¹ãããã¬ãã«ã§ã¯ãããŸããããªããžã§ã¯ãã¯ã¹ããŒã¿ã¹ ã©ã€ã³ã® effort ãã£ãŒã«ããšäžèŽããŸããPreToolUseãPostToolUseãStopãSubagentStop ãªã©ã®ããŒã«äœ¿çšã³ã³ããã¹ãå
ã§çºç«ããã€ãã³ããããã³çŸåšã®ã¢ãã«ãåªåãã©ã¡ãŒã¿ããµããŒãããå Žåã«ååšããŸããã¬ãã«ã¯ããã㯠ã³ãã³ããš Bash ããŒã«ã« $CLAUDE_EFFORT ç°å¢å€æ°ãšããŠå©çšå¯èœã§ãã |
hook_event_name |
çºç«ããã€ãã³ãã®åå |
--agent ã§å®è¡ãããããµããšãŒãžã§ã³ãå
ã§å®è¡ããå Žåã2 ã€ã®è¿œå ãã£ãŒã«ããå«ãŸããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
agent_id |
ãµããšãŒãžã§ã³ãã®äžæã®èå¥åãããã¯ããµããšãŒãžã§ã³ãåŒã³åºãå ã§çºç«ããå Žåã«ã®ã¿ååšããŸããããã䜿çšããŠããµããšãŒãžã§ã³ã ããã¯åŒã³åºããã¡ã€ã³ ã¹ã¬ããåŒã³åºãããåºå¥ããŸãã |
agent_type |
ãšãŒãžã§ã³ãåïŒäŸãã°ã"Explore" ãŸã㯠"security-reviewer"ïŒãã»ãã·ã§ã³ã --agent ã䜿çšããããããã¯ããµããšãŒãžã§ã³ãå
ã§çºç«ããå Žåã«ååšããŸãããµããšãŒãžã§ã³ãã®å ŽåããµããšãŒãžã§ã³ãã®ã¿ã€ããã»ãã·ã§ã³ã® --agent å€ãããåªå
ãããŸããã«ã¹ã¿ã ãµããšãŒãžã§ã³ãã®å Žåãããã¯ãšãŒãžã§ã³ãã®ããã³ããã¿ãŒã® name ãã£ãŒã«ãã§ããããã¡ã€ã«åã§ã¯ãããŸããã |
SessionStart ããã¯ã®ã¿ã model ãã£ãŒã«ããåãåããŸãã$CLAUDE_MODEL ç°å¢å€æ°ã¯ãããŸããããã㯠ããã»ã¹ã¯èŠªç°å¢ãç¶æ¿ãããããã·ã§ã«ã§ $ANTHROPIC_MODEL ãèšå®ããå Žåã¯ãããèªã¿åãããšãã§ããŸãããã»ãã·ã§ã³äžã« /model ã§ã¢ãã«ãåãæ¿ãããšãã«ãã®å€ã¯å€ãããŸããã
äŸãã°ãBash ã³ãã³ãã® PreToolUse ããã¯ã¯ stdin ã§ä»¥äžãåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/home/user/.claude/projects/.../transcript.jsonl",
"cwd": "/home/user/my-project",
"permission_mode": "default",
"hook_event_name": "PreToolUse",
"tool_name": "Bash",
"tool_input": {
"command": "npm test"
}
}
tool_name ãš tool_input ãã£ãŒã«ãã¯ã€ãã³ãåºæã§ããåãã㯠ã€ãã³ãã»ã¯ã·ã§ã³ã§ã¯ããã®ã€ãã³ãã®è¿œå ãã£ãŒã«ãã«ã€ããŠèª¬æããŠããŸãã
çµäºã³ãŒãåºå
ãã㯠ã³ãã³ãããã®çµäºã³ãŒãã¯ãClaude Code ã«ã¢ã¯ã·ã§ã³ãé²è¡ãã¹ããããããã¯ãããã¹ãããç¡èŠãããã¹ãããäŒããŸãã
çµäº 0 ã¯æåãæå³ããŸããClaude Code 㯠stdout ãJSON åºåãã£ãŒã«ãã§è§£æããŸããJSON åºåã¯çµäº 0 ã§ã®ã¿åŠçãããŸããã»ãšãã©ã®ã€ãã³ãã§ã¯ãstdout ã¯ãããã° ãã°ã«æžã蟌ãŸããŸããããã©ã³ã¹ã¯ãªããã«ã¯è¡šç€ºãããŸãããäŸå€ã¯ UserPromptSubmitãUserPromptExpansionãããã³ SessionStart ã§ãstdout 㯠Claude ãèŠãŠè¡åã§ããã³ã³ããã¹ããšããŠè¿œå ãããŸãã
çµäº 2 ã¯ããããã³ã° ãšã©ãŒãæå³ããŸããClaude Code 㯠stdout ãšããå
ã® JSON ãç¡èŠããŸãã代ããã«ãstderr ããã¹ãããšã©ãŒ ã¡ãã»ãŒãžãšã㊠Claude ã«ãã£ãŒãããã¯ãããŸãã广ã¯ã€ãã³ãã«äŸåããŸããPreToolUse ã¯ããŒã«åŒã³åºãããããã¯ããUserPromptSubmit ã¯ããã³ãããæåŠããŸããå®å
šãªãªã¹ãã«ã€ããŠã¯ãçµäºã³ãŒã 2 åäœãåç
§ããŠãã ããã
ãã®ä»ã®çµäºã³ãŒã ã¯ã»ãšãã©ã®ãã㯠ã€ãã³ãã®éããããã³ã° ãšã©ãŒã§ãããã©ã³ã¹ã¯ãªãã㯠<hook name> hook error éç¥ã衚瀺ãããã®åŸã« stderr ã®æåã®è¡ãç¶ãããã--debug ãªãã§åå ãç¹å®ã§ããŸããå®è¡ã¯ç¶è¡ãããå®å
šãª stderr ã¯ãããã° ãã°ã«æžã蟌ãŸããŸãã
äŸãã°ãå±éºãª Bash ã³ãã³ãããããã¯ãããã㯠ã³ãã³ã ã¹ã¯ãªããã
#!/bin/bash
# stdin ãã JSON å
¥åãèªã¿åããã³ãã³ãããã§ãã¯
command=$(jq -r '.tool_input.command' < /dev/stdin)
if [[ "$command" == rm* ]]; then
echo "Blocked: rm commands are not allowed" >&2
exit 2 # ããããã³ã° ãšã©ãŒ: ããŒã«åŒã³åºãã鲿¢ããã
fi
exit 0 # æå: ããŒã«åŒã³åºããé²è¡
ã»ãšãã©ã®ãã㯠ã€ãã³ãã§ã¯ãçµäºã³ãŒã 2 ã®ã¿ãã¢ã¯ã·ã§ã³ããããã¯ããŸããClaude Code ã¯çµäºã³ãŒã 1 ãéããããã³ã° ãšã©ãŒãšããŠæ±ãã1 ãåŸæ¥ã® Unix 倱æã³ãŒãã§ãã£ãŠããã¢ã¯ã·ã§ã³ãé²è¡ãããŸããããã¯ãããªã·ãŒã宿œããããšãç®çãšããŠããå Žåã¯ãexit 2 ã䜿çšããŠãã ãããäŸå€ã¯ WorktreeCreate ã§ã0 以å€ã®çµäºã³ãŒãã¯ã¯ãŒã¯ããªãŒäœæãäžæ¢ããŸãã
ã€ãã³ãããšã®çµäºã³ãŒã 2 åäœ
çµäºã³ãŒã 2 ã¯ãããã¯ãã忢ããããããªãã§ãã ããããšéç¥ããæ¹æ³ã§ãã广ã¯ã€ãã³ãã«äŸåããŸããäžéšã®ã€ãã³ãã¯ãããã¯å¯èœãªã¢ã¯ã·ã§ã³ïŒãŸã çºçããŠããªãããŒã«åŒã³åºããªã©ïŒã衚ããä»ã®ã€ãã³ãã¯ãã§ã«çºçããã鲿¢ã§ããªãããšã衚ãããã§ãã
| ãã㯠ã€ãã³ã | ãããã¯å¯èœïŒ | çµäº 2 ã§äœãèµ·ããã |
|---|---|---|
PreToolUse |
ã¯ã | ããŒã«åŒã³åºããããã㯠|
PermissionRequest |
ã¯ã | æš©éãæåŠ |
UserPromptSubmit |
ã¯ã | ããã³ããåŠçããããã¯ããŠããã³ãããæ¶å» |
UserPromptExpansion |
ã¯ã | æ¡åŒµãããã㯠|
Stop |
ã¯ã | Claude ã忢ããã®ãé²ããäŒè©±ãç¶è¡ |
SubagentStop |
ã¯ã | ãµããšãŒãžã§ã³ãã忢ããã®ã鲿¢ |
TeammateIdle |
ã¯ã | ããŒã ã¡ã€ããã¢ã€ãã«ç¶æ ã«ãªãã®ã鲿¢ïŒããŒã ã¡ã€ããäœæ¥ãç¶è¡ïŒ |
TaskCreated |
ã¯ã | ã¿ã¹ã¯äœæãããŒã«ãã㯠|
TaskCompleted |
ã¯ã | ã¿ã¹ã¯ãå®äºãšããŠããŒã¯ãããã®ã鲿¢ |
ConfigChange |
ã¯ã | èšå®å€æŽãæå¹ã«ãªãã®ããããã¯ïŒpolicy_settings ãé€ãïŒ |
StopFailure |
ããã | åºåãšçµäºã³ãŒãã¯ç¡èŠ |
PostToolUse |
ããã | Claude ã« stderr ã衚瀺ïŒããŒã«ã¯ãã§ã«å®è¡ïŒ |
PostToolUseFailure |
ããã | Claude ã« stderr ã衚瀺ïŒããŒã«ã¯ãã§ã«å€±æïŒ |
PostToolBatch |
ã¯ã | 次ã®ã¢ãã«åŒã³åºãã®åã« agentic ã«ãŒãã忢 |
PermissionDenied |
ããã | çµäºã³ãŒããš stderr ã¯ç¡èŠïŒæåŠã¯ãã§ã«çºçïŒãJSON hookSpecificOutput.retry: true ã䜿çšããŠã¢ãã«ãå詊è¡ã§ããããšãäŒãã |
Notification |
ããã | ãŠãŒã¶ãŒã®ã¿ã« stderr ã衚瀺 |
SubagentStart |
ããã | ãŠãŒã¶ãŒã®ã¿ã« stderr ã衚瀺 |
SessionStart |
ããã | ãŠãŒã¶ãŒã®ã¿ã« stderr ã衚瀺 |
Setup |
ããã | ãŠãŒã¶ãŒã®ã¿ã« stderr ã衚瀺 |
SessionEnd |
ããã | ãŠãŒã¶ãŒã®ã¿ã« stderr ã衚瀺 |
CwdChanged |
ããã | ãŠãŒã¶ãŒã®ã¿ã« stderr ã衚瀺 |
FileChanged |
ããã | ãŠãŒã¶ãŒã®ã¿ã« stderr ã衚瀺 |
PreCompact |
ã¯ã | ã³ã³ãã¯ã·ã§ã³ãããã㯠|
PostCompact |
ããã | ãŠãŒã¶ãŒã®ã¿ã« stderr ã衚瀺 |
Elicitation |
ã¯ã | elicitation ãæåŠ |
ElicitationResult |
ã¯ã | ã¬ã¹ãã³ã¹ããããã¯ïŒã¢ã¯ã·ã§ã³ã decline ã«ãªãïŒ |
WorktreeCreate |
ã¯ã | 0 以å€ã®çµäºã³ãŒãã§ã¯ãŒã¯ããªãŒäœæã倱æ |
WorktreeRemove |
ããã | 倱æã¯ãããã° ã¢ãŒãã§ã®ã¿ãã° |
InstructionsLoaded |
ããã | çµäºã³ãŒãã¯ç¡èŠ |
HTTP ã¬ã¹ãã³ã¹åŠç
HTTP ããã¯ã¯çµäºã³ãŒããš stdout ã®ä»£ããã« HTTP ã¹ããŒã¿ã¹ ã³ãŒããšã¬ã¹ãã³ã¹æ¬äœã䜿çšããŸãã
- 2xx ã§ç©ºã®æ¬äœ: æåãçµäºã³ãŒã 0 ã§åºåãªããšåç
- 2xx ã§ãã¬ãŒã³ ããã¹ãæ¬äœ: æåãããã¹ããã³ã³ããã¹ããšããŠè¿œå
- 2xx ã§ JSON æ¬äœ: æåãã³ãã³ã ããã¯ãšåãJSON åºåã¹ããŒãã䜿çšããŠè§£æ
- 2xx 以å€ã®ã¹ããŒã¿ã¹: éããããã³ã° ãšã©ãŒãå®è¡ã¯ç¶è¡
- æ¥ç¶å€±æãŸãã¯ã¿ã€ã ã¢ãŠã: éããããã³ã° ãšã©ãŒãå®è¡ã¯ç¶è¡
ã³ãã³ã ããã¯ãšã¯ç°ãªããHTTP ããã¯ã¯ã¹ããŒã¿ã¹ ã³ãŒãã®ã¿ã§ããããã³ã° ãšã©ãŒãéç¥ã§ããŸãããããŒã«åŒã³åºãããããã¯ãŸãã¯æš©éãæåŠããã«ã¯ãé©åãªæ±ºå®ãã£ãŒã«ããå«ã JSON æ¬äœãæã€ 2xx ã¬ã¹ãã³ã¹ãè¿ããŸãã
JSON åºå
çµäºã³ãŒãã§èš±å¯ãŸãã¯ãããã¯ã§ããŸãããJSON åºåã¯ãã现ããå¶åŸ¡ãæäŸããŸããçµäºã³ãŒã 2 ã§ãããã¯ãã代ããã«ãçµäº 0 ã㊠stdout ã« JSON ãªããžã§ã¯ããåºåããŸããClaude Code ã¯ãã® JSON ããç¹å®ã®ãã£ãŒã«ããèªã¿åãããããã¯ãèš±å¯ããŸãã¯ãŠãŒã¶ãŒãžã®ãšã¹ã«ã¬ãŒã·ã§ã³ãå«ã決å®å¶åŸ¡ãéããåäœãå¶åŸ¡ããŸãã
ããã¯ããšã« 1 ã€ã®ã¢ãããŒããéžæããå¿ èŠããããŸããäž¡æ¹ã§ã¯ãããŸãããçµäºã³ãŒãã®ã¿ã§ã·ã°ããªã³ã°ããããçµäº 0 ããŠæ§é åå¶åŸ¡ã®ããã« JSON ãåºåãããã®ããããã§ããClaude Code ã¯çµäº 0 ã§ã®ã¿ JSON ãåŠçããŸããçµäº 2 ã®å ŽåãJSON ã¯ç¡èŠãããŸãã
ããã¯ã® stdout ã«ã¯ JSON ãªããžã§ã¯ãã®ã¿ãå«ãŸããŠããå¿ èŠããããŸããã·ã§ã« ãããã¡ã€ã«ãã¹ã¿ãŒãã¢ããæã«ããã¹ããåºåããå ŽåãJSON è§£æã«å¹²æžããå¯èœæ§ããããŸãããã©ãã«ã·ã¥ãŒãã£ã³ã° ã¬ã€ãã®JSON æ€èšŒã«å€±æãåç §ããŠãã ããã
ããã¯åºåæååïŒadditionalContextãsystemMessageãããã³ãã¬ãŒã³ stdout ãå«ãïŒã¯ 10,000 æåã§ãã£ãããããŸãããã®å¶éãè¶
ããåºåã¯ãã¡ã€ã«ã«ä¿åããããã¬ãã¥ãŒãšãã¡ã€ã« ãã¹ã«çœ®ãæããããŸãã倧ããªããŒã«çµæãšåãæ¹æ³ã§åŠçãããŸãã
JSON ãªããžã§ã¯ã㯠3 çš®é¡ã®ãã£ãŒã«ãããµããŒãããŠããŸãã
continueãªã©ã®ãŠãããŒãµã« ãã£ãŒã«ãã¯ãã¹ãŠã®ã€ãã³ãå šäœã§æ©èœããŸãããããã¯ä»¥äžã®è¡šã«ãªã¹ããããŠããŸãã- ãããã¬ãã«ã®
decisionãšreasonã¯äžéšã®ã€ãã³ãã§äœ¿çšããããããã¯ãŸãã¯ãã£ãŒãããã¯ãæäŸããŸãã hookSpecificOutputã¯ããè±ããªå¶åŸ¡ãå¿ èŠãªã€ãã³ãçšã®ãã¹ãããããªããžã§ã¯ãã§ããã€ãã³ãåã«èšå®ãããhookEventNameãã£ãŒã«ããå¿ èŠã§ãã
| ãã£ãŒã«ã | ããã©ã«ã | 説æ |
|---|---|---|
continue |
true |
false ã®å Žåãããã¯ãå®è¡ãããåŸãClaude ã¯å®å
šã«åŠçã忢ããŸããã€ãã³ãåºæã®æ±ºå®ãã£ãŒã«ããããåªå
ãããŸã |
stopReason |
ãªã | continue ã false ã®ãšãã«ãŠãŒã¶ãŒã«è¡šç€ºãããã¡ãã»ãŒãžãClaude ã«ã¯è¡šç€ºãããŸãã |
suppressOutput |
false |
true ã®å Žåããããã° ãã°ãã stdout ãé衚瀺ã«ããŸã |
systemMessage |
ãªã | ãŠãŒã¶ãŒã«è¡šç€ºãããèŠåã¡ãã»ãŒãž |
terminalSequence |
ãªã | Claude Code ã代ããã«çºè¡ããã¿ãŒããã« ãšã¹ã±ãŒã ã·ãŒã±ã³ã¹ïŒãã¹ã¯ãããéç¥ããŠã£ã³ã㊠ã¿ã€ãã«ããã«ãªã©ïŒãOSC 0/1/2/9/99/777 ãš BEL ã«å¶éãããŸããå€ã«èš±å¯ãªã¹ãå€ã®ãã®ãå«ãŸããŠããå Žåããã£ãŒã«ãã¯ç¡èŠãããŸãã/dev/tty ãå©çšã§ããªãããã¯ã®ä»£ããã«ããã䜿çšããŠãã ãã |
Claude ãå®å šã«åæ¢ããã«ã¯ãã€ãã³ã ã¿ã€ãã«é¢ä¿ãªãã
{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }
ã¿ãŒããã«éç¥ãçºè¡
terminalSequence ãã£ãŒã«ãã«ã¯ Claude Code v2.1.141 以éãå¿
èŠã§ãã
ããã¯ã¯å¶åŸ¡ç«¯æ«ãªãã§å®è¡ãããããããšã¹ã±ãŒã ã·ãŒã±ã³ã¹ã /dev/tty ã«çŽæ¥æžã蟌ãããšã¯å€±æããŸãã代ããã«ããšã¹ã±ãŒã ã·ãŒã±ã³ã¹ã terminalSequence ãã£ãŒã«ãã§è¿ããClaude Code ã¯ç¬èªã®ã¿ãŒããã«æžã蟌ã¿ãã¹ãéããŠãããçºè¡ããŸããããã¯ã¬ãŒã¹ ããªãŒã§ãtmux ãš GNU screen å
ã§æ©èœãã/dev/tty ããªã Windows ã§æ©èœããŸãã
ãã£ãŒã«ã㯠1 ã€ä»¥äžã®èš±å¯ãªã¹ãã«ç»é²ããããšã¹ã±ãŒã ã·ãŒã±ã³ã¹ã®æååãåãå ¥ããŸãã
- OSC
0ã1ã2: ãŠã£ã³ããŠãšã¢ã€ã³ã³ ã¿ã€ãã« - OSC
9: iTerm2ãConEmuãWindows TerminalãWezTerm éç¥ïŒ9;4ã¿ã¹ã¯ããŒé²æãå«ãïŒ - OSC
99: Kitty éç¥ - OSC
777: urxvtãGhosttyãWarp éç¥ - 裞㮠BEL
ã·ãŒã±ã³ã¹ã¯ BEL ãŸã㯠ST ã§çµäºããå ŽåããããŸããèš±å¯ãªã¹ãå€ã®ãã®ïŒCSI ã«ãŒãœã«ãšè²ã·ãŒã±ã³ã¹ãOSC ãã¬ãã ã·ãŒã±ã³ã¹ãOSC 8 ãã€ããŒãªã³ã¯ãOSC 52 ã¯ãªããããŒãæžã蟌ã¿ãOSC 1337 ãå«ãïŒã¯æåŠããããã£ãŒã«ãã¯ç¡èŠãããŸãã
以äžã®äŸã¯ Notification ããã¯ãããã¹ã¯ãããéç¥ãçºç«ããŸãããšã¹ã±ãŒã ã·ãŒã±ã³ã¹ã¯ printf 8 鲿°ãšã¹ã±ãŒãã§æ§ç¯ããããããå¶åŸ¡ãã€ãã¯ã·ã§ã« ã³ãã³ã ã©ã€ã³ã«è¡šç€ºããããjq -n --arg 㯠JSON åºåãæ§ç¯ãããããéç¥ã¡ãã»ãŒãžã®åŒçšç¬Šãããã¯ã¹ã©ãã·ã¥ãæ¹è¡ã¯æ£ãããšã¹ã±ãŒããããŸãã
#!/bin/bash
# Notification ããã¯: Claude Code ãæ³šæãå¿
èŠãšãããšãã«ãã¹ã¯ãããã« ping ãéä¿¡ããŸãã
input=$(cat)
title="Claude Code'
body=$(jq -r '.message // 'Needs your attention'' <<<"$input")
seq=$(printf '\033]777;notify;%s;%s\007' "$title" "$body")
jq -nc --arg seq "$seq" '{terminalSequence: $seq}'
{ "terminalSequence": "..." } ã®åœ¢ç¶ã¯ãä»»æã®ã·ã§ã«ãŸãã¯èšèªããåãã§ããWindows ã§ã¯ãPowerShell ãŸãã¯ã¹ã¯ãªããã§ãšã¹ã±ãŒãæååãæ§ç¯ããåã JSON ãªããžã§ã¯ããçºè¡ããŸãã
terminalSequence ã¯ã以åã« /dev/tty ã«ãšã¹ã±ãŒã ã·ãŒã±ã³ã¹ãçŽæ¥æžã蟌ãã§ããããã¯ã®å¯Ÿå¿ãã眮ãæãã§ããèš±å¯ãªã¹ãã¯ã«ãŒãœã«ãç§»åãããè²ã倿Žãããã§ããªãã·ãŒã±ã³ã¹ã«å¶éãããŠãããããããã¯ã¯ãªã³ã¹ã¯ãªãŒã³ ããã³ãããç Žæããããšã¯ã§ããŸããã
Claude çšã«ã³ã³ããã¹ãã远å
additionalContext ãã£ãŒã«ãã¯ãããã¯ãã Claude ã®ã³ã³ããã¹ã ãŠã£ã³ããŠã«æååãæž¡ããŸããClaude Code ã¯æååãã·ã¹ãã ãªãã€ã³ããŒã§ã©ããããããã¯ãçºç«ããæç¹ã§äŒè©±ã«æ¿å
¥ããŸããClaude ã¯æ¬¡ã®ã¢ãã« ãªã¯ãšã¹ãã§ãªãã€ã³ããŒãèªã¿åããŸãããã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãã£ãã ã¡ãã»ãŒãžãšããŠè¡šç€ºãããŸããã
hookSpecificOutput å
ã§ã€ãã³ãåãšäžç·ã« additionalContext ãè¿ããŸãã
{
"hookSpecificOutput": {
"hookEventName": "PostToolUse",
"additionalContext": "This file is generated. Edit src/schema.ts and run `bun generate` instead."
}
}
ãªãã€ã³ããŒã衚瀺ãããå Žæã¯ã€ãã³ãã«äŸåããŸãã
- SessionStartãSetupãããã³ SubagentStart: äŒè©±ã®éå§æãæåã®ããã³ããã®å
- UserPromptSubmit ããã³ UserPromptExpansion: éä¿¡ãããããã³ããã®æšª
- PreToolUseãPostToolUseãPostToolUseFailureãããã³ PostToolBatch: ããŒã«çµæã®æšª
è€æ°ã®ããã¯ãåãã€ãã³ãã«å¯Ÿã㊠additionalContext ãè¿ãå ŽåãClaude ã¯ãã¹ãŠã®å€ãåãåããŸããå€ã 10,000 æåãè¶
ããå ŽåãClaude Code ã¯ã»ãã·ã§ã³ ãã£ã¬ã¯ããªå
ã®ãã¡ã€ã«ã«å®å
šãªããã¹ããæžã蟌ã¿ãçããã¬ãã¥ãŒãšãã¡ã€ã« ãã¹ã Claude ã«æž¡ããŸãã
Claude ãçŸåšã®ç°å¢ã®ç¶æ
ãŸãã¯å®è¡ãããã°ããã®æäœã«ã€ããŠç¥ã£ãŠããã¹ãæ
å ±ã« additionalContext ã䜿çšããŸãã
- ç°å¢ç¶æ : çŸåšã®ãã©ã³ããããã〠ã¿ãŒã²ããããŸãã¯ã¢ã¯ãã£ããªæ©èœãã©ã°
- æ¡ä»¶ä»ããããžã§ã¯ã ã«ãŒã«: ç·šéãããã°ããã®ãã¡ã€ã«ã«é©çšããããã¹ã ã³ãã³ãããã®ã¯ãŒã¯ããªãŒã§èªã¿åãå°çšã®ãã£ã¬ã¯ããª
- å€éšããŒã¿: å²ãåœãŠããããªãŒãã³ ã€ã·ã¥ãŒãæè¿ã® CI çµæãå éšãµãŒãã¹ããååŸãããã³ã³ãã³ã
å€ãããªãæç€ºã«ã€ããŠã¯ãCLAUDE.mdãåªå ããŸããã¹ã¯ãªãããå®è¡ããã«èªã¿èŸŒãŸããéçãªãããžã§ã¯ãèŠçŽã®æšæºçãªå Žæã§ãã
ããã¹ããåœä»€åã·ã¹ãã æç€ºã§ã¯ãªããäºå®çãªã¹ããŒãã¡ã³ããšããŠèšè¿°ããŸãããããã〠ã¿ãŒã²ããã¯æ¬çªç°å¢ã§ãããŸãã¯ããã®ãªããžããªã¯ bun test ã䜿çšããŸãããªã©ã®ãã¬ãŒãºã¯ãããžã§ã¯ãæ
å ±ãšããŠèªã¿åãããŸãã垯åå€ã·ã¹ãã ã³ãã³ããšããŠãã¬ãŒã åãããããã¹ã㯠Claude ã®ããã³ãã ã€ã³ãžã§ã¯ã·ã§ã³é²åŸ¡ãããªã¬ãŒããå¯èœæ§ããããClaude ãããã¹ããã³ã³ããã¹ããšããŠæ±ã代ããã«è¡šç€ºããŸãã
泚å
¥ãããããã¹ãã¯ã»ãã·ã§ã³ ãã©ã³ã¹ã¯ãªããã«ä¿åãããŸããPostToolUse ãŸã㯠UserPromptSubmit ãªã©ã®äžç€ã€ãã³ãã®å Žåã--continue ãŸã㯠--resume ã§åéãããšãããã¯ãåå®è¡ãã代ããã«ä¿åãããããã¹ããåçããããããã¿ã€ã ã¹ã¿ã³ããã³ããã SHA ãªã©ã®å€ã¯åéæã«å€ããªããŸããSessionStart ããã¯ã¯ source ã "resume" ã«èšå®ããŠåéæã«å床å®è¡ããããããã³ã³ããã¹ãããªãã¬ãã·ã¥ã§ããŸãã
決å®å¶åŸ¡
ãã¹ãŠã®ã€ãã³ãã JSON ãéããããããã³ã°ãŸãã¯åäœå¶åŸ¡ããµããŒãããŠããããã§ã¯ãããŸããããµããŒãããã€ãã³ãã¯ããã®æ±ºå®ã衚çŸããããã«ç°ãªããã£ãŒã«ã ã»ããã䜿çšããŸããããã¯ãæžãåã«ããã®ããŒãã«ãã¯ã€ã㯠ãªãã¡ã¬ã³ã¹ãšããŠäœ¿çšããŠãã ããã
| ã€ãã³ã | 決å®ãã¿ãŒã³ | ã㌠ãã£ãŒã«ã |
|---|---|---|
| UserPromptSubmitãUserPromptExpansionãPostToolUseãPostToolUseFailureãPostToolBatchãStopãSubagentStopãConfigChangeãPreCompact | ãããã¬ãã« decision |
decision: "block"ãreason |
| TeammateIdleãTaskCreatedãTaskCompleted | çµäºã³ãŒããŸã㯠continue: false |
çµäºã³ãŒã 2 ã¯ã¢ã¯ã·ã§ã³ããããã¯ããstderr ãã£ãŒãããã¯ã䜿çšããŸããJSON {"continue": false, "stopReason": "..."} ã¯ããŒã ã¡ã€ãå
šäœã忢ããStop ããã¯åäœãšäžèŽããŸã |
| PreToolUse | hookSpecificOutput |
permissionDecisionïŒallow/deny/ask/deferïŒãpermissionDecisionReason |
| PermissionRequest | hookSpecificOutput |
decision.behaviorïŒallow/denyïŒ |
| PermissionDenied | hookSpecificOutput |
retry: true ã¯ã¢ãã«ãæåŠãããããŒã«åŒã³åºããå詊è¡ã§ããããšãäŒãã |
| WorktreeCreate | ãã¹æ»ãå€ | ã³ãã³ã ããã¯ã¯ stdout ã«ãã¹ãåºåããŸããHTTP ããã¯ã¯ hookSpecificOutput.worktreePath çµç±ã§è¿ããŸããããã¯å€±æãŸãã¯ãã¹æ¬ èœã§äœæã倱æ |
| Elicitation | hookSpecificOutput |
actionïŒaccept/decline/cancelïŒãcontentïŒaccept ã®å Žåã®ãã©ãŒã ãã£ãŒã«ãå€ïŒ |
| ElicitationResult | hookSpecificOutput |
actionïŒaccept/decline/cancelïŒãcontentïŒãã©ãŒã ãã£ãŒã«ãå€ããªãŒããŒã©ã€ãïŒ |
| WorktreeRemoveãNotificationãSessionEndãPostCompactãInstructionsLoadedãStopFailureãCwdChangedãFileChanged | ãªã | 決å®å¶åŸ¡ãªãããã°ãã¯ãªãŒã³ã¢ãããªã©ã®å¯äœçšã«äœ¿çš |
åãã¿ãŒã³ã®å®è¡äŸã以äžã«ç€ºããŸãã
UserPromptSubmitãUserPromptExpansionãPostToolUseãPostToolUseFailureãPostToolBatchãStopãSubagentStopãConfigChangeãPreCompact ã§äœ¿çšãããŸããå¯äžã®å€ã¯ "block" ã§ããã¢ã¯ã·ã§ã³ãé²è¡ãããã«ã¯ãJSON ãã decision ãçç¥ããããJSON ãªãã§çµäº 0 ã§çµäºããŸãã
{
"decision": "block",
"reason": "Test suite must pass before proceeding"
}
ããè±ããªå¶åŸ¡ã®ããã« hookSpecificOutput ã䜿çšããŸããèš±å¯ãæåŠããŸãã¯ãŠãŒã¶ãŒãžã®ãšã¹ã«ã¬ãŒã·ã§ã³ãããŒã«å
¥åãå®è¡åã«å€æŽããããClaude çšã«è¿œå ã³ã³ããã¹ããæ³šå
¥ããããšãã§ããŸãããªãã·ã§ã³ã®å®å
šãªã»ããã«ã€ããŠã¯ãPreToolUse 決å®å¶åŸ¡ãåç
§ããŠãã ããã
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "Database writes are not allowed"
}
}
hookSpecificOutput ã䜿çšããŠããŠãŒã¶ãŒã«ä»£ãã£ãŠæš©éãªã¯ãšã¹ããèš±å¯ãŸãã¯æåŠããŸããèš±å¯ããå ŽåãããŒã«ã®å
¥åã倿Žããããæš©éã«ãŒã«ãé©çšããŠããŠãŒã¶ãŒãå床ããã³ãããããªãããã«ããããšãã§ããŸãããªãã·ã§ã³ã®å®å
šãªã»ããã«ã€ããŠã¯ãPermissionRequest 決å®å¶åŸ¡ãåç
§ããŠãã ããã
{
"hookSpecificOutput": {
"hookEventName": "PermissionRequest",
"decision": {
"behavior": "allow",
"updatedInput": {
"command": "npm run lint"
}
}
}
}
Bash ã³ãã³ãæ€èšŒãããã³ãã ãã£ã«ã¿ãªã³ã°ãèªåæ¿èªã¹ã¯ãªãããå«ãæ¡åŒµäŸã«ã€ããŠã¯ãã¬ã€ãã®èªååã§ããããšãšBash ã³ãã³ã ããªããŒã¿ãŒ ãªãã¡ã¬ã³ã¹å®è£ ãåç §ããŠãã ããã
ãã㯠ã€ãã³ã
åã€ãã³ã㯠Claude Code ã®ã©ã€ããµã€ã¯ã«å ã®ãã€ã³ãã«å¯Ÿå¿ããããã¯ãå®è¡ã§ããŸãã以äžã®ã»ã¯ã·ã§ã³ã¯ã©ã€ããµã€ã¯ã«ã«äžèŽããé åºã§é 眮ãããŠããŸããã»ãã·ã§ã³ ã»ããã¢ãããã agentic ã«ãŒããçµç±ããŠã»ãã·ã§ã³çµäºãŸã§ãåã»ã¯ã·ã§ã³ã§ã¯ãã€ãã³ãããã€çºç«ãããããµããŒããããããã£ãŒãåãåã JSON å ¥åãåºåãéããåäœå¶åŸ¡æ¹æ³ã«ã€ããŠèª¬æããŠããŸãã
SessionStart
Claude Code ãæ°ããã»ãã·ã§ã³ãéå§ããããæ¢åã®ã»ãã·ã§ã³ãåéãããšãã«å®è¡ãããŸããæ¢åã®åé¡ãæè¿ã®ã³ãŒãããŒã¹å€æŽãªã©ãéçºã³ã³ããã¹ããããŒãããããç°å¢å€æ°ãã»ããã¢ãããããããã®ã«äŸ¿å©ã§ããéçã³ã³ããã¹ãã§ã¹ã¯ãªãããäžèŠãªå Žåã¯ã代ããã«CLAUDE.mdã䜿çšããŠãã ããã
SessionStart ã¯ãã¹ãŠã®ã»ãã·ã§ã³ã§å®è¡ãããããããããã®ããã¯ãé«éã«ä¿ã¡ãŸããtype: "command" ãš type: "mcp_tool" ããã¯ã®ã¿ããµããŒããããŠããŸãã
ãããã£ãŒå€ã¯ã»ãã·ã§ã³ãã©ã®ããã«éå§ããããã«å¯Ÿå¿ããŠããŸãã
| ãããã£ãŒ | ãã€çºç«ããã |
|---|---|
startup |
æ°ããã»ãã·ã§ã³ |
resume |
--resumeã--continueããŸã㯠/resume |
clear |
/clear |
compact |
èªåãŸãã¯ããã¥ã¢ã« ã³ã³ãã¯ã·ã§ã³ |
SessionStart å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãSessionStart ããã¯ã¯ sourceãmodelãããã³ãªãã·ã§ã³ã§ agent_type ãåãåããŸããsource ãã£ãŒã«ãã¯ã»ãã·ã§ã³ãã©ã®ããã«éå§ããããã瀺ããŸããæ°ããã»ãã·ã§ã³ã®å Žå㯠"startup"ãåéãããã»ãã·ã§ã³ã®å Žå㯠"resume"ã/clear ã®åŸã¯ "clear"ãã³ã³ãã¯ã·ã§ã³åŸã¯ "compact"ãmodel ãã£ãŒã«ãã¯ã¢ãã«èå¥åãå«ã¿ãŸããclaude --agent <name> ã§ Claude Code ãéå§ããå Žåãagent_type ãã£ãŒã«ãã¯ãšãŒãžã§ã³ãåãå«ã¿ãŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "SessionStart",
"source": "startup",
"model": "claude-sonnet-4-6"
}
SessionStart 決å®å¶åŸ¡
ãã㯠ã¹ã¯ãªããã stdout ã«åºåããããã¹ã㯠Claude ã®ã³ã³ããã¹ããšããŠè¿œå ãããŸãããã¹ãŠã®ããã¯ã§å©çšå¯èœãªJSON åºåãã£ãŒã«ãã«å ããŠããããã®ã€ãã³ãåºæã®ãã£ãŒã«ããè¿ãããšãã§ããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
additionalContext |
Claude ã®ã³ã³ããã¹ãã®éå§æã«è¿œå ãããæååãæåã®ããã³ããã®åãClaude ã®ã³ã³ããã¹ãã远å ãåç §ããŠãããã¹ããã©ã®ããã«é ä¿¡ãããããäœãå«ãããã確èªããŠãã ãã |
{
"hookSpecificOutput": {
"hookEventName": "SessionStart",
"additionalContext": "Current branch: feat/auth-refactor\nUncommitted changes: src/auth.ts, src/login.tsx\nActive issue: #4211 Migrate to OAuth2"
}
}
ãã®ã€ãã³ãã§ã¯ãã¬ãŒã³ stdout ãæ¢ã« Claude ã«å°éãããããã³ã³ããã¹ãã®ã¿ãããŒãããããã¯ã¯ JSON ãæ§ç¯ããã« stdout ã«çŽæ¥åºåã§ããŸããsuppressOutput ãªã©ã®ä»ã®ãã£ãŒã«ããšã³ã³ããã¹ããçµã¿åãããå¿
èŠãããå Žå㯠JSON 圢åŒã䜿çšããŸãã
ç°å¢å€æ°ãæ°žç¶å
SessionStart ããã¯ã¯ CLAUDE_ENV_FILE ç°å¢å€æ°ã«ã¢ã¯ã»ã¹ã§ããåŸç¶ã® Bash ã³ãã³ãçšã«ç°å¢å€æ°ãæ°žç¶åã§ãããã¡ã€ã« ãã¹ãæäŸããŸãã
åå¥ã®ç°å¢å€æ°ãèšå®ããã«ã¯ãexport ã¹ããŒãã¡ã³ãã CLAUDE_ENV_FILE ã«æžã蟌ã¿ãŸããä»ã®ããã¯ã§èšå®ããã倿°ãä¿æããã«ã¯ã远å ïŒ>>ïŒã䜿çšããŸãã
#!/bin/bash
if [ -n "$CLAUDE_ENV_FILE" ]; then
echo 'export NODE_ENV=production' >> "$CLAUDE_ENV_FILE"
echo 'export DEBUG_LOG=true' >> "$CLAUDE_ENV_FILE"
echo 'export PATH="$PATH:./node_modules/.bin"' >> "$CLAUDE_ENV_FILE"
fi
exit 0
ç°å¢ããã®ãã¹ãŠã®å€æŽããã£ããã£ããã«ã¯ãã»ããã¢ãã ã³ãã³ãã®ååŸã§ãšã¯ã¹ããŒãããã倿°ãæ¯èŒããŸãã
#!/bin/bash
ENV_BEFORE=$(export -p | sort)
# ç°å¢ã倿Žããã»ããã¢ãã ã³ãã³ããå®è¡
source ~/.nvm/nvm.sh
nvm use 20
if [ -n "$CLAUDE_ENV_FILE" ]; then
ENV_AFTER=$(export -p | sort)
comm -13 <(echo "$ENV_BEFORE") <(echo "$ENV_AFTER") >> "$CLAUDE_ENV_FILE"
fi
exit 0
ãã®ãã¡ã€ã«ã«æžã蟌ãŸãã倿°ã¯ãã»ãã·ã§ã³äžã« Claude Code ãå®è¡ãããã¹ãŠã®åŸç¶ã® Bash ã³ãã³ãã§å©çšå¯èœã«ãªããŸãã
CLAUDE_ENV_FILE 㯠SessionStartãSetupãCwdChangedãFileChangedããã¯ã§å©çšå¯èœã§ããä»ã®ãã㯠ã¿ã€ãã¯ãã®å€æ°ã«ã¢ã¯ã»ã¹ã§ããŸããã
Setup
--init-only ã§ Claude Code ãèµ·åããããããªã³ã ã¢ãŒãïŒ-pïŒã§ --init ãŸã㯠--maintenance ã§èµ·åãããšãã®ã¿çºç«ããŸããéåžžã®ã¹ã¿ãŒãã¢ããã§ã¯çºç«ããŸãããCI ãŸãã¯ã¹ã¯ãªããããæç€ºçã«ããªã¬ãŒãã 1 åéãã®äŸåé¢ä¿ã€ã³ã¹ããŒã«ãŸãã¯ã¹ã±ãžã¥ãŒã«æžã¿ã¯ãªãŒã³ã¢ããã«äœ¿çšããŸããéåžžã®ã»ãã·ã§ã³ ã¹ã¿ãŒãã¢ãããšã¯å¥ã§ããã»ãã·ã§ã³ããšã®åæåã®å Žåã¯ã代ããã«SessionStartã䜿çšããŠãã ããã
ãããã£ãŒå€ã¯ããã¯ãããªã¬ãŒãã CLI ãã©ã°ã«å¯Ÿå¿ããŠããŸãã
| ãããã£ãŒ | ãã€çºç«ããã |
|---|---|
init |
claude --init-only ãŸã㯠claude -p --init |
maintenance |
claude -p --maintenance |
--init-only 㯠Setup ããã¯ãš startup ãããã£ãŒãæã€ SessionStart ããã¯ãå®è¡ããŠãããäŒè©±ãéå§ããã«çµäºããŸãã--init ãš --maintenance 㯠-pïŒããªã³ã ã¢ãŒãïŒãšçµã¿åãããå Žåã®ã¿ Setup ããã¯ãçºç«ãããŸãã察話åã»ãã·ã§ã³ã§ã¯ãããã 2 ã€ã®ãã©ã°ã¯çŸåš Setup ããã¯ãçºç«ãããŸããã
Setup ã¯ãã¹ãŠã®èµ·åã§çºç«ããªããããäŸåé¢ä¿ãã€ã³ã¹ããŒã«ãããŠããå¿
èŠããããã©ã°ã€ã³ã¯ Setup ã®ã¿ã«äŸåã§ããŸãããå®çšçãªãã¿ãŒã³ã¯ãæåã®äœ¿çšæã«äŸåé¢ä¿ããã§ãã¯ããæ¬ èœããŠããå Žåã¯ã€ã³ã¹ããŒã«ããããšã§ããäŸãã°ã${CLAUDE_PLUGIN_DATA}/node_modules ããã¹ãããæ¬ èœããŠããå Žå㯠npm install ãå®è¡ããããã¯ãŸãã¯ã¹ãã«ãæ°žç¶ããŒã¿ ãã£ã¬ã¯ããªã«ã€ããŠã¯ãæ°žç¶ããŒã¿ ãã£ã¬ã¯ããªãåç
§ããŠãã€ã³ã¹ããŒã«ãããäŸåé¢ä¿ãä¿åããå Žæã確èªããŠãã ããã
Setup å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãSetup ããã¯ã¯ trigger ãã£ãŒã«ããåãåããŸãããã㯠"init" ãŸã㯠"maintenance" ã«èšå®ãããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "Setup",
"trigger": "init"
}
Setup 決å®å¶åŸ¡
Setup ããã¯ã¯ãããã¯ã§ããŸãããçµäºã³ãŒã 2 ã§ã¯ãstderr ããŠãŒã¶ãŒã«è¡šç€ºãããŸãããã®ä»ã®éãŒãçµäºã³ãŒãã§ã¯ãstderr 㯠--verbose ã§èµ·åããå Žåã®ã¿è¡šç€ºãããŸããã©ã¡ãã®å Žåãå®è¡ã¯ç¶è¡ãããŸããClaude ã®ã³ã³ããã¹ãã«æ
å ±ãæž¡ãã«ã¯ãJSON åºåã§ additionalContext ãè¿ããŸãããã¬ãŒã³ stdout ã¯ãããã° ãã°ã«ã®ã¿æžã蟌ãŸããŸãããã¹ãŠã®ããã¯ã§å©çšå¯èœãªJSON åºåãã£ãŒã«ãã«å ããŠããããã®ã€ãã³ãåºæã®ãã£ãŒã«ããè¿ãããšãã§ããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
additionalContext |
Claude ã®ã³ã³ããã¹ãã«è¿œå ãããæååãè€æ°ã®ããã¯ã®å€ã¯é£çµãããŸã |
{
"hookSpecificOutput": {
"hookEventName": "Setup",
"additionalContext": "Dependencies installed: node_modules, .venv"
}
}
Setup ããã¯ã¯ CLAUDE_ENV_FILE ã«ã¢ã¯ã»ã¹ã§ããŸãããã®ãã¡ã€ã«ã«æžã蟌ãŸãã倿°ã¯ãSessionStart ããã¯ãšåãããã«ãã»ãã·ã§ã³äžã®åŸç¶ã® Bash ã³ãã³ãã«æ°žç¶åãããŸããtype: "command" ãš type: "mcp_tool" ããã¯ã®ã¿ããµããŒããããŠããŸãã
InstructionsLoaded
CLAUDE.md ãŸã㯠.claude/rules/*.md ãã¡ã€ã«ãã³ã³ããã¹ãã«ããŒãããããšãã«çºç«ããŸãããã®ã€ãã³ãã¯ã»ãã·ã§ã³éå§æã«ç±å¿ã«ããŒãããããã¡ã€ã«ã«å¯ŸããŠçºç«ããåŸã§ Claude ããã¹ãããã CLAUDE.md ãå«ããµããã£ã¬ã¯ããªã«ã¢ã¯ã»ã¹ãããšããªã©ãé
å»¶ããŒãããããã¡ã€ã«ã«å¯ŸããŠå床çºç«ããŸãããŸã㯠paths: ããã³ããã¿ãŒãæã€æ¡ä»¶ä»ãã«ãŒã«ãããããããšããããã¯ã¯ããããã³ã°ãŸãã¯æ±ºå®å¶åŸ¡ããµããŒãããŸããã芳枬å¯èœæ§ã®ç®çã§éåæã«å®è¡ãããŸãã
ãããã£ãŒã¯ load_reason ã«å¯ŸããŠå®è¡ãããŸããäŸãã°ã"matcher": "session_start" ã䜿çšããŠã»ãã·ã§ã³éå§æã«ããŒãããããã¡ã€ã«ã®ã¿ã«å¯ŸããŠçºç«ãããã"matcher": "path_glob_match|nested_traversal" ã䜿çšããŠé
å»¶ããŒãã®ã¿ã«å¯ŸããŠçºç«ããŸãã
InstructionsLoaded å ¥å
å ±éå ¥åãã£ãŒã«ãã«å ããŠãInstructionsLoaded ããã¯ã¯ãããã®ãã£ãŒã«ããåãåããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
file_path |
ããŒããããåœä»€ãã¡ã€ã«ãžã®çµ¶å¯Ÿãã¹ |
memory_type |
ãã¡ã€ã«ã®ã¹ã³ãŒã: "User"ã"Project"ã"Local"ããŸã㯠"Managed" |
load_reason |
ãã¡ã€ã«ãããŒããããçç±: "session_start"ã"nested_traversal"ã"path_glob_match"ã"include"ããŸã㯠"compact"ã"compact" å€ã¯ã³ã³ãã¯ã·ã§ã³ ã€ãã³ãåŸã«åœä»€ãã¡ã€ã«ãåããŒãããããšãã«çºç«ããŸã |
globs |
ãã¡ã€ã«ã® paths: ããã³ããã¿ãŒããã®ãã¹ ã°ãã ãã¿ãŒã³ïŒååšããå ŽåïŒãpath_glob_match ããŒãã®å Žåã®ã¿ååš |
trigger_file_path |
é å»¶ããŒãã®å Žåããã®ããŒããããªã¬ãŒãããã¡ã€ã«ãžã®ãã¹ |
parent_file_path |
include ããŒãã®å Žåããã®ãã¡ã€ã«ãå«ã芪åœä»€ãã¡ã€ã«ãžã®ãã¹ |
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../transcript.jsonl",
"cwd": "/Users/my-project",
"hook_event_name": "InstructionsLoaded",
"file_path": "/Users/my-project/CLAUDE.md",
"memory_type": "Project",
"load_reason": "session_start"
}
InstructionsLoaded 決å®å¶åŸ¡
InstructionsLoaded ããã¯ã¯æ±ºå®å¶åŸ¡ããããŸãããåœä»€ããŒãããããã¯ãŸãã¯å€æŽã§ããŸããããã®ã€ãã³ããç£æ»ãã°ãã³ã³ãã©ã€ã¢ã³ã¹è¿œè·¡ããŸãã¯èŠ³æž¬å¯èœæ§ã«äœ¿çšããŸãã
UserPromptSubmit
ãŠãŒã¶ãŒãããã³ãããéä¿¡ãããšãã«å®è¡ãããŸããClaude ããããåŠçããåã«ãããã«ãããããã³ãã/äŒè©±ã«åºã¥ããŠè¿œå ã³ã³ããã¹ãã远å ããããããã³ãããæ€èšŒããããç¹å®ã®ã¿ã€ãã®ããã³ããããããã¯ãããã§ããŸãã
UserPromptSubmit ããã¯ã¯ commandãhttpãmcp_tool ã¿ã€ãã®ããã©ã«ã ã¿ã€ã ã¢ãŠãã 30 ç§ã§ãä»ã®ã€ãã³ãã§ã®ãããã®ã¿ã€ãã® 600 ç§ã®ããã©ã«ãããçããªã£ãŠããŸãããã®ããã¯ã¯ãã¹ãŠã®ããã³ããã®åã«å®è¡ãããã¢ãã«åŠçããããå®äºãããŸã§ãããã¯ããããããã¹ã¿ãã¯ããããã¯ã¯ã»ãã·ã§ã³ã忢ãããŸããããã¯ã«ããå€ãã®æéãå¿
èŠãªå Žåã¯ããã㯠ãšã³ããªã§ timeout ãã£ãŒã«ããèšå®ããŸãã
UserPromptSubmit å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãUserPromptSubmit ããã¯ã¯ãŠãŒã¶ãŒãéä¿¡ããããã¹ããå«ã prompt ãã£ãŒã«ããåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "UserPromptSubmit",
"prompt": "Write a function to calculate the factorial of a number"
}
UserPromptSubmit 決å®å¶åŸ¡
UserPromptSubmit ããã¯ã¯ããŠãŒã¶ãŒ ããã³ãããåŠçããããã©ãããå¶åŸ¡ããã³ã³ããã¹ãã远å ã§ããŸãããã¹ãŠã®JSON åºåãã£ãŒã«ããå©çšå¯èœã§ãã
çµäºã³ãŒã 0 ã§äŒè©±ã«ã³ã³ããã¹ãã远å ãã 2 ã€ã®æ¹æ³ããããŸãã
- ãã¬ãŒã³ ããã¹ã stdout: stdout ã«æžã蟌ãŸãã JSON 以å€ã®ããã¹ãã¯ã³ã³ããã¹ããšããŠè¿œå ãããŸã
additionalContextãå«ã JSON: ããå€ãã®å¶åŸ¡ã®ããã«ä»¥äžã® JSON 圢åŒã䜿çšããŸããadditionalContextãã£ãŒã«ãã¯ã³ã³ããã¹ããšããŠè¿œå ãããŸã
ãã¬ãŒã³ stdout ã¯ãã©ã³ã¹ã¯ãªããã®ããã¯åºåãšããŠè¡šç€ºãããŸããadditionalContext ãã£ãŒã«ãã¯ããæ
éã«è¿œå ãããŸãã
ããã³ããããããã¯ããã«ã¯ãdecision ã "block" ã«èšå®ãã JSON ãªããžã§ã¯ããè¿ããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
decision |
"block" ã¯ããã³ãããåŠçãããã®ãé²ããã³ã³ããã¹ãããæ¶å»ããŸããèš±å¯ããã«ã¯çç¥ |
reason |
decision ã "block" ã®ãšãã«ãŠãŒã¶ãŒã«è¡šç€ºãããŸããã³ã³ããã¹ãã«è¿œå ãããŸãã |
additionalContext |
Claude ã®ã³ã³ããã¹ãã«è¿œå ãããæååãClaude ã®ã³ã³ããã¹ãã远å ãåç §ããŠãã ãã |
sessionTitle |
ã»ãã·ã§ã³ ã¿ã€ãã«ãèšå®ããŸããããã³ãã ã³ã³ãã³ãã«åºã¥ããŠã»ãã·ã§ã³ãèªåçã«ååä»ãããã®ã«äœ¿çš |
{
"decision": "block",
"reason": "Explanation for decision",
"hookSpecificOutput": {
"hookEventName": "UserPromptSubmit",
"additionalContext": "My additional context here",
"sessionTitle": "My session title"
}
}
JSON 圢åŒã¯åçŽãªãŠãŒã¹ã±ãŒã¹ã«ã¯å¿ é ã§ã¯ãããŸãããã³ã³ããã¹ãã远å ããã«ã¯ãçµäºã³ãŒã 0 ã§ stdout ã«ãã¬ãŒã³ ããã¹ããåºåã§ããŸããããã³ããããããã¯ãããå ŽåããŸãã¯ããæ§é åãããå¶åŸ¡ãå¿ èŠãªå Žå㯠JSON ã䜿çšããŸãã
UserPromptExpansion
ãŠãŒã¶ãŒãå
¥åããã¹ã©ãã·ã¥ ã³ãã³ãã Claude ã«å°éããåã«ããã³ããã«å±éããããšãã«å®è¡ãããŸããç¹å®ã®ã³ãã³ããçŽæ¥åŒã³åºããããããã¯ããããç¹å®ã®ã¹ãã«ã®ã³ã³ããã¹ããæ³šå
¥ãããããŠãŒã¶ãŒãåŒã³åºãã³ãã³ãããã°ãããããã®ã«äœ¿çšããŸããäŸãã°ãdeploy ã«ãããããããã¯ã¯ãæ¿èªãã¡ã€ã«ãååšããªãéã /deploy ããããã¯ã§ããŸãããŸãã¯ãã¬ãã¥ãŒ ã¹ãã«ã«ãããããããã¯ã¯ããŒã ã®ã¬ãã¥ãŒ ãã§ãã¯ãªã¹ãã additionalContext ãšããŠè¿œå ã§ããŸãã
ãã®ã€ãã³ã㯠PreToolUse ãã«ããŒããªããã¹ãã«ããŒããŸããPreToolUse ããã¯ã Skill ããŒã«ã«ãããããã®ã¯ Claude ãããŒã«ãåŒã³åºããšãã®ã¿ã§ããã/skillname ãçŽæ¥å
¥åãããš PreToolUse ããã€ãã¹ããŸããUserPromptExpansion ã¯ãã®çŽæ¥ãã¹ã§çºç«ããŸãã
command_name ã§ãããããŸãããããã£ãŒã空ã®ãŸãŸã«ããŠããã¹ãŠã®ããã³ãã ã¿ã€ãã®ã¹ã©ãã·ã¥ ã³ãã³ãã§çºç«ããŸãã
UserPromptExpansion å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãUserPromptExpansion ããã¯ã¯ expansion_typeãcommand_nameãcommand_argsãcommand_sourceãããã³å
ã® prompt æååãåãåããŸããexpansion_type ãã£ãŒã«ãã¯ã¹ãã«ãšã«ã¹ã¿ã ã³ãã³ãã®å Žå㯠slash_commandãMCP ãµãŒã㌠ããã³ããã®å Žå㯠mcp_prompt ã§ãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../00893aaf.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "UserPromptExpansion",
"expansion_type": "slash_command",
"command_name": "example-skill",
"command_args": "arg1 arg2",
"command_source": "plugin",
"prompt": "/example-skill arg1 arg2"
}
UserPromptExpansion 決å®å¶åŸ¡
UserPromptExpansion ããã¯ã¯å±éããããã¯ããããã³ã³ããã¹ãã远å ã§ããŸãããã¹ãŠã®JSON åºåãã£ãŒã«ããå©çšå¯èœã§ãã
| ãã£ãŒã«ã | 説æ |
|---|---|
decision |
"block" ã¯ã¹ã©ãã·ã¥ ã³ãã³ããå±éãããã®ã鲿¢ãèš±å¯ããã«ã¯çç¥ |
reason |
decision ã "block" ã®ãšãã«ãŠãŒã¶ãŒã«è¡šç€ºãããŸã |
additionalContext |
å±éãããããã³ãããšäžç·ã« Claude ã®ã³ã³ããã¹ãã«è¿œå ãããæååãClaude ã®ã³ã³ããã¹ãã远å ãåç §ããŠãã ãã |
{
"decision": "block",
"reason": "This slash command is not available",
"hookSpecificOutput": {
"hookEventName": "UserPromptExpansion",
"additionalContext": "Additional context for this expansion"
}
}
PreToolUse
Claude ãããŒã« ãã©ã¡ãŒã¿ãŒãäœæããåŸãããŒã«åŒã³åºããåŠçããåã«å®è¡ãããŸããããŒã«åã§ãããããŸããBashãEditãWriteãReadãGlobãGrepãAgentãWebFetchãWebSearchãAskUserQuestionãExitPlanModeãããã³ä»»æã®MCP ããŒã«åã
PreToolUse 決å®å¶åŸ¡ã䜿çšããŠãããŒã«ã®äœ¿çšãèš±å¯ãæåŠã質åããŸãã¯é å»¶ããŸãã
PreToolUse å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãPreToolUse ããã¯ã¯ tool_nameãtool_inputãtool_use_id ãåãåããŸããtool_input ãã£ãŒã«ãã¯ããŒã«ã«äŸåããŸãã
Bash
ã·ã§ã« ã³ãã³ããå®è¡ããŸãã
| ãã£ãŒã«ã | ã¿ã€ã | äŸ | 説æ |
|---|---|---|---|
command |
æåå | "npm test" |
å®è¡ããã·ã§ã« ã³ãã³ã |
description |
æåå | "Run test suite" |
ã³ãã³ããäœããããã®ãªãã·ã§ã³èª¬æ |
timeout |
æ°å€ | 120000 |
ããªç§åäœã®ãªãã·ã§ã³ ã¿ã€ã ã¢ãŠã |
run_in_background |
ããŒã«å€ | false |
ã³ãã³ããããã¯ã°ã©ãŠã³ãã§å®è¡ãããã©ãã |
Write
ãã¡ã€ã«ãäœæãŸãã¯äžæžãããŸãã
| ãã£ãŒã«ã | ã¿ã€ã | äŸ | 説æ |
|---|---|---|---|
file_path |
æåå | "/path/to/file.txt" |
æžã蟌ããã¡ã€ã«ãžã®çµ¶å¯Ÿãã¹ |
content |
æåå | "file content" |
ãã¡ã€ã«ã«æžã蟌ãã³ã³ãã³ã |
Edit
æ¢åãã¡ã€ã«å ã®æååã眮æããŸãã
| ãã£ãŒã«ã | ã¿ã€ã | äŸ | 説æ |
|---|---|---|---|
file_path |
æåå | "/path/to/file.txt" |
ç·šéãããã¡ã€ã«ãžã®çµ¶å¯Ÿãã¹ |
old_string |
æåå | "original text" |
æ€çŽ¢ããŠçœ®æããããã¹ã |
new_string |
æåå | "replacement text" |
眮æããã¹ã |
replace_all |
ããŒã«å€ | false |
ãã¹ãŠã®åºçŸã眮æãããã©ãã |
Read
ãã¡ã€ã« ã³ã³ãã³ããèªã¿åããŸãã
| ãã£ãŒã«ã | ã¿ã€ã | äŸ | 説æ |
|---|---|---|---|
file_path |
æåå | "/path/to/file.txt" |
èªã¿åããã¡ã€ã«ãžã®çµ¶å¯Ÿãã¹ |
offset |
æ°å€ | 10 |
èªã¿åããéå§ããè¡çªå·ã®ãªãã·ã§ã³ |
limit |
æ°å€ | 50 |
èªã¿åãè¡æ°ã®ãªãã·ã§ã³ |
Glob
ã°ãã ãã¿ãŒã³ã«ããããããã¡ã€ã«ãæ€çŽ¢ããŸãã
| ãã£ãŒã«ã | ã¿ã€ã | äŸ | 説æ |
|---|---|---|---|
pattern |
æåå | "**/*.ts" |
ãã¡ã€ã«ã«ãããããã°ãã ãã¿ãŒã³ |
path |
æåå | "/path/to/dir" |
æ€çŽ¢ãããªãã·ã§ã³ ãã£ã¬ã¯ããªãããã©ã«ãã¯çŸåšã®äœæ¥ãã£ã¬ã¯ã㪠|
Grep
æ£èŠè¡šçŸã§ãã¡ã€ã« ã³ã³ãã³ããæ€çŽ¢ããŸãã
| ãã£ãŒã«ã | ã¿ã€ã | äŸ | 説æ |
|---|---|---|---|
pattern |
æåå | "TODO.*fix" |
æ€çŽ¢ããæ£èŠè¡šçŸãã¿ãŒã³ |
path |
æåå | "/path/to/dir" |
æ€çŽ¢ãããªãã·ã§ã³ ãã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ã㪠|
glob |
æåå | "*.ts" |
ãã¡ã€ã«ããã£ã«ã¿ãªã³ã°ãããªãã·ã§ã³ ã°ãã ãã¿ãŒã³ |
output_mode |
æåå | "content" |
"content"ã"files_with_matches"ããŸã㯠"count"ãããã©ã«ã㯠"files_with_matches" |
-i |
ããŒã«å€ | true |
倧æåå°æåãåºå¥ããªãæ€çŽ¢ |
multiline |
ããŒã«å€ | false |
è€æ°è¡ãããã³ã°ãæå¹å |
WebFetch
Web ã³ã³ãã³ããååŸããŠåŠçããŸãã
| ãã£ãŒã«ã | ã¿ã€ã | äŸ | 説æ |
|---|---|---|---|
url |
æåå | "https://example.com/api" |
ã³ã³ãã³ããååŸãã URL |
prompt |
æåå | "Extract the API endpoints" |
ååŸããã³ã³ãã³ãã§å®è¡ããããã³ãã |
WebSearch
Web ãæ€çŽ¢ããŸãã
| ãã£ãŒã«ã | ã¿ã€ã | äŸ | 説æ |
|---|---|---|---|
query |
æåå | "react hooks best practices" |
æ€çŽ¢ã¯ãšãª |
allowed_domains |
é å | ["docs.example.com"] |
ãªãã·ã§ã³: ãããã®ãã¡ã€ã³ããã®ã¿çµæãå«ãã |
blocked_domains |
é å | ["spam.example.com"] |
ãªãã·ã§ã³: ãããã®ãã¡ã€ã³ããã®çµæãé€å€ |
Agent
ãµããšãŒãžã§ã³ããçæããŸãã
| ãã£ãŒã«ã | ã¿ã€ã | äŸ | 説æ |
|---|---|---|---|
prompt |
æåå | "Find all API endpoints" |
ãšãŒãžã§ã³ããå®è¡ããã¿ã¹ã¯ |
description |
æåå | "Find API endpoints" |
ã¿ã¹ã¯ã®çã説æ |
subagent_type |
æåå | "Explore" |
䜿çšããç¹æ®ãšãŒãžã§ã³ãã®ã¿ã€ã |
model |
æåå | "sonnet" |
ããã©ã«ãããªãŒããŒã©ã€ããããªãã·ã§ã³ ã¢ãã« ãšã€ãªã¢ã¹ |
PostToolUse ã§ã¯ãå®äºãã Agent åŒã³åºãã® tool_response ã¯ãµããšãŒãžã§ã³ãã®æçµããã¹ããšäœ¿çšãã¬ã¡ããªãå«ã¿ãŸããããã¯ãããµããšãŒãžã§ã³ãåäœã®ã³ã¹ããèšé²ããããã«ãããã®ãã£ãŒã«ããèªã¿åããŸãã
| ãã£ãŒã«ã | ã¿ã€ã | äŸ | 説æ |
|---|---|---|---|
status |
æåå | "completed" |
åæåŒã³åºãã®å Žå㯠"completed"ãrun_in_background: true ã®å Žå㯠"async_launched" |
agentId |
æåå | "a4d2c8f1e0b3a297" |
ãµããšãŒãžã§ã³ãå®è¡ã®èå¥å |
content |
é å | [{"type": "text", "text": "Found 12 endpoints..."}] |
ãµããšãŒãžã§ã³ãã®æçµããã¹ã ããã㯠|
totalTokens |
æ°å€ | 12450 |
ãµããšãŒãžã§ã³ãã®ã¿ãŒã³å šäœã§è«æ±ãããããŒã¯ã³åèš |
totalDurationMs |
æ°å€ | 48211 |
ãµããšãŒãžã§ã³ãå®è¡ã®å®æé |
totalToolUseCount |
æ°å€ | 7 |
ãµããšãŒãžã§ã³ããè¡ã£ãããŒã«åŒã³åºãã®æ° |
usage |
ãªããžã§ã¯ã | {"input_tokens": 8320, ...} |
ã¿ã€ãå¥ããŒã¯ã³åè§£: input_tokensãoutput_tokensãcache_creation_input_tokensãcache_read_input_tokens |
run_in_background: true åŒã³åºãã®å ŽåãããŒã«ã¯ãµããšãŒãžã§ã³ãèµ·ååŸããã«è¿ããããããtool_response ã¯äœ¿çšãã£ãŒã«ããå«ã¿ãŸãããstatus: "async_launched"ãagentIdãdescriptionãpromptãoutputFile ãå«ã¿ãŸãã
AskUserQuestion
ãŠãŒã¶ãŒã« 1 ã€ãã 4 ã€ã®è€æ°éžæè¢ã®è³ªåãããŸãã
| ãã£ãŒã«ã | ã¿ã€ã | äŸ | 説æ |
|---|---|---|---|
questions |
é å | [{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}] |
æç€ºãã質åãå質åã«ã¯ question æååãçã headerãoptions é
åãããã³ãªãã·ã§ã³ã® multiSelect ãã©ã°ããããŸã |
answers |
ãªããžã§ã¯ã | {"Which framework?": "React"} |
ãªãã·ã§ã³ã質åããã¹ããéžæããããªãã·ã§ã³ ã©ãã«ã«ãããããŸããè€æ°éžæã®åçã¯ã©ãã«ãã³ã³ãã§çµåããŸããClaude ã¯ãã®ãã£ãŒã«ããèšå®ããŸãããupdatedInput çµç±ã§æäŸããŠãããã°ã©ã ã§åçããŸã |
ExitPlanMode
Claude ããã©ã³ ã¢ãŒããé¢ããåã«ãã©ã³ãæç€ºãããŠãŒã¶ãŒã«æ¿èªãæ±ããŸããClaude ã¯ããŒã«ãåŒã³åºãåã«ãã©ã³ããã£ã¹ã¯äžã®ãã¡ã€ã«ã«æžã蟌ããããã¢ãã«ããã®ãªãã©ã« tool_input 㯠allowedPrompts ã®ã¿ãå«ã¿ãŸããClaude Code ã¯ãã©ã³ ã³ã³ãã³ããšãã¡ã€ã« ãã¹ãããã¯ã«æž¡ãåã«æ³šå
¥ããŸãã
| ãã£ãŒã«ã | ã¿ã€ã | äŸ | 説æ |
|---|---|---|---|
plan |
æåå | "## Refactor auth\n1. Extract..." |
Markdown ã®ãã©ã³ ã³ã³ãã³ãããã£ã¹ã¯äžã®ãã©ã³ ãã¡ã€ã«ããæ³šå ¥ |
planFilePath |
æåå | "/Users/.../plans/refactor-auth.md" |
ãã©ã³ ãã¡ã€ã«ãžã®ãã¹ãæ³šå ¥ |
allowedPrompts |
é å | [{"tool": "Bash", "prompt": "run tests"}] |
ãªãã·ã§ã³ãClaude ããã©ã³ãå®è£
ããããã«èŠæ±ããŠããããã³ãã ããŒã¹ã®æš©éãåãšã³ããªã¯ tool åãšã¢ã¯ã·ã§ã³ã®ã«ããŽãªã説æãã prompt ãå«ã¿ãŸã |
PostToolUse ã§ã¯ãtool_response 㯠plan ãš filePath ãã£ãŒã«ããå«ããªããžã§ã¯ãã§ãæ¿èªããããã©ã³ãšå
éšã¹ããŒã¿ã¹ ãã©ã°ãä¿æããŸãããã£ã¹ã¯ãããã¡ã€ã«ãå床èªã¿åãã®ã§ã¯ãªããtool_response.plan ã§ãã©ã³ ã³ã³ãã³ããèªã¿åããŸãã
PreToolUse 決å®å¶åŸ¡
PreToolUse ããã¯ã¯ããŒã«åŒã³åºããé²è¡ãããã©ãããå¶åŸ¡ã§ããŸãããããã¬ãã« decision ãã£ãŒã«ãã䜿çšããä»ã®ããã¯ãšã¯ç°ãªããPreToolUse 㯠hookSpecificOutput ãªããžã§ã¯ãå
ã«æ±ºå®ãè¿ããŸããããã«ãããããè±ããªå¶åŸ¡ãå¯èœã«ãªããŸãã4 ã€ã®çµæïŒèš±å¯ãæåŠã質åãé
å»¶ïŒãšãå®è¡åã«ããŒã«å
¥åã倿Žããæ©èœã
| ãã£ãŒã«ã | 説æ |
|---|---|
permissionDecision |
"allow" ã¯ããŒã«åŒã³åºããã¹ãããããŸãã"deny" ã¯ããŒã«åŒã³åºãã鲿¢ããŸãã"ask" ã¯ãŠãŒã¶ãŒã«ç¢ºèªãä¿ããŸãã"defer" ã¯åªé
ã«çµäºããŠãããŒã«ãåŸã§åéã§ããããã«ããŸããæåŠãšè³ªåã«ãŒã«ã¯ãããã¯ãè¿ãå
容ã«é¢ä¿ãªãåŒãç¶ãè©äŸ¡ãããŸã |
permissionDecisionReason |
"allow" ãš "ask" ã®å ŽåããŠãŒã¶ãŒã«è¡šç€ºãããŸãã Claude ã«ã¯è¡šç€ºãããŸããã"deny" ã®å ŽåãClaude ã«è¡šç€ºãããŸãã"defer" ã®å Žåãç¡èŠãããŸã |
updatedInput |
å®è¡åã«ããŒã«ã®å
¥åãã©ã¡ãŒã¿ãŒã倿ŽããŸããå
¥åãªããžã§ã¯ãå
šäœã眮ãæããããã倿ŽãããŠããªããã£ãŒã«ãã倿Žããããã£ãŒã«ããšäžç·ã«å«ããŸãã"allow" ãšçµã¿åãããŠèªåæ¿èªãããã"ask" ãšçµã¿åãããŠå€æŽãããå
¥åããŠãŒã¶ãŒã«è¡šç€ºããŸãã"defer" ã®å Žåãç¡èŠãããŸã |
additionalContext |
ããŒã«å®è¡åã« Claude ã®ã³ã³ããã¹ãã«è¿œå ãããæååã"defer" ã®å Žåãç¡èŠãããŸããClaude ã®ã³ã³ããã¹ãã远å ãåç
§ããŠãã ãã |
è€æ°ã® PreToolUse ããã¯ãç°ãªã決å®ãè¿ãå Žåãåªå
é äœã¯ deny > defer > ask > allow ã§ãã
ããã¯ã "ask" ãè¿ããšããŠãŒã¶ãŒã«è¡šç€ºãããæš©éããã³ããã«ã¯ãããã¯ã®åºæãèå¥ããã©ãã«ãå«ãŸããŸããäŸãã°ã[User]ã[Project]ã[Plugin]ããŸã㯠[Local]ãããã«ããããŠãŒã¶ãŒã¯ã©ã®èšå®ãœãŒã¹ã確èªãèŠæ±ããŠããããçè§£ã§ããŸãã
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"permissionDecisionReason": "My reason here",
"updatedInput": {
"field_to_modify": "new value"
},
"additionalContext": "Current environment: production. Proceed with caution."
}
}
AskUserQuestion ãš ExitPlanMode ã¯ãŠãŒã¶ãŒæäœãå¿
èŠã§ãéåžžã¯é察話åã¢ãŒãã§ -p ãã©ã°ã§ãããã¯ããŸããpermissionDecision: "allow" ã updatedInput ãšäžç·ã«è¿ãããšã§ãã®èŠä»¶ãæºãããŸããããã¯ã¯ stdin ããããŒã«ã®å
¥åãèªã¿åããç¬èªã® UI ãéããŠåçãåéããããŒã«ãããã³ãããªãã§å®è¡ãããããã« updatedInput ã§è¿ããŸãã"allow" ã®ã¿ãè¿ãããšã¯ãããã®ããŒã«ã«ã¯ååã§ã¯ãããŸãããAskUserQuestion ã®å Žåãå
ã® questions é
åããšã³ãŒããã¯ããå質åã®ããã¹ããéžæãããåçã«ããããã answers ãªããžã§ã¯ãã远å ããŸãã
PreToolUse ã¯ä»¥åããããã¬ãã« decision ãš reason ãã£ãŒã«ãã䜿çšããŠããŸãããããã®ã€ãã³ãã§ã¯éæšå¥šã§ãã代ããã« hookSpecificOutput.permissionDecision ãš hookSpecificOutput.permissionDecisionReason ã䜿çšããŠãã ãããéæšå¥šã®å€ "approve" ãš "block" 㯠"allow" ãš "deny" ã«ããããããŸããPostToolUse ãš Stop ãªã©ã®ä»ã®ã€ãã³ãã¯ãçŸåšã®åœ¢åŒãšããŠãããã¬ãã« decision ãš reason ã䜿çšãç¶ããŸãã
ããŒã«åŒã³åºããåŸã§åéããããã«é å»¶
"defer" 㯠claude -p ããµãããã»ã¹ãšããŠå®è¡ãããã® JSON åºåãèªã¿åã Agent SDK ã¢ããªãŸãã¯ã«ã¹ã¿ã UI ãªã©ã®çµ±åçšã§ããããã«ããããã®åŒã³åºãããã»ã¹ã¯ Claude ãããŒã«åŒã³åºãã§äžæåæ¢ããç¬èªã®ã€ã³ã¿ãŒãã§ãŒã¹ãéããŠå
¥åãåéããäžæãããšããããåéã§ããŸããClaude Code ã¯é察話åã¢ãŒãã§ -p ãã©ã°ã§ã®ã¿ãã®å€ãå°éããŸãã察話åã»ãã·ã§ã³ã§ã¯ãã°èŠåãèšé²ããããã¯çµæãç¡èŠããŸãã
defer å€ã«ã¯ Claude Code v2.1.89 以éãå¿
èŠã§ãã以åã®ããŒãžã§ã³ã¯ãããèªèãããããŒã«ã¯éåžžã®æš©éãããŒãéããŠé²è¡ããŸãã
AskUserQuestion ããŒã«ãå
žåçãªã±ãŒã¹ã§ããClaude ã¯ãŠãŒã¶ãŒã«äœããå°ãããã®ã§ãããå¿çããã¿ãŒããã«ããããŸãããã©ãŠã³ã ããªããã¯æ¬¡ã®ããã«æ©èœããŸãã
- Claude ã
AskUserQuestionãåŒã³åºããŸããPreToolUseããã¯ãçºç«ããŸãã - ããã¯ã¯
permissionDecision: "defer"ãè¿ããŸããããŒã«ã¯å®è¡ãããŸãããããã»ã¹ã¯stop_reason: "tool_deferred"ã§çµäºãããã©ã³ã¹ã¯ãªããã«ä¿çäžã®ããŒã«åŒã³åºããä¿æãããŸãã - åŒã³åºãããã»ã¹ã¯ SDK çµæãã
deferred_tool_useãèªã¿åããç¬èªã® UI ã§è³ªåã衚瀺ããåçãåŸ ã¡ãŸãã - åŒã³åºãããã»ã¹ã¯
claude -p --resume <session-id>ãå®è¡ããŸããåãããŒã«åŒã³åºããPreToolUseãå床çºç«ãããŸãã - ããã¯ã¯
permissionDecision: "allow"ãè¿ããupdatedInputã«åçãå«ããŸããããŒã«ãå®è¡ãããClaude ãç¶è¡ããŸãã
deferred_tool_use ãã£ãŒã«ãã¯ããŒã«ã® idãnameãinput ãå«ã¿ãŸããinput ã¯å®è¡åã«ãã£ããã£ãããããŒã«åŒã³åºãã®ãã©ã¡ãŒã¿ãŒã§ãã
{
"type": "result",
"subtype": "success",
"stop_reason": "tool_deferred",
"session_id": "abc123",
"deferred_tool_use": {
"id": "toolu_01abc",
"name": "AskUserQuestion",
"input": { "questions": [{ "question": "Which framework?", "header": "Framework", "options": [{"label": "React"}, {"label": "Vue"}], "multiSelect": false }] }
}
}
ã¿ã€ã ã¢ãŠããŸãã¯å詊è¡å¶éã¯ãããŸãããã»ãã·ã§ã³ã¯ãã£ã¹ã¯äžã«æ®ããŸããåçã®æºåãã§ããŠããªããšãã«åéããå Žåãããã¯ã¯å床 "defer" ãè¿ãããšãã§ããããã»ã¹ã¯åãæ¹æ³ã§çµäºããŸããåŒã³åºãããã»ã¹ã¯ã«ãŒããç Žãã¿ã€ãã³ã°ãå¶åŸ¡ããæçµçã« "allow" ãŸã㯠"deny" ãè¿ããŸãã
"defer" 㯠Claude ãåäžã®ããŒã«åŒã³åºããè¡ããšãã®ã¿æ©èœããŸããClaude ãäžåºŠã«è€æ°ã®ããŒã«åŒã³åºããè¡ãå Žåã"defer" ã¯èŠåã§ç¡èŠãããããŒã«ã¯éåžžã®æš©éãããŒãéããŠé²è¡ããŸããå¶çŽãååšããã®ã¯ãåéã 1 ã€ã®ããŒã«ã®ã¿ãåå®è¡ã§ããããã§ããããããã 1 ã€ã®åŒã³åºããé
å»¶ãããæ¹æ³ã¯ãªããä»ã®åŒã³åºãã¯æªè§£æ±ºã®ãŸãŸã«ãªããŸãã
é
å»¶ãããããŒã«ãåéæã«å©çšã§ããªããªã£ãå Žåãããã»ã¹ã¯ stop_reason: "tool_deferred_unavailable" ãš is_error: true ã§çµäºããããã¯ãçºç«ããåã«ãããã¯ãæäŸãããããŒã«ã® MCP ãµãŒããŒãåéãããã»ãã·ã§ã³ã«æ¥ç¶ãããŠããªãå Žåã«çºçããŸããdeferred_tool_use ãã€ããŒãã¯åŒãç¶ãå«ãŸãããããã©ã®ããŒã«ãæ¬ èœããŠããããèå¥ã§ããŸãã
--resume ã¯åã®ã»ãã·ã§ã³ããæš©éã¢ãŒãã埩å
ããŸããé
å»¶ããããšãã«ã¢ã¯ãã£ãã ã£ãæš©éã¢ãŒãã埩å
ããããããåéæã« --permission-mode ãå床枡ãå¿
èŠã¯ãããŸãããäŸå€ã¯ plan ãš bypassPermissions ã§ããããã¯æ±ºããŠåŒãç¶ãããŸãããåéæã« --permission-mode ãæç€ºçã«æž¡ããšã埩å
ãããå€ããªãŒããŒã©ã€ããããŸãã
PermissionRequest
ãŠãŒã¶ãŒã«æš©éãã€ã¢ãã°ã衚瀺ããããšãã«å®è¡ãããŸãã PermissionRequest 決å®å¶åŸ¡ã䜿çšããŠããŠãŒã¶ãŒã«ä»£ãã£ãŠèš±å¯ãŸãã¯æåŠããŸãã
ããŒã«åã§ãããããŸããPreToolUse ãšåãå€ã
PermissionRequest å ¥å
PermissionRequest ããã¯ã¯ PreToolUse ããã¯ã®ãã㪠tool_name ãš tool_input ãã£ãŒã«ããåãåããŸãããtool_use_id ã¯ãããŸããããªãã·ã§ã³ã® permission_suggestions é
åã«ã¯ããŠãŒã¶ãŒãéåžžæš©éãã€ã¢ãã°ã§èŠããåžžã«èš±å¯ããªãã·ã§ã³ãå«ãŸããŠããŸããéãã¯ããã¯ãçºç«ããã¿ã€ãã³ã°ã§ããPermissionRequest ããã¯ã¯ãŠãŒã¶ãŒã«æš©éãã€ã¢ãã°ã衚瀺ãããããšããŠãããšãã«å®è¡ãããPreToolUse ããã¯ã¯æš©éã¹ããŒã¿ã¹ã«é¢ä¿ãªãããŒã«å®è¡åã«å®è¡ãããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "PermissionRequest",
"tool_name": "Bash",
"tool_input": {
"command": "rm -rf node_modules",
"description": "Remove node_modules directory"
},
"permission_suggestions": [
{
"type": "addRules",
"rules": [{ "toolName": "Bash", "ruleContent": "rm -rf node_modules" }],
"behavior": "allow",
"destination": "localSettings"
}
]
}
PermissionRequest 決å®å¶åŸ¡
PermissionRequest ããã¯ã¯æš©éãªã¯ãšã¹ããèš±å¯ãŸãã¯æåŠã§ããŸãããã¹ãŠã®ããã¯ã§å©çšå¯èœãªJSON åºåãã£ãŒã«ãã«å ããŠããã㯠ã¹ã¯ãªããã¯ãããã®ã€ãã³ãåºæã®ãã£ãŒã«ããæã€ decision ãªããžã§ã¯ããè¿ãããšãã§ããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
behavior |
"allow" ã¯æš©éãä»äžã"deny" ã¯æåŠãæåŠãšè³ªåã«ãŒã«ã¯åŒãç¶ãè©äŸ¡ãããããã"allow" ãè¿ãããã¯ã¯äžèŽããæåŠã«ãŒã«ããªãŒããŒã©ã€ãããŸãã |
updatedInput |
"allow" ã®ã¿: å®è¡åã«ããŒã«ã®å
¥åãã©ã¡ãŒã¿ãŒã倿ŽããŸããå
¥åãªããžã§ã¯ãå
šäœã眮ãæããããã倿ŽãããŠããªããã£ãŒã«ãã倿Žããããã£ãŒã«ããšäžç·ã«å«ããŸãã倿Žãããå
¥åã¯æåŠãšè³ªåã«ãŒã«ã«å¯ŸããŠåè©äŸ¡ãããŸã |
updatedPermissions |
"allow" ã®ã¿: é©çšããæš©éæŽæ°ãšã³ããªã®é
åãèš±å¯ã«ãŒã«ã远å ããããã»ãã·ã§ã³æš©éã¢ãŒãã倿Žããããããªã© |
message |
"deny" ã®ã¿: æš©éãæåŠãããçç±ã Claude ã«äŒãã |
interrupt |
"deny" ã®ã¿: true ã®å ŽåãClaude ã忢 |
{
"hookSpecificOutput": {
"hookEventName": "PermissionRequest",
"decision": {
"behavior": "allow",
"updatedInput": {
"command": "npm run lint"
}
}
}
}
æš©éæŽæ°ãšã³ããª
updatedPermissions åºåãã£ãŒã«ããšpermission_suggestions å
¥åãã£ãŒã«ãã®äž¡æ¹ãåããšã³ã㪠ãªããžã§ã¯ãã®é
åã䜿çšããŸããåãšã³ããªã«ã¯ããã®ä»ã®ãã£ãŒã«ããæ±ºå®ãã type ãšã倿Žãæžã蟌ãŸããå Žæãå¶åŸ¡ãã destination ããããŸãã
type |
ãã£ãŒã«ã | 广 |
|---|---|---|
addRules |
rulesãbehaviorãdestination |
æš©éã«ãŒã«ã远å ããŸããrules 㯠{toolName, ruleContent?} ãªããžã§ã¯ãã®é
åã§ããããŒã«å
šäœã«ãããããã«ã¯ ruleContent ãçç¥ããŸããbehavior 㯠"allow"ã"deny"ããŸã㯠"ask" |
replaceRules |
rulesãbehaviorãdestination |
destination ã§æå®ããã behavior ã®ãã¹ãŠã®ã«ãŒã«ãæäŸãããã«ãŒã«ã«çœ®ãæããŸã |
removeRules |
rulesãbehaviorãdestination |
æå®ããã behavior ã®äžèŽããã«ãŒã«ãåé€ |
setMode |
modeãdestination |
æš©éã¢ãŒãã倿ŽããŸããæå¹ãªã¢ãŒã㯠defaultãacceptEditsãdontAskãbypassPermissionsãplan |
addDirectories |
directoriesãdestination |
äœæ¥ãã£ã¬ã¯ããªã远å ããŸããdirectories ã¯ãã¹æååã®é
å |
removeDirectories |
directoriesãdestination |
äœæ¥ãã£ã¬ã¯ããªãåé€ |
setMode ã§ bypassPermissions ã䜿çšããå Žåãã»ãã·ã§ã³ãæ¢ã«ãã€ãã¹ ã¢ãŒãã§èµ·åãããŠããå Žåã®ã¿æå¹ã§ãã--dangerously-skip-permissionsã--permission-mode bypassPermissionsã--allow-dangerously-skip-permissionsããŸãã¯èšå®ã® permissions.defaultMode: "bypassPermissions" ã䜿çšããã¢ãŒãã permissions.disableBypassPermissionsModeã§ç¡å¹åãããŠããªãå Žåããã以å€ã®å ŽåãæŽæ°ã¯ no-op ã§ããbypassPermissions 㯠destination ã«é¢ä¿ãªã defaultMode ãšããŠæ°žç¶åãããŸããã
ãã¹ãŠã®ãšã³ããªã® destination ãã£ãŒã«ãã¯ã倿Žãã¡ã¢ãªã«çãŸããèšå®ãã¡ã€ã«ã«æ°žç¶åãããããæ±ºå®ããŸãã
destination |
æžã蟌ã¿å |
|---|---|
session |
ã¡ã¢ãªã®ã¿ãã»ãã·ã§ã³çµäºæã«ç Žæ£ |
localSettings |
.claude/settings.local.json |
projectSettings |
.claude/settings.json |
userSettings |
~/.claude/settings.json |
ããã¯ã¯åãåã£ã permission_suggestions ã® 1 ã€ãç¬èªã® updatedPermissions åºåãšããŠåæ ã§ããŸããããã¯ããŠãŒã¶ãŒããã€ã¢ãã°ã§ãåžžã«èš±å¯ããªãã·ã§ã³ãéžæããã®ãšåçã§ãã
PostToolUse
ããŒã«ãæ£åžžã«å®äºããçŽåŸã«å®è¡ãããŸãã
ããŒã«åã§ãããããŸããPreToolUse ãšåãå€ã
PostToolUse å ¥å
PostToolUse ããã¯ã¯ããŒã«ããã§ã«æ£åžžã«å®è¡ãããåŸã«çºç«ããŸããå
¥åã«ã¯ãããŒã«ã«éä¿¡ãããåŒæ°ã§ãã tool_input ãšãè¿ãããçµæã§ãã tool_response ã®äž¡æ¹ãå«ãŸããŸããäž¡æ¹ã®æ£ç¢ºãªã¹ããŒãã¯ããŒã«ã«äŸåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "PostToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "/path/to/file.txt",
"content": "file content"
},
"tool_response": {
"filePath": "/path/to/file.txt",
"success": true
},
"tool_use_id": "toolu_01ABC123...",
"duration_ms": 12
}
| ãã£ãŒã«ã | 説æ |
|---|---|
duration_ms |
ãªãã·ã§ã³ãããŒã«å®è¡æéïŒããªç§ïŒãæš©éããã³ãããš PreToolUse ããã¯ã«è²»ããããæéã¯é€å€ |
PostToolUse 決å®å¶åŸ¡
PostToolUse ããã¯ã¯ããŒã«å®è¡åŸã« Claude ã«ãã£ãŒãããã¯ãæäŸã§ããŸãããã¹ãŠã®ããã¯ã§å©çšå¯èœãªJSON åºåãã£ãŒã«ãã«å ããŠããã㯠ã¹ã¯ãªããã¯ãããã®ã€ãã³ãåºæã®ãã£ãŒã«ããè¿ãããšãã§ããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
decision |
"block" 㯠Claude ã« reason ã§ããã³ããã衚瀺ãèš±å¯ããã«ã¯çç¥ |
reason |
decision ã "block" ã®ãšãã« Claude ã«è¡šç€ºããã説æ |
additionalContext |
Claude ã®ã³ã³ããã¹ãã«è¿œå ãããæååãClaude ã®ã³ã³ããã¹ãã远å ãåç §ããŠãã ãã |
updatedToolOutput |
ããŒã«ã®åºåãæäŸãããå€ã«çœ®æããŠãã Claude ã«éä¿¡ãå€ã¯ããŒã«ã®åºå圢ç¶ãšäžèŽããå¿ èŠããããŸã |
updatedMCPToolOutput |
MCP ããŒã«ã®ã¿: ããŒã«ã®åºåã眮æããã¹ãŠã®ããŒã«ã§æ©èœãã updatedToolOutput ãåªå
|
以äžã®äŸã¯ Bash åŒã³åºãã®åºåã眮æããŸãã眮æå€ã¯ Bash ããŒã«ã®åºå圢ç¶ãšäžèŽããŸãã
{
"hookSpecificOutput": {
"hookEventName": "PostToolUse",
"additionalContext": "Additional information for Claude",
"updatedToolOutput": {
"stdout": "[redacted]",
"stderr": "",
"interrupted": false,
"isImage": false
}
}
}
updatedToolOutput 㯠Claude ãèŠããã®ã ãã倿ŽããŸããããã¯ãçºç«ãããŸã§ã«ããŒã«ã¯ãã§ã«å®è¡ãããŠãããããæžã蟌ãŸãããã¡ã€ã«ãå®è¡ãããã³ãã³ããéä¿¡ããããããã¯ãŒã¯ ãªã¯ãšã¹ãã¯ãã§ã«æå¹ã«ãªã£ãŠããŸããOpenTelemetry ããŒã« ã¹ãã³ãã¢ããªãã£ã¯ã¹ ã€ãã³ããªã©ã®ãã¬ã¡ããªããããã¯ãå®è¡ãããåã«å
ã®åºåããã£ããã£ããŸããããŒã«åŒã³åºããå®è¡åã«é²æ¢ãŸãã¯å€æŽããã«ã¯ã代ããã«PreToolUseããã¯ã䜿çšããŸãã
眮æå€ã¯ããŒã«ã®åºå圢ç¶ãšäžèŽããå¿
èŠããããŸããçµã¿èŸŒã¿ããŒã«ã¯åçŽãªæååã§ã¯ãªãæ§é åãªããžã§ã¯ããè¿ããŸããäŸãã°ãBash 㯠stdoutãstderrãinterruptedãisImage ãã£ãŒã«ããæã€ãªããžã§ã¯ããè¿ããŸããçµã¿èŸŒã¿ããŒã«ã®å ŽåãããŒã«ã®åºåã¹ããŒããšäžèŽããªãå€ã¯ç¡èŠãããå
ã®åºåã䜿çšãããŸããMCP ããŒã«åºåã¯ã¹ããŒãæ€èšŒãªãã§æž¡ãããŸããClaude ãå¿
èŠãšãããšã©ãŒè©³çްãåé€ãããšãClaude ã誀ã£ãä»®å®ã§é²è¡ããå¯èœæ§ããããŸãã
PostToolUseFailure
ããŒã«å®è¡ã倱æãããšãã«å®è¡ãããŸãããã®ã€ãã³ãã¯ãšã©ãŒãã¹ããŒããŸãã¯å€±æçµæãè¿ãããŒã«åŒã³åºãã«å¯ŸããŠçºç«ããŸããããã䜿çšããŠå€±æããã°ãã¢ã©ãŒããéä¿¡ããŸã㯠Claude ã«æ¯æ£ãã£ãŒãããã¯ãæäŸããŸãã
ããŒã«åã§ãããããŸããPreToolUse ãšåãå€ã
PostToolUseFailure å ¥å
PostToolUseFailure ããã¯ã¯ PostToolUse ãšåã tool_name ãš tool_input ãã£ãŒã«ããåãåãããšã©ãŒæ
å ±ããããã¬ãã« ãã£ãŒã«ããšããŠåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "PostToolUseFailure",
"tool_name": "Bash",
"tool_input": {
"command": "npm test",
"description": "Run test suite"
},
"tool_use_id": "toolu_01ABC123...",
"error": "Command exited with non-zero status code 1",
"is_interrupt": false,
"duration_ms": 4187
}
| ãã£ãŒã«ã | 説æ |
|---|---|
error |
äœãæªãã£ããã説æããæåå |
is_interrupt |
倱æããŠãŒã¶ãŒå²ã蟌ã¿ã«ãã£ãŠåŒãèµ·ãããããã©ããã瀺ããªãã·ã§ã³ ããŒã«å€ |
duration_ms |
ãªãã·ã§ã³ãããŒã«å®è¡æéïŒããªç§ïŒãæš©éããã³ãããš PreToolUse ããã¯ã«è²»ããããæéã¯é€å€ |
PostToolUseFailure 決å®å¶åŸ¡
PostToolUseFailure ããã¯ã¯ããŒã«å€±æåŸã« Claude ã«ã³ã³ããã¹ããæäŸã§ããŸãããã¹ãŠã®ããã¯ã§å©çšå¯èœãªJSON åºåãã£ãŒã«ãã«å ããŠããã㯠ã¹ã¯ãªããã¯ãããã®ã€ãã³ãåºæã®ãã£ãŒã«ããè¿ãããšãã§ããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
additionalContext |
Claude ã®ã³ã³ããã¹ãã«è¿œå ãããæååãClaude ã®ã³ã³ããã¹ãã远å ãåç §ããŠãã ãã |
{
"hookSpecificOutput": {
"hookEventName": "PostToolUseFailure",
"additionalContext": "Additional information about the failure for Claude"
}
}
PostToolBatch
ãããå
ã®ãã¹ãŠã®ããŒã«åŒã³åºãã解決ãããåŸãClaude Code ãæ¬¡ã®ã¢ãã« ãªã¯ãšã¹ããéä¿¡ããåã«ã1 åå®è¡ãããŸããPostToolUse ã¯ããŒã«ããšã« 1 åçºç«ããŸããã€ãŸããClaude ã䞊åããŒã«åŒã³åºããè¡ããšãã«åæã«çºç«ããŸããPostToolBatch ã¯å®å
šãªãããã§æ£ç¢ºã« 1 åçºç«ãããããåäžã®ããŒã«ã§ã¯ãªããå®è¡ãããããŒã«ã®ã»ããã«äŸåããã³ã³ããã¹ããæ³šå
¥ããã®ã«é©åãªå Žæã§ãããã®ã€ãã³ãã«ã¯ãããã£ãŒããããŸããã
PostToolBatch å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãPostToolBatch ããã¯ã¯ãããå
ã®ãã¹ãŠã®ããŒã«åŒã³åºãã説æãã tool_calls é
åãåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "PostToolBatch",
"tool_calls": [
{
"tool_name": "Read",
"tool_input": {"file_path": "/.../ledger/accounts.py"},
"tool_use_id": "toolu_01...",
"tool_response": " 1\tfrom __future__ import annotations\n 2\t..."
},
{
"tool_name": "Read",
"tool_input": {"file_path": "/.../ledger/transactions.py"},
"tool_use_id": "toolu_02...",
"tool_response": " 1\tfrom __future__ import annotations\n 2\t..."
}
]
}
tool_response ã¯ã¢ãã«ã察å¿ãã tool_result ãããã¯ã§åãåãã®ãšåãã³ã³ãã³ããå«ã¿ãŸããå€ã¯ããŒã«ãçºè¡ããã®ãšåãããã«ãã·ãªã¢ã«åãããæååãŸãã¯ã³ã³ãã³ã ãããã¯é
åã§ããRead ã®å Žåãããã¯çã®ãã¡ã€ã« ã³ã³ãã³ãã§ã¯ãªããè¡çªå·ãä»ããããã¹ããæå³ããŸããå¿çã¯å€§ãããªãå¯èœæ§ããããããå¿
èŠãªãã£ãŒã«ãã®ã¿ãè§£æããŠãã ããã
tool_response ã®åœ¢ç¶ã¯ PostToolUse ã®ãã®ãšç°ãªããŸããPostToolUse ã¯ããŒã«ã®æ§é å Output ãªããžã§ã¯ãïŒWrite ã®å Žå㯠{filePath: "...", success: true} ãªã©ïŒãæž¡ããŸããPostToolBatch ã¯ã¢ãã«ãèŠãã·ãªã¢ã«åããã tool_result ã³ã³ãã³ããæž¡ããŸãã
PostToolBatch 決å®å¶åŸ¡
PostToolBatch ããã¯ã¯ Claude ã®ã³ã³ããã¹ããæ³šå
¥ã§ããŸãããã¹ãŠã®ããã¯ã§å©çšå¯èœãªJSON åºåãã£ãŒã«ãã«å ããŠããã㯠ã¹ã¯ãªããã¯ãããã®ã€ãã³ãåºæã®ãã£ãŒã«ããè¿ãããšãã§ããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
additionalContext |
次ã®ã¢ãã«åŒã³åºãã®åã« 1 åæ³šå ¥ãããã³ã³ããã¹ãæååãClaude ã®ã³ã³ããã¹ãã远å ãåç §ããŠãã ãã |
{
"hookSpecificOutput": {
"hookEventName": "PostToolBatch",
"additionalContext": "These files are part of the ledger module. Run pytest before marking the task complete."
}
}
decision: "block" ãŸã㯠continue: false ãè¿ããšã次ã®ã¢ãã«åŒã³åºãã®åã« agentic ã«ãŒãã忢ããŸãã
PermissionDenied
èªåã¢ãŒãåé¡åšãããŒã«åŒã³åºããæåŠãããšãã«å®è¡ãããŸãããã®ããã¯ã¯èªåã¢ãŒãã§ã®ã¿çºç«ããŸããæåã§æš©éãã€ã¢ãã°ãæåŠãããšããPreToolUse ããã¯ãã³ãŒã«ããããã¯ãããšãããŸã㯠deny ã«ãŒã«ãããããããšãã¯å®è¡ãããŸãããããã䜿çšããŠåé¡åšã®æåŠããã°ãèšå®ã調æŽããŸãã¯ã¢ãã«ãããŒã«åŒã³åºããå詊è¡ã§ããããšãäŒããŸãã
ããŒã«åã§ãããããŸããPreToolUse ãšåãå€ã
PermissionDenied å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãPermissionDenied ããã¯ã¯ tool_nameãtool_inputãtool_use_idãreason ãåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "auto",
"hook_event_name": "PermissionDenied",
"tool_name": "Bash",
"tool_input": {
"command": "rm -rf /tmp/build",
"description": "Clean build directory"
},
"tool_use_id": "toolu_01ABC123...",
"reason": "Auto mode denied: command targets a path outside the project"
}
| ãã£ãŒã«ã | 説æ |
|---|---|
reason |
ããŒã«åŒã³åºããæåŠãããçç±ã®åé¡åšã®èª¬æ |
PermissionDenied 決å®å¶åŸ¡
PermissionDenied ããã¯ã¯ã¢ãã«ãæåŠãããããŒã«åŒã³åºããå詊è¡ã§ããããšãäŒããããšãã§ããŸããhookSpecificOutput.retry ã true ã«èšå®ãã JSON ãªããžã§ã¯ããè¿ããŸãã
{
"hookSpecificOutput": {
"hookEventName": "PermissionDenied",
"retry": true
}
}
retry ã true ã®å ŽåãClaude Code ã¯äŒè©±ã«ã¡ãã»ãŒãžã远å ããã¢ãã«ãããŒã«åŒã³åºããå詊è¡ã§ããããšãäŒããŸããæåŠèªäœã¯å転ãããŸãããããã¯ã JSON ãè¿ããªãå ŽåããŸã㯠retry: false ãè¿ãå ŽåãæåŠã¯ç«ã£ããŸãŸã§ãã¢ãã«ã¯å
ã®æåŠã¡ãã»ãŒãžãåãåããŸãã
Notification
Claude Code ãéç¥ãéä¿¡ãããšãã«å®è¡ãããŸããéç¥ã¿ã€ãã§ãããããŸããpermission_promptãidle_promptãauth_successãelicitation_dialogãelicitation_completeãelicitation_responseããããã£ãŒãçç¥ããŠããã¹ãŠã®éç¥ã¿ã€ãã®ããã¯ãå®è¡ããŸãã
ç°ãªããããã£ãŒã䜿çšããŠãéç¥ã¿ã€ãã«å¿ããŠç°ãªããã³ãã©ãŒãå®è¡ããŸãããã®èšå®ã¯ãClaude ãæš©éæ¿èªãå¿ èŠãšãããšãã«æš©éåºæã®ã¢ã©ãŒã ã¹ã¯ãªãããããªã¬ãŒããClaude ãã¢ã€ãã«ç¶æ ã«ãªã£ããšãã«ç°ãªãéç¥ãããªã¬ãŒããŸãã
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{
"type": "command",
"command": "/path/to/permission-alert.sh"
}
]
},
{
"matcher": "idle_prompt",
"hooks": [
{
"type": "command",
"command": "/path/to/idle-notification.sh"
}
]
}
]
}
}
Notification å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãNotification ããã¯ã¯éç¥ããã¹ããå«ã messageããªãã·ã§ã³ã® titleãçºç«ããã¿ã€ãã瀺ã notification_type ãåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "Notification",
"message": "Claude needs your permission to use Bash",
"title": "Permission needed",
"notification_type": "permission_prompt"
}
Notification ããã¯ã¯éç¥ããããã¯ãŸãã¯å€æŽã§ããŸããããããã¯å¯äœçšïŒå€éšãµãŒãã¹ãžã®éç¥ã®è»¢éãªã©ïŒãç®çãšããŠããŸãããã¹ãŠã®ããã¯ã§å©çšå¯èœãªJSON åºåãã£ãŒã«ãïŒsystemMessage ãªã©ïŒãé©çšãããŸãã
SubagentStart
Agent ããŒã«çµç±ã§ãµããšãŒãžã§ã³ããçæããããšãã«å®è¡ãããŸãããšãŒãžã§ã³ã ã¿ã€ãåã§ãã£ã«ã¿ãªã³ã°ãããããã£ãŒããµããŒãïŒgeneral-purposeãExploreãPlan ãªã©ã®çµã¿èŸŒã¿ãšãŒãžã§ã³ãããŸãã¯ã«ã¹ã¿ã ãµããšãŒãžã§ã³ãã®å Žåã¯ãšãŒãžã§ã³ãã®ããã³ããã¿ãŒã® name ãã£ãŒã«ãããã¡ã€ã«åã§ã¯ãããŸããïŒã
SubagentStart å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãSubagentStart ããã¯ã¯ãµããšãŒãžã§ã³ãã®äžæã®èå¥åãå«ã agent_id ãšãšãŒãžã§ã³ãåãå«ã agent_typeïŒ"general-purpose"ã"Explore"ã"Plan" ãªã©ã®çµã¿èŸŒã¿ãšãŒãžã§ã³ãããŸãã¯ã«ã¹ã¿ã ãšãŒãžã§ã³ãåïŒãåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "SubagentStart",
"agent_id": "agent-abc123",
"agent_type": "Explore"
}
SubagentStart ããã¯ã¯ãµããšãŒãžã§ã³ãäœæããããã¯ã§ããŸãããããµããšãŒãžã§ã³ãã«ã³ã³ããã¹ããæ³šå ¥ã§ããŸãããã¹ãŠã®ããã¯ã§å©çšå¯èœãªJSON åºåãã£ãŒã«ãã«å ããŠã以äžãè¿ãããšãã§ããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
additionalContext |
ãµããšãŒãžã§ã³ãã®ã³ã³ããã¹ãã®éå§æã«è¿œå ãããæååãæåã®ããã³ããã®åãClaude ã®ã³ã³ããã¹ãã远å ãåç §ããŠãã ãã |
{
"hookSpecificOutput": {
"hookEventName": "SubagentStart",
"additionalContext": "Follow security guidelines for this task"
}
}
SubagentStop
Claude Code ãµããšãŒãžã§ã³ããå¿çãçµäºãããšãã«å®è¡ãããŸãããšãŒãžã§ã³ã ã¿ã€ãã§ãããããŸããSubagentStart ãšåãå€ã
SubagentStop å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãSubagentStop ããã¯ã¯ stop_hook_activeãagent_idãagent_typeãagent_transcript_pathãlast_assistant_message ãåãåããŸããagent_type ãã£ãŒã«ãã¯ãããã£ãŒ ãã£ã«ã¿ãªã³ã°ã«äœ¿çšãããå€ã§ããtranscript_path ã¯ã¡ã€ã³ ã»ãã·ã§ã³ã®ãã©ã³ã¹ã¯ãªãããagent_transcript_path ã¯ãã¹ãããã subagents/ ãã©ã«ãã«ä¿åããããµããšãŒãžã§ã³ãç¬èªã®ãã©ã³ã¹ã¯ãªããã§ããlast_assistant_message ãã£ãŒã«ãã¯ãµããšãŒãžã§ã³ãã®æçµå¿çã®ããã¹ã ã³ã³ãã³ããå«ããããããã¯ã¯ãã©ã³ã¹ã¯ãªãã ãã¡ã€ã«ãè§£æããã«ã¢ã¯ã»ã¹ã§ããŸãã
{
"session_id": "abc123",
"transcript_path": "~/.claude/projects/.../abc123.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "SubagentStop",
"stop_hook_active": false,
"agent_id": "def456",
"agent_type": "Explore",
"agent_transcript_path": "~/.claude/projects/.../abc123/subagents/agent-def456.jsonl",
"last_assistant_message": "Analysis complete. Found 3 potential issues..."
}
SubagentStop ããã¯ã¯Stop ããã¯ãšåãæ±ºå®å¶åŸ¡åœ¢åŒã䜿çšããŸããadditionalContext ããµããŒãããŸãããdecision: "block" ã reason ãšäžç·ã«è¿ããšãµããšãŒãžã§ã³ããå®è¡ãç¶ããreason ããµããšãŒãžã§ã³ãã®æ¬¡ã®åœä»€ãšããŠé
ä¿¡ããŸãããµããšãŒãžã§ã³ããæ»ã£ãåŸã«èŠªã»ãã·ã§ã³ã«ã³ã³ããã¹ããæ³šå
¥ããã«ã¯ã代ããã« Agent ããŒã«äžã® PostToolUseããã¯ã䜿çšããŸãã
TaskCreated
ã¿ã¹ã¯ã TaskCreate ããŒã«çµç±ã§äœæããããšãã«å®è¡ãããŸããåœåèŠåã宿œããããã¿ã¹ã¯èª¬æãèŠæ±ããããç¹å®ã®ã¿ã¹ã¯ãäœæãããã®ãé²ãã ãããã®ã«äœ¿çšããŸãã
TaskCreated ããã¯ãçµäºã³ãŒã 2 ã§çµäºãããšãã¿ã¹ã¯ã¯äœæããããstderr ã¡ãã»ãŒãžã¯ã¢ãã«ãžã®ãã£ãŒãããã¯ãšããŠãã£ãŒãããã¯ãããŸããããŒã ã¡ã€ãå
šäœã忢ãã代ããã«åå®è¡ããã«ã¯ã{"continue": false, "stopReason": "..."} ãå«ã JSON ãè¿ããŸããTaskCreated ããã¯ã¯ãããã£ãŒããµããŒãããããã¹ãŠã®åºçŸã§çºç«ããŸãã
TaskCreated å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãTaskCreated ããã¯ã¯ task_idãtask_subjectãããã³ãªãã·ã§ã³ã§ task_descriptionãteammate_nameãteam_name ãåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "TaskCreated",
"task_id": "task-001",
"task_subject": "Implement user authentication",
"task_description": "Add login and signup endpoints",
"teammate_name": "implementer",
"team_name": "my-project"
}
| ãã£ãŒã«ã | 説æ |
|---|---|
task_id |
äœæãããã¿ã¹ã¯ã®èå¥å |
task_subject |
ã¿ã¹ã¯ã®ã¿ã€ãã« |
task_description |
ã¿ã¹ã¯ã®è©³çŽ°èª¬æãååšããªãå¯èœæ§ããããŸã |
teammate_name |
ã¿ã¹ã¯ãäœæããŠããããŒã ã¡ã€ãã®ååãååšããªãå¯èœæ§ããããŸã |
team_name |
ããŒã ã®ååãååšããªãå¯èœæ§ããããŸã |
TaskCreated 決å®å¶åŸ¡
TaskCreated ããã¯ã¯ã¿ã¹ã¯äœæãå¶åŸ¡ãã 2 ã€ã®æ¹æ³ããµããŒãããŠããŸãã
- çµäºã³ãŒã 2: ã¿ã¹ã¯ã¯äœæããããstderr ã¡ãã»ãŒãžã¯ã¢ãã«ãžã®ãã£ãŒãããã¯ãšããŠãã£ãŒãããã¯ãããŸãã
- JSON
{"continue": false, "stopReason": "..."}: ããŒã ã¡ã€ãå šäœã忢ããStopããã¯åäœãšäžèŽããŸããstopReasonã¯ãŠãŒã¶ãŒã«è¡šç€ºãããŸãã
ãã®äŸã¯ãã¿ã¹ã¯ä»¶åãå¿ èŠãªåœ¢åŒã«åŸããªãå Žåãã¿ã¹ã¯äœæããããã¯ããŸãã
#!/bin/bash
INPUT=$(cat)
TASK_SUBJECT=$(echo "$INPUT" | jq -r '.task_subject')
if [[ ! "$TASK_SUBJECT" =~ ^\[TICKET-[0-9]+\] ]]; then
echo "Task subject must start with a ticket number, e.g. '[TICKET-123] Add feature'" >&2
exit 2
fi
exit 0
TaskCompleted
ã¿ã¹ã¯ãå®äºãšããŠããŒã¯ããããšãã«å®è¡ãããŸãããã㯠2 ã€ã®ç¶æ³ã§çºç«ããŸããä»»æã®ãšãŒãžã§ã³ãã TaskUpdate ããŒã«çµç±ã§ã¿ã¹ã¯ãæç€ºçã«å®äºãšããŠããŒã¯ãããšãããŸãã¯ãšãŒãžã§ã³ã ããŒã ããŒã ã¡ã€ããé²è¡äžã®ã¿ã¹ã¯ã§ã¿ãŒã³ãçµäºãããšããããã䜿çšããŠããŒã ã¡ã€ããäœæ¥ã忢ããåã«å質ã²ãŒãã宿œããŸããäŸãã°ãlint ãã§ãã¯ã®åæ ŒãèŠæ±ããããåºåãã¡ã€ã«ãååšããããšã確èªãããããŸãã
TaskCompleted ããã¯ãçµäºã³ãŒã 2 ã§çµäºãããšãã¿ã¹ã¯ã¯å®äºãšããŠããŒã¯ããããstderr ã¡ãã»ãŒãžã¯ã¢ãã«ãžã®ãã£ãŒãããã¯ãšããŠãã£ãŒãããã¯ãããŸããããŒã ã¡ã€ãå
šäœã忢ãã代ããã«åå®è¡ããã«ã¯ã{"continue": false, "stopReason": "..."} ãå«ã JSON ãè¿ããŸããTaskCompleted ããã¯ã¯ãããã£ãŒããµããŒãããããã¹ãŠã®åºçŸã§çºç«ããŸãã
TaskCompleted å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãTaskCompleted ããã¯ã¯ task_idãtask_subjectãããã³ãªãã·ã§ã³ã§ task_descriptionãteammate_nameãteam_name ãåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "TaskCompleted",
"task_id": "task-001",
"task_subject": "Implement user authentication",
"task_description": "Add login and signup endpoints",
"teammate_name": "implementer",
"team_name": "my-project"
}
| ãã£ãŒã«ã | 説æ |
|---|---|
task_id |
å®äºããŠããã¿ã¹ã¯ã®èå¥å |
task_subject |
ã¿ã¹ã¯ã®ã¿ã€ãã« |
task_description |
ã¿ã¹ã¯ã®è©³çŽ°èª¬æãååšããªãå¯èœæ§ããããŸã |
teammate_name |
ã¿ã¹ã¯ãå®äºããŠããããŒã ã¡ã€ãã®ååãååšããªãå¯èœæ§ããããŸã |
team_name |
ããŒã ã®ååãååšããªãå¯èœæ§ããããŸã |
TaskCompleted 決å®å¶åŸ¡
TaskCompleted ããã¯ã¯ã¿ã¹ã¯å®äºãå¶åŸ¡ãã 2 ã€ã®æ¹æ³ããµããŒãããŠããŸãã
- çµäºã³ãŒã 2: ã¿ã¹ã¯ã¯å®äºãšããŠããŒã¯ããããstderr ã¡ãã»ãŒãžã¯ã¢ãã«ãžã®ãã£ãŒãããã¯ãšããŠãã£ãŒãããã¯ãããŸãã
- JSON
{"continue": false, "stopReason": "..."}: ããŒã ã¡ã€ãå šäœã忢ããStopããã¯åäœãšäžèŽããŸããstopReasonã¯ãŠãŒã¶ãŒã«è¡šç€ºãããŸãã
ãã®äŸã¯ãã¹ããå®è¡ãã倱æããå Žåã¯ã¿ã¹ã¯å®äºããããã¯ããŸãã
#!/bin/bash
INPUT=$(cat)
TASK_SUBJECT=$(echo "$INPUT" | jq -r '.task_subject')
# ãã¹ã ã¹ã€ãŒããå®è¡
if ! npm test 2>&1; then
echo "Tests not passing. Fix failing tests before completing: $TASK_SUBJECT" >&2
exit 2
fi
exit 0
Stop
ã¡ã€ã³ Claude Code ãšãŒãžã§ã³ããå¿çãçµäºãããšãã«å®è¡ãããŸãããŠãŒã¶ãŒå²ã蟌ã¿ãåå ã§åæ¢ãçºçããå Žåã¯å®è¡ãããŸãããAPI ãšã©ãŒã¯ä»£ããã«StopFailureãçºç«ãããŸãã
/goalã³ãã³ãã¯ãã»ãã·ã§ã³ ã¹ã³ãŒãã®ããã³ãã ããŒã¹ã® Stop ããã¯ã®çµã¿èŸŒã¿ã·ã§ãŒãã«ããã§ããClaude ãæ¡ä»¶ãæç«ãããŸã§äœæ¥ãç¶ããããã«ãããããããã¯èšå®ãæžããããªãå Žåã«äœ¿çšããŸãã
Stop å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãStop ããã¯ã¯ stop_hook_active ãš last_assistant_message ãåãåããŸããstop_hook_active ãã£ãŒã«ãã¯ãClaude Code ããã§ã« stop ããã¯ã®çµæãšããŠç¶è¡ããŠããå Žå㯠true ã§ãããã®å€ããã§ãã¯ããããClaude Code ãç¡éã«å®è¡ãããã®ãé²ãããã«ãã©ã³ã¹ã¯ãªãããåŠçããŸããlast_assistant_message ãã£ãŒã«ã㯠Claude ã®æçµå¿çã®ããã¹ã ã³ã³ãã³ããå«ããããããã¯ã¯ãã©ã³ã¹ã¯ãªãã ãã¡ã€ã«ãè§£æããã«ã¢ã¯ã»ã¹ã§ããŸãã
{
"session_id": "abc123",
"transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "Stop",
"stop_hook_active": true,
"last_assistant_message": "I've completed the refactoring. Here's a summary..."
}
Stop 決å®å¶åŸ¡
Stop ãš SubagentStop ããã¯ã¯ Claude ãç¶è¡ãããã©ãããå¶åŸ¡ã§ããŸãããã¹ãŠã®ããã¯ã§å©çšå¯èœãªJSON åºåãã£ãŒã«ãã«å ããŠããã㯠ã¹ã¯ãªããã¯ãããã®ã€ãã³ãåºæã®ãã£ãŒã«ããè¿ãããšãã§ããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
decision |
"block" 㯠Claude ã忢ããã®ã鲿¢ãClaude ã忢ãããã«ã¯çç¥ |
reason |
decision ã "block" ã®ãšãã«å¿
é ãClaude ãç¶è¡ãã¹ãçç±ãäŒãã |
{
"decision": "block",
"reason": "Must be provided when Claude is blocked from stopping"
}
StopFailure
Stopã®ä»£ããã«ãã¿ãŒã³ã API ãšã©ãŒã®ããã«çµäºãããšãã«å®è¡ãããŸããåºåãšçµäºã³ãŒãã¯ç¡èŠãããŸããClaude ã API ãšã©ãŒã®ããå¿çãå®äºã§ããªãå Žåã倱æããã°ãã¢ã©ãŒããéä¿¡ããŸãã¯å埩ã¢ã¯ã·ã§ã³ãå®è¡ããã®ã«äœ¿çšããŸãã
StopFailure å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãStopFailure ããã¯ã¯ errorããªãã·ã§ã³ã® error_detailsãããã³ãªãã·ã§ã³ã® last_assistant_message ãåãåããŸããerror ãã£ãŒã«ãã¯ãšã©ãŒ ã¿ã€ããèå¥ãããããã£ãŒ ãã£ã«ã¿ãªã³ã°ã«äœ¿çšãããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
error |
ãšã©ãŒ ã¿ã€ã: rate_limitãauthentication_failedãoauth_org_not_allowedãbilling_errorãinvalid_requestãserver_errorãmax_output_tokensããŸã㯠unknown |
error_details |
å©çšå¯èœãªå Žåããšã©ãŒã«é¢ãã远å 詳现 |
last_assistant_message |
äŒè©±ã«è¡šç€ºãããã¬ã³ããªã³ã°ããããšã©ãŒ ããã¹ããStop ãš SubagentStop ãšã¯ç°ãªãããã®ãã£ãŒã«ã㯠Claude ã®äŒè©±åºåã§ã¯ãªãã"API Error: Rate limit reached" ãªã©ã® API ãšã©ãŒæååãå«ã¿ãŸã |
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "StopFailure",
"error": "rate_limit",
"error_details": "429 Too Many Requests",
"last_assistant_message": "API Error: Rate limit reached"
}
StopFailure ããã¯ã¯æ±ºå®å¶åŸ¡ããããŸãããéç¥ãšãã°ã®ç®çã§ã®ã¿å®è¡ãããŸãã
TeammateIdle
ãšãŒãžã§ã³ã ããŒã ããŒã ã¡ã€ããã¿ãŒã³ãçµäºããåŸãã¢ã€ãã«ç¶æ ã«ãªãããšããŠãããšãã«å®è¡ãããŸããããã䜿çšããŠããŒã ã¡ã€ããäœæ¥ã忢ããåã«å質ã²ãŒãã宿œããŸããäŸãã°ãlint ãã§ãã¯ã®åæ ŒãèŠæ±ããããåºåãã¡ã€ã«ãååšããããšã確èªãããããŸãã
TeammateIdle ããã¯ãçµäºã³ãŒã 2 ã§çµäºãããšãããŒã ã¡ã€ã㯠stderr ã¡ãã»ãŒãžããã£ãŒãããã¯ãšããŠåãåããã¢ã€ãã«ç¶æ
ã«ãªã代ããã«äœæ¥ãç¶è¡ããŸããããŒã ã¡ã€ãå
šäœã忢ãã代ããã«åå®è¡ããã«ã¯ã{"continue": false, "stopReason": "..."} ãå«ã JSON ãè¿ããŸããTeammateIdle ããã¯ã¯ãããã£ãŒããµããŒãããããã¹ãŠã®åºçŸã§çºç«ããŸãã
TeammateIdle å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãTeammateIdle ããã¯ã¯ teammate_name ãš team_name ãåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "TeammateIdle",
"teammate_name": "researcher",
"team_name": "my-project"
}
| ãã£ãŒã«ã | 説æ |
|---|---|
teammate_name |
ã¢ã€ãã«ç¶æ ã«ãªãããšããŠããããŒã ã¡ã€ãã®åå |
team_name |
ããŒã ã®åå |
TeammateIdle 決å®å¶åŸ¡
TeammateIdle ããã¯ã¯ããŒã ã¡ã€ãåäœãå¶åŸ¡ãã 2 ã€ã®æ¹æ³ããµããŒãããŠããŸãã
- çµäºã³ãŒã 2: ããŒã ã¡ã€ã㯠stderr ã¡ãã»ãŒãžããã£ãŒãããã¯ãšããŠåãåããã¢ã€ãã«ç¶æ ã«ãªã代ããã«äœæ¥ãç¶è¡ããŸãã
- JSON
{"continue": false, "stopReason": "..."}: ããŒã ã¡ã€ãå šäœã忢ããStopããã¯åäœãšäžèŽããŸããstopReasonã¯ãŠãŒã¶ãŒã«è¡šç€ºãããŸãã
ãã®äŸã¯ãããŒã ã¡ã€ããã¢ã€ãã«ç¶æ ã«ãªãããšãèš±å¯ããåã«ããã«ã ã¢ãŒãã£ãã¡ã¯ããååšããããšããã§ãã¯ããŸãã
#!/bin/bash
if [ ! -f "./dist/output.js" ]; then
echo "Build artifact missing. Run the build before stopping." >&2
exit 2
fi
exit 0
ConfigChange
ã»ãã·ã§ã³äžã«èšå®ãã¡ã€ã«ã倿Žããããšãã«å®è¡ãããŸããèšå®å€æŽãç£æ»ããããã»ãã¥ãªã㣠ããªã·ãŒã宿œããããèšå®ãã¡ã€ã«ãžã®äžæ£ãªå€æŽããããã¯ãããããã®ã«äœ¿çšããŸãã
ConfigChange ããã¯ã¯èšå®ãã¡ã€ã«ã管çããªã·ãŒèšå®ãã¹ãã« ãã¡ã€ã«ã®å€æŽã«å¯ŸããŠçºç«ããŸããå
¥åã® source ãã£ãŒã«ãã¯ãã©ã®ã¿ã€ãã®èšå®ã倿Žããããã瀺ãããªãã·ã§ã³ã® file_path ãã£ãŒã«ãã¯å€æŽããããã¡ã€ã«ãžã®ãã¹ãæäŸããŸãã
ãããã£ãŒã¯èšå®ãœãŒã¹ã§ãã£ã«ã¿ãªã³ã°ããŸãã
| ãããã£ãŒ | ãã€çºç«ããã |
|---|---|
user_settings |
~/.claude/settings.json ãå€æŽ |
project_settings |
.claude/settings.json ãå€æŽ |
local_settings |
.claude/settings.local.json ãå€æŽ |
policy_settings |
管çããªã·ãŒèšå®ãå€æŽ |
skills |
.claude/skills/ ã®ã¹ãã« ãã¡ã€ã«ãå€æŽ |
ãã®äŸã¯ãã»ãã¥ãªãã£ç£æ»ã®ããã«ãã¹ãŠã®èšå®å€æŽããã°ããŸãã
{
"hooks": {
"ConfigChange": [
{
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/audit-config-change.sh",
"args": []
}
]
}
]
}
}
ConfigChange å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãConfigChange ããã¯ã¯ source ãšãªãã·ã§ã³ã§ file_path ãåãåããŸããsource ãã£ãŒã«ãã¯ãã©ã®ã¿ã€ãã®èšå®ã倿Žããããã瀺ããfile_path ã¯å€æŽããããã¡ã€ã«ãžã®ãã¹ãæäŸããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "ConfigChange",
"source": "project_settings",
"file_path": "/Users/.../my-project/.claude/settings.json"
}
ConfigChange 決å®å¶åŸ¡
ConfigChange ããã¯ã¯èšå®å€æŽãæå¹ã«ãªãã®ããããã¯ã§ããŸããçµäºã³ãŒã 2 ãŸã㯠JSON decision ã䜿çšããŠå€æŽã鲿¢ããŸãããããã¯ãããå Žåãæ°ããèšå®ã¯å®è¡äžã®ã»ãã·ã§ã³ã«é©çšãããŸããã
| ãã£ãŒã«ã | 説æ |
|---|---|
decision |
"block" ã¯èšå®å€æŽãé©çšãããã®ã鲿¢ã倿Žãèš±å¯ããã«ã¯çç¥ |
reason |
decision ã "block" ã®ãšãã«ãŠãŒã¶ãŒã«è¡šç€ºããã説æ |
{
"decision": "block",
"reason": "Configuration changes to project settings require admin approval"
}
policy_settings ã®å€æŽã¯ãããã¯ã§ããŸãããããã¯ã¯ policy_settings ãœãŒã¹ã«å¯ŸããŠåŒãç¶ãçºç«ãããããç£æ»ãã°ã«äœ¿çšã§ããŸãããããããã³ã°æ±ºå®ã¯ç¡èŠãããŸããããã«ããããšã³ã¿ãŒãã©ã€ãºç®¡çèšå®ãåžžã«æå¹ã«ãªãããšãä¿èšŒãããŸãã
CwdChanged
ã»ãã·ã§ã³äžã«äœæ¥ãã£ã¬ã¯ããªã倿Žããããšãã«å®è¡ãããŸããäŸãã°ãClaude ã cd ã³ãã³ããå®è¡ãããšããããã䜿çšããŠãã£ã¬ã¯ããªå€æŽã«åå¿ããŸããç°å¢å€æ°ããªããŒããããããããžã§ã¯ãåºæã®ããŒã«ãã§ãŒã³ãã¢ã¯ãã£ãã«ããããã»ããã¢ãã ã¹ã¯ãªãããèªåçã«å®è¡ãããããŸããFileChangedãšãã¢ã«ãªããdirenvãªã©ã®ããŒã«çšã«ããã£ã¬ã¯ããªããšã®ç°å¢ã管çããŸãã
CwdChanged ããã¯ã¯ CLAUDE_ENV_FILE ã«ã¢ã¯ã»ã¹ã§ããŸãããã®ãã¡ã€ã«ã«æžã蟌ãŸãã倿°ã¯ãSessionStart ããã¯ãšåãããã«ãã»ãã·ã§ã³äžã®åŸç¶ã® Bash ã³ãã³ãã«æ°žç¶åãããŸãã
CwdChanged ã¯ãããã£ãŒããµããŒãããããã¹ãŠã®ãã£ã¬ã¯ããªå€æŽã§çºç«ããŸãã
CwdChanged å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãCwdChanged ããã¯ã¯ old_cwd ãš new_cwd ãåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../transcript.jsonl",
"cwd": "/Users/my-project/src",
"hook_event_name": "CwdChanged",
"old_cwd": "/Users/my-project",
"new_cwd": "/Users/my-project/src"
}
CwdChanged åºå
ãã¹ãŠã®ããã¯ã§å©çšå¯èœãªJSON åºåãã£ãŒã«ãã«å ããŠãCwdChanged ããã¯ã¯ watchPaths ãè¿ããŠãFileChangedãç£èŠãããã¡ã€ã« ãã¹ãåçã«èšå®ã§ããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
watchPaths |
絶察ãã¹ã®é åãçŸåšã®åçç£èŠãªã¹ãã眮ãæããŸãïŒãããã£ãŒèšå®ããã®ãã¹ã¯åžžã«ç£èŠãããŸãïŒãæ°ãããã£ã¬ã¯ããªã«å ¥ããšãã¯ã空ã®é åãè¿ãã®ãäžè¬çã§ã |
CwdChanged ããã¯ã¯æ±ºå®å¶åŸ¡ããããŸããããã£ã¬ã¯ããªå€æŽããããã¯ã§ããŸããã
FileChanged
ç£èŠããããã¡ã€ã«ããã£ã¹ã¯äžã§å€æŽããããšãã«å®è¡ãããŸãããããžã§ã¯ãèšå®ãã¡ã€ã«ã倿Žããããšãã«ç°å¢å€æ°ããªããŒãããã®ã«äŸ¿å©ã§ãã
ãã®ã€ãã³ãã® matcher 㯠2 ã€ã®åœ¹å²ãæãããŸãã
- ç£èŠãªã¹ããæ§ç¯: å€ã¯
|ã§åå²ãããåã»ã°ã¡ã³ãã¯äœæ¥ãã£ã¬ã¯ããªã®ãªãã©ã« ãã¡ã€ã«åãšããŠç»é²ãããããã.envrc|.envã¯ããã 2 ã€ã®ãã¡ã€ã«ãæ£ç¢ºã«ç£èŠããŸããæ£èŠè¡šçŸãã¿ãŒã³ã¯ããã§ã¯åœ¹ã«ç«ã¡ãŸããã^\.envã®ãããªå€ã¯^\.envãšããæåéãã®ååã®ãã¡ã€ã«ãç£èŠããŸãã - ã©ã®ããã¯ãå®è¡ããããããã£ã«ã¿ãªã³ã°: ç£èŠããããã¡ã€ã«ã倿Žããããšãåãå€ã¯æšæºãããã£ãŒ ã«ãŒã«ã䜿çšããŠã倿Žããããã¡ã€ã«ã®ããŒã¹åã«å¯ŸããŠã©ã®ãã㯠ã°ã«ãŒããå®è¡ããããããã£ã«ã¿ãªã³ã°ããŸãã
FileChanged ããã¯ã¯ CLAUDE_ENV_FILE ã«ã¢ã¯ã»ã¹ã§ããŸãããã®ãã¡ã€ã«ã«æžã蟌ãŸãã倿°ã¯ãSessionStart ããã¯ãšåãããã«ãã»ãã·ã§ã³äžã®åŸç¶ã® Bash ã³ãã³ãã«æ°žç¶åãããŸãã
FileChanged å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãFileChanged ããã¯ã¯ file_path ãš event ãåãåããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
file_path |
倿Žããããã¡ã€ã«ãžã®çµ¶å¯Ÿãã¹ |
event |
äœãèµ·ãã£ãã: "change"ïŒãã¡ã€ã«å€æŽïŒã"add"ïŒãã¡ã€ã«äœæïŒããŸã㯠"unlink"ïŒãã¡ã€ã«åé€ïŒ |
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../transcript.jsonl",
"cwd": "/Users/my-project",
"hook_event_name": "FileChanged",
"file_path": "/Users/my-project/.envrc",
"event": "change"
}
FileChanged åºå
ãã¹ãŠã®ããã¯ã§å©çšå¯èœãªJSON åºåãã£ãŒã«ãã«å ããŠãFileChanged ããã¯ã¯ watchPaths ãè¿ããŠãç£èŠããããã¡ã€ã« ãã¹ãåçã«æŽæ°ã§ããŸãã
| ãã£ãŒã«ã | 説æ |
|---|---|
watchPaths |
絶察ãã¹ã®é åãçŸåšã®åçç£èŠãªã¹ãã眮ãæããŸãïŒãããã£ãŒèšå®ããã®ãã¹ã¯åžžã«ç£èŠãããŸãïŒããã㯠ã¹ã¯ãªããã倿Žããããã¡ã€ã«ã«åºã¥ããŠæ€åºãã远å ãã¡ã€ã«ãç£èŠããå Žåã«äœ¿çšããŸã |
FileChanged ããã¯ã¯æ±ºå®å¶åŸ¡ããããŸããããã¡ã€ã«å€æŽããããã¯ã§ããŸããã
WorktreeCreate
claude --worktree ãå®è¡ãããããµããšãŒãžã§ã³ãã isolation: "worktree" ã䜿çšããå ŽåãClaude Code 㯠git worktree ã䜿çšããŠåé¢ãããäœæ¥ã³ããŒãäœæããŸããWorktreeCreate ããã¯ãèšå®ããå Žåãããã©ã«ãã® git åäœã眮ãæããSVNãPerforceãMercurial ãªã©ã®å¥ã®ããŒãžã§ã³ç®¡çã·ã¹ãã ã䜿çšã§ããŸãã
ããã¯ã¯äœæãããã¯ãŒã¯ããªãŒ ãã£ã¬ã¯ããªãžã®çµ¶å¯Ÿãã¹ãè¿ãå¿
èŠããããŸããClaude Code ã¯ãã®ãã¹ãåé¢ãããã»ãã·ã§ã³ã®äœæ¥ãã£ã¬ã¯ããªãšããŠäœ¿çšããŸããã³ãã³ã ããã¯ã¯ stdout ã«ãã¹ãåºåããŸããHTTP ããã¯ã¯ hookSpecificOutput.worktreePath çµç±ã§è¿ããŸãã
ããã¯ã¯ããã©ã«ãã® git åäœãå®å
šã«çœ®ãæããããã.worktreeincludeã¯åŠçãããŸããã.env ãªã©ã®ããŒã«ã«èšå®ãã¡ã€ã«ãæ°ããã¯ãŒã¯ããªãŒã«ã³ããŒããå¿
èŠãããå Žåã¯ããã㯠ã¹ã¯ãªããå
ã§å®è¡ããŠãã ããã
ãã®äŸã¯ SVN äœæ¥ã³ããŒãäœæããClaude Code ã䜿çšãããã¹ãåºåããŸãããªããžã㪠URL ãèªåã®ãã®ã«çœ®ãæããŸãã
{
"hooks": {
"WorktreeCreate": [
{
"hooks": [
{
"type": "command",
"command": "bash -c 'NAME=$(jq -r .name); DIR=\"$HOME/.claude/worktrees/$NAME\"; svn checkout https://svn.example.com/repo/trunk \"$DIR\" >&2 && echo \"$DIR\"'"
}
]
}
]
}
}
ããã¯ã¯ stdin ãã JSON å
¥åããã¯ãŒã¯ããªãŒ name ãèªã¿åããæ°ãããã£ã¬ã¯ããªã«æ°ããã³ããŒããã§ãã¯ã¢ãŠããããã£ã¬ã¯ã㪠ãã¹ãåºåããŸããæåŸã®è¡ã® echo 㯠Claude Code ãèªã¿åãã¯ãŒã¯ããªãŒ ãã¹ã§ããä»ã®åºåã stderr ã«ãªãã€ã¬ã¯ãããŠããã¹ã«å¹²æžããªãããã«ããŸãã
WorktreeCreate å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãWorktreeCreate ããã¯ã¯ name ãã£ãŒã«ããåãåããŸããããã¯æ°ããã¯ãŒã¯ããªãŒã®ã¹ã©ãã°èå¥åã§ããŠãŒã¶ãŒãæå®ãããèªåçæãããŸãïŒäŸãã°ãbold-oak-a3f2ïŒã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "WorktreeCreate",
"name": "feature-auth"
}
WorktreeCreate åºå
WorktreeCreate ããã¯ã¯æšæºçãªèš±å¯/ãããã¯æ±ºå®ã¢ãã«ã䜿çšããŸããã代ããã«ãããã¯ã®æåãŸãã¯å€±æãçµæãæ±ºå®ããŸããããã¯ã¯äœæãããã¯ãŒã¯ããªãŒ ãã£ã¬ã¯ããªãžã®çµ¶å¯Ÿãã¹ãè¿ãå¿ èŠããããŸãã
- ã³ãã³ã ãã㯠(
type: "command"): stdout ã«ãã¹ãåºåããŸãã - HTTP ãã㯠(
type: "http"): ã¬ã¹ãã³ã¹æ¬äœã§{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }ãè¿ããŸãã
ããã¯ã倱æãããåºåãçæããªãå Žåãã¯ãŒã¯ããªãŒäœæã¯ãšã©ãŒã§å€±æããŸãã
WorktreeRemove
WorktreeCreateã®ã¯ãªãŒã³ã¢ãã察å¿ããã®ããã¯ã¯ã¯ãŒã¯ããªãŒãåé€ããããšãã«çºç«ããŸãã--worktree ã»ãã·ã§ã³ãçµäºããŠåé€ãéžæããããisolation: "worktree" ãæã€ãµããšãŒãžã§ã³ããå®äºãããšããgit ããŒã¹ã®ã¯ãŒã¯ããªãŒã®å ŽåãClaude 㯠git worktree remove ã§èªåçã«ã¯ãªãŒã³ã¢ãããåŠçããŸããgit 以å€ã®ããŒãžã§ã³ç®¡çã·ã¹ãã ã® WorktreeCreate ããã¯ãèšå®ããå Žåãã¯ãªãŒã³ã¢ãããåŠçããããã« WorktreeRemove ããã¯ãšãã¢ã«ããŸãããªããã°ãã¯ãŒã¯ããªãŒ ãã£ã¬ã¯ããªã¯ãã£ã¹ã¯äžã«æ®ããŸãã
Claude Code 㯠WorktreeCreate ãè¿ãããã¹ã worktree_path ãšããŠããã¯å
¥åã«æž¡ããŸãããã®äŸã¯ãã®ãã¹ãèªã¿åãããã£ã¬ã¯ããªãåé€ããŸãã
{
"hooks": {
"WorktreeRemove": [
{
"hooks": [
{
"type": "command",
"command": "bash -c 'jq -r .worktree_path | xargs rm -rf'"
}
]
}
]
}
}
WorktreeRemove å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããWorktreeRemove ããã¯ã¯åé€ãããã¯ãŒã¯ããªãŒãžã®çµ¶å¯Ÿãã¹ã§ãã worktree_path ãã£ãŒã«ããåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "WorktreeRemove",
"worktree_path": "/Users/.../my-project/.claude/worktrees/feature-auth"
}
WorktreeRemove ããã¯ã¯æ±ºå®å¶åŸ¡ããããŸãããã¯ãŒã¯ããªãŒåé€ããããã¯ã§ããŸããããããŒãžã§ã³ç®¡çç¶æ ã®åé€ãã¢ãŒã«ã€ã倿Žãªã©ã®ã¯ãªãŒã³ã¢ãã ã¿ã¹ã¯ãå®è¡ã§ããŸããããã¯å€±æã¯ãããã° ã¢ãŒãã§ã®ã¿ãã°ãããŸãã
PreCompact
Claude Code ãã³ã³ãã¯ã·ã§ã³æäœãå®è¡ããããšããŠããåã«å®è¡ãããŸãã
ãããã£ãŒå€ã¯ãã³ã³ãã¯ã·ã§ã³ãæåã§ããªã¬ãŒããããèªåçã«ããªã¬ãŒããããã瀺ããŸãã
| ãããã£ãŒ | ãã€çºç«ããã |
|---|---|
manual |
/compact |
auto |
ã³ã³ããã¹ã ãŠã£ã³ããŠãæºæ¯ã®ãšãã®èªåã³ã³ãã¯ã·ã§ã³ |
çµäºã³ãŒã 2 ã§ã³ã³ãã¯ã·ã§ã³ããããã¯ãæåã® /compact ã®å Žåãstderr ã¡ãã»ãŒãžã¯ãŠãŒã¶ãŒã«è¡šç€ºãããŸããJSON ã§ "decision": "block" ãè¿ããŠãããã¯ããããšãã§ããŸãã
èªåã³ã³ãã¯ã·ã§ã³ã®ãããã¯ã¯ããã€çºç«ãããã«å¿ããŠç°ãªã广ããããŸããã³ã³ããã¹ãå¶éã®åã«ã³ã³ãã¯ã·ã§ã³ãããã¢ã¯ãã£ãã«ããªã¬ãŒãããå ŽåãClaude Code ã¯ãããã¹ãããããäŒè©±ã¯éå§çž®ã§ç¶è¡ãããŸããã³ã³ããã¹ãå¶éãšã©ãŒããå埩ããããã«ã³ã³ãã¯ã·ã§ã³ãããªã¬ãŒãããå Žåãåºç€ãšãªããšã©ãŒã衚瀺ãããçŸåšã®ãªã¯ãšã¹ãã倱æããŸãã
PreCompact å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãPreCompact ããã¯ã¯ trigger ãš custom_instructions ãåãåããŸããmanual ã®å Žåãcustom_instructions ã¯ãŠãŒã¶ãŒã /compact ã«æž¡ããã®ãå«ã¿ãŸããauto ã®å Žåãcustom_instructions ã¯ç©ºã§ãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "PreCompact",
"trigger": "manual",
"custom_instructions": ""
}
PostCompact
Claude Code ãã³ã³ãã¯ã·ã§ã³æäœãå®äºããåŸã«å®è¡ãããŸãããã®ã€ãã³ãã䜿çšããŠãæ°ããã³ã³ãã¯ãç¶æ ã«åå¿ããŸããäŸãã°ãçæããããµããªãŒããã°ããããå€éšç¶æ ãæŽæ°ãããããŸãã
PreCompact ãšåããããã£ãŒå€ãé©çšãããŸãã
| ãããã£ãŒ | ãã€çºç«ããã |
|---|---|
manual |
/compact ã®åŸ |
auto |
ã³ã³ããã¹ã ãŠã£ã³ããŠãæºæ¯ã®ãšãã®èªåã³ã³ãã¯ã·ã§ã³åŸ |
PostCompact å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãPostCompact ããã¯ã¯ trigger ãš compact_summary ãåãåããŸããcompact_summary ãã£ãŒã«ãã¯ã³ã³ãã¯ã·ã§ã³æäœã«ãã£ãŠçæãããäŒè©±ãµããªãŒãå«ã¿ãŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "PostCompact",
"trigger": "manual",
"compact_summary": "Summary of the compacted conversation..."
}
PostCompact ããã¯ã¯æ±ºå®å¶åŸ¡ããããŸãããã³ã³ãã¯ã·ã§ã³çµæã«åœ±é¿ãäžããããšã¯ã§ããŸãããããã©ããŒã¢ãã ã¿ã¹ã¯ãå®è¡ã§ããŸãã
SessionEnd
Claude Code ã»ãã·ã§ã³ãçµäºãããšãã«å®è¡ãããŸããã¯ãªãŒã³ã¢ãã ã¿ã¹ã¯ãã»ãã·ã§ã³çµ±èšã®ãã°ããŸãã¯ã»ãã·ã§ã³ç¶æ ã®ä¿åã«äŸ¿å©ã§ããçµäºçç±ã§ãã£ã«ã¿ãªã³ã°ãããããã£ãŒããµããŒãããŸãã
ããã¯å
¥åã® reason ãã£ãŒã«ãã¯ã»ãã·ã§ã³ãçµäºããçç±ã瀺ããŸãã
| çç± | 説æ |
|---|---|
clear |
/clear ã³ãã³ãã§ã»ãã·ã§ã³ãã¯ãªã¢ |
resume |
ã€ã³ã¿ã©ã¯ãã£ã /resume çµç±ã§ã»ãã·ã§ã³ãåãæ¿ã |
logout |
ãŠãŒã¶ãŒããã°ã¢ãŠã |
prompt_input_exit |
ããã³ããå ¥åã衚瀺ãããŠããéã«ãŠãŒã¶ãŒãçµäº |
bypass_permissions_disabled |
ãã€ãã¹æš©éã¢ãŒããç¡å¹å |
other |
ãã®ä»ã®çµäºçç± |
SessionEnd å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãSessionEnd ããã¯ã¯ã»ãã·ã§ã³ãçµäºããçç±ã瀺ã reason ãã£ãŒã«ããåãåããŸããäžèšã®çç±ããŒãã«ããã¹ãŠã®å€ã«ã€ããŠåç
§ããŠãã ããã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "SessionEnd",
"reason": "other"
}
SessionEnd ããã¯ã¯æ±ºå®å¶åŸ¡ããããŸãããã»ãã·ã§ã³çµäºããããã¯ã§ããŸããããã¯ãªãŒã³ã¢ãã ã¿ã¹ã¯ãå®è¡ã§ããŸãã
SessionEnd ããã¯ã®ããã©ã«ã ã¿ã€ã ã¢ãŠã㯠1.5 ç§ã§ããããã¯ã»ãã·ã§ã³çµäºã/clearãããã³ã€ã³ã¿ã©ã¯ãã£ã /resume çµç±ã§ã®ã»ãã·ã§ã³åãæ¿ãã«é©çšãããŸããããã¯ã«ããå€ãã®æéãå¿
èŠãªå Žåã¯ãããã¯èšå®ã§ããã¯ããšã® timeout ãèšå®ããŸããå
šäœçãªäºç®ã¯ãèšå®ãã¡ã€ã«ã§èšå®ãããããã¯ããšã®ã¿ã€ã ã¢ãŠãã®æé«å€ã«èªåçã«åŒãäžããããæå€§ 60 ç§ã§ãããã©ã°ã€ã³æäŸã®ããã¯ã«èšå®ãããã¿ã€ã ã¢ãŠãã¯äºç®ãåŒãäžããŸãããäºç®ãæç€ºçã«ãªãŒããŒã©ã€ãããã«ã¯ãCLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS ç°å¢å€æ°ãããªç§åäœã§èšå®ããŸãã
CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude
Elicitation
MCP ãµãŒããŒãã¿ã¹ã¯äžã«ãŠãŒã¶ãŒå ¥åããªã¯ãšã¹ããããšãã«å®è¡ãããŸããããã©ã«ãã§ã¯ãClaude Code ã¯ãŠãŒã¶ãŒãå¿çããããã®ã€ã³ã¿ã©ã¯ãã£ã ãã€ã¢ãã°ã衚瀺ããŸããããã¯ã¯ãã®ãªã¯ãšã¹ããã€ã³ã¿ãŒã»ããããŠãããã°ã©ã ã§å¿çãããã€ã¢ãã°ãå®å šã«ã¹ãããã§ããŸãã
ãããã£ãŒ ãã£ãŒã«ã㯠MCP ãµãŒããŒåã«å¯ŸããŠãããããŸãã
Elicitation å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãElicitation ããã¯ã¯ mcp_server_nameãmessageãããã³ãªãã·ã§ã³ã§ modeãurlãelicitation_idãrequested_schema ãã£ãŒã«ããåãåããŸãã
ãã©ãŒã ã¢ãŒã elicitationïŒæãäžè¬çãªã±ãŒã¹ïŒã®å Žåã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "Elicitation",
"mcp_server_name": "my-mcp-server",
"message": "Please provide your credentials",
"mode": "form",
"requested_schema": {
"type": "object",
"properties": {
"username": { "type": "string", "title": "Username" }
}
}
}
URL ã¢ãŒã elicitationïŒãã©ãŠã¶ããŒã¹ã®èªèšŒïŒã®å Žåã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "Elicitation",
"mcp_server_name": "my-mcp-server",
"message": "Please authenticate",
"mode": "url",
"url": "https://auth.example.com/login"
}
Elicitation åºå
ãã€ã¢ãã°ã衚瀺ããã«ããã°ã©ã ã§å¿çããã«ã¯ãhookSpecificOutput ãå«ã JSON ãªããžã§ã¯ããè¿ããŸãã
{
"hookSpecificOutput": {
"hookEventName": "Elicitation",
"action": "accept",
"content": {
"username": "alice"
}
}
}
| ãã£ãŒã«ã | å€ | 説æ |
|---|---|---|
action |
acceptãdeclineãcancel |
ãªã¯ãšã¹ããåãå ¥ããããæåŠãããããã£ã³ã»ã«ããã |
content |
ãªããžã§ã¯ã | éä¿¡ãããã©ãŒã ãã£ãŒã«ãå€ãaction ã accept ã®ãšãã®ã¿äœ¿çš |
çµäºã³ãŒã 2 㯠elicitation ãæåŠããstderr ããŠãŒã¶ãŒã«è¡šç€ºããŸãã
ElicitationResult
ãŠãŒã¶ãŒã MCP elicitation ã«å¿çããåŸã«å®è¡ãããŸããããã¯ã¯å¿çã芳å¯ã倿ŽããŸãã¯ãããã¯ããŠãããMCP ãµãŒããŒã«éãè¿ãããšãã§ããŸãã
ãããã£ãŒ ãã£ãŒã«ã㯠MCP ãµãŒããŒåã«å¯ŸããŠãããããŸãã
ElicitationResult å ¥å
å
±éå
¥åãã£ãŒã«ãã«å ããŠãElicitationResult ããã¯ã¯ mcp_server_nameãactionãããã³ãªãã·ã§ã³ã§ modeãelicitation_idãcontent ãã£ãŒã«ããåãåããŸãã
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"permission_mode": "default",
"hook_event_name": "ElicitationResult",
"mcp_server_name": "my-mcp-server",
"action": "accept",
"content": { "username": "alice" },
"mode": "form",
"elicitation_id": "elicit-123"
}
ElicitationResult åºå
ãŠãŒã¶ãŒã®å¿çããªãŒããŒã©ã€ãããã«ã¯ãhookSpecificOutput ãå«ã JSON ãªããžã§ã¯ããè¿ããŸãã
{
"hookSpecificOutput": {
"hookEventName": "ElicitationResult",
"action": "decline",
"content": {}
}
}
| ãã£ãŒã«ã | å€ | 説æ |
|---|---|---|
action |
acceptãdeclineãcancel |
ãŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ããªãŒããŒã©ã€ã |
content |
ãªããžã§ã¯ã | ãã©ãŒã ãã£ãŒã«ãå€ããªãŒããŒã©ã€ããaction ã accept ã®ãšãã®ã¿æå³ããã |
çµäºã³ãŒã 2 ã¯ã¬ã¹ãã³ã¹ããããã¯ããæå¹ãªã¢ã¯ã·ã§ã³ã decline ã«å€æŽããŸãã
ããã³ãã ããŒã¹ã®ããã¯
ã³ãã³ããHTTPãMCP ããŒã« ããã¯ã«å ããŠãClaude Code ã¯ããã³ãã ããŒã¹ã®ããã¯ïŒtype: "prompt"ïŒããµããŒãããŠãããLLM ã䜿çšããŠã¢ã¯ã·ã§ã³ãèš±å¯ãŸãã¯ãããã¯ãããã©ãããè©äŸ¡ãããšãŒãžã§ã³ã ããã¯ïŒtype: "agent"ïŒã¯ããŒã« ã¢ã¯ã»ã¹ãæã€ agentic ããªãã¡ã€ã¢ãŒãçæããŸãããã¹ãŠã®ã€ãã³ãããã¹ãŠã®ãã㯠ã¿ã€ãããµããŒãããŠããããã§ã¯ãããŸããã
5 ã€ã®ãã㯠ã¿ã€ãïŒcommandãhttpãmcp_toolãpromptãagentïŒãã¹ãŠããµããŒãããã€ãã³ãïŒ
PermissionRequestPostToolBatchPostToolUsePostToolUseFailurePreToolUseStopSubagentStopTaskCompletedTaskCreatedUserPromptExpansionUserPromptSubmit
commandãhttpãmcp_tool ããã¯ããµããŒãããããprompt ãŸã㯠agent ããµããŒãããªãã€ãã³ãïŒ
ConfigChangeCwdChangedElicitationElicitationResultFileChangedInstructionsLoadedNotificationPermissionDeniedPostCompactPreCompactSessionEndStopFailureSubagentStartTeammateIdleWorktreeCreateWorktreeRemove
SessionStart ãš Setup 㯠command ãš mcp_tool ããã¯ããµããŒãããŠããŸããããã㯠httpãpromptãagent ããã¯ããµããŒãããŠããŸããã
ããã³ãã ããŒã¹ã®ããã¯ã®ä»çµã¿
ããã³ãã ããŒã¹ã®ããã¯ã¯ Bash ã³ãã³ããå®è¡ãã代ããã«ïŒ
- ããã¯å ¥åãšããã³ããã Claude ã¢ãã«ïŒããã©ã«ã㯠HaikuïŒã«éä¿¡
- LLM ã¯æ±ºå®ãå«ãæ§é å JSON ã§å¿ç
- Claude Code ã¯æ±ºå®ãèªåçã«åŠç
ããã³ãã ããã¯èšå®
type ã "prompt" ã«èšå®ããcommand ã®ä»£ããã« prompt æååãæäŸããŸãã$ARGUMENTS ãã¬ãŒã¹ãã«ããŒã䜿çšããŠãããã¯ã® JSON å
¥åããŒã¿ãããã³ãã ããã¹ãã«æ³šå
¥ããŸããClaude Code ã¯çµåãããããã³ãããšå
¥åãé«é Claude ã¢ãã«ã«éä¿¡ããJSON 決å®ãè¿ããŸãã
ãã® Stop ããã¯ã¯ãClaude ãçµäºããåã«ãã¹ãŠã®ã¿ã¹ã¯ãå®äºããŠãããã©ãããè©äŸ¡ãããã LLM ã«æ±ããŸãïŒ
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "prompt",
"prompt": "Evaluate if Claude should stop: $ARGUMENTS. Check if all tasks are complete."
}
]
}
]
}
}
| ãã£ãŒã«ã | å¿ é | 説æ |
|---|---|---|
type |
ã¯ã | "prompt" ã§ããå¿
èŠããããŸã |
prompt |
ã¯ã | LLM ã«éä¿¡ããããã³ãã ããã¹ããããã¯å
¥å JSON ã®ãã¬ãŒã¹ãã«ããŒãšã㊠$ARGUMENTS ã䜿çšããŸãã$ARGUMENTS ãååšããªãå Žåãå
¥å JSON ãããã³ããã«è¿œå ãããŸã |
model |
ããã | è©äŸ¡ã«äœ¿çšããã¢ãã«ãããã©ã«ãã¯é«éã¢ãã« |
timeout |
ããã | ã¿ã€ã ã¢ãŠãïŒç§åäœïŒãããã©ã«ãïŒ30 |
continueOnBlock |
ããã | ããã³ããã ok: false ãè¿ããšããçç±ã Claude ã«ãã£ãŒãããã¯ããŠã忢ãã代ããã«ã¿ãŒã³ãç¶è¡ããŸããããã©ã«ãïŒfalseãçµæã® decision: "block" ã« continue: true ãšããŠå®è£
ãããŸããã€ãã³ã ããšã®åäœã«ã€ããŠã¯ãã¬ã¹ãã³ã¹ ã¹ããŒããåç
§ããŠãã ãã |
ã¬ã¹ãã³ã¹ ã¹ããŒã
LLM ã¯ä»¥äžãå«ã JSON ã§å¿çããå¿ èŠããããŸãïŒ
{
"ok": true | false,
"reason": "Explanation for the decision"
}
| ãã£ãŒã«ã | 説æ |
|---|---|
ok |
true ã¯ã¢ã¯ã·ã§ã³ãèš±å¯ãfalse 㯠decision: "block" ãçæããŸãã以äžã®ã€ãã³ã ããšã®åäœãåç
§ããŠãã ãã |
reason |
ok ã false ã®ãšãã«å¿
é ããããã¯çç±ãšããŠäœ¿çšãããŸã |
ok: false ã§äœãèµ·ãããã¯ã€ãã³ãã«ãã£ãŠç°ãªããŸãïŒ
StopãšSubagentStopïŒçç±ã¯ Claude ã®æ¬¡ã®æç€ºãšããŠãã£ãŒãããã¯ãããã¿ãŒã³ãç¶è¡ãããŸãPreToolUseïŒããŒã«åŒã³åºããæåŠãããçç±ã¯ Claude ã«ããŒã« ãšã©ãŒãšããŠè¿ãããŸããããã¯ã³ãã³ã ããã¯ã®permissionDecision: "deny"ãšåçã§ãPostToolUseïŒããã©ã«ãã§ã¯ã¿ãŒã³ãçµäºããçç±ã¯èŠåè¡ãšããŠãã£ããã«è¡šç€ºãããŸããcontinueOnBlock: trueãèšå®ããŠãçç±ã Claude ã«ãã£ãŒãããã¯ããã¿ãŒã³ãç¶è¡ãã代ããã«äœ¿çšããŸãPostToolBatchãUserPromptSubmitãUserPromptExpansionïŒã¿ãŒã³ãçµäºããçç±ã¯èŠåè¡ãšããŠè¡šç€ºãããŸãããããã®ã€ãã³ãã¯continueã«é¢ä¿ãªãdecision: "block"ã§ã¿ãŒã³ãçµäºããŸãPostToolUseFailureãTaskCreatedãTaskCompletedïŒçç±ã¯ Claude ã«ããŒã« ãšã©ãŒãšããŠè¿ãããŸããPreToolUseãšåæ§ã§ãPermissionRequestïŒok: falseã¯å¹æããããŸãããããã¯ããæ¿èªãæåŠããã«ã¯ãã³ãã³ã ããã¯ã䜿çšããŠhookSpecificOutput.decision.behavior: "deny"ãè¿ããŸã
ä»»æã®ã€ãã³ãã§ãã现ããå¶åŸ¡ãå¿ èŠãªå Žåã¯ã決å®å¶åŸ¡ã§èª¬æãããŠããã€ãã³ã ããšã®ãã£ãŒã«ãã䜿çšããŠãã³ãã³ã ããã¯ã䜿çšããŠãã ããã
äŸïŒãã«ãåºæº Stop ããã¯
ãã® Stop ããã¯ã¯è©³çްãªããã³ããã䜿çšããŠãClaude ã忢ããããšãèš±å¯ããåã« 3 ã€ã®æ¡ä»¶ããã§ãã¯ããŸãã"ok" ã false ã®å ŽåãClaude ã¯æäŸãããçç±ãæ¬¡ã®æç€ºãšããŠåãåããäœæ¥ãç¶è¡ããŸããSubagentStop ããã¯ã¯åã圢åŒã䜿çšããŠããµããšãŒãžã§ã³ãã忢ãã¹ããã©ãããè©äŸ¡ããŸãïŒ
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "prompt",
"prompt": "You are evaluating whether Claude should stop working. Context: $ARGUMENTS\n\nAnalyze the conversation and determine if:\n1. All user-requested tasks are complete\n2. Any errors need to be addressed\n3. Follow-up work is needed\n\nRespond with JSON: {\"ok\": true} to allow stopping, or {\"ok\": false, \"reason\": \"your explanation\"} to continue working.",
"timeout": 30
}
]
}
]
}
}
ãšãŒãžã§ã³ã ããŒã¹ã®ããã¯
ãšãŒãžã§ã³ã ããã¯ã¯å®éšçã§ããåäœãšèšå®ã¯å°æ¥ã®ãªãªãŒã¹ã§å€æŽãããå¯èœæ§ããããŸããæ¬çªã¯ãŒã¯ãããŒã®å Žåã¯ãã³ãã³ã ããã¯ãåªå ããŠãã ããã
ãšãŒãžã§ã³ã ããŒã¹ã®ããã¯ïŒtype: "agent"ïŒã¯ããã³ãã ããŒã¹ã®ããã¯ã®ããã§ããããã«ãã¿ãŒã³ ããŒã« ã¢ã¯ã»ã¹ãåããŠããŸããåäžã® LLM åŒã³åºãã®ä»£ããã«ããšãŒãžã§ã³ã ããã¯ã¯ãµããšãŒãžã§ã³ããçæãããã¡ã€ã«ãèªã¿åããã³ãŒããæ€çŽ¢ããã³ãŒãããŒã¹ãæ€æ»ããŠæ¡ä»¶ãæ€èšŒã§ããŸãããšãŒãžã§ã³ã ããã¯ã¯ããã³ãã ããŒã¹ã®ããã¯ãšåãã€ãã³ãããµããŒãããŠããŸãã
ãšãŒãžã§ã³ã ããã¯ã®ä»çµã¿
ãšãŒãžã§ã³ã ããã¯ãçºç«ãããšãïŒ
- Claude Code ã¯ããã³ãããšããã¯ã® JSON å ¥åãæã€ãµããšãŒãžã§ã³ããçæããŸã
- ãµããšãŒãžã§ã³ã㯠ReadãGrepãGlob ãªã©ã®ããŒã«ã䜿çšããŠèª¿æ»ã§ããŸã
- æå€§ 50 ã¿ãŒã³åŸããµããšãŒãžã§ã³ãã¯æ§é å
{ "ok": true/false }決å®ãè¿ããŸã - Claude Code ã¯ããã³ãã ããã¯ãšåãæ¹æ³ã§æ±ºå®ãåŠçããŸã
ãšãŒãžã§ã³ã ããã¯ã¯ãããã¯å ¥åããŒã¿ã®ã¿ãè©äŸ¡ããã®ã§ã¯ãªããå®éã®ãã¡ã€ã«ãæ€æ»ããããã¹ãåºåãæ€æ»ãããããå¿ èŠãããå Žåã«äŸ¿å©ã§ãã
ãšãŒãžã§ã³ã ããã¯èšå®
type ã "agent" ã«èšå®ããprompt æååãæäŸããŸããèšå®ãã£ãŒã«ãã¯ããã³ãã ããã¯ãšåãã§ãããããé·ãããã©ã«ã ã¿ã€ã ã¢ãŠãã§ãïŒ
| ãã£ãŒã«ã | å¿ é | 説æ |
|---|---|---|
type |
ã¯ã | "agent" ã§ããå¿
èŠããããŸã |
prompt |
ã¯ã | æ€èšŒããå
容ã説æããããã³ãããããã¯å
¥å JSON ã®ãã¬ãŒã¹ãã«ããŒãšã㊠$ARGUMENTS ã䜿çšããŸã |
model |
ããã | 䜿çšããã¢ãã«ãããã©ã«ãã¯é«éã¢ãã« |
timeout |
ããã | ã¿ã€ã ã¢ãŠãïŒç§åäœïŒãããã©ã«ãïŒ60 |
ã¬ã¹ãã³ã¹ ã¹ããŒãã¯ããã³ãã ããã¯ãšåãã§ãïŒèš±å¯ããã«ã¯ { "ok": true } ãããããã¯ããã«ã¯ { "ok": false, "reason": "..." } ãè¿ããŸãã
ãã® Stop ããã¯ã¯ãClaude ãçµäºããããšãèš±å¯ããåã«ãã¹ãŠã®ãŠããã ãã¹ããåæ Œããããšãæ€èšŒããŸãïŒ
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "agent",
"prompt": "Verify that all unit tests pass. Run the test suite and check the results. $ARGUMENTS",
"timeout": 120
}
]
}
]
}
}
ããã¯ã°ã©ãŠã³ãã§ããã¯ãå®è¡
ããã©ã«ãã§ã¯ãããã¯ã¯å®äºãããŸã§ Claude ã®å®è¡ããããã¯ããŸãããããã€ã¡ã³ãããã¹ã ã¹ã€ãŒããå€éš API åŒã³åºããªã©ã®é·æéå®è¡ã¿ã¹ã¯ã®å Žåã"async": true ãèšå®ããŠããã¯ãããã¯ã°ã©ãŠã³ãã§å®è¡ããClaude ãäœæ¥ãç¶è¡ã§ããããã«ããŸããéåæããã¯ã¯ãããã¯ãŸã㯠Claude ã®åäœãå¶åŸ¡ã§ããŸãããdecisionãpermissionDecisionãcontinue ãªã©ã®ã¬ã¹ãã³ã¹ ãã£ãŒã«ãã¯ãå¶åŸ¡ããããšããã¢ã¯ã·ã§ã³ããã§ã«å®äºããŠããããã广ããããŸããã
éåæããã¯ãèšå®
ã³ãã³ã ããã¯ã®èšå®ã« "async": true ã远å ããŠãClaude ããããã¯ããã«ããã¯ã°ã©ãŠã³ãã§å®è¡ããŸãããã®ãã£ãŒã«ã㯠type: "command" ããã¯ã§ã®ã¿å©çšå¯èœã§ãã
ãã®ããã¯ã¯ããã¹ãŠã® Write ããŒã«åŒã³åºãã®åŸã«ãã¹ã ã¹ã¯ãªãããå®è¡ããŸããClaude 㯠run-tests.sh ãæå€§ 120 ç§éå®è¡ãããŠããéãããã«äœæ¥ãç¶è¡ããŸããã¹ã¯ãªãããå®äºãããšããã®åºåã¯æ¬¡ã®äŒè©±ã¿ãŒã³ã§é
ä¿¡ãããŸãã
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "/path/to/run-tests.sh",
"async": true,
"timeout": 120
}
]
}
]
}
}
timeout ãã£ãŒã«ãã¯ããã¯ã°ã©ãŠã³ã ããã»ã¹ã®æå€§æéïŒç§åäœïŒãèšå®ããŸããæå®ãããªãå Žåãéåæããã¯ã¯åæããã¯ãšåã 10 åã®ããã©ã«ãã䜿çšããŸãã
éåæããã¯ã®å®è¡æ¹æ³
éåæããã¯ãçºç«ãããšãClaude Code ã¯ãã㯠ããã»ã¹ãéå§ããå®äºãåŸ ããã«ããã«ç¶è¡ããŸããããã¯ã¯åæããã¯ãšåã JSON å ¥åã stdin çµç±ã§åãåããŸãã
ããã¯ã°ã©ãŠã³ã ããã»ã¹ãçµäºããåŸãããã¯ã additionalContext ãã£ãŒã«ããå«ã JSON ã¬ã¹ãã³ã¹ãçæããå Žåããã®ã³ã³ãã³ãã¯æ¬¡ã®äŒè©±ã¿ãŒã³ã§ Claude ã«ã³ã³ããã¹ããšããŠé
ä¿¡ãããŸããsystemMessage ãã£ãŒã«ã㯠Claude ã§ã¯ãªããããªãã«è¡šç€ºãããŸãã
éåæããã¯å®äºéç¥ã¯ããã©ã«ãã§æå¶ãããŸãããããã衚瀺ããã«ã¯ãCtrl+O ã§è©³çްã¢ãŒããæå¹ã«ãããã--verbose ã§ Claude Code ãéå§ããŸãã
äŸ: ãã¡ã€ã«å€æŽåŸã«ãã¹ããå®è¡
ãã®ããã¯ã¯ Claude ããã¡ã€ã«ãæžã蟌ããã³ã«ããã¯ã°ã©ãŠã³ãã§ãã¹ã ã¹ã€ãŒããéå§ãããã¹ããå®äºãããçµæã Claude ã«å ±åããŸãããã®ã¹ã¯ãªããããããžã§ã¯ãã® .claude/hooks/run-tests-async.sh ã«ä¿åããchmod +x ã§å®è¡å¯èœã«ããŸãã
#!/bin/bash
# run-tests-async.sh
# stdin ããããã¯å
¥åãèªã¿åã
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
# ãœãŒã¹ ãã¡ã€ã«ã®ã¿ãã¹ããå®è¡
if [[ "$FILE_PATH" != *.ts && "$FILE_PATH" != *.js ]]; then
exit 0
fi
# ãã¹ããå®è¡ããadditionalContext çµç±ã§çµæã Claude ã«å ±å
RESULT=$(npm test 2>&1)
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
MSG="Tests passed after editing $FILE_PATH"
else
MSG="Tests failed after editing $FILE_PATH: $RESULT"
fi
jq -nc --arg msg "$MSG" '{hookSpecificOutput: {hookEventName: "PostToolUse", additionalContext: $msg}}'
次ã«ããããžã§ã¯ã ã«ãŒãã® .claude/settings.json ã«ãã®èšå®ã远å ããŸããasync: true ãã©ã°ã«ãããClaude ã¯ãã¹ãã®å®è¡äžã«äœæ¥ãç¶è¡ã§ããŸãã
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/run-tests-async.sh",
"args": [],
"async": true,
"timeout": 300
}
]
}
]
}
}
å¶éäºé
éåæããã¯ã¯åæããã¯ãšæ¯ã¹ãŠããã€ãã®å¶çŽããããŸãã
asyncããµããŒãããã®ã¯type: "command"ããã¯ã®ã¿ã§ããããã³ãã ããŒã¹ã®ããã¯ã¯éåæã§å®è¡ã§ããŸããã- éåæããã¯ã¯ããŒã«åŒã³åºãããããã¯ãŸãã¯æ±ºå®ãè¿ãããšãã§ããŸãããããã¯ãå®äºãããŸã§ã«ãããªã¬ãŒããã¢ã¯ã·ã§ã³ã¯ãã§ã«é²è¡ããŠããŸãã
- ããã¯åºåã¯æ¬¡ã®äŒè©±ã¿ãŒã³ã§é
ä¿¡ãããŸããã»ãã·ã§ã³ãã¢ã€ãã«ç¶æ
ã®å Žåãã¬ã¹ãã³ã¹ã¯æ¬¡ã®ãŠãŒã¶ãŒæäœãŸã§åŸ
æ©ããŸããäŸå€:
asyncRewakeããã¯ãçµäºã³ãŒã 2 ã§çµäºãããšãã»ãã·ã§ã³ãã¢ã€ãã«ç¶æ ã§ã Claude ãçŽã¡ã«èµ·åããŸãã - åå®è¡ã¯åå¥ã®ããã¯ã°ã©ãŠã³ã ããã»ã¹ãäœæããŸããåãéåæããã¯ã®è€æ°ã®çºç«å šäœã§éè€æé€ã¯ãããŸããã
ã»ãã¥ãªãã£ã«é¢ããèæ ®äºé
å 責äºé
ã³ãã³ã ããã¯ã¯ã·ã¹ãã ãŠãŒã¶ãŒã®å®å šãªæš©éã§å®è¡ãããŸãã
ã³ãã³ã ããã¯ã¯ãŠãŒã¶ãŒ ã¢ã«ãŠã³ãã®å®å šãªæš©éã§ã·ã§ã« ã³ãã³ããå®è¡ããŸãããŠãŒã¶ãŒ ã¢ã«ãŠã³ããã¢ã¯ã»ã¹ã§ãããã¡ã€ã«ã倿Žãåé€ããŸãã¯ã¢ã¯ã»ã¹ã§ããŸãããã㯠ã³ãã³ããèšå®ã«è¿œå ããåã«ããã¹ãŠã®ãã㯠ã³ãã³ãã確èªããŠãã¹ãããŠãã ããã
ã»ãã¥ãªã㣠ãã¹ããã©ã¯ãã£ã¹
ããã¯ãæžããšãã¯ããããã®ãã©ã¯ãã£ã¹ã«çæããŠãã ããã
- å ¥åãæ€èšŒããã³ãµãã¿ã€ãº: å ¥åããŒã¿ãç²ç®çã«ä¿¡é Œããªãã§ãã ãã
- åžžã«ã·ã§ã«å€æ°ãåŒçš:
$VARã§ã¯ãªã"$VAR"ãäœ¿çš - ãã¹ ãã©ããŒãµã«ããããã¯: ãã¡ã€ã« ãã¹ã§
..ããã§ã㯠- 絶察ãã¹ã䜿çš: ã¹ã¯ãªããã®å®å
šãªãã¹ãæå®ããŸããexec 圢åŒã§ã¯ã
${CLAUDE_PROJECT_DIR}ã䜿çšãããã¹ã¯åŒçšç¬Šã§å²ãå¿ èŠããããŸãããã·ã§ã«åœ¢åŒã§ã¯ãããã« ã¯ã©ãŒãã§å²ã¿ãŸã - æ©å¯ãã¡ã€ã«ãã¹ããã:
.envã.git/ãããŒãªã©ãé¿ãã
Windows PowerShell ããŒã«
Windows ã§ã¯ãã³ãã³ã ããã¯ã§ "shell": "powershell" ãèšå®ããããšã§ãåå¥ã®ããã¯ã PowerShell ã§å®è¡ã§ããŸããããã¯ã¯ PowerShell ãçŽæ¥çæãããããCLAUDE_CODE_USE_POWERSHELL_TOOL ãèšå®ãããŠãããã©ããã«é¢ä¿ãªãæ©èœããŸããClaude Code 㯠pwsh.exeïŒPowerShell 7 以äžïŒãèªåæ€åºããpowershell.exeïŒ5.1ïŒã«ãã©ãŒã«ããã¯ããŸãã
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"shell": "powershell",
"command": "Write-Host 'File written'"
}
]
}
]
}
}
ããã¯ããããã°
ããã¯å®è¡ã®è©³çްããããããããã¯ãçµäºã³ãŒããå®å
šãª stdout ãš stderr ã¯ãããã° ãã° ãã¡ã€ã«ã«æžã蟌ãŸããŸããclaude --debug-file <path> ã§æ¢ç¥ã®å Žæã«ãã°ãæžã蟌ãããclaude --debug ãå®è¡ããŠãã°ã ~/.claude/debug/<session-id>.txt ã§èªã¿åããŸãã--debug ãã©ã°ã¯ã¿ãŒããã«ã«åºåããŸããã
[DEBUG] Executing hooks for PostToolUse:Write
[DEBUG] Found 1 hook commands to execute
[DEBUG] Executing hook command: <Your command> with timeout 600000ms
[DEBUG] Hook command completed with status 0: <Your stdout>
ãã詳现ãªãã㯠ãããã³ã°è©³çްã«ã€ããŠã¯ãCLAUDE_CODE_DEBUG_LOG_LEVEL=verbose ãèšå®ããŠããã㯠ãããã£ãŒæ°ãšã¯ãšãª ãããã³ã°ãªã©ã®è¿œå ãã°è¡ã確èªããŸãã
ããã¯ãçºç«ããªããStop ããã¯ãå®è¡ããããã¯ãç¶ããããŸãã¯èšå®ãšã©ãŒãªã©ã®äžè¬çãªåé¡ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã«ã€ããŠã¯ãã¬ã€ãã®å¶éäºé
ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°ãåç
§ããŠãã ããã/contextã/doctorãããã³èšå®ã®åªå
é äœãã«ããŒããããåºç¯ãªèšºæãã¥ãŒããªã¢ã«ã«ã€ããŠã¯ãèšå®ããããã°ãåç
§ããŠãã ããã