docs: 단독 판결 MVP 포함 및 CLAUDE.md 정책 업데이트 - #51
Conversation
- 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>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
📝 WalkthroughWalkthrough
ChangesCLAUDE.md 판결 흐름 문서 갱신
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@CLAUDE.md`:
- Around line 7-31: The documented "solo judgment flow" in CLAUDE.md is not
supported by the current API implementation because the dispute creation
endpoint enforces ONE_TO_ONE room mode and the judgment endpoint requires
BOTH_SUBMITTED status. Create a new endpoint for solo judgment disputes (or
modify the existing POST /disputes endpoint to conditionally support both
modes), update the judgment generation logic in the judge endpoint to accept
requests when either a single statement is completed OR both statements are
completed, and ensure the dispute status validation allows judgment generation
in both solo and dual-submission scenarios. Reference the roomMode check in
disputes/route.ts and the status check in disputes/[id]/judge/route.ts to
identify where these restrictions are enforced and need to be updated.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI (base), Organization UI (inherited)
Review profile: CHILL
Plan: Pro Plus
Run ID: e6c22cd3-79d0-4f7b-be0e-107c6be8a4ee
📒 Files selected for processing (1)
CLAUDE.md
| 사용자가 갈등 상황을 AI와 먼저 정리한 뒤, 단독으로 판결을 받거나 상대방을 초대하여 1:1 조정 상태로 전환하고, 진술을 기반으로 AI 판결과 관계 회복 제안을 제공한다. | ||
|
|
||
| ### 핵심 서비스 흐름 | ||
|
|
||
| **단독 판결 흐름** | ||
| ```txt | ||
| AI 대화방 생성 | ||
| → AI 대화 | ||
| → 단독 진술 작성 | ||
| → AI 판결 생성 (제한적 결과) | ||
| → 판결 결과 확인 | ||
| ``` | ||
|
|
||
| **1:1 판결 흐름** | ||
| ```txt | ||
| AI 대화방 생성 | ||
| → AI 대화 | ||
| → 초대 링크 발급 | ||
| → 상대방 참여 | ||
| → 1:1 조정 전환 | ||
| → 양측 진술 작성 | ||
| → AI 판결 생성 | ||
| → AI 판결 생성 (전체 결과) | ||
| → 판결 결과 확인 | ||
| → 선물추천 | ||
| ``` |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# PR `#49에서` 변경된 disputes/route.ts 확인
git log --oneline -n 20 | grep -i "49\|단독\|single"
# 현재 disputes/route.ts의 전체 내용 확인
cat src/app/api/disputes/route.tsRepository: I5-Project/TALKY-OWL
Length of output: 7389
🏁 Script executed:
#!/bin/bash
# Check CLAUDE.md file content at specified lines
head -40 CLAUDE.md | tail -35
# Search for other API endpoints related to judgments
find src/app/api -type f -name "*.ts" | head -20Repository: I5-Project/TALKY-OWL
Length of output: 726
🏁 Script executed:
#!/bin/bash
# Search for judgment-related endpoints
rg "judgment|judgement|단독" src/app/api --type ts -i -lRepository: I5-Project/TALKY-OWL
Length of output: 147
🏁 Script executed:
#!/bin/bash
# Check the judge and result endpoints
echo "=== Judge endpoint ==="
cat src/app/api/disputes/\[id\]/judge/route.ts
echo ""
echo "=== Result endpoint ==="
cat src/app/api/disputes/\[id\]/result/route.tsRepository: I5-Project/TALKY-OWL
Length of output: 9319
CLAUDE.md와 실제 API 구현 간 일관성 부재
CLAUDE.md에서 문서화한 "단독 판결 흐름"이 현재 API 구현에서 지원되지 않습니다.
확인된 문제:
disputes/route.tsPOST:room.roomMode === 'ONE_TO_ONE'강제 → 2인 참여 필수disputes/[id]/judge/route.tsPOST:dispute.status === 'BOTH_SUBMITTED'필수 → 양측 진술 완료 후에만 판결 가능- 단독 판결 사건 생성 엔드포인트 부재
필요한 작업:
- 단독 판결을 위한 별도 API 엔드포인트 추가 (예:
POST /api/disputes/solo) - 판결 요청 로직 수정: 단독 진술 완료 또는 양측 진술 완료 모두 지원
- 문서와 구현 동기화
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@CLAUDE.md` around lines 7 - 31, The documented "solo judgment flow" in
CLAUDE.md is not supported by the current API implementation because the dispute
creation endpoint enforces ONE_TO_ONE room mode and the judgment endpoint
requires BOTH_SUBMITTED status. Create a new endpoint for solo judgment disputes
(or modify the existing POST /disputes endpoint to conditionally support both
modes), update the judgment generation logic in the judge endpoint to accept
requests when either a single statement is completed OR both statements are
completed, and ensure the dispute status validation allows judgment generation
in both solo and dual-submission scenarios. Reference the roomMode check in
disputes/route.ts and the status check in disputes/[id]/judge/route.ts to
identify where these restrictions are enforced and need to be updated.
| 단독 판결 미제공 (1:1 판결 전용): | ||
| - A/B 판결 점수 | ||
| - 선물추천 문구 | ||
| - 16가지 세부 결과 유형 |
* 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: 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> * feat: Textarea 바이트 카운팅 및 filterMessage prop 추가 - 한글 2바이트/ASCII 1바이트 기준으로 글자 수 계산 - maxLength 초과 시 바이트 기준으로 자동 truncate - filterMessage prop 추가 — 욕설 차단 메시지 동적 표시 - border 색상 변경은 error prop에만 적용 (filter는 border 유지) - filter-warning 텍스트: Body-S + var(--text-danger) - field gap 8 → 10px (Figma 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 욕설 감지 필터 구현 (Gemini 2.5 Flash) - moderation.ts: Gemini 2.5 Flash 기반 욕설/개인정보 감지 - isBlocked: 욕설·혐오·위협 차단 (보수적 기준) - hasPersonalInfo: 개인정보 경고 (차단 없음) - fail-open: Gemini 실패 시 pending 상태로 저장 - statements/route.ts: 진술 저장 API - 모더레이션 통과 후 upsert + ModerationLog 트랜잭션 - 차단 시 ModerationLog만 기록, 저장 없이 422 반환 - dev bypass: 개발 환경에서 세션 없이 모더레이션 테스트 가능 - page.tsx: handleSave 연결, filterMessage 상태, 개인정보 경고 모달 - StatementPage.module.scss: 모달 스타일, Stylelint 공백 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #49 코드리뷰 수정 — MBTI 연동, 파싱 에러, 인젝션, 타임아웃 - MBTI: GET /api/user/me 신규 생성, statement 페이지 마운트 시 user.mbti 초기화 - MBTI: handleSave body에 mbti 포함, statements route에서 user.mbti 업데이트 (트랜잭션) - statement/page.tsx: res.json() 파싱 실패를 별도 try-catch로 분리 - Textarea.tsx: e.target.value 직접 변경 → Object.assign으로 새 이벤트 객체 전달 - moderation.ts: content 삽입 전 < > HTML 이스케이프 (프롬프트 인젝션 방지) - moderation.ts: Promise.race() 기반 10초 타임아웃 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: user/me route catch 블록에 에러 로깅 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: judge route 1인 판결 허용 — isSolo 분기 및 rollback 상태 수정 - 2인: BOTH_SUBMITTED 상태 확인 유지 - 1인: 진술 제출 여부만 확인 (statements.length > 0) - 롤백 대상을 하드코딩된 BOTH_SUBMITTED → previousStatus로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카카오 로그인 기능 구현 (#50) * 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> * feat: 카카오 로그인 기능 구현 - 로그인 페이지 UI 및 카카오 signIn 버튼 연결 - @auth/prisma-adapter 설치 및 authOptions에 적용 - 최초 로그인 시 kakaoId, nickname, termsAgreedAt 자동 설정 - 닉네임 자동 생성 유틸 추가 (~하는부엉이 + 4자리 난수) - middleware 추가: 비인증 사용자 /login 리다이렉트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 로그인 페이지 및 인증 로직 개선 - SCSS import 절대경로(@/) 수정 - 캐릭터 이미지 Next/Image fill → img 태그로 변경 - 이용약관/개인정보처리방침 링크(/terms, /privacy) 추가 및 스타일 적용 - 닉네임 유니크 제약(@unique) 추가 및 충돌 재시도 로직 구현 (최대 10회) - middleware matcher 패턴 보완 (/login-help 등 우회 경로 차단) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: disclaimer mixin 적용, nickname 유실 복구 및 fallback 랜덤화 - .disclaimer에 @include m.text-caption mixin 적용 - 유실된 nickname.ts 복구 - fallback 닉네임 Date.now() → 랜덤 8자리 숫자로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 단독/1:1 판결 공통 진입 흐름 반영 및 관련 문서 일괄 수정 (#54) - 단독 판결과 1:1 판결이 완전히 분리된 진입이 아니라 AI 대화방 → 진술저장 → [분기] → disputes/[id]/statement 경로를 공통으로 거침 - CLAUDE.md: 핵심 서비스 흐름 분기 구조로 수정, 단독 판결 MVP 포함 반영, AI 대화방 정책 단독/1:1 병행 기술, dispute_status 단독 경로 추가 - PROJECT_DECISIONS.md: 흐름·MVP포함·MVP제외·dispute_status 동기화 - STATUS_TRANSITION.md: 단독 판결 경로(draft→judging→judged) 추가 - DISPUTE.md: 상태 전이 단독/1:1 경로 분리 기술, 주의사항 확정 내용 반영 - ROOM.md: 진술저장 후 분기 흐름 포함 기능에 명시 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Login 페이지 hydration removeChild 에러 수정 (#55) * 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 아이콘 - …
* 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: 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> * feat: Textarea 바이트 카운팅 및 filterMessage prop 추가 - 한글 2바이트/ASCII 1바이트 기준으로 글자 수 계산 - maxLength 초과 시 바이트 기준으로 자동 truncate - filterMessage prop 추가 — 욕설 차단 메시지 동적 표시 - border 색상 변경은 error prop에만 적용 (filter는 border 유지) - filter-warning 텍스트: Body-S + var(--text-danger) - field gap 8 → 10px (Figma 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 욕설 감지 필터 구현 (Gemini 2.5 Flash) - moderation.ts: Gemini 2.5 Flash 기반 욕설/개인정보 감지 - isBlocked: 욕설·혐오·위협 차단 (보수적 기준) - hasPersonalInfo: 개인정보 경고 (차단 없음) - fail-open: Gemini 실패 시 pending 상태로 저장 - statements/route.ts: 진술 저장 API - 모더레이션 통과 후 upsert + ModerationLog 트랜잭션 - 차단 시 ModerationLog만 기록, 저장 없이 422 반환 - dev bypass: 개발 환경에서 세션 없이 모더레이션 테스트 가능 - page.tsx: handleSave 연결, filterMessage 상태, 개인정보 경고 모달 - StatementPage.module.scss: 모달 스타일, Stylelint 공백 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #49 코드리뷰 수정 — MBTI 연동, 파싱 에러, 인젝션, 타임아웃 - MBTI: GET /api/user/me 신규 생성, statement 페이지 마운트 시 user.mbti 초기화 - MBTI: handleSave body에 mbti 포함, statements route에서 user.mbti 업데이트 (트랜잭션) - statement/page.tsx: res.json() 파싱 실패를 별도 try-catch로 분리 - Textarea.tsx: e.target.value 직접 변경 → Object.assign으로 새 이벤트 객체 전달 - moderation.ts: content 삽입 전 < > HTML 이스케이프 (프롬프트 인젝션 방지) - moderation.ts: Promise.race() 기반 10초 타임아웃 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: user/me route catch 블록에 에러 로깅 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: judge route 1인 판결 허용 — isSolo 분기 및 rollback 상태 수정 - 2인: BOTH_SUBMITTED 상태 확인 유지 - 1인: 진술 제출 여부만 확인 (statements.length > 0) - 롤백 대상을 하드코딩된 BOTH_SUBMITTED → previousStatus로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카카오 로그인 기능 구현 (#50) * 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> * feat: 카카오 로그인 기능 구현 - 로그인 페이지 UI 및 카카오 signIn 버튼 연결 - @auth/prisma-adapter 설치 및 authOptions에 적용 - 최초 로그인 시 kakaoId, nickname, termsAgreedAt 자동 설정 - 닉네임 자동 생성 유틸 추가 (~하는부엉이 + 4자리 난수) - middleware 추가: 비인증 사용자 /login 리다이렉트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 로그인 페이지 및 인증 로직 개선 - SCSS import 절대경로(@/) 수정 - 캐릭터 이미지 Next/Image fill → img 태그로 변경 - 이용약관/개인정보처리방침 링크(/terms, /privacy) 추가 및 스타일 적용 - 닉네임 유니크 제약(@unique) 추가 및 충돌 재시도 로직 구현 (최대 10회) - middleware matcher 패턴 보완 (/login-help 등 우회 경로 차단) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: disclaimer mixin 적용, nickname 유실 복구 및 fallback 랜덤화 - .disclaimer에 @include m.text-caption mixin 적용 - 유실된 nickname.ts 복구 - fallback 닉네임 Date.now() → 랜덤 8자리 숫자로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 단독/1:1 판결 공통 진입 흐름 반영 및 관련 문서 일괄 수정 (#54) - 단독 판결과 1:1 판결이 완전히 분리된 진입이 아니라 AI 대화방 → 진술저장 → [분기] → disputes/[id]/statement 경로를 공통으로 거침 - CLAUDE.md: 핵심 서비스 흐름 분기 구조로 수정, 단독 판결 MVP 포함 반영, AI 대화방 정책 단독/1:1 병행 기술, dispute_status 단독 경로 추가 - PROJECT_DECISIONS.md: 흐름·MVP포함·MVP제외·dispute_status 동기화 - STATUS_TRANSITION.md: 단독 판결 경로(draft→judging→judged) 추가 - DISPUTE.md: 상태 전이 단독/1:1 경로 분리 기술, 주의사항 확정 내용 반영 - ROOM.md: 진술저장 후 분기 흐름 포함 기능에 명시 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Login 페이지 hydration removeChild 에러 수정 (#55) * 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-…
* 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: 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> * feat: Textarea 바이트 카운팅 및 filterMessage prop 추가 - 한글 2바이트/ASCII 1바이트 기준으로 글자 수 계산 - maxLength 초과 시 바이트 기준으로 자동 truncate - filterMessage prop 추가 — 욕설 차단 메시지 동적 표시 - border 색상 변경은 error prop에만 적용 (filter는 border 유지) - filter-warning 텍스트: Body-S + var(--text-danger) - field gap 8 → 10px (Figma 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 욕설 감지 필터 구현 (Gemini 2.5 Flash) - moderation.ts: Gemini 2.5 Flash 기반 욕설/개인정보 감지 - isBlocked: 욕설·혐오·위협 차단 (보수적 기준) - hasPersonalInfo: 개인정보 경고 (차단 없음) - fail-open: Gemini 실패 시 pending 상태로 저장 - statements/route.ts: 진술 저장 API - 모더레이션 통과 후 upsert + ModerationLog 트랜잭션 - 차단 시 ModerationLog만 기록, 저장 없이 422 반환 - dev bypass: 개발 환경에서 세션 없이 모더레이션 테스트 가능 - page.tsx: handleSave 연결, filterMessage 상태, 개인정보 경고 모달 - StatementPage.module.scss: 모달 스타일, Stylelint 공백 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #49 코드리뷰 수정 — MBTI 연동, 파싱 에러, 인젝션, 타임아웃 - MBTI: GET /api/user/me 신규 생성, statement 페이지 마운트 시 user.mbti 초기화 - MBTI: handleSave body에 mbti 포함, statements route에서 user.mbti 업데이트 (트랜잭션) - statement/page.tsx: res.json() 파싱 실패를 별도 try-catch로 분리 - Textarea.tsx: e.target.value 직접 변경 → Object.assign으로 새 이벤트 객체 전달 - moderation.ts: content 삽입 전 < > HTML 이스케이프 (프롬프트 인젝션 방지) - moderation.ts: Promise.race() 기반 10초 타임아웃 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: user/me route catch 블록에 에러 로깅 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: judge route 1인 판결 허용 — isSolo 분기 및 rollback 상태 수정 - 2인: BOTH_SUBMITTED 상태 확인 유지 - 1인: 진술 제출 여부만 확인 (statements.length > 0) - 롤백 대상을 하드코딩된 BOTH_SUBMITTED → previousStatus로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카카오 로그인 기능 구현 (#50) * 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> * feat: 카카오 로그인 기능 구현 - 로그인 페이지 UI 및 카카오 signIn 버튼 연결 - @auth/prisma-adapter 설치 및 authOptions에 적용 - 최초 로그인 시 kakaoId, nickname, termsAgreedAt 자동 설정 - 닉네임 자동 생성 유틸 추가 (~하는부엉이 + 4자리 난수) - middleware 추가: 비인증 사용자 /login 리다이렉트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 로그인 페이지 및 인증 로직 개선 - SCSS import 절대경로(@/) 수정 - 캐릭터 이미지 Next/Image fill → img 태그로 변경 - 이용약관/개인정보처리방침 링크(/terms, /privacy) 추가 및 스타일 적용 - 닉네임 유니크 제약(@unique) 추가 및 충돌 재시도 로직 구현 (최대 10회) - middleware matcher 패턴 보완 (/login-help 등 우회 경로 차단) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: disclaimer mixin 적용, nickname 유실 복구 및 fallback 랜덤화 - .disclaimer에 @include m.text-caption mixin 적용 - 유실된 nickname.ts 복구 - fallback 닉네임 Date.now() → 랜덤 8자리 숫자로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 단독/1:1 판결 공통 진입 흐름 반영 및 관련 문서 일괄 수정 (#54) - 단독 판결과 1:1 판결이 완전히 분리된 진입이 아니라 AI 대화방 → 진술저장 → [분기] → disputes/[id]/statement 경로를 공통으로 거침 - CLAUDE.md: 핵심 서비스 흐름 분기 구조로 수정, 단독 판결 MVP 포함 반영, AI 대화방 정책 단독/1:1 병행 기술, dispute_status 단독 경로 추가 - PROJECT_DECISIONS.md: 흐름·MVP포함·MVP제외·dispute_status 동기화 - STATUS_TRANSITION.md: 단독 판결 경로(draft→judging→judged) 추가 - DISPUTE.md: 상태 전이 단독/1:1 경로 분리 기술, 주의사항 확정 내용 반영 - ROOM.md: 진술저장 후 분기 흐름 포함 기능에 명시 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Login 페이지 hydration removeChild 에러 수정 (#55) * 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 아이콘…
* 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: 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> * feat: Textarea 바이트 카운팅 및 filterMessage prop 추가 - 한글 2바이트/ASCII 1바이트 기준으로 글자 수 계산 - maxLength 초과 시 바이트 기준으로 자동 truncate - filterMessage prop 추가 — 욕설 차단 메시지 동적 표시 - border 색상 변경은 error prop에만 적용 (filter는 border 유지) - filter-warning 텍스트: Body-S + var(--text-danger) - field gap 8 → 10px (Figma 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 욕설 감지 필터 구현 (Gemini 2.5 Flash) - moderation.ts: Gemini 2.5 Flash 기반 욕설/개인정보 감지 - isBlocked: 욕설·혐오·위협 차단 (보수적 기준) - hasPersonalInfo: 개인정보 경고 (차단 없음) - fail-open: Gemini 실패 시 pending 상태로 저장 - statements/route.ts: 진술 저장 API - 모더레이션 통과 후 upsert + ModerationLog 트랜잭션 - 차단 시 ModerationLog만 기록, 저장 없이 422 반환 - dev bypass: 개발 환경에서 세션 없이 모더레이션 테스트 가능 - page.tsx: handleSave 연결, filterMessage 상태, 개인정보 경고 모달 - StatementPage.module.scss: 모달 스타일, Stylelint 공백 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #49 코드리뷰 수정 — MBTI 연동, 파싱 에러, 인젝션, 타임아웃 - MBTI: GET /api/user/me 신규 생성, statement 페이지 마운트 시 user.mbti 초기화 - MBTI: handleSave body에 mbti 포함, statements route에서 user.mbti 업데이트 (트랜잭션) - statement/page.tsx: res.json() 파싱 실패를 별도 try-catch로 분리 - Textarea.tsx: e.target.value 직접 변경 → Object.assign으로 새 이벤트 객체 전달 - moderation.ts: content 삽입 전 < > HTML 이스케이프 (프롬프트 인젝션 방지) - moderation.ts: Promise.race() 기반 10초 타임아웃 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: user/me route catch 블록에 에러 로깅 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: judge route 1인 판결 허용 — isSolo 분기 및 rollback 상태 수정 - 2인: BOTH_SUBMITTED 상태 확인 유지 - 1인: 진술 제출 여부만 확인 (statements.length > 0) - 롤백 대상을 하드코딩된 BOTH_SUBMITTED → previousStatus로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카카오 로그인 기능 구현 (#50) * 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> * feat: 카카오 로그인 기능 구현 - 로그인 페이지 UI 및 카카오 signIn 버튼 연결 - @auth/prisma-adapter 설치 및 authOptions에 적용 - 최초 로그인 시 kakaoId, nickname, termsAgreedAt 자동 설정 - 닉네임 자동 생성 유틸 추가 (~하는부엉이 + 4자리 난수) - middleware 추가: 비인증 사용자 /login 리다이렉트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 로그인 페이지 및 인증 로직 개선 - SCSS import 절대경로(@/) 수정 - 캐릭터 이미지 Next/Image fill → img 태그로 변경 - 이용약관/개인정보처리방침 링크(/terms, /privacy) 추가 및 스타일 적용 - 닉네임 유니크 제약(@unique) 추가 및 충돌 재시도 로직 구현 (최대 10회) - middleware matcher 패턴 보완 (/login-help 등 우회 경로 차단) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: disclaimer mixin 적용, nickname 유실 복구 및 fallback 랜덤화 - .disclaimer에 @include m.text-caption mixin 적용 - 유실된 nickname.ts 복구 - fallback 닉네임 Date.now() → 랜덤 8자리 숫자로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 단독/1:1 판결 공통 진입 흐름 반영 및 관련 문서 일괄 수정 (#54) - 단독 판결과 1:1 판결이 완전히 분리된 진입이 아니라 AI 대화방 → 진술저장 → [분기] → disputes/[id]/statement 경로를 공통으로 거침 - CLAUDE.md: 핵심 서비스 흐름 분기 구조로 수정, 단독 판결 MVP 포함 반영, AI 대화방 정책 단독/1:1 병행 기술, dispute_status 단독 경로 추가 - PROJECT_DECISIONS.md: 흐름·MVP포함·MVP제외·dispute_status 동기화 - STATUS_TRANSITION.md: 단독 판결 경로(draft→judging→judged) 추가 - DISPUTE.md: 상태 전이 단독/1:1 경로 분리 기술, 주의사항 확정 내용 반영 - ROOM.md: 진술저장 후 분기 흐름 포함 기능에 명시 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Login 페이지 hydration removeChild 에러 수정 (#55) * 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탭(홈/사건기록/일기/마이페이지),…
* 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: 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> * feat: Textarea 바이트 카운팅 및 filterMessage prop 추가 - 한글 2바이트/ASCII 1바이트 기준으로 글자 수 계산 - maxLength 초과 시 바이트 기준으로 자동 truncate - filterMessage prop 추가 — 욕설 차단 메시지 동적 표시 - border 색상 변경은 error prop에만 적용 (filter는 border 유지) - filter-warning 텍스트: Body-S + var(--text-danger) - field gap 8 → 10px (Figma 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 욕설 감지 필터 구현 (Gemini 2.5 Flash) - moderation.ts: Gemini 2.5 Flash 기반 욕설/개인정보 감지 - isBlocked: 욕설·혐오·위협 차단 (보수적 기준) - hasPersonalInfo: 개인정보 경고 (차단 없음) - fail-open: Gemini 실패 시 pending 상태로 저장 - statements/route.ts: 진술 저장 API - 모더레이션 통과 후 upsert + ModerationLog 트랜잭션 - 차단 시 ModerationLog만 기록, 저장 없이 422 반환 - dev bypass: 개발 환경에서 세션 없이 모더레이션 테스트 가능 - page.tsx: handleSave 연결, filterMessage 상태, 개인정보 경고 모달 - StatementPage.module.scss: 모달 스타일, Stylelint 공백 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #49 코드리뷰 수정 — MBTI 연동, 파싱 에러, 인젝션, 타임아웃 - MBTI: GET /api/user/me 신규 생성, statement 페이지 마운트 시 user.mbti 초기화 - MBTI: handleSave body에 mbti 포함, statements route에서 user.mbti 업데이트 (트랜잭션) - statement/page.tsx: res.json() 파싱 실패를 별도 try-catch로 분리 - Textarea.tsx: e.target.value 직접 변경 → Object.assign으로 새 이벤트 객체 전달 - moderation.ts: content 삽입 전 < > HTML 이스케이프 (프롬프트 인젝션 방지) - moderation.ts: Promise.race() 기반 10초 타임아웃 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: user/me route catch 블록에 에러 로깅 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: judge route 1인 판결 허용 — isSolo 분기 및 rollback 상태 수정 - 2인: BOTH_SUBMITTED 상태 확인 유지 - 1인: 진술 제출 여부만 확인 (statements.length > 0) - 롤백 대상을 하드코딩된 BOTH_SUBMITTED → previousStatus로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카카오 로그인 기능 구현 (#50) * 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> * feat: 카카오 로그인 기능 구현 - 로그인 페이지 UI 및 카카오 signIn 버튼 연결 - @auth/prisma-adapter 설치 및 authOptions에 적용 - 최초 로그인 시 kakaoId, nickname, termsAgreedAt 자동 설정 - 닉네임 자동 생성 유틸 추가 (~하는부엉이 + 4자리 난수) - middleware 추가: 비인증 사용자 /login 리다이렉트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 로그인 페이지 및 인증 로직 개선 - SCSS import 절대경로(@/) 수정 - 캐릭터 이미지 Next/Image fill → img 태그로 변경 - 이용약관/개인정보처리방침 링크(/terms, /privacy) 추가 및 스타일 적용 - 닉네임 유니크 제약(@unique) 추가 및 충돌 재시도 로직 구현 (최대 10회) - middleware matcher 패턴 보완 (/login-help 등 우회 경로 차단) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: disclaimer mixin 적용, nickname 유실 복구 및 fallback 랜덤화 - .disclaimer에 @include m.text-caption mixin 적용 - 유실된 nickname.ts 복구 - fallback 닉네임 Date.now() → 랜덤 8자리 숫자로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 단독/1:1 판결 공통 진입 흐름 반영 및 관련 문서 일괄 수정 (#54) - 단독 판결과 1:1 판결이 완전히 분리된 진입이 아니라 AI 대화방 → 진술저장 → [분기] → disputes/[id]/statement 경로를 공통으로 거침 - CLAUDE.md: 핵심 서비스 흐름 분기 구조로 수정, 단독 판결 MVP 포함 반영, AI 대화방 정책 단독/1:1 병행 기술, dispute_status 단독 경로 추가 - PROJECT_DECISIONS.md: 흐름·MVP포함·MVP제외·dispute_status 동기화 - STATUS_TRANSITION.md: 단독 판결 경로(draft→judging→judged) 추가 - DISPUTE.md: 상태 전이 단독/1:1 경로 분리 기술, 주의사항 확정 내용 반영 - ROOM.md: 진술저장 후 분기 흐름 포함 기능에 명시 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Login 페이지 hydration removeChild 에러 수정 (#55) * 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 아…
* 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: 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> * feat: Textarea 바이트 카운팅 및 filterMessage prop 추가 - 한글 2바이트/ASCII 1바이트 기준으로 글자 수 계산 - maxLength 초과 시 바이트 기준으로 자동 truncate - filterMessage prop 추가 — 욕설 차단 메시지 동적 표시 - border 색상 변경은 error prop에만 적용 (filter는 border 유지) - filter-warning 텍스트: Body-S + var(--text-danger) - field gap 8 → 10px (Figma 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 욕설 감지 필터 구현 (Gemini 2.5 Flash) - moderation.ts: Gemini 2.5 Flash 기반 욕설/개인정보 감지 - isBlocked: 욕설·혐오·위협 차단 (보수적 기준) - hasPersonalInfo: 개인정보 경고 (차단 없음) - fail-open: Gemini 실패 시 pending 상태로 저장 - statements/route.ts: 진술 저장 API - 모더레이션 통과 후 upsert + ModerationLog 트랜잭션 - 차단 시 ModerationLog만 기록, 저장 없이 422 반환 - dev bypass: 개발 환경에서 세션 없이 모더레이션 테스트 가능 - page.tsx: handleSave 연결, filterMessage 상태, 개인정보 경고 모달 - StatementPage.module.scss: 모달 스타일, Stylelint 공백 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #49 코드리뷰 수정 — MBTI 연동, 파싱 에러, 인젝션, 타임아웃 - MBTI: GET /api/user/me 신규 생성, statement 페이지 마운트 시 user.mbti 초기화 - MBTI: handleSave body에 mbti 포함, statements route에서 user.mbti 업데이트 (트랜잭션) - statement/page.tsx: res.json() 파싱 실패를 별도 try-catch로 분리 - Textarea.tsx: e.target.value 직접 변경 → Object.assign으로 새 이벤트 객체 전달 - moderation.ts: content 삽입 전 < > HTML 이스케이프 (프롬프트 인젝션 방지) - moderation.ts: Promise.race() 기반 10초 타임아웃 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: user/me route catch 블록에 에러 로깅 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: judge route 1인 판결 허용 — isSolo 분기 및 rollback 상태 수정 - 2인: BOTH_SUBMITTED 상태 확인 유지 - 1인: 진술 제출 여부만 확인 (statements.length > 0) - 롤백 대상을 하드코딩된 BOTH_SUBMITTED → previousStatus로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카카오 로그인 기능 구현 (#50) * 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> * feat: 카카오 로그인 기능 구현 - 로그인 페이지 UI 및 카카오 signIn 버튼 연결 - @auth/prisma-adapter 설치 및 authOptions에 적용 - 최초 로그인 시 kakaoId, nickname, termsAgreedAt 자동 설정 - 닉네임 자동 생성 유틸 추가 (~하는부엉이 + 4자리 난수) - middleware 추가: 비인증 사용자 /login 리다이렉트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 로그인 페이지 및 인증 로직 개선 - SCSS import 절대경로(@/) 수정 - 캐릭터 이미지 Next/Image fill → img 태그로 변경 - 이용약관/개인정보처리방침 링크(/terms, /privacy) 추가 및 스타일 적용 - 닉네임 유니크 제약(@unique) 추가 및 충돌 재시도 로직 구현 (최대 10회) - middleware matcher 패턴 보완 (/login-help 등 우회 경로 차단) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: disclaimer mixin 적용, nickname 유실 복구 및 fallback 랜덤화 - .disclaimer에 @include m.text-caption mixin 적용 - 유실된 nickname.ts 복구 - fallback 닉네임 Date.now() → 랜덤 8자리 숫자로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 단독/1:1 판결 공통 진입 흐름 반영 및 관련 문서 일괄 수정 (#54) - 단독 판결과 1:1 판결이 완전히 분리된 진입이 아니라 AI 대화방 → 진술저장 → [분기] → disputes/[id]/statement 경로를 공통으로 거침 - CLAUDE.md: 핵심 서비스 흐름 분기 구조로 수정, 단독 판결 MVP 포함 반영, AI 대화방 정책 단독/1:1 병행 기술, dispute_status 단독 경로 추가 - PROJECT_DECISIONS.md: 흐름·MVP포함·MVP제외·dispute_status 동기화 - STATUS_TRANSITION.md: 단독 판결 경로(draft→judging→judged) 추가 - DISPUTE.md: 상태 전이 단독/1:1 경로 분리 기술, 주의사항 확정 내용 반영 - ROOM.md: 진술저장 후 분기 흐름 포함 기능에 명시 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Login 페이지 hydration removeChild 에러 수정 (#55) * 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 아이…
* 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…
* 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: 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> * feat: Textarea 바이트 카운팅 및 filterMessage prop 추가 - 한글 2바이트/ASCII 1바이트 기준으로 글자 수 계산 - maxLength 초과 시 바이트 기준으로 자동 truncate - filterMessage prop 추가 — 욕설 차단 메시지 동적 표시 - border 색상 변경은 error prop에만 적용 (filter는 border 유지) - filter-warning 텍스트: Body-S + var(--text-danger) - field gap 8 → 10px (Figma 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 욕설 감지 필터 구현 (Gemini 2.5 Flash) - moderation.ts: Gemini 2.5 Flash 기반 욕설/개인정보 감지 - isBlocked: 욕설·혐오·위협 차단 (보수적 기준) - hasPersonalInfo: 개인정보 경고 (차단 없음) - fail-open: Gemini 실패 시 pending 상태로 저장 - statements/route.ts: 진술 저장 API - 모더레이션 통과 후 upsert + ModerationLog 트랜잭션 - 차단 시 ModerationLog만 기록, 저장 없이 422 반환 - dev bypass: 개발 환경에서 세션 없이 모더레이션 테스트 가능 - page.tsx: handleSave 연결, filterMessage 상태, 개인정보 경고 모달 - StatementPage.module.scss: 모달 스타일, Stylelint 공백 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #49 코드리뷰 수정 — MBTI 연동, 파싱 에러, 인젝션, 타임아웃 - MBTI: GET /api/user/me 신규 생성, statement 페이지 마운트 시 user.mbti 초기화 - MBTI: handleSave body에 mbti 포함, statements route에서 user.mbti 업데이트 (트랜잭션) - statement/page.tsx: res.json() 파싱 실패를 별도 try-catch로 분리 - Textarea.tsx: e.target.value 직접 변경 → Object.assign으로 새 이벤트 객체 전달 - moderation.ts: content 삽입 전 < > HTML 이스케이프 (프롬프트 인젝션 방지) - moderation.ts: Promise.race() 기반 10초 타임아웃 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: user/me route catch 블록에 에러 로깅 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: judge route 1인 판결 허용 — isSolo 분기 및 rollback 상태 수정 - 2인: BOTH_SUBMITTED 상태 확인 유지 - 1인: 진술 제출 여부만 확인 (statements.length > 0) - 롤백 대상을 하드코딩된 BOTH_SUBMITTED → previousStatus로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카카오 로그인 기능 구현 (#50) * 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> * feat: 카카오 로그인 기능 구현 - 로그인 페이지 UI 및 카카오 signIn 버튼 연결 - @auth/prisma-adapter 설치 및 authOptions에 적용 - 최초 로그인 시 kakaoId, nickname, termsAgreedAt 자동 설정 - 닉네임 자동 생성 유틸 추가 (~하는부엉이 + 4자리 난수) - middleware 추가: 비인증 사용자 /login 리다이렉트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 로그인 페이지 및 인증 로직 개선 - SCSS import 절대경로(@/) 수정 - 캐릭터 이미지 Next/Image fill → img 태그로 변경 - 이용약관/개인정보처리방침 링크(/terms, /privacy) 추가 및 스타일 적용 - 닉네임 유니크 제약(@unique) 추가 및 충돌 재시도 로직 구현 (최대 10회) - middleware matcher 패턴 보완 (/login-help 등 우회 경로 차단) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: disclaimer mixin 적용, nickname 유실 복구 및 fallback 랜덤화 - .disclaimer에 @include m.text-caption mixin 적용 - 유실된 nickname.ts 복구 - fallback 닉네임 Date.now() → 랜덤 8자리 숫자로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 단독/1:1 판결 공통 진입 흐름 반영 및 관련 문서 일괄 수정 (#54) - 단독 판결과 1:1 판결이 완전히 분리된 진입이 아니라 AI 대화방 → 진술저장 → [분기] → disputes/[id]/statement 경로를 공통으로 거침 - CLAUDE.md: 핵심 서비스 흐름 분기 구조로 수정, 단독 판결 MVP 포함 반영, AI 대화방 정책 단독/1:1 병행 기술, dispute_status 단독 경로 추가 - PROJECT_DECISIONS.md: 흐름·MVP포함·MVP제외·dispute_status 동기화 - STATUS_TRANSITION.md: 단독 판결 경로(draft→judging→judged) 추가 - DISPUTE.md: 상태 전이 단독/1:1 경로 분리 기술, 주의사항 확정 내용 반영 - ROOM.md: 진술저장 후 분기 흐름 포함 기능에 명시 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Login 페이지 hydration removeChild 에러 수정 (#55) * 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 아이콘 …
* 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…
* 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: 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> * feat: Textarea 바이트 카운팅 및 filterMessage prop 추가 - 한글 2바이트/ASCII 1바이트 기준으로 글자 수 계산 - maxLength 초과 시 바이트 기준으로 자동 truncate - filterMessage prop 추가 — 욕설 차단 메시지 동적 표시 - border 색상 변경은 error prop에만 적용 (filter는 border 유지) - filter-warning 텍스트: Body-S + var(--text-danger) - field gap 8 → 10px (Figma 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 욕설 감지 필터 구현 (Gemini 2.5 Flash) - moderation.ts: Gemini 2.5 Flash 기반 욕설/개인정보 감지 - isBlocked: 욕설·혐오·위협 차단 (보수적 기준) - hasPersonalInfo: 개인정보 경고 (차단 없음) - fail-open: Gemini 실패 시 pending 상태로 저장 - statements/route.ts: 진술 저장 API - 모더레이션 통과 후 upsert + ModerationLog 트랜잭션 - 차단 시 ModerationLog만 기록, 저장 없이 422 반환 - dev bypass: 개발 환경에서 세션 없이 모더레이션 테스트 가능 - page.tsx: handleSave 연결, filterMessage 상태, 개인정보 경고 모달 - StatementPage.module.scss: 모달 스타일, Stylelint 공백 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #49 코드리뷰 수정 — MBTI 연동, 파싱 에러, 인젝션, 타임아웃 - MBTI: GET /api/user/me 신규 생성, statement 페이지 마운트 시 user.mbti 초기화 - MBTI: handleSave body에 mbti 포함, statements route에서 user.mbti 업데이트 (트랜잭션) - statement/page.tsx: res.json() 파싱 실패를 별도 try-catch로 분리 - Textarea.tsx: e.target.value 직접 변경 → Object.assign으로 새 이벤트 객체 전달 - moderation.ts: content 삽입 전 < > HTML 이스케이프 (프롬프트 인젝션 방지) - moderation.ts: Promise.race() 기반 10초 타임아웃 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: user/me route catch 블록에 에러 로깅 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: judge route 1인 판결 허용 — isSolo 분기 및 rollback 상태 수정 - 2인: BOTH_SUBMITTED 상태 확인 유지 - 1인: 진술 제출 여부만 확인 (statements.length > 0) - 롤백 대상을 하드코딩된 BOTH_SUBMITTED → previousStatus로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카카오 로그인 기능 구현 (#50) * 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> * feat: 카카오 로그인 기능 구현 - 로그인 페이지 UI 및 카카오 signIn 버튼 연결 - @auth/prisma-adapter 설치 및 authOptions에 적용 - 최초 로그인 시 kakaoId, nickname, termsAgreedAt 자동 설정 - 닉네임 자동 생성 유틸 추가 (~하는부엉이 + 4자리 난수) - middleware 추가: 비인증 사용자 /login 리다이렉트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 로그인 페이지 및 인증 로직 개선 - SCSS import 절대경로(@/) 수정 - 캐릭터 이미지 Next/Image fill → img 태그로 변경 - 이용약관/개인정보처리방침 링크(/terms, /privacy) 추가 및 스타일 적용 - 닉네임 유니크 제약(@unique) 추가 및 충돌 재시도 로직 구현 (최대 10회) - middleware matcher 패턴 보완 (/login-help 등 우회 경로 차단) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: disclaimer mixin 적용, nickname 유실 복구 및 fallback 랜덤화 - .disclaimer에 @include m.text-caption mixin 적용 - 유실된 nickname.ts 복구 - fallback 닉네임 Date.now() → 랜덤 8자리 숫자로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 단독/1:1 판결 공통 진입 흐름 반영 및 관련 문서 일괄 수정 (#54) - 단독 판결과 1:1 판결이 완전히 분리된 진입이 아니라 AI 대화방 → 진술저장 → [분기] → disputes/[id]/statement 경로를 공통으로 거침 - CLAUDE.md: 핵심 서비스 흐름 분기 구조로 수정, 단독 판결 MVP 포함 반영, AI 대화방 정책 단독/1:1 병행 기술, dispute_status 단독 경로 추가 - PROJECT_DECISIONS.md: 흐름·MVP포함·MVP제외·dispute_status 동기화 - STATUS_TRANSITION.md: 단독 판결 경로(draft→judging→judged) 추가 - DISPUTE.md: 상태 전이 단독/1:1 경로 분리 기술, 주의사항 확정 내용 반영 - ROOM.md: 진술저장 후 분기 흐름 포함 기능에 명시 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Login 페이지 hydration removeChild 에러 수정 (#55) * 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 아이…
* 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: 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> * feat: Textarea 바이트 카운팅 및 filterMessage prop 추가 - 한글 2바이트/ASCII 1바이트 기준으로 글자 수 계산 - maxLength 초과 시 바이트 기준으로 자동 truncate - filterMessage prop 추가 — 욕설 차단 메시지 동적 표시 - border 색상 변경은 error prop에만 적용 (filter는 border 유지) - filter-warning 텍스트: Body-S + var(--text-danger) - field gap 8 → 10px (Figma 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 욕설 감지 필터 구현 (Gemini 2.5 Flash) - moderation.ts: Gemini 2.5 Flash 기반 욕설/개인정보 감지 - isBlocked: 욕설·혐오·위협 차단 (보수적 기준) - hasPersonalInfo: 개인정보 경고 (차단 없음) - fail-open: Gemini 실패 시 pending 상태로 저장 - statements/route.ts: 진술 저장 API - 모더레이션 통과 후 upsert + ModerationLog 트랜잭션 - 차단 시 ModerationLog만 기록, 저장 없이 422 반환 - dev bypass: 개발 환경에서 세션 없이 모더레이션 테스트 가능 - page.tsx: handleSave 연결, filterMessage 상태, 개인정보 경고 모달 - StatementPage.module.scss: 모달 스타일, Stylelint 공백 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #49 코드리뷰 수정 — MBTI 연동, 파싱 에러, 인젝션, 타임아웃 - MBTI: GET /api/user/me 신규 생성, statement 페이지 마운트 시 user.mbti 초기화 - MBTI: handleSave body에 mbti 포함, statements route에서 user.mbti 업데이트 (트랜잭션) - statement/page.tsx: res.json() 파싱 실패를 별도 try-catch로 분리 - Textarea.tsx: e.target.value 직접 변경 → Object.assign으로 새 이벤트 객체 전달 - moderation.ts: content 삽입 전 < > HTML 이스케이프 (프롬프트 인젝션 방지) - moderation.ts: Promise.race() 기반 10초 타임아웃 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: user/me route catch 블록에 에러 로깅 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: judge route 1인 판결 허용 — isSolo 분기 및 rollback 상태 수정 - 2인: BOTH_SUBMITTED 상태 확인 유지 - 1인: 진술 제출 여부만 확인 (statements.length > 0) - 롤백 대상을 하드코딩된 BOTH_SUBMITTED → previousStatus로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카카오 로그인 기능 구현 (#50) * 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> * feat: 카카오 로그인 기능 구현 - 로그인 페이지 UI 및 카카오 signIn 버튼 연결 - @auth/prisma-adapter 설치 및 authOptions에 적용 - 최초 로그인 시 kakaoId, nickname, termsAgreedAt 자동 설정 - 닉네임 자동 생성 유틸 추가 (~하는부엉이 + 4자리 난수) - middleware 추가: 비인증 사용자 /login 리다이렉트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 로그인 페이지 및 인증 로직 개선 - SCSS import 절대경로(@/) 수정 - 캐릭터 이미지 Next/Image fill → img 태그로 변경 - 이용약관/개인정보처리방침 링크(/terms, /privacy) 추가 및 스타일 적용 - 닉네임 유니크 제약(@unique) 추가 및 충돌 재시도 로직 구현 (최대 10회) - middleware matcher 패턴 보완 (/login-help 등 우회 경로 차단) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: disclaimer mixin 적용, nickname 유실 복구 및 fallback 랜덤화 - .disclaimer에 @include m.text-caption mixin 적용 - 유실된 nickname.ts 복구 - fallback 닉네임 Date.now() → 랜덤 8자리 숫자로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 단독/1:1 판결 공통 진입 흐름 반영 및 관련 문서 일괄 수정 (#54) - 단독 판결과 1:1 판결이 완전히 분리된 진입이 아니라 AI 대화방 → 진술저장 → [분기] → disputes/[id]/statement 경로를 공통으로 거침 - CLAUDE.md: 핵심 서비스 흐름 분기 구조로 수정, 단독 판결 MVP 포함 반영, AI 대화방 정책 단독/1:1 병행 기술, dispute_status 단독 경로 추가 - PROJECT_DECISIONS.md: 흐름·MVP포함·MVP제외·dispute_status 동기화 - STATUS_TRANSITION.md: 단독 판결 경로(draft→judging→judged) 추가 - DISPUTE.md: 상태 전이 단독/1:1 경로 분리 기술, 주의사항 확정 내용 반영 - ROOM.md: 진술저장 후 분기 흐름 포함 기능에 명시 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Login 페이지 hydration removeChild 에러 수정 (#55) * 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 …
* 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: 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> * feat: Textarea 바이트 카운팅 및 filterMessage prop 추가 - 한글 2바이트/ASCII 1바이트 기준으로 글자 수 계산 - maxLength 초과 시 바이트 기준으로 자동 truncate - filterMessage prop 추가 — 욕설 차단 메시지 동적 표시 - border 색상 변경은 error prop에만 적용 (filter는 border 유지) - filter-warning 텍스트: Body-S + var(--text-danger) - field gap 8 → 10px (Figma 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 욕설 감지 필터 구현 (Gemini 2.5 Flash) - moderation.ts: Gemini 2.5 Flash 기반 욕설/개인정보 감지 - isBlocked: 욕설·혐오·위협 차단 (보수적 기준) - hasPersonalInfo: 개인정보 경고 (차단 없음) - fail-open: Gemini 실패 시 pending 상태로 저장 - statements/route.ts: 진술 저장 API - 모더레이션 통과 후 upsert + ModerationLog 트랜잭션 - 차단 시 ModerationLog만 기록, 저장 없이 422 반환 - dev bypass: 개발 환경에서 세션 없이 모더레이션 테스트 가능 - page.tsx: handleSave 연결, filterMessage 상태, 개인정보 경고 모달 - StatementPage.module.scss: 모달 스타일, Stylelint 공백 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #49 코드리뷰 수정 — MBTI 연동, 파싱 에러, 인젝션, 타임아웃 - MBTI: GET /api/user/me 신규 생성, statement 페이지 마운트 시 user.mbti 초기화 - MBTI: handleSave body에 mbti 포함, statements route에서 user.mbti 업데이트 (트랜잭션) - statement/page.tsx: res.json() 파싱 실패를 별도 try-catch로 분리 - Textarea.tsx: e.target.value 직접 변경 → Object.assign으로 새 이벤트 객체 전달 - moderation.ts: content 삽입 전 < > HTML 이스케이프 (프롬프트 인젝션 방지) - moderation.ts: Promise.race() 기반 10초 타임아웃 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: user/me route catch 블록에 에러 로깅 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: judge route 1인 판결 허용 — isSolo 분기 및 rollback 상태 수정 - 2인: BOTH_SUBMITTED 상태 확인 유지 - 1인: 진술 제출 여부만 확인 (statements.length > 0) - 롤백 대상을 하드코딩된 BOTH_SUBMITTED → previousStatus로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카카오 로그인 기능 구현 (#50) * 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> * feat: 카카오 로그인 기능 구현 - 로그인 페이지 UI 및 카카오 signIn 버튼 연결 - @auth/prisma-adapter 설치 및 authOptions에 적용 - 최초 로그인 시 kakaoId, nickname, termsAgreedAt 자동 설정 - 닉네임 자동 생성 유틸 추가 (~하는부엉이 + 4자리 난수) - middleware 추가: 비인증 사용자 /login 리다이렉트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 로그인 페이지 및 인증 로직 개선 - SCSS import 절대경로(@/) 수정 - 캐릭터 이미지 Next/Image fill → img 태그로 변경 - 이용약관/개인정보처리방침 링크(/terms, /privacy) 추가 및 스타일 적용 - 닉네임 유니크 제약(@unique) 추가 및 충돌 재시도 로직 구현 (최대 10회) - middleware matcher 패턴 보완 (/login-help 등 우회 경로 차단) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: disclaimer mixin 적용, nickname 유실 복구 및 fallback 랜덤화 - .disclaimer에 @include m.text-caption mixin 적용 - 유실된 nickname.ts 복구 - fallback 닉네임 Date.now() → 랜덤 8자리 숫자로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 단독/1:1 판결 공통 진입 흐름 반영 및 관련 문서 일괄 수정 (#54) - 단독 판결과 1:1 판결이 완전히 분리된 진입이 아니라 AI 대화방 → 진술저장 → [분기] → disputes/[id]/statement 경로를 공통으로 거침 - CLAUDE.md: 핵심 서비스 흐름 분기 구조로 수정, 단독 판결 MVP 포함 반영, AI 대화방 정책 단독/1:1 병행 기술, dispute_status 단독 경로 추가 - PROJECT_DECISIONS.md: 흐름·MVP포함·MVP제외·dispute_status 동기화 - STATUS_TRANSITION.md: 단독 판결 경로(draft→judging→judged) 추가 - DISPUTE.md: 상태 전이 단독/1:1 경로 분리 기술, 주의사항 확정 내용 반영 - ROOM.md: 진술저장 후 분기 흐름 포함 기능에 명시 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Login 페이지 hydration removeChild 에러 수정 (#55) * 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 아이…
* 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: 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> * feat: Textarea 바이트 카운팅 및 filterMessage prop 추가 - 한글 2바이트/ASCII 1바이트 기준으로 글자 수 계산 - maxLength 초과 시 바이트 기준으로 자동 truncate - filterMessage prop 추가 — 욕설 차단 메시지 동적 표시 - border 색상 변경은 error prop에만 적용 (filter는 border 유지) - filter-warning 텍스트: Body-S + var(--text-danger) - field gap 8 → 10px (Figma 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 욕설 감지 필터 구현 (Gemini 2.5 Flash) - moderation.ts: Gemini 2.5 Flash 기반 욕설/개인정보 감지 - isBlocked: 욕설·혐오·위협 차단 (보수적 기준) - hasPersonalInfo: 개인정보 경고 (차단 없음) - fail-open: Gemini 실패 시 pending 상태로 저장 - statements/route.ts: 진술 저장 API - 모더레이션 통과 후 upsert + ModerationLog 트랜잭션 - 차단 시 ModerationLog만 기록, 저장 없이 422 반환 - dev bypass: 개발 환경에서 세션 없이 모더레이션 테스트 가능 - page.tsx: handleSave 연결, filterMessage 상태, 개인정보 경고 모달 - StatementPage.module.scss: 모달 스타일, Stylelint 공백 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #49 코드리뷰 수정 — MBTI 연동, 파싱 에러, 인젝션, 타임아웃 - MBTI: GET /api/user/me 신규 생성, statement 페이지 마운트 시 user.mbti 초기화 - MBTI: handleSave body에 mbti 포함, statements route에서 user.mbti 업데이트 (트랜잭션) - statement/page.tsx: res.json() 파싱 실패를 별도 try-catch로 분리 - Textarea.tsx: e.target.value 직접 변경 → Object.assign으로 새 이벤트 객체 전달 - moderation.ts: content 삽입 전 < > HTML 이스케이프 (프롬프트 인젝션 방지) - moderation.ts: Promise.race() 기반 10초 타임아웃 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: user/me route catch 블록에 에러 로깅 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: judge route 1인 판결 허용 — isSolo 분기 및 rollback 상태 수정 - 2인: BOTH_SUBMITTED 상태 확인 유지 - 1인: 진술 제출 여부만 확인 (statements.length > 0) - 롤백 대상을 하드코딩된 BOTH_SUBMITTED → previousStatus로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카카오 로그인 기능 구현 (#50) * 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> * feat: 카카오 로그인 기능 구현 - 로그인 페이지 UI 및 카카오 signIn 버튼 연결 - @auth/prisma-adapter 설치 및 authOptions에 적용 - 최초 로그인 시 kakaoId, nickname, termsAgreedAt 자동 설정 - 닉네임 자동 생성 유틸 추가 (~하는부엉이 + 4자리 난수) - middleware 추가: 비인증 사용자 /login 리다이렉트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 로그인 페이지 및 인증 로직 개선 - SCSS import 절대경로(@/) 수정 - 캐릭터 이미지 Next/Image fill → img 태그로 변경 - 이용약관/개인정보처리방침 링크(/terms, /privacy) 추가 및 스타일 적용 - 닉네임 유니크 제약(@unique) 추가 및 충돌 재시도 로직 구현 (최대 10회) - middleware matcher 패턴 보완 (/login-help 등 우회 경로 차단) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: disclaimer mixin 적용, nickname 유실 복구 및 fallback 랜덤화 - .disclaimer에 @include m.text-caption mixin 적용 - 유실된 nickname.ts 복구 - fallback 닉네임 Date.now() → 랜덤 8자리 숫자로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 단독/1:1 판결 공통 진입 흐름 반영 및 관련 문서 일괄 수정 (#54) - 단독 판결과 1:1 판결이 완전히 분리된 진입이 아니라 AI 대화방 → 진술저장 → [분기] → disputes/[id]/statement 경로를 공통으로 거침 - CLAUDE.md: 핵심 서비스 흐름 분기 구조로 수정, 단독 판결 MVP 포함 반영, AI 대화방 정책 단독/1:1 병행 기술, dispute_status 단독 경로 추가 - PROJECT_DECISIONS.md: 흐름·MVP포함·MVP제외·dispute_status 동기화 - STATUS_TRANSITION.md: 단독 판결 경로(draft→judging→judged) 추가 - DISPUTE.md: 상태 전이 단독/1:1 경로 분리 기술, 주의사항 확정 내용 반영 - ROOM.md: 진술저장 후 분기 흐름 포함 기능에 명시 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Login 페이지 hydration removeChild 에러 수정 (#55) * 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 …
Summary
PR #49 리뷰 과정에서 단독 판결 기능이 MVP에 포함되는 것으로 팀 결정이 확인되어 CLAUDE.md 정책을 업데이트합니다.
단독 판결 (진술 1건 기반, 제한적 결과 제공)을 MVP 포함으로 이동, MVP 제외 목록에서 제거ai_chat / invite_ready상태에서 단독 판결 생성 허용단독 판결 제공 결과 정의
관련 PR
disputes/route.ts변경과 정합성 맞춤🤖 Generated with Claude Code
Summary by CodeRabbit
Release Notes