Skip to content

Commit b4db8b6

Browse files
lee-sihunclaude
andcommitted
docs: presets.onSnapshot 및 customTabs.restore API 문서 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 3e0e644 commit b4db8b6

7 files changed

Lines changed: 133 additions & 0 deletions

File tree

.claude/CLAUDE.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# 로컬 워크플로 규칙
2+
3+
## 기본 워크플로
4+
5+
모든 구현 작업은 다음 워크플로를 따릅니다.
6+
7+
### 1. 계획 수립 (필수)
8+
사용자의 구현 요청이나 설계 논의가 있으면 `/plan` 스킬을 사용하여 Codex와 함께 계획을 수립합니다.
9+
- 단순 버그 수정이나 1~2줄 변경이 아닌 이상 항상 plan을 먼저 실행
10+
- Claude 선분석 → Codex 검증 → 최종 계획 확정
11+
12+
### 2. 단계별 구현 + 코드 리뷰
13+
확정된 계획을 단계별로 나누어 구현하고, 각 단계마다 `/codex-review`로 코드 리뷰를 수행합니다.
14+
- 한 번에 모든 변경을 하지 않고, 논리적 단위로 분리
15+
- 각 단계 완료 후 Codex 리뷰 → 이슈 있으면 수정 → 리뷰 통과 확인
16+
17+
### 3. 자동 커밋
18+
각 단계의 리뷰가 통과되면 해당 변경사항을 즉시 커밋합니다.
19+
- 커밋 메시지는 변경 내용에 맞게 작성
20+
- 단계별로 커밋하여 git 히스토리를 깔끔하게 유지
21+
22+
### 워크플로 예시
23+
```
24+
사용자: "키보드 입력 시스템에 딜레이 옵션 추가해줘"
25+
26+
1. /plan 실행 → Codex와 구현 계획 수립
27+
2. 단계 1: Rust 백엔드 커맨드 추가 → /codex-review → 커밋
28+
3. 단계 2: 프론트엔드 설정 UI 추가 → /codex-review → 커밋
29+
4. 단계 3: 오버레이 반영 로직 수정 → /codex-review → 커밋
30+
```
31+
32+
### 4. 최종 보고
33+
모든 단계가 완료되면 작업 결과를 정리하여 보고합니다.
34+
- 변경된 파일 목록과 각 변경 요지
35+
- 커밋 히스토리 요약
36+
- Codex 리뷰에서 나온 주요 피드백과 반영 여부
37+
- 남은 리스크나 후속 작업이 있으면 명시
38+
39+
## 예외
40+
- 1~2줄 수정, 오타 수정, 포맷팅 등 사소한 변경은 plan/review 없이 직접 처리
41+
- 긴급 핫픽스는 plan 없이 구현 후 review만 수행

AGENTS.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ src-tauri/src/
124124
- `useMemo` / `useCallback` 의존성 배열에서 배열/객체는 개별 요소 비교 고려
125125
- 린트 자동 수정이 의도적 패턴을 덮어쓸 수 있으므로 필요시 `eslint-disable` 주석 사용
126126

127+
## API 문서 동기화
128+
129+
- 프론트엔드 플러그인 API(`dmn.*`) 또는 Tauri 커맨드에 변경이 있으면 `docs/content/` 하위 관련 MDX 문서를 업데이트
130+
- 문서는 `en/`, `ko/` 두 언어로 관리되므로 양쪽 모두 반영
131+
127132
## 작업 마무리 체크리스트
128133

129134
### 프론트엔드 (TypeScript/React) 변경 시

CLAUDE.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ src-tauri/src/
124124
- `useMemo` / `useCallback` 의존성 배열에서 배열/객체는 개별 요소 비교 고려
125125
- 린트 자동 수정이 의도적 패턴을 덮어쓸 수 있으므로 필요시 `eslint-disable` 주석 사용
126126

127+
## API 문서 동기화
128+
129+
- 프론트엔드 플러그인 API(`dmn.*`) 또는 Tauri 커맨드에 변경이 있으면 `docs/content/` 하위 관련 MDX 문서를 업데이트
130+
- 문서는 `en/`, `ko/` 두 언어로 관리되므로 양쪽 모두 반영
131+
127132
## 작업 마무리 체크리스트
128133

129134
### 프론트엔드 (TypeScript/React) 변경 시

docs/content/en/api-reference/keys/page.mdx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,17 @@ const unsub = dmn.keys.registerCustomTab({
145145
});
146146
```
147147

148+
### `dmn.keys.customTabs.restore(customTabs, selectedKeyType): Promise<void>`
149+
150+
Restores custom tabs and selected mode atomically. Syncs backend state, overlay, and main window.
151+
152+
```javascript
153+
await dmn.keys.customTabs.restore(
154+
[{ id: "custom-123", name: "My Keys", keys: ["KeyA", "KeyS"] }],
155+
"custom-123",
156+
);
157+
```
158+
148159
---
149160

150161
## Stats API

docs/content/en/api-reference/presets/page.mdx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,36 @@ const unsub = dmn.presets.onChanged((presets) => {
7676

7777
---
7878

79+
## Snapshot Event
80+
81+
### `dmn.presets.onSnapshot(callback): Unsubscribe`
82+
83+
Subscribes to preset load completions. Receives the full snapshot of applied data (key mappings, positions, tabs, mode, etc.) in a single event.
84+
85+
```typescript
86+
interface PresetSnapshot {
87+
keys: KeyMappings;
88+
positions: KeyPositions;
89+
statPositions: StatItemPositions;
90+
graphPositions: GraphItemPositions;
91+
customTabs: CustomTab[];
92+
selectedKeyType: string;
93+
tabNoteOverrides: TabNoteOverrides;
94+
}
95+
96+
const unsub = dmn.presets.onSnapshot((snapshot) => {
97+
console.log("Preset loaded:", snapshot.selectedKeyType);
98+
console.log("Key mappings:", snapshot.keys);
99+
});
100+
```
101+
102+
<Callout type="info">
103+
Individual change events (`onChanged`, `onPositionsChanged`, etc.) are not emitted during preset load.
104+
Use `onSnapshot` to detect preset loads.
105+
</Callout>
106+
107+
---
108+
79109
## Example Usage
80110

81111
```javascript

docs/content/ko/api-reference/keys/page.mdx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,17 @@ const result = await dmn.keys.customTabs.delete("custom-123");
272272
await dmn.keys.customTabs.select("custom-123");
273273
```
274274

275+
### restore(customTabs, selectedKeyType)
276+
277+
커스텀 탭 목록과 선택된 모드를 일괄 복원합니다. 백엔드 상태, 오버레이, 메인 윈도우가 모두 동기화됩니다.
278+
279+
```javascript
280+
await dmn.keys.customTabs.restore(
281+
[{ id: "custom-123", name: "My Keys", keys: ["KeyA", "KeyS"] }],
282+
"custom-123",
283+
);
284+
```
285+
275286
### onChanged(listener)
276287

277288
커스텀 탭 변경 이벤트를 구독합니다.

docs/content/ko/api-reference/presets/page.mdx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,36 @@ dmn.plugin.registerCleanup(() => {
8080
});
8181
```
8282

83+
## 이벤트 구독
84+
85+
### onSnapshot(listener)
86+
87+
프리셋 로드 완료 시 적용된 스냅샷 데이터를 수신합니다. 키 매핑, 위치, 탭, 모드 등이 한 번에 전달됩니다.
88+
89+
```typescript
90+
interface PresetSnapshot {
91+
keys: KeyMappings;
92+
positions: KeyPositions;
93+
statPositions: StatItemPositions;
94+
graphPositions: GraphItemPositions;
95+
customTabs: CustomTab[];
96+
selectedKeyType: string;
97+
tabNoteOverrides: TabNoteOverrides;
98+
}
99+
```
100+
101+
```javascript
102+
const unsub = dmn.presets.onSnapshot((snapshot) => {
103+
console.log("프리셋 로드됨:", snapshot.selectedKeyType);
104+
console.log("키 매핑:", snapshot.keys);
105+
});
106+
```
107+
108+
<Callout type="info">
109+
프리셋 로드 시 개별 이벤트(`onChanged`, `onPositionsChanged` 등)는 발행되지 않습니다.
110+
프리셋 로드를 감지하려면 `onSnapshot`을 사용하세요.
111+
</Callout>
112+
83113
## 프리셋에 포함되는 항목
84114

85115
프리셋은 “전체 설정 덤프”가 아니라, 아래 항목들을 파일로 저장/복원합니다.

0 commit comments

Comments
 (0)