#!/usr/bin/env python3
"""pretooluse_guard.py — PreToolUse hook 示例（无需 key）。

Claude Code 会在每次工具调用前把事件 JSON 通过 stdin 传给 hook；
hook 返回 exit code 2 = 阻止该工具调用（deny 规则在所有权限模式下都生效）。
这是「LLM 指令 ≠ 应用层强制」的最小可运行示范：
即使模型（或注入内容）想让 Bash 跑 `rm -rf`，这一层也会拒绝。

字段以 hooks reference 为准：https://code.claude.com/docs/en/hooks（2026-08-30）

用法（手动测试）: echo '{"tool_name":"Bash","tool_input":{"command":"rm -rf /"}}' | python3 pretooluse_guard.py
"""

from __future__ import annotations

import json
import sys

BLOCKED_PATTERNS = ("rm -rf", "curl http://", "git push --force origin main")


def main() -> int:
    try:
        event = json.load(sys.stdin)
    except json.JSONDecodeError:
        print("hook: 无法解析事件 JSON", file=sys.stderr)
        return 0  # 解析失败不阻断业务（fail-open 的教学示例；生产可改 fail-closed）

    tool = event.get("tool_name", "")
    cmd = str(event.get("tool_input", {}).get("command", ""))
    print(f"hook: 审查 {tool} -> {cmd[:80]}", file=sys.stderr)

    for pat in BLOCKED_PATTERNS:
        if pat in cmd:
            print(json.dumps({
                "decision": "block",
                "reason": f"违反项目策略：禁止 {pat!r}",
            }))
            return 2  # deny（exit code 2 阻止工具调用）

    print("hook: 允许", file=sys.stderr)
    return 0


if __name__ == "__main__":
    sys.exit(main())
