electron-ipc-patterns
Clauday 에 IPC 채널을 추가하거나 수정할 때 따라야 하는 3+1 규칙 패턴. 새 IPC 작업 진입 시 항상 트리거.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Clauday 에 IPC 채널을 추가하거나 수정할 때 따라야 하는 3+1 규칙 패턴. 새 IPC 작업 진입 시 항상 트리거.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Use when: developer 페이즈 진입 시, BE/FE 코드 변경을 실행해야 할 때.
Use when: QA 페이즈에서 수락기준 검증이 필요할 때.
Use when: 코드 리뷰가 필요할 때.
Use when: developer 페이즈에서 코드 변경이 필요할 때.
AIService.runClaudeStream 또는 ClaudeChatService 의 claude CLI spawn 코드를 수정할 때 Windows/Mac 분기 함정을 피하기 위한 안전 체크리스트. ai-service 또는 claude-chat 도메인 작업 시 반드시 트리거.
feature/<도메인>/<task-id>/ 산출물 (prd, adr, plan, impl-log, qa-report) 의 YAML frontmatter / 필수 섹션 / 불변성 검증. integrator 가 게이트 진입 시 호출.
| name | electron-ipc-patterns |
| description | Clauday 에 IPC 채널을 추가하거나 수정할 때 따라야 하는 3+1 규칙 패턴. 새 IPC 작업 진입 시 항상 트리거. |
Clauday 의 IPC 는 한 곳에서 누락되면 전체가 깨진다. 본 스킬은 그 누락을 막는 체크리스트.
src/shared/types/ipc.ts — IPC_CHANNELS 단일 카탈로그src/preload/index.ts — contextBridge exposesrc/main/index.ts — ipcMain.handle 등록.agent/wiki/domain-electron-ipc.md — 상세 도메인// src/shared/types/<domain>.ts (없으면 신규)
export interface FooListResult {
items: FooItem[]
}
// src/shared/types/ipc.ts
export const IPC_CHANNELS = {
// ... 기존 ...
FOO_LIST: 'foo:list', // ← 추가
} as const
// src/preload/index.ts
import { IPC_CHANNELS } from '../shared/types/ipc'
contextBridge.exposeInMainWorld('api', {
// ... 기존 ...
foo: {
list: (): Promise<FooListResult> => ipcRenderer.invoke(IPC_CHANNELS.FOO_LIST),
},
})
window.api 의 타입은 src/renderer/src/types/window.d.ts (있으면) 에 동기.
// src/main/index.ts
import { fooService } from './foo/FooService'
// ... 부팅 시 ...
ipcMain.handle(IPC_CHANNELS.FOO_LIST, async () => {
return fooService.list() // 얇은 어댑터만, 로직은 service 안
})
// src/main/foo/FooService.test.ts
import { describe, it, expect } from 'vitest'
import { FooService } from './FooService'
describe('FooService.list', () => {
it('빈 상태에서 빈 배열 반환', () => {
expect(new FooService().list()).toEqual({ items: [] })
})
})
// main
mainWindow.webContents.send(IPC_CHANNELS.FOO_EVENT, payload)
// preload
contextBridge.exposeInMainWorld('api', {
foo: {
onEvent: (cb: (payload: FooEvent) => void): (() => void) => {
const listener = (_: unknown, p: FooEvent): void => cb(p)
ipcRenderer.on(IPC_CHANNELS.FOO_EVENT, listener)
return () => ipcRenderer.removeListener(IPC_CHANNELS.FOO_EVENT, listener)
},
},
})
반드시 unsubscribe 함수 반환. 컴포넌트 unmount 시 누수 방지.
undefined 직렬화 안 됨: 옵셔널 필드는 null 명시 또는 필드 자체 생략.string 으로.await 가 reject. swallow 금지 — 사용자에게 정확한 에러 메시지 전달.@deprecated 주석으로 유예 없이 바로 삭제 가능 — 개인 레포 모드 (외부 API 호환성 불필요).
새 IPC 가 사용자에게 보이는 기능 의 일부면 → ClaudeManual.tsx SECTIONS 갱신 의무.