# D3RO-VOICE 프로젝트 현황 > 마지막 갱신: 2026-04-08 > 규칙 13: 작업 완료 즉시 이 파일 갱신 의무 ## 현재 단계 **V1 (Electron) 완료** → **V2 (Monorepo) 진행 중** - Phase V2-1a ✅ 완료 (Monorepo 구조 이동) - Phase V2-1b ✅ 완료 (packages/core 추출) - Phase V2-1c ✅ 완료 (packages/ui 추출) - 다음: Phase V2-1d (packages/i18n 추출) ## 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-1c 완료 내역** - `packages/ui/` (@d3ro/ui) 신규 생성: - `src/theme.ts` (d3roPalette/d3roTypo/d3roShadow SSOT 전체) - `src/theme-vars.ts` (팝업/main 프로세스용 CSS 변수 맵) - `src/components/ds/{CrtDisplay, InstrumentPanel, Led, MetalCard, MetalDial, PhosphorText, PhysicalButton, ScreenPanel, ButtonGroup, index}.tsx` - `src/index.ts` barrel - `packages/ui/package.json`: React/MUI/Emotion은 **peerDependencies**, `@d3ro/core`만 직접 dep - `apps/desktop/src/shared/` 디렉토리 완전 제거 (theme-vars가 마지막이었음) - subpath exports: `./theme`, `./theme-vars`, `./components/ds` - DS 컴포넌트 내부 `../../theme` 상대 경로는 그대로 유효 (packages/ui 내부에서 해결) - **일괄 치환**: - `../theme`, `../../theme`, `./theme` → `@d3ro/ui/theme` - `../components/ds`, `../../components/ds`, `./ds`, `../ds` → `@d3ro/ui/components/ds` - `../ds/`, `../../ds/` → `@d3ro/ui/components/ds` (세부 파일 import는 barrel로 통합) - `@shared/theme-vars` → `@d3ro/ui/theme-vars` (WindowManager 1건) - `apps/desktop/tsconfig.node/web.json`: `@shared/*` paths 완전 제거, `@d3ro/ui`, `@d3ro/ui/*` paths 추가, `include`에서 `src/shared/**/*` 제거 - `electron.vite.config.ts`: `@shared` alias 제거, `@d3ro/ui` alias 추가, externalize exclude에 `@d3ro/ui` 추가 - `vitest.config.ts`: alias 교체 **V2-1c 검증** - `typecheck` ✅ - `build` ✅ - `dev` 런타임 ✅ (DB/핫키/Ollama/Main window 정상) - `apps/desktop/src/shared/` 디렉토리 자체가 사라져 `@shared/*`는 이제 프로젝트에 존재하지 않음 **V2-1b 완료 내역** - `packages/core/` 패키지 신규: `@d3ro/core`, subpath exports (types/errors/ipc-channels/constants/utils/*), docx dep 포함 - 6개 파일 `git mv`로 `packages/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.json`의 `paths`에 `@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 ```