BurningTimesAi/scripts/auditor_gate.sh

89 lines
3.1 KiB
Bash
Raw Normal View History

#!/bin/bash
# PreToolUse hook — 감사 미보고 시 Edit/Write/MultiEdit/Bash(git commit·push) 차단
# C35-9 Layer 3 개정 (2026-04-20 PD님 직접 지시 — 차단 + 해제 워크플로우)
# 근본 해결: "hook은 proxy" 자인 + LLM 자율 준수 한계 차단 층 추가
# 8회차 변종 재발 방지 (proxy 회피 반사·작업 유연성 명분 기각)
INPUT=$(cat 2>/dev/null)
# 1. tool_name 추출
TOOL_NAME=$(echo "$INPUT" | grep -oE '"tool_name"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"\([^"]*\)"$/\1/')
# 2. 대상 tool 필터
SHOULD_GATE=0
case "$TOOL_NAME" in
Edit|Write|MultiEdit) SHOULD_GATE=1 ;;
Bash)
CMD=$(echo "$INPUT" | grep -oE '"command"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1)
if echo "$CMD" | grep -qE 'git[[:space:]]+(commit|push)'; then
SHOULD_GATE=1
fi
;;
esac
[ "$SHOULD_GATE" -eq 0 ] && exit 0
# 3. 의무 영역 식별 (auditor_guard 동일 로직)
TARGET=""
if echo "$INPUT" | grep -qE '"file_path"[[:space:]]*:[[:space:]]*"[^"]*(SKILL\.md|memory/org/feedback|조직공지|PD_지시_트래킹)[^"]*"'; then
TARGET="의무 영역 파일"
elif echo "$INPUT" | grep -qE '"command"[[:space:]]*:[[:space:]]*"[^"]*git[[:space:]]+(commit|push)'; then
TARGET="git commit/push"
fi
[ -z "$TARGET" ] && exit 0
# 4. M-1 수용: BYPASS 플래그 PreToolUse 차단 우회 불가
# (BYPASS는 기존 PostToolUse 경고 메커니즘 전용, 본 차단은 무조건 체크)
# 5. 활성 매니페스트 존재 확인
feat(BT·신설): 조직 신설 Phase 1 — git 저장소 교체 + 중앙 저장소 A안 분리 PD님 2026-04-21 직접 지시 5개 중 1·2·4 이행. ## 집행 내역 1. git remote: NerdNavisAi.git → BurningTimesAi.git 교체 (BT main + 본 worktree) - E:/NerdNavisAi 레포 원격은 원상 유지 (실측 확인) 2. 중앙 저장소 A안 분리: ~/.claude/burningtimes-{live,memory,audit}/ - nerdnavis-* 중앙 저장소에서 cp -r 복사 (원본 미변경) - .junction-marker 내용 BT로 갱신 3. 본 worktree .live junction 재연결 → burningtimes-live 4. audit junction 3종 신설: .burningtimes_{auditor_calls,warning_ignored,bypass_log} 5. scripts·setup 28파일 하드코딩 일괄 치환 (nerdnavis/NerdNavis/너드나비스/NERDNAVIS → burningtimes/BurningTimes/BURNINGTIMES) 6. paths.local.json.template BT 전용 재작성 (Unity·Framework 경로 __TBD__ placeholder) 7. .gitignore: .live.bak_*/ 패턴 추가 ## 보류 항목 (PD 재논의 예정) - 3. memory/org/ 내용 초기화 (PD 지시) - 5. Unity 프로젝트 경로 (PD 신규 경로 제공 전까지) - SKILL.md·CLAUDE.md 조직명 전환 및 P17·P29 처리 - 프로젝트/수상한잡화점/ 등 수상한잡화점 관련 일괄 정리 - 코어코드/NerdNavis.Framework/ → BT-프레임워크 이름 전환 - 공유/조직공지/ 너드나비스 맥락 공지 처리 - .claude/agents/*.md frontmatter skills 참조명 ## 감사 pm-auditor 사전 감사 통과 (Critical 0건, Major 2건 commit 전 정정 완료). 매니페스트: bt-org-split-phase1 (C35-9 PreToolUse 차단 해제). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 15:14:51 +00:00
MANIFEST_DIR="$HOME/.claude/burningtimes-audit/manifest/active"
mkdir -p "$MANIFEST_DIR" 2>/dev/null
ACTIVE=$(ls -t "$MANIFEST_DIR"/*.md 2>/dev/null | head -1)
if [ -z "$ACTIVE" ]; then
cat >&2 <<EOF
🔒 [C35-9 차단] $TARGET 수정 전 감사 보고 필요
해결 절차:
1. pm-auditor Task 호출 (집행 계획 사전 감사)
2. bash scripts/manifest_register.sh <plan_id> <target_files_csv> <goal>
3. 본 작업 재시도 → 차단 자동 해제
예시:
bash scripts/manifest_register.sh "2026-04-20_$(date +%H%M%S)" "scripts/x.sh,SKILL.md" "안건 X 집행"
근거: C35-9 Layer 3 차단 + 해제 워크플로우 (2026-04-20 근본 해결)
BYPASS 플래그로는 우회 불가 (M-1 수용)
EOF
exit 2
fi
# 6. 범위 체크 — Edit/Write/MultiEdit인 경우
if [ "$TOOL_NAME" != "Bash" ]; then
FILE_PATH=$(echo "$INPUT" | grep -oE '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"\([^"]*\)"$/\1/')
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
if [ -n "$REPO_ROOT" ] && [ -n "$FILE_PATH" ]; then
REL=$(realpath --relative-to="$REPO_ROOT" "$FILE_PATH" 2>/dev/null || echo "$FILE_PATH")
else
REL="$FILE_PATH"
fi
# target_files 목록에서 검색 (YAML frontmatter " - " 형태)
if ! grep -qF " - $REL" "$ACTIVE" 2>/dev/null; then
cat >&2 <<EOF
🔒 [C35-9 차단] 범위 이탈
대상 파일: $REL
활성 매니페스트: $(basename "$ACTIVE")
현 매니페스트 target_files에 미등록
해결:
- 범위 확장 필요: manifest_register.sh 재호출 (신 plan_id 또는 기존 갱신)
- 또는 해당 파일이 의도 밖이면 수정 취소
EOF
exit 2
fi
fi
# 통과
exit 0