From d11c4a1f81eefa3399af7d0314740f28363a0dc4 Mon Sep 17 00:00:00 2001 From: Xiaoya Wang <57889612+XiaoyaWang-gh@users.noreply.github.com> Date: Wed, 28 Jan 2026 15:26:28 +0800 Subject: [PATCH] fix: guard JSON.parse(result.stdout) with || "{}" fallback in hook handlers (#1191) Co-authored-by: wangxiaoya.2000 --- src/hooks/claude-code-hooks/post-tool-use.ts | 2 +- src/hooks/claude-code-hooks/pre-compact.ts | 2 +- src/hooks/claude-code-hooks/pre-tool-use.ts | 2 +- src/hooks/claude-code-hooks/stop.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hooks/claude-code-hooks/post-tool-use.ts b/src/hooks/claude-code-hooks/post-tool-use.ts index d7caf4cdf..abfcf4480 100644 --- a/src/hooks/claude-code-hooks/post-tool-use.ts +++ b/src/hooks/claude-code-hooks/post-tool-use.ts @@ -123,7 +123,7 @@ export async function executePostToolUseHooks( if (result.exitCode === 0 && result.stdout) { try { - const output = JSON.parse(result.stdout) as PostToolUseOutput + const output = JSON.parse(result.stdout || "{}") as PostToolUseOutput if (output.decision === "block") { return { block: true, diff --git a/src/hooks/claude-code-hooks/pre-compact.ts b/src/hooks/claude-code-hooks/pre-compact.ts index edaf1fa64..17a4b58e8 100644 --- a/src/hooks/claude-code-hooks/pre-compact.ts +++ b/src/hooks/claude-code-hooks/pre-compact.ts @@ -73,7 +73,7 @@ export async function executePreCompactHooks( if (result.stdout) { try { - const output = JSON.parse(result.stdout) as PreCompactOutput + const output = JSON.parse(result.stdout || "{}") as PreCompactOutput if (output.hookSpecificOutput?.additionalContext) { collectedContext.push(...output.hookSpecificOutput.additionalContext) diff --git a/src/hooks/claude-code-hooks/pre-tool-use.ts b/src/hooks/claude-code-hooks/pre-tool-use.ts index 51d8ca871..ac362a8e7 100644 --- a/src/hooks/claude-code-hooks/pre-tool-use.ts +++ b/src/hooks/claude-code-hooks/pre-tool-use.ts @@ -117,7 +117,7 @@ export async function executePreToolUseHooks( if (result.stdout) { try { - const output = JSON.parse(result.stdout) as PreToolUseOutput + const output = JSON.parse(result.stdout || "{}") as PreToolUseOutput // Handle deprecated decision/reason fields (Claude Code backward compat) let decision: PermissionDecision | undefined diff --git a/src/hooks/claude-code-hooks/stop.ts b/src/hooks/claude-code-hooks/stop.ts index f5371f64e..d1e1e8d18 100644 --- a/src/hooks/claude-code-hooks/stop.ts +++ b/src/hooks/claude-code-hooks/stop.ts @@ -93,7 +93,7 @@ export async function executeStopHooks( if (result.stdout) { try { - const output = JSON.parse(result.stdout) as StopOutput + const output = JSON.parse(result.stdout || "{}") as StopOutput if (output.stop_hook_active !== undefined) { stopHookActiveState.set(ctx.sessionId, output.stop_hook_active) }