From 5aeb5688e834cc912011f30396fb2df35a82cee2 Mon Sep 17 00:00:00 2001 From: kilhyeonjun Date: Fri, 10 Apr 2026 10:15:49 +0900 Subject: [PATCH] fix: don't early-return on 'allow' in executePreToolUseHooks When multiple hook sources are merged (global ~/.claude/settings.json + project .claude/settings.json), a global catch-all hook returning 'allow' caused early return before project-level hooks could execute. Only 'deny' and 'ask' decisions should short-circuit. 'allow' should continue processing remaining hooks so project-specific guards (e.g., file budget enforcement) get a chance to block. --- src/hooks/claude-code-hooks/pre-tool-use.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/hooks/claude-code-hooks/pre-tool-use.ts b/src/hooks/claude-code-hooks/pre-tool-use.ts index 97bfaf04a..2d949d2d3 100644 --- a/src/hooks/claude-code-hooks/pre-tool-use.ts +++ b/src/hooks/claude-code-hooks/pre-tool-use.ts @@ -143,9 +143,9 @@ export async function executePreToolUseHooks( output.suppressOutput !== undefined || output.systemMessage !== undefined - if (decision || hasCommonFields) { + if (decision === "deny" || decision === "ask") { return { - decision: decision ?? "allow", + decision, reason, modifiedInput, elapsedMs: Date.now() - startTime, @@ -158,6 +158,11 @@ export async function executePreToolUseHooks( systemMessage: output.systemMessage, } } + + // "allow" — apply modifiedInput but continue processing remaining hooks + if (modifiedInput) { + Object.assign(stdinData.tool_input, objectToSnakeCase(modifiedInput)) + } } catch { } }