- CLAUDE.md: 프로젝트 규칙, 기술 스택, 코딩 규칙, 페이즈 로드맵 - .claude/settings.json: 권한, 강제 훅 (매 프롬프트 설계서 규칙 주입) - .claude/skills/: implement-phase, review-phase, scaffold, test-commit, debug - .claude/agents/: electron-architect, voice-pipeline-expert, ui-specialist - docs/design/00-09: 마스터 아키텍처, 서비스 명세(16개), IPC(113채널), DB스키마, UI컴포넌트, 검증리포트, 외부엔진연동, 갭분석, VoiceMode패턴, 디자인시스템, 히스토리팝업 - docs/phases/1-7+3.5: 전체 구현 페이즈 문서 - docs/re-findings/: Speakly RE 노하우 5개 문서
7.3 KiB
7.3 KiB
Phase 6: 커스텀 명령어 + 설정 UI 고도화
목표
사용자 정의 LLM 명령어 시스템을 완전 구현하고, 설정 UI를 고도화하여 STT/LLM/TTS 모델 선택, 온보딩, 다국어(i18n)를 지원한다.
태스크
6.1 CustomInstructionService 완전 구현
src/main/services/CustomInstructionService.ts- electron-store에 명령어 목록 저장 (DB 아닌 설정 파일)
- CustomInstruction 타입:
interface CustomInstruction { id: string; // nanoid name: string; // 표시 이름 (예: "번역 (한→영)") description: string; // 설명 prompt: string; // 시스템 프롬프트 템플릿 icon: string; // MUI 아이콘 이름 또는 이모지 isBuiltin: boolean; // 프리셋 여부 (삭제 불가) hotkeyId: string | null; // 바인딩된 핫키 ID (null이면 미설정) order: number; // 표시 순서 createdAt: number; updatedAt: number; } - CRUD 메서드:
getAll(): CustomInstruction[]getById(id: string): CustomInstruction | nullcreate(input: CreateCustomInstructionInput): CustomInstructionupdate(id: string, data: Partial<CustomInstruction>): voiddelete(id: string): void— isBuiltin은 삭제 불가reorder(ids: string[]): void— 순서 변경resetBuiltins(): void— 프리셋을 기본값으로 초기화
6.2 프리셋 명령어 5개
- 앱 최초 실행 시 자동 생성 (isBuiltin: true)
-
번역 (
translate)다음 텍스트를 {{targetLanguage}}로 번역해주세요. 자연스럽고 정확한 번역만 출력하세요. -
요약 (
summarize)다음 텍스트의 핵심 내용을 3줄 이내로 요약해주세요. 요약문만 출력하세요. -
전문 리라이트 (
formal-rewrite)다음 텍스트를 격식 있는 비즈니스 문체로 다시 작성해주세요. 원래 의미를 유지하면서 전문적인 톤으로 변환하세요. 다시 작성된 텍스트만 출력하세요. -
코드 설명 (
explain-code)다음 코드를 한국어로 설명해주세요. 각 부분이 무엇을 하는지 간결하게 설명하세요. -
자유 프롬프트 (
free-prompt){{userPrompt}}- 사용자가 매번 프롬프트를 직접 입력하는 특수 모드
- UI에서 프롬프트 입력 필드 표시
6.3 사용자 정의 명령어 CRUD UI
src/renderer/components/CustomCommands.tsx- 명령어 목록: 이름, 설명, 프리셋 여부 표시
- 추가: 이름, 설명, 프롬프트 템플릿 입력 다이얼로그
- 프롬프트 템플릿에
{{text}}변수 자동 삽입 안내 - 프롬프트 미리보기 (예시 텍스트로 치환 결과 표시)
- 프롬프트 템플릿에
- 편집: 프리셋은 프롬프트만 수정 가능, 사용자 정의는 전체 수정 가능
- 삭제: 프리셋은 삭제 불가 (리셋만 가능), 사용자 정의는 확인 후 삭제
- 드래그 앤 드롭으로 순서 변경
- IPC 채널:
customInstruction:getAllcustomInstruction:createcustomInstruction:updatecustomInstruction:deletecustomInstruction:reorder
6.4 핫키 바인딩 (명령어별)
- 각 커스텀 명령어에 개별 핫키 설정 가능
- HotkeyService에 동적 핫키 등록/해제 연동
- 핫키 녹화 UI (Speakly HotkeyRecordModal 참조):
- 모달에서 키 조합 누르면 감지 → 표시 → 저장
- 시스템 예약 키 블랙리스트 (Ctrl+C, Ctrl+V, Alt+F4 등)
- 중복 핫키 충돌 감지 + 경고
- 명령어별 핫키 → VoiceModeService에 postProcess 자동 설정
- 핫키 감지 시: 해당 명령어의 prompt로 postProcess 설정 후 녹음 시작
6.5 설정 UI 고도화
src/renderer/components/Settings.tsx— MUI Modal 기반- 섹션별 탭 구성:
일반 탭:
- 테마 선택 (light/dark/system)
- 시작 시 최소화
- 닫기 시 트레이로 최소화
음성 입력(STT) 탭:
- STT 모델 선택 드롭다운 (base, small, medium, large-v3)
- 모델별 크기, 정확도 설명 표시
- 미다운로드 모델 표시 + 다운로드 버튼 (선택)
- 기본 언어 선택 (auto, ko, en, ja, zh 등)
- VAD 필터 토글
- 초기 프롬프트 입력
- 마이크 디바이스 선택 + 테스트 (Phase 3에서 이관)
LLM 탭:
- Ollama 서버 URL 입력 + 연결 테스트 버튼
- 기본 LLM 모델 선택 드롭다운 (Ollama에서 설치된 모델 목록 조회)
- 기본 온도, 최대 토큰 설정
- 기본 후처리 명령 선택
TTS 탭:
- TTS 활성화/비활성화 토글
- 기본 음성 선택 (설치된 음성 목록)
- 말하기 속도 슬라이더 (0.5x ~ 2.0x)
- 미리듣기 버튼
핫키 탭:
- Dictation 모드 핫키 설정
- Hands-free 모드 핫키 설정
- 커스텀 명령어별 핫키 설정 (6.4 연동)
- 핫키 녹화 모달
6.6 온보딩 플로우 (첫 실행 안내)
- 앱 최초 실행 감지: ConfigService에
onboarding.completed플래그 - 4단계 온보딩 위저드:
- 환영: 앱 소개, 주요 기능 설명
- 마이크 설정: 디바이스 선택 + 테스트 녹음
- 핫키 설정: 기본 핫키 안내 + 커스텀 설정
- Ollama 설정: Ollama 설치 안내 + 연결 테스트, 모델 선택
- 건너뛰기 가능, 설정에서 다시 실행 가능
- Speakly FlowOnboarding 참조: 단계별 UI, 진행 표시기
6.7 i18n (한국어/영어)
src/shared/i18n/디렉토리- 리소스 파일 구조:
i18n/ ├── ko.json # 한국어 (기본) └── en.json # 영어 - 간단한 i18n 유틸리티 (라이브러리 없이 직접 구현):
type I18nKey = string; function t(key: I18nKey, params?: Record<string, string>): string; function setLocale(locale: 'ko' | 'en'): void; function getLocale(): string; - React 컨텍스트:
I18nProvider+useI18n()훅 - ConfigService
ui.language연동 - 번역 대상: UI 라벨, 에러 메시지, 프리셋 명령어 이름/설명, 온보딩 텍스트
- Speakly I18nService 참조: 키-값 리소스 파일, 런타임 언어 전환
6.8 IPC 채널 추가
customInstruction:getAll,customInstruction:create,customInstruction:update,customInstruction:delete,customInstruction:reorderconfig:getSection,config:setSection,config:resetSectioni18n:getLocale,i18n:setLocale,i18n:getTranslationsonboarding:getStatus,onboarding:complete
Speakly RE 참조
- CustomInstructionConfigService: 명령어 CRUD, 프리셋 관리, electron-store 저장
- HotkeyConfig: 키코드 맵, 시스템 예약 단축키 블랙리스트, HotkeyRecordModal
- FlowOnboarding: 단계별 온보딩 UI, 진행 표시, 건너뛰기
- I18nService: 키-값 리소스 파일, 런타임 언어 전환, React 컨텍스트 연동
- Settings: 섹션별 탭 UI, 디바이스 선택, 모델 선택
완료 조건
- 프리셋 명령어 5개 기본 제공
- 사용자 정의 명령어 추가/편집/삭제/순서변경 가능
- 명령어별 핫키 바인딩 및 핫키로 녹음+명령어 실행 가능
- 설정에서 STT 모델, LLM 모델, TTS 음성 선택 가능
- Ollama 연결 테스트 작동
- 온보딩 위저드가 첫 실행 시 표시됨
- 한국어/영어 UI 전환 가능
- 모든 UI 텍스트가 i18n 리소스에서 로드됨