Commit Graph

228 Commits

Author SHA1 Message Date
ee5dbb2927 docs(spec): 배포를 기존 deployer와 분리된 별도 방식으로 정정 (검토 반영)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 09:47:21 +09:00
4cbc50dc70 docs(spec): NAS 풀 self-host 전환 설계 (Vercel/Supabase/GitHub → NAS/self-host Supabase/Gitea)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 09:45:04 +09:00
1b4e6803a2 fix(db): contact_requests.phone 컬럼 보장 + project_milestones anon 전체 CRUD 정책 제거
- 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>
2026-06-01 15:13:59 +09:00
3dc6a28979 chore(db): quotes RLS 활성화 + 미사용 PostGIS 제거 (Supabase linter 'RLS Disabled' 해소)
- quotes: service_role(서버 admin client) 전용 접근이므로 RLS ENABLE해도 무영향
  + authenticated 본인 견적 SELECT 정책 복원(002 의도)
- spatial_ref_sys: extension 소유라 RLS 불가 → 미사용 PostGIS extension 제거로 해소
  (geometry/geography 의존 0건 확인)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 16:47:45 +09:00
6d16e17969 Merge: SaaS 전환 마이그레이션 P1·P2·P4 + P3 골격
- 블로그 자동화 완전 제거
- SaaS 제품 카탈로그(/packages) + 네비 3축(SaaS·음악·외주) 재편
- 음악을 'AI 음악 생성 개발 가이드 패키지' 단품으로 디벨롭
- 계획 문서 진행 상태 반영

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 16:11:44 +09:00
4cbc563411 docs(plan): SaaS 전환 마이그레이션 P1·P2·P4 완료 + P3 골격 구현 상태 반영
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 16:09:43 +09:00
a9d6091d1a feat(music): 음악 팩을 'AI 음악 생성 개발 가이드 패키지' 단품으로 디벨롭 (구독 폐기)
- TIERS desc·productName을 '개발 가이드' 정체성으로 재서술 (가격·1회 결제 유지)
- music/packs/layout 메타 + layout.tsx JSON-LD Offer를 가이드 패키지로 갱신
- 구독 인프라(products.ts monthly·subscriptions·cron)는 보존
- 기존 1회 구매자 0명 — 별도 처리 없음(종결 기록)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 16:08:36 +09:00
4eee1b5c31 feat(ia): SaaS 제품 카탈로그(/packages) + 네비를 SaaS·음악·외주 3축으로 재편
- 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>
2026-05-31 16:08:28 +09:00
ec8c4345b8 chore(blog): /work/blog 라우트·참조·메타 완전 제거 (2026-05-29 재정의)
- app/work/blog/, lib/blog-tools/ 폴더 삭제
- 홈·work 허브 카드/카피, footer 링크에서 블로그 자동화 제거
- layout.tsx keywords·description·JSON-LD Offer 제거
- refund 약관 상품 목록 정리, sitemap /services/blog 엔트리 제거
- next.config: /services/blog·/work/blog → /work 301 리다이렉트

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 15:51:40 +09:00
87aa498500 feat(admin): AdminSidebar에 "설문 응답" 메뉴 추가
NAV_ITEMS 배열 끝에 /admin/survey 항목 (체크리스트 아이콘).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:40:08 +09:00
7f196f1c19 feat(admin): /admin/survey 대시보드 — 목록 + 통계 + CSV + 상세 modal
- 필터: 전체/오늘/이번 주
- 통계: Q2/Q4/Q5 분포 + 만족도 평균 + 이메일률 + 완료 시간 중간값
- 응답 테이블 (시각/나이상황/Q4/Q5/Q6 미리보기/이메일/상세)
- 상세 modal: 7 질문 + 메타 14 필드 모두 표시
- CSV 다운로드 (BOM UTF-8, Excel 호환)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:38:59 +09:00
fa9b05c7e8 feat(api): /api/admin/survey GET — 목록 + 통계 + CSV export
- ?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>
2026-05-16 05:36:40 +09:00
ac9b70fb5e feat(shell): DashboardShell STANDALONE_PATHS에 /gyeol 추가
CONTOUR 설문 페이지는 자체 시각 정체성 — TopNav/푸터/카카오 모두 숨김.
풀스크린 설문 UI 집중도 보장.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:34:53 +09:00
41f6b347a9 feat(api): /api/survey POST — DB 저장 + Resend 확인 메일
- Rate limit: IP당 1분 5회 (기존 contact 패턴)
- 필수 validation: age_range, status, awareness_freq
- 입력 정제(sanitizeStr) + 이메일 형식 검증
- supabase INSERT (service role, RLS 우회)
- 이메일 입력 시: Resend 즉시 확인 메일 + email_confirmation_sent 마킹
- 메일 실패는 응답 저장 성공에 영향 X

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:33:50 +09:00
262d6c3ed1 feat(gyeol): /gyeol 단일 페이지 통합 — 9 step state, localStorage 복구
- 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>
2026-05-16 05:31:54 +09:00
82fa3b3489 feat(gyeol): ThanksStep — 감사 메시지 + 사이트 돌아가기
이메일 입력 여부에 따라 "결과 추후 공유" 안내 분기.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:30:05 +09:00
0cc8b6b497 feat(gyeol): Q6Step (자유 의견 textarea) + Q7Step (이메일 옵션)
- 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>
2026-05-16 05:29:20 +09:00
d622dafcce feat(gyeol): Q4Step (비용 라디오 6) + Q5Step (도구 라디오 8 + 만족도 1-5)
- Q4: 라디오 패턴 재사용 (Q2와 동일 스타일)
- Q5: 두 입력 한 화면 — 도구 라디오 + 만족도 1-5 버튼 그리드
- 둘 다 선택 시 다음 활성

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:27:56 +09:00
0586ccc9ea feat(gyeol): Q3Step — 멀티 체크 9개 + 기타 자유 입력
validation: 최소 1개 체크 또는 기타 입력 있어야 다음 활성.
체크박스 패턴 + 활성 시 보라 + 흰 체크마크.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:26:15 +09:00
27b3f7948e feat(gyeol): Q1Step (드롭다운) + Q2Step (라디오 5)
- Q1: 나이대 + 상황 두 드롭다운, 둘 다 선택 시 활성
- Q2: 자각 빈도 5 라디오, 보라 활성 스타일
- 라디오 패턴이 이후 Q4/Q5에서 재사용됨

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:24:58 +09:00
454b7abf88 feat(gyeol): IntroStep — CONTOUR 로고 그라데이션 + 부제 + 시작 버튼
영문 단독 브랜드, 한글 부제 "나를 더 선명하게 이해하는 3분".
보라/시안 그라데이션 텍스트, 7 질문 안내.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:23:40 +09:00
b54e34feba feat(gyeol): QuestionLayout — 질문 단계 공통 wrapper
ProgressBar + 헤더 + 본문 slot + 이전/다음 네비게이션.
nextDisabled로 validation 제어. submitting 시 버튼 비활성.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:22:43 +09:00
d0db9236c8 feat(gyeol): ProgressBar — 진행률 (보라/시안 그라데이션 라인)
intro/thanks step에서는 미렌더. q1~q7만 표시.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:21:44 +09:00
2a99567a7f feat(survey): lib/survey/storage — localStorage progress save/load/clear
새로고침 시 step + response 복구. SSR safe (window 체크).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:20:42 +09:00
a773af2a20 feat(survey): lib/survey/questions — 7 질문 옵션 SSOT
각 질문의 라디오/체크/드롭다운 옵션 배열 + 헤더 카피.
spec markdown의 7 질문 그대로 반영 (단어 '결' 등 한글 컨셉어 제거 — CONTOUR 영문 단독).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:19:46 +09:00
824d2cd1ea feat(survey): lib/survey/types — SurveyStep, SurveyResponse, SavedProgress
7 질문 step 정의 + 응답 객체 타입. survey_responses 테이블과 1:1 대응.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:18:18 +09:00
7fbfff7f54 feat(db): survey_responses 테이블 마이그레이션 — CONTOUR PMF 설문
- anon INSERT 허용 (불특정 다수 응답)
- SELECT 정책 없음 → service role(admin)만 조회 가능
- index: created_at desc + email partial
- 메타: user_agent, referrer, utm_*, completion_seconds

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:17:25 +09:00
ae10bdc0b9 docs(plan): CONTOUR PMF 설문 사이트 implementation plan — 19 task, 5 phase
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>
2026-05-16 05:07:09 +09:00
82feb14fa1 docs(spec): CONTOUR PMF 인터뷰 설문 사이트 설계
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>
2026-05-16 04:50:41 +09:00
960728c99c feat(nav): TopNav 로그인 시에도 "Try now" 노출 (마케팅 컨버전 유지)
D 트랙 4/4. P1 Task 2 review M-3 후속:
- 로그인 사용자: [마이페이지] [Try now] [로그아웃] 3개 모두 노출
  → 신규 팩 구매 동기 유지 (이전: Try now가 사라져 컨버전 손실)
- 로그아웃 button을 텍스트 스타일로 가볍게 (Try now가 시각 강조)
- 모바일: flex-col로 2줄 배치 (1줄: 마이페이지+Try now, 2줄: 로그아웃 텍스트)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 04:14:20 +09:00
25b682b7cb refactor(mypage): kakao URL 상수 + 옛 URL 정돈 + 탭 가로 스크롤
D 트랙 3/4. 잔여 정돈:
- kakao 오픈채팅 URL hardcoded → KAKAO_OPENCHAT_URL import (lib/contact)
- EmptyState linkHref + 기타 잔존 옛 URL 새 URL로 (/services/* → /music|work/*)
- 탭 바: flex-wrap → flex-nowrap + overflow-x-auto + scrollbar-hide
  → 모바일 7-tab을 한 줄 가로 스크롤 (wrap 시 2줄 불규칙 배치 해소)
- globals.css에 scrollbar-hide 유틸리티 추가

P2 Task 4 review M-5 (mobile 7-tab orphan) 해소.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 04:12:19 +09:00
400d879093 refactor(shell): KakaoFloatButton 컴포넌트 추출 — PublicShell 인라인 → 별도 컴포넌트
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>
2026-05-16 04:09:18 +09:00
359e70f57b feat(lib): contact.ts — KAKAO_OPENCHAT_URL SSOT 상수
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>
2026-05-16 04:07:23 +09:00
fd7297a383 docs(plan): D 트랙 follow-up — 4 task cleanup
P0/P1/P2 review에서 defer된 4 cleanup 일괄:
- D1: lib/contact.ts — KAKAO_OPENCHAT_URL SSOT
- D2: KakaoFloatButton.tsx 컴포넌트 추출
- D3: mypage 잔여 정돈 (kakao URL 상수 + EmptyState linkHref 새 URL + 탭 가로 스크롤)
- D4: TopNav "Try now" 로그인 시 노출 (컨버전 유지)

당초 5 follow-up 중 "mypage 다운로드 버튼 조건부 렌더"는 Phase 2 implementation
에서 이미 조건부 처리됨 → D3 정돈에 흡수.

총 ~100 LOC 미만. brainstorm 생략 (review에서 이미 명세).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 04:05:46 +09:00
972bfd8f8a refactor(routes): 원본 25 파일 삭제 — Phase B에서 컨텐츠 이동 완료
Phase D 마무리:
- app/services/music/* (page, layout, samples — 3 파일)
- app/studio/page.tsx (1)
- app/freelance/* (page, layout — 2)
- app/services/website/* (page, layout, 8 samples — 10)
- app/services/blog/* (page, layout — 2)
- app/saju/* (page, layout, input, result, 2 sections, SajuForm — 7)

총 25 파일. next.config.ts redirects()로 외부 링크 보존 (영구 301).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:53:34 +09:00
e60749f21d feat(seo): JSON-LD OfferCatalog URL 갱신 — 새 IA
모든 Offer.url + itemOffered.url 필드를 새 URL로:
- /services/music → /music/packs (음악 3종)
- /services/blog → /work/blog
- /saju → /work/saju
- /freelance → /work/freelance
- /services/website → /work/website

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:51:25 +09:00
8df0eb6ee3 feat(footer): PublicShell 푸터 URL 갱신 + Product → Music 컬럼명
- 8개 URL 새 URL로 (/services/* → /music/*, /work/*)
- Product 컬럼명 → Music (사업부 명명 일치)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:49:51 +09:00
a35d9e3017 feat(nav): TopNav LINKS 5개 → 2개 (Music | Custom Build) + Try now → /music
헤더 안 b 적용. 각 사업부 허브로 진입.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:48:23 +09:00
9fb9ae6a79 feat(home): 메인 안 2 적용 — Brand Hero + 2-up + Music 섹션 + Custom Build + Final CTA
- 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>
2026-05-16 03:46:45 +09:00
5309f6d08b feat(work): /work/blog — 현 /services/blog 컨텐츠 이동
@/ 절대 경로 import + 내부 Link 새 URL.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:41:58 +09:00
31c376da07 feat(work): /work/saju + input + result — 현 /saju 컨텐츠 이동
- 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>
2026-05-16 03:39:14 +09:00
f9f8882710 feat(work): /work/website + 8 samples — 현 /services/website 컨텐츠 이동
- 메인 페이지 + 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>
2026-05-16 03:32:19 +09:00
9fabde02b2 feat(work): /work/freelance — 현 /freelance 이동 + #automation 앵커
- 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>
2026-05-16 03:27:37 +09:00
ff76bab84f feat(work): /work 허브 신설 — Custom Build 4 카드 + 5건 사례 + 견적 폼
- 4 카드: 외주 / 웹사이트 / AI 사주 / 블로그 (자동화는 외주 흡수)
- 납품 사례: lib/freelance-portfolio 5건 import
- 견적 CTA: ContactModal('외주 개발 문의')
- 가격 표 없음 — 가격 미정 (P3에서 추가 예정)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:22:37 +09:00
5c23f135b1 feat(music): /music/studio — 현 /studio 컨텐츠 이동 (depth 변경 → @/ 절대 import)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:20:39 +09:00
807c01246b feat(music): /music/samples — 현 /services/music/samples 컨텐츠 이동
@/ 절대 경로 import + 내부 Link 새 URL.
원본은 Phase D에서 삭제 예정.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:17:43 +09:00
868b78f4f6 feat(music): /music/packs — 현 /services/music 컨텐츠 이동
@/ 절대 경로 import + 내부 Link 새 URL로 변환.
원본 app/services/music/* 는 Phase D에서 삭제 (현재는 양쪽 존재 → redirect 우선).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:15:51 +09:00
96cc452d37 feat(music): /music 허브 신설 — 3 카드 (팩 상세 / 샘플 / 스튜디오)
Music 사업부 진입점. /music/{packs,samples,studio} 으로 분기.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:12:51 +09:00
a6aae53b89 feat(packs): lib/freelance-portfolio — 외주 납품 5건 데이터 추출
/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>
2026-05-16 03:11:04 +09:00
b74cfacf8d feat(routing): next.config.ts redirects() 10개 추가
P1 IA 마이그레이션 — 기존 URL → 새 URL 영구 리다이렉트 (permanent: true):
- /services/music → /music/packs
- /services/music/samples → /music/samples
- /studio → /music/studio
- /freelance → /work/freelance
- /services/website → /work/website
- /services/website/samples/:slug → /work/website/samples/:slug
- /services/blog → /work/blog
- /saju → /work/saju
- /saju/input → /work/saju/input
- /saju/result → /work/saju/result

이 시점에 destination 페이지 아직 없음 (Phase B에서 생성). 단, redirect 자체는 빌드 OK.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:09:26 +09:00