Commit Graph

9 Commits

Author SHA1 Message Date
1081a3a85e feat(ui): UI 화면 골격 + store + composite/maskSplit hook (v0-plan Task 9/10/11)
새 의존성:
- expo-image-picker ~56.0.13 (PhotoCapture)
- expo-media-library ~56.0.6 (CaptureResult 저장)
- expo-file-system ~56.0.7 (generateRegionMask 파일 저장 — Mac 구현 시)

새 파일:
- src/store/useAppStore.ts: zustand store (photoUri/maskUri/pose/mode + reset)
- src/features/segmentation/index.ts: SegmentationModule TS wrapper (Mac Swift 빌드 대기)
- src/features/composite/shaders.ts: Skia RuntimeEffect 셰이더 소스 (마스크 흰색 → 카메라, 그 외 → 베이스)
- src/features/composite/CompositeView.tsx: 합성 컴포넌트 골격 (Skia v2 API Mac 검증 대기)
- src/features/composite/useCameraFrameUri.ts: 카메라 프레임 URI hook 골격 (vision-camera v5 API Mac 검증 대기)
- src/features/maskSplit/generateRegionMask.ts: region 마스크 생성 골격 (Skia v2 API Mac 검증 대기)
- src/features/maskSplit/useModeMask.ts: mode 전환 시 마스크 자동 재생성 hook + cleanup race 처리
- src/screens/OnboardingScreen.tsx: 3장 슬라이드 (정상 동작)
- src/screens/PhotoCaptureScreen.tsx: 갤러리 선택 + 자세 검증 (PoseModule Mac 빌드 후 동작)
- src/screens/CaptureResultScreen.tsx: 결과 + 저장 + 공유 (expo-media-library)
- src/screens/LiveFittingScreen.tsx: 모드 전환 + 핀치/팬 + Composite 골격 (Camera는 v5 API Mac 검증 대기)
- App.tsx: 4화면 state-based navigation (onboarding → photo → live → result) + GestureHandlerRootView 감싸기

핵심 결정:
- vision-camera v5는 v4와 완전 다른 Nitro 기반 (takeSnapshot 미존재 / usePhotoOutput/usePreviewOutput hook 패턴).
  v0-plan v4 코드 그대로 옮길 수 없어 Camera 부분 골격 + Mac TODO 명시.
- Skia v2 child shader API도 v1과 다를 가능성 → CompositeView 골격 + Mac TODO.
- 모드 전환/핀치 줌/네비게이션/store/검증 로직은 골격 단계에서 정상 동작.

검증 (Windows 가능 범위):
- npx tsc --noEmit: 무에러
- npm test: 6 suites / 17 tests passed (UI 골격 추가가 기존 테스트 영향 없음 확인)

Mac에서 채울 부분 (정리):
- vision-camera v5 Camera + photoOutput + previewOutput 통합
- Skia v2 RuntimeEffect child shader 패턴 (ImageShader / useShader)
- expo-file-system v56 writeAsStringAsync(base64) 동작 확인
- generateRegionMask 본 구현 (Surface.MakeOffscreen + clipRect + encode PNG)
- 실기기 manual test 5종 (각 화면 전환 + 핀치 줌 + 캡쳐 + 저장 + 공유)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 16:38:44 +09:00
69d61231b9 docs: v0-plan task step 체크박스 + README 상태 표 갱신
docs/v0-plan.md ( 표시 + Mac 작업 명시):
- Task 1 (Expo 셋업): Step 1/3/4/6  (Step 2/5 Mac)
- Task 4 (Pose Swift 브릿지): Step 3/4 TS+test  (Step 1/2/5/6 Mac)
- Task 5 (validatePose + 사진 등록 UI): Step 1-4 TDD  (Step 5/6 Task C)
- Task 6 (splitMask): Step 1-4 
- Task 8 (자동 스케일): Step 1-6  (Step 7 Mac 검증)

README.md:
- "v0 상태"를 사전 액션 + v0 코드 진행으로 2분할
- W1 Task 1 ⏸ →  Windows 가능 범위
- macOS 접근 방안 ⏸ →  Mac 보유
- W1~W4 Task 별 상태 한눈에 (Task 4 🟡 일부, Task 5/6/8 , Task 2/3/7/9/10/11 ⏸ Mac)
- 검증 결과 한 줄: 17 tests passed, 7 commits

검증:
- npx tsc --noEmit: 무에러
- npm test: 6 suites / 17 tests passed (docs 변경이라 기존 테스트 영향 없음 확인)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 16:32:00 +09:00
005d612ef3 feat(autoScale): detectClothBounds 폴백 + usePinchScale hook (v0-plan Task 8 마무리)
src/features/autoScale/detectClothBounds.ts:
- v0 폴백: detectClothWidthPx → 항상 0 반환
  → calculateScale가 confidence=0으로 fallback, 사용자가 핀치로 직접 보정
- 정식 구현은 Task 12: iOS Vision Saliency (VNGenerateAttentionBasedSaliencyImageRequest)

src/features/autoScale/__tests__/detectClothBounds.test.ts:
- 회귀 테스트 2 케이스: 정상 입력 / 빈 문자열 → 둘 다 0 (Task 12 정식 구현 시 spec 변경 명시점)

src/features/autoScale/usePinchScale.ts:
- react-native-gesture-handler v2 Pinch + Pan Simultaneous
- .runOnJS(true) 명시 → worklet→JS thread 트램폴린 없이 setState 직접 (reanimated 의존 회피)
- [MIN_SCALE, MAX_SCALE] 재사용 (calculateScale 모듈에서 import)
- reset(): initialScale로 scale 복원 + tx/ty 0
- 검증은 Mac 실기기 manual test (Windows에서 hook 동작 검증 불가)

검증:
- npx tsc --noEmit: 무에러
- 전체 npm test: 6 suites / 17 tests passed
  (sanity 1 + pose 1 + photoValidation 3 + maskSplit 4 + calculateScale 6 + detectClothBounds 2)

남은 Task 8 부분: 없음 (Step 4-6 완료, Step 7 Mac 검증)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 16:18:25 +09:00
1c29b4ee8a feat(autoScale): calculateScale TDD (v0-plan Task 8 — 핵심 차별화)
src/features/autoScale/calculateScale.ts:
- 사진 어깨 픽셀 / 카메라 옷 너비 픽셀 = 스케일
- 카메라 옷 너비 ≤ 0 → scale=1, confidence=0 폴백
- 비율 [0.3, 3.0] 클램핑 → 클램핑 시 confidence=0.5, 정상 시 confidence=1.0

src/features/autoScale/__tests__/calculateScale.test.ts:
- 6 케이스 TDD: 정상비율 / 0폴백 / 음수폴백 / 상한클램핑 / 하한클램핑 / 클램핑X

검증:
- npx jest src/features/autoScale: 6 passed
- 전체 npm test: 5 suites / 15 tests passed (sanity 1 + pose 1 + photoValidation 3 + maskSplit 4 + autoScale 6)
- npx tsc --noEmit: 무에러

남은 부분 (v0-plan Task 8):
- detectClothWidthPx (네이티브 saliency 호출) — v0 폴백 scale=1, 보강은 Task 12에서
- usePinchScale hook (gesture-handler) — UI 통합 시점에 작성

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 15:55:12 +09:00
8ec53d95f0 feat(maskSplit): computeSplitRegions TDD (v0-plan Task 6)
src/features/maskSplit/splitMask.ts:
- Region / SplitRegions / ImageSize 타입
- 상의(어깨-20 ~ 골반) / 하의(골반 ~ 발목+20) / 전신(어깨-80 ~ 발목+20)
- x 범위: keypoint bbox ±20px
- requireJoint helper: validatePose 통과 후 호출 invariant — 누락 시 explicit throw

src/features/maskSplit/__tests__/splitMask.test.ts:
- 4 케이스 TDD: top / bottom / full y 좌표 + 공통 x 범위

검증:
- npx jest src/features/maskSplit: 4 passed
- npx tsc --noEmit: 무에러

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 15:54:17 +09:00
6f2998ef5f feat(photoValidation): validatePose TDD 3 케이스 (v0-plan Task 5)
src/features/photoValidation/validatePose.ts:
- 필수 6개 joint(어깨/골반/발목) 신뢰도 0.5↑ 검사
- 어깨 y 차이 30px 초과 시 기울어짐 사유 추가
- score = 100 - reasons × 25, passed = score ≥ 80
- 한국어 격조사 정확히 ('어깨가', '골반이', '발목이')

src/features/photoValidation/__tests__/validatePose.test.ts:
- 3 케이스 TDD: 정상 / 어깨 누락 / 기울어짐
- RED(Cannot find module) → GREEN(3 passed) 사이클 확인

검증:
- npx jest src/features/photoValidation: 3 passed
- npx tsc --noEmit: 무에러

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 15:53:05 +09:00
0f12be57cf feat(pose): TS wrapper + PoseResult 타입 + Jest mock test (v0-plan Task 4 일부)
src/features/pose/index.ts:
- Keypoint / Joint / PoseResult 타입 정의 (Vision Framework joint name 매핑)
- detectPose 함수: NativeModules.PoseModule.detectPose wrapper
- wrapper 내부 매번 NativeModules 조회 → 테스트의 NativeModule 주입 가능

src/features/pose/__tests__/pose.test.ts:
- NativeModules.PoseModule 직접 할당 mock (jest.mock 호이스팅 + jest-expo Platform 충돌 회피)
- detectPose 호출 → mock 결과 그대로 반환되는지 검증

검증:
- npx jest src/features/pose: 1 passed
- npx tsc --noEmit: 무에러

남은 부분 (Mac 작업):
- modules/pose/ios/PoseModule.swift (VNDetectHumanBodyPoseRequest 17점 keypoint)
- modules/pose/ios/PoseModule.m (RCT_EXTERN_MODULE)
- 실기기 manual test: keypoint를 사진 위 overlay로 시각 검증

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 15:51:43 +09:00
2919b7b4ac chore: initial Expo SDK 56 + RN 0.85 + TS 6 setup with vision-camera/skia deps
W1 Task 1 Windows 가능 범위 완료.

핵심 파일:
- package.json: lapie name + scripts(start/ios/android/web/test/typecheck)
- app.json: bundleIdentifier com.lapie.app + iOS 권한 3종
  (NSCameraUsageDescription, NSPhotoLibraryUsageDescription, NSPhotoLibraryAddUsageDescription)
- tsconfig.json: strict + noUncheckedIndexedAccess + types:["jest"]
- jest.config.js: jest-expo preset
- src/__tests__/sanity.test.ts: jest 동작 검증용 (W1 Task 3에서 실제 테스트로 대체 예정)

의존성:
- expo ~56.0.4, react 19.2.3, react-native 0.85.3
- react-native-vision-camera ^5.0.10
- @shopify/react-native-skia 2.6.2
- react-native-worklets-core ^1.6.3
- react-native-gesture-handler ~2.31.1
- react-native-safe-area-context ~5.7.0
- zustand ^5.0.13
- jest ^29.7.0, jest-expo ^56.0.4, @types/jest ^30

SDK 버전은 v0-plan(2026-05-23 작성)의 표기보다 상향:
- Expo SDK 52 → 56 (작업 시점 최신 stable)
- RN 0.76 → 0.85, TS 5 → 6
- vision-camera v4 → v5, skia v1 → v2.6
plan은 "7월 착수 직전 재검토" 명시 — 작업 시점 최신 적용.

검증:
- npx tsc --noEmit: 무에러
- npm test: sanity 1 passed

다음 단계 (Mac):
- npx expo prebuild --platform ios
- npx expo run:ios --device
- W1 Task 2 (vision-camera 카메라 화면 + 권한)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 15:41:31 +09:00
1a03b71779 docs: initial spec, v0-plan, brainstorming, CLAUDE.md harness rules
- docs/spec.md: 정식 spec (브랜드·시장·기술 스택·일정·Day 0 검증 결과)
- docs/v0-plan.md: W1~W4 13 task 구현 plan (TDD + manual test 절차)
- docs/brainstorming-raw.md: 2026-05-23 brainstorming 원본
- CLAUDE.md: 하네스 운영 규약 (컨텍스트 3단·agentic 7 구성요소·박재오 Why 정합도)
- README.md: 입구 + v0 상태 표
- .gitattributes: Windows ↔ macOS LF 통일 + pbxproj 바이너리 처리
- src/, modules/ 폴더 구조 (.gitkeep)

박재오 + AI agent 협업 표준 정립. 7월 착수 → 5/24 앞당김.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 15:31:41 +09:00