# CLAUDE.md

이 파일은 AI 코딩 에이전트가 bibimbap 프로젝트에서 작업할 때 따를 프로젝트 지침이다.

## 프로젝트 개요

- Java 21, Spring Boot, JSP, MyBatis 기반 WAR 애플리케이션이다.
- 화면은 `/WEB-INF/views/*.jsp`를 사용한다.
- DB 접근은 annotation 기반 MyBatis mapper를 사용한다.
- 업로드된 프로필 이미지는 `/profile/**`, 게임 WebGL asset은 `/game/{gameUuid}/**`로 제공된다.
- 정적 CSS/JS 파일은 `src/main/webapp/css/`, `src/main/webapp/js/`에 두면 Tomcat DefaultServlet이 직접 서빙한다. `src/main/resources/static/`은 WAR에서 불필요하다.

## 작업 원칙

- 사용자 변경을 보호한다. 작업 전후로 `git status --short`를 확인한다.
- 비-메인스트림 브랜치(메인스트림 = `main`/`master` 및 보호 브랜치, 그 외 `feat/*`·`fix/*`·`chore/*`·`docs/*` 등 작업 브랜치)에서는 커밋이 표준 승인된다. 작업 단위가 끝날 때마다 사용자에게 매번 묻지 않고 커밋하며, 메시지 규약·커밋 단위·트레일러는 `docs/development/git-workflow.md`를 따른다. `push`는 브랜치와 무관하게 사용자 명시 요청 시에만 수행한다.
- 메인스트림 브랜치에서는 커밋 표준 승인이 적용되지 않는다. 기본 브랜치(`main`) 위라면 먼저 작업 브랜치를 생성한 뒤 작업한다.
- 검색은 우선 `rg`를 사용한다.
- 문서-only 분석 요청에서는 `src/`와 `pom.xml`을 수정하지 않는다.
- 보안 발견 사항은 `docs/analysis/`에 `file:line` 근거와 함께 기록한다.
- 보안 개선 작업은 `docs/security/security-remediation-checklist.md`의 완료 조건을 기준으로 분리한다.
- 방법 선택 시 빠름보다 확실성을 우선한다. 검증되지 않은 지름길은 피한다.

## 보안 원칙

- 상태 변경 요청은 CSRF 검증을 적용한다.
- MyBatis SQL은 `#{}` 바인딩을 사용하고 `${}` 동적 치환을 피한다.
- 업로드 파일은 크기, 타입, normalize된 저장 경로 boundary를 모두 검증한다.
- JSP 출력은 `HtmlUtils.htmlEscape` 또는 JSTL escape를 사용한다.
- 클라이언트 렌더링은 가능한 `textContent`를 사용한다.
- 세션 관련 변경은 세션 고정 방어와 쿠키 하드닝을 함께 확인한다.

## 문서 위치

- 문서 인덱스: `docs/index.md`
- 최신 프로젝트 분석: `docs/analysis/2026-06-16-project-analysis.md`
- 보안 개선 체크리스트: `docs/security/security-remediation-checklist.md`

<!-- atp:begin -->
## 문서화 정책 (docs-first)
작업 시작 전 `docs/index.md` → 카테고리 `index.md` → 구체 문서 순으로 읽는다.
## 에이전트 팀 운영
`/atp:task [요청]` 으로 Orchestrator+Advisor+Worker 팀 모드 진입(명시 호출 전용).
위임 토폴로지는 호스트 capability 자가판정(Tier A/A-flat/B)을 따른다 — 번들 `docs/development/platform-adapters.md`.
권위 레퍼런스: atp 플러그인 번들 `docs/development/agent-team-protocol.md`.
<!-- atp:end -->
