@pega/sdk 0.0.1 → 0.0.3
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/dist/index.js +2 -19
- package/package.json +4 -1
- package/templates/react-sdk-reference/.claude/instructions/component-map.md +38 -0
- package/templates/react-sdk-reference/.claude/instructions/dse-component.md +75 -0
- package/templates/react-sdk-reference/.claude/instructions/field-component.md +71 -0
- package/templates/react-sdk-reference/.claude/instructions/template-component.md +92 -0
- package/templates/react-sdk-reference/.claude/instructions/widget-component.md +87 -0
- package/templates/react-sdk-reference/.claude/prompts/add-component.md +144 -0
- package/templates/react-sdk-reference/.claude/prompts/component-manifest.json +111 -0
- package/templates/react-sdk-reference/.claude/prompts/generate-all-components.md +149 -0
- package/templates/react-sdk-reference/.claude/prompts/generate-dse-components.md +126 -0
- package/templates/react-sdk-reference/.claude/prompts/generate-field-components.md +139 -0
- package/templates/react-sdk-reference/.claude/prompts/generate-template-components.md +151 -0
- package/templates/react-sdk-reference/.claude/prompts/generate-widget-components.md +124 -0
- package/templates/react-sdk-reference/.claude/prompts/identify-components.md +105 -0
- package/templates/react-sdk-reference/.claude/prompts/replace-design-system.md +519 -0
- package/templates/react-sdk-reference/.claude/skills/component-contracts.md +140 -0
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/AlertBanner.md +135 -0
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/Banner.md +149 -0
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/CaseSummaryFields.md +154 -0
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/DetailsFields.md +144 -0
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldGroup.md +131 -0
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldGroupList.md +111 -0
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldValueList.md +115 -0
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/Operator.md +149 -0
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/Pulse.md +83 -0
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/RichTextEditor.md +206 -0
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/WssQuickCreate.md +135 -0
- package/templates/react-sdk-reference/.claude/skills/design-system-extension.md +289 -0
- package/templates/react-sdk-reference/.claude/skills/field-components.md +294 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/AutoComplete.md +112 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/CancelAlert.md +203 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Checkbox.md +158 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Currency.md +106 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Date.md +99 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/DateTime.md +103 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Decimal.md +98 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Dropdown.md +114 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Email.md +107 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Group.md +90 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Integer.md +87 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Location.md +136 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Multiselect.md +164 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/ObjectReference.md +164 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Percentage.md +92 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Phone.md +110 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/RadioButtons.md +146 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/RichText.md +138 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/ScalarList.md +124 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/SelectableCard.md +216 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/SemanticLink.md +148 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/TextArea.md +96 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/TextContent.md +101 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/TextInput.md +104 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/Time.md +88 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/URL.md +85 -0
- package/templates/react-sdk-reference/.claude/skills/field-skills/UserReference.md +180 -0
- package/templates/react-sdk-reference/.claude/skills/run-and-verify.md +68 -0
- package/templates/react-sdk-reference/.claude/skills/template-components.md +322 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/AdvancedSearch.md +144 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/AppShell.md +122 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/BannerPage.md +83 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/CaseSummary.md +100 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/CaseView.md +131 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/CaseViewActionsMenu.md +126 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/Confirmation.md +107 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/DataReference.md +120 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/DefaultForm.md +102 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/DefaultPage.md +110 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/Details.md +88 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsSubTabs.md +95 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsThreeColumn.md +78 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsTwoColumn.md +78 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/DynamicTabs.md +101 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/FieldGroupTemplate.md +109 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/HierarchicalForm.md +113 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/InlineDashboard.md +104 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/InlineDashboardPage.md +85 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/ListPage.md +68 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/ListView.md +139 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/MultiReferenceReadOnly.md +80 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/NarrowWide.md +141 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/OneColumn.md +109 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/PromotedFilters.md +124 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/SelfServiceCaseView.md +135 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/SimpleTable.md +127 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/SingleReferenceReadOnly.md +103 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/SubTabs.md +79 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/TwoColumn.md +131 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/WideNarrow.md +150 -0
- package/templates/react-sdk-reference/.claude/skills/template-skills/WssNavBar.md +135 -0
- package/templates/react-sdk-reference/.claude/skills/widget-components.md +271 -0
- package/templates/react-sdk-reference/.claude/skills/widget-skills/AppAnnouncement.md +82 -0
- package/templates/react-sdk-reference/.claude/skills/widget-skills/Attachment.md +146 -0
- package/templates/react-sdk-reference/.claude/skills/widget-skills/CaseHistory.md +107 -0
- package/templates/react-sdk-reference/.claude/skills/widget-skills/FileUtility.md +200 -0
- package/templates/react-sdk-reference/.claude/skills/widget-skills/Followers.md +99 -0
- package/templates/react-sdk-reference/.claude/skills/widget-skills/QuickCreate.md +114 -0
- package/templates/react-sdk-reference/.claude/skills/widget-skills/SummaryItem.md +167 -0
- package/templates/react-sdk-reference/.claude/skills/widget-skills/ToDo.md +190 -0
- package/templates/react-sdk-reference/.cursor/rules/component-map.mdrules +41 -0
- package/templates/react-sdk-reference/.cursor/rules/dse-component.mdrules +78 -0
- package/templates/react-sdk-reference/.cursor/rules/field-component.mdrules +74 -0
- package/templates/react-sdk-reference/.cursor/rules/pega-sdk.mdrules +247 -0
- package/templates/react-sdk-reference/.cursor/rules/prompts/add-component.mdrules +149 -0
- package/templates/react-sdk-reference/.cursor/rules/prompts/component-manifest.json +111 -0
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-all-components.mdrules +154 -0
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-dse-components.mdrules +131 -0
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-field-components.mdrules +144 -0
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-template-components.mdrules +156 -0
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-widget-components.mdrules +129 -0
- package/templates/react-sdk-reference/.cursor/rules/prompts/identify-components.mdrules +110 -0
- package/templates/react-sdk-reference/.cursor/rules/prompts/replace-design-system.mdrules +524 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/component-contracts.mdrules +145 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/AlertBanner.mdrules +140 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Banner.mdrules +154 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/CaseSummaryFields.mdrules +159 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/DetailsFields.mdrules +149 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldGroup.mdrules +136 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldGroupList.mdrules +116 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldValueList.mdrules +120 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Operator.mdrules +154 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Pulse.mdrules +88 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/RichTextEditor.mdrules +211 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/WssQuickCreate.mdrules +140 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension.mdrules +294 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-components.mdrules +299 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/AutoComplete.mdrules +117 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/CancelAlert.mdrules +208 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Checkbox.mdrules +163 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Currency.mdrules +111 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Date.mdrules +104 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/DateTime.mdrules +108 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Decimal.mdrules +103 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Dropdown.mdrules +119 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Email.mdrules +112 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Group.mdrules +95 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Integer.mdrules +92 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Location.mdrules +141 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Multiselect.mdrules +169 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/ObjectReference.mdrules +169 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Percentage.mdrules +97 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Phone.mdrules +115 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/RadioButtons.mdrules +151 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/RichText.mdrules +143 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/ScalarList.mdrules +129 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/SelectableCard.mdrules +221 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/SemanticLink.mdrules +153 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextArea.mdrules +101 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextContent.mdrules +106 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextInput.mdrules +109 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Time.mdrules +93 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/URL.mdrules +90 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/UserReference.mdrules +185 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/run-and-verify.mdrules +73 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-components.mdrules +327 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/AdvancedSearch.mdrules +149 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/AppShell.mdrules +127 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/BannerPage.mdrules +88 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseSummary.mdrules +105 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseView.mdrules +136 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseViewActionsMenu.mdrules +131 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/Confirmation.mdrules +112 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DataReference.mdrules +125 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DefaultForm.mdrules +107 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DefaultPage.mdrules +115 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/Details.mdrules +93 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsSubTabs.mdrules +100 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsThreeColumn.mdrules +83 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsTwoColumn.mdrules +83 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DynamicTabs.mdrules +106 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/FieldGroupTemplate.mdrules +114 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/HierarchicalForm.mdrules +118 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/InlineDashboard.mdrules +109 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/InlineDashboardPage.mdrules +90 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/ListPage.mdrules +73 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/ListView.mdrules +144 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/MultiReferenceReadOnly.mdrules +85 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/NarrowWide.mdrules +146 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/OneColumn.mdrules +114 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/PromotedFilters.mdrules +129 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SelfServiceCaseView.mdrules +140 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SimpleTable.mdrules +132 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SingleReferenceReadOnly.mdrules +108 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SubTabs.mdrules +84 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/TwoColumn.mdrules +136 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/WideNarrow.mdrules +155 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/WssNavBar.mdrules +140 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-components.mdrules +276 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/AppAnnouncement.mdrules +87 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/Attachment.mdrules +151 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/CaseHistory.mdrules +112 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/FileUtility.mdrules +205 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/Followers.mdrules +104 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/QuickCreate.mdrules +119 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/SummaryItem.mdrules +172 -0
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/ToDo.mdrules +195 -0
- package/templates/react-sdk-reference/.cursor/rules/template-component.mdrules +95 -0
- package/templates/react-sdk-reference/.cursor/rules/widget-component.mdrules +90 -0
- package/templates/react-sdk-reference/.github/copilot-instructions.md +58 -0
- package/templates/react-sdk-reference/.github/prompts/add-component.prompt.md +144 -16
- package/templates/react-sdk-reference/.github/prompts/generate-all-components.prompt.md +154 -0
- package/templates/react-sdk-reference/.github/prompts/generate-dse-components.prompt.md +131 -0
- package/templates/react-sdk-reference/.github/prompts/generate-field-components.prompt.md +144 -0
- package/templates/react-sdk-reference/.github/prompts/generate-template-components.prompt.md +156 -0
- package/templates/react-sdk-reference/.github/prompts/generate-widget-components.prompt.md +129 -0
- package/templates/react-sdk-reference/.github/skills/design-system-extension.md +58 -18
- package/templates/react-sdk-reference/.github/skills/field-components.md +55 -23
- package/templates/react-sdk-reference/.github/skills/template-components.md +48 -11
- package/templates/react-sdk-reference/.github/skills/widget-components.md +49 -12
- package/templates/react-sdk-reference/AGENTS.md +217 -29
- package/templates/react-sdk-reference/package.json +3 -2
- package/templates/react-sdk-reference/pega-auth-0.2.42.tgz +0 -0
- package/templates/react-sdk-reference/pega-constellationjs-0.26.3-local.tgz +0 -0
- package/templates/react-sdk-reference/pega-sdk-react-0.1.0.tgz +0 -0
- package/templates/react-sdk-reference/pega-sdk-types-0.1.0.tgz +0 -0
- package/templates/react-sdk-reference/sdk-config.json +1 -1
- package/templates/react-sdk-reference/vite.config.ts +1 -1
- package/templates/react-sdk-reference/.github/prompts/replace-all-fields.prompt.md +0 -48
- package/templates/react-sdk-reference/.github/prompts/replace-component.prompt.md +0 -81
- package/templates/react-sdk-reference/.github/prompts/replace-field.prompt.md +0 -41
- package/templates/react-sdk-reference/.github/prompts/swap-design-system.prompt.md +0 -49
- package/templates/react-sdk-reference/.github/skills/swap-design-system.md +0 -105
package/dist/index.js
CHANGED
|
@@ -343,9 +343,6 @@ var SKIP_ENTRIES = /* @__PURE__ */ new Set([
|
|
|
343
343
|
".expo",
|
|
344
344
|
".angular"
|
|
345
345
|
]);
|
|
346
|
-
function shouldSkipFile(name) {
|
|
347
|
-
return name.endsWith(".tgz");
|
|
348
|
-
}
|
|
349
346
|
async function scaffold(choices, targetDir, onProgress) {
|
|
350
347
|
const report = (message) => onProgress?.(message);
|
|
351
348
|
const {
|
|
@@ -413,7 +410,7 @@ async function scaffold(choices, targetDir, onProgress) {
|
|
|
413
410
|
}
|
|
414
411
|
}
|
|
415
412
|
if (!aiTool) {
|
|
416
|
-
for (const dir of [".github", ".cursor", "AGENTS.md"]) {
|
|
413
|
+
for (const dir of [".github", ".cursor", "AGENTS.md", ".claude"]) {
|
|
417
414
|
const target = path.join(targetDir, dir);
|
|
418
415
|
if (fs.existsSync(target)) {
|
|
419
416
|
fs.rmSync(target, { recursive: true });
|
|
@@ -423,7 +420,7 @@ async function scaffold(choices, targetDir, onProgress) {
|
|
|
423
420
|
const AI_TOOL_PATHS = {
|
|
424
421
|
copilot: [".github"],
|
|
425
422
|
cursor: [".cursor"],
|
|
426
|
-
"claude-code": ["AGENTS.md"]
|
|
423
|
+
"claude-code": ["AGENTS.md", ".claude"]
|
|
427
424
|
};
|
|
428
425
|
const allAiPaths = Object.values(AI_TOOL_PATHS).flat();
|
|
429
426
|
const keepPaths = AI_TOOL_PATHS[aiTool];
|
|
@@ -464,19 +461,6 @@ function transformPackageJson(pkgJsonPath, projectName) {
|
|
|
464
461
|
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
|
|
465
462
|
pkgJson.name = projectName;
|
|
466
463
|
delete pkgJson.private;
|
|
467
|
-
const fileDepsMap = {
|
|
468
|
-
"@pega/auth": "^0.2.42",
|
|
469
|
-
"@pega/constellationjs": "^0.26.2"
|
|
470
|
-
};
|
|
471
|
-
for (const section of ["dependencies", "devDependencies"]) {
|
|
472
|
-
const deps = pkgJson[section];
|
|
473
|
-
if (!deps) continue;
|
|
474
|
-
for (const [name, version] of Object.entries(deps)) {
|
|
475
|
-
if (typeof version === "string" && version.startsWith("file:")) {
|
|
476
|
-
deps[name] = fileDepsMap[name] || "*";
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
464
|
fs.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + "\n");
|
|
481
465
|
}
|
|
482
466
|
function transformTsConfig(tsconfigPath) {
|
|
@@ -541,7 +525,6 @@ function copyDir(src, dest) {
|
|
|
541
525
|
fs.mkdirSync(dest, { recursive: true });
|
|
542
526
|
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
543
527
|
if (SKIP_ENTRIES.has(entry.name)) continue;
|
|
544
|
-
if (!entry.isDirectory() && shouldSkipFile(entry.name)) continue;
|
|
545
528
|
const srcPath = path.join(src, entry.name);
|
|
546
529
|
const destPath = path.join(dest, entry.name);
|
|
547
530
|
if (entry.isDirectory()) {
|
package/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pega/sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Scaffold a Pega SDK application project",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"sdk": "./dist/index.js"
|
|
8
8
|
},
|
|
9
|
+
"publishConfig": {
|
|
10
|
+
"registry": "https://registry.npmjs.org/"
|
|
11
|
+
},
|
|
9
12
|
"files": [
|
|
10
13
|
"dist",
|
|
11
14
|
"templates",
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<!-- Applies to: **/component-map.ts -->
|
|
2
|
+
|
|
3
|
+
# Component Map Rules
|
|
4
|
+
|
|
5
|
+
The component map (`src/components/component-map.ts`) is the registry that maps Pega component names to React implementations.
|
|
6
|
+
|
|
7
|
+
## Structure
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import { sdkComponents } from '@pega/sdk-react';
|
|
11
|
+
|
|
12
|
+
function getSampleComponentMap() {
|
|
13
|
+
return {
|
|
14
|
+
...sdkComponents, // NEVER remove this — provides infrastructure
|
|
15
|
+
// Your components below:
|
|
16
|
+
TextInput,
|
|
17
|
+
Dropdown,
|
|
18
|
+
// ...
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Rules
|
|
24
|
+
|
|
25
|
+
1. **NEVER remove `...sdkComponents`** — it provides View, Region, Reference, RootContainer, FlowContainer, ViewContainer, Assignment, AssignmentCard, ErrorBoundary, MultiStep, CaseSummary, and their aliases.
|
|
26
|
+
|
|
27
|
+
2. **Map keys must match Pega component names exactly** — these are resolved at runtime by the platform. The key is what Pega sends; the value is your React component.
|
|
28
|
+
|
|
29
|
+
3. **To replace a component**: change its import path to your new implementation. Do NOT rename the key.
|
|
30
|
+
|
|
31
|
+
4. **To add a new component**: add the import + add a new key-value entry.
|
|
32
|
+
|
|
33
|
+
5. **Key naming exceptions** (where key differs from variable name):
|
|
34
|
+
- `Date: DateField` (Date is reserved in JS)
|
|
35
|
+
- `URL: URLComponent` (URL is a global)
|
|
36
|
+
- `Todo: ToDo` (casing difference)
|
|
37
|
+
|
|
38
|
+
6. **Keep the `registerSampleComponents` function** — it registers all entries into the `ComponentRegistry` instance used by the PConnect bridge.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<!-- Applies to: src/components/designSystemExtension/**/*.tsx -->
|
|
2
|
+
|
|
3
|
+
# Design System Extension Component Rules
|
|
4
|
+
|
|
5
|
+
When creating or modifying DSE components, follow these rules:
|
|
6
|
+
|
|
7
|
+
## What Are DSE Components?
|
|
8
|
+
|
|
9
|
+
Design System Extension components are display-focused presentational components. They sit between pure UI and data-fetching widgets. Some receive `getPConnect`, others receive only display props.
|
|
10
|
+
|
|
11
|
+
## Patterns
|
|
12
|
+
|
|
13
|
+
### Pattern A: With PConnect (data-aware display)
|
|
14
|
+
|
|
15
|
+
Used for: FieldValueList, CaseSummaryFields, DetailsFields
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import type { PConnProps } from '@pega/sdk-react';
|
|
19
|
+
|
|
20
|
+
interface FieldValueListProps extends PConnProps {
|
|
21
|
+
name?: string;
|
|
22
|
+
value?: string;
|
|
23
|
+
variant?: 'stacked' | 'inline';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export default function FieldValueList(props: FieldValueListProps) {
|
|
27
|
+
const { name, value, variant = 'inline' } = props;
|
|
28
|
+
// Render a label-value pair
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Pattern B: Without PConnect (pure presentation)
|
|
33
|
+
|
|
34
|
+
Used for: AlertBanner, Banner, Operator
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
interface AlertBannerProps {
|
|
38
|
+
variant: 'urgent' | 'warning' | 'info' | 'success';
|
|
39
|
+
heading?: string;
|
|
40
|
+
messages: Array<string | { label?: string; description?: string }>;
|
|
41
|
+
onClose?: () => void;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default function AlertBanner(props: AlertBannerProps) {
|
|
45
|
+
// Render an alert/notification banner
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Pattern C: Rich editor (extends PConnFieldProps)
|
|
50
|
+
|
|
51
|
+
Used for: RichTextEditor
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import type { PConnFieldProps } from '@pega/sdk-react';
|
|
55
|
+
|
|
56
|
+
interface RichTextEditorProps extends PConnFieldProps {
|
|
57
|
+
content?: string;
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Visual Preservation
|
|
62
|
+
|
|
63
|
+
The replacement must look the same as the original component:
|
|
64
|
+
|
|
65
|
+
1. **Read any `.css` file in the directory first.** Note every class's visual intent (spacing, sizing, colors, layout).
|
|
66
|
+
2. Replicate those styles via inline `style` props, the new design system's props/variants, or by keeping the CSS import — whichever produces the closest match.
|
|
67
|
+
3. Do NOT silently drop `makeStyles` classes — map each one to an equivalent style.
|
|
68
|
+
|
|
69
|
+
## Key Rules
|
|
70
|
+
|
|
71
|
+
- DSE components are the **most commonly referenced by other components** via `getComponentFromRegistry('FieldValueList')` — every field uses FieldValueList for display modes
|
|
72
|
+
- Keep the same export name (default export) and prop interface shape
|
|
73
|
+
- If you replace FieldValueList, ensure it accepts `name`, `value`, and optional `variant` props
|
|
74
|
+
- AlertBanner must handle the `messages` array format (both strings and `{label, description}` objects)
|
|
75
|
+
- Do NOT drop visual styles when removing `makeStyles` — always map them to an equivalent
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<!-- Applies to: src/components/field/**/*.tsx -->
|
|
2
|
+
|
|
3
|
+
# Field Component Rules
|
|
4
|
+
|
|
5
|
+
When creating or modifying field components, follow these rules:
|
|
6
|
+
|
|
7
|
+
## Required Structure
|
|
8
|
+
|
|
9
|
+
1. **Import types from `@pega/sdk-react`**:
|
|
10
|
+
```typescript
|
|
11
|
+
import type { PConnFieldProps } from '@pega/sdk-react';
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
2. **Define a props interface extending `PConnFieldProps`**:
|
|
15
|
+
```typescript
|
|
16
|
+
interface MyFieldProps extends PConnFieldProps {
|
|
17
|
+
// additional props specific to this field
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
3. **Export as default function component**:
|
|
22
|
+
```typescript
|
|
23
|
+
export default function MyField(props: MyFieldProps) { ... }
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Required Behaviors
|
|
27
|
+
|
|
28
|
+
1. **Extract standard props**: `getPConnect`, `label`, `required`, `disabled`, `value`, `validatemessage`, `status`, `readOnly`, `testId`, `helperText`, `displayMode`, `hideLabel`, `placeholder`
|
|
29
|
+
|
|
30
|
+
2. **Get PConnect APIs**:
|
|
31
|
+
```typescript
|
|
32
|
+
const pConn = getPConnect();
|
|
33
|
+
const actions = pConn.getActionsApi();
|
|
34
|
+
const propName = (pConn.getStateProps() as any).value;
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
3. **Handle displayMode** (MUST be before the main return):
|
|
38
|
+
```typescript
|
|
39
|
+
if (displayMode === 'DISPLAY_ONLY') {
|
|
40
|
+
return <FieldValueList name={hideLabel ? '' : label} value={value} />;
|
|
41
|
+
}
|
|
42
|
+
if (displayMode === 'STACKED_LARGE_VAL') {
|
|
43
|
+
return <FieldValueList name={hideLabel ? '' : label} value={value} variant='stacked' />;
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
4. **Use local state + blur pattern**:
|
|
48
|
+
- `onChange` → update local state only
|
|
49
|
+
- `onBlur` → call `handleEvent(actions, 'changeNblur', propName, localValue)`
|
|
50
|
+
|
|
51
|
+
5. **Show validation**: Display `validatemessage` and apply error styling when `status === 'error'`
|
|
52
|
+
|
|
53
|
+
6. **Pass test ID**: Set `data-test-id={testId}` on the interactive element
|
|
54
|
+
|
|
55
|
+
7. **Use `getComponentFromRegistry('FieldValueList')`** — never hardcode FieldValueList import
|
|
56
|
+
|
|
57
|
+
## Visual Preservation
|
|
58
|
+
|
|
59
|
+
The replacement must look the same as the original component:
|
|
60
|
+
|
|
61
|
+
1. **Read any `.css` file in the directory first.** Note every class's visual intent (spacing, sizing, colors, layout).
|
|
62
|
+
2. Replicate those styles via inline `style` props, {{designSystem}} component props/variants, or by keeping the CSS import — whichever produces the closest match.
|
|
63
|
+
3. Do NOT silently drop `makeStyles` classes — map each one to an equivalent style.
|
|
64
|
+
|
|
65
|
+
## Do NOT
|
|
66
|
+
|
|
67
|
+
- Skip `displayMode` handling — it breaks read-only views
|
|
68
|
+
- Call `handleEvent` on every keystroke — only on blur
|
|
69
|
+
- Hardcode component imports for components that exist in the registry
|
|
70
|
+
- Remove the `handleEvent` import from `../../helpers/event-utils`
|
|
71
|
+
- Drop visual styles when removing `makeStyles` — always map them to an equivalent
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
<!-- Applies to: src/components/template/**/*.tsx -->
|
|
2
|
+
|
|
3
|
+
# Template Component Rules
|
|
4
|
+
|
|
5
|
+
When creating or modifying template/layout components, follow these rules:
|
|
6
|
+
|
|
7
|
+
## Required Structure
|
|
8
|
+
|
|
9
|
+
1. **Import types from `@pega/sdk-react`**:
|
|
10
|
+
```typescript
|
|
11
|
+
import type { PConnProps } from '@pega/sdk-react';
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
2. **Export as default function component**:
|
|
15
|
+
```typescript
|
|
16
|
+
export default function MyTemplate(props: MyTemplateProps) { ... }
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Template Categories
|
|
20
|
+
|
|
21
|
+
### Layout Templates (TwoColumn, OneColumn, NarrowWide, WideNarrow)
|
|
22
|
+
|
|
23
|
+
Receive React `children` directly:
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import type { PropsWithChildren, ReactElement } from 'react';
|
|
27
|
+
|
|
28
|
+
interface TwoColumnProps extends PConnProps {
|
|
29
|
+
templateCol?: string; // e.g. "1fr 1fr", "2fr 1fr"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default function TwoColumn(props: PropsWithChildren<TwoColumnProps>) {
|
|
33
|
+
const { children, templateCol = '1fr 1fr' } = props;
|
|
34
|
+
const childrenToRender = children as ReactElement[];
|
|
35
|
+
// Render childrenToRender[0], childrenToRender[1], etc. in grid columns
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Form/View Templates (DefaultForm, Details, CaseView)
|
|
40
|
+
|
|
41
|
+
Render children via `getPConnect().getChildren()`:
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
export default function DefaultForm(props: DefaultFormProps) {
|
|
45
|
+
const { getPConnect } = props;
|
|
46
|
+
const pConn = getPConnect();
|
|
47
|
+
const children = pConn.getChildren() as any[];
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<div>
|
|
51
|
+
{children.map((child, i) => (
|
|
52
|
+
<PConnectComponent key={i} getPConnect={() => child.getPConnect()} />
|
|
53
|
+
))}
|
|
54
|
+
</div>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Page Templates (OneColumnPage, TwoColumnPage)
|
|
60
|
+
|
|
61
|
+
Wrap a layout with page-level chrome (title, actions):
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
export default function OneColumnPage(props: PageProps) {
|
|
65
|
+
const { getPConnect, children } = props;
|
|
66
|
+
const pConn = getPConnect();
|
|
67
|
+
const title = pConn.getDataObject('')?.caseInfo?.name;
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<div>
|
|
71
|
+
<h1>{title}</h1>
|
|
72
|
+
{children}
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Visual Preservation
|
|
79
|
+
|
|
80
|
+
The replacement must look the same as the original component:
|
|
81
|
+
|
|
82
|
+
1. **Read any `.css` file in the directory first.** Note every class's visual intent (spacing, sizing, colors, layout).
|
|
83
|
+
2. Replicate those styles via inline `style` props, the new design system's layout props, or by keeping the CSS import — whichever produces the closest match.
|
|
84
|
+
3. Do NOT silently drop `makeStyles` classes — map each one to an equivalent style.
|
|
85
|
+
|
|
86
|
+
## Key Rules
|
|
87
|
+
|
|
88
|
+
- Use `PConnectComponent` from `@pega/sdk-react` to render PConnect children
|
|
89
|
+
- Grid proportions come from `templateCol` prop — parse it to calculate column ratios
|
|
90
|
+
- Templates must not call `handleEvent` or interact with field state
|
|
91
|
+
- Templates are layout-only — they arrange, not edit
|
|
92
|
+
- Do NOT drop column gap, padding, or alignment styles when removing MUI `Grid` — replicate them in the replacement layout
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
<!-- Applies to: src/components/widget/**/*.tsx -->
|
|
2
|
+
|
|
3
|
+
# Widget Component Rules
|
|
4
|
+
|
|
5
|
+
When creating or modifying widget components, follow these rules:
|
|
6
|
+
|
|
7
|
+
## Required Structure
|
|
8
|
+
|
|
9
|
+
1. **Import types from `@pega/sdk-react`**:
|
|
10
|
+
```typescript
|
|
11
|
+
import type { PConnProps } from '@pega/sdk-react';
|
|
12
|
+
// or PConnFieldProps if the widget behaves like a field (e.g., Attachment)
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
2. **Export as default function component**:
|
|
16
|
+
```typescript
|
|
17
|
+
export default function MyWidget(props: MyWidgetProps) { ... }
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Widget Patterns
|
|
21
|
+
|
|
22
|
+
### Data-Fetching Widget (ToDo, CaseHistory, Followers)
|
|
23
|
+
|
|
24
|
+
Fetches data from Pega data pages on mount:
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
export default function MyWidget(props: MyWidgetProps) {
|
|
28
|
+
const { getPConnect, datasource, headerText } = props;
|
|
29
|
+
const pConn = getPConnect();
|
|
30
|
+
const [data, setData] = useState<any[]>([]);
|
|
31
|
+
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
const context = pConn.getContextName();
|
|
34
|
+
PCore.getDataPageUtils()
|
|
35
|
+
.getDataAsync(datasource?.source, context, {})
|
|
36
|
+
.then((response: any) => {
|
|
37
|
+
setData(response.data || []);
|
|
38
|
+
});
|
|
39
|
+
}, []);
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<Card>
|
|
43
|
+
<CardHeader title={headerText} />
|
|
44
|
+
<CardContent>{/* render data */}</CardContent>
|
|
45
|
+
</Card>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Action Widget (ToDo)
|
|
51
|
+
|
|
52
|
+
Triggers case actions:
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
// Get assignments and trigger actions
|
|
56
|
+
import { getToDoAssignments } from '@pega/sdk-react';
|
|
57
|
+
|
|
58
|
+
const assignments = getToDoAssignments(getPConnect);
|
|
59
|
+
// Each assignment has: onClick callback, urgency, name, etc.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### File Widget (Attachment, FileUtility)
|
|
63
|
+
|
|
64
|
+
Handles file upload/download via PCore attachment APIs:
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
PCore.getAttachmentUtils().uploadAttachment(file, onUploadProgress, errorHandler, context);
|
|
68
|
+
PCore.getAttachmentUtils().downloadAttachment(attachmentId, context);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Visual Preservation
|
|
72
|
+
|
|
73
|
+
The replacement must look the same as the original component:
|
|
74
|
+
|
|
75
|
+
1. **Read any `.css` file in the directory first.** Note every class's visual intent (spacing, sizing, colors, layout).
|
|
76
|
+
2. Replicate those styles via inline `style` props, the new design system's component props/variants, or by keeping the CSS import — whichever produces the closest match.
|
|
77
|
+
3. Do NOT silently drop `makeStyles` classes — map each one to an equivalent style.
|
|
78
|
+
|
|
79
|
+
## Key Rules
|
|
80
|
+
|
|
81
|
+
- Widgets are self-contained — they manage their own data fetching
|
|
82
|
+
- Use `PCore.getDataPageUtils()` for data page access
|
|
83
|
+
- Use `PCore.getAttachmentUtils()` for file operations
|
|
84
|
+
- Always handle loading and error states
|
|
85
|
+
- Widgets may use `PCore.getPubSubUtils()` to subscribe to events
|
|
86
|
+
- Clean up subscriptions in `useEffect` return function
|
|
87
|
+
- Do NOT drop card padding, list item spacing, or avatar sizing when removing MUI components — replicate them in the replacement
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
## Step 0 — Resolve missing information
|
|
2
|
+
|
|
3
|
+
Read the user's message carefully. Extract:
|
|
4
|
+
|
|
5
|
+
- **Component name** — the exact name (e.g. `AutoComplete`, `DatePicker`)
|
|
6
|
+
- **Component type** — one of: `field` | `template` | `widget` | `designSystemExtension`
|
|
7
|
+
- **Design system** — the UI library to use (e.g. `Ant Design`, `Chakra UI`, `Carbon`, `Radix UI`)
|
|
8
|
+
- **Output path** — the exact or relative path where the component should be generated (e.g. `src/components/field/AutoComplete`)
|
|
9
|
+
|
|
10
|
+
If any of the four are missing or ambiguous, ask the user all unresolved items in **one numbered list** and wait for their answers before continuing. Do not guess or proceed with assumptions.
|
|
11
|
+
|
|
12
|
+
Example questions to ask (only ask the ones that are actually missing):
|
|
13
|
+
1. Which design system should I use? (e.g. Ant Design, Chakra UI, Carbon, Radix UI)
|
|
14
|
+
2. What is the exact component name?
|
|
15
|
+
3. What type of component is this? (field / template / widget / designSystemExtension)
|
|
16
|
+
4. What is the exact or relative path where the component should be generated? (e.g. `src/components/field/AutoComplete`)
|
|
17
|
+
|
|
18
|
+
### Case-insensitive component name matching
|
|
19
|
+
|
|
20
|
+
The user may enter the component name in any casing (e.g. `autocomplete`, `Autocomplete`, `autoComplete`). It is your responsibility to match it to the correct canonical name by checking the skill files in `.claude/skills/field-skills/`, `.claude/skills/template-skills/`, `.claude/skills/widget-skills/`, and `.claude/skills/design-system-extension-skills/`. For example, if the user types `autocomplete`, match it to `AutoComplete`.
|
|
21
|
+
|
|
22
|
+
Once all four are known, continue to Step 1.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Step 1 — Check for existing component (overwrite check)
|
|
27
|
+
|
|
28
|
+
Before generating, check if a component already exists at the resolved output path:
|
|
29
|
+
|
|
30
|
+
1. Check if `<outputPath>/<ComponentName>.tsx` (or the directory) already exists.
|
|
31
|
+
2. If it **does exist**, ask the user: _"A component named `<ComponentName>` already exists at `<outputPath>`. Do you want to overwrite it with the new implementation?"_
|
|
32
|
+
- If the user says **yes**, proceed to overwrite.
|
|
33
|
+
- If the user says **no**, stop and skip generation.
|
|
34
|
+
3. If it **does not exist**, continue to Step 2.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Step 2 — Check for skill files
|
|
39
|
+
|
|
40
|
+
Always read the **general type skill** for the component type:
|
|
41
|
+
|
|
42
|
+
| Component Type | General Skill File |
|
|
43
|
+
|---|---|
|
|
44
|
+
| `field` | `.claude/skills/field-components.md` |
|
|
45
|
+
| `template` | `.claude/skills/template-components.md` |
|
|
46
|
+
| `widget` | `.claude/skills/widget-components.md` |
|
|
47
|
+
| `designSystemExtension` | `.claude/skills/design-system-extension.md` |
|
|
48
|
+
|
|
49
|
+
Then look for a **component-specific skill** based on the component type:
|
|
50
|
+
|
|
51
|
+
| Component Type | Specific Skill Location |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `field` | `.claude/skills/field-skills/<ComponentName>.md` |
|
|
54
|
+
| `template` | `.claude/skills/template-skills/<ComponentName>.md` |
|
|
55
|
+
| `widget` | `.claude/skills/widget-skills/<ComponentName>.md` |
|
|
56
|
+
| `designSystemExtension` | `.claude/skills/design-system-extension-skills/<ComponentName>.md` |
|
|
57
|
+
|
|
58
|
+
If the component-specific skill file exists, read it fully. Pay special attention to:
|
|
59
|
+
- **Behavioral Contract** — state management, event handling, option loading, edge cases
|
|
60
|
+
- **Design System Mapping** table — the recommended component for the chosen design system
|
|
61
|
+
|
|
62
|
+
You must read **both** the general type skill and the component-specific skill (if it exists) before proceeding.
|
|
63
|
+
|
|
64
|
+
Examples:
|
|
65
|
+
- `AutoComplete` (field) → read `field-components.md` + `field-skills/AutoComplete.md`
|
|
66
|
+
- `AdvancedSearch` (template) → read `template-components.md` + `template-skills/AdvancedSearch.md`
|
|
67
|
+
- `AppAnnouncement` (widget) → read `widget-components.md` + `widget-skills/AppAnnouncement.md`
|
|
68
|
+
- `AlertBanner` (designSystemExtension) → read `design-system-extension.md` + `design-system-extension-skills/AlertBanner.md`
|
|
69
|
+
|
|
70
|
+
If no component-specific skill file exists, continue using the general pattern from the type skill.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Step 3 — Check and install dependencies
|
|
75
|
+
|
|
76
|
+
Run:
|
|
77
|
+
```
|
|
78
|
+
cat package.json | grep "<design-system-package>"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
If the design system package is **not** listed in `dependencies` or `devDependencies`, install it:
|
|
82
|
+
```
|
|
83
|
+
npm install <design-system-package>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Also install any peer dependencies documented in the package's README. Report what was installed.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Step 4 — Discover the design system's API
|
|
91
|
+
|
|
92
|
+
Before writing any code, inspect the installed package:
|
|
93
|
+
|
|
94
|
+
1. `cat node_modules/<designSystem>/README.md` — note the correct import path and usage patterns for the installed version.
|
|
95
|
+
2. `grep "^export" node_modules/<designSystem>/dist/index.d.ts 2>/dev/null || grep -rl "^export" node_modules/<designSystem> --include="index.d.ts" | head -3 | xargs grep "^export"` — lists every component actually exported by the installed version.
|
|
96
|
+
3. For every component you plan to use, read its TypeScript prop interface from the installed `.d.ts`:
|
|
97
|
+
`find node_modules/<designSystem> -name "ComponentName.d.ts" | head -3`, then `grep -A 40 "interface.*Props"` on the result.
|
|
98
|
+
4. Only use component names and prop names confirmed in those files. Do not rely on training knowledge of the API.
|
|
99
|
+
|
|
100
|
+
Also check:
|
|
101
|
+
- Whether the design system has a **form layout wrapper** (label + input + helper text) — use it instead of manual margins
|
|
102
|
+
- Whether it has **size/density/variant conventions** — use built-in props rather than custom padding
|
|
103
|
+
- Whether it has a **companion icons package** — read its exports before using any icon name; never guess icon names
|
|
104
|
+
- Whether it has a **tokens or CSS directory** — use design system CSS custom properties for spacing; never hardcode `px` values
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Step 5 — Generate the component
|
|
109
|
+
|
|
110
|
+
Create the component directory at the resolved output path (from Step 0).
|
|
111
|
+
|
|
112
|
+
Create `<ComponentName>.tsx` using the pattern for the component type:
|
|
113
|
+
|
|
114
|
+
- **field**: Extend `PConnFieldProps` from `@pega/sdk-react`. Extract `getPConnect`, `label`, `required`, `disabled`, `value`, `validatemessage`, `status`, `readOnly`, `testId`, `helperText`, `displayMode`, `hideLabel`, `placeholder`. Call `handleEvent(actions, 'changeNblur', propName, value)` on blur. Handle `displayMode === 'DISPLAY_ONLY'` and `'STACKED_LARGE_VAL'` using `getComponentFromRegistry('FieldValueList')`. Show `validatemessage` when `status === 'error'`. Pass `data-test-id={testId}` on the interactive element.
|
|
115
|
+
- **template**: Extend `PConnProps`, render children via the design system's grid/layout primitives
|
|
116
|
+
- **widget**: Extend `PConnProps`, fetch data via `PCore.getDataPageUtils()`
|
|
117
|
+
- **designSystemExtension**: Pure display props or extend `PConnProps`
|
|
118
|
+
|
|
119
|
+
Create `index.tsx`:
|
|
120
|
+
```typescript
|
|
121
|
+
export { default } from './<ComponentName>';
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Step 6 — Register in component-map.ts
|
|
127
|
+
|
|
128
|
+
Edit `src/components/component-map.ts`:
|
|
129
|
+
|
|
130
|
+
1. Add the import at the top of the file, in the correct section (Fields / Templates / Widgets / Design System Extension)
|
|
131
|
+
2. Add an entry in `getSampleComponentMap()` under the matching category comment
|
|
132
|
+
|
|
133
|
+
Do not restructure or reorder any existing entries.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Step 7 — Verify the build
|
|
138
|
+
|
|
139
|
+
Run:
|
|
140
|
+
```
|
|
141
|
+
npm run build
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
If build errors occur, fix them before reporting completion. Report what files were created and what was added to `component-map.ts`.
|