Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
470 changes: 100 additions & 370 deletions .claude/CLAUDE.md

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions .claude/backup/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# Android Project Conventions

## Project Context
- 모듈 구조: **단일 `:app` 모듈**. Clean Architecture 를 패키지로 구성 — `data` / `domain` / `presentation` (+ `di`, `core`, `ui/theme`). 멀티모듈·`build-logic` 컨벤션 플러그인 없음.
- 모듈 구조: **멀티모듈** — `:app` + `:core:*`(model·designsystem·datastore·network·domain·data) + `:feature:*`(auth·home·combination·onboarding·profile) + `build-logic` 컨벤션 플러그인. Clean Architecture + MVVM.
- 패키지: `com.example.hackathon`.
- minSdk / targetSdk / compileSdk: 모두 **36** (JVM 17). 정의 위치: `app/build.gradle.kts`.
- 빌드 툴체인: AGP 8.13.2 + Kotlin 2.0.21 + KSP, Compose BOM 2024.09.00. Version Catalog(`gradle/libs.versions.toml`) 강제.
- 정적 분석: **Detekt** (`config/detekt.yml`, baseline `config/detekt-baseline.xml`). ktlint 아님.
- 핵심 도메인: 해커톤용 Android 앱. 서버 연동 전까지 `BuildConfig.USE_MOCK_API` 로 Mock/실 API 토글, `BuildConfig.BASE_URL` 로 엔드포인트 주입.
- 빌드 툴체인: AGP 9.2.1 + Kotlin 2.3.21 + KSP 2.3.9, Compose BOM 2026.05.01. Version Catalog(`gradle/libs.versions.toml`) 강제.
- 정적 분석: **ktlint** — CI `.github/workflows/lint.yml` 의 ScaCap/action-ktlint 1.8.0, `.editorconfig` 의 `ktlint_code_style=android_studio` (call-site trailing comma 미사용). + Android Lint(`./gradlew lintDebug`). (`config/detekt*` 은 미사용 잔재 — `detekt` Gradle 태스크 없음.)
- 핵심 도메인: **음식 조합·레시피 공유 앱** — 사용자가 카테고리(하이디라오·서브웨이·편의점)별로 재료·사진·해시태그를 담은 '조합'을 등록·탐색·검색하고 좋아요·랭킹으로 큐레이션. 인증·온보딩·프로필 포함. 서버 연동 전까지 `BuildConfig.USE_MOCK_API` 로 Mock/실 API 토글, `BuildConfig.BASE_URL` 로 엔드포인트 주입.

## 작업 시작/마무리 규약 (위반 금지)
- **이슈 우선 + 브랜치 링크**: 새 브랜치는 메타데이터 완비된 GitHub 이슈에 정식 링크된 상태여야 한다. 절차 자동화는 `android-issue-branch` skill 에 위임 — 사용자가 "브랜치 파"라고만 해도 skill 진입 후 이슈부터 작성. `git checkout -b` 직행은 `git-branch-guard.sh` 가 차단.
Expand Down Expand Up @@ -90,7 +90,7 @@
```bash
./gradlew assembleDebug
./gradlew testDebugUnitTest # 또는 ./gradlew :app:testDebugUnitTest
./gradlew detekt # 정적 분석 (Detekt)
./gradlew lintDebug # Android Lint (CI lint.yml). ktlint 은 CI(ScaCap/action-ktlint)로 실행 — 로컬 Gradle 태스크 없음
./gradlew :app:connectedDebugAndroidTest # 인스트루멘티드 테스트
```

Expand Down
26 changes: 6 additions & 20 deletions .claude/hooks/git-state-guard.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@
# PreToolUse Bash hook: block dangerous git state changes without explicit user instruction.
#
# 차단 대상:
# - git push (모든 형태) — force push 포함
# - git push --force (force push 만)
# - git reset --hard
# - git rebase
# - git branch -D
# - git clean -f
# - git checkout -- <file> (작업 파일 폐기)
# - git restore <file> (작업 파일 폐기)
#
# 자율 허용 (사용자 지시 2026-06-01): git branch -D / -d, git checkout <branch> 는
# Claude 가 명시 지시 없이 수행 가능. 브랜치 삭제·전환은 손실 위험 낮고 머지된 브랜치 정리에 필요.
set -uo pipefail

input="$(cat)"
Expand All @@ -22,7 +24,6 @@ deny() {
}

# git push — force push 만 차단. 일반 push 와 --delete 는 통과.
# /create-pr 같은 명시 워크플로우에서 일반 push 는 안전한 작업 (기존 commit 추가만, 손실 없음).
# Force push (-f, --force, --force-with-lease, +refspec) 는 commit 손실 위험 → 차단 유지.
if [[ "$cmd" =~ (^|[[:space:]]|\;|\&|\|)git[[:space:]]+push([[:space:]]|$) ]]; then
if [[ "$cmd" =~ git[[:space:]]+push[[:space:]].*(-f([[:space:]]|$)|--force([[:space:]]|=|$)|--force-with-lease) ]] \
Expand All @@ -41,29 +42,14 @@ if [[ "$cmd" =~ (^|[[:space:]]|\;|\&|\|)git[[:space:]]+rebase([[:space:]]|$) ]];
deny "git rebase"
fi

# git branch -D (force delete)
# 예외: 단일 feat/<숫자> 브랜치 + 머지된 PR (head 매칭) 1건 이상이면 통과.
# memory feedback_cleanup_merged_branches.md — PR 머지 확인 시점 자동 삭제 영구 허가.
# 모호 케이스 (multi-branch, 옵션 섞임, PR 없음/OPEN/CLOSED, head 매칭 안 됨) 는 deny 유지.
if [[ "$cmd" =~ git[[:space:]]+branch[[:space:]]+-D([[:space:]]|$) ]]; then
args="${cmd#*git branch -D}"
read -ra tokens <<< "$args"
if [[ ${#tokens[@]} -eq 1 && "${tokens[0]}" =~ ^feat/[0-9]+$ ]]; then
branch="${tokens[0]}"
if merged=$(gh pr list --head "$branch" --state merged --json number --jq 'length' 2>/dev/null) \
&& [[ "$merged" -gt 0 ]]; then
exit 0
fi
fi
deny "git branch -D"
fi
# git branch -D / -d (브랜치 삭제) — 사용자 지시로 자율 허용 (2026-06-01). 차단하지 않음.

# git clean -f / -fd / -ffd 등
if [[ "$cmd" =~ git[[:space:]]+clean[[:space:]].*-[a-zA-Z]*f ]]; then
deny "git clean -f"
fi

# git checkout -- <file> (작업 파일 폐기)
# git checkout -- <file> (작업 파일 폐기). 브랜치 전환(git checkout <branch>)은 허용.
if [[ "$cmd" =~ git[[:space:]]+checkout[[:space:]]+-- ]]; then
deny "git checkout --"
fi
Expand Down
Loading
Loading