d3ro-voice/memory/handoff-archive/2026-04-11-0940-prior-bigbang.md
윤찬 817b4a2580 chore: 빅뱅 사이클 1차 wrap-up — 핸드오프 + Phase 5 체크리스트
빅뱅 Phase 1~6 완료 (Phase 5는 OAuth provider 연결 대기):
- Phase 1: 사용자별 SQLite 격리 (816f527)
- Phase 1.5: 로컬 모드 entry point (1a01cea)
- Phase 2: 온보딩 + Cloud Sync 티저 (f1321df)
- Phase 4: 티어 enforcement 로컬 해방 (46b77f1)
- Phase 3: 로컬 우선 sync + login_required UI (ceadf1b) [재정의]
- Phase 5: 3 클라이언트 일원화 검증 → OAuth provider 대기
- Phase 6: wrap-up (이 커밋)

handoff-latest 새로 작성, 이전 스냅샷은 archive로 이동.
project_status에 Phase 5 OAuth 연결 가이드 + 검증 체크리스트 기록.
2026-04-11 10:37:40 +09:00

7.2 KiB

Session Handoff — 2026-04-11 09:40 (Mac, Big Bang 사이클 직전)

From: macOS (yunchan-ui-MacBookPro) Last commit: dd1c305 — feat(desktop): SaaS [1+2] 빌드 타임 env + OAuth 강제 로그인 게이트 Branch: main Remote: https://gitlab.twentyoz.kr:8443/d3r0/voice.git

이번 세션에서 한 일 (1M 컨텍스트, 데스크톱 Mac 안정화 + SaaS 1차)

환경

  • Mac 부트스트랩: Node 22 (brew), sox 14, supabase CLI 2.84
  • npm install --force (rollup win32 옵셔널 dep 충돌 우회)
  • @electron/rebuild@3 --version=33.4.11 완료
  • Sanity build: desktop/web typecheck, web next build, api-client vitest 19 passed

Supabase 배포

  • 프로젝트: yunchan8804-blip's Project (llnocwyqvhgwpdjcqqyw)
  • supabase link + db push (8개 마이그레이션)
  • supabase functions deploy (10개 Edge Functions)
  • apps/web/.env.local + server/supabase/.env.local 작성

V2-6차 [W][A~D] — 웹 고도화

  • W. fix: AppRouterCacheProvider Emotion key 'd3ro-mui''mui' (숫자 3 → SSR 500)
  • A. Dark/Light/Theme 토글 (theme-mode-context.tsx, 12개 locale theme.*)
  • B. DocumentEditor Mermaid + Markdown 렌더 (markdown-preview.tsx)
  • C. 회의 오디오 재생 (meeting-audio-player.tsx, Storage signed URL 1h)
  • D. Dashboard 14일 추이 차트 (recharts)

V2-6차 [E~L] — 데스크톱 Mac 안정화

  • E. macOS 단축키 표기 ⌘⇧⌃⌥ (format-hotkey.ts + 호출 위치 4개)
  • F. Sidecar apps/desktop/sidecar/.venv/ 생성 + paths.ts venv 우선
  • G. HotkeyRecordModal 칩 'WIN' → ⌘ 표기 (getKeyName 플랫폼 분기)
  • H. bootstrap.ts hideRecordingTip import 누락 → ReferenceError 픽스
  • I. macOS 시스템 beep 차단 — Electron globalShortcut 통합 (HotkeyService)
  • J. Sidecar 동적 포트 (_findFreePort, orphan EADDRINUSE 회피)
  • K. macOS Cmd+V paste — TextInsertService LeftSuper/LeftControl 분기
  • L. qwen3 reasoning 39초 — /no_think 토큰 + stripReasoningBlocks + 빈 응답 fallback

SaaS [1+2] — 데스크톱 fat client → 진짜 SaaS 클라이언트 변환

  • [1] 빌드 타임 Supabase env 주입
    • electron.vite.config.ts: loadEnv('D3RO_') + main define
    • apps/desktop/.env.local: D3RO_SUPABASE_URL/ANON_KEY
    • ConfigService: BUILD_TIME_* 상수, configGet/Set이 빌드 타임 우선 + 변경 차단
  • [2] OAuth 첫 실행 강제 게이트
    • CloudSyncState.saasMode: boolean 추가
    • LoginScreen.tsx 신규 (Google/GitHub만)
    • App.tsx AuthGate 상태머신
    • CloudSyncSection saasMode일 때 URL/Key 입력 필드 숨김

미완 / 확실히 알려진 이슈

  • Ollama qwen3:4b가 4B reasoning 모델이라 CPU에서 느림 → 사용자가 더 빠른 모델로 교체 권장 (gemma3:1b 또는 qwen2.5:3b)
  • Accessibility 권한 첫 실행 시 macOS 권한 다이얼로그가 떠야 함 (안 뜨면 시스템 설정 → 손쉬운 사용에 Electron 추가)
  • 데스크톱 SQLite는 여전히 단일 파일 (userData/d3ro-voice/d3ro.db) — 한 PC에 여러 사용자가 OAuth 로그인 시 데이터 섞일 위험 ← 빅뱅 핵심 작업

🚧 다음 세션: 빅뱅 사이클 (Desktop SaaS Client 완성)

자세한 단계별 계획은 아래 "다음 세션 시작 프롬프트" 참조.

요약 목표:

  1. 사용자별 SQLite 격리userData/users/${userId}/d3ro.db
  2. 회원가입/온보딩 흐름 — OAuth 첫 가입 시 환영 + 마이그레이션
  3. cloud-first 정책 — Supabase source of truth, local read-through cache
  4. 멀티 디바이스 sync 강화
  5. 티어 enforcement — 데스크톱에서도 free quota 차단
  6. 데스크톱 ↔ 웹 ↔ 모바일 데이터 일원화 검증

🔑 다음 세션 시작 시 즉시 할 일

# 1. git pull
git pull origin main   # 마지막 커밋 dd1c305 또는 그 이후 확인

# 2. 환경 검증 (이미 mac에 다 있음)
node --version          # v22.x
which sox supabase      # /opt/homebrew/bin/...
ls apps/desktop/sidecar/.venv/bin/python3   # exists
ls apps/desktop/.env.local                  # gitignored, exists

# 3. 워크스페이스 재설치 필요 시
npm install --force

# 4. 데스크톱 dev 띄워서 LoginScreen 보이는지 확인
npm run dev
# → 첫 화면이 LoginScreen이어야 함 (Google/GitHub 버튼)

⚠ 환경 / 주의사항

  • gitlab 푸시는 사용자 명시 후에만: 이번 세션에선 push 안 했음. 다음 세션에서 빅뱅 작업 끝나면 사용자 확인 후 git push origin main
  • Ollama 모델: qwen3:4b 설치됨, 느리면 ollama pull gemma3:1b 권장
  • Accessibility 권한: 데스크톱 핫키 동작에 필수 — macOS 시스템 설정에서 수동 허용
  • Supabase 외부 키: ANTHROPIC/OPENAI/RESEND/STRIPE는 아직 안 주입됨 → web의 /chat, /knowledge, /billing은 키 채워지기 전엔 동작 안 함 (사용자가 키 줄 때 supabase secrets set)
  • 데스크톱 .env.local: gitignored, 이번 세션에서 작성. 만약 다음 세션이 다른 PC에서 시작하면 apps/desktop/env.example을 보고 직접 작성 필요
  • DB 마이그레이션: 빅뱅 [1] 사용자별 SQLite 격리 시 기존 단일 DB의 데이터를 첫 로그인 사용자에게 귀속시키는 마이그레이션 필요. 데이터 손실 주의

📦 의존성 / 도구

  • Node 22.22.2 (brew)
  • Python 3.13 (Framework) + venv at apps/desktop/sidecar/.venv
  • Supabase CLI 2.84.2
  • Ollama (사용자가 별도 설치, qwen3:4b 모델)
  • @electron/rebuild@3 33.4.11
  • Electron 33.4.11

🧪 마지막 검증

게이트 상태
desktop tsc
desktop build (electron-vite)
desktop dev (실제 실행) Main window shown
Hotkey ⌘⇧1 + globalShortcut accelerator=Shift+Cmd+1 등록
Sidecar venv spawn 한국어 96% 1.5초 오디오 → 426ms 전사
Cmd+V paste (사용자 확인 "되긴한다")
LLM refine ⚠ qwen3:4b reasoning 끄기 후 첫 시도 미확인 — 사용자 검증 필요
LoginScreen ⚠ 이번 세션 마지막에 빌드만, 사용자 시각 확인 미수행

📊 누적 통계 (이번 세션 포함)

  • 신규 커밋: 13개 (V2-6차 [A~L] + SaaS [1+2])
  • 신규 파일:
    • apps/web: theme-mode-context, markdown-preview, meeting-audio-player, meetings-trend-chart
    • apps/desktop: format-hotkey, LoginScreen, sidecar/.venv, .env.local, env.example
  • 수정: ConfigService(빌드 타임), CloudSyncService(saasMode), CloudSyncSection, App.tsx, HotkeyService(globalShortcut), LocalSTTService(_findFreePort), LocalLLMService(/no_think + stripReasoning), TextInsertService(Cmd+V), bootstrap(hideRecordingTip), ...

🔗 참고

  • memory/project_status.md — 전체 현황 + V2-6차 [A~L] + SaaS [1+2]
  • docs/v2/00-v2-master-plan.md — V2 마스터 플랜
  • docs/v2/phase-V2-4.md — 데스크톱 동기화 설계
  • apps/desktop/.env.local — 빌드 타임 Supabase env (gitignored)
  • apps/desktop/env.example — 템플릿
  • memory/handoff-archive/2026-04-10-2300-windows-to-mac.md — 이전 핸드오프

🎯 다음 세션 시작 프롬프트 (사용자가 그대로 복사해서 붙여넣기)

다음 세션에서 그대로 붙여넣을 프롬프트는 별도 파일에: memory/big-bang-prompt.md