- 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>
각 질문의 라디오/체크/드롭다운 옵션 배열 + 헤더 카피.
spec markdown의 7 질문 그대로 반영 (단어 '결' 등 한글 컨셉어 제거 — CONTOUR 영문 단독).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 phase 구성:
- A (4): supabase migration + lib types/questions/storage
- B (8): UI 컴포넌트 — Intro/Q1-Q7/Thanks/ProgressBar/QuestionLayout
- C (4): page+layout 통합 + /api/survey POST + standalone shell + /api/admin/survey
- D (2): /admin/survey 대시보드 + AdminSidebar 메뉴
- E (1): build/lint/시각 회귀/CEO 운영 안내 (메모리 갱신 선택)
핵심 패턴:
- 단일 페이지 + step state (URL 불변, localStorage 진행 저장)
- /gyeol standalone (TopNav/푸터/카카오 모두 숨김)
- DB RLS — anon INSERT만, admin SELECT
- Resend 즉시 확인 메일 (이메일 입력 시만)
- UTM·referrer 자동 수집 → 9 채널 CPM 분석
- 각 task 마지막에 git log -3 직접 검증 (Phase 2 sandbox 이슈 대비)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
obsidian PMF spec(7질문) + design PNG 참고:
- URL /gyeol, 브랜드 CONTOUR 영문 단독 (마케팅 반감 회피, '결' 한글 제거)
- 단일 페이지 + step state 9개 (intro / q1-q7 / thanks), localStorage 진행 저장
- /gyeol standalone shell (TopNav/푸터/카카오 모두 숨김, 설문 집중)
- DB: survey_responses 테이블 + RLS (anon INSERT만, SELECT service role)
- POST /api/survey + Resend 즉시 확인 메일 1통
- /admin/survey 대시보드: 목록 + 카운트 + CSV (차트는 응답 누적 후 별도)
- UTM·referrer 추적 → 9 채널 × CPM 분석
- robots: noindex (PMF 검증 단계)
백로그: 차트 시각화, Q6 자발어 워드클라우드, rate limit,
NAS Synology Mail Server 전환(Resend 의존 제거).
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>
D 트랙 1/4. 현재 카카오 오픈채팅 URL이 3곳에 하드코딩(PublicShell, mypage,
historical DashboardShell) — single source of truth로 정돈. 향후 URL 변경 시
이 파일만 수정.
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>
/work 허브 + /work/freelance 양쪽 import. 단일 source of truth.
원본은 app/freelance/page.tsx — Phase B6에서 lib import로 교체.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4월 27일 brainstorm 의 A-1 결정 + 5월 16일 spec 구현:
- Phase A (2): next.config redirects 10개 + lib/freelance-portfolio 추출
- Phase B (9): /music 허브 + /music/{packs,samples,studio} + /work 허브
+ /work/{freelance,website,saju,blog} + website samples 8개 + saju 7개
- Phase C (4): app/page.tsx 안 2 + TopNav 2개 LINKS + PublicShell footer
+ layout JSON-LD URL 갱신
- Phase D (2): 원본 25 파일 삭제 + build/lint/시각 회귀
핵심 안전 장치:
- Phase A/B/C/D 분할로 빌드 무중단 (원본 + 신규 양쪽 존재 기간 보호)
- push 시점은 Phase D 완료 후 (사용자 시각 회귀 후)
- 모든 task 마지막 step: git log -3 직접 검증 (Phase 2 subagent commit 누락 이슈 대비)
- redirect 영구 (301) — 외부 링크/검색 인덱스 보존
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4월 27일 brainstorm의 A-1 결정을 구현 spec으로 확정.
CEO 결정 8개 라인:
- 메인 안 2 (Brand Hero + 2-up Card)
- 헤더 안 b (Music | Custom Build | Try now)
- /work, /music URL prefix, 10 redirects
- 사주 단순 URL 마이그 (카탈로그 spec 보류)
- 자동화는 /work/freelance 흡수 (Custom Build 4라인)
- /about 미신설 (Brand Hero가 약식 회사 표지)
- 가격 미정 → 견적 문의 CTA만
- 외주 진행 5건 비공개, 납품 5건만 사례
Phase A/B/C 분할 마이그레이션 (인프라+신규 → 원본 삭제+안 2 → 검증).
push는 Phase B 완료 후 무중단 배포.
신규 21+, 수정 5, 삭제 21 파일.
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>