@skyroc/scripts 2.5.1 → 2.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/README.md +6 -3
  2. package/dist/cli.mjs +1 -1
  3. package/dist/{config-BKkdncJS.mjs → config-Cj9IzlRz.mjs} +105 -5
  4. package/dist/index.mjs +1 -1
  5. package/package.json +3 -3
  6. package/templates/admin/package.json +5 -1
  7. package/templates/admin/src/assets/svg-icon/logo.svg +1 -1
  8. package/templates/admin/uno.config.ts +1 -1
  9. package/templates/admin-root/.agents/skills/component-doc/SKILL.md +304 -0
  10. package/templates/admin-root/.agents/skills/component-refactoring/SKILL.md +483 -0
  11. package/templates/admin-root/.agents/skills/component-refactoring/references/complexity-patterns.md +493 -0
  12. package/templates/admin-root/.agents/skills/component-refactoring/references/component-splitting.md +477 -0
  13. package/templates/admin-root/.agents/skills/component-refactoring/references/hook-extraction.md +317 -0
  14. package/templates/admin-root/.agents/skills/doc-coauthoring/SKILL.md +375 -0
  15. package/templates/admin-root/.agents/skills/feature-dev/SKILL.md +78 -0
  16. package/templates/admin-root/.agents/skills/frontend-code-review/SKILL.md +73 -0
  17. package/templates/admin-root/.agents/skills/frontend-code-review/references/business-logic.md +15 -0
  18. package/templates/admin-root/.agents/skills/frontend-code-review/references/code-quality.md +44 -0
  19. package/templates/admin-root/.agents/skills/frontend-code-review/references/performance.md +45 -0
  20. package/templates/admin-root/.agents/skills/frontend-design/LICENSE.txt +177 -0
  21. package/templates/admin-root/.agents/skills/frontend-design/SKILL.md +42 -0
  22. package/templates/admin-root/.agents/skills/frontend-testing/SKILL.md +325 -0
  23. package/templates/admin-root/.agents/skills/frontend-testing/assets/component-test.template.tsx +293 -0
  24. package/templates/admin-root/.agents/skills/frontend-testing/assets/hook-test.template.ts +207 -0
  25. package/templates/admin-root/.agents/skills/frontend-testing/assets/utility-test.template.ts +154 -0
  26. package/templates/admin-root/.agents/skills/frontend-testing/references/async-testing.md +345 -0
  27. package/templates/admin-root/.agents/skills/frontend-testing/references/checklist.md +205 -0
  28. package/templates/admin-root/.agents/skills/frontend-testing/references/common-patterns.md +449 -0
  29. package/templates/admin-root/.agents/skills/frontend-testing/references/domain-components.md +523 -0
  30. package/templates/admin-root/.agents/skills/frontend-testing/references/mocking.md +512 -0
  31. package/templates/admin-root/.agents/skills/frontend-testing/references/workflow.md +269 -0
  32. package/templates/admin-root/.agents/skills/migrate-nativewind-to-uniwind/SKILL.md +734 -0
  33. package/templates/admin-root/.agents/skills/migrate-oxfmt/SKILL.md +202 -0
  34. package/templates/admin-root/.agents/skills/migrate-oxlint/SKILL.md +196 -0
  35. package/templates/admin-root/.agents/skills/native-component-doc/SKILL.md +245 -0
  36. package/templates/admin-root/.agents/skills/senior-frontend/SKILL.md +209 -0
  37. package/templates/admin-root/.agents/skills/senior-frontend/references/frontend_best_practices.md +103 -0
  38. package/templates/admin-root/.agents/skills/senior-frontend/references/nextjs_optimization_guide.md +103 -0
  39. package/templates/admin-root/.agents/skills/senior-frontend/references/react_patterns.md +103 -0
  40. package/templates/admin-root/.agents/skills/senior-frontend/scripts/bundle_analyzer.py +114 -0
  41. package/templates/admin-root/.agents/skills/senior-frontend/scripts/component_generator.py +114 -0
  42. package/templates/admin-root/.agents/skills/senior-frontend/scripts/frontend_scaffolder.py +114 -0
  43. package/templates/admin-root/.agents/skills/skill-creator/SKILL.md +355 -0
  44. package/templates/admin-root/.agents/skills/skill-creator/references/output-patterns.md +86 -0
  45. package/templates/admin-root/.agents/skills/skill-creator/references/workflows.md +28 -0
  46. package/templates/admin-root/.agents/skills/skill-creator/scripts/init_skill.py +300 -0
  47. package/templates/admin-root/.agents/skills/skill-creator/scripts/package_skill.py +110 -0
  48. package/templates/admin-root/.agents/skills/skill-creator/scripts/quick_validate.py +97 -0
  49. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/SKILL.md +163 -0
  50. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/acceptance-checklist.md +75 -0
  51. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/evidence-order.md +109 -0
  52. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/prd-rules.md +103 -0
  53. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/prototype-rules.md +85 -0
  54. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/scripts/verify-prototypes.mjs +144 -0
  55. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/templates/admin-page.html +771 -0
  56. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/templates/prd.md +182 -0
  57. package/templates/admin-root/.agents/skills/ui-ux-pro-max/SKILL.md +292 -0
  58. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/charts.csv +26 -0
  59. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/colors.csv +97 -0
  60. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/icons.csv +101 -0
  61. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/landing.csv +31 -0
  62. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/products.csv +97 -0
  63. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  64. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  65. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  66. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  67. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  68. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  69. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  70. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  71. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  72. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  73. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  74. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  75. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  76. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  77. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/styles.csv +68 -0
  78. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/typography.csv +58 -0
  79. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  80. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  81. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  82. package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/core.py +253 -0
  83. package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  84. package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/search.py +114 -0
  85. package/templates/admin-root/.agents/skills/uniwind/SKILL.md +64 -0
  86. package/templates/admin-root/.agents/skills/uniwind/references/component-bindings.md +338 -0
  87. package/templates/admin-root/.agents/skills/uniwind/references/css-and-utilities.md +325 -0
  88. package/templates/admin-root/.agents/skills/uniwind/references/integrations.md +75 -0
  89. package/templates/admin-root/.agents/skills/uniwind/references/pro.md +354 -0
  90. package/templates/admin-root/.agents/skills/uniwind/references/setup.md +144 -0
  91. package/templates/admin-root/.agents/skills/uniwind/references/styling-patterns.md +237 -0
  92. package/templates/admin-root/.agents/skills/uniwind/references/theming.md +309 -0
  93. package/templates/admin-root/.agents/skills/uniwind/references/troubleshooting.md +179 -0
  94. package/templates/admin-root/.agents/skills/uniwind/references/variants-and-selectors.md +224 -0
  95. package/templates/admin-root/.agents/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  96. package/templates/admin-root/.agents/skills/vercel-react-best-practices/SKILL.md +136 -0
  97. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  98. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  99. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  100. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  101. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  102. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  103. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  104. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  105. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  106. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  107. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  108. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  109. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  110. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  111. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  112. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  113. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  114. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  115. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  116. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  117. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  118. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  119. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  120. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  121. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  122. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  123. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  124. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  125. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  126. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  127. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  128. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  129. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  130. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  131. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  132. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  133. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  134. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  135. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  136. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  137. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  138. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  139. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  140. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  141. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  142. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  143. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  144. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  145. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  146. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  147. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  148. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  149. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  150. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  151. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  152. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  153. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  154. package/templates/admin-root/.claude/settings.json +5 -0
  155. package/templates/admin-root/.claude/skills/component-doc/SKILL.md +304 -0
  156. package/templates/admin-root/.claude/skills/component-refactoring/SKILL.md +483 -0
  157. package/templates/admin-root/.claude/skills/component-refactoring/references/complexity-patterns.md +493 -0
  158. package/templates/admin-root/.claude/skills/component-refactoring/references/component-splitting.md +477 -0
  159. package/templates/admin-root/.claude/skills/component-refactoring/references/hook-extraction.md +317 -0
  160. package/templates/admin-root/.claude/skills/doc-coauthoring/SKILL.md +375 -0
  161. package/templates/admin-root/.claude/skills/feature-dev/SKILL.md +78 -0
  162. package/templates/admin-root/.claude/skills/frontend-code-review/SKILL.md +73 -0
  163. package/templates/admin-root/.claude/skills/frontend-code-review/references/business-logic.md +15 -0
  164. package/templates/admin-root/.claude/skills/frontend-code-review/references/code-quality.md +44 -0
  165. package/templates/admin-root/.claude/skills/frontend-code-review/references/performance.md +45 -0
  166. package/templates/admin-root/.claude/skills/frontend-design/LICENSE.txt +177 -0
  167. package/templates/admin-root/.claude/skills/frontend-design/SKILL.md +42 -0
  168. package/templates/admin-root/.claude/skills/frontend-testing/SKILL.md +325 -0
  169. package/templates/admin-root/.claude/skills/frontend-testing/assets/component-test.template.tsx +293 -0
  170. package/templates/admin-root/.claude/skills/frontend-testing/assets/hook-test.template.ts +207 -0
  171. package/templates/admin-root/.claude/skills/frontend-testing/assets/utility-test.template.ts +154 -0
  172. package/templates/admin-root/.claude/skills/frontend-testing/references/async-testing.md +345 -0
  173. package/templates/admin-root/.claude/skills/frontend-testing/references/checklist.md +205 -0
  174. package/templates/admin-root/.claude/skills/frontend-testing/references/common-patterns.md +449 -0
  175. package/templates/admin-root/.claude/skills/frontend-testing/references/domain-components.md +523 -0
  176. package/templates/admin-root/.claude/skills/frontend-testing/references/mocking.md +512 -0
  177. package/templates/admin-root/.claude/skills/frontend-testing/references/workflow.md +269 -0
  178. package/templates/admin-root/.claude/skills/migrate-nativewind-to-uniwind +1 -0
  179. package/templates/admin-root/.claude/skills/native-component-doc/SKILL.md +245 -0
  180. package/templates/admin-root/.claude/skills/senior-frontend/SKILL.md +209 -0
  181. package/templates/admin-root/.claude/skills/senior-frontend/references/frontend_best_practices.md +103 -0
  182. package/templates/admin-root/.claude/skills/senior-frontend/references/nextjs_optimization_guide.md +103 -0
  183. package/templates/admin-root/.claude/skills/senior-frontend/references/react_patterns.md +103 -0
  184. package/templates/admin-root/.claude/skills/senior-frontend/scripts/bundle_analyzer.py +114 -0
  185. package/templates/admin-root/.claude/skills/senior-frontend/scripts/component_generator.py +114 -0
  186. package/templates/admin-root/.claude/skills/senior-frontend/scripts/frontend_scaffolder.py +114 -0
  187. package/templates/admin-root/.claude/skills/skill-creator/SKILL.md +355 -0
  188. package/templates/admin-root/.claude/skills/skill-creator/references/output-patterns.md +86 -0
  189. package/templates/admin-root/.claude/skills/skill-creator/references/workflows.md +28 -0
  190. package/templates/admin-root/.claude/skills/skill-creator/scripts/init_skill.py +300 -0
  191. package/templates/admin-root/.claude/skills/skill-creator/scripts/package_skill.py +110 -0
  192. package/templates/admin-root/.claude/skills/skill-creator/scripts/quick_validate.py +97 -0
  193. package/templates/admin-root/.claude/skills/ui-ux-pro-max/SKILL.md +386 -0
  194. package/templates/admin-root/.claude/skills/ui-ux-pro-max/data +1 -0
  195. package/templates/admin-root/.claude/skills/ui-ux-pro-max/scripts +1 -0
  196. package/templates/admin-root/.claude/skills/uniwind +1 -0
  197. package/templates/admin-root/.claude/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  198. package/templates/admin-root/.claude/skills/vercel-react-best-practices/SKILL.md +136 -0
  199. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  200. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  201. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  202. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  203. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  204. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  205. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  206. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  207. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  208. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  209. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  210. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  211. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  212. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  213. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  214. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  215. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  216. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  217. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  218. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  219. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  220. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  221. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  222. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  223. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  224. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  225. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  226. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  227. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  228. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  229. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  230. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  231. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  232. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  233. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  234. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  235. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  236. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  237. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  238. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  239. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  240. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  241. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  242. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  243. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  244. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  245. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  246. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  247. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  248. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  249. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  250. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  251. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  252. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  253. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  254. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  255. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  256. package/templates/admin-root/.cursor/settings.json +10 -0
  257. package/templates/admin-root/.editorconfig +19 -0
  258. package/templates/admin-root/.gitattributes +16 -0
  259. package/templates/admin-root/.oxfmtrc.json +35 -0
  260. package/templates/admin-root/AGENTS.md +297 -0
  261. package/templates/admin-root/CLAUDE.md +1 -0
  262. package/templates/admin-root/skills-lock.json +27 -0
  263. package/templates/admin-root.manifest.json +1317 -0
  264. package/templates/admin.meta.json +9 -4
  265. package/LICENSE +0 -21
@@ -0,0 +1,523 @@
1
+ # Domain-Specific Component Testing
2
+
3
+ This guide covers testing patterns for Dify's domain-specific components.
4
+
5
+ ## Workflow Components (`workflow/`)
6
+
7
+ Workflow components handle node configuration, data flow, and graph operations.
8
+
9
+ ### Key Test Areas
10
+
11
+ 1. **Node Configuration**
12
+ 1. **Data Validation**
13
+ 1. **Variable Passing**
14
+ 1. **Edge Connections**
15
+ 1. **Error Handling**
16
+
17
+ ### Example: Node Configuration Panel
18
+
19
+ ```typescript
20
+ import { render, screen, fireEvent, waitFor } from '@testing-library/react'
21
+ import userEvent from '@testing-library/user-event'
22
+ import NodeConfigPanel from './node-config-panel'
23
+ import { createMockNode, createMockWorkflowContext } from '@/__mocks__/workflow'
24
+
25
+ // Mock workflow context
26
+ vi.mock('@/app/components/workflow/hooks', () => ({
27
+ useWorkflowStore: () => mockWorkflowStore,
28
+ useNodesInteractions: () => mockNodesInteractions,
29
+ }))
30
+
31
+ let mockWorkflowStore = {
32
+ nodes: [],
33
+ edges: [],
34
+ updateNode: vi.fn(),
35
+ }
36
+
37
+ let mockNodesInteractions = {
38
+ handleNodeSelect: vi.fn(),
39
+ handleNodeDelete: vi.fn(),
40
+ }
41
+
42
+ describe('NodeConfigPanel', () => {
43
+ beforeEach(() => {
44
+ vi.clearAllMocks()
45
+ mockWorkflowStore = {
46
+ nodes: [],
47
+ edges: [],
48
+ updateNode: vi.fn(),
49
+ }
50
+ })
51
+
52
+ describe('Node Configuration', () => {
53
+ it('should render node type selector', () => {
54
+ const node = createMockNode({ type: 'llm' })
55
+ render(<NodeConfigPanel node={node} />)
56
+
57
+ expect(screen.getByLabelText(/model/i)).toBeInTheDocument()
58
+ })
59
+
60
+ it('should update node config on change', async () => {
61
+ const user = userEvent.setup()
62
+ const node = createMockNode({ type: 'llm' })
63
+
64
+ render(<NodeConfigPanel node={node} />)
65
+
66
+ await user.selectOptions(screen.getByLabelText(/model/i), 'gpt-4')
67
+
68
+ expect(mockWorkflowStore.updateNode).toHaveBeenCalledWith(
69
+ node.id,
70
+ expect.objectContaining({ model: 'gpt-4' })
71
+ )
72
+ })
73
+ })
74
+
75
+ describe('Data Validation', () => {
76
+ it('should show error for invalid input', async () => {
77
+ const user = userEvent.setup()
78
+ const node = createMockNode({ type: 'code' })
79
+
80
+ render(<NodeConfigPanel node={node} />)
81
+
82
+ // Enter invalid code
83
+ const codeInput = screen.getByLabelText(/code/i)
84
+ await user.clear(codeInput)
85
+ await user.type(codeInput, 'invalid syntax {{{')
86
+
87
+ await waitFor(() => {
88
+ expect(screen.getByText(/syntax error/i)).toBeInTheDocument()
89
+ })
90
+ })
91
+
92
+ it('should validate required fields', async () => {
93
+ const node = createMockNode({ type: 'http', data: { url: '' } })
94
+
95
+ render(<NodeConfigPanel node={node} />)
96
+
97
+ fireEvent.click(screen.getByRole('button', { name: /save/i }))
98
+
99
+ await waitFor(() => {
100
+ expect(screen.getByText(/url is required/i)).toBeInTheDocument()
101
+ })
102
+ })
103
+ })
104
+
105
+ describe('Variable Passing', () => {
106
+ it('should display available variables from upstream nodes', () => {
107
+ const upstreamNode = createMockNode({
108
+ id: 'node-1',
109
+ type: 'start',
110
+ data: { outputs: [{ name: 'user_input', type: 'string' }] },
111
+ })
112
+ const currentNode = createMockNode({
113
+ id: 'node-2',
114
+ type: 'llm',
115
+ })
116
+
117
+ mockWorkflowStore.nodes = [upstreamNode, currentNode]
118
+ mockWorkflowStore.edges = [{ source: 'node-1', target: 'node-2' }]
119
+
120
+ render(<NodeConfigPanel node={currentNode} />)
121
+
122
+ // Variable selector should show upstream variables
123
+ fireEvent.click(screen.getByRole('button', { name: /add variable/i }))
124
+
125
+ expect(screen.getByText('user_input')).toBeInTheDocument()
126
+ })
127
+
128
+ it('should insert variable into prompt template', async () => {
129
+ const user = userEvent.setup()
130
+ const node = createMockNode({ type: 'llm' })
131
+
132
+ render(<NodeConfigPanel node={node} />)
133
+
134
+ // Click variable button
135
+ await user.click(screen.getByRole('button', { name: /insert variable/i }))
136
+ await user.click(screen.getByText('user_input'))
137
+
138
+ const promptInput = screen.getByLabelText(/prompt/i)
139
+ expect(promptInput).toHaveValue(expect.stringContaining('{{user_input}}'))
140
+ })
141
+ })
142
+ })
143
+ ```
144
+
145
+ ## Dataset Components (`dataset/`)
146
+
147
+ Dataset components handle file uploads, data display, and search/filter operations.
148
+
149
+ ### Key Test Areas
150
+
151
+ 1. **File Upload**
152
+ 1. **File Type Validation**
153
+ 1. **Pagination**
154
+ 1. **Search & Filtering**
155
+ 1. **Data Format Handling**
156
+
157
+ ### Example: Document Uploader
158
+
159
+ ```typescript
160
+ import { render, screen, fireEvent, waitFor } from '@testing-library/react'
161
+ import userEvent from '@testing-library/user-event'
162
+ import DocumentUploader from './document-uploader'
163
+
164
+ vi.mock('@/service/datasets', () => ({
165
+ uploadDocument: vi.fn(),
166
+ parseDocument: vi.fn(),
167
+ }))
168
+
169
+ import * as datasetService from '@/service/datasets'
170
+ const mockedService = vi.mocked(datasetService)
171
+
172
+ describe('DocumentUploader', () => {
173
+ beforeEach(() => {
174
+ vi.clearAllMocks()
175
+ })
176
+
177
+ describe('File Upload', () => {
178
+ it('should accept valid file types', async () => {
179
+ const user = userEvent.setup()
180
+ const onUpload = vi.fn()
181
+ mockedService.uploadDocument.mockResolvedValue({ id: 'doc-1' })
182
+
183
+ render(<DocumentUploader onUpload={onUpload} />)
184
+
185
+ const file = new File(['content'], 'test.pdf', { type: 'application/pdf' })
186
+ const input = screen.getByLabelText(/upload/i)
187
+
188
+ await user.upload(input, file)
189
+
190
+ await waitFor(() => {
191
+ expect(mockedService.uploadDocument).toHaveBeenCalledWith(
192
+ expect.any(FormData)
193
+ )
194
+ })
195
+ })
196
+
197
+ it('should reject invalid file types', async () => {
198
+ const user = userEvent.setup()
199
+
200
+ render(<DocumentUploader />)
201
+
202
+ const file = new File(['content'], 'test.exe', { type: 'application/x-msdownload' })
203
+ const input = screen.getByLabelText(/upload/i)
204
+
205
+ await user.upload(input, file)
206
+
207
+ expect(screen.getByText(/unsupported file type/i)).toBeInTheDocument()
208
+ expect(mockedService.uploadDocument).not.toHaveBeenCalled()
209
+ })
210
+
211
+ it('should show upload progress', async () => {
212
+ const user = userEvent.setup()
213
+
214
+ // Mock upload with progress
215
+ mockedService.uploadDocument.mockImplementation(() => {
216
+ return new Promise((resolve) => {
217
+ setTimeout(() => resolve({ id: 'doc-1' }), 100)
218
+ })
219
+ })
220
+
221
+ render(<DocumentUploader />)
222
+
223
+ const file = new File(['content'], 'test.pdf', { type: 'application/pdf' })
224
+ await user.upload(screen.getByLabelText(/upload/i), file)
225
+
226
+ expect(screen.getByRole('progressbar')).toBeInTheDocument()
227
+
228
+ await waitFor(() => {
229
+ expect(screen.queryByRole('progressbar')).not.toBeInTheDocument()
230
+ })
231
+ })
232
+ })
233
+
234
+ describe('Error Handling', () => {
235
+ it('should handle upload failure', async () => {
236
+ const user = userEvent.setup()
237
+ mockedService.uploadDocument.mockRejectedValue(new Error('Upload failed'))
238
+
239
+ render(<DocumentUploader />)
240
+
241
+ const file = new File(['content'], 'test.pdf', { type: 'application/pdf' })
242
+ await user.upload(screen.getByLabelText(/upload/i), file)
243
+
244
+ await waitFor(() => {
245
+ expect(screen.getByText(/upload failed/i)).toBeInTheDocument()
246
+ })
247
+ })
248
+
249
+ it('should allow retry after failure', async () => {
250
+ const user = userEvent.setup()
251
+ mockedService.uploadDocument
252
+ .mockRejectedValueOnce(new Error('Network error'))
253
+ .mockResolvedValueOnce({ id: 'doc-1' })
254
+
255
+ render(<DocumentUploader />)
256
+
257
+ const file = new File(['content'], 'test.pdf', { type: 'application/pdf' })
258
+ await user.upload(screen.getByLabelText(/upload/i), file)
259
+
260
+ await waitFor(() => {
261
+ expect(screen.getByRole('button', { name: /retry/i })).toBeInTheDocument()
262
+ })
263
+
264
+ await user.click(screen.getByRole('button', { name: /retry/i }))
265
+
266
+ await waitFor(() => {
267
+ expect(screen.getByText(/uploaded successfully/i)).toBeInTheDocument()
268
+ })
269
+ })
270
+ })
271
+ })
272
+ ```
273
+
274
+ ### Example: Document List with Pagination
275
+
276
+ ```typescript
277
+ describe('DocumentList', () => {
278
+ describe('Pagination', () => {
279
+ it('should load first page on mount', async () => {
280
+ mockedService.getDocuments.mockResolvedValue({
281
+ data: [{ id: '1', name: 'Doc 1' }],
282
+ total: 50,
283
+ page: 1,
284
+ pageSize: 10,
285
+ })
286
+
287
+ render(<DocumentList datasetId="ds-1" />)
288
+
289
+ await waitFor(() => {
290
+ expect(screen.getByText('Doc 1')).toBeInTheDocument()
291
+ })
292
+
293
+ expect(mockedService.getDocuments).toHaveBeenCalledWith('ds-1', { page: 1 })
294
+ })
295
+
296
+ it('should navigate to next page', async () => {
297
+ const user = userEvent.setup()
298
+ mockedService.getDocuments.mockResolvedValue({
299
+ data: [{ id: '1', name: 'Doc 1' }],
300
+ total: 50,
301
+ page: 1,
302
+ pageSize: 10,
303
+ })
304
+
305
+ render(<DocumentList datasetId="ds-1" />)
306
+
307
+ await waitFor(() => {
308
+ expect(screen.getByText('Doc 1')).toBeInTheDocument()
309
+ })
310
+
311
+ mockedService.getDocuments.mockResolvedValue({
312
+ data: [{ id: '11', name: 'Doc 11' }],
313
+ total: 50,
314
+ page: 2,
315
+ pageSize: 10,
316
+ })
317
+
318
+ await user.click(screen.getByRole('button', { name: /next/i }))
319
+
320
+ await waitFor(() => {
321
+ expect(screen.getByText('Doc 11')).toBeInTheDocument()
322
+ })
323
+ })
324
+ })
325
+
326
+ describe('Search & Filtering', () => {
327
+ it('should filter by search query', async () => {
328
+ const user = userEvent.setup()
329
+ vi.useFakeTimers()
330
+
331
+ render(<DocumentList datasetId="ds-1" />)
332
+
333
+ await user.type(screen.getByPlaceholderText(/search/i), 'test query')
334
+
335
+ // Debounce
336
+ vi.advanceTimersByTime(300)
337
+
338
+ await waitFor(() => {
339
+ expect(mockedService.getDocuments).toHaveBeenCalledWith(
340
+ 'ds-1',
341
+ expect.objectContaining({ search: 'test query' })
342
+ )
343
+ })
344
+
345
+ vi.useRealTimers()
346
+ })
347
+ })
348
+ })
349
+ ```
350
+
351
+ ## Configuration Components (`app/configuration/`, `config/`)
352
+
353
+ Configuration components handle forms, validation, and data persistence.
354
+
355
+ ### Key Test Areas
356
+
357
+ 1. **Form Validation**
358
+ 1. **Save/Reset**
359
+ 1. **Required vs Optional Fields**
360
+ 1. **Configuration Persistence**
361
+ 1. **Error Feedback**
362
+
363
+ ### Example: App Configuration Form
364
+
365
+ ```typescript
366
+ import { render, screen, fireEvent, waitFor } from '@testing-library/react'
367
+ import userEvent from '@testing-library/user-event'
368
+ import AppConfigForm from './app-config-form'
369
+
370
+ vi.mock('@/service/apps', () => ({
371
+ updateAppConfig: vi.fn(),
372
+ getAppConfig: vi.fn(),
373
+ }))
374
+
375
+ import * as appService from '@/service/apps'
376
+ const mockedService = vi.mocked(appService)
377
+
378
+ describe('AppConfigForm', () => {
379
+ const defaultConfig = {
380
+ name: 'My App',
381
+ description: '',
382
+ icon: 'default',
383
+ openingStatement: '',
384
+ }
385
+
386
+ beforeEach(() => {
387
+ vi.clearAllMocks()
388
+ mockedService.getAppConfig.mockResolvedValue(defaultConfig)
389
+ })
390
+
391
+ describe('Form Validation', () => {
392
+ it('should require app name', async () => {
393
+ const user = userEvent.setup()
394
+
395
+ render(<AppConfigForm appId="app-1" />)
396
+
397
+ await waitFor(() => {
398
+ expect(screen.getByLabelText(/name/i)).toHaveValue('My App')
399
+ })
400
+
401
+ // Clear name field
402
+ await user.clear(screen.getByLabelText(/name/i))
403
+ await user.click(screen.getByRole('button', { name: /save/i }))
404
+
405
+ expect(screen.getByText(/name is required/i)).toBeInTheDocument()
406
+ expect(mockedService.updateAppConfig).not.toHaveBeenCalled()
407
+ })
408
+
409
+ it('should validate name length', async () => {
410
+ const user = userEvent.setup()
411
+
412
+ render(<AppConfigForm appId="app-1" />)
413
+
414
+ await waitFor(() => {
415
+ expect(screen.getByLabelText(/name/i)).toBeInTheDocument()
416
+ })
417
+
418
+ // Enter very long name
419
+ await user.clear(screen.getByLabelText(/name/i))
420
+ await user.type(screen.getByLabelText(/name/i), 'a'.repeat(101))
421
+
422
+ expect(screen.getByText(/name must be less than 100 characters/i)).toBeInTheDocument()
423
+ })
424
+
425
+ it('should allow empty optional fields', async () => {
426
+ const user = userEvent.setup()
427
+ mockedService.updateAppConfig.mockResolvedValue({ success: true })
428
+
429
+ render(<AppConfigForm appId="app-1" />)
430
+
431
+ await waitFor(() => {
432
+ expect(screen.getByLabelText(/name/i)).toHaveValue('My App')
433
+ })
434
+
435
+ // Leave description empty (optional)
436
+ await user.click(screen.getByRole('button', { name: /save/i }))
437
+
438
+ await waitFor(() => {
439
+ expect(mockedService.updateAppConfig).toHaveBeenCalled()
440
+ })
441
+ })
442
+ })
443
+
444
+ describe('Save/Reset Functionality', () => {
445
+ it('should save configuration', async () => {
446
+ const user = userEvent.setup()
447
+ mockedService.updateAppConfig.mockResolvedValue({ success: true })
448
+
449
+ render(<AppConfigForm appId="app-1" />)
450
+
451
+ await waitFor(() => {
452
+ expect(screen.getByLabelText(/name/i)).toHaveValue('My App')
453
+ })
454
+
455
+ await user.clear(screen.getByLabelText(/name/i))
456
+ await user.type(screen.getByLabelText(/name/i), 'Updated App')
457
+ await user.click(screen.getByRole('button', { name: /save/i }))
458
+
459
+ await waitFor(() => {
460
+ expect(mockedService.updateAppConfig).toHaveBeenCalledWith(
461
+ 'app-1',
462
+ expect.objectContaining({ name: 'Updated App' })
463
+ )
464
+ })
465
+
466
+ expect(screen.getByText(/saved successfully/i)).toBeInTheDocument()
467
+ })
468
+
469
+ it('should reset to default values', async () => {
470
+ const user = userEvent.setup()
471
+
472
+ render(<AppConfigForm appId="app-1" />)
473
+
474
+ await waitFor(() => {
475
+ expect(screen.getByLabelText(/name/i)).toHaveValue('My App')
476
+ })
477
+
478
+ // Make changes
479
+ await user.clear(screen.getByLabelText(/name/i))
480
+ await user.type(screen.getByLabelText(/name/i), 'Changed Name')
481
+
482
+ // Reset
483
+ await user.click(screen.getByRole('button', { name: /reset/i }))
484
+
485
+ expect(screen.getByLabelText(/name/i)).toHaveValue('My App')
486
+ })
487
+
488
+ it('should show unsaved changes warning', async () => {
489
+ const user = userEvent.setup()
490
+
491
+ render(<AppConfigForm appId="app-1" />)
492
+
493
+ await waitFor(() => {
494
+ expect(screen.getByLabelText(/name/i)).toHaveValue('My App')
495
+ })
496
+
497
+ // Make changes
498
+ await user.type(screen.getByLabelText(/name/i), ' Updated')
499
+
500
+ expect(screen.getByText(/unsaved changes/i)).toBeInTheDocument()
501
+ })
502
+ })
503
+
504
+ describe('Error Handling', () => {
505
+ it('should show error on save failure', async () => {
506
+ const user = userEvent.setup()
507
+ mockedService.updateAppConfig.mockRejectedValue(new Error('Server error'))
508
+
509
+ render(<AppConfigForm appId="app-1" />)
510
+
511
+ await waitFor(() => {
512
+ expect(screen.getByLabelText(/name/i)).toHaveValue('My App')
513
+ })
514
+
515
+ await user.click(screen.getByRole('button', { name: /save/i }))
516
+
517
+ await waitFor(() => {
518
+ expect(screen.getByText(/failed to save/i)).toBeInTheDocument()
519
+ })
520
+ })
521
+ })
522
+ })
523
+ ```