- BankTransferModal: POST /api/orders 401 응답 시 setAuthState('guest')로 전환 (에러 텍스트 대신 로그인 유도 UI 복귀)
- BankTransferModal: 모달 열릴 때 closeBtnRef.current?.focus() 호출 (접근성 초기 포커스)
- auth/callback: next 파라미터를 safeNext 패턴으로 검증 — startsWith('/') && !startsWith('//') && !startsWith('/\') 미충족 시 /mypage 폴백
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- checkRateLimit('orders:{user.id}', 60_000, 5) 인증 직후 적용 → 429 반환
- getProductById try/catch 추가 → DB 장애 시 500 '상품 조회에 실패했습니다'
- lib/order-emails.ts sendOrderPaidEmail HTML 이스케이프 대상 없음 (해당 없음)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 이메일/비밀번호 input에 focus-visible:ring-2 추가
- Google 로그인 버튼에 type=\"button\" 명시
- disabled 상태 배경 jsm-line → jsm-ink-faint로 변경 (대비 개선)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 계좌이체 중심 결제, 기존 서비스 숨김(admin 토글), 고객 포털, 풀 리디자인
- orders 단일 소스 구매 식별, pack 인프라 범용 제품 시스템 확장
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- /api/survey 등 모듈 레벨 new Resend(process.env.RESEND_API_KEY)가
.env 없는 docker 빌드에서 throw → 빌드타임 더미로 통과(런타임은 env_file 실제값)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 로컬 통합테스트: supa 도메인 apikey 200, Google OAuth 로그인→mypage 데이터 확인
- supa 노출: Cloudflare DNS + DSM 역방향 프록시(443→8100) + Let's Encrypt
- OAuth: GOTRUE_GOOGLE 활성화, authorize 302 확인
- 남은 컷오버는 Phase 5(앱 배포) 후
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 멀티앱 공유 DB 발견 → 쟁승 10테이블+auth+storage만 이전
- 클라우드 PG17.6 ↔ NAS PG17 통일, 행수 12개 일치, project_milestones anon 없음 확인
- storage 0(실파일 스킵), subscriptions 클라우드 미존재(후속)
- Phase 3: maxDuration 제거 안 함(Vercel 전용 메타, self-host 무시)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- /volume1/docker/jsm, KONG 8100/8543, pooler 5432 충돌 해결(522 주석)
- 레거시 JWT_SECRET 호환 확정 → 앱 무수정 연결 가능
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 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>
- 블로그 자동화 완전 제거
- SaaS 제품 카탈로그(/packages) + 네비 3축(SaaS·음악·외주) 재편
- 음악을 'AI 음악 생성 개발 가이드 패키지' 단품으로 디벨롭
- 계획 문서 진행 상태 반영
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>