d3ro-voice/memory/project_status.md
yunchan8804 3b0eb3393b feat(V2-1b): packages/core 추출 — 공유 타입/에러/채널/유틸 분리
packages/core (@d3ro/core) 신규 생성:
- types.ts, errors.ts, ipc-channels.ts, constants.ts (shared에서 이동)
- utils/meeting-markdown.ts, utils/markdown-to-docx.ts (main/utils에서 이동)
- subpath exports 정의 (./types, ./errors, ./ipc-channels, ./constants,
  ./utils/meeting-markdown, ./utils/markdown-to-docx)
- src/index.ts barrel export 추가
- docx를 core 자체 dependency로 선언

apps/desktop 연결:
- package.json에 @d3ro/core: '*' dep 추가
- tsconfig.node/web.json paths에 @d3ro/core/* 추가
- electron.vite.config.ts 3개 섹션 alias 추가 (main/preload/renderer)
- externalizeDepsPlugin exclude에 @d3ro/core (workspace 소스 번들 대상)
- vitest.config.ts alias 추가

일괄 치환 (79 파일, 167건):
- @shared/{types,errors,ipc-channels,constants} → @d3ro/core/*
- static/dynamic import + type expression import 모두 포함
- MeetingModeService.ts의 ../utils/* 상대 경로 → @d3ro/core/utils/*
- @shared/theme-vars는 V2-1c 범위로 남김 (WindowManager만 사용)

M1 수정 포함:
- electron.vite.config.ts의 resolve('src/shared') → resolve(__dirname, ...)
  CWD 독립적으로 동작하도록 견고화

검증:
- typecheck 통과
- build 통과 (main+preload+renderer)
- dev 런타임 → DB/핫키/Ollama 모두 정상, 기존 데이터 연속성 유지
2026-04-08 14:39:46 +09:00

6.2 KiB

D3RO-VOICE 프로젝트 현황

마지막 갱신: 2026-04-08 규칙 13: 작업 완료 즉시 이 파일 갱신 의무

현재 단계

V1 (Electron) 완료V2 (Monorepo) 진행 중

  • Phase V2-1a 완료 (Monorepo 구조 이동)
  • Phase V2-1b 완료 (packages/core 추출)
  • 다음: Phase V2-1c (packages/ui 추출) — 별도 세션

V1 완료 페이즈

Phase 내용 상태
1~9 기본 음성 어시스턴트 (STT/LLM/TTS/핫키/팝업)
10 Killer features (메모, 보이스 커맨드, 스크린 컨텍스트, 체인, 캡션)
11 Monetization (라이선스, 쿼터)
12 Pro features (파일 전사, 회의 요약, 딕테이션 템플릿)
13 음성 대화, RAG, 보이스 액션
14 회의 모드
14.5 회의 고도화 (다중 문서 생성/편집/내보내기)
15 Auto Polish + AI 채팅 + 마인드맵 + 공유
15.5 화자 구분 (LLM 추정 + pyannote)

추가 개선사항 (post-15.5)

  • 히스토리/회의 목록 반응형 그리드 + 카드 UI
  • 설정 LLM 모델 드롭다운
  • 오디오 테스트 실시간 레벨 미터
  • Ollama 미실행 시 설치 경로 탐색 후 자동 스폰 (2026-04-08)

V2 진행 상황

Phase V2-1: Monorepo + Core 추출 — 진행 중

Sub-phase 범위 상태
V2-1a npm workspaces + apps/desktop으로 V1 이동 완료
V2-1b packages/core 추출 (types, errors, ipc-channels, constants, utils) 완료
V2-1c packages/ui 추출 (DS 컴포넌트 + theme + theme-vars) ⏸️ 대기
V2-1d packages/i18n 추출 (locale JSON + 훅) ⏸️ 대기

V2-1b 완료 내역

  • packages/core/ 패키지 신규: @d3ro/core, subpath exports (types/errors/ipc-channels/constants/utils/*), docx dep 포함
  • 6개 파일 git mvpackages/core/src/로 이동:
    • apps/desktop/src/shared/{types,errors,ipc-channels,constants}.ts
    • apps/desktop/src/main/utils/{meeting-markdown,markdown-to-docx}.ts
  • packages/core/src/index.ts barrel export 추가
  • apps/desktop/package.json"@d3ro/core": "*" dep 추가
  • apps/desktop/tsconfig.node.json, tsconfig.web.jsonpaths@d3ro/core/* 추가, @shared/*는 theme-vars용으로 유지
  • apps/desktop/electron.vite.config.ts alias 3개 섹션에 @d3ro/core 추가 + M1 수정: resolve('src/shared')resolve(__dirname, 'src/shared')
  • externalizeDepsPlugin exclude에 @d3ro/core 추가 (main/preload 둘 다)
  • apps/desktop/vitest.config.ts@d3ro/core alias 추가
  • 일괄 치환: @shared/{types,errors,ipc-channels,constants}@d3ro/core/* (사용자 79개 파일, 167건)
    • static import (from '@shared/...')
    • dynamic import (import('@shared/...'))
    • type expression import (keyof import('@shared/...').AppConfig)
  • MeetingModeService.ts의 상대 경로 utils import (../utils/meeting-markdown, ../utils/markdown-to-docx)를 @d3ro/core/utils/*로 교체
  • packages/core 내부 자기 참조: meeting-markdown.ts@shared/types../types 상대 경로

V2-1b 검증

  • npm run typecheck
  • npm run build (main+preload+renderer)
  • npm run dev 런타임 실행 (DB/핫키/Ollama 모두 정상)
  • apps/desktop/src/shared/에는 theme-vars.ts 1개만 남음 (V2-1c에서 이동 예정)

V2-1a 완료 내역

  • 루트 package.json을 npm workspaces 루트로 재구성 (workspaces: apps/, packages/)
  • turbo.json, tsconfig.base.json 추가 (Turborepo 자체 설치는 뒤로 미룸)
  • V1 파일 전체를 apps/desktop/으로 git mv:
    • src/, resources/, tests/, sidecar/, scripts/
    • electron.vite.config.ts, electron-builder.yml, vitest.config.ts
    • tsconfig.node.json, tsconfig.web.json (+ 새 tsconfig.json)
  • apps/desktop/package.json 신규 (name: "@d3ro/desktop", 기존 deps 그대로)
  • @electron/rebuild --version=33.4.11로 native 모듈 재빌드 (better-sqlite3, uiohook-napi)
  • 루트 tsconfig.json → apps/desktop references 형태

V2-1a 결정사항

  • 패키지 매니저: npm workspaces 유지 (pnpm 전환은 별도 sub-phase)
    • 이유: Turborepo는 npm workspaces와 호환, 구조 이동과 PM 전환을 동시에 하면 롤백 불가
  • site/: 루트 유지 (랜딩 페이지, V2 무관)
  • docs/, memory/, CLAUDE.md: 루트 유지
  • productName: "d3ro-voice" 필수 — package name을 @d3ro/desktop으로 바꾸면 Electron의 app.getName()이 바뀌어 userData 경로가 %APPDATA%\@d3ro\desktop\으로 이동(기존 DB/설정 유실). productName을 명시하면 app.getName()이 이를 우선 반환하여 %APPDATA%\d3ro-voice\ 그대로 유지됨.

검증 결과

  • npm run typecheck
  • npm run build (electron-vite main+preload+renderer)
  • npm run dev 실제 실행 → DB 경로 d3ro-voice/로 복원, 기존 핫키(Alt keyCode=2) 로드, Ollama 자동 실행 감지 모두 정상
  • npm run dist (electron-builder installer)은 V2-1 완료 후 별도 검증

Phase V2-2~V2-8: 미착수

Supabase 인프라, Web App MVP, 데스크톱 동기화, Mac 빌드, Mobile App, 팀 기능, 결제/출시

알려진 차단/이슈

  • @nut-tree-fork/nut-js 포크 사용 (V1 잔여 이슈)
  • Ollama 의존성: 없으면 LLM 기능 사용 불가 (2026-04-08 자동 실행 기능 추가로 UX 개선)

디렉토리 구조 (V2-1a 목표)

d3ro-voice/                   # 루트 (monorepo)
├── apps/
│   └── desktop/              # 기존 V1 전체
│       ├── src/
│       ├── resources/
│       ├── build/
│       ├── package.json      # name: @d3ro/desktop
│       ├── electron.vite.config.ts
│       ├── electron-builder.yml
│       ├── tsconfig*.json
│       └── drizzle.config.ts
├── packages/                 # V2-1b/c/d에서 채움
├── site/                     # 랜딩 페이지 (루트 유지)
├── docs/                     # 설계서/페이즈 문서
├── memory/                   # 이 파일
├── pnpm-workspace.yaml       # 또는 package.json "workspaces"
├── turbo.json
├── package.json              # 루트 workspace
├── tsconfig.base.json
└── CLAUDE.md