packages/i18n (@d3ro/i18n) 신규:
- src/locales/ 12개 JSON (ko/en/ja/zh/zh-TW/es/fr/de/pt/ru/vi/th)
- src/index.tsx: TFunction/Locale/LOCALE_META/resolveTranslation/
포맷 유틸(createFormatDate/Number/RelativeDate/Time)/
I18nContext/useI18n/I18nProvider
Electron 독립성 확보 (monorepo 원칙 준수):
- I18nStorage interface 신설 (load/save 어댑터 추상화)
- window.electronAPI.config 직접 호출 제거
- I18nProvider는 storage prop으로 영속화 어댑터 주입
- 기본값 noopStorage (메모리 한정, 세션 범위)
- 결과: packages/i18n은 React에만 의존, web/mobile에서 재사용 가능
apps/desktop 어댑터:
- App.tsx에 electronI18nStorage 구현 (config.get/set 래핑)
- <I18nProvider storage={electronI18nStorage}>로 주입
apps/desktop 설정:
- package.json: @d3ro/i18n '*' dep 추가
- tsconfig.node/web.json paths에 @d3ro/i18n 추가
- electron.vite.config.ts alias + externalize exclude 추가
- vitest.config.ts alias 추가
일괄 치환 (29 파일):
- ./i18n, ../i18n, ../../i18n → @d3ro/i18n
apps/desktop/src/renderer/i18n/ 디렉토리 완전 제거.
검증: typecheck + build + dev 런타임 모두 통과.
Phase V2-1 전체 완료 (a/b/c/d).
9 KiB
9 KiB
D3RO-VOICE 프로젝트 현황
마지막 갱신: 2026-04-08 규칙 13: 작업 완료 즉시 이 파일 갱신 의무
현재 단계
V1 (Electron) 완료 → V2 (Monorepo) 진행 중
- Phase V2-1 (전체) ✅ 완료
- V2-1a: Monorepo 구조 이동
- V2-1b: packages/core 추출
- V2-1c: packages/ui 추출
- V2-1d: packages/i18n 추출
- 다음: Phase V2-2 (Supabase 인프라)
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-1d 완료 내역
packages/i18n/(@d3ro/i18n) 신규 생성:src/locales/12개 JSON (ko/en/ja/zh/zh-TW/es/fr/de/pt/ru/vi/th)src/index.tsx: TFunction, Locale, LOCALE_META, resolveTranslation, createFormatDate/Number/RelativeDate/Time, I18nContext, useI18n, I18nProvider
- Electron 독립성 확보:
I18nStorageinterface 추가 (load/save 어댑터)- 기존
window.electronAPI.config직접 호출 →storageprop 주입 패턴 - 기본값은 noopStorage (메모리 한정)
- 기존
apps/desktop/src/renderer/App.tsx에electronI18nStorage어댑터 구현 후<I18nProvider storage={electronI18nStorage}>로 주입- apps/desktop 설정:
@d3ro/i18n: "*"dep 추가- tsconfig paths, vite alias, externalize exclude에
@d3ro/i18n추가
- 일괄 치환:
./i18n,../i18n,../../i18n→@d3ro/i18n(29 파일) apps/desktop/src/renderer/i18n/디렉토리 완전 제거
V2-1d 검증
- typecheck ✅
- build ✅
- dev 런타임 ✅ (DB/핫키/Ollama/Main window 모두 정상)
- Electron 의존이 완전히 apps/desktop에만 남아 monorepo 원칙 준수 (packages/i18n은 React에만 의존, 웹/모바일에서 그대로 재사용 가능)
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}.tsxsrc/index.tsbarrel
packages/ui/package.json: React/MUI/Emotion은 peerDependencies,@d3ro/core만 직접 depapps/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/<Component>,../../ds/<Component>→@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:@sharedalias 제거,@d3ro/uialias 추가, 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}.tsapps/desktop/src/main/utils/{meeting-markdown,markdown-to-docx}.ts
packages/core/src/index.tsbarrel 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.tsalias 3개 섹션에@d3ro/core추가 + M1 수정:resolve('src/shared')→resolve(__dirname, 'src/shared')externalizeDepsPluginexclude에@d3ro/core추가 (main/preload 둘 다)apps/desktop/vitest.config.ts에@d3ro/corealias 추가- 일괄 치환:
@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)
- static import (
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.ts1개만 남음 (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