2026-04-20 04:57:50 +00:00
|
|
|
#!/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 13:24:56 +00:00
|
|
|
# 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"
|
2026-04-20 04:57:50 +00:00
|
|
|
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
|