diff --git a/.claude/hooks/auto-annotate-reminder.sh b/.claude/hooks/auto-annotate-reminder.sh new file mode 100755 index 0000000..2a4adbb --- /dev/null +++ b/.claude/hooks/auto-annotate-reminder.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# UserPromptSubmit hook — 코드 이해/동작 질문 시 답변 후 해당 코드에 주석/KDoc 을 +# 자동 보강하도록 매 프롬프트에 reminder 를 additionalContext 로 주입한다. +# (이전엔 user-memory feedback_auto_annotate_on_question.md 에 있던 동작을 훅으로 일원화) +cat > /dev/null 2>&1 # stdin(prompt JSON) 소비 (SIGPIPE 방지) +cat <<'JSON' +{"hookSpecificOutput":{"hookEventName":"UserPromptSubmit","additionalContext":"[자동 주석 규칙] 이번 사용자 입력이 코드의 이해·동작·이유를 묻는 질문이라면, 채팅 답변만으로 끝내지 말고 답변 직후 질문 대상이 된 코드 파일에 질문 내용을 반영한 주석/KDoc 을 보강하라. 단순 작업 지시나 코드 수정 요청에는 적용하지 않는다."}} +JSON diff --git a/.claude/hooks/source-authority-reminder.sh b/.claude/hooks/source-authority-reminder.sh new file mode 100755 index 0000000..3f5f769 --- /dev/null +++ b/.claude/hooks/source-authority-reminder.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +# UserPromptSubmit hook — 버전/라이브러리/빌드툴체인/디자인 등 "공식 문서 권위"가 +# 필요한 질문·작업을 키워드로 감지하면, 역할별 권위 소스 분기 규칙(A~F + Compose↔Kotlin 횡단)을 +# additionalContext 로 주입한다. (상시 로드 대신 관련 프롬프트에서만 주입해 컨텍스트 절약) +input="$(cat)" +text="$(printf '%s' "$input" | jq -r '.prompt // empty' 2>/dev/null)" +[ -z "$text" ] && exit 0 + +# 버전/의존성/빌드툴체인/디자인 관련 키워드 (대소문자 무시) +if ! printf '%s' "$text" | grep -qiE '버전|version|라이브러리|library|의존성|depend|업그레이드|upgrade|마이그레이션|migrat|AGP|gradle|kotlin|compose|material|androidx|maven|좌표|핀|호환|compatib|릴리스|release|stable|KSP|hilt|retrofit|okhttp|coil|compilesdk|targetsdk|minsdk|jdk|libs\.versions|build\.gradle'; then + exit 0 +fi + +RULES="$(cat <<'RULESEOF' +[작업 원칙 — 역할별 공식 문서 권위 소스] +소스는 평면적 우선순위가 아니라 역할로 구분 — "무엇을 찾느냐"로 분기해 질문 유형에 맞는 권위 소스를 쓸 것. 핵심 문서는 WebFetch 로 원문 확인하고, 답변·커밋 메시지에 출처 URL 을 명시한다. + +A. 라이브러리(AndroidX): 사용법·API·버전 + 1. 사용법·API·동작·마이그레이션 → developer.android.com (Architecture Guide, Library 문서, release notes). 단 release notes 상단 요약 박스(Latest/Stable/RC/Beta/Alpha)는 stable 승격을 늦게 반영하므로 "최신 버전 숫자"의 근거로는 쓰지 말 것. + 2. 최신 Stable 좌표(버전 권위) → Google Maven. 브라우징 maven.google.com, 좌표 확정은 아티팩트별 메타데이터 dl.google.com/dl/android/maven2///maven-metadata.xml. 핀 박기 전 stable 존재 여부는 여기서 확정. + - 보조: AndroidX Atom 피드 developer.android.com/feeds/androidx-release-notes.xml (라이브러리 전용 — AGP/Gradle 은 여기 안 뜸 → C). fallback 미러(캐시·지연 주의): androidx.tech 또는 mvnrepository.com (1차 실패 시에만). + 3. API 시그니처·소스·커밋 → android.googlesource.com / AndroidX GitHub. 버전 체크용 아님. + +B. 언어(Kotlin) → kotlinlang.org. 문법·표준 라이브러리·coroutines/Flow 1차(developer.android.com 아님). 버전 좌표는 kotlinlang.org/docs 또는 GitHub JetBrains/kotlin releases. + +C. 빌드 툴체인(AGP/Gradle/Studio/JDK/Build Tools/API level) → developer.android.com/build/releases. AGP 좌표는 dl.google.com/.../com/android/tools/build/gradle/maven-metadata.xml. 핵심인 AGP↔Gradle↔Studio↔JDK↔compileSdk 호환 행렬은 .../build/releases/about-agp + 버전별 release notes 가 권위. Gradle 쪽 행렬은 docs.gradle.org/current/userguide/compatibility.html. + +D. 디자인(Material 3) → m3.material.io. 가이드라인·토큰·컴포넌트 권위. I/O 2026부터 Material Android = Compose-first, MDC-Android(Views)는 유지보수 모드 → 새 작업은 Compose Material3 기준. + +E. 알려진 버그 → issuetracker.google.com (공개 Google Issue Tracker). 핀 박은 버전 오동작 시 "알려진 버그냐/픽스 예정이냐"는 release notes 아니라 여기. + +F. (선택) 정준 패턴·샘플 → github.com/android (nowinandroid, architecture-samples, compose-samples). + +횡단 — Compose↔Kotlin: Kotlin 2.0+ 는 Compose 컴파일러 버전 = Kotlin 버전. Compose Compiler Gradle plugin(org.jetbrains.kotlin.plugin.compose, version = Kotlin 버전)으로 적용. "Compose to Kotlin Compatibility Map"은 1.9 이하 전용 legacy — 2.0+ 에선 kotlinCompilerExtensionVersion 따로 핀 박지 말 것. +RULESEOF +)" + +jq -n --arg ctx "$RULES" '{hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:$ctx}}' diff --git a/.claude/settings.local.json b/.claude/settings.local.json index bd74a2d..f23e3d2 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -64,6 +64,22 @@ } ] } + ], + "UserPromptSubmit": [ + { + "hooks": [ + { + "type": "command", + "command": "bash \"$CLAUDE_PROJECT_DIR/.claude/hooks/auto-annotate-reminder.sh\"", + "timeout": 5 + }, + { + "type": "command", + "command": "bash \"$CLAUDE_PROJECT_DIR/.claude/hooks/source-authority-reminder.sh\"", + "timeout": 5 + } + ] + } ] } } diff --git a/.gitignore b/.gitignore index b172cc1..ced3c56 100644 --- a/.gitignore +++ b/.gitignore @@ -239,9 +239,7 @@ XmlUnusedNamespaceDeclaration.xml !inspection/ !inspection/*.xml -### Claude Code (개인 운영 환경) ### -# 루트 CLAUDE.md 는 개인 컨벤션 파일 — git 추적 안 함. 복원 백업: .claude/backup/CLAUDE.md -/CLAUDE.md - -# Claude Code 런타임 부산물 (추적 금지) +### Claude Code (단독 프로젝트 — 추적함) ### +# CLAUDE.md·.claude 설정/훅은 git 으로 추적한다(백업 메커니즘 폐기). +# 런타임 부산물(lock)만 제외. .claude/scheduled_tasks.lock diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..0933e18 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,11 @@ +# Android Project Conventions + +## Project Context +- 핵심 도메인: **음식 조합·레시피 공유 앱** — 사용자가 카테고리(하이디라오·서브웨이·편의점)별로 재료·사진·해시태그를 담은 '조합'을 등록·탐색·검색하고 좋아요·랭킹으로 큐레이션. 인증·온보딩·프로필 포함. Mock/실 데이터는 `demo`/`prod` product flavor 로 분기(demo=Fake 로컬 데이터, prod=실 서버 API), `BuildConfig.BASE_URL` 로 엔드포인트 주입. + +