feat(V2-3): Web App MVP — Next.js 15 + @d3ro/api-client
packages/api-client (@d3ro/api-client) 신규: - types.ts: 12개 테이블 Row/Insert/Update 타입 + Database 형식 - client.ts: createD3roSupabaseClient 팩토리 (placeholder fallback) - auth.ts: signInWithOAuth/signOut/getSession/onAuthStateChange - meetings.ts: 회의 + 메모 + 문서 + 전사 CRUD - history.ts: 음성 입력 이력 CRUD - usage.ts: 일일 쿼터 + 구독 조회 - 루트 barrel은 types만 re-export, 함수는 subpath import 전용 apps/web (@d3ro/web) 신규 — Next.js 15 App Router: - transpilePackages: @d3ro/core, ui, i18n, api-client - ThemeProvider (MUI + AppRouterCacheProvider) - I18nProvider (localStorage 어댑터) - AuthProvider (Supabase session Context) - 라우트 9개: - / (auth 상태 기반 리다이렉트) - /login (Google/GitHub OAuth, 미설정 경고) - /auth/callback (code -> session 교환) - /dashboard (요약 카드 + 최근 회의) - /meetings (카드 그리드 리스트) - /meetings/[id] (transcripts/memos/documents) - /record (getUserMedia + MediaRecorder + stt-proxy) - Sidebar, 인증 가드, 9바 웨이브폼, 레벨 미터 packages/ui 확장: - MetalCard가 BoxProps 상속 (sx/onClick 등 전달) - theme.ts에 typoSx(key) 헬퍼 추가 (d3roTypo -> MUI sx 변환) - d3roPalette.tag.blue 추가 (M5 정리 포함) - DS 컴포넌트 9개에 'use client' directive - MetalDial 미사용 import 제거 packages/i18n 확장: - ko.json에 7개 새 키 (nav.meetings/record/logout, login.*) 설계 결정: - Database 제네릭 현재는 기본 타입 (V2-4에서 supabase gen types로 자동화) - api-client barrel은 타입만 노출해서 컴파일 전파 차단 - DS 컴포넌트 client 경계 명시 - env 없어도 Next.js 빌드 성공 (placeholder URL/key) 검증: - web typecheck OK - desktop typecheck OK (회귀 없음) - web next build OK (9 라우트 정적/동적 생성) - desktop build OK (회귀 없음)
This commit is contained in:
parent
9742b2109a
commit
d0c33ca259
190 changed files with 6167 additions and 18 deletions
|
|
@ -7,14 +7,11 @@
|
|||
|
||||
**V1 (Electron) 완료** → **V2 (Monorepo) 진행 중**
|
||||
- Phase V2-1 ✅ 완료 (Monorepo 전환 — a/b/c/d)
|
||||
- Phase V2-2 🟡 로컬 작업 완료, 사용자 Supabase 배포 대기
|
||||
- Phase V2-5 🟡 로컬 작업 완료, 사용자 Mac 검증 대기
|
||||
- paths.ts 플랫폼 분기, electron-builder.yml mac 타겟, entitlements,
|
||||
SoundEffectService(afplay)/ScreenContextService(AppleScript) Mac 분기,
|
||||
build-sidecar.py 크로스 플랫폼, install-sox.sh, GitHub Actions Mac CI
|
||||
- 가이드: `docs/v2/phase-V2-5-mac-guide.md`
|
||||
- 다음: Phase V2-3 (Web App MVP — Next.js) 또는 V2-4 (데스크톱 동기화)
|
||||
- V2-2 사용자 액션이 끝나면 V2-3 진행 가능
|
||||
- Phase V2-1 minor ✅ 정리 ([M4] .eslintignore, [M5] EditableSegment hex)
|
||||
- Phase V2-2 🟡 로컬 완료, 사용자 Supabase 배포 대기
|
||||
- Phase V2-3 ✅ 완료 (Web App MVP — Next.js 15, 9 라우트)
|
||||
- Phase V2-5 🟡 로컬 완료, 사용자 Mac 검증 대기
|
||||
- 다음: Phase V2-4 (데스크톱 동기화) 또는 V2-6 (Mobile)
|
||||
|
||||
## V1 완료 페이즈
|
||||
|
||||
|
|
@ -212,8 +209,60 @@
|
|||
- C7 build-sidecar.py Windows 전제 → ✅ 크로스 플랫폼
|
||||
- M6/M7/M8/M9 (이미 분기 완료) → 변경 없음
|
||||
|
||||
### Phase V2-3/V2-4/V2-6/V2-7/V2-8: 미착수
|
||||
Web App MVP, 데스크톱 동기화, Mobile App, 팀 기능, 결제/출시
|
||||
### Phase V2-3: Web App MVP — 완료
|
||||
|
||||
**신규 패키지**
|
||||
- `packages/api-client/` (@d3ro/api-client) — Supabase 래퍼
|
||||
- `src/types.ts` — V2-2 스키마에 맞춘 수동 Database 타입 정의 (profiles/teams/meetings/transcripts/history/dictionary/daily_usage/subscriptions)
|
||||
- `src/client.ts` — createD3roSupabaseClient 팩토리 (URL/KEY 주입형, env 없어도 placeholder로 작동)
|
||||
- `src/auth.ts` — signInWithOAuth/signOut/getSession
|
||||
- `src/meetings.ts` — CRUD 함수 (meetings, memos, documents, transcripts)
|
||||
- `src/history.ts` — 음성 입력 이력 CRUD
|
||||
- `src/usage.ts` — daily_usage 조회 (쿼터 UI)
|
||||
- 루트 barrel은 types만 re-export (함수는 subpath로, 순환 의존 방지)
|
||||
|
||||
**신규 앱 — `apps/web/`**
|
||||
- Next.js 15 App Router + MUI 7 + Emotion
|
||||
- transpilePackages로 `@d3ro/core/ui/i18n/api-client` 소스 TypeScript 그대로 번들
|
||||
- 라우트 (총 9개):
|
||||
- `/` — auth 상태에 따라 리다이렉트
|
||||
- `/login` — Google/GitHub OAuth (Supabase 미설정 시 경고)
|
||||
- `/auth/callback` — OAuth code → session 교환 route handler
|
||||
- `/dashboard` — 요약 카드 4개 + 최근 회의 5건
|
||||
- `/meetings` — 회의 카드 그리드 리스트
|
||||
- `/meetings/[id]` — 상세 (transcripts + memos + documents 탭)
|
||||
- `/record` — 녹음 페이지 (getUserMedia + MediaRecorder + stt-proxy)
|
||||
- Providers: ThemeProvider(MUI+AppRouterCacheProvider) / I18nProvider(localStorage 어댑터) / AuthProvider(Supabase session)
|
||||
- 인증 가드: `/dashboard` layout + `/meetings`, `/record`, `/meetings/[id]` 개별 redirect
|
||||
- Sidebar: Dashboard / Meetings / Record / Logout
|
||||
- Recorder: 9바 웨이브폼 (Speakly 스타일), 실시간 레벨, elapsed timer, cancel/stop
|
||||
|
||||
**packages/ui 확장 (@d3ro/ui)**
|
||||
- `MetalCard`: `BoxProps` 확장하여 `sx`/`onClick` 등 전달 가능
|
||||
- `theme.ts`에 `typoSx(key)` 헬퍼 추가 — d3roTypo를 MUI sx 친화 포맷으로 변환
|
||||
- `theme.ts`에 `d3roPalette.tag.blue` 추가 (M5 수정의 부산물)
|
||||
- DS 컴포넌트 9개에 `'use client'` directive 추가 — RSC 경계 명시
|
||||
- `MetalDial.tsx`의 미사용 import 3개 제거 (tsc strict 회귀)
|
||||
|
||||
**packages/i18n 확장**
|
||||
- `ko.json`에 7개 새 키: `nav.meetings`, `nav.record`, `nav.logout`, `login.subtitle`, `login.google`, `login.github`, `login.terms`
|
||||
- 다른 locale은 fallback 체인으로 ko/en 사용 (추후 번역 작업에서 채움)
|
||||
|
||||
**설계 결정사항**
|
||||
- **Database 제네릭**: 현재 `SupabaseClient` 기본 타입 사용, V2-4에서 `supabase gen types typescript --local` 자동화 후 제네릭 주입 예정. 이유: 수동 Database 타입 정의가 @supabase/supabase-js 2.102의 복잡한 제약(PostgrestVersion, Views/Functions/Enums 형식)을 만족시키기 어려움.
|
||||
- **api-client barrel 분리**: 루트에서는 types만 export. 함수는 subpath(`@d3ro/api-client/meetings`)로만 접근. 이렇게 하지 않으면 apps/web이 api-client 루트를 import할 때 내부 meetings/history 등이 모두 tsc 스캔 대상이 되어 타입 에러가 전파됨.
|
||||
- **DS 컴포넌트 `'use client'`**: MUI + React 훅(CrtDisplay)을 쓰는 컴포넌트들은 Next.js RSC에서 쓰려면 client directive 필요. barrel 대신 각 파일마다 붙임.
|
||||
- **Supabase env 없이도 빌드 성공**: placeholder URL/key로 createBrowserClient/createServerClient를 호출. 런타임에 `isSupabaseConfigured()` 체크로 UI 경고 표시.
|
||||
|
||||
**검증 결과**
|
||||
- web typecheck ✅ (apps/web)
|
||||
- desktop typecheck ✅ (회귀 없음)
|
||||
- web `next build` ✅ — 9 라우트 (/ /login /auth/callback /dashboard /meetings /meetings/[id] /record /_not-found + root)
|
||||
- desktop `npm run build` ✅ (main+preload+renderer)
|
||||
- 실제 Supabase 연결은 V2-2 사용자 액션 이후 검증 가능
|
||||
|
||||
### Phase V2-4/V2-6/V2-7/V2-8: 미착수
|
||||
데스크톱 동기화, Mobile App, 팀 기능, 결제/출시
|
||||
|
||||
## 알려진 차단/이슈
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue