#!/bin/sh # Install git hook and Claude Code hook for this repo. # Run once after cloning: sh scripts/install-hooks.sh set -e REPO_ROOT=$(git rev-parse --show-toplevel) # ── Git pre-commit hook ──────────────────────────────────────────────────── HOOK_DST="$REPO_ROOT/.git/hooks/pre-commit" cp "$REPO_ROOT/scripts/hook-pre-commit-docs.sh" "$HOOK_DST" chmod +x "$HOOK_DST" echo "✓ git pre-commit hook installed → .git/hooks/pre-commit" # ── Claude Code PreToolUse hook ──────────────────────────────────────────── CLAUDE_DIR="$REPO_ROOT/.claude" CLAUDE_HOOKS="$CLAUDE_DIR/hooks" CLAUDE_SETTINGS="$CLAUDE_DIR/settings.json" mkdir -p "$CLAUDE_HOOKS" # Copy the hook script into .claude/hooks/ cp "$REPO_ROOT/scripts/hook-pre-commit-docs.sh" "$CLAUDE_HOOKS/pre-commit-docs-check.sh" chmod +x "$CLAUDE_HOOKS/pre-commit-docs-check.sh" # Merge the hook entry into .claude/settings.json if [ -f "$CLAUDE_SETTINGS" ]; then # Add hooks key if not already present using Python python3 - "$CLAUDE_SETTINGS" <<'PYEOF' import sys, json path = sys.argv[1] with open(path) as f: cfg = json.load(f) hook_entry = { "type": "command", "command": "bash .claude/hooks/pre-commit-docs-check.sh" } hooks = cfg.setdefault("hooks", {}) pre = hooks.setdefault("PreToolUse", []) # Find or create Bash matcher bash_matchers = [m for m in pre if m.get("matcher") == "Bash"] if bash_matchers: existing = bash_matchers[0].setdefault("hooks", []) cmds = [h.get("command") for h in existing] if hook_entry["command"] not in cmds: existing.append(hook_entry) else: pre.append({"matcher": "Bash", "hooks": [hook_entry]}) with open(path, "w") as f: json.dump(cfg, f, indent=2) f.write("\n") print("✓ Claude Code PreToolUse hook registered → .claude/settings.json") PYEOF else cat > "$CLAUDE_SETTINGS" <