Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
1fd665a
chore: 이슈 및 pr 템플릿 작성, 에이전트 문서 작성 (#4)
sjungwon03 Jul 6, 2026
fb6e1ea
chore: 이슈템플릿 오타 수정 및 패키지매니저 고정 (#6)
sjungwon03 Jul 6, 2026
d2e238a
refac: FSD 폴더 구조 적용 (#8)
imi21123 Jul 8, 2026
2b24055
chore: 코드래빗 설정 파일 추가 (#12)
sjungwon03 Jul 8, 2026
0590055
chore: 브랜드 로고 및 아이콘 이미지 교체 (#15)
sjungwon03 Jul 8, 2026
d2febb2
chore: Claude 에이전트 하네스 구성 및 Biome 도입 (#13)
sjungwon03 Jul 8, 2026
40e4044
chore: 프론트엔드 CI 파이프라인 추가 (#19)
sjungwon03 Jul 8, 2026
7f7329b
refac: UI 수정 및 디테일 작업 (#16) (#20)
imi21123 Jul 9, 2026
543bc5d
refac: 온보딩 프로필 입력 항목 재정리 (정책 매칭 조건 기준) (#23)
imi21123 Jul 9, 2026
a1ddf8e
feat: 커뮤니티 게시판 목록/상세, 댓글·대댓글 기능 추가 (#24)
imi21123 Jul 9, 2026
56fe5bd
refac: 정책 카드 관심 표시 및 신청 관리 UI 정리 (#26)
imi21123 Jul 9, 2026
98b6571
refac: 정책/커뮤니티 검색 로직 공통화 (#28)
imi21123 Jul 10, 2026
31c29dc
refac: 마이페이지 UI 정리 및 '가중치' 워딩 변경 (#30)
imi21123 Jul 10, 2026
085f6bb
docs: rules.md를 .claude/로 이동하고 CLAUDE.md에서 자동 로드하도록 정리 (#33)
sjungwon03 Jul 11, 2026
10a2470
feat: 정책질문·정책후기 게시글에 정책 첨부 기능 추가 (#34)
imi21123 Jul 13, 2026
f3c5833
fix: 커뮤니티 게시글 댓글 수를 실제 댓글 개수로 표시 (#36)
imi21123 Jul 13, 2026
88156ad
fix: 정책 비교 독 페이지 이동 시 재슬라이드 및 접힘 상태 추가 미반영 수정 (#38)
imi21123 Jul 13, 2026
30a551a
feat: 관리자 페이지 공통 인프라 구축 (테이블 라이브러리, 서브 라우팅, 로그 엔티티 골격) (#47)
sjungwon03 Jul 13, 2026
358bc6e
fix: 줄바꿈 정규화를 위한 .gitattributes 추가 (#53)
sjungwon03 Jul 13, 2026
f74ee9e
fix: 비로그인 상태에서 관심 버튼 클릭 시 로그인 페이지로 이동 (#51)
imi21123 Jul 13, 2026
f87dcd5
feat: 좋아요한 글·내가 작성한 글 전용 목록 페이지 추가 (#54)
imi21123 Jul 13, 2026
27653ca
feat: 관리자 로그인 로그 뷰어 페이지 (#55)
sjungwon03 Jul 14, 2026
be6a74b
feat: 관리자 애플리케이션 로그(log4j) 뷰어 페이지 (#56)
sjungwon03 Jul 14, 2026
31b8c93
feat: 관리자 사용자 관리 페이지 (Users/UserProfiles) (#57)
sjungwon03 Jul 14, 2026
79f3052
feat: 관리자 정책 관리 페이지 (Policies/Regions/PolicyRegions) (#58)
sjungwon03 Jul 14, 2026
8afddfa
feat: 관리자 정책 신청 관리 페이지 (PolicyApplications/ApplicationChecklists) (#59)
sjungwon03 Jul 14, 2026
457343d
feat: 관리자 커뮤니티 관리 페이지 (Posts/Comments/Attachments) (#60)
sjungwon03 Jul 14, 2026
f52afa5
feat: 관리자 검색 로그 / 배치 작업 로그 뷰어 (#61)
sjungwon03 Jul 14, 2026
5a558f4
feat: 공용 Pagination 컴포넌트 추가 및 주요 목록 화면 적용 (#63)
sjungwon03 Jul 14, 2026
762f358
feat: 정책 상세 모달에 필드별 상세 정보 섹션 추가 (#67)
imi21123 Jul 15, 2026
e6b46ad
fix: 소셜 로그인 버튼 공식 브랜드 가이드 준수 개선 (#68)
sjungwon03 Jul 15, 2026
8d18aac
feat: 로그인/인증 처리 및 관리자 기능 모킹 제거, 실제 API 연동 (#71)
sjungwon03 Jul 15, 2026
8434c9c
feat: 정책 비교 화면에 주관기관/신청자격/참여제한사항 비교 필드 추가 (#72)
imi21123 Jul 15, 2026
3966084
fix: 회원 탈퇴를 실제 API(DELETE /v1/users) 연동으로 교체 (#74)
sjungwon03 Jul 16, 2026
6fc741d
fix: 새로고침 시 세션 복원 refresh 요청이 StrictMode로 중복 발생해 401 (#76)
sjungwon03 Jul 16, 2026
731b703
fix: OAuth 콜백 처리 후 StrictMode 이중 실행으로 화면 전환 안 되는 문제 수정 (#81)
sjungwon03 Jul 16, 2026
ae723fc
fix: 프로필 온보딩 상태가 새로고침/재로그인 시 초기화되는 문제 수정 (#84)
sjungwon03 Jul 16, 2026
eeb9547
fix: 관리자 정책 지역 선택지를 실제 API로 연동 (#86)
sjungwon03 Jul 18, 2026
7d09a8d
feat: 신청관리 체크리스트 메모 수정 UX 개선 및 마감일 검증 연동 (#88)
canfactor Jul 20, 2026
1579698
feat: 정책 목데이터 제거 및 실제 API 연동 — 홈 목록·상세·카테고리 필터 (#82) (#91)
myh7754 Jul 20, 2026
f5e3524
feat: 정책 상세 정책별 STOMP 채팅 연동 (#95)
sjungwon03 Jul 20, 2026
6771c99
fix: 로컬 dev 서버 프록시에 ws:true 추가해 정책 채팅 재연결 반복 문제 해결 (#99)
sjungwon03 Jul 20, 2026
f579773
fix: 정책 상세 팝업 확대 및 정책 채팅을 옆 컬럼으로 재배치 (#97)
sjungwon03 Jul 20, 2026
4dbf566
feat: 게시글 작성 WYSIWYG 에디터 적용 및 이미지 업로드 연동 (#100) (#101)
sjungwon03 Jul 20, 2026
c9c50af
feat: 온보딩 프로필 제출을 실제 백엔드 API 연동으로 완성 (#104)
sjungwon03 Jul 20, 2026
a65e44b
refac: 정책 카드 지역 라벨 조립을 상세와 공통 로직으로 통일 (#103)
sjungwon03 Jul 20, 2026
70e5770
fix: 정책 목업 데이터 제거 (#108)
sjungwon03 Jul 20, 2026
2ed6b77
fix: 마이페이지 프로필 카드가 서버 데이터를 표시하도록 수정 (#109)
sjungwon03 Jul 20, 2026
ce3a74c
feat: 정책 신청관리 API 연동 (#111)
sjungwon03 Jul 20, 2026
f2eb120
fix: 관심 정책 중복 요청 방지 (#113)
sjungwon03 Jul 20, 2026
26ca124
fix: 커뮤니티 이미지 업로드 연동 (#115)
sjungwon03 Jul 20, 2026
a99e393
feat: 정책 비교 API(POST /api/v1/policy-comparisons) 프론트엔드 연동 (#90)
imi21123 Jul 21, 2026
0674cde
feat: 커뮤니티 게시글 목록 조회를 실제 API에 연결 (#118)
sjungwon03 Jul 21, 2026
659d89e
fix: 검색 연령 필터를 ageMin/ageMax로 변환해 서버 전송 (#93) — dev 재적용 (#119)
myh7754 Jul 21, 2026
732ca22
feat: 커뮤니티 검색·카테고리 필터·정렬 UI를 실제 API에 연결 (#124)
sjungwon03 Jul 21, 2026
eaef678
fix: 게시글 상세 첨부 정책 미표시 및 수정 화면 본문 미표시 수정 (#128)
sjungwon03 Jul 21, 2026
7ac27b2
refac: 신청관리(policy-tracker) 코드 가독성 리팩토링 (#134)
canfactor Jul 21, 2026
cb65f8e
fix: 정책 비교의 카테고리·지역 표시를 목록·상세와 동일한 규칙으로 통일 (#123)
imi21123 Jul 21, 2026
04776a2
fix: 카테고리 뱃지에서 참여·기반과 기타가 같은 색으로 보이던 문제 수정 (#125)
imi21123 Jul 21, 2026
71de642
fix: 프로필 수정 화면에 기존 데이터가 반영되지 않고 저장도 되지 않는 문제 수정 (#140)
sjungwon03 Jul 21, 2026
41f6360
fix: 온보딩 완료 후에도 온보딩 페이지로 잘못 리다이렉트되는 문제 수정 (#138)
sjungwon03 Jul 21, 2026
354fce2
fix: 게시글 수정 화면에서 내용이 있어도 플레이스홀더가 겹쳐 보이는 문제 수정 (#136)
sjungwon03 Jul 21, 2026
be463b4
fix: 정책 목록·검색 페이지네이션 page 이중 변환 제거 (#126) (#129)
myh7754 Jul 21, 2026
e45715d
refac: 검색 지역 필터에서 '전국' 옵션 제거 (#130) (#131)
myh7754 Jul 21, 2026
845e37a
feat: 온보딩 완료 상태에서 온보딩 페이지 직접 접근 시 홈으로 리다이렉트 (#142)
sjungwon03 Jul 21, 2026
d39fb53
fix: 신청관리 시작 시 화면표시용 마감일을 API에 그대로 보내던 문제 수정 (#144)
canfactor Jul 21, 2026
e93d9e2
fix: 정책 링크 referenceUrl2 폴백 누락 및 트래커 상세의 깨진 공고 링크 수정 (#146)
sjungwon03 Jul 22, 2026
7ff7eee
fix: 검색 지역 선택지를 DB 시드와 정합 (10 → 16개 시도) (#92) (#133)
myh7754 Jul 22, 2026
235676d
feat: 검색 생활·상태 필터를 온보딩 취업상태 어휘로 교체하고 서버 연동 (#155) (#156)
myh7754 Jul 22, 2026
9f2bec0
feat: 맞춤정책 추천을 실제 API로 연동 (#150) (#152)
imi21123 Jul 22, 2026
e5d3d90
fix: 맞춤 정책 페이지 프로필을 서버 API와 연동 (#154)
sjungwon03 Jul 22, 2026
8448054
fix: 비교함 정책이 최신 100건 join 대신 상세 조회로 표시되도록 수정 (#158)
imi21123 Jul 22, 2026
c95a8cf
docs: 리드미 새로 작성 (#160)
sjungwon03 Jul 22, 2026
6ff4516
fix: 정책 채팅 입력창 Enter 전송, Shift+Enter 줄바꿈 지원
sjungwon03 Jul 22, 2026
50ccbae
fix: 정책 채팅 입력창 Enter 전송, Shift+Enter 줄바꿈 지원 (#179)
sjungwon03 Jul 22, 2026
227b05d
fix: 홈 분야 바로가기 카드 색상·문구를 정책 카테고리와 일치시킴 (#181)
imi21123 Jul 22, 2026
bfff83a
fix: 라우터 최상위 errorElement 추가로 흰 화면 방지
sjungwon03 Jul 22, 2026
028a954
fix: 채팅 receipt 타임아웃 오탐 제거 (#185)
sjungwon03 Jul 22, 2026
5a3b16e
test: RouteErrorBoundary fallback UI·무한 새로고침 가드 테스트 추가
sjungwon03 Jul 22, 2026
26abdc3
fix: 로그아웃·세션 만료 시 TanStack Query 캐시 정리
sjungwon03 Jul 22, 2026
1aa39ba
fix: 삭제된/없는 게시글 상세 404 시 not-found 안내 분기 추가
sjungwon03 Jul 22, 2026
84517a3
fix: RichTextEditor 이미지 업로드 흐름 정리 (#194)
sjungwon03 Jul 22, 2026
26f3c05
fix: 커뮤니티 좋아요 mock 의존과 중복 요청 정리 (#189)
sjungwon03 Jul 22, 2026
5451b59
fix: 커뮤니티 글 수정 접근 상태를 보호 (#193)
sjungwon03 Jul 22, 2026
585cd42
fix: 정책 상세 모달의 가짜 추천 근거를 제거 (#199)
sjungwon03 Jul 22, 2026
9815568
fix: 4xx 쿼리 재시도를 방지 (#201)
sjungwon03 Jul 22, 2026
3b8b42e
fix: 로그아웃 시 사용자 쿼리 캐시를 초기화 (#203)
sjungwon03 Jul 22, 2026
e70fed3
fix: OAuth 콜백 오류를 안전하게 안내 (#205)
sjungwon03 Jul 22, 2026
8b36332
fix: 신청관리 화면에 실제 정책 데이터를 표시 (#207)
sjungwon03 Jul 22, 2026
2f20cc2
fix: 프로필 출생연도 기준을 현재 연도로 계산 (#209)
sjungwon03 Jul 22, 2026
86dbf68
Merge branch 'fix/182-global-error-boundary' into dev
sjungwon03 Jul 22, 2026
dc68096
Merge branch 'fix/187-logout-cache-clear' into dev
sjungwon03 Jul 22, 2026
123d5fb
Merge branch 'fix/188-post-not-found' into dev
sjungwon03 Jul 22, 2026
f71525f
Merge branch 'fix/189-community-like-guards' into dev
sjungwon03 Jul 22, 2026
650008e
Merge branch 'fix/193-edit-page-guard' into dev
sjungwon03 Jul 22, 2026
738075e
Merge branch 'fix/194-richtext-editor-cleanup' into dev
sjungwon03 Jul 22, 2026
3ec4c23
Merge branch 'fix/199-policy-detail-recommendation' into dev
sjungwon03 Jul 22, 2026
b5bf3ac
Merge branch 'fix/201-query-retry-policy' into dev
sjungwon03 Jul 22, 2026
777ad71
Merge branch 'fix/203-clear-auth-cache' into dev
sjungwon03 Jul 22, 2026
03c2322
Merge branch 'fix/205-oauth-callback-errors' into dev
sjungwon03 Jul 22, 2026
47e64b9
Merge branch 'fix/207-tracker-policy-data' into dev
sjungwon03 Jul 22, 2026
df52350
Merge branch 'fix/209-dynamic-birth-years' into dev
sjungwon03 Jul 22, 2026
c9327d7
fix: remove duplicate queryClient.clear in authStore
sjungwon03 Jul 22, 2026
333b6ab
chore: tsconfig strict 활성화 및 템플릿 잔재 정리 (#191)
sjungwon03 Jul 22, 2026
6e2d67b
fix: 인증 refresh 흐름 개선 및 세션 오류 대응 (#211) (#212)
sjungwon03 Jul 22, 2026
957f5c8
fix: 북마크/트래커 API N+1 및 동기화 최적화 (#213) (#214)
sjungwon03 Jul 22, 2026
78dbdd4
fix: 추천 API 장애 fallback 및 최근 본 정책 UI 연동 (#215) (#216)
sjungwon03 Jul 22, 2026
51c9370
fix: 프로필 설정 Zod 검증 도입 및 UI 버그 수정 (#217) (#218)
sjungwon03 Jul 22, 2026
e75a86d
fix: 커뮤니티 댓글 성능 최적화 및 글 이탈 방지 가드 (#219) (#220)
sjungwon03 Jul 22, 2026
a277f71
fix: 관리자 필터 공통화(useUrlFilters), stale 상태 표시, ConfirmDialog 접근성 개선 (#2…
sjungwon03 Jul 22, 2026
f7343c4
fix: 온보딩 미완료 사용자의 홈 맞춤 추천 스켈레톤 고정 해소 (#227)
imi21123 Jul 23, 2026
2bcd802
fix: 맞춤 추천 피드 전체 목록 페이지네이션 노출 (#229)
imi21123 Jul 23, 2026
e9cec4d
fix: 로그아웃 직후 세션 만료 토스트 중복 노출 수정 (#232)
sjungwon03 Jul 23, 2026
9f192be
feat: 게시글 상세 정책 위치 변경 및 목록 정책/요약 노출 (#233)
sjungwon03 Jul 23, 2026
815a60c
fix: 맞춤 정책 고지 문구 정정 및 메뉴 탭 명칭 변경 (#239)
imi21123 Jul 23, 2026
e8385ac
fix: 게스트의 정상 401을 세션 만료로 오인해 토스트 노출하는 문제 수정 (#237)
sjungwon03 Jul 23, 2026
32ddf47
feat: 댓글 UI를 실제 백엔드 API에 연동 (대댓글/수정 포함) (#243)
sjungwon03 Jul 24, 2026
1b8809c
chore: docker compose 전체 스택 배포용 nginx Dockerfile 및 API 리버스 프록시 추가 (#241)
sjungwon03 Jul 24, 2026
e7867e2
feat: 관리자 배치 수동 동기화 버튼을 실제 백엔드 엔드포인트에 연동 (#235)
myh7754 Jul 24, 2026
b88d759
chore: nginx에 Swagger UI/OpenAPI 문서 프록시 경로 추가 (#245)
sjungwon03 Jul 24, 2026
269e013
fix: swagger-config 프록시 누락으로 Swagger UI가 petstore로 폴백되는 문제 수정 (#247)
sjungwon03 Jul 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
22 changes: 22 additions & 0 deletions .claude/agent-memory/code-reviewer/MEMORY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# code-reviewer 메모리

code-reviewer 에이전트가 이 레포를 리뷰하며 축적하는 지속 메모. 리뷰에서 반복되는 패턴·합의된 판단·자주 놓치는 지점을 기록한다. 한 줄에 하나씩, 근거와 함께.

## 프로젝트 고정 사실

- 스택: React 19, TypeScript(strict 지향), Vite 6, Tailwind CSS 4, pnpm 11.9.0. 테스트 러너 미도입.
- 구조: Feature-Sliced Design. 의존 방향 `app → pages → widgets → features → entities → shared` (역방향 import 금지).
- 검증 명령: `corepack pnpm run lint`(= `biome check .` + `tsc --noEmit`), `corepack pnpm run build`. 포맷·lint는 Biome, 타입 검증은 `tsc`가 담당(별도 `typecheck` 스크립트도 있음).
- 디자인 토큰은 `src/index.css`의 `@theme`/`:root`에 정의. 임의 hex/radius/shadow 금지.
- 에러 처리: HTTP status가 아니라 응답 body의 `code` 기준으로 사용자 메시지를 매핑한다.

## 반복 지적 패턴

<!-- 리뷰하며 반복 발견되는 항목을 여기에 추가. 예: -->
<!-- - Presenter에서 fetch/localStorage 직접 호출 → hooks의 custom hook으로 분리 필요. (근거: rules.md) -->
<!-- - list index key 사용 → stable id로 교체. (근거: rules.md) -->

## 합의된 판단 / 예외

<!-- 팀이 합의한 예외나 관례를 여기에 기록. 예: -->
<!-- - FSD 레이어 경계·public API(index.ts) 준수 여부는 rules.md의 FSD 규칙 기준으로 판단. (근거: rules.md) -->
54 changes: 54 additions & 0 deletions .claude/agents/code-reviewer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
---
name: code-reviewer
description: 프론트엔드(React/TS/FSD) 변경사항을 리뷰 전용으로 점검한다. 코드를 수정하지 않고 발견과 권장만 보고한다. PR 전이나 변경 검토가 필요할 때 사용한다.
tools: Read, Grep, Glob, Bash
model: inherit
---

너는 이 레포 전용 프론트엔드 코드 리뷰어다. **코드를 수정하지 않는다.** 발견 사항과 권장안만 보고한다. 판단 기준은 [`AGENTS.md`](../../AGENTS.md)와 정본 상세 규칙 [`rules.md`](../rules.md)다.

## 진행 방식

1. `git diff origin/dev...HEAD`(없으면 워킹/스테이징 diff)로 변경 범위를 확인한다.
2. 변경 파일과 그 주변 맥락(같은 slice의 public API `index.ts`와 관련 세그먼트: feature는 `api/hooks/components`, entity는 `api/model/ui`)을 읽고 diff만 보고 판단하지 않는다.
3. 아래 관점으로 점검하고, 각 발견을 `파일:라인 · 무엇이 문제 · 왜 · 권장 수정`으로 남긴다.

## 리뷰 관점

**FSD 구조**
- 의존 방향 위반(하위 레이어가 상위 import)이 없는가?
- slice 내부 파일을 public API(`index.ts`) 우회해 깊게 import하지 않는가?
- 코드가 책임에 맞는 레이어에 있는가?

**Container / Presenter**
- Presenter가 API 호출·localStorage·복잡한 상태 전이를 직접 하지 않는가?
- 기능 로직이 feature의 `hooks`에 있는 `use*` custom hook으로 분리됐는가? hook 이름은 `use`로 시작하는가?

**TypeScript**
- `any`, 불필요한 `as`, `@ts-ignore`가 있는가? (`unknown` + type guard 권장)
- API DTO와 UI model이 분리되고 매퍼가 올바른 위치(공유 도메인은 `entities/*/model`, feature 전용은 feature `api` 근처)에 있는가?
- nullable 처리와 union/discriminated union 사용이 안전한가?

**React**
- 함수 컴포넌트, PascalCase, `interface {Name}Props`, list stable key(index key 금지)를 지키는가?
- `useEffect`가 외부 동기화에만 쓰이고 cleanup이 있는가? 파생값을 effect로 계산하지 않는가?
- event handler `handleX` / props `onX` 컨벤션을 지키는가?

**디자인 시스템**
- `src/index.css` 토큰을 쓰는가? 임의 hex/radius/shadow/spacing을 도입하지 않는가?
- 같은 의미의 버튼/카드 스타일을 중복 생성하지 않는가?

**상태/에러/접근성**
- loading/error/empty/fallback 상태를 처리하는가?
- API 에러를 `code` 기반으로 매핑하고 raw message/stack을 노출하지 않는가?
- semantic HTML, `button type`, `aria-label`, 포커스, `target="_blank"`의 `rel="noopener noreferrer"`를 확인했는가?

**보안**
- 시크릿 번들 노출, `dangerouslySetInnerHTML`, 저장소 민감정보가 없는가?

## 보고 형식

- 심각도 순(Blocking / High / Medium / Nit)으로 정렬한다.
- 확신이 낮은 항목은 추정임을 명시하고, 불필요한 지적으로 노이즈를 늘리지 않는다.
- 잘된 점도 한두 줄 짚는다.
- 코드를 직접 고치지 말고, 필요한 변경을 구체적으로 제안한다.
48 changes: 48 additions & 0 deletions .claude/commands/fix-issue.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
---
description: GitHub Issue 번호를 받아 이슈 우선 워크플로우로 구현한다.
argument-hint: <issue-number>
allowed-tools: Bash(gh issue *), Bash(gh pr *), Bash(git *), Bash(corepack pnpm *), Read, Edit, Write, Grep, Glob
---

# /fix-issue

이 레포의 이슈 우선 워크플로우로 이슈 하나를 끝까지 처리한다. 반드시 [`AGENTS.md`](../../AGENTS.md)와 정본 상세 규칙 [`rules.md`](../rules.md)를 먼저 따른다.

## 대상 이슈

`#$1`

## 절차

1. **이슈 파악**: `gh issue view $1`로 배경/작업 범위/검증 항목을 읽는다. 요구가 모호하면 진행 전에 질문한다.
2. **브랜치 생성**: 기본 브랜치 `dev` 최신화 후 이슈 번호 브랜치를 만든다. 타입은 작업 성격에 맞춘다.
```bash
git switch dev && git pull
git switch -c feat/$1-<short-name> # 브랜치 타입: feat|fix|docs|refac
```
3. **탐색**: 관련 slice와 FSD 레이어를 파악한다. 기존 패턴/디자인 토큰/유사 구현을 먼저 읽는다.
4. **구현**:
- FSD 의존 방향(`app → pages → widgets → features → entities → shared`)을 지킨다.
- 새/큰 변경 기능은 Container/Presenter로 분리하고 로직은 `hooks`의 `use*` custom hook에 둔다.
- API는 DTO ↔ UI model 분리 + 매퍼(공유 도메인은 `entities/*/model`, feature 전용은 feature `api` 근처). 에러는 `code` 기반 매핑.
- 디자인은 `src/index.css` 토큰과 기존 UI 패턴을 따른다. 임의 색/여백/radius 금지.
- `any`, 불필요한 `as`, `@ts-ignore` 금지.
- loading/error/empty/fallback 상태와 접근성(semantic HTML, button type, aria, 외부 링크 rel)을 처리한다.
5. **검증** (실제 실행하고 결과를 기록):
```bash
corepack pnpm run lint # biome check . && tsc --noEmit
corepack pnpm run typecheck # tsc --noEmit (타입만 별도로 볼 때)
corepack pnpm run build # vite build
```
6. **커밋**: `type: subject` 형식. 관련 없는 변경을 섞지 않는다.
7. **PR**: `.github/PULL_REQUEST_TEMPLATE.md`를 채워 연다. 변경 요약 · 실제 검증 결과 · (UI면) 스크린샷 · `Closes #$1`을 포함한다.
```bash
gh pr create --fill --base dev
```
8. **보고**: 무엇을 바꿨고, 검증 결과가 무엇이며, 남은 확인 사항이 있으면 명시한다.

## 하지 말 것

- 이슈/브랜치 없이 바로 구현하지 않는다.
- 검증을 실행하지 않고 "완료"라고 하지 않는다.
- 요청 범위를 넘는 대규모 리팩터링을 임의로 하지 않는다.
45 changes: 45 additions & 0 deletions .claude/hooks/block-secrets.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#!/usr/bin/env bash
# PreToolUse(Bash) 훅: 파괴적 삭제와 시크릿 파일 노출 명령을 차단한다.
# exit 2 => 명령 차단 후 stderr 메시지를 에이전트에 전달.
set -euo pipefail

input=$(cat)

cmd=$(printf '%s' "$input" | node -e '
let d="";
process.stdin.on("data", c => d += c);
process.stdin.on("end", () => {
try { process.stdout.write(JSON.parse(d).tool_input?.command || ""); }
catch { process.stdout.write(""); }
});
' 2>/dev/null || true)

[ -z "$cmd" ] && exit 0

block() {
echo "🚫 차단됨: $1" >&2
echo "이 명령은 안전 훅(block-secrets.sh)에 의해 막혔습니다. 의도한 작업이면 사람이 직접 실행하세요." >&2
exit 2
}

# 1) 루트/홈 대상 파괴적 삭제 (short/long 옵션 모두)
if printf '%s' "$cmd" | grep -Eq 'rm[[:space:]]+((-[a-zA-Z]+|--(recursive|force|no-preserve-root))[[:space:]]+)*(-[a-zA-Z]*[rRfF][a-zA-Z]*|--(recursive|force))[[:space:]]+(/|~|\$HOME|/\*|\.\*)([[:space:]]|$)'; then
block "루트/홈 대상 파괴적 삭제(rm -rf)"
fi

# 2) .env 등 시크릿 파일 내용 출력 (읽기 명령 또는 입력 리다이렉션)
if printf '%s' "$cmd" | grep -Eq '((cat|less|more|head|tail|xxd|od|base64|strings|grep|egrep|sed|awk|nl|tac)[[:space:]]+[^|;&]*|<[[:space:]]*)(\.env($|[^.a-zA-Z0-9])|\.env\.[a-z]+|id_rsa|id_ed25519|\.pem($|[^a-zA-Z]))'; then
block "시크릿/자격증명 파일 내용 출력 시도"
fi

# 3) .env를 git에 강제 추가
if printf '%s' "$cmd" | grep -Eq 'git[[:space:]]+add[[:space:]]+[^|;&]*(-f|--force)[^|;&]*\.env'; then
block ".env 파일 강제 git add"
fi

# 4) 원격으로 시크릿 유출 (curl/wget에 .env 첨부)
if printf '%s' "$cmd" | grep -Eq '(curl|wget)[[:space:]]+[^|;&]*\.env'; then
block ".env 파일을 원격으로 전송 시도"
fi

exit 0
37 changes: 37 additions & 0 deletions .claude/hooks/format-on-save.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/usr/bin/env bash
# PostToolUse(Edit|Write) 훅: 방금 저장한 파일을 Biome로 포맷 + 정리한다.
# Biome가 설치돼 있을 때만 동작하고, 없으면 조용히 통과한다.
set -euo pipefail

input=$(cat)

# stdin JSON에서 tool_input.file_path 추출 (node는 이 레포에 항상 존재)
file_path=$(printf '%s' "$input" | node -e '
let d="";
process.stdin.on("data", c => d += c);
process.stdin.on("end", () => {
try { process.stdout.write(JSON.parse(d).tool_input?.file_path || ""); }
catch { process.stdout.write(""); }
});
' 2>/dev/null || true)

[ -z "$file_path" ] && exit 0

# Biome가 지원하는 확장자만 (md/yaml 등은 제외)
case "$file_path" in
*.ts|*.tsx|*.js|*.jsx|*.mjs|*.cjs|*.css|*.json|*.jsonc) ;;
*) exit 0 ;;
esac

[ -f "$file_path" ] || exit 0

cd "${CLAUDE_PROJECT_DIR:-.}"

# 로컬에 설치된 Biome 바이너리가 있을 때만 실행 (없으면 no-op).
# node_modules의 바이너리를 직접 호출한다(pnpm exec의 워크스페이스 파일 생성 부작용 회피).
# check --write: 포맷 + import 정리 + 안전한 lint 자동수정. 저장 파일 하나만 대상으로 한다.
if [ -x "node_modules/.bin/biome" ]; then
node_modules/.bin/biome check --write --no-errors-on-unmatched "$file_path" >/dev/null 2>&1 || true
fi

exit 0
12 changes: 12 additions & 0 deletions .claude/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "dev",
"runtimeExecutable": "corepack",
"runtimeArgs": ["pnpm", "run", "dev"],
"port": 5173,
"autoPort": true
}
]
}
21 changes: 21 additions & 0 deletions .claude/output-styles/teaching.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
name: teaching
description: 작업을 수행하면서 왜 그렇게 했는지 짧게 설명을 덧붙이는 말투.
---

너는 이 레포에서 작업하는 코딩 에이전트다. 평소처럼 정확하게 작업하되, 프론트엔드(React/TS/FSD)를 배우는 팀원에게 설명하듯 맥락을 덧붙인다.

## 말투 규칙

- 결정을 내릴 때, **무엇을** 했는지뿐 아니라 **왜** 그 선택이 이 레포 규칙(FSD, Container/Presenter, 디자인 토큰, 에러코드 매핑 등)에 맞는지 한 줄로 짚는다.
- 새 패턴/개념(custom hook 분리, DTO↔model 매퍼, discriminated union 등)이 나오면 2~3문장으로 짧게 설명한다.
- 트레이드오프가 있으면 대안과 선택 이유를 간단히 밝힌다.
- 설명은 **간결하게**. 장황한 강의가 아니라 코드 옆의 주석 같은 밀도로 유지한다.
- 코드/명령/검증 결과 등 실질 작업은 절대 생략하지 않는다. 설명은 작업을 대체하지 않고 보완한다.
- 한국어로 설명한다. 코드/식별자/명령은 원문 그대로 둔다.

## 하지 말 것

- 이미 아는 기본 개념을 매번 장황하게 반복하지 않는다.
- 설명하느라 실제 구현·검증을 미루지 않는다.
- 추측을 사실처럼 설명하지 않는다. 불확실하면 불확실하다고 말한다.
Loading
Loading