opencode-skills-collection 3.0.35 → 3.0.37

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 (238) hide show
  1. package/bundled-skills/.antigravity-install-manifest.json +15 -1
  2. package/bundled-skills/accesslint-audit/SKILL.md +115 -0
  3. package/bundled-skills/accesslint-diff/SKILL.md +81 -0
  4. package/bundled-skills/accesslint-scan/SKILL.md +47 -0
  5. package/bundled-skills/composition-patterns/SKILL.md +87 -0
  6. package/bundled-skills/composition-patterns/rules/_sections.md +29 -0
  7. package/bundled-skills/composition-patterns/rules/_template.md +24 -0
  8. package/bundled-skills/composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  9. package/bundled-skills/composition-patterns/rules/architecture-compound-components.md +112 -0
  10. package/bundled-skills/composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  11. package/bundled-skills/composition-patterns/rules/patterns-explicit-variants.md +100 -0
  12. package/bundled-skills/composition-patterns/rules/react19-no-forwardref.md +42 -0
  13. package/bundled-skills/composition-patterns/rules/state-context-interface.md +191 -0
  14. package/bundled-skills/composition-patterns/rules/state-decouple-implementation.md +113 -0
  15. package/bundled-skills/composition-patterns/rules/state-lift-state.md +125 -0
  16. package/bundled-skills/debugging-toolkit/SKILL.md +35 -0
  17. package/bundled-skills/deploy-to-vercel/SKILL.md +304 -0
  18. package/bundled-skills/deploy-to-vercel/resources/deploy-codex.sh +301 -0
  19. package/bundled-skills/deploy-to-vercel/resources/deploy.sh +301 -0
  20. package/bundled-skills/docs/integrations/jetski-cortex.md +3 -3
  21. package/bundled-skills/docs/integrations/jetski-gemini-loader/README.md +1 -1
  22. package/bundled-skills/docs/maintainers/backups/README-2026-06-02.md +687 -0
  23. package/bundled-skills/docs/maintainers/repo-growth-seo.md +4 -4
  24. package/bundled-skills/docs/maintainers/skills-update-guide.md +1 -1
  25. package/bundled-skills/docs/users/bundles.md +245 -1
  26. package/bundled-skills/docs/users/claude-code-skills.md +1 -1
  27. package/bundled-skills/docs/users/gemini-cli-skills.md +1 -1
  28. package/bundled-skills/docs/users/getting-started.md +1 -1
  29. package/bundled-skills/docs/users/kiro-integration.md +1 -1
  30. package/bundled-skills/docs/users/plugins.md +21 -13
  31. package/bundled-skills/docs/users/specialized-plugin-roadmap.md +95 -0
  32. package/bundled-skills/docs/users/usage.md +4 -4
  33. package/bundled-skills/docs/users/visual-guide.md +4 -4
  34. package/bundled-skills/polis-protocol/SKILL.md +93 -0
  35. package/bundled-skills/python-development/SKILL.md +35 -0
  36. package/bundled-skills/radix-ui-design-system/SKILL.md +2 -2
  37. package/bundled-skills/react-native-skills/SKILL.md +120 -0
  38. package/bundled-skills/react-native-skills/rules/_sections.md +86 -0
  39. package/bundled-skills/react-native-skills/rules/_template.md +28 -0
  40. package/bundled-skills/react-native-skills/rules/animation-derived-value.md +53 -0
  41. package/bundled-skills/react-native-skills/rules/animation-gesture-detector-press.md +95 -0
  42. package/bundled-skills/react-native-skills/rules/animation-gpu-properties.md +65 -0
  43. package/bundled-skills/react-native-skills/rules/design-system-compound-components.md +66 -0
  44. package/bundled-skills/react-native-skills/rules/fonts-config-plugin.md +71 -0
  45. package/bundled-skills/react-native-skills/rules/imports-design-system-folder.md +68 -0
  46. package/bundled-skills/react-native-skills/rules/js-hoist-intl.md +61 -0
  47. package/bundled-skills/react-native-skills/rules/list-performance-callbacks.md +44 -0
  48. package/bundled-skills/react-native-skills/rules/list-performance-function-references.md +132 -0
  49. package/bundled-skills/react-native-skills/rules/list-performance-images.md +53 -0
  50. package/bundled-skills/react-native-skills/rules/list-performance-inline-objects.md +97 -0
  51. package/bundled-skills/react-native-skills/rules/list-performance-item-expensive.md +94 -0
  52. package/bundled-skills/react-native-skills/rules/list-performance-item-memo.md +82 -0
  53. package/bundled-skills/react-native-skills/rules/list-performance-item-types.md +104 -0
  54. package/bundled-skills/react-native-skills/rules/list-performance-virtualize.md +67 -0
  55. package/bundled-skills/react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
  56. package/bundled-skills/react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
  57. package/bundled-skills/react-native-skills/rules/navigation-native-navigators.md +188 -0
  58. package/bundled-skills/react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
  59. package/bundled-skills/react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
  60. package/bundled-skills/react-native-skills/rules/react-state-dispatcher.md +91 -0
  61. package/bundled-skills/react-native-skills/rules/react-state-fallback.md +56 -0
  62. package/bundled-skills/react-native-skills/rules/react-state-minimize.md +65 -0
  63. package/bundled-skills/react-native-skills/rules/rendering-no-falsy-and.md +74 -0
  64. package/bundled-skills/react-native-skills/rules/rendering-text-in-text-component.md +36 -0
  65. package/bundled-skills/react-native-skills/rules/scroll-position-no-state.md +82 -0
  66. package/bundled-skills/react-native-skills/rules/state-ground-truth.md +80 -0
  67. package/bundled-skills/react-native-skills/rules/ui-expo-image.md +66 -0
  68. package/bundled-skills/react-native-skills/rules/ui-image-gallery.md +104 -0
  69. package/bundled-skills/react-native-skills/rules/ui-measure-views.md +78 -0
  70. package/bundled-skills/react-native-skills/rules/ui-menus.md +174 -0
  71. package/bundled-skills/react-native-skills/rules/ui-native-modals.md +77 -0
  72. package/bundled-skills/react-native-skills/rules/ui-pressable.md +61 -0
  73. package/bundled-skills/react-native-skills/rules/ui-safe-area-scroll.md +65 -0
  74. package/bundled-skills/react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
  75. package/bundled-skills/react-native-skills/rules/ui-styling.md +87 -0
  76. package/bundled-skills/skill-issue/SKILL.md +73 -0
  77. package/bundled-skills/tdd-workflows/SKILL.md +35 -0
  78. package/bundled-skills/vercel-cli-with-tokens/SKILL.md +361 -0
  79. package/bundled-skills/vercel-optimize/CONTRIBUTING.md +41 -0
  80. package/bundled-skills/vercel-optimize/SKILL.md +331 -0
  81. package/bundled-skills/vercel-optimize/lib/auth-route.mjs +23 -0
  82. package/bundled-skills/vercel-optimize/lib/budget-summary.mjs +182 -0
  83. package/bundled-skills/vercel-optimize/lib/citations.mjs +139 -0
  84. package/bundled-skills/vercel-optimize/lib/cost-coverage.mjs +143 -0
  85. package/bundled-skills/vercel-optimize/lib/dedup-recs.mjs +325 -0
  86. package/bundled-skills/vercel-optimize/lib/deep-dive.mjs +350 -0
  87. package/bundled-skills/vercel-optimize/lib/display-labels.mjs +185 -0
  88. package/bundled-skills/vercel-optimize/lib/extract-claims.mjs +550 -0
  89. package/bundled-skills/vercel-optimize/lib/framework-support.mjs +67 -0
  90. package/bundled-skills/vercel-optimize/lib/gates/build-minutes-fanout.mjs +69 -0
  91. package/bundled-skills/vercel-optimize/lib/gates/cold-start.mjs +66 -0
  92. package/bundled-skills/vercel-optimize/lib/gates/contract.mjs +79 -0
  93. package/bundled-skills/vercel-optimize/lib/gates/cwv-poor.mjs +87 -0
  94. package/bundled-skills/vercel-optimize/lib/gates/external-api-slow.mjs +55 -0
  95. package/bundled-skills/vercel-optimize/lib/gates/hard-gates.mjs +73 -0
  96. package/bundled-skills/vercel-optimize/lib/gates/index.mjs +45 -0
  97. package/bundled-skills/vercel-optimize/lib/gates/isr-overrevalidation.mjs +62 -0
  98. package/bundled-skills/vercel-optimize/lib/gates/middleware-heavy.mjs +51 -0
  99. package/bundled-skills/vercel-optimize/lib/gates/observability-events-attribution.mjs +56 -0
  100. package/bundled-skills/vercel-optimize/lib/gates/platform-bot-protection.mjs +115 -0
  101. package/bundled-skills/vercel-optimize/lib/gates/platform-fluid-compute.mjs +83 -0
  102. package/bundled-skills/vercel-optimize/lib/gates/region-misconfig.mjs +64 -0
  103. package/bundled-skills/vercel-optimize/lib/gates/route-errors.mjs +80 -0
  104. package/bundled-skills/vercel-optimize/lib/gates/scanner-driven.mjs +122 -0
  105. package/bundled-skills/vercel-optimize/lib/gates/select-candidates.mjs +134 -0
  106. package/bundled-skills/vercel-optimize/lib/gates/slow-route.mjs +88 -0
  107. package/bundled-skills/vercel-optimize/lib/gates/types.d.ts +38 -0
  108. package/bundled-skills/vercel-optimize/lib/gates/uncached-route.mjs +93 -0
  109. package/bundled-skills/vercel-optimize/lib/gates/usage-spike-triage.mjs +121 -0
  110. package/bundled-skills/vercel-optimize/lib/grade-recommendation.mjs +155 -0
  111. package/bundled-skills/vercel-optimize/lib/impact-label.mjs +126 -0
  112. package/bundled-skills/vercel-optimize/lib/impact-magnitude.mjs +60 -0
  113. package/bundled-skills/vercel-optimize/lib/investigation-brief.mjs +610 -0
  114. package/bundled-skills/vercel-optimize/lib/observation-safety.mjs +174 -0
  115. package/bundled-skills/vercel-optimize/lib/project-facts.mjs +99 -0
  116. package/bundled-skills/vercel-optimize/lib/queries.mjs +315 -0
  117. package/bundled-skills/vercel-optimize/lib/reconcile-candidates.mjs +372 -0
  118. package/bundled-skills/vercel-optimize/lib/render-report.mjs +955 -0
  119. package/bundled-skills/vercel-optimize/lib/repo-root.mjs +86 -0
  120. package/bundled-skills/vercel-optimize/lib/route-normalize.mjs +220 -0
  121. package/bundled-skills/vercel-optimize/lib/sanitizers/bot-protection-certainty.mjs +38 -0
  122. package/bundled-skills/vercel-optimize/lib/sanitizers/cache-tag-invalidation-certainty.mjs +30 -0
  123. package/bundled-skills/vercel-optimize/lib/sanitizers/count-correct.mjs +52 -0
  124. package/bundled-skills/vercel-optimize/lib/sanitizers/function-duration-invocations.mjs +38 -0
  125. package/bundled-skills/vercel-optimize/lib/sanitizers/index.mjs +79 -0
  126. package/bundled-skills/vercel-optimize/lib/sanitizers/middleware-conflict.mjs +36 -0
  127. package/bundled-skills/vercel-optimize/lib/sanitizers/missing-citation.mjs +16 -0
  128. package/bundled-skills/vercel-optimize/lib/sanitizers/pre-release.mjs +74 -0
  129. package/bundled-skills/vercel-optimize/lib/sanitizers/rate-limit.mjs +67 -0
  130. package/bundled-skills/vercel-optimize/lib/sanitizers/rendering-mode-mislabel.mjs +38 -0
  131. package/bundled-skills/vercel-optimize/lib/sanitizers/undeclared-dep.mjs +78 -0
  132. package/bundled-skills/vercel-optimize/lib/sanitizers/vercel-directive-strip.mjs +37 -0
  133. package/bundled-skills/vercel-optimize/lib/sanitizers/window-units.mjs +32 -0
  134. package/bundled-skills/vercel-optimize/lib/scanners/cache-components-suspense-dedupe.mjs +109 -0
  135. package/bundled-skills/vercel-optimize/lib/scanners/edge-heavy-import.mjs +94 -0
  136. package/bundled-skills/vercel-optimize/lib/scanners/force-dynamic.mjs +42 -0
  137. package/bundled-skills/vercel-optimize/lib/scanners/headers-in-page.mjs +44 -0
  138. package/bundled-skills/vercel-optimize/lib/scanners/index.mjs +35 -0
  139. package/bundled-skills/vercel-optimize/lib/scanners/large-static-asset.mjs +92 -0
  140. package/bundled-skills/vercel-optimize/lib/scanners/max-age-without-s-maxage.mjs +42 -0
  141. package/bundled-skills/vercel-optimize/lib/scanners/middleware-broad-matcher.mjs +55 -0
  142. package/bundled-skills/vercel-optimize/lib/scanners/missing-cache-headers.mjs +90 -0
  143. package/bundled-skills/vercel-optimize/lib/scanners/prisma-include-tree.mjs +42 -0
  144. package/bundled-skills/vercel-optimize/lib/scanners/region-pin-in-config.mjs +88 -0
  145. package/bundled-skills/vercel-optimize/lib/scanners/source-maps-production.mjs +36 -0
  146. package/bundled-skills/vercel-optimize/lib/scanners/sveltekit-prerender-missing.mjs +43 -0
  147. package/bundled-skills/vercel-optimize/lib/scanners/turbo-force-bypass.mjs +129 -0
  148. package/bundled-skills/vercel-optimize/lib/scanners/unoptimized-image.mjs +113 -0
  149. package/bundled-skills/vercel-optimize/lib/scanners/use-cache-date-stamp.mjs +106 -0
  150. package/bundled-skills/vercel-optimize/lib/support-topics.mjs +355 -0
  151. package/bundled-skills/vercel-optimize/lib/throttle.mjs +273 -0
  152. package/bundled-skills/vercel-optimize/lib/util.mjs +17 -0
  153. package/bundled-skills/vercel-optimize/lib/vercel.mjs +784 -0
  154. package/bundled-skills/vercel-optimize/lib/verify-claim.mjs +1296 -0
  155. package/bundled-skills/vercel-optimize/lib/workspace-resolver.mjs +521 -0
  156. package/bundled-skills/vercel-optimize/references/candidates.md +176 -0
  157. package/bundled-skills/vercel-optimize/references/data-collection.md +218 -0
  158. package/bundled-skills/vercel-optimize/references/docs-library.json +683 -0
  159. package/bundled-skills/vercel-optimize/references/doctrine.md +105 -0
  160. package/bundled-skills/vercel-optimize/references/observability-plus.md +108 -0
  161. package/bundled-skills/vercel-optimize/references/playbooks/README.md +53 -0
  162. package/bundled-skills/vercel-optimize/references/playbooks/ai-application.md +32 -0
  163. package/bundled-skills/vercel-optimize/references/playbooks/api-service.md +30 -0
  164. package/bundled-skills/vercel-optimize/references/playbooks/content-site.md +30 -0
  165. package/bundled-skills/vercel-optimize/references/playbooks/ecommerce.md +30 -0
  166. package/bundled-skills/vercel-optimize/references/playbooks/marketing.md +30 -0
  167. package/bundled-skills/vercel-optimize/references/playbooks/saas.md +31 -0
  168. package/bundled-skills/vercel-optimize/references/playbooks/sveltekit.md +75 -0
  169. package/bundled-skills/vercel-optimize/references/recommendations.md +203 -0
  170. package/bundled-skills/vercel-optimize/references/scanner-patterns.md +251 -0
  171. package/bundled-skills/vercel-optimize/references/scoring.md +205 -0
  172. package/bundled-skills/vercel-optimize/references/support-topics/README.md +46 -0
  173. package/bundled-skills/vercel-optimize/references/support-topics/astro-edge-middleware-scope.md +22 -0
  174. package/bundled-skills/vercel-optimize/references/support-topics/astro-output-mode-and-isr.md +22 -0
  175. package/bundled-skills/vercel-optimize/references/support-topics/auth-preserving-parallelization.md +22 -0
  176. package/bundled-skills/vercel-optimize/references/support-topics/bot-protection-product-guardrails.md +22 -0
  177. package/bundled-skills/vercel-optimize/references/support-topics/build-minutes-monorepo-fanout.md +23 -0
  178. package/bundled-skills/vercel-optimize/references/support-topics/cache-components-static-shell-boundaries.md +22 -0
  179. package/bundled-skills/vercel-optimize/references/support-topics/cache-components-suspense-dedupe-pitfall.md +23 -0
  180. package/bundled-skills/vercel-optimize/references/support-topics/cdn-cache-auth-safety.md +22 -0
  181. package/bundled-skills/vercel-optimize/references/support-topics/cold-start-initialization-bundle.md +22 -0
  182. package/bundled-skills/vercel-optimize/references/support-topics/core-web-vitals-client-bottlenecks.md +22 -0
  183. package/bundled-skills/vercel-optimize/references/support-topics/database-egress-pooling-region.md +22 -0
  184. package/bundled-skills/vercel-optimize/references/support-topics/dynamic-rendering-traps.md +22 -0
  185. package/bundled-skills/vercel-optimize/references/support-topics/external-api-critical-path-platform.md +22 -0
  186. package/bundled-skills/vercel-optimize/references/support-topics/external-api-critical-path.md +22 -0
  187. package/bundled-skills/vercel-optimize/references/support-topics/fast-data-transfer-payloads.md +22 -0
  188. package/bundled-skills/vercel-optimize/references/support-topics/fluid-compute-caveats.md +22 -0
  189. package/bundled-skills/vercel-optimize/references/support-topics/function-duration-io-and-after.md +22 -0
  190. package/bundled-skills/vercel-optimize/references/support-topics/function-invocation-reduction.md +22 -0
  191. package/bundled-skills/vercel-optimize/references/support-topics/function-region-misconfiguration-ttfb.md +23 -0
  192. package/bundled-skills/vercel-optimize/references/support-topics/image-optimization-cost-control.md +22 -0
  193. package/bundled-skills/vercel-optimize/references/support-topics/isr-revalidation-static-generation.md +22 -0
  194. package/bundled-skills/vercel-optimize/references/support-topics/middleware-proxy-edge-cost.md +22 -0
  195. package/bundled-skills/vercel-optimize/references/support-topics/next-fetch-revalidate-floor.md +22 -0
  196. package/bundled-skills/vercel-optimize/references/support-topics/next-font-cls-self-hosting.md +23 -0
  197. package/bundled-skills/vercel-optimize/references/support-topics/next-heavy-ui-lazy-load-boundaries.md +23 -0
  198. package/bundled-skills/vercel-optimize/references/support-topics/next-image-lcp-preload-sizes.md +23 -0
  199. package/bundled-skills/vercel-optimize/references/support-topics/next-route-handler-get-cache-defaults.md +22 -0
  200. package/bundled-skills/vercel-optimize/references/support-topics/next-script-third-party-strategy.md +23 -0
  201. package/bundled-skills/vercel-optimize/references/support-topics/nextjs-version-cache-semantics.md +22 -0
  202. package/bundled-skills/vercel-optimize/references/support-topics/not-found-catchall-request-waste.md +23 -0
  203. package/bundled-skills/vercel-optimize/references/support-topics/nuxt-route-rules-cache-isr.md +22 -0
  204. package/bundled-skills/vercel-optimize/references/support-topics/observability-events-cost-attribution.md +22 -0
  205. package/bundled-skills/vercel-optimize/references/support-topics/post-response-work-waituntil.md +22 -0
  206. package/bundled-skills/vercel-optimize/references/support-topics/route-error-durable-offload.md +22 -0
  207. package/bundled-skills/vercel-optimize/references/support-topics/route-error-runtime-limits.md +22 -0
  208. package/bundled-skills/vercel-optimize/references/support-topics/runtime-cache-reusable-data.md +22 -0
  209. package/bundled-skills/vercel-optimize/references/support-topics/sveltekit-isr-prerender-safety.md +22 -0
  210. package/bundled-skills/vercel-optimize/references/support-topics/sveltekit-split-cold-start-tradeoff.md +22 -0
  211. package/bundled-skills/vercel-optimize/references/support-topics/usage-spike-triage.md +22 -0
  212. package/bundled-skills/vercel-optimize/references/support-topics/use-cache-date-stamp-isr-write-amplifier.md +23 -0
  213. package/bundled-skills/vercel-optimize/references/support-topics/use-cache-remote-shared-origin-data.md +22 -0
  214. package/bundled-skills/vercel-optimize/references/support-topics/workflow-resumable-stream-routes.md +23 -0
  215. package/bundled-skills/vercel-optimize/references/verification.md +102 -0
  216. package/bundled-skills/vercel-optimize/references/voice.md +76 -0
  217. package/bundled-skills/vercel-optimize/scripts/budget-summary.mjs +56 -0
  218. package/bundled-skills/vercel-optimize/scripts/build-docs.mjs +74 -0
  219. package/bundled-skills/vercel-optimize/scripts/check-citations.mjs +81 -0
  220. package/bundled-skills/vercel-optimize/scripts/check-docs-fresh.mjs +93 -0
  221. package/bundled-skills/vercel-optimize/scripts/collect-signals.mjs +576 -0
  222. package/bundled-skills/vercel-optimize/scripts/collect-sub-agent-outputs.mjs +296 -0
  223. package/bundled-skills/vercel-optimize/scripts/deep-dive.mjs +319 -0
  224. package/bundled-skills/vercel-optimize/scripts/gate-investigations.mjs +166 -0
  225. package/bundled-skills/vercel-optimize/scripts/merge-signals.mjs +192 -0
  226. package/bundled-skills/vercel-optimize/scripts/prepare-investigation-brief.mjs +231 -0
  227. package/bundled-skills/vercel-optimize/scripts/reconcile-candidates.mjs +62 -0
  228. package/bundled-skills/vercel-optimize/scripts/render-report.mjs +437 -0
  229. package/bundled-skills/vercel-optimize/scripts/scan-codebase.mjs +313 -0
  230. package/bundled-skills/vercel-optimize/scripts/verify-and-regen.mjs +346 -0
  231. package/bundled-skills/vercel-optimize/scripts/verify-finding.mjs +19 -0
  232. package/bundled-skills/vercel-react-view-transitions/SKILL.md +327 -0
  233. package/bundled-skills/vercel-react-view-transitions/references/css-recipes.md +242 -0
  234. package/bundled-skills/vercel-react-view-transitions/references/implementation.md +182 -0
  235. package/bundled-skills/vercel-react-view-transitions/references/nextjs.md +176 -0
  236. package/bundled-skills/vercel-react-view-transitions/references/patterns.md +262 -0
  237. package/package.json +2 -2
  238. package/skills_index.json +312 -0
@@ -0,0 +1,87 @@
1
+ ---
2
+ title: Prefer Composing Children Over Render Props
3
+ impact: MEDIUM
4
+ impactDescription: cleaner composition, better readability
5
+ tags: composition, children, render-props
6
+ ---
7
+
8
+ ## Prefer Children Over Render Props
9
+
10
+ Use `children` for composition instead of `renderX` props. Children are more
11
+ readable, compose naturally, and don't require understanding callback
12
+ signatures.
13
+
14
+ **Incorrect (render props):**
15
+
16
+ ```tsx
17
+ function Composer({
18
+ renderHeader,
19
+ renderFooter,
20
+ renderActions,
21
+ }: {
22
+ renderHeader?: () => React.ReactNode
23
+ renderFooter?: () => React.ReactNode
24
+ renderActions?: () => React.ReactNode
25
+ }) {
26
+ return (
27
+ <form>
28
+ {renderHeader?.()}
29
+ <Input />
30
+ {renderFooter ? renderFooter() : <DefaultFooter />}
31
+ {renderActions?.()}
32
+ </form>
33
+ )
34
+ }
35
+
36
+ // Usage is awkward and inflexible
37
+ return (
38
+ <Composer
39
+ renderHeader={() => <CustomHeader />}
40
+ renderFooter={() => (
41
+ <>
42
+ <Formatting />
43
+ <Emojis />
44
+ </>
45
+ )}
46
+ renderActions={() => <SubmitButton />}
47
+ />
48
+ )
49
+ ```
50
+
51
+ **Correct (compound components with children):**
52
+
53
+ ```tsx
54
+ function ComposerFrame({ children }: { children: React.ReactNode }) {
55
+ return <form>{children}</form>
56
+ }
57
+
58
+ function ComposerFooter({ children }: { children: React.ReactNode }) {
59
+ return <footer className='flex'>{children}</footer>
60
+ }
61
+
62
+ // Usage is flexible
63
+ return (
64
+ <Composer.Frame>
65
+ <CustomHeader />
66
+ <Composer.Input />
67
+ <Composer.Footer>
68
+ <Composer.Formatting />
69
+ <Composer.Emojis />
70
+ <SubmitButton />
71
+ </Composer.Footer>
72
+ </Composer.Frame>
73
+ )
74
+ ```
75
+
76
+ **When render props are appropriate:**
77
+
78
+ ```tsx
79
+ // Render props work well when you need to pass data back
80
+ <List
81
+ data={items}
82
+ renderItem={({ item, index }) => <Item item={item} index={index} />}
83
+ />
84
+ ```
85
+
86
+ Use render props when the parent needs to provide data or state to the child.
87
+ Use children when composing static structure.
@@ -0,0 +1,100 @@
1
+ ---
2
+ title: Create Explicit Component Variants
3
+ impact: MEDIUM
4
+ impactDescription: self-documenting code, no hidden conditionals
5
+ tags: composition, variants, architecture
6
+ ---
7
+
8
+ ## Create Explicit Component Variants
9
+
10
+ Instead of one component with many boolean props, create explicit variant
11
+ components. Each variant composes the pieces it needs. The code documents
12
+ itself.
13
+
14
+ **Incorrect (one component, many modes):**
15
+
16
+ ```tsx
17
+ // What does this component actually render?
18
+ <Composer
19
+ isThread
20
+ isEditing={false}
21
+ channelId='abc'
22
+ showAttachments
23
+ showFormatting={false}
24
+ />
25
+ ```
26
+
27
+ **Correct (explicit variants):**
28
+
29
+ ```tsx
30
+ // Immediately clear what this renders
31
+ <ThreadComposer channelId="abc" />
32
+
33
+ // Or
34
+ <EditMessageComposer messageId="xyz" />
35
+
36
+ // Or
37
+ <ForwardMessageComposer messageId="123" />
38
+ ```
39
+
40
+ Each implementation is unique, explicit and self-contained. Yet they can each
41
+ use shared parts.
42
+
43
+ **Implementation:**
44
+
45
+ ```tsx
46
+ function ThreadComposer({ channelId }: { channelId: string }) {
47
+ return (
48
+ <ThreadProvider channelId={channelId}>
49
+ <Composer.Frame>
50
+ <Composer.Input />
51
+ <AlsoSendToChannelField channelId={channelId} />
52
+ <Composer.Footer>
53
+ <Composer.Formatting />
54
+ <Composer.Emojis />
55
+ <Composer.Submit />
56
+ </Composer.Footer>
57
+ </Composer.Frame>
58
+ </ThreadProvider>
59
+ )
60
+ }
61
+
62
+ function EditMessageComposer({ messageId }: { messageId: string }) {
63
+ return (
64
+ <EditMessageProvider messageId={messageId}>
65
+ <Composer.Frame>
66
+ <Composer.Input />
67
+ <Composer.Footer>
68
+ <Composer.Formatting />
69
+ <Composer.Emojis />
70
+ <Composer.CancelEdit />
71
+ <Composer.SaveEdit />
72
+ </Composer.Footer>
73
+ </Composer.Frame>
74
+ </EditMessageProvider>
75
+ )
76
+ }
77
+
78
+ function ForwardMessageComposer({ messageId }: { messageId: string }) {
79
+ return (
80
+ <ForwardMessageProvider messageId={messageId}>
81
+ <Composer.Frame>
82
+ <Composer.Input placeholder="Add a message, if you'd like." />
83
+ <Composer.Footer>
84
+ <Composer.Formatting />
85
+ <Composer.Emojis />
86
+ <Composer.Mentions />
87
+ </Composer.Footer>
88
+ </Composer.Frame>
89
+ </ForwardMessageProvider>
90
+ )
91
+ }
92
+ ```
93
+
94
+ Each variant is explicit about:
95
+
96
+ - What provider/state it uses
97
+ - What UI elements it includes
98
+ - What actions are available
99
+
100
+ No boolean prop combinations to reason about. No impossible states.
@@ -0,0 +1,42 @@
1
+ ---
2
+ title: React 19 API Changes
3
+ impact: MEDIUM
4
+ impactDescription: cleaner component definitions and context usage
5
+ tags: react19, refs, context, hooks
6
+ ---
7
+
8
+ ## React 19 API Changes
9
+
10
+ > **⚠️ React 19+ only.** Skip this if you're on React 18 or earlier.
11
+
12
+ In React 19, `ref` is now a regular prop (no `forwardRef` wrapper needed), and `use()` replaces `useContext()`.
13
+
14
+ **Incorrect (forwardRef in React 19):**
15
+
16
+ ```tsx
17
+ const ComposerInput = forwardRef<TextInput, Props>((props, ref) => {
18
+ return <TextInput ref={ref} {...props} />
19
+ })
20
+ ```
21
+
22
+ **Correct (ref as a regular prop):**
23
+
24
+ ```tsx
25
+ function ComposerInput({ ref, ...props }: Props & { ref?: React.Ref<TextInput> }) {
26
+ return <TextInput ref={ref} {...props} />
27
+ }
28
+ ```
29
+
30
+ **Incorrect (useContext in React 19):**
31
+
32
+ ```tsx
33
+ const value = useContext(MyContext)
34
+ ```
35
+
36
+ **Correct (use instead of useContext):**
37
+
38
+ ```tsx
39
+ const value = use(MyContext)
40
+ ```
41
+
42
+ `use()` can also be called conditionally, unlike `useContext()`.
@@ -0,0 +1,191 @@
1
+ ---
2
+ title: Define Generic Context Interfaces for Dependency Injection
3
+ impact: HIGH
4
+ impactDescription: enables dependency-injectable state across use-cases
5
+ tags: composition, context, state, typescript, dependency-injection
6
+ ---
7
+
8
+ ## Define Generic Context Interfaces for Dependency Injection
9
+
10
+ Define a **generic interface** for your component context with three parts:
11
+ `state`, `actions`, and `meta`. This interface is a contract that any provider
12
+ can implement—enabling the same UI components to work with completely different
13
+ state implementations.
14
+
15
+ **Core principle:** Lift state, compose internals, make state
16
+ dependency-injectable.
17
+
18
+ **Incorrect (UI coupled to specific state implementation):**
19
+
20
+ ```tsx
21
+ function ComposerInput() {
22
+ // Tightly coupled to a specific hook
23
+ const { input, setInput } = useChannelComposerState()
24
+ return <TextInput value={input} onChangeText={setInput} />
25
+ }
26
+ ```
27
+
28
+ **Correct (generic interface enables dependency injection):**
29
+
30
+ ```tsx
31
+ // Define a GENERIC interface that any provider can implement
32
+ interface ComposerState {
33
+ input: string
34
+ attachments: Attachment[]
35
+ isSubmitting: boolean
36
+ }
37
+
38
+ interface ComposerActions {
39
+ update: (updater: (state: ComposerState) => ComposerState) => void
40
+ submit: () => void
41
+ }
42
+
43
+ interface ComposerMeta {
44
+ inputRef: React.RefObject<TextInput>
45
+ }
46
+
47
+ interface ComposerContextValue {
48
+ state: ComposerState
49
+ actions: ComposerActions
50
+ meta: ComposerMeta
51
+ }
52
+
53
+ const ComposerContext = createContext<ComposerContextValue | null>(null)
54
+ ```
55
+
56
+ **UI components consume the interface, not the implementation:**
57
+
58
+ ```tsx
59
+ function ComposerInput() {
60
+ const {
61
+ state,
62
+ actions: { update },
63
+ meta,
64
+ } = use(ComposerContext)
65
+
66
+ // This component works with ANY provider that implements the interface
67
+ return (
68
+ <TextInput
69
+ ref={meta.inputRef}
70
+ value={state.input}
71
+ onChangeText={(text) => update((s) => ({ ...s, input: text }))}
72
+ />
73
+ )
74
+ }
75
+ ```
76
+
77
+ **Different providers implement the same interface:**
78
+
79
+ ```tsx
80
+ // Provider A: Local state for ephemeral forms
81
+ function ForwardMessageProvider({ children }: { children: React.ReactNode }) {
82
+ const [state, setState] = useState(initialState)
83
+ const inputRef = useRef(null)
84
+ const submit = useForwardMessage()
85
+
86
+ return (
87
+ <ComposerContext
88
+ value={{
89
+ state,
90
+ actions: { update: setState, submit },
91
+ meta: { inputRef },
92
+ }}
93
+ >
94
+ {children}
95
+ </ComposerContext>
96
+ )
97
+ }
98
+
99
+ // Provider B: Global synced state for channels
100
+ function ChannelProvider({ channelId, children }: Props) {
101
+ const { state, update, submit } = useGlobalChannel(channelId)
102
+ const inputRef = useRef(null)
103
+
104
+ return (
105
+ <ComposerContext
106
+ value={{
107
+ state,
108
+ actions: { update, submit },
109
+ meta: { inputRef },
110
+ }}
111
+ >
112
+ {children}
113
+ </ComposerContext>
114
+ )
115
+ }
116
+ ```
117
+
118
+ **The same composed UI works with both:**
119
+
120
+ ```tsx
121
+ // Works with ForwardMessageProvider (local state)
122
+ <ForwardMessageProvider>
123
+ <Composer.Frame>
124
+ <Composer.Input />
125
+ <Composer.Submit />
126
+ </Composer.Frame>
127
+ </ForwardMessageProvider>
128
+
129
+ // Works with ChannelProvider (global synced state)
130
+ <ChannelProvider channelId="abc">
131
+ <Composer.Frame>
132
+ <Composer.Input />
133
+ <Composer.Submit />
134
+ </Composer.Frame>
135
+ </ChannelProvider>
136
+ ```
137
+
138
+ **Custom UI outside the component can access state and actions:**
139
+
140
+ The provider boundary is what matters—not the visual nesting. Components that
141
+ need shared state don't have to be inside the `Composer.Frame`. They just need
142
+ to be within the provider.
143
+
144
+ ```tsx
145
+ function ForwardMessageDialog() {
146
+ return (
147
+ <ForwardMessageProvider>
148
+ <Dialog>
149
+ {/* The composer UI */}
150
+ <Composer.Frame>
151
+ <Composer.Input placeholder="Add a message, if you'd like." />
152
+ <Composer.Footer>
153
+ <Composer.Formatting />
154
+ <Composer.Emojis />
155
+ </Composer.Footer>
156
+ </Composer.Frame>
157
+
158
+ {/* Custom UI OUTSIDE the composer, but INSIDE the provider */}
159
+ <MessagePreview />
160
+
161
+ {/* Actions at the bottom of the dialog */}
162
+ <DialogActions>
163
+ <CancelButton />
164
+ <ForwardButton />
165
+ </DialogActions>
166
+ </Dialog>
167
+ </ForwardMessageProvider>
168
+ )
169
+ }
170
+
171
+ // This button lives OUTSIDE Composer.Frame but can still submit based on its context!
172
+ function ForwardButton() {
173
+ const {
174
+ actions: { submit },
175
+ } = use(ComposerContext)
176
+ return <Button onPress={submit}>Forward</Button>
177
+ }
178
+
179
+ // This preview lives OUTSIDE Composer.Frame but can read composer's state!
180
+ function MessagePreview() {
181
+ const { state } = use(ComposerContext)
182
+ return <Preview message={state.input} attachments={state.attachments} />
183
+ }
184
+ ```
185
+
186
+ The `ForwardButton` and `MessagePreview` are not visually inside the composer
187
+ box, but they can still access its state and actions. This is the power of
188
+ lifting state into providers.
189
+
190
+ The UI is reusable bits you compose together. The state is dependency-injected
191
+ by the provider. Swap the provider, keep the UI.
@@ -0,0 +1,113 @@
1
+ ---
2
+ title: Decouple State Management from UI
3
+ impact: MEDIUM
4
+ impactDescription: enables swapping state implementations without changing UI
5
+ tags: composition, state, architecture
6
+ ---
7
+
8
+ ## Decouple State Management from UI
9
+
10
+ The provider component should be the only place that knows how state is managed.
11
+ UI components consume the context interface—they don't know if state comes from
12
+ useState, Zustand, or a server sync.
13
+
14
+ **Incorrect (UI coupled to state implementation):**
15
+
16
+ ```tsx
17
+ function ChannelComposer({ channelId }: { channelId: string }) {
18
+ // UI component knows about global state implementation
19
+ const state = useGlobalChannelState(channelId)
20
+ const { submit, updateInput } = useChannelSync(channelId)
21
+
22
+ return (
23
+ <Composer.Frame>
24
+ <Composer.Input
25
+ value={state.input}
26
+ onChange={(text) => sync.updateInput(text)}
27
+ />
28
+ <Composer.Submit onPress={() => sync.submit()} />
29
+ </Composer.Frame>
30
+ )
31
+ }
32
+ ```
33
+
34
+ **Correct (state management isolated in provider):**
35
+
36
+ ```tsx
37
+ // Provider handles all state management details
38
+ function ChannelProvider({
39
+ channelId,
40
+ children,
41
+ }: {
42
+ channelId: string
43
+ children: React.ReactNode
44
+ }) {
45
+ const { state, update, submit } = useGlobalChannel(channelId)
46
+ const inputRef = useRef(null)
47
+
48
+ return (
49
+ <Composer.Provider
50
+ state={state}
51
+ actions={{ update, submit }}
52
+ meta={{ inputRef }}
53
+ >
54
+ {children}
55
+ </Composer.Provider>
56
+ )
57
+ }
58
+
59
+ // UI component only knows about the context interface
60
+ function ChannelComposer() {
61
+ return (
62
+ <Composer.Frame>
63
+ <Composer.Header />
64
+ <Composer.Input />
65
+ <Composer.Footer>
66
+ <Composer.Submit />
67
+ </Composer.Footer>
68
+ </Composer.Frame>
69
+ )
70
+ }
71
+
72
+ // Usage
73
+ function Channel({ channelId }: { channelId: string }) {
74
+ return (
75
+ <ChannelProvider channelId={channelId}>
76
+ <ChannelComposer />
77
+ </ChannelProvider>
78
+ )
79
+ }
80
+ ```
81
+
82
+ **Different providers, same UI:**
83
+
84
+ ```tsx
85
+ // Local state for ephemeral forms
86
+ function ForwardMessageProvider({ children }) {
87
+ const [state, setState] = useState(initialState)
88
+ const forwardMessage = useForwardMessage()
89
+
90
+ return (
91
+ <Composer.Provider
92
+ state={state}
93
+ actions={{ update: setState, submit: forwardMessage }}
94
+ >
95
+ {children}
96
+ </Composer.Provider>
97
+ )
98
+ }
99
+
100
+ // Global synced state for channels
101
+ function ChannelProvider({ channelId, children }) {
102
+ const { state, update, submit } = useGlobalChannel(channelId)
103
+
104
+ return (
105
+ <Composer.Provider state={state} actions={{ update, submit }}>
106
+ {children}
107
+ </Composer.Provider>
108
+ )
109
+ }
110
+ ```
111
+
112
+ The same `Composer.Input` component works with both providers because it only
113
+ depends on the context interface, not the implementation.
@@ -0,0 +1,125 @@
1
+ ---
2
+ title: Lift State into Provider Components
3
+ impact: HIGH
4
+ impactDescription: enables state sharing outside component boundaries
5
+ tags: composition, state, context, providers
6
+ ---
7
+
8
+ ## Lift State into Provider Components
9
+
10
+ Move state management into dedicated provider components. This allows sibling
11
+ components outside the main UI to access and modify state without prop drilling
12
+ or awkward refs.
13
+
14
+ **Incorrect (state trapped inside component):**
15
+
16
+ ```tsx
17
+ function ForwardMessageComposer() {
18
+ const [state, setState] = useState(initialState)
19
+ const forwardMessage = useForwardMessage()
20
+
21
+ return (
22
+ <Composer.Frame>
23
+ <Composer.Input />
24
+ <Composer.Footer />
25
+ </Composer.Frame>
26
+ )
27
+ }
28
+
29
+ // Problem: How does this button access composer state?
30
+ function ForwardMessageDialog() {
31
+ return (
32
+ <Dialog>
33
+ <ForwardMessageComposer />
34
+ <MessagePreview /> {/* Needs composer state */}
35
+ <DialogActions>
36
+ <CancelButton />
37
+ <ForwardButton /> {/* Needs to call submit */}
38
+ </DialogActions>
39
+ </Dialog>
40
+ )
41
+ }
42
+ ```
43
+
44
+ **Incorrect (useEffect to sync state up):**
45
+
46
+ ```tsx
47
+ function ForwardMessageDialog() {
48
+ const [input, setInput] = useState('')
49
+ return (
50
+ <Dialog>
51
+ <ForwardMessageComposer onInputChange={setInput} />
52
+ <MessagePreview input={input} />
53
+ </Dialog>
54
+ )
55
+ }
56
+
57
+ function ForwardMessageComposer({ onInputChange }) {
58
+ const [state, setState] = useState(initialState)
59
+ useEffect(() => {
60
+ onInputChange(state.input) // Sync on every change 😬
61
+ }, [state.input])
62
+ }
63
+ ```
64
+
65
+ **Incorrect (reading state from ref on submit):**
66
+
67
+ ```tsx
68
+ function ForwardMessageDialog() {
69
+ const stateRef = useRef(null)
70
+ return (
71
+ <Dialog>
72
+ <ForwardMessageComposer stateRef={stateRef} />
73
+ <ForwardButton onPress={() => submit(stateRef.current)} />
74
+ </Dialog>
75
+ )
76
+ }
77
+ ```
78
+
79
+ **Correct (state lifted to provider):**
80
+
81
+ ```tsx
82
+ function ForwardMessageProvider({ children }: { children: React.ReactNode }) {
83
+ const [state, setState] = useState(initialState)
84
+ const forwardMessage = useForwardMessage()
85
+ const inputRef = useRef(null)
86
+
87
+ return (
88
+ <Composer.Provider
89
+ state={state}
90
+ actions={{ update: setState, submit: forwardMessage }}
91
+ meta={{ inputRef }}
92
+ >
93
+ {children}
94
+ </Composer.Provider>
95
+ )
96
+ }
97
+
98
+ function ForwardMessageDialog() {
99
+ return (
100
+ <ForwardMessageProvider>
101
+ <Dialog>
102
+ <ForwardMessageComposer />
103
+ <MessagePreview /> {/* Custom components can access state and actions */}
104
+ <DialogActions>
105
+ <CancelButton />
106
+ <ForwardButton /> {/* Custom components can access state and actions */}
107
+ </DialogActions>
108
+ </Dialog>
109
+ </ForwardMessageProvider>
110
+ )
111
+ }
112
+
113
+ function ForwardButton() {
114
+ const { actions } = use(Composer.Context)
115
+ return <Button onPress={actions.submit}>Forward</Button>
116
+ }
117
+ ```
118
+
119
+ The ForwardButton lives outside the Composer.Frame but still has access to the
120
+ submit action because it's within the provider. Even though it's a one-off
121
+ component, it can still access the composer's state and actions from outside the
122
+ UI itself.
123
+
124
+ **Key insight:** Components that need shared state don't have to be visually
125
+ nested inside each other—they just need to be within the same provider.
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: debugging-toolkit
3
+ description: "Use when working with debugging toolkit smart debug (Alias for debugging-toolkit-smart-debug)"
4
+ risk: unknown
5
+ source: "alias"
6
+ date_added: "2026-06-02"
7
+ ---
8
+
9
+ # Debugging Toolkit
10
+
11
+ > **This is an alias.** The canonical skill is **`debugging-toolkit-smart-debug`**.
12
+
13
+ This skill redirects to `debugging-toolkit-smart-debug`. Load it from the vault:
14
+
15
+ `skill-libraries/code-quality/debugging-toolkit-smart-debug/SKILL.md`
16
+
17
+ ## When to Use
18
+ - Use this skill when working with debugging toolkit smart debug (Alias for debugging-toolkit-smart-debug)
19
+
20
+ ## Why this alias exists
21
+
22
+ Users commonly search for `debugging-toolkit` but the full skill name in this collection is `debugging-toolkit-smart-debug`. This alias ensures discoverability.
23
+
24
+ ## Limitations
25
+ - Use this skill only when the task clearly matches the scope described above.
26
+ - Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
27
+ - Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.
28
+
29
+ ## Examples
30
+ ```text
31
+ Use @debugging-toolkit for this task: Use when working with debugging toolkit smart debug (Alias for debugging-toolkit-smart-debug).
32
+
33
+ Apply the skill to my current work and walk me through the safest next steps,
34
+ key checks, and the concrete output I should produce.
35
+ ```