#!/bin/bash # PreToolUse hook (Edit/Write/MultiEdit) — PM 실측 누락 감지·환기 # BurningTimes BT9 이식 (2026-04-24 NerdNavis 원본 반영 · PD 결정 5) # 원본: D:/NerdNavis/NerdNavisAi/scripts/pm_implicit_check.sh (NerdNavis 방안 9 · 2026-04-23 PD 직접 결정) # 목적: 외부 시스템 추정 참조 차단 — "Unity 레포·git log·다른 PC" 등 # 토큰 비용: 0 (키워드 grep + 파일 mtime 체크만 수행) # # 근거: BurningTimes C30 (git 동기화 프로젝트 작업 전 최신 상태 점검 의무) · C5 정직성 # NerdNavis 실측 의무 진입점 차단 패턴 계승 # LLM 자율 준수 한계 → 외부 키워드 + 명령 이력 교차 검증 INPUT=$(cat 2>/dev/null) # Edit·Write·MultiEdit의 new_string·content 본문 추출 BODY=$(echo "$INPUT" | grep -oE '"(new_string|content)"[[:space:]]*:[[:space:]]*"[^"]*"' | head -3) [ -z "$BODY" ] && exit 0 # 외부 시스템 참조 키워드 카탈로그 (실측 의무 영역) HIT_LIST="" # 그룹 1 — Unity 레포·외부 git 레포 참조 if echo "$BODY" | grep -qE '(Unity[[:space:]]*레포|Unity[[:space:]]*프로젝트|UNITY_PROJECT_ROOT|코어[[:space:]]*프레임워크[[:space:]]*레포|BT\.Framework)'; then HIT_LIST="${HIT_LIST}Unity 레포·외부 git 레포, " fi # 그룹 2 — git 명령 결과 참조 if echo "$BODY" | grep -qE '(git[[:space:]]+log|git[[:space:]]+status|git[[:space:]]+diff|git[[:space:]]+ls-remote|원격[[:space:]]*HEAD|local[[:space:]]*==[[:space:]]*remote)'; then HIT_LIST="${HIT_LIST}git 명령 결과 참조, " fi # 그룹 3 — 다른 PC·다른 세션 상태 참조 if echo "$BODY" | grep -qE '(다른[[:space:]]*PC|다른[[:space:]]*세션|동기화[[:space:]]*완료|세션[[:space:]]*간[[:space:]]*공유)'; then HIT_LIST="${HIT_LIST}다른 PC·다른 세션 상태, " fi # 그룹 4 — 외부 시스템 상태 일반 if echo "$BODY" | grep -qE '(외부[[:space:]]*시스템|코드[[:space:]]*반영|테이블[[:space:]]*반영|설정[[:space:]]*반영)'; then HIT_LIST="${HIT_LIST}외부 시스템 반영 상태, " fi [ -z "$HIT_LIST" ] && exit 0 # 직전 N분 내 실측 명령 호출 이력 체크 # Bash 명령 이력 = $HOME/.bash_history는 신뢰 X (Claude Code Bash는 별도) # 대체: $HOME/.claude/.burningtimes_implicit_check/last_verify.log mtime 체크 VERIFY_LOG_DIR="$HOME/.claude/.burningtimes_implicit_check" mkdir -p "$VERIFY_LOG_DIR" 2>/dev/null VERIFY_LOG="$VERIFY_LOG_DIR/last_verify.log" # 직전 5분 (300초) 내 실측 흔적 부재 시 환기 WINDOW_SEC=300 NOW=$(date +%s) LAST_VERIFY=0 if [ -f "$VERIFY_LOG" ]; then # 파일 mtime을 epoch 초로 변환 (Linux·Mac·Windows MINGW 호환) LAST_VERIFY=$(stat -c %Y "$VERIFY_LOG" 2>/dev/null || stat -f %m "$VERIFY_LOG" 2>/dev/null || echo 0) fi ELAPSED=$((NOW - LAST_VERIFY)) if [ "$ELAPSED" -gt "$WINDOW_SEC" ]; then cat >&2 <