Skip to content

fix: dev → main 프로덕션 배포 동기화 (#166) - #167

Merged
evenif99 merged 202 commits into
mainfrom
fix/sync-dev-to-main
Jul 1, 2026
Merged

fix: dev → main 프로덕션 배포 동기화 (#166)#167
evenif99 merged 202 commits into
mainfrom
fix/sync-dev-to-main

Conversation

@evenif99

@evenif99 evenif99 commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • origin/dev 기준으로 main 브랜치 동기화
  • 충돌 발생 파일 7개 전부 dev 기준으로 해소 후 머지

변경 파일

  • src/app/(page)/disputes/[id]/page.tsx
  • src/app/(page)/disputes/[id]/statement/StatementPage.module.scss
  • src/app/(page)/disputes/[id]/statement/page.tsx
  • src/app/(page)/join/[token]/page.tsx
  • src/app/api/disputes/[id]/statements/route.ts
  • src/app/api/disputes/route.ts
  • src/components/home/NewCaseButton.tsx

Test plan

  • 로컬 dev 기준 정상 작동 확인 완료
  • 충돌 없음 확인 (dev 기준 해소 완료)

🤖 Generated with Claude Code

evenif99 and others added 30 commits June 15, 2026 02:02
* 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>
lyla-bae and others added 25 commits June 24, 2026 09:27
* 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…
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* 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>
@vercel

vercel Bot commented Jul 1, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
talky-owl Ignored Ignored Jul 1, 2026 2:05am

@coderabbitai

coderabbitai Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

🗂️ Base branches to auto review (1)
  • dev

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 6aae1ec9-689d-4089-993e-7cfab2552bd5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/sync-dev-to-main

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@evenif99
evenif99 merged commit ffa5b32 into main Jul 1, 2026
3 checks passed
@evenif99
evenif99 deleted the fix/sync-dev-to-main branch July 1, 2026 02:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants