#!/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 (부분집합 감지)

# 2026-05-06 (나) 채택 — main 워크트리 .claude/manifest/ 일괄 SOT
GCD=$(git rev-parse --git-common-dir 2>/dev/null)
MAIN_ROOT=$(cd "$GCD/.." 2>/dev/null && pwd)
[ -z "$MAIN_ROOT" ] && MAIN_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
MANIFEST_DIR="$MAIN_ROOT/.claude/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
