- npm workspaces 루트 (apps/*, packages/*) 세팅
- 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)
- apps/desktop/package.json 신규 (name=@d3ro/desktop)
- productName: 'd3ro-voice' 명시 — app.getName()을 고정하여 userData 경로
%APPDATA%\d3ro-voice\ 그대로 유지 (기존 DB/설정 연속성 보장)
- 루트 package.json을 workspace 루트로 재구성, 공통 devDep만 유지
(typescript, eslint, prettier)
- turbo.json, tsconfig.base.json 추가 (Turborepo 자체 설치는 별도 sub-phase)
- memory/project_status.md 생성 (규칙 13)
검증:
- npm run typecheck 통과
- npm run build 통과 (electron-vite main+preload+renderer)
- npm run dev 실제 실행 → DB/핫키/Ollama 자동 실행 모두 정상
- Sidecar: pyannote /diarize 엔드포인트 + requirements.txt 업데이트
- LLM 기반 화자 추정 (Phase 1 — 오디오 보존 없이 전사 텍스트 분석)
- CaptionSegment에 speaker 필드 추가
- EditableSegment: 화자별 색상 바 + 화자 Chip 표시
- TranscriptTab: 화자 구분 버튼 + 진행률
- 설정: HuggingFace 토큰 입력 + Diarization 토글
- IPC: DIARIZE + DIARIZATION_PROGRESS 채널
- 에러코드: 895-897
- 12개 locale i18n
- Auto Polish: LLM으로 전사 다듬기 (필러 제거, 문장 교정)
- AI 채팅: 회의 전사 기반 Q&A (LocalLLMService.chatStream 활용, 스트리밍)
- 마인드맵: 빌트인 템플릿 추가 (마크다운 계층 트리)
- 공유: 클립보드 복사 메뉴 추가
- MeetingChatPanel UI (접기/펼치기, 스트리밍 인디케이터)
- TranscriptTab에 AI 다듬기 버튼 추가
- 12개 locale i18n 키 추가
PLAUD 수준의 기능 확장:
- 전사 편집: 인라인 편집 + 원본 보존 + 수정됨 표시(점선 밑줄)
- 다중 문서 생성: 회의록/보고서/아이디어노트/커스텀 템플릿
- MD 에디터: 렌더링/편집 토글 (react-markdown + remark-gfm)
- 상세 페이지 리디자인: 풀스크린 탭 전환 구조
- 내보내기: MD, PDF, TXT, DOCX 4종 (docx 패키지)
- 커스텀 프롬프트 템플릿 저장/재사용 (electron-store)
- SSOT: 마크다운 파싱 유틸 추출, 후처리에서 자동 문서 생성 제거
DB: meeting_documents 테이블 + edited_transcript 컬럼
IPC: 8+4 채널, 서비스 2개(MeetingModeService 확장 + MeetingDocTemplateService 신규)
UI: 8개 신규 컴포넌트 (meeting/ 디렉토리), 12개 locale i18n
실시간 녹음 + 타임스탬프 메모 + STT 전사 + LLM 구조화 회의록 + PDF/MD 내보내기.
CaptionService 연동, 동시 사용 충돌 방지, 긴 회의 2-pass 요약 지원.
DB 2테이블, IPC 15채널, UI 3뷰(목록/녹음/상세), 12개 locale i18n.
- CHANGELOG.md: Phase 1~13 + 랜딩 페이지 전체 변경 이력
- LICENSE: MIT
- CONTRIBUTING.md: 개발 환경, 코드 표준, PR 프로세스
- SECURITY.md: 보안 정책, 취약점 보고 절차
- .editorconfig: 에디터 설정 통일 (indent, charset, eol)
- .nvmrc: Node.js 20
- .gitattributes: line ending 정규화, 바이너리 선언, linguist 설정
- .gitignore: site/dist, Python, Whisper 모델 등 누락 항목 추가
Phase 12:
- FileTranscriptionService: ffmpeg PCM 변환 + 30초 청크 순차 STT
- MeetingSummaryService: 자막 세션 → LLM 자동 요약 + DB summaryText
- DictationTemplateService: 필드별 음성 입력 상태 머신 + 프리셋 3개
Phase 13.1:
- VoiceConversationService: STT→Ollama /api/chat→TTS 대화 루프 (10턴)
- TTSPlaybackService: Windows SAPI 문장 단위 큐 재생
- LocalLLMService.chatStream: Ollama /api/chat 스트리밍
Phase 13.2:
- RAGService: Ollama 임베딩 + SQLite 벡터 + 코사인 유사도 검색
- KnowledgeBasePage: 문서 관리 + 질문/답변 UI
- PDF 파서: zlib FlateDecode 해제 + BT/ET 텍스트 추출
Phase 13.3:
- VoiceActionService: LLM JSON 액션 플랜 생성 + 실행
- 프리셋 6개 (크롬/메모장/탐색기/볼륨), 위험 명령 차단
공통: IPC ~70채널, 에러코드 780-878, i18n 100+키
버그픽스: 라이선스 로컬 키 우선, i18n featureLabel, DOM 중첩
- StatusBar: 오프라인 3초 후 넛징 버블 표시 ("설치 안내 보기→" 링크)
- OllamaGuideModal: 3단계 설치 안내 (다운로드→모델 pull→자동 연결)
- OnboardingModal: Step 3에 Ollama 설치 안내 단계 추가
- Settings 정보 탭: "초기 설정 안내 다시 보기" 버튼
- system.openExternal IPC 추가 (외부 URL 열기)
- bootstrap: notifyRenderer('app:dataChanged') 이벤트 발행
- session-completed: Dashboard 통계 + History 갱신
- command:selected: CMD 페이지 활성 명령어 갱신
- preload: app.onDataChanged 이벤트 리스너 추가
- DashboardPage/CommandsPage/HistoryPage: onDataChanged 구독하여 자동 loadData()
- command-popup: Vanilla JS 팝업 (히스토리 팝업과 동일 패턴)
Arrow↑↓ 선택, Enter 적용, 1-5 직접 선택, ESC 닫기
- WindowManager: showCommandPopup/hideCommandPopup/sendKeyToCommandPopup
- bootstrap: Ctrl+Shift+C 단축키 등록 + command:selected IPC
- electron.vite.config: command-popup HTML 빌드 엔트리 추가
- 선택한 명령어가 즉시 activeInstructionId로 설정 → 다음 녹음에 적용
- CommandsPage: 명령어 카드 클릭 → 활성 명령어 설정 (앰버 하이라이트)
- 상단에 ACTIVE COMMAND 표시
- 같은 카드 다시 클릭하면 해제
- 활성화 시 defaultLLMAction='custom' + activeInstructionId 저장
- VoiceModeService: action='custom'일 때 활성 명령어 프롬프트로 LLM 처리
- {{text}}를 전사 텍스트로 치환
- Settings LLM 탭: "기본 후처리 명령어" 드롭다운 추가
(없음/다듬기/번역/요약/문법교정/커스텀)
- VoiceModeService: defaultLLMAction='none'이면 LLM 스킵
(이전: 'refine' 아니면 무조건 스킵 → 수정)
- 사용자가 Settings에서 후처리 방식을 선택하면 모든 녹음에 적용
1. CommandsPage: handleSave/handleDelete에 실제 IPC 호출 연결
- instruction:create/update/delete 호출 추가
- 프리셋은 삭제 불가 (isBuiltin 체크)
2. Preload: instruction API 추가 (getAll/create/update/delete/reorder)
- 기존에 preload 브릿지가 없어서 렌더러에서 호출 불가했음
3. Dictionary → STT initialPrompt 주입
- VoiceModeService._transcribe에서 DictionaryService.getPromptHints() 호출
- 사용자 사전 단어를 Whisper initialPrompt로 전달
4. DictionaryPage: 편집 기능 추가
- 각 항목에 Edit 버튼 추가
- Add/Edit 공용 다이얼로그 (editId로 분기)
- Arrow↑↓/Enter/Escape/1-9 키를 팝업 열릴 때 globalShortcut 등록, 닫힐 때 해제
- showHistoryPopup: 2-phase 제거 → 즉시 show (렌더러 비활성 문제 방지)
- hideHistoryPopup/itemSelected/popupDismissed에서 nav 키 해제
1. RecordingTip: thinking 상태 전환 시 opacity 보장
2. 히스토리 오디오 경로: WAV 파일 경로를 DB에 기록
3. 마이크 테스트 UI: Settings Audio 탭에 TEST 버튼 + 레벨 바
4. 온보딩 플로우: 첫 실행 시 3단계 안내 (환영→마이크→핫키→완료)
5. MetalDial 컴포넌트: 동심원 그루브, 회전 포인터, LED 인디케이터
- Settings: 정보(About) 탭 추가 (버전, 기술 스택, 음성 엔진 정보)
- VoiceModeService: 전사 완료 시 PCM→WAV 파일 저장 ({userData}/recordings/)
- WAV 헤더 생성 (16kHz, 16bit, mono)
- HistoryService와 연동 가능 (audioLocalPath)
- docs/phases/phase-9.md 설계 문서 작성