#!/bin/bash # install.sh # 一键把 ai-proj-helper hooks 注册到 ~/.claude/settings.json # # 用法: bash hooks/install.sh set -e HOOKS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SETTINGS_FILE="$HOME/.claude/settings.json" if ! command -v python3 >/dev/null 2>&1; then echo "❌ 需要 python3(用于合并 JSON)" exit 1 fi if ! command -v jq >/dev/null 2>&1; then echo "⚠️ 未安装 jq,PreToolUse hook 将无法正常工作" echo " 请执行: brew install jq" fi mkdir -p "$HOME/.claude" python3 << EOF import json import os settings_file = "$SETTINGS_FILE" hooks_dir = "$HOOKS_DIR" # 读已有配置 if os.path.exists(settings_file): with open(settings_file) as f: data = json.load(f) else: data = {} # 合并 hooks hooks = data.setdefault("hooks", {}) # SessionStart session_start = hooks.setdefault("SessionStart", []) session_cmd = f"{hooks_dir}/session-context.sh" already_registered = any( any(h.get("command") == session_cmd for h in entry.get("hooks", [])) for entry in session_start ) if not already_registered: session_start.append({ "hooks": [{"type": "command", "command": session_cmd, "timeout": 10}] }) print("✅ 注册 SessionStart hook") else: print("⏭️ SessionStart hook 已存在") # PreToolUse (Bash) pre_tool = hooks.setdefault("PreToolUse", []) pre_cmd = f"{hooks_dir}/pre-tool-confirm.sh" already_registered = any( entry.get("matcher") == "Bash" and any(h.get("command") == pre_cmd for h in entry.get("hooks", [])) for entry in pre_tool ) if not already_registered: pre_tool.append({ "matcher": "Bash", "hooks": [{"type": "command", "command": pre_cmd, "timeout": 30}] }) print("✅ 注册 PreToolUse (Bash) hook") else: print("⏭️ PreToolUse hook 已存在") # 写回 with open(settings_file, "w") as f: json.dump(data, f, indent=2, ensure_ascii=False) print(f"\n📝 已更新: {settings_file}") print("\n下一步:") print(" 1. 重启 Claude Code 会话") print(" 2. 切到含 REQ-ID 的分支测试 SessionStart hook") print(" 3. 让 AI 尝试 'git push origin main' 测试 PreToolUse hook") EOF