start-vibing 2.0.9 → 2.0.11

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 (139) hide show
  1. package/README.md +177 -176
  2. package/dist/cli.js +38 -11
  3. package/package.json +42 -42
  4. package/template/.claude/CLAUDE.md +174 -172
  5. package/template/.claude/agents/01-orchestration/agent-selector.md +130 -123
  6. package/template/.claude/agents/01-orchestration/checkpoint-manager.md +142 -131
  7. package/template/.claude/agents/01-orchestration/context-manager.md +138 -124
  8. package/template/.claude/agents/01-orchestration/error-recovery.md +182 -176
  9. package/template/.claude/agents/01-orchestration/orchestrator.md +114 -107
  10. package/template/.claude/agents/01-orchestration/parallel-coordinator.md +141 -130
  11. package/template/.claude/agents/01-orchestration/task-decomposer.md +121 -118
  12. package/template/.claude/agents/01-orchestration/workflow-router.md +114 -111
  13. package/template/.claude/agents/02-typescript/bun-runtime-expert.md +197 -180
  14. package/template/.claude/agents/02-typescript/esm-resolver.md +193 -187
  15. package/template/.claude/agents/02-typescript/import-alias-enforcer.md +158 -149
  16. package/template/.claude/agents/02-typescript/ts-generics-helper.md +183 -165
  17. package/template/.claude/agents/02-typescript/ts-migration-helper.md +238 -227
  18. package/template/.claude/agents/02-typescript/ts-strict-checker.md +180 -162
  19. package/template/.claude/agents/02-typescript/ts-types-analyzer.md +199 -185
  20. package/template/.claude/agents/02-typescript/type-definition-writer.md +187 -183
  21. package/template/.claude/agents/02-typescript/zod-schema-designer.md +212 -197
  22. package/template/.claude/agents/02-typescript/zod-validator.md +158 -153
  23. package/template/.claude/agents/03-testing/playwright-assertions.md +265 -255
  24. package/template/.claude/agents/03-testing/playwright-e2e.md +247 -245
  25. package/template/.claude/agents/03-testing/playwright-fixtures.md +234 -240
  26. package/template/.claude/agents/03-testing/playwright-multi-viewport.md +256 -261
  27. package/template/.claude/agents/03-testing/playwright-page-objects.md +247 -247
  28. package/template/.claude/agents/03-testing/test-cleanup-manager.md +248 -256
  29. package/template/.claude/agents/03-testing/test-data-generator.md +254 -266
  30. package/template/.claude/agents/03-testing/tester-integration.md +278 -278
  31. package/template/.claude/agents/03-testing/tester-unit.md +207 -204
  32. package/template/.claude/agents/03-testing/vitest-config.md +287 -289
  33. package/template/.claude/agents/04-docker/container-health.md +255 -239
  34. package/template/.claude/agents/04-docker/deployment-validator.md +225 -217
  35. package/template/.claude/agents/04-docker/docker-compose-designer.md +281 -268
  36. package/template/.claude/agents/04-docker/docker-env-manager.md +235 -228
  37. package/template/.claude/agents/04-docker/docker-multi-stage.md +241 -229
  38. package/template/.claude/agents/04-docker/dockerfile-optimizer.md +208 -204
  39. package/template/.claude/agents/05-database/data-migration.md +0 -293
  40. package/template/.claude/agents/05-database/database-seeder.md +273 -270
  41. package/template/.claude/agents/05-database/mongodb-query-optimizer.md +230 -219
  42. package/template/.claude/agents/05-database/mongoose-aggregation.md +306 -280
  43. package/template/.claude/agents/05-database/mongoose-index-optimizer.md +182 -174
  44. package/template/.claude/agents/05-database/mongoose-schema-designer.md +267 -267
  45. package/template/.claude/agents/06-security/auth-session-validator.md +68 -65
  46. package/template/.claude/agents/06-security/input-sanitizer.md +80 -81
  47. package/template/.claude/agents/06-security/owasp-checker.md +97 -87
  48. package/template/.claude/agents/06-security/permission-auditor.md +100 -95
  49. package/template/.claude/agents/06-security/security-auditor.md +84 -82
  50. package/template/.claude/agents/06-security/sensitive-data-scanner.md +83 -85
  51. package/template/.claude/agents/07-documentation/api-documenter.md +136 -131
  52. package/template/.claude/agents/07-documentation/changelog-manager.md +105 -96
  53. package/template/.claude/agents/07-documentation/documenter.md +76 -73
  54. package/template/.claude/agents/07-documentation/domain-updater.md +81 -74
  55. package/template/.claude/agents/07-documentation/jsdoc-generator.md +114 -114
  56. package/template/.claude/agents/07-documentation/readme-generator.md +135 -132
  57. package/template/.claude/agents/08-git/branch-manager.md +58 -58
  58. package/template/.claude/agents/08-git/commit-manager.md +63 -61
  59. package/template/.claude/agents/08-git/pr-creator.md +76 -72
  60. package/template/.claude/agents/09-quality/code-reviewer.md +71 -64
  61. package/template/.claude/agents/09-quality/quality-checker.md +67 -67
  62. package/template/.claude/agents/10-research/best-practices-finder.md +89 -82
  63. package/template/.claude/agents/10-research/competitor-analyzer.md +106 -96
  64. package/template/.claude/agents/10-research/pattern-researcher.md +93 -86
  65. package/template/.claude/agents/10-research/research-cache-manager.md +76 -75
  66. package/template/.claude/agents/10-research/research-web.md +98 -91
  67. package/template/.claude/agents/10-research/tech-evaluator.md +101 -94
  68. package/template/.claude/agents/11-ui-ux/accessibility-auditor.md +136 -128
  69. package/template/.claude/agents/11-ui-ux/design-system-enforcer.md +125 -116
  70. package/template/.claude/agents/11-ui-ux/skeleton-generator.md +118 -120
  71. package/template/.claude/agents/11-ui-ux/ui-desktop.md +132 -126
  72. package/template/.claude/agents/11-ui-ux/ui-mobile.md +98 -94
  73. package/template/.claude/agents/11-ui-ux/ui-tablet.md +110 -111
  74. package/template/.claude/agents/12-performance/api-latency-analyzer.md +156 -149
  75. package/template/.claude/agents/12-performance/bundle-analyzer.md +113 -107
  76. package/template/.claude/agents/12-performance/memory-leak-detector.md +137 -126
  77. package/template/.claude/agents/12-performance/performance-profiler.md +115 -108
  78. package/template/.claude/agents/12-performance/query-optimizer.md +124 -116
  79. package/template/.claude/agents/12-performance/render-optimizer.md +154 -148
  80. package/template/.claude/agents/13-debugging/build-error-fixer.md +207 -188
  81. package/template/.claude/agents/13-debugging/debugger.md +149 -137
  82. package/template/.claude/agents/13-debugging/error-stack-analyzer.md +141 -131
  83. package/template/.claude/agents/13-debugging/network-debugger.md +208 -185
  84. package/template/.claude/agents/13-debugging/runtime-error-fixer.md +181 -173
  85. package/template/.claude/agents/13-debugging/type-error-resolver.md +185 -173
  86. package/template/.claude/agents/14-validation/final-validator.md +93 -83
  87. package/template/.claude/agents/_backup/analyzer.md +134 -125
  88. package/template/.claude/agents/_backup/code-reviewer.md +279 -272
  89. package/template/.claude/agents/_backup/commit-manager.md +219 -212
  90. package/template/.claude/agents/_backup/debugger.md +280 -271
  91. package/template/.claude/agents/_backup/documenter.md +237 -220
  92. package/template/.claude/agents/_backup/domain-updater.md +197 -194
  93. package/template/.claude/agents/_backup/final-validator.md +169 -164
  94. package/template/.claude/agents/_backup/orchestrator.md +149 -138
  95. package/template/.claude/agents/_backup/performance.md +232 -228
  96. package/template/.claude/agents/_backup/quality-checker.md +240 -240
  97. package/template/.claude/agents/_backup/research.md +315 -299
  98. package/template/.claude/agents/_backup/security-auditor.md +192 -186
  99. package/template/.claude/agents/_backup/tester.md +566 -564
  100. package/template/.claude/agents/_backup/ui-ux-reviewer.md +247 -242
  101. package/template/.claude/commands/feature.md +48 -48
  102. package/template/.claude/config/README.md +30 -30
  103. package/template/.claude/config/mcp-config.json +344 -330
  104. package/template/.claude/config/project-config.json +53 -53
  105. package/template/.claude/config/quality-gates.json +46 -46
  106. package/template/.claude/config/security-rules.json +45 -45
  107. package/template/.claude/config/testing-config.json +164 -168
  108. package/template/.claude/hooks/SETUP.md +126 -126
  109. package/template/.claude/hooks/run-hook.ts +176 -172
  110. package/template/.claude/hooks/stop-validator.ts +824 -772
  111. package/template/.claude/hooks/user-prompt-submit.ts +886 -823
  112. package/template/.claude/scripts/mcp-quick-install.ts +151 -151
  113. package/template/.claude/scripts/setup-mcps.ts +651 -628
  114. package/template/.claude/settings.json +275 -276
  115. package/template/.claude/skills/bun-runtime/SKILL.md +430 -430
  116. package/template/.claude/skills/codebase-knowledge/SKILL.md +145 -145
  117. package/template/.claude/skills/codebase-knowledge/domains/claude-system.md +431 -403
  118. package/template/.claude/skills/codebase-knowledge/domains/mcp-integration.md +295 -281
  119. package/template/.claude/skills/debugging-patterns/SKILL.md +485 -484
  120. package/template/.claude/skills/docker-patterns/SKILL.md +555 -547
  121. package/template/.claude/skills/docs-tracker/SKILL.md +239 -239
  122. package/template/.claude/skills/final-check/SKILL.md +284 -284
  123. package/template/.claude/skills/git-workflow/SKILL.md +454 -454
  124. package/template/.claude/skills/mongoose-patterns/SKILL.md +499 -512
  125. package/template/.claude/skills/nextjs-app-router/SKILL.md +327 -337
  126. package/template/.claude/skills/performance-patterns/SKILL.md +547 -549
  127. package/template/.claude/skills/playwright-automation/SKILL.md +438 -438
  128. package/template/.claude/skills/quality-gate/SKILL.md +294 -294
  129. package/template/.claude/skills/react-patterns/SKILL.md +389 -376
  130. package/template/.claude/skills/research-cache/SKILL.md +222 -207
  131. package/template/.claude/skills/security-scan/SKILL.md +222 -222
  132. package/template/.claude/skills/shadcn-ui/SKILL.md +511 -520
  133. package/template/.claude/skills/tailwind-patterns/SKILL.md +465 -467
  134. package/template/.claude/skills/test-coverage/SKILL.md +467 -464
  135. package/template/.claude/skills/trpc-api/SKILL.md +434 -435
  136. package/template/.claude/skills/typescript-strict/SKILL.md +367 -368
  137. package/template/.claude/skills/ui-ux-audit/SKILL.md +254 -254
  138. package/template/.claude/skills/zod-validation/SKILL.md +403 -405
  139. package/template/CLAUDE.md +25 -25
@@ -1,376 +1,389 @@
1
- ---
2
- name: react-patterns
3
- description: Modern React patterns for React 19. Hooks, state management, component composition, performance optimization. Use when building React components.
4
- allowed-tools: Read, Write, Edit, Grep, Glob
5
- ---
6
-
7
- # React Patterns - Modern Component Architecture
8
-
9
- ## Purpose
10
-
11
- Expert guidance for React 19 patterns:
12
-
13
- - **Component Design** - Composition over inheritance
14
- - **State Management** - Local, context, and server state
15
- - **Performance** - Memoization and optimization
16
- - **Hooks** - Built-in and custom hooks
17
- - **TypeScript** - Proper typing patterns
18
-
19
- ---
20
-
21
- ## Component Patterns
22
-
23
- ### 1. Compound Components
24
-
25
- ```tsx
26
- // Composable API for complex UIs
27
- interface TabsContextValue {
28
- activeTab: string;
29
- setActiveTab: (id: string) => void;
30
- }
31
-
32
- const TabsContext = createContext<TabsContextValue | null>(null);
33
-
34
- function Tabs({ children, defaultTab }: { children: ReactNode; defaultTab: string }) {
35
- const [activeTab, setActiveTab] = useState(defaultTab);
36
-
37
- return (
38
- <TabsContext.Provider value={{ activeTab, setActiveTab }}>
39
- <div className="tabs">{children}</div>
40
- </TabsContext.Provider>
41
- );
42
- }
43
-
44
- function TabList({ children }: { children: ReactNode }) {
45
- return <div className="tab-list" role="tablist">{children}</div>;
46
- }
47
-
48
- function Tab({ id, children }: { id: string; children: ReactNode }) {
49
- const context = useContext(TabsContext);
50
- if (!context) throw new Error('Tab must be used within Tabs');
51
-
52
- return (
53
- <button
54
- role="tab"
55
- aria-selected={context.activeTab === id}
56
- onClick={() => context.setActiveTab(id)}
57
- >
58
- {children}
59
- </button>
60
- );
61
- }
62
-
63
- function TabPanel({ id, children }: { id: string; children: ReactNode }) {
64
- const context = useContext(TabsContext);
65
- if (!context) throw new Error('TabPanel must be used within Tabs');
66
-
67
- if (context.activeTab !== id) return null;
68
- return <div role="tabpanel">{children}</div>;
69
- }
70
-
71
- // Usage
72
- <Tabs defaultTab="home">
73
- <TabList>
74
- <Tab id="home">Home</Tab>
75
- <Tab id="settings">Settings</Tab>
76
- </TabList>
77
- <TabPanel id="home">Home content</TabPanel>
78
- <TabPanel id="settings">Settings content</TabPanel>
79
- </Tabs>
80
- ```
81
-
82
- ### 2. Render Props Pattern
83
-
84
- ```tsx
85
- interface MousePosition {
86
- x: number;
87
- y: number;
88
- }
89
-
90
- function MouseTracker({ render }: { render: (pos: MousePosition) => ReactNode }) {
91
- const [position, setPosition] = useState({ x: 0, y: 0 });
92
-
93
- useEffect(() => {
94
- const handleMove = (e: MouseEvent) => {
95
- setPosition({ x: e.clientX, y: e.clientY });
96
- };
97
- window.addEventListener('mousemove', handleMove);
98
- return () => window.removeEventListener('mousemove', handleMove);
99
- }, []);
100
-
101
- return <>{render(position)}</>;
102
- }
103
-
104
- // Usage
105
- <MouseTracker render={({ x, y }) => <div>Mouse: {x}, {y}</div>} />
106
- ```
107
-
108
- ### 3. HOC (Higher-Order Component)
109
-
110
- ```tsx
111
- function withAuth<P extends object>(Component: ComponentType<P>) {
112
- return function AuthenticatedComponent(props: P) {
113
- const { user, isLoading } = useAuth();
114
-
115
- if (isLoading) return <Loading />;
116
- if (!user) return <Redirect to="/login" />;
117
-
118
- return <Component {...props} />;
119
- };
120
- }
121
-
122
- // Usage
123
- const ProtectedDashboard = withAuth(Dashboard);
124
- ```
125
-
126
- ---
127
-
128
- ## Hooks Patterns
129
-
130
- ### Custom Hooks
131
-
132
- ```tsx
133
- // useLocalStorage - Persist state
134
- function useLocalStorage<T>(key: string, initialValue: T) {
135
- const [storedValue, setStoredValue] = useState<T>(() => {
136
- if (typeof window === 'undefined') return initialValue;
137
- try {
138
- const item = window.localStorage.getItem(key);
139
- return item ? JSON.parse(item) : initialValue;
140
- } catch {
141
- return initialValue;
142
- }
143
- });
144
-
145
- const setValue = useCallback((value: T | ((val: T) => T)) => {
146
- setStoredValue((prev) => {
147
- const valueToStore = value instanceof Function ? value(prev) : value;
148
- window.localStorage.setItem(key, JSON.stringify(valueToStore));
149
- return valueToStore;
150
- });
151
- }, [key]);
152
-
153
- return [storedValue, setValue] as const;
154
- }
155
-
156
- // useDebounce - Debounced value
157
- function useDebounce<T>(value: T, delay: number): T {
158
- const [debouncedValue, setDebouncedValue] = useState(value);
159
-
160
- useEffect(() => {
161
- const handler = setTimeout(() => setDebouncedValue(value), delay);
162
- return () => clearTimeout(handler);
163
- }, [value, delay]);
164
-
165
- return debouncedValue;
166
- }
167
-
168
- // useAsync - Async operation state
169
- function useAsync<T>(asyncFunction: () => Promise<T>, deps: unknown[] = []) {
170
- const [state, setState] = useState<{
171
- data: T | null;
172
- loading: boolean;
173
- error: Error | null;
174
- }>({
175
- data: null,
176
- loading: true,
177
- error: null,
178
- });
179
-
180
- useEffect(() => {
181
- let mounted = true;
182
- setState((s) => ({ ...s, loading: true }));
183
-
184
- asyncFunction()
185
- .then((data) => mounted && setState({ data, loading: false, error: null }))
186
- .catch((error) => mounted && setState({ data: null, loading: false, error }));
187
-
188
- return () => { mounted = false; };
189
- }, deps);
190
-
191
- return state;
192
- }
193
- ```
194
-
195
- ---
196
-
197
- ## State Management
198
-
199
- ### 1. useReducer for Complex State
200
-
201
- ```tsx
202
- type State = {
203
- items: Item[];
204
- loading: boolean;
205
- error: string | null;
206
- };
207
-
208
- type Action =
209
- | { type: 'FETCH_START' }
210
- | { type: 'FETCH_SUCCESS'; payload: Item[] }
211
- | { type: 'FETCH_ERROR'; payload: string }
212
- | { type: 'ADD_ITEM'; payload: Item }
213
- | { type: 'REMOVE_ITEM'; payload: string };
214
-
215
- function reducer(state: State, action: Action): State {
216
- switch (action.type) {
217
- case 'FETCH_START':
218
- return { ...state, loading: true, error: null };
219
- case 'FETCH_SUCCESS':
220
- return { ...state, loading: false, items: action.payload };
221
- case 'FETCH_ERROR':
222
- return { ...state, loading: false, error: action.payload };
223
- case 'ADD_ITEM':
224
- return { ...state, items: [...state.items, action.payload] };
225
- case 'REMOVE_ITEM':
226
- return { ...state, items: state.items.filter((i) => i.id !== action.payload) };
227
- default:
228
- return state;
229
- }
230
- }
231
- ```
232
-
233
- ### 2. Context for Global State
234
-
235
- ```tsx
236
- interface AppContextValue {
237
- user: User | null;
238
- theme: 'light' | 'dark';
239
- setTheme: (theme: 'light' | 'dark') => void;
240
- }
241
-
242
- const AppContext = createContext<AppContextValue | undefined>(undefined);
243
-
244
- export function AppProvider({ children }: { children: ReactNode }) {
245
- const [theme, setTheme] = useState<'light' | 'dark'>('light');
246
- const { data: user } = useUser();
247
-
248
- const value = useMemo(() => ({ user, theme, setTheme }), [user, theme]);
249
-
250
- return <AppContext.Provider value={value}>{children}</AppContext.Provider>;
251
- }
252
-
253
- export function useApp() {
254
- const context = useContext(AppContext);
255
- if (!context) throw new Error('useApp must be used within AppProvider');
256
- return context;
257
- }
258
- ```
259
-
260
- ---
261
-
262
- ## Performance Optimization
263
-
264
- ### 1. Memoization
265
-
266
- ```tsx
267
- // memo - Prevent re-renders
268
- const ExpensiveList = memo(function ExpensiveList({ items }: { items: Item[] }) {
269
- return (
270
- <ul>
271
- {items.map((item) => (
272
- <li key={item.id}>{item.name}</li>
273
- ))}
274
- </ul>
275
- );
276
- });
277
-
278
- // useMemo - Expensive calculations
279
- function Dashboard({ data }: { data: DataPoint[] }) {
280
- const processedData = useMemo(() => {
281
- return data.map((d) => ({ ...d, computed: expensiveCalculation(d) }));
282
- }, [data]);
283
-
284
- return <Chart data={processedData} />;
285
- }
286
-
287
- // useCallback - Stable function references
288
- function Parent() {
289
- const [count, setCount] = useState(0);
290
-
291
- const handleClick = useCallback(() => {
292
- setCount((c) => c + 1);
293
- }, []);
294
-
295
- return <Child onClick={handleClick} />;
296
- }
297
- ```
298
-
299
- ### 2. Code Splitting
300
-
301
- ```tsx
302
- import { lazy, Suspense } from 'react';
303
-
304
- const HeavyComponent = lazy(() => import('./HeavyComponent'));
305
-
306
- function App() {
307
- return (
308
- <Suspense fallback={<Loading />}>
309
- <HeavyComponent />
310
- </Suspense>
311
- );
312
- }
313
- ```
314
-
315
- ---
316
-
317
- ## TypeScript Patterns
318
-
319
- ### Props Types
320
-
321
- ```tsx
322
- // Discriminated unions for variants
323
- type ButtonProps =
324
- | { variant: 'primary'; onClick: () => void }
325
- | { variant: 'link'; href: string };
326
-
327
- function Button(props: ButtonProps) {
328
- if (props.variant === 'link') {
329
- return <a href={props.href}>Link</a>;
330
- }
331
- return <button onClick={props.onClick}>Button</button>;
332
- }
333
-
334
- // Generic components
335
- interface ListProps<T> {
336
- items: T[];
337
- renderItem: (item: T) => ReactNode;
338
- keyExtractor: (item: T) => string;
339
- }
340
-
341
- function List<T>({ items, renderItem, keyExtractor }: ListProps<T>) {
342
- return (
343
- <ul>
344
- {items.map((item) => (
345
- <li key={keyExtractor(item)}>{renderItem(item)}</li>
346
- ))}
347
- </ul>
348
- );
349
- }
350
- ```
351
-
352
- ---
353
-
354
- ## Agent Integration
355
-
356
- This skill is used by:
357
-
358
- - **react-expert** subagent
359
- - **render-optimizer** for performance issues
360
- - **ui-mobile/tablet/desktop** for component patterns
361
-
362
- ---
363
-
364
- ## FORBIDDEN
365
-
366
- 1. **Class components** - Use function components
367
- 2. **Prop drilling** - Use context or composition
368
- 3. **Inline objects/functions in JSX** - Causes re-renders
369
- 4. **useEffect for derived state** - Use useMemo
370
- 5. **Mutating state directly** - Always use setState/dispatch
371
-
372
- ---
373
-
374
- ## Version
375
-
376
- - **v1.0.0** - Initial implementation based on React 19 patterns
1
+ ---
2
+ name: react-patterns
3
+ description: Modern React patterns for React 19. Hooks, state management, component composition, performance optimization. Use when building React components.
4
+ allowed-tools: Read, Write, Edit, Grep, Glob
5
+ ---
6
+
7
+ # React Patterns - Modern Component Architecture
8
+
9
+ ## Purpose
10
+
11
+ Expert guidance for React 19 patterns:
12
+
13
+ - **Component Design** - Composition over inheritance
14
+ - **State Management** - Local, context, and server state
15
+ - **Performance** - Memoization and optimization
16
+ - **Hooks** - Built-in and custom hooks
17
+ - **TypeScript** - Proper typing patterns
18
+
19
+ ---
20
+
21
+ ## Component Patterns
22
+
23
+ ### 1. Compound Components
24
+
25
+ ```tsx
26
+ // Composable API for complex UIs
27
+ interface TabsContextValue {
28
+ activeTab: string;
29
+ setActiveTab: (id: string) => void;
30
+ }
31
+
32
+ const TabsContext = createContext<TabsContextValue | null>(null);
33
+
34
+ function Tabs({ children, defaultTab }: { children: ReactNode; defaultTab: string }) {
35
+ const [activeTab, setActiveTab] = useState(defaultTab);
36
+
37
+ return (
38
+ <TabsContext.Provider value={{ activeTab, setActiveTab }}>
39
+ <div className="tabs">{children}</div>
40
+ </TabsContext.Provider>
41
+ );
42
+ }
43
+
44
+ function TabList({ children }: { children: ReactNode }) {
45
+ return (
46
+ <div className="tab-list" role="tablist">
47
+ {children}
48
+ </div>
49
+ );
50
+ }
51
+
52
+ function Tab({ id, children }: { id: string; children: ReactNode }) {
53
+ const context = useContext(TabsContext);
54
+ if (!context) throw new Error('Tab must be used within Tabs');
55
+
56
+ return (
57
+ <button
58
+ role="tab"
59
+ aria-selected={context.activeTab === id}
60
+ onClick={() => context.setActiveTab(id)}
61
+ >
62
+ {children}
63
+ </button>
64
+ );
65
+ }
66
+
67
+ function TabPanel({ id, children }: { id: string; children: ReactNode }) {
68
+ const context = useContext(TabsContext);
69
+ if (!context) throw new Error('TabPanel must be used within Tabs');
70
+
71
+ if (context.activeTab !== id) return null;
72
+ return <div role="tabpanel">{children}</div>;
73
+ }
74
+
75
+ // Usage
76
+ <Tabs defaultTab="home">
77
+ <TabList>
78
+ <Tab id="home">Home</Tab>
79
+ <Tab id="settings">Settings</Tab>
80
+ </TabList>
81
+ <TabPanel id="home">Home content</TabPanel>
82
+ <TabPanel id="settings">Settings content</TabPanel>
83
+ </Tabs>;
84
+ ```
85
+
86
+ ### 2. Render Props Pattern
87
+
88
+ ```tsx
89
+ interface MousePosition {
90
+ x: number;
91
+ y: number;
92
+ }
93
+
94
+ function MouseTracker({ render }: { render: (pos: MousePosition) => ReactNode }) {
95
+ const [position, setPosition] = useState({ x: 0, y: 0 });
96
+
97
+ useEffect(() => {
98
+ const handleMove = (e: MouseEvent) => {
99
+ setPosition({ x: e.clientX, y: e.clientY });
100
+ };
101
+ window.addEventListener('mousemove', handleMove);
102
+ return () => window.removeEventListener('mousemove', handleMove);
103
+ }, []);
104
+
105
+ return <>{render(position)}</>;
106
+ }
107
+
108
+ // Usage
109
+ <MouseTracker
110
+ render={({ x, y }) => (
111
+ <div>
112
+ Mouse: {x}, {y}
113
+ </div>
114
+ )}
115
+ />;
116
+ ```
117
+
118
+ ### 3. HOC (Higher-Order Component)
119
+
120
+ ```tsx
121
+ function withAuth<P extends object>(Component: ComponentType<P>) {
122
+ return function AuthenticatedComponent(props: P) {
123
+ const { user, isLoading } = useAuth();
124
+
125
+ if (isLoading) return <Loading />;
126
+ if (!user) return <Redirect to="/login" />;
127
+
128
+ return <Component {...props} />;
129
+ };
130
+ }
131
+
132
+ // Usage
133
+ const ProtectedDashboard = withAuth(Dashboard);
134
+ ```
135
+
136
+ ---
137
+
138
+ ## Hooks Patterns
139
+
140
+ ### Custom Hooks
141
+
142
+ ```tsx
143
+ // useLocalStorage - Persist state
144
+ function useLocalStorage<T>(key: string, initialValue: T) {
145
+ const [storedValue, setStoredValue] = useState<T>(() => {
146
+ if (typeof window === 'undefined') return initialValue;
147
+ try {
148
+ const item = window.localStorage.getItem(key);
149
+ return item ? JSON.parse(item) : initialValue;
150
+ } catch {
151
+ return initialValue;
152
+ }
153
+ });
154
+
155
+ const setValue = useCallback(
156
+ (value: T | ((val: T) => T)) => {
157
+ setStoredValue((prev) => {
158
+ const valueToStore = value instanceof Function ? value(prev) : value;
159
+ window.localStorage.setItem(key, JSON.stringify(valueToStore));
160
+ return valueToStore;
161
+ });
162
+ },
163
+ [key]
164
+ );
165
+
166
+ return [storedValue, setValue] as const;
167
+ }
168
+
169
+ // useDebounce - Debounced value
170
+ function useDebounce<T>(value: T, delay: number): T {
171
+ const [debouncedValue, setDebouncedValue] = useState(value);
172
+
173
+ useEffect(() => {
174
+ const handler = setTimeout(() => setDebouncedValue(value), delay);
175
+ return () => clearTimeout(handler);
176
+ }, [value, delay]);
177
+
178
+ return debouncedValue;
179
+ }
180
+
181
+ // useAsync - Async operation state
182
+ function useAsync<T>(asyncFunction: () => Promise<T>, deps: unknown[] = []) {
183
+ const [state, setState] = useState<{
184
+ data: T | null;
185
+ loading: boolean;
186
+ error: Error | null;
187
+ }>({
188
+ data: null,
189
+ loading: true,
190
+ error: null,
191
+ });
192
+
193
+ useEffect(() => {
194
+ let mounted = true;
195
+ setState((s) => ({ ...s, loading: true }));
196
+
197
+ asyncFunction()
198
+ .then((data) => mounted && setState({ data, loading: false, error: null }))
199
+ .catch((error) => mounted && setState({ data: null, loading: false, error }));
200
+
201
+ return () => {
202
+ mounted = false;
203
+ };
204
+ }, deps);
205
+
206
+ return state;
207
+ }
208
+ ```
209
+
210
+ ---
211
+
212
+ ## State Management
213
+
214
+ ### 1. useReducer for Complex State
215
+
216
+ ```tsx
217
+ type State = {
218
+ items: Item[];
219
+ loading: boolean;
220
+ error: string | null;
221
+ };
222
+
223
+ type Action =
224
+ | { type: 'FETCH_START' }
225
+ | { type: 'FETCH_SUCCESS'; payload: Item[] }
226
+ | { type: 'FETCH_ERROR'; payload: string }
227
+ | { type: 'ADD_ITEM'; payload: Item }
228
+ | { type: 'REMOVE_ITEM'; payload: string };
229
+
230
+ function reducer(state: State, action: Action): State {
231
+ switch (action.type) {
232
+ case 'FETCH_START':
233
+ return { ...state, loading: true, error: null };
234
+ case 'FETCH_SUCCESS':
235
+ return { ...state, loading: false, items: action.payload };
236
+ case 'FETCH_ERROR':
237
+ return { ...state, loading: false, error: action.payload };
238
+ case 'ADD_ITEM':
239
+ return { ...state, items: [...state.items, action.payload] };
240
+ case 'REMOVE_ITEM':
241
+ return { ...state, items: state.items.filter((i) => i.id !== action.payload) };
242
+ default:
243
+ return state;
244
+ }
245
+ }
246
+ ```
247
+
248
+ ### 2. Context for Global State
249
+
250
+ ```tsx
251
+ interface AppContextValue {
252
+ user: User | null;
253
+ theme: 'light' | 'dark';
254
+ setTheme: (theme: 'light' | 'dark') => void;
255
+ }
256
+
257
+ const AppContext = createContext<AppContextValue | undefined>(undefined);
258
+
259
+ export function AppProvider({ children }: { children: ReactNode }) {
260
+ const [theme, setTheme] = useState<'light' | 'dark'>('light');
261
+ const { data: user } = useUser();
262
+
263
+ const value = useMemo(() => ({ user, theme, setTheme }), [user, theme]);
264
+
265
+ return <AppContext.Provider value={value}>{children}</AppContext.Provider>;
266
+ }
267
+
268
+ export function useApp() {
269
+ const context = useContext(AppContext);
270
+ if (!context) throw new Error('useApp must be used within AppProvider');
271
+ return context;
272
+ }
273
+ ```
274
+
275
+ ---
276
+
277
+ ## Performance Optimization
278
+
279
+ ### 1. Memoization
280
+
281
+ ```tsx
282
+ // memo - Prevent re-renders
283
+ const ExpensiveList = memo(function ExpensiveList({ items }: { items: Item[] }) {
284
+ return (
285
+ <ul>
286
+ {items.map((item) => (
287
+ <li key={item.id}>{item.name}</li>
288
+ ))}
289
+ </ul>
290
+ );
291
+ });
292
+
293
+ // useMemo - Expensive calculations
294
+ function Dashboard({ data }: { data: DataPoint[] }) {
295
+ const processedData = useMemo(() => {
296
+ return data.map((d) => ({ ...d, computed: expensiveCalculation(d) }));
297
+ }, [data]);
298
+
299
+ return <Chart data={processedData} />;
300
+ }
301
+
302
+ // useCallback - Stable function references
303
+ function Parent() {
304
+ const [count, setCount] = useState(0);
305
+
306
+ const handleClick = useCallback(() => {
307
+ setCount((c) => c + 1);
308
+ }, []);
309
+
310
+ return <Child onClick={handleClick} />;
311
+ }
312
+ ```
313
+
314
+ ### 2. Code Splitting
315
+
316
+ ```tsx
317
+ import { lazy, Suspense } from 'react';
318
+
319
+ const HeavyComponent = lazy(() => import('./HeavyComponent'));
320
+
321
+ function App() {
322
+ return (
323
+ <Suspense fallback={<Loading />}>
324
+ <HeavyComponent />
325
+ </Suspense>
326
+ );
327
+ }
328
+ ```
329
+
330
+ ---
331
+
332
+ ## TypeScript Patterns
333
+
334
+ ### Props Types
335
+
336
+ ```tsx
337
+ // Discriminated unions for variants
338
+ type ButtonProps = { variant: 'primary'; onClick: () => void } | { variant: 'link'; href: string };
339
+
340
+ function Button(props: ButtonProps) {
341
+ if (props.variant === 'link') {
342
+ return <a href={props.href}>Link</a>;
343
+ }
344
+ return <button onClick={props.onClick}>Button</button>;
345
+ }
346
+
347
+ // Generic components
348
+ interface ListProps<T> {
349
+ items: T[];
350
+ renderItem: (item: T) => ReactNode;
351
+ keyExtractor: (item: T) => string;
352
+ }
353
+
354
+ function List<T>({ items, renderItem, keyExtractor }: ListProps<T>) {
355
+ return (
356
+ <ul>
357
+ {items.map((item) => (
358
+ <li key={keyExtractor(item)}>{renderItem(item)}</li>
359
+ ))}
360
+ </ul>
361
+ );
362
+ }
363
+ ```
364
+
365
+ ---
366
+
367
+ ## Agent Integration
368
+
369
+ This skill is used by:
370
+
371
+ - **react-expert** subagent
372
+ - **render-optimizer** for performance issues
373
+ - **ui-mobile/tablet/desktop** for component patterns
374
+
375
+ ---
376
+
377
+ ## FORBIDDEN
378
+
379
+ 1. **Class components** - Use function components
380
+ 2. **Prop drilling** - Use context or composition
381
+ 3. **Inline objects/functions in JSX** - Causes re-renders
382
+ 4. **useEffect for derived state** - Use useMemo
383
+ 5. **Mutating state directly** - Always use setState/dispatch
384
+
385
+ ---
386
+
387
+ ## Version
388
+
389
+ - **v1.0.0** - Initial implementation based on React 19 patterns