@kood/claude-code 0.6.6 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/dist/index.js +7 -1
  2. package/package.json +1 -1
  3. package/templates/.claude/agents/analyst.md +5 -0
  4. package/templates/.claude/agents/architect.md +5 -0
  5. package/templates/.claude/agents/build-fixer.md +1 -0
  6. package/templates/.claude/agents/code-reviewer.md +1 -0
  7. package/templates/.claude/agents/critic.md +4 -0
  8. package/templates/.claude/agents/deep-executor.md +1 -0
  9. package/templates/.claude/agents/dependency-manager.md +2 -0
  10. package/templates/.claude/agents/deployment-validator.md +2 -0
  11. package/templates/.claude/agents/designer.md +2 -0
  12. package/templates/.claude/agents/document-writer.md +3 -0
  13. package/templates/.claude/agents/explore.md +1 -0
  14. package/templates/.claude/agents/git-operator.md +2 -0
  15. package/templates/.claude/agents/implementation-executor.md +2 -0
  16. package/templates/.claude/agents/ko-to-en-translator.md +3 -0
  17. package/templates/.claude/agents/lint-fixer.md +2 -0
  18. package/templates/.claude/agents/planner.md +3 -0
  19. package/templates/.claude/agents/pm.md +349 -0
  20. package/templates/.claude/agents/qa-tester.md +1 -0
  21. package/templates/.claude/agents/refactor-advisor.md +4 -0
  22. package/templates/.claude/agents/researcher.md +9 -1
  23. package/templates/.claude/agents/scientist.md +1 -0
  24. package/templates/.claude/agents/security-reviewer.md +1 -0
  25. package/templates/.claude/agents/tdd-guide.md +1 -0
  26. package/templates/.claude/agents/vision.md +1 -0
  27. package/templates/.claude/instructions/agent-patterns/agent-teams-usage.md +376 -0
  28. package/templates/.claude/instructions/sourcing/reliable-search.md +49 -2
  29. package/templates/.claude/scripts/agent-teams/check-availability.sh +238 -0
  30. package/templates/.claude/scripts/agent-teams/setup-tmux.sh +125 -0
  31. package/templates/.claude/skills/agent-teams-setup/SKILL.md +460 -0
  32. package/templates/.claude/skills/brainstorm/SKILL.md +1 -0
  33. package/templates/.claude/skills/bug-fix/SKILL.md +1 -0
  34. package/templates/.claude/skills/crawler/SKILL.md +2 -0
  35. package/templates/.claude/skills/docs-creator/SKILL.md +1 -0
  36. package/templates/.claude/skills/docs-fetch/SKILL.md +6 -4
  37. package/templates/.claude/skills/docs-refactor/SKILL.md +1 -0
  38. package/templates/.claude/skills/elon-musk/SKILL.md +1 -0
  39. package/templates/.claude/skills/execute/SKILL.md +1 -0
  40. package/templates/.claude/skills/feedback/SKILL.md +1 -0
  41. package/templates/.claude/skills/figma-to-code/SKILL.md +1 -0
  42. package/templates/.claude/skills/genius-thinking/SKILL.md +1 -0
  43. package/templates/.claude/skills/global-uiux-design/SKILL.md +1 -0
  44. package/templates/.claude/skills/korea-uiux-design/SKILL.md +1 -0
  45. package/templates/.claude/skills/nextjs-react-best-practices/SKILL.md +1 -0
  46. package/templates/.claude/skills/plan/SKILL.md +1 -0
  47. package/templates/.claude/skills/prd/SKILL.md +1 -0
  48. package/templates/.claude/skills/project-optimizer/AGENTS.md +275 -0
  49. package/templates/.claude/skills/project-optimizer/SKILL.md +375 -0
  50. package/templates/.claude/skills/project-optimizer/rules/arch-config-centralize.md +66 -0
  51. package/templates/.claude/skills/project-optimizer/rules/arch-hot-path.md +35 -0
  52. package/templates/.claude/skills/project-optimizer/rules/arch-interface-segregation.md +51 -0
  53. package/templates/.claude/skills/project-optimizer/rules/arch-module-boundary.md +42 -0
  54. package/templates/.claude/skills/project-optimizer/rules/build-cache.md +57 -0
  55. package/templates/.claude/skills/project-optimizer/rules/build-code-split.md +56 -0
  56. package/templates/.claude/skills/project-optimizer/rules/build-incremental.md +65 -0
  57. package/templates/.claude/skills/project-optimizer/rules/build-minify.md +61 -0
  58. package/templates/.claude/skills/project-optimizer/rules/build-tree-shake.md +60 -0
  59. package/templates/.claude/skills/project-optimizer/rules/code-complexity.md +65 -0
  60. package/templates/.claude/skills/project-optimizer/rules/code-dead-elimination.md +32 -0
  61. package/templates/.claude/skills/project-optimizer/rules/code-duplication.md +54 -0
  62. package/templates/.claude/skills/project-optimizer/rules/code-error-handling.md +75 -0
  63. package/templates/.claude/skills/project-optimizer/rules/code-naming.md +52 -0
  64. package/templates/.claude/skills/project-optimizer/rules/concurrency-defer-await.md +54 -0
  65. package/templates/.claude/skills/project-optimizer/rules/concurrency-parallel.md +90 -0
  66. package/templates/.claude/skills/project-optimizer/rules/concurrency-pipeline.md +68 -0
  67. package/templates/.claude/skills/project-optimizer/rules/concurrency-pool.md +68 -0
  68. package/templates/.claude/skills/project-optimizer/rules/deps-lightweight-alt.md +37 -0
  69. package/templates/.claude/skills/project-optimizer/rules/deps-peer-align.md +44 -0
  70. package/templates/.claude/skills/project-optimizer/rules/deps-security-audit.md +45 -0
  71. package/templates/.claude/skills/project-optimizer/rules/deps-unused-removal.md +25 -0
  72. package/templates/.claude/skills/project-optimizer/rules/deps-version-pin.md +40 -0
  73. package/templates/.claude/skills/project-optimizer/rules/dx-ci-speed.md +47 -0
  74. package/templates/.claude/skills/project-optimizer/rules/dx-dev-server.md +35 -0
  75. package/templates/.claude/skills/project-optimizer/rules/dx-lint-config.md +36 -0
  76. package/templates/.claude/skills/project-optimizer/rules/dx-test-coverage.md +34 -0
  77. package/templates/.claude/skills/project-optimizer/rules/dx-type-safety.md +49 -0
  78. package/templates/.claude/skills/project-optimizer/rules/io-batch-queries.md +67 -0
  79. package/templates/.claude/skills/project-optimizer/rules/io-cache-layer.md +67 -0
  80. package/templates/.claude/skills/project-optimizer/rules/io-connection-reuse.md +67 -0
  81. package/templates/.claude/skills/project-optimizer/rules/io-serialize-minimal.md +61 -0
  82. package/templates/.claude/skills/project-optimizer/rules/io-stream.md +75 -0
  83. package/templates/.claude/skills/project-optimizer/rules/memory-bounded-cache.md +65 -0
  84. package/templates/.claude/skills/project-optimizer/rules/memory-large-data.md +64 -0
  85. package/templates/.claude/skills/project-optimizer/rules/memory-lazy-init.md +78 -0
  86. package/templates/.claude/skills/project-optimizer/rules/memory-leak-prevention.md +79 -0
  87. package/templates/.claude/skills/project-optimizer/rules/memory-pool-reuse.md +70 -0
  88. package/templates/.claude/skills/ralph/SKILL.md +1 -0
  89. package/templates/.claude/skills/refactor/SKILL.md +1 -0
  90. package/templates/.claude/skills/research/SKILL.md +1 -0
  91. package/templates/.claude/skills/sql-optimizer/SKILL.md +438 -0
  92. package/templates/.claude/skills/sql-optimizer/orm-patterns.md +218 -0
  93. package/templates/.claude/skills/startup-validator/SKILL.md +1 -0
  94. package/templates/.claude/skills/tanstack-start-react-best-practices/AGENTS.md +53 -14
  95. package/templates/.claude/skills/tanstack-start-react-best-practices/SKILL.md +94 -27
  96. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-defer-third-party.md +42 -19
  97. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-optimistic-updates.md +109 -0
  98. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-suspense-query.md +74 -0
  99. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-use-hook.md +81 -0
  100. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-react-compiler.md +81 -0
  101. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-beforeload-auth.md +121 -0
  102. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-file-conventions.md +104 -0
  103. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-link-navigation.md +119 -0
  104. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-nested-layouts.md +155 -0
  105. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-path-params.md +89 -0
  106. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-pending-component.md +110 -0
  107. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-preload-strategy.md +91 -0
  108. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-router-context.md +120 -0
  109. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-search-params.md +114 -0
  110. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-deferred-data.md +1 -1
  111. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-error-boundaries.md +79 -0
  112. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-middleware.md +85 -0
  113. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-serialization.md +56 -21
  114. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-streaming.md +84 -0
  115. package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-validator.md +71 -0
  116. package/templates/.claude/skills/tauri-react-best-practices/AGENTS.md +527 -0
  117. package/templates/.claude/skills/tauri-react-best-practices/SKILL.md +571 -0
  118. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-barrel-imports.md +140 -0
  119. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-cargo-profile.md +96 -0
  120. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-frontend-treeshake.md +242 -0
  121. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-lazy-components.md +255 -0
  122. package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-remove-unused-commands.md +160 -0
  123. package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-ci-pipeline.md +269 -0
  124. package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-signing.md +207 -0
  125. package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-updater.md +226 -0
  126. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-async-commands.md +172 -0
  127. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-batch-commands.md +133 -0
  128. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-binary-response.md +198 -0
  129. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-channel-streaming.md +186 -0
  130. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-error-handling.md +250 -0
  131. package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-type-safe.md +227 -0
  132. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-derived-state.md +231 -0
  133. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-functional-setstate.md +191 -0
  134. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-index-maps.md +276 -0
  135. package/templates/.claude/skills/tauri-react-best-practices/rules/perf-lazy-state-init.md +196 -0
  136. package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-lifecycle.md +265 -0
  137. package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-mobile-compat.md +199 -0
  138. package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-permission-scope.md +193 -0
  139. package/templates/.claude/skills/tauri-react-best-practices/rules/react-error-boundary.md +239 -0
  140. package/templates/.claude/skills/tauri-react-best-practices/rules/react-event-listener.md +151 -0
  141. package/templates/.claude/skills/tauri-react-best-practices/rules/react-file-src.md +155 -0
  142. package/templates/.claude/skills/tauri-react-best-practices/rules/react-invoke-hook.md +139 -0
  143. package/templates/.claude/skills/tauri-react-best-practices/rules/react-optimistic-update.md +211 -0
  144. package/templates/.claude/skills/tauri-react-best-practices/rules/security-capability-split.md +205 -0
  145. package/templates/.claude/skills/tauri-react-best-practices/rules/security-csp.md +207 -0
  146. package/templates/.claude/skills/tauri-react-best-practices/rules/security-least-privilege.md +106 -0
  147. package/templates/.claude/skills/tauri-react-best-practices/rules/security-no-wildcard.md +253 -0
  148. package/templates/.claude/skills/tauri-react-best-practices/rules/security-scope-paths.md +160 -0
  149. package/templates/.claude/skills/tauri-react-best-practices/rules/state-async-mutex.md +270 -0
  150. package/templates/.claude/skills/tauri-react-best-practices/rules/state-mutex-pattern.md +265 -0
  151. package/templates/.claude/skills/tauri-react-best-practices/rules/state-react-sync.md +375 -0
  152. package/templates/.claude/skills/tauri-react-best-practices/rules/state-single-container.md +275 -0
  153. package/templates/tanstack-start/docs/architecture.md +238 -167
  154. package/templates/tanstack-start/docs/library/tanstack-router/error-handling.md +777 -38
  155. package/templates/tanstack-start/docs/library/tanstack-router/hooks.md +549 -37
  156. package/templates/tanstack-start/docs/library/tanstack-router/index.md +895 -111
  157. package/templates/tanstack-start/docs/library/tanstack-router/navigation.md +641 -43
  158. package/templates/tanstack-start/docs/library/tanstack-router/route-context.md +889 -38
  159. package/templates/tanstack-start/docs/library/tanstack-router/search-params.md +891 -29
  160. package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +972 -36
  161. package/templates/tanstack-start/docs/library/tanstack-start/index.md +1525 -881
  162. package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +1099 -20
  163. package/templates/tanstack-start/docs/library/tanstack-start/routing.md +796 -30
  164. package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +953 -35
  165. package/templates/tanstack-start/docs/library/tanstack-start/setup.md +371 -15
  166. package/templates/tauri/CLAUDE.md +189 -0
  167. package/templates/tauri/docs/guides/distribution.md +261 -0
  168. package/templates/tauri/docs/guides/getting-started.md +302 -0
  169. package/templates/tauri/docs/guides/mobile.md +288 -0
  170. package/templates/tauri/docs/library/tauri/index.md +510 -0
@@ -0,0 +1,527 @@
1
+ # Tauri v2 React 베스트 프랙티스
2
+
3
+ **Version 1.0.0**
4
+ Tauri v2 + React 19 데스크톱/모바일 앱 최적화 가이드
5
+ February 2026
6
+
7
+ > **참고:**
8
+ > 이 문서는 주로 에이전트와 LLM이 Tauri v2 + React 코드베이스를 유지보수, 생성, 리팩토링할 때 따르기 위한 것입니다.
9
+
10
+ ---
11
+
12
+ ## 요약
13
+
14
+ AI 에이전트를 위한 Tauri v2 (@tauri-apps/api v2.10+) + React 19 애플리케이션 종합 최적화 가이드. 8개 카테고리에 걸쳐 40+ 규칙 포함. IPC 최적화(Commands/Events/Channels), 보안(Capabilities/Permissions/Scopes), 번들 크기 최소화(Cargo 프로필, 미사용 커맨드 제거), Rust 상태 관리(Mutex 패턴), React 통합(invoke hook, 이벤트 리스너), 플러그인 패턴, 배포/업데이트 등 Tauri 특화 패턴 반영.
15
+
16
+ ---
17
+
18
+ <instructions>
19
+
20
+ ## 문서 사용 지침
21
+
22
+ @rules/ipc-batch-commands.md
23
+ @rules/ipc-channel-streaming.md
24
+ @rules/ipc-async-commands.md
25
+ @rules/ipc-binary-response.md
26
+ @rules/ipc-type-safe.md
27
+ @rules/ipc-error-handling.md
28
+ @rules/security-least-privilege.md
29
+ @rules/security-scope-paths.md
30
+ @rules/security-capability-split.md
31
+ @rules/security-csp.md
32
+ @rules/security-no-wildcard.md
33
+ @rules/bundle-cargo-profile.md
34
+ @rules/bundle-remove-unused-commands.md
35
+ @rules/bundle-barrel-imports.md
36
+ @rules/bundle-lazy-components.md
37
+ @rules/bundle-frontend-treeshake.md
38
+ @rules/state-mutex-pattern.md
39
+ @rules/state-single-container.md
40
+ @rules/state-async-mutex.md
41
+ @rules/state-react-sync.md
42
+ @rules/react-invoke-hook.md
43
+ @rules/react-event-listener.md
44
+ @rules/react-file-src.md
45
+ @rules/react-error-boundary.md
46
+ @rules/react-optimistic-update.md
47
+ @rules/plugin-permission-scope.md
48
+ @rules/plugin-lifecycle.md
49
+ @rules/plugin-mobile-compat.md
50
+ @rules/deploy-signing.md
51
+ @rules/deploy-updater.md
52
+ @rules/deploy-ci-pipeline.md
53
+ @rules/perf-functional-setstate.md
54
+ @rules/perf-lazy-state-init.md
55
+ @rules/perf-derived-state.md
56
+ @rules/perf-index-maps.md
57
+
58
+ </instructions>
59
+
60
+ ---
61
+
62
+ <categories>
63
+
64
+ ## 카테고리별 우선순위
65
+
66
+ | 우선순위 | 카테고리 | 영향도 | 설명 |
67
+ |---------|---------|--------|------|
68
+ | 1 | IPC 최적화 | **CRITICAL** | Commands 배치, Channel 스트리밍, 바이너리 응답으로 IPC 병목 제거 |
69
+ | 2 | 보안 설정 | **CRITICAL** | 최소 권한, Scope 제한, Capability 분리로 공격 표면 최소화 |
70
+ | 3 | 번들 크기 최적화 | **HIGH** | Cargo 프로필, 미사용 커맨드 제거, 프론트엔드 tree-shaking |
71
+ | 4 | Tauri 상태 관리 | HIGH | Mutex 패턴, 타입 별칭, React 상태 동기화 |
72
+ | 5 | React 통합 패턴 | MEDIUM-HIGH | invoke hook, 이벤트 리스너 정리, convertFileSrc |
73
+ | 6 | 플러그인 패턴 | MEDIUM | 플러그인 권한 설정, 라이프사이클, 모바일 호환 |
74
+ | 7 | 배포 최적화 | MEDIUM | 코드 서명, 자동 업데이트, CI/CD 파이프라인 |
75
+ | 8 | Re-render/JS 성능 | LOW-MEDIUM | 함수형 setState, 파생 상태, Map 조회 |
76
+
77
+ </categories>
78
+
79
+ ---
80
+
81
+ <critical_patterns>
82
+
83
+ ## 1. IPC 최적화 (CRITICAL)
84
+
85
+ IPC는 Tauri 앱의 가장 큰 성능 병목입니다. 모든 프론트엔드-백엔드 통신이 JSON 직렬화를 거칩니다.
86
+
87
+ ### 배치 커맨드
88
+
89
+ ```rust
90
+ // ❌ N번 IPC 호출 (느림)
91
+ // JS: for (item of items) await invoke('process', { item })
92
+
93
+ // ✅ 1번 IPC 호출 (빠름)
94
+ #[tauri::command]
95
+ fn process_batch(items: Vec<String>) -> Result<Vec<String>, String> {
96
+ items.iter().map(|item| process_item(item)).collect()
97
+ }
98
+ ```
99
+
100
+ ### Channel 스트리밍 (Events 대신)
101
+
102
+ ```rust
103
+ use tauri::ipc::Channel;
104
+
105
+ // ❌ Events (높은 지연, 낮은 처리량)
106
+ #[tauri::command]
107
+ async fn download(app: AppHandle, url: String) {
108
+ for chunk in download_stream(&url) {
109
+ app.emit("progress", chunk).unwrap();
110
+ }
111
+ }
112
+
113
+ // ✅ Channel (낮은 지연, 높은 처리량)
114
+ #[tauri::command]
115
+ async fn download(url: String, on_progress: Channel<u32>) -> Result<(), String> {
116
+ for (i, _chunk) in download_stream(&url).enumerate() {
117
+ on_progress.send(i as u32).unwrap();
118
+ }
119
+ Ok(())
120
+ }
121
+ ```
122
+
123
+ ```typescript
124
+ import { invoke, Channel } from '@tauri-apps/api/core';
125
+
126
+ const onProgress = new Channel<number>();
127
+ onProgress.onmessage = (bytes) => updateProgressBar(bytes);
128
+ await invoke('download', { url, onProgress });
129
+ ```
130
+
131
+ ### 바이너리 응답 (JSON 직렬화 우회)
132
+
133
+ ```rust
134
+ use tauri::ipc::Response;
135
+
136
+ // ❌ Vec<u8> JSON 직렬화 (크기 증가, 느림)
137
+ #[tauri::command]
138
+ fn get_image() -> Result<Vec<u8>, String> { ... }
139
+
140
+ // ✅ Raw 바이너리 (직렬화 없음)
141
+ #[tauri::command]
142
+ fn get_image() -> Result<Response, String> {
143
+ let bytes = std::fs::read("/path/to/image.png").map_err(|e| e.to_string())?;
144
+ Ok(Response::new(bytes))
145
+ }
146
+ ```
147
+
148
+ ### Async Commands (비차단)
149
+
150
+ ```rust
151
+ // ❌ 동기 커맨드 (메인 스레드 차단)
152
+ #[tauri::command]
153
+ fn heavy_work() -> String {
154
+ std::thread::sleep(std::time::Duration::from_secs(5));
155
+ "done".to_string()
156
+ }
157
+
158
+ // ✅ 비동기 커맨드 (비차단)
159
+ #[tauri::command]
160
+ async fn heavy_work() -> Result<String, String> {
161
+ tokio::time::sleep(std::time::Duration::from_secs(5)).await;
162
+ Ok("done".to_string())
163
+ }
164
+ ```
165
+
166
+ ### 구조화된 에러 처리
167
+
168
+ ```rust
169
+ #[derive(Debug, thiserror::Error)]
170
+ enum AppError {
171
+ #[error("File not found: {0}")]
172
+ FileNotFound(String),
173
+ #[error("Permission denied")]
174
+ PermissionDenied,
175
+ #[error(transparent)]
176
+ Io(#[from] std::io::Error),
177
+ }
178
+
179
+ impl serde::Serialize for AppError {
180
+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
181
+ where S: serde::ser::Serializer {
182
+ serializer.serialize_str(self.to_string().as_ref())
183
+ }
184
+ }
185
+ ```
186
+
187
+ </critical_patterns>
188
+
189
+ ---
190
+
191
+ <security>
192
+
193
+ ## 2. 보안 설정 (CRITICAL)
194
+
195
+ Tauri의 보안은 Trust Boundary (Rust=신뢰, WebView=검증 필요) 기반입니다.
196
+
197
+ ### 최소 권한 Capability
198
+
199
+ ```json
200
+ {
201
+ "identifier": "main-window",
202
+ "windows": ["main"],
203
+ "permissions": [
204
+ "core:window:allow-close",
205
+ "core:window:allow-minimize",
206
+ "fs:allow-read"
207
+ ]
208
+ }
209
+ ```
210
+
211
+ ### Scope 제한
212
+
213
+ ```toml
214
+ # ❌ 위험: 모든 경로
215
+ [[scope.allow]]
216
+ path = "/*"
217
+
218
+ # ❌ 위험: 모든 명령
219
+ [permission.commands]
220
+ allow = ["*"]
221
+
222
+ # ✅ 안전: 특정 경로만
223
+ [[scope.allow]]
224
+ path = "$APPDATA/my-app/data/**"
225
+
226
+ [[scope.deny]]
227
+ path = "$HOME/.ssh/**"
228
+ path = "$HOME/.gnupg/**"
229
+ ```
230
+
231
+ ### 윈도우별 Capability 분리
232
+
233
+ ```json
234
+ // capabilities/main-window.json - UI 권한
235
+ {
236
+ "identifier": "main-cap",
237
+ "windows": ["main"],
238
+ "permissions": ["fs:allow-read", "window:allow-create"]
239
+ }
240
+
241
+ // capabilities/worker-window.json - 백그라운드 권한
242
+ {
243
+ "identifier": "worker-cap",
244
+ "windows": ["worker"],
245
+ "permissions": ["fs:allow-read", "fs:allow-write", "http:allow-fetch"]
246
+ }
247
+ ```
248
+
249
+ ### CSP 설정
250
+
251
+ ```json
252
+ {
253
+ "app": {
254
+ "security": {
255
+ "csp": "default-src 'self'; script-src 'self'; img-src 'self' data: asset:; style-src 'self' 'unsafe-inline'"
256
+ }
257
+ }
258
+ }
259
+ ```
260
+
261
+ </security>
262
+
263
+ ---
264
+
265
+ <bundle_optimization>
266
+
267
+ ## 3. 번들 크기 최적화 (HIGH)
268
+
269
+ Tauri 앱은 OS 네이티브 WebView를 사용하여 Electron보다 훨씬 작지만, 추가 최적화가 가능합니다.
270
+
271
+ ### Cargo Release 프로필
272
+
273
+ ```toml
274
+ # src-tauri/Cargo.toml
275
+ [profile.release]
276
+ codegen-units = 1 # LLVM 최적화 극대화
277
+ lto = true # 링크 타임 최적화
278
+ opt-level = "s" # 크기 우선 ("3"은 성능 우선)
279
+ panic = "abort" # 패닉 핸들러 제거
280
+ strip = true # 디버그 심볼 제거
281
+ ```
282
+
283
+ ### 미사용 커맨드 제거 (v2.4+)
284
+
285
+ ```json
286
+ {
287
+ "build": {
288
+ "removeUnusedCommands": true
289
+ }
290
+ }
291
+ ```
292
+
293
+ ### 프론트엔드 최적화
294
+
295
+ ```tsx
296
+ // ❌ 전체 라이브러리 import
297
+ import { Check, X, Menu } from 'lucide-react'
298
+
299
+ // ✅ 직접 import
300
+ import Check from 'lucide-react/dist/esm/icons/check'
301
+
302
+ // ✅ 무거운 컴포넌트 lazy load
303
+ const HeavyEditor = lazy(() => import('./components/HeavyEditor'))
304
+ ```
305
+
306
+ </bundle_optimization>
307
+
308
+ ---
309
+
310
+ <state_management>
311
+
312
+ ## 4. Tauri 상태 관리 (HIGH)
313
+
314
+ ### Mutex 패턴 + 타입 별칭
315
+
316
+ ```rust
317
+ use std::sync::Mutex;
318
+ use tauri::State;
319
+
320
+ // ✅ 타입 별칭으로 불일치 방지
321
+ type AppState = Mutex<AppStateInner>;
322
+
323
+ #[derive(Default)]
324
+ struct AppStateInner {
325
+ counter: u32,
326
+ users: Vec<String>,
327
+ }
328
+
329
+ // 초기화
330
+ tauri::Builder::default()
331
+ .manage(AppState::default())
332
+
333
+ // 커맨드에서 접근
334
+ #[tauri::command]
335
+ fn increment(state: State<'_, AppState>) -> u32 {
336
+ let mut s = state.lock().unwrap();
337
+ s.counter += 1;
338
+ s.counter
339
+ }
340
+ ```
341
+
342
+ ### 동일 타입 중복 등록 방지
343
+
344
+ ```rust
345
+ // ❌ 두 번째 등록은 무시됨
346
+ app.manage(Mutex::new(AppState { counter: 0 }));
347
+ app.manage(Mutex::new(AppState { counter: 100 })); // 무시!
348
+
349
+ // ✅ 컨테이너로 통합
350
+ struct AppStates {
351
+ counter1: u32,
352
+ counter2: u32,
353
+ }
354
+ app.manage(Mutex::new(AppStates { counter1: 0, counter2: 100 }));
355
+ ```
356
+
357
+ ### 비동기 Mutex 선택 기준
358
+
359
+ ```rust
360
+ // ✅ 대부분: 표준 Mutex (빠름)
361
+ use std::sync::Mutex;
362
+
363
+ // ✅ IO 리소스 (DB 연결 등): Tokio Mutex
364
+ use tokio::sync::Mutex;
365
+
366
+ #[tauri::command]
367
+ async fn query_db(state: State<'_, tokio::sync::Mutex<DbPool>>) -> Result<Vec<User>, String> {
368
+ let pool = state.lock().await;
369
+ // await 포인트 너머로 lock 유지 필요할 때만 Tokio Mutex
370
+ pool.query("SELECT * FROM users").await.map_err(|e| e.to_string())
371
+ }
372
+ ```
373
+
374
+ </state_management>
375
+
376
+ ---
377
+
378
+ <react_integration>
379
+
380
+ ## 5. React 통합 패턴 (MEDIUM-HIGH)
381
+
382
+ ### invoke Hook 패턴
383
+
384
+ ```tsx
385
+ import { invoke } from '@tauri-apps/api/core';
386
+
387
+ // ✅ invoke + 에러 처리 + 로딩 상태
388
+ function useInvoke<T>(cmd: string, args?: Record<string, unknown>) {
389
+ const [data, setData] = useState<T | null>(null);
390
+ const [error, setError] = useState<string | null>(null);
391
+ const [loading, setLoading] = useState(true);
392
+
393
+ useEffect(() => {
394
+ setLoading(true);
395
+ invoke<T>(cmd, args)
396
+ .then(setData)
397
+ .catch((err) => setError(String(err)))
398
+ .finally(() => setLoading(false));
399
+ }, [cmd, JSON.stringify(args)]);
400
+
401
+ return { data, error, loading };
402
+ }
403
+ ```
404
+
405
+ ### 이벤트 리스너 정리 필수
406
+
407
+ ```tsx
408
+ // ✅ cleanup으로 메모리 누수 방지
409
+ useEffect(() => {
410
+ let unlisten: (() => void) | undefined;
411
+
412
+ const setup = async () => {
413
+ unlisten = await listen('event-name', (event) => {
414
+ setStatus(event.payload as string);
415
+ });
416
+ };
417
+ setup();
418
+
419
+ return () => { unlisten?.(); };
420
+ }, []);
421
+ ```
422
+
423
+ ### convertFileSrc로 로컬 파일 렌더링
424
+
425
+ ```tsx
426
+ import { convertFileSrc } from '@tauri-apps/api/core';
427
+
428
+ // ❌ invoke로 파일 읽어서 base64 변환 (느림)
429
+ const base64 = await invoke('read_image_base64', { path });
430
+
431
+ // ✅ 네이티브 프로토콜로 직접 렌더링 (빠름)
432
+ const assetUrl = convertFileSrc(filePath);
433
+ return <img src={assetUrl} />;
434
+ ```
435
+
436
+ </react_integration>
437
+
438
+ ---
439
+
440
+ <deployment>
441
+
442
+ ## 6. 배포 최적화 (MEDIUM)
443
+
444
+ ### GitHub Actions 멀티 플랫폼
445
+
446
+ ```yaml
447
+ strategy:
448
+ matrix:
449
+ platform:
450
+ - os: ubuntu-latest
451
+ rust_target: x86_64-unknown-linux-gnu
452
+ - os: macos-latest
453
+ rust_target: aarch64-apple-darwin
454
+ - os: windows-latest
455
+ rust_target: x86_64-pc-windows-msvc
456
+
457
+ steps:
458
+ - uses: tauri-apps/tauri-action@v0
459
+ env:
460
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
461
+ TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
462
+ ```
463
+
464
+ ### 자동 업데이트
465
+
466
+ ```json
467
+ {
468
+ "bundle": { "createUpdaterArtifacts": true },
469
+ "plugins": {
470
+ "updater": {
471
+ "pubkey": "PUBLIC_KEY",
472
+ "endpoints": ["https://releases.myapp.com/{{target}}/{{arch}}/{{current_version}}"]
473
+ }
474
+ }
475
+ }
476
+ ```
477
+
478
+ ```typescript
479
+ import { check } from '@tauri-apps/plugin-updater';
480
+ import { relaunch } from '@tauri-apps/plugin-process';
481
+
482
+ const update = await check();
483
+ if (update) {
484
+ await update.downloadAndInstall((event) => {
485
+ if (event.event === 'Progress') console.log(event.data.chunkLength);
486
+ });
487
+ await relaunch();
488
+ }
489
+ ```
490
+
491
+ </deployment>
492
+
493
+ ---
494
+
495
+ <references>
496
+
497
+ ## 참고 자료
498
+
499
+ ### Tauri v2 공식 문서
500
+ 1. [Tauri Overview](https://tauri.app/start/)
501
+ 2. [Calling Rust from Frontend](https://tauri.app/develop/calling-rust/)
502
+ 3. [Calling Frontend from Rust](https://tauri.app/develop/calling-frontend/)
503
+ 4. [Inter-Process Communication](https://tauri.app/concept/inter-process-communication/)
504
+ 5. [State Management](https://tauri.app/develop/state-management/)
505
+ 6. [Security](https://tauri.app/security/)
506
+ 7. [Capabilities](https://tauri.app/security/capabilities/)
507
+ 8. [Permissions](https://tauri.app/security/permissions/)
508
+ 9. [App Size](https://tauri.app/concept/size/)
509
+ 10. [Distribution](https://tauri.app/distribute/)
510
+ 11. [Updater Plugin](https://tauri.app/plugin/updater/)
511
+ 12. [Migration from v1](https://tauri.app/start/migrate/from-tauri-1/)
512
+
513
+ ### React 19
514
+ 13. [React](https://react.dev)
515
+ 14. [React use()](https://react.dev/reference/react/use)
516
+ 15. [React useOptimistic](https://react.dev/reference/react/useOptimistic)
517
+ 16. [React Compiler](https://react.dev/learn/react-compiler)
518
+
519
+ ### TypeScript 타입 안전성
520
+ 17. [tauri-specta](https://github.com/specta-rs/tauri-specta)
521
+ 18. [TauRPC](https://github.com/MatsDK/TauRPC)
522
+
523
+ ### 외부 자료
524
+ 19. [Tauri v2 + React 19 Template](https://github.com/dannysmith/tauri-template)
525
+ 20. [Tauri Plugins Workspace](https://github.com/tauri-apps/plugins-workspace)
526
+
527
+ </references>