fix: dev → main 프로덕션 배포 동기화 (#166) - #167
Conversation
* chore: initialize project folder structure - Add base directory layout for Next.js + domain-driven architecture - Add .gitkeep to track empty directories in git - Exclude MVP out-of-scope domains (shop, points, user-items) - No implementation files included, structure only Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Update README.md --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add project overview and MVP scope definition - Add fixed product rules (categories, AI chat policy, judgement output) - Add architecture, domain scope, and state transition rules - Add auth/security, DB, frontend state, API, logging rules - Add Git workflow, Claude work process, STOP conditions - Add approval-required list and required reference documents Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add package.json with Next.js 15, React 19, TypeScript stack - Add next.config.ts (minimal Next.js 15 config) - Add tsconfig.json (strict mode, @/* path alias) - Add eslint.config.mjs (next/core-web-vitals + next/typescript) - Add .prettierrc and .prettierignore - Add .gitignore (node_modules, .next, .env.local, etc.) - Add .env.example (key names only, no real values) - Add prisma/schema.prisma (generator + datasource only) - Add data/mock/db.json (health check stub for json-server) - Add docs/TECH_STACK.md (package list and selection rationale) - Update README.md with run commands and env guide Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add PROJECT_DECISIONS.md (MVP scope, architecture, security principles) - Add guides/CLAUDE_WORKFLOW.md (work process, STOP conditions, approval rules) - Add guides/GIT_WORKFLOW.md (branch naming, commit convention, workflow) - Add guides/PR_RULES.md (PR target, title rules, review criteria) - Add guides/ENV_GUIDE.md (Vercel env pull, .env.example management) - Add guides/CODING_CONVENTION.md (naming, state management, folder rules) - Add db/STATUS_TRANSITION.md (room_mode, dispute_status transitions) - Add db/PRISMA_MAPPING.md (snake_case/camelCase mapping rules) - Add db/MASTER_DATA.md (categories, result types, DB master principles) - Add domains/README.md (domain list, MVP scope, writing guidelines) - Add domains/_DOMAIN_TEMPLATE.md (template for domain docs) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add AUTH.md (kakao login, terms, session management) - Add COMMON.md (error handling, logging, common response) - Add ROOM.md (AI chat room, invite link, room_mode transitions) - Add PERSONAL_ANALYSIS.md (AI-based personal conflict analysis) - Add DISPUTE.md (1:1 mediation, roles, statements, dispute_status) - Add JUDGEMENT.md (AI judgement, Gemini API, result card) - Add GIFT.md (gift recommendation after judgement) - Add USER.md (mypage, profile, bottom tab) - Add CALENDAR.md (date-based record marking, monthly summary) - Add DIARY.md (emotion diary, author-only access, content protection) - Add STATISTICS.md (anonymous aggregation, summary components) - Add SHOP_FUTURE.md (v2.0 planned, MVP excluded) - Add POINTS_FUTURE.md (v2.0 planned, MVP excluded) - Add USER_ITEMS_FUTURE.md (v2.0 planned, MVP excluded) All documents are draft templates with TODO markers for assignees. No implementation, no API routes, no schema changes. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add src/app/layout.tsx (root layout with metadata and globals.scss import) - Add src/app/page.tsx (minimal root page for build verification) - Add src/app/globals.scss (imports src/styles/main.scss) - Add src/app/error.tsx (minimal error boundary with reset) - Add src/app/not-found.tsx (minimal 404 page) - Add src/app/loading.tsx (minimal loading page) - Add src/styles/main.scss (ordered SCSS entry point) - Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens) - Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints) - Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset) - Add src/styles/base/_global.scss (body font, background, color defaults) - Add src/styles/layout/_page.scss (placeholder for page layout) Verified: type-check, lint, build all pass Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: add Next.js App Router entry files and SCSS base structure - Add src/app/layout.tsx (root layout with metadata and globals.scss import) - Add src/app/page.tsx (minimal root page for build verification) - Add src/app/globals.scss (imports src/styles/main.scss) - Add src/app/error.tsx (minimal error boundary with reset) - Add src/app/not-found.tsx (minimal 404 page) - Add src/app/loading.tsx (minimal loading page) - Add src/styles/main.scss (ordered SCSS entry point) - Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens) - Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints) - Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset) - Add src/styles/base/_global.scss (body font, background, color defaults) - Add src/styles/layout/_page.scss (placeholder for page layout) Verified: type-check, lint, build all pass Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: resolve ESLint and TypeScript config warnings - eslint.config.mjs: ignore next-env.d.ts and .next/** (auto-generated by Next.js, triple-slash reference false positive) - tsconfig.json: remove deprecated baseUrl option (TypeScript 5.x+, paths works without baseUrl) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
달력 UI 라이브러리로 MUI X Date Pickers + Day.js 사용을 확정하고 관련 문서(TECH_STACK, PROJECT_DECISIONS, CODING_CONVENTION, CALENDAR, DIARY, CLAUDE.md)에 반영한다.
달력 UI 구현을 위해 MUI X Date Pickers 및 필수 peer dependency를 설치한다. @mui/material@9.1.1, @emotion/react@11.14.0, @emotion/styled@11.14.1, @mui/x-date-pickers@9.5.0, dayjs@1.11.21
* infra: add Next.js App Router entry files and SCSS base structure - Add src/app/layout.tsx (root layout with metadata and globals.scss import) - Add src/app/page.tsx (minimal root page for build verification) - Add src/app/globals.scss (imports src/styles/main.scss) - Add src/app/error.tsx (minimal error boundary with reset) - Add src/app/not-found.tsx (minimal 404 page) - Add src/app/loading.tsx (minimal loading page) - Add src/styles/main.scss (ordered SCSS entry point) - Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens) - Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints) - Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset) - Add src/styles/base/_global.scss (body font, background, color defaults) - Add src/styles/layout/_page.scss (placeholder for page layout) Verified: type-check, lint, build all pass Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: resolve ESLint and TypeScript config warnings - eslint.config.mjs: ignore next-env.d.ts and .next/** (auto-generated by Next.js, triple-slash reference false positive) - tsconfig.json: remove deprecated baseUrl option (TypeScript 5.x+, paths works without baseUrl) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- datasource: add directUrl for Supabase connection pooler support - enums: CategoryGroup, RoomMode, DisputeStatus, ParticipantRole, etc. - NextAuth models: User (with TALKY-OWL fields), Account, Session, VerificationToken - core models: DisputeRoom, RoomAiConversation, RoomAiMessage - dispute models: Dispute, DisputeParticipant, DisputeStatement - judgment models: AiJudgment, JudgmentResultCard - gift models: GiftRecommendation, GiftRecommendationItem - feature models: EmotionDiary, CalendarRecord - master data: ConflictTypeGroup, ConflictTypeDetail (DB-based, no enum hardcoding) - log models: AuditLog, ApiErrorLog, ModerationLog, RoomAccessLog, UserDeletionLog - .env.example: add DIRECT_URL for Supabase directUrl - v2.0 TODO: ShopItem, PointTransaction, UserItem, DisputeStatistic excluded Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
folders added:
- src/components/{personal-analysis,room,dispute,judgement,calendar,diary,statistics,gift}
- src/app/api/auth/[...nextauth]
- src/app/api/v1/{users,personal-analyses,rooms,disputes,statements,calendar,diary,statistics,cron}
files added:
- prisma/seed.ts (placeholder for ConflictTypeGroup master data)
docs updated (minimal):
- docs/domains/COMMON.md: add log table list, judgement_logs TODO note
- docs/domains/JUDGEMENT.md: clarify Storage is MVP-excluded scaffolding
- docs/guides/ENV_GUIDE.md: clarify Supabase Storage vars are MVP-excluded
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…e group (#23) src/app/page/ (괄호 없음)는 /page/* URL segment를 생성하므로, Next.js App Router route group 문법인 src/app/(page)/로 변경한다. URL은 /landing, /home 등으로 노출되어야 하며 /page/... 가 아니다. 관련 문서 내 경로 참조도 모두 업데이트 (CLAUDE.md, docs/domains/*, docs/guides/*). Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(styles): 디자인 토큰 및 전역 스타일 설정 - _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가 - _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m) - _global.scss body 폰트 Pretendard 적용 - next/font/local로 PretendardVariable 폰트 로드 (layout.tsx) - GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 컨테이너 max-width 1000px 설정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 개발 확인용 임시 border 색상 회색으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: container min-height 100vh 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(styles): 디자인 토큰 및 전역 스타일 설정 - _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가 - _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m) - _global.scss body 폰트 Pretendard 적용 - next/font/local로 PretendardVariable 폰트 로드 (layout.tsx) - GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 컨테이너 max-width 1000px 설정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 개발 확인용 임시 border 색상 회색으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: container min-height 100vh 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: rem 스케일 토큰 추가 및 타이포그래피 변수 rem 참조로 전환 - Rem scale 섹션 추가 (0.25rem ~ 30rem) - 폰트 토큰에서 누락된 0.875rem(14px), 1.125rem(18px) 추가 - font-size, line-height 변수를 rem 스케일 변수 참조로 전환 - rem 스케일을 typography 섹션보다 상단으로 이동 (선언 순서) - 컴포넌트 width/height 대응을 위해 큰 단위(9rem~30rem) 포함 Co-Authored-By: Claude <noreply@anthropic.com> * style: r() 함수 분리 및 타이포그래피 변수 함수 기반으로 전환 - _functions.scss 신규 추가 — px → rem 변환 함수 r() 단독 관리 - _variables.scss에서 rem 스케일 변수 제거, fn.r() 참조로 전환 - _mixins.scss에 functions @use 추가 - 순환 참조 없이 variables → functions → (없음) 단방향 의존성 구성 Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): add Button, Toast, Header, BottomNavigation components - Button: primary / outline / disabled variants, design token 기반 - Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용 - Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering - BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘 - toastStore: Zustand UI 상태 (show/hide/message) * docs: update collaboration policy - GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리) - Issues / Milestones / Project Board 미사용으로 관련 내용 제거 - GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거 - PR_RULES PR 본문에서 관련 Issue 항목 제거
* feat(styles): 디자인 토큰 및 전역 스타일 설정 - _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가 - _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m) - _global.scss body 폰트 Pretendard 적용 - next/font/local로 PretendardVariable 폰트 로드 (layout.tsx) - GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 컨테이너 max-width 1000px 설정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 개발 확인용 임시 border 색상 회색으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: container min-height 100vh 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: rem 스케일 토큰 추가 및 타이포그래피 변수 rem 참조로 전환 - Rem scale 섹션 추가 (0.25rem ~ 30rem) - 폰트 토큰에서 누락된 0.875rem(14px), 1.125rem(18px) 추가 - font-size, line-height 변수를 rem 스케일 변수 참조로 전환 - rem 스케일을 typography 섹션보다 상단으로 이동 (선언 순서) - 컴포넌트 width/height 대응을 위해 큰 단위(9rem~30rem) 포함 Co-Authored-By: Claude <noreply@anthropic.com> * style: r() 함수 분리 및 타이포그래피 변수 함수 기반으로 전환 - _functions.scss 신규 추가 — px → rem 변환 함수 r() 단독 관리 - _variables.scss에서 rem 스케일 변수 제거, fn.r() 참조로 전환 - _mixins.scss에 functions @use 추가 - 순환 참조 없이 variables → functions → (없음) 단방향 의존성 구성 Co-Authored-By: Claude <noreply@anthropic.com> * fix: :root {} 시맨틱 토큰을 _global.scss로 분리 _variables.scss에 :root {}가 있으면 module.scss에서 @use 시 CSS Modules 'not pure' 에러 발생. SCSS 변수는 _variables.scss, CSS 출력은 _global.scss로 분리. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): add Button, Toast, Header, BottomNavigation components - Button: primary / outline / disabled variants, design token 기반 - Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용 - Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering - BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘 - toastStore: Zustand UI 상태 (show/hide/message) * docs: update collaboration policy - GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리) - Issues / Milestones / Project Board 미사용으로 관련 내용 제거 - GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거 - PR_RULES PR 본문에서 관련 Issue 항목 제거 * feat(common): add Tabs, CaseCard, ActionPrompt, Input, Select, Textarea components Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(common): apply MUI icons and Snackbar, update MUI usage policy - Toast: MUI Snackbar (3s auto-dismiss) - BottomNavigation, Header, Select: lucide-react → @mui/icons-material - Install @mui/icons-material - CLAUDE.md, CODING_CONVENTION.md: MUI usage policy updated Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update icon policy — @mui/icons-material except diary feature Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건 관련 페이지의 진행 상태 컴포넌트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정 --------- Co-authored-by: jungmin park <jungxmin21@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): add Button, Toast, Header, BottomNavigation components - Button: primary / outline / disabled variants, design token 기반 - Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용 - Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering - BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘 - toastStore: Zustand UI 상태 (show/hide/message) * docs: update collaboration policy - GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리) - Issues / Milestones / Project Board 미사용으로 관련 내용 제거 - GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거 - PR_RULES PR 본문에서 관련 Issue 항목 제거 * feat(common): add Tabs, CaseCard, ActionPrompt, Input, Select, Textarea components Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(common): apply MUI icons and Snackbar, update MUI usage policy - Toast: MUI Snackbar (3s auto-dismiss) - BottomNavigation, Header, Select: lucide-react → @mui/icons-material - Install @mui/icons-material - CLAUDE.md, CODING_CONVENTION.md: MUI usage policy updated Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update icon policy — @mui/icons-material except diary feature Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(common): ActionPrompt message 제거 및 Textarea 글자수 카운터 absolute 배치 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- ApiResponse, ApiError, ApiFieldError, CategoryGroup (common.ts) - DisputeDto, CreateDisputeRequest, DisputeListResponse 등 (dispute.ts) - AiJudgmentDto, CreateAiJudgmentRequest 등 (judgment.ts) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- VALID_CATEGORY_GROUPS, IMMUTABLE_DISPUTE_STATUSES 상수 (constants/dispute.ts) - getSessionUserId NextAuth 세션 헬퍼 (auth/session.ts) - toAiJudgmentDto 공유 mapper (judgement/judgment.mapper.ts) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- GET /api/v1/disputes — 참여 사건 목록, categoryGroup 필터, 페이지네이션 - POST /api/v1/disputes — 사건 생성 + role_a 참여자 트랜잭션 등록 - GET /api/v1/disputes/:id — 사건 상세 조회 - PATCH /api/v1/disputes/:id — 사건 수정 (role_a 전용, 변경 불가 상태 차단) - DELETE /api/v1/disputes/:id — 사건 소프트 삭제 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- POST /api/v1/disputes/:id/judge — AI 판결 요청, JUDGING 상태 잠금으로 멱등성 보장 - GET /api/v1/disputes/:id/result — 판결 결과 조회 (참여자 전용) - AI 모듈 미구현 구간은 TODO 주석으로 마킹, 완료 전까지 503 반환 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건 관련 페이지의 진행 상태 컴포넌트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정 * fix: StatusBadge 크기 조정 및 .playwright-mcp gitignore 추가 - StatusBadge min-width, height, padding, border-radius 수정 - justify-content: center 추가 - .playwright-mcp/ gitignore 등록 - package-lock.json peer dependency 재분류 반영 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: jungmin park <jungxmin21@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor(home): 홈 헤더 직접 렌더 구조로 전환
- layout에서 홈('/') 경로일 때 Header 렌더 스킵
- page.tsx에서 SetHeader 제거 후 Header 직접 렌더
- Header 컴포넌트에 className prop 추가 (optional, 하위 호환)
- page.module.scss를 src/app/에서 src/app/(page)/로 이동
- HomeGreeting import 경로 업데이트
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* design: 메인페이지 디자인 스타일 수정
* chore: 버튼 소개링크로 변경
* design: 메인 진행중인사건 텍스트 수정
* design: 패딩 수정
* design: 하단 플로팅버튼 디자인수정
* design: 캘린더 페이지 하단 플로팅 스타일 수정
* style: 플로팅 버튼 고정
* style: 사건기록 탭 스타일 수정
* style: 마이페이지, 캘린더 메뉴 스타일 수정
* style:판결결과 페이지 스타일 수정
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 404/500/global 에러 페이지 디자인 구현 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 에러 페이지 img -> next/image 교체 및 eslint 경고 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 에러 페이지 뒤로가기 히스토리 없을 시 홈 이동 폴백 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor(home): 홈 헤더 직접 렌더 구조로 전환
- layout에서 홈('/') 경로일 때 Header 렌더 스킵
- page.tsx에서 SetHeader 제거 후 Header 직접 렌더
- Header 컴포넌트에 className prop 추가 (optional, 하위 호환)
- page.module.scss를 src/app/에서 src/app/(page)/로 이동
- HomeGreeting import 경로 업데이트
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* design: 메인페이지 디자인 스타일 수정
* chore: 버튼 소개링크로 변경
* design: 메인 진행중인사건 텍스트 수정
* design: 패딩 수정
* design: 하단 플로팅버튼 디자인수정
* design: 캘린더 페이지 하단 플로팅 스타일 수정
* style: 플로팅 버튼 고정
* style: 사건기록 탭 스타일 수정
* style: 마이페이지, 캘린더 메뉴 스타일 수정
* style:판결결과 페이지 스타일 수정
* fix: 코드래빗 리뷰 반영 - 접근성·스타일 수정
- mypage: menu__item--danger 클래스 누락 복구 (회원탈퇴 강조 색상)
- disputes: Space 키 onKeyDown에 e.preventDefault() 추가 (스크롤 방지)
- page.module.scss, StatsCategorySection.module.scss: @include 뒤 빈 줄 추가
- Tab.module.scss: 불필요한 빈 줄 제거
Co-Authored-By: Claude <noreply@anthropic.com>
* style: 랜딩페이지 버튼 컬러추가
* style: 마이페이지 메뉴순서 및 컬러 변경
* style: 컨텐츠 사이즈 수정 및 경계 추가
* style: 감정일기 페이지 스타일 수정
* fix: fixed 푸터에 max-width 및 margin auto 추가
뷰포트가 768px을 초과할 때 fixed 푸터가 전체 너비로 늘어나는 문제 수정.
left: 0; right: 0; 만 있던 푸터에 max-width와 margin: 0 auto를 추가해
컨테이너 너비 기준으로 중앙 정렬되도록 처리.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(join): 초대 페이지 닉네임 폴백 및 min-height 추가
- inviterNickname 조회 시 nickname이 null이면 name으로 폴백
- Prisma select에 name 필드 추가
- .page에 min-height: 100dvh 추가하여 버튼이 하단에 위치하도록 수정
Co-Authored-By: Claude <noreply@anthropic.com>
* style: 전체페이지 2차 스타일수정
* fix: 코드래빗 리뷰 반영 - MUI 아이콘 size prop 수정 및 탭 오버플로우 개선
- StatsCategorySection: MUI 아이콘 지원하지 않는 size prop → sx={{ fontSize: 18 }} 변경
- Tab.module.scss: width 고정값 → min-width로 변경하여 텍스트 오버플로우 방지
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(login): 카카오 로고 인라인 SVG → logo_kakao.svg 파일로 교체
인라인 SVG path가 실제 카카오 로고와 달라 깨져 보이는 문제 수정.
public/images/common/logo_kakao.svg 파일을 Next.js Image 컴포넌트로 사용.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
chore: 일기 감정별 부엉이 캐릭터 이미지 업로드
* feat: 404/500/global 에러 페이지 디자인 구현 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 에러 페이지 img -> next/image 교체 및 eslint 경고 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 에러 페이지 뒤로가기 히스토리 없을 시 홈 이동 폴백 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 갈등 유형 공유 링크 비로그인 접근 시 공유자 이름 표시 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 갈등 유형 공유 페이지 커스텀 헤더 -> 공통 Header 컴포넌트로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 유형 탭 하단 과도한 여백 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 유형 탭 contentType 조건 누락 수정 및 공유 텍스트 개선 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: kakaoShare window 가드 및 키 유효성 검사 추가, disputeId 인코딩 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 이미지 저장 방식을 navigator.share(files)로 변경하여 갤러리 직접 저장 지원 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: .gitignore에서 TROUBLESHOOTING.md 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 이미지 공유 취소(AbortError) 처리 및 res.ok 검사 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
로그인 상태면 홈(/), 비로그인이면 로그인(/login)으로 이동하도록 변경. useSession으로 인증 상태 확인. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: README.md 프로젝트 현황 기반 전면 개편 서비스 로고 및 기술 스택 뱃지, 핵심 흐름과 주요 기능 테이블, Frontend/Backend 기술 스택 분리 정리, 프로젝트 디렉토리 구조, 시작하기 가이드, Git 브랜치 전략 등 프로젝트 전반 내용을 반영. Co-Authored-By: Claude <noreply@anthropic.com> * docs: README에서 라이선스 섹션 삭제 퍼블릭 리포지토리이므로 비공개 프로젝트 문구 제거. Co-Authored-By: Claude <noreply@anthropic.com> * docs: README를 프로젝트 기획 배경·기술 해결·학습 중심으로 재구성 실행 가이드 중심에서 포트폴리오 관점으로 전환: - 프로젝트 탄생 배경 (문제 인식, 해결 방향) - 핵심 기능별 기술적 해결 방법 (AI 판결, 상태 전환, 감정일기, 선물추천) - 프로젝트를 통해 학습한 점 (DDD, 상태 관리 분리, AI 안정성, 보안 설계, 문서 중심 협업) Co-Authored-By: Claude <noreply@anthropic.com> * docs: README에 팀원 프로필 추가 PR 기록 기반으로 5명 팀원의 역할과 담당 영역 정리. 도메인별 풀스택 개발 구조를 반영하여 역할 구분. Co-Authored-By: Claude <noreply@anthropic.com> * fix(docs): 팀원 이름 줄바꿈 방지 및 담당 영역 간결화 nobr 태그로 이름 줄바꿈 방지, 담당 영역 텍스트 축약으로 열 너비 확보. Co-Authored-By: Claude <noreply@anthropic.com> * docs: 이승규 팀원 프로필에 DB 관리 역할 추가 Co-Authored-By: Claude <noreply@anthropic.com> * docs: README에 개발 워크플로우 섹션 추가 브랜치 전략, 개발 흐름(dev 최신화→브랜치→검증→PR→리뷰→Squash Merge), 커밋 컨벤션을 프로젝트 실제 운영 기준으로 정리. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
style(about): about 페이지 텍스트 수정
* docs: 프로젝트 아키텍처, 디자인 시스템, ERD 문서 추가 시스템 아키텍처(ARCHITECTURE.md), 디자인 시스템 가이드(DESIGN.md), ERD v2.7(ERD.md) 문서를 추가한다. Co-Authored-By: Claude <noreply@anthropic.com> * docs: CLAUDE.md 참조 문서 목록을 실제 존재 파일 기준으로 갱신 존재하지 않는 문서 제거: PRD.md, FUNCTIONAL_REQUIREMENTS.xlsx, NON_FUNCTIONAL_REQUIREMENTS.xlsx, TASK_ASSIGNMENT.xlsx 누락된 문서 추가: DESIGN.md, PAGES.md, GITHUB_COLLABORATION_POLICY.md, VERCEL_DEPLOYMENT_GUIDE.md Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
* feat : 사건 판결 선물추천기능 추가 * feat: 감정일기 상세페이지 카테고리별 배경 및 이미지변경 추가 * fix(calendar): 슬라이드 트랜지션 minHeight 제거로 탭 클릭 차단 문제 수정 MuiDayCalendar-slideTransition에 minHeight: 512 설정으로 인해 달력 콘텐츠 아래 투명 영역이 생겨 사건기록 탭 클릭이 차단되던 문제 수정. 바깥 DateCalendar의 minHeight: 512로 레이아웃 안정성은 유지. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix : 캘린더 사건조회 오류 수정 및 판결결과 선물추천기능 이미지 로딩 스켈레톤처리 * fix : 선물 추천 sql 쿼리 수정( 추천선물상품 제공) --------- Co-authored-by: 배근영 <bgy09270@naver.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(loading): 부엉이 캐릭터 스피너로 로딩 페이지 교체 텍스트만 표시하던 로딩 페이지를 character-loading.svg 기반 float 애니메이션 스피너로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(loading): 기존 Spinner 컴포넌트로 교체 직접 구현한 float 애니메이션 대신 기존 Spinner 컴포넌트 사용 MUI CircularProgress + 부엉이 캐릭터 조합으로 통일 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
카카오톡 링크 공유 시 OG 이미지가 표시되지 않는 문제 수정 - metadataBase에서 미설정된 NEXT_PUBLIC_BASE_URL 대신 기존 환경변수 NEXT_PUBLIC_APP_URL 사용 - layout.tsx, kakaoShare.ts, disputes/[id]/type/page.tsx 일괄 변경 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 404/500/global 에러 페이지 디자인 구현 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 에러 페이지 img -> next/image 교체 및 eslint 경고 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 에러 페이지 뒤로가기 히스토리 없을 시 홈 이동 폴백 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 갈등 유형 공유 링크 비로그인 접근 시 공유자 이름 표시 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 갈등 유형 공유 페이지 커스텀 헤더 -> 공통 Header 컴포넌트로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 유형 탭 하단 과도한 여백 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 유형 탭 contentType 조건 누락 수정 및 공유 텍스트 개선 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: kakaoShare window 가드 및 키 유효성 검사 추가, disputeId 인코딩 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 이미지 저장 방식을 navigator.share(files)로 변경하여 갤러리 직접 저장 지원 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: .gitignore에서 TROUBLESHOOTING.md 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 이미지 공유 취소(AbortError) 처리 및 res.ok 검사 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: OG 메타태그 head 주입 및 이미지 다운로드 개선 - RootLayout async 제거, SessionBridge로 분리하여 metadata streaming 문제 해결 - layout.tsx openGraph 이미지 URL 절대경로로 수정 - disputes/[id]/type/page.tsx OG fallback URL 절대경로로 수정 - JudgmentTypeResult 다운로드 버튼 anchor download 방식으로 통일 - kakaoShare.ts 미사용 파일 삭제 - invite/route.ts NEXT_PUBLIC_APP_URL → NEXT_PUBLIC_BASE_URL 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 사건 기록 에러 메시지 마침표 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: trigger redeploy * chore: trigger redeploy * fix: 프로덕션 ENV 누락 시 초대 링크 오류 및 OG 이미지 URL 하드코딩 제거 - invite/route.ts: NEXT_PUBLIC_BASE_URL 누락 시 프로덕션에서 CONFIG_ERROR 500 반환 - invite/route.ts: template literal → new URL()로 URL 조합 안전성 개선 - layout.tsx: OG 이미지 URL 하드코딩 제거, NEXT_PUBLIC_BASE_URL 기반으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: NEXT_PUBLIC_BASE_URL을 NEXT_PUBLIC_APP_URL로 통일 - layout.tsx, invite/route.ts, type/page.tsx 모두 NEXT_PUBLIC_APP_URL로 일관 적용 - type/page.tsx 하드코딩된 OG 이미지 URL 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: OG 메타태그 head 주입 및 NEXT_PUBLIC_APP_URL 통일 - layout.tsx: metadataBase 복원, NEXT_PUBLIC_APP_URL 적용, SessionBridge 분리로 metadata streaming 수정 - type/page.tsx: NEXT_PUBLIC_BASE_URL → NEXT_PUBLIC_APP_URL 통일 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: type/page.tsx ownerName 쿼리 누락 수정 dev 복원 과정에서 participants 쿼리와 ownerName 반환값이 빠진 것 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: OG description 문구 및 에러 메시지 마침표 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 이미지 저장 파일명 한글 제거, 고정 영문으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: juahcheon <132863519+juahcheon@users.noreply.github.com>
* feat: 로그인 페이지 캐릭터 이미지를 픽셀아트 부엉이로 교체 - owl_pixel_art_rgba_transparent.svg를 login_character.svg로 교체 - 기존 133x109 비율 영역 유지를 위해 height/max-height/object-fit 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 로그인/사건기록/사건조회/마이페이지에 홈과 동일한 그라데이션 배경 적용 - 로그인: page 스타일에 직접 background 추가 - 사건기록/사건조회/마이페이지: 레이아웃에서 pathname 기반 gradient 클래스 적용 - 사건조회 페이지의 기존 background-color 제거 (레이아웃 그라데이션과 충돌 방지) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 마이페이지 그라데이션 배경 적용 제외 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 404/500/global 에러 페이지 디자인 구현 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 에러 페이지 img -> next/image 교체 및 eslint 경고 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 에러 페이지 뒤로가기 히스토리 없을 시 홈 이동 폴백 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 갈등 유형 공유 링크 비로그인 접근 시 공유자 이름 표시 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 갈등 유형 공유 페이지 커스텀 헤더 -> 공통 Header 컴포넌트로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 유형 탭 하단 과도한 여백 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 유형 탭 contentType 조건 누락 수정 및 공유 텍스트 개선 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: kakaoShare window 가드 및 키 유효성 검사 추가, disputeId 인코딩 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 이미지 저장 방식을 navigator.share(files)로 변경하여 갤러리 직접 저장 지원 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: .gitignore에서 TROUBLESHOOTING.md 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 이미지 공유 취소(AbortError) 처리 및 res.ok 검사 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: OG 메타태그 head 주입 및 이미지 다운로드 개선 - RootLayout async 제거, SessionBridge로 분리하여 metadata streaming 문제 해결 - layout.tsx openGraph 이미지 URL 절대경로로 수정 - disputes/[id]/type/page.tsx OG fallback URL 절대경로로 수정 - JudgmentTypeResult 다운로드 버튼 anchor download 방식으로 통일 - kakaoShare.ts 미사용 파일 삭제 - invite/route.ts NEXT_PUBLIC_APP_URL → NEXT_PUBLIC_BASE_URL 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 사건 기록 에러 메시지 마침표 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: trigger redeploy * chore: trigger redeploy * fix: 프로덕션 ENV 누락 시 초대 링크 오류 및 OG 이미지 URL 하드코딩 제거 - invite/route.ts: NEXT_PUBLIC_BASE_URL 누락 시 프로덕션에서 CONFIG_ERROR 500 반환 - invite/route.ts: template literal → new URL()로 URL 조합 안전성 개선 - layout.tsx: OG 이미지 URL 하드코딩 제거, NEXT_PUBLIC_BASE_URL 기반으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: NEXT_PUBLIC_BASE_URL을 NEXT_PUBLIC_APP_URL로 통일 - layout.tsx, invite/route.ts, type/page.tsx 모두 NEXT_PUBLIC_APP_URL로 일관 적용 - type/page.tsx 하드코딩된 OG 이미지 URL 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: OG 메타태그 head 주입 및 NEXT_PUBLIC_APP_URL 통일 - layout.tsx: metadataBase 복원, NEXT_PUBLIC_APP_URL 적용, SessionBridge 분리로 metadata streaming 수정 - type/page.tsx: NEXT_PUBLIC_BASE_URL → NEXT_PUBLIC_APP_URL 통일 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: type/page.tsx ownerName 쿼리 누락 수정 dev 복원 과정에서 participants 쿼리와 ownerName 반환값이 빠진 것 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: OG description 문구 및 에러 메시지 마침표 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 이미지 저장 파일명 한글 제거, 고정 영문으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 이미지 다운로드 서버 프록시 API 추가 및 공유 기능 개선 - /api/download 프록시 엔드포인트 추가 (CORS 우회, 자동 다운로드) - handleDownload: 직접 Supabase URL 대신 /api/download 프록시 경유 - handleShare: 767px 이상에서 링크 복사 + 토스트 메시지 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 이미지 다운로드 프록시 API 강화 및 Apple 공유 경로 통일 - download/route.ts: 전체 로직 try-catch로 감싸기 - download/route.ts: 업스트림 Content-Type 검증 추가 (JPEG 아닌 경우 415 반환) - JudgmentTypeResult: handleAppleShareSave도 /api/download 프록시 경유로 통일 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 이미지 다운로드 프록시 호스트 검증 및 Content-Type 조건 완화 - 호스트 검증: SUPABASE_URL 고정 비교 → *.supabase.co 패턴으로 변경 (Storage URL 호스트 불일치 해결) - Content-Type 검증: image/jpeg 전용 → image/* 전체 허용 (WebP 등 대응) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: juahcheon <132863519+juahcheon@users.noreply.github.com>
* Update README.md
* fix: update README to match project (말해부엉) (#17)
* [Release] 초기 세팅 및 문서화 dev → main (#19)
* chore: initialize project folder structure (#1)
* chore: initialize project folder structure
- Add base directory layout for Next.js + domain-driven architecture
- Add .gitkeep to track empty directories in git
- Exclude MVP out-of-scope domains (shop, points, user-items)
- No implementation files included, structure only
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Update README.md
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add CLAUDE.md with project rules and work guidelines (#2)
- Add project overview and MVP scope definition
- Add fixed product rules (categories, AI chat policy, judgement output)
- Add architecture, domain scope, and state transition rules
- Add auth/security, DB, frontend state, API, logging rules
- Add Git workflow, Claude work process, STOP conditions
- Add approval-required list and required reference documents
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: setup project config and install dependencies (#3)
- Add package.json with Next.js 15, React 19, TypeScript stack
- Add next.config.ts (minimal Next.js 15 config)
- Add tsconfig.json (strict mode, @/* path alias)
- Add eslint.config.mjs (next/core-web-vitals + next/typescript)
- Add .prettierrc and .prettierignore
- Add .gitignore (node_modules, .next, .env.local, etc.)
- Add .env.example (key names only, no real values)
- Add prisma/schema.prisma (generator + datasource only)
- Add data/mock/db.json (health check stub for json-server)
- Add docs/TECH_STACK.md (package list and selection rationale)
- Update README.md with run commands and env guide
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add base documentation structure (#4)
- Add PROJECT_DECISIONS.md (MVP scope, architecture, security principles)
- Add guides/CLAUDE_WORKFLOW.md (work process, STOP conditions, approval rules)
- Add guides/GIT_WORKFLOW.md (branch naming, commit convention, workflow)
- Add guides/PR_RULES.md (PR target, title rules, review criteria)
- Add guides/ENV_GUIDE.md (Vercel env pull, .env.example management)
- Add guides/CODING_CONVENTION.md (naming, state management, folder rules)
- Add db/STATUS_TRANSITION.md (room_mode, dispute_status transitions)
- Add db/PRISMA_MAPPING.md (snake_case/camelCase mapping rules)
- Add db/MASTER_DATA.md (categories, result types, DB master principles)
- Add domains/README.md (domain list, MVP scope, writing guidelines)
- Add domains/_DOMAIN_TEMPLATE.md (template for domain docs)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add domain document drafts for all MVP domains (#5)
- Add AUTH.md (kakao login, terms, session management)
- Add COMMON.md (error handling, logging, common response)
- Add ROOM.md (AI chat room, invite link, room_mode transitions)
- Add PERSONAL_ANALYSIS.md (AI-based personal conflict analysis)
- Add DISPUTE.md (1:1 mediation, roles, statements, dispute_status)
- Add JUDGEMENT.md (AI judgement, Gemini API, result card)
- Add GIFT.md (gift recommendation after judgement)
- Add USER.md (mypage, profile, bottom tab)
- Add CALENDAR.md (date-based record marking, monthly summary)
- Add DIARY.md (emotion diary, author-only access, content protection)
- Add STATISTICS.md (anonymous aggregation, summary components)
- Add SHOP_FUTURE.md (v2.0 planned, MVP excluded)
- Add POINTS_FUTURE.md (v2.0 planned, MVP excluded)
- Add USER_ITEMS_FUTURE.md (v2.0 planned, MVP excluded)
All documents are draft templates with TODO markers for assignees.
No implementation, no API routes, no schema changes.
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: add Next.js App Router entry files and SCSS base structure (#6)
- Add src/app/layout.tsx (root layout with metadata and globals.scss import)
- Add src/app/page.tsx (minimal root page for build verification)
- Add src/app/globals.scss (imports src/styles/main.scss)
- Add src/app/error.tsx (minimal error boundary with reset)
- Add src/app/not-found.tsx (minimal 404 page)
- Add src/app/loading.tsx (minimal loading page)
- Add src/styles/main.scss (ordered SCSS entry point)
- Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens)
- Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints)
- Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset)
- Add src/styles/base/_global.scss (body font, background, color defaults)
- Add src/styles/layout/_page.scss (placeholder for page layout)
Verified: type-check, lint, build all pass
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Infra/init next setup (#7)
* infra: add Next.js App Router entry files and SCSS base structure
- Add src/app/layout.tsx (root layout with metadata and globals.scss import)
- Add src/app/page.tsx (minimal root page for build verification)
- Add src/app/globals.scss (imports src/styles/main.scss)
- Add src/app/error.tsx (minimal error boundary with reset)
- Add src/app/not-found.tsx (minimal 404 page)
- Add src/app/loading.tsx (minimal loading page)
- Add src/styles/main.scss (ordered SCSS entry point)
- Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens)
- Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints)
- Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset)
- Add src/styles/base/_global.scss (body font, background, color defaults)
- Add src/styles/layout/_page.scss (placeholder for page layout)
Verified: type-check, lint, build all pass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: resolve ESLint and TypeScript config warnings
- eslint.config.mjs: ignore next-env.d.ts and .next/** (auto-generated by Next.js, triple-slash reference false positive)
- tsconfig.json: remove deprecated baseUrl option (TypeScript 5.x+, paths works without baseUrl)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Update README.md (#8)
* docs(infra): confirm Supabase as project infrastructure (#9)
* chore(github): add collaboration templates and policy (#10)
* docs(env): document environment variable management (#11)
* docs(calendar): confirm MUI date picker usage (#12)
달력 UI 라이브러리로 MUI X Date Pickers + Day.js 사용을 확정하고
관련 문서(TECH_STACK, PROJECT_DECISIONS, CODING_CONVENTION, CALENDAR, DIARY, CLAUDE.md)에 반영한다.
* chore(deps): install MUI X Date Pickers and peer dependencies (#13)
달력 UI 구현을 위해 MUI X Date Pickers 및 필수 peer dependency를 설치한다.
@mui/material@9.1.1, @emotion/react@11.14.0, @emotion/styled@11.14.1,
@mui/x-date-pickers@9.5.0, dayjs@1.11.21
* Update README.md (#15)
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: dev → main 프로덕션 배포 병합 (#112)
* chore: initialize project folder structure (#1)
* chore: initialize project folder structure
- Add base directory layout for Next.js + domain-driven architecture
- Add .gitkeep to track empty directories in git
- Exclude MVP out-of-scope domains (shop, points, user-items)
- No implementation files included, structure only
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Update README.md
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add CLAUDE.md with project rules and work guidelines (#2)
- Add project overview and MVP scope definition
- Add fixed product rules (categories, AI chat policy, judgement output)
- Add architecture, domain scope, and state transition rules
- Add auth/security, DB, frontend state, API, logging rules
- Add Git workflow, Claude work process, STOP conditions
- Add approval-required list and required reference documents
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: setup project config and install dependencies (#3)
- Add package.json with Next.js 15, React 19, TypeScript stack
- Add next.config.ts (minimal Next.js 15 config)
- Add tsconfig.json (strict mode, @/* path alias)
- Add eslint.config.mjs (next/core-web-vitals + next/typescript)
- Add .prettierrc and .prettierignore
- Add .gitignore (node_modules, .next, .env.local, etc.)
- Add .env.example (key names only, no real values)
- Add prisma/schema.prisma (generator + datasource only)
- Add data/mock/db.json (health check stub for json-server)
- Add docs/TECH_STACK.md (package list and selection rationale)
- Update README.md with run commands and env guide
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add base documentation structure (#4)
- Add PROJECT_DECISIONS.md (MVP scope, architecture, security principles)
- Add guides/CLAUDE_WORKFLOW.md (work process, STOP conditions, approval rules)
- Add guides/GIT_WORKFLOW.md (branch naming, commit convention, workflow)
- Add guides/PR_RULES.md (PR target, title rules, review criteria)
- Add guides/ENV_GUIDE.md (Vercel env pull, .env.example management)
- Add guides/CODING_CONVENTION.md (naming, state management, folder rules)
- Add db/STATUS_TRANSITION.md (room_mode, dispute_status transitions)
- Add db/PRISMA_MAPPING.md (snake_case/camelCase mapping rules)
- Add db/MASTER_DATA.md (categories, result types, DB master principles)
- Add domains/README.md (domain list, MVP scope, writing guidelines)
- Add domains/_DOMAIN_TEMPLATE.md (template for domain docs)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add domain document drafts for all MVP domains (#5)
- Add AUTH.md (kakao login, terms, session management)
- Add COMMON.md (error handling, logging, common response)
- Add ROOM.md (AI chat room, invite link, room_mode transitions)
- Add PERSONAL_ANALYSIS.md (AI-based personal conflict analysis)
- Add DISPUTE.md (1:1 mediation, roles, statements, dispute_status)
- Add JUDGEMENT.md (AI judgement, Gemini API, result card)
- Add GIFT.md (gift recommendation after judgement)
- Add USER.md (mypage, profile, bottom tab)
- Add CALENDAR.md (date-based record marking, monthly summary)
- Add DIARY.md (emotion diary, author-only access, content protection)
- Add STATISTICS.md (anonymous aggregation, summary components)
- Add SHOP_FUTURE.md (v2.0 planned, MVP excluded)
- Add POINTS_FUTURE.md (v2.0 planned, MVP excluded)
- Add USER_ITEMS_FUTURE.md (v2.0 planned, MVP excluded)
All documents are draft templates with TODO markers for assignees.
No implementation, no API routes, no schema changes.
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: add Next.js App Router entry files and SCSS base structure (#6)
- Add src/app/layout.tsx (root layout with metadata and globals.scss import)
- Add src/app/page.tsx (minimal root page for build verification)
- Add src/app/globals.scss (imports src/styles/main.scss)
- Add src/app/error.tsx (minimal error boundary with reset)
- Add src/app/not-found.tsx (minimal 404 page)
- Add src/app/loading.tsx (minimal loading page)
- Add src/styles/main.scss (ordered SCSS entry point)
- Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens)
- Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints)
- Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset)
- Add src/styles/base/_global.scss (body font, background, color defaults)
- Add src/styles/layout/_page.scss (placeholder for page layout)
Verified: type-check, lint, build all pass
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Infra/init next setup (#7)
* infra: add Next.js App Router entry files and SCSS base structure
- Add src/app/layout.tsx (root layout with metadata and globals.scss import)
- Add src/app/page.tsx (minimal root page for build verification)
- Add src/app/globals.scss (imports src/styles/main.scss)
- Add src/app/error.tsx (minimal error boundary with reset)
- Add src/app/not-found.tsx (minimal 404 page)
- Add src/app/loading.tsx (minimal loading page)
- Add src/styles/main.scss (ordered SCSS entry point)
- Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens)
- Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints)
- Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset)
- Add src/styles/base/_global.scss (body font, background, color defaults)
- Add src/styles/layout/_page.scss (placeholder for page layout)
Verified: type-check, lint, build all pass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: resolve ESLint and TypeScript config warnings
- eslint.config.mjs: ignore next-env.d.ts and .next/** (auto-generated by Next.js, triple-slash reference false positive)
- tsconfig.json: remove deprecated baseUrl option (TypeScript 5.x+, paths works without baseUrl)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Update README.md (#8)
* docs(infra): confirm Supabase as project infrastructure (#9)
* chore(github): add collaboration templates and policy (#10)
* docs(env): document environment variable management (#11)
* docs(calendar): confirm MUI date picker usage (#12)
달력 UI 라이브러리로 MUI X Date Pickers + Day.js 사용을 확정하고
관련 문서(TECH_STACK, PROJECT_DECISIONS, CODING_CONVENTION, CALENDAR, DIARY, CLAUDE.md)에 반영한다.
* chore(deps): install MUI X Date Pickers and peer dependencies (#13)
달력 UI 구현을 위해 MUI X Date Pickers 및 필수 peer dependency를 설치한다.
@mui/material@9.1.1, @emotion/react@11.14.0, @emotion/styled@11.14.1,
@mui/x-date-pickers@9.5.0, dayjs@1.11.21
* Update README.md (#15)
* fix: resolve ESLint and TypeScript config warnings (#20)
* infra: add Next.js App Router entry files and SCSS base structure
- Add src/app/layout.tsx (root layout with metadata and globals.scss import)
- Add src/app/page.tsx (minimal root page for build verification)
- Add src/app/globals.scss (imports src/styles/main.scss)
- Add src/app/error.tsx (minimal error boundary with reset)
- Add src/app/not-found.tsx (minimal 404 page)
- Add src/app/loading.tsx (minimal loading page)
- Add src/styles/main.scss (ordered SCSS entry point)
- Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens)
- Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints)
- Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset)
- Add src/styles/base/_global.scss (body font, background, color defaults)
- Add src/styles/layout/_page.scss (placeholder for page layout)
Verified: type-check, lint, build all pass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: resolve ESLint and TypeScript config warnings
- eslint.config.mjs: ignore next-env.d.ts and .next/** (auto-generated by Next.js, triple-slash reference false positive)
- tsconfig.json: remove deprecated baseUrl option (TypeScript 5.x+, paths works without baseUrl)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: add MVP Prisma schema with NextAuth and TALKY-OWL models (#21)
- datasource: add directUrl for Supabase connection pooler support
- enums: CategoryGroup, RoomMode, DisputeStatus, ParticipantRole, etc.
- NextAuth models: User (with TALKY-OWL fields), Account, Session, VerificationToken
- core models: DisputeRoom, RoomAiConversation, RoomAiMessage
- dispute models: Dispute, DisputeParticipant, DisputeStatement
- judgment models: AiJudgment, JudgmentResultCard
- gift models: GiftRecommendation, GiftRecommendationItem
- feature models: EmotionDiary, CalendarRecord
- master data: ConflictTypeGroup, ConflictTypeDetail (DB-based, no enum hardcoding)
- log models: AuditLog, ApiErrorLog, ModerationLog, RoomAccessLog, UserDeletionLog
- .env.example: add DIRECT_URL for Supabase directUrl
- v2.0 TODO: ShopItem, PointTransaction, UserItem, DisputeStatistic excluded
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: align project structure with guide v2 (#22)
folders added:
- src/components/{personal-analysis,room,dispute,judgement,calendar,diary,statistics,gift}
- src/app/api/auth/[...nextauth]
- src/app/api/v1/{users,personal-analyses,rooms,disputes,statements,calendar,diary,statistics,cron}
files added:
- prisma/seed.ts (placeholder for ConflictTypeGroup master data)
docs updated (minimal):
- docs/domains/COMMON.md: add log table list, judgement_logs TODO note
- docs/domains/JUDGEMENT.md: clarify Storage is MVP-excluded scaffolding
- docs/guides/ENV_GUIDE.md: clarify Supabase Storage vars are MVP-excluded
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: rename src/app/page to src/app/(page) for correct Next.js route group (#23)
src/app/page/ (괄호 없음)는 /page/* URL segment를 생성하므로,
Next.js App Router route group 문법인 src/app/(page)/로 변경한다.
URL은 /landing, /home 등으로 노출되어야 하며 /page/... 가 아니다.
관련 문서 내 경로 참조도 모두 업데이트 (CLAUDE.md, docs/domains/*, docs/guides/*).
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* [Style] 디자인 토큰 및 전역 스타일 설정 (#25)
* feat(styles): 디자인 토큰 및 전역 스타일 설정
- _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가
- _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m)
- _global.scss body 폰트 Pretendard 적용
- next/font/local로 PretendardVariable 폰트 로드 (layout.tsx)
- GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 커밋 타입 style 추가 및 scope 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 컨테이너 max-width 1000px 설정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 개발 확인용 임시 border 색상 회색으로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: container min-height 100vh 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 커밋 타입 style 추가 및 scope 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 디자인 시스템 기반 설정 (#27)
* feat(styles): 디자인 토큰 및 전역 스타일 설정
- _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가
- _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m)
- _global.scss body 폰트 Pretendard 적용
- next/font/local로 PretendardVariable 폰트 로드 (layout.tsx)
- GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 커밋 타입 style 추가 및 scope 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 컨테이너 max-width 1000px 설정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 개발 확인용 임시 border 색상 회색으로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: container min-height 100vh 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 커밋 타입 style 추가 및 scope 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: rem 스케일 토큰 추가 및 타이포그래피 변수 rem 참조로 전환
- Rem scale 섹션 추가 (0.25rem ~ 30rem)
- 폰트 토큰에서 누락된 0.875rem(14px), 1.125rem(18px) 추가
- font-size, line-height 변수를 rem 스케일 변수 참조로 전환
- rem 스케일을 typography 섹션보다 상단으로 이동 (선언 순서)
- 컴포넌트 width/height 대응을 위해 큰 단위(9rem~30rem) 포함
Co-Authored-By: Claude <noreply@anthropic.com>
* style: r() 함수 분리 및 타이포그래피 변수 함수 기반으로 전환
- _functions.scss 신규 추가 — px → rem 변환 함수 r() 단독 관리
- _variables.scss에서 rem 스케일 변수 제거, fn.r() 참조로 전환
- _mixins.scss에 functions @use 추가
- 순환 참조 없이 variables → functions → (없음) 단방향 의존성 구성
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Feature/common component jw (#28)
* feat(common): add Button, Toast, Header, BottomNavigation components
- Button: primary / outline / disabled variants, design token 기반
- Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용
- Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering
- BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘
- toastStore: Zustand UI 상태 (show/hide/message)
* docs: update collaboration policy
- GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리)
- Issues / Milestones / Project Board 미사용으로 관련 내용 제거
- GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거
- PR_RULES PR 본문에서 관련 Issue 항목 제거
* fix: :root {} 시맨틱 토큰을 _global.scss로 분리 (#29)
* feat(styles): 디자인 토큰 및 전역 스타일 설정
- _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가
- _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m)
- _global.scss body 폰트 Pretendard 적용
- next/font/local로 PretendardVariable 폰트 로드 (layout.tsx)
- GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 커밋 타입 style 추가 및 scope 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 컨테이너 max-width 1000px 설정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 개발 확인용 임시 border 색상 회색으로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: container min-height 100vh 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 커밋 타입 style 추가 및 scope 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: rem 스케일 토큰 추가 및 타이포그래피 변수 rem 참조로 전환
- Rem scale 섹션 추가 (0.25rem ~ 30rem)
- 폰트 토큰에서 누락된 0.875rem(14px), 1.125rem(18px) 추가
- font-size, line-height 변수를 rem 스케일 변수 참조로 전환
- rem 스케일을 typography 섹션보다 상단으로 이동 (선언 순서)
- 컴포넌트 width/height 대응을 위해 큰 단위(9rem~30rem) 포함
Co-Authored-By: Claude <noreply@anthropic.com>
* style: r() 함수 분리 및 타이포그래피 변수 함수 기반으로 전환
- _functions.scss 신규 추가 — px → rem 변환 함수 r() 단독 관리
- _variables.scss에서 rem 스케일 변수 제거, fn.r() 참조로 전환
- _mixins.scss에 functions @use 추가
- 순환 참조 없이 variables → functions → (없음) 단방향 의존성 구성
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: :root {} 시맨틱 토큰을 _global.scss로 분리
_variables.scss에 :root {}가 있으면 module.scss에서 @use 시
CSS Modules 'not pure' 에러 발생.
SCSS 변수는 _variables.scss, CSS 출력은 _global.scss로 분리.
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): 공통 UI 컴포넌트 추가 및 MUI 정책 적용 (#30)
* feat(common): add Button, Toast, Header, BottomNavigation components
- Button: primary / outline / disabled variants, design token 기반
- Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용
- Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering
- BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘
- toastStore: Zustand UI 상태 (show/hide/message)
* docs: update collaboration policy
- GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리)
- Issues / Milestones / Project Board 미사용으로 관련 내용 제거
- GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거
- PR_RULES PR 본문에서 관련 Issue 항목 제거
* feat(common): add Tabs, CaseCard, ActionPrompt, Input, Select, Textarea components
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): apply MUI icons and Snackbar, update MUI usage policy
- Toast: MUI Snackbar (3s auto-dismiss)
- BottomNavigation, Header, Select: lucide-react → @mui/icons-material
- Install @mui/icons-material
- CLAUDE.md, CODING_CONVENTION.md: MUI usage policy updated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: update icon policy — @mui/icons-material except diary feature
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건 목록 공통 UI 컴포넌트 추가 (Tab, StatusBadge) (#31)
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건 관련 페이지의 진행 상태 컴포넌트
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정
---------
Co-authored-by: jungmin park <jungxmin21@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(common): ActionPrompt message 제거 및 Textarea 글자수 카운터 위치 수정 (#32)
* feat(common): add Button, Toast, Header, BottomNavigation components
- Button: primary / outline / disabled variants, design token 기반
- Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용
- Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering
- BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘
- toastStore: Zustand UI 상태 (show/hide/message)
* docs: update collaboration policy
- GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리)
- Issues / Milestones / Project Board 미사용으로 관련 내용 제거
- GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거
- PR_RULES PR 본문에서 관련 Issue 항목 제거
* feat(common): add Tabs, CaseCard, ActionPrompt, Input, Select, Textarea components
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): apply MUI icons and Snackbar, update MUI usage policy
- Toast: MUI Snackbar (3s auto-dismiss)
- BottomNavigation, Header, Select: lucide-react → @mui/icons-material
- Install @mui/icons-material
- CLAUDE.md, CODING_CONVENTION.md: MUI usage policy updated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: update icon policy — @mui/icons-material except diary feature
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(common): ActionPrompt message 제거 및 Textarea 글자수 카운터 absolute 배치
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 공통 및 dispute·judgment DTO 타입 정의
- ApiResponse, ApiError, ApiFieldError, CategoryGroup (common.ts)
- DisputeDto, CreateDisputeRequest, DisputeListResponse 등 (dispute.ts)
- AiJudgmentDto, CreateAiJudgmentRequest 등 (judgment.ts)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: dispute 도메인 공유 상수·헬퍼·mapper 추가
- VALID_CATEGORY_GROUPS, IMMUTABLE_DISPUTE_STATUSES 상수 (constants/dispute.ts)
- getSessionUserId NextAuth 세션 헬퍼 (auth/session.ts)
- toAiJudgmentDto 공유 mapper (judgement/judgment.mapper.ts)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건 목록 조회·생성·수정·삭제 API 구현
- GET /api/v1/disputes — 참여 사건 목록, categoryGroup 필터, 페이지네이션
- POST /api/v1/disputes — 사건 생성 + role_a 참여자 트랜잭션 등록
- GET /api/v1/disputes/:id — 사건 상세 조회
- PATCH /api/v1/disputes/:id — 사건 수정 (role_a 전용, 변경 불가 상태 차단)
- DELETE /api/v1/disputes/:id — 사건 소프트 삭제
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: AI 판결 요청·결과 조회 API 구현
- POST /api/v1/disputes/:id/judge — AI 판결 요청, JUDGING 상태 잠금으로 멱등성 보장
- GET /api/v1/disputes/:id/result — 판결 결과 조회 (참여자 전용)
- AI 모듈 미구현 구간은 TODO 주석으로 마킹, 완료 전까지 503 반환
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 공통 UI 컴포넌트 - StatusBadge, Tab, 진행 상태 (#33)
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건 관련 페이지의 진행 상태 컴포넌트
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정
* fix: StatusBadge 크기 조정 및 .playwright-mcp gitignore 추가
- StatusBadge min-width, height, padding, border-radius 수정
- justify-content: center 추가
- .playwright-mcp/ gitignore 등록
- package-lock.json peer dependency 재분류 반영
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: jungmin park <jungxmin21@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: Prisma 클라이언트, NextAuth Kakao OAuth 설정 및 핸들러 추가
- src/lib/db/index.ts — Prisma 전역 싱글턴
- src/lib/auth/index.ts — NextAuth authOptions (Kakao OAuth, session user.id 매핑)
- src/app/api/auth/[...nextauth]/route.ts — NextAuth GET/POST 핸들러
- @mui/icons-material 패키지 설치 (빌드 에러 해결)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: 빌드 스크립트에 prisma generate 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: MVP 전체 API 명세서 작성 (API_SPEC.md) (#36)
* docs: MVP 전체 API 명세서 작성 (API_SPEC.md)
- 도메인 문서 및 기존 합의 기반 MVP API 명세 초안 작성
- 공통 응답 구조, 에러 코드 체계 정의
- Auth / User / Room / Dispute / Statement / Judgement / Diary / Calendar / Statistics / Gift / Cron 도메인 API 명세 포함
- 경로 충돌 항목 (withdraw, judge/result, diary 경로) 확정 필요 사항으로 명시
- 미확정 TODO 항목 섹션 7에 전체 정리
- MVP 제외 항목 (shop, points, 단독판결, 독립 통계 화면 등) 명시적으로 제거 처리
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 단독 판결 MVP 포함 반영 및 라우트 주석 명확화
- 단독 판결(상대방 없는 AI 판결)을 MVP 포함 범위로 변경
- Personal Analysis 섹션에 단독 판결 API 초안 추가 (POST/GET /api/v1/personal-analyses)
- 라우트 트리 personal-analyses 디렉터리 구조 구체화
- /auth/withdraw route.ts 주석을 경로 충돌 상호 참조가 명확한 형태로 수정
(경로 충돌 → /auth/withdraw vs DELETE /users/me)
- MVP 제외 목록에서 단독 판결 항목 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 카카오 로그인 시 약관 동의 자동 간주 정책 반영
- 카카오 OAuth 로그인 완료를 약관 동의로 간주
- 별도 약관 동의 페이지 이동 플로우 제거
- 확정 필요 항목에서 약관 동의 기준 항목 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 도메인 API 목록 중복 제거 및 회원탈퇴 경로 확정
- docs/domains/*.md 8개 파일의 API 목록 섹션을 docs/API_SPEC.md 참조로 교체
(AUTH, USER, ROOM, DISPUTE, JUDGEMENT, DIARY, CALENDAR, STATISTICS)
- API_SPEC.md 단일 소스 체계 확립
- 회원탈퇴 경로 DELETE /api/v1/users/me 채택 확정
- §3 요약표, §4.1·§4.2 상세, §5 라우트 트리, §6 충돌 목록, §7 체크리스트 반영
- /auth/withdraw 라우트 제거, /users/me route.ts에 DELETE 추가
- CLAUDE_WORKFLOW.md PR 템플릿 준수 문구 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 날짜 포맷 및 Pagination 구조 확정 반영
- 날짜/시간 포맷 ISO 8601 (YYYY-MM-DDTHH:mm:ssZ) 확정
- Pagination 공통 구조 확정
- data 필드: items 배열
- page 필드: page / totalPages / sortBy / isNext
- 섹션 7 확정 필요 항목 두 개 체크 처리
- Room 목록, Diary 목록 섹션 Pagination 참조로 갱신
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: Pagination 구조에 size / sort / hasNext / hasPrevious 추가
- size: 한 번에 가져오는 항목 수
- sort: 정렬 방향 (asc | desc)
- isNext → hasNext로 변경 (다음 페이지 존재 여부)
- hasPrevious 추가 (이전 페이지 존재 여부)
- §7 체크리스트 항목 갱신
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 날짜 포맷 코드블록 언어 지정자 추가 (MD040)
코드래빗 지적 사항 반영 — 언어 미지정 펜스 코드블록에 text 지정자 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 통계 API 비로그인 공개 조회로 변경
홈 화면 진입 시 비로그인 회원도 통계 조회 가능하도록 수정
- GET /api/v1/statistics/summary: 🔒 → 공개
- GET /api/v1/statistics/top-types: 🔒 → 공개
- §3 요약표, §4.9 상세 명세 인증 표기 및 설명 반영
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 목록 응답 예시에 page 객체 추가 (코드래빗 지적 반영)
- GET /api/v1/rooms 응답 예시에 page 객체 추가
- GET /api/v1/diary 응답 예시에 page 객체 추가
- GET /api/v1/statistics/top-types 응답 예시에 page 객체 추가
(Top5 고정 목록 특성 반영: size=5, totalPages=1, hasNext=false)
- 코드래빗 제안의 구버전 필드(isNext) 대신 확정 구조(hasNext/hasPrevious/size/sort) 적용
- §7 Room Pagination 항목 체크 처리
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: Spinner, Avatar, AvatarGroup 공통 컴포넌트 추가 (#37)
* chore: 정적 이미지 에셋 추가 및 정리
주요 페이지용 캐릭터 이미지 추가 및 공통 에셋 정리.
gift, loading 캐릭터를 common에서 characters로 이동하여
캐릭터 이미지를 한 폴더로 통합.
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: Spinner 공통 컴포넌트 추가
캐릭터 로딩 이미지를 중앙에 배치한 88x88 스피너 컴포넌트 추가.
트랙(배경 원)과 애니메이션 링을 분리하여 각각 border-default, bg-brand 색상 적용.
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: Avatar, AvatarGroup 공통 컴포넌트 추가
MUI Avatar, AvatarGroup 래핑 컴포넌트 추가.
size prop으로 s/m/l 사이즈 조절, src prop으로 프로필 사진 지원.
global.scss에 --color-white, --color-black CSS 변수 추가.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: Avatar Context로 AvatarGroup size 전달 및 토큰 수정
AvatarGroup size prop이 자식 Avatar에 적용 안 되는 버그 수정.
Context를 통해 size를 내려주고 Avatar가 그룹 size를 우선 적용.
color 토큰 --color-white를 --text-inverse로 교체.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: Avatar src 없을 때 기본 썸네일 이미지로 fallback 처리
Co-Authored-By: Claude <noreply@anthropic.com>
* test: Spinner, Avatar, AvatarGroup 테스트 페이지 추가
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* feat: 공통 UI 컴포넌트 - CategoryFilter, CategoryIcon, Tab, StatusBadge (#38)
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건 관련 페이지의 진행 상태 컴포넌트
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정
* fix: StatusBadge 크기 조정 및 .playwright-mcp gitignore 추가
- StatusBadge min-width, height, padding, border-radius 수정
- justify-content: center 추가
- .playwright-mcp/ gitignore 등록
- package-lock.json peer dependency 재분류 반영
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: CategoryFilter 공통 컴포넌트 생성
- 전체/연애/직장/친구/가족 카테고리 필터 구현
- 아이콘 박스 44x44, border-radius 8, 아이콘 24x24
- 선택 상태: icon-primary bg / 미선택: bg-disabled
- MUI icons 사용 (GridViewRounded, Favorite, BusinessCenter, Diversity3, FamilyRestroom)
- Category 타입 export
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Tab 라벨 폰트 스타일 명시
- item.label을 span.label로 래핑
- Body-M 기준 font-size 16, line-height 28 적용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: @mui/icons-material 패키지 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: CategoryFilter 스타일 및 single 모드 적용
- 선택: bg-page + border-brand(1px) + icon-primary + 텍스트 bold
- 미선택: bg-page + border-default(1px) + icon-secondary + 텍스트 regular
- mode prop 추가 (filter 기본값 / single: 선택된 박스 하나만 표시)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카테고리 타입을 DB CategoryGroup 기준으로 통일
## 수정 배경
CategoryIcon, CategoryFilter가 한국어 문자열('연애', '직장' 등)을 타입으로 사용하고 있어
API/DB의 CategoryGroup('romance', 'work' 등)과 불일치가 발생.
페이지에서 연결 시 별도 변환 레이어가 필요해지는 문제를 사전 차단.
## 변경 파일별 수정 내용
### CategoryIcon.tsx
- CategoryWithoutAll 타입 제거 → @/types/common의 CategoryGroup 직접 사용
- 아이콘/레이블/컬러 맵 키를 한국어 → 영문 DB 값으로 변경
(romance, work, friend, family)
- CATEGORY_LABEL_MAP export 추가 (CategoryFilter에서 레이블 참조용)
### CategoryFilter.tsx
- Category 타입을 'all' | CategoryGroup으로 변경 (기존: 한국어 문자열)
- CATEGORIES 배열에 label 필드 추가, CATEGORY_LABEL_MAP에서 참조
- 전체 키를 '전체' → 'all'로 변경 (API 필터 미적용 값과 일치)
### CaseCard.tsx (타팀원 파일 수정)
- 수정 이유: CATEGORY_EMOJI 맵 키가 대문자('ROMANCE')였으나
API 응답은 소문자('romance')로 내려와 emoji가 항상 '📋' fallback만 표시되는 버그 존재
- 해결 방법: emoji 방식 전체 제거, CategoryIcon 컴포넌트로 교체
- categoryGroup prop 타입을 string → CategoryGroup으로 명시
- categoryGroup 미전달 시 아이콘 미표시 처리 (optional 유지)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Update src/components/ui/CategoryIcon.tsx
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* fix: CategoryIcon 중복 import 제거 및 CategoryFilter discriminated union 타입 에러 수정
- CategoryIcon: FamilyRestroomIcon, CategoryGroup 중복 import 제거
- CategoryFilter: discriminated union(CodeRabbit 피드백 반영) 유지하면서
props 전체로 받아 props.mode로 narrowing 처리해 타입 에러 해결
(mode='single'일 때 onChange가 CategoryGroup을 기대하는 문제)
- Tab.module.scss: height → min-height 변경 (유연한 높이 대응)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: CaseCard 카테고리 아이콘을 제목 왼쪽 인라인으로 이동
- card__header 구조 변경: titleRow(아이콘+제목)와 badge를 좌우 배치
- card__titleRow 추가: flex row, align-items center, gap 6px
- 아이콘이 제목 위에 쌓이던 문제 수정 → 제목 왼쪽에 인라인 배치
- card__icon: font-size/line-height(이모지 잔재) → display:flex 로 변경
- card__title: margin-bottom 제거(card__header margin-bottom으로 대체)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 공통 컴포넌트 테스트 스크린샷 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: CaseCard titleRow flex 축소 보완 (min-width: 0, flex: 1)
긴 제목에서 card__titleRow가 축소되지 않아 배지가 밀리는 문제 방지.
card__header가 space-between일 때 titleRow가 flex: 1로 가용 공간을 차지하고
min-width: 0으로 내부 콘텐츠가 넘치지 않도록 제약.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: jungmin park <jungxmin21@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* fix(common): BottomNavigation 아이콘 MUI MD2 기본 스타일로 수정 (#39)
* fix(common): BottomNavigation 아이콘을 MUI MD2 기본 스타일로 수정
- HomeRounded → Home
- GavelRounded → MenuBook (사건기록 아이콘 자체 변경)
- CalendarMonthRounded → CalendarMonth
- PersonRounded → Person
디자인 시안 기준 MD2 filled 아이콘으로 통일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: BottomNavigation 테스트 스크린샷 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(common): BottomNavigation 활성 탭 레이블 색상 black-700으로 수정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(common): BottomNavigation 테스트 스크린샷 삭제
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: wjdalss21 <jungxmin21@gmail.com>
* feat: 사건·방 도메인 타입 정의 및 API 구현 (#40)
* feat: room DTO 타입 정의
- RoomMode, RoomDto, CreateRoomRequest, RoomListResponse
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 방 목록 조회·생성·상세 조회·종료·삭제 API 구현
- GET /api/v1/rooms — 내 방 목록 조회 (페이지네이션)
- POST /api/v1/rooms — AI 대화방 생성 (roomMode = ai_chat)
- GET /api/v1/rooms/:id — 방 상세 조회
- POST /api/v1/rooms/:id/close — 방 종료 (closedAt + roomMode = closed)
- DELETE /api/v1/rooms/:id — 방 소프트 삭제 (deletedAt + roomMode = deleted)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 방 목록 페이지네이션 파라미터 NaN 방어 처리
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: API 라우트 경로 v1 버전 세그먼트 제거 (#42)
* fix: API 라우트 경로에서 v1 버전 세그먼트 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 라우트 핸들러 주석 경로 v1 제거 (/api/v1/ -> /api/)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(docs): 서비스 흐름 기반 문서 구조 수정 및 페이지 문서 생성 (#43)
* fix(docs): 서비스 흐름 기반 문서 구조 수정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(docs): PAGES.md 코드 블록 언어 명시 추가 (MD040)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: personal-analyses 페이지 및 API 폴더 삭제 (#45)
* fix: personal-analyses 페이지 및 API 폴더 삭제
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(docs): personal-analysis 도메인 참조 MD 문서 일괄 정리
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 통계 API 구현 (GET /api/statistics/categories) (#44)
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건 관련 페이지의 진행 상태 컴포넌트
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정
* fix: StatusBadge 크기 조정 및 .playwright-mcp gitignore 추가
- StatusBadge min-width, height, padding, border-radius 수정
- justify-content: center 추가
- .playwright-mcp/ gitignore 등록
- package-lock.json peer dependency 재분류 반영
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: CategoryFilter 공통 컴포넌트 생성
- 전체/연애/직장/친구/가족 카테고리 필터 구현
- 아이콘 박스 44x44, border-radius 8, 아이콘 24x24
- 선택 상태: icon-primary bg / 미선택: bg-disabled
- MUI icons 사용 (GridViewRounded, Favorite, BusinessCenter, Diversity3, FamilyRestroom)
- Category 타입 export
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Tab 라벨 폰트 스타일 명시
- item.label을 span.label로 래핑
- Body-M 기준 font-size 16, line-height 28 적용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: @mui/icons-material 패키지 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: CategoryFilter 스타일 및 single 모드 적용
- 선택: bg-page + border-brand(1px) + icon-primary + 텍스트 bold
- 미선택: bg-page + border-default(1px) + icon-secondary + 텍스트 regular
- mode prop 추가 (filter 기본값 / single: 선택된 박스 하나만 표시)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카테고리 타입을 DB CategoryGroup 기준으로 통일
## 수정 배경
CategoryIcon, CategoryFilter가 한국어 문자열('연애', '직장' 등)을 타입으로 사용하고 있어
API/DB의 CategoryGroup('romance', 'work' 등)과 불일치가 발생.
페이지에서 연결 시 별도 변환 레이어가 필요해지는 문제를 사전 차단.
## 변경 파일별 수정 내용
### CategoryIcon.tsx
- CategoryWithoutAll 타입 제거 → @/types/common의 CategoryGroup 직접 사용
- 아이콘/레이블/컬러 맵 키를 한국어 → 영문 DB 값으로 변경
(romance, work, friend, family)
- CATEGORY_LABEL_MAP export 추가 (CategoryFilter에서 레이블 참조용)
### CategoryFilter.tsx
- Category 타입을 'all' | CategoryGroup으로 변경 (기존: 한국어 문자열)
- CATEGORIES 배열에 label 필드 추가, CATEGORY_LABEL_MAP에서 참조
- 전체 키를 '전체' → 'all'로 변경 (API 필터 미적용 값과 일치)
### CaseCard.tsx (타팀원 파일 수정)
- 수정 이유: CATEGORY_EMOJI 맵 키가 대문자('ROMANCE')였으나
API 응답은 소문자('romance')로 내려와 emoji가 항상 '📋' fallback만 표시되는 버그 존재
- 해결 방법: emoji 방식 전체 제거, CategoryIcon 컴포넌트로 교체
- categoryGroup prop 타입을 string → CategoryGroup으로 명시
- categoryGroup 미전달 시 아이콘 미표시 처리 (optional 유지)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Update src/components/ui/CategoryIcon.tsx
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* fix: CategoryIcon 중복 import 제거 및 CategoryFilter discriminated union 타입 에러 수정
- CategoryIcon: FamilyRestroomIcon, CategoryGroup 중복 import 제거
- CategoryFilter: discriminated union(CodeRabbit 피드백 반영) 유지하면서
props 전체로 받아 props.mode로 narrowing 처리해 타입 에러 해결
(mode='single'일 때 onChange가 CategoryGroup을 기대하는 문제)
- Tab.module.scss: height → min-height 변경 (유연한 높이 대응)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: CaseCard 카테고리 아이콘을 제목 왼쪽 인라인으로 이동
- card__header 구조 변경: titleRow(아이콘+제목)와 badge를 좌우 배치
- card__titleRow 추가: flex row, align-items center, gap 6px
- 아이콘이 제목 위에 쌓이던 문제 수정 → 제목 왼쪽에 인라인 배치
- card__icon: font-size/line-height(이모지 잔재) → display:flex 로 변경
- card__title: margin-bottom 제거(card__header margin-bottom으로 대체)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 공통 컴포넌트 테스트 스크린샷 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: CaseCard titleRow flex 축소 보완 (min-width: 0, flex: 1)
긴 제목에서 card__titleRow가 축소되지 않아 배지가 밀리는 문제 방지.
card__header가 space-between일 때 titleRow가 flex: 1로 가용 공간을 차지하고
min-width: 0으로 내부 콘텐츠가 넘치지 않도록 제약.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 통계 도메인 서비스 레이어 생성 (statisticsService.ts)
## 생성 이유
통계 API의 DB 쿼리 로직을 Route Handler와 분리하기 위해
도메인 서비스 레이어를 별도 파일로 작성했다.
## 폴더 선택 이유
src/domains/statistics/
- CLAUDE.md §4 아키텍처 원칙에 따라 도메인별 비즈니스 로직은
src/domains/{domain}/ 에 위치한다.
- statistics는 MVP 도메인 목록에 포함된 독립 도메인이다.
- Route Handler(src/app/api/)는 요청/응답 처리만 담당하고,
실제 DB 쿼리 로직은 서비스 레이어에서 관리한다.
## 구현 내용
### getSummary()
- 서비스 전체 판결 완료 건수(totalJudgements) 집계
- dispute.status = JUDGED 조건 명시: ai_judgements는 판결 완료 시에만
생성되지만 의도를 코드에 명시적으로 표현
- deletedAt / anonymizedAt IS NULL: 삭제·익명화된 사건 제외 (CLAUDE.md §7)
### getTopTypes(size = 5)
- ai_judgements.result_conflict_detail_id 기준 GROUP BY COUNT DESC
- 결과 유형 마스터(conflict_type_details)를 JOIN해 detailCode·displayName 반환
- isActive = true 필터: 비활성화된 유형은 통계에서 제외
- percentage 서버 계산: count / total * 100 (소수점 1자리)
FE에서 별도 계산 없이 바로 사용할 수 있도록 서버에서 내려줌
- prisma.conflictTypeDetail 사용 (prisma.conflictDetail은 스키마에 존재하지 않음)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 통계 API Route Handler 생성 (GET /api/v1/statistics/top-types)
## 생성 이유
statisticsService의 getTopTypes()를 HTTP 엔드포인트로 노출하기 위해
Next.js App Router 기반 Route Handler를 생성했다.
## 폴더 선택 이유
src/app/api/v1/statistics/top-types/
- CLAUDE.md §4 아키텍처 원칙에 따라 API Route는 src/app/api/v1/ 하위에 위치한다.
- API_SPEC.md §4.9 기준 엔드포인트 경로: GET /api/v1/statistics/top-types
- summary 엔드포인트는 현재 MVP 범위에서 불필요하여 top-types만 생성
## 구현 내용
- getServerSession으로 서버에서 직접 세션 검증
(FE 리다이렉트만으로는 API 직접 호출을 막을 수 없으므로 서버 검증 필수 — CLAUDE.md §7)
- 인증 실패 시 401 UNAUTHORIZED 반환
- getTopTypes(5) 호출 → 판결 완료 기준 Top5 유형 + 비율 반환
- ApiResponse 타입 준수: data/error는 null 아닌 undefined(optional) 사용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: statistics top-types 인증 제거 (메인 페이지 공개 접근 허용)
메인 페이지에서도 통계 차트가 노출되는 익명 집계 데이터이므로
세션 없이 접근 가능하도록 수정.
- getServerSession 및 관련 import 제거
- 401 인증 체크 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: statistics top-types 에러 핸들링 보완
코드래빗 피드백 반영:
- catch {} -> catch (error): 에러 정보 유실 방지
- 타임아웃 감지 후 504 분기 처리
- console.error 로깅 추가 (CLAUDE.md 11 API 오류 로그 대상)
- 세션 체크는 이전 커밋에서 이미 제거됨 (공개 엔드포인트)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor: 통계 API 카테고리 기준으로 재설계
- 결과 유형(top-types) → 작성 카테고리(ROMANCE/FAMILY/FRIEND/WORK) 기준으로 변경
- route.ts에 DB 쿼리 직접 작성, statisticsService.ts 제거
- 비율 계산은 프론트 훅(useStatistics)에서 담당
- revalidate = 86400 (하루 1회 재계산)
- src/hooks/ 폴더 신설 및 useStatistics.ts 생성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 통계 API 서버 측 세션 인증 추가
- GET /api/statistics/categories 진입 시 getServerSession으로 인증 검증
- 미인증 요청 401 UNAUTHORIZED 반환
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: jungmin park <jungxmin21@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* feat: Header variant 분리 (logo/title) 및 홈 화면 적용 (#47)
* feat: 홈 화면 기본 구조 생성 (헤더, 일기 박스)
- 헤더: 세션 유저명 + character-welcome.png 부엉이 이미지
- 일기 박스: 365x88, border black-700 2px, bg primary-100
- TODO: GangwonEduPower 폰트 추가 후 헤더 로고 텍스트 적용 필요
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: Header variant 분리 (logo/title) 및 홈 화면 적용
- Header.tsx에 variant prop 추가 (logo | title)
- logo: 좌측 상단 말해부엉 로고 표시 (66x19, h:56, padding: 16px 20px)
- title: 기존 뒤로가기 + 페이지 제목 형태 유지
- Header.module.scss에 __logo 스타일 추가
- home/page.tsx에 Header variant='logo' 적용
- 헤더를 컨테이너 padding 밖으로 분리하여 상단 여백 제거
- home/page.module.scss diaryBox에 align-self: center 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건기록 페이지 생성 및 로고 헤더 적용 (/records)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: diaryBox 고정 폭을 max-width + width 100%로 반응형 처리
- width: 365px → width: 100% + max-width: 365px
- 작은 화면에서 좌우 패딩과 결합 시 오버플로우 방지
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 감정일기 작성 버튼 /diary/new 네비게이션 연결
- 일기 박스 전체를 Link로 변경 (텍스트 + 버튼 모두 클릭 가능)
- diaryBox에 text-decoration: none, cursor: pointer 추가
- /diary/new 경로는 임시 지정 (담당자 확인 후 수정 예정)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 홈 화면 캐릭터 이미지 교체 및 위치 조정
- character-welcome.png → character-home.png 교체 (169x138)
- 캐릭터 절대 위치 적용 (top: 41px, right: -20px)
- 캐릭터가 일기 박스 뒤에 위치하도록 z-index 조정 (character: 0, container: 1)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 홈 화면 코드래빗 피드백 반영
- 캐릭터 이미지 가로 스크롤 방지: .page에 overflow-x: hidden 추가
- 비로그인 사용자 분기 처리: 말해부엉 알아보기 박스 추가 (/login 이동)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor: 홈 화면 typography 믹신 적용
- greetingText, diaryTitle, diarySubtitle에 typography 믹신 사용
- 개별 font 속성 직접 선언 → @include m.text-* 토큰으로 교체
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 비로그인 알아보기 박스 위치 수정
- 인사/일기 박스는 로그인 여부 무관하게 항상 표시
- 말해부엉 알아보기 박스를 진행중인 사건 위치(구분선 아래)로 이동
- 비로그인 인사: '안녕하세요' 표시
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 홈 화면에 통계 섹션 및 구분선 통합
- StatsCategorySection, useStatistics, QueryProvider 병합
- 고민 카테고리 TOP4 통계 섹션 추가
- 통계 섹션 하단 구분선 추가 (h:8px, black-100, gap:42px)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: 개발 편의용 로그인 상태 강제 설정 (배포 전 제거 필요)
- isLoggedIn = true 하드코딩으로 로그인 상태 유지
- TODO 주석으로 배포 전 제거 안내 표시
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건작성 페이지 구현 (disputes/[id]/statement) (#46)
* feat: 사건작성 페이지 구현 (disputes/[id]/statement)
- 사건 카테고리 선택 (연애/직장/친구/가족)
- MBTI 선택 드롭다운
- 진술 내용 입력 (최대 1000자)
- 진술저장 버튼 (내용 입력 시 활성화)
- TODO: 진술 저장 API 연결
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 사건작성 페이지 카테고리/간격/드롭다운 수정
- 카테고리를 searchParams에서 읽어 하나만 표시 (비상호작용)
- 카테고리 없을 시 모달 표시 후 이전 페이지로 이동
- Select/Textarea 사이 간격 8px (statementGroup)
- label/Select 사이 간격 16px 유지
- Textarea placeholder 줄바꿈 적용 (\n)
- content overflow-y 제거 → Select 드롭다운 아래 방향 열림 수정
- Select placeholder 색상 var(--text-secondary) 적용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카테고리 없음 모달에서 버튼 제거 — 페이지 블로킹만 유지
확인 버튼 클릭 시 이동하지 않고 Header 뒤로가기로만 탈출 가능
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카테고리 기본값 romance 적용, 모달 확인 버튼 복원
- searchParams에 카테고리 없을 시 임시로 romance 기본값 사용
- 모달 확인 버튼 클릭 시 router.back() 복원
- TODO: 이전 페이지 카테고리 데이터 연동 후 교체
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Select 커스텀 드롭다운 교체 및 Textarea focus 스타일 제거
- Select: 네이티브 select → 커스텀 드롭다운 (항상 아래 방향 열림)
- Select: placeholder 색상 --text-secondary 적용 (option 색 영향 없음)
- Select: 아이콘 회전 애니메이션 추가
- Textarea: focus 시 border-color 변경 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: Button 좌우 패딩 16 → 12으로 조정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: SCSS import 상대경로 → 절대경로(@/) 변환 및 컨벤션 문서 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Select 접근성 및 스타일 개선
- ul 기본 margin 리셋
- hasValue를 options.find 기준으로 판단 (빈 문자열 오인 방지)
- aria-invalid / aria-describedby 연결로 보조기기 지원
- 키보드 내비게이션 추가 (ArrowUp/Down, Enter/Space, Escape)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: dispute 생성 조건을 active room 전체로 완화 (ONE_TO_ONE 제한 제거)
혼자서도 판결 가능한 흐름을 지원하기 위해
room.roomMode !== 'ONE_TO_ONE' 체크를 제거하고
CLOSED/EXPIRED 방만 차단하도록 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Select id 안정화, 빈 options 가드, Tab 기본 포커스 이동 허용
- resolvedId를 label 문자열 대신 useId() 기반으로 고정
- option id를 value 대신 index 기반으로 변경
- Enter/Space 시 options 길이 가드 추가 (크래시 방지)
- Tab은 preventDefault 제거 — 닫기만 하고 포커스 이동은 브라우저에 위임
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 단독 판결 MVP 포함 및 관련 정책 업데이트 (#51)
- Section 1: 단독 판결 / 1:1 판결 흐름 분리 명시
- Section 2: 단독 판결을 MVP 포함으로 이동, MVP 제외에서 제거
- Section 3: AI 대화방 정책 수정 (ai_chat/invite_ready 상태 단독 판결 허용)
- Section 3: 단독 판결 vs 1:1 판결 제공 결과 비교 섹션 추가
- Section 14: 단독 판결 관련 STOP Condition 항목 제거
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Feature/verdict record display - 캘린더 페이지 ui 제작 (#41)
* feat : 다이어리 (감정일기 , 사건기록)탭분리
* feat : 달력 ui 커스텀 추가 및 감정일기 사건기록 분기처리
* refactor: 및 캘린더 페이지구조 개선 (리뷰 피드백 반영)
* feat : 감정일기카드 컴포넌트 구현
* fix: build 에러 ( 임시 페이지 )
* refactor: 감정일기 컴포넌트 SCSS 모듈 적용 및 믹스인 토큰 사용
* feat: 달력 페이지 UI 구현 및 스타일 정리
- MUI DateCalendar 커스텀
- 감정일기 / 사건기록 탭 전환 구조 구현
- EmotionDiaryList, RecordList 빈 상태 UI 추가
- DiaryCard mixin 적용 (text-title-s, text-body-s, text-label-s)
- 인라인 style 제거 → SCSS 모듈로 분리
- outsideCurrentMonth 감정 아이콘 노출 차단
- 새 일기 FAB 버튼 추가 (감정일기 탭 전용)
- 불필요한 파일 삭제 (DiaryMode, EmotionDiaryCard 등)
* style : EmotionDiaryList.moulde 스타일 수정
* feat: 달력 RecordList에 CaseCard 연동 및 스타일 개선
* Update model name from 'gpt-5.5' to 'gemini-2.5-flash'
seed.ts Ai modelName 수정
---------
Co-authored-by: 배근영 <bgy09270@naver.com>
* feat: 사건작성(진술서) 페이지 구현 및 욕설 감지 필터 연동 (#49)
* feat: 사건작성 페이지 구현 (disputes/[id]/statement)
- 사건 카테고리 선택 (연애/직장/친구/가족)
- MBTI 선택 드롭다운
- 진술 내용 입력 (최대 1000자)
- 진술저장 버튼 (내용 입력 시 활성화)
- TODO: 진술 저장 API 연결
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 사건작성 페이지 카테고리/간격/드롭다운 수정
- 카테고리를 searchParams에서 읽어 하나만 표시 (비상호작용)
- 카테고리 없을 시 모달 표시 후 이전 페이지로 이동
- Select/Textarea 사이 간격 8px (statementGroup)
- label/Select 사이 간격 16px 유지
- Textarea placeholder 줄바꿈 적용 (\n)
- content overflow-y 제거 → Select 드롭다운 아래 방향 열림 수정
- Select placeholder 색상 var(--text-secondary) 적용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카테고리 없음 모달에서 버튼 제거 — 페이지 블로킹만 유지
확인 버튼 클릭 시 이동하지 않고 Header 뒤로가기로만 탈출 가능
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카테고리 기본값 romance 적용, 모달 확인 버튼 복원
- searchParams에 카테고리 없을 시 임시로 romance 기본값 사용
- 모달 확인 버튼 클릭 시 router.back() 복원
- TODO: 이전 페이지 카테고리 데이터 연동 후 교체
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Select 커스텀 드롭다운 교체 및 Textarea focus 스타일 제거
- Select: 네이티브 select → 커스텀 드롭다운 (항상 아래 방향 열림)
- Select: placeholder 색상 --text-secondary 적용 (option 색 영향 없음)
- Select: 아이콘 회전 애니메이션 추가
- Textarea: focus 시 border-color 변경 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: Button 좌우 패딩 16 → 12으로 조정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: SCSS import 상대경로 → 절대경로(@/) 변환 및 컨벤션 문서 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Select 접근성 및 스타일 개선
- ul 기본 margin 리셋
- hasValue를 options.find 기준으로 판단 (빈 문자열 오인 방지)
- aria-invalid / aria-describedby 연결로 보조기기 지원
- 키보드 내비게이션 추가 (ArrowUp/Down, Enter/Space, Escape)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: dispute 생성 조건을 active room 전체로 완화 (ONE_TO_ONE 제한 제거)
혼자서도 판결 가능한 흐름을 지원하기 위해
room.roomMode !== 'ONE_TO_ONE' 체크를 제거하고
CLOSED/EXPIRED 방만 차단하도록 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Selec…
fix(user): 프로필 수정 기능 개선 — 이미지 업로드 통합 및 닉네임 우선 표시 PATCH /api/user/me에 프로필 이미지 업로드 로직을 통합하여 프로필 수정 페이지에서 사진 변경이 실제로 반영되도록 수정한다. 닉네임 표시 우선순위를 nickname > name으로 변경하여 사용자가 수정한 닉네임이 카카오 실명보다 우선 표시되도록 한다. - PATCH /api/user/me에 Supabase Storage 이미지 업로드 통합 - 표시 우선순위 변경: name ?? nickname → nickname ?? name (마이페이지, 프로필 수정, 탈퇴, 홈 인사말, 챗봇) - 최초 카카오 로그인 시 nickname에 카카오 이름 저장 - 프로필 수정 페이지 라벨 "이름" → "닉네임" 변경 @ Co-authored-by: Claude <noreply@anthropic.com>
* feat: 404/500/global 에러 페이지 디자인 구현
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 에러 페이지 img -> next/image 교체 및 eslint 경고 수정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 에러 페이지 뒤로가기 히스토리 없을 시 홈 이동 폴백 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 갈등 유형 공유 링크 비로그인 접근 시 공유자 이름 표시
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 갈등 유형 공유 페이지 커스텀 헤더 -> 공통 Header 컴포넌트로 교체
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 유형 탭 하단 과도한 여백 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 유형 탭 contentType 조건 누락 수정 및 공유 텍스트 개선
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: kakaoShare window 가드 및 키 유효성 검사 추가, disputeId 인코딩
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 이미지 저장 방식을 navigator.share(files)로 변경하여 갤러리 직접 저장 지원
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: .gitignore에서 TROUBLESHOOTING.md 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 이미지 공유 취소(AbortError) 처리 및 res.ok 검사 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: OG 메타태그 head 주입 및 이미지 다운로드 개선
- RootLayout async 제거, SessionBridge로 분리하여 metadata streaming 문제 해결
- layout.tsx openGraph 이미지 URL 절대경로로 수정
- disputes/[id]/type/page.tsx OG fallback URL 절대경로로 수정
- JudgmentTypeResult 다운로드 버튼 anchor download 방식으로 통일
- kakaoShare.ts 미사용 파일 삭제
- invite/route.ts NEXT_PUBLIC_APP_URL → NEXT_PUBLIC_BASE_URL 교체
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 사건 기록 에러 메시지 마침표 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: trigger redeploy
* chore: trigger redeploy
* fix: 프로덕션 ENV 누락 시 초대 링크 오류 및 OG 이미지 URL 하드코딩 제거
- invite/route.ts: NEXT_PUBLIC_BASE_URL 누락 시 프로덕션에서 CONFIG_ERROR 500 반환
- invite/route.ts: template literal → new URL()로 URL 조합 안전성 개선
- layout.tsx: OG 이미지 URL 하드코딩 제거, NEXT_PUBLIC_BASE_URL 기반으로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: NEXT_PUBLIC_BASE_URL을 NEXT_PUBLIC_APP_URL로 통일
- layout.tsx, invite/route.ts, type/page.tsx 모두 NEXT_PUBLIC_APP_URL로 일관 적용
- type/page.tsx 하드코딩된 OG 이미지 URL 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: OG 메타태그 head 주입 및 NEXT_PUBLIC_APP_URL 통일
- layout.tsx: metadataBase 복원, NEXT_PUBLIC_APP_URL 적용, SessionBridge 분리로 metadata streaming 수정
- type/page.tsx: NEXT_PUBLIC_BASE_URL → NEXT_PUBLIC_APP_URL 통일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: type/page.tsx ownerName 쿼리 누락 수정
dev 복원 과정에서 participants 쿼리와 ownerName 반환값이 빠진 것 수정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: OG description 문구 및 에러 메시지 마침표 수정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 이미지 저장 파일명 한글 제거, 고정 영문으로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 이미지 다운로드 서버 프록시 API 추가 및 공유 기능 개선
- /api/download 프록시 엔드포인트 추가 (CORS 우회, 자동 다운로드)
- handleDownload: 직접 Supabase URL 대신 /api/download 프록시 경유
- handleShare: 767px 이상에서 링크 복사 + 토스트 메시지
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 이미지 다운로드 프록시 API 강화 및 Apple 공유 경로 통일
- download/route.ts: 전체 로직 try-catch로 감싸기
- download/route.ts: 업스트림 Content-Type 검증 추가 (JPEG 아닌 경우 415 반환)
- JudgmentTypeResult: handleAppleShareSave도 /api/download 프록시 경유로 통일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 이미지 다운로드 프록시 호스트 검증 및 Content-Type 조건 완화
- 호스트 검증: SUPABASE_URL 고정 비교 → *.supabase.co 패턴으로 변경 (Storage URL 호스트 불일치 해결)
- Content-Type 검증: image/jpeg 전용 → image/* 전체 허용 (WebP 등 대응)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 공유 링크 페이지 이미지 저장 기기 분기 및 프록시 경유 수정
- Supabase URL 직접 fetch → /api/download 프록시 경유로 변경 (CORS 해결)
- isAppleDevice UserAgent 감지 추가
- Apple: navigator.share({ files }) → 공유 시트 → 사진에 저장
- 비Apple: a download → 공유 시트 없이 바로 저장
- 파일명 한글 제거, 고정 영문(talkyowl-conflict-type.jpg)으로 통일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: juahcheon <132863519+juahcheon@users.noreply.github.com>
* Update README.md
* fix: update README to match project (말해부엉) (#17)
* [Release] 초기 세팅 및 문서화 dev → main (#19)
* chore: initialize project folder structure (#1)
* chore: initialize project folder structure
- Add base directory layout for Next.js + domain-driven architecture
- Add .gitkeep to track empty directories in git
- Exclude MVP out-of-scope domains (shop, points, user-items)
- No implementation files included, structure only
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Update README.md
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add CLAUDE.md with project rules and work guidelines (#2)
- Add project overview and MVP scope definition
- Add fixed product rules (categories, AI chat policy, judgement output)
- Add architecture, domain scope, and state transition rules
- Add auth/security, DB, frontend state, API, logging rules
- Add Git workflow, Claude work process, STOP conditions
- Add approval-required list and required reference documents
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: setup project config and install dependencies (#3)
- Add package.json with Next.js 15, React 19, TypeScript stack
- Add next.config.ts (minimal Next.js 15 config)
- Add tsconfig.json (strict mode, @/* path alias)
- Add eslint.config.mjs (next/core-web-vitals + next/typescript)
- Add .prettierrc and .prettierignore
- Add .gitignore (node_modules, .next, .env.local, etc.)
- Add .env.example (key names only, no real values)
- Add prisma/schema.prisma (generator + datasource only)
- Add data/mock/db.json (health check stub for json-server)
- Add docs/TECH_STACK.md (package list and selection rationale)
- Update README.md with run commands and env guide
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add base documentation structure (#4)
- Add PROJECT_DECISIONS.md (MVP scope, architecture, security principles)
- Add guides/CLAUDE_WORKFLOW.md (work process, STOP conditions, approval rules)
- Add guides/GIT_WORKFLOW.md (branch naming, commit convention, workflow)
- Add guides/PR_RULES.md (PR target, title rules, review criteria)
- Add guides/ENV_GUIDE.md (Vercel env pull, .env.example management)
- Add guides/CODING_CONVENTION.md (naming, state management, folder rules)
- Add db/STATUS_TRANSITION.md (room_mode, dispute_status transitions)
- Add db/PRISMA_MAPPING.md (snake_case/camelCase mapping rules)
- Add db/MASTER_DATA.md (categories, result types, DB master principles)
- Add domains/README.md (domain list, MVP scope, writing guidelines)
- Add domains/_DOMAIN_TEMPLATE.md (template for domain docs)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add domain document drafts for all MVP domains (#5)
- Add AUTH.md (kakao login, terms, session management)
- Add COMMON.md (error handling, logging, common response)
- Add ROOM.md (AI chat room, invite link, room_mode transitions)
- Add PERSONAL_ANALYSIS.md (AI-based personal conflict analysis)
- Add DISPUTE.md (1:1 mediation, roles, statements, dispute_status)
- Add JUDGEMENT.md (AI judgement, Gemini API, result card)
- Add GIFT.md (gift recommendation after judgement)
- Add USER.md (mypage, profile, bottom tab)
- Add CALENDAR.md (date-based record marking, monthly summary)
- Add DIARY.md (emotion diary, author-only access, content protection)
- Add STATISTICS.md (anonymous aggregation, summary components)
- Add SHOP_FUTURE.md (v2.0 planned, MVP excluded)
- Add POINTS_FUTURE.md (v2.0 planned, MVP excluded)
- Add USER_ITEMS_FUTURE.md (v2.0 planned, MVP excluded)
All documents are draft templates with TODO markers for assignees.
No implementation, no API routes, no schema changes.
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: add Next.js App Router entry files and SCSS base structure (#6)
- Add src/app/layout.tsx (root layout with metadata and globals.scss import)
- Add src/app/page.tsx (minimal root page for build verification)
- Add src/app/globals.scss (imports src/styles/main.scss)
- Add src/app/error.tsx (minimal error boundary with reset)
- Add src/app/not-found.tsx (minimal 404 page)
- Add src/app/loading.tsx (minimal loading page)
- Add src/styles/main.scss (ordered SCSS entry point)
- Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens)
- Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints)
- Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset)
- Add src/styles/base/_global.scss (body font, background, color defaults)
- Add src/styles/layout/_page.scss (placeholder for page layout)
Verified: type-check, lint, build all pass
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Infra/init next setup (#7)
* infra: add Next.js App Router entry files and SCSS base structure
- Add src/app/layout.tsx (root layout with metadata and globals.scss import)
- Add src/app/page.tsx (minimal root page for build verification)
- Add src/app/globals.scss (imports src/styles/main.scss)
- Add src/app/error.tsx (minimal error boundary with reset)
- Add src/app/not-found.tsx (minimal 404 page)
- Add src/app/loading.tsx (minimal loading page)
- Add src/styles/main.scss (ordered SCSS entry point)
- Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens)
- Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints)
- Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset)
- Add src/styles/base/_global.scss (body font, background, color defaults)
- Add src/styles/layout/_page.scss (placeholder for page layout)
Verified: type-check, lint, build all pass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: resolve ESLint and TypeScript config warnings
- eslint.config.mjs: ignore next-env.d.ts and .next/** (auto-generated by Next.js, triple-slash reference false positive)
- tsconfig.json: remove deprecated baseUrl option (TypeScript 5.x+, paths works without baseUrl)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Update README.md (#8)
* docs(infra): confirm Supabase as project infrastructure (#9)
* chore(github): add collaboration templates and policy (#10)
* docs(env): document environment variable management (#11)
* docs(calendar): confirm MUI date picker usage (#12)
달력 UI 라이브러리로 MUI X Date Pickers + Day.js 사용을 확정하고
관련 문서(TECH_STACK, PROJECT_DECISIONS, CODING_CONVENTION, CALENDAR, DIARY, CLAUDE.md)에 반영한다.
* chore(deps): install MUI X Date Pickers and peer dependencies (#13)
달력 UI 구현을 위해 MUI X Date Pickers 및 필수 peer dependency를 설치한다.
@mui/material@9.1.1, @emotion/react@11.14.0, @emotion/styled@11.14.1,
@mui/x-date-pickers@9.5.0, dayjs@1.11.21
* Update README.md (#15)
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: dev → main 프로덕션 배포 병합 (#112)
* chore: initialize project folder structure (#1)
* chore: initialize project folder structure
- Add base directory layout for Next.js + domain-driven architecture
- Add .gitkeep to track empty directories in git
- Exclude MVP out-of-scope domains (shop, points, user-items)
- No implementation files included, structure only
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Update README.md
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add CLAUDE.md with project rules and work guidelines (#2)
- Add project overview and MVP scope definition
- Add fixed product rules (categories, AI chat policy, judgement output)
- Add architecture, domain scope, and state transition rules
- Add auth/security, DB, frontend state, API, logging rules
- Add Git workflow, Claude work process, STOP conditions
- Add approval-required list and required reference documents
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: setup project config and install dependencies (#3)
- Add package.json with Next.js 15, React 19, TypeScript stack
- Add next.config.ts (minimal Next.js 15 config)
- Add tsconfig.json (strict mode, @/* path alias)
- Add eslint.config.mjs (next/core-web-vitals + next/typescript)
- Add .prettierrc and .prettierignore
- Add .gitignore (node_modules, .next, .env.local, etc.)
- Add .env.example (key names only, no real values)
- Add prisma/schema.prisma (generator + datasource only)
- Add data/mock/db.json (health check stub for json-server)
- Add docs/TECH_STACK.md (package list and selection rationale)
- Update README.md with run commands and env guide
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add base documentation structure (#4)
- Add PROJECT_DECISIONS.md (MVP scope, architecture, security principles)
- Add guides/CLAUDE_WORKFLOW.md (work process, STOP conditions, approval rules)
- Add guides/GIT_WORKFLOW.md (branch naming, commit convention, workflow)
- Add guides/PR_RULES.md (PR target, title rules, review criteria)
- Add guides/ENV_GUIDE.md (Vercel env pull, .env.example management)
- Add guides/CODING_CONVENTION.md (naming, state management, folder rules)
- Add db/STATUS_TRANSITION.md (room_mode, dispute_status transitions)
- Add db/PRISMA_MAPPING.md (snake_case/camelCase mapping rules)
- Add db/MASTER_DATA.md (categories, result types, DB master principles)
- Add domains/README.md (domain list, MVP scope, writing guidelines)
- Add domains/_DOMAIN_TEMPLATE.md (template for domain docs)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: add domain document drafts for all MVP domains (#5)
- Add AUTH.md (kakao login, terms, session management)
- Add COMMON.md (error handling, logging, common response)
- Add ROOM.md (AI chat room, invite link, room_mode transitions)
- Add PERSONAL_ANALYSIS.md (AI-based personal conflict analysis)
- Add DISPUTE.md (1:1 mediation, roles, statements, dispute_status)
- Add JUDGEMENT.md (AI judgement, Gemini API, result card)
- Add GIFT.md (gift recommendation after judgement)
- Add USER.md (mypage, profile, bottom tab)
- Add CALENDAR.md (date-based record marking, monthly summary)
- Add DIARY.md (emotion diary, author-only access, content protection)
- Add STATISTICS.md (anonymous aggregation, summary components)
- Add SHOP_FUTURE.md (v2.0 planned, MVP excluded)
- Add POINTS_FUTURE.md (v2.0 planned, MVP excluded)
- Add USER_ITEMS_FUTURE.md (v2.0 planned, MVP excluded)
All documents are draft templates with TODO markers for assignees.
No implementation, no API routes, no schema changes.
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: add Next.js App Router entry files and SCSS base structure (#6)
- Add src/app/layout.tsx (root layout with metadata and globals.scss import)
- Add src/app/page.tsx (minimal root page for build verification)
- Add src/app/globals.scss (imports src/styles/main.scss)
- Add src/app/error.tsx (minimal error boundary with reset)
- Add src/app/not-found.tsx (minimal 404 page)
- Add src/app/loading.tsx (minimal loading page)
- Add src/styles/main.scss (ordered SCSS entry point)
- Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens)
- Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints)
- Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset)
- Add src/styles/base/_global.scss (body font, background, color defaults)
- Add src/styles/layout/_page.scss (placeholder for page layout)
Verified: type-check, lint, build all pass
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Infra/init next setup (#7)
* infra: add Next.js App Router entry files and SCSS base structure
- Add src/app/layout.tsx (root layout with metadata and globals.scss import)
- Add src/app/page.tsx (minimal root page for build verification)
- Add src/app/globals.scss (imports src/styles/main.scss)
- Add src/app/error.tsx (minimal error boundary with reset)
- Add src/app/not-found.tsx (minimal 404 page)
- Add src/app/loading.tsx (minimal loading page)
- Add src/styles/main.scss (ordered SCSS entry point)
- Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens)
- Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints)
- Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset)
- Add src/styles/base/_global.scss (body font, background, color defaults)
- Add src/styles/layout/_page.scss (placeholder for page layout)
Verified: type-check, lint, build all pass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: resolve ESLint and TypeScript config warnings
- eslint.config.mjs: ignore next-env.d.ts and .next/** (auto-generated by Next.js, triple-slash reference false positive)
- tsconfig.json: remove deprecated baseUrl option (TypeScript 5.x+, paths works without baseUrl)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Update README.md (#8)
* docs(infra): confirm Supabase as project infrastructure (#9)
* chore(github): add collaboration templates and policy (#10)
* docs(env): document environment variable management (#11)
* docs(calendar): confirm MUI date picker usage (#12)
달력 UI 라이브러리로 MUI X Date Pickers + Day.js 사용을 확정하고
관련 문서(TECH_STACK, PROJECT_DECISIONS, CODING_CONVENTION, CALENDAR, DIARY, CLAUDE.md)에 반영한다.
* chore(deps): install MUI X Date Pickers and peer dependencies (#13)
달력 UI 구현을 위해 MUI X Date Pickers 및 필수 peer dependency를 설치한다.
@mui/material@9.1.1, @emotion/react@11.14.0, @emotion/styled@11.14.1,
@mui/x-date-pickers@9.5.0, dayjs@1.11.21
* Update README.md (#15)
* fix: resolve ESLint and TypeScript config warnings (#20)
* infra: add Next.js App Router entry files and SCSS base structure
- Add src/app/layout.tsx (root layout with metadata and globals.scss import)
- Add src/app/page.tsx (minimal root page for build verification)
- Add src/app/globals.scss (imports src/styles/main.scss)
- Add src/app/error.tsx (minimal error boundary with reset)
- Add src/app/not-found.tsx (minimal 404 page)
- Add src/app/loading.tsx (minimal loading page)
- Add src/styles/main.scss (ordered SCSS entry point)
- Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens)
- Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints)
- Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset)
- Add src/styles/base/_global.scss (body font, background, color defaults)
- Add src/styles/layout/_page.scss (placeholder for page layout)
Verified: type-check, lint, build all pass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: resolve ESLint and TypeScript config warnings
- eslint.config.mjs: ignore next-env.d.ts and .next/** (auto-generated by Next.js, triple-slash reference false positive)
- tsconfig.json: remove deprecated baseUrl option (TypeScript 5.x+, paths works without baseUrl)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: add MVP Prisma schema with NextAuth and TALKY-OWL models (#21)
- datasource: add directUrl for Supabase connection pooler support
- enums: CategoryGroup, RoomMode, DisputeStatus, ParticipantRole, etc.
- NextAuth models: User (with TALKY-OWL fields), Account, Session, VerificationToken
- core models: DisputeRoom, RoomAiConversation, RoomAiMessage
- dispute models: Dispute, DisputeParticipant, DisputeStatement
- judgment models: AiJudgment, JudgmentResultCard
- gift models: GiftRecommendation, GiftRecommendationItem
- feature models: EmotionDiary, CalendarRecord
- master data: ConflictTypeGroup, ConflictTypeDetail (DB-based, no enum hardcoding)
- log models: AuditLog, ApiErrorLog, ModerationLog, RoomAccessLog, UserDeletionLog
- .env.example: add DIRECT_URL for Supabase directUrl
- v2.0 TODO: ShopItem, PointTransaction, UserItem, DisputeStatistic excluded
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: align project structure with guide v2 (#22)
folders added:
- src/components/{personal-analysis,room,dispute,judgement,calendar,diary,statistics,gift}
- src/app/api/auth/[...nextauth]
- src/app/api/v1/{users,personal-analyses,rooms,disputes,statements,calendar,diary,statistics,cron}
files added:
- prisma/seed.ts (placeholder for ConflictTypeGroup master data)
docs updated (minimal):
- docs/domains/COMMON.md: add log table list, judgement_logs TODO note
- docs/domains/JUDGEMENT.md: clarify Storage is MVP-excluded scaffolding
- docs/guides/ENV_GUIDE.md: clarify Supabase Storage vars are MVP-excluded
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: rename src/app/page to src/app/(page) for correct Next.js route group (#23)
src/app/page/ (괄호 없음)는 /page/* URL segment를 생성하므로,
Next.js App Router route group 문법인 src/app/(page)/로 변경한다.
URL은 /landing, /home 등으로 노출되어야 하며 /page/... 가 아니다.
관련 문서 내 경로 참조도 모두 업데이트 (CLAUDE.md, docs/domains/*, docs/guides/*).
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* [Style] 디자인 토큰 및 전역 스타일 설정 (#25)
* feat(styles): 디자인 토큰 및 전역 스타일 설정
- _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가
- _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m)
- _global.scss body 폰트 Pretendard 적용
- next/font/local로 PretendardVariable 폰트 로드 (layout.tsx)
- GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 커밋 타입 style 추가 및 scope 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 컨테이너 max-width 1000px 설정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 개발 확인용 임시 border 색상 회색으로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: container min-height 100vh 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 커밋 타입 style 추가 및 scope 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 디자인 시스템 기반 설정 (#27)
* feat(styles): 디자인 토큰 및 전역 스타일 설정
- _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가
- _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m)
- _global.scss body 폰트 Pretendard 적용
- next/font/local로 PretendardVariable 폰트 로드 (layout.tsx)
- GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 커밋 타입 style 추가 및 scope 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 컨테이너 max-width 1000px 설정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 개발 확인용 임시 border 색상 회색으로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: container min-height 100vh 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 커밋 타입 style 추가 및 scope 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: rem 스케일 토큰 추가 및 타이포그래피 변수 rem 참조로 전환
- Rem scale 섹션 추가 (0.25rem ~ 30rem)
- 폰트 토큰에서 누락된 0.875rem(14px), 1.125rem(18px) 추가
- font-size, line-height 변수를 rem 스케일 변수 참조로 전환
- rem 스케일을 typography 섹션보다 상단으로 이동 (선언 순서)
- 컴포넌트 width/height 대응을 위해 큰 단위(9rem~30rem) 포함
Co-Authored-By: Claude <noreply@anthropic.com>
* style: r() 함수 분리 및 타이포그래피 변수 함수 기반으로 전환
- _functions.scss 신규 추가 — px → rem 변환 함수 r() 단독 관리
- _variables.scss에서 rem 스케일 변수 제거, fn.r() 참조로 전환
- _mixins.scss에 functions @use 추가
- 순환 참조 없이 variables → functions → (없음) 단방향 의존성 구성
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Feature/common component jw (#28)
* feat(common): add Button, Toast, Header, BottomNavigation components
- Button: primary / outline / disabled variants, design token 기반
- Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용
- Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering
- BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘
- toastStore: Zustand UI 상태 (show/hide/message)
* docs: update collaboration policy
- GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리)
- Issues / Milestones / Project Board 미사용으로 관련 내용 제거
- GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거
- PR_RULES PR 본문에서 관련 Issue 항목 제거
* fix: :root {} 시맨틱 토큰을 _global.scss로 분리 (#29)
* feat(styles): 디자인 토큰 및 전역 스타일 설정
- _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가
- _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m)
- _global.scss body 폰트 Pretendard 적용
- next/font/local로 PretendardVariable 폰트 로드 (layout.tsx)
- GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 커밋 타입 style 추가 및 scope 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 컨테이너 max-width 1000px 설정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: 개발 확인용 임시 border 색상 회색으로 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: container min-height 100vh 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 커밋 타입 style 추가 및 scope 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: rem 스케일 토큰 추가 및 타이포그래피 변수 rem 참조로 전환
- Rem scale 섹션 추가 (0.25rem ~ 30rem)
- 폰트 토큰에서 누락된 0.875rem(14px), 1.125rem(18px) 추가
- font-size, line-height 변수를 rem 스케일 변수 참조로 전환
- rem 스케일을 typography 섹션보다 상단으로 이동 (선언 순서)
- 컴포넌트 width/height 대응을 위해 큰 단위(9rem~30rem) 포함
Co-Authored-By: Claude <noreply@anthropic.com>
* style: r() 함수 분리 및 타이포그래피 변수 함수 기반으로 전환
- _functions.scss 신규 추가 — px → rem 변환 함수 r() 단독 관리
- _variables.scss에서 rem 스케일 변수 제거, fn.r() 참조로 전환
- _mixins.scss에 functions @use 추가
- 순환 참조 없이 variables → functions → (없음) 단방향 의존성 구성
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: :root {} 시맨틱 토큰을 _global.scss로 분리
_variables.scss에 :root {}가 있으면 module.scss에서 @use 시
CSS Modules 'not pure' 에러 발생.
SCSS 변수는 _variables.scss, CSS 출력은 _global.scss로 분리.
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): 공통 UI 컴포넌트 추가 및 MUI 정책 적용 (#30)
* feat(common): add Button, Toast, Header, BottomNavigation components
- Button: primary / outline / disabled variants, design token 기반
- Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용
- Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering
- BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘
- toastStore: Zustand UI 상태 (show/hide/message)
* docs: update collaboration policy
- GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리)
- Issues / Milestones / Project Board 미사용으로 관련 내용 제거
- GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거
- PR_RULES PR 본문에서 관련 Issue 항목 제거
* feat(common): add Tabs, CaseCard, ActionPrompt, Input, Select, Textarea components
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): apply MUI icons and Snackbar, update MUI usage policy
- Toast: MUI Snackbar (3s auto-dismiss)
- BottomNavigation, Header, Select: lucide-react → @mui/icons-material
- Install @mui/icons-material
- CLAUDE.md, CODING_CONVENTION.md: MUI usage policy updated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: update icon policy — @mui/icons-material except diary feature
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건 목록 공통 UI 컴포넌트 추가 (Tab, StatusBadge) (#31)
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건 관련 페이지의 진행 상태 컴포넌트
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정
---------
Co-authored-by: jungmin park <jungxmin21@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(common): ActionPrompt message 제거 및 Textarea 글자수 카운터 위치 수정 (#32)
* feat(common): add Button, Toast, Header, BottomNavigation components
- Button: primary / outline / disabled variants, design token 기반
- Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용
- Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering
- BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘
- toastStore: Zustand UI 상태 (show/hide/message)
* docs: update collaboration policy
- GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리)
- Issues / Milestones / Project Board 미사용으로 관련 내용 제거
- GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거
- PR_RULES PR 본문에서 관련 Issue 항목 제거
* feat(common): add Tabs, CaseCard, ActionPrompt, Input, Select, Textarea components
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): apply MUI icons and Snackbar, update MUI usage policy
- Toast: MUI Snackbar (3s auto-dismiss)
- BottomNavigation, Header, Select: lucide-react → @mui/icons-material
- Install @mui/icons-material
- CLAUDE.md, CODING_CONVENTION.md: MUI usage policy updated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: update icon policy — @mui/icons-material except diary feature
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(common): ActionPrompt message 제거 및 Textarea 글자수 카운터 absolute 배치
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 공통 및 dispute·judgment DTO 타입 정의
- ApiResponse, ApiError, ApiFieldError, CategoryGroup (common.ts)
- DisputeDto, CreateDisputeRequest, DisputeListResponse 등 (dispute.ts)
- AiJudgmentDto, CreateAiJudgmentRequest 등 (judgment.ts)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: dispute 도메인 공유 상수·헬퍼·mapper 추가
- VALID_CATEGORY_GROUPS, IMMUTABLE_DISPUTE_STATUSES 상수 (constants/dispute.ts)
- getSessionUserId NextAuth 세션 헬퍼 (auth/session.ts)
- toAiJudgmentDto 공유 mapper (judgement/judgment.mapper.ts)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건 목록 조회·생성·수정·삭제 API 구현
- GET /api/v1/disputes — 참여 사건 목록, categoryGroup 필터, 페이지네이션
- POST /api/v1/disputes — 사건 생성 + role_a 참여자 트랜잭션 등록
- GET /api/v1/disputes/:id — 사건 상세 조회
- PATCH /api/v1/disputes/:id — 사건 수정 (role_a 전용, 변경 불가 상태 차단)
- DELETE /api/v1/disputes/:id — 사건 소프트 삭제
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: AI 판결 요청·결과 조회 API 구현
- POST /api/v1/disputes/:id/judge — AI 판결 요청, JUDGING 상태 잠금으로 멱등성 보장
- GET /api/v1/disputes/:id/result — 판결 결과 조회 (참여자 전용)
- AI 모듈 미구현 구간은 TODO 주석으로 마킹, 완료 전까지 503 반환
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 공통 UI 컴포넌트 - StatusBadge, Tab, 진행 상태 (#33)
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건 관련 페이지의 진행 상태 컴포넌트
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정
* fix: StatusBadge 크기 조정 및 .playwright-mcp gitignore 추가
- StatusBadge min-width, height, padding, border-radius 수정
- justify-content: center 추가
- .playwright-mcp/ gitignore 등록
- package-lock.json peer dependency 재분류 반영
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: jungmin park <jungxmin21@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: Prisma 클라이언트, NextAuth Kakao OAuth 설정 및 핸들러 추가
- src/lib/db/index.ts — Prisma 전역 싱글턴
- src/lib/auth/index.ts — NextAuth authOptions (Kakao OAuth, session user.id 매핑)
- src/app/api/auth/[...nextauth]/route.ts — NextAuth GET/POST 핸들러
- @mui/icons-material 패키지 설치 (빌드 에러 해결)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: 빌드 스크립트에 prisma generate 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: MVP 전체 API 명세서 작성 (API_SPEC.md) (#36)
* docs: MVP 전체 API 명세서 작성 (API_SPEC.md)
- 도메인 문서 및 기존 합의 기반 MVP API 명세 초안 작성
- 공통 응답 구조, 에러 코드 체계 정의
- Auth / User / Room / Dispute / Statement / Judgement / Diary / Calendar / Statistics / Gift / Cron 도메인 API 명세 포함
- 경로 충돌 항목 (withdraw, judge/result, diary 경로) 확정 필요 사항으로 명시
- 미확정 TODO 항목 섹션 7에 전체 정리
- MVP 제외 항목 (shop, points, 단독판결, 독립 통계 화면 등) 명시적으로 제거 처리
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 단독 판결 MVP 포함 반영 및 라우트 주석 명확화
- 단독 판결(상대방 없는 AI 판결)을 MVP 포함 범위로 변경
- Personal Analysis 섹션에 단독 판결 API 초안 추가 (POST/GET /api/v1/personal-analyses)
- 라우트 트리 personal-analyses 디렉터리 구조 구체화
- /auth/withdraw route.ts 주석을 경로 충돌 상호 참조가 명확한 형태로 수정
(경로 충돌 → /auth/withdraw vs DELETE /users/me)
- MVP 제외 목록에서 단독 판결 항목 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 카카오 로그인 시 약관 동의 자동 간주 정책 반영
- 카카오 OAuth 로그인 완료를 약관 동의로 간주
- 별도 약관 동의 페이지 이동 플로우 제거
- 확정 필요 항목에서 약관 동의 기준 항목 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 도메인 API 목록 중복 제거 및 회원탈퇴 경로 확정
- docs/domains/*.md 8개 파일의 API 목록 섹션을 docs/API_SPEC.md 참조로 교체
(AUTH, USER, ROOM, DISPUTE, JUDGEMENT, DIARY, CALENDAR, STATISTICS)
- API_SPEC.md 단일 소스 체계 확립
- 회원탈퇴 경로 DELETE /api/v1/users/me 채택 확정
- §3 요약표, §4.1·§4.2 상세, §5 라우트 트리, §6 충돌 목록, §7 체크리스트 반영
- /auth/withdraw 라우트 제거, /users/me route.ts에 DELETE 추가
- CLAUDE_WORKFLOW.md PR 템플릿 준수 문구 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 날짜 포맷 및 Pagination 구조 확정 반영
- 날짜/시간 포맷 ISO 8601 (YYYY-MM-DDTHH:mm:ssZ) 확정
- Pagination 공통 구조 확정
- data 필드: items 배열
- page 필드: page / totalPages / sortBy / isNext
- 섹션 7 확정 필요 항목 두 개 체크 처리
- Room 목록, Diary 목록 섹션 Pagination 참조로 갱신
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: Pagination 구조에 size / sort / hasNext / hasPrevious 추가
- size: 한 번에 가져오는 항목 수
- sort: 정렬 방향 (asc | desc)
- isNext → hasNext로 변경 (다음 페이지 존재 여부)
- hasPrevious 추가 (이전 페이지 존재 여부)
- §7 체크리스트 항목 갱신
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 날짜 포맷 코드블록 언어 지정자 추가 (MD040)
코드래빗 지적 사항 반영 — 언어 미지정 펜스 코드블록에 text 지정자 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 통계 API 비로그인 공개 조회로 변경
홈 화면 진입 시 비로그인 회원도 통계 조회 가능하도록 수정
- GET /api/v1/statistics/summary: 🔒 → 공개
- GET /api/v1/statistics/top-types: 🔒 → 공개
- §3 요약표, §4.9 상세 명세 인증 표기 및 설명 반영
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 목록 응답 예시에 page 객체 추가 (코드래빗 지적 반영)
- GET /api/v1/rooms 응답 예시에 page 객체 추가
- GET /api/v1/diary 응답 예시에 page 객체 추가
- GET /api/v1/statistics/top-types 응답 예시에 page 객체 추가
(Top5 고정 목록 특성 반영: size=5, totalPages=1, hasNext=false)
- 코드래빗 제안의 구버전 필드(isNext) 대신 확정 구조(hasNext/hasPrevious/size/sort) 적용
- §7 Room Pagination 항목 체크 처리
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: Spinner, Avatar, AvatarGroup 공통 컴포넌트 추가 (#37)
* chore: 정적 이미지 에셋 추가 및 정리
주요 페이지용 캐릭터 이미지 추가 및 공통 에셋 정리.
gift, loading 캐릭터를 common에서 characters로 이동하여
캐릭터 이미지를 한 폴더로 통합.
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: Spinner 공통 컴포넌트 추가
캐릭터 로딩 이미지를 중앙에 배치한 88x88 스피너 컴포넌트 추가.
트랙(배경 원)과 애니메이션 링을 분리하여 각각 border-default, bg-brand 색상 적용.
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: Avatar, AvatarGroup 공통 컴포넌트 추가
MUI Avatar, AvatarGroup 래핑 컴포넌트 추가.
size prop으로 s/m/l 사이즈 조절, src prop으로 프로필 사진 지원.
global.scss에 --color-white, --color-black CSS 변수 추가.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: Avatar Context로 AvatarGroup size 전달 및 토큰 수정
AvatarGroup size prop이 자식 Avatar에 적용 안 되는 버그 수정.
Context를 통해 size를 내려주고 Avatar가 그룹 size를 우선 적용.
color 토큰 --color-white를 --text-inverse로 교체.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: Avatar src 없을 때 기본 썸네일 이미지로 fallback 처리
Co-Authored-By: Claude <noreply@anthropic.com>
* test: Spinner, Avatar, AvatarGroup 테스트 페이지 추가
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* feat: 공통 UI 컴포넌트 - CategoryFilter, CategoryIcon, Tab, StatusBadge (#38)
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건 관련 페이지의 진행 상태 컴포넌트
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정
* fix: StatusBadge 크기 조정 및 .playwright-mcp gitignore 추가
- StatusBadge min-width, height, padding, border-radius 수정
- justify-content: center 추가
- .playwright-mcp/ gitignore 등록
- package-lock.json peer dependency 재분류 반영
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: CategoryFilter 공통 컴포넌트 생성
- 전체/연애/직장/친구/가족 카테고리 필터 구현
- 아이콘 박스 44x44, border-radius 8, 아이콘 24x24
- 선택 상태: icon-primary bg / 미선택: bg-disabled
- MUI icons 사용 (GridViewRounded, Favorite, BusinessCenter, Diversity3, FamilyRestroom)
- Category 타입 export
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Tab 라벨 폰트 스타일 명시
- item.label을 span.label로 래핑
- Body-M 기준 font-size 16, line-height 28 적용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: @mui/icons-material 패키지 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: CategoryFilter 스타일 및 single 모드 적용
- 선택: bg-page + border-brand(1px) + icon-primary + 텍스트 bold
- 미선택: bg-page + border-default(1px) + icon-secondary + 텍스트 regular
- mode prop 추가 (filter 기본값 / single: 선택된 박스 하나만 표시)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카테고리 타입을 DB CategoryGroup 기준으로 통일
## 수정 배경
CategoryIcon, CategoryFilter가 한국어 문자열('연애', '직장' 등)을 타입으로 사용하고 있어
API/DB의 CategoryGroup('romance', 'work' 등)과 불일치가 발생.
페이지에서 연결 시 별도 변환 레이어가 필요해지는 문제를 사전 차단.
## 변경 파일별 수정 내용
### CategoryIcon.tsx
- CategoryWithoutAll 타입 제거 → @/types/common의 CategoryGroup 직접 사용
- 아이콘/레이블/컬러 맵 키를 한국어 → 영문 DB 값으로 변경
(romance, work, friend, family)
- CATEGORY_LABEL_MAP export 추가 (CategoryFilter에서 레이블 참조용)
### CategoryFilter.tsx
- Category 타입을 'all' | CategoryGroup으로 변경 (기존: 한국어 문자열)
- CATEGORIES 배열에 label 필드 추가, CATEGORY_LABEL_MAP에서 참조
- 전체 키를 '전체' → 'all'로 변경 (API 필터 미적용 값과 일치)
### CaseCard.tsx (타팀원 파일 수정)
- 수정 이유: CATEGORY_EMOJI 맵 키가 대문자('ROMANCE')였으나
API 응답은 소문자('romance')로 내려와 emoji가 항상 '📋' fallback만 표시되는 버그 존재
- 해결 방법: emoji 방식 전체 제거, CategoryIcon 컴포넌트로 교체
- categoryGroup prop 타입을 string → CategoryGroup으로 명시
- categoryGroup 미전달 시 아이콘 미표시 처리 (optional 유지)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Update src/components/ui/CategoryIcon.tsx
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* fix: CategoryIcon 중복 import 제거 및 CategoryFilter discriminated union 타입 에러 수정
- CategoryIcon: FamilyRestroomIcon, CategoryGroup 중복 import 제거
- CategoryFilter: discriminated union(CodeRabbit 피드백 반영) 유지하면서
props 전체로 받아 props.mode로 narrowing 처리해 타입 에러 해결
(mode='single'일 때 onChange가 CategoryGroup을 기대하는 문제)
- Tab.module.scss: height → min-height 변경 (유연한 높이 대응)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: CaseCard 카테고리 아이콘을 제목 왼쪽 인라인으로 이동
- card__header 구조 변경: titleRow(아이콘+제목)와 badge를 좌우 배치
- card__titleRow 추가: flex row, align-items center, gap 6px
- 아이콘이 제목 위에 쌓이던 문제 수정 → 제목 왼쪽에 인라인 배치
- card__icon: font-size/line-height(이모지 잔재) → display:flex 로 변경
- card__title: margin-bottom 제거(card__header margin-bottom으로 대체)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 공통 컴포넌트 테스트 스크린샷 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: CaseCard titleRow flex 축소 보완 (min-width: 0, flex: 1)
긴 제목에서 card__titleRow가 축소되지 않아 배지가 밀리는 문제 방지.
card__header가 space-between일 때 titleRow가 flex: 1로 가용 공간을 차지하고
min-width: 0으로 내부 콘텐츠가 넘치지 않도록 제약.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: jungmin park <jungxmin21@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* fix(common): BottomNavigation 아이콘 MUI MD2 기본 스타일로 수정 (#39)
* fix(common): BottomNavigation 아이콘을 MUI MD2 기본 스타일로 수정
- HomeRounded → Home
- GavelRounded → MenuBook (사건기록 아이콘 자체 변경)
- CalendarMonthRounded → CalendarMonth
- PersonRounded → Person
디자인 시안 기준 MD2 filled 아이콘으로 통일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: BottomNavigation 테스트 스크린샷 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(common): BottomNavigation 활성 탭 레이블 색상 black-700으로 수정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(common): BottomNavigation 테스트 스크린샷 삭제
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: wjdalss21 <jungxmin21@gmail.com>
* feat: 사건·방 도메인 타입 정의 및 API 구현 (#40)
* feat: room DTO 타입 정의
- RoomMode, RoomDto, CreateRoomRequest, RoomListResponse
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 방 목록 조회·생성·상세 조회·종료·삭제 API 구현
- GET /api/v1/rooms — 내 방 목록 조회 (페이지네이션)
- POST /api/v1/rooms — AI 대화방 생성 (roomMode = ai_chat)
- GET /api/v1/rooms/:id — 방 상세 조회
- POST /api/v1/rooms/:id/close — 방 종료 (closedAt + roomMode = closed)
- DELETE /api/v1/rooms/:id — 방 소프트 삭제 (deletedAt + roomMode = deleted)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 방 목록 페이지네이션 파라미터 NaN 방어 처리
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: API 라우트 경로 v1 버전 세그먼트 제거 (#42)
* fix: API 라우트 경로에서 v1 버전 세그먼트 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 라우트 핸들러 주석 경로 v1 제거 (/api/v1/ -> /api/)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(docs): 서비스 흐름 기반 문서 구조 수정 및 페이지 문서 생성 (#43)
* fix(docs): 서비스 흐름 기반 문서 구조 수정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(docs): PAGES.md 코드 블록 언어 명시 추가 (MD040)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: personal-analyses 페이지 및 API 폴더 삭제 (#45)
* fix: personal-analyses 페이지 및 API 폴더 삭제
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(docs): personal-analysis 도메인 참조 MD 문서 일괄 정리
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 통계 API 구현 (GET /api/statistics/categories) (#44)
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건 관련 페이지의 진행 상태 컴포넌트
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정
* fix: StatusBadge 크기 조정 및 .playwright-mcp gitignore 추가
- StatusBadge min-width, height, padding, border-radius 수정
- justify-content: center 추가
- .playwright-mcp/ gitignore 등록
- package-lock.json peer dependency 재분류 반영
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: CategoryFilter 공통 컴포넌트 생성
- 전체/연애/직장/친구/가족 카테고리 필터 구현
- 아이콘 박스 44x44, border-radius 8, 아이콘 24x24
- 선택 상태: icon-primary bg / 미선택: bg-disabled
- MUI icons 사용 (GridViewRounded, Favorite, BusinessCenter, Diversity3, FamilyRestroom)
- Category 타입 export
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Tab 라벨 폰트 스타일 명시
- item.label을 span.label로 래핑
- Body-M 기준 font-size 16, line-height 28 적용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: @mui/icons-material 패키지 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: CategoryFilter 스타일 및 single 모드 적용
- 선택: bg-page + border-brand(1px) + icon-primary + 텍스트 bold
- 미선택: bg-page + border-default(1px) + icon-secondary + 텍스트 regular
- mode prop 추가 (filter 기본값 / single: 선택된 박스 하나만 표시)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카테고리 타입을 DB CategoryGroup 기준으로 통일
## 수정 배경
CategoryIcon, CategoryFilter가 한국어 문자열('연애', '직장' 등)을 타입으로 사용하고 있어
API/DB의 CategoryGroup('romance', 'work' 등)과 불일치가 발생.
페이지에서 연결 시 별도 변환 레이어가 필요해지는 문제를 사전 차단.
## 변경 파일별 수정 내용
### CategoryIcon.tsx
- CategoryWithoutAll 타입 제거 → @/types/common의 CategoryGroup 직접 사용
- 아이콘/레이블/컬러 맵 키를 한국어 → 영문 DB 값으로 변경
(romance, work, friend, family)
- CATEGORY_LABEL_MAP export 추가 (CategoryFilter에서 레이블 참조용)
### CategoryFilter.tsx
- Category 타입을 'all' | CategoryGroup으로 변경 (기존: 한국어 문자열)
- CATEGORIES 배열에 label 필드 추가, CATEGORY_LABEL_MAP에서 참조
- 전체 키를 '전체' → 'all'로 변경 (API 필터 미적용 값과 일치)
### CaseCard.tsx (타팀원 파일 수정)
- 수정 이유: CATEGORY_EMOJI 맵 키가 대문자('ROMANCE')였으나
API 응답은 소문자('romance')로 내려와 emoji가 항상 '📋' fallback만 표시되는 버그 존재
- 해결 방법: emoji 방식 전체 제거, CategoryIcon 컴포넌트로 교체
- categoryGroup prop 타입을 string → CategoryGroup으로 명시
- categoryGroup 미전달 시 아이콘 미표시 처리 (optional 유지)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Update src/components/ui/CategoryIcon.tsx
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* fix: CategoryIcon 중복 import 제거 및 CategoryFilter discriminated union 타입 에러 수정
- CategoryIcon: FamilyRestroomIcon, CategoryGroup 중복 import 제거
- CategoryFilter: discriminated union(CodeRabbit 피드백 반영) 유지하면서
props 전체로 받아 props.mode로 narrowing 처리해 타입 에러 해결
(mode='single'일 때 onChange가 CategoryGroup을 기대하는 문제)
- Tab.module.scss: height → min-height 변경 (유연한 높이 대응)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: CaseCard 카테고리 아이콘을 제목 왼쪽 인라인으로 이동
- card__header 구조 변경: titleRow(아이콘+제목)와 badge를 좌우 배치
- card__titleRow 추가: flex row, align-items center, gap 6px
- 아이콘이 제목 위에 쌓이던 문제 수정 → 제목 왼쪽에 인라인 배치
- card__icon: font-size/line-height(이모지 잔재) → display:flex 로 변경
- card__title: margin-bottom 제거(card__header margin-bottom으로 대체)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 공통 컴포넌트 테스트 스크린샷 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: CaseCard titleRow flex 축소 보완 (min-width: 0, flex: 1)
긴 제목에서 card__titleRow가 축소되지 않아 배지가 밀리는 문제 방지.
card__header가 space-between일 때 titleRow가 flex: 1로 가용 공간을 차지하고
min-width: 0으로 내부 콘텐츠가 넘치지 않도록 제약.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 통계 도메인 서비스 레이어 생성 (statisticsService.ts)
## 생성 이유
통계 API의 DB 쿼리 로직을 Route Handler와 분리하기 위해
도메인 서비스 레이어를 별도 파일로 작성했다.
## 폴더 선택 이유
src/domains/statistics/
- CLAUDE.md §4 아키텍처 원칙에 따라 도메인별 비즈니스 로직은
src/domains/{domain}/ 에 위치한다.
- statistics는 MVP 도메인 목록에 포함된 독립 도메인이다.
- Route Handler(src/app/api/)는 요청/응답 처리만 담당하고,
실제 DB 쿼리 로직은 서비스 레이어에서 관리한다.
## 구현 내용
### getSummary()
- 서비스 전체 판결 완료 건수(totalJudgements) 집계
- dispute.status = JUDGED 조건 명시: ai_judgements는 판결 완료 시에만
생성되지만 의도를 코드에 명시적으로 표현
- deletedAt / anonymizedAt IS NULL: 삭제·익명화된 사건 제외 (CLAUDE.md §7)
### getTopTypes(size = 5)
- ai_judgements.result_conflict_detail_id 기준 GROUP BY COUNT DESC
- 결과 유형 마스터(conflict_type_details)를 JOIN해 detailCode·displayName 반환
- isActive = true 필터: 비활성화된 유형은 통계에서 제외
- percentage 서버 계산: count / total * 100 (소수점 1자리)
FE에서 별도 계산 없이 바로 사용할 수 있도록 서버에서 내려줌
- prisma.conflictTypeDetail 사용 (prisma.conflictDetail은 스키마에 존재하지 않음)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 통계 API Route Handler 생성 (GET /api/v1/statistics/top-types)
## 생성 이유
statisticsService의 getTopTypes()를 HTTP 엔드포인트로 노출하기 위해
Next.js App Router 기반 Route Handler를 생성했다.
## 폴더 선택 이유
src/app/api/v1/statistics/top-types/
- CLAUDE.md §4 아키텍처 원칙에 따라 API Route는 src/app/api/v1/ 하위에 위치한다.
- API_SPEC.md §4.9 기준 엔드포인트 경로: GET /api/v1/statistics/top-types
- summary 엔드포인트는 현재 MVP 범위에서 불필요하여 top-types만 생성
## 구현 내용
- getServerSession으로 서버에서 직접 세션 검증
(FE 리다이렉트만으로는 API 직접 호출을 막을 수 없으므로 서버 검증 필수 — CLAUDE.md §7)
- 인증 실패 시 401 UNAUTHORIZED 반환
- getTopTypes(5) 호출 → 판결 완료 기준 Top5 유형 + 비율 반환
- ApiResponse 타입 준수: data/error는 null 아닌 undefined(optional) 사용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: statistics top-types 인증 제거 (메인 페이지 공개 접근 허용)
메인 페이지에서도 통계 차트가 노출되는 익명 집계 데이터이므로
세션 없이 접근 가능하도록 수정.
- getServerSession 및 관련 import 제거
- 401 인증 체크 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: statistics top-types 에러 핸들링 보완
코드래빗 피드백 반영:
- catch {} -> catch (error): 에러 정보 유실 방지
- 타임아웃 감지 후 504 분기 처리
- console.error 로깅 추가 (CLAUDE.md 11 API 오류 로그 대상)
- 세션 체크는 이전 커밋에서 이미 제거됨 (공개 엔드포인트)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor: 통계 API 카테고리 기준으로 재설계
- 결과 유형(top-types) → 작성 카테고리(ROMANCE/FAMILY/FRIEND/WORK) 기준으로 변경
- route.ts에 DB 쿼리 직접 작성, statisticsService.ts 제거
- 비율 계산은 프론트 훅(useStatistics)에서 담당
- revalidate = 86400 (하루 1회 재계산)
- src/hooks/ 폴더 신설 및 useStatistics.ts 생성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 통계 API 서버 측 세션 인증 추가
- GET /api/statistics/categories 진입 시 getServerSession으로 인증 검증
- 미인증 요청 401 UNAUTHORIZED 반환
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: jungmin park <jungxmin21@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* feat: Header variant 분리 (logo/title) 및 홈 화면 적용 (#47)
* feat: 홈 화면 기본 구조 생성 (헤더, 일기 박스)
- 헤더: 세션 유저명 + character-welcome.png 부엉이 이미지
- 일기 박스: 365x88, border black-700 2px, bg primary-100
- TODO: GangwonEduPower 폰트 추가 후 헤더 로고 텍스트 적용 필요
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: Header variant 분리 (logo/title) 및 홈 화면 적용
- Header.tsx에 variant prop 추가 (logo | title)
- logo: 좌측 상단 말해부엉 로고 표시 (66x19, h:56, padding: 16px 20px)
- title: 기존 뒤로가기 + 페이지 제목 형태 유지
- Header.module.scss에 __logo 스타일 추가
- home/page.tsx에 Header variant='logo' 적용
- 헤더를 컨테이너 padding 밖으로 분리하여 상단 여백 제거
- home/page.module.scss diaryBox에 align-self: center 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건기록 페이지 생성 및 로고 헤더 적용 (/records)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: diaryBox 고정 폭을 max-width + width 100%로 반응형 처리
- width: 365px → width: 100% + max-width: 365px
- 작은 화면에서 좌우 패딩과 결합 시 오버플로우 방지
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 감정일기 작성 버튼 /diary/new 네비게이션 연결
- 일기 박스 전체를 Link로 변경 (텍스트 + 버튼 모두 클릭 가능)
- diaryBox에 text-decoration: none, cursor: pointer 추가
- /diary/new 경로는 임시 지정 (담당자 확인 후 수정 예정)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 홈 화면 캐릭터 이미지 교체 및 위치 조정
- character-welcome.png → character-home.png 교체 (169x138)
- 캐릭터 절대 위치 적용 (top: 41px, right: -20px)
- 캐릭터가 일기 박스 뒤에 위치하도록 z-index 조정 (character: 0, container: 1)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 홈 화면 코드래빗 피드백 반영
- 캐릭터 이미지 가로 스크롤 방지: .page에 overflow-x: hidden 추가
- 비로그인 사용자 분기 처리: 말해부엉 알아보기 박스 추가 (/login 이동)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor: 홈 화면 typography 믹신 적용
- greetingText, diaryTitle, diarySubtitle에 typography 믹신 사용
- 개별 font 속성 직접 선언 → @include m.text-* 토큰으로 교체
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 비로그인 알아보기 박스 위치 수정
- 인사/일기 박스는 로그인 여부 무관하게 항상 표시
- 말해부엉 알아보기 박스를 진행중인 사건 위치(구분선 아래)로 이동
- 비로그인 인사: '안녕하세요' 표시
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 홈 화면에 통계 섹션 및 구분선 통합
- StatsCategorySection, useStatistics, QueryProvider 병합
- 고민 카테고리 TOP4 통계 섹션 추가
- 통계 섹션 하단 구분선 추가 (h:8px, black-100, gap:42px)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: 개발 편의용 로그인 상태 강제 설정 (배포 전 제거 필요)
- isLoggedIn = true 하드코딩으로 로그인 상태 유지
- TODO 주석으로 배포 전 제거 안내 표시
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건작성 페이지 구현 (disputes/[id]/statement) (#46)
* feat: 사건작성 페이지 구현 (disputes/[id]/statement)
- 사건 카테고리 선택 (연애/직장/친구/가족)
- MBTI 선택 드롭다운
- 진술 내용 입력 (최대 1000자)
- 진술저장 버튼 (내용 입력 시 활성화)
- TODO: 진술 저장 API 연결
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 사건작성 페이지 카테고리/간격/드롭다운 수정
- 카테고리를 searchParams에서 읽어 하나만 표시 (비상호작용)
- 카테고리 없을 시 모달 표시 후 이전 페이지로 이동
- Select/Textarea 사이 간격 8px (statementGroup)
- label/Select 사이 간격 16px 유지
- Textarea placeholder 줄바꿈 적용 (\n)
- content overflow-y 제거 → Select 드롭다운 아래 방향 열림 수정
- Select placeholder 색상 var(--text-secondary) 적용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카테고리 없음 모달에서 버튼 제거 — 페이지 블로킹만 유지
확인 버튼 클릭 시 이동하지 않고 Header 뒤로가기로만 탈출 가능
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카테고리 기본값 romance 적용, 모달 확인 버튼 복원
- searchParams에 카테고리 없을 시 임시로 romance 기본값 사용
- 모달 확인 버튼 클릭 시 router.back() 복원
- TODO: 이전 페이지 카테고리 데이터 연동 후 교체
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Select 커스텀 드롭다운 교체 및 Textarea focus 스타일 제거
- Select: 네이티브 select → 커스텀 드롭다운 (항상 아래 방향 열림)
- Select: placeholder 색상 --text-secondary 적용 (option 색 영향 없음)
- Select: 아이콘 회전 애니메이션 추가
- Textarea: focus 시 border-color 변경 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: Button 좌우 패딩 16 → 12으로 조정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: SCSS import 상대경로 → 절대경로(@/) 변환 및 컨벤션 문서 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Select 접근성 및 스타일 개선
- ul 기본 margin 리셋
- hasValue를 options.find 기준으로 판단 (빈 문자열 오인 방지)
- aria-invalid / aria-describedby 연결로 보조기기 지원
- 키보드 내비게이션 추가 (ArrowUp/Down, Enter/Space, Escape)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: dispute 생성 조건을 active room 전체로 완화 (ONE_TO_ONE 제한 제거)
혼자서도 판결 가능한 흐름을 지원하기 위해
room.roomMode !== 'ONE_TO_ONE' 체크를 제거하고
CLOSED/EXPIRED 방만 차단하도록 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Select id 안정화, 빈 options 가드, Tab 기본 포커스 이동 허용
- resolvedId를 label 문자열 대신 useId() 기반으로 고정
- option id를 value 대신 index 기반으로 변경
- Enter/Space 시 options 길이 가드 추가 (크래시 방지)
- Tab은 preventDefault 제거 — 닫기만 하고 포커스 이동은 브라우저에 위임
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: 단독 판결 MVP 포함 및 관련 정책 업데이트 (#51)
- Section 1: 단독 판결 / 1:1 판결 흐름 분리 명시
- Section 2: 단독 판결을 MVP 포함으로 이동, MVP 제외에서 제거
- Section 3: AI 대화방 정책 수정 (ai_chat/invite_ready 상태 단독 판결 허용)
- Section 3: 단독 판결 vs 1:1 판결 제공 결과 비교 섹션 추가
- Section 14: 단독 판결 관련 STOP Condition 항목 제거
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Feature/verdict record display - 캘린더 페이지 ui 제작 (#41)
* feat : 다이어리 (감정일기 , 사건기록)탭분리
* feat : 달력 ui 커스텀 추가 및 감정일기 사건기록 분기처리
* refactor: 및 캘린더 페이지구조 개선 (리뷰 피드백 반영)
* feat : 감정일기카드 컴포넌트 구현
* fix: build 에러 ( 임시 페이지 )
* refactor: 감정일기 컴포넌트 SCSS 모듈 적용 및 믹스인 토큰 사용
* feat: 달력 페이지 UI 구현 및 스타일 정리
- MUI DateCalendar 커스텀
- 감정일기 / 사건기록 탭 전환 구조 구현
- EmotionDiaryList, RecordList 빈 상태 UI 추가
- DiaryCard mixin 적용 (text-title-s, text-body-s, text-label-s)
- 인라인 style 제거 → SCSS 모듈로 분리
- outsideCurrentMonth 감정 아이콘 노출 차단
- 새 일기 FAB 버튼 추가 (감정일기 탭 전용)
- 불필요한 파일 삭제 (DiaryMode, EmotionDiaryCard 등)
* style : EmotionDiaryList.moulde 스타일 수정
* feat: 달력 RecordList에 CaseCard 연동 및 스타일 개선
* Update model name from 'gpt-5.5' to 'gemini-2.5-flash'
seed.ts Ai modelName 수정
---------
Co-authored-by: 배근영 <bgy09270@naver.com>
* feat: 사건작성(진술서) 페이지 구현 및 욕설 감지 필터 연동 (#49)
* feat: 사건작성 페이지 구현 (disputes/[id]/statement)
- 사건 카테고리 선택 (연애/직장/친구/가족)
- MBTI 선택 드롭다운
- 진술 내용 입력 (최대 1000자)
- 진술저장 버튼 (내용 입력 시 활성화)
- TODO: 진술 저장 API 연결
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 사건작성 페이지 카테고리/간격/드롭다운 수정
- 카테고리를 searchParams에서 읽어 하나만 표시 (비상호작용)
- 카테고리 없을 시 모달 표시 후 이전 페이지로 이동
- Select/Textarea 사이 간격 8px (statementGroup)
- label/Select 사이 간격 16px 유지
- Textarea placeholder 줄바꿈 적용 (\n)
- content overflow-y 제거 → Select 드롭다운 아래 방향 열림 수정
- Select placeholder 색상 var(--text-secondary) 적용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카테고리 없음 모달에서 버튼 제거 — 페이지 블로킹만 유지
확인 버튼 클릭 시 이동하지 않고 Header 뒤로가기로만 탈출 가능
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카테고리 기본값 romance 적용, 모달 확인 버튼 복원
- searchParams에 카테고리 없을 시 임시로 romance 기본값 사용
- 모달 확인 버튼 클릭 시 router.back() 복원
- TODO: 이전 페이지 카테고리 데이터 연동 후 교체
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Select 커스텀 드롭다운 교체 및 Textarea focus 스타일 제거
- Select: 네이티브 select → 커스텀 드롭다운 (항상 아래 방향 열림)
- Select: placeholder 색상 --text-secondary 적용 (option 색 영향 없음)
- Select: 아이콘 회전 애니메이션 추가
- Textarea: focus 시 border-color 변경 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: Button 좌우 패딩 16 → 12으로 조정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* style: SCSS import 상대경로 → 절대경로(@/) 변환 및 컨벤션 문서 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Select 접근성 및 스타일 개선
- ul 기본 margin 리셋
- hasValue를 options.find 기준으로 판단 (빈 문자열 오인 방지)
- aria-invalid / aria-describedby 연결로 보조기기 지원
- 키보드 내비게이션 추가 (ArrowUp/Down, Enter/Space, Escape)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: dispute 생성 조건을 active room 전체로 완화 (ONE_TO_ONE 제한 제거)
혼자서도 판결 가능한 흐름을 지원하기 위해
room.roomMode !== 'ONE_TO_ONE' 체크를 제거하고
CLOSED/EXPIRED 방만 차단하도록 변경
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: Selec…
* feat: 진술 저장 시 MBTI 변경사항 user.mbti에 동기화 * fix: 초대 링크 참여 시 statement 페이지로 카테고리 쿼리스트링 전달 * fix: mbti 미설정 시 placeholder 텍스트 표시 * fix: 상대방 작성 중일 때 판결받기 버튼 텍스트 변경 * refactor: rooms statement 페이지 제거 및 disputes/[id]/statement로 라우팅 통합 * fix: 진술저장 페이지 푸터 버튼 가로 정렬 * fix: statement 수정/신규 API 분기, invite category 전달, closed 모달 방지, MBTI placeholder - disputes/[id]/statement: isEditMode 시 PATCH /api/disputes/[id]/statements 호출 - disputes/[id]/statement: !isEditMode 시 POST /api/disputes 호출 (roomId 기준) - api/disputes POST: unified handler - 신규/상대방 참여 통합 처리 - api/disputes/[id]/statements PATCH: 수정 전용 핸들러 추가 (moderation only) - join/[token]: roomId 기준 라우팅 + categoryGroup 쿼리스트링 전달 - disputes/[id]/page: status === closed 시 판결 에러 모달 미표시 - disputes/[id]/page: user.mbti 없을 시 'MBTI 미설정' placeholder 표시 - disputes/[id]/page: opponent_joined 시 '상대방이 작성 중...' 버튼 텍스트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 초대 링크에 category 쿼리스트링 추가, join 페이지 메인 경로 수정 - disputes/[id]: 초대 링크 복사 시 ?category= 쿼리스트링 추가 - join/[token]: searchParams에서 category 읽어 statement 페이지로 전달 - join/[token]: 메인으로 돌아가기 /home -> / Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. 🗂️ Base branches to auto review (1)
Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI (base), Organization UI (inherited) Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary
변경 파일
Test plan
🤖 Generated with Claude Code