@pega/custom-dx-components 26.1.11 → 26.1.12-alpha.0.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 (323) hide show
  1. package/README.md +6 -2
  2. package/package.json +48 -64
  3. package/src/ai/README.md +44 -0
  4. package/src/ai/catalog/README.md +133 -0
  5. package/src/ai/catalog/best-practices/README.md +24 -0
  6. package/src/ai/catalog/best-practices/accessibility-for-async-components.md +53 -0
  7. package/src/ai/catalog/best-practices/error-handling-and-resiliency.md +116 -0
  8. package/src/ai/catalog/best-practices/genai-assistant-integration-patterns.md +49 -0
  9. package/src/ai/catalog/best-practices/performance-and-efficiency.md +109 -0
  10. package/src/ai/catalog/best-practices/security-considerations.md +93 -0
  11. package/src/ai/catalog/best-practices/testing-pconnect-components.md +245 -0
  12. package/src/ai/catalog/best-practices/troubleshooting-common-pitfalls.md +132 -0
  13. package/src/ai/catalog/pconnect-assignment-lifecycle/SKILL.md +44 -0
  14. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/README.md +39 -0
  15. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/approval-workflow-decision.md +47 -0
  16. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/attachment-upload.md +45 -0
  17. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/bulk-action-submit.md +50 -0
  18. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/confirm-before-destructive-action.md +43 -0
  19. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/create-and-stage-new-case.md +45 -0
  20. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/graceful-submit-failure.md +39 -0
  21. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/modal-assignment-submit.md +58 -0
  22. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/multi-step-wizard.md +44 -0
  23. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/resolve-or-ignore-duplicate.md +47 -0
  24. package/src/ai/catalog/pconnect-assignment-lifecycle/cookbooks/safe-case-deletion.md +36 -0
  25. package/src/ai/catalog/pconnect-case-collaboration/SKILL.md +42 -0
  26. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/README.md +36 -0
  27. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/look-up-user-details.md +43 -0
  28. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/manage-case-attachments.md +51 -0
  29. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/manage-case-participants.md +52 -0
  30. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/participant-and-follower.md +40 -0
  31. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/post-and-manage-feed.md +50 -0
  32. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/relate-cases.md +35 -0
  33. package/src/ai/catalog/pconnect-case-collaboration/cookbooks/tag-case-and-find-related.md +44 -0
  34. package/src/ai/catalog/pconnect-data-subscriptions/SKILL.md +42 -0
  35. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/README.md +35 -0
  36. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/data-page-subscription-cleanup.md +41 -0
  37. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/publish-and-subscribe-events.md +40 -0
  38. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/pubsub-cleanup.md +38 -0
  39. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/query-paginated-list-data.md +44 -0
  40. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/realtime-case-subscription.md +46 -0
  41. package/src/ai/catalog/pconnect-data-subscriptions/cookbooks/refresh-and-update-data.md +41 -0
  42. package/src/ai/catalog/pconnect-forms-and-fields/SKILL.md +44 -0
  43. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/README.md +36 -0
  44. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/autosave-tracking.md +45 -0
  45. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/cascading-dependent-fields.md +51 -0
  46. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/collect-form-changes-for-manual-save.md +45 -0
  47. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/custom-field-validators.md +44 -0
  48. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/discard-changes-and-reset-form.md +41 -0
  49. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/full-form-validation.md +38 -0
  50. package/src/ai/catalog/pconnect-forms-and-fields/cookbooks/persist-widget-ui-state.md +41 -0
  51. package/src/ai/catalog/pconnect-lists-and-views/SKILL.md +44 -0
  52. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/README.md +35 -0
  53. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/activate-and-switch-container-items.md +52 -0
  54. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/container-item-lifecycle.md +61 -0
  55. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/insert-delete-list-rows.md +40 -0
  56. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/reorder-list-rows.md +39 -0
  57. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/repeating-row-edit.md +39 -0
  58. package/src/ai/catalog/pconnect-lists-and-views/cookbooks/view-personalization.md +60 -0
  59. package/src/ai/catalog/pconnect-navigation-locale-genai/SKILL.md +45 -0
  60. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/README.md +35 -0
  61. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/agent-conversation-for-tasks.md +54 -0
  62. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/bookmarkable-filter-state.md +40 -0
  63. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/deep-link-semantic-url.md +39 -0
  64. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/genai-assistant-conversation.md +43 -0
  65. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/locale-switch-and-relocalize.md +38 -0
  66. package/src/ai/catalog/pconnect-navigation-locale-genai/cookbooks/persist-operator-preferences.md +40 -0
  67. package/src/ai/catalog/references/architecture-overview.md +52 -0
  68. package/src/ai/catalog/references/pconnect-actions-api.md +948 -0
  69. package/src/ai/catalog/references/pconnect-case-info-data-info-localization.md +618 -0
  70. package/src/ai/catalog/references/pconnect-case-validation-utilities.md +238 -0
  71. package/src/ai/catalog/references/pconnect-container-manager.md +215 -0
  72. package/src/ai/catalog/references/pconnect-list-actions.md +250 -0
  73. package/src/ai/catalog/references/pconnect-misc-suggestions-creation.md +231 -0
  74. package/src/ai/catalog/references/pconnect-reference-context-component.md +471 -0
  75. package/src/ai/catalog/references/pconnect-state-config.md +316 -0
  76. package/src/ai/catalog/references/pconnect-validation-api.md +45 -0
  77. package/src/ai/catalog/references/pcore-analytics-genai-details.md +50 -0
  78. package/src/ai/catalog/references/pcore-bootstrap-init-details.md +121 -0
  79. package/src/ai/catalog/references/pcore-bootstrap-registry-routing.md +253 -0
  80. package/src/ai/catalog/references/pcore-case-collaboration-details.md +191 -0
  81. package/src/ai/catalog/references/pcore-case-collaboration-genai.md +264 -0
  82. package/src/ai/catalog/references/pcore-environment-info-details.md +96 -0
  83. package/src/ai/catalog/references/pcore-environment-locale-namespace.md +175 -0
  84. package/src/ai/catalog/references/pcore-messaging-details.md +99 -0
  85. package/src/ai/catalog/references/pcore-misc-details.md +207 -0
  86. package/src/ai/catalog/references/pcore-misc-utilities.md +325 -0
  87. package/src/ai/catalog/references/pcore-rest-data-details.md +164 -0
  88. package/src/ai/catalog/references/pcore-rest-data-messaging.md +308 -0
  89. package/src/ai/catalog/references/pcore-store-context-details.md +40 -0
  90. package/src/ai/catalog/references/pcore-store-context-state.md +130 -0
  91. package/src/ai/index.js +154 -0
  92. package/src/ai/project/.claude/skills/boolean/SKILL.md +43 -0
  93. package/src/ai/project/.claude/skills/case/SKILL.md +58 -0
  94. package/src/ai/project/.claude/skills/create-dx-component/SKILL.md +98 -0
  95. package/src/ai/project/.claude/skills/create-dx-component/assets/PConnProps.d.ts +24 -0
  96. package/src/ai/project/.claude/skills/create-dx-component/assets/create-nonce.ts +5 -0
  97. package/src/ai/project/.claude/skills/create-dx-component/assets/event-utils.ts +18 -0
  98. package/src/ai/project/.claude/skills/create-dx-component/assets/styles.ts +7 -0
  99. package/src/ai/project/.claude/skills/create-dx-component/cookbooks/README.md +28 -0
  100. package/src/ai/project/.claude/skills/create-dx-component/cookbooks/build-a-data-widget.md +281 -0
  101. package/src/ai/project/.claude/skills/create-dx-component/cookbooks/field-with-limits-and-validation.md +156 -0
  102. package/src/ai/project/.claude/skills/create-dx-component/cookbooks/status-badge-field.md +97 -0
  103. package/src/ai/project/.claude/skills/create-dx-component/references/accessibility.md +71 -0
  104. package/src/ai/project/.claude/skills/create-dx-component/references/choosing-type-and-subtype.md +79 -0
  105. package/src/ai/project/.claude/skills/create-dx-component/references/cli-workflow.md +125 -0
  106. package/src/ai/project/.claude/skills/create-dx-component/references/component-patterns.md +241 -0
  107. package/src/ai/project/.claude/skills/create-dx-component/references/config-schema.md +296 -0
  108. package/src/ai/project/.claude/skills/create-dx-component/references/cosmos-components.md +137 -0
  109. package/src/ai/project/.claude/skills/create-dx-component/references/field-behavior.md +155 -0
  110. package/src/ai/project/.claude/skills/create-dx-component/references/field-essentials.md +90 -0
  111. package/src/ai/project/.claude/skills/create-dx-component/references/field-subtypes-extra.md +68 -0
  112. package/src/ai/project/.claude/skills/create-dx-component/references/localization.md +30 -0
  113. package/src/ai/project/.claude/skills/create-dx-component/references/pcore-pconnect-apis.md +77 -0
  114. package/src/ai/project/.claude/skills/create-dx-component/references/presentation-essentials.md +57 -0
  115. package/src/ai/project/.claude/skills/create-dx-component/references/props-contract.md +182 -0
  116. package/src/ai/project/.claude/skills/create-dx-component/references/state-matrix.md +102 -0
  117. package/src/ai/project/.claude/skills/create-dx-component/references/storybook-pattern.md +262 -0
  118. package/src/ai/project/.claude/skills/create-dx-component/references/styles-pattern.md +54 -0
  119. package/src/ai/project/.claude/skills/create-dx-component/references/template-essentials.md +87 -0
  120. package/src/ai/project/.claude/skills/create-dx-component/references/template-patterns.md +131 -0
  121. package/src/ai/project/.claude/skills/create-dx-component/references/test-pattern.md +215 -0
  122. package/src/ai/project/.claude/skills/create-dx-component/references/ui-gallery-reuse.md +93 -0
  123. package/src/ai/project/.claude/skills/create-dx-component/references/widget-essentials.md +84 -0
  124. package/src/ai/project/.claude/skills/create-dx-component/references/widget-patterns.md +164 -0
  125. package/src/ai/project/.claude/skills/currency/SKILL.md +46 -0
  126. package/src/ai/project/.claude/skills/date/SKILL.md +46 -0
  127. package/src/ai/project/.claude/skills/decimal/SKILL.md +49 -0
  128. package/src/ai/project/.claude/skills/details/SKILL.md +60 -0
  129. package/src/ai/project/.claude/skills/email/SKILL.md +42 -0
  130. package/src/ai/project/.claude/skills/field/SKILL.md +68 -0
  131. package/src/ai/project/.claude/skills/form/SKILL.md +51 -0
  132. package/src/ai/project/.claude/skills/generate-component-set/SKILL.md +80 -0
  133. package/src/ai/project/.claude/skills/generate-component-set/component-manifest.json +161 -0
  134. package/src/ai/project/.claude/skills/identify-components/SKILL.md +76 -0
  135. package/src/ai/project/.claude/skills/integer/SKILL.md +45 -0
  136. package/src/ai/project/.claude/skills/page/SKILL.md +60 -0
  137. package/src/ai/project/.claude/skills/page-widget/SKILL.md +55 -0
  138. package/src/ai/project/.claude/skills/percentage/SKILL.md +52 -0
  139. package/src/ai/project/.claude/skills/phone/SKILL.md +44 -0
  140. package/src/ai/project/.claude/skills/picklist/SKILL.md +50 -0
  141. package/src/ai/project/.claude/skills/plan-dx-component/SKILL.md +51 -0
  142. package/src/ai/project/.claude/skills/plan-dx-component/references/design-system-mapping.md +108 -0
  143. package/src/ai/project/.claude/skills/plan-dx-component/references/intake.md +146 -0
  144. package/src/ai/project/.claude/skills/plan-dx-component/references/plan-template.md +76 -0
  145. package/src/ai/project/.claude/skills/plan-dx-component/references/requirements-template.md +88 -0
  146. package/src/ai/project/.claude/skills/presentation/SKILL.md +61 -0
  147. package/src/ai/project/.claude/skills/publish-library/SKILL.md +106 -0
  148. package/src/ai/project/.claude/skills/radiobuttons/SKILL.md +51 -0
  149. package/src/ai/project/.claude/skills/review-component/SKILL.md +49 -0
  150. package/src/ai/project/.claude/skills/review-component/references/checklist.md +77 -0
  151. package/src/ai/project/.claude/skills/template/SKILL.md +60 -0
  152. package/src/ai/project/.claude/skills/text/SKILL.md +45 -0
  153. package/src/ai/project/.claude/skills/update-dx-component/SKILL.md +56 -0
  154. package/src/ai/project/.claude/skills/update-dx-component/references/maintenance.md +43 -0
  155. package/src/ai/project/.claude/skills/url/SKILL.md +46 -0
  156. package/src/ai/project/.claude/skills/validate-component/SKILL.md +78 -0
  157. package/src/ai/project/.claude/skills/validate-component/references/runtime-troubleshooting.md +56 -0
  158. package/src/ai/project/.claude/skills/validate-component/scripts/check-component.mjs +327 -0
  159. package/src/ai/project/.claude/skills/widget/SKILL.md +59 -0
  160. package/src/ai/project/.gemini/settings.json +5 -0
  161. package/src/ai/project/AGENTS.md +74 -0
  162. package/src/ai/readme-section.md +91 -0
  163. package/src/cli.js +48 -7
  164. package/src/constants.js +54 -53
  165. package/src/internal-tests.js +27 -0
  166. package/src/tasks/ai-toggle/index.js +46 -0
  167. package/src/tasks/authenticate/helper.js +38 -38
  168. package/src/tasks/authenticate/index.js +17 -15
  169. package/src/tasks/build-all/helper.js +4 -4
  170. package/src/tasks/build-all/index.js +7 -7
  171. package/src/tasks/build-comp/helper.js +17 -17
  172. package/src/tasks/build-comp/index.js +10 -10
  173. package/src/tasks/build-jest-assets/index.js +7 -9
  174. package/src/tasks/build-lib/helper.js +8 -8
  175. package/src/tasks/build-lib/index.js +8 -8
  176. package/src/tasks/bundle/builder/index.js +9 -12
  177. package/src/tasks/bundle/builder/modules.js +8 -9
  178. package/src/tasks/bundle/builder/paths.js +2 -19
  179. package/src/tasks/bundle/builder/webpack.config.js +60 -77
  180. package/src/tasks/bundle/index.js +8 -8
  181. package/src/tasks/create/index.js +35 -35
  182. package/src/tasks/create/templates/Constellation/Field/Boolean/index.tsx.mustache +1 -36
  183. package/src/tasks/create/templates/Constellation/Field/Date/date.ts.mustache +2 -2
  184. package/src/tasks/create/templates/Constellation/Field/Date/index.tsx.mustache +2 -27
  185. package/src/tasks/create/templates/Constellation/Field/DateTime/date-utils.ts.mustache +2 -2
  186. package/src/tasks/create/templates/Constellation/Field/DateTime/date.ts.mustache +2 -2
  187. package/src/tasks/create/templates/Constellation/Field/DateTime/index.tsx.mustache +2 -35
  188. package/src/tasks/create/templates/Constellation/Field/Decimal/index.tsx.mustache +3 -36
  189. package/src/tasks/create/templates/Constellation/Field/Decimal-Currency/index.tsx.mustache +4 -39
  190. package/src/tasks/create/templates/Constellation/Field/Decimal-Percentage/index.tsx.mustache +4 -53
  191. package/src/tasks/create/templates/Constellation/Field/Icon-Button-URL/index.tsx.mustache +5 -5
  192. package/src/tasks/create/templates/Constellation/Field/Integer/index.tsx.mustache +3 -36
  193. package/src/tasks/create/templates/Constellation/Field/Picklist/index.tsx.mustache +7 -42
  194. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/component-constants.ts +1 -1
  195. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/date.ts.mustache +0 -2
  196. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/embed-utils.ts.mustache +1 -1
  197. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/index.tsx.mustache +11 -11
  198. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/repeat-utils.ts.mustache +3 -13
  199. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/textformat-utils.tsx.mustache +2 -3
  200. package/src/tasks/create/templates/Constellation/Field/Picklist-Autocomplete/utils.ts.mustache +28 -28
  201. package/src/tasks/create/templates/Constellation/Field/Picklist-RadioButtons/index.tsx.mustache +2 -2
  202. package/src/tasks/create/templates/Constellation/Field/Picklist-RadioButtons/textformat-utils.tsx.mustache +2 -3
  203. package/src/tasks/create/templates/Constellation/Field/Text/index.tsx.mustache +4 -33
  204. package/src/tasks/create/templates/Constellation/Field/Text-Email/index.tsx.mustache +3 -33
  205. package/src/tasks/create/templates/Constellation/Field/Text-Input/index.tsx.mustache +3 -31
  206. package/src/tasks/create/templates/Constellation/Field/Text-Paragraph/index.tsx.mustache +3 -31
  207. package/src/tasks/create/templates/Constellation/Field/Text-Phone/index.tsx.mustache +3 -35
  208. package/src/tasks/create/templates/Constellation/Field/Text-URL/index.tsx.mustache +3 -33
  209. package/src/tasks/create/templates/Constellation/Field/Text-URL/text-url.tsx.mustache +2 -3
  210. package/src/tasks/create/templates/Constellation/Field/TimeofDay/index.tsx.mustache +2 -35
  211. package/src/tasks/create/templates/Constellation/Field/TimeofDay/time-of-day.ts.mustache +2 -2
  212. package/src/tasks/create/templates/Constellation/Template/DETAILS/Avatar.tsx.mustache +19 -15
  213. package/src/tasks/create/templates/Constellation/Template/DETAILS/Operator.tsx.mustache +6 -6
  214. package/src/tasks/create/templates/Constellation/Template/DETAILS/demo.stories.tsx.mustache +1 -1
  215. package/src/tasks/create/templates/Constellation/Template/DETAILS/index.tsx.mustache +4 -8
  216. package/src/tasks/create/templates/Constellation/Template/DETAILS/mock.ts.mustache +9 -9
  217. package/src/tasks/create/templates/Constellation/Template/DETAILS/utils.js.mustache +4 -8
  218. package/src/tasks/create/templates/Constellation/Template/DETAILS-region/Avatar.tsx.mustache +19 -15
  219. package/src/tasks/create/templates/Constellation/Template/DETAILS-region/Operator.tsx.mustache +6 -6
  220. package/src/tasks/create/templates/Constellation/Template/DETAILS-region/demo.stories.tsx.mustache +1 -1
  221. package/src/tasks/create/templates/Constellation/Template/DETAILS-region/index.tsx.mustache +1 -1
  222. package/src/tasks/create/templates/Constellation/Template/DETAILS-region/mock.ts.mustache +9 -9
  223. package/src/tasks/create/templates/Constellation/Template/DETAILS-region/utils.ts.mustache +4 -8
  224. package/src/tasks/create/templates/Constellation/Template/FORM/demo.stories.tsx.mustache +8 -8
  225. package/src/tasks/create/templates/Constellation/Template/FORM-region/demo.stories.tsx.mustache +8 -8
  226. package/src/tasks/create/templates/Constellation/Template/PAGE/utils.ts.mustache +4 -9
  227. package/src/tasks/create/templates/Constellation/Widget/CASE/demo.test.tsx.mustache +3 -3
  228. package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/Avatar.tsx.mustache +19 -14
  229. package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/Operator.tsx.mustache +6 -6
  230. package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/index.tsx.mustache +1 -1
  231. package/src/tasks/create/templates/Constellation/Widget/PAGE-CASE/mock.ts.mustache +1 -1
  232. package/src/tasks/create/templates/Launchpad/Field/Icon-Button-URL/index.tsx.mustache +5 -5
  233. package/src/tasks/create/templates/Launchpad/Field/Text-Phone/index.tsx.mustache +3 -35
  234. package/src/tasks/create/templates/Launchpad/Field/__components.md +1 -1
  235. package/src/tasks/create/templates/Launchpad/Template/FORM/demo.stories.tsx.mustache +8 -8
  236. package/src/tasks/create/templates/Launchpad/Template/FORM-region/demo.stories.tsx.mustache +8 -8
  237. package/src/tasks/create/templates/Launchpad/Widget/CASE/demo.test.tsx.mustache +3 -3
  238. package/src/tasks/create/templates/Launchpad/Widget/PAGE-CASE/index.tsx.mustache +1 -1
  239. package/src/tasks/create/templates/Launchpad/Widget/PAGE-CASE/mock.ts.mustache +1 -1
  240. package/src/tasks/create-all/index.js +42 -41
  241. package/src/tasks/create-lib/helper.js +13 -13
  242. package/src/tasks/create-lib/index.js +5 -5
  243. package/src/tasks/create-version/helper.js +10 -10
  244. package/src/tasks/create-version/index.js +3 -4
  245. package/src/tasks/delete/helper.js +20 -19
  246. package/src/tasks/delete/index.js +2 -2
  247. package/src/tasks/delete-all/helper.js +26 -25
  248. package/src/tasks/delete-all/index.js +2 -2
  249. package/src/tasks/delete-lib/helper.js +6 -6
  250. package/src/tasks/delete-lib/index.js +6 -6
  251. package/src/tasks/delete-pub/helper.js +18 -18
  252. package/src/tasks/delete-pub/index.js +8 -8
  253. package/src/tasks/delete-version/index.js +2 -2
  254. package/src/tasks/dev-server/index.js +1 -1
  255. package/src/tasks/export-archive/helper.js +21 -21
  256. package/src/tasks/export-archive/index.js +27 -40
  257. package/src/tasks/export-rc/helper.js +34 -34
  258. package/src/tasks/export-rc/index.js +21 -31
  259. package/src/tasks/import-archive/helper.js +39 -39
  260. package/src/tasks/import-archive/index.js +69 -89
  261. package/src/tasks/import-comp/helper.js +8 -8
  262. package/src/tasks/import-comp/index.js +30 -42
  263. package/src/tasks/index.js +5 -0
  264. package/src/tasks/init/Node.gitignore +149 -0
  265. package/src/tasks/init/helper.js +15 -8
  266. package/src/tasks/init/index.js +115 -35
  267. package/src/tasks/init/template/.prettierrc.json +4 -1
  268. package/src/tasks/init/template/.storybook/main.ts +1 -4
  269. package/src/tasks/init/template/.storybook/manager.ts +1 -1
  270. package/src/tasks/init/template/.storybook/preview.tsx +2 -2
  271. package/src/tasks/init/template/.storybook/theme.js +1 -1
  272. package/src/tasks/init/template/.vscode/extensions.json +0 -1
  273. package/src/tasks/init/template/README.md +2 -2
  274. package/src/tasks/init/template/eslint.config.mjs +13 -155
  275. package/src/tasks/init/template/jest.config.cjs +2 -0
  276. package/src/tasks/init/template/package-lock.json +26864 -0
  277. package/src/tasks/init/template/package.json.mustache +19 -74
  278. package/src/tasks/init/template/setupTests.ts +10 -4
  279. package/src/tasks/init/template/tsconfig.json +14 -6
  280. package/src/tasks/internal-test/index.js +21 -0
  281. package/src/tasks/internal-test-full/index.js +15 -0
  282. package/src/tasks/internal-test-functional/index.js +15 -0
  283. package/src/tasks/internal-test-unit/index.js +13 -0
  284. package/src/tasks/linter/index.js +2 -2
  285. package/src/tasks/list/helper.js +41 -40
  286. package/src/tasks/list/index.js +3 -3
  287. package/src/tasks/list-lib/helper.js +5 -5
  288. package/src/tasks/list-lib/index.js +8 -8
  289. package/src/tasks/list-pub/helper.js +23 -16
  290. package/src/tasks/list-pub/index.js +24 -21
  291. package/src/tasks/move/helper.js +8 -8
  292. package/src/tasks/move/index.js +19 -23
  293. package/src/tasks/promote-webpack/index.js +4 -4
  294. package/src/tasks/promote-webpack/webpack.config.js +62 -93
  295. package/src/tasks/publish/helper.js +21 -21
  296. package/src/tasks/publish/index.js +16 -16
  297. package/src/tasks/publish-all/helper.js +20 -20
  298. package/src/tasks/publish-all/index.js +11 -12
  299. package/src/tasks/publish-archive/helper.js +9 -9
  300. package/src/tasks/publish-archive/index.js +12 -14
  301. package/src/tasks/publish-lib/helper.js +3 -3
  302. package/src/tasks/publish-lib/index.js +28 -34
  303. package/src/tasks/quarantine/index.js +8 -8
  304. package/src/tasks/rename/index.js +26 -30
  305. package/src/tasks/rename-lib/index.js +21 -25
  306. package/src/tasks/restore/index.js +8 -8
  307. package/src/tasks/restore-config/index.js +3 -5
  308. package/src/tasks/set-perm/index.js +8 -8
  309. package/src/tasks/show-help/index.js +17 -9
  310. package/src/tasks/show-status/index.js +2 -2
  311. package/src/tasks/store/index.js +8 -8
  312. package/src/tasks/switch-lib/helper.js +7 -7
  313. package/src/tasks/switch-lib/index.js +7 -7
  314. package/src/tasks/switch-version/helper.js +6 -6
  315. package/src/tasks/switch-version/index.js +7 -7
  316. package/src/tasks/update/index.js +1 -1
  317. package/src/tasks/upgrade/index.js +7 -7
  318. package/src/tasks/validator/index.js +49 -203
  319. package/src/util.js +169 -186
  320. package/src/rules/no-pcore-pconnect-in-presentation.js +0 -103
  321. package/src/tasks/init/template/.stylelintrc.json +0 -4
  322. package/src/tasks/init/template/babel.config.cjs +0 -22
  323. package/src/tasks/init/template/cspell.json +0 -14
@@ -0,0 +1,154 @@
1
+ import path from 'path';
2
+ import fs from 'fs';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ // Everything the CLI ships for AI coding tools lives under src/ai and is copied into a project only when AI is enabled:
6
+ // project/ mirrors the project root (AGENTS.md, .gemini/, .claude/skills/<component skills>)
7
+ // catalog/ the PCore/PConnect skills, installed into .claude/skills next to the component skills
8
+ // readme-section.md the README section describing the AI setup
9
+ // The list of installed files is derived from these folders, so nothing needs to be registered twice.
10
+ const AI_DIR = path.dirname(fileURLToPath(import.meta.url));
11
+ const PROJECT_DIR = path.join(AI_DIR, 'project');
12
+ const CATALOG_DIR = path.join(AI_DIR, 'catalog');
13
+ const README_SECTION_FILE = path.join(AI_DIR, 'readme-section.md');
14
+
15
+ // Claude Code, GitHub Copilot and Cursor discover project skills at .claude/skills/<name>/SKILL.md (one level deep).
16
+ const SKILLS_TARGET = path.join('.claude', 'skills');
17
+
18
+ // Codex CLI and Gemini CLI read .agents/skills rather than .claude/skills, so they get a link to the same folder
19
+ // instead of a copy. Copilot and Cursor also scan .agents/skills and de-duplicate by skill name.
20
+ const AGENTS_SKILLS_TARGET = path.join('.agents', 'skills');
21
+
22
+ // The project's own format check (`prettier -c .`) would otherwise flag every installed AI file, because they are
23
+ // formatted for this repository, not for the customer's Prettier settings. ESLint already ignores `.claude`.
24
+ const PRETTIER_IGNORE_FILE = '.prettierignore';
25
+ const PRETTIER_IGNORE_BLOCK = ['# ai-agents:start', '.claude/', '.agents/', '.gemini/', 'AGENTS.md', '# ai-agents:end'].join('\n');
26
+ const PRETTIER_IGNORE_SECTION = /\n?# ai-agents:start[\s\S]*?# ai-agents:end\n?/;
27
+
28
+ const README_AGENT_SECTION = /<!-- ai-agents:start -->[\s\S]*?<!-- ai-agents:end -->\n*/;
29
+ const README_FOLLOWING_SECTION = '## Latest Documentation';
30
+
31
+ const listFiles = (directory, relative = '') =>
32
+ fs.readdirSync(path.join(directory, relative), { withFileTypes: true }).flatMap((entry) => {
33
+ const entryPath = path.join(relative, entry.name);
34
+ if (entry.isDirectory()) return listFiles(directory, entryPath);
35
+ return entry.name === '.DS_Store' ? [] : [entryPath];
36
+ });
37
+
38
+ const exists = (target) => {
39
+ try {
40
+ fs.lstatSync(target);
41
+ return true;
42
+ } catch {
43
+ return false;
44
+ }
45
+ };
46
+
47
+ // Project-relative paths of every file the CLI installs. .agents/skills is normally a link and is handled separately.
48
+ const shippedFiles = () => [...listFiles(PROJECT_DIR), ...listFiles(CATALOG_DIR).map((file) => path.join(SKILLS_TARGET, file))];
49
+
50
+ const linkAgentsSkills = async (projectDirectory) => {
51
+ const skillsDirectory = path.join(projectDirectory, SKILLS_TARGET);
52
+ const linkPath = path.join(projectDirectory, AGENTS_SKILLS_TARGET);
53
+
54
+ await fs.promises.mkdir(path.dirname(linkPath), { recursive: true });
55
+ await fs.promises.rm(linkPath, { recursive: true, force: true });
56
+ try {
57
+ // A junction needs no elevated rights on Windows; on other platforms the type is ignored.
58
+ await fs.promises.symlink(path.relative(path.dirname(linkPath), skillsDirectory), linkPath, 'junction');
59
+ } catch {
60
+ await fs.promises.cp(skillsDirectory, linkPath, { recursive: true });
61
+ }
62
+ };
63
+
64
+ const addReadmeSection = async (projectDirectory) => {
65
+ const readmePath = path.join(projectDirectory, 'README.md');
66
+ if (!fs.existsSync(readmePath)) return;
67
+
68
+ const readme = await fs.promises.readFile(readmePath, 'utf8');
69
+ if (README_AGENT_SECTION.test(readme)) return;
70
+
71
+ const section = (await fs.promises.readFile(README_SECTION_FILE, 'utf8')).trimEnd();
72
+ const insertAt = readme.indexOf(README_FOLLOWING_SECTION);
73
+ const updated = insertAt === -1 ? `${readme.trimEnd()}\n\n${section}\n` : `${readme.slice(0, insertAt)}${section}\n\n${readme.slice(insertAt)}`;
74
+ await fs.promises.writeFile(readmePath, updated);
75
+ };
76
+
77
+ const addPrettierIgnore = async (projectDirectory) => {
78
+ const ignorePath = path.join(projectDirectory, PRETTIER_IGNORE_FILE);
79
+ const current = exists(ignorePath) ? await fs.promises.readFile(ignorePath, 'utf8') : '';
80
+ if (PRETTIER_IGNORE_SECTION.test(current)) return;
81
+
82
+ const separator = current === '' || current.endsWith('\n') ? '' : '\n';
83
+ await fs.promises.writeFile(ignorePath, `${current}${separator}${PRETTIER_IGNORE_BLOCK}\n`);
84
+ };
85
+
86
+ // Removes only the block the CLI added, and the file itself when nothing else is in it.
87
+ const removePrettierIgnore = async (projectDirectory) => {
88
+ const ignorePath = path.join(projectDirectory, PRETTIER_IGNORE_FILE);
89
+ if (!exists(ignorePath)) return;
90
+
91
+ const current = await fs.promises.readFile(ignorePath, 'utf8');
92
+ if (!PRETTIER_IGNORE_SECTION.test(current)) return;
93
+
94
+ const remaining = current.replace(PRETTIER_IGNORE_SECTION, '\n').replace(/^\n+/, '');
95
+ if (remaining.trim() === '') {
96
+ await fs.promises.rm(ignorePath);
97
+ } else {
98
+ await fs.promises.writeFile(ignorePath, remaining);
99
+ }
100
+ };
101
+
102
+ export const hasAgentFiles = (projectDirectory) => shippedFiles().some((file) => exists(path.join(projectDirectory, file)));
103
+
104
+ // Existing files are never overwritten, so edits survive a re-enable.
105
+ export const enableAgentFiles = async (projectDirectory) => {
106
+ await fs.promises.cp(PROJECT_DIR, projectDirectory, { recursive: true, force: false });
107
+ await fs.promises.cp(CATALOG_DIR, path.join(projectDirectory, SKILLS_TARGET), { recursive: true, force: false });
108
+ await linkAgentsSkills(projectDirectory);
109
+ await addReadmeSection(projectDirectory);
110
+ await addPrettierIgnore(projectDirectory);
111
+ };
112
+
113
+ // Only the files the CLI ships are removed, so anything a user added later (their own skills, .github/workflows,
114
+ // .claude/settings.json) survives.
115
+ export const removeAgentFiles = async (projectDirectory) => {
116
+ const agentsSkills = path.join(projectDirectory, AGENTS_SKILLS_TARGET);
117
+ const files = shippedFiles();
118
+
119
+ if (exists(agentsSkills)) {
120
+ if (fs.lstatSync(agentsSkills).isSymbolicLink()) {
121
+ // Removing the link must never remove the skills it points to.
122
+ await fs.promises.rm(agentsSkills);
123
+ } else {
124
+ // The link could not be created at install time and the skills were copied instead.
125
+ const skillFiles = files.filter((file) => file.startsWith(SKILLS_TARGET + path.sep)).map((file) => path.relative(SKILLS_TARGET, file));
126
+ files.push(...skillFiles.map((file) => path.join(AGENTS_SKILLS_TARGET, file)));
127
+ }
128
+ }
129
+
130
+ await Promise.all(files.map((file) => fs.promises.rm(path.join(projectDirectory, file), { force: true })));
131
+
132
+ // Prune folders left empty, deepest first.
133
+ const directories = new Set(['.agents']);
134
+ files.forEach((file) => {
135
+ for (let directory = path.dirname(file); directory !== '.'; directory = path.dirname(directory)) {
136
+ directories.add(directory);
137
+ }
138
+ });
139
+ const deepestFirst = [...directories].sort((a, b) => b.split(path.sep).length - a.split(path.sep).length);
140
+ for (const directory of deepestFirst) {
141
+ const target = path.join(projectDirectory, directory);
142
+ if (exists(target) && fs.readdirSync(target).length === 0) {
143
+ await fs.promises.rmdir(target);
144
+ }
145
+ }
146
+
147
+ const readmePath = path.join(projectDirectory, 'README.md');
148
+ if (fs.existsSync(readmePath)) {
149
+ const readme = await fs.promises.readFile(readmePath, 'utf8');
150
+ await fs.promises.writeFile(readmePath, readme.replace(README_AGENT_SECTION, ''));
151
+ }
152
+
153
+ await removePrettierIgnore(projectDirectory);
154
+ };
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: boolean
3
+ description: 'Scaffold a Pega DX Field component with subtype **Boolean** — true/false input bound to a boolean case property. Use when: user asks for a checkbox, toggle, switch, yes/no field, consent or opt-in control, or a boolean display.'
4
+ argument-hint: 'Describe the boolean field (e.g., "a consent checkbox that shows Yes/No when read-only")'
5
+ ---
6
+
7
+ # Create Boolean Field
8
+
9
+ Field subtype `Boolean`. Binds to a boolean case property.
10
+
11
+ Read [../field/SKILL.md](../field/SKILL.md) for the shared Field rules first. This skill adds only what is specific to `Boolean`.
12
+
13
+ ## Cosmos Mapping
14
+
15
+ | Mode | Component |
16
+ | --- | --- |
17
+ | Edit | `Checkbox` from `@pega/cosmos-react-core` |
18
+ | `DISPLAY_ONLY` | `BooleanDisplay` |
19
+
20
+ ## Value Handling
21
+
22
+ - `value` may arrive as a real boolean **or** the strings `'true'` / `'false'`. Normalize before render: checked only when `value === true || value === 'true'`.
23
+ - A property that was never set arrives as `null`. A checkbox has no null state: show it unchecked and write `false` with `handleEvent(actions, 'change', propName, false, { skipDirtyValidation: true })` so the form is not marked dirty by a value the user never touched. If you offer a two-radio (true/false) variant, skip that write so "unset" stays distinct from "false".
24
+ - `onChange` sends `event.target.checked`, not `event.target.value`.
25
+ - Boolean fields use `changeNblur` — dispatch the change and the field-change in one step, since there is no meaningful blur for a checkbox: `handleEvent(actions, 'changeNblur', propName, event.target.checked)`.
26
+
27
+ ## config.json Additions
28
+
29
+ | Property | Label | Format | Default | Notes |
30
+ | --- | --- | --- | --- | --- |
31
+ | `trueLabel` | Label when true | `TEXT` | `"Yes"` | |
32
+ | `falseLabel` | Label when false | `TEXT` | `"No"` | |
33
+
34
+ ## Gotchas
35
+
36
+ - `Checkbox` renders its own label. Do not add a separate `Text` label beside it. Production uses two labels: the field `label` is the legend of a `CheckboxGroup`, and the checkbox's own `label` comes from a `caption` prop (default `@FL .$this.name`). It uses a bare `Checkbox` only when the label is hidden or empty. Add `caption` to `config.json` if you want that split, and put `info` and `status` on the group (or on the bare checkbox).
37
+ - Custom true/false text (`trueLabel`, `falseLabel`) is read from raw config, strips a leading `@L`, and is localized with the localization service.
38
+ - A required boolean means "must be checked". Validation must reject `false`, not just `undefined`.
39
+ - `hideLabel` on a checkbox still needs an accessible name — keep the `label` prop populated and set `labelHidden`.
40
+
41
+ ## Validate
42
+
43
+ Run `node .claude/skills/validate-component/scripts/check-component.mjs <Org>_<Library>_<Name>` and paste its table into your final report.
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: case
3
+ description: 'Scaffold a Pega DX Widget component with subtype **CASE** — a data-driven block rendered inside a case view, with access to the current case context. Use when: user asks for a case-scoped chart, KPI, related-records table, case timeline, attachment list, or any block that reads the current case ID.'
4
+ argument-hint: 'Describe the case widget (e.g., "a table of related contacts for the current case")'
5
+ ---
6
+
7
+ # Create CASE Widget
8
+
9
+ Widget subtype `CASE`. Rendered **inside a case view** and has access to the current case.
10
+
11
+ Read [../widget/SKILL.md](../widget/SKILL.md) for the shared Widget rules first. This skill adds only what is specific to `CASE`.
12
+
13
+ ## Defining Trait
14
+
15
+ A CASE widget can read the case it is rendered in.
16
+
17
+ Take the property name from `PCore.getConstants().CASE_INFO.CASE_INFO_ID` and read the ID with `pConn.getValue(thatProperty, '')`.
18
+
19
+ If the block does **not** need the case, use `page-widget` instead — a CASE widget placed on a portal page has no case to read and will fetch with an empty key.
20
+
21
+ ## Reading the case
22
+
23
+ `CaseInfo` has no status getter (check the typedefs before assuming a getter exists). Read case identity with `pConn.getCaseInfo()` (`getKey()`, `getID()`, ...) and case properties with `pConn.getValue(propertyPath, defaultValue)`. Confirm the property path in your application.
24
+
25
+ ## Data Fetch
26
+
27
+ Pass the case key as the `CaseInstanceKey` data-view parameter (`{ dataViewParameters: { CaseInstanceKey: caseID } }`) to `PCore.getDataApiUtils().getData(dataPage, payload, context)`. Run it in a `useEffect` keyed on `[context, caseID, dataPage]`: reset loading and error first, ignore a response that arrives after unmount or a dependency change, and keep a failure distinct from an empty result. The guarded fetch shape is in [widget-patterns.md](../create-dx-component/references/widget-patterns.md).
28
+
29
+ See [widget-patterns.md](../create-dx-component/references/widget-patterns.md) for cancellation, subscriptions (a case widget often refetches on a case push), mutations and the traps to avoid.
30
+
31
+ ## Required States
32
+
33
+ | State | Cosmos component |
34
+ | --- | --- |
35
+ | Loading | `Progress` |
36
+ | Empty | `EmptyState` |
37
+ | Error | `ErrorState` (with `onRetry`) or `Banner` |
38
+ | Data | `Table`, `Grid`, or a chart |
39
+
40
+ ## config.json Additions
41
+
42
+ | Property | Label | Format | Default | Notes |
43
+ | --- | --- | --- | --- | --- |
44
+ | `label` | Label value | `TEXT` | | |
45
+ | `dataPage` | Data page | `TEXT` | | |
46
+ | `maxRows` | Maximum rows | `NUMBER` | `10` | |
47
+
48
+ ## Gotchas
49
+
50
+ - Guard the empty case ID. On first render `caseID` may be `''`, and fetching with it returns unrelated rows or an error — skip the fetch until it is populated.
51
+ - Include `caseID` in the effect dependency array, or the widget shows stale data after the user navigates to a different case.
52
+ - Do not refetch on every parent re-render. A Constellation case view re-renders often.
53
+ - Write-back to a case property must go through `updateFieldValue` plus `triggerFieldChange`, preserving the source's original shape.
54
+ - The widget must not assume it is the only consumer of the data page — never mutate the response array in place.
55
+
56
+ ## Validate
57
+
58
+ Run `node .claude/skills/validate-component/scripts/check-component.mjs <Org>_<Library>_<Name>` and paste its table into your final report.
@@ -0,0 +1,98 @@
1
+ ---
2
+ name: create-dx-component
3
+ description: 'General Pega DX component scaffolding — shared references, assets, and the router when the component type is UNCLEAR. Prefer the type-specific skills (`field`, `template`, `widget`, `presentation`) when the user names a type. Use THIS skill only when: the type is ambiguous, the user asks for general DX component guidance, or multiple types are being created together.'
4
+ argument-hint: 'Describe the component you want (e.g., "a date range picker field" or "a KPI widget showing case metrics")'
5
+ ---
6
+
7
+ # Create DX Component Skill (Router / Shared Reference)
8
+
9
+ ## Type-Specific Skills
10
+
11
+ If the user's request clearly matches one component type, use the focused skill instead of this one:
12
+
13
+ | User asks for… | Use skill |
14
+ | --- | --- |
15
+ | Input field, property-bound value, Text/Boolean/Date/Email/Phone/Currency/Picklist/Radiobuttons | [field](../field/SKILL.md) |
16
+ | Layout container, FORM/DETAILS/PAGE arrangement, `children` wrapper | [template](../template/SKILL.md) |
17
+ | Chart, KPI, table, dashboard tile, data-page-driven block, spin wheel, self-fetching UI | [widget](../widget/SKILL.md) |
18
+ | Replace how the whole case view is rendered (`CASEVIEW` / `WSSCASEVIEW`) | [presentation](../presentation/SKILL.md) |
19
+ | Plan a component from requirements, or port one from another design system or framework | [plan-dx-component](../plan-dx-component/SKILL.md) |
20
+ | Change, fix or extend a component that **already exists** | [update-dx-component](../update-dx-component/SKILL.md) |
21
+
22
+ A read-only badge, pill, icon or formatted value bound to a property is a `field` that handles `DISPLAY_ONLY`; one that shows its own data is a `widget`. For an unusual request (a custom control, a board, a layout with tabs, something that may not be a custom component at all), read [choosing-type-and-subtype.md](./references/choosing-type-and-subtype.md): it has the fit check and maps ideas onto the subtypes the CLI accepts.
23
+
24
+ ## Procedure
25
+
26
+ The repo-wide rules (gallery reuse, contract approval and its layout, authoring properties, third-party consent, Cosmos first, no dead code) are in `AGENTS.md`, which is always loaded. They are not repeated here.
27
+
28
+ ### Step 0: Check the Constellation UI Gallery
29
+
30
+ Follow [ui-gallery-reuse.md](./references/ui-gallery-reuse.md). On a match, use the gallery component's `config.json` as the starting proposal for Step 1.
31
+
32
+ ### Step 1: Agree the contract
33
+
34
+ If the user supplied requirements, links, images or a named design system, read them first ([intake.md](../plan-dx-component/references/intake.md)); for a large or unclear input, plan first with [plan-dx-component](../plan-dx-component/SKILL.md). The draft covers:
35
+
36
+ - **Type and subtype**: any subtype the CLI accepts ([cli-workflow.md](./references/cli-workflow.md)); for a Field, the one matching the stored value type. Say why.
37
+ - **Name, label, description, library and version** (normally `1.0.0`; confirm rather than assume)
38
+ - **Behavior, data and runtime contract**: what it renders, data pages, actions, editable and read-only expectations
39
+ - **Authoring properties** with formats and defaults
40
+ - **States to cover**, from [state-matrix.md](./references/state-matrix.md); each gets a story and a test assertion
41
+ - **Third-party libraries**, each with its purpose and whether it is installed
42
+
43
+ Do not scaffold or touch `config.json` until the user approves.
44
+
45
+ ### Step 2: Scaffold via CLI (non-interactive)
46
+
47
+ If no library exists yet, run `npm run createLib -- <Library> 1.0.0 Y Current`. Then scaffold, **passing every argument**:
48
+
49
+ `npm run create -- <type> <subtype> <Name> "<Label>" <version> <Library> "<description>" <Organization>`. For example, `npm run create -- Field Text-Email ContactEmail "Contact email" 1.0.0 Lib "Email field" Acme` creates `src/components/Acme_Lib_ContactEmail`.
50
+
51
+ The scaffold creates `index.tsx`, `config.json`, `styles.ts`, `mock.ts`, `demo.stories.tsx`, `demo.test.tsx` (and `localizations.json` when the scaffold shows its own text), plus `PConnProps.d.ts` and `create-nonce.ts` once in `src/components/shared/`. **It is a working sample, not an empty skeleton**: replace everything that does not serve the request, including the story, mock, test and localization strings. Delete a generated shared helper your component does not use. If anything goes wrong, see [cli-workflow.md](./references/cli-workflow.md).
52
+
53
+ ### Step 3: Implement
54
+
55
+ Read the essentials file for the type and implement every scaffolded file from it: [field-essentials.md](./references/field-essentials.md), [widget-essentials.md](./references/widget-essentials.md), [template-essentials.md](./references/template-essentials.md) or [presentation-essentials.md](./references/presentation-essentials.md). Each one ends with a table of when to open a deeper reference; open those only when the situation applies.
56
+
57
+ Before writing a `PCore` or `pConn` call, search the catalog for the method name as described in [pcore-pconnect-apis.md](./references/pcore-pconnect-apis.md), and follow the matching `pconnect-*` skill for call order and pitfalls.
58
+
59
+ ### Step 4: Run the check loop
60
+
61
+ Run `node .claude/skills/validate-component/scripts/check-component.mjs <Org>_<Library>_<Name>` from the project root. It runs the schema check, `tsc`, ESLint, Jest, the config-to-props sync check, the story and test coverage warnings, the inline-style, raw-HTML and secret scans, and the build. While fixing failures, add `--no-build`; run it once without the flag at the end.
62
+
63
+ Fix every FAIL before reporting the work as done, and **paste the final table into your report**. Do not weaken a check to make it pass. A `NOT RUN` row is not a pass: say so and give the reason.
64
+
65
+ ### Step 5: Independent review (new components)
66
+
67
+ For a new Field, Widget or Template, run the [review-component](../review-component/SKILL.md) skill before reporting it done, ideally in a fresh sub-agent that sees the brief but not your summary. Fix every Blocker and Major it reports, rerun the check script, and include the verdict in the final report. Skip this step for a small edit to an existing component.
68
+
69
+ ### Step 6: Review in Storybook (user)
70
+
71
+ `npm run startStorybook` starts a long-running dev server. Leave it to the user unless they ask.
72
+
73
+ ## Verify the Cosmos API before you use it
74
+
75
+ Cosmos prop names are often not what they sound like, and several plausible component names do not exist. Before importing a component or passing a prop you have not used in this repo before, read `node_modules/@pega/cosmos-react-core/lib/components/<Name>/<Name>.d.ts` and confirm the export in `node_modules/@pega/cosmos-react-core/lib/index.d.ts`. Do not rely on training knowledge of the Cosmos API. Known traps are under Verified Gotchas in [cosmos-components.md](./references/cosmos-components.md); add any new one you find.
76
+
77
+ ## References and Cookbooks (open when needed)
78
+
79
+ | File | What it gives you |
80
+ | --- | --- |
81
+ | [field-essentials.md](./references/field-essentials.md), [widget-essentials.md](./references/widget-essentials.md), [template-essentials.md](./references/template-essentials.md), [presentation-essentials.md](./references/presentation-essentials.md) | The must-follow rules for each type, file by file. Read the one for your type first |
82
+ | [ui-gallery-reuse.md](./references/ui-gallery-reuse.md) | Checking the Constellation UI Gallery and adapting a match |
83
+ | [cli-workflow.md](./references/cli-workflow.md) | Project layout, non-interactive CLI commands, naming rules, the check loop, troubleshooting |
84
+ | [props-contract.md](./references/props-contract.md) | The props each type receives; reading and writing values; display modes |
85
+ | [component-patterns.md](./references/component-patterns.md) | Code skeletons for each component type |
86
+ | [config-schema.md](./references/config-schema.md) | `config.json` structure, formats, `defaultConfig` bindings, what `validate-schema` checks |
87
+ | [storybook-pattern.md](./references/storybook-pattern.md), [test-pattern.md](./references/test-pattern.md) | Story, mock and Jest conventions |
88
+ | [template-patterns.md](./references/template-patterns.md) | Template regions and children, forcing read-only, responsive columns, field groups, tabs, PAGE |
89
+ | [widget-patterns.md](./references/widget-patterns.md) | Widget fetch lifecycle, cancellation, duplicate-click guards, subscriptions, mutations, confirm-before-delete |
90
+ | [field-subtypes-extra.md](./references/field-subtypes-extra.md) | Text-Input, Text-Paragraph, Icon-Button-URL, DateTime, TimeOfDay, Picklist-Autocomplete |
91
+ | [field-behavior.md](./references/field-behavior.md) | Field commit protocol, null/zero/empty, message precedence, dates and time zones, numbers, pickers |
92
+ | [localization.md](./references/localization.md) | `localizations.json`, getLocalizedText, placeholders, plurals, formatting |
93
+ | [accessibility.md](./references/accessibility.md) | What Cosmos covers and what the author owns; focus, headings, announcements; verification |
94
+ | [choosing-type-and-subtype.md](./references/choosing-type-and-subtype.md) | The fit check and how to pick a type and subtype for an unusual request |
95
+ | [state-matrix.md](./references/state-matrix.md) | The states to cover per component type |
96
+ | [cosmos-components.md](./references/cosmos-components.md) | Which Cosmos component to use, and verified gotchas |
97
+ | [pcore-pconnect-apis.md](./references/pcore-pconnect-apis.md) | How to look up a PCore/PConnect method |
98
+ | [cookbooks/](./cookbooks/README.md) | End-to-end recipes: a field with limits and validation; a data widget with loading, empty and error states |
@@ -0,0 +1,24 @@
1
+ import { PConnect } from '@pega/pcore-pconnect-typedefs';
2
+
3
+ export interface PConnProps {
4
+ getPConnect: () => typeof PConnect;
5
+ }
6
+
7
+ export interface PConnFieldProps extends PConnProps {
8
+ label: string;
9
+ required: boolean;
10
+ disabled: boolean;
11
+ value: any;
12
+ validatemessage: string;
13
+ status?: string;
14
+ onChange?: any;
15
+ onBlur?: any;
16
+ readOnly: boolean;
17
+ testId: string;
18
+ helperText: string;
19
+ displayMode?: string;
20
+ hideLabel: boolean;
21
+ placeholder?: string;
22
+ fieldMetadata?: any;
23
+ additionalProps?: any;
24
+ }
@@ -0,0 +1,5 @@
1
+ // @ts-ignore
2
+ if (window?.__webpack_nonce__) {
3
+ // @ts-ignore
4
+ __webpack_nonce__ = window.__webpack_nonce__;
5
+ }
@@ -0,0 +1,18 @@
1
+ const handleEvent = (actions: any, eventType: string, propName: string, value: any) => {
2
+ switch (eventType) {
3
+ case 'change':
4
+ actions.updateFieldValue(propName, value);
5
+ break;
6
+ case 'blur':
7
+ actions.triggerFieldChange(propName, value);
8
+ break;
9
+ case 'changeNblur':
10
+ actions.updateFieldValue(propName, value);
11
+ actions.triggerFieldChange(propName, value);
12
+ break;
13
+ default:
14
+ break;
15
+ }
16
+ };
17
+
18
+ export default handleEvent;
@@ -0,0 +1,7 @@
1
+ import styled, { css } from 'styled-components';
2
+
3
+ export default styled.div(() => {
4
+ return css`
5
+ margin: 0px 0;
6
+ `;
7
+ });
@@ -0,0 +1,28 @@
1
+ ---
2
+ title: Component Authoring Cookbook — Recipe Index
3
+ description: End-to-end recipes for building and customizing Constellation DX components (fields, widgets, templates), indexed by symptom/keyword and primary method for AI/RAG retrieval.
4
+ ---
5
+
6
+ # Cookbook: Component Authoring
7
+
8
+ > Part of the [create-dx-component skill](../SKILL.md).
9
+
10
+ Every file in [`../references/`](../references/) documents one topic at a time. Each file in this folder walks through **one complete component change** from scaffold to a passing build: which command to run, which files to edit, the code, the story and the tests. The code in each recipe was run in a generated project (`tsc`, Jest, schema validation, lint and bundle all passed).
11
+
12
+ Each recipe is a single, self-contained file with:
13
+
14
+ - YAML frontmatter (`keywords`, `primary_methods`, `related`) for structured/metadata search.
15
+ - A **Problem** statement in plain language.
16
+ - A **Solution** with numbered steps and the exact code.
17
+ - A **Discussion** with the rules and pitfalls behind the code.
18
+ - **Related recipes**.
19
+
20
+ ## Recipe Index
21
+
22
+ | Recipe | Use it when | Primary methods |
23
+ | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
24
+ | [Customize a field with limits, a counter and validation messages](./field-with-limits-and-validation.md) | Changing how a field edits or validates a value; adding configurable properties to a field | `updateFieldValue`, `triggerFieldChange`, `getStateProps` |
25
+ | [Build a data-driven widget with loading, empty and error states](./build-a-data-widget.md) | Showing data from a data page in a panel or table; any component that loads data asynchronously | `getDataApiUtils().getData`, `getContextName`, `getLocalizedText` |
26
+ | [Show a property as a colored status badge](./status-badge-field.md) | A read-only value, pill or badge bound to a property; handling `DISPLAY_ONLY`; a configurable value-to-color map | `getStateProps`, Cosmos `Status` |
27
+
28
+ For recipes on the **runtime APIs** a component calls (submitting assignments, validation, subscriptions, collaboration), use the cookbooks of the `pconnect-*` skills linked from the [skills index](../../README.md).