Skip to content

Hook payloads

Claude Code invokes each hook command with a JSON object on stdin. gitvow reads these fields:

Field Used by Meaning
session_id all the session identifier
transcript_path PostToolUse, Stop path to the JSONL transcript Claude Code keeps locally
cwd all the repository being worked on
hook_event_name all SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, Stop
tool_name PreToolUse, PostToolUse e.g. Bash, Edit, mcp__server__tool
tool_input PreToolUse, PostToolUse e.g. {"command": "..."} or {"file_path": "..."}
prompt UserPromptSubmit the person's message; only the first line of the session's first message is kept, redacted, as the intent; the message itself is never stored
permission_mode PreToolUse Claude Code's mode; in the prompting modes a confirm is answered as permissionDecision: ask

PostToolUse on an editing tool records the blob id of the written file for attribution and takes a working-tree snapshot; on a git commit it writes the session note. UserPromptSubmit records the intent once per session and prints nothing.

Output contract: exit 0 allows the call; exit 2 blocks it and Claude Code feeds stderr back to the model as the reason. gitvow never writes to stdout from a hook.

Settings entries

gitvow install merges these into settings.json:

{"hooks": {
  "SessionStart": [{"hooks": [{"type": "command", "command": "gitvow hook SessionStart"}]}],
  "UserPromptSubmit": [{"hooks": [{"type": "command", "command": "gitvow hook UserPromptSubmit"}]}],
  "PreToolUse":   [{"matcher": "Bash|Edit|Write|MultiEdit|NotebookEdit|mcp__.*", "hooks": [{"type": "command", "command": "gitvow hook PreToolUse"}]}],
  "PostToolUse":  [{"matcher": "Bash|Edit|Write|MultiEdit|NotebookEdit", "hooks": [{"type": "command", "command": "gitvow hook PostToolUse"}]}],
  "Stop":         [{"hooks": [{"type": "command", "command": "gitvow hook Stop"}]}]
}}

Entries are recognised by the gitvow hook prefix, so install is idempotent and uninstall removes only these.

Other agents

Codex CLI, Gemini CLI and Cursor are supported through adapters that translate their payloads into this shape; see Adapter reference.