From 69d61231b96e1ca4a1a76ce1ccfde7bacbc1783f Mon Sep 17 00:00:00 2001 From: gahusb Date: Mon, 25 May 2026 16:32:00 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20v0-plan=20task=20step=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC=EB=B0=95=EC=8A=A4=20+=20README=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=20=ED=91=9C=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- README.md | 33 ++++++++++++++++++++++++++---- docs/v0-plan.md | 54 ++++++++++++++++++++++++------------------------- 2 files changed, 56 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 1bf50d1..5640801 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,9 @@ - **v0 구현 plan (W1~W4, 13 task)**: `docs/v0-plan.md` - **brainstorming 원본**: `docs/brainstorming-raw.md` -## v0 상태 (2026-05-24 기준) +## v0 상태 (2026-05-25 기준) + +### 사전 액션 | 항목 | 상태 | |---|---| @@ -19,11 +21,34 @@ | v0 plan (W1~W4) | ✅ | | Day 0 검증 (도메인·앱스토어·인스타·상표) | ✅ | | @lapie_app 인스타 핸들 선점 | ✅ | +| macOS 접근 방안 결정 | ✅ 박재오 Mac 보유 (2026-05-24) | | lapie.kr / lapie.io 도메인 등록 | ⏸ 7월 착수 직전 | -| macOS 접근 방안 결정 | ⏸ Pre-Task 0.2 | | 변리사 정식 상표 조사 | ⏸ 출원 직전 | -| Figma 와이어프레임 5화면 | ⏸ W1 첫 주 | -| **W1 Task 1 (Expo 세팅) 착수** | ⏸ 2026-07 예정 | +| Figma 와이어프레임 5화면 | ⏸ 가능하면 W1 첫 주 | + +### v0 코드 진행 (W1~W4, 7월 → 2026-05-24 앞당김) + +| Task | 상태 | 비고 | +|---|---|---| +| Gitea repo 연결 (`gahusb/lapie_app`) | ✅ SSH ED25519 키 (`windows-pc`) | +| **W1 Task 1** Expo + RN + TS 셋업 | ✅ Windows 가능 범위 (SDK 56, RN 0.85, TS 6) | `prebuild` + `run:ios`는 Mac | +| **W1 Task 2** 카메라 화면 + 권한 | ⏸ Mac 실기기 | +| **W1 Task 3** Segmentation Swift 브릿지 | ⏸ Mac | +| **W2 Task 4** Pose Swift 브릿지 | 🟡 TS wrapper + mock test ✅ / Swift Mac | +| **W2 Task 5** validatePose | ✅ TDD 3 케이스 / UI는 Task C | +| **W2 Task 6** splitMask | ✅ TDD 4 케이스 | +| **W3 Task 7** Skia 합성 컴포넌트 | ⏸ Mac 실기기 | +| **W3 Task 8** 자동 스케일 (핵심 차별화) | ✅ calculateScale TDD + 폴백 + usePinchScale / Mac 검증 | +| **W4 Task 9** LiveFittingScreen | ⏸ Task C UI 골격 + Mac | +| **W4 Task 10** CaptureResultScreen | ⏸ Task C UI 골격 + Mac | +| **W4 Task 11** Onboarding + 네비게이션 | ⏸ Task C UI 골격 + Mac | +| **W5~6 Task 12** 자동 스케일 보강 | ⏸ 버퍼 | +| **W5~6 Task 13** 마케팅 콘텐츠 5편 | ⏸ 버퍼 | + +검증: +- `npx tsc --noEmit`: 무에러 +- `npm test`: 6 suites / 17 tests passed (sanity 1 + pose 1 + photoValidation 3 + maskSplit 4 + calculateScale 6 + detectClothBounds 2) +- 푸시: 7 commits → Gitea ## 기술 스택 (v0) diff --git a/docs/v0-plan.md b/docs/v0-plan.md index 93a7c27..10df81f 100644 --- a/docs/v0-plan.md +++ b/docs/v0-plan.md @@ -78,7 +78,7 @@ - Create: `lapie/app.json` - Create: `lapie/tsconfig.json` -- [ ] **Step 1: Expo 프로젝트 생성** +- [x] **Step 1: Expo 프로젝트 생성** ✅ 2026-05-24 (SDK 56, Windows 임시폴더 → 파일 복사 방식) ```bash cd C:/Users/jaeoh/Desktop/workspace/ @@ -88,7 +88,7 @@ cd lapie Expected: `lapie/` 디렉터리에 `App.tsx`, `package.json`, `tsconfig.json` 생성. -- [ ] **Step 2: Bare workflow로 전환 (네이티브 모듈 필요)** +- [ ] **Step 2: Bare workflow로 전환 (네이티브 모듈 필요)** ⏸ Mac 작업 ```bash npx expo prebuild --platform ios @@ -96,14 +96,14 @@ npx expo prebuild --platform ios Expected: `lapie/ios/` 디렉터리 생성, CocoaPods install. (Windows에서는 prebuild 실패 가능 — mac 환경 또는 EAS에서 실행). -- [ ] **Step 3: 필수 의존성 설치** +- [x] **Step 3: 필수 의존성 설치** ✅ 2026-05-24 (vision-camera v5, skia v2.6, worklets-core, zustand, gesture-handler, safe-area-context, jest-expo 등) ```bash npm install react-native-vision-camera @shopify/react-native-skia react-native-worklets-core zustand react-native-safe-area-context npm install --save-dev jest @types/jest ts-jest ``` -- [ ] **Step 4: 권한 설정 (`app.json`)** +- [x] **Step 4: 권한 설정 (`app.json`)** ✅ 2026-05-24 (iOS NSCamera/Photo/PhotoAdd 3종 + bundleIdentifier com.lapie.app) ```json { @@ -122,7 +122,7 @@ npm install --save-dev jest @types/jest ts-jest } ``` -- [ ] **Step 5: 첫 빌드 확인** +- [ ] **Step 5: 첫 빌드 확인** ⏸ Mac 작업 (`npx expo run:ios`) ```bash npx expo run:ios @@ -130,7 +130,7 @@ npx expo run:ios Expected: iOS 시뮬레이터에 기본 화면 표시. -- [ ] **Step 6: Git 초기화 + 첫 커밋** +- [x] **Step 6: Git 초기화 + 첫 커밋** ✅ 2026-05-24 (Gitea SSH remote 연결 + ED25519 키 + 2 commits push) ```bash cd lapie @@ -367,7 +367,7 @@ git commit -m "feat: iOS Vision person segmentation native bridge" - Create: `lapie/src/features/pose/index.ts` - Test: `lapie/src/features/pose/__tests__/pose.test.ts` -- [ ] **Step 1: Swift 모듈 작성 (17개 keypoint 반환)** +- [ ] **Step 1: Swift 모듈 작성 (17개 keypoint 반환)** ⏸ Mac 작업 `lapie/modules/pose/ios/PoseModule.swift`: ```swift @@ -418,7 +418,7 @@ class PoseModule: NSObject { } ``` -- [ ] **Step 2: Obj-C 브릿지** +- [ ] **Step 2: Obj-C 브릿지** ⏸ Mac 작업 `lapie/modules/pose/ios/PoseModule.m`: ```objc @@ -431,7 +431,7 @@ RCT_EXTERN_METHOD(detectPose:(NSString *)imageUri @end ``` -- [ ] **Step 3: TS 래퍼 + 타입** +- [x] **Step 3: TS 래퍼 + 타입** ✅ 2026-05-24 (Keypoint/Joint/PoseResult + NativeModules wrapper, 매번 조회 패턴) `lapie/src/features/pose/index.ts`: ```ts @@ -459,7 +459,7 @@ export async function detectPose(imageUri: string): Promise { } ``` -- [ ] **Step 4: 유닛 테스트 (모킹)** +- [x] **Step 4: 유닛 테스트 (모킹)** ✅ 2026-05-24 (1 passed, jest-expo 호이스팅 충돌 회피 — NativeModules 직접 할당 패턴 사용) `lapie/src/features/pose/__tests__/pose.test.ts`: ```ts @@ -485,7 +485,7 @@ describe('detectPose', () => { }); ``` -- [ ] **Step 5: 실기기 manual test** +- [ ] **Step 5: 실기기 manual test** ⏸ Mac 작업 - 정면사진 1장 입력 → 어깨·골반·발목 keypoint가 사진 위 정확한 위치에 표시되는지 시각 검증 - 임시 화면 `PoseDebugScreen.tsx`에 keypoint를 점으로 overlay @@ -503,7 +503,7 @@ git commit -m "feat: iOS Vision human body pose native bridge (17 keypoints)" - Create: `lapie/src/features/photoValidation/validatePose.ts` - Test: `lapie/src/features/photoValidation/__tests__/validatePose.test.ts` -- [ ] **Step 1: 자세 검증 함수 (TDD)** +- [x] **Step 1: 자세 검증 함수 (TDD)** ✅ 2026-05-24 — RED 단계 (Cannot find module → 실패 확인) `lapie/src/features/photoValidation/__tests__/validatePose.test.ts`: ```ts @@ -550,7 +550,7 @@ describe('validatePose', () => { }); ``` -- [ ] **Step 2: 실행 → 실패 확인** +- [x] **Step 2: 실행 → 실패 확인** ✅ 2026-05-24 ```bash npx jest src/features/photoValidation @@ -558,7 +558,7 @@ npx jest src/features/photoValidation Expected: FAIL — validatePose not defined. -- [ ] **Step 3: 구현** +- [x] **Step 3: 구현** ✅ 2026-05-24 (한국어 격조사 정확화: '어깨가/골반이/발목이') `lapie/src/features/photoValidation/validatePose.ts`: ```ts @@ -599,7 +599,7 @@ export function validatePose(pose: PoseResult): ValidationResult { } ``` -- [ ] **Step 4: 테스트 통과 확인** +- [x] **Step 4: 테스트 통과 확인** ✅ 2026-05-24 — 3 passed ```bash npx jest src/features/photoValidation @@ -607,7 +607,7 @@ npx jest src/features/photoValidation Expected: 3 passed. -- [ ] **Step 5: 사진 등록 화면 (UI)** +- [ ] **Step 5: 사진 등록 화면 (UI)** ⏸ Task C에서 진행 + Mac 실기기 검증 `lapie/src/screens/PhotoCaptureScreen.tsx`: ```tsx @@ -668,7 +668,7 @@ const styles = StyleSheet.create({ }); ``` -- [ ] **Step 6: 의존성 추가 + 커밋** +- [ ] **Step 6: 의존성 추가 + 커밋** ⏸ Task C에서 진행 (expo-image-picker) ```bash npx expo install expo-image-picker @@ -684,7 +684,7 @@ git commit -m "feat: photo capture screen with pose-based validation" > Selfie Segmentation 마스크(전체 실루엣) + Pose keypoint(어깨·골반·발목)로 상의/하의/전신 3 마스크를 잘라낸다. Skia로 처리. -- [ ] **Step 1: 분할 로직 테스트 (TDD)** +- [x] **Step 1: 분할 로직 테스트 (TDD)** ✅ 2026-05-24 — RED 단계 `lapie/src/features/maskSplit/__tests__/splitMask.test.ts`: ```ts @@ -720,7 +720,7 @@ describe('computeSplitRegions', () => { }); ``` -- [ ] **Step 2: 구현** +- [x] **Step 2: 구현** ✅ 2026-05-24 (requireJoint helper로 invariant explicit — `!` 안티패턴 회피) `lapie/src/features/maskSplit/splitMask.ts`: ```ts @@ -764,7 +764,7 @@ export function computeSplitRegions( } ``` -- [ ] **Step 3: 테스트 통과 확인** +- [x] **Step 3: 테스트 통과 확인** ✅ 2026-05-24 — 4 passed (top/bottom/full y + x 범위 별도) ```bash npx jest src/features/maskSplit @@ -772,7 +772,7 @@ npx jest src/features/maskSplit Expected: 3 passed. -- [ ] **Step 4: 커밋** +- [x] **Step 4: 커밋** ✅ 2026-05-24 — `8ec53d9 feat(maskSplit): computeSplitRegions TDD (v0-plan Task 6)` ```bash git add src/features/maskSplit @@ -916,7 +916,7 @@ git commit -m "feat: Skia composite view masking camera live into base photo" - Create: `lapie/src/features/autoScale/detectClothBounds.ts` - Test: `lapie/src/features/autoScale/__tests__/calculateScale.test.ts` -- [ ] **Step 1: 스케일 계산 테스트 (TDD)** +- [x] **Step 1: 스케일 계산 테스트 (TDD)** ✅ 2026-05-25 — 6 케이스 (정상비율/0폴백/음수폴백/상한클램핑/하한클램핑/클램핑X) `lapie/src/features/autoScale/__tests__/calculateScale.test.ts`: ```ts @@ -948,7 +948,7 @@ describe('calculateScale', () => { }); ``` -- [ ] **Step 2: 구현** +- [x] **Step 2: 구현** ✅ 2026-05-25 (MIN_SCALE/MAX_SCALE export — usePinchScale에서 재사용) `lapie/src/features/autoScale/calculateScale.ts`: ```ts @@ -976,7 +976,7 @@ export function calculateScale({ photoShoulderPx, cameraClothWidthPx }: ScaleInp } ``` -- [ ] **Step 3: 테스트 통과** +- [x] **Step 3: 테스트 통과** ✅ 2026-05-25 — 6 passed ```bash npx jest src/features/autoScale/calculateScale @@ -984,7 +984,7 @@ npx jest src/features/autoScale/calculateScale Expected: 3 passed. -- [ ] **Step 4: 옷 경계 검출 (단순화: 카메라 프레임에서 person mask 제외 영역의 bbox)** +- [x] **Step 4: 옷 경계 검출 (단순화: 카메라 프레임에서 person mask 제외 영역의 bbox)** ✅ 2026-05-25 — v0 폴백 함수 (항상 0 반환) + 회귀 테스트 2 케이스. 정식 구현은 Task 12 (Vision Saliency) `lapie/src/features/autoScale/detectClothBounds.ts`: ```ts @@ -1005,7 +1005,7 @@ export async function detectClothWidthPx(cameraFrameUri: string): Promise ⚠ 옷 윤곽 검출은 v0 W3 가장 어려운 부분. **v0 1차 출시는 자동 검출 폴백(scale=1) + 핀치만으로 운영**, 정확도는 W5~6 버퍼·v1에 보강. 본 단계의 핵심은 calculateScale 순수 함수의 TDD 검증. -- [ ] **Step 5: 핀치 줌 hook** +- [x] **Step 5: 핀치 줌 hook** ✅ 2026-05-25 — `.runOnJS(true)` 명시로 reanimated 의존 회피, Mac 실기기 검증 대기 `lapie/src/features/autoScale/usePinchScale.ts`: ```ts @@ -1036,7 +1036,7 @@ export function usePinchScale(initialScale = 1) { } ``` -- [ ] **Step 6: 의존성 + 커밋** +- [x] **Step 6: 의존성 + 커밋** ✅ 2026-05-25 — gesture-handler는 W1 Task 1에서 이미 설치, `005d612 feat(autoScale): detectClothBounds 폴백 + usePinchScale hook` ```bash npx expo install react-native-gesture-handler