#!/bin/bash # post-commit hook — 활성 매니페스트 cross-check + archived 이동 # C35-9 Layer 3 근본 해결 2026-04-20 # M-1 수용: commit diff vs manifest target_files cross-check (부분집합 감지) MANIFEST_DIR="$HOME/.claude/nerdnavis-audit/manifest" ACTIVE_DIR="$MANIFEST_DIR/active" ARCHIVED_DIR="$MANIFEST_DIR/archived" [ ! -d "$ACTIVE_DIR" ] && exit 0 mkdir -p "$ARCHIVED_DIR" 2>/dev/null # 본 commit의 수정 파일 목록 COMMIT_FILES=$(git diff-tree --no-commit-id --name-only -r HEAD 2>/dev/null) [ -z "$COMMIT_FILES" ] && exit 0 # 활성 매니페스트 각각 cross-check + archived 이동 MOVED=0 for mf in "$ACTIVE_DIR"/*.md; do [ -f "$mf" ] || continue PLAN_ID=$(basename "$mf" .md) # target_files 추출 (YAML frontmatter) TARGET_FILES=$(awk '/^target_files:$/,/^[a-z_]+:/' "$mf" | grep -E '^ - ' | sed 's/^ - //') # cross-check: commit_files 중 target_files 밖 파일 OUT_OF_SCOPE=() while IFS= read -r cf; do [ -z "$cf" ] && continue if ! echo "$TARGET_FILES" | grep -qFx "$cf"; then OUT_OF_SCOPE+=("$cf") fi done <<< "$COMMIT_FILES" if [ "${#OUT_OF_SCOPE[@]}" -gt 0 ]; then echo "⚠️ [manifest cross-check] $PLAN_ID" >&2 echo " target_files 밖 수정 ${#OUT_OF_SCOPE[@]}건:" >&2 for f in "${OUT_OF_SCOPE[@]}"; do echo " - $f" >&2 done echo " → M-1 사후 경고. 매니페스트 범위 축소 조작 가능성 점검 필요." >&2 fi # archived 이동 if mv "$mf" "$ARCHIVED_DIR/" 2>/dev/null; then echo "📦 [manifest archived] $PLAN_ID" MOVED=$((MOVED + 1)) fi done [ "$MOVED" -gt 0 ] && echo "✅ [manifest] $MOVED건 archived 이동 완료" exit 0