@pega/sdk 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -3
- package/dist/index.js +977 -92
- package/package.json +1 -1
- package/templates/angular-sdk-reference/package.json +12 -12
- package/templates/angular-sdk-reference/tsconfig.json +1 -1
- package/templates/react-native-sdk-reference/.claude/settings.json +5 -0
- package/templates/react-native-sdk-reference/.prettierignore +17 -0
- package/templates/react-native-sdk-reference/.vscode/extensions.json +1 -0
- package/templates/react-native-sdk-reference/.vscode/settings.json +7 -0
- package/templates/react-native-sdk-reference/AGENTS.md +3 -0
- package/templates/react-native-sdk-reference/CLAUDE.md +1 -0
- package/templates/react-native-sdk-reference/README.md +56 -0
- package/templates/react-native-sdk-reference/app.json +40 -5
- package/templates/react-native-sdk-reference/assets/expo.icon/Assets/expo-symbol 2.svg +3 -0
- package/templates/react-native-sdk-reference/assets/expo.icon/Assets/grid.png +0 -0
- package/templates/react-native-sdk-reference/assets/expo.icon/icon.json +35 -0
- package/templates/react-native-sdk-reference/assets/icons/bell.png +0 -0
- package/templates/react-native-sdk-reference/assets/icons/clock.png +0 -0
- package/templates/react-native-sdk-reference/assets/icons/cross.png +0 -0
- package/templates/react-native-sdk-reference/assets/icons/donut.png +0 -0
- package/templates/react-native-sdk-reference/assets/icons/gear.png +0 -0
- package/templates/react-native-sdk-reference/assets/icons/globe.png +0 -0
- package/templates/react-native-sdk-reference/assets/icons/internet.png +0 -0
- package/templates/react-native-sdk-reference/assets/icons/music.png +0 -0
- package/templates/react-native-sdk-reference/assets/icons/right-arrow.png +0 -0
- package/templates/react-native-sdk-reference/assets/icons/speed.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/MediaCo.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/adaptive-icon.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/android-icon-background.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/android-icon-foreground.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/android-icon-monochrome.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/expo-badge-white.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/expo-badge.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/expo-logo.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/favicon.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/icon.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/logo-glow.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/partial-react-logo.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/react-logo.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/react-logo@2x.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/react-logo@3x.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/splash-icon.png +0 -0
- package/templates/react-native-sdk-reference/assets/images/tutorial-web.png +0 -0
- package/templates/react-native-sdk-reference/eslint.config.mjs +68 -0
- package/templates/react-native-sdk-reference/package.json +59 -14
- package/templates/react-native-sdk-reference/pega-constellationjs-0.26.3.tgz +0 -0
- package/templates/react-native-sdk-reference/pega-sdk-react-0.1.0.tgz +0 -0
- package/templates/react-native-sdk-reference/pega-sdk-types-0.1.0.tgz +0 -0
- package/templates/react-native-sdk-reference/sdk-config.json +31 -9
- package/templates/react-native-sdk-reference/src/app/_layout.tsx +38 -0
- package/templates/react-native-sdk-reference/src/app/home/_layout.tsx +39 -0
- package/templates/react-native-sdk-reference/src/app/home/contact.tsx +11 -0
- package/templates/react-native-sdk-reference/src/app/home/index.tsx +36 -0
- package/templates/react-native-sdk-reference/src/app/home/shop.tsx +11 -0
- package/templates/react-native-sdk-reference/src/app/home/your-services.tsx +11 -0
- package/templates/react-native-sdk-reference/src/app/index.tsx +72 -0
- package/templates/react-native-sdk-reference/src/app/workarea.tsx +135 -0
- package/templates/react-native-sdk-reference/src/bridge/Context/StoreContext.ts +4 -0
- package/templates/react-native-sdk-reference/src/bridge/RootComponent.tsx +12 -0
- package/templates/react-native-sdk-reference/src/bridge/react_pconnect.jsx +334 -0
- package/templates/react-native-sdk-reference/src/components/common/DisplayField.tsx +29 -0
- package/templates/react-native-sdk-reference/src/components/common/FormFieldWrapper.tsx +5 -0
- package/templates/react-native-sdk-reference/src/components/common/HelperText.tsx +11 -0
- package/templates/react-native-sdk-reference/src/components/common/LabelText.tsx +22 -0
- package/templates/react-native-sdk-reference/src/components/common/inputTheme.ts +17 -0
- package/templates/react-native-sdk-reference/src/components/design-system/AutoComplete.tsx +126 -0
- package/templates/react-native-sdk-reference/src/components/design-system/FieldGroup.tsx +72 -0
- package/templates/react-native-sdk-reference/src/components/design-system/Radio.tsx +61 -0
- package/templates/react-native-sdk-reference/src/components/field/AutoComplete/AutoComplete.tsx +196 -0
- package/templates/react-native-sdk-reference/src/components/field/AutoComplete/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/field/Checkbox/Checkbox.tsx +89 -0
- package/templates/react-native-sdk-reference/src/components/field/Checkbox/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/field/Currency/Currency.tsx +84 -0
- package/templates/react-native-sdk-reference/src/components/field/Currency/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/field/Date/Date.tsx +94 -0
- package/templates/react-native-sdk-reference/src/components/field/Date/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/field/Dropdown/Dropdown.tsx +211 -0
- package/templates/react-native-sdk-reference/src/components/field/Dropdown/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/field/Email/Email.tsx +81 -0
- package/templates/react-native-sdk-reference/src/components/field/Email/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/field/Group/Group.tsx +47 -0
- package/templates/react-native-sdk-reference/src/components/field/Group/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/field/Integer/Integer.tsx +84 -0
- package/templates/react-native-sdk-reference/src/components/field/Integer/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/field/Phone/Phone.tsx +85 -0
- package/templates/react-native-sdk-reference/src/components/field/Phone/index.ts +1 -0
- package/templates/react-native-sdk-reference/src/components/field/RadioButtons/RadioButtons.tsx +118 -0
- package/templates/react-native-sdk-reference/src/components/field/RadioButtons/index.ts +1 -0
- package/templates/react-native-sdk-reference/src/components/field/TextArea/TextArea.tsx +86 -0
- package/templates/react-native-sdk-reference/src/components/field/TextArea/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/field/TextInput/TextInput.tsx +84 -0
- package/templates/react-native-sdk-reference/src/components/field/TextInput/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/field/URL/URL.tsx +86 -0
- package/templates/react-native-sdk-reference/src/components/field/URL/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/helpers/data_page.ts +20 -0
- package/templates/react-native-sdk-reference/src/components/helpers/event-utils.ts +20 -0
- package/templates/react-native-sdk-reference/src/components/helpers/instructions-utils.ts +57 -0
- package/templates/react-native-sdk-reference/src/components/helpers/state-utils.tsx +46 -0
- package/templates/react-native-sdk-reference/src/components/helpers/template-utils.ts +75 -0
- package/templates/react-native-sdk-reference/src/components/helpers/utils.ts +339 -0
- package/templates/react-native-sdk-reference/src/components/infra/ActionButtons/ActionButtons.tsx +63 -0
- package/templates/react-native-sdk-reference/src/components/infra/ActionButtons/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/infra/Assignment/Assignment.tsx +348 -0
- package/templates/react-native-sdk-reference/src/components/infra/Assignment/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/infra/AssignmentCard/AssignmentCard.tsx +56 -0
- package/templates/react-native-sdk-reference/src/components/infra/AssignmentCard/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/infra/Containers/FlowContainer/FlowContainer.tsx +57 -0
- package/templates/react-native-sdk-reference/src/components/infra/Containers/FlowContainer/helpers.ts +137 -0
- package/templates/react-native-sdk-reference/src/components/infra/Containers/FlowContainer/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/infra/Containers/RootContainer/RootContainer.tsx +52 -0
- package/templates/react-native-sdk-reference/src/components/infra/Containers/RootContainer/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/infra/Containers/SimpleView/helper.ts +128 -0
- package/templates/react-native-sdk-reference/src/components/infra/Containers/SimpleView/index.tsx +59 -0
- package/templates/react-native-sdk-reference/src/components/infra/Containers/ViewContainer/ViewContainer.tsx +31 -0
- package/templates/react-native-sdk-reference/src/components/infra/Containers/ViewContainer/helper.ts +39 -0
- package/templates/react-native-sdk-reference/src/components/infra/Containers/ViewContainer/index.ts +1 -0
- package/templates/react-native-sdk-reference/src/components/infra/Containers/helper.ts +9 -0
- package/templates/react-native-sdk-reference/src/components/infra/ErrorBoundary/ErrorBoundary.tsx +53 -0
- package/templates/react-native-sdk-reference/src/components/infra/ErrorBoundary/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/infra/MultiStep/MultiStep.tsx +24 -0
- package/templates/react-native-sdk-reference/src/components/infra/MultiStep/index.ts +1 -0
- package/templates/react-native-sdk-reference/src/components/infra/Reference/Reference.tsx +68 -0
- package/templates/react-native-sdk-reference/src/components/infra/Reference/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/infra/Reference/utils.ts +16 -0
- package/templates/react-native-sdk-reference/src/components/infra/Region/Region.tsx +10 -0
- package/templates/react-native-sdk-reference/src/components/infra/Region/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/infra/View/View.tsx +49 -0
- package/templates/react-native-sdk-reference/src/components/template/DefaultForm/DefaultForm.tsx +38 -0
- package/templates/react-native-sdk-reference/src/components/template/DefaultForm/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/template/DefaultForm/utils/index.ts +28 -0
- package/templates/react-native-sdk-reference/src/components/template/Details/Details.tsx +82 -0
- package/templates/react-native-sdk-reference/src/components/template/Details/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/components/template/OneColumn/OneColumn.tsx +29 -0
- package/templates/react-native-sdk-reference/src/components/template/OneColumn/index.tsx +1 -0
- package/templates/react-native-sdk-reference/src/context/LoaderContext.tsx +42 -0
- package/templates/react-native-sdk-reference/src/mediaco/AdvBanner.tsx +62 -0
- package/templates/react-native-sdk-reference/src/mediaco/Header.tsx +60 -0
- package/templates/react-native-sdk-reference/src/mediaco/HomeScreen.tsx +78 -0
- package/templates/react-native-sdk-reference/src/mediaco/QuickActions.tsx +68 -0
- package/templates/react-native-sdk-reference/src/mediaco/ResolutionScreen.tsx +48 -0
- package/templates/react-native-sdk-reference/src/mediaco/SafeArea.tsx +11 -0
- package/templates/react-native-sdk-reference/src/mediaco/TabBar.tsx +102 -0
- package/templates/react-native-sdk-reference/src/mediaco/YourServices.tsx +90 -0
- package/templates/react-native-sdk-reference/src/sdk-pega-component-map.ts +64 -0
- package/templates/react-native-sdk-reference/src/types/PConnProps.d.ts +41 -0
- package/templates/react-native-sdk-reference/src/utils/auth.ts +62 -0
- package/templates/react-native-sdk-reference/src/utils/init-pcore.ts +37 -0
- package/templates/react-native-sdk-reference/src/utils/pcore-polyfills.ts +66 -0
- package/templates/react-native-sdk-reference/tsconfig.json +9 -8
- package/templates/react-sdk-reference/.ai-common/agents/embedded-flow-expert.md +171 -0
- package/templates/react-sdk-reference/{.github/agents/implementation-expert.agent.md → .ai-common/agents/implementation-expert.md} +44 -48
- package/templates/react-sdk-reference/.ai-common/global/ai-agent-instructions-embedded.md +119 -0
- package/templates/react-sdk-reference/.ai-common/global/ai-agent-instructions.md +192 -0
- package/templates/react-sdk-reference/.ai-common/instructions/component-map.md +35 -0
- package/templates/react-sdk-reference/.ai-common/instructions/dse-component.md +47 -0
- package/templates/react-sdk-reference/.ai-common/instructions/embedded-component.md +134 -0
- package/templates/react-sdk-reference/.ai-common/instructions/field-component.md +50 -0
- package/templates/react-sdk-reference/.ai-common/instructions/template-component.md +43 -0
- package/templates/react-sdk-reference/.ai-common/instructions/widget-component.md +45 -0
- package/templates/react-sdk-reference/.ai-common/prompts/add-component.md +193 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/prompts/component-manifest.json +106 -2
- package/templates/react-sdk-reference/.ai-common/prompts/embedded-component-manifest.md +155 -0
- package/templates/react-sdk-reference/.ai-common/prompts/generate-all-components.md +358 -0
- package/templates/react-sdk-reference/.ai-common/prompts/generate-dse-components.md +165 -0
- package/templates/react-sdk-reference/.ai-common/prompts/generate-embedded-components.md +315 -0
- package/templates/react-sdk-reference/.ai-common/prompts/generate-field-components.md +190 -0
- package/templates/react-sdk-reference/.ai-common/prompts/generate-template-components.md +227 -0
- package/templates/react-sdk-reference/.ai-common/prompts/generate-widget-components.md +172 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/prompts/identify-components.md +4 -0
- package/templates/react-sdk-reference/{.cursor/rules/prompts/replace-design-system.mdrules → .ai-common/prompts/replace-design-system.md} +2 -3
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/AlertBanner.md +61 -25
- package/templates/react-sdk-reference/.ai-common/skills/design-system-extension-skills/Banner.md +176 -0
- package/templates/react-sdk-reference/.ai-common/skills/design-system-extension-skills/CaseSummaryFields.md +180 -0
- package/templates/react-sdk-reference/.ai-common/skills/design-system-extension-skills/DetailsFields.md +180 -0
- package/templates/react-sdk-reference/.ai-common/skills/design-system-extension-skills/FieldGroup.md +153 -0
- package/templates/react-sdk-reference/.ai-common/skills/design-system-extension-skills/FieldGroupList.md +136 -0
- package/templates/react-sdk-reference/.ai-common/skills/design-system-extension-skills/FieldValueList.md +140 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/design-system-extension-skills/Operator.md +85 -41
- package/templates/react-sdk-reference/.ai-common/skills/design-system-extension-skills/Pulse.md +97 -0
- package/templates/react-sdk-reference/.ai-common/skills/design-system-extension-skills/RichTextEditor.md +226 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/design-system-extension-skills/WssQuickCreate.md +35 -20
- package/templates/react-sdk-reference/.ai-common/skills/design-system-extension.md +169 -0
- package/templates/react-sdk-reference/.ai-common/skills/embedded-flow/analyze-customer-repo.md +130 -0
- package/templates/react-sdk-reference/.ai-common/skills/embedded-flow/authenticate.md +311 -0
- package/templates/react-sdk-reference/.ai-common/skills/embedded-flow/run-and-verify-integration.md +156 -0
- package/templates/react-sdk-reference/.ai-common/skills/embedded-flow/wire-integration.md +476 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-components.md +190 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/AutoComplete.md +157 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/CancelAlert.md +178 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Checkbox.md +189 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Currency.md +136 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Date.md +126 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/DateTime.md +115 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Decimal.md +119 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Dropdown.md +136 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Email.md +99 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Group.md +88 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Integer.md +102 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Location.md +142 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/Multiselect.md +42 -53
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/ObjectReference.md +36 -60
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Percentage.md +113 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Phone.md +100 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/RadioButtons.md +153 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/RichText.md +117 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/ScalarList.md +95 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/SelectableCard.md +155 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/SemanticLink.md +35 -57
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/TextArea.md +109 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/TextContent.md +27 -52
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/TextInput.md +112 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Time.md +102 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/URL.md +96 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/UserReference.md +41 -78
- package/templates/react-sdk-reference/.ai-common/skills/infra-components.md +165 -0
- package/templates/react-sdk-reference/.ai-common/skills/infra-skills/ActionButtons.md +122 -0
- package/templates/react-sdk-reference/.ai-common/skills/infra-skills/MultiStep.md +178 -0
- package/templates/react-sdk-reference/.ai-common/skills/infra-skills/Stages.md +140 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-components.md +198 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/AdvancedSearch.md +126 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/AppShell.md +160 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/BannerPage.md +90 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/CaseSummary.md +129 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/CaseView.md +196 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/CaseViewActionsMenu.md +157 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/Confirmation.md +149 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/DataReference.md +46 -31
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/DefaultForm.md +141 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/DefaultPage.md +40 -34
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/Details.md +96 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/DetailsSubTabs.md +103 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/DetailsThreeColumn.md +85 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/DetailsTwoColumn.md +77 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/DynamicTabs.md +103 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/FieldGroupTemplate.md +130 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/HierarchicalForm.md +200 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/InlineDashboard.md +110 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/InlineDashboardPage.md +105 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/ListPage.md +21 -16
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/ListView.md +234 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/MultiReferenceReadOnly.md +18 -23
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/NarrowWide.md +161 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/OneColumn.md +114 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/PromotedFilters.md +132 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/SelfServiceCaseView.md +173 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/SimpleTable.md +44 -24
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/SingleReferenceReadOnly.md +103 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/SubTabs.md +89 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/TwoColumn.md +133 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/WideNarrow.md +36 -43
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/WssNavBar.md +26 -45
- package/templates/react-sdk-reference/.ai-common/skills/widget-components.md +124 -0
- package/templates/react-sdk-reference/.ai-common/skills/widget-skills/AppAnnouncement.md +94 -0
- package/templates/react-sdk-reference/.ai-common/skills/widget-skills/Attachment.md +163 -0
- package/templates/react-sdk-reference/.ai-common/skills/widget-skills/CaseHistory.md +90 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/widget-skills/FileUtility.md +68 -62
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/Followers.md +24 -19
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/QuickCreate.md +27 -44
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/SummaryItem.md +35 -61
- package/templates/react-sdk-reference/.ai-common/skills/widget-skills/ToDo.md +261 -0
- package/templates/react-sdk-reference/package.json +1 -1
- package/templates/react-sdk-reference/package.minimal.json +29 -0
- package/templates/react-sdk-reference/pega-auth-0.2.44.tgz +0 -0
- package/templates/react-sdk-reference/pega-sdk-react-0.1.0.tgz +0 -0
- package/templates/react-sdk-reference/src/AppProviders.tsx +17 -0
- package/templates/react-sdk-reference/src/MashupApp.tsx +8 -19
- package/templates/react-sdk-reference/src/PortalApp.tsx +6 -17
- package/templates/react-sdk-reference/src/components/helpers/formatters/index.ts +13 -3
- package/templates/react-native-sdk-reference/.github/AGENTS.md +0 -23
- package/templates/react-native-sdk-reference/.github/copilot-instructions.md +0 -40
- package/templates/react-native-sdk-reference/.github/skills/pega-sdk-component.md +0 -48
- package/templates/react-native-sdk-reference/App.tsx +0 -49
- package/templates/react-sdk-reference/.claude/instructions/component-map.md +0 -38
- package/templates/react-sdk-reference/.claude/instructions/dse-component.md +0 -75
- package/templates/react-sdk-reference/.claude/instructions/field-component.md +0 -75
- package/templates/react-sdk-reference/.claude/instructions/template-component.md +0 -93
- package/templates/react-sdk-reference/.claude/instructions/widget-component.md +0 -88
- package/templates/react-sdk-reference/.claude/prompts/add-component.md +0 -152
- package/templates/react-sdk-reference/.claude/prompts/generate-all-components.md +0 -158
- package/templates/react-sdk-reference/.claude/prompts/generate-dse-components.md +0 -140
- package/templates/react-sdk-reference/.claude/prompts/generate-field-components.md +0 -153
- package/templates/react-sdk-reference/.claude/prompts/generate-template-components.md +0 -165
- package/templates/react-sdk-reference/.claude/prompts/generate-widget-components.md +0 -138
- package/templates/react-sdk-reference/.claude/prompts/replace-design-system.md +0 -519
- package/templates/react-sdk-reference/.claude/skills/component-contracts.md +0 -140
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/AlertBanner.md +0 -137
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/Banner.md +0 -152
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/CaseSummaryFields.md +0 -159
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/DetailsFields.md +0 -148
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldGroup.md +0 -134
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldGroupList.md +0 -113
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldValueList.md +0 -118
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/Pulse.md +0 -85
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/RichTextEditor.md +0 -232
- package/templates/react-sdk-reference/.claude/skills/design-system-extension.md +0 -291
- package/templates/react-sdk-reference/.claude/skills/field-components.md +0 -295
- package/templates/react-sdk-reference/.claude/skills/field-skills/AutoComplete.md +0 -113
- package/templates/react-sdk-reference/.claude/skills/field-skills/CancelAlert.md +0 -211
- package/templates/react-sdk-reference/.claude/skills/field-skills/Checkbox.md +0 -175
- package/templates/react-sdk-reference/.claude/skills/field-skills/Currency.md +0 -109
- package/templates/react-sdk-reference/.claude/skills/field-skills/Date.md +0 -101
- package/templates/react-sdk-reference/.claude/skills/field-skills/DateTime.md +0 -106
- package/templates/react-sdk-reference/.claude/skills/field-skills/Decimal.md +0 -99
- package/templates/react-sdk-reference/.claude/skills/field-skills/Dropdown.md +0 -134
- package/templates/react-sdk-reference/.claude/skills/field-skills/Email.md +0 -109
- package/templates/react-sdk-reference/.claude/skills/field-skills/Group.md +0 -96
- package/templates/react-sdk-reference/.claude/skills/field-skills/Integer.md +0 -88
- package/templates/react-sdk-reference/.claude/skills/field-skills/Location.md +0 -145
- package/templates/react-sdk-reference/.claude/skills/field-skills/Percentage.md +0 -93
- package/templates/react-sdk-reference/.claude/skills/field-skills/Phone.md +0 -129
- package/templates/react-sdk-reference/.claude/skills/field-skills/RadioButtons.md +0 -167
- package/templates/react-sdk-reference/.claude/skills/field-skills/RichText.md +0 -149
- package/templates/react-sdk-reference/.claude/skills/field-skills/ScalarList.md +0 -134
- package/templates/react-sdk-reference/.claude/skills/field-skills/SelectableCard.md +0 -231
- package/templates/react-sdk-reference/.claude/skills/field-skills/TextArea.md +0 -98
- package/templates/react-sdk-reference/.claude/skills/field-skills/TextContent.md +0 -117
- package/templates/react-sdk-reference/.claude/skills/field-skills/TextInput.md +0 -107
- package/templates/react-sdk-reference/.claude/skills/field-skills/Time.md +0 -89
- package/templates/react-sdk-reference/.claude/skills/field-skills/URL.md +0 -86
- package/templates/react-sdk-reference/.claude/skills/template-components.md +0 -321
- package/templates/react-sdk-reference/.claude/skills/template-skills/AdvancedSearch.md +0 -150
- package/templates/react-sdk-reference/.claude/skills/template-skills/AppShell.md +0 -124
- package/templates/react-sdk-reference/.claude/skills/template-skills/BannerPage.md +0 -86
- package/templates/react-sdk-reference/.claude/skills/template-skills/CaseSummary.md +0 -106
- package/templates/react-sdk-reference/.claude/skills/template-skills/CaseView.md +0 -137
- package/templates/react-sdk-reference/.claude/skills/template-skills/CaseViewActionsMenu.md +0 -131
- package/templates/react-sdk-reference/.claude/skills/template-skills/Confirmation.md +0 -109
- package/templates/react-sdk-reference/.claude/skills/template-skills/DefaultForm.md +0 -104
- package/templates/react-sdk-reference/.claude/skills/template-skills/DefaultPage.md +0 -112
- package/templates/react-sdk-reference/.claude/skills/template-skills/Details.md +0 -90
- package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsSubTabs.md +0 -97
- package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsThreeColumn.md +0 -80
- package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsTwoColumn.md +0 -80
- package/templates/react-sdk-reference/.claude/skills/template-skills/DynamicTabs.md +0 -106
- package/templates/react-sdk-reference/.claude/skills/template-skills/FieldGroupTemplate.md +0 -112
- package/templates/react-sdk-reference/.claude/skills/template-skills/HierarchicalForm.md +0 -116
- package/templates/react-sdk-reference/.claude/skills/template-skills/InlineDashboard.md +0 -108
- package/templates/react-sdk-reference/.claude/skills/template-skills/InlineDashboardPage.md +0 -82
- package/templates/react-sdk-reference/.claude/skills/template-skills/ListView.md +0 -142
- package/templates/react-sdk-reference/.claude/skills/template-skills/MultiReferenceReadOnly.md +0 -82
- package/templates/react-sdk-reference/.claude/skills/template-skills/NarrowWide.md +0 -143
- package/templates/react-sdk-reference/.claude/skills/template-skills/OneColumn.md +0 -114
- package/templates/react-sdk-reference/.claude/skills/template-skills/PromotedFilters.md +0 -130
- package/templates/react-sdk-reference/.claude/skills/template-skills/SelfServiceCaseView.md +0 -142
- package/templates/react-sdk-reference/.claude/skills/template-skills/SingleReferenceReadOnly.md +0 -108
- package/templates/react-sdk-reference/.claude/skills/template-skills/SubTabs.md +0 -82
- package/templates/react-sdk-reference/.claude/skills/template-skills/TwoColumn.md +0 -133
- package/templates/react-sdk-reference/.claude/skills/template-skills/WssNavBar.md +0 -139
- package/templates/react-sdk-reference/.claude/skills/widget-components.md +0 -260
- package/templates/react-sdk-reference/.claude/skills/widget-skills/AppAnnouncement.md +0 -84
- package/templates/react-sdk-reference/.claude/skills/widget-skills/Attachment.md +0 -151
- package/templates/react-sdk-reference/.claude/skills/widget-skills/CaseHistory.md +0 -110
- package/templates/react-sdk-reference/.claude/skills/widget-skills/FileUtility.md +0 -206
- package/templates/react-sdk-reference/.claude/skills/widget-skills/ToDo.md +0 -198
- package/templates/react-sdk-reference/.cursor/rules/component-map.mdrules +0 -41
- package/templates/react-sdk-reference/.cursor/rules/dse-component.mdrules +0 -78
- package/templates/react-sdk-reference/.cursor/rules/field-component.mdrules +0 -74
- package/templates/react-sdk-reference/.cursor/rules/pega-sdk.mdrules +0 -247
- package/templates/react-sdk-reference/.cursor/rules/prompts/add-component.mdrules +0 -149
- package/templates/react-sdk-reference/.cursor/rules/prompts/component-manifest.json +0 -193
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-all-components.mdrules +0 -154
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-dse-components.mdrules +0 -131
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-field-components.mdrules +0 -144
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-template-components.mdrules +0 -156
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-widget-components.mdrules +0 -129
- package/templates/react-sdk-reference/.cursor/rules/prompts/identify-components.mdrules +0 -110
- package/templates/react-sdk-reference/.cursor/rules/skills/component-contracts.mdrules +0 -145
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/AlertBanner.mdrules +0 -140
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Banner.mdrules +0 -154
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/CaseSummaryFields.mdrules +0 -159
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/DetailsFields.mdrules +0 -149
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldGroup.mdrules +0 -136
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldGroupList.mdrules +0 -116
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldValueList.mdrules +0 -120
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Operator.mdrules +0 -154
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Pulse.mdrules +0 -88
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/RichTextEditor.mdrules +0 -211
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/WssQuickCreate.mdrules +0 -140
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension.mdrules +0 -294
- package/templates/react-sdk-reference/.cursor/rules/skills/field-components.mdrules +0 -299
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/AutoComplete.mdrules +0 -117
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/CancelAlert.mdrules +0 -208
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Checkbox.mdrules +0 -163
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Currency.mdrules +0 -111
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Date.mdrules +0 -104
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/DateTime.mdrules +0 -108
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Decimal.mdrules +0 -103
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Dropdown.mdrules +0 -119
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Email.mdrules +0 -112
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Group.mdrules +0 -95
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Integer.mdrules +0 -92
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Location.mdrules +0 -141
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Multiselect.mdrules +0 -169
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/ObjectReference.mdrules +0 -169
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Percentage.mdrules +0 -97
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Phone.mdrules +0 -115
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/RadioButtons.mdrules +0 -151
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/RichText.mdrules +0 -143
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/ScalarList.mdrules +0 -129
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/SelectableCard.mdrules +0 -221
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/SemanticLink.mdrules +0 -153
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextArea.mdrules +0 -101
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextContent.mdrules +0 -106
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextInput.mdrules +0 -109
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Time.mdrules +0 -93
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/URL.mdrules +0 -90
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/UserReference.mdrules +0 -185
- package/templates/react-sdk-reference/.cursor/rules/skills/run-and-verify.mdrules +0 -73
- package/templates/react-sdk-reference/.cursor/rules/skills/template-components.mdrules +0 -327
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/AdvancedSearch.mdrules +0 -149
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/AppShell.mdrules +0 -127
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/BannerPage.mdrules +0 -88
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseSummary.mdrules +0 -105
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseView.mdrules +0 -136
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseViewActionsMenu.mdrules +0 -131
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/Confirmation.mdrules +0 -112
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DataReference.mdrules +0 -125
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DefaultForm.mdrules +0 -107
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DefaultPage.mdrules +0 -115
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/Details.mdrules +0 -93
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsSubTabs.mdrules +0 -100
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsThreeColumn.mdrules +0 -83
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsTwoColumn.mdrules +0 -83
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DynamicTabs.mdrules +0 -106
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/FieldGroupTemplate.mdrules +0 -114
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/HierarchicalForm.mdrules +0 -118
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/InlineDashboard.mdrules +0 -109
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/InlineDashboardPage.mdrules +0 -90
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/ListPage.mdrules +0 -73
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/ListView.mdrules +0 -144
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/MultiReferenceReadOnly.mdrules +0 -85
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/NarrowWide.mdrules +0 -146
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/OneColumn.mdrules +0 -114
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/PromotedFilters.mdrules +0 -129
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SelfServiceCaseView.mdrules +0 -140
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SimpleTable.mdrules +0 -132
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SingleReferenceReadOnly.mdrules +0 -108
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SubTabs.mdrules +0 -84
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/TwoColumn.mdrules +0 -136
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/WideNarrow.mdrules +0 -155
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/WssNavBar.mdrules +0 -140
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-components.mdrules +0 -276
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/AppAnnouncement.mdrules +0 -87
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/Attachment.mdrules +0 -151
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/CaseHistory.mdrules +0 -112
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/FileUtility.mdrules +0 -205
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/Followers.mdrules +0 -104
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/QuickCreate.mdrules +0 -119
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/SummaryItem.mdrules +0 -172
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/ToDo.mdrules +0 -195
- package/templates/react-sdk-reference/.cursor/rules/template-component.mdrules +0 -95
- package/templates/react-sdk-reference/.cursor/rules/widget-component.mdrules +0 -90
- package/templates/react-sdk-reference/.github/copilot-instructions.md +0 -243
- package/templates/react-sdk-reference/.github/instructions/component-map.instructions.md +0 -40
- package/templates/react-sdk-reference/.github/instructions/dse-component.instructions.md +0 -77
- package/templates/react-sdk-reference/.github/instructions/field-component.instructions.md +0 -77
- package/templates/react-sdk-reference/.github/instructions/template-component.instructions.md +0 -95
- package/templates/react-sdk-reference/.github/instructions/widget-component.instructions.md +0 -90
- package/templates/react-sdk-reference/.github/prompts/add-component.prompt.md +0 -192
- package/templates/react-sdk-reference/.github/prompts/component-manifest.json +0 -193
- package/templates/react-sdk-reference/.github/prompts/generate-all-components.prompt.md +0 -411
- package/templates/react-sdk-reference/.github/prompts/generate-dse-components.prompt.md +0 -205
- package/templates/react-sdk-reference/.github/prompts/generate-field-components.prompt.md +0 -223
- package/templates/react-sdk-reference/.github/prompts/generate-template-components.prompt.md +0 -229
- package/templates/react-sdk-reference/.github/prompts/generate-widget-components.prompt.md +0 -208
- package/templates/react-sdk-reference/.github/prompts/identify-components.prompt.md +0 -110
- package/templates/react-sdk-reference/.github/prompts/replace-design-system.prompt.md +0 -524
- package/templates/react-sdk-reference/.github/skills/component-contracts.md +0 -140
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/Banner.md +0 -152
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/CaseSummaryFields.md +0 -159
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/DetailsFields.md +0 -148
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/FieldGroup.md +0 -134
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/FieldGroupList.md +0 -113
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/FieldValueList.md +0 -118
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/Operator.md +0 -155
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/Pulse.md +0 -85
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/RichTextEditor.md +0 -232
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/WssQuickCreate.md +0 -137
- package/templates/react-sdk-reference/.github/skills/design-system-extension.md +0 -291
- package/templates/react-sdk-reference/.github/skills/field-components.md +0 -295
- package/templates/react-sdk-reference/.github/skills/field-skills/AutoComplete.md +0 -113
- package/templates/react-sdk-reference/.github/skills/field-skills/CancelAlert.md +0 -211
- package/templates/react-sdk-reference/.github/skills/field-skills/Checkbox.md +0 -175
- package/templates/react-sdk-reference/.github/skills/field-skills/Currency.md +0 -109
- package/templates/react-sdk-reference/.github/skills/field-skills/Date.md +0 -101
- package/templates/react-sdk-reference/.github/skills/field-skills/DateTime.md +0 -106
- package/templates/react-sdk-reference/.github/skills/field-skills/Decimal.md +0 -99
- package/templates/react-sdk-reference/.github/skills/field-skills/Dropdown.md +0 -134
- package/templates/react-sdk-reference/.github/skills/field-skills/Email.md +0 -109
- package/templates/react-sdk-reference/.github/skills/field-skills/Group.md +0 -96
- package/templates/react-sdk-reference/.github/skills/field-skills/Integer.md +0 -88
- package/templates/react-sdk-reference/.github/skills/field-skills/Location.md +0 -145
- package/templates/react-sdk-reference/.github/skills/field-skills/Multiselect.md +0 -188
- package/templates/react-sdk-reference/.github/skills/field-skills/ObjectReference.md +0 -173
- package/templates/react-sdk-reference/.github/skills/field-skills/Percentage.md +0 -93
- package/templates/react-sdk-reference/.github/skills/field-skills/Phone.md +0 -129
- package/templates/react-sdk-reference/.github/skills/field-skills/RadioButtons.md +0 -167
- package/templates/react-sdk-reference/.github/skills/field-skills/RichText.md +0 -149
- package/templates/react-sdk-reference/.github/skills/field-skills/ScalarList.md +0 -134
- package/templates/react-sdk-reference/.github/skills/field-skills/SelectableCard.md +0 -231
- package/templates/react-sdk-reference/.github/skills/field-skills/SemanticLink.md +0 -155
- package/templates/react-sdk-reference/.github/skills/field-skills/TextArea.md +0 -98
- package/templates/react-sdk-reference/.github/skills/field-skills/TextInput.md +0 -107
- package/templates/react-sdk-reference/.github/skills/field-skills/Time.md +0 -89
- package/templates/react-sdk-reference/.github/skills/field-skills/URL.md +0 -86
- package/templates/react-sdk-reference/.github/skills/field-skills/UserReference.md +0 -203
- package/templates/react-sdk-reference/.github/skills/run-and-verify.md +0 -70
- package/templates/react-sdk-reference/.github/skills/template-components.md +0 -321
- package/templates/react-sdk-reference/.github/skills/template-skills/AdvancedSearch.md +0 -150
- package/templates/react-sdk-reference/.github/skills/template-skills/AppShell.md +0 -124
- package/templates/react-sdk-reference/.github/skills/template-skills/BannerPage.md +0 -86
- package/templates/react-sdk-reference/.github/skills/template-skills/CaseSummary.md +0 -106
- package/templates/react-sdk-reference/.github/skills/template-skills/CaseView.md +0 -137
- package/templates/react-sdk-reference/.github/skills/template-skills/CaseViewActionsMenu.md +0 -131
- package/templates/react-sdk-reference/.github/skills/template-skills/Confirmation.md +0 -109
- package/templates/react-sdk-reference/.github/skills/template-skills/DataReference.md +0 -124
- package/templates/react-sdk-reference/.github/skills/template-skills/DefaultForm.md +0 -104
- package/templates/react-sdk-reference/.github/skills/template-skills/Details.md +0 -90
- package/templates/react-sdk-reference/.github/skills/template-skills/DetailsSubTabs.md +0 -97
- package/templates/react-sdk-reference/.github/skills/template-skills/DetailsThreeColumn.md +0 -80
- package/templates/react-sdk-reference/.github/skills/template-skills/DetailsTwoColumn.md +0 -80
- package/templates/react-sdk-reference/.github/skills/template-skills/DynamicTabs.md +0 -106
- package/templates/react-sdk-reference/.github/skills/template-skills/FieldGroupTemplate.md +0 -112
- package/templates/react-sdk-reference/.github/skills/template-skills/HierarchicalForm.md +0 -116
- package/templates/react-sdk-reference/.github/skills/template-skills/InlineDashboard.md +0 -108
- package/templates/react-sdk-reference/.github/skills/template-skills/InlineDashboardPage.md +0 -82
- package/templates/react-sdk-reference/.github/skills/template-skills/ListPage.md +0 -70
- package/templates/react-sdk-reference/.github/skills/template-skills/ListView.md +0 -142
- package/templates/react-sdk-reference/.github/skills/template-skills/NarrowWide.md +0 -143
- package/templates/react-sdk-reference/.github/skills/template-skills/OneColumn.md +0 -114
- package/templates/react-sdk-reference/.github/skills/template-skills/PromotedFilters.md +0 -130
- package/templates/react-sdk-reference/.github/skills/template-skills/SelfServiceCaseView.md +0 -142
- package/templates/react-sdk-reference/.github/skills/template-skills/SimpleTable.md +0 -131
- package/templates/react-sdk-reference/.github/skills/template-skills/SingleReferenceReadOnly.md +0 -108
- package/templates/react-sdk-reference/.github/skills/template-skills/SubTabs.md +0 -82
- package/templates/react-sdk-reference/.github/skills/template-skills/TwoColumn.md +0 -133
- package/templates/react-sdk-reference/.github/skills/template-skills/WideNarrow.md +0 -152
- package/templates/react-sdk-reference/.github/skills/widget-components.md +0 -260
- package/templates/react-sdk-reference/.github/skills/widget-skills/AppAnnouncement.md +0 -84
- package/templates/react-sdk-reference/.github/skills/widget-skills/Attachment.md +0 -151
- package/templates/react-sdk-reference/.github/skills/widget-skills/CaseHistory.md +0 -110
- package/templates/react-sdk-reference/.github/skills/widget-skills/Followers.md +0 -103
- package/templates/react-sdk-reference/.github/skills/widget-skills/QuickCreate.md +0 -118
- package/templates/react-sdk-reference/.github/skills/widget-skills/SummaryItem.md +0 -169
- package/templates/react-sdk-reference/.github/skills/widget-skills/ToDo.md +0 -198
- package/templates/react-sdk-reference/AGENTS.md +0 -246
- package/templates/react-sdk-reference/pega-auth-0.2.42.tgz +0 -0
- /package/templates/react-sdk-reference/{.claude → .ai-common}/skills/run-and-verify.md +0 -0
package/dist/index.js
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
// src/index.ts
|
|
4
4
|
import * as p from "@clack/prompts";
|
|
5
5
|
import pc from "picocolors";
|
|
6
|
-
import
|
|
6
|
+
import path3 from "path";
|
|
7
|
+
import { createRequire } from "module";
|
|
7
8
|
|
|
8
9
|
// src/scaffold.ts
|
|
9
|
-
import
|
|
10
|
-
import
|
|
10
|
+
import fs2 from "fs";
|
|
11
|
+
import path2 from "path";
|
|
11
12
|
import { fileURLToPath } from "url";
|
|
12
13
|
import { spawn } from "child_process";
|
|
13
14
|
|
|
@@ -301,15 +302,134 @@ export function registerSampleComponents(registry: ComponentRegistry<React.Compo
|
|
|
301
302
|
return body;
|
|
302
303
|
}
|
|
303
304
|
|
|
305
|
+
// src/merge.ts
|
|
306
|
+
import fs from "fs";
|
|
307
|
+
import path from "path";
|
|
308
|
+
var PEGA_BEGIN = "<!-- BEGIN PEGA SDK \u2014 generated by @pega/sdk. Do not edit inside this block. -->";
|
|
309
|
+
var PEGA_END = "<!-- END PEGA SDK -->";
|
|
310
|
+
var PEGA_BLOCK_RE = new RegExp(`${escapeRegExp(PEGA_BEGIN)}[\\s\\S]*?${escapeRegExp(PEGA_END)}`);
|
|
311
|
+
function escapeRegExp(value) {
|
|
312
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
313
|
+
}
|
|
314
|
+
function hasPegaBlock(content) {
|
|
315
|
+
return PEGA_BLOCK_RE.test(content);
|
|
316
|
+
}
|
|
317
|
+
function wrapPegaBlock(body) {
|
|
318
|
+
return `${PEGA_BEGIN}
|
|
319
|
+
${body.replace(/\s+$/, "")}
|
|
320
|
+
${PEGA_END}
|
|
321
|
+
`;
|
|
322
|
+
}
|
|
323
|
+
function splitFrontmatter(content) {
|
|
324
|
+
const match = content.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n/);
|
|
325
|
+
if (!match) return { frontmatter: "", body: content };
|
|
326
|
+
return { frontmatter: match[0], body: content.slice(match[0].length) };
|
|
327
|
+
}
|
|
328
|
+
function writeManagedMarkdown(destPath, input) {
|
|
329
|
+
const { frontmatter, body, policy, markers = true } = input;
|
|
330
|
+
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
331
|
+
if (!markers) {
|
|
332
|
+
const existed = fs.existsSync(destPath);
|
|
333
|
+
fs.writeFileSync(destPath, frontmatter + body);
|
|
334
|
+
return existed ? "overwritten" : "created";
|
|
335
|
+
}
|
|
336
|
+
const block = wrapPegaBlock(body);
|
|
337
|
+
if (!fs.existsSync(destPath)) {
|
|
338
|
+
fs.writeFileSync(destPath, frontmatter + block);
|
|
339
|
+
return "created";
|
|
340
|
+
}
|
|
341
|
+
const existing = fs.readFileSync(destPath, "utf-8");
|
|
342
|
+
if (hasPegaBlock(existing)) {
|
|
343
|
+
const outside = existing.replace(PEGA_BLOCK_RE, "");
|
|
344
|
+
const { body: outsideBody } = splitFrontmatter(outside);
|
|
345
|
+
if (outsideBody.trim() === "") {
|
|
346
|
+
fs.writeFileSync(destPath, frontmatter + block);
|
|
347
|
+
return "block-replaced";
|
|
348
|
+
}
|
|
349
|
+
fs.writeFileSync(destPath, existing.replace(PEGA_BLOCK_RE, block.replace(/\n$/, "")));
|
|
350
|
+
return "block-replaced";
|
|
351
|
+
}
|
|
352
|
+
if (policy === "override") {
|
|
353
|
+
fs.writeFileSync(destPath, frontmatter + block);
|
|
354
|
+
return "overwritten";
|
|
355
|
+
}
|
|
356
|
+
const separator = existing.endsWith("\n") ? "\n" : "\n\n";
|
|
357
|
+
fs.writeFileSync(destPath, existing + separator + block);
|
|
358
|
+
return "appended";
|
|
359
|
+
}
|
|
360
|
+
function isPlainObject(value) {
|
|
361
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
362
|
+
}
|
|
363
|
+
function deepMergeJson(existing, incoming, incomingWins = [], basePath = "") {
|
|
364
|
+
if (!isPlainObject(existing) || !isPlainObject(incoming)) {
|
|
365
|
+
return existing === void 0 ? incoming : existing;
|
|
366
|
+
}
|
|
367
|
+
const result = { ...existing };
|
|
368
|
+
for (const [key, incomingValue] of Object.entries(incoming)) {
|
|
369
|
+
const keyPath = basePath ? `${basePath}.${key}` : key;
|
|
370
|
+
if (!(key in result)) {
|
|
371
|
+
result[key] = incomingValue;
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
const existingValue = result[key];
|
|
375
|
+
if (isPlainObject(existingValue) && isPlainObject(incomingValue)) {
|
|
376
|
+
result[key] = deepMergeJson(existingValue, incomingValue, incomingWins, keyPath);
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
if (incomingWins.includes(keyPath) || incomingWins.includes(key)) {
|
|
380
|
+
result[key] = incomingValue;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return result;
|
|
384
|
+
}
|
|
385
|
+
function writeManagedJson(destPath, incoming, policy, incomingWins = []) {
|
|
386
|
+
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
387
|
+
if (!fs.existsSync(destPath)) {
|
|
388
|
+
fs.writeFileSync(destPath, JSON.stringify(incoming, null, 2) + "\n");
|
|
389
|
+
return "created";
|
|
390
|
+
}
|
|
391
|
+
if (policy === "merge") {
|
|
392
|
+
try {
|
|
393
|
+
const existing = JSON.parse(fs.readFileSync(destPath, "utf-8"));
|
|
394
|
+
const merged = deepMergeJson(existing, incoming, incomingWins);
|
|
395
|
+
fs.writeFileSync(destPath, JSON.stringify(merged, null, 2) + "\n");
|
|
396
|
+
return "appended";
|
|
397
|
+
} catch {
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
fs.writeFileSync(destPath, JSON.stringify(incoming, null, 2) + "\n");
|
|
401
|
+
return "overwritten";
|
|
402
|
+
}
|
|
403
|
+
function isConflict(destPath, incomingJson, incomingWins = []) {
|
|
404
|
+
if (!fs.existsSync(destPath)) return false;
|
|
405
|
+
let existing;
|
|
406
|
+
try {
|
|
407
|
+
existing = fs.readFileSync(destPath, "utf-8");
|
|
408
|
+
} catch {
|
|
409
|
+
return true;
|
|
410
|
+
}
|
|
411
|
+
if (/\.json$/i.test(destPath)) {
|
|
412
|
+
if (incomingJson === void 0) return true;
|
|
413
|
+
try {
|
|
414
|
+
const parsed = JSON.parse(existing);
|
|
415
|
+
const merged = deepMergeJson(parsed, incomingJson, incomingWins);
|
|
416
|
+
return JSON.stringify(merged) !== JSON.stringify(parsed);
|
|
417
|
+
} catch {
|
|
418
|
+
return true;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
return !hasPegaBlock(existing);
|
|
422
|
+
}
|
|
423
|
+
|
|
304
424
|
// src/scaffold.ts
|
|
305
|
-
var __dirname =
|
|
306
|
-
var MONOREPO_SAMPLES_DIR =
|
|
307
|
-
var PACKAGED_TEMPLATES_DIR =
|
|
425
|
+
var __dirname = path2.dirname(fileURLToPath(import.meta.url));
|
|
426
|
+
var MONOREPO_SAMPLES_DIR = path2.resolve(__dirname, "..", "..", "..", "samples");
|
|
427
|
+
var PACKAGED_TEMPLATES_DIR = path2.resolve(__dirname, "..", "templates");
|
|
308
428
|
function resolveTemplateSourceRoot() {
|
|
309
|
-
if (
|
|
429
|
+
if (fs2.existsSync(MONOREPO_SAMPLES_DIR)) {
|
|
310
430
|
return MONOREPO_SAMPLES_DIR;
|
|
311
431
|
}
|
|
312
|
-
if (
|
|
432
|
+
if (fs2.existsSync(PACKAGED_TEMPLATES_DIR)) {
|
|
313
433
|
return PACKAGED_TEMPLATES_DIR;
|
|
314
434
|
}
|
|
315
435
|
throw new Error(
|
|
@@ -329,57 +449,86 @@ var CATEGORY_DIR_MAP = {
|
|
|
329
449
|
infra: "infra",
|
|
330
450
|
designSystemExtension: "designSystemExtension"
|
|
331
451
|
};
|
|
332
|
-
var SKIP_ENTRIES = /* @__PURE__ */ new Set([
|
|
452
|
+
var SKIP_ENTRIES = /* @__PURE__ */ new Set([
|
|
453
|
+
"node_modules",
|
|
454
|
+
"dist",
|
|
455
|
+
".DS_Store",
|
|
456
|
+
".next",
|
|
457
|
+
".expo",
|
|
458
|
+
".angular",
|
|
459
|
+
"build",
|
|
460
|
+
".pnpm-store"
|
|
461
|
+
]);
|
|
333
462
|
async function scaffold(choices, targetDir, onProgress) {
|
|
334
463
|
const report = (message) => onProgress?.(message);
|
|
335
|
-
|
|
464
|
+
let { framework, aiTool, includeTemplates, componentCategories, projectName } = choices;
|
|
465
|
+
if (framework === "react-native") {
|
|
466
|
+
includeTemplates = true;
|
|
467
|
+
componentCategories = ["fields", "templates", "infra"];
|
|
468
|
+
}
|
|
336
469
|
report("Preparing project directory\u2026");
|
|
337
|
-
if (
|
|
338
|
-
const files =
|
|
470
|
+
if (fs2.existsSync(targetDir)) {
|
|
471
|
+
const files = fs2.readdirSync(targetDir);
|
|
339
472
|
if (files.length > 0) {
|
|
340
473
|
throw new Error(`Directory "${targetDir}" is not empty.`);
|
|
341
474
|
}
|
|
342
475
|
} else {
|
|
343
|
-
|
|
476
|
+
fs2.mkdirSync(targetDir, { recursive: true });
|
|
344
477
|
}
|
|
345
478
|
const templateSourceRoot = resolveTemplateSourceRoot();
|
|
346
479
|
const sampleName = FRAMEWORK_SAMPLE_MAP[framework];
|
|
347
|
-
const sampleDir =
|
|
348
|
-
if (!
|
|
480
|
+
const sampleDir = path2.join(templateSourceRoot, sampleName);
|
|
481
|
+
if (!fs2.existsSync(sampleDir)) {
|
|
349
482
|
throw new Error(`Template "${sampleName}" not found at ${sampleDir}.`);
|
|
350
483
|
}
|
|
351
484
|
report(`Copying ${sampleName} reference app\u2026`);
|
|
352
485
|
copyDir(sampleDir, targetDir);
|
|
353
486
|
report("Configuring component set\u2026");
|
|
354
|
-
const componentsDir =
|
|
355
|
-
if (
|
|
487
|
+
const componentsDir = path2.join(targetDir, "src", "components");
|
|
488
|
+
if (fs2.existsSync(componentsDir)) {
|
|
489
|
+
const allowedCategories = framework === "react-native" ? ["fields", "templates", "infra"] : ["fields", "templates", "widgets", "infra", "designSystemExtension"];
|
|
356
490
|
if (!includeTemplates || componentCategories.length === 0) {
|
|
357
491
|
for (const cat of Object.values(CATEGORY_DIR_MAP)) {
|
|
358
|
-
const catDir =
|
|
359
|
-
if (
|
|
360
|
-
|
|
492
|
+
const catDir = path2.join(componentsDir, cat);
|
|
493
|
+
if (fs2.existsSync(catDir)) {
|
|
494
|
+
fs2.rmSync(catDir, { recursive: true });
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
fs2.writeFileSync(path2.join(componentsDir, "component-map.ts"), generateMinimalComponentMap(framework));
|
|
498
|
+
if (framework === "react") {
|
|
499
|
+
fs2.writeFileSync(path2.join(targetDir, "src", "AppProviders.tsx"), generateMinimalReactProviders());
|
|
500
|
+
const muiThemeAugmentation = path2.join(targetDir, "src", "mui-theme-augmentation.d.ts");
|
|
501
|
+
if (fs2.existsSync(muiThemeAugmentation)) {
|
|
502
|
+
fs2.rmSync(muiThemeAugmentation);
|
|
361
503
|
}
|
|
362
504
|
}
|
|
363
|
-
fs.writeFileSync(path.join(componentsDir, "component-map.ts"), generateMinimalComponentMap());
|
|
364
505
|
} else {
|
|
365
|
-
const
|
|
366
|
-
for (const cat of allCategories) {
|
|
506
|
+
for (const cat of allowedCategories) {
|
|
367
507
|
if (!componentCategories.includes(cat)) {
|
|
368
|
-
const catDir =
|
|
369
|
-
if (
|
|
370
|
-
|
|
508
|
+
const catDir = path2.join(componentsDir, CATEGORY_DIR_MAP[cat]);
|
|
509
|
+
if (fs2.existsSync(catDir)) {
|
|
510
|
+
fs2.rmSync(catDir, { recursive: true });
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
if (framework === "react-native") {
|
|
515
|
+
const unsupportedCats = ["widgets", "designSystemExtension"];
|
|
516
|
+
for (const cat of unsupportedCats) {
|
|
517
|
+
const catDir = path2.join(componentsDir, CATEGORY_DIR_MAP[cat]);
|
|
518
|
+
if (fs2.existsSync(catDir)) {
|
|
519
|
+
fs2.rmSync(catDir, { recursive: true });
|
|
371
520
|
}
|
|
372
521
|
}
|
|
373
522
|
}
|
|
374
523
|
const componentMapContent = generateComponentMap(componentCategories, framework);
|
|
375
|
-
|
|
524
|
+
fs2.writeFileSync(path2.join(componentsDir, "component-map.ts"), componentMapContent);
|
|
376
525
|
}
|
|
377
526
|
}
|
|
378
527
|
if (!aiTool) {
|
|
379
|
-
for (const dir of [".github", ".cursor", "AGENTS.md", ".claude"]) {
|
|
380
|
-
const target =
|
|
381
|
-
if (
|
|
382
|
-
|
|
528
|
+
for (const dir of [".github", ".cursor", "AGENTS.md", ".claude", ".ai-common"]) {
|
|
529
|
+
const target = path2.join(targetDir, dir);
|
|
530
|
+
if (fs2.existsSync(target)) {
|
|
531
|
+
fs2.rmSync(target, { recursive: true });
|
|
383
532
|
}
|
|
384
533
|
}
|
|
385
534
|
} else {
|
|
@@ -392,16 +541,22 @@ async function scaffold(choices, targetDir, onProgress) {
|
|
|
392
541
|
const keepPaths = AI_TOOL_PATHS[aiTool];
|
|
393
542
|
for (const dir of allAiPaths) {
|
|
394
543
|
if (!keepPaths.includes(dir)) {
|
|
395
|
-
const target =
|
|
396
|
-
if (
|
|
397
|
-
|
|
544
|
+
const target = path2.join(targetDir, dir);
|
|
545
|
+
if (fs2.existsSync(target)) {
|
|
546
|
+
fs2.rmSync(target, { recursive: true });
|
|
398
547
|
}
|
|
399
548
|
}
|
|
400
549
|
}
|
|
550
|
+
generateAiConfigs(targetDir, aiTool);
|
|
401
551
|
}
|
|
402
552
|
report("Finalizing project configuration\u2026");
|
|
403
|
-
|
|
404
|
-
|
|
553
|
+
selectReactPackageManifest(targetDir, framework, includeTemplates, componentCategories);
|
|
554
|
+
transformPackageJson(path2.join(targetDir, "package.json"), projectName);
|
|
555
|
+
transformTsConfig(path2.join(targetDir, "tsconfig.json"));
|
|
556
|
+
transformSdkConfig(path2.join(targetDir, "sdk-config.json"));
|
|
557
|
+
if (framework === "react-native") {
|
|
558
|
+
transformExpoConfig(path2.join(targetDir, "app.json"), projectName);
|
|
559
|
+
}
|
|
405
560
|
report("Installing dependencies (this may take a minute)\u2026");
|
|
406
561
|
try {
|
|
407
562
|
await runInstall(targetDir);
|
|
@@ -423,15 +578,27 @@ function runInstall(cwd) {
|
|
|
423
578
|
});
|
|
424
579
|
}
|
|
425
580
|
function transformPackageJson(pkgJsonPath, projectName) {
|
|
426
|
-
if (!
|
|
427
|
-
const pkgJson = JSON.parse(
|
|
581
|
+
if (!fs2.existsSync(pkgJsonPath)) return;
|
|
582
|
+
const pkgJson = JSON.parse(fs2.readFileSync(pkgJsonPath, "utf-8"));
|
|
428
583
|
pkgJson.name = projectName;
|
|
429
584
|
delete pkgJson.private;
|
|
430
|
-
|
|
585
|
+
fs2.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + "\n");
|
|
586
|
+
}
|
|
587
|
+
function selectReactPackageManifest(targetDir, framework, includeTemplates, componentCategories) {
|
|
588
|
+
if (framework !== "react") return;
|
|
589
|
+
const pkgJsonPath = path2.join(targetDir, "package.json");
|
|
590
|
+
const minimalPkgJsonPath = path2.join(targetDir, "package.minimal.json");
|
|
591
|
+
const hasSampleComponents = includeTemplates && componentCategories.length > 0;
|
|
592
|
+
if (!hasSampleComponents && fs2.existsSync(minimalPkgJsonPath)) {
|
|
593
|
+
fs2.copyFileSync(minimalPkgJsonPath, pkgJsonPath);
|
|
594
|
+
}
|
|
595
|
+
if (fs2.existsSync(minimalPkgJsonPath)) {
|
|
596
|
+
fs2.rmSync(minimalPkgJsonPath);
|
|
597
|
+
}
|
|
431
598
|
}
|
|
432
599
|
function transformTsConfig(tsconfigPath) {
|
|
433
|
-
if (!
|
|
434
|
-
const tsconfig = JSON.parse(
|
|
600
|
+
if (!fs2.existsSync(tsconfigPath)) return;
|
|
601
|
+
const tsconfig = JSON.parse(fs2.readFileSync(tsconfigPath, "utf-8"));
|
|
435
602
|
if (tsconfig.compilerOptions) {
|
|
436
603
|
if (tsconfig.compilerOptions.paths) {
|
|
437
604
|
const cleanedPaths = {};
|
|
@@ -451,9 +618,60 @@ function transformTsConfig(tsconfigPath) {
|
|
|
451
618
|
tsconfig.compilerOptions.typeRoots = ["./node_modules/@types", "./node_modules/@pega"];
|
|
452
619
|
}
|
|
453
620
|
}
|
|
454
|
-
|
|
621
|
+
fs2.writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2) + "\n");
|
|
622
|
+
}
|
|
623
|
+
function transformSdkConfig(sdkConfigPath) {
|
|
624
|
+
if (!fs2.existsSync(sdkConfigPath)) return;
|
|
625
|
+
const sdkConfig = JSON.parse(fs2.readFileSync(sdkConfigPath, "utf-8"));
|
|
626
|
+
if (sdkConfig.serverConfig) {
|
|
627
|
+
if ("infinityRestServerUrl" in sdkConfig.serverConfig) sdkConfig.serverConfig.infinityRestServerUrl = "";
|
|
628
|
+
if ("appAlias" in sdkConfig.serverConfig) sdkConfig.serverConfig.appAlias = "";
|
|
629
|
+
if ("appMashupCaseType" in sdkConfig.serverConfig) sdkConfig.serverConfig.appMashupCaseType = "";
|
|
630
|
+
}
|
|
631
|
+
if (sdkConfig.authConfig) {
|
|
632
|
+
if ("mashupClientId" in sdkConfig.authConfig) sdkConfig.authConfig.mashupClientId = "";
|
|
633
|
+
if ("mashupUserIdentifier" in sdkConfig.authConfig) sdkConfig.authConfig.mashupUserIdentifier = "";
|
|
634
|
+
if ("portalClientId" in sdkConfig.authConfig) sdkConfig.authConfig.portalClientId = "";
|
|
635
|
+
}
|
|
636
|
+
fs2.writeFileSync(sdkConfigPath, JSON.stringify(sdkConfig, null, 2) + "\n");
|
|
637
|
+
}
|
|
638
|
+
function transformExpoConfig(appJsonPath, projectName) {
|
|
639
|
+
if (!fs2.existsSync(appJsonPath)) return;
|
|
640
|
+
const appJson = JSON.parse(fs2.readFileSync(appJsonPath, "utf-8"));
|
|
641
|
+
if (appJson.expo) {
|
|
642
|
+
appJson.expo.name = projectName;
|
|
643
|
+
appJson.expo.slug = projectName.toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "");
|
|
644
|
+
}
|
|
645
|
+
fs2.writeFileSync(appJsonPath, JSON.stringify(appJson, null, 2) + "\n");
|
|
646
|
+
}
|
|
647
|
+
function generateMinimalComponentMap(framework) {
|
|
648
|
+
if (framework === "react-native") {
|
|
649
|
+
return `import { sdkComponents } from '@pega/sdk-react';
|
|
650
|
+
import type { ComponentRegistry } from '@pega/sdk-types';
|
|
651
|
+
|
|
652
|
+
/**
|
|
653
|
+
* Returns a map of Pega component names \u2192 React Native components.
|
|
654
|
+
* Add your own components here as you build them.
|
|
655
|
+
*/
|
|
656
|
+
function getSampleComponentMap(): Record<string, React.ComponentType<Record<string, unknown>>> {
|
|
657
|
+
return {
|
|
658
|
+
...sdkComponents,
|
|
659
|
+
};
|
|
455
660
|
}
|
|
456
|
-
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
* Registers all components into the given registry.
|
|
664
|
+
*/
|
|
665
|
+
export function registerComponents(
|
|
666
|
+
registry: ComponentRegistry<React.ComponentType<Record<string, unknown>>>,
|
|
667
|
+
) {
|
|
668
|
+
const map = getSampleComponentMap();
|
|
669
|
+
for (const [name, component] of Object.entries(map)) {
|
|
670
|
+
registry.register(name, component);
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
`;
|
|
674
|
+
}
|
|
457
675
|
return `import { sdkComponents } from '@pega/sdk-react';
|
|
458
676
|
import type { ComponentRegistry } from '@pega/sdk-types';
|
|
459
677
|
|
|
@@ -480,24 +698,505 @@ export function registerSampleComponents(
|
|
|
480
698
|
}
|
|
481
699
|
`;
|
|
482
700
|
}
|
|
701
|
+
function generateMinimalReactProviders() {
|
|
702
|
+
return `import type { PropsWithChildren } from 'react';
|
|
703
|
+
|
|
704
|
+
export function AppProviders({ children }: PropsWithChildren) {
|
|
705
|
+
return <>{children}</>;
|
|
706
|
+
}
|
|
707
|
+
`;
|
|
708
|
+
}
|
|
709
|
+
var AI_GEN_CONFIGS = {
|
|
710
|
+
copilot: {
|
|
711
|
+
skillDir: ".github/skills",
|
|
712
|
+
promptDir: ".github/prompts",
|
|
713
|
+
instructionsDir: ".github/instructions",
|
|
714
|
+
agentsDir: ".github/agents",
|
|
715
|
+
skillExt: "md",
|
|
716
|
+
promptExt: "prompt.md",
|
|
717
|
+
instructionsExt: "instructions.md",
|
|
718
|
+
agentExt: "agent.md",
|
|
719
|
+
tokens: {
|
|
720
|
+
"{{PROMPT_DIR}}": ".github/prompts",
|
|
721
|
+
"{{SKILL_DIR}}": ".github/skills",
|
|
722
|
+
"{{INSTRUCTIONS_DIR}}": ".github/instructions",
|
|
723
|
+
"{{PROMPT_EXT}}": ".prompt.md",
|
|
724
|
+
"{{SKILL_EXT}}": ".md",
|
|
725
|
+
"{{AI_FILE_EXT}}": ".instructions.md"
|
|
726
|
+
}
|
|
727
|
+
},
|
|
728
|
+
"claude-code": {
|
|
729
|
+
skillDir: ".claude/skills",
|
|
730
|
+
promptDir: ".claude/prompts",
|
|
731
|
+
instructionsDir: ".claude/instructions",
|
|
732
|
+
agentsDir: ".claude/agents",
|
|
733
|
+
skillExt: "md",
|
|
734
|
+
promptExt: "md",
|
|
735
|
+
instructionsExt: "md",
|
|
736
|
+
agentExt: "md",
|
|
737
|
+
tokens: {
|
|
738
|
+
"{{PROMPT_DIR}}": ".claude/prompts",
|
|
739
|
+
"{{SKILL_DIR}}": ".claude/skills",
|
|
740
|
+
"{{INSTRUCTIONS_DIR}}": ".claude/instructions",
|
|
741
|
+
"{{PROMPT_EXT}}": ".md",
|
|
742
|
+
"{{SKILL_EXT}}": ".md",
|
|
743
|
+
"{{AI_FILE_EXT}}": ".md"
|
|
744
|
+
}
|
|
745
|
+
},
|
|
746
|
+
cursor: {
|
|
747
|
+
skillDir: ".cursor/rules/skills",
|
|
748
|
+
promptDir: ".cursor/rules/prompts",
|
|
749
|
+
instructionsDir: ".cursor/rules",
|
|
750
|
+
agentsDir: ".cursor/rules/agents",
|
|
751
|
+
skillExt: "mdrules",
|
|
752
|
+
promptExt: "mdrules",
|
|
753
|
+
instructionsExt: "mdrules",
|
|
754
|
+
agentExt: "mdrules",
|
|
755
|
+
tokens: {
|
|
756
|
+
"{{PROMPT_DIR}}": ".cursor/rules/prompts",
|
|
757
|
+
"{{SKILL_DIR}}": ".cursor/rules/skills",
|
|
758
|
+
"{{INSTRUCTIONS_DIR}}": ".cursor/rules",
|
|
759
|
+
"{{PROMPT_EXT}}": ".mdrules",
|
|
760
|
+
"{{SKILL_EXT}}": ".mdrules",
|
|
761
|
+
"{{AI_FILE_EXT}}": ".mdrules"
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
};
|
|
765
|
+
function parseAiMeta(content) {
|
|
766
|
+
const match = content.match(/^---\n([\s\S]*?)\n---\n\n?/);
|
|
767
|
+
if (!match) return { meta: {}, body: content };
|
|
768
|
+
const meta = {};
|
|
769
|
+
for (const line of match[1].split("\n")) {
|
|
770
|
+
const colonIdx = line.indexOf(":");
|
|
771
|
+
if (colonIdx === -1) continue;
|
|
772
|
+
const key = line.slice(0, colonIdx).trim();
|
|
773
|
+
const val = line.slice(colonIdx + 1).trim().replace(/^"|"$/g, "");
|
|
774
|
+
if (key.startsWith("ai-")) meta[key.slice(3)] = val;
|
|
775
|
+
}
|
|
776
|
+
return { meta, body: content.slice(match[0].length) };
|
|
777
|
+
}
|
|
778
|
+
function applyTokens(content, tokens) {
|
|
779
|
+
let result = content;
|
|
780
|
+
for (const [token, value] of Object.entries(tokens)) {
|
|
781
|
+
result = result.split(token).join(value);
|
|
782
|
+
}
|
|
783
|
+
return result;
|
|
784
|
+
}
|
|
785
|
+
function cursorSkillDescription(relPath) {
|
|
786
|
+
const parts = relPath.split("/");
|
|
787
|
+
if (parts.length >= 2) {
|
|
788
|
+
const subdir = parts[parts.length - 2];
|
|
789
|
+
const name = parts[parts.length - 1].replace(/\.md$/, "");
|
|
790
|
+
if (subdir === "field-skills") return `Field component skill: ${name}`;
|
|
791
|
+
if (subdir === "template-skills") return `Template component skill: ${name}`;
|
|
792
|
+
if (subdir === "widget-skills") return `Widget component skill: ${name}`;
|
|
793
|
+
if (subdir === "design-system-extension-skills") return `DSE component skill: ${name}`;
|
|
794
|
+
}
|
|
795
|
+
return relPath.replace(/\.md$/, "").split("/").pop();
|
|
796
|
+
}
|
|
797
|
+
function planAiConfigs(aiCommonDir, targetDir, aiTool, options = {}) {
|
|
798
|
+
if (!fs2.existsSync(aiCommonDir)) return [];
|
|
799
|
+
const cfg = AI_GEN_CONFIGS[aiTool];
|
|
800
|
+
const { tokens } = cfg;
|
|
801
|
+
const planned = [];
|
|
802
|
+
const skillsSrc = path2.join(aiCommonDir, "skills");
|
|
803
|
+
if (fs2.existsSync(skillsSrc)) {
|
|
804
|
+
const walkSkills = (srcDir, relDir = "") => {
|
|
805
|
+
for (const entry of fs2.readdirSync(srcDir, { withFileTypes: true })) {
|
|
806
|
+
const relPath = relDir ? `${relDir}/${entry.name}` : entry.name;
|
|
807
|
+
const srcPath = path2.join(srcDir, entry.name);
|
|
808
|
+
if (entry.isDirectory()) {
|
|
809
|
+
walkSkills(srcPath, relPath);
|
|
810
|
+
} else if (entry.name.endsWith(".md")) {
|
|
811
|
+
const { body } = parseAiMeta(fs2.readFileSync(srcPath, "utf-8"));
|
|
812
|
+
let frontmatter = "";
|
|
813
|
+
if (aiTool === "cursor") {
|
|
814
|
+
const desc = cursorSkillDescription(relPath);
|
|
815
|
+
frontmatter = `---
|
|
816
|
+
description: ${desc}
|
|
817
|
+
alwaysApply: false
|
|
818
|
+
---
|
|
819
|
+
|
|
820
|
+
`;
|
|
821
|
+
}
|
|
822
|
+
const outName = `${entry.name.replace(/\.md$/, "")}.${cfg.skillExt}`;
|
|
823
|
+
planned.push({
|
|
824
|
+
destPath: path2.join(targetDir, cfg.skillDir, relDir, outName),
|
|
825
|
+
frontmatter,
|
|
826
|
+
body: applyTokens(body, tokens),
|
|
827
|
+
kind: "md"
|
|
828
|
+
});
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
};
|
|
832
|
+
walkSkills(skillsSrc);
|
|
833
|
+
}
|
|
834
|
+
const promptsSrc = path2.join(aiCommonDir, "prompts");
|
|
835
|
+
if (fs2.existsSync(promptsSrc)) {
|
|
836
|
+
const promptsDest = path2.join(targetDir, cfg.promptDir);
|
|
837
|
+
for (const entry of fs2.readdirSync(promptsSrc, { withFileTypes: true })) {
|
|
838
|
+
const srcPath = path2.join(promptsSrc, entry.name);
|
|
839
|
+
if (entry.name === "component-manifest.json") {
|
|
840
|
+
planned.push({
|
|
841
|
+
destPath: path2.join(promptsDest, entry.name),
|
|
842
|
+
frontmatter: "",
|
|
843
|
+
body: fs2.readFileSync(srcPath, "utf-8"),
|
|
844
|
+
kind: "json"
|
|
845
|
+
});
|
|
846
|
+
} else if (entry.name.endsWith(".md")) {
|
|
847
|
+
const { meta, body } = parseAiMeta(fs2.readFileSync(srcPath, "utf-8"));
|
|
848
|
+
const basename = entry.name.replace(/\.md$/, "");
|
|
849
|
+
let frontmatter = "";
|
|
850
|
+
if (aiTool === "copilot") {
|
|
851
|
+
frontmatter = `---
|
|
852
|
+
agent: agent
|
|
853
|
+
description: ${meta.description || basename}
|
|
854
|
+
---
|
|
855
|
+
|
|
856
|
+
`;
|
|
857
|
+
} else if (aiTool === "cursor") {
|
|
858
|
+
frontmatter = `---
|
|
859
|
+
description: Workflow prompt: ${basename}
|
|
860
|
+
alwaysApply: false
|
|
861
|
+
---
|
|
862
|
+
|
|
863
|
+
`;
|
|
864
|
+
}
|
|
865
|
+
planned.push({
|
|
866
|
+
destPath: path2.join(promptsDest, `${basename}.${cfg.promptExt}`),
|
|
867
|
+
frontmatter,
|
|
868
|
+
body: applyTokens(body, tokens),
|
|
869
|
+
kind: "md"
|
|
870
|
+
});
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
const instructionsSrc = path2.join(aiCommonDir, "instructions");
|
|
875
|
+
if (fs2.existsSync(instructionsSrc)) {
|
|
876
|
+
const instructionsDest = path2.join(targetDir, cfg.instructionsDir);
|
|
877
|
+
for (const entry of fs2.readdirSync(instructionsSrc, { withFileTypes: true })) {
|
|
878
|
+
if (!entry.name.endsWith(".md")) continue;
|
|
879
|
+
const { meta, body } = parseAiMeta(fs2.readFileSync(path2.join(instructionsSrc, entry.name), "utf-8"));
|
|
880
|
+
const basename = entry.name.replace(/\.md$/, "");
|
|
881
|
+
let frontmatter = "";
|
|
882
|
+
if (aiTool === "cursor") {
|
|
883
|
+
frontmatter = meta.globs ? `---
|
|
884
|
+
globs: ["${meta.globs}"]
|
|
885
|
+
---
|
|
886
|
+
|
|
887
|
+
` : `---
|
|
888
|
+
alwaysApply: false
|
|
889
|
+
---
|
|
890
|
+
|
|
891
|
+
`;
|
|
892
|
+
} else if (aiTool === "copilot") {
|
|
893
|
+
if (meta.globs) frontmatter = `---
|
|
894
|
+
applyTo: '${meta.globs}'
|
|
895
|
+
---
|
|
896
|
+
|
|
897
|
+
`;
|
|
898
|
+
}
|
|
899
|
+
planned.push({
|
|
900
|
+
destPath: path2.join(instructionsDest, `${basename}.${cfg.instructionsExt}`),
|
|
901
|
+
frontmatter,
|
|
902
|
+
body: applyTokens(body, tokens),
|
|
903
|
+
kind: "md"
|
|
904
|
+
});
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
const agentsSrc = path2.join(aiCommonDir, "agents");
|
|
908
|
+
if (fs2.existsSync(agentsSrc)) {
|
|
909
|
+
const agentsDest = path2.join(targetDir, cfg.agentsDir);
|
|
910
|
+
for (const entry of fs2.readdirSync(agentsSrc, { withFileTypes: true })) {
|
|
911
|
+
if (!entry.name.endsWith(".md")) continue;
|
|
912
|
+
const basename = entry.name.replace(/\.md$/, "");
|
|
913
|
+
const { meta, body } = parseAiMeta(fs2.readFileSync(path2.join(agentsSrc, entry.name), "utf-8"));
|
|
914
|
+
let frontmatter = "";
|
|
915
|
+
if (aiTool === "copilot") {
|
|
916
|
+
const description = applyTokens(meta.description || "", tokens);
|
|
917
|
+
const name = meta.name || basename.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
918
|
+
frontmatter = `---
|
|
919
|
+
description: "${description}"
|
|
920
|
+
name: '${name}'
|
|
921
|
+
user-invocable: true
|
|
922
|
+
disable-model-invocation: false
|
|
923
|
+
---
|
|
924
|
+
|
|
925
|
+
`;
|
|
926
|
+
} else if (aiTool === "cursor") {
|
|
927
|
+
const description = applyTokens(meta.description || `Agent config: ${basename}`, tokens);
|
|
928
|
+
frontmatter = `---
|
|
929
|
+
description: ${description}
|
|
930
|
+
alwaysApply: false
|
|
931
|
+
---
|
|
932
|
+
|
|
933
|
+
`;
|
|
934
|
+
} else if (aiTool === "claude-code") {
|
|
935
|
+
const description = applyTokens(meta.description || `Agent config: ${basename}`, tokens);
|
|
936
|
+
frontmatter = `---
|
|
937
|
+
name: ${basename}
|
|
938
|
+
description: "${description}"
|
|
939
|
+
---
|
|
940
|
+
|
|
941
|
+
`;
|
|
942
|
+
}
|
|
943
|
+
planned.push({
|
|
944
|
+
destPath: path2.join(agentsDest, `${basename}.${cfg.agentExt}`),
|
|
945
|
+
frontmatter,
|
|
946
|
+
body: applyTokens(body, tokens),
|
|
947
|
+
kind: "md"
|
|
948
|
+
});
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
const globalSrc = path2.join(aiCommonDir, "global", options.globalFile ?? "ai-agent-instructions.md");
|
|
952
|
+
if (fs2.existsSync(globalSrc)) {
|
|
953
|
+
const body = applyTokens(fs2.readFileSync(globalSrc, "utf-8"), tokens);
|
|
954
|
+
if (aiTool === "copilot") {
|
|
955
|
+
planned.push({
|
|
956
|
+
destPath: path2.join(targetDir, ".github", "copilot-instructions.md"),
|
|
957
|
+
frontmatter: "",
|
|
958
|
+
body,
|
|
959
|
+
kind: "md"
|
|
960
|
+
});
|
|
961
|
+
} else if (aiTool === "cursor") {
|
|
962
|
+
planned.push({
|
|
963
|
+
destPath: path2.join(targetDir, ".cursor", "rules", "pega-sdk.mdrules"),
|
|
964
|
+
frontmatter: "---\ndescription: Core rules for working with Pega SDK components\nalwaysApply: true\n---\n\n",
|
|
965
|
+
body,
|
|
966
|
+
kind: "md"
|
|
967
|
+
});
|
|
968
|
+
} else if (aiTool === "claude-code") {
|
|
969
|
+
planned.push({
|
|
970
|
+
destPath: path2.join(targetDir, "AGENTS.md"),
|
|
971
|
+
frontmatter: "",
|
|
972
|
+
body,
|
|
973
|
+
kind: "md"
|
|
974
|
+
});
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
return planned;
|
|
978
|
+
}
|
|
979
|
+
function applyPlannedFiles(files, policy, options = {}) {
|
|
980
|
+
const { markers = true } = options;
|
|
981
|
+
const counts = {
|
|
982
|
+
created: 0,
|
|
983
|
+
"block-replaced": 0,
|
|
984
|
+
appended: 0,
|
|
985
|
+
overwritten: 0
|
|
986
|
+
};
|
|
987
|
+
for (const file of files) {
|
|
988
|
+
let outcome;
|
|
989
|
+
if (file.kind === "json") {
|
|
990
|
+
let parsed;
|
|
991
|
+
try {
|
|
992
|
+
parsed = markers ? JSON.parse(file.body) : void 0;
|
|
993
|
+
} catch {
|
|
994
|
+
parsed = void 0;
|
|
995
|
+
}
|
|
996
|
+
if (parsed === void 0) {
|
|
997
|
+
fs2.mkdirSync(path2.dirname(file.destPath), { recursive: true });
|
|
998
|
+
const existed = fs2.existsSync(file.destPath);
|
|
999
|
+
fs2.writeFileSync(file.destPath, file.body);
|
|
1000
|
+
counts[existed ? "overwritten" : "created"] += 1;
|
|
1001
|
+
continue;
|
|
1002
|
+
}
|
|
1003
|
+
outcome = writeManagedJson(file.destPath, parsed, policy);
|
|
1004
|
+
} else {
|
|
1005
|
+
outcome = writeManagedMarkdown(file.destPath, {
|
|
1006
|
+
frontmatter: file.frontmatter,
|
|
1007
|
+
body: file.body,
|
|
1008
|
+
policy,
|
|
1009
|
+
markers
|
|
1010
|
+
});
|
|
1011
|
+
}
|
|
1012
|
+
counts[outcome] += 1;
|
|
1013
|
+
}
|
|
1014
|
+
return counts;
|
|
1015
|
+
}
|
|
1016
|
+
function generateAiConfigs(targetDir, aiTool) {
|
|
1017
|
+
const aiCommonDir = path2.join(targetDir, ".ai-common");
|
|
1018
|
+
if (!fs2.existsSync(aiCommonDir)) return;
|
|
1019
|
+
applyPlannedFiles(planAiConfigs(aiCommonDir, targetDir, aiTool), "override", { markers: false });
|
|
1020
|
+
fs2.rmSync(aiCommonDir, { recursive: true });
|
|
1021
|
+
}
|
|
1022
|
+
var EMBEDDED_GLOBAL_FILE = "ai-agent-instructions-embedded.md";
|
|
1023
|
+
function resolveEmbeddedSource() {
|
|
1024
|
+
const templateSourceRoot = resolveTemplateSourceRoot();
|
|
1025
|
+
const sampleDir = path2.join(templateSourceRoot, FRAMEWORK_SAMPLE_MAP.react);
|
|
1026
|
+
const aiCommonSrc = path2.join(sampleDir, ".ai-common");
|
|
1027
|
+
if (!fs2.existsSync(aiCommonSrc)) {
|
|
1028
|
+
throw new Error(`AI common source not found at ${aiCommonSrc}. Ensure the template source is available.`);
|
|
1029
|
+
}
|
|
1030
|
+
return { sampleDir, aiCommonSrc };
|
|
1031
|
+
}
|
|
1032
|
+
var SDK_CONFIG_USER_KEYS = [
|
|
1033
|
+
"serverConfig.infinityRestServerUrl",
|
|
1034
|
+
"serverConfig.appAlias",
|
|
1035
|
+
"authConfig.mashupClientId",
|
|
1036
|
+
"authConfig.mashupUserIdentifier",
|
|
1037
|
+
"authConfig.portalClientId"
|
|
1038
|
+
];
|
|
1039
|
+
function buildSdkConfig(choices) {
|
|
1040
|
+
return {
|
|
1041
|
+
serverConfig: {
|
|
1042
|
+
infinityRestServerUrl: choices.serverUrl,
|
|
1043
|
+
appAlias: choices.appAlias,
|
|
1044
|
+
sdkContentServerUrl: "",
|
|
1045
|
+
appPortal: "",
|
|
1046
|
+
appMashupCaseType: "",
|
|
1047
|
+
excludePortals: [
|
|
1048
|
+
"pxExpress",
|
|
1049
|
+
"Developer",
|
|
1050
|
+
"pxPredictionStudio",
|
|
1051
|
+
"pxAdminStudio",
|
|
1052
|
+
"pyCaseWorker",
|
|
1053
|
+
"pyCaseManager7"
|
|
1054
|
+
]
|
|
1055
|
+
},
|
|
1056
|
+
authConfig: {
|
|
1057
|
+
authService: "pega",
|
|
1058
|
+
mashupClientId: choices.clientId,
|
|
1059
|
+
mashupUserIdentifier: choices.userIdentifier,
|
|
1060
|
+
mashupPassword: "",
|
|
1061
|
+
portalClientId: choices.clientId,
|
|
1062
|
+
portalClientSecret: "",
|
|
1063
|
+
portalGrantType: ""
|
|
1064
|
+
}
|
|
1065
|
+
};
|
|
1066
|
+
}
|
|
1067
|
+
function collectEmbeddedConflicts(targetDir, choices) {
|
|
1068
|
+
const { aiCommonSrc } = resolveEmbeddedSource();
|
|
1069
|
+
const planned = planAiConfigs(aiCommonSrc, targetDir, choices.aiTool, { globalFile: EMBEDDED_GLOBAL_FILE });
|
|
1070
|
+
const conflicts = planned.filter((file) => {
|
|
1071
|
+
if (file.kind !== "json") return isConflict(file.destPath);
|
|
1072
|
+
try {
|
|
1073
|
+
return isConflict(file.destPath, JSON.parse(file.body));
|
|
1074
|
+
} catch {
|
|
1075
|
+
return isConflict(file.destPath);
|
|
1076
|
+
}
|
|
1077
|
+
}).map((file) => file.destPath);
|
|
1078
|
+
const sdkConfigPath = path2.join(resolveStaticDir(targetDir), "sdk-config.json");
|
|
1079
|
+
if (isConflict(sdkConfigPath, buildSdkConfig(choices), SDK_CONFIG_USER_KEYS)) {
|
|
1080
|
+
conflicts.push(sdkConfigPath);
|
|
1081
|
+
}
|
|
1082
|
+
return conflicts.map((filePath) => path2.relative(targetDir, filePath));
|
|
1083
|
+
}
|
|
1084
|
+
async function scaffoldEmbedded(choices, targetDir, onProgress) {
|
|
1085
|
+
const report = (message) => onProgress?.(message);
|
|
1086
|
+
const { aiTool } = choices;
|
|
1087
|
+
const policy = choices.conflictPolicy ?? "merge";
|
|
1088
|
+
report("Locating embedded flow skills\u2026");
|
|
1089
|
+
const { sampleDir, aiCommonSrc } = resolveEmbeddedSource();
|
|
1090
|
+
report(`Generating ${aiTool} configuration\u2026`);
|
|
1091
|
+
const planned = planAiConfigs(aiCommonSrc, targetDir, aiTool, { globalFile: EMBEDDED_GLOBAL_FILE });
|
|
1092
|
+
const counts = applyPlannedFiles(planned, policy);
|
|
1093
|
+
report(
|
|
1094
|
+
`Wrote ${planned.length} file(s): ${counts.created} new, ${counts["block-replaced"]} updated, ${counts.appended} merged, ${counts.overwritten} replaced.`
|
|
1095
|
+
);
|
|
1096
|
+
report("Copying SDK packages\u2026");
|
|
1097
|
+
const tgzFiles = fs2.readdirSync(sampleDir).filter((f) => f.endsWith(".tgz"));
|
|
1098
|
+
for (const tgz of tgzFiles) {
|
|
1099
|
+
const src = path2.join(sampleDir, tgz);
|
|
1100
|
+
const dest = path2.join(targetDir, tgz);
|
|
1101
|
+
fs2.copyFileSync(src, dest);
|
|
1102
|
+
}
|
|
1103
|
+
report("Adding SDK dependencies\u2026");
|
|
1104
|
+
const pkgJsonPath = path2.join(targetDir, "package.json");
|
|
1105
|
+
if (fs2.existsSync(pkgJsonPath)) {
|
|
1106
|
+
const pkgJson = JSON.parse(fs2.readFileSync(pkgJsonPath, "utf-8"));
|
|
1107
|
+
if (!pkgJson.dependencies) pkgJson.dependencies = {};
|
|
1108
|
+
const TGZ_PACKAGE_MAP = {
|
|
1109
|
+
"pega-auth": "@pega/auth",
|
|
1110
|
+
"pega-constellationjs": "@pega/constellationjs",
|
|
1111
|
+
"pega-sdk-react": "@pega/sdk-react",
|
|
1112
|
+
"pega-sdk-types": "@pega/sdk-types"
|
|
1113
|
+
};
|
|
1114
|
+
for (const tgz of tgzFiles) {
|
|
1115
|
+
const match = tgz.match(/^(pega-[\w-]+?)-\d/);
|
|
1116
|
+
if (match) {
|
|
1117
|
+
const pkgName = TGZ_PACKAGE_MAP[match[1]];
|
|
1118
|
+
if (pkgName) {
|
|
1119
|
+
pkgJson.dependencies[pkgName] = `file:${tgz}`;
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
fs2.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + "\n");
|
|
1124
|
+
}
|
|
1125
|
+
report("Creating SDK configuration\u2026");
|
|
1126
|
+
const staticDir = ensureStaticDir(targetDir);
|
|
1127
|
+
const sdkConfigPath = path2.join(staticDir, "sdk-config.json");
|
|
1128
|
+
writeManagedJson(sdkConfigPath, buildSdkConfig(choices), policy, SDK_CONFIG_USER_KEYS);
|
|
1129
|
+
if (staticDir !== targetDir && fs2.existsSync(path2.join(targetDir, "sdk-config.json"))) {
|
|
1130
|
+
report(`\u26A0\uFE0F A sdk-config.json also exists at the project root. The active one is ${sdkConfigPath}.`);
|
|
1131
|
+
}
|
|
1132
|
+
report("Installing dependencies (this may take a minute)\u2026");
|
|
1133
|
+
let installSucceeded = true;
|
|
1134
|
+
try {
|
|
1135
|
+
await runInstall(targetDir);
|
|
1136
|
+
} catch {
|
|
1137
|
+
installSucceeded = false;
|
|
1138
|
+
report(
|
|
1139
|
+
"\u26A0\uFE0F Dependency installation failed. Run your package manager manually, then copy OAuth callback assets (see below)."
|
|
1140
|
+
);
|
|
1141
|
+
}
|
|
1142
|
+
if (installSucceeded) {
|
|
1143
|
+
report("Copying OAuth callback assets\u2026");
|
|
1144
|
+
const authOAuthDir = path2.join(targetDir, "node_modules", "@pega", "auth", "lib", "oauth-client");
|
|
1145
|
+
if (fs2.existsSync(authOAuthDir)) {
|
|
1146
|
+
const authHtmlSrc = path2.join(authOAuthDir, "authDone.html");
|
|
1147
|
+
const authJsSrc = path2.join(authOAuthDir, "authDone.js");
|
|
1148
|
+
const lockSvgSrc = path2.join(authOAuthDir, "lock-closed-solid.svg");
|
|
1149
|
+
if (fs2.existsSync(authHtmlSrc)) fs2.copyFileSync(authHtmlSrc, path2.join(staticDir, "auth.html"));
|
|
1150
|
+
if (fs2.existsSync(authJsSrc)) fs2.copyFileSync(authJsSrc, path2.join(staticDir, "authDone.js"));
|
|
1151
|
+
if (fs2.existsSync(lockSvgSrc)) fs2.copyFileSync(lockSvgSrc, path2.join(staticDir, "lock-closed-solid.svg"));
|
|
1152
|
+
} else {
|
|
1153
|
+
report(
|
|
1154
|
+
"\u26A0\uFE0F Auth OAuth assets not found after install. Copy auth.html, authDone.js, and lock-closed-solid.svg manually to the served static directory."
|
|
1155
|
+
);
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
report("Done!");
|
|
1159
|
+
}
|
|
1160
|
+
function detectExistingProject(dir) {
|
|
1161
|
+
return fs2.existsSync(path2.join(dir, "package.json"));
|
|
1162
|
+
}
|
|
1163
|
+
function resolveStaticDir(targetDir) {
|
|
1164
|
+
const pkgJsonPath = path2.join(targetDir, "package.json");
|
|
1165
|
+
if (fs2.existsSync(pkgJsonPath)) {
|
|
1166
|
+
const pkgJson = JSON.parse(fs2.readFileSync(pkgJsonPath, "utf-8"));
|
|
1167
|
+
const allDeps = { ...pkgJson.dependencies, ...pkgJson.devDependencies };
|
|
1168
|
+
if (allDeps["next"] || allDeps["vite"] || allDeps["react-scripts"]) {
|
|
1169
|
+
return path2.join(targetDir, "public");
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
return targetDir;
|
|
1173
|
+
}
|
|
1174
|
+
function ensureStaticDir(targetDir) {
|
|
1175
|
+
const staticDir = resolveStaticDir(targetDir);
|
|
1176
|
+
fs2.mkdirSync(staticDir, { recursive: true });
|
|
1177
|
+
return staticDir;
|
|
1178
|
+
}
|
|
483
1179
|
function copyDir(src, dest) {
|
|
484
|
-
|
|
485
|
-
for (const entry of
|
|
1180
|
+
fs2.mkdirSync(dest, { recursive: true });
|
|
1181
|
+
for (const entry of fs2.readdirSync(src, { withFileTypes: true })) {
|
|
486
1182
|
if (SKIP_ENTRIES.has(entry.name)) continue;
|
|
487
|
-
const srcPath =
|
|
488
|
-
const destPath =
|
|
1183
|
+
const srcPath = path2.join(src, entry.name);
|
|
1184
|
+
const destPath = path2.join(dest, entry.name);
|
|
489
1185
|
if (entry.isDirectory()) {
|
|
490
1186
|
copyDir(srcPath, destPath);
|
|
491
1187
|
} else {
|
|
492
|
-
|
|
1188
|
+
fs2.copyFileSync(srcPath, destPath);
|
|
493
1189
|
}
|
|
494
1190
|
}
|
|
495
1191
|
}
|
|
496
1192
|
|
|
497
1193
|
// src/index.ts
|
|
1194
|
+
var require2 = createRequire(import.meta.url);
|
|
1195
|
+
var { version: sdkVersion } = require2("../package.json");
|
|
498
1196
|
async function main() {
|
|
499
1197
|
console.clear();
|
|
500
1198
|
p.intro(pc.bgCyan(pc.black(" @pega/sdk ")));
|
|
1199
|
+
p.log.info(`Using @pega/sdk v${sdkVersion}`);
|
|
501
1200
|
const args = process.argv.slice(2);
|
|
502
1201
|
const command = args[0];
|
|
503
1202
|
if (command !== "init") {
|
|
@@ -506,6 +1205,185 @@ async function main() {
|
|
|
506
1205
|
Usage: ${pc.cyan("npx @pega/sdk init")}`);
|
|
507
1206
|
process.exit(1);
|
|
508
1207
|
}
|
|
1208
|
+
const cwd = process.cwd();
|
|
1209
|
+
const projectMode = detectExistingProject(cwd) ? "embedded" : "new";
|
|
1210
|
+
if (projectMode === "embedded") {
|
|
1211
|
+
const continueEmbedded = await p.confirm({
|
|
1212
|
+
message: "An existing project was detected in this folder (package.json found). Would you like to continue and integrate the embedded flow into it?",
|
|
1213
|
+
initialValue: true
|
|
1214
|
+
});
|
|
1215
|
+
if (p.isCancel(continueEmbedded) || !continueEmbedded) {
|
|
1216
|
+
p.cancel("Operation cancelled.");
|
|
1217
|
+
process.exit(0);
|
|
1218
|
+
}
|
|
1219
|
+
} else {
|
|
1220
|
+
p.log.info(pc.dim("No existing project detected in this folder \u2014 continuing with the new-project flow."));
|
|
1221
|
+
}
|
|
1222
|
+
if (projectMode === "embedded") {
|
|
1223
|
+
p.log.info(pc.dim("Let's set up Pega embedded flow in your existing project."));
|
|
1224
|
+
const aiAssisted = await p.confirm({
|
|
1225
|
+
message: "Would you like AI assistance to set up the embedded flow?",
|
|
1226
|
+
initialValue: true
|
|
1227
|
+
});
|
|
1228
|
+
if (p.isCancel(aiAssisted)) {
|
|
1229
|
+
p.cancel("Operation cancelled.");
|
|
1230
|
+
process.exit(0);
|
|
1231
|
+
}
|
|
1232
|
+
if (!aiAssisted) {
|
|
1233
|
+
p.log.info("Non-AI embedded flow is still under development. Stay tuned!");
|
|
1234
|
+
p.outro(pc.dim("No changes were made."));
|
|
1235
|
+
process.exit(0);
|
|
1236
|
+
}
|
|
1237
|
+
const embeddedAiTool = await p.select({
|
|
1238
|
+
message: "Which AI coding assistant do you use?",
|
|
1239
|
+
options: [
|
|
1240
|
+
{ value: "copilot", label: "GitHub Copilot" },
|
|
1241
|
+
{ value: "cursor", label: "Cursor" },
|
|
1242
|
+
{ value: "claude-code", label: "Claude Code" }
|
|
1243
|
+
]
|
|
1244
|
+
});
|
|
1245
|
+
if (p.isCancel(embeddedAiTool)) {
|
|
1246
|
+
p.cancel("Operation cancelled.");
|
|
1247
|
+
process.exit(0);
|
|
1248
|
+
}
|
|
1249
|
+
p.log.info(pc.dim("\nNow let's connect to your Pega server."));
|
|
1250
|
+
const serverUrl = await p.text({
|
|
1251
|
+
message: "What is your Pega server URL?",
|
|
1252
|
+
placeholder: "https://your-pega-server.com/prweb",
|
|
1253
|
+
validate(value) {
|
|
1254
|
+
if (!value) return "Server URL is required.";
|
|
1255
|
+
if (!value.startsWith("http")) return "Must be a valid URL starting with http:// or https://";
|
|
1256
|
+
}
|
|
1257
|
+
});
|
|
1258
|
+
if (p.isCancel(serverUrl)) {
|
|
1259
|
+
p.cancel("Operation cancelled.");
|
|
1260
|
+
process.exit(0);
|
|
1261
|
+
}
|
|
1262
|
+
const appAlias = await p.text({
|
|
1263
|
+
message: "What is your Pega application alias?",
|
|
1264
|
+
placeholder: "MyApp",
|
|
1265
|
+
validate(value) {
|
|
1266
|
+
if (!value) return "Application alias is required.";
|
|
1267
|
+
}
|
|
1268
|
+
});
|
|
1269
|
+
if (p.isCancel(appAlias)) {
|
|
1270
|
+
p.cancel("Operation cancelled.");
|
|
1271
|
+
process.exit(0);
|
|
1272
|
+
}
|
|
1273
|
+
const clientId = await p.text({
|
|
1274
|
+
message: "What is the OAuth Client ID for your app?",
|
|
1275
|
+
placeholder: "Your OAuth 2.0 client identifier",
|
|
1276
|
+
validate(value) {
|
|
1277
|
+
if (!value) return "Client ID is required for authentication.";
|
|
1278
|
+
}
|
|
1279
|
+
});
|
|
1280
|
+
if (p.isCancel(clientId)) {
|
|
1281
|
+
p.cancel("Operation cancelled.");
|
|
1282
|
+
process.exit(0);
|
|
1283
|
+
}
|
|
1284
|
+
const userIdentifier = await p.text({
|
|
1285
|
+
message: "What is the operator ID for the embedded session?",
|
|
1286
|
+
placeholder: "user@yourapp",
|
|
1287
|
+
validate(value) {
|
|
1288
|
+
if (!value) return "Operator ID is required.";
|
|
1289
|
+
}
|
|
1290
|
+
});
|
|
1291
|
+
if (p.isCancel(userIdentifier)) {
|
|
1292
|
+
p.cancel("Operation cancelled.");
|
|
1293
|
+
process.exit(0);
|
|
1294
|
+
}
|
|
1295
|
+
const embeddedTargetDir = cwd;
|
|
1296
|
+
p.note(
|
|
1297
|
+
[
|
|
1298
|
+
`${pc.bold("Mode")}: Embed Pega flow`,
|
|
1299
|
+
`${pc.bold("Directory")}: ${embeddedTargetDir}`,
|
|
1300
|
+
`${pc.bold("AI Tool")}: ${embeddedAiTool}`,
|
|
1301
|
+
`${pc.bold("Server")}: ${serverUrl}`,
|
|
1302
|
+
`${pc.bold("App Alias")}: ${appAlias}`,
|
|
1303
|
+
`${pc.bold("Client ID")}: ${clientId}`,
|
|
1304
|
+
`${pc.bold("Operator")}: ${userIdentifier}`
|
|
1305
|
+
].join("\n"),
|
|
1306
|
+
"Configuration"
|
|
1307
|
+
);
|
|
1308
|
+
const embeddedConfirmed = await p.confirm({
|
|
1309
|
+
message: "Looks good? Let's set it up.",
|
|
1310
|
+
initialValue: true
|
|
1311
|
+
});
|
|
1312
|
+
if (p.isCancel(embeddedConfirmed) || !embeddedConfirmed) {
|
|
1313
|
+
p.cancel("Operation cancelled.");
|
|
1314
|
+
process.exit(0);
|
|
1315
|
+
}
|
|
1316
|
+
const embeddedChoices = {
|
|
1317
|
+
aiTool: embeddedAiTool,
|
|
1318
|
+
serverUrl,
|
|
1319
|
+
appAlias,
|
|
1320
|
+
clientId,
|
|
1321
|
+
userIdentifier
|
|
1322
|
+
};
|
|
1323
|
+
let conflicts = [];
|
|
1324
|
+
try {
|
|
1325
|
+
conflicts = collectEmbeddedConflicts(embeddedTargetDir, embeddedChoices);
|
|
1326
|
+
} catch (err) {
|
|
1327
|
+
p.log.error(String(err));
|
|
1328
|
+
process.exit(1);
|
|
1329
|
+
}
|
|
1330
|
+
if (conflicts.length > 0) {
|
|
1331
|
+
const MAX_LISTED = 15;
|
|
1332
|
+
const listed = conflicts.slice(0, MAX_LISTED);
|
|
1333
|
+
const remaining = conflicts.length - listed.length;
|
|
1334
|
+
p.note(
|
|
1335
|
+
[...listed, ...remaining > 0 ? [pc.dim(`\u2026and ${remaining} more`)] : []].join("\n"),
|
|
1336
|
+
`Found ${conflicts.length} existing file(s)`
|
|
1337
|
+
);
|
|
1338
|
+
const policyResult = await p.select({
|
|
1339
|
+
message: "These files already exist. How should we handle them?",
|
|
1340
|
+
options: [
|
|
1341
|
+
{
|
|
1342
|
+
value: "merge",
|
|
1343
|
+
label: "Merge",
|
|
1344
|
+
hint: "keep your content and add Pega content in a marked block"
|
|
1345
|
+
},
|
|
1346
|
+
{
|
|
1347
|
+
value: "override",
|
|
1348
|
+
label: "Override",
|
|
1349
|
+
hint: "replace these files with the Pega versions"
|
|
1350
|
+
}
|
|
1351
|
+
],
|
|
1352
|
+
initialValue: "merge"
|
|
1353
|
+
});
|
|
1354
|
+
if (p.isCancel(policyResult)) {
|
|
1355
|
+
p.cancel("Operation cancelled.");
|
|
1356
|
+
process.exit(0);
|
|
1357
|
+
}
|
|
1358
|
+
embeddedChoices.conflictPolicy = policyResult;
|
|
1359
|
+
}
|
|
1360
|
+
const spinner3 = p.spinner();
|
|
1361
|
+
spinner3.start("Setting up embedded flow\u2026");
|
|
1362
|
+
try {
|
|
1363
|
+
await scaffoldEmbedded(embeddedChoices, embeddedTargetDir, (message) => {
|
|
1364
|
+
spinner3.message(message);
|
|
1365
|
+
});
|
|
1366
|
+
spinner3.stop("Embedded flow ready!");
|
|
1367
|
+
} catch (err) {
|
|
1368
|
+
spinner3.stop("Failed to set up embedded flow.");
|
|
1369
|
+
p.log.error(String(err));
|
|
1370
|
+
process.exit(1);
|
|
1371
|
+
}
|
|
1372
|
+
p.note(
|
|
1373
|
+
[
|
|
1374
|
+
"# Open your AI coding assistant and say:",
|
|
1375
|
+
'"Embed case [YOUR-CASE-TYPE] on click of [your button]"',
|
|
1376
|
+
"",
|
|
1377
|
+
"# The assistant will:",
|
|
1378
|
+
"1. Scan your codebase to understand your design system",
|
|
1379
|
+
"2. Generate Pega components matching your app's style",
|
|
1380
|
+
"3. Wire everything together so the case flow just works"
|
|
1381
|
+
].join("\n"),
|
|
1382
|
+
"Next Steps"
|
|
1383
|
+
);
|
|
1384
|
+
p.outro(pc.green("You're all set! Open your AI assistant and start embedding."));
|
|
1385
|
+
process.exit(0);
|
|
1386
|
+
}
|
|
509
1387
|
const nameResult = await p.text({
|
|
510
1388
|
message: "What is the name of your project?",
|
|
511
1389
|
placeholder: "my-pega-app",
|
|
@@ -562,12 +1440,12 @@ Usage: ${pc.cyan("npx @pega/sdk init")}`);
|
|
|
562
1440
|
{
|
|
563
1441
|
value: "react",
|
|
564
1442
|
label: "React",
|
|
565
|
-
hint: "Vite + React
|
|
1443
|
+
hint: "Vite + React 19 + @pega/sdk-react"
|
|
566
1444
|
},
|
|
567
1445
|
{
|
|
568
1446
|
value: "angular",
|
|
569
1447
|
label: "Angular",
|
|
570
|
-
hint: "Angular
|
|
1448
|
+
hint: "Angular 21 + @pega/sdk-angular"
|
|
571
1449
|
},
|
|
572
1450
|
{
|
|
573
1451
|
value: "web-components",
|
|
@@ -585,54 +1463,61 @@ Usage: ${pc.cyan("npx @pega/sdk init")}`);
|
|
|
585
1463
|
p.cancel("Operation cancelled.");
|
|
586
1464
|
process.exit(0);
|
|
587
1465
|
}
|
|
588
|
-
|
|
589
|
-
message: "Include starter component implementations? (scaffolds working component files you can customize)",
|
|
590
|
-
initialValue: true
|
|
591
|
-
});
|
|
592
|
-
if (p.isCancel(includeTemplates)) {
|
|
593
|
-
p.cancel("Operation cancelled.");
|
|
594
|
-
process.exit(0);
|
|
595
|
-
}
|
|
1466
|
+
let includeTemplates;
|
|
596
1467
|
let componentCategories = [];
|
|
597
|
-
if (
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
hint: "TextInput, Dropdown, Checkbox, Date, etc."
|
|
605
|
-
},
|
|
606
|
-
{
|
|
607
|
-
value: "templates",
|
|
608
|
-
label: "Templates",
|
|
609
|
-
hint: "OneColumn, TwoColumn, CaseView, DefaultForm, etc."
|
|
610
|
-
},
|
|
611
|
-
{
|
|
612
|
-
value: "widgets",
|
|
613
|
-
label: "Widgets",
|
|
614
|
-
hint: "Attachment, CaseHistory, ToDo, etc."
|
|
615
|
-
},
|
|
616
|
-
{
|
|
617
|
-
value: "infra",
|
|
618
|
-
label: "Infrastructure",
|
|
619
|
-
hint: "NavBar, ActionButtons, Stages, etc."
|
|
620
|
-
},
|
|
621
|
-
{
|
|
622
|
-
value: "designSystemExtension",
|
|
623
|
-
label: "Design System Extensions",
|
|
624
|
-
hint: "AlertBanner, FieldGroup, Pulse, etc."
|
|
625
|
-
}
|
|
626
|
-
],
|
|
627
|
-
required: true
|
|
1468
|
+
if (framework === "react-native") {
|
|
1469
|
+
includeTemplates = true;
|
|
1470
|
+
componentCategories = ["fields", "templates", "infra"];
|
|
1471
|
+
} else {
|
|
1472
|
+
const includeTemplatesResult = await p.confirm({
|
|
1473
|
+
message: "Include starter component implementations? (scaffolds working component files you can customize)",
|
|
1474
|
+
initialValue: true
|
|
628
1475
|
});
|
|
629
|
-
if (p.isCancel(
|
|
1476
|
+
if (p.isCancel(includeTemplatesResult)) {
|
|
630
1477
|
p.cancel("Operation cancelled.");
|
|
631
1478
|
process.exit(0);
|
|
632
1479
|
}
|
|
633
|
-
|
|
1480
|
+
includeTemplates = includeTemplatesResult;
|
|
1481
|
+
if (includeTemplates) {
|
|
1482
|
+
const categories = await p.multiselect({
|
|
1483
|
+
message: "Which component types do you want scaffolded?",
|
|
1484
|
+
options: [
|
|
1485
|
+
{
|
|
1486
|
+
value: "fields",
|
|
1487
|
+
label: "Fields",
|
|
1488
|
+
hint: "TextInput, Dropdown, Checkbox, Date, etc."
|
|
1489
|
+
},
|
|
1490
|
+
{
|
|
1491
|
+
value: "templates",
|
|
1492
|
+
label: "Templates",
|
|
1493
|
+
hint: "OneColumn, TwoColumn, CaseView, DefaultForm, etc."
|
|
1494
|
+
},
|
|
1495
|
+
{
|
|
1496
|
+
value: "widgets",
|
|
1497
|
+
label: "Widgets",
|
|
1498
|
+
hint: "Attachment, CaseHistory, ToDo, etc."
|
|
1499
|
+
},
|
|
1500
|
+
{
|
|
1501
|
+
value: "infra",
|
|
1502
|
+
label: "Infrastructure",
|
|
1503
|
+
hint: "NavBar, ActionButtons, Stages, etc."
|
|
1504
|
+
},
|
|
1505
|
+
{
|
|
1506
|
+
value: "designSystemExtension",
|
|
1507
|
+
label: "Design System Extensions",
|
|
1508
|
+
hint: "AlertBanner, FieldGroup, Pulse, etc."
|
|
1509
|
+
}
|
|
1510
|
+
],
|
|
1511
|
+
required: true
|
|
1512
|
+
});
|
|
1513
|
+
if (p.isCancel(categories)) {
|
|
1514
|
+
p.cancel("Operation cancelled.");
|
|
1515
|
+
process.exit(0);
|
|
1516
|
+
}
|
|
1517
|
+
componentCategories = categories;
|
|
1518
|
+
}
|
|
634
1519
|
}
|
|
635
|
-
const targetDir =
|
|
1520
|
+
const targetDir = path3.resolve(process.cwd(), projectName);
|
|
636
1521
|
p.note(
|
|
637
1522
|
[
|
|
638
1523
|
`${pc.bold("Project")}: ${projectName}`,
|