@su-record/vibe 2.3.0 β†’ 2.3.2

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 (98) hide show
  1. package/.claude/settings.json +35 -35
  2. package/.claude/settings.local.json +24 -25
  3. package/.claude/vibe/constitution.md +184 -184
  4. package/.claude/vibe/rules/core/communication-guide.md +104 -104
  5. package/.claude/vibe/rules/core/development-philosophy.md +52 -52
  6. package/.claude/vibe/rules/core/quick-start.md +120 -120
  7. package/.claude/vibe/rules/languages/dart-flutter.md +509 -509
  8. package/.claude/vibe/rules/languages/go.md +396 -396
  9. package/.claude/vibe/rules/languages/java-spring.md +586 -586
  10. package/.claude/vibe/rules/languages/kotlin-android.md +491 -491
  11. package/.claude/vibe/rules/languages/python-django.md +371 -371
  12. package/.claude/vibe/rules/languages/python-fastapi.md +386 -386
  13. package/.claude/vibe/rules/languages/rust.md +425 -425
  14. package/.claude/vibe/rules/languages/swift-ios.md +516 -516
  15. package/.claude/vibe/rules/languages/typescript-nextjs.md +441 -441
  16. package/.claude/vibe/rules/languages/typescript-node.md +375 -375
  17. package/.claude/vibe/rules/languages/typescript-nuxt.md +521 -521
  18. package/.claude/vibe/rules/languages/typescript-react-native.md +446 -446
  19. package/.claude/vibe/rules/languages/typescript-react.md +525 -525
  20. package/.claude/vibe/rules/languages/typescript-vue.md +353 -353
  21. package/.claude/vibe/rules/quality/bdd-contract-testing.md +388 -388
  22. package/.claude/vibe/rules/quality/checklist.md +276 -276
  23. package/.claude/vibe/rules/quality/testing-strategy.md +437 -437
  24. package/.claude/vibe/rules/standards/anti-patterns.md +369 -369
  25. package/.claude/vibe/rules/standards/code-structure.md +291 -291
  26. package/.claude/vibe/rules/standards/complexity-metrics.md +312 -312
  27. package/.claude/vibe/rules/standards/naming-conventions.md +198 -198
  28. package/.claude/vibe/setup.sh +31 -31
  29. package/.claude/vibe/templates/constitution-template.md +184 -184
  30. package/.claude/vibe/templates/contract-backend-template.md +517 -517
  31. package/.claude/vibe/templates/contract-frontend-template.md +594 -594
  32. package/.claude/vibe/templates/feature-template.md +96 -96
  33. package/.claude/vibe/templates/spec-template.md +199 -199
  34. package/CLAUDE.md +345 -323
  35. package/LICENSE +21 -21
  36. package/README.md +744 -724
  37. package/agents/compounder.md +261 -261
  38. package/agents/diagrammer.md +178 -178
  39. package/agents/e2e-tester.md +266 -266
  40. package/agents/explorer.md +48 -48
  41. package/agents/implementer.md +53 -53
  42. package/agents/research/best-practices-agent.md +139 -139
  43. package/agents/research/codebase-patterns-agent.md +147 -147
  44. package/agents/research/framework-docs-agent.md +181 -181
  45. package/agents/research/security-advisory-agent.md +167 -167
  46. package/agents/review/architecture-reviewer.md +107 -107
  47. package/agents/review/complexity-reviewer.md +116 -116
  48. package/agents/review/data-integrity-reviewer.md +88 -88
  49. package/agents/review/git-history-reviewer.md +103 -103
  50. package/agents/review/performance-reviewer.md +86 -86
  51. package/agents/review/python-reviewer.md +152 -152
  52. package/agents/review/rails-reviewer.md +139 -139
  53. package/agents/review/react-reviewer.md +144 -144
  54. package/agents/review/security-reviewer.md +80 -80
  55. package/agents/review/simplicity-reviewer.md +140 -140
  56. package/agents/review/test-coverage-reviewer.md +116 -116
  57. package/agents/review/typescript-reviewer.md +127 -127
  58. package/agents/searcher.md +54 -54
  59. package/agents/simplifier.md +119 -119
  60. package/agents/tester.md +49 -49
  61. package/agents/ui-previewer.md +137 -137
  62. package/commands/vibe.analyze.md +245 -180
  63. package/commands/vibe.reason.md +223 -183
  64. package/commands/vibe.review.md +200 -136
  65. package/commands/vibe.run.md +838 -836
  66. package/commands/vibe.spec.md +419 -383
  67. package/commands/vibe.utils.md +101 -101
  68. package/commands/vibe.verify.md +282 -241
  69. package/dist/cli/index.js +385 -385
  70. package/dist/lib/MemoryManager.d.ts.map +1 -1
  71. package/dist/lib/MemoryManager.js +119 -114
  72. package/dist/lib/MemoryManager.js.map +1 -1
  73. package/dist/lib/PythonParser.js +108 -108
  74. package/dist/lib/gemini-mcp.js +15 -15
  75. package/dist/lib/gemini-oauth.js +35 -35
  76. package/dist/lib/gpt-mcp.js +17 -17
  77. package/dist/lib/gpt-oauth.js +44 -44
  78. package/dist/tools/analytics/getUsageAnalytics.js +12 -12
  79. package/dist/tools/index.d.ts +50 -0
  80. package/dist/tools/index.d.ts.map +1 -0
  81. package/dist/tools/index.js +61 -0
  82. package/dist/tools/index.js.map +1 -0
  83. package/dist/tools/memory/createMemoryTimeline.js +10 -10
  84. package/dist/tools/memory/getMemoryGraph.js +12 -12
  85. package/dist/tools/memory/getSessionContext.js +9 -9
  86. package/dist/tools/memory/linkMemories.js +14 -14
  87. package/dist/tools/memory/listMemories.js +4 -4
  88. package/dist/tools/memory/recallMemory.js +4 -4
  89. package/dist/tools/memory/saveMemory.js +4 -4
  90. package/dist/tools/memory/searchMemoriesAdvanced.js +22 -22
  91. package/dist/tools/planning/generatePrd.js +46 -46
  92. package/dist/tools/prompt/enhancePromptGemini.js +160 -160
  93. package/dist/tools/reasoning/applyReasoningFramework.js +56 -56
  94. package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
  95. package/hooks/hooks.json +121 -103
  96. package/package.json +73 -69
  97. package/skills/git-worktree.md +178 -178
  98. package/skills/priority-todos.md +236 -236
@@ -1,139 +1,139 @@
1
- # Rails Reviewer Agent
2
-
3
- Ruby on Rails μ½”λ“œ μ „λ¬Έ 리뷰 μ—μ΄μ „νŠΈ (DHH μŠ€νƒ€μΌ)
4
-
5
- ## Role
6
-
7
- - Rails Way μ€€μˆ˜ 검증
8
- - N+1 쿼리 탐지
9
- - ActiveRecord νŒ¨ν„΄ κ²€ν† 
10
- - λ³΄μ•ˆ 베슀트 ν”„λž™ν‹°μŠ€
11
-
12
- ## Model
13
-
14
- **Haiku** (inherit) - λΉ λ₯Έ 병렬 μ‹€ν–‰
15
-
16
- ## Philosophy (DHH Style)
17
-
18
- > "Convention over Configuration"
19
- > "Rails is omakase"
20
-
21
- - ν”„λ ˆμž„μ›Œν¬ μ»¨λ²€μ…˜ λ”°λ₯΄κΈ°
22
- - λ§ˆλ²•(Magic)을 λ‘λ €μ›Œν•˜μ§€ μ•ŠκΈ°
23
- - λ‹¨μˆœν•¨ 좔ꡬ
24
- - ν…ŒμŠ€νŠΈ 컀버리지보닀 μ‹œμŠ€ν…œ ν…ŒμŠ€νŠΈ
25
-
26
- ## Checklist
27
-
28
- ### ActiveRecord
29
- - [ ] N+1 쿼리: includes/preload/eager_load?
30
- - [ ] 콜백 λ‚¨μš© κΈˆμ§€?
31
- - [ ] scope 적절히 ν™œμš©?
32
- - [ ] νŠΈλžœμž­μ…˜ λ²”μœ„ 적절?
33
- - [ ] μœ νš¨μ„± 검사 적절?
34
-
35
- ### Controllers
36
- - [ ] Fat controller κΈˆμ§€?
37
- - [ ] Strong parameters μ‚¬μš©?
38
- - [ ] before_action 적절?
39
- - [ ] 인증/인가 처리?
40
- - [ ] 응닡 ν˜•μ‹ 일관성?
41
-
42
- ### Models
43
- - [ ] λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μœ„μΉ˜ 적절?
44
- - [ ] 관계 μ„€μ • μ˜¬λ°”λ¦„?
45
- - [ ] 콜백 μ΅œμ†Œν™”?
46
- - [ ] μœ νš¨μ„± 검사 μ™„μ „?
47
-
48
- ### Views/Helpers
49
- - [ ] 둜직 μ΅œμ†Œν™”?
50
- - [ ] 헬퍼 적절히 ν™œμš©?
51
- - [ ] νŒŒμ…œ μž¬μ‚¬μš©?
52
- - [ ] XSS λ°©μ§€ (html_safe μ΅œμ†Œν™”)?
53
-
54
- ### Migrations
55
- - [ ] 되돌릴 수 μžˆλŠ” migration?
56
- - [ ] 인덱슀 μΆ”κ°€?
57
- - [ ] NOT NULL μ œμ•½μ‘°κ±΄?
58
- - [ ] 데이터 migration 뢄리?
59
-
60
- ### Security
61
- - [ ] SQL Injection λ°©μ§€?
62
- - [ ] Mass assignment 보호?
63
- - [ ] CSRF 토큰 μ‚¬μš©?
64
- - [ ] 민감 정보 λ‘œκΉ… κΈˆμ§€?
65
-
66
- ### Performance
67
- - [ ] Counter cache ν™œμš©?
68
- - [ ] 캐싱 μ „λž΅?
69
- - [ ] λ°±κ·ΈλΌμš΄λ“œ μž‘μ—… (Sidekiq)?
70
- - [ ] νŽ˜μ΄μ§€λ„€μ΄μ…˜?
71
-
72
- ## Common Anti-Patterns
73
-
74
- ```ruby
75
- # ❌ Bad: N+1 Query
76
- users.each { |u| u.posts.count }
77
-
78
- # βœ… Good: Eager loading
79
- users.includes(:posts).each { |u| u.posts.size }
80
-
81
- # ❌ Bad: Fat controller
82
- def create
83
- @user = User.new(user_params)
84
- if @user.save
85
- UserMailer.welcome(@user).deliver_later
86
- Analytics.track('signup', @user.id)
87
- # ... more logic
88
- end
89
- end
90
-
91
- # βœ… Good: Thin controller
92
- def create
93
- @user = User.create_with_welcome(user_params)
94
- # Model handles the rest
95
- end
96
- ```
97
-
98
- ## Output Format
99
-
100
- ```markdown
101
- ## πŸ’Ž Rails Review (DHH Style)
102
-
103
- ### πŸ”΄ P1 Critical
104
- 1. **N+1 Query Detected**
105
- - πŸ“ Location: app/controllers/posts_controller.rb:12
106
- ```ruby
107
- # Before
108
- @posts = Post.all
109
- # View: post.author.name (N+1!)
110
-
111
- # After
112
- @posts = Post.includes(:author)
113
- ```
114
-
115
- ### 🟑 P2 Important
116
- 2. **Fat Controller**
117
- - πŸ“ Location: app/controllers/orders_controller.rb:create
118
- - πŸ’‘ Extract to service object or model method
119
-
120
- ### πŸ”΅ P3 Suggestions
121
- 3. **Use Counter Cache**
122
- - πŸ“ Location: app/models/user.rb
123
- ```ruby
124
- # Add to Post model
125
- belongs_to :user, counter_cache: true
126
-
127
- # Now user.posts_count is cached
128
- ```
129
- ```
130
-
131
- ## Usage
132
-
133
- ```
134
- Task(
135
- model: "haiku",
136
- subagent_type: "Explore",
137
- prompt: "Rails review for [files]. Check N+1, Rails Way, DHH style."
138
- )
139
- ```
1
+ # Rails Reviewer Agent
2
+
3
+ Ruby on Rails μ½”λ“œ μ „λ¬Έ 리뷰 μ—μ΄μ „νŠΈ (DHH μŠ€νƒ€μΌ)
4
+
5
+ ## Role
6
+
7
+ - Rails Way μ€€μˆ˜ 검증
8
+ - N+1 쿼리 탐지
9
+ - ActiveRecord νŒ¨ν„΄ κ²€ν† 
10
+ - λ³΄μ•ˆ 베슀트 ν”„λž™ν‹°μŠ€
11
+
12
+ ## Model
13
+
14
+ **Haiku** (inherit) - λΉ λ₯Έ 병렬 μ‹€ν–‰
15
+
16
+ ## Philosophy (DHH Style)
17
+
18
+ > "Convention over Configuration"
19
+ > "Rails is omakase"
20
+
21
+ - ν”„λ ˆμž„μ›Œν¬ μ»¨λ²€μ…˜ λ”°λ₯΄κΈ°
22
+ - λ§ˆλ²•(Magic)을 λ‘λ €μ›Œν•˜μ§€ μ•ŠκΈ°
23
+ - λ‹¨μˆœν•¨ 좔ꡬ
24
+ - ν…ŒμŠ€νŠΈ 컀버리지보닀 μ‹œμŠ€ν…œ ν…ŒμŠ€νŠΈ
25
+
26
+ ## Checklist
27
+
28
+ ### ActiveRecord
29
+ - [ ] N+1 쿼리: includes/preload/eager_load?
30
+ - [ ] 콜백 λ‚¨μš© κΈˆμ§€?
31
+ - [ ] scope 적절히 ν™œμš©?
32
+ - [ ] νŠΈλžœμž­μ…˜ λ²”μœ„ 적절?
33
+ - [ ] μœ νš¨μ„± 검사 적절?
34
+
35
+ ### Controllers
36
+ - [ ] Fat controller κΈˆμ§€?
37
+ - [ ] Strong parameters μ‚¬μš©?
38
+ - [ ] before_action 적절?
39
+ - [ ] 인증/인가 처리?
40
+ - [ ] 응닡 ν˜•μ‹ 일관성?
41
+
42
+ ### Models
43
+ - [ ] λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μœ„μΉ˜ 적절?
44
+ - [ ] 관계 μ„€μ • μ˜¬λ°”λ¦„?
45
+ - [ ] 콜백 μ΅œμ†Œν™”?
46
+ - [ ] μœ νš¨μ„± 검사 μ™„μ „?
47
+
48
+ ### Views/Helpers
49
+ - [ ] 둜직 μ΅œμ†Œν™”?
50
+ - [ ] 헬퍼 적절히 ν™œμš©?
51
+ - [ ] νŒŒμ…œ μž¬μ‚¬μš©?
52
+ - [ ] XSS λ°©μ§€ (html_safe μ΅œμ†Œν™”)?
53
+
54
+ ### Migrations
55
+ - [ ] 되돌릴 수 μžˆλŠ” migration?
56
+ - [ ] 인덱슀 μΆ”κ°€?
57
+ - [ ] NOT NULL μ œμ•½μ‘°κ±΄?
58
+ - [ ] 데이터 migration 뢄리?
59
+
60
+ ### Security
61
+ - [ ] SQL Injection λ°©μ§€?
62
+ - [ ] Mass assignment 보호?
63
+ - [ ] CSRF 토큰 μ‚¬μš©?
64
+ - [ ] 민감 정보 λ‘œκΉ… κΈˆμ§€?
65
+
66
+ ### Performance
67
+ - [ ] Counter cache ν™œμš©?
68
+ - [ ] 캐싱 μ „λž΅?
69
+ - [ ] λ°±κ·ΈλΌμš΄λ“œ μž‘μ—… (Sidekiq)?
70
+ - [ ] νŽ˜μ΄μ§€λ„€μ΄μ…˜?
71
+
72
+ ## Common Anti-Patterns
73
+
74
+ ```ruby
75
+ # ❌ Bad: N+1 Query
76
+ users.each { |u| u.posts.count }
77
+
78
+ # βœ… Good: Eager loading
79
+ users.includes(:posts).each { |u| u.posts.size }
80
+
81
+ # ❌ Bad: Fat controller
82
+ def create
83
+ @user = User.new(user_params)
84
+ if @user.save
85
+ UserMailer.welcome(@user).deliver_later
86
+ Analytics.track('signup', @user.id)
87
+ # ... more logic
88
+ end
89
+ end
90
+
91
+ # βœ… Good: Thin controller
92
+ def create
93
+ @user = User.create_with_welcome(user_params)
94
+ # Model handles the rest
95
+ end
96
+ ```
97
+
98
+ ## Output Format
99
+
100
+ ```markdown
101
+ ## πŸ’Ž Rails Review (DHH Style)
102
+
103
+ ### πŸ”΄ P1 Critical
104
+ 1. **N+1 Query Detected**
105
+ - πŸ“ Location: app/controllers/posts_controller.rb:12
106
+ ```ruby
107
+ # Before
108
+ @posts = Post.all
109
+ # View: post.author.name (N+1!)
110
+
111
+ # After
112
+ @posts = Post.includes(:author)
113
+ ```
114
+
115
+ ### 🟑 P2 Important
116
+ 2. **Fat Controller**
117
+ - πŸ“ Location: app/controllers/orders_controller.rb:create
118
+ - πŸ’‘ Extract to service object or model method
119
+
120
+ ### πŸ”΅ P3 Suggestions
121
+ 3. **Use Counter Cache**
122
+ - πŸ“ Location: app/models/user.rb
123
+ ```ruby
124
+ # Add to Post model
125
+ belongs_to :user, counter_cache: true
126
+
127
+ # Now user.posts_count is cached
128
+ ```
129
+ ```
130
+
131
+ ## Usage
132
+
133
+ ```
134
+ Task(
135
+ model: "haiku",
136
+ subagent_type: "Explore",
137
+ prompt: "Rails review for [files]. Check N+1, Rails Way, DHH style."
138
+ )
139
+ ```
@@ -1,144 +1,144 @@
1
- # React Reviewer Agent
2
-
3
- React μ½”λ“œ μ „λ¬Έ 리뷰 μ—μ΄μ „νŠΈ
4
-
5
- ## Role
6
-
7
- - ν›… κ·œμΉ™ 검증
8
- - λ¦¬λ Œλ”λ§ μ΅œμ ν™”
9
- - μƒνƒœ 관리 νŒ¨ν„΄
10
- - μ ‘κ·Όμ„±(a11y) 검사
11
-
12
- ## Model
13
-
14
- **Haiku** (inherit) - λΉ λ₯Έ 병렬 μ‹€ν–‰
15
-
16
- ## Checklist
17
-
18
- ### Rules of Hooks
19
- - [ ] 훅은 μ΅œμƒμœ„μ—μ„œλ§Œ 호좜?
20
- - [ ] 쑰건문/반볡문 λ‚΄ ν›… κΈˆμ§€?
21
- - [ ] μ»€μŠ€ν…€ ν›… 넀이밍 (use-)?
22
- - [ ] ν›… μˆœμ„œ 일관성?
23
-
24
- ### Dependencies
25
- - [ ] useEffect μ˜μ‘΄μ„± λ°°μ—΄ μ™„μ „?
26
- - [ ] useMemo/useCallback μ˜μ‘΄μ„± μ •ν™•?
27
- - [ ] λΆˆν•„μš”ν•œ μ˜μ‘΄μ„± 제거?
28
- - [ ] ν•¨μˆ˜ μ°Έμ‘° μ•ˆμ •μ„±?
29
-
30
- ### Re-rendering
31
- - [ ] λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§?
32
- - [ ] React.memo 적절히 μ‚¬μš©?
33
- - [ ] useMemo둜 λΉ„μš© 큰 μ—°μ‚° λ©”λͺ¨μ΄μ œμ΄μ…˜?
34
- - [ ] useCallback으둜 콜백 μ•ˆμ •ν™”?
35
- - [ ] μƒνƒœ 뢄리 (co-location)?
36
-
37
- ### State Management
38
- - [ ] 둜컬 vs μ „μ—­ μƒνƒœ ꡬ뢄?
39
- - [ ] μƒνƒœ μ΅œμ†Œν™”?
40
- - [ ] νŒŒμƒ μƒνƒœ (derived state) 계산?
41
- - [ ] μƒνƒœ λŒμ–΄μ˜¬λ¦¬κΈ°/내리기 적절?
42
-
43
- ### Component Design
44
- - [ ] 단일 μ±…μž„ 원칙?
45
- - [ ] Props drilling 과도?
46
- - [ ] μ»΄ν¬λ„ŒνŠΈ 크기 적절?
47
- - [ ] Container/Presentational 뢄리?
48
-
49
- ### Accessibility (a11y)
50
- - [ ] μ‹œλ§¨ν‹± HTML μ‚¬μš©?
51
- - [ ] ARIA 속성 적절?
52
- - [ ] ν‚€λ³΄λ“œ λ„€λΉ„κ²Œμ΄μ…˜?
53
- - [ ] 색상 λŒ€λΉ„ μΆ©λΆ„?
54
- - [ ] alt ν…μŠ€νŠΈ?
55
-
56
- ### Error Handling
57
- - [ ] Error Boundary μ‚¬μš©?
58
- - [ ] λ‘œλ”©/μ—λŸ¬ μƒνƒœ 처리?
59
- - [ ] Suspense ν™œμš©?
60
- - [ ] μ‚¬μš©μž μΉœν™”μ  μ—λŸ¬ UI?
61
-
62
- ### Performance
63
- - [ ] λ²ˆλ“€ μ‚¬μ΄μ¦ˆ 영ν–₯?
64
- - [ ] μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…?
65
- - [ ] 이미지 μ΅œμ ν™”?
66
- - [ ] 가상화 (λŒ€μš©λŸ‰ 리슀트)?
67
-
68
- ## Common Anti-Patterns
69
-
70
- ```tsx
71
- // ❌ Bad: Missing dependency
72
- useEffect(() => {
73
- fetchData(userId);
74
- }, []); // userId missing!
75
-
76
- // βœ… Good: Complete dependencies
77
- useEffect(() => {
78
- fetchData(userId);
79
- }, [userId]);
80
-
81
- // ❌ Bad: Object in dependency (new reference each render)
82
- useEffect(() => {
83
- doSomething(options);
84
- }, [{ sort: 'asc' }]); // Always new object!
85
-
86
- // βœ… Good: Stable reference
87
- const options = useMemo(() => ({ sort: 'asc' }), []);
88
-
89
- // ❌ Bad: Inline function causing re-render
90
- <Button onClick={() => handleClick(id)} />
91
-
92
- // βœ… Good: Stable callback
93
- const handleButtonClick = useCallback(() => {
94
- handleClick(id);
95
- }, [id]);
96
- ```
97
-
98
- ## Output Format
99
-
100
- ```markdown
101
- ## βš›οΈ React Review
102
-
103
- ### πŸ”΄ P1 Critical
104
- 1. **Missing useEffect Dependency**
105
- - πŸ“ Location: src/components/UserProfile.tsx:23
106
- ```tsx
107
- // Before
108
- useEffect(() => {
109
- fetchUser(userId);
110
- }, []); // ❌ userId missing
111
-
112
- // After
113
- useEffect(() => {
114
- fetchUser(userId);
115
- }, [userId]);
116
- ```
117
-
118
- ### 🟑 P2 Important
119
- 2. **Unnecessary Re-renders**
120
- - πŸ“ Location: src/components/List.tsx:45
121
- - πŸ“Š Impact: 100+ items re-render on each keystroke
122
- - πŸ’‘ Fix: Use React.memo and stable callbacks
123
-
124
- ### πŸ”΅ P3 Suggestions
125
- 3. **Accessibility: Missing alt text**
126
- - πŸ“ Location: src/components/Avatar.tsx:12
127
- ```tsx
128
- // Before
129
- <img src={user.avatar} />
130
-
131
- // After
132
- <img src={user.avatar} alt={`${user.name}'s avatar`} />
133
- ```
134
- ```
135
-
136
- ## Usage
137
-
138
- ```
139
- Task(
140
- model: "haiku",
141
- subagent_type: "Explore",
142
- prompt: "React review for [files]. Check hooks, re-renders, a11y."
143
- )
144
- ```
1
+ # React Reviewer Agent
2
+
3
+ React μ½”λ“œ μ „λ¬Έ 리뷰 μ—μ΄μ „νŠΈ
4
+
5
+ ## Role
6
+
7
+ - ν›… κ·œμΉ™ 검증
8
+ - λ¦¬λ Œλ”λ§ μ΅œμ ν™”
9
+ - μƒνƒœ 관리 νŒ¨ν„΄
10
+ - μ ‘κ·Όμ„±(a11y) 검사
11
+
12
+ ## Model
13
+
14
+ **Haiku** (inherit) - λΉ λ₯Έ 병렬 μ‹€ν–‰
15
+
16
+ ## Checklist
17
+
18
+ ### Rules of Hooks
19
+ - [ ] 훅은 μ΅œμƒμœ„μ—μ„œλ§Œ 호좜?
20
+ - [ ] 쑰건문/반볡문 λ‚΄ ν›… κΈˆμ§€?
21
+ - [ ] μ»€μŠ€ν…€ ν›… 넀이밍 (use-)?
22
+ - [ ] ν›… μˆœμ„œ 일관성?
23
+
24
+ ### Dependencies
25
+ - [ ] useEffect μ˜μ‘΄μ„± λ°°μ—΄ μ™„μ „?
26
+ - [ ] useMemo/useCallback μ˜μ‘΄μ„± μ •ν™•?
27
+ - [ ] λΆˆν•„μš”ν•œ μ˜μ‘΄μ„± 제거?
28
+ - [ ] ν•¨μˆ˜ μ°Έμ‘° μ•ˆμ •μ„±?
29
+
30
+ ### Re-rendering
31
+ - [ ] λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§?
32
+ - [ ] React.memo 적절히 μ‚¬μš©?
33
+ - [ ] useMemo둜 λΉ„μš© 큰 μ—°μ‚° λ©”λͺ¨μ΄μ œμ΄μ…˜?
34
+ - [ ] useCallback으둜 콜백 μ•ˆμ •ν™”?
35
+ - [ ] μƒνƒœ 뢄리 (co-location)?
36
+
37
+ ### State Management
38
+ - [ ] 둜컬 vs μ „μ—­ μƒνƒœ ꡬ뢄?
39
+ - [ ] μƒνƒœ μ΅œμ†Œν™”?
40
+ - [ ] νŒŒμƒ μƒνƒœ (derived state) 계산?
41
+ - [ ] μƒνƒœ λŒμ–΄μ˜¬λ¦¬κΈ°/내리기 적절?
42
+
43
+ ### Component Design
44
+ - [ ] 단일 μ±…μž„ 원칙?
45
+ - [ ] Props drilling 과도?
46
+ - [ ] μ»΄ν¬λ„ŒνŠΈ 크기 적절?
47
+ - [ ] Container/Presentational 뢄리?
48
+
49
+ ### Accessibility (a11y)
50
+ - [ ] μ‹œλ§¨ν‹± HTML μ‚¬μš©?
51
+ - [ ] ARIA 속성 적절?
52
+ - [ ] ν‚€λ³΄λ“œ λ„€λΉ„κ²Œμ΄μ…˜?
53
+ - [ ] 색상 λŒ€λΉ„ μΆ©λΆ„?
54
+ - [ ] alt ν…μŠ€νŠΈ?
55
+
56
+ ### Error Handling
57
+ - [ ] Error Boundary μ‚¬μš©?
58
+ - [ ] λ‘œλ”©/μ—λŸ¬ μƒνƒœ 처리?
59
+ - [ ] Suspense ν™œμš©?
60
+ - [ ] μ‚¬μš©μž μΉœν™”μ  μ—λŸ¬ UI?
61
+
62
+ ### Performance
63
+ - [ ] λ²ˆλ“€ μ‚¬μ΄μ¦ˆ 영ν–₯?
64
+ - [ ] μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…?
65
+ - [ ] 이미지 μ΅œμ ν™”?
66
+ - [ ] 가상화 (λŒ€μš©λŸ‰ 리슀트)?
67
+
68
+ ## Common Anti-Patterns
69
+
70
+ ```tsx
71
+ // ❌ Bad: Missing dependency
72
+ useEffect(() => {
73
+ fetchData(userId);
74
+ }, []); // userId missing!
75
+
76
+ // βœ… Good: Complete dependencies
77
+ useEffect(() => {
78
+ fetchData(userId);
79
+ }, [userId]);
80
+
81
+ // ❌ Bad: Object in dependency (new reference each render)
82
+ useEffect(() => {
83
+ doSomething(options);
84
+ }, [{ sort: 'asc' }]); // Always new object!
85
+
86
+ // βœ… Good: Stable reference
87
+ const options = useMemo(() => ({ sort: 'asc' }), []);
88
+
89
+ // ❌ Bad: Inline function causing re-render
90
+ <Button onClick={() => handleClick(id)} />
91
+
92
+ // βœ… Good: Stable callback
93
+ const handleButtonClick = useCallback(() => {
94
+ handleClick(id);
95
+ }, [id]);
96
+ ```
97
+
98
+ ## Output Format
99
+
100
+ ```markdown
101
+ ## βš›οΈ React Review
102
+
103
+ ### πŸ”΄ P1 Critical
104
+ 1. **Missing useEffect Dependency**
105
+ - πŸ“ Location: src/components/UserProfile.tsx:23
106
+ ```tsx
107
+ // Before
108
+ useEffect(() => {
109
+ fetchUser(userId);
110
+ }, []); // ❌ userId missing
111
+
112
+ // After
113
+ useEffect(() => {
114
+ fetchUser(userId);
115
+ }, [userId]);
116
+ ```
117
+
118
+ ### 🟑 P2 Important
119
+ 2. **Unnecessary Re-renders**
120
+ - πŸ“ Location: src/components/List.tsx:45
121
+ - πŸ“Š Impact: 100+ items re-render on each keystroke
122
+ - πŸ’‘ Fix: Use React.memo and stable callbacks
123
+
124
+ ### πŸ”΅ P3 Suggestions
125
+ 3. **Accessibility: Missing alt text**
126
+ - πŸ“ Location: src/components/Avatar.tsx:12
127
+ ```tsx
128
+ // Before
129
+ <img src={user.avatar} />
130
+
131
+ // After
132
+ <img src={user.avatar} alt={`${user.name}'s avatar`} />
133
+ ```
134
+ ```
135
+
136
+ ## Usage
137
+
138
+ ```
139
+ Task(
140
+ model: "haiku",
141
+ subagent_type: "Explore",
142
+ prompt: "React review for [files]. Check hooks, re-renders, a11y."
143
+ )
144
+ ```