cp-toolkit 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -0
- package/bin/cp-kit.js +72 -0
- package/package.json +46 -0
- package/src/commands/add.js +212 -0
- package/src/commands/doctor.js +149 -0
- package/src/commands/init.js +662 -0
- package/src/commands/list.js +128 -0
- package/src/index.js +13 -0
- package/templates/agents/backend-specialist.md +263 -0
- package/templates/agents/code-archaeologist.md +106 -0
- package/templates/agents/database-architect.md +226 -0
- package/templates/agents/debugger.md +225 -0
- package/templates/agents/devops-engineer.md +242 -0
- package/templates/agents/documentation-writer.md +104 -0
- package/templates/agents/explorer-agent.md +73 -0
- package/templates/agents/frontend-specialist.md +556 -0
- package/templates/agents/game-developer.md +162 -0
- package/templates/agents/mobile-developer.md +377 -0
- package/templates/agents/orchestrator.md +416 -0
- package/templates/agents/penetration-tester.md +188 -0
- package/templates/agents/performance-optimizer.md +187 -0
- package/templates/agents/product-manager.md +112 -0
- package/templates/agents/product-owner.md +95 -0
- package/templates/agents/project-planner.md +406 -0
- package/templates/agents/qa-automation-engineer.md +103 -0
- package/templates/agents/security-auditor.md +170 -0
- package/templates/agents/seo-specialist.md +111 -0
- package/templates/agents/test-engineer.md +158 -0
- package/templates/github/agents/backend-specialist.md +67 -0
- package/templates/github/agents/code-archaeologist.md +61 -0
- package/templates/github/agents/database-architect.md +73 -0
- package/templates/github/agents/debugger.md +71 -0
- package/templates/github/agents/devops-engineer.md +85 -0
- package/templates/github/agents/documentation-writer.md +107 -0
- package/templates/github/agents/explorer-agent.md +87 -0
- package/templates/github/agents/frontend-specialist.md +54 -0
- package/templates/github/agents/game-developer.md +94 -0
- package/templates/github/agents/mobile-developer.md +75 -0
- package/templates/github/agents/orchestrator.md +48 -0
- package/templates/github/agents/penetration-tester.md +87 -0
- package/templates/github/agents/performance-optimizer.md +70 -0
- package/templates/github/agents/product-manager.md +85 -0
- package/templates/github/agents/product-owner.md +77 -0
- package/templates/github/agents/project-planner.md +83 -0
- package/templates/github/agents/qa-automation-engineer.md +95 -0
- package/templates/github/agents/security-auditor.md +72 -0
- package/templates/github/agents/seo-specialist.md +78 -0
- package/templates/github/agents/test-engineer.md +79 -0
- package/templates/github/instructions/database.instructions.md +74 -0
- package/templates/github/instructions/python.instructions.md +76 -0
- package/templates/github/instructions/security.instructions.md +73 -0
- package/templates/github/instructions/typescript.instructions.md +50 -0
- package/templates/rules/GEMINI.md +273 -0
- package/templates/scripts/mcp-server.js +704 -0
- package/templates/skills/core/behavioral-modes/SKILL.md +242 -0
- package/templates/skills/core/brainstorming/SKILL.md +163 -0
- package/templates/skills/core/brainstorming/dynamic-questioning.md +350 -0
- package/templates/skills/core/clean-code/SKILL.md +201 -0
- package/templates/skills/core/intelligent-routing/SKILL.md +335 -0
- package/templates/skills/core/mcp-builder/SKILL.md +176 -0
- package/templates/skills/core/parallel-agents/SKILL.md +175 -0
- package/templates/skills/core/plan-writing/SKILL.md +152 -0
- package/templates/skills/optional/api-patterns/SKILL.md +81 -0
- package/templates/skills/optional/api-patterns/api-style.md +42 -0
- package/templates/skills/optional/api-patterns/auth.md +24 -0
- package/templates/skills/optional/api-patterns/documentation.md +26 -0
- package/templates/skills/optional/api-patterns/graphql.md +41 -0
- package/templates/skills/optional/api-patterns/rate-limiting.md +31 -0
- package/templates/skills/optional/api-patterns/response.md +37 -0
- package/templates/skills/optional/api-patterns/rest.md +40 -0
- package/templates/skills/optional/api-patterns/scripts/api_validator.py +211 -0
- package/templates/skills/optional/api-patterns/security-testing.md +122 -0
- package/templates/skills/optional/api-patterns/trpc.md +41 -0
- package/templates/skills/optional/api-patterns/versioning.md +22 -0
- package/templates/skills/optional/app-builder/SKILL.md +75 -0
- package/templates/skills/optional/app-builder/agent-coordination.md +71 -0
- package/templates/skills/optional/app-builder/feature-building.md +53 -0
- package/templates/skills/optional/app-builder/project-detection.md +34 -0
- package/templates/skills/optional/app-builder/scaffolding.md +118 -0
- package/templates/skills/optional/app-builder/tech-stack.md +40 -0
- package/templates/skills/optional/app-builder/templates/SKILL.md +39 -0
- package/templates/skills/optional/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/templates/skills/optional/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/templates/skills/optional/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/templates/skills/optional/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/templates/skills/optional/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/templates/skills/optional/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/templates/skills/optional/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/templates/skills/optional/app-builder/templates/nextjs-fullstack/TEMPLATE.md +82 -0
- package/templates/skills/optional/app-builder/templates/nextjs-saas/TEMPLATE.md +100 -0
- package/templates/skills/optional/app-builder/templates/nextjs-static/TEMPLATE.md +106 -0
- package/templates/skills/optional/app-builder/templates/nuxt-app/TEMPLATE.md +101 -0
- package/templates/skills/optional/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/templates/skills/optional/app-builder/templates/react-native-app/TEMPLATE.md +93 -0
- package/templates/skills/optional/architecture/SKILL.md +55 -0
- package/templates/skills/optional/architecture/context-discovery.md +43 -0
- package/templates/skills/optional/architecture/examples.md +94 -0
- package/templates/skills/optional/architecture/pattern-selection.md +68 -0
- package/templates/skills/optional/architecture/patterns-reference.md +50 -0
- package/templates/skills/optional/architecture/trade-off-analysis.md +77 -0
- package/templates/skills/optional/bash-linux/SKILL.md +199 -0
- package/templates/skills/optional/code-review-checklist/SKILL.md +109 -0
- package/templates/skills/optional/database-design/SKILL.md +52 -0
- package/templates/skills/optional/database-design/database-selection.md +43 -0
- package/templates/skills/optional/database-design/indexing.md +39 -0
- package/templates/skills/optional/database-design/migrations.md +48 -0
- package/templates/skills/optional/database-design/optimization.md +36 -0
- package/templates/skills/optional/database-design/orm-selection.md +30 -0
- package/templates/skills/optional/database-design/schema-design.md +56 -0
- package/templates/skills/optional/database-design/scripts/schema_validator.py +172 -0
- package/templates/skills/optional/deployment-procedures/SKILL.md +241 -0
- package/templates/skills/optional/documentation-templates/SKILL.md +194 -0
- package/templates/skills/optional/frontend-design/SKILL.md +418 -0
- package/templates/skills/optional/frontend-design/animation-guide.md +331 -0
- package/templates/skills/optional/frontend-design/color-system.md +311 -0
- package/templates/skills/optional/frontend-design/decision-trees.md +418 -0
- package/templates/skills/optional/frontend-design/motion-graphics.md +306 -0
- package/templates/skills/optional/frontend-design/scripts/accessibility_checker.py +183 -0
- package/templates/skills/optional/frontend-design/scripts/ux_audit.py +722 -0
- package/templates/skills/optional/frontend-design/typography-system.md +345 -0
- package/templates/skills/optional/frontend-design/ux-psychology.md +541 -0
- package/templates/skills/optional/frontend-design/visual-effects.md +383 -0
- package/templates/skills/optional/game-development/2d-games/SKILL.md +119 -0
- package/templates/skills/optional/game-development/3d-games/SKILL.md +135 -0
- package/templates/skills/optional/game-development/SKILL.md +167 -0
- package/templates/skills/optional/game-development/game-art/SKILL.md +185 -0
- package/templates/skills/optional/game-development/game-audio/SKILL.md +190 -0
- package/templates/skills/optional/game-development/game-design/SKILL.md +129 -0
- package/templates/skills/optional/game-development/mobile-games/SKILL.md +108 -0
- package/templates/skills/optional/game-development/multiplayer/SKILL.md +132 -0
- package/templates/skills/optional/game-development/pc-games/SKILL.md +144 -0
- package/templates/skills/optional/game-development/vr-ar/SKILL.md +123 -0
- package/templates/skills/optional/game-development/web-games/SKILL.md +150 -0
- package/templates/skills/optional/geo-fundamentals/SKILL.md +156 -0
- package/templates/skills/optional/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/templates/skills/optional/i18n-localization/SKILL.md +154 -0
- package/templates/skills/optional/i18n-localization/scripts/i18n_checker.py +241 -0
- package/templates/skills/optional/lint-and-validate/SKILL.md +45 -0
- package/templates/skills/optional/lint-and-validate/scripts/lint_runner.py +172 -0
- package/templates/skills/optional/lint-and-validate/scripts/type_coverage.py +173 -0
- package/templates/skills/optional/mobile-design/SKILL.md +394 -0
- package/templates/skills/optional/mobile-design/decision-trees.md +516 -0
- package/templates/skills/optional/mobile-design/mobile-backend.md +491 -0
- package/templates/skills/optional/mobile-design/mobile-color-system.md +420 -0
- package/templates/skills/optional/mobile-design/mobile-debugging.md +122 -0
- package/templates/skills/optional/mobile-design/mobile-design-thinking.md +357 -0
- package/templates/skills/optional/mobile-design/mobile-navigation.md +458 -0
- package/templates/skills/optional/mobile-design/mobile-performance.md +767 -0
- package/templates/skills/optional/mobile-design/mobile-testing.md +356 -0
- package/templates/skills/optional/mobile-design/mobile-typography.md +433 -0
- package/templates/skills/optional/mobile-design/platform-android.md +666 -0
- package/templates/skills/optional/mobile-design/platform-ios.md +561 -0
- package/templates/skills/optional/mobile-design/scripts/mobile_audit.py +670 -0
- package/templates/skills/optional/mobile-design/touch-psychology.md +537 -0
- package/templates/skills/optional/nextjs-react-expert/1-async-eliminating-waterfalls.md +312 -0
- package/templates/skills/optional/nextjs-react-expert/2-bundle-bundle-size-optimization.md +240 -0
- package/templates/skills/optional/nextjs-react-expert/3-server-server-side-performance.md +490 -0
- package/templates/skills/optional/nextjs-react-expert/4-client-client-side-data-fetching.md +264 -0
- package/templates/skills/optional/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -0
- package/templates/skills/optional/nextjs-react-expert/6-rendering-rendering-performance.md +432 -0
- package/templates/skills/optional/nextjs-react-expert/7-js-javascript-performance.md +684 -0
- package/templates/skills/optional/nextjs-react-expert/8-advanced-advanced-patterns.md +150 -0
- package/templates/skills/optional/nextjs-react-expert/SKILL.md +267 -0
- package/templates/skills/optional/nextjs-react-expert/scripts/convert_rules.py +222 -0
- package/templates/skills/optional/nextjs-react-expert/scripts/react_performance_checker.py +252 -0
- package/templates/skills/optional/nodejs-best-practices/SKILL.md +333 -0
- package/templates/skills/optional/performance-profiling/SKILL.md +143 -0
- package/templates/skills/optional/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/templates/skills/optional/powershell-windows/SKILL.md +167 -0
- package/templates/skills/optional/python-patterns/SKILL.md +441 -0
- package/templates/skills/optional/red-team-tactics/SKILL.md +199 -0
- package/templates/skills/optional/seo-fundamentals/SKILL.md +129 -0
- package/templates/skills/optional/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/templates/skills/optional/server-management/SKILL.md +161 -0
- package/templates/skills/optional/systematic-debugging/SKILL.md +109 -0
- package/templates/skills/optional/tailwind-patterns/SKILL.md +269 -0
- package/templates/skills/optional/tdd-workflow/SKILL.md +149 -0
- package/templates/skills/optional/testing-patterns/SKILL.md +178 -0
- package/templates/skills/optional/testing-patterns/scripts/test_runner.py +219 -0
- package/templates/skills/optional/vulnerability-scanner/SKILL.md +276 -0
- package/templates/skills/optional/vulnerability-scanner/checklists.md +121 -0
- package/templates/skills/optional/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/templates/skills/optional/web-design-guidelines/SKILL.md +57 -0
- package/templates/skills/optional/webapp-testing/SKILL.md +187 -0
- package/templates/skills/optional/webapp-testing/scripts/playwright_runner.py +173 -0
- package/templates/workflows/brainstorm.md +113 -0
- package/templates/workflows/create.md +59 -0
- package/templates/workflows/debug.md +103 -0
- package/templates/workflows/deploy.md +176 -0
- package/templates/workflows/enhance.md +63 -0
- package/templates/workflows/orchestrate.md +237 -0
- package/templates/workflows/plan.md +89 -0
- package/templates/workflows/preview.md +81 -0
- package/templates/workflows/status.md +86 -0
- package/templates/workflows/test.md +144 -0
- package/templates/workflows/ui-ux-pro-max.md +296 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# 8. Advanced Patterns
|
|
2
|
+
|
|
3
|
+
> **Impact:** VARIABLE
|
|
4
|
+
> **Focus:** Advanced patterns for specific cases that require careful implementation.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
This section contains **3 rules** focused on advanced patterns.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Rule 8.1: Initialize App Once, Not Per Mount
|
|
15
|
+
|
|
16
|
+
**Impact:** LOW-MEDIUM
|
|
17
|
+
**Tags:** initialization, useEffect, app-startup, side-effects
|
|
18
|
+
|
|
19
|
+
## Initialize App Once, Not Per Mount
|
|
20
|
+
|
|
21
|
+
Do not put app-wide initialization that must run once per app load inside `useEffect([])` of a component. Components can remount and effects will re-run. Use a module-level guard or top-level init in the entry module instead.
|
|
22
|
+
|
|
23
|
+
**Incorrect (runs twice in dev, re-runs on remount):**
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
function Comp() {
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
loadFromStorage()
|
|
29
|
+
checkAuthToken()
|
|
30
|
+
}, [])
|
|
31
|
+
|
|
32
|
+
// ...
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Correct (once per app load):**
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
let didInit = false
|
|
40
|
+
|
|
41
|
+
function Comp() {
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (didInit) return
|
|
44
|
+
didInit = true
|
|
45
|
+
loadFromStorage()
|
|
46
|
+
checkAuthToken()
|
|
47
|
+
}, [])
|
|
48
|
+
|
|
49
|
+
// ...
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Reference: [Initializing the application](https://react.dev/learn/you-might-not-need-an-effect#initializing-the-application)
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Rule 8.2: Store Event Handlers in Refs
|
|
58
|
+
|
|
59
|
+
**Impact:** LOW
|
|
60
|
+
**Tags:** advanced, hooks, refs, event-handlers, optimization
|
|
61
|
+
|
|
62
|
+
## Store Event Handlers in Refs
|
|
63
|
+
|
|
64
|
+
Store callbacks in refs when used in effects that shouldn't re-subscribe on callback changes.
|
|
65
|
+
|
|
66
|
+
**Incorrect (re-subscribes on every render):**
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
function useWindowEvent(event: string, handler: (e) => void) {
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
window.addEventListener(event, handler)
|
|
72
|
+
return () => window.removeEventListener(event, handler)
|
|
73
|
+
}, [event, handler])
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Correct (stable subscription):**
|
|
78
|
+
|
|
79
|
+
```tsx
|
|
80
|
+
function useWindowEvent(event: string, handler: (e) => void) {
|
|
81
|
+
const handlerRef = useRef(handler)
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
handlerRef.current = handler
|
|
84
|
+
}, [handler])
|
|
85
|
+
|
|
86
|
+
useEffect(() => {
|
|
87
|
+
const listener = (e) => handlerRef.current(e)
|
|
88
|
+
window.addEventListener(event, listener)
|
|
89
|
+
return () => window.removeEventListener(event, listener)
|
|
90
|
+
}, [event])
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Alternative: use `useEffectEvent` if you're on latest React:**
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
import { useEffectEvent } from 'react'
|
|
98
|
+
|
|
99
|
+
function useWindowEvent(event: string, handler: (e) => void) {
|
|
100
|
+
const onEvent = useEffectEvent(handler)
|
|
101
|
+
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
window.addEventListener(event, onEvent)
|
|
104
|
+
return () => window.removeEventListener(event, onEvent)
|
|
105
|
+
}, [event])
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`useEffectEvent` provides a cleaner API for the same pattern: it creates a stable function reference that always calls the latest version of the handler.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Rule 8.3: useEffectEvent for Stable Callback Refs
|
|
114
|
+
|
|
115
|
+
**Impact:** LOW
|
|
116
|
+
**Tags:** advanced, hooks, useEffectEvent, refs, optimization
|
|
117
|
+
|
|
118
|
+
## useEffectEvent for Stable Callback Refs
|
|
119
|
+
|
|
120
|
+
Access latest values in callbacks without adding them to dependency arrays. Prevents effect re-runs while avoiding stale closures.
|
|
121
|
+
|
|
122
|
+
**Incorrect (effect re-runs on every callback change):**
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
function SearchInput({ onSearch }: { onSearch: (q: string) => void }) {
|
|
126
|
+
const [query, setQuery] = useState('')
|
|
127
|
+
|
|
128
|
+
useEffect(() => {
|
|
129
|
+
const timeout = setTimeout(() => onSearch(query), 300)
|
|
130
|
+
return () => clearTimeout(timeout)
|
|
131
|
+
}, [query, onSearch])
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Correct (using React's useEffectEvent):**
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
import { useEffectEvent } from 'react';
|
|
139
|
+
|
|
140
|
+
function SearchInput({ onSearch }: { onSearch: (q: string) => void }) {
|
|
141
|
+
const [query, setQuery] = useState('')
|
|
142
|
+
const onSearchEvent = useEffectEvent(onSearch)
|
|
143
|
+
|
|
144
|
+
useEffect(() => {
|
|
145
|
+
const timeout = setTimeout(() => onSearchEvent(query), 300)
|
|
146
|
+
return () => clearTimeout(timeout)
|
|
147
|
+
}, [query])
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nextjs-react-expert
|
|
3
|
+
description: React and Next.js performance optimization from Vercel Engineering. Use when building React components, optimizing performance, eliminating waterfalls, reducing bundle size, reviewing code for performance issues, or implementing server/client-side optimizations.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Glob, Grep, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Next.js & React Performance Expert
|
|
8
|
+
|
|
9
|
+
> **From Vercel Engineering** - 57 optimization rules prioritized by impact
|
|
10
|
+
> **Philosophy:** Eliminate waterfalls first, optimize bundles second, then micro-optimize.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 🎯 Selective Reading Rule (MANDATORY)
|
|
15
|
+
|
|
16
|
+
**Read ONLY sections relevant to your task!** Check the content map below and load what you need.
|
|
17
|
+
|
|
18
|
+
> 🔴 **For performance reviews: Start with CRITICAL sections (1-2), then move to HIGH/MEDIUM.**
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 📑 Content Map
|
|
23
|
+
|
|
24
|
+
| File | Impact | Rules | When to Read |
|
|
25
|
+
|------|--------|-------|--------------|
|
|
26
|
+
| `1-async-eliminating-waterfalls.md` | 🔴 **CRITICAL** | 5 rules | Slow page loads, sequential API calls, data fetching waterfalls |
|
|
27
|
+
| `2-bundle-bundle-size-optimization.md` | 🔴 **CRITICAL** | 5 rules | Large bundle size, slow Time to Interactive, First Load issues |
|
|
28
|
+
| `3-server-server-side-performance.md` | 🟠 **HIGH** | 7 rules | Slow SSR, API route optimization, server-side waterfalls |
|
|
29
|
+
| `4-client-client-side-data-fetching.md` | 🟡 **MEDIUM-HIGH** | 4 rules | Client data management, SWR patterns, deduplication |
|
|
30
|
+
| `5-rerender-re-render-optimization.md` | 🟡 **MEDIUM** | 12 rules | Excessive re-renders, React performance, memoization |
|
|
31
|
+
| `6-rendering-rendering-performance.md` | 🟡 **MEDIUM** | 9 rules | Rendering bottlenecks, virtualization, image optimization |
|
|
32
|
+
| `7-js-javascript-performance.md` | ⚪ **LOW-MEDIUM** | 12 rules | Micro-optimizations, caching, loop performance |
|
|
33
|
+
| `8-advanced-advanced-patterns.md` | 🔵 **VARIABLE** | 3 rules | Advanced React patterns, useLatest, init-once |
|
|
34
|
+
|
|
35
|
+
**Total: 57 rules across 8 categories**
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 🚀 Quick Decision Tree
|
|
40
|
+
|
|
41
|
+
**What's your performance issue?**
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
🐌 Slow page loads / Long Time to Interactive
|
|
45
|
+
→ Read Section 1: Eliminating Waterfalls
|
|
46
|
+
→ Read Section 2: Bundle Size Optimization
|
|
47
|
+
|
|
48
|
+
📦 Large bundle size (> 200KB)
|
|
49
|
+
→ Read Section 2: Bundle Size Optimization
|
|
50
|
+
→ Check: Dynamic imports, barrel imports, tree-shaking
|
|
51
|
+
|
|
52
|
+
🖥️ Slow Server-Side Rendering
|
|
53
|
+
→ Read Section 3: Server-Side Performance
|
|
54
|
+
→ Check: Parallel data fetching, streaming
|
|
55
|
+
|
|
56
|
+
🔄 Too many re-renders / UI lag
|
|
57
|
+
→ Read Section 5: Re-render Optimization
|
|
58
|
+
→ Check: React.memo, useMemo, useCallback
|
|
59
|
+
|
|
60
|
+
🎨 Rendering performance issues
|
|
61
|
+
→ Read Section 6: Rendering Performance
|
|
62
|
+
→ Check: Virtualization, layout thrashing
|
|
63
|
+
|
|
64
|
+
🌐 Client-side data fetching problems
|
|
65
|
+
→ Read Section 4: Client-Side Data Fetching
|
|
66
|
+
→ Check: SWR deduplication, localStorage
|
|
67
|
+
|
|
68
|
+
✨ Need advanced patterns
|
|
69
|
+
→ Read Section 8: Advanced Patterns
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 📊 Impact Priority Guide
|
|
75
|
+
|
|
76
|
+
**Use this order when doing comprehensive optimization:**
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
1️⃣ CRITICAL (Biggest Gains - Do First):
|
|
80
|
+
├─ Section 1: Eliminating Waterfalls
|
|
81
|
+
│ └─ Each waterfall adds full network latency (100-500ms+)
|
|
82
|
+
└─ Section 2: Bundle Size Optimization
|
|
83
|
+
└─ Affects Time to Interactive and Largest Contentful Paint
|
|
84
|
+
|
|
85
|
+
2️⃣ HIGH (Significant Impact - Do Second):
|
|
86
|
+
└─ Section 3: Server-Side Performance
|
|
87
|
+
└─ Eliminates server-side waterfalls, faster response times
|
|
88
|
+
|
|
89
|
+
3️⃣ MEDIUM (Moderate Gains - Do Third):
|
|
90
|
+
├─ Section 4: Client-Side Data Fetching
|
|
91
|
+
├─ Section 5: Re-render Optimization
|
|
92
|
+
└─ Section 6: Rendering Performance
|
|
93
|
+
|
|
94
|
+
4️⃣ LOW (Polish - Do Last):
|
|
95
|
+
├─ Section 7: JavaScript Performance
|
|
96
|
+
└─ Section 8: Advanced Patterns
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 🔗 Related Skills
|
|
102
|
+
|
|
103
|
+
| Need | Skill |
|
|
104
|
+
|------|-------|
|
|
105
|
+
| API design patterns | `@[skills/api-patterns]` |
|
|
106
|
+
| Database optimization | `@[skills/database-design]` |
|
|
107
|
+
| Testing strategies | `@[skills/testing-patterns]` |
|
|
108
|
+
| UI/UX design principles | `@[skills/frontend-design]` |
|
|
109
|
+
| TypeScript patterns | `@[skills/typescript-expert]` |
|
|
110
|
+
| Deployment & DevOps | `@[skills/deployment-procedures]` |
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## ✅ Performance Review Checklist
|
|
115
|
+
|
|
116
|
+
Before shipping to production:
|
|
117
|
+
|
|
118
|
+
**Critical (Must Fix):**
|
|
119
|
+
- [ ] No sequential data fetching (waterfalls eliminated)
|
|
120
|
+
- [ ] Bundle size < 200KB for main bundle
|
|
121
|
+
- [ ] No barrel imports in app code
|
|
122
|
+
- [ ] Dynamic imports used for large components
|
|
123
|
+
- [ ] Parallel data fetching where possible
|
|
124
|
+
|
|
125
|
+
**High Priority:**
|
|
126
|
+
- [ ] Server components used where appropriate
|
|
127
|
+
- [ ] API routes optimized (no N+1 queries)
|
|
128
|
+
- [ ] Suspense boundaries for data fetching
|
|
129
|
+
- [ ] Static generation used where possible
|
|
130
|
+
|
|
131
|
+
**Medium Priority:**
|
|
132
|
+
- [ ] Expensive computations memoized
|
|
133
|
+
- [ ] List rendering virtualized (if > 100 items)
|
|
134
|
+
- [ ] Images optimized with next/image
|
|
135
|
+
- [ ] No unnecessary re-renders
|
|
136
|
+
|
|
137
|
+
**Low Priority (Polish):**
|
|
138
|
+
- [ ] Hot path loops optimized
|
|
139
|
+
- [ ] RegExp patterns hoisted
|
|
140
|
+
- [ ] Property access cached in loops
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## ❌ Anti-Patterns (Common Mistakes)
|
|
145
|
+
|
|
146
|
+
**DON'T:**
|
|
147
|
+
- ❌ Use sequential `await` for independent operations
|
|
148
|
+
- ❌ Import entire libraries when you need one function
|
|
149
|
+
- ❌ Use barrel exports (`index.ts` re-exports) in app code
|
|
150
|
+
- ❌ Skip dynamic imports for large components/libraries
|
|
151
|
+
- ❌ Fetch data in useEffect without deduplication
|
|
152
|
+
- ❌ Forget to memoize expensive computations
|
|
153
|
+
- ❌ Use client components when server components work
|
|
154
|
+
|
|
155
|
+
**DO:**
|
|
156
|
+
- ✅ Fetch data in parallel with `Promise.all()`
|
|
157
|
+
- ✅ Use dynamic imports: `const Comp = dynamic(() => import('./Heavy'))`
|
|
158
|
+
- ✅ Import directly: `import { specific } from 'library/specific'`
|
|
159
|
+
- ✅ Use Suspense boundaries for better UX
|
|
160
|
+
- ✅ Leverage React Server Components
|
|
161
|
+
- ✅ Measure performance before optimizing
|
|
162
|
+
- ✅ Use Next.js built-in optimizations (next/image, next/font)
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 🎯 How to Use This Skill
|
|
167
|
+
|
|
168
|
+
### For New Features:
|
|
169
|
+
1. Check **Section 1 & 2** while building (prevent waterfalls, keep bundle small)
|
|
170
|
+
2. Use server components by default (Section 3)
|
|
171
|
+
3. Apply memoization for expensive operations (Section 5)
|
|
172
|
+
|
|
173
|
+
### For Performance Reviews:
|
|
174
|
+
1. Start with **Section 1** (waterfalls = biggest impact)
|
|
175
|
+
2. Then **Section 2** (bundle size)
|
|
176
|
+
3. Then **Section 3** (server-side)
|
|
177
|
+
4. Finally other sections as needed
|
|
178
|
+
|
|
179
|
+
### For Debugging Slow Performance:
|
|
180
|
+
1. Identify the symptom (slow load, lag, etc.)
|
|
181
|
+
2. Use Quick Decision Tree above
|
|
182
|
+
3. Read relevant section
|
|
183
|
+
4. Apply fixes in priority order
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 📚 Learning Path
|
|
188
|
+
|
|
189
|
+
**Beginner (Focus on Critical):**
|
|
190
|
+
→ Section 1: Eliminating Waterfalls
|
|
191
|
+
→ Section 2: Bundle Size Optimization
|
|
192
|
+
|
|
193
|
+
**Intermediate (Add High Priority):**
|
|
194
|
+
→ Section 3: Server-Side Performance
|
|
195
|
+
→ Section 5: Re-render Optimization
|
|
196
|
+
|
|
197
|
+
**Advanced (Full Optimization):**
|
|
198
|
+
→ All sections + Section 8: Advanced Patterns
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## 🔍 Validation Script
|
|
203
|
+
|
|
204
|
+
| Script | Purpose | Command |
|
|
205
|
+
|--------|---------|---------|
|
|
206
|
+
| `scripts/react_performance_checker.py` | Automated performance audit | `python scripts/react_performance_checker.py <project_path>` |
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## 📖 Section Details
|
|
211
|
+
|
|
212
|
+
### Section 1: Eliminating Waterfalls (CRITICAL)
|
|
213
|
+
**Impact:** Each waterfall adds 100-500ms+ latency
|
|
214
|
+
**Key Concepts:** Parallel fetching, Promise.all(), Suspense boundaries, preloading
|
|
215
|
+
|
|
216
|
+
### Section 2: Bundle Size Optimization (CRITICAL)
|
|
217
|
+
**Impact:** Directly affects Time to Interactive, Largest Contentful Paint
|
|
218
|
+
**Key Concepts:** Dynamic imports, tree-shaking, barrel import avoidance
|
|
219
|
+
|
|
220
|
+
### Section 3: Server-Side Performance (HIGH)
|
|
221
|
+
**Impact:** Faster server responses, better SEO
|
|
222
|
+
**Key Concepts:** Parallel server fetching, streaming, API route optimization
|
|
223
|
+
|
|
224
|
+
### Section 4: Client-Side Data Fetching (MEDIUM-HIGH)
|
|
225
|
+
**Impact:** Reduces redundant requests, better UX
|
|
226
|
+
**Key Concepts:** SWR deduplication, localStorage caching, event listeners
|
|
227
|
+
|
|
228
|
+
### Section 5: Re-render Optimization (MEDIUM)
|
|
229
|
+
**Impact:** Smoother UI, less wasted computation
|
|
230
|
+
**Key Concepts:** React.memo, useMemo, useCallback, component structure
|
|
231
|
+
|
|
232
|
+
### Section 6: Rendering Performance (MEDIUM)
|
|
233
|
+
**Impact:** Better rendering efficiency
|
|
234
|
+
**Key Concepts:** Virtualization, image optimization, layout thrashing
|
|
235
|
+
|
|
236
|
+
### Section 7: JavaScript Performance (LOW-MEDIUM)
|
|
237
|
+
**Impact:** Incremental improvements in hot paths
|
|
238
|
+
**Key Concepts:** Loop optimization, caching, RegExp hoisting
|
|
239
|
+
|
|
240
|
+
### Section 8: Advanced Patterns (VARIABLE)
|
|
241
|
+
**Impact:** Specific use cases
|
|
242
|
+
**Key Concepts:** useLatest hook, init-once patterns, event handler refs
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## 🎓 Best Practices Summary
|
|
247
|
+
|
|
248
|
+
**Golden Rules:**
|
|
249
|
+
1. **Measure first** - Use React DevTools Profiler, Chrome DevTools
|
|
250
|
+
2. **Biggest impact first** - Waterfalls → Bundle → Server → Micro
|
|
251
|
+
3. **Don't over-optimize** - Focus on real bottlenecks
|
|
252
|
+
4. **Use platform features** - Next.js has optimizations built-in
|
|
253
|
+
5. **Think about users** - Real-world conditions matter
|
|
254
|
+
|
|
255
|
+
**Performance Mindset:**
|
|
256
|
+
- Every `await` in sequence = potential waterfall
|
|
257
|
+
- Every `import` = potential bundle bloat
|
|
258
|
+
- Every re-render = wasted computation (if unnecessary)
|
|
259
|
+
- Server components = less JavaScript to ship
|
|
260
|
+
- Measure, don't guess
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
**Source:** Vercel Engineering
|
|
265
|
+
**Date:** January 2026
|
|
266
|
+
**Version:** 1.0.0
|
|
267
|
+
**Total Rules:** 57 across 8 categories
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Conversion Script: React Best Practices → .agent Format
|
|
4
|
+
Merges 59 individual rules into 8 grouped section files
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import re
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Dict, List, Tuple
|
|
11
|
+
|
|
12
|
+
# Section metadata from _sections.md
|
|
13
|
+
SECTIONS = {
|
|
14
|
+
'async': {
|
|
15
|
+
'number': 1,
|
|
16
|
+
'title': 'Eliminating Waterfalls',
|
|
17
|
+
'impact': 'CRITICAL',
|
|
18
|
+
'description': 'Waterfalls are the #1 performance killer. Each sequential await adds full network latency. Eliminating them yields the largest gains.'
|
|
19
|
+
},
|
|
20
|
+
'bundle': {
|
|
21
|
+
'number': 2,
|
|
22
|
+
'title': 'Bundle Size Optimization',
|
|
23
|
+
'impact': 'CRITICAL',
|
|
24
|
+
'description': 'Reducing initial bundle size improves Time to Interactive and Largest Contentful Paint.'
|
|
25
|
+
},
|
|
26
|
+
'server': {
|
|
27
|
+
'number': 3,
|
|
28
|
+
'title': 'Server-Side Performance',
|
|
29
|
+
'impact': 'HIGH',
|
|
30
|
+
'description': 'Optimizing server-side rendering and data fetching eliminates server-side waterfalls and reduces response times.'
|
|
31
|
+
},
|
|
32
|
+
'client': {
|
|
33
|
+
'number': 4,
|
|
34
|
+
'title': 'Client-Side Data Fetching',
|
|
35
|
+
'impact': 'MEDIUM-HIGH',
|
|
36
|
+
'description': 'Automatic deduplication and efficient data fetching patterns reduce redundant network requests.'
|
|
37
|
+
},
|
|
38
|
+
'rerender': {
|
|
39
|
+
'number': 5,
|
|
40
|
+
'title': 'Re-render Optimization',
|
|
41
|
+
'impact': 'MEDIUM',
|
|
42
|
+
'description': 'Reducing unnecessary re-renders minimizes wasted computation and improves UI responsiveness.'
|
|
43
|
+
},
|
|
44
|
+
'rendering': {
|
|
45
|
+
'number': 6,
|
|
46
|
+
'title': 'Rendering Performance',
|
|
47
|
+
'impact': 'MEDIUM',
|
|
48
|
+
'description': 'Optimizing the rendering process reduces the work the browser needs to do.'
|
|
49
|
+
},
|
|
50
|
+
'js': {
|
|
51
|
+
'number': 7,
|
|
52
|
+
'title': 'JavaScript Performance',
|
|
53
|
+
'impact': 'LOW-MEDIUM',
|
|
54
|
+
'description': 'Micro-optimizations for hot paths can add up to meaningful improvements.'
|
|
55
|
+
},
|
|
56
|
+
'advanced': {
|
|
57
|
+
'number': 8,
|
|
58
|
+
'title': 'Advanced Patterns',
|
|
59
|
+
'impact': 'VARIABLE',
|
|
60
|
+
'description': 'Advanced patterns for specific cases that require careful implementation.'
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def parse_frontmatter(content: str) -> Tuple[Dict, str]:
|
|
66
|
+
"""Parse markdown frontmatter and body"""
|
|
67
|
+
if not content.startswith('---'):
|
|
68
|
+
return {}, content
|
|
69
|
+
|
|
70
|
+
parts = content.split('---', 2)
|
|
71
|
+
if len(parts) < 3:
|
|
72
|
+
return {}, content
|
|
73
|
+
|
|
74
|
+
# Parse YAML frontmatter manually (simple key: value)
|
|
75
|
+
frontmatter = {}
|
|
76
|
+
for line in parts[1].strip().split('\n'):
|
|
77
|
+
if ':' in line:
|
|
78
|
+
key, value = line.split(':', 1)
|
|
79
|
+
frontmatter[key.strip()] = value.strip()
|
|
80
|
+
|
|
81
|
+
body = parts[2].strip()
|
|
82
|
+
return frontmatter, body
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def parse_rule_file(filepath: Path) -> Dict:
|
|
86
|
+
"""Parse a single rule file"""
|
|
87
|
+
with open(filepath, 'r', encoding='utf-8') as f:
|
|
88
|
+
content = f.read()
|
|
89
|
+
|
|
90
|
+
frontmatter, body = parse_frontmatter(content)
|
|
91
|
+
|
|
92
|
+
# Extract prefix from filename
|
|
93
|
+
filename = filepath.stem
|
|
94
|
+
prefix = filename.split('-')[0]
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
'filename': filepath.name,
|
|
98
|
+
'prefix': prefix,
|
|
99
|
+
'title': frontmatter.get('title', filename),
|
|
100
|
+
'impact': frontmatter.get('impact', ''),
|
|
101
|
+
'impactDescription': frontmatter.get('impactDescription', ''),
|
|
102
|
+
'tags': frontmatter.get('tags', ''),
|
|
103
|
+
'body': body,
|
|
104
|
+
'frontmatter': frontmatter
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def group_rules_by_section(rules_dir: Path) -> Dict[str, List[Dict]]:
|
|
109
|
+
"""Group all rules by their section prefix"""
|
|
110
|
+
grouped = {prefix: [] for prefix in SECTIONS.keys()}
|
|
111
|
+
|
|
112
|
+
for rule_file in sorted(rules_dir.glob('*.md')):
|
|
113
|
+
# Skip special files
|
|
114
|
+
if rule_file.name.startswith('_'):
|
|
115
|
+
continue
|
|
116
|
+
|
|
117
|
+
rule = parse_rule_file(rule_file)
|
|
118
|
+
prefix = rule['prefix']
|
|
119
|
+
|
|
120
|
+
if prefix in grouped:
|
|
121
|
+
grouped[prefix].append(rule)
|
|
122
|
+
else:
|
|
123
|
+
print(f"[WARNING] Unknown prefix '{prefix}' in file: {rule_file.name}")
|
|
124
|
+
|
|
125
|
+
return grouped
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def generate_section_file(section_prefix: str, rules: List[Dict], output_dir: Path):
|
|
129
|
+
"""Generate a merged section file"""
|
|
130
|
+
if not rules:
|
|
131
|
+
print(f"[WARNING] No rules found for section: {section_prefix}")
|
|
132
|
+
return
|
|
133
|
+
|
|
134
|
+
section_meta = SECTIONS[section_prefix]
|
|
135
|
+
section_num = section_meta['number']
|
|
136
|
+
section_title = section_meta['title']
|
|
137
|
+
impact = section_meta['impact']
|
|
138
|
+
description = section_meta['description']
|
|
139
|
+
|
|
140
|
+
# Sort rules by title
|
|
141
|
+
rules.sort(key=lambda r: r['title'])
|
|
142
|
+
|
|
143
|
+
# Build content
|
|
144
|
+
content = f"""# {section_num}. {section_title}
|
|
145
|
+
|
|
146
|
+
> **Impact:** {impact}
|
|
147
|
+
> **Focus:** {description}
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Overview
|
|
152
|
+
|
|
153
|
+
This section contains **{len(rules)} rules** focused on {section_title.lower()}.
|
|
154
|
+
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
# Add each rule
|
|
158
|
+
for i, rule in enumerate(rules, 1):
|
|
159
|
+
rule_id = f"{section_num}.{i}"
|
|
160
|
+
title = rule['title']
|
|
161
|
+
rule_impact = rule['impact']
|
|
162
|
+
tags = rule['tags']
|
|
163
|
+
body = rule['body']
|
|
164
|
+
|
|
165
|
+
content += f"""---
|
|
166
|
+
|
|
167
|
+
## Rule {rule_id}: {title}
|
|
168
|
+
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
if rule_impact:
|
|
172
|
+
content += f"**Impact:** {rule_impact} \n"
|
|
173
|
+
|
|
174
|
+
if tags:
|
|
175
|
+
content += f"**Tags:** {tags} \n"
|
|
176
|
+
|
|
177
|
+
content += f"\n{body}\n\n"
|
|
178
|
+
|
|
179
|
+
# Write file
|
|
180
|
+
output_file = output_dir / f"{section_num}-{section_prefix}-{section_title.lower().replace(' ', '-')}.md"
|
|
181
|
+
output_file.write_text(content, encoding='utf-8')
|
|
182
|
+
print(f"[OK] Generated: {output_file.name} ({len(rules)} rules)")
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def main():
|
|
186
|
+
"""Main conversion function"""
|
|
187
|
+
# Paths
|
|
188
|
+
base_dir = Path(__file__).parent.parent.parent.parent.parent
|
|
189
|
+
rules_dir = base_dir / "others/agent-skills/skills/react-best-practices/rules"
|
|
190
|
+
output_dir = base_dir / ".agent/skills/nextjs-react-expert"
|
|
191
|
+
|
|
192
|
+
print(f"[*] Reading rules from: {rules_dir}")
|
|
193
|
+
print(f"[*] Output to: {output_dir}")
|
|
194
|
+
print()
|
|
195
|
+
|
|
196
|
+
# Check if rules directory exists
|
|
197
|
+
if not rules_dir.exists():
|
|
198
|
+
print(f"[ERROR] Rules directory not found: {rules_dir}")
|
|
199
|
+
return
|
|
200
|
+
|
|
201
|
+
# Group rules
|
|
202
|
+
print("[*] Grouping rules by section...")
|
|
203
|
+
grouped_rules = group_rules_by_section(rules_dir)
|
|
204
|
+
|
|
205
|
+
# Stats
|
|
206
|
+
total_rules = sum(len(rules) for rules in grouped_rules.values())
|
|
207
|
+
print(f"[*] Found {total_rules} total rules")
|
|
208
|
+
print()
|
|
209
|
+
|
|
210
|
+
# Generate section files
|
|
211
|
+
print("[*] Generating section files...")
|
|
212
|
+
for section_prefix in SECTIONS.keys():
|
|
213
|
+
rules = grouped_rules[section_prefix]
|
|
214
|
+
generate_section_file(section_prefix, rules, output_dir)
|
|
215
|
+
|
|
216
|
+
print()
|
|
217
|
+
print("[SUCCESS] Conversion complete!")
|
|
218
|
+
print(f"[*] Generated 8 section files from {total_rules} rules")
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
if __name__ == '__main__':
|
|
222
|
+
main()
|