# 아누 가이드 시스템 구축: 즉시조치 + Phase 0

## 참조 문서 (반드시 읽을 것)
- 계획서: /home/jay/workspace/memory/plans/anu-guide-system/plan.md
- 맥락노트: /home/jay/workspace/memory/plans/anu-guide-system/context-notes.md
- 체크리스트: /home/jay/workspace/memory/plans/anu-guide-system/checklist.md

## Part 1: 즉시조치 — 보안

### A. dispatch.py BOT_KEYS 하드코딩 폴백 제거
파일: /home/jay/workspace/dispatch.py (34-39행)
현재:
  BOT_KEYS = {
    'anu': os.environ.get('COKACDIR_KEY_ANU', 'c119085addb0f8b7'),
    ...
  }
변경: 환경변수 없으면 None 반환. None이면 에러 메시지 + sys.exit(1).
  BOT_KEYS = {
    'anu': os.environ.get('COKACDIR_KEY_ANU'),
    ...
  }
그리고 dispatch() 함수에서 key가 None이면 명확한 에러 메시지 출력.
추가: .bashrc 또는 별도 env 파일에서 환경변수 로드하도록 /home/jay/workspace/.env.keys 파일 생성 (키 값은 기존 하드코딩 값 사용).

### B. 핵심 파일 권한 640 강화
다음 파일들: chmod 640
- /home/jay/workspace/dispatch.py
- /home/jay/workspace/memory/task-timer.py
- /home/jay/.cokacdir/bot_settings.json
- /home/jay/workspace/memory/organization-structure.json
- /home/jay/workspace/.env.keys (새로 만든 파일)

## Part 2: Phase 0 — hooks 인프라

### Claude Code hooks 스펙 요약 (리서치 완료)
- settings.json의 hooks 키로 등록
- 이벤트: UserPromptSubmit, PostToolUse, PreToolUse, Stop, SessionStart 등
- UserPromptSubmit: 매처 없음(항상 발동). stdout 텍스트가 Claude 컨텍스트에 추가됨.
- PostToolUse: 매처 = 도구 이름 (Edit|Write 등). stdin으로 JSON 수신 (tool_name, tool_input.file_path 등).
- 입력: stdin JSON (session_id, cwd, hook_event_name, tool_name, tool_input)
- 출력: exit 0 = 진행, exit 2 = 차단. stdout 텍스트는 컨텍스트 주입.
- jq로 JSON 파싱 가능.

### A. ~/.claude/hooks/ 디렉토리 생성
mkdir -p /home/jay/.claude/hooks/lib/

### B. ~/.claude/settings.json 수정
기존 mcpServers 유지하면서 hooks 키 추가:
{
  "hooks": {
    "UserPromptSubmit": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "bash /home/jay/.claude/hooks/user-prompt-submit.sh"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit|Write|NotebookEdit",
        "hooks": [
          {
            "type": "command",
            "command": "bash /home/jay/.claude/hooks/post-tool-use.sh"
          }
        ]
      }
    ]
  },
  "mcpServers": { ... 기존 유지 ... }
}

### C. hooks/user-prompt-submit.sh
기능: 사용자 프롬프트가 개발 관련인지 판별 → 맞으면 아누 가이드 핵심 규칙을 stdout으로 출력 (컨텍스트 주입)
구현:
1. stdin에서 JSON 읽기 (jq로 .prompt 추출 — 참고: UserPromptSubmit은 prompt 필드가 있음)
2. 봇 식별: detect-bot.sh 호출하여 BOT_ID 결정
3. 아누 봇(autoset cwd)이면: 아누 가이드 핵심 규칙 주입 (직접 코딩 금지, 위임 원칙)
4. 개발팀 봇(teams/ cwd)이면: 보고서 작성 규칙 + task-timer 기록 규칙 주입
5. 일상 대화(인사 등)면: 아무것도 출력하지 않음 (exit 0만)
주의: 훅은 가볍게\! 복잡한 로직 금지. 단순 문자열 매칭.

### D. hooks/post-tool-use.sh
기능: 파일 변경 시 Audit Trail JSONL 로그 기록
구현:
1. stdin에서 JSON 읽기 (jq로 .tool_name, .tool_input.file_path, .cwd 추출)
2. detect-bot.sh 호출하여 BOT_ID 결정
3. 로그 디렉토리 확인: mkdir -p /home/jay/workspace/memory/logs/
4. JSONL append: /home/jay/workspace/memory/logs/audit-trail.jsonl
   형식: {"ts":"...","bot":"...","tool":"...","file":"...","cwd":"..."}
5. exit 0 (절대 차단하지 않음)
주의: jq 없으면 grep/sed 폴백. 실패해도 exit 0 (작업 블로킹 금지).

### E. hooks/lib/detect-bot.sh
기능: cwd 기반 봇 식별
구현:
  CWD=$(pwd)
  case "$CWD" in
    */autoset*|*/.cokacdir/workspace/autoset*) BOT_ID="anu" ;;
    */teams/dev1*) BOT_ID="dev1" ;;
    */teams/dev2*) BOT_ID="dev2" ;;
    */teams/dev3*) BOT_ID="dev3" ;;
    *) BOT_ID="unknown" ;;
  esac
  export BOT_ID

### F. /tmp/ 로그 이전
mkdir -p /home/jay/workspace/memory/logs/servers/
현재 /tmp/에 서버 로그가 있으면 복사. 없으면 디렉토리만 생성.

### G. 테스트
1. echo 테스트: echo '{"prompt":"대시보드 만들어줘"}' | bash /home/jay/.claude/hooks/user-prompt-submit.sh → 규칙 텍스트 출력 확인
2. echo 테스트: echo '{"tool_name":"Edit","tool_input":{"file_path":"/tmp/test.py"},"cwd":"/home/jay/workspace"}' | bash /home/jay/.claude/hooks/post-tool-use.sh → audit-trail.jsonl에 기록 확인
3. cat /home/jay/workspace/memory/logs/audit-trail.jsonl → JSON 형식 확인
4. jq가 없으면 sudo apt-get install -y jq
5. chmod 640 확인: stat -c %a 로 검증

## 보고서
작업 완료 후 /home/jay/workspace/memory/reports/ 에 보고서 저장.
검증 기준: 
- grep -r 하드코딩된 키 → 없음
- stat -c %a → 640
- hooks 테스트 통과
- audit-trail.jsonl 생성 확인