--- name: scaffold-component description: D3RO-VOICE 프로젝트 컨벤션에 맞게 새 컴포넌트/서비스를 스캐폴딩. 이름을 인자로 전달. argument-hint: "[component or service name]" allowed-tools: Read Write Glob Grep Edit --- # Scaffold 프로젝트 컨벤션에 맞는 새 모듈을 생성합니다. 모듈명: $ARGUMENTS ## 0. 중복 방지 가드 (스킵 불가) 생성 전 반드시 확인: 1. **서비스**: `src/main/services/` 내 동일 이름 파일 Glob 검색. 존재 시 유저에게 확인 2. **컴포넌트**: `src/renderer/components/` 내 동일 이름 Glob 검색. 존재 시 유저에게 확인 3. **IPC 채널**: `shared/ipc-channels.ts`에서 해당 feature 네임스페이스 Grep 검색. 충돌 시 경고 4. **i18n 키**: `src/renderer/locales/ko.json`에서 해당 키 접두사 검색. 충돌 시 경고 ## 서비스 스캐폴딩 (메인 프로세스) Speakly 패턴: - 싱글톤 + EventEmitter - 로거 태그 `[ServiceName]` (electron-log, console.log 금지) - 초기화/종료 메서드 (`initialize()` / `dispose()`) - IPC 채널 `shared/ipc-channels.ts`에 추가 - 에러: D3ROError + ErrorCode enum 생성 파일: - `src/main/services/$ARGUMENTS.ts` — 서비스 본체 - `shared/ipc-channels.ts` — 채널 추가 (Edit) - `src/main/ipc/` — 핸들러 등록 (Edit) ## React 컴포넌트 스캐폴딩 (렌더러) - 함수형 컴포넌트 + TypeScript Props 인터페이스 - 스타일: d3roPalette/d3roTypo/d3roShadow 토큰만 (hex 리터럴 금지) - DS 컴포넌트(MetalCard, PhosphorText, Led, PhysicalButton 등) 적극 활용 - i18n: t() 함수 사용, 하드코딩 문자열 금지 - IPC: window.electronAPI.* 호출 생성 파일: - `src/renderer/components/$ARGUMENTS.tsx` — 컴포넌트 본체 - `src/renderer/locales/ko.json` — i18n 키 추가 (Edit) - `src/renderer/locales/en.json` — i18n 키 추가 (Edit) ## Vanilla JS 팝업 스캐폴딩 Speakly 패턴: - 별도 HTML 엔트리포인트, React 미사용 - 순수 DOM 조작 - 2-phase 리사이즈: prepare(측정) → resize → show - d3roPalette 토큰의 CSS var 사용