@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,510 @@
1
+ # Tauri
2
+
3
+ > **Version 2.x** | Cross-platform Desktop & Mobile Application Framework
4
+
5
+ ---
6
+
7
+ <context>
8
+
9
+ **Purpose:** Rust 백엔드 + 시스템 WebView 기반 크로스플랫폼 앱 프레임워크
10
+ **Generated:** 2026-02-09
11
+ **Source:** https://tauri.app, https://v2.tauri.app, https://github.com/tauri-apps/tauri
12
+
13
+ **Key Features:**
14
+ - 시스템 WebView 활용 (최소 600KB 바이너리)
15
+ - Rust 메모리/타입 안전성 기반 보안
16
+ - Commands + Events IPC 시스템
17
+ - Capabilities/Permissions 보안 모델
18
+ - Plugin 시스템 (네이티브 확장)
19
+ - 데스크톱 (Windows, macOS, Linux) + 모바일 (iOS, Android) 지원
20
+
21
+ </context>
22
+
23
+ ---
24
+
25
+ <forbidden>
26
+
27
+ | 분류 | ❌ 금지 | 이유 |
28
+ |------|---------|------|
29
+ | **v1 API** | `@tauri-apps/api/tauri` import | `@tauri-apps/api/core` 사용 |
30
+ | **v1 API** | `Window` 타입 | `WebviewWindow` 사용 |
31
+ | **v1 API** | `get_window()` | `get_webview_window()` 사용 |
32
+ | **v1 API** | allowlist 설정 | Capabilities/Permissions 사용 |
33
+ | **v1 API** | `.validator()` | v2에서 제거됨 |
34
+ | **보안** | Permission 없이 Command 노출 | Capabilities 필수 |
35
+ | **보안** | CSP 비활성화 | 항상 CSP 설정 |
36
+ | **보안** | `'unsafe-eval'` 무분별 사용 | WASM만 `'wasm-unsafe-eval'` 허용 |
37
+ | **보안** | CDN에서 원격 스크립트 로드 | 공격 벡터, 로컬 번들 사용 |
38
+ | **IPC** | Rust 함수 직접 FFI 호출 | `invoke()` 메시지 패싱 사용 |
39
+ | **IPC** | async command에 &str 인자 | `String`으로 변환 필수 |
40
+ | **상태** | `State<T>`에 Arc 래핑 | Tauri가 내부적으로 처리 |
41
+ | **상태** | async에서 await 걸쳐 Mutex lock | 데드락 위험, 표준 Mutex 사용 |
42
+ | **Plugin** | v1 built-in API 직접 사용 | v2 plugin으로 설치 필요 |
43
+
44
+ </forbidden>
45
+
46
+ ---
47
+
48
+ <required>
49
+
50
+ | 분류 | ✅ 필수 | 상세 |
51
+ |------|---------|------|
52
+ | **Command** | `#[tauri::command]` 어노테이션 | 모든 프론트엔드 호출 함수 |
53
+ | **Command** | `tauri::generate_handler![]` 등록 | Builder에 핸들러 등록 |
54
+ | **Command** | `serde::Serialize/Deserialize` | 인자/반환값 직렬화 필수 |
55
+ | **Command** | `Result<T, E>` 반환 | E도 직렬화 가능해야 함 |
56
+ | **IPC** | `invoke()` 사용 | `@tauri-apps/api/core`에서 import |
57
+ | **IPC** | camelCase 인자 | Rust snake_case → JS camelCase 자동 변환 |
58
+ | **보안** | Capabilities 파일 정의 | `src-tauri/capabilities/` |
59
+ | **보안** | Plugin Permission 추가 | 사용하는 모든 plugin에 대해 |
60
+ | **보안** | CSP 설정 | `tauri.conf.json > app > security > csp` |
61
+ | **상태** | `app.manage()` 등록 | setup 내에서 상태 등록 |
62
+ | **상태** | `State<'_, T>` 매개변수 | Command에서 상태 접근 |
63
+ | **상태** | 가변 상태 → `Mutex<T>` | 스레드 안전 보장 |
64
+ | **모바일** | lib.rs 엔트리포인트 | 모바일은 라이브러리로 로드 |
65
+ | **Config** | `identifier` 설정 | 역도메인 형식 (com.example.app) |
66
+
67
+ </required>
68
+
69
+ ---
70
+
71
+ <setup>
72
+
73
+ ## 설치
74
+
75
+ ```bash
76
+ # 새 프로젝트 생성 (React + TypeScript + Vite)
77
+ npm create tauri-app@latest -- --template react-ts
78
+
79
+ # 기존 Vite 프로젝트에 추가
80
+ npm add -D @tauri-apps/cli@latest
81
+ npx tauri init
82
+ ```
83
+
84
+ ## Prerequisites
85
+
86
+ **모든 플랫폼:**
87
+ - Rust (rustup 설치)
88
+ - Node.js
89
+
90
+ **macOS:**
91
+ - Xcode Command Line Tools
92
+
93
+ **Windows:**
94
+ - Microsoft C++ Build Tools (Desktop development with C++)
95
+ - WebView2 Runtime (Windows 10 v1803+ 기본 포함)
96
+
97
+ **Linux:**
98
+ - webkit2gtk, build-essential, libssl-dev, librsvg2-dev
99
+
100
+ ## 초기 설정
101
+
102
+ ```json
103
+ // src-tauri/tauri.conf.json
104
+ {
105
+ "productName": "my-app",
106
+ "identifier": "com.example.myapp",
107
+ "build": {
108
+ "beforeDevCommand": "npm run dev",
109
+ "beforeBuildCommand": "npm run build",
110
+ "devUrl": "http://localhost:5173",
111
+ "frontendDist": "../dist"
112
+ },
113
+ "app": {
114
+ "windows": [{ "title": "My App", "width": 1024, "height": 768 }],
115
+ "security": {
116
+ "csp": {
117
+ "default-src": "'self' customprotocol: asset:",
118
+ "connect-src": "ipc: http://ipc.localhost",
119
+ "img-src": "'self' asset: http://asset.localhost blob: data:",
120
+ "style-src": "'unsafe-inline' 'self'"
121
+ }
122
+ }
123
+ }
124
+ }
125
+ ```
126
+
127
+ ```typescript
128
+ // vite.config.ts
129
+ import { defineConfig } from 'vite';
130
+ import react from '@vitejs/plugin-react';
131
+
132
+ const host = process.env.TAURI_DEV_HOST;
133
+
134
+ export default defineConfig({
135
+ plugins: [react()],
136
+ clearScreen: false,
137
+ server: {
138
+ port: 5173,
139
+ strictPort: true,
140
+ host: host || false,
141
+ hmr: host ? { protocol: 'ws', host, port: 1421 } : undefined,
142
+ watch: { ignored: ['**/src-tauri/**'] },
143
+ },
144
+ envPrefix: ['VITE_', 'TAURI_ENV_*'],
145
+ build: {
146
+ target: process.env.TAURI_ENV_PLATFORM === 'windows' ? 'chrome105' : 'safari13',
147
+ minify: !process.env.TAURI_ENV_DEBUG ? 'esbuild' : false,
148
+ sourcemap: !!process.env.TAURI_ENV_DEBUG,
149
+ },
150
+ });
151
+ ```
152
+
153
+ </setup>
154
+
155
+ ---
156
+
157
+ ## IPC (Inter-Process Communication)
158
+
159
+ ### Commands (프론트엔드 → Rust)
160
+
161
+ ```rust
162
+ // src-tauri/src/commands/mod.rs
163
+ use serde::{Deserialize, Serialize};
164
+ use tauri::State;
165
+ use std::sync::Mutex;
166
+
167
+ #[derive(Serialize, Deserialize)]
168
+ pub struct User {
169
+ pub id: u32,
170
+ pub name: String,
171
+ }
172
+
173
+ // 기본 Command
174
+ #[tauri::command]
175
+ fn greet(name: String) -> String {
176
+ format!("Hello, {}!", name)
177
+ }
178
+
179
+ // 비동기 Command + State
180
+ #[tauri::command]
181
+ async fn get_user(id: u32, db: State<'_, Mutex<Database>>) -> Result<User, String> {
182
+ let db = db.lock().map_err(|e| e.to_string())?;
183
+ db.find_user(id).ok_or("User not found".into())
184
+ }
185
+
186
+ // 에러 처리 (thiserror 권장)
187
+ #[derive(Debug, thiserror::Error)]
188
+ pub enum AppError {
189
+ #[error("Not found: {0}")]
190
+ NotFound(String),
191
+ #[error("Internal error: {0}")]
192
+ Internal(String),
193
+ }
194
+
195
+ impl serde::Serialize for AppError {
196
+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
197
+ where S: serde::Serializer {
198
+ serializer.serialize_str(self.to_string().as_ref())
199
+ }
200
+ }
201
+
202
+ #[tauri::command]
203
+ async fn delete_user(id: u32) -> Result<(), AppError> {
204
+ // ...
205
+ Err(AppError::NotFound(format!("User {} not found", id)))
206
+ }
207
+ ```
208
+
209
+ ```typescript
210
+ // 프론트엔드 invoke
211
+ import { invoke } from '@tauri-apps/api/core';
212
+
213
+ // 기본 호출
214
+ const greeting = await invoke<string>('greet', { name: 'World' });
215
+
216
+ // 타입 안전 호출
217
+ interface User { id: number; name: string; }
218
+ const user = await invoke<User>('get_user', { id: 1 });
219
+
220
+ // 에러 처리
221
+ try {
222
+ await invoke('delete_user', { id: 999 });
223
+ } catch (error) {
224
+ console.error('Command failed:', error);
225
+ }
226
+ ```
227
+
228
+ ### Events (양방향 통신)
229
+
230
+ ```rust
231
+ // Rust → 프론트엔드 Event 발행
232
+ use tauri::{AppHandle, Emitter};
233
+
234
+ #[derive(Clone, Serialize)]
235
+ struct DownloadProgress {
236
+ url: String,
237
+ progress: f64,
238
+ }
239
+
240
+ fn download_file(app: AppHandle, url: String) {
241
+ // 모든 윈도우에 Global Event
242
+ app.emit("download-progress", DownloadProgress {
243
+ url, progress: 0.5,
244
+ }).unwrap();
245
+
246
+ // 특정 윈도우에만
247
+ app.emit_to("main", "download-complete", ()).unwrap();
248
+ }
249
+ ```
250
+
251
+ ```typescript
252
+ // 프론트엔드 Event 리스닝
253
+ import { listen, once } from '@tauri-apps/api/event';
254
+
255
+ // 지속 리스닝
256
+ const unlisten = await listen<{ url: string; progress: number }>(
257
+ 'download-progress',
258
+ (event) => console.log(`${event.payload.url}: ${event.payload.progress * 100}%`)
259
+ );
260
+
261
+ // 단발 리스닝
262
+ await once('download-complete', () => console.log('Done!'));
263
+
264
+ // 리스너 해제
265
+ unlisten();
266
+ ```
267
+
268
+ ### Channels (고속 스트리밍)
269
+
270
+ ```rust
271
+ use tauri::ipc::Channel;
272
+
273
+ #[tauri::command]
274
+ fn stream_data(channel: Channel<String>) {
275
+ for i in 0..100 {
276
+ channel.send(format!("chunk {}", i)).unwrap();
277
+ }
278
+ }
279
+ ```
280
+
281
+ ---
282
+
283
+ ## Security (보안)
284
+
285
+ ### Capabilities
286
+
287
+ ```json
288
+ // src-tauri/capabilities/default.json
289
+ {
290
+ "identifier": "default",
291
+ "description": "메인 윈도우 기본 권한",
292
+ "windows": ["main"],
293
+ "permissions": [
294
+ "core:default",
295
+ "core:window:allow-set-title",
296
+ "core:window:allow-close",
297
+ "shell:allow-open"
298
+ ]
299
+ }
300
+ ```
301
+
302
+ ```json
303
+ // 플랫폼별 Capability
304
+ {
305
+ "identifier": "mobile-features",
306
+ "description": "모바일 전용 권한",
307
+ "windows": ["main"],
308
+ "platforms": ["iOS", "android"],
309
+ "permissions": [
310
+ "nfc:default",
311
+ "biometric:default"
312
+ ]
313
+ }
314
+ ```
315
+
316
+ ### Permission 패턴
317
+
318
+ ```
319
+ core:default # Core 기본 권한
320
+ core:window:allow-<command> # Window 개별 허용
321
+ core:event:allow-listen # Event 리스닝 허용
322
+ <plugin>:default # Plugin 기본 권한
323
+ <plugin>:allow-<command> # Plugin 개별 허용
324
+ <plugin>:deny-<command> # Plugin 개별 거부
325
+ ```
326
+
327
+ ### CSP 설정
328
+
329
+ ```json
330
+ // tauri.conf.json > app > security > csp
331
+ {
332
+ "default-src": "'self' customprotocol: asset:",
333
+ "connect-src": "ipc: http://ipc.localhost",
334
+ "font-src": ["https://fonts.gstatic.com"],
335
+ "img-src": "'self' asset: http://asset.localhost blob: data:",
336
+ "style-src": "'unsafe-inline' 'self'"
337
+ }
338
+ ```
339
+
340
+ ---
341
+
342
+ ## State Management (상태 관리)
343
+
344
+ ```rust
345
+ use std::sync::Mutex;
346
+ use tauri::{Builder, Manager, State};
347
+
348
+ struct AppState {
349
+ counter: u32,
350
+ db_url: String,
351
+ }
352
+
353
+ #[tauri::command]
354
+ async fn increment(state: State<'_, Mutex<AppState>>) -> Result<u32, String> {
355
+ let mut s = state.lock().map_err(|e| e.to_string())?;
356
+ s.counter += 1;
357
+ Ok(s.counter)
358
+ }
359
+
360
+ fn main() {
361
+ Builder::default()
362
+ .setup(|app| {
363
+ // 불변 상태
364
+ app.manage(String::from("config-value"));
365
+ // 가변 상태
366
+ app.manage(Mutex::new(AppState { counter: 0, db_url: String::new() }));
367
+ Ok(())
368
+ })
369
+ .invoke_handler(tauri::generate_handler![increment])
370
+ .run(tauri::generate_context!())
371
+ .unwrap();
372
+ }
373
+ ```
374
+
375
+ **규칙:**
376
+ - Arc 불필요 (State<T>가 내부 처리)
377
+ - 가변 상태 → `Mutex<T>` (std::sync::Mutex 권장)
378
+ - 비동기 코드에서 await 포인트 넘어 lock 유지 금지
379
+ - 잘못된 타입 접근 → 런타임 패닉 (타입 별칭 권장)
380
+
381
+ ---
382
+
383
+ ## Plugins (v2)
384
+
385
+ ### v1 Built-in → v2 Plugin 전환
386
+
387
+ | 기능 | v2 Plugin 패키지 |
388
+ |------|-----------------|
389
+ | Clipboard | `@tauri-apps/plugin-clipboard-manager` |
390
+ | Dialog | `@tauri-apps/plugin-dialog` |
391
+ | File System | `@tauri-apps/plugin-fs` |
392
+ | HTTP | `@tauri-apps/plugin-http` |
393
+ | Shell | `@tauri-apps/plugin-shell` |
394
+ | Process | `@tauri-apps/plugin-process` |
395
+ | OS Info | `@tauri-apps/plugin-os` |
396
+ | Store | `@tauri-apps/plugin-store` |
397
+ | Notification | `@tauri-apps/plugin-notification` |
398
+ | Global Shortcut | `@tauri-apps/plugin-global-shortcut` |
399
+
400
+ ### Plugin 사용 패턴
401
+
402
+ ```bash
403
+ # 설치 (Rust + JS 바인딩)
404
+ npm add @tauri-apps/plugin-shell
405
+ cargo add tauri-plugin-shell -F tauri-plugin-shell/build
406
+ ```
407
+
408
+ ```rust
409
+ // main.rs에 등록
410
+ fn main() {
411
+ tauri::Builder::default()
412
+ .plugin(tauri_plugin_shell::init())
413
+ .run(tauri::generate_context!())
414
+ .unwrap();
415
+ }
416
+ ```
417
+
418
+ ```json
419
+ // capabilities에 Permission 추가
420
+ {
421
+ "permissions": ["shell:allow-open"]
422
+ }
423
+ ```
424
+
425
+ ---
426
+
427
+ ## Configuration
428
+
429
+ ### 플랫폼별 설정
430
+
431
+ ```
432
+ src-tauri/
433
+ ├── tauri.conf.json # 공통 설정
434
+ ├── tauri.windows.conf.json # Windows 오버라이드
435
+ ├── tauri.macos.conf.json # macOS 오버라이드
436
+ ├── tauri.linux.conf.json # Linux 오버라이드
437
+ ├── tauri.android.conf.json # Android 오버라이드
438
+ └── tauri.ios.conf.json # iOS 오버라이드
439
+ ```
440
+
441
+ ### 핵심 설정 필드
442
+
443
+ ```json
444
+ {
445
+ "productName": "My App",
446
+ "version": "1.0.0",
447
+ "identifier": "com.example.myapp",
448
+ "build": {
449
+ "beforeDevCommand": "npm run dev",
450
+ "beforeBuildCommand": "npm run build",
451
+ "devUrl": "http://localhost:5173",
452
+ "frontendDist": "../dist"
453
+ },
454
+ "app": {
455
+ "windows": [{ "title": "My App", "width": 1024, "height": 768 }],
456
+ "security": { "csp": "..." }
457
+ },
458
+ "bundle": {
459
+ "active": true,
460
+ "targets": ["deb", "rpm", "appimage", "msi", "nsis", "dmg", "app"],
461
+ "icon": ["icons/32x32.png", "icons/icon.icns", "icons/icon.ico"],
462
+ "android": { "minSdkVersion": 24 },
463
+ "macOS": { "minimumSystemVersion": "10.13" }
464
+ }
465
+ }
466
+ ```
467
+
468
+ ---
469
+
470
+ <quick_reference>
471
+
472
+ ```rust
473
+ // Command 기본 패턴
474
+ #[tauri::command]
475
+ async fn my_command(arg: String, state: State<'_, Mutex<AppState>>) -> Result<MyResponse, MyError> {
476
+ let s = state.lock().map_err(|e| MyError::Lock(e.to_string()))?;
477
+ Ok(MyResponse { data: s.process(arg) })
478
+ }
479
+ ```
480
+
481
+ ```typescript
482
+ // invoke 기본 패턴
483
+ const result = await invoke<ResponseType>('my_command', { arg: 'value' });
484
+ ```
485
+
486
+ ```json
487
+ // Capability 기본 패턴
488
+ { "identifier": "main", "windows": ["main"], "permissions": ["core:default", "plugin:allow-command"] }
489
+ ```
490
+
491
+ </quick_reference>
492
+
493
+ ---
494
+
495
+ <version_info>
496
+
497
+ **Version:** 2.x (현재 2.10.x)
498
+ **CLI Package:** @tauri-apps/cli
499
+ **API Package:** @tauri-apps/api
500
+ **Rust Crate:** tauri
501
+
502
+ **v1 → v2 Breaking Changes:**
503
+ - Config: `tauri {}` → `app {}`, `build.distDir` → `frontendDist`, `build.devPath` → `devUrl`
504
+ - API: `@tauri-apps/api/tauri` → `@tauri-apps/api/core`
505
+ - Window: `Window` → `WebviewWindow`, `get_window()` → `get_webview_window()`
506
+ - Security: allowlist → Capabilities/Permissions 시스템
507
+ - Plugins: 모든 시스템 API가 별도 plugin으로 분리
508
+ - Events: source-based → target-based 필터링
509
+
510
+ </version_info>