← Files GH Review LoopARCHIVED FILE

skills/gh-review-loop/scripts/hook_runtime.py

1.76 KB · Oct 4, 2026 · 12:34 UTC

↓ Download file

"""Runtime helpers shared by Claude and Codex hook entrypoints."""

from __future__ import annotations

import json
from pathlib import Path
from typing import Any


def load_hook_payload(raw: str) -> dict[str, Any]:
    """Parse a hook JSON payload, failing open to an empty dict."""
    try:
        payload = json.loads(raw or "{}")
    except (json.JSONDecodeError, ValueError, TypeError):
        return {}
    return payload if isinstance(payload, dict) else {}


def tool_name(payload: dict[str, Any]) -> str:
    """Return the invoked tool name across known hook payload shapes."""
    for key in ("tool_name", "toolName", "name"):
        value = payload.get(key)
        if isinstance(value, str):
            return value

    tool = payload.get("tool")
    if isinstance(tool, str):
        return tool
    if isinstance(tool, dict):
        for key in ("name", "tool_name", "toolName"):
            value = tool.get(key)
            if isinstance(value, str):
                return value
    return ""


def tool_command(payload: dict[str, Any]) -> str:
    """Return a Bash command string across known hook payload shapes."""
    for key in ("tool_input", "toolInput", "input", "arguments"):
        value = payload.get(key)
        if isinstance(value, dict) and isinstance(value.get("command"), str):
            return value["command"]
    value = payload.get("command")
    return value if isinstance(value, str) else ""


def script_path(script_name: str) -> Path:
    """Return an absolute path to a sibling script in this plugin install."""
    return Path(__file__).resolve().with_name(script_name)


def python_script_command(script_name: str) -> str:
    """Return a quoted python command for user-facing hook remediation text."""
    return f'python3 "{script_path(script_name)}"'

SHA-256: 73827352328c4e7dafd20caf1453a36cfe094f224a068475d6a27f08e854a8f3