#!/bin/bash # PreToolUse hook — 감사 미보고 시 Edit/Write/MultiEdit/Bash(git commit·push) 차단 # C35-9 Layer 3 개정 (2026-04-20 PD님 직접 지시 — 차단 + 해제 워크플로우) # 근본 해결: "hook은 proxy" 자인 + LLM 자율 준수 한계 차단 층 추가 # 8회차 변종 재발 방지 (proxy 회피 반사·작업 유연성 명분 기각) INPUT=$(cat 2>/dev/null) # 1. tool_name 추출 TOOL_NAME=$(echo "$INPUT" | grep -oE '"tool_name"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"\([^"]*\)"$/\1/') # 2. 대상 tool 필터 SHOULD_GATE=0 case "$TOOL_NAME" in Edit|Write|MultiEdit) SHOULD_GATE=1 ;; Bash) CMD=$(echo "$INPUT" | grep -oE '"command"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1) if echo "$CMD" | grep -qE 'git[[:space:]]+(commit|push)'; then SHOULD_GATE=1 fi ;; esac [ "$SHOULD_GATE" -eq 0 ] && exit 0 # 3. 의무 영역 식별 (auditor_guard 동일 로직) TARGET="" if echo "$INPUT" | grep -qE '"file_path"[[:space:]]*:[[:space:]]*"[^"]*(SKILL\.md|memory/org/feedback|조직공지|PD_지시_트래킹)[^"]*"'; then TARGET="의무 영역 파일" elif echo "$INPUT" | grep -qE '"command"[[:space:]]*:[[:space:]]*"[^"]*git[[:space:]]+(commit|push)'; then TARGET="git commit/push" fi [ -z "$TARGET" ] && exit 0 # 4. M-1 수용: BYPASS 플래그 PreToolUse 차단 우회 불가 # (BYPASS는 기존 PostToolUse 경고 메커니즘 전용, 본 차단은 무조건 체크) # 5. 활성 매니페스트 존재 확인 MANIFEST_DIR="$HOME/.claude/nerdnavis-audit/manifest/active" mkdir -p "$MANIFEST_DIR" 2>/dev/null ACTIVE=$(ls -t "$MANIFEST_DIR"/*.md 2>/dev/null | head -1) if [ -z "$ACTIVE" ]; then cat >&2 < 3. 본 작업 재시도 → 차단 자동 해제 예시: bash scripts/manifest_register.sh "2026-04-20_$(date +%H%M%S)" "scripts/x.sh,SKILL.md" "안건 X 집행" 근거: C35-9 Layer 3 차단 + 해제 워크플로우 (2026-04-20 근본 해결) BYPASS 플래그로는 우회 불가 (M-1 수용) EOF exit 2 fi # 6. 범위 체크 — Edit/Write/MultiEdit인 경우 if [ "$TOOL_NAME" != "Bash" ]; then FILE_PATH=$(echo "$INPUT" | grep -oE '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"\([^"]*\)"$/\1/') REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) if [ -n "$REPO_ROOT" ] && [ -n "$FILE_PATH" ]; then REL=$(realpath --relative-to="$REPO_ROOT" "$FILE_PATH" 2>/dev/null || echo "$FILE_PATH") else REL="$FILE_PATH" fi # target_files 목록에서 검색 (YAML frontmatter " - " 형태) if ! grep -qF " - $REL" "$ACTIVE" 2>/dev/null; then cat >&2 <