#!/usr/bin/env node /** * Minimal Claude Code hook bridge. * * This intentionally mirrors the Codex hook path without a worker daemon: * hook process in, SQLite operation, JSON output out. */ import { pathToFileURL } from "node:url"; import { type AgentHookEvent, type AgentHookInput, type AgentHookOutput, handleAgentHook, quiet, readStdinJson } from "./agent-hook.js"; interface ClaudeHookOutput { continue?: true; suppressOutput?: boolean; hookSpecificOutput?: AgentHookOutput["hookSpecificOutput"]; } export async function handleClaudeHook(event: AgentHookEvent, input: AgentHookInput): Promise { const output = await handleAgentHook("claude", event, input); if (output.hookSpecificOutput) { return { hookSpecificOutput: output.hookSpecificOutput }; } return output; } async function main(): Promise { const event = process.argv[2] as AgentHookEvent | undefined; if (!event || !["SessionStart", "PostToolUse", "Stop"].includes(event)) { console.log(JSON.stringify(quiet())); return; } try { const input = await readStdinJson(); console.log(JSON.stringify(await handleClaudeHook(event, input))); } catch { console.log(JSON.stringify(quiet())); } } if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { void main(); }