- 세션 목록을 useSessionListQuery 로 서버 조회(필터·정렬·페이지 위임),
mock 제거. 정수 코드↔한국어 라벨 변환 어댑터(list/lib/adapter)
- 협상 참여: useParticipateMutation, 성공 시 채팅 진입·실패 토스트
- 거부: 사유 입력 팝업(RejectPopup) + useRejectMutation, 상태별 차단 안내
- 선택/상태 검증을 토스트로 일원화(ActionSection 은 버튼만 담당)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 로그인 실연동: 성공 시 access/refresh 토큰 저장, me 캐시 무효화
- SidebarFooter: useMeQuery 로 공급사명 표시, useLogoutMutation 로 로그아웃
- RequireAuth 가드로 /list·/chat 보호, 토큰 없으면 로그인으로
- 인증 만료/폐기 시 로그인 페이지로 이동(setUnauthorizedHandler)
- LoginPage: 이미 로그인 상태면 목록으로 리다이렉트
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- sonner 기반 토스트 래퍼(lib/toast): error/info/success/warning,
프로젝트 디자인 토큰으로 스타일 통일. Toaster 를 provider 에 마운트
- 공통 Modal 컴포넌트: 반투명 배경 + 배경 클릭/ESC 닫기
- core/Provider import 케이싱 정리(provider)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- auth/negotiation 도메인별 api/keys/queries/mutations/type 5파일 구조
- axios 인스턴스: access token 주입, 434 만료 시 refresh 자동 재발급(단일 비행)
후 원요청 재시도, 433/435/1203(TOKEN_REVOKED) 시 세션 종료 처리
- HTTP 200 + result.success=false 비즈니스 에러를 ApiError 로 변환,
에러코드별 한국어 메시지 맵(getApiErrorMessage) 제공
- 토큰 localStorage 저장소(tokenStorage)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
item/supplier 의 POST upload-excel 스텁 라우트와 Res_ExcelUpload 프로토콜 제거.
프론트 엑셀 모달은 클라이언트 CSV 파싱+check-codes/create 로 도는 독립 기능이라 영향 없음.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- WebServerConfig.cors_origins(list) 추가, config 의 오리진이 있을 때만 CORSMiddleware 적용
- 명시적 오리진이라 allow_credentials=true (Authorization 헤더 허용)
- 로컬 기본값: http://localhost:5173, http://127.0.0.1:5173 (Vite)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- tbl_account 예시 인증 제거, supplier_users 기반으로 일원화(generic 네이밍 재사용)
- DBType USER/PARTNER 분리, AccountStatus/UserRole/TokenType enum 추가
- 보호 요청 시 su_id DB 존재/활성 검증(stateless JWT 빈틈 보완), 공급사명(partner.suppliers) 응답 포함
- 로그인 시 단일 세션 access/refresh 토큰을 supplier_user_tokens 에 저장(재로그인 시 교체)
- greenlet 의존성 추가, 인증 e2e 테스트(test_auth.py) 재작성
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- orval 실제 타입(ItemData/SupplierData/QuotationData/QuotationSettingData) 사용,
응답 봉투 과중첩(.data.data) 제거 → 목록 정상 렌더
- 배송형태(delivery_type) 자유텍스트 → 서버 /v1/enums 코드 select 로 전환
- orval 클라이언트 재생성 (enums 훅, companyData 등)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- item/supplier/quotation/quotation_setting CRUD·service·router 추가
- item protocol delivery_type str→int (ERD/스키마 SMALLINT 일치)
- DeliveryType enum + 한글 라벨, 공용 GET /v1/enums (도메인 코드 메타데이터)
- CompanyBrief → CompanyData 로 *Data 네이밍 통일
- CORS: WebServerConfig.client_url(단일) 도입 (config_models/router)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 타이포그래피 스케일 추가 (headline/title/body/reject 등) — 채팅에서 사용
- 채팅 영역 스크롤바 스타일(.chat-scroll) 추가
- 브랜드 스케일 채도 추가 인하, surface(콘텐츠 면) 톤 조정
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 브랜드 스케일 채도 약 20%↓ (색상·명도 유지)
- surface(콘텐츠 면 쿨 그레이)·table-header 토큰 추가
- 배너 주석 제거 및 최소화
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- TableSection에서 컬럼 설정(tableColumns)·날짜 유틸(datetime) 분리
- PageSection → Pagination 개명, 인라인 SVG를 paginationIcons로 분리
- 상태 색상 정비: 협상중=강조(다크), 미참여=회색, 나머지 의미색 유지
- 활성 페이지·목데이터 격리(mocks), 페이지 크기 20 복구, 주석 정리
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- cn·interactive를 components에서 lib로 분리 (컴포넌트와 순수 유틸 경계 정리)
- core/provider.tsx → Provider.tsx 개명 (컴포넌트 파일 PascalCase 통일)
- 불필요한 주석 정리
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 라우팅 react-router v7, 서버상태 TanStack Query
- orval 자동 생성 API 클라이언트(src/api/generated)
- 견적/상품/협력사/견적설정 페이지, shadcn UI, 토큰(tokens.css)
- 실행: 루트 docker compose (front :3001), README 그에 맞게 정리
- AI Studio 스캐폴드 잔재 제거(metadata.json, 중복 DESIGN_TOKENS.md), 타이틀 NegoData, vite.config 죽은코드 제거
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- layouts: 공통 2분할 레이아웃 MainLayout(좌 사이드바/우 메인, 로고 헤더,
헤더 아래 콘텐츠 면) + 다크 헤더 바 MainHeaderBar 분리
- pages: ListPage/ChatPage 를 MainLayout 기반으로 구성(견적 선택/협상 잔여 시간 헤더)
- features/list: 필터 섹션 추가 — ListFilter(요소)/FilterSection(컨테이너)/
filterOptions(데이터)/useListFilterStore(상태), SidebarFooter 분리
- deps: lucide-react 추가(필터 화살표·목록 이동 아이콘)
- refactor: 모든 import 를 @ alias 로 통일
- fix: Button secondary variant hover(=accent 동일색) 및 필터 화살표 hover 색상 보정
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
versions 테이블과 동일하게 quotation.quotation_settings 에 user_id (uuid NOT NULL)
컬럼을 추가하고, 조인/조회용 인덱스 idx_quotation_settings_user_id 를 생성한다.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- react-router v7 도입, App.tsx 에서 라우트 정의(/, /list, /chat)
- 기본 진입('/')은 로그인 페이지
- 사용하지 않는 Vite 데모 정리(App.css, assets 삭제)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 네이티브 element props 상속 + className 병합(무의존 cn 헬퍼)
- Button: variant(primary/secondary/outline/ghost/destructive)/size, hover 톤다운(brand-700)
- React 19 기준 forwardRef 없이 ref 전달
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Vite 8 은 'local' 을 모드 이름으로 허용하지 않음(.env.local 접미사 충돌)
- dev 스크립트를 'vite --mode local' → 'vite' 로 변경 (.env.local 은 자동 로드)
- README 환경 변수/실행 안내를 실제 동작에 맞게 갱신
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- index.css 를 shadcn 스타일 토큰 시스템(Tailwind v4 @theme inline)으로 교체
- 다크모드/차트 토큰 제외 (프로젝트 미사용), light 전용
- 브랜드 블루 숫자 스케일 추가: --brand-500/600/700 (hover=톤다운 700)
- --primary=brand-600, --ring/--sidebar-ring=brand-500 로 통일
- 폰트: Pretendard CDN(@import, dynamic-subset, 버전 고정)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- .env.sample 추가, 실제 env(local/dev/prod)는 .gitignore 처리
- package.json: mode 별 실행/빌드 스크립트(dev/dev:dev/build:dev/build:prod) 추가
- README: 기술 스택·로컬 세팅·환경 변수·실행 방법 정리, 템플릿 boilerplate 제거
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Vite(react-ts) 스캐폴딩, @/* -> src 경로 alias 설정
- 라이브러리 추가: TanStack Query, axios, zustand, slate(react/history), tailwindcss v4
- core/provider.tsx 로 QueryClientProvider 분리 및 main 연결
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 단일 negosium_db 안에 company/supplier/partner/card/quotation/negotiation 6개 schema 로 18개 테이블 구성
- FK 미사용(앱 레이어 무결성) + 조인/자연키 인덱스 명시 생성
- enum 코드값은 SMALLINT(1부터), 시각 TIMESTAMPTZ(UTC 고정), 금액 BIGINT, 비율 NUMERIC
- chats: session 1:N + (session_id, seq) 부분 유니크
- CREATE DATABASE 는 \gexec 가드로 멱등 처리, 그 외 전부 IF NOT EXISTS
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>