@su-record/vibe 2.4.72 → 2.4.76

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 (164) 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 -223
  23. package/commands/vibe.spec.md +425 -186
  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/MemoryManager.d.ts +13 -155
  37. package/dist/lib/MemoryManager.d.ts.map +1 -1
  38. package/dist/lib/MemoryManager.js +52 -617
  39. package/dist/lib/MemoryManager.js.map +1 -1
  40. package/dist/lib/gemini-api.js +12 -12
  41. package/dist/lib/gemini-api.js.map +1 -1
  42. package/dist/lib/gemini-oauth.js +22 -22
  43. package/dist/lib/gemini-oauth.js.map +1 -1
  44. package/dist/lib/gemini-storage.js +3 -3
  45. package/dist/lib/gemini-storage.js.map +1 -1
  46. package/dist/lib/gpt-api.js +11 -11
  47. package/dist/lib/gpt-api.js.map +1 -1
  48. package/dist/lib/gpt-oauth.js +28 -28
  49. package/dist/lib/gpt-oauth.js.map +1 -1
  50. package/dist/lib/gpt-storage.js +3 -3
  51. package/dist/lib/gpt-storage.js.map +1 -1
  52. package/dist/lib/memory/KnowledgeGraph.d.ts +34 -0
  53. package/dist/lib/memory/KnowledgeGraph.d.ts.map +1 -0
  54. package/dist/lib/memory/KnowledgeGraph.js +216 -0
  55. package/dist/lib/memory/KnowledgeGraph.js.map +1 -0
  56. package/dist/lib/memory/KnowledgeGraph.test.d.ts +2 -0
  57. package/dist/lib/memory/KnowledgeGraph.test.d.ts.map +1 -0
  58. package/dist/lib/memory/KnowledgeGraph.test.js +189 -0
  59. package/dist/lib/memory/KnowledgeGraph.test.js.map +1 -0
  60. package/dist/lib/memory/MemorySearch.d.ts +25 -0
  61. package/dist/lib/memory/MemorySearch.d.ts.map +1 -0
  62. package/dist/lib/memory/MemorySearch.js +85 -0
  63. package/dist/lib/memory/MemorySearch.js.map +1 -0
  64. package/dist/lib/memory/MemorySearch.test.d.ts +2 -0
  65. package/dist/lib/memory/MemorySearch.test.d.ts.map +1 -0
  66. package/dist/lib/memory/MemorySearch.test.js +149 -0
  67. package/dist/lib/memory/MemorySearch.test.js.map +1 -0
  68. package/dist/lib/memory/MemoryStorage.d.ts +77 -0
  69. package/dist/lib/memory/MemoryStorage.d.ts.map +1 -0
  70. package/dist/lib/memory/MemoryStorage.js +278 -0
  71. package/dist/lib/memory/MemoryStorage.js.map +1 -0
  72. package/dist/lib/memory/MemoryStorage.test.d.ts +2 -0
  73. package/dist/lib/memory/MemoryStorage.test.d.ts.map +1 -0
  74. package/dist/lib/memory/MemoryStorage.test.js +198 -0
  75. package/dist/lib/memory/MemoryStorage.test.js.map +1 -0
  76. package/dist/lib/memory/index.d.ts +4 -0
  77. package/dist/lib/memory/index.d.ts.map +1 -0
  78. package/dist/lib/memory/index.js +8 -0
  79. package/dist/lib/memory/index.js.map +1 -0
  80. package/dist/orchestrator/orchestrator.d.ts.map +1 -1
  81. package/dist/orchestrator/orchestrator.js +4 -6
  82. package/dist/orchestrator/orchestrator.js.map +1 -1
  83. package/dist/tools/convention/analyzeComplexity.d.ts +3 -1
  84. package/dist/tools/convention/analyzeComplexity.d.ts.map +1 -1
  85. package/dist/tools/convention/analyzeComplexity.js +102 -4
  86. package/dist/tools/convention/analyzeComplexity.js.map +1 -1
  87. package/dist/tools/convention/analyzeComplexity.test.d.ts +2 -0
  88. package/dist/tools/convention/analyzeComplexity.test.d.ts.map +1 -0
  89. package/dist/tools/convention/analyzeComplexity.test.js +207 -0
  90. package/dist/tools/convention/analyzeComplexity.test.js.map +1 -0
  91. package/dist/tools/convention/applyQualityRules.js +1 -1
  92. package/dist/tools/convention/applyQualityRules.js.map +1 -1
  93. package/dist/tools/convention/checkCouplingCohesion.js +2 -2
  94. package/dist/tools/convention/checkCouplingCohesion.js.map +1 -1
  95. package/dist/tools/convention/suggestImprovements.js +1 -1
  96. package/dist/tools/convention/suggestImprovements.js.map +1 -1
  97. package/dist/tools/convention/validateCodeQuality.d.ts +3 -1
  98. package/dist/tools/convention/validateCodeQuality.d.ts.map +1 -1
  99. package/dist/tools/convention/validateCodeQuality.js +145 -2
  100. package/dist/tools/convention/validateCodeQuality.js.map +1 -1
  101. package/dist/tools/convention/validateCodeQuality.test.d.ts +2 -0
  102. package/dist/tools/convention/validateCodeQuality.test.d.ts.map +1 -0
  103. package/dist/tools/convention/validateCodeQuality.test.js +230 -0
  104. package/dist/tools/convention/validateCodeQuality.test.js.map +1 -0
  105. package/dist/tools/memory/autoSaveContext.js +1 -1
  106. package/dist/tools/memory/autoSaveContext.js.map +1 -1
  107. package/dist/tools/memory/createMemoryTimeline.js +27 -27
  108. package/dist/tools/memory/createMemoryTimeline.js.map +1 -1
  109. package/dist/tools/memory/deleteMemory.js +1 -1
  110. package/dist/tools/memory/deleteMemory.js.map +1 -1
  111. package/dist/tools/memory/getMemoryGraph.js +24 -24
  112. package/dist/tools/memory/getMemoryGraph.js.map +1 -1
  113. package/dist/tools/memory/getSessionContext.js +36 -36
  114. package/dist/tools/memory/getSessionContext.js.map +1 -1
  115. package/dist/tools/memory/linkMemories.js +21 -21
  116. package/dist/tools/memory/linkMemories.js.map +1 -1
  117. package/dist/tools/memory/prioritizeMemory.js +1 -1
  118. package/dist/tools/memory/prioritizeMemory.js.map +1 -1
  119. package/dist/tools/memory/restoreSessionContext.js +1 -1
  120. package/dist/tools/memory/restoreSessionContext.js.map +1 -1
  121. package/dist/tools/memory/searchMemories.js +1 -1
  122. package/dist/tools/memory/searchMemories.js.map +1 -1
  123. package/dist/tools/memory/searchMemoriesAdvanced.js +42 -42
  124. package/dist/tools/memory/searchMemoriesAdvanced.js.map +1 -1
  125. package/dist/tools/memory/startSession.js +2 -2
  126. package/dist/tools/memory/startSession.js.map +1 -1
  127. package/dist/tools/memory/updateMemory.js +1 -1
  128. package/dist/tools/memory/updateMemory.js.map +1 -1
  129. package/dist/tools/semantic/analyzeDependencyGraph.js +38 -38
  130. package/dist/tools/semantic/analyzeDependencyGraph.js.map +1 -1
  131. package/dist/tools/semantic/findReferences.js +1 -1
  132. package/dist/tools/semantic/findReferences.js.map +1 -1
  133. package/dist/tools/semantic/findSymbol.js +1 -1
  134. package/dist/tools/semantic/findSymbol.js.map +1 -1
  135. package/dist/tools/time/getCurrentTime.js +1 -1
  136. package/dist/tools/time/getCurrentTime.js.map +1 -1
  137. package/dist/tools/ui/previewUiAscii.js +2 -2
  138. package/dist/tools/ui/previewUiAscii.js.map +1 -1
  139. package/hooks/hooks.json +11 -2
  140. package/hooks/scripts/llm-orchestrate.js +1 -1
  141. package/hooks/scripts/utils.js +31 -6
  142. package/languages/csharp-unity.md +82 -83
  143. package/languages/dart-flutter.md +89 -88
  144. package/languages/go.md +76 -75
  145. package/languages/java-spring.md +85 -84
  146. package/languages/kotlin-android.md +64 -63
  147. package/languages/python-django.md +83 -82
  148. package/languages/python-fastapi.md +82 -81
  149. package/languages/rust.md +75 -74
  150. package/languages/swift-ios.md +73 -72
  151. package/languages/typescript-electron.md +70 -71
  152. package/languages/typescript-nextjs.md +93 -92
  153. package/languages/typescript-node.md +64 -63
  154. package/languages/typescript-nuxt.md +113 -112
  155. package/languages/typescript-react-native.md +82 -81
  156. package/languages/typescript-react.md +76 -75
  157. package/languages/typescript-tauri.md +74 -75
  158. package/languages/typescript-vue.md +73 -72
  159. package/package.json +1 -1
  160. package/skills/git-worktree.md +25 -25
  161. package/skills/multi-llm-orchestration.md +4 -6
  162. package/skills/priority-todos.md +39 -39
  163. package/skills/vibe-capabilities.md +2 -2
  164. package/vibe/config.json +2 -2
@@ -1,28 +1,29 @@
1
- # ⚛️ TypeScript + React 품질 규칙
1
+ # TypeScript + React 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
- ## TypeScript/React 특화 규칙
16
+ ## TypeScript/React Specific Rules
16
17
 
17
- ### 1. 타입 안전성 100%
18
+ ### 1. 100% Type Safety
18
19
 
19
20
  ```typescript
20
- // any 사용
21
+ // Bad: Using any
21
22
  function processData(data: any) {
22
23
  return data.value;
23
24
  }
24
25
 
25
- // 명확한 타입 정의
26
+ // Good: Clear type definition
26
27
  interface User {
27
28
  id: string;
28
29
  name: string;
@@ -34,7 +35,7 @@ function processUser(user: User): string {
34
35
  return user.name;
35
36
  }
36
37
 
37
- // Generic 활용
38
+ // Good: Generic usage
38
39
  interface ApiResponse<T> {
39
40
  success: boolean;
40
41
  data: T;
@@ -45,10 +46,10 @@ type UserResponse = ApiResponse<User>;
45
46
  type ProductResponse = ApiResponse<Product>;
46
47
  ```
47
48
 
48
- ### 2. 함수형 컴포넌트 + Hooks
49
+ ### 2. Functional Components + Hooks
49
50
 
50
51
  ```typescript
51
- // 함수형 컴포넌트 (권장)
52
+ // Good: Functional component (recommended)
52
53
  interface UserCardProps {
53
54
  user: User;
54
55
  onEdit?: (user: User) => void;
@@ -71,16 +72,16 @@ export function UserCard({ user, onEdit }: UserCardProps) {
71
72
  );
72
73
  }
73
74
 
74
- // 클래스 컴포넌트 (레거시)
75
+ // Bad: Class component (legacy)
75
76
  class UserCard extends React.Component<UserCardProps> {
76
- // 복잡하고 장황함
77
+ // Complex and verbose
77
78
  }
78
79
  ```
79
80
 
80
- ### 3. Custom Hook으로 로직 분리
81
+ ### 3. Separate Logic with Custom Hooks
81
82
 
82
83
  ```typescript
83
- // Custom Hook (재사용 가능한 로직)
84
+ // Good: Custom Hook (reusable logic)
84
85
  interface UseUserOptions {
85
86
  userId: string;
86
87
  }
@@ -119,7 +120,7 @@ function useUser({ userId }: UseUserOptions): UseUserReturn {
119
120
  return { user, isLoading, error, refetch: fetchUser };
120
121
  }
121
122
 
122
- // 사용
123
+ // Usage
123
124
  function UserProfile({ userId }: { userId: string }) {
124
125
  const { user, isLoading, error } = useUser({ userId });
125
126
 
@@ -131,10 +132,10 @@ function UserProfile({ userId }: { userId: string }) {
131
132
  }
132
133
  ```
133
134
 
134
- ### 4. Props 타입 정의
135
+ ### 4. Props Type Definition
135
136
 
136
137
  ```typescript
137
- // Props 타입 명확히
138
+ // Good: Clear Props types
138
139
  interface ButtonProps {
139
140
  variant?: 'primary' | 'secondary' | 'danger';
140
141
  size?: 'sm' | 'md' | 'lg';
@@ -163,7 +164,7 @@ export function Button({
163
164
  );
164
165
  }
165
166
 
166
- // PropsWithChildren 활용
167
+ // Good: Using PropsWithChildren
167
168
  import { PropsWithChildren } from 'react';
168
169
 
169
170
  interface CardProps {
@@ -186,17 +187,17 @@ export function Card({
186
187
  }
187
188
  ```
188
189
 
189
- ### 5. React Query (서버 상태 관리)
190
+ ### 5. React Query (Server State Management)
190
191
 
191
192
  ```typescript
192
- // React Query로 서버 상태 관리
193
+ // Good: Server state management with React Query
193
194
  import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
194
195
 
195
196
  function useUser(userId: string) {
196
197
  return useQuery({
197
198
  queryKey: ['user', userId],
198
199
  queryFn: () => fetchUser(userId),
199
- staleTime: 5 * 60 * 1000, // 5
200
+ staleTime: 5 * 60 * 1000, // 5 minutes
200
201
  });
201
202
  }
202
203
 
@@ -206,13 +207,13 @@ function useUpdateUser() {
206
207
  return useMutation({
207
208
  mutationFn: (data: UpdateUserData) => updateUser(data),
208
209
  onSuccess: (updatedUser) => {
209
- // 캐시 업데이트
210
+ // Update cache
210
211
  queryClient.setQueryData(['user', updatedUser.id], updatedUser);
211
212
  },
212
213
  });
213
214
  }
214
215
 
215
- // 사용
216
+ // Usage
216
217
  function UserProfile({ userId }: { userId: string }) {
217
218
  const { data: user, isLoading, error } = useUser(userId);
218
219
  const updateMutation = useUpdateUser();
@@ -234,10 +235,10 @@ function UserProfile({ userId }: { userId: string }) {
234
235
  }
235
236
  ```
236
237
 
237
- ### 6. Zod로 Contract 정의
238
+ ### 6. Define Contract with Zod
238
239
 
239
240
  ```typescript
240
- // Zod 스키마 (런타임 + 타입 검증)
241
+ // Good: Zod schema (runtime + type validation)
241
242
  import { z } from 'zod';
242
243
 
243
244
  const createUserSchema = z.object({
@@ -249,7 +250,7 @@ const createUserSchema = z.object({
249
250
 
250
251
  type CreateUserRequest = z.infer<typeof createUserSchema>;
251
252
 
252
- // 사용 (React Hook Form)
253
+ // Usage (React Hook Form)
253
254
  import { useForm } from 'react-hook-form';
254
255
  import { zodResolver } from '@hookform/resolvers/zod';
255
256
 
@@ -288,28 +289,28 @@ function SignUpForm() {
288
289
  }
289
290
  ```
290
291
 
291
- ### 7. 컴포넌트 분리 (Extract Component)
292
+ ### 7. Component Separation (Extract Component)
292
293
 
293
294
  ```typescript
294
- // JSX (80)
295
+ // Bad: Long JSX (80 lines)
295
296
  function UserDashboard() {
296
297
  return (
297
298
  <div>
298
299
  <header>
299
300
  <h1>Dashboard</h1>
300
- {/* 20 */}
301
+ {/* 20 lines */}
301
302
  </header>
302
303
  <main>
303
- {/* 40 */}
304
+ {/* 40 lines */}
304
305
  </main>
305
306
  <footer>
306
- {/* 20 */}
307
+ {/* 20 lines */}
307
308
  </footer>
308
309
  </div>
309
310
  );
310
311
  }
311
312
 
312
- // 서브 컴포넌트 분리
313
+ // Good: Separate into sub-components
313
314
  function UserDashboard() {
314
315
  return (
315
316
  <div>
@@ -333,14 +334,14 @@ function DashboardFooter() {
333
334
  }
334
335
  ```
335
336
 
336
- ### 8. useCallback + useMemo 최적화
337
+ ### 8. useCallback + useMemo Optimization
337
338
 
338
339
  ```typescript
339
- // useCallback (함수 메모이제이션)
340
+ // Good: useCallback (function memoization)
340
341
  function Parent() {
341
342
  const [count, setCount] = useState(0);
342
343
 
343
- // 매번 함수 생성 방지
344
+ // Prevent creating new function every render
344
345
  const handleClick = useCallback(() => {
345
346
  setCount(prev => prev + 1);
346
347
  }, []);
@@ -352,7 +353,7 @@ const Child = React.memo<{ onClick: () => void }>(({ onClick }) => {
352
353
  return <button onClick={onClick}>Click</button>;
353
354
  });
354
355
 
355
- // useMemo ( 메모이제이션)
356
+ // Good: useMemo (value memoization)
356
357
  function ExpensiveComponent({ data }: { data: number[] }) {
357
358
  const processedData = useMemo(() => {
358
359
  return data
@@ -368,7 +369,7 @@ function ExpensiveComponent({ data }: { data: number[] }) {
368
369
  ### 9. Error Boundary
369
370
 
370
371
  ```typescript
371
- // Error Boundary (클래스 컴포넌트 필수)
372
+ // Good: Error Boundary (class component required)
372
373
  interface ErrorBoundaryProps {
373
374
  children: React.ReactNode;
374
375
  fallback?: React.ReactNode;
@@ -405,7 +406,7 @@ class ErrorBoundary extends React.Component<
405
406
  }
406
407
  }
407
408
 
408
- // 사용
409
+ // Usage
409
410
  function App() {
410
411
  return (
411
412
  <ErrorBoundary fallback={<ErrorPage />}>
@@ -415,10 +416,10 @@ function App() {
415
416
  }
416
417
  ```
417
418
 
418
- ### 10. 타입 가드 활용
419
+ ### 10. Type Guards
419
420
 
420
421
  ```typescript
421
- // 타입 가드
422
+ // Good: Type guards
422
423
  interface Dog {
423
424
  type: 'dog';
424
425
  bark: () => void;
@@ -437,13 +438,13 @@ function isDog(animal: Animal): animal is Dog {
437
438
 
438
439
  function makeSound(animal: Animal) {
439
440
  if (isDog(animal)) {
440
- animal.bark(); // 타입 안전
441
+ animal.bark(); // Type safe
441
442
  } else {
442
- animal.meow(); // 타입 안전
443
+ animal.meow(); // Type safe
443
444
  }
444
445
  }
445
446
 
446
- // Discriminated Union
447
+ // Good: Discriminated Union
447
448
  function AnimalCard({ animal }: { animal: Animal }) {
448
449
  switch (animal.type) {
449
450
  case 'dog':
@@ -454,46 +455,46 @@ function AnimalCard({ animal }: { animal: Animal }) {
454
455
  }
455
456
  ```
456
457
 
457
- ## 안티패턴
458
+ ## Anti-patterns
458
459
 
459
460
  ```typescript
460
- // Props drilling (3단계 이상)
461
+ // Bad: Props drilling (3+ levels)
461
462
  <GrandParent user={user}>
462
463
  <Parent user={user}>
463
464
  <Child user={user} />
464
465
  </Parent>
465
466
  </GrandParent>
466
467
 
467
- // Context 사용
468
+ // Good: Use Context
468
469
  const UserContext = createContext<User | undefined>(undefined);
469
470
 
470
471
  <UserContext.Provider value={user}>
471
472
  <GrandParent />
472
473
  </UserContext.Provider>
473
474
 
474
- // useEffect 의존성 누락
475
+ // Bad: Missing useEffect dependency
475
476
  useEffect(() => {
476
477
  fetchUser(userId);
477
- }, []); // userId 의존성 누락!
478
+ }, []); // userId dependency missing!
478
479
 
479
- // 모든 의존성 명시
480
+ // Good: Specify all dependencies
480
481
  useEffect(() => {
481
482
  fetchUser(userId);
482
483
  }, [userId]);
483
484
 
484
- // 인라인 객체/함수 (리렌더 유발)
485
+ // Bad: Inline objects/functions (cause re-renders)
485
486
  <Child config={{ theme: 'dark' }} onClick={() => {}} />
486
487
 
487
- // useMemo/useCallback
488
+ // Good: useMemo/useCallback
488
489
  const config = useMemo(() => ({ theme: 'dark' }), []);
489
490
  const handleClick = useCallback(() => {}, []);
490
491
  <Child config={config} onClick={handleClick} />
491
492
  ```
492
493
 
493
- ## 코드 품질 도구
494
+ ## Code Quality Tools
494
495
 
495
496
  ```bash
496
- # TypeScript 컴파일
497
+ # TypeScript compile
497
498
  tsc --noEmit
498
499
 
499
500
  # ESLint
@@ -502,24 +503,24 @@ eslint src/ --ext .ts,.tsx
502
503
  # Prettier
503
504
  prettier --write src/
504
505
 
505
- # 테스트
506
+ # Testing
506
507
  vitest
507
508
  # or
508
509
  jest
509
510
  ```
510
511
 
511
- ## 체크리스트
512
-
513
- TypeScript/React 코드 작성 시:
514
-
515
- - [ ] 타입 안전성 100% (no any)
516
- - [ ] 함수형 컴포넌트 + Hooks
517
- - [ ] Custom Hook으로 로직 분리
518
- - [ ] Props 타입 명확히 정의
519
- - [ ] React Query로 서버 상태 관리
520
- - [ ] Zod로 Contract 정의
521
- - [ ] JSX 50 (컴포넌트 분리)
522
- - [ ] useCallback/useMemo 최적화
523
- - [ ] Error Boundary 사용
524
- - [ ] 타입 가드 활용
525
- - [ ] 복잡도 10
512
+ ## Checklist
513
+
514
+ When writing TypeScript/React code:
515
+
516
+ - [ ] 100% type safety (no any)
517
+ - [ ] Functional components + Hooks
518
+ - [ ] Separate logic with Custom Hook
519
+ - [ ] Clear Props type definition
520
+ - [ ] Server state with React Query
521
+ - [ ] Define Contract with Zod
522
+ - [ ] JSX <= 50 lines (component separation)
523
+ - [ ] useCallback/useMemo optimization
524
+ - [ ] Use Error Boundary
525
+ - [ ] Use type guards
526
+ - [ ] Complexity <= 10