Phase 10~11 전체 구현: 킬러 피처 5종 + 수익화 시스템

Phase 10 킬러 피처:
- MemoService: 태그 CRUD + 마크다운 내보내기 (memo_tags DB)
- VoiceCommandService: 키워드→명령어 매칭, 프리셋 4종
- ScreenContextService: PowerShell 활성 윈도우 + Ctrl+C 선택 텍스트
- ChainService: LLM 명령어 순차 실행 파이프라인
- CaptionService: 6초 청크 연속 전사 + 시스템 오디오 루프백

VoiceModeService 파이프라인 통합:
- 녹음 시작 → 컨텍스트 캡처 → STT → 키워드 매칭 → LLM(체인/컨텍스트 주입) → 삽입

시스템 오디오 캡처:
- setDisplayMediaRequestHandler + audio: 'loopback' (IPC 브릿지)
- electron-audio-loopback 패키지 contextIsolation 호환 불가 → 직접 구현

Phase 11 수익화:
- LicenseService: Free/Pro/Pro+ 3티어, LemonSqueezy API
- Feature Gate: requireFeature/checkFeature/consumeFeature
- 일일 쿼터: Free dictation 20/일, LLM 10/일 (SQLite daily_usage)
- LicenseModal, ProBadge, UpgradePromptModal UI

디자인 보강:
- d3roTypo(13종), d3roShadow(10종), d3roRadius(7종) 토큰 시스템
- ScreenPanel, ButtonGroup DS 컴포넌트 신규
- PhosphorText 4→13종 변형, MetalDial conic-gradient 광택
- 공유 컴포넌트: EmptyStateCard, SearchInput, PageHeader, HistoryEntryCard

기타:
- 자막 핫키 SSOT 전체 연동 (Config→Hotkey→VoiceMode→Caption→Settings)
- StatusBar 자막 LED + 효과음, 자막 로딩 UI
- LLM 상태 이벤트 전파 수정 (폴링 제거 → onStatusChanged)
- 커맨드 팝업 "선택 해제" 항목 추가
This commit is contained in:
Yun Chan 2026-04-05 21:36:09 +09:00
parent 36d77ca224
commit a31f96bbb8
97 changed files with 11853 additions and 1143 deletions

View file

@ -77,9 +77,9 @@ npm run typecheck # tsc --noEmit
6. **녹음 UI**: 9개 웨이브 바, cos 분포 가중치, 100ms 애니메이션
## 현재 상태
Phase: 9 완료 + 폴리싱 완료 (Phase 1~9 전부 완료)
마지막 작업: Ollama 설치 안내 UI + Settings 속도 개선 + 커맨드 선택 팝업 + 실시간 UI 갱신
다음 작업: **Phase 10 킬러 피처** (실시간 자막, 스크린 컨텍스트, 음성 메모장, 멀티 LLM 체인, 음성 단축키)
Phase: 11 완료 (Phase 1~11 전체 완료)
마지막 작업: LicenseService + Feature Gate + LicenseModal + ProBadge + UpgradePrompt + 일일 쿼터 + LemonSqueezy API
다음 작업: Phase 12 랜딩 페이지 & 마케팅 또는 빌드/배포 안정화
차단 이슈: @nut-tree-fork/nut-js 포크 사용
### DS 컴포넌트 현황 (src/renderer/components/ds/)
@ -88,8 +88,48 @@ Phase: 9 완료 + 폴리싱 완료 (Phase 1~9 전부 완료)
- Led.tsx: LED 인디케이터 (amber/green/red/orange, pulse) ✅
- PhysicalButton.tsx: 물리 버튼 (돌출 그림자, 눌림 피드백) ✅
- MetalCard.tsx: 메탈 카드 컨테이너 ✅
- PhosphorText.tsx: 인광 텍스트 (hero/value/label/dim) ✅
- MetalDial.tsx: 메탈 다이얼 (동심원 텍스처, 드래그 회전, 금속 광택) ✅
- PhosphorText.tsx: 인광 텍스트 (13종 변형: hero/title/value/heading/body/compact/small/meta/label/dim/engrave/micro/nano) ✅
- MetalDial.tsx: 메탈 다이얼 (동심원 텍스처, 드래그 회전, conic-gradient 금속 광택) ✅
- ScreenPanel.tsx: 글래스 스크린 패널 (CRT 없는 인셋 베젤 + 반사) ✅
- ButtonGroup.tsx: 인셋 버튼 클러스터 (레퍼런스 .button-group) ✅
### 디자인 토큰 현황 (theme.ts)
- d3roTypo: 13단계 타이포 (hero 42px ~ nano 7px, size/weight/spacing/line)
- d3roShadow: 10종 그림자 (chassis/card/inset/button/dialog/tooltip 등)
- d3roRadius: 7종 반경 (outer 24px ~ pill 999px)
### Phase 11 구현 내용 (수익화 기반)
- **LicenseService**: Free/Pro/Pro+ 3단계 티어, electron-store 대신 별도 JSON 파일, 오프라인 우선 설계
- **Feature Gating**: Feature enum (16개 기능), 티어별 접근 매핑, 쿼터 한도 (Free: 받아쓰기 20회/일, LLM 10회/일)
- **daily_usage DB 테이블**: 날짜+기능별 사용량 추적 (drizzle-orm, UPSERT)
- **LemonSqueezy 연동**: 키 활성화/검증 API, variant_name→tier 매핑, 오프라인 유예 30일
- **IPC**: LICENSE 네임스페이스 9개 채널 (getInfo, activate, deactivate, checkFeature, getUsage, getAllUsage, getTierComparison, upgradePrompt, tierChanged)
- **Preload**: license API 네임스페이스 추가 (9개 메서드 + 2개 이벤트 리스너)
- **ErrorCode**: 850-862 범위 라이센스 에러 (LicenseKeyInvalid, QuotaExceeded, TierRequired 등)
- **UpgradePromptModal**: 쿼터 소진/잠긴 기능 접근 시 업그레이드 유도 모달 (혜택 목록, 쿼터 바)
- **SettingsModal License 탭**: 티어 표시, 키 입력/활성화, 사용량 바, 티어 비교표
- **DashboardPage 사용량**: Free 티어에서 오늘 사용량 바 (받아쓰기/LLM) 표시
- **ProBadge + useProFeature**: 잠긴 기능 오버레이 래퍼 컴포넌트 + 훅
- **VoiceModeService gating**: startSession에서 DICTATION 쿼터 체크/소비
- **LocalLLMService gating**: processText에서 LLM_PROCESS 쿼터 체크/소비 (차단 시 원본 텍스트 폴백)
- **i18n**: license.* 네임스페이스 40+ 키 추가 (ko/en)
### Phase 10 구현 내용 (서비스 레이어 + UI 통합)
- **MemoService**: memo_tags DB 테이블 + 태그 CRUD + 마크다운 내보내기
- **VoiceCommandService**: 키워드→명령어 매칭 엔진, 프리셋 키워드 4종 (번역/요약/다듬기/설명)
- **ScreenContextService**: 활성 윈도우 감지(PowerShell) + 선택 텍스트 캡처(Ctrl+C)
- **ChainService**: LLM 명령어 순차 실행 파이프라인, 단계별 진행 이벤트
- **CaptionService**: 3초 청크 연속 전사, caption-overlay 팝업(Vanilla JS)
- **VoiceModeService 통합**: 파이프라인 훅 3개 (컨텍스트 캡처→키워드 매칭→체인/컨텍스트 주입)
- **공유 컴포넌트**: EmptyStateCard, SearchInput, PageHeader, HistoryEntryCard
- **공유 유틸**: formatters.ts (formatDuration, getDateKey, formatNumber 등)
- **IPC**: 5개 새 네임스페이스 (MEMO, VOICE_COMMAND, CONTEXT, CHAIN, CAPTION)
- **Preload**: 5개 API 네임스페이스 추가 (memo, voiceCommand, context, chain, caption)
- **HistoryPage 태그 통합**: HistoryEntryCard에 태그 표시/추가/삭제, 태그 필터 바, 마크다운 내보내기
- **CommandsPage 키워드/체인**: VoiceCommandService 키워드 편집 섹션 + ChainService 체인 CRUD/실행 UI
- **DashboardPage 자막 토글**: 실시간 자막 시작/종료 버튼, CaptionState LED 표시
- **SettingsModal 설정 추가**: 음성 명령어 on/off, 스크린 컨텍스트 on/off 토글 (LLM 탭)
- **i18n**: memo/voiceCommand/chain/context/dashboard.caption 번역 키 추가 (ko/en)
### Phase 9 구현 내용
- **Settings About 탭**: 앱/Electron 버전, 기술 스택, 프로젝트 링크, 정밀기기 디자인
@ -213,6 +253,9 @@ Phase: 9 완료 + 폴리싱 완료 (Phase 1~9 전부 완료)
- Phase 8: UI 디자인 재설계 + SSOT + DS 컴포넌트 정비
- Phase 9: 품질 보강 + UX 개선 (온보딩, 마이크 테스트, WAV 저장, 커맨드 팝업, Ollama 안내)
- Phase 10: 킬러 피처 — Speakly를 넘어서 (실시간 자막, 스크린 컨텍스트, 음성 메모장, 멀티 LLM 체인, 음성 단축키)
- Phase 11: 수익화 기반 — LicenseService + Feature Gating + Freemium UI
- Phase 12: Pro 피처 — 파일 전사, 회의록 자동 요약, 딕테이션 템플릿
- Phase 13: Pro+ 프리미엄 — 음성 대화 모드, 로컬 RAG, OS 자동화
## 설계 문서 (구현 시 반드시 참조)
@docs/design/00-master-architecture.md
@ -233,6 +276,8 @@ Phase: 9 완료 + 폴리싱 완료 (Phase 1~9 전부 완료)
@docs/phases/phase-8.md
@docs/phases/phase-9.md
@docs/phases/phase-10-killer-features.md
@docs/phases/phase-11-monetization.md
@docs/phases/phase-12-pro-features.md
## RE 노하우 (패턴 적용 근거)
@docs/re-findings/speakly-architecture.md