fix: dev → main 프로덕션 배포 동기화 (충돌 해결 완료) - #137
Merged
Merged
Conversation
* chore: initialize project folder structure - Add base directory layout for Next.js + domain-driven architecture - Add .gitkeep to track empty directories in git - Exclude MVP out-of-scope domains (shop, points, user-items) - No implementation files included, structure only Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Update README.md --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add project overview and MVP scope definition - Add fixed product rules (categories, AI chat policy, judgement output) - Add architecture, domain scope, and state transition rules - Add auth/security, DB, frontend state, API, logging rules - Add Git workflow, Claude work process, STOP conditions - Add approval-required list and required reference documents Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add package.json with Next.js 15, React 19, TypeScript stack - Add next.config.ts (minimal Next.js 15 config) - Add tsconfig.json (strict mode, @/* path alias) - Add eslint.config.mjs (next/core-web-vitals + next/typescript) - Add .prettierrc and .prettierignore - Add .gitignore (node_modules, .next, .env.local, etc.) - Add .env.example (key names only, no real values) - Add prisma/schema.prisma (generator + datasource only) - Add data/mock/db.json (health check stub for json-server) - Add docs/TECH_STACK.md (package list and selection rationale) - Update README.md with run commands and env guide Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add PROJECT_DECISIONS.md (MVP scope, architecture, security principles) - Add guides/CLAUDE_WORKFLOW.md (work process, STOP conditions, approval rules) - Add guides/GIT_WORKFLOW.md (branch naming, commit convention, workflow) - Add guides/PR_RULES.md (PR target, title rules, review criteria) - Add guides/ENV_GUIDE.md (Vercel env pull, .env.example management) - Add guides/CODING_CONVENTION.md (naming, state management, folder rules) - Add db/STATUS_TRANSITION.md (room_mode, dispute_status transitions) - Add db/PRISMA_MAPPING.md (snake_case/camelCase mapping rules) - Add db/MASTER_DATA.md (categories, result types, DB master principles) - Add domains/README.md (domain list, MVP scope, writing guidelines) - Add domains/_DOMAIN_TEMPLATE.md (template for domain docs) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add AUTH.md (kakao login, terms, session management) - Add COMMON.md (error handling, logging, common response) - Add ROOM.md (AI chat room, invite link, room_mode transitions) - Add PERSONAL_ANALYSIS.md (AI-based personal conflict analysis) - Add DISPUTE.md (1:1 mediation, roles, statements, dispute_status) - Add JUDGEMENT.md (AI judgement, Gemini API, result card) - Add GIFT.md (gift recommendation after judgement) - Add USER.md (mypage, profile, bottom tab) - Add CALENDAR.md (date-based record marking, monthly summary) - Add DIARY.md (emotion diary, author-only access, content protection) - Add STATISTICS.md (anonymous aggregation, summary components) - Add SHOP_FUTURE.md (v2.0 planned, MVP excluded) - Add POINTS_FUTURE.md (v2.0 planned, MVP excluded) - Add USER_ITEMS_FUTURE.md (v2.0 planned, MVP excluded) All documents are draft templates with TODO markers for assignees. No implementation, no API routes, no schema changes. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add src/app/layout.tsx (root layout with metadata and globals.scss import) - Add src/app/page.tsx (minimal root page for build verification) - Add src/app/globals.scss (imports src/styles/main.scss) - Add src/app/error.tsx (minimal error boundary with reset) - Add src/app/not-found.tsx (minimal 404 page) - Add src/app/loading.tsx (minimal loading page) - Add src/styles/main.scss (ordered SCSS entry point) - Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens) - Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints) - Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset) - Add src/styles/base/_global.scss (body font, background, color defaults) - Add src/styles/layout/_page.scss (placeholder for page layout) Verified: type-check, lint, build all pass Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: add Next.js App Router entry files and SCSS base structure - Add src/app/layout.tsx (root layout with metadata and globals.scss import) - Add src/app/page.tsx (minimal root page for build verification) - Add src/app/globals.scss (imports src/styles/main.scss) - Add src/app/error.tsx (minimal error boundary with reset) - Add src/app/not-found.tsx (minimal 404 page) - Add src/app/loading.tsx (minimal loading page) - Add src/styles/main.scss (ordered SCSS entry point) - Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens) - Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints) - Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset) - Add src/styles/base/_global.scss (body font, background, color defaults) - Add src/styles/layout/_page.scss (placeholder for page layout) Verified: type-check, lint, build all pass Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: resolve ESLint and TypeScript config warnings - eslint.config.mjs: ignore next-env.d.ts and .next/** (auto-generated by Next.js, triple-slash reference false positive) - tsconfig.json: remove deprecated baseUrl option (TypeScript 5.x+, paths works without baseUrl) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
달력 UI 라이브러리로 MUI X Date Pickers + Day.js 사용을 확정하고 관련 문서(TECH_STACK, PROJECT_DECISIONS, CODING_CONVENTION, CALENDAR, DIARY, CLAUDE.md)에 반영한다.
달력 UI 구현을 위해 MUI X Date Pickers 및 필수 peer dependency를 설치한다. @mui/material@9.1.1, @emotion/react@11.14.0, @emotion/styled@11.14.1, @mui/x-date-pickers@9.5.0, dayjs@1.11.21
* infra: add Next.js App Router entry files and SCSS base structure - Add src/app/layout.tsx (root layout with metadata and globals.scss import) - Add src/app/page.tsx (minimal root page for build verification) - Add src/app/globals.scss (imports src/styles/main.scss) - Add src/app/error.tsx (minimal error boundary with reset) - Add src/app/not-found.tsx (minimal 404 page) - Add src/app/loading.tsx (minimal loading page) - Add src/styles/main.scss (ordered SCSS entry point) - Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens) - Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints) - Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset) - Add src/styles/base/_global.scss (body font, background, color defaults) - Add src/styles/layout/_page.scss (placeholder for page layout) Verified: type-check, lint, build all pass Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: resolve ESLint and TypeScript config warnings - eslint.config.mjs: ignore next-env.d.ts and .next/** (auto-generated by Next.js, triple-slash reference false positive) - tsconfig.json: remove deprecated baseUrl option (TypeScript 5.x+, paths works without baseUrl) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- datasource: add directUrl for Supabase connection pooler support - enums: CategoryGroup, RoomMode, DisputeStatus, ParticipantRole, etc. - NextAuth models: User (with TALKY-OWL fields), Account, Session, VerificationToken - core models: DisputeRoom, RoomAiConversation, RoomAiMessage - dispute models: Dispute, DisputeParticipant, DisputeStatement - judgment models: AiJudgment, JudgmentResultCard - gift models: GiftRecommendation, GiftRecommendationItem - feature models: EmotionDiary, CalendarRecord - master data: ConflictTypeGroup, ConflictTypeDetail (DB-based, no enum hardcoding) - log models: AuditLog, ApiErrorLog, ModerationLog, RoomAccessLog, UserDeletionLog - .env.example: add DIRECT_URL for Supabase directUrl - v2.0 TODO: ShopItem, PointTransaction, UserItem, DisputeStatistic excluded Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
folders added:
- src/components/{personal-analysis,room,dispute,judgement,calendar,diary,statistics,gift}
- src/app/api/auth/[...nextauth]
- src/app/api/v1/{users,personal-analyses,rooms,disputes,statements,calendar,diary,statistics,cron}
files added:
- prisma/seed.ts (placeholder for ConflictTypeGroup master data)
docs updated (minimal):
- docs/domains/COMMON.md: add log table list, judgement_logs TODO note
- docs/domains/JUDGEMENT.md: clarify Storage is MVP-excluded scaffolding
- docs/guides/ENV_GUIDE.md: clarify Supabase Storage vars are MVP-excluded
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…e group (#23) src/app/page/ (괄호 없음)는 /page/* URL segment를 생성하므로, Next.js App Router route group 문법인 src/app/(page)/로 변경한다. URL은 /landing, /home 등으로 노출되어야 하며 /page/... 가 아니다. 관련 문서 내 경로 참조도 모두 업데이트 (CLAUDE.md, docs/domains/*, docs/guides/*). Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(styles): 디자인 토큰 및 전역 스타일 설정 - _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가 - _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m) - _global.scss body 폰트 Pretendard 적용 - next/font/local로 PretendardVariable 폰트 로드 (layout.tsx) - GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 컨테이너 max-width 1000px 설정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 개발 확인용 임시 border 색상 회색으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: container min-height 100vh 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(styles): 디자인 토큰 및 전역 스타일 설정 - _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가 - _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m) - _global.scss body 폰트 Pretendard 적용 - next/font/local로 PretendardVariable 폰트 로드 (layout.tsx) - GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 컨테이너 max-width 1000px 설정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 개발 확인용 임시 border 색상 회색으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: container min-height 100vh 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: rem 스케일 토큰 추가 및 타이포그래피 변수 rem 참조로 전환 - Rem scale 섹션 추가 (0.25rem ~ 30rem) - 폰트 토큰에서 누락된 0.875rem(14px), 1.125rem(18px) 추가 - font-size, line-height 변수를 rem 스케일 변수 참조로 전환 - rem 스케일을 typography 섹션보다 상단으로 이동 (선언 순서) - 컴포넌트 width/height 대응을 위해 큰 단위(9rem~30rem) 포함 Co-Authored-By: Claude <noreply@anthropic.com> * style: r() 함수 분리 및 타이포그래피 변수 함수 기반으로 전환 - _functions.scss 신규 추가 — px → rem 변환 함수 r() 단독 관리 - _variables.scss에서 rem 스케일 변수 제거, fn.r() 참조로 전환 - _mixins.scss에 functions @use 추가 - 순환 참조 없이 variables → functions → (없음) 단방향 의존성 구성 Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): add Button, Toast, Header, BottomNavigation components - Button: primary / outline / disabled variants, design token 기반 - Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용 - Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering - BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘 - toastStore: Zustand UI 상태 (show/hide/message) * docs: update collaboration policy - GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리) - Issues / Milestones / Project Board 미사용으로 관련 내용 제거 - GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거 - PR_RULES PR 본문에서 관련 Issue 항목 제거
* feat(styles): 디자인 토큰 및 전역 스타일 설정 - _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가 - _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m) - _global.scss body 폰트 Pretendard 적용 - next/font/local로 PretendardVariable 폰트 로드 (layout.tsx) - GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 컨테이너 max-width 1000px 설정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 개발 확인용 임시 border 색상 회색으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: container min-height 100vh 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: rem 스케일 토큰 추가 및 타이포그래피 변수 rem 참조로 전환 - Rem scale 섹션 추가 (0.25rem ~ 30rem) - 폰트 토큰에서 누락된 0.875rem(14px), 1.125rem(18px) 추가 - font-size, line-height 변수를 rem 스케일 변수 참조로 전환 - rem 스케일을 typography 섹션보다 상단으로 이동 (선언 순서) - 컴포넌트 width/height 대응을 위해 큰 단위(9rem~30rem) 포함 Co-Authored-By: Claude <noreply@anthropic.com> * style: r() 함수 분리 및 타이포그래피 변수 함수 기반으로 전환 - _functions.scss 신규 추가 — px → rem 변환 함수 r() 단독 관리 - _variables.scss에서 rem 스케일 변수 제거, fn.r() 참조로 전환 - _mixins.scss에 functions @use 추가 - 순환 참조 없이 variables → functions → (없음) 단방향 의존성 구성 Co-Authored-By: Claude <noreply@anthropic.com> * fix: :root {} 시맨틱 토큰을 _global.scss로 분리 _variables.scss에 :root {}가 있으면 module.scss에서 @use 시 CSS Modules 'not pure' 에러 발생. SCSS 변수는 _variables.scss, CSS 출력은 _global.scss로 분리. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): add Button, Toast, Header, BottomNavigation components - Button: primary / outline / disabled variants, design token 기반 - Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용 - Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering - BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘 - toastStore: Zustand UI 상태 (show/hide/message) * docs: update collaboration policy - GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리) - Issues / Milestones / Project Board 미사용으로 관련 내용 제거 - GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거 - PR_RULES PR 본문에서 관련 Issue 항목 제거 * feat(common): add Tabs, CaseCard, ActionPrompt, Input, Select, Textarea components Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(common): apply MUI icons and Snackbar, update MUI usage policy - Toast: MUI Snackbar (3s auto-dismiss) - BottomNavigation, Header, Select: lucide-react → @mui/icons-material - Install @mui/icons-material - CLAUDE.md, CODING_CONVENTION.md: MUI usage policy updated Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update icon policy — @mui/icons-material except diary feature Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건 관련 페이지의 진행 상태 컴포넌트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정 --------- Co-authored-by: jungmin park <jungxmin21@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): add Button, Toast, Header, BottomNavigation components - Button: primary / outline / disabled variants, design token 기반 - Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용 - Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering - BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘 - toastStore: Zustand UI 상태 (show/hide/message) * docs: update collaboration policy - GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리) - Issues / Milestones / Project Board 미사용으로 관련 내용 제거 - GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거 - PR_RULES PR 본문에서 관련 Issue 항목 제거 * feat(common): add Tabs, CaseCard, ActionPrompt, Input, Select, Textarea components Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(common): apply MUI icons and Snackbar, update MUI usage policy - Toast: MUI Snackbar (3s auto-dismiss) - BottomNavigation, Header, Select: lucide-react → @mui/icons-material - Install @mui/icons-material - CLAUDE.md, CODING_CONVENTION.md: MUI usage policy updated Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update icon policy — @mui/icons-material except diary feature Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(common): ActionPrompt message 제거 및 Textarea 글자수 카운터 absolute 배치 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- ApiResponse, ApiError, ApiFieldError, CategoryGroup (common.ts) - DisputeDto, CreateDisputeRequest, DisputeListResponse 등 (dispute.ts) - AiJudgmentDto, CreateAiJudgmentRequest 등 (judgment.ts) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- VALID_CATEGORY_GROUPS, IMMUTABLE_DISPUTE_STATUSES 상수 (constants/dispute.ts) - getSessionUserId NextAuth 세션 헬퍼 (auth/session.ts) - toAiJudgmentDto 공유 mapper (judgement/judgment.mapper.ts) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- GET /api/v1/disputes — 참여 사건 목록, categoryGroup 필터, 페이지네이션 - POST /api/v1/disputes — 사건 생성 + role_a 참여자 트랜잭션 등록 - GET /api/v1/disputes/:id — 사건 상세 조회 - PATCH /api/v1/disputes/:id — 사건 수정 (role_a 전용, 변경 불가 상태 차단) - DELETE /api/v1/disputes/:id — 사건 소프트 삭제 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- POST /api/v1/disputes/:id/judge — AI 판결 요청, JUDGING 상태 잠금으로 멱등성 보장 - GET /api/v1/disputes/:id/result — 판결 결과 조회 (참여자 전용) - AI 모듈 미구현 구간은 TODO 주석으로 마킹, 완료 전까지 503 반환 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건 관련 페이지의 진행 상태 컴포넌트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정 * fix: StatusBadge 크기 조정 및 .playwright-mcp gitignore 추가 - StatusBadge min-width, height, padding, border-radius 수정 - justify-content: center 추가 - .playwright-mcp/ gitignore 등록 - package-lock.json peer dependency 재분류 반영 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: jungmin park <jungxmin21@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- 상점/고객문의 메뉴 클릭 시 페이지 이동 대신 토스트 메시지 표시 - 회원탈퇴 페이지 본문 폰트 색상을 text-secondary에서 text-primary로 변경 - 회원탈퇴 페이지 상단에 사용자 프로필(아바타, 이름, 이메일) 표시 Co-authored-by: Claude <noreply@anthropic.com>
* feat: 판결 결과 컴포넌트 및 도메인 로직 초기 작업 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 판결 결과 페이지 구현 (#판결탭/유형탭/UI) - DisputePage: 판결/유형 서브탭(Tab 공통컴포넌트) 추가 - JudgmentResult: 이미지 기준 UI 재구성, nickname 적용 - JudgmentTypeResult: 유형탭 컴포넌트 신규 생성 (카드이미지, ActionPrompt) - Tab.module.scss: w60 h36 사이즈 조정 - DisputeParticipantDto: nickname 필드 추가 - disputes/[id]/route: nickname 조회 추가 - judgment.mapper: cardImageUrl 추가 - types/judgment: ConflictTypeDetailDto에 cardImageUrl 추가 - auth/index: 카카오 로그인 시 profileImageUrl 저장 - page.module.scss: diaryBox max-width 제거 - NewCaseButton: AbortController timeout 30s Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: next.config에 Supabase Storage 및 카카오 이미지 도메인 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: JudgmentResult Avatar img 태그를 next/image로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 리뷰 반영 - participants nickname → name으로 변경 (DTO, route, 컴포넌트, useActiveCases) - next.config: 카카오 HTTP 패턴 제거 (HTTPS만 허용) - DisputePage: isCompleted null 케이스 처리 (!!dispute) - JudgmentResult.module.scss: declaration-empty-line-before stylelint 수정 - JudgmentTypeResult.module.scss: 동일 stylelint 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 추가 리뷰 반영 - JudgmentResult/JudgmentTypeResult: props 대신 disputeId 기반 직접 API 호출 (새로고침 시 데이터 유실 방지, TanStack Query 캐시로 중복 요청 없음) - DisputePage: judgment/participants props 제거, isError 기반 에러 처리 - auth/index.ts: 프로필 이미지 백필 try-catch 감싸기 (실패 시 로그인 차단 방지) - judgement.api.ts: 에러 메시지 사용자 친화적으로 개선 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: 불필요한 스크린샷 PNG 파일 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: CalendarRecord 모델 제거 및 EmotionDiary title 필드 추가 - CalendarRecord 모델 및 CalendarRecordType enum 제거 - User, DisputeRoom, RoomAiConversation, Dispute에서 calendarRecords relation 제거 - EmotionDiary에 title 필드 추가 (VarChar 200) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건기록 페이지 API 연동 - GET /api/disputes에 completed=true 쿼리 파라미터 추가 (judged/closed 필터링) - fetchCompletedCases, useCompletedCases 추가 (카테고리 필터 + 최신순) - RecordListSection 더미 데이터 제거, 실제 API 연동 - 사건 박스 클릭 시 /disputes/{id}로 이동 (기존 Link 구조 유지) - 로딩/에러/빈 상태 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건기록 빈 상태 UI 개선 - 빈 상태 텍스트 → '등록한 사건이 없어요' - character-case.png 이미지 + 텍스트 중앙 배치 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건박스 공통 컴포넌트 CaseRecordCard 분리 - CaseRecordCard 신규 생성 (src/components/ui) - MUI AvatarGroup으로 1인/2인 참여자 프로필 겹침 표시 - RecordListSection에서 CaseRecordCard 사용하도록 교체 - 카드 스타일 RecordListSection.module.scss → CaseRecordCard.module.scss로 이동 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카카오 CDN http 프로토콜 이미지 허용 (img1.kakaocdn.net) 카카오 기본 프로필 이미지 URL이 http로 오는 경우가 있어 *.kakaocdn.net http 패턴 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 홈 페이지 배경 그라데이션 추가 (primary-200 → white) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 홈 그라데이션 범위 15%로 조정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: dispute.hooks.ts dev 브랜치 import 충돌 사전 해결 - UseQueryOptions, DisputeDto import 추가 (dev 브랜치 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: dispute.hooks.ts dev 브랜치 useDispute refetchInterval 옵션 반영 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 및 juacheon 리뷰 반영 - disputes/route.ts: active/completed 동시 사용 시 if/else 분기로 필터 충돌 방지 - CaseRecordCard: <time> 요소에 dateTime 속성 추가 (접근성) - Header: transparent prop 추가, :global(header) 셀렉터 제거 - RecordListSection: 에러 메시지 구체화 - next.config.ts: 중복 HTTP 항목 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 2인 판결결과 점수 그래프 UI 수정 - isEqual/barEqual 제거, 색상 로직 ratioA >= ratioB 패턴으로 단순화 - scoreGraph margin-bottom 추가 - scoreAvatarImg 크기 명시적 fn.r(48)로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 2인 판결결과 그래프 디테일 수정 - 바 height 12 → 16, border-radius 6 → 4 - 중앙 실선 추가 (solid, border-strong, h36) - barDark 컬러 → status-disabled-text - scoreTitle 이름 부분만 bold 처리 - AI 고지 문구 컬러 → text-secondary Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 진술 탭 참여자 이름/MBTI 표시, 프로필 이미지 fallback 개선 - 진술 카드 레이블 A/B → 참여자 실명으로 변경 - 진술 카드 하단 프로필 이미지 + MBTI 추가 - DisputeParticipantDto에 mbti 필드 추가 - API participants에 mbti 포함 (disputes/[id] GET/PATCH) - profileImageUrl null 시 image 필드 fallback 적용 (목록/상세 API) - DisputePage.module.scss mixins import 추가 - JudgmentResult 그래프 점선/바 높이 디테일 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: JudgmentResult 참여자 이름 변수 통일 및 텍스트 치환 적용 - nameA / nameB 변수로 cardLabel, barLabel 통일 - replaceRoleNames 함수로 aFault/bFault/aSuggestedLine/bSuggestedLine 내 A님→실제이름 치환 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 리뷰 반영 - replaceRoleNames 단일 패스 치환으로 개선 (A님|B님 alternation) - disputes 목록/POST API Prisma 쿼리에 image 필드 선택 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * perf: statistics/categories API 빌드 시 DB 호출 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카테고리 사건 2개 제한 및 사건기록 무한스크롤 - POST /api/rooms 카테고리당 진행중 사건 2개 초과 시 CATEGORY_LIMIT_EXCEEDED(422) 반환 - DisputeListResponse에 hasNext 필드 추가 - fetchCompletedCases 페이지 기반 API 호출로 전환 (limit 10) - useCompletedCases useInfiniteQuery로 전환 - RecordListSection IntersectionObserver 기반 무한스크롤 구현 - 모든 데이터 로드 시 '모든 데이터를 불러왔습니다' 표시 - NewCaseButton 카테고리 한도 초과 시 에러 모달 표시 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 리뷰 반영 - GET /api/disputes: completed 파라미터 where 조건 반영으로 hasNext 정확도 개선 - POST /api/disputes: 카테고리 한도 체크 추가 (직접 API 호출 우회 방지) - NewCaseButton: limitError 모달 표시 시 body 스크롤 잠금 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카테고리 한도 초과 에러 모달 UI 개선 - 기존 카테고리 패널 스타일 재사용 → 독립 검은 배경 센터 모달로 변경 - limitOverlay, limitModal, limitMessage, limitCloseButton 스타일 추가 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>
* chore: update claude settings.json Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: update claude settings.json Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * @ feat(user): 마이페이지 프로필 편집 및 이미지 업로드 구현 - 마이페이지 편집 페이지 UI 및 프로필 수정 로직 구현 - 프로필 이미지 업로드 API (Supabase Storage 연동) - user/me API에 PATCH 메서드 추가 (닉네임, MBTI 수정) - user 도메인 API client, hooks, constants 구성 - auth constants 및 lib/storage 유틸 추가 - API 명세서 업데이트 - dev 최신 반영 (사건기록, 홈 화면 개선) Co-Authored-By: Claude <noreply@anthropic.com> @ * fix(auth): 카카오 로그인 시 kakao_id 중복 유니크 제약 위반 해결 동일 카카오 계정으로 user 레코드가 중복 생성된 경우, 기존 유저의 kakao_id를 null로 정리 후 현재 유저에 저장하도록 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * @ fix(api): Remove duplicate profile image upload logic from user/me PATCH Profile image upload was handled in both api/user/me PATCH and the dedicated api/user/me/profile-image POST endpoint. Remove the duplicate code from PATCH including supabaseAdmin import, file validation constants, image signature checker, and upload logic. Co-Authored-By: Claude <noreply@anthropic.com> @ --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
DEV_BYPASS를 제거하고 next-auth 기본 미들웨어로 교체하여 비회원이 보호 페이지(감정일기, 마이페이지 등) 접근 시 로그인 화면으로 리다이렉트되도록 수정. 홈(/), about, contact, join 등 공개 페이지는 matcher에서 제외하여 비회원도 접근 가능하도록 유지. Co-authored-by: Claude <noreply@anthropic.com>
미들웨어가 callbackUrl을 절대 URL(https://...)로 생성하지만 login, auth/callback 페이지에서 상대 경로만 허용해 로그인 성공 후 원래 페이지 대신 홈(/)으로 리다이렉트되는 문제 수정. - login: 절대 URL을 상대 경로로 변환 후 전달 - auth/callback: URL 파싱으로 pathname 추출하여 리다이렉트 Co-authored-by: Claude <noreply@anthropic.com>
…ature/calendar-daily-record-api
배포 환경에서 /api/* 라우트에 next-auth 미들웨어가 개입하여 인증되지 않은 요청을 307로 리다이렉트하는 문제 수정. API 라우트는 자체 인증(getRequestUserId)을 사용하므로 미들웨어 매처에서 api/* 전체를 제외. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…-api feat: 감정일기 수정 , 조회 api 추가
* feat(about): 서비스 소개 페이지 구현 - 스프라이트 애니메이션, iris-out 전환, gsap 순차 등장 - 부엉이 판사봉 스프라이트 애니메이션 (25프레임) 인트로 추가 - iris-out 원형 줌아웃 전환 효과 구현 - gsap ScrollTrigger 기반 순차 등장 애니메이션 적용 - 기능 소개 5개 섹션 (홈, 사건작성, 사건기록, 사건조회, AI판결) - CTA 섹션 및 시작하기 버튼 추가 - 기존 mixin/변수 활용 (flex-center, text-display 등) - gsap 패키지 추가 - landing 폴더 삭제 (미사용) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(about): Hide bottom navigation on about page The about page serves as a landing/service introduction page, so the bottom tab navigation should not be displayed. Co-Authored-By: Claude <noreply@anthropic.com> * fix(about): CodeRabbit 리뷰 반영 - stylelint, 메모리 누수, 경로 매칭 수정 - .gitignore: app 디렉토리 컴파일된 CSS 모듈 패턴 추가 - page.module.scss: @include 뒤 빈 줄 추가 (stylelint declaration-empty-line-before) - page.module.scss: keyframes 이름 kebab-case 변환 (irisOut→iris-out, fadeIn→fade-in) - SpriteAnimation.tsx: 언마운트 후 img.onload/RAF 메모리 누수 방지 - layout.tsx: /about 경로 정확 매칭으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(about): 서비스 소개 페이지 디자인 리뉴얼 - 이미지 기반 재구성 - Hero: 중앙 폰 목업 + 떠다니는 갈등상황 태그 + 하이라이트 텍스트 - Feature Cards: 3개 카드 가로 배치 (AI 판결, 갈등유형, 감정일기) - Showcase: 기울어진 폰 목업 + 텍스트 교대 배치 (초대/감정일기/기록) - CTA: 말해부엉 캐릭터 + 시작하기 버튼 - GSAP ScrollTrigger 기반 순차 등장 애니메이션 유지 - 기존 mixin/variable 재활용, SpriteAnimation 메모리 누수 수정 포함 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): SpriteAnimation sed 중복 삽입 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(about): 피그마 디자인 기반 서비스 소개 페이지 전면 재구성 - Tab1 Hero: 기울어진 폰(about/1.png) + 리볼빙 강조 태그 애니메이션 - Tab2 Feature Cards: 3개 카드(AI판결/갈등유형/감정일기) + 캘린더 아이콘 - Tab3 초대: 하단잘린 폰(about/8.png) + 좌측 텍스트 - Tab4 감정일기: 기울어진 폰(about/3.png) + 우측 텍스트 + 연한 배경 - Tab5 기록: 하단잘린 폰(about/6.png) + 좌측 텍스트 - Tab6 CTA: 부엉이 캐릭터 + 바로가기 버튼 + 푸터 - GSAP ScrollTrigger 스크롤 감지 순차 등장 유지 - 기존 mixin/variable/function 전부 재활용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): Hero 누끼 폰 이미지 + 수직 리볼빙 텍스트 애니메이션 구현 - Hero 폰을 about/10.png 누끼 이미지로 교체 (CSS 목업 제거) - 리볼빙 텍스트: 수직 리스트 순환 (직장상사와→엄마랑→남친이랑→친구랑) - active 텍스트 검정/굵게, 나머지 연한 회색 - 배열 2배 복제 + y 리셋으로 끊김 없는 무한 루프 - 갈등상황 suffix 텍스트 고정 위치 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): Hero 레이아웃 피그마 일치 - 좌측 리볼빙/중앙 폰/우측 텍스트 - 3컬럼 수평 배치: heroLeft(리볼빙) | heroCenter(누끼폰) | heroRight(타이틀) - 리볼빙: 위(연회색 2줄) + active(검정 굵게 + 갈등상황) + 아래(연회색 1줄) 구조 - active 텍스트 순환: 직장상사와→엄마랑→남친이랑→친구랑 반복 - 폰 이미지 중앙 배치, 좌우 텍스트와 살짝 겹침 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): Hero 좌우 텍스트 크기 통일 + 폰 위치 고정 - 좌우 텍스트 모두 text-title-xl로 통일 - heroLeft에 고정 width(240px) 적용하여 리볼빙 시 레이아웃 변동 방지 - 폰 이미지를 absolute 중앙 배치로 변경하여 텍스트 변화에 영향 받지 않도록 처리 - heroPhoneImage에 background: white 적용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): Hero 피그마 레이아웃 일치 - 위치/크기/배경 수정 - 좌측 텍스트: absolute bottom-80px, 폰 하단 높이에 배치 - 우측 텍스트: absolute right-0 bottom-120px - 폰: absolute top-0 center, 상단부터 시작 - 좌우 텍스트 크기 26px(1.625rem)으로 통일 - 리볼빙 비활성 텍스트 20px, 높이 36px - 폰 이미지 mix-blend-mode: multiply로 체크무늬 배경 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 전체 페이지 비율 피그마 일치 - Hero 축소 및 섹션 간격 조정 - Hero: min-height 100dvh → height 360px (피그마 비율 ~25%) - Feature Cards: padding 80px→48px, 카드 min-height 200→160px - Showcase: padding 100px→56px, min-height 제거 - CTA: padding 축소, 아이콘/텍스트/버튼 전체 축소 - 폰 이미지 320→260px, 텍스트 26→22px - 전체적으로 피그마 스크린샷 비율에 맞춤 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): Hero 폰 이미지를 투명 누끼(11.png)로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): Hero 축소 + 텍스트 중앙 배치 + 크기 증가 - heroSection padding 축소, min-height 제거 - heroInner를 flex center로 변경 (absolute 제거) - 좌우 텍스트 28px, 리볼빙 비활성 22px으로 증가 - 폰 240px, 좌우 텍스트와 수직 중앙 정렬 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): Hero 좌우 텍스트 정렬 + 크기 증가 + 말해부엉 색 조합 - 좌우 모두 flex:1로 균등 분배, 텍스트 수직 중앙 정렬 - active/title 텍스트 36px bold, 비활성 26px medium - 말해(primary 초록) + 부엉(검정) 색 분리 적용 - heroRight를 flex justify-content: flex-end로 우측 정렬 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 폰 고정 + 좌우 텍스트 줄 맞춤 + 커스텀 헤더 - 폰: absolute center (top:50%,left:50%) 고정, 텍스트 변화에 절대 안 움직임 - 좌우 텍스트: 둘 다 absolute top:50% translateY(-50%)로 같은 줄 정렬 - 텍스트 크기 유지 (active/title 36px, 비활성 26px) - 헤더: 기본 헤더 제거 → 커스텀 헤더 (로고 + 서비스 바로가기 버튼) - 서비스 바로가기 클릭 시 홈(/)으로 이동 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): about 경로에서 기본 헤더 완전 제거 - layout.tsx에서 isAbout일 때 Header 컴포넌트 렌더링 차단 - 커스텀 헤더(로고 + 서비스 바로가기)만 표시 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 좌우 텍스트 줄 맞춤 + 우측 텍스트 폰 침범 방지 - heroLeft: transform에 -22px 오프셋 추가하여 activeRow가 정확히 수직 중앙에 위치 - heroRight: max-width calc(50% - 150px)으로 폰 영역 침범 방지 - heroInner max-width 800→960px로 확대하여 텍스트 공간 확보 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 좌측 텍스트 밀림 수정 + 우측 텍스트 위치 조정 - 리볼빙 애니메이션에서 revolvingRef.current에 y 변환 제거 (위치 밀림 원인) - 우측 텍스트: right:0 → left:calc(50%+140px) (폰 바로 옆에서 시작) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 리볼빙 텍스트 부드러운 슬라이드 애니메이션 복원 - 내부 트랙(aboveTrack, activeRow, belowTrack)에만 y/opacity 애니메이션 적용 - heroLeft 자체는 절대 움직이지 않음 (position 유지) - fade-out(y:-12, 0.25s) → 텍스트 교체 → fade-in(y:12→0, 0.3s) - 스크롤/화면 이동 시 좌측 텍스트 위치 변하지 않음 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 좌측 텍스트 중앙 방향으로 위치 조정 - heroLeft left: 0 → calc(50% - 420px), 폰 침범 없이 중앙 쪽으로 이동 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 리볼빙 텍스트 끊김 없는 무한 루프로 변경 - repeat:-1 타임라인 → onComplete 재귀 호출 방식으로 변경 - 마지막→처음 전환 시 텍스트 사라짐 현상 제거 - hold(2s) → fadeOut(0.25s) → 텍스트교체 → fadeIn(0.3s) → 반복 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 리볼빙 텍스트 항상 표시 유지 + active만 슬라이드 전환 - 위/아래 회색 텍스트: 짧은 crossfade(0.15s)로 내용만 교체, 항상 보임 - active 텍스트: slide-up fade-out → 텍스트 교체 → slide-in fade-in - 전체 텍스트가 사라지는 현상 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 리볼빙 애니메이션을 순차 콜백 방식으로 변경 - timeline 대신 순차 gsap.to 콜백 체인으로 변경 - fadeOut(0.3s) → 텍스트교체 → fadeIn(0.35s) → hold(2s) → 반복 - 모든 요소가 동시에 fade되어 active만 사라지는 현상 제거 - hold 후에만 다음 사이클 시작하여 타이밍 겹침 방지 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 탭3-5 Showcase 피그마 비율 맞춤 - showcaseSection max-width 960px, gap 48px, padding 64px - showcaseTitle text-title-xl로 증가 - showcaseText flex:1 max-width 380px - 폰 목업 200→240px, border-radius 32px - 전체적으로 피그마 탭3 레이아웃에 맞춤 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 탭3/5 폰 목업 하단 잘림 완화 - 전체 폰 표시 - phoneMockupStraight: border-bottom 복원, border-radius 32px 전체 적용 - margin-bottom: -40px로 섹션 하단에 살짝만 걸치게 처리 - phoneScreenClipped도 border-radius 26px 전체 적용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 탭3 CSS 폰 목업 제거 → 누끼 이미지(12.png)로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 탭3 폰 이미지 하단까지 닿도록 margin-bottom -80px 적용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 탭4 감정일기 레이아웃 변경 - 텍스트 왼쪽, 폰 오른쪽 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 탭4 폰 왼쪽 + 텍스트 오른쪽 배치로 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 탭4 폰 이미지를 13.png 누끼로 교체 + 하단 잘림 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 탭5 폰 이미지를 14.png로 교체 + 상단 잘림 처리 - CSS 목업 제거 → 14.png 누끼 이미지 사용 - margin-top: -60px로 상단이 섹션 위로 잘린 형태 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(about): 탭2 피그마 일치 - 동물 캐릭터 배치 + 카드별 아이콘 분리 - animal01(고양이): 카드 왼쪽 아래, z-index:2 카드 앞으로 - animal02(강아지): 카드 가운데 아래, z-index:2 카드 앞으로 - animal03(판다): 카드 오른쪽 위, z-index:0 카드 뒤에 가림 - 카드 아이콘: feature01=저울, feature02=체크, feature03=캘린더 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(about): 탭2 동물 캐릭터 위치 피그마 일치 조정 - 고양이: left:-20px bottom:-40px (카드 왼쪽 아래 걸침) - 강아지: left:50% translateX(-70%) bottom:-45px (카드 중앙 아래) - 판다: right:-10px top:-45px (카드 오른쪽 위, 뒤에 가림) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(about): 서비스 소개 페이지 이미지 에셋 추가 - 7.png: 진술 정리 로딩 화면 - 8.png: 사건조회/초대 화면 - 10.png: 누끼 폰 (RGB) - 11.png: 누끼 폰 (RGBA 투명) - 12.png: 초대 화면 폰 누끼 - 13.png: 감정일기 폰 누끼 - 14.png: 판결 결과 폰 누끼 (상단 잘림) - animal01~03.png: 고양이/강아지/판다 캐릭터 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(about): framer-motion 패키지 설치 * feat(about): 랜딩 페이지 1400px 레이아웃 확장 및 타이포 스케일 조정 - 전체 섹션 max-width 1400px 통일 - 히어로 absolute 레이아웃 유지하며 좌우 포지션 조정 - revolving 단어 크기(52px/80px) 및 마스크 높이 업데이트 - 히어로 타이포 58px, 쇼케이스 타이포 52px로 확장 - 피처카드 flex: 1 + space-between으로 너비 채움 - 쇼케이스 space-between + showcaseText max-width 600px - SCSS 이미지 고정 width 제거 → Image props로 제어 * feat(about): GSAP 제거 → Framer Motion으로 전환 - gsap 의존성 완전 제거 - 히어로 폰 입장 애니메이션 + float 루프 (motion.div) - heroRight 슬라이드인 애니메이션 (motion.div) - revolving words: DOM 조작 방식 → 상태 기반 AnimatePresence로 단순화 - setInterval로 2초마다 단어 순환, phase=content 1.5초 후 시작 * style(variables): font-weight-extrabold 토큰 추가 및 포맷 정리 * fix(layout): about 페이지 container 클래스 분리 처리 - RootLayout에서 전역 container div 제거 - PageLayout에서 about 여부에 따라 container 조건부 적용 * chore(about): 랜딩 페이지 목업 이미지 에셋 추가 * chore(about): 구버전 이미지 에셋 제거 numbered 이미지(1~14.png) 및 s1_bg copy.svg 삭제 mockup01~04.png로 대체 완료 Co-Authored-By: Claude <noreply@anthropic.com> * feat(about): 히어로 배경 이미지 추가 및 heroRight 애니메이션 제거 - s1_bg.svg를 heroInner에 absolute z-index 0으로 배치 (목업 뒤) - heroRight motion.div 제거 → 정적 렌더링으로 세로정렬 안정화 - Framer Motion transform 충돌 방지를 위해 포지셔닝/애니메이션 div 분리 Co-Authored-By: Claude <noreply@anthropic.com> * style(about): 피처카드 레이아웃 및 헤더 버튼 스타일 정리 - featureCard min-height 확장, padding/gap 조정 - featureCardsSection padding 120px으로 통일 - headerLink에 text-body-m 믹스인 적용 - 아이콘 크기 48px로 조정 Co-Authored-By: Claude <noreply@anthropic.com> * chore(about): 동물 캐릭터 이미지 에셋 교체 - animal01~03.png 제거 - animals01.png(고양이+강아지 합본), animals02.png(판다) 추가 - mockup02.png 업데이트 Co-Authored-By: Claude <noreply@anthropic.com> * style(about): 피처카드 동물 캐릭터 배치 개선 - animal01/02 분리 → animals01(고양이+강아지 합본)으로 통합 - animalCatnDog을 featureCardsSection 기준 absolute 배치 - featureCardsSection에 position: relative 추가 - animalPanda 위치 조정 Co-Authored-By: Claude <noreply@anthropic.com> * style(about): showcase 레이아웃 개선 및 목업 이미지 비율 수정 - showcaseWrapper에 overflow hidden 추가 - showcaseSection justify-content space-between 적용 - showcaseText min-height 600px 및 justify-content center 설정 - showcaseDesc font-family/size 제거하고 text-body-l 믹스인으로 대체, 색상 black-400으로 변경 - showcasePhoneImage margin-bottom 제거 - showcaseTitle font-family 중복 제거, font-size 52→48 조정 - 목업 이미지(02~04) 실제 비율에 맞게 width/height 수정 Co-Authored-By: Claude <noreply@anthropic.com> * fix(about): 푸터 서비스 소개 링크 추가 및 래퍼 div 적용 - HomeServiceInfo의 서비스 소개 링크에 /about 경로 연결 - about 페이지 푸터에 serviceInfoWrapper div 추가 Co-Authored-By: Claude <noreply@anthropic.com> * feat(about): Framer Motion 스크롤 애니메이션 및 반응형 레이아웃 적용 - 섹션별 다양한 진입 애니메이션 추가 (fadeUp / slideLeft / slideRight / walkIn / dropBounce / scaleUp / riseUp / cardContainer 스태거) - animals01 대각선 걸어오기, animals02 스프링 바운스 적용 - 미디어쿼리를 respond-to 믹스인 기반 모바일-퍼스트로 전면 리팩터링 - 브레이크포인트를 mobile / lg(1024px+) 2단계로 단순화 - 모바일: 히어로 수직 스택, 회전 단어 상하 숨김, 목업 90vw - 헤더 position fixed + backdrop-filter blur 처리 Co-Authored-By: Claude <noreply@anthropic.com> * fix(about): 피처 카드 hover 추가 및 미사용 CSS 정리 - 피처 카드 whileHover y:-6 + box-shadow 인터랙션 추가 - animalCatnDog 모바일 하단 padding 80px→180px으로 카드 겹침 수정 - 미사용 클래스 제거: revolvingTrack, revolvingTrackBelow, heroPhone, titleBold, siteFooter, footerLogo, footerLinks, footerCopy Co-Authored-By: Claude <noreply@anthropic.com> * chore(about): 애니메이션 duration 조정 및 카피라이트 수정 - 전체 모션 duration 0.1~0.3s 증가로 자연스러운 진입감 개선 - dropBounce stiffness 180→120으로 스프링 속도 완화 - staggerChildren 0.13→0.18s로 카드 순차 등장 간격 확보 - 감정일기 섹션 설명 문구 개선 Co-Authored-By: Claude <noreply@anthropic.com> * feat(about): 헤더 로고 클릭 시 메인 페이지 이동 링크 추가 Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: 배근영 <bgy09270@naver.com>
* feat: 판결 결과 컴포넌트 및 도메인 로직 초기 작업 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 판결 결과 페이지 구현 (#판결탭/유형탭/UI) - DisputePage: 판결/유형 서브탭(Tab 공통컴포넌트) 추가 - JudgmentResult: 이미지 기준 UI 재구성, nickname 적용 - JudgmentTypeResult: 유형탭 컴포넌트 신규 생성 (카드이미지, ActionPrompt) - Tab.module.scss: w60 h36 사이즈 조정 - DisputeParticipantDto: nickname 필드 추가 - disputes/[id]/route: nickname 조회 추가 - judgment.mapper: cardImageUrl 추가 - types/judgment: ConflictTypeDetailDto에 cardImageUrl 추가 - auth/index: 카카오 로그인 시 profileImageUrl 저장 - page.module.scss: diaryBox max-width 제거 - NewCaseButton: AbortController timeout 30s Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: next.config에 Supabase Storage 및 카카오 이미지 도메인 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: JudgmentResult Avatar img 태그를 next/image로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 리뷰 반영 - participants nickname → name으로 변경 (DTO, route, 컴포넌트, useActiveCases) - next.config: 카카오 HTTP 패턴 제거 (HTTPS만 허용) - DisputePage: isCompleted null 케이스 처리 (!!dispute) - JudgmentResult.module.scss: declaration-empty-line-before stylelint 수정 - JudgmentTypeResult.module.scss: 동일 stylelint 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 추가 리뷰 반영 - JudgmentResult/JudgmentTypeResult: props 대신 disputeId 기반 직접 API 호출 (새로고침 시 데이터 유실 방지, TanStack Query 캐시로 중복 요청 없음) - DisputePage: judgment/participants props 제거, isError 기반 에러 처리 - auth/index.ts: 프로필 이미지 백필 try-catch 감싸기 (실패 시 로그인 차단 방지) - judgement.api.ts: 에러 메시지 사용자 친화적으로 개선 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: 불필요한 스크린샷 PNG 파일 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: CalendarRecord 모델 제거 및 EmotionDiary title 필드 추가 - CalendarRecord 모델 및 CalendarRecordType enum 제거 - User, DisputeRoom, RoomAiConversation, Dispute에서 calendarRecords relation 제거 - EmotionDiary에 title 필드 추가 (VarChar 200) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건기록 페이지 API 연동 - GET /api/disputes에 completed=true 쿼리 파라미터 추가 (judged/closed 필터링) - fetchCompletedCases, useCompletedCases 추가 (카테고리 필터 + 최신순) - RecordListSection 더미 데이터 제거, 실제 API 연동 - 사건 박스 클릭 시 /disputes/{id}로 이동 (기존 Link 구조 유지) - 로딩/에러/빈 상태 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건기록 빈 상태 UI 개선 - 빈 상태 텍스트 → '등록한 사건이 없어요' - character-case.png 이미지 + 텍스트 중앙 배치 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건박스 공통 컴포넌트 CaseRecordCard 분리 - CaseRecordCard 신규 생성 (src/components/ui) - MUI AvatarGroup으로 1인/2인 참여자 프로필 겹침 표시 - RecordListSection에서 CaseRecordCard 사용하도록 교체 - 카드 스타일 RecordListSection.module.scss → CaseRecordCard.module.scss로 이동 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카카오 CDN http 프로토콜 이미지 허용 (img1.kakaocdn.net) 카카오 기본 프로필 이미지 URL이 http로 오는 경우가 있어 *.kakaocdn.net http 패턴 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 홈 페이지 배경 그라데이션 추가 (primary-200 → white) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 홈 그라데이션 범위 15%로 조정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: dispute.hooks.ts dev 브랜치 import 충돌 사전 해결 - UseQueryOptions, DisputeDto import 추가 (dev 브랜치 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: dispute.hooks.ts dev 브랜치 useDispute refetchInterval 옵션 반영 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 및 juacheon 리뷰 반영 - disputes/route.ts: active/completed 동시 사용 시 if/else 분기로 필터 충돌 방지 - CaseRecordCard: <time> 요소에 dateTime 속성 추가 (접근성) - Header: transparent prop 추가, :global(header) 셀렉터 제거 - RecordListSection: 에러 메시지 구체화 - next.config.ts: 중복 HTTP 항목 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 2인 판결결과 점수 그래프 UI 수정 - isEqual/barEqual 제거, 색상 로직 ratioA >= ratioB 패턴으로 단순화 - scoreGraph margin-bottom 추가 - scoreAvatarImg 크기 명시적 fn.r(48)로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 2인 판결결과 그래프 디테일 수정 - 바 height 12 → 16, border-radius 6 → 4 - 중앙 실선 추가 (solid, border-strong, h36) - barDark 컬러 → status-disabled-text - scoreTitle 이름 부분만 bold 처리 - AI 고지 문구 컬러 → text-secondary Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 진술 탭 참여자 이름/MBTI 표시, 프로필 이미지 fallback 개선 - 진술 카드 레이블 A/B → 참여자 실명으로 변경 - 진술 카드 하단 프로필 이미지 + MBTI 추가 - DisputeParticipantDto에 mbti 필드 추가 - API participants에 mbti 포함 (disputes/[id] GET/PATCH) - profileImageUrl null 시 image 필드 fallback 적용 (목록/상세 API) - DisputePage.module.scss mixins import 추가 - JudgmentResult 그래프 점선/바 높이 디테일 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: JudgmentResult 참여자 이름 변수 통일 및 텍스트 치환 적용 - nameA / nameB 변수로 cardLabel, barLabel 통일 - replaceRoleNames 함수로 aFault/bFault/aSuggestedLine/bSuggestedLine 내 A님→실제이름 치환 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 리뷰 반영 - replaceRoleNames 단일 패스 치환으로 개선 (A님|B님 alternation) - disputes 목록/POST API Prisma 쿼리에 image 필드 선택 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * perf: statistics/categories API 빌드 시 DB 호출 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카테고리 사건 2개 제한 및 사건기록 무한스크롤 - POST /api/rooms 카테고리당 진행중 사건 2개 초과 시 CATEGORY_LIMIT_EXCEEDED(422) 반환 - DisputeListResponse에 hasNext 필드 추가 - fetchCompletedCases 페이지 기반 API 호출로 전환 (limit 10) - useCompletedCases useInfiniteQuery로 전환 - RecordListSection IntersectionObserver 기반 무한스크롤 구현 - 모든 데이터 로드 시 '모든 데이터를 불러왔습니다' 표시 - NewCaseButton 카테고리 한도 초과 시 에러 모달 표시 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 리뷰 반영 - GET /api/disputes: completed 파라미터 where 조건 반영으로 hasNext 정확도 개선 - POST /api/disputes: 카테고리 한도 체크 추가 (직접 API 호출 우회 방지) - NewCaseButton: limitError 모달 표시 시 body 스크롤 잠금 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카테고리 한도 초과 에러 모달 UI 개선 - 기존 카테고리 패널 스타일 재사용 → 독립 검은 배경 센터 모달로 변경 - limitOverlay, limitModal, limitMessage, limitCloseButton 스타일 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카테고리 한도 에러 모달 메시지 줄바꿈 적용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 홈 통계 staleTime 24시간 → 1시간으로 단축 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 갈등유형 공유 페이지 분리 및 URL 공유 기능 구현 - /disputes/[id]/type 갈등유형 전용 페이지 신규 생성 (비회원 접근 가능) - GET /api/disputes/[id]/conflict-type 공개 API 추가 (유형명·이미지 URL만 반환) - 미들웨어에서 /disputes/[id]/type 인증 예외 처리 - 카카오 공유 → URL 복사(PC) / Web Share API(모바일) 방식으로 변경 - generateMetadata로 OG 메타 태그 생성 (og:image에 cardImageUrl 적용) - root layout에 metadataBase 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 갈등유형 결과 이미지 다운로드 기능 구현 - ConflictTypeClient, JudgmentTypeResult 결과 다운받기 버튼 활성화 - Supabase Storage 이미지 fetch 후 Blob 변환으로 로컬 저장 - fetch 실패(CORS 등) 시 새 탭으로 열어 수동 저장 유도 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: metadataBase에 VERCEL_URL fallback 추가 - 배포 환경에서 NEXT_PUBLIC_BASE_URL 미설정 시 VERCEL_URL을 자동 감지하여 사용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: ConflictTypeDetail Prisma 필드명 card_image_url로 수정 - cardImageUrl은 @Map 없이 card_image_url로 정의된 필드 - select 및 반환 시 camelCase 변환 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: JudgmentTypeResult에 disputeId prop 전달 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: ConflictTypeClient data null 체크 옵셔널 체이닝 적용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 리뷰 반영 (res.ok 체크, SCSS 린트, 에러 로그, Kakao SDK 제거) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 갈등 유형 탭 이름 표시를 role_a 고정에서 현재 사용자 기준으로 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: session.user.id 타입 오류 수정 및 유형 탭 이름 표시 fallback 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(chatbot): 마이페이지 고객문의 챗봇 구현 Gemini API 기반 FAQ 챗봇을 마이페이지에 플로팅 버튼으로 추가. GSAP 애니메이션 적용 (열기/닫기, 메시지 등장, 캐릭터 바운스). 대화 내역 DB 저장/조회 기능 포함. - 챗봇 UI 컴포넌트 (플로팅 버튼 + 채팅 화면 + 커스텀 메뉴) - Gemini 2.5 Flash 연동 FAQ 응답 (서비스 안내 범위 제한) - ChatSession/ChatMessage Prisma 모델 추가 - 챗봇 API Route (POST/GET/DELETE) - contact 페이지 및 관련 참조 삭제 - middleware에서 contact 인증 예외 경로 제거 Co-Authored-By: Claude <noreply@anthropic.com> * fix(chatbot): Gemini API 503/429 에러 재시도 로직 추가 일시적 서버 과부하(503) 및 요청 제한(429) 발생 시 최대 2회 재시도하여 응답 안정성 향상. Co-Authored-By: Claude <noreply@anthropic.com> * fix(chatbot): 코드 리뷰 반영 - 에러 분기, role 매핑, 히스토리 제한 - role 대소문자 불일치 수정 (toLowerCase 비교) - Gemini 실패(502), 타임아웃(504) 에러 유형 분리 - 30초 요청 타임아웃 추가 - 히스토리 조회 최근 30개로 제한 - DELETE 실패 시 사용자 안내 메시지 추가 - 히스토리 로드 실패 시 재시도 가능하도록 수정 Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
* feat: 판결 결과 컴포넌트 및 도메인 로직 초기 작업 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 판결 결과 페이지 구현 (#판결탭/유형탭/UI) - DisputePage: 판결/유형 서브탭(Tab 공통컴포넌트) 추가 - JudgmentResult: 이미지 기준 UI 재구성, nickname 적용 - JudgmentTypeResult: 유형탭 컴포넌트 신규 생성 (카드이미지, ActionPrompt) - Tab.module.scss: w60 h36 사이즈 조정 - DisputeParticipantDto: nickname 필드 추가 - disputes/[id]/route: nickname 조회 추가 - judgment.mapper: cardImageUrl 추가 - types/judgment: ConflictTypeDetailDto에 cardImageUrl 추가 - auth/index: 카카오 로그인 시 profileImageUrl 저장 - page.module.scss: diaryBox max-width 제거 - NewCaseButton: AbortController timeout 30s Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: next.config에 Supabase Storage 및 카카오 이미지 도메인 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: JudgmentResult Avatar img 태그를 next/image로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 리뷰 반영 - participants nickname → name으로 변경 (DTO, route, 컴포넌트, useActiveCases) - next.config: 카카오 HTTP 패턴 제거 (HTTPS만 허용) - DisputePage: isCompleted null 케이스 처리 (!!dispute) - JudgmentResult.module.scss: declaration-empty-line-before stylelint 수정 - JudgmentTypeResult.module.scss: 동일 stylelint 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 추가 리뷰 반영 - JudgmentResult/JudgmentTypeResult: props 대신 disputeId 기반 직접 API 호출 (새로고침 시 데이터 유실 방지, TanStack Query 캐시로 중복 요청 없음) - DisputePage: judgment/participants props 제거, isError 기반 에러 처리 - auth/index.ts: 프로필 이미지 백필 try-catch 감싸기 (실패 시 로그인 차단 방지) - judgement.api.ts: 에러 메시지 사용자 친화적으로 개선 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: 불필요한 스크린샷 PNG 파일 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: CalendarRecord 모델 제거 및 EmotionDiary title 필드 추가 - CalendarRecord 모델 및 CalendarRecordType enum 제거 - User, DisputeRoom, RoomAiConversation, Dispute에서 calendarRecords relation 제거 - EmotionDiary에 title 필드 추가 (VarChar 200) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건기록 페이지 API 연동 - GET /api/disputes에 completed=true 쿼리 파라미터 추가 (judged/closed 필터링) - fetchCompletedCases, useCompletedCases 추가 (카테고리 필터 + 최신순) - RecordListSection 더미 데이터 제거, 실제 API 연동 - 사건 박스 클릭 시 /disputes/{id}로 이동 (기존 Link 구조 유지) - 로딩/에러/빈 상태 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건기록 빈 상태 UI 개선 - 빈 상태 텍스트 → '등록한 사건이 없어요' - character-case.png 이미지 + 텍스트 중앙 배치 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건박스 공통 컴포넌트 CaseRecordCard 분리 - CaseRecordCard 신규 생성 (src/components/ui) - MUI AvatarGroup으로 1인/2인 참여자 프로필 겹침 표시 - RecordListSection에서 CaseRecordCard 사용하도록 교체 - 카드 스타일 RecordListSection.module.scss → CaseRecordCard.module.scss로 이동 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카카오 CDN http 프로토콜 이미지 허용 (img1.kakaocdn.net) 카카오 기본 프로필 이미지 URL이 http로 오는 경우가 있어 *.kakaocdn.net http 패턴 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 홈 페이지 배경 그라데이션 추가 (primary-200 → white) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 홈 그라데이션 범위 15%로 조정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: dispute.hooks.ts dev 브랜치 import 충돌 사전 해결 - UseQueryOptions, DisputeDto import 추가 (dev 브랜치 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: dispute.hooks.ts dev 브랜치 useDispute refetchInterval 옵션 반영 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 및 juacheon 리뷰 반영 - disputes/route.ts: active/completed 동시 사용 시 if/else 분기로 필터 충돌 방지 - CaseRecordCard: <time> 요소에 dateTime 속성 추가 (접근성) - Header: transparent prop 추가, :global(header) 셀렉터 제거 - RecordListSection: 에러 메시지 구체화 - next.config.ts: 중복 HTTP 항목 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 2인 판결결과 점수 그래프 UI 수정 - isEqual/barEqual 제거, 색상 로직 ratioA >= ratioB 패턴으로 단순화 - scoreGraph margin-bottom 추가 - scoreAvatarImg 크기 명시적 fn.r(48)로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 2인 판결결과 그래프 디테일 수정 - 바 height 12 → 16, border-radius 6 → 4 - 중앙 실선 추가 (solid, border-strong, h36) - barDark 컬러 → status-disabled-text - scoreTitle 이름 부분만 bold 처리 - AI 고지 문구 컬러 → text-secondary Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 진술 탭 참여자 이름/MBTI 표시, 프로필 이미지 fallback 개선 - 진술 카드 레이블 A/B → 참여자 실명으로 변경 - 진술 카드 하단 프로필 이미지 + MBTI 추가 - DisputeParticipantDto에 mbti 필드 추가 - API participants에 mbti 포함 (disputes/[id] GET/PATCH) - profileImageUrl null 시 image 필드 fallback 적용 (목록/상세 API) - DisputePage.module.scss mixins import 추가 - JudgmentResult 그래프 점선/바 높이 디테일 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: JudgmentResult 참여자 이름 변수 통일 및 텍스트 치환 적용 - nameA / nameB 변수로 cardLabel, barLabel 통일 - replaceRoleNames 함수로 aFault/bFault/aSuggestedLine/bSuggestedLine 내 A님→실제이름 치환 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 리뷰 반영 - replaceRoleNames 단일 패스 치환으로 개선 (A님|B님 alternation) - disputes 목록/POST API Prisma 쿼리에 image 필드 선택 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * perf: statistics/categories API 빌드 시 DB 호출 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카테고리 사건 2개 제한 및 사건기록 무한스크롤 - POST /api/rooms 카테고리당 진행중 사건 2개 초과 시 CATEGORY_LIMIT_EXCEEDED(422) 반환 - DisputeListResponse에 hasNext 필드 추가 - fetchCompletedCases 페이지 기반 API 호출로 전환 (limit 10) - useCompletedCases useInfiniteQuery로 전환 - RecordListSection IntersectionObserver 기반 무한스크롤 구현 - 모든 데이터 로드 시 '모든 데이터를 불러왔습니다' 표시 - NewCaseButton 카테고리 한도 초과 시 에러 모달 표시 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 리뷰 반영 - GET /api/disputes: completed 파라미터 where 조건 반영으로 hasNext 정확도 개선 - POST /api/disputes: 카테고리 한도 체크 추가 (직접 API 호출 우회 방지) - NewCaseButton: limitError 모달 표시 시 body 스크롤 잠금 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카테고리 한도 초과 에러 모달 UI 개선 - 기존 카테고리 패널 스타일 재사용 → 독립 검은 배경 센터 모달로 변경 - limitOverlay, limitModal, limitMessage, limitCloseButton 스타일 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카테고리 한도 에러 모달 메시지 줄바꿈 적용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 홈 통계 staleTime 24시간 → 1시간으로 단축 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 갈등유형 공유 페이지 분리 및 URL 공유 기능 구현 - /disputes/[id]/type 갈등유형 전용 페이지 신규 생성 (비회원 접근 가능) - GET /api/disputes/[id]/conflict-type 공개 API 추가 (유형명·이미지 URL만 반환) - 미들웨어에서 /disputes/[id]/type 인증 예외 처리 - 카카오 공유 → URL 복사(PC) / Web Share API(모바일) 방식으로 변경 - generateMetadata로 OG 메타 태그 생성 (og:image에 cardImageUrl 적용) - root layout에 metadataBase 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 갈등유형 결과 이미지 다운로드 기능 구현 - ConflictTypeClient, JudgmentTypeResult 결과 다운받기 버튼 활성화 - Supabase Storage 이미지 fetch 후 Blob 변환으로 로컬 저장 - fetch 실패(CORS 등) 시 새 탭으로 열어 수동 저장 유도 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: metadataBase에 VERCEL_URL fallback 추가 - 배포 환경에서 NEXT_PUBLIC_BASE_URL 미설정 시 VERCEL_URL을 자동 감지하여 사용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: ConflictTypeDetail Prisma 필드명 card_image_url로 수정 - cardImageUrl은 @Map 없이 card_image_url로 정의된 필드 - select 및 반환 시 camelCase 변환 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: JudgmentTypeResult에 disputeId prop 전달 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: ConflictTypeClient data null 체크 옵셔널 체이닝 적용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 리뷰 반영 (res.ok 체크, SCSS 린트, 에러 로그, Kakao SDK 제거) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 갈등 유형 탭 이름 표시를 role_a 고정에서 현재 사용자 기준으로 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: session.user.id 타입 오류 수정 및 유형 탭 이름 표시 fallback 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #124 리뷰 반영 - ConflictTypeClient 에러 상태 뒤로가기, 타이틀 개인화, 비로그인 버튼 경로 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 새 사건 카테고리 패널 딤 배경 적용, 에러 알림 모달로 변경, 홈 캐릭터 이미지 위치 조정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: closed 상태 판결 결과 미로드, 기본 이미지 확장자 통일, replaceRoleNames 순서 버그 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 갈등 유형 카드 이미지 max-width 360px 제한 적용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(chatbot): Apply Gemini model fallback logic Replace single-model retry with multi-model fallback matching the pattern used in moderation and judgment. On 503/404/429 errors the chatbot now cycles through gemini-2.0-flash-lite, gemini-2.5-flash, and gemini-1.5-flash before giving up. @ Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* @ fix: Replace deprecated gemini-1.5-flash with gemini-2.0-flash gemini-1.5-flash is no longer available in the v1beta API, causing 404 errors when all prior fallback models also fail. Update the last resort model to gemini-2.0-flash across chatbot, moderation, and judgment. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> @ * @ fix: Remove deprecated models and add per-model retry for 503/429 gemini-2.0-flash-lite, gemini-2.0-flash, gemini-1.5-flash are all deprecated (404). Replace with gemini-2.5-flash + gemini-2.5-pro fallback. Add per-model retry (up to 2 attempts with backoff) for transient 503/429 errors before switching to next model. Apply to chatbot, moderation, and judgment. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> @ * @ fix: Use gemini-2.5-flash only with increased retry count Remove multi-model fallback to avoid gemini-2.5-pro cost overhead. Use gemini-2.5-flash as single model with up to 3 retries on transient 503/429 errors across chatbot, moderation, and judgment. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> @ * @ fix(chatbot): Add plain text only instruction to system prompt Gemini sometimes returns markdown syntax (**, ##) in responses which renders as literal characters in the chat UI. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> @ --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- MBTI 텍스트가 이름 시작점과 동일하게 왼쪽 정렬되도록 수정 - badge 스타일에서 불필요한 padding, background, border-radius 제거 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- HomeServiceInfo 공통 컴포넌트에서 고객문의 항목 삭제 - 서비스 소개, 개인정보 처리방침, 이용약관 3개만 표시 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. 🗂️ Base branches to auto review (1)
Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI (base), Organization UI (inherited) Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Test plan
🤖 Generated with Claude Code