소스 정보
- 저장소
- BangDori/prowl
- 최근 소스 활동
- 2026년 3월 2일 14:18
- 감지된 SKILL.md 언어
- 한국어
- 스타
- 10
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
SKILL.md 표시 중
SKILL.md
소스 지침 · 읽기 전용 미리보기- name
- ipc-development
- description
- IPC 채널 추가/수정 시 안전 규칙과 절차
- user-invocable
- false
# IPC Development Guide
## Single Source of Truth
모든 IPC 채널은 `src/shared/ipc-schema.ts`에 정의. 이 스키마에서 타입이 자동 추론되므로 별도 타입 정의 불필요.
## 채널 추가 절차
새 IPC 채널 추가 시 **3곳 수정**:
1. `src/shared/ipc-schema.ts` — 채널 + params + return 타입 정의
2. `src/main/ipc.ts` — `handleIpc()` 핸들러 추가
3. `src/preload/index.ts` — `invokeIpc()` 메서드 추가
→ Renderer 타입은 자동 반영
## 반환 타입 규칙
| 채널 유형 | 반환 타입 | 예시 |
|-----------|----------|------|
| 데이터 조회 | 구체적 타입 | `LaunchdJob[]`, `AppSettings` |
| 데이터 변경 (mutation) | `IpcResult` | `{ success: true }` |
| Fire-and-forget | `void` | quit, resize, navigate |
## 에러 처리
`handleIpc` 래퍼가 try/catch 자동 적용:
- 성공 → 핸들러 결과 반환
- 실패 → 에러 로깅 + mutation은 `{ success: false, error: message }` 반환
## 직렬화
- **Date 객체는 IPC를 통과하지 않음** — ISO 8601 문자열(`string`) 사용
- 서비스에서 `.toISOString()` 호출 후 전달
- Renderer에서 `new Date(isoString)` 으로 파싱
## 채널 네이밍
형식: `{domain}:{action}` (액션은 kebab-case)
```
jobs:list # 조회
jobs:toggle # 액션
settings:get # 단일 조회
calendar:add-local-event # 복합 액션
```
## Renderer에서 사용
**컴포넌트에서 `window.electronAPI` 직접 호출 금지.** 반드시 hooks를 통해 접근:
```typescript
// Bad
const jobs = await window.electronAPI.listJobs();
// Good
const { jobs } = useLaunchdJobs();
```
## plist 파싱
외부 데이터(plist)는 Zod `safeParse`로 런타임 검증:
```typescript
// Bad
const data = plist.parse(content) as PlistData;
// Good
const result = PlistDataSchema.safeParse(plist.parse(content));
if (!result.success) { /* handle error */ }
```
GitHub에서 보기