@su-record/vibe 2.4.71 → 2.4.74

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 (120) hide show
  1. package/CLAUDE.md +216 -215
  2. package/README.md +4 -4
  3. package/agents/research/best-practices-agent.md +13 -13
  4. package/agents/research/codebase-patterns-agent.md +33 -33
  5. package/agents/research/framework-docs-agent.md +23 -23
  6. package/agents/research/security-advisory-agent.md +29 -29
  7. package/agents/review/architecture-reviewer.md +31 -31
  8. package/agents/review/complexity-reviewer.md +21 -21
  9. package/agents/review/data-integrity-reviewer.md +29 -29
  10. package/agents/review/git-history-reviewer.md +24 -24
  11. package/agents/review/performance-reviewer.md +29 -29
  12. package/agents/review/python-reviewer.md +53 -53
  13. package/agents/review/rails-reviewer.md +40 -40
  14. package/agents/review/react-reviewer.md +40 -40
  15. package/agents/review/security-reviewer.md +29 -29
  16. package/agents/review/simplicity-reviewer.md +24 -24
  17. package/agents/review/test-coverage-reviewer.md +31 -31
  18. package/agents/review/typescript-reviewer.md +41 -41
  19. package/commands/vibe.analyze.md +103 -7
  20. package/commands/vibe.reason.md +106 -0
  21. package/commands/vibe.review.md +123 -38
  22. package/commands/vibe.run.md +286 -221
  23. package/commands/vibe.spec.md +293 -173
  24. package/commands/vibe.utils.md +104 -3
  25. package/commands/vibe.verify.md +179 -86
  26. package/dist/cli/detect.js +40 -40
  27. package/dist/cli/detect.js.map +1 -1
  28. package/dist/cli/index.d.ts +1 -1
  29. package/dist/cli/index.js +1 -1
  30. package/dist/cli/llm.js +5 -5
  31. package/dist/cli/llm.js.map +1 -1
  32. package/dist/cli/setup.js +3 -3
  33. package/dist/cli/setup.js.map +1 -1
  34. package/dist/lib/ContextCompressor.js +1 -1
  35. package/dist/lib/ContextCompressor.js.map +1 -1
  36. package/dist/lib/gemini-api.js +12 -12
  37. package/dist/lib/gemini-api.js.map +1 -1
  38. package/dist/lib/gemini-oauth.js +22 -22
  39. package/dist/lib/gemini-oauth.js.map +1 -1
  40. package/dist/lib/gemini-storage.js +3 -3
  41. package/dist/lib/gemini-storage.js.map +1 -1
  42. package/dist/lib/gpt-api.js +11 -11
  43. package/dist/lib/gpt-api.js.map +1 -1
  44. package/dist/lib/gpt-oauth.js +28 -28
  45. package/dist/lib/gpt-oauth.js.map +1 -1
  46. package/dist/lib/gpt-storage.js +3 -3
  47. package/dist/lib/gpt-storage.js.map +1 -1
  48. package/dist/orchestrator/orchestrator.d.ts.map +1 -1
  49. package/dist/orchestrator/orchestrator.js +4 -6
  50. package/dist/orchestrator/orchestrator.js.map +1 -1
  51. package/dist/tools/convention/analyzeComplexity.js +3 -3
  52. package/dist/tools/convention/analyzeComplexity.js.map +1 -1
  53. package/dist/tools/convention/applyQualityRules.js +1 -1
  54. package/dist/tools/convention/applyQualityRules.js.map +1 -1
  55. package/dist/tools/convention/checkCouplingCohesion.js +2 -2
  56. package/dist/tools/convention/checkCouplingCohesion.js.map +1 -1
  57. package/dist/tools/convention/suggestImprovements.js +1 -1
  58. package/dist/tools/convention/suggestImprovements.js.map +1 -1
  59. package/dist/tools/convention/validateCodeQuality.js +1 -1
  60. package/dist/tools/convention/validateCodeQuality.js.map +1 -1
  61. package/dist/tools/memory/autoSaveContext.js +1 -1
  62. package/dist/tools/memory/autoSaveContext.js.map +1 -1
  63. package/dist/tools/memory/createMemoryTimeline.js +27 -27
  64. package/dist/tools/memory/createMemoryTimeline.js.map +1 -1
  65. package/dist/tools/memory/deleteMemory.js +1 -1
  66. package/dist/tools/memory/deleteMemory.js.map +1 -1
  67. package/dist/tools/memory/getMemoryGraph.js +24 -24
  68. package/dist/tools/memory/getMemoryGraph.js.map +1 -1
  69. package/dist/tools/memory/getSessionContext.js +36 -36
  70. package/dist/tools/memory/getSessionContext.js.map +1 -1
  71. package/dist/tools/memory/linkMemories.js +21 -21
  72. package/dist/tools/memory/linkMemories.js.map +1 -1
  73. package/dist/tools/memory/prioritizeMemory.js +1 -1
  74. package/dist/tools/memory/prioritizeMemory.js.map +1 -1
  75. package/dist/tools/memory/restoreSessionContext.js +1 -1
  76. package/dist/tools/memory/restoreSessionContext.js.map +1 -1
  77. package/dist/tools/memory/searchMemories.js +1 -1
  78. package/dist/tools/memory/searchMemories.js.map +1 -1
  79. package/dist/tools/memory/searchMemoriesAdvanced.js +42 -42
  80. package/dist/tools/memory/searchMemoriesAdvanced.js.map +1 -1
  81. package/dist/tools/memory/startSession.js +2 -2
  82. package/dist/tools/memory/startSession.js.map +1 -1
  83. package/dist/tools/memory/updateMemory.js +1 -1
  84. package/dist/tools/memory/updateMemory.js.map +1 -1
  85. package/dist/tools/semantic/analyzeDependencyGraph.js +38 -38
  86. package/dist/tools/semantic/analyzeDependencyGraph.js.map +1 -1
  87. package/dist/tools/semantic/findReferences.js +1 -1
  88. package/dist/tools/semantic/findReferences.js.map +1 -1
  89. package/dist/tools/semantic/findSymbol.js +1 -1
  90. package/dist/tools/semantic/findSymbol.js.map +1 -1
  91. package/dist/tools/time/getCurrentTime.js +1 -1
  92. package/dist/tools/time/getCurrentTime.js.map +1 -1
  93. package/dist/tools/ui/previewUiAscii.js +2 -2
  94. package/dist/tools/ui/previewUiAscii.js.map +1 -1
  95. package/hooks/hooks.json +11 -2
  96. package/hooks/scripts/llm-orchestrate.js +1 -1
  97. package/hooks/scripts/utils.js +31 -6
  98. package/languages/csharp-unity.md +82 -83
  99. package/languages/dart-flutter.md +89 -88
  100. package/languages/go.md +76 -75
  101. package/languages/java-spring.md +85 -84
  102. package/languages/kotlin-android.md +64 -63
  103. package/languages/python-django.md +83 -82
  104. package/languages/python-fastapi.md +82 -81
  105. package/languages/rust.md +75 -74
  106. package/languages/swift-ios.md +73 -72
  107. package/languages/typescript-electron.md +70 -71
  108. package/languages/typescript-nextjs.md +93 -92
  109. package/languages/typescript-node.md +64 -63
  110. package/languages/typescript-nuxt.md +113 -112
  111. package/languages/typescript-react-native.md +82 -81
  112. package/languages/typescript-react.md +76 -75
  113. package/languages/typescript-tauri.md +74 -75
  114. package/languages/typescript-vue.md +73 -72
  115. package/package.json +1 -1
  116. package/skills/git-worktree.md +25 -25
  117. package/skills/multi-llm-orchestration.md +4 -6
  118. package/skills/priority-todos.md +39 -39
  119. package/skills/vibe-capabilities.md +2 -2
  120. package/vibe/config.json +2 -2
@@ -1,42 +1,41 @@
1
- # 🦀 TypeScript + Tauri v2 품질 규칙
1
+ # TypeScript + Tauri v2 Quality Rules
2
2
 
3
- ## 핵심 원칙 (core에서 상속)
3
+ ## Core Principles (inherited from core)
4
4
 
5
5
  ```markdown
6
- 단일 책임 (SRP)
7
- 중복 제거 (DRY)
8
- 재사용성
9
- ✅ 낮은 복잡도
10
- 함수 ≤ 30줄, JSX ≤ 50줄
11
- 중첩 3단계
12
- Cyclomatic complexity ≤ 10
6
+ # Core Principles (inherited from core)
7
+ Single Responsibility (SRP)
8
+ No Duplication (DRY)
9
+ Reusability
10
+ Low Complexity
11
+ Function <= 30 lines, JSX <= 50 lines
12
+ Nesting <= 3 levels
13
+ Cyclomatic complexity <= 10
13
14
  ```
14
15
 
15
- ## Tauri 아키텍처 이해
16
+ ## Tauri Architecture Understanding
16
17
 
17
- ```
18
- ┌─────────────────────────────────────────────┐
19
- │ Frontend (TypeScript/React/Vue/Svelte) │
20
- - UI 렌더링 │
21
- - 사용자 인터랙션 │
22
- │ - @tauri-apps/api 호출 │
23
- ├─────────────────────────────────────────────┤
24
- │ Tauri Core (Rust) │
25
- - 시스템 API 접근 │
26
- - 파일 시스템, 네트워크 │
27
- │ - 보안 샌드박스 │
28
- └─────────────────────────────────────────────┘
18
+ ```text
19
+ Frontend (TypeScript/React/Vue/Svelte)
20
+ - UI rendering
21
+ - User interaction
22
+ - @tauri-apps/api calls
23
+
24
+ Tauri Core (Rust)
25
+ - System API access
26
+ - File system, network
27
+ - Security sandbox
29
28
  ```
30
29
 
31
- ## TypeScript/Tauri 특화 규칙
30
+ ## TypeScript/Tauri Specific Rules
32
31
 
33
- ### 1. Tauri Command 타입 안전성
32
+ ### 1. Tauri Command Type Safety
34
33
 
35
34
  ```typescript
36
- // any 사용
35
+ // Bad: Using any
37
36
  const result = await invoke('get_data');
38
37
 
39
- // 명확한 타입 정의
38
+ // Good: Clear type definition
40
39
  interface FileInfo {
41
40
  path: string;
42
41
  size: number;
@@ -45,7 +44,7 @@ interface FileInfo {
45
44
 
46
45
  const fileInfo = await invoke<FileInfo>('get_file_info', { path: '/path/to/file' });
47
46
 
48
- // Command 응답 타입 정의
47
+ // Good: Command response type definition
49
48
  interface CommandResponse<T> {
50
49
  success: boolean;
51
50
  data?: T;
@@ -61,14 +60,14 @@ async function invokeCommand<T>(cmd: string, args?: Record<string, unknown>): Pr
61
60
  }
62
61
  ```
63
62
 
64
- ### 2. Tauri API 사용 패턴
63
+ ### 2. Tauri API Usage Patterns
65
64
 
66
65
  ```typescript
67
66
  import { invoke } from '@tauri-apps/api/core';
68
67
  import { open, save } from '@tauri-apps/plugin-dialog';
69
68
  import { readTextFile, writeTextFile } from '@tauri-apps/plugin-fs';
70
69
 
71
- // 파일 다이얼로그 + 읽기
70
+ // Good: File dialog + read
72
71
  async function openFile(): Promise<string | null> {
73
72
  const selected = await open({
74
73
  multiple: false,
@@ -80,7 +79,7 @@ async function openFile(): Promise<string | null> {
80
79
  return await readTextFile(selected as string);
81
80
  }
82
81
 
83
- // 파일 저장
82
+ // Good: File save
84
83
  async function saveFile(content: string): Promise<void> {
85
84
  const path = await save({
86
85
  filters: [{ name: 'Text', extensions: ['txt'] }]
@@ -92,12 +91,12 @@ async function saveFile(content: string): Promise<void> {
92
91
  }
93
92
  ```
94
93
 
95
- ### 3. Event 시스템 활용
94
+ ### 3. Event System Usage
96
95
 
97
96
  ```typescript
98
97
  import { listen, emit } from '@tauri-apps/api/event';
99
98
 
100
- // 이벤트 리스너 (cleanup 필수)
99
+ // Good: Event listener (cleanup required)
101
100
  function useBackendEvent<T>(eventName: string, handler: (payload: T) => void) {
102
101
  useEffect(() => {
103
102
  const unlisten = listen<T>(eventName, (event) => {
@@ -110,41 +109,41 @@ function useBackendEvent<T>(eventName: string, handler: (payload: T) => void) {
110
109
  }, [eventName, handler]);
111
110
  }
112
111
 
113
- // 프론트엔드 백엔드 이벤트
112
+ // Good: Frontend -> Backend event
114
113
  async function notifyBackend(action: string, data: unknown): Promise<void> {
115
114
  await emit('frontend-action', { action, data });
116
115
  }
117
116
  ```
118
117
 
119
- ### 4. Window 관리
118
+ ### 4. Window Management
120
119
 
121
120
  ```typescript
122
121
  import { getCurrentWindow } from '@tauri-apps/api/window';
123
122
 
124
- // 제어
123
+ // Good: Window control
125
124
  async function setupWindow(): Promise<void> {
126
125
  const appWindow = getCurrentWindow();
127
126
 
128
- // 크기 설정
127
+ // Set window size
129
128
  await appWindow.setSize(new LogicalSize(800, 600));
130
129
 
131
- // 위치 중앙
130
+ // Center window
132
131
  await appWindow.center();
133
132
 
134
- // 제목 설정
133
+ // Set window title
135
134
  await appWindow.setTitle('My Tauri App');
136
135
  }
137
136
 
138
- // 이벤트 리스너
137
+ // Good: Window event listener
139
138
  function useWindowEvents() {
140
139
  useEffect(() => {
141
140
  const appWindow = getCurrentWindow();
142
141
 
143
142
  const unlistenClose = appWindow.onCloseRequested(async (event) => {
144
- // 저장되지 않은 변경사항 확인
143
+ // Check for unsaved changes
145
144
  if (hasUnsavedChanges) {
146
145
  event.preventDefault();
147
- // 확인 다이얼로그 표시
146
+ // Show confirmation dialog
148
147
  }
149
148
  });
150
149
 
@@ -155,18 +154,18 @@ function useWindowEvents() {
155
154
  }
156
155
  ```
157
156
 
158
- ### 5. Rust Command 정의 (백엔드)
157
+ ### 5. Rust Command Definition (Backend)
159
158
 
160
159
  ```rust
161
- // src-tauri/src/main.rs 또는 lib.rs
160
+ // src-tauri/src/main.rs or lib.rs
162
161
 
163
- // Command 정의
162
+ // Good: Command definition
164
163
  #[tauri::command]
165
164
  fn greet(name: &str) -> String {
166
165
  format!("Hello, {}!", name)
167
166
  }
168
167
 
169
- // 비동기 Command
168
+ // Good: Async Command
170
169
  #[tauri::command]
171
170
  async fn read_file(path: String) -> Result<String, String> {
172
171
  tokio::fs::read_to_string(&path)
@@ -174,13 +173,13 @@ async fn read_file(path: String) -> Result<String, String> {
174
173
  .map_err(|e| e.to_string())
175
174
  }
176
175
 
177
- // State 사용
176
+ // Good: Using State
178
177
  #[tauri::command]
179
178
  fn get_count(state: tauri::State<'_, AppState>) -> u32 {
180
179
  *state.count.lock().unwrap()
181
180
  }
182
181
 
183
- // main.rs에서 등록
182
+ // Register in main.rs
184
183
  fn main() {
185
184
  tauri::Builder::default()
186
185
  .invoke_handler(tauri::generate_handler![greet, read_file, get_count])
@@ -189,7 +188,7 @@ fn main() {
189
188
  }
190
189
  ```
191
190
 
192
- ### 6. 보안 설정 (tauri.conf.json)
191
+ ### 6. Security Configuration (tauri.conf.json)
193
192
 
194
193
  ```json
195
194
  {
@@ -210,10 +209,10 @@ fn main() {
210
209
  }
211
210
  ```
212
211
 
213
- ### 7. Custom Hook 패턴
212
+ ### 7. Custom Hook Pattern
214
213
 
215
214
  ```typescript
216
- // Tauri Command Hook
215
+ // Good: Tauri Command Hook
217
216
  function useTauriCommand<T, A extends Record<string, unknown>>(
218
217
  command: string
219
218
  ) {
@@ -240,7 +239,7 @@ function useTauriCommand<T, A extends Record<string, unknown>>(
240
239
  return { data, loading, error, execute };
241
240
  }
242
241
 
243
- // 사용 예시
242
+ // Usage example
244
243
  function FileViewer() {
245
244
  const { data: content, loading, error, execute } = useTauriCommand<string>('read_file');
246
245
 
@@ -260,24 +259,24 @@ function FileViewer() {
260
259
  }
261
260
  ```
262
261
 
263
- ### 8. 빌드 배포
262
+ ### 8. Build and Deploy
264
263
 
265
264
  ```bash
266
- # 개발 모드
265
+ # Development mode
267
266
  npm run tauri dev
268
267
 
269
- # 프로덕션 빌드
268
+ # Production build
270
269
  npm run tauri build
271
270
 
272
- # 특정 타겟
271
+ # Specific target
273
272
  npm run tauri build -- --target x86_64-pc-windows-msvc
274
273
  npm run tauri build -- --target aarch64-apple-darwin
275
274
  npm run tauri build -- --target x86_64-unknown-linux-gnu
276
275
  ```
277
276
 
278
- ## 폴더 구조 권장
277
+ ## Recommended Folder Structure
279
278
 
280
- ```
279
+ ```text
281
280
  my-tauri-app/
282
281
  ├── src/ # Frontend
283
282
  │ ├── components/
@@ -295,34 +294,34 @@ my-tauri-app/
295
294
  └── package.json
296
295
  ```
297
296
 
298
- ## 성능 최적화
297
+ ## Performance Optimization
299
298
 
300
299
  ```typescript
301
- // 대용량 데이터 스트리밍
300
+ // Good: Large data streaming
302
301
  import { Channel } from '@tauri-apps/api/core';
303
302
 
304
303
  async function streamLargeFile(path: string): Promise<void> {
305
304
  const channel = new Channel<string>();
306
305
 
307
306
  channel.onmessage = (chunk) => {
308
- // 청크 단위로 처리
307
+ // Process chunk by chunk
309
308
  appendToDisplay(chunk);
310
309
  };
311
310
 
312
311
  await invoke('stream_file', { path, channel });
313
312
  }
314
313
 
315
- // 백그라운드 작업
314
+ // Good: Background task
316
315
  async function runHeavyTask(): Promise<void> {
317
- // Rust에서 별도 스레드로 처리
316
+ // Process in separate thread in Rust
318
317
  await invoke('heavy_computation', { data: largeData });
319
318
  }
320
319
  ```
321
320
 
322
- ## 디버깅
321
+ ## Debugging
323
322
 
324
323
  ```typescript
325
- // 개발 모드에서만 로깅
324
+ // Good: Logging only in development mode
326
325
  const isDev = import.meta.env.DEV;
327
326
 
328
327
  function debugLog(message: string, data?: unknown): void {
@@ -331,14 +330,14 @@ function debugLog(message: string, data?: unknown): void {
331
330
  }
332
331
  }
333
332
 
334
- // Rust 로그 확인 (터미널에서)
333
+ // Good: Check Rust logs (in terminal)
335
334
  // RUST_LOG=debug npm run tauri dev
336
335
  ```
337
336
 
338
- ## 테스트
337
+ ## Testing
339
338
 
340
339
  ```typescript
341
- // Command Mock
340
+ // Good: Command Mock
342
341
  import { mockIPC } from '@tauri-apps/api/mocks';
343
342
 
344
343
  beforeAll(() => {
@@ -355,12 +354,12 @@ test('greet command', async () => {
355
354
  });
356
355
  ```
357
356
 
358
- ## 체크리스트
357
+ ## Checklist
359
358
 
360
- - [ ] 모든 Command에 타입 정의
361
- - [ ] 이벤트 리스너 cleanup 처리
362
- - [ ] 파일 접근 scope 최소화 (tauri.conf.json)
363
- - [ ] CSP 설정 확인
364
- - [ ] 에러 핸들링 (Rust Frontend)
365
- - [ ] 대용량 데이터 스트리밍 처리
366
- - [ ] 개발/프로덕션 환경 분리
359
+ - [ ] Define types for all Commands
360
+ - [ ] Handle event listener cleanup
361
+ - [ ] Minimize file access scope (tauri.conf.json)
362
+ - [ ] Verify CSP configuration
363
+ - [ ] Error handling (Rust -> Frontend)
364
+ - [ ] Handle large data streaming
365
+ - [ ] Separate development/production environments
@@ -1,23 +1,24 @@
1
- # 🟢 TypeScript + Vue/Nuxt 품질 규칙
1
+ # TypeScript + Vue/Nuxt Quality Rules
2
2
 
3
- ## 핵심 원칙 (core에서 상속)
3
+ ## Core Principles (inherited from core)
4
4
 
5
5
  ```markdown
6
- 단일 책임 (SRP)
7
- 중복 제거 (DRY)
8
- 재사용성
9
- ✅ 낮은 복잡도
10
- 함수 ≤ 30줄, Template ≤ 100줄
11
- 중첩 3단계
12
- Cyclomatic complexity ≤ 10
6
+ # Core Principles (inherited from core)
7
+ Single Responsibility (SRP)
8
+ No Duplication (DRY)
9
+ Reusability
10
+ Low Complexity
11
+ Function <= 30 lines, Template <= 100 lines
12
+ Nesting <= 3 levels
13
+ Cyclomatic complexity <= 10
13
14
  ```
14
15
 
15
- ## Vue 3 + TypeScript 특화 규칙
16
+ ## Vue 3 + TypeScript Specific Rules
16
17
 
17
- ### 1. Composition API 사용 (Options API 지양)
18
+ ### 1. Use Composition API (Avoid Options API)
18
19
 
19
20
  ```typescript
20
- // Options API (레거시)
21
+ // Bad: Options API (legacy)
21
22
  export default {
22
23
  data() {
23
24
  return { count: 0 };
@@ -29,7 +30,7 @@ export default {
29
30
  }
30
31
  };
31
32
 
32
- // Composition API + script setup
33
+ // Good: Composition API + script setup
33
34
  <script setup lang="ts">
34
35
  import { ref, computed, onMounted } from 'vue';
35
36
 
@@ -41,15 +42,15 @@ function increment() {
41
42
  }
42
43
 
43
44
  onMounted(() => {
44
- console.log('컴포넌트 마운트됨');
45
+ console.log('Component mounted');
45
46
  });
46
47
  </script>
47
48
  ```
48
49
 
49
- ### 2. 타입 안전한 Props/Emits
50
+ ### 2. Type-safe Props/Emits
50
51
 
51
52
  ```typescript
52
- // Props 타입 정의
53
+ // Good: Props type definition
53
54
  interface Props {
54
55
  userId: string;
55
56
  title?: string;
@@ -57,10 +58,10 @@ interface Props {
57
58
  }
58
59
 
59
60
  const props = withDefaults(defineProps<Props>(), {
60
- title: '기본 제목',
61
+ title: 'Default Title',
61
62
  });
62
63
 
63
- // Emits 타입 정의
64
+ // Good: Emits type definition
64
65
  interface Emits {
65
66
  (e: 'update', value: string): void;
66
67
  (e: 'delete', id: number): void;
@@ -69,15 +70,15 @@ interface Emits {
69
70
 
70
71
  const emit = defineEmits<Emits>();
71
72
 
72
- // 사용
73
- emit('update', ' ');
73
+ // Usage
74
+ emit('update', 'new value');
74
75
  emit('delete', 123);
75
76
  ```
76
77
 
77
- ### 3. Composables로 로직 분리
78
+ ### 3. Separate Logic with Composables
78
79
 
79
80
  ```typescript
80
- // composables/useUser.ts
81
+ // Good: composables/useUser.ts
81
82
  import { ref, computed } from 'vue';
82
83
  import type { User } from '@/types';
83
84
 
@@ -97,7 +98,7 @@ export function useUser(userId: string) {
97
98
  const response = await api.getUser(userId);
98
99
  user.value = response.data;
99
100
  } catch (e) {
100
- error.value = '사용자를 불러오지 못했습니다';
101
+ error.value = 'Failed to load user';
101
102
  } finally {
102
103
  isLoading.value = false;
103
104
  }
@@ -112,7 +113,7 @@ export function useUser(userId: string) {
112
113
  };
113
114
  }
114
115
 
115
- // 컴포넌트에서 사용
116
+ // Usage in component
116
117
  <script setup lang="ts">
117
118
  const { user, isLoading, fetchUser } = useUser(props.userId);
118
119
 
@@ -120,10 +121,10 @@ onMounted(fetchUser);
120
121
  </script>
121
122
  ```
122
123
 
123
- ### 4. Pinia 상태 관리
124
+ ### 4. Pinia State Management
124
125
 
125
126
  ```typescript
126
- // stores/user.ts
127
+ // Good: stores/user.ts
127
128
  import { defineStore } from 'pinia';
128
129
  import type { User } from '@/types';
129
130
 
@@ -162,7 +163,7 @@ export const useUserStore = defineStore('user', {
162
163
  },
163
164
  });
164
165
 
165
- // Setup Store 스타일 (권장)
166
+ // Setup Store style (recommended)
166
167
  export const useUserStore = defineStore('user', () => {
167
168
  const currentUser = ref<User | null>(null);
168
169
  const isLoggedIn = computed(() => !!currentUser.value);
@@ -175,10 +176,10 @@ export const useUserStore = defineStore('user', () => {
175
176
  });
176
177
  ```
177
178
 
178
- ### 5. Nuxt 3 특화 규칙
179
+ ### 5. Nuxt 3 Specific Rules
179
180
 
180
181
  ```typescript
181
- // Server API Routes (server/api/)
182
+ // Good: Server API Routes (server/api/)
182
183
  // server/api/users/[id].get.ts
183
184
  export default defineEventHandler(async (event) => {
184
185
  const id = getRouterParam(event, 'id');
@@ -186,7 +187,7 @@ export default defineEventHandler(async (event) => {
186
187
  if (!id) {
187
188
  throw createError({
188
189
  statusCode: 400,
189
- message: 'ID 필요합니다',
190
+ message: 'ID is required',
190
191
  });
191
192
  }
192
193
 
@@ -195,28 +196,28 @@ export default defineEventHandler(async (event) => {
195
196
  if (!user) {
196
197
  throw createError({
197
198
  statusCode: 404,
198
- message: '사용자를 찾을 수 없습니다',
199
+ message: 'User not found',
199
200
  });
200
201
  }
201
202
 
202
203
  return user;
203
204
  });
204
205
 
205
- // useFetch / useAsyncData
206
+ // Good: useFetch / useAsyncData
206
207
  <script setup lang="ts">
207
- // SSR 지원 데이터 페칭
208
+ // SSR supported data fetching
208
209
  const { data: user, pending, error } = await useFetch<User>(
209
210
  `/api/users/${props.userId}`
210
211
  );
211
212
 
212
- // 캐싱 지정
213
+ // With caching key
213
214
  const { data: posts } = await useAsyncData(
214
215
  `user-${props.userId}-posts`,
215
216
  () => $fetch(`/api/users/${props.userId}/posts`)
216
217
  );
217
218
  </script>
218
219
 
219
- // Middleware
220
+ // Good: Middleware
220
221
  // middleware/auth.ts
221
222
  export default defineNuxtRouteMiddleware((to, from) => {
222
223
  const { isLoggedIn } = useUserStore();
@@ -227,15 +228,15 @@ export default defineNuxtRouteMiddleware((to, from) => {
227
228
  });
228
229
  ```
229
230
 
230
- ### 6. 컴포넌트 구조
231
+ ### 6. Component Structure
231
232
 
232
233
  ```vue
233
- <!-- 권장 컴포넌트 구조 -->
234
+ <!-- Good: Recommended component structure -->
234
235
  <script setup lang="ts">
235
- // 1. 타입 import
236
+ // 1. Type imports
236
237
  import type { User, Item } from '@/types';
237
238
 
238
- // 2. 컴포넌트 import
239
+ // 2. Component imports
239
240
  import UserAvatar from '@/components/UserAvatar.vue';
240
241
 
241
242
  // 3. Props/Emits
@@ -272,7 +273,7 @@ async function handleSave() {
272
273
 
273
274
  // 8. Lifecycle
274
275
  onMounted(() => {
275
- console.log('컴포넌트 준비됨');
276
+ console.log('Component ready');
276
277
  });
277
278
  </script>
278
279
 
@@ -285,7 +286,7 @@ onMounted(() => {
285
286
  :disabled="!canSave"
286
287
  @click="handleSave"
287
288
  >
288
- 저장
289
+ Save
289
290
  </button>
290
291
  </div>
291
292
  </template>
@@ -298,56 +299,56 @@ onMounted(() => {
298
299
  </style>
299
300
  ```
300
301
 
301
- ## 안티패턴
302
+ ## Anti-patterns
302
303
 
303
304
  ```typescript
304
- // v-if v-for 함께 사용
305
+ // Bad: Using v-if and v-for together
305
306
  <li v-for="user in users" v-if="user.isActive">
306
307
 
307
- // computed로 필터링
308
+ // Good: Filter with computed
308
309
  const activeUsers = computed(() => users.value.filter(u => u.isActive));
309
310
  <li v-for="user in activeUsers">
310
311
 
311
- // Props 직접 수정
312
- props.user.name = ' 이름';
312
+ // Bad: Mutating props directly
313
+ props.user.name = 'New Name';
313
314
 
314
- // emit으로 부모에게 알림
315
- emit('update', { ...props.user, name: ' 이름' });
315
+ // Good: Emit to parent
316
+ emit('update', { ...props.user, name: 'New Name' });
316
317
 
317
- // $refs 남용
318
+ // Bad: Overusing $refs
318
319
  this.$refs.input.focus();
319
320
 
320
- // template ref + expose
321
+ // Good: template ref + expose
321
322
  const inputRef = ref<HTMLInputElement>();
322
323
  defineExpose({ focus: () => inputRef.value?.focus() });
323
324
  ```
324
325
 
325
- ## 파일 구조 (Nuxt 3)
326
+ ## File Structure (Nuxt 3)
326
327
 
327
- ```
328
+ ```text
328
329
  project/
329
330
  ├── components/
330
- │ ├── ui/ # 기본 UI 컴포넌트
331
- │ ├── features/ # 기능별 컴포넌트
332
- │ └── layouts/ # 레이아웃 컴포넌트
333
- ├── composables/ # Composition 함수
334
- ├── stores/ # Pinia 스토어
331
+ │ ├── ui/ # Base UI components
332
+ │ ├── features/ # Feature-specific components
333
+ │ └── layouts/ # Layout components
334
+ ├── composables/ # Composition functions
335
+ ├── stores/ # Pinia stores
335
336
  ├── server/
336
- │ ├── api/ # API 라우트
337
- │ ├── middleware/ # 서버 미들웨어
338
- │ └── utils/ # 서버 유틸리티
339
- ├── pages/ # 파일 기반 라우팅
340
- ├── middleware/ # 클라이언트 미들웨어
341
- ├── types/ # TypeScript 타입
342
- └── utils/ # 유틸리티 함수
337
+ │ ├── api/ # API routes
338
+ │ ├── middleware/ # Server middleware
339
+ │ └── utils/ # Server utilities
340
+ ├── pages/ # File-based routing
341
+ ├── middleware/ # Client middleware
342
+ ├── types/ # TypeScript types
343
+ └── utils/ # Utility functions
343
344
  ```
344
345
 
345
- ## 체크리스트
346
+ ## Checklist
346
347
 
347
- - [ ] Composition API + `<script setup>` 사용
348
- - [ ] Props/Emits 타입 정의
349
- - [ ] Composables로 로직 분리
350
- - [ ] Pinia Setup Store 스타일 사용
351
- - [ ] `any` 타입 사용 금지
352
- - [ ] v-if/v-for 분리
353
- - [ ] scoped 스타일 사용
348
+ - [ ] Use Composition API + `<script setup>`
349
+ - [ ] Define Props/Emits types
350
+ - [ ] Separate logic with Composables
351
+ - [ ] Use Pinia Setup Store style
352
+ - [ ] No `any` type usage
353
+ - [ ] Separate v-if/v-for
354
+ - [ ] Use scoped styles
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@su-record/vibe",
3
- "version": "2.4.71",
3
+ "version": "2.4.74",
4
4
  "description": "Vibe - Claude Code exclusive SPEC-driven AI coding framework with 35+ integrated tools",
5
5
  "type": "module",
6
6
  "main": "dist/cli/index.js",