agy-superpowers 5.0.8 → 5.0.9

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 (204) hide show
  1. package/package.json +1 -1
  2. package/template/agent/rules/superpowers.md +54 -0
  3. package/template/agent/skills/frontend-developer/SKILL.md +39 -0
  4. package/template/agent/skills/frontend-developer/references/react-nextjs.md +343 -0
  5. package/template/agent/skills/frontend-developer/references/react-rules/_sections.md +46 -0
  6. package/template/agent/skills/frontend-developer/references/react-rules/_template.md +28 -0
  7. package/template/agent/skills/frontend-developer/references/react-rules/advanced-event-handler-refs.md +55 -0
  8. package/template/agent/skills/frontend-developer/references/react-rules/advanced-init-once.md +42 -0
  9. package/template/agent/skills/frontend-developer/references/react-rules/advanced-use-latest.md +39 -0
  10. package/template/agent/skills/frontend-developer/references/react-rules/async-api-routes.md +38 -0
  11. package/template/agent/skills/frontend-developer/references/react-rules/async-defer-await.md +80 -0
  12. package/template/agent/skills/frontend-developer/references/react-rules/async-dependencies.md +51 -0
  13. package/template/agent/skills/frontend-developer/references/react-rules/async-parallel.md +28 -0
  14. package/template/agent/skills/frontend-developer/references/react-rules/async-suspense-boundaries.md +99 -0
  15. package/template/agent/skills/frontend-developer/references/react-rules/bundle-barrel-imports.md +59 -0
  16. package/template/agent/skills/frontend-developer/references/react-rules/bundle-conditional.md +31 -0
  17. package/template/agent/skills/frontend-developer/references/react-rules/bundle-defer-third-party.md +49 -0
  18. package/template/agent/skills/frontend-developer/references/react-rules/bundle-dynamic-imports.md +35 -0
  19. package/template/agent/skills/frontend-developer/references/react-rules/bundle-preload.md +50 -0
  20. package/template/agent/skills/frontend-developer/references/react-rules/client-event-listeners.md +74 -0
  21. package/template/agent/skills/frontend-developer/references/react-rules/client-localstorage-schema.md +71 -0
  22. package/template/agent/skills/frontend-developer/references/react-rules/client-passive-event-listeners.md +48 -0
  23. package/template/agent/skills/frontend-developer/references/react-rules/client-swr-dedup.md +56 -0
  24. package/template/agent/skills/frontend-developer/references/react-rules/js-batch-dom-css.md +107 -0
  25. package/template/agent/skills/frontend-developer/references/react-rules/js-cache-function-results.md +80 -0
  26. package/template/agent/skills/frontend-developer/references/react-rules/js-cache-property-access.md +28 -0
  27. package/template/agent/skills/frontend-developer/references/react-rules/js-cache-storage.md +70 -0
  28. package/template/agent/skills/frontend-developer/references/react-rules/js-combine-iterations.md +32 -0
  29. package/template/agent/skills/frontend-developer/references/react-rules/js-early-exit.md +50 -0
  30. package/template/agent/skills/frontend-developer/references/react-rules/js-flatmap-filter.md +60 -0
  31. package/template/agent/skills/frontend-developer/references/react-rules/js-hoist-regexp.md +45 -0
  32. package/template/agent/skills/frontend-developer/references/react-rules/js-index-maps.md +37 -0
  33. package/template/agent/skills/frontend-developer/references/react-rules/js-length-check-first.md +49 -0
  34. package/template/agent/skills/frontend-developer/references/react-rules/js-min-max-loop.md +82 -0
  35. package/template/agent/skills/frontend-developer/references/react-rules/js-set-map-lookups.md +24 -0
  36. package/template/agent/skills/frontend-developer/references/react-rules/js-tosorted-immutable.md +57 -0
  37. package/template/agent/skills/frontend-developer/references/react-rules/rendering-activity.md +26 -0
  38. package/template/agent/skills/frontend-developer/references/react-rules/rendering-animate-svg-wrapper.md +47 -0
  39. package/template/agent/skills/frontend-developer/references/react-rules/rendering-conditional-render.md +40 -0
  40. package/template/agent/skills/frontend-developer/references/react-rules/rendering-content-visibility.md +38 -0
  41. package/template/agent/skills/frontend-developer/references/react-rules/rendering-hoist-jsx.md +46 -0
  42. package/template/agent/skills/frontend-developer/references/react-rules/rendering-hydration-no-flicker.md +82 -0
  43. package/template/agent/skills/frontend-developer/references/react-rules/rendering-hydration-suppress-warning.md +30 -0
  44. package/template/agent/skills/frontend-developer/references/react-rules/rendering-resource-hints.md +85 -0
  45. package/template/agent/skills/frontend-developer/references/react-rules/rendering-script-defer-async.md +68 -0
  46. package/template/agent/skills/frontend-developer/references/react-rules/rendering-svg-precision.md +28 -0
  47. package/template/agent/skills/frontend-developer/references/react-rules/rendering-usetransition-loading.md +75 -0
  48. package/template/agent/skills/frontend-developer/references/react-rules/rerender-defer-reads.md +39 -0
  49. package/template/agent/skills/frontend-developer/references/react-rules/rerender-dependencies.md +45 -0
  50. package/template/agent/skills/frontend-developer/references/react-rules/rerender-derived-state-no-effect.md +40 -0
  51. package/template/agent/skills/frontend-developer/references/react-rules/rerender-derived-state.md +29 -0
  52. package/template/agent/skills/frontend-developer/references/react-rules/rerender-functional-setstate.md +74 -0
  53. package/template/agent/skills/frontend-developer/references/react-rules/rerender-lazy-state-init.md +58 -0
  54. package/template/agent/skills/frontend-developer/references/react-rules/rerender-memo-with-default-value.md +38 -0
  55. package/template/agent/skills/frontend-developer/references/react-rules/rerender-memo.md +44 -0
  56. package/template/agent/skills/frontend-developer/references/react-rules/rerender-move-effect-to-event.md +45 -0
  57. package/template/agent/skills/frontend-developer/references/react-rules/rerender-no-inline-components.md +82 -0
  58. package/template/agent/skills/frontend-developer/references/react-rules/rerender-simple-expression-in-memo.md +35 -0
  59. package/template/agent/skills/frontend-developer/references/react-rules/rerender-split-combined-hooks.md +64 -0
  60. package/template/agent/skills/frontend-developer/references/react-rules/rerender-transitions.md +40 -0
  61. package/template/agent/skills/frontend-developer/references/react-rules/rerender-use-deferred-value.md +59 -0
  62. package/template/agent/skills/frontend-developer/references/react-rules/rerender-use-ref-transient-values.md +73 -0
  63. package/template/agent/skills/frontend-developer/references/react-rules/server-after-nonblocking.md +73 -0
  64. package/template/agent/skills/frontend-developer/references/react-rules/server-auth-actions.md +96 -0
  65. package/template/agent/skills/frontend-developer/references/react-rules/server-cache-lru.md +41 -0
  66. package/template/agent/skills/frontend-developer/references/react-rules/server-cache-react.md +76 -0
  67. package/template/agent/skills/frontend-developer/references/react-rules/server-dedup-props.md +65 -0
  68. package/template/agent/skills/frontend-developer/references/react-rules/server-hoist-static-io.md +142 -0
  69. package/template/agent/skills/frontend-developer/references/react-rules/server-parallel-fetching.md +83 -0
  70. package/template/agent/skills/frontend-developer/references/react-rules/server-serialization.md +38 -0
  71. package/template/agent/skills/frontend-developer/references/svelte-sveltekit.md +220 -0
  72. package/template/agent/skills/frontend-developer/references/vanilla.md +275 -0
  73. package/template/agent/skills/frontend-developer/references/vue-nuxt.md +289 -0
  74. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/_index.md +154 -0
  75. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/animation-class-based-technique.md +254 -0
  76. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/animation-state-driven-technique.md +291 -0
  77. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-async.md +97 -0
  78. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-data-flow.md +307 -0
  79. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-fallthrough-attrs.md +174 -0
  80. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-keep-alive.md +137 -0
  81. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-slots.md +216 -0
  82. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-suspense.md +228 -0
  83. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-teleport.md +108 -0
  84. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-transition-group.md +128 -0
  85. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-transition.md +125 -0
  86. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/composables.md +290 -0
  87. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/directives.md +162 -0
  88. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/perf-avoid-component-abstraction-in-lists.md +159 -0
  89. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/perf-v-once-v-memo-directives.md +182 -0
  90. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/perf-virtualize-large-lists.md +187 -0
  91. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/plugins.md +166 -0
  92. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/reactivity.md +344 -0
  93. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/render-functions.md +201 -0
  94. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/sfc.md +310 -0
  95. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/state-management.md +135 -0
  96. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/updated-hook-performance.md +187 -0
  97. package/template/agent/skills/frontend-developer/references/vue-rules/router/_index.md +23 -0
  98. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-beforeenter-no-param-trigger.md +167 -0
  99. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-beforerouteenter-no-this.md +176 -0
  100. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-guard-async-await-pattern.md +227 -0
  101. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-navigation-guard-infinite-loop.md +187 -0
  102. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-navigation-guard-next-deprecated.md +150 -0
  103. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-param-change-no-lifecycle.md +181 -0
  104. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-simple-routing-cleanup.md +209 -0
  105. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-use-vue-router-for-production.md +183 -0
  106. package/template/agent/skills/frontend-developer/references/vue-rules/testing/_index.md +29 -0
  107. package/template/agent/skills/frontend-developer/references/vue-rules/testing/async-component-testing.md +163 -0
  108. package/template/agent/skills/frontend-developer/references/vue-rules/testing/teleport-testing-complexity.md +158 -0
  109. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-async-await-flushpromises.md +175 -0
  110. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-browser-vs-node-runners.md +208 -0
  111. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-component-blackbox-approach.md +144 -0
  112. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-composables-helper-wrapper.md +238 -0
  113. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-e2e-playwright-recommended.md +242 -0
  114. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-no-snapshot-only.md +197 -0
  115. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-pinia-store-setup.md +228 -0
  116. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-suspense-async-components.md +229 -0
  117. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-vitest-recommended-for-vue.md +204 -0
  118. package/template/agent/skills/mobile-developer/SKILL.md +52 -0
  119. package/template/agent/skills/mobile-developer/references/android-native.md +396 -0
  120. package/template/agent/skills/mobile-developer/references/android-rules/android-accessibility.md +36 -0
  121. package/template/agent/skills/mobile-developer/references/android-rules/android-architecture.md +52 -0
  122. package/template/agent/skills/mobile-developer/references/android-rules/android-coroutines.md +139 -0
  123. package/template/agent/skills/mobile-developer/references/android-rules/android-data-layer.md +51 -0
  124. package/template/agent/skills/mobile-developer/references/android-rules/android-emulator-skill.md +108 -0
  125. package/template/agent/skills/mobile-developer/references/android-rules/android-gradle-logic.md +126 -0
  126. package/template/agent/skills/mobile-developer/references/android-rules/android-retrofit.md +142 -0
  127. package/template/agent/skills/mobile-developer/references/android-rules/android-testing.md +102 -0
  128. package/template/agent/skills/mobile-developer/references/android-rules/android-viewmodel.md +43 -0
  129. package/template/agent/skills/mobile-developer/references/android-rules/coil-compose.md +74 -0
  130. package/template/agent/skills/mobile-developer/references/android-rules/compose-navigation.md +422 -0
  131. package/template/agent/skills/mobile-developer/references/android-rules/compose-performance-audit.md +199 -0
  132. package/template/agent/skills/mobile-developer/references/android-rules/compose-ui.md +49 -0
  133. package/template/agent/skills/mobile-developer/references/android-rules/gradle-build-performance.md +346 -0
  134. package/template/agent/skills/mobile-developer/references/android-rules/kotlin-concurrency-expert.md +169 -0
  135. package/template/agent/skills/mobile-developer/references/android-rules/rxjava-to-coroutines-migration.md +101 -0
  136. package/template/agent/skills/mobile-developer/references/android-rules/xml-to-compose-migration.md +338 -0
  137. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-best-practices.md +52 -0
  138. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-checks-migration.md +134 -0
  139. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-cli-app-best-practices.md +123 -0
  140. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-doc-validation.md +45 -0
  141. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-matcher-best-practices.md +106 -0
  142. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-modern-features.md +241 -0
  143. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-package-maintenance.md +75 -0
  144. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-test-fundamentals.md +124 -0
  145. package/template/agent/skills/mobile-developer/references/flutter.md +291 -0
  146. package/template/agent/skills/mobile-developer/references/ios-native.md +358 -0
  147. package/template/agent/skills/mobile-developer/references/ios-rules/accessibility-patterns.md +215 -0
  148. package/template/agent/skills/mobile-developer/references/ios-rules/animation-advanced.md +403 -0
  149. package/template/agent/skills/mobile-developer/references/ios-rules/animation-basics.md +284 -0
  150. package/template/agent/skills/mobile-developer/references/ios-rules/animation-transitions.md +326 -0
  151. package/template/agent/skills/mobile-developer/references/ios-rules/charts-accessibility.md +135 -0
  152. package/template/agent/skills/mobile-developer/references/ios-rules/charts.md +602 -0
  153. package/template/agent/skills/mobile-developer/references/ios-rules/image-optimization.md +203 -0
  154. package/template/agent/skills/mobile-developer/references/ios-rules/latest-apis.md +464 -0
  155. package/template/agent/skills/mobile-developer/references/ios-rules/layout-best-practices.md +266 -0
  156. package/template/agent/skills/mobile-developer/references/ios-rules/liquid-glass.md +416 -0
  157. package/template/agent/skills/mobile-developer/references/ios-rules/list-patterns.md +394 -0
  158. package/template/agent/skills/mobile-developer/references/ios-rules/macos-scenes.md +318 -0
  159. package/template/agent/skills/mobile-developer/references/ios-rules/macos-views.md +357 -0
  160. package/template/agent/skills/mobile-developer/references/ios-rules/macos-window-styling.md +303 -0
  161. package/template/agent/skills/mobile-developer/references/ios-rules/performance-patterns.md +403 -0
  162. package/template/agent/skills/mobile-developer/references/ios-rules/scroll-patterns.md +293 -0
  163. package/template/agent/skills/mobile-developer/references/ios-rules/sheet-navigation-patterns.md +363 -0
  164. package/template/agent/skills/mobile-developer/references/ios-rules/state-management.md +417 -0
  165. package/template/agent/skills/mobile-developer/references/ios-rules/view-structure.md +389 -0
  166. package/template/agent/skills/mobile-developer/references/react-native-rules/_sections.md +86 -0
  167. package/template/agent/skills/mobile-developer/references/react-native-rules/_template.md +28 -0
  168. package/template/agent/skills/mobile-developer/references/react-native-rules/animation-derived-value.md +53 -0
  169. package/template/agent/skills/mobile-developer/references/react-native-rules/animation-gesture-detector-press.md +95 -0
  170. package/template/agent/skills/mobile-developer/references/react-native-rules/animation-gpu-properties.md +65 -0
  171. package/template/agent/skills/mobile-developer/references/react-native-rules/design-system-compound-components.md +66 -0
  172. package/template/agent/skills/mobile-developer/references/react-native-rules/fonts-config-plugin.md +71 -0
  173. package/template/agent/skills/mobile-developer/references/react-native-rules/imports-design-system-folder.md +68 -0
  174. package/template/agent/skills/mobile-developer/references/react-native-rules/js-hoist-intl.md +61 -0
  175. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-callbacks.md +44 -0
  176. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-function-references.md +132 -0
  177. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-images.md +53 -0
  178. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-inline-objects.md +97 -0
  179. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-item-expensive.md +94 -0
  180. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-item-memo.md +82 -0
  181. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-item-types.md +104 -0
  182. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-virtualize.md +67 -0
  183. package/template/agent/skills/mobile-developer/references/react-native-rules/monorepo-native-deps-in-app.md +46 -0
  184. package/template/agent/skills/mobile-developer/references/react-native-rules/monorepo-single-dependency-versions.md +63 -0
  185. package/template/agent/skills/mobile-developer/references/react-native-rules/navigation-native-navigators.md +188 -0
  186. package/template/agent/skills/mobile-developer/references/react-native-rules/react-compiler-destructure-functions.md +50 -0
  187. package/template/agent/skills/mobile-developer/references/react-native-rules/react-compiler-reanimated-shared-values.md +48 -0
  188. package/template/agent/skills/mobile-developer/references/react-native-rules/react-state-dispatcher.md +91 -0
  189. package/template/agent/skills/mobile-developer/references/react-native-rules/react-state-fallback.md +56 -0
  190. package/template/agent/skills/mobile-developer/references/react-native-rules/react-state-minimize.md +65 -0
  191. package/template/agent/skills/mobile-developer/references/react-native-rules/rendering-no-falsy-and.md +74 -0
  192. package/template/agent/skills/mobile-developer/references/react-native-rules/rendering-text-in-text-component.md +36 -0
  193. package/template/agent/skills/mobile-developer/references/react-native-rules/scroll-position-no-state.md +82 -0
  194. package/template/agent/skills/mobile-developer/references/react-native-rules/state-ground-truth.md +80 -0
  195. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-expo-image.md +66 -0
  196. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-image-gallery.md +104 -0
  197. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-measure-views.md +78 -0
  198. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-menus.md +174 -0
  199. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-native-modals.md +77 -0
  200. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-pressable.md +61 -0
  201. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-safe-area-scroll.md +65 -0
  202. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-scrollview-content-inset.md +45 -0
  203. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-styling.md +87 -0
  204. package/template/agent/skills/mobile-developer/references/react-native.md +345 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agy-superpowers",
3
- "version": "5.0.8",
3
+ "version": "5.0.9",
4
4
  "description": "Superpowers skills library for Google Antigravity agent — scaffold .agent/ with one command",
5
5
  "type": "module",
6
6
  "bin": {
@@ -14,6 +14,8 @@ All skills are symlinked into `.agent/skills/` and are automatically available.
14
14
 
15
15
  ## Available Skills
16
16
 
17
+ ### Development Workflow
18
+
17
19
  | Skill | When to Use |
18
20
  |---|---|
19
21
  | `brainstorming` | Before ANY creative work — adding features, building components, modifying behavior |
@@ -29,6 +31,57 @@ All skills are symlinked into `.agent/skills/` and are automatically available.
29
31
  | `finishing-a-development-branch` | When tasks complete — merge / PR / discard |
30
32
  | `dispatching-parallel-agents` | When running concurrent subagent workflows |
31
33
  | `writing-skills` | When creating new skills |
34
+ | `using-superpowers` | When starting any conversation — find and use skills |
35
+
36
+ ### Technical Roles
37
+
38
+ | Skill | When to Use |
39
+ |---|---|
40
+ | `frontend-developer` | Web UI, component architecture, React/Vue/Svelte/Vanilla. Has `react-rules/` (66 Vercel rules) and `vue-rules/` (44 antfu rules) |
41
+ | `backend-developer` | APIs, server-side logic, database schemas |
42
+ | `mobile-developer` | Mobile apps — React Native, Flutter, iOS, Android. Has `react-native-rules/` (38), `flutter-rules/` (8), `android-rules/` (17), `ios-rules/` (19) |
43
+ | `game-developer` | Mobile game features, architecture decisions |
44
+ | `game-design` | Game mechanics, core loops, progression, monetization |
45
+ | `cto-architect` | System design, tech debt, scaling, architecture |
46
+ | `saas-architect` | Multi-tenant SaaS architecture, tenant isolation |
47
+ | `devops-engineer` | CI/CD, infrastructure, deployment, monitoring |
48
+ | `security-engineer` | App security, auth, GDPR, security audits |
49
+
50
+ ### Business & Growth
51
+
52
+ | Skill | When to Use |
53
+ |---|---|
54
+ | `product-manager` | Product requirements, feature prioritization, roadmap |
55
+ | `data-analyst` | Metrics, funnels, cohort analysis, A/B tests |
56
+ | `growth-hacker` | User acquisition, viral loops, activation funnels |
57
+ | `monetization-strategist` | Pricing, freemium, IAP, unit economics |
58
+ | `conversion-optimizer` | Landing pages, trial-to-paid, onboarding, CRO |
59
+ | `retention-specialist` | Onboarding flows, churn reduction, re-engagement |
60
+ | `customer-success-manager` | User support, feedback loops, NPS/CSAT |
61
+ | `app-store-optimizer` | ASO, keyword strategy, screenshots, ratings |
62
+ | `ux-designer` | UI design, wireframes, user research, IA |
63
+ | `copywriter` | Landing copy, app descriptions, email sequences |
64
+
65
+ ### Marketing & Content
66
+
67
+ | Skill | When to Use |
68
+ |---|---|
69
+ | `content-marketer` | Content strategy, SEO content, social media |
70
+ | `seo-specialist` | Technical SEO, keywords, backlinks, organic search |
71
+ | `community-manager` | Discord, Reddit, Slack community management |
72
+ | `influencer-marketer` | UGC, creator partnerships, affiliate programs |
73
+ | `paid-acquisition-specialist` | Meta Ads, Google Ads, Apple Search Ads, ROAS |
74
+
75
+ ### Infrastructure & Integration
76
+
77
+ | Skill | When to Use |
78
+ |---|---|
79
+ | `api-design` | REST/GraphQL APIs, versioning, rate limiting |
80
+ | `auth-and-identity` | Auth, SSO/SAML/OIDC, RBAC, session management |
81
+ | `subscription-billing` | Stripe, IAP, trials, dunning flows |
82
+ | `email-infrastructure` | Transactional email, SPF/DKIM/DMARC, deliverability |
83
+ | `real-time-features` | WebSockets, SSE, live collaboration, presence |
84
+ | `i18n-localization` | Internationalization, translations, localized ASO |
32
85
 
33
86
  ## How to Read a Skill (Antigravity)
34
87
 
@@ -50,3 +103,4 @@ Example: `.agent/skills/brainstorming/SKILL.md`
50
103
  - **TDD always**: Write failing tests first, then code
51
104
  - **Systematic over ad-hoc**: Follow the skill process, don't guess
52
105
  - **Evidence over claims**: Verify before declaring success
106
+
@@ -131,3 +131,42 @@ Too many re-renders → React DevTools Profiler → memo, useMemo, useCallback
131
131
  Slow data fetch → Parallel with Promise.all(), SWR/React Query for cache
132
132
  Large images → WebP format, srcset for responsive, lazy loading
133
133
  ```
134
+
135
+ ---
136
+
137
+ ## Platform References
138
+
139
+ When this skill is invoked, detect the project's framework and read
140
+ the matching reference file(s) from `references/` before proceeding:
141
+
142
+ | Stack indicator | Reference file |
143
+ |-----------------------------------------|---------------------------------|
144
+ | `next.config.js/ts` or `react` in deps | `references/react-nextjs.md` |
145
+ | `nuxt.config.ts` or `vue` in deps | `references/vue-nuxt.md` |
146
+ | `svelte.config.js` or `svelte` in deps | `references/svelte-sveltekit.md`|
147
+ | No framework deps / plain HTML | `references/vanilla.md` |
148
+
149
+ If the stack is unclear, ask the user which framework they're using.
150
+
151
+ ### Granular Rules (React)
152
+
153
+ For React/Next.js projects, `references/react-rules/` contains 66
154
+ individual rule files from [Vercel's agent-skills](https://github.com/vercel-labs/agent-skills).
155
+ Each rule covers one specific pattern with incorrect/correct code examples.
156
+
157
+ Read `references/react-rules/_sections.md` for the full index
158
+ organized by priority (CRITICAL → LOW). Reference individual rules
159
+ when working on specific areas (waterfalls, bundle size, re-renders, SSR, etc.).
160
+
161
+ ### Granular Rules (Vue)
162
+
163
+ For Vue/Nuxt projects, `references/vue-rules/` contains 44 individual
164
+ rule files from [antfu/skills](https://github.com/antfu/skills)
165
+ (sourced from [vuejs-ai/skills](https://github.com/vuejs-ai/skills)),
166
+ organized into three sub-directories:
167
+
168
+ - `best-practices/` — Components, reactivity, composables, performance (22 files)
169
+ - `router/` — Vue Router guards, navigation, lifecycle gotchas (8 files)
170
+ - `testing/` — Vitest, composable testing, Pinia setup, async patterns (11 files)
171
+
172
+ Read the `_index.md` in each sub-directory for an overview.
@@ -0,0 +1,343 @@
1
+ # React + Next.js (App Router) Reference
2
+
3
+ > **Philosophy:** Server-first. Components render on the server by default.
4
+ > Client components are opt-in. React Server Components change everything.
5
+
6
+ ---
7
+
8
+ ## Project Setup & Detection
9
+
10
+ **Stack indicators:** `next.config.js` / `next.config.ts`, `package.json` with `next` dependency.
11
+
12
+ **Key config files:**
13
+
14
+ | File | Purpose |
15
+ |------|---------|
16
+ | `next.config.js` / `.ts` | Next.js configuration (redirects, rewrites, images) |
17
+ | `tsconfig.json` | TypeScript configuration |
18
+ | `tailwind.config.ts` | TailwindCSS configuration (if used) |
19
+ | `.env.local` | Local environment variables |
20
+ | `middleware.ts` | Edge middleware (auth, redirects) |
21
+
22
+ **Recommended project structure (App Router):**
23
+
24
+ ```
25
+ app/
26
+ layout.tsx # Root layout (Server Component)
27
+ page.tsx # Home page
28
+ loading.tsx # Loading UI (Suspense boundary)
29
+ error.tsx # Error boundary
30
+ not-found.tsx # 404 page
31
+ (auth)/
32
+ login/page.tsx
33
+ register/page.tsx
34
+ (dashboard)/
35
+ layout.tsx # Dashboard layout with sidebar
36
+ page.tsx
37
+ settings/page.tsx
38
+ api/
39
+ route.ts # API route handlers
40
+ components/
41
+ ui/ # Reusable UI components (shadcn, etc.)
42
+ forms/ # Form-specific components
43
+ lib/
44
+ db.ts # Database client
45
+ auth.ts # Auth configuration
46
+ utils.ts # Utility functions
47
+ actions/ # Server Actions
48
+ hooks/ # Custom React hooks (client-side)
49
+ ```
50
+
51
+ ---
52
+
53
+ ## Architecture Patterns
54
+
55
+ ### Server vs Client Components
56
+
57
+ ```
58
+ Server Components (default) | Client Components ('use client')
59
+ -------------------------------|----------------------------------
60
+ Fetch data directly | useState, useEffect, event handlers
61
+ Access backend resources | Browser APIs (localStorage, etc.)
62
+ Keep secrets server-side | Interactivity (onClick, onChange)
63
+ Reduce bundle size | Third-party client libraries
64
+ ```
65
+
66
+ **Rules of thumb:**
67
+ - Start everything as Server Component
68
+ - Add `'use client'` only when you need interactivity or browser APIs
69
+ - Push `'use client'` boundary as low as possible in the component tree
70
+ - Server Components can render Client Components (not vice versa)
71
+
72
+ ### Data Fetching
73
+
74
+ | Pattern | Use When |
75
+ |---------|----------|
76
+ | **Server Components + `fetch`** | Default — data fetched at request or build time |
77
+ | **Server Actions** | Mutations (forms, button clicks) |
78
+ | **Route Handlers** (`app/api/`) | External API clients, webhooks |
79
+ | **`use` hook + Suspense** | Streaming data to client |
80
+ | **React Query / SWR** | Client-side caching, polling, optimistic updates |
81
+
82
+ **Server Actions** replace API routes for mutations:
83
+
84
+ ```tsx
85
+ // lib/actions/user.ts
86
+ 'use server'
87
+
88
+ export async function updateProfile(formData: FormData) {
89
+ const name = formData.get('name') as string
90
+ await db.user.update({ where: { id: userId }, data: { name } })
91
+ revalidatePath('/profile')
92
+ }
93
+ ```
94
+
95
+ ### State Management
96
+
97
+ | Approach | Use When |
98
+ |----------|----------|
99
+ | **Server state** (fetch in Server Components) | Most data — no client state needed |
100
+ | **React Context** | Theme, locale, auth — infrequently changing |
101
+ | **Zustand** | Complex client-side state |
102
+ | **URL state** (`useSearchParams`) | Filters, pagination, shareable state |
103
+ | **React Query / SWR** | Client-side server state cache |
104
+
105
+ ---
106
+
107
+ ## Performance Optimization
108
+
109
+ ### Core Web Vitals (Target)
110
+
111
+ | Metric | Good | Poor |
112
+ |--------|------|------|
113
+ | **LCP** | < 2.5s | > 4s |
114
+ | **INP** | < 200ms | > 500ms |
115
+ | **CLS** | < 0.1 | > 0.25 |
116
+
117
+ ### Key Optimizations
118
+
119
+ 1. **Eliminate waterfalls** — parallel data fetching is critical.
120
+
121
+ ```tsx
122
+ // ❌ Bad: sequential (waterfall)
123
+ const user = await getUser(id)
124
+ const posts = await getPosts(user.id)
125
+
126
+ // ✅ Good: parallel
127
+ const [user, posts] = await Promise.all([getUser(id), getPosts(id)])
128
+ ```
129
+
130
+ 2. **`next/image`** — automatic optimization, lazy loading, responsive sizes.
131
+
132
+ 3. **Dynamic imports** — code-split heavy components.
133
+
134
+ ```tsx
135
+ const HeavyChart = dynamic(() => import('@/components/Chart'), {
136
+ loading: () => <ChartSkeleton />,
137
+ ssr: false, // client-only if needed
138
+ })
139
+ ```
140
+
141
+ 4. **Streaming with Suspense** — show content progressively.
142
+
143
+ ```tsx
144
+ export default function Page() {
145
+ return (
146
+ <main>
147
+ <Header /> {/* instant */}
148
+ <Suspense fallback={<PostsSkeleton />}>
149
+ <Posts /> {/* streams when ready */}
150
+ </Suspense>
151
+ </main>
152
+ )
153
+ }
154
+ ```
155
+
156
+ 5. **Route segment config** — control caching behavior.
157
+
158
+ ```tsx
159
+ export const dynamic = 'force-dynamic' // or 'auto', 'force-static'
160
+ export const revalidate = 3600 // ISR: revalidate every hour
161
+ ```
162
+
163
+ ---
164
+
165
+ ## Common Libraries Ecosystem
166
+
167
+ | Category | Recommended | Alternative |
168
+ |----------|-------------|-------------|
169
+ | **UI** | `shadcn/ui` (copy-paste) | `radix-ui`, `headless-ui` |
170
+ | **Styling** | `tailwindcss` | `css modules`, `vanilla-extract` |
171
+ | **Forms** | `react-hook-form` + `zod` | `formik` |
172
+ | **Auth** | `next-auth` / `clerk` | `lucia`, `supabase auth` |
173
+ | **Database** | `prisma` / `drizzle` | `kysely` |
174
+ | **Server State** | `@tanstack/react-query` | `swr` |
175
+ | **Tables** | `@tanstack/react-table` | `ag-grid` |
176
+ | **Email** | `react-email` + `resend` | `nodemailer` |
177
+ | **Testing** | `vitest` + `@testing-library/react` | `jest` |
178
+ | **E2E** | `playwright` | `cypress` |
179
+ | **Analytics** | `@vercel/analytics` | `posthog` |
180
+ | **Icons** | `lucide-react` | `heroicons`, `phosphor` |
181
+ | **Date** | `date-fns` | `dayjs` |
182
+
183
+ ---
184
+
185
+ ## Anti-Patterns & Gotchas
186
+
187
+ | ❌ Don't | Why | ✅ Do Instead |
188
+ |----------|-----|---------------|
189
+ | `'use client'` on every component | Bloats bundle, loses RSC benefits | Default to Server Components |
190
+ | `useEffect` for data fetching | Waterfall, no SSR, loading state | Fetch in Server Components |
191
+ | Sequential `await` for independent data | Each waits on previous (waterfall) | `Promise.all()` |
192
+ | `localStorage` in Server Component | Doesn't exist on server, hydration mismatch | Move to Client Component |
193
+ | Barrel exports (`index.ts`) | Defeats tree-shaking, slow cold start | Import directly from source file |
194
+ | `next/router` (Pages Router) | Legacy | `next/navigation` (App Router) |
195
+ | Missing `loading.tsx` | No loading UI, blank screen | Add `loading.tsx` per route segment |
196
+ | Missing `error.tsx` | Unhandled errors crash entire page | Add `error.tsx` error boundaries |
197
+ | Fetch in Client Component for initial data | Extra round trip, no SSR | Pass data from Server Component as props |
198
+ | `console.log` in Server Components | Logs on server, not browser | Use proper logging (pino, winston) |
199
+
200
+ ---
201
+
202
+ ## Testing
203
+
204
+ | Layer | Tool | Purpose |
205
+ |-------|------|---------|
206
+ | **Unit** | Vitest + Testing Library | Components, hooks, utils |
207
+ | **Integration** | Vitest + MSW | API mocking, server actions |
208
+ | **E2E** | Playwright | Full user flows |
209
+ | **Visual** | Chromatic / Percy | Visual regression |
210
+
211
+ ---
212
+
213
+ ## Deployment & Distribution
214
+
215
+ ### Vercel (recommended for Next.js)
216
+
217
+ ```bash
218
+ # Deploy
219
+ vercel deploy # Preview
220
+ vercel --prod # Production
221
+
222
+ # Environment variables
223
+ vercel env add # Add env var
224
+ ```
225
+
226
+ ### Self-hosted
227
+
228
+ ```bash
229
+ # Build
230
+ next build
231
+
232
+ # Start (requires Node.js server)
233
+ next start
234
+
235
+ # Docker
236
+ FROM node:20-alpine
237
+ COPY . .
238
+ RUN npm ci && npm run build
239
+ CMD ["npm", "start"]
240
+ ```
241
+
242
+ ### Static Export
243
+
244
+ ```js
245
+ // next.config.js
246
+ module.exports = { output: 'export' }
247
+ ```
248
+
249
+ Generates static HTML — deployable to any CDN (Cloudflare Pages, Netlify, S3).
250
+
251
+ ---
252
+
253
+ ## Quick Reference — Granular Rules
254
+
255
+ Individual rule files in `react-rules/` with detailed incorrect/correct
256
+ code examples. Read the specific rule when working in that area.
257
+
258
+ > Source: [Vercel agent-skills](https://github.com/vercel-labs/agent-skills/tree/main/skills/react-best-practices)
259
+
260
+ ### CRITICAL — Eliminating Waterfalls
261
+
262
+ - [async-parallel.md](react-rules/async-parallel.md) — Parallel data fetching
263
+ - [async-suspense-boundaries.md](react-rules/async-suspense-boundaries.md) — Suspense for streaming
264
+ - [async-defer-await.md](react-rules/async-defer-await.md) — Defer non-critical awaits
265
+ - [async-dependencies.md](react-rules/async-dependencies.md) — Minimize async dependencies
266
+ - [async-api-routes.md](react-rules/async-api-routes.md) — API route optimization
267
+
268
+ ### CRITICAL — Bundle Size
269
+
270
+ - [bundle-dynamic-imports.md](react-rules/bundle-dynamic-imports.md) — Dynamic imports for code splitting
271
+ - [bundle-barrel-imports.md](react-rules/bundle-barrel-imports.md) — Avoid barrel exports
272
+ - [bundle-conditional.md](react-rules/bundle-conditional.md) — Conditional imports
273
+ - [bundle-defer-third-party.md](react-rules/bundle-defer-third-party.md) — Defer third-party scripts
274
+ - [bundle-preload.md](react-rules/bundle-preload.md) — Preload critical resources
275
+
276
+ ### HIGH — Server-Side Performance
277
+
278
+ - [server-parallel-fetching.md](react-rules/server-parallel-fetching.md) — Parallel server fetching
279
+ - [server-cache-react.md](react-rules/server-cache-react.md) — React cache for dedup
280
+ - [server-cache-lru.md](react-rules/server-cache-lru.md) — LRU cache for hot data
281
+ - [server-hoist-static-io.md](react-rules/server-hoist-static-io.md) — Hoist static I/O
282
+ - [server-dedup-props.md](react-rules/server-dedup-props.md) — Dedup prop fetching
283
+ - [server-after-nonblocking.md](react-rules/server-after-nonblocking.md) — Non-blocking after()
284
+ - [server-auth-actions.md](react-rules/server-auth-actions.md) — Auth in server actions
285
+ - [server-serialization.md](react-rules/server-serialization.md) — Serialization optimization
286
+
287
+ ### MEDIUM-HIGH — Client-Side Data
288
+
289
+ - [client-swr-dedup.md](react-rules/client-swr-dedup.md) — SWR deduplication
290
+ - [client-event-listeners.md](react-rules/client-event-listeners.md) — Event listener cleanup
291
+ - [client-localstorage-schema.md](react-rules/client-localstorage-schema.md) — localStorage versioning
292
+ - [client-passive-event-listeners.md](react-rules/client-passive-event-listeners.md) — Passive listeners
293
+
294
+ ### MEDIUM — Re-render Optimization
295
+
296
+ - [rerender-memo.md](react-rules/rerender-memo.md) — React.memo usage
297
+ - [rerender-derived-state.md](react-rules/rerender-derived-state.md) — Derived state pattern
298
+ - [rerender-derived-state-no-effect.md](react-rules/rerender-derived-state-no-effect.md) — No useEffect for derived state
299
+ - [rerender-functional-setstate.md](react-rules/rerender-functional-setstate.md) — Functional setState
300
+ - [rerender-lazy-state-init.md](react-rules/rerender-lazy-state-init.md) — Lazy state initialization
301
+ - [rerender-no-inline-components.md](react-rules/rerender-no-inline-components.md) — No inline components
302
+ - [rerender-transitions.md](react-rules/rerender-transitions.md) — useTransition for heavy updates
303
+ - [rerender-use-deferred-value.md](react-rules/rerender-use-deferred-value.md) — useDeferredValue
304
+ - [rerender-use-ref-transient-values.md](react-rules/rerender-use-ref-transient-values.md) — useRef for transient values
305
+ - [rerender-split-combined-hooks.md](react-rules/rerender-split-combined-hooks.md) — Split combined hooks
306
+ - [rerender-defer-reads.md](react-rules/rerender-defer-reads.md) — Defer expensive reads
307
+ - [rerender-dependencies.md](react-rules/rerender-dependencies.md) — Dependency optimization
308
+ - [rerender-memo-with-default-value.md](react-rules/rerender-memo-with-default-value.md) — Memo with defaults
309
+ - [rerender-move-effect-to-event.md](react-rules/rerender-move-effect-to-event.md) — Move effects to events
310
+ - [rerender-simple-expression-in-memo.md](react-rules/rerender-simple-expression-in-memo.md) — Simple expressions
311
+
312
+ ### MEDIUM — Rendering Performance
313
+
314
+ - [rendering-conditional-render.md](react-rules/rendering-conditional-render.md) — Conditional rendering
315
+ - [rendering-hoist-jsx.md](react-rules/rendering-hoist-jsx.md) — Hoist static JSX
316
+ - [rendering-content-visibility.md](react-rules/rendering-content-visibility.md) — CSS content-visibility
317
+ - [rendering-resource-hints.md](react-rules/rendering-resource-hints.md) — Resource hints
318
+ - [rendering-script-defer-async.md](react-rules/rendering-script-defer-async.md) — Script defer/async
319
+ - [rendering-hydration-no-flicker.md](react-rules/rendering-hydration-no-flicker.md) — No hydration flicker
320
+ - [rendering-hydration-suppress-warning.md](react-rules/rendering-hydration-suppress-warning.md) — Suppress hydration warnings
321
+ - [rendering-usetransition-loading.md](react-rules/rendering-usetransition-loading.md) — useTransition loading
322
+ - [rendering-activity.md](react-rules/rendering-activity.md) — Activity API
323
+ - [rendering-animate-svg-wrapper.md](react-rules/rendering-animate-svg-wrapper.md) — SVG animation
324
+ - [rendering-svg-precision.md](react-rules/rendering-svg-precision.md) — SVG precision
325
+
326
+ ### LOW — JavaScript & Advanced
327
+
328
+ - [js-early-exit.md](react-rules/js-early-exit.md) — Early exit patterns
329
+ - [js-set-map-lookups.md](react-rules/js-set-map-lookups.md) — Set/Map for lookups
330
+ - [js-index-maps.md](react-rules/js-index-maps.md) — Index maps
331
+ - [js-cache-function-results.md](react-rules/js-cache-function-results.md) — Cache function results
332
+ - [js-flatmap-filter.md](react-rules/js-flatmap-filter.md) — flatMap over filter+map
333
+ - [js-combine-iterations.md](react-rules/js-combine-iterations.md) — Combine iterations
334
+ - [js-hoist-regexp.md](react-rules/js-hoist-regexp.md) — Hoist RegExp
335
+ - [js-length-check-first.md](react-rules/js-length-check-first.md) — Length check first
336
+ - [js-tosorted-immutable.md](react-rules/js-tosorted-immutable.md) — toSorted immutable
337
+ - [js-min-max-loop.md](react-rules/js-min-max-loop.md) — Min/max in loops
338
+ - [js-cache-property-access.md](react-rules/js-cache-property-access.md) — Cache property access
339
+ - [js-cache-storage.md](react-rules/js-cache-storage.md) — Cache Storage API
340
+ - [js-batch-dom-css.md](react-rules/js-batch-dom-css.md) — Batch DOM/CSS updates
341
+ - [advanced-event-handler-refs.md](react-rules/advanced-event-handler-refs.md) — Event handler refs
342
+ - [advanced-init-once.md](react-rules/advanced-init-once.md) — Init once pattern
343
+ - [advanced-use-latest.md](react-rules/advanced-use-latest.md) — useLatest pattern
@@ -0,0 +1,46 @@
1
+ # Sections
2
+
3
+ This file defines all sections, their ordering, impact levels, and descriptions.
4
+ The section ID (in parentheses) is the filename prefix used to group rules.
5
+
6
+ ---
7
+
8
+ ## 1. Eliminating Waterfalls (async)
9
+
10
+ **Impact:** CRITICAL
11
+ **Description:** Waterfalls are the #1 performance killer. Each sequential await adds full network latency. Eliminating them yields the largest gains.
12
+
13
+ ## 2. Bundle Size Optimization (bundle)
14
+
15
+ **Impact:** CRITICAL
16
+ **Description:** Reducing initial bundle size improves Time to Interactive and Largest Contentful Paint.
17
+
18
+ ## 3. Server-Side Performance (server)
19
+
20
+ **Impact:** HIGH
21
+ **Description:** Optimizing server-side rendering and data fetching eliminates server-side waterfalls and reduces response times.
22
+
23
+ ## 4. Client-Side Data Fetching (client)
24
+
25
+ **Impact:** MEDIUM-HIGH
26
+ **Description:** Automatic deduplication and efficient data fetching patterns reduce redundant network requests.
27
+
28
+ ## 5. Re-render Optimization (rerender)
29
+
30
+ **Impact:** MEDIUM
31
+ **Description:** Reducing unnecessary re-renders minimizes wasted computation and improves UI responsiveness.
32
+
33
+ ## 6. Rendering Performance (rendering)
34
+
35
+ **Impact:** MEDIUM
36
+ **Description:** Optimizing the rendering process reduces the work the browser needs to do.
37
+
38
+ ## 7. JavaScript Performance (js)
39
+
40
+ **Impact:** LOW-MEDIUM
41
+ **Description:** Micro-optimizations for hot paths can add up to meaningful improvements.
42
+
43
+ ## 8. Advanced Patterns (advanced)
44
+
45
+ **Impact:** LOW
46
+ **Description:** Advanced patterns for specific cases that require careful implementation.
@@ -0,0 +1,28 @@
1
+ ---
2
+ title: Rule Title Here
3
+ impact: MEDIUM
4
+ impactDescription: Optional description of impact (e.g., "20-50% improvement")
5
+ tags: tag1, tag2
6
+ ---
7
+
8
+ ## Rule Title Here
9
+
10
+ **Impact: MEDIUM (optional impact description)**
11
+
12
+ Brief explanation of the rule and why it matters. This should be clear and concise, explaining the performance implications.
13
+
14
+ **Incorrect (description of what's wrong):**
15
+
16
+ ```typescript
17
+ // Bad code example here
18
+ const bad = example()
19
+ ```
20
+
21
+ **Correct (description of what's right):**
22
+
23
+ ```typescript
24
+ // Good code example here
25
+ const good = example()
26
+ ```
27
+
28
+ Reference: [Link to documentation or resource](https://example.com)
@@ -0,0 +1,55 @@
1
+ ---
2
+ title: Store Event Handlers in Refs
3
+ impact: LOW
4
+ impactDescription: stable subscriptions
5
+ tags: advanced, hooks, refs, event-handlers, optimization
6
+ ---
7
+
8
+ ## Store Event Handlers in Refs
9
+
10
+ Store callbacks in refs when used in effects that shouldn't re-subscribe on callback changes.
11
+
12
+ **Incorrect (re-subscribes on every render):**
13
+
14
+ ```tsx
15
+ function useWindowEvent(event: string, handler: (e) => void) {
16
+ useEffect(() => {
17
+ window.addEventListener(event, handler)
18
+ return () => window.removeEventListener(event, handler)
19
+ }, [event, handler])
20
+ }
21
+ ```
22
+
23
+ **Correct (stable subscription):**
24
+
25
+ ```tsx
26
+ function useWindowEvent(event: string, handler: (e) => void) {
27
+ const handlerRef = useRef(handler)
28
+ useEffect(() => {
29
+ handlerRef.current = handler
30
+ }, [handler])
31
+
32
+ useEffect(() => {
33
+ const listener = (e) => handlerRef.current(e)
34
+ window.addEventListener(event, listener)
35
+ return () => window.removeEventListener(event, listener)
36
+ }, [event])
37
+ }
38
+ ```
39
+
40
+ **Alternative: use `useEffectEvent` if you're on latest React:**
41
+
42
+ ```tsx
43
+ import { useEffectEvent } from 'react'
44
+
45
+ function useWindowEvent(event: string, handler: (e) => void) {
46
+ const onEvent = useEffectEvent(handler)
47
+
48
+ useEffect(() => {
49
+ window.addEventListener(event, onEvent)
50
+ return () => window.removeEventListener(event, onEvent)
51
+ }, [event])
52
+ }
53
+ ```
54
+
55
+ `useEffectEvent` provides a cleaner API for the same pattern: it creates a stable function reference that always calls the latest version of the handler.
@@ -0,0 +1,42 @@
1
+ ---
2
+ title: Initialize App Once, Not Per Mount
3
+ impact: LOW-MEDIUM
4
+ impactDescription: avoids duplicate init in development
5
+ tags: initialization, useEffect, app-startup, side-effects
6
+ ---
7
+
8
+ ## Initialize App Once, Not Per Mount
9
+
10
+ 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.
11
+
12
+ **Incorrect (runs twice in dev, re-runs on remount):**
13
+
14
+ ```tsx
15
+ function Comp() {
16
+ useEffect(() => {
17
+ loadFromStorage()
18
+ checkAuthToken()
19
+ }, [])
20
+
21
+ // ...
22
+ }
23
+ ```
24
+
25
+ **Correct (once per app load):**
26
+
27
+ ```tsx
28
+ let didInit = false
29
+
30
+ function Comp() {
31
+ useEffect(() => {
32
+ if (didInit) return
33
+ didInit = true
34
+ loadFromStorage()
35
+ checkAuthToken()
36
+ }, [])
37
+
38
+ // ...
39
+ }
40
+ ```
41
+
42
+ Reference: [Initializing the application](https://react.dev/learn/you-might-not-need-an-effect#initializing-the-application)
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: useEffectEvent for Stable Callback Refs
3
+ impact: LOW
4
+ impactDescription: prevents effect re-runs
5
+ tags: advanced, hooks, useEffectEvent, refs, optimization
6
+ ---
7
+
8
+ ## useEffectEvent for Stable Callback Refs
9
+
10
+ Access latest values in callbacks without adding them to dependency arrays. Prevents effect re-runs while avoiding stale closures.
11
+
12
+ **Incorrect (effect re-runs on every callback change):**
13
+
14
+ ```tsx
15
+ function SearchInput({ onSearch }: { onSearch: (q: string) => void }) {
16
+ const [query, setQuery] = useState('')
17
+
18
+ useEffect(() => {
19
+ const timeout = setTimeout(() => onSearch(query), 300)
20
+ return () => clearTimeout(timeout)
21
+ }, [query, onSearch])
22
+ }
23
+ ```
24
+
25
+ **Correct (using React's useEffectEvent):**
26
+
27
+ ```tsx
28
+ import { useEffectEvent } from 'react';
29
+
30
+ function SearchInput({ onSearch }: { onSearch: (q: string) => void }) {
31
+ const [query, setQuery] = useState('')
32
+ const onSearchEvent = useEffectEvent(onSearch)
33
+
34
+ useEffect(() => {
35
+ const timeout = setTimeout(() => onSearchEvent(query), 300)
36
+ return () => clearTimeout(timeout)
37
+ }, [query])
38
+ }
39
+ ```