- contact route가 phone을 INSERT하나 schema에 컬럼 부재 → 문의 DB 저장이
조용히 실패(이메일은 정상)할 수 있어 ADD COLUMN IF NOT EXISTS로 보장
- 003_fix_quotes_rls의 'Admin manage milestones'(anon FOR ALL USING true) 제거:
비로그인 누구나 고객 마일스톤 CRUD 가능한 보안 구멍. 실제 접근은 전부
service_role 서버 API라 제거해도 무영향
- schema.sql에 phone 동기화, contact route의 불필요한 created_at 명시 제거
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- lib/saas-catalog.ts: 확장 가능한 SaaS 제품 데이터 모델(배열에 추가 시 자동 노출)
- app/packages: 카탈로그 페이지 — available 카드 그리드 / coming_soon / 빈 상태 예고+출시 알림 수집(ContactModal 재사용)
- TopNav·Footer: SaaS 제품(/packages)·AI 음악(/music)·커스텀 외주(/work) 3축
- 홈 Hero·라벨 카피를 새 정체성으로 정렬, 'Custom Build/사업부' 잔재 정리
- sitemap에 /packages 등록, STRATEGY.md에 크몽·숨고 미사용+인스타 유입 정책 명시
- 음악은 카탈로그에 넣지 않고 단품 라인(/music) 유지
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- ?range=all|today|week 필터
- ?format=csv → BOM 포함 UTF-8 CSV 다운로드 (Excel 호환)
- 통계: 각 질문별 카운트 분포 + 만족도 평균 + 이메일률 + 완료시간 중간값
- admin HMAC cookie 인증 (verifyAdminTokenNode)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- layout: radial 그라데이션 배경 + metadata (robots noindex)
- page: step state + Q1~Q7 컴포넌트 조합
- 진입 시 localStorage 복구 + step 변경 시 저장 + 제출 시 clear
- 최종 제출: completion_seconds, user_agent, referrer, utm_* 자동 수집
- 에러 토스트 표시
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Q6: 1000자 textarea, 빈 칸 허용 (skippable)
- Q7: yes/no 라디오 + yes 선택 시 이메일 입력 노출 + 형식 validation
- Q7 onSubmit = 최종 제출 트리거 (page.tsx에서 POST /api/survey)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Q4: 라디오 패턴 재사용 (Q2와 동일 스타일)
- Q5: 두 입력 한 화면 — 도구 라디오 + 만족도 1-5 버튼 그리드
- 둘 다 선택 시 다음 활성
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Q1: 나이대 + 상황 두 드롭다운, 둘 다 선택 시 활성
- Q2: 자각 빈도 5 라디오, 보라 활성 스타일
- 라디오 패턴이 이후 Q4/Q5에서 재사용됨
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
D 트랙 2/4. P1 Task 3 review I-1 후속:
- PublicShell의 인라인 카카오 버튼 JSX + style 블록 → KakaoFloatButton.tsx
- KAKAO_OPENCHAT_URL은 lib/contact 에서 import
- SVG에 aria-hidden 추가 (parent aria-label 우선)
향후 admin shell 또는 다른 surface에서 재사용 가능.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 8개 URL 새 URL로 (/services/* → /music/*, /work/*)
- Product 컬럼명 → Music (사업부 명명 일치)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Brand Hero: 60vh, "현직 엔지니어가 만드는 두 가지" + 영상 blur 35%
- Two-up: Music 카드(영상+₩39,000~) / Custom Build 카드(정적 그라데이션+견적)
- Music 섹션: 기존 Features+Before/After+마퀴 그대로 보존
- Custom Build 섹션: 4 카드 (자동화는 외주 흡수) + 납품 5건 사례 + 견적 CTA
- Final CTA: "어느 쪽이든 시작하세요" + 두 분기 CTA
- 메인 진입점: Music → /music, Custom Build → /work
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- saju 페이지 + 입력 폼 + 결과 + AI 해석 + 사주 컴포넌트 모두 이동
- depth 변경 → 모든 import @/ 절대 경로
- 내부 Link href + router.push 새 URL로
- 카탈로그 spec(49만 코어 + 11 모듈)은 보류 — 무료 사주 분석만 마이그
- API route /api/saju/* 변경 없음
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 메인 페이지 + layout
- 8 sample 페이지: bakery, corporate, dashboard, game, interior, portfolio, reading, shopping
- import @/ 절대 경로 변환
- 내부 Link href 새 URL로
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- portfolio 데이터 lib/freelance-portfolio 에서 import (양쪽 페이지 공유)
- depth 변경으로 모든 import @/ 절대 경로 변환
- 자동화 사례 그룹에 id="automation" — /work/freelance#automation 진입 가능
- 내부 Link href 새 URL로 변환
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@/ 절대 경로 import + 내부 Link 새 URL로 변환.
원본 app/services/music/* 는 Phase D에서 삭제 (현재는 양쪽 존재 → redirect 우선).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- packFiles state + /api/packs/list-mine fetch (RLS 우회 위해 admin client 라우트)
- handleDownload: /api/packs/sign-link 호출 → window.location 이동
- 카드: 자료 리스트 DB SSOT (PACK_ASSETS.files 폐기)
- order.status === 'completed' 만 다운로드 활성, 그 외는 Phase 1 placeholder 유지
- 4시간 만료 안내 추가
빌드 복구: B3에서 깨진 mypage 빌드를 이번 commit이 복구.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 업로드: tier 선택 + label + 파일 → /api/admin/packs/upload-url 토큰 발급
→ XHR로 web-backend에 직접 multipart POST (진행률 추적)
- 리스트: tier별 그룹 + label inline 편집 (blur 시 PATCH)
- 삭제: confirm 후 DELETE → soft delete
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- GET: pack_files 목록 (deleted_at IS NULL)
- PATCH: { id, label?, sort_order?, min_tier? } 인라인 편집
- DELETE: web-backend 통한 soft delete
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
15분 만료 + jti 단발성. 브라우저는 이 토큰을 web-backend /api/packs/upload에
직접 multipart POST 시 Authorization Bearer 헤더로 전달 → Vercel function body
limit 우회 (5GB 업로드).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
DashboardShell에서 사이드바 분기를 제거하면서 Sidebar 컴포넌트는 더 이상
어디에서도 import되지 않음. 파일 삭제로 dead code 정리.
(AdminSidebar는 별도 컴포넌트로 admin shell에서 계속 사용 중 — 영향 없음)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
mypage가 PublicShell + TopNav를 사용하도록 라우팅 단순화:
- SIDEBAR_PATHS 상수 + Sidebar import + useSidebar 분기 + 모바일 top bar
+ 사이드바 안의 카카오 버튼 + 사업자 정보 footer + style 블록 모두 삭제
- Standalone 분기(/login·/signup·/admin)는 그대로 유지
- 카카오 버튼은 PublicShell로 이미 이동(Task 3)
- 사업자 정보 footer는 PublicShell footer가 동일 정보 보유
Sidebar.tsx 자체는 다음 커밋(Task 7)에서 삭제 — 사용처 0이 됨.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Liquid Glass 메인 surface와 톤 정렬:
- 본문 배경 #f0f5ff → slate-50
- 액센트 #1a56db → violet-600 (탭 active, 버튼, 링크)
- 카드 보더 #dbe8ff → slate-200
- 다크 카드(프로젝트 헤더) #04102b → #060e20 (kx-surface 일관)
- 강조 박스 blue-50/200 → violet-50/200
- 다크 위 텍스트 blue-300/60 → white/50 등
- 탭 button min-w-[100px] 추가 (모바일 wrap 시 텍스트 잘림 방지)
의미 색(emerald/orange/amber/red/rose/pink/cyan/sky)는 시그널이므로 보존.
프로젝트 헤더 in_progress 상태 핀은 sky 계열로 이전(브랜드 블루 잔존 제거).
Task 4에서 추가된 새 코드(AI 스튜디오 카드 등)도 함께 마이그레이션.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
코드 리뷰 후속 (I-1):
인접 div에 사용자 이메일이 텍스트로 노출되므로 아바타 글자는 decoration.
스크린 리더가 외톨이 글자("B" 등)를 읽지 않도록 aria-hidden 처리.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Hero: bg-[#04102b] → kx-surface, py-10→py-8, 아바타 보라 액센트, 가입일 톤 다운,
로그아웃 버튼 제거 (TopNav가 담당)
- Tab type에 'packs' 추가, 결제 내역 다음 위치에 "구매한 팩" 탭
- packOrders 계산: orders.service 에서 extractPackTier로 Music 팩만 필터
- 신규 탭 JSX: status별 분기(완료/처리중/대기) + 자료 리스트 + 비활성 다운로드 버튼
+ 카톡 안내. Phase 2에서 다운로드 활성화 예정
- 빠른 메뉴: AI 스튜디오 카드 1개 추가 (사주·외주 옆), grid-cols-2→sm:grid-cols-3
- 탭 컨테이너 flex-wrap 적용 (모바일 7개 wrap)
- handleLogout 함수 제거 (사용처 없어짐)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
DashboardShell 사이드바 분기에서 mypage 전용으로만 노출되던 카카오 버튼을
모든 공개 페이지(메인/서비스/외주/사주/결제/legal/mypage 등)에서 노출되도록 이동.
DashboardShell 쪽 원본은 Task 6에서 사이드바 분기 제거와 함께 자연 삭제 예정.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>