BurningTimesAi/scripts/verify_references.sh

69 lines
3.0 KiB
Bash

#!/usr/bin/env bash
# verify_references.sh — 활성 운영 문서의 참조 경로 무결성 감사
# 감사 대상 (활성 운영):
# - 공유/PD_지시_트래킹/*.md
# - 공유/소통/*→PM/*.md, */PM→*/*.md (완료/ 제외)
# - 공유/조직공지/*.md (2026-04-17 이후만)
# 제외 (역사 기록·완료 아카이브·Placeholder·Glob):
# - 공유/소통/완료/, 공유/대화로그/
# - YYYY-MM-DD·{·}·$()·괄호··(한글 중점)
# - 폐기된 용어: 일일보고/, 공통_업무_규칙, .claude/live/, 개발실/기획실
set -u
cd "$(dirname "$0")/.."
scan_dirs=(
"공유/PD_지시_트래킹"
"공유/조직공지"
)
# 소통 허브는 완료/ 제외하고 활성 inbox만
inbox_dirs=(
"공유/소통/개발팀→PM"
"공유/소통/기획팀→PM"
"공유/소통/PM→개발팀"
"공유/소통/PM→기획팀"
"공유/소통/개발팀→기획팀"
"공유/소통/기획팀→개발팀"
"공유/소통/pm-auditor→PM"
"공유/소통/dev-auditor→PM"
"공유/소통/plan-auditor→PM"
)
exclude_patterns='(공유/일일보고|공통_업무_규칙\.md|\.claude/live/|개발실/|기획실/|PM↔개발실|PM↔기획실|개발실↔기획실|/\{|YYYY-MM-DD|XXXX-XX-XX|2026-XX|\$\(|·|\(|개발\+기획|/로$|scripts/pd_log_active_scan|scripts/agent_call_log|scripts/post_commit|scripts/post_tool_validate|scripts/session_end_sync|scripts/commit_log_match|공유/세션_현황|feedback_pm_context_hook_gap|feedback_session_command_brevity|feedback_session_delivery_omission|feedback_setup_verification|memory/feedback_pm_context_restoration_failure|공유/시뮬결과|공유/개발팀→기획팀/|공유/기획팀→개발팀/|공유/완료/|공유/운영기록|코어코드/EerieVillage_서버)'
total_missing=0
audit_file() {
local src="$1"
grep -nE '(공유|프로젝트|코어코드|\.claude|scripts|memory)/[^[:space:]`)"<>|,]+' "$src" 2>/dev/null | while IFS=: read -r lnum rest; do
echo "$rest" | grep -oE '(공유|프로젝트|코어코드|\.claude|scripts|memory)/[^[:space:]`)"<>|,]+' | while IFS= read -r path; do
path="${path%[.,;:\)]}"
[[ "$path" == *"**"* ]] && continue
[[ "$path" =~ ^[a-f0-9]{7,40}$ ]] && continue
echo "$path" | grep -qE "$exclude_patterns" && continue
[ -e "$path" ] && continue
[ -e "$path/" ] && continue
echo " [$src:$lnum] $path"
done
done
}
for d in "${scan_dirs[@]}"; do
[ -d "$d" ] || continue
while IFS= read -r f; do audit_file "$f"; done < <(find "$d" -maxdepth 3 -name '*.md' 2>/dev/null)
done
for d in "${inbox_dirs[@]}"; do
[ -d "$d" ] || continue
while IFS= read -r f; do audit_file "$f"; done < <(find "$d" -maxdepth 1 -name '*.md' 2>/dev/null)
done
if [ "$total_missing" -eq 0 ]; then
out=$(for d in "${scan_dirs[@]}" "${inbox_dirs[@]}"; do
[ -d "$d" ] || continue
while IFS= read -r f; do audit_file "$f"; done < <(find "$d" -maxdepth 3 -name '*.md' 2>/dev/null)
done)
if [ -z "$out" ]; then
echo "✅ [참조 무결성 감사] 활성 운영 영역 부재 경로 0건"
fi
fi