@pega/sdk 0.0.14 → 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +46 -6
  2. package/dist/index.js +50 -24
  3. package/package.json +42 -3
  4. package/templates/angular-sdk-reference/angular.json +1 -2
  5. package/templates/angular-sdk-reference/extra-webpack.config.cjs +23 -0
  6. package/templates/angular-sdk-reference/index.html +12 -0
  7. package/templates/angular-sdk-reference/package.json +0 -1
  8. package/templates/angular-sdk-reference/src/app/app.component.ts +15 -232
  9. package/templates/angular-sdk-reference/src/app/pconnect-renderer.component.ts +153 -0
  10. package/templates/angular-sdk-reference/src/components/fields/auto-complete/auto-complete.component.ts +58 -21
  11. package/templates/angular-sdk-reference/src/components/fields/checkbox/checkbox.component.ts +8 -3
  12. package/templates/angular-sdk-reference/src/components/fields/currency/currency.component.ts +22 -7
  13. package/templates/angular-sdk-reference/src/components/fields/date-input/date-input.component.ts +19 -6
  14. package/templates/angular-sdk-reference/src/components/fields/dropdown/dropdown.component.ts +24 -7
  15. package/templates/angular-sdk-reference/src/components/fields/email/email.component.ts +19 -6
  16. package/templates/angular-sdk-reference/src/components/fields/integer/integer.component.ts +19 -6
  17. package/templates/angular-sdk-reference/src/components/fields/phone/phone.component.ts +19 -6
  18. package/templates/angular-sdk-reference/src/components/fields/radio-buttons/radio-buttons.component.ts +16 -5
  19. package/templates/angular-sdk-reference/src/components/fields/text-area/text-area.component.ts +19 -6
  20. package/templates/angular-sdk-reference/src/components/fields/text-input/text-input.component.ts +19 -6
  21. package/templates/angular-sdk-reference/src/components/fields/url-input/url-input.component.ts +26 -7
  22. package/templates/angular-sdk-reference/src/components/helpers/sdk-helpers.ts +93 -0
  23. package/templates/angular-sdk-reference/src/components/infra/case-summary/case-summary.component.ts +8 -9
  24. package/templates/angular-sdk-reference/src/components/infra/case-view/case-view.component.ts +24 -12
  25. package/templates/angular-sdk-reference/src/components/infra/root-container/root-container.component.ts +21 -15
  26. package/templates/angular-sdk-reference/src/components/infra/stages/stages.component.ts +21 -10
  27. package/templates/angular-sdk-reference/src/components/infra/view/view.component.ts +14 -9
  28. package/templates/angular-sdk-reference/src/components/templates/default-form/default-form.component.ts +12 -8
  29. package/templates/angular-sdk-reference/tsconfig.app.json +13 -0
  30. package/templates/angular-sdk-reference/tsconfig.json +2 -5
  31. package/templates/react-sdk-reference/.ai-common/agents/embedded-flow-expert.md +65 -31
  32. package/templates/react-sdk-reference/.ai-common/agents/implementation-expert.md +74 -38
  33. package/templates/react-sdk-reference/.ai-common/global/ai-agent-instructions-embedded.md +33 -1
  34. package/templates/react-sdk-reference/.ai-common/global/ai-agent-instructions.md +57 -22
  35. package/templates/react-sdk-reference/.ai-common/instructions/embedded-component.md +25 -10
  36. package/templates/react-sdk-reference/.ai-common/prompts/add-component.md +40 -19
  37. package/templates/react-sdk-reference/.ai-common/prompts/component-manifest.json +55 -1
  38. package/templates/react-sdk-reference/.ai-common/prompts/embedded-component-manifest.md +26 -4
  39. package/templates/react-sdk-reference/.ai-common/prompts/generate-all-components.md +82 -33
  40. package/templates/react-sdk-reference/.ai-common/prompts/generate-dse-components.md +46 -26
  41. package/templates/react-sdk-reference/.ai-common/prompts/generate-embedded-components.md +28 -15
  42. package/templates/react-sdk-reference/.ai-common/prompts/generate-field-components.md +24 -6
  43. package/templates/react-sdk-reference/.ai-common/prompts/generate-infra-components.md +24 -6
  44. package/templates/react-sdk-reference/.ai-common/prompts/generate-template-components.md +24 -6
  45. package/templates/react-sdk-reference/.ai-common/prompts/generate-widget-components.md +24 -6
  46. package/templates/react-sdk-reference/.ai-common/prompts/identify-components.md +2 -0
  47. package/templates/react-sdk-reference/.ai-common/prompts/replace-design-system.md +44 -17
  48. package/templates/react-sdk-reference/.ai-common/skills/connect-pega-server.md +14 -1
  49. package/templates/react-sdk-reference/.ai-common/skills/design-system-extension-skills/AssignmentHeader.md +79 -0
  50. package/templates/react-sdk-reference/.ai-common/skills/design-system-extension-skills/Toast.md +96 -0
  51. package/templates/react-sdk-reference/.ai-common/skills/design-system-extension.md +56 -35
  52. package/templates/react-sdk-reference/.ai-common/skills/embedded-flow/analyze-customer-repo.md +29 -3
  53. package/templates/react-sdk-reference/.ai-common/skills/embedded-flow/run-and-verify-integration.md +97 -37
  54. package/templates/react-sdk-reference/.ai-common/skills/embedded-flow/wire-integration.md +91 -60
  55. package/templates/react-sdk-reference/.ai-common/skills/field-components.md +13 -1
  56. package/templates/react-sdk-reference/.ai-common/skills/infra-components.md +13 -1
  57. package/templates/react-sdk-reference/.ai-common/skills/portal-flow/run-and-verify-portal.md +290 -0
  58. package/templates/react-sdk-reference/.ai-common/skills/template-components.md +13 -1
  59. package/templates/react-sdk-reference/.ai-common/skills/widget-components.md +13 -1
  60. package/templates/react-sdk-reference/assets/icons/trash.svg +3 -0
  61. package/templates/react-sdk-reference/index.html +0 -1
  62. package/templates/react-sdk-reference/package.json +2 -2
  63. package/templates/react-sdk-reference/package.minimal.json +2 -2
  64. package/templates/react-sdk-reference/sdk-config.json +3 -3
  65. package/templates/react-sdk-reference/src/FallbackComponent.tsx +1 -1
  66. package/templates/react-sdk-reference/src/MashupApp.tsx +33 -78
  67. package/templates/react-sdk-reference/src/PortalApp.tsx +23 -100
  68. package/templates/react-sdk-reference/src/components/component-map.ts +15 -1
  69. package/templates/react-sdk-reference/src/components/designSystemExtension/AssignmentHeader/AssignmentHeader.tsx +15 -0
  70. package/templates/react-sdk-reference/src/components/designSystemExtension/AssignmentHeader/index.tsx +1 -0
  71. package/templates/react-sdk-reference/src/components/designSystemExtension/FieldGroup/FieldGroup.tsx +1 -1
  72. package/templates/react-sdk-reference/src/components/designSystemExtension/FieldGroupList/FieldGroupList.tsx +1 -1
  73. package/templates/react-sdk-reference/src/components/designSystemExtension/FieldValueList/FieldValueList.tsx +16 -4
  74. package/templates/react-sdk-reference/src/components/designSystemExtension/ModalDialog/ModalDialog.tsx +26 -0
  75. package/templates/react-sdk-reference/src/components/designSystemExtension/ModalDialog/index.tsx +1 -0
  76. package/templates/react-sdk-reference/src/components/designSystemExtension/Toast/Toast.tsx +35 -0
  77. package/templates/react-sdk-reference/src/components/designSystemExtension/Toast/index.tsx +1 -0
  78. package/templates/react-sdk-reference/src/components/field/AutoComplete/AutoComplete.tsx +362 -24
  79. package/templates/react-sdk-reference/src/components/field/CancelAlert/CancelAlert.tsx +1 -1
  80. package/templates/react-sdk-reference/src/components/field/Checkbox/Checkbox.tsx +3 -1
  81. package/templates/react-sdk-reference/src/components/field/Currency/Currency.tsx +6 -3
  82. package/templates/react-sdk-reference/src/components/field/Date/Date.tsx +2 -1
  83. package/templates/react-sdk-reference/src/components/field/DateTime/DateTime.tsx +2 -1
  84. package/templates/react-sdk-reference/src/components/field/Decimal/Decimal.tsx +4 -3
  85. package/templates/react-sdk-reference/src/components/field/Dropdown/Dropdown.tsx +2 -0
  86. package/templates/react-sdk-reference/src/components/field/Email/Email.tsx +2 -1
  87. package/templates/react-sdk-reference/src/components/field/EmbeddedDataMulti/EmbeddedDataMulti.tsx +121 -0
  88. package/templates/react-sdk-reference/src/components/field/EmbeddedDataMulti/config-ext.json +7 -0
  89. package/templates/react-sdk-reference/src/components/field/EmbeddedDataMulti/index.tsx +1 -0
  90. package/templates/react-sdk-reference/src/components/field/Integer/Integer.tsx +2 -1
  91. package/templates/react-sdk-reference/src/components/field/Location/Location.tsx +1 -1
  92. package/templates/react-sdk-reference/src/components/field/Multiselect/Multiselect.tsx +40 -20
  93. package/templates/react-sdk-reference/src/components/field/ObjectReference/ObjectReference.tsx +554 -49
  94. package/templates/react-sdk-reference/src/components/field/ObjectReference/utils.ts +111 -20
  95. package/templates/react-sdk-reference/src/components/field/Percentage/Percentage.tsx +4 -3
  96. package/templates/react-sdk-reference/src/components/field/Phone/Phone.tsx +2 -1
  97. package/templates/react-sdk-reference/src/components/field/SelectableCard/SelectableCard.tsx +2 -1
  98. package/templates/react-sdk-reference/src/components/field/TextArea/TextArea.tsx +2 -1
  99. package/templates/react-sdk-reference/src/components/field/TextInput/TextInput.tsx +2 -1
  100. package/templates/react-sdk-reference/src/components/field/Time/Time.tsx +2 -1
  101. package/templates/react-sdk-reference/src/components/field/URL/URL.tsx +2 -1
  102. package/templates/react-sdk-reference/src/components/field/UserReference/UserReference.tsx +1 -1
  103. package/templates/react-sdk-reference/src/components/helpers/field-utils.ts +44 -0
  104. package/templates/react-sdk-reference/src/components/helpers/simpleTableHelpers.ts +19 -7
  105. package/templates/react-sdk-reference/src/components/infra/ModalViewContainer/DataViewActionButtons/DataViewActionButtons.tsx +97 -0
  106. package/templates/react-sdk-reference/src/components/infra/ModalViewContainer/DataViewActionButtons/index.tsx +1 -0
  107. package/templates/react-sdk-reference/src/components/infra/ModalViewContainer/ListViewActionButtons/ListViewActionButtons.tsx +53 -0
  108. package/templates/react-sdk-reference/src/components/infra/ModalViewContainer/ListViewActionButtons/index.tsx +1 -0
  109. package/templates/react-sdk-reference/src/components/template/AdvancedSearch/SearchGroups/SearchGroups.tsx +2 -2
  110. package/templates/react-sdk-reference/src/components/template/CaseSummary/CaseSummary.tsx +3 -1
  111. package/templates/react-sdk-reference/src/components/template/DataReference/SearchForm.tsx +4 -4
  112. package/templates/react-sdk-reference/src/components/template/HierarchicalForm/HierarchicalForm.tsx +2 -2
  113. package/templates/react-sdk-reference/src/components/template/InlineDashboard/InlineDashboard.tsx +1 -1
  114. package/templates/react-sdk-reference/src/components/template/ListView/ListView.tsx +7 -3
  115. package/templates/react-sdk-reference/src/components/template/SimpleTable/SimpleTableManual/SimpleTableManual.tsx +173 -99
  116. package/templates/react-sdk-reference/src/components/template/SimpleTable/SimpleTableSelect/SimpleTableSelect.tsx +63 -56
  117. package/templates/react-sdk-reference/src/components/widget/ToDo/ToDo.tsx +1 -1
  118. package/templates/react-sdk-reference/vite.config.ts +26 -4
  119. package/templates/angular-sdk-reference/pega-constellationjs-0.26.3-local.tgz +0 -0
  120. package/templates/angular-sdk-reference/src/helpers/event-utils.ts +0 -18
  121. package/templates/angular-sdk-reference/src/helpers/utils.ts +0 -38
  122. package/templates/angular-sdk-reference/src/helpers/versionHelpers.ts +0 -14
  123. package/templates/react-sdk-reference/.ai-common/instructions/dse-component.md +0 -47
  124. package/templates/react-sdk-reference/.ai-common/instructions/field-component.md +0 -50
  125. package/templates/react-sdk-reference/.ai-common/instructions/infra-component.md +0 -76
  126. package/templates/react-sdk-reference/.ai-common/instructions/template-component.md +0 -43
  127. package/templates/react-sdk-reference/.ai-common/instructions/widget-component.md +0 -45
  128. package/templates/react-sdk-reference/.ai-common/skills/embedded-flow/authenticate.md +0 -311
  129. package/templates/react-sdk-reference/pega-constellationjs-0.26.3-local.tgz +0 -0
  130. package/templates/react-sdk-reference/pega-sdk-react-0.1.0.tgz +0 -0
@@ -2,6 +2,16 @@
2
2
  ai-description: Add a new component type to the registry
3
3
  ---
4
4
 
5
+ ## Progress milestones
6
+
7
+ Announce these to the user as you reach them, in plain words and with a counter — "Step 3 of 4 — Building the component". Count only the milestones that apply to this run.
8
+
9
+ 1. **Understanding your request** — Step 0
10
+ 2. **Preparing your design system** — Steps 1 to 3
11
+ 3. **Building the component** — Steps 5 and 6
12
+ 4. **Checking the app builds** — Step 7
13
+ 5. **Trying it out** — Step 8
14
+
5
15
  ## Step 0 — Resolve missing information
6
16
 
7
17
  Read the user's message carefully. Extract:
@@ -13,19 +23,23 @@ Read the user's message carefully. Extract:
13
23
 
14
24
  All four values above are required. If any are missing or ambiguous, you MUST stop and ask the user before proceeding. Do not infer any value from the project structure, `{{AI_FILE_EXT}}` files, existing folders, or any other source.
15
25
 
26
+ **One exception — component type.** Once the component name is resolved to a canonical name, take its type from `{{PROMPT_DIR}}/component-manifest.json` and ask the user to confirm it in plain words, in the same message as any other missing items — for example "I'll treat the date picker as a form field — is that right?". Ask the user for the type only when the name cannot be resolved. Every other value still comes from the user.
27
+
16
28
  ⛔ **STOP** — If the user's message does not explicitly provide ALL of: component name, component type, design system, and output path — ask for the missing items now. Do not proceed to Step 1 until you have explicit answers from the user for all required inputs.
17
29
 
18
- Example questions to ask (only ask the ones that are actually missing):
30
+ Ask every missing item together, in one plain message. Example questions to ask (only ask the ones that are actually missing):
19
31
 
20
- 1. Which design system should I use? (e.g. Ant Design, Chakra UI, Carbon, Radix UI)
21
- 2. What is the exact component name?
22
- 3. What type of component is this? (field / template / widget / designSystemExtension / infra)
32
+ 1. Which style kit should I use for the screens? (A style kit is a ready-made set of buttons, inputs, and layouts.) Before asking, check the project's dependency list for UI libraries and list any you find first, marked as already in the project, then offer Ant Design, Chakra UI, Carbon, Radix UI, or another. Never choose one on the user's behalf, even when only one is installed.
33
+ 2. Which piece of the screen should I build? (Describe it in your own words if you don't know its name.)
34
+ 3. What kind of piece is this — a form field, a page layout, a panel, a display piece, or one of the buttons or progress indicators? (Only when the name could not be resolved; otherwise confirm the type as described above.)
23
35
  4. What is the exact or relative path where the component should be generated? (e.g. `src/components/field/AutoComplete`)
24
36
 
25
37
  ### Case-insensitive component name matching
26
38
 
27
39
  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 `{{SKILL_DIR}}/field-skills/`, `{{SKILL_DIR}}/template-skills/`, `{{SKILL_DIR}}/widget-skills/`, `{{SKILL_DIR}}/design-system-extension-skills/`, and `{{SKILL_DIR}}/infra-skills/`. For example, if the user types `autocomplete`, match it to `AutoComplete`.
28
40
 
41
+ The user may also describe the component in everyday words ("date picker", "the buttons at the bottom"). Resolve those through the `aliases` and `behaviorClasses` in `{{PROMPT_DIR}}/component-manifest.json`, and confirm the match with the user before continuing. If nothing matches, ask the user which piece they mean — never guess.
42
+
29
43
  Once all four are known, continue to Step 1.
30
44
 
31
45
  ---
@@ -36,6 +50,7 @@ Before generating, check if a component already exists at the resolved output pa
36
50
 
37
51
  1. Check if the component file or directory already exists at the resolved output path.
38
52
  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?"_
53
+ - Ask it in plain words, naming the piece exactly as the user did — for example _"You already have a date picker. Replace it with the new one, or keep yours?"_. If they called it "combo box", say "combo box"; never swap in a synonym or the component name. If the user did not name it, use `<ComponentName> – plain description` (the first summary line of its skill file, reworded into a few plain words). "Replace" means **yes**, "keep" means **no**.
39
54
  - If the user says **yes**, proceed to overwrite.
40
55
  - If the user says **no**, stop and skip generation.
41
56
  3. If it **does not exist**, continue to Step 2.
@@ -46,25 +61,25 @@ Before generating, check if a component already exists at the resolved output pa
46
61
 
47
62
  Always read the **general type skill** for the component type:
48
63
 
49
- | Component Type | General Skill File |
50
- | ----------------------- | ------------------------------------------ |
51
- | `field` | `{{SKILL_DIR}}/field-components.md` |
52
- | `template` | `{{SKILL_DIR}}/template-components.md` |
53
- | `widget` | `{{SKILL_DIR}}/widget-components.md` |
54
- | `designSystemExtension` | `{{SKILL_DIR}}/design-system-extension.md` |
55
- | `infra` | `{{SKILL_DIR}}/infra-components.md` |
64
+ | Component Type | General Skill File |
65
+ | ----------------------- | ---------------------------------------------------- |
66
+ | `field` | `{{SKILL_DIR}}/field-components{{SKILL_EXT}}` |
67
+ | `template` | `{{SKILL_DIR}}/template-components{{SKILL_EXT}}` |
68
+ | `widget` | `{{SKILL_DIR}}/widget-components{{SKILL_EXT}}` |
69
+ | `designSystemExtension` | `{{SKILL_DIR}}/design-system-extension{{SKILL_EXT}}` |
70
+ | `infra` | `{{SKILL_DIR}}/infra-components{{SKILL_EXT}}` |
56
71
 
57
72
  Only three `infra` components may be added — `ActionButtons`, `Stages`, and `MultiStep`. Every other infrastructure component is SDK-provided; if the user names one, stop and tell them it is not generated.
58
73
 
59
74
  Then look for a **component-specific skill** based on the component type:
60
75
 
61
- | Component Type | Specific Skill Location |
62
- | ----------------------- | ----------------------------------------------------------------- |
63
- | `field` | `{{SKILL_DIR}}/field-skills/<ComponentName>.md` |
64
- | `template` | `{{SKILL_DIR}}/template-skills/<ComponentName>.md` |
65
- | `widget` | `{{SKILL_DIR}}/widget-skills/<ComponentName>.md` |
66
- | `designSystemExtension` | `{{SKILL_DIR}}/design-system-extension-skills/<ComponentName>.md` |
67
- | `infra` | `{{SKILL_DIR}}/infra-skills/<ComponentName>.md` |
76
+ | Component Type | Specific Skill Location |
77
+ | ----------------------- | --------------------------------------------------------------------------- |
78
+ | `field` | `{{SKILL_DIR}}/field-skills/<ComponentName>{{SKILL_EXT}}` |
79
+ | `template` | `{{SKILL_DIR}}/template-skills/<ComponentName>{{SKILL_EXT}}` |
80
+ | `widget` | `{{SKILL_DIR}}/widget-skills/<ComponentName>{{SKILL_EXT}}` |
81
+ | `designSystemExtension` | `{{SKILL_DIR}}/design-system-extension-skills/<ComponentName>{{SKILL_EXT}}` |
82
+ | `infra` | `{{SKILL_DIR}}/infra-skills/<ComponentName>{{SKILL_EXT}}` |
68
83
 
69
84
  If the component-specific skill file exists, read it fully. Pay special attention to:
70
85
 
@@ -157,7 +172,7 @@ If a component-specific skill file exists, follow its Behavioral Contract for da
157
172
 
158
173
  ### designSystemExtension
159
174
 
160
- Follow the implementation structure described in `design-system-extension.md` (read in Step 2). That file specifies the pattern variants (pure display, PConnect display, complex display) for this project's framework.
175
+ Follow the implementation structure described in `design-system-extension.md` (read in Step 2). That file specifies the pattern variants (pure display, data display, complex display) for this project's framework.
161
176
 
162
177
  ---
163
178
 
@@ -191,3 +206,9 @@ Do not restructure or reorder any existing entries.
191
206
  Run the project's build process to confirm everything compiles without errors.
192
207
 
193
208
  If build errors occur, diagnose and fix them before reporting completion. Report what files were created and what was registered in the component map.
209
+
210
+ ---
211
+
212
+ ## Step 8 — Try the portal
213
+
214
+ Once the Step 7 build passes, read and execute `{{SKILL_DIR}}/portal-flow/run-and-verify-portal{{SKILL_EXT}}`, handing it the component you added. Report its verification summary together with the Step 7 report.
@@ -18,6 +18,24 @@
18
18
  ]
19
19
  }
20
20
  },
21
+ "scopeAliases": {
22
+ "form fields": "field",
23
+ "fields": "field",
24
+ "inputs": "field",
25
+ "page layouts": "template",
26
+ "layouts": "template",
27
+ "templates": "template",
28
+ "panels": "widget",
29
+ "widgets": "widget",
30
+ "display pieces": "designSystemExtension",
31
+ "banners and messages": "designSystemExtension",
32
+ "buttons and progress bars": "infra",
33
+ "forms": "workflow-form",
34
+ "the forms": "workflow-form",
35
+ "the whole app": "all",
36
+ "everything": "all",
37
+ "all components": "all"
38
+ },
21
39
  "components": {
22
40
  "field": [
23
41
  { "name": "AutoComplete", "path": "src/components/field/AutoComplete" },
@@ -163,6 +181,10 @@
163
181
  "name": "AlertBanner",
164
182
  "path": "src/components/designSystemExtension/AlertBanner"
165
183
  },
184
+ {
185
+ "name": "AssignmentHeader",
186
+ "path": "src/components/designSystemExtension/AssignmentHeader"
187
+ },
166
188
  {
167
189
  "name": "Banner",
168
190
  "path": "src/components/designSystemExtension/Banner"
@@ -196,6 +218,7 @@
196
218
  "name": "RichTextEditor",
197
219
  "path": "src/components/designSystemExtension/RichTextEditor"
198
220
  },
221
+ { "name": "Toast", "path": "src/components/designSystemExtension/Toast" },
199
222
  {
200
223
  "name": "WssQuickCreate",
201
224
  "path": "src/components/designSystemExtension/WssQuickCreate"
@@ -257,7 +280,35 @@
257
280
  "Assignee": "UserReference",
258
281
  "Label": "TextContent",
259
282
  "StaticText": "TextContent",
260
- "Paragraph": "TextContent"
283
+ "Paragraph": "TextContent",
284
+ "Snackbar": "Toast",
285
+ "Text box": "TextInput",
286
+ "Big text box": "TextArea",
287
+ "Comment box": "TextArea",
288
+ "Tick box": "Checkbox",
289
+ "Option buttons": "RadioButtons",
290
+ "Date selector": "Date",
291
+ "Time selector": "Time",
292
+ "Phone number": "Phone",
293
+ "Email address": "Email",
294
+ "Website link": "URL",
295
+ "Web link": "URL",
296
+ "File uploader": "Attachment",
297
+ "Upload button": "Attachment",
298
+ "Form buttons": "ActionButtons",
299
+ "Submit and cancel buttons": "ActionButtons",
300
+ "Buttons at the bottom": "ActionButtons",
301
+ "Error messages": "AlertBanner",
302
+ "Error banner": "AlertBanner",
303
+ "Validation messages": "AlertBanner",
304
+ "Form title": "AssignmentHeader",
305
+ "Step title": "AssignmentHeader",
306
+ "Popup message": "Toast",
307
+ "Notification message": "Toast",
308
+ "Stage progress": "Stages",
309
+ "Step navigation": "MultiStep",
310
+ "Task list": "ToDo",
311
+ "To do list": "ToDo"
261
312
  },
262
313
  "behaviorClasses": {
263
314
  "free text entry": ["TextInput"],
@@ -289,6 +340,9 @@
289
340
  "link display": ["SemanticLink"],
290
341
  "grouped set of fields": ["Group", "FieldGroup", "FieldGroupList"],
291
342
  "confirmation or alert message": ["CancelAlert", "AlertBanner", "Banner"],
343
+ "short notification after an action": ["Toast"],
344
+ "assignment step title": ["AssignmentHeader"],
345
+ "step progress indicator": ["MultiStep", "Stages"],
292
346
  "layout container": ["DefaultForm", "OneColumn", "TwoColumn", "NarrowWide", "WideNarrow"],
293
347
  "tabular list": ["SimpleTable", "ListView"],
294
348
  "selectable card": ["SelectableCard"],
@@ -4,7 +4,7 @@ ai-description: 'Design Profile template — defines the structure and schema fo
4
4
 
5
5
  # Design Profile Schema
6
6
 
7
- This document defines the required structure for a Design Profile produced by the `{{SKILL_DIR}}/embedded-flow/analyze-customer-repo.md` skill. The profile is consumed by the `{{PROMPT_DIR}}/generate-embedded-components{{PROMPT_EXT}}` prompt to generate Pega components matching the customer's application.
7
+ This document defines the required structure for a Design Profile produced by the `{{SKILL_DIR}}/embedded-flow/analyze-customer-repo{{SKILL_EXT}}` skill. The profile is consumed by the `{{PROMPT_DIR}}/generate-embedded-components{{PROMPT_EXT}}` prompt to generate Pega components matching the customer's application.
8
8
 
9
9
  ---
10
10
 
@@ -63,11 +63,20 @@ Organize by category. Use semantic names where the customer defines them; otherw
63
63
 
64
64
  - Responsive boundaries (if defined)
65
65
 
66
+ **Global Appearance:**
67
+
68
+ - Font loading — where the web font is loaded and the family names it provides
69
+ - Base text — the element or wrapper that sets base font family, size, line height, text colour, and page background
70
+ - Reset or baseline — any global reset, normalizer, or baseline styles, and where they apply
71
+ - Theme scope — the design system's root theme or provider wrapper, where it is mounted, and what it covers
72
+ - Theme switching — supported themes and how the active one is selected
73
+ - Overlay placement — whether dialogs, drawers, and popovers render inside the application root or outside the theme scope
74
+
66
75
  ---
67
76
 
68
77
  ### 3. Component Patterns
69
78
 
70
- Document how the customer's existing components work. **This section is context, not instructions.** Only the Validation Display and Styling conventions below are replicated in generated Pega components, because they affect appearance. The Input Interface, State Management, and Event Handling conventions are recorded so the reader understands the codebase — generated components follow the Pega contract for all three regardless of what is written here.
79
+ Document how the customer's existing components work. **This section is context, not instructions.** Only the Validation Display, Styling, and Form Layout conventions below are replicated in generated Pega components, because they affect appearance. The Input Interface, State Management, and Event Handling conventions are recorded so the reader understands the codebase — generated components follow the Pega contract for all three regardless of what is written here.
71
80
 
72
81
  **Input Interface Convention:**
73
82
 
@@ -101,6 +110,19 @@ Record the visual treatment only. Generated components read validation messages
101
110
  - How conditional/dynamic styles are _expressed_ (e.g., error, disabled, focus states) — record the visual mechanism only; Pega supplies the state itself
102
111
  - How responsive behavior is implemented
103
112
 
113
+ **Form Layout Convention:**
114
+
115
+ Record the visual arrangement only. Generated layout templates own the space between fields, so capture what that space _is_ in the customer's forms.
116
+
117
+ - Vertical gap between fields and horizontal gap between columns (as spacing tokens)
118
+ - Label position (above, beside, floating)
119
+ - Field width (fills its column, fixed, or maximum width)
120
+ - How sections and groups of fields are separated, and the spacing around them
121
+ - How multi-column forms are built, and the width at which they stack into one column
122
+ - Space between the last field and the form's buttons, and button alignment
123
+ - Whether gaps come from the form's layout container or from margins on each field
124
+ - File paths of the forms these were taken from
125
+
104
126
  ---
105
127
 
106
128
  ### 4. File Conventions
@@ -148,8 +170,8 @@ List 3–5 components that were analyzed, with their file paths. These serve as
148
170
  The generation prompt reads this profile once at the start of component generation. It uses:
149
171
 
150
172
  - **Project Fundamentals** → to determine which SDK adapter to reference and what language to generate
151
- - **Design Tokens** → to apply correct colors, spacing, typography without hardcoding values
152
- - **Component Patterns** → to replicate the customer's validation display and styling conventions; the rest of the section is context only
173
+ - **Design Tokens** → to apply correct colors, spacing, typography without hardcoding values; **Global Appearance** → to keep the Pega area inside the host's font and theme scope
174
+ - **Component Patterns** → to replicate the customer's validation display, styling, and form layout conventions; the rest of the section is context only
153
175
  - **File Conventions** → to inform co-located files (barrels, tests, styles); generated components' paths and names come from Pega, not from here
154
176
  - **Import Conventions** → to write imports that match the project's style
155
177
  - **Representative Examples** → as reference sources to re-read for detailed pattern matching
@@ -2,6 +2,18 @@
2
2
  ai-description: Generate components across multiple types (field, template, widget, designSystemExtension, infra) using any design system
3
3
  ---
4
4
 
5
+ ## Progress milestones
6
+
7
+ Announce these to the user as you reach them, in plain words and with a counter — "Step 5 of 6 — Building the components". Count only the milestones that apply to this run.
8
+
9
+ 1. **Understanding your request** — Step 0
10
+ 2. **Connecting to your Pega server** — Step 0.5.0
11
+ 3. **Choosing what to build** — Steps 0.5.1 to 0.5.7
12
+ 4. **Preparing your design system** — Steps 1 to 3
13
+ 5. **Building the components** — Steps 4 to 8, counting each component across the whole generation set
14
+ 6. **Checking the app builds** — Step 9
15
+ 7. **Trying it out** — Step 10
16
+
5
17
  ## Step 0 — Resolve inputs
6
18
 
7
19
  Read the user's message carefully. Extract:
@@ -14,11 +26,11 @@ Both **design system** and **base components folder** are required. If either is
14
26
 
15
27
  ⛔ **STOP** — If the user's message does not explicitly state BOTH the design system AND the base components folder, ask for the missing items now. Do not proceed to Step 0.5 until you have explicit answers from the user for all required inputs.
16
28
 
17
- **Which components get generated is not decided here.** That set comes from the portal, and the landing pages and/or case types the user picks within it, all resolved from the Pega server in Step 0.5. The type scope below is only a filter applied on top of that set — it can narrow it, never widen it.
29
+ **Which components get generated is not decided here.** That set comes from the portal, and the landing pages and/or case types the user picks within it, all resolved from the Pega server in Step 0.5. The type scope below is only a filter applied on top of that set — it can narrow it, never widen it. The one exception is the portal shell (Step 0.5.4a): the components that draw the portal's frame are always included, even when the type scope leaves their type out.
18
30
 
19
- Example questions (ask only the ones that are actually missing):
31
+ Ask every missing item together, in one plain message. Example questions (ask only the ones that are actually missing):
20
32
 
21
- 1. Which design system should I use? (e.g. Ant Design, Chakra UI, Carbon, Radix UI)
33
+ 1. Which style kit should I use for the screens? (A style kit is a ready-made set of buttons, inputs, and layouts.) Before asking, check the project's dependency list for UI libraries and list any you find first, marked as already in the project, then offer Ant Design, Chakra UI, Carbon, Radix UI, or another. Never choose one on the user's behalf, even when only one is installed.
22
34
  2. What is your base components folder? (e.g. `src/components/`) — subfolders `field/`, `template/`, `widget/`, `designSystemExtension/`, and `infra/` will be used under it.
23
35
 
24
36
  ### Component type scope
@@ -53,11 +65,11 @@ Once design system, base folder, and type scope are resolved, continue to Step 0
53
65
 
54
66
  ## Step 0.5 — Resolve the portal, its scope, and its components from the server (MANDATORY GATE)
55
67
 
56
- ⛔ **This step MUST complete before anything is read, installed, or written.** A portal renders a specific set of components, and generating the full catalogue produces components the portal will never mount. Do NOT use a hardcoded component list, and do NOT infer one from the project's existing folders.
68
+ ⛔ **This step MUST complete before anything is read, installed, or written.** A portal renders a specific set of components, and generating the full catalogue produces components the portal will never mount. Do NOT use a hardcoded component list, and do NOT infer one from the project's existing folders. The only fixed names are the portal shell companions and fallback that Step 0.5.4a defines.
57
69
 
58
70
  ### 0.5.0 — Ensure the Pega server connection is configured
59
71
 
60
- Before executing any data source below, read and execute `{{SKILL_DIR}}/connect-pega-server.md`. It is a no-op when the connection is already configured. Otherwise, it resolves existing values from the active MCP config, application `sdk-config.json`, and environment files; asks once for every missing non-secret value; and writes chat-provided values to every applicable file. It may pause for an environment-sourced Pega MCP client secret (Cursor only) or an MCP reconnect. After the user retries, rerun the gate before executing any data source.
72
+ Before executing any data source below, read and execute `{{SKILL_DIR}}/connect-pega-server{{SKILL_EXT}}`. It is a no-op when the connection is already configured. Otherwise, it resolves existing values from the active MCP config, application `sdk-config.json`, and environment files; asks once for every missing non-secret value; and writes chat-provided values to every applicable file. It may pause for an environment-sourced Pega MCP client secret (Cursor only — an MCP entry that carries its own client ID and secret) or an MCP reconnect. After the user retries, rerun the gate before executing any data source.
61
73
 
62
74
  ### 0.5.1 — Resolve the portal
63
75
 
@@ -67,6 +79,8 @@ Execute it directly, by name. An execution tool may instruct you to look up the
67
79
 
68
80
  If nothing in this session can execute a Pega data source, stop. Tell the user the Pega MCP server is not available to this conversation, and name both common causes: the server is not running, or it was started after this conversation began — in which case its tools are not bound to this session and a new session is needed. Do not guess at its configuration, and do not fall back to generating the full component catalogue.
69
81
 
82
+ Say it in plain words — for example: "I can't reach your Pega server from this chat. Usually the Pega connection in your editor isn't running, or it was started after this chat began. Start it, or open a new chat, and ask me again."
83
+
70
84
  If the execution runs but fails, report the failure and the error the server returned. You may list the server's advertised data sources alongside it as context, but never present that list as evidence the data page is unavailable. Do not substitute a different data page.
71
85
 
72
86
  The response's `pxResults` array holds one entry per portal. Then:
@@ -80,6 +94,8 @@ The response's `pxResults` array holds one entry per portal. Then:
80
94
 
81
95
  Ask the user which parts of the portal to convert: **Landing pages**, **Cases**, or **Both**. Allow selecting more than one. This is a gate — wait for the answer before continuing.
82
96
 
97
+ Explain the choices in plain words when you ask: **Landing pages** are the main screens people open from the app's menu, such as dashboards, lists, and home pages; **Cases** are the step-by-step forms people fill in to get work done, such as a service request; **Both** covers all of them.
98
+
83
99
  - If **Landing pages** is selected, run Step 0.5.3.
84
100
  - If **Cases** is selected, run Step 0.5.4.
85
101
  - If **Both** is selected, run 0.5.3 and 0.5.4 and merge their results in Step 0.5.5.
@@ -92,7 +108,7 @@ Execute it — and every data page this step dispatches to — by name. Step 0.5
92
108
 
93
109
  If `pxResults` is empty, tell the user this portal has no landing pages and, if Cases was not already selected, offer to fall back to it. If Cases was also not selected or also comes back empty, stop — there is nothing to generate.
94
110
 
95
- Present the returned pages as a **checkbox list** (label each with its `pyRuleName`, and show its `pxObjClass` alongside so the user can tell a view from a landing page) and let the user select one or more. This is a gate.
111
+ Present the returned pages as a **checkbox list** (label each with its `pyRuleName`, and show its `pxObjClass` alongside so the user can tell a view from a landing page) and let the user select one or more. Next to each class, also say in plain words whether the entry is a view or a landing page. This is a gate.
96
112
 
97
113
  For **each selected page**, resolve its components by its `pxObjClass`:
98
114
 
@@ -125,9 +141,26 @@ Present the returned case types as a **checkbox list** and let the user select o
125
141
 
126
142
  For **each selected case type**, execute **`D_pyCaseViewComponentsByType`** with `CaseType` set to its `pyClassName`. Make one call per selected case type. Discard malformed entries from each response, then union the results across all selected case types and drop duplicates. Keep a note of which case type(s) contributed each component.
127
143
 
144
+ ### 0.5.4a — Portal shell (always runs)
145
+
146
+ The portal is drawn by a shell view that sits around every landing page and case. Its components are never returned by Step 0.5.3 or Step 0.5.4, and without them the portal shows a placeholder instead of its header and navigation. Run this step every time, whatever the user chose in Step 0.5.2.
147
+
148
+ Execute **`D_pyViewDependencies`** with `ViewName = pzWebChannelInterfaceShell` and `ViewClass = Data-Portal`. Pass both values exactly as written — this view is part of the Pega platform, is the same for every portal type, and does not vary between installations. Read component names from `pxDependencies` and discard malformed entries. Execute it by name; Step 0.5.1's rule still applies.
149
+
150
+ Then add these two, which the server never returns because `AppShell` looks them up from the registry at runtime:
151
+
152
+ - **`WssNavBar`** — the top navigation bar of a self-service portal
153
+ - **`AlertBanner`** — the page messages shown above the portal content
154
+
155
+ Do not add `NavBar` — the SDK already provides it.
156
+
157
+ If the execution fails or `pxDependencies` is empty, report it with the error the server returned, use `AppShell`, `WssNavBar`, and `AlertBanner` as the shell set, and tell the user this fallback was used. Do not stop the flow for this.
158
+
159
+ Note each of these components as coming from the portal shell — Step 0.5.5 shows them as their own group and Step 9 reports them.
160
+
128
161
  ### 0.5.5 — Resolve names, present, and ask which components to generate
129
162
 
130
- Union whatever Step 0.5.3 and Step 0.5.4 produced (only one ran unless the user chose Both) and drop duplicates across the two.
163
+ Union whatever Step 0.5.3 and Step 0.5.4 produced (only one ran unless the user chose Both) and drop duplicates across the two. Add the portal shell names from Step 0.5.4a to that union; they go through the same name resolution below.
131
164
 
132
165
  Every component you generate must correspond to one canonical component listed in `{{PROMPT_DIR}}/component-manifest.json`. Pega defines a fixed set of components, and the manifest is the complete list of them. Read it once. It contains three things you need here:
133
166
 
@@ -135,6 +168,8 @@ Every component you generate must correspond to one canonical component listed i
135
168
  - `aliases` — known non-canonical names and the canonical name each one maps to
136
169
  - `behaviorClasses` — a fixed list of behaviour descriptions, each mapping to one or more canonical names
137
170
 
171
+ **Not supported yet.** `GenAICoach` is not supported by the SDK yet. Whichever step returned it, do not run it through the stages below and do not ask the user about it. Keep it visible in the list, unticked and not selectable, with the plain reason "The SDK doesn't support this one yet", and never generate it. The portal shell entries Pega already provides — `ModalViewContainer`, `View`, and `ViewContainer` — are also set aside before the stages and shown as not generatable.
172
+
138
173
  For each name the server returned, work through the following stages in order. Stop at the first stage that produces an answer. These names come from Pega's own view metadata, so most are already canonical and settle at Stage 1 — the later stages exist for the ones that do not.
139
174
 
140
175
  #### Stage 1 — Normalized name match
@@ -154,13 +189,13 @@ Do not search for a "similar sounding" name here. Follow these three sub-steps e
154
189
 
155
190
  1. Decide what the component does for the end user, and choose **exactly one** entry from the `behaviorClasses` list that describes that behaviour. You must pick one of the listed classes. If you cannot honestly place the component in any of them, go to Stage 4.
156
191
  2. Read the canonical names that class maps to. If the class maps to exactly one name, that is the candidate.
157
- 3. Read the candidate's skill file — `{{SKILL_DIR}}/{type}-skills/<CanonicalName>.md`, where `{type}` is `field`, `template`, `widget`, `design-system-extension`, or `infra` — and confirm its behavioural contract covers what the component does. If it clearly does not, go to Stage 4.
192
+ 3. Read the candidate's skill file — `{{SKILL_DIR}}/{type}-skills/<CanonicalName>{{SKILL_EXT}}`, where `{type}` is `field`, `template`, `widget`, `design-system-extension`, or `infra` — and confirm its behavioural contract covers what the component does. If it clearly does not, go to Stage 4.
158
193
 
159
194
  If the class maps to more than one canonical name, choose between them using the page or case type the name came from and the surrounding context. If the context does not make the choice obvious, go to Stage 4.
160
195
 
161
196
  #### Stage 4 — Ask the user
162
197
 
163
- Tell the user the name could not be resolved to a Pega component, list the two or three canonical names you considered most likely, and ask which one they want — or whether to leave it out. Do not guess, and do not proceed with that component until they answer. Collect every unresolved name into a **single** question rather than asking once per name; a portal can return a long list, and one question per name is not a usable gate.
198
+ Tell the user the name could not be resolved to a Pega component, list the two or three canonical names you considered most likely, and ask which one they want — or whether to leave it out. Show each candidate as `<ComponentName> – plain description` (the first summary line of its skill file, reworded into a few plain words), for example "SimpleTableManual – Table you can edit". Do not guess, and do not proceed with that component until they answer. Collect every unresolved name into a **single** question rather than asking once per name; a portal can return a long list, and one question per name is not a usable gate.
164
199
 
165
200
  #### Rules for this step
166
201
 
@@ -171,7 +206,11 @@ Tell the user the name could not be resolved to a Pega component, list the two o
171
206
 
172
207
  Group the resolved canonical names by type — `field`, `template`, `widget`, `designSystemExtension`, or `infra`.
173
208
 
174
- Present the grouped list — noting, for any component contributed by more than one page or case type, which ones — and ask which components to generate as a **checkbox list**, offering selecting all of them as an explicit option. Where a returned component is one the SDK provides and this prompt never generates — anything named in Step 8's never-generate list, or a structural wrapper such as `View`, `Region`, or `FlowContainer` — keep it visible in the list but mark it as not generatable and say why, so the user can see it's used without expecting a folder for it.
209
+ Present the grouped list — noting, for any component contributed by more than one page or case type, which ones — and ask which components to generate as a **checkbox list**, offering selecting all of them as an explicit option. Where a returned component is one the SDK provides and this prompt never generates — anything named in Step 8's never-generate list, or a structural wrapper such as `View`, `Region`, or `FlowContainer` — keep it visible in the list but mark it as not generatable and say why, so the user can see it's used without expecting a folder for it. Give that reason in plain words — for example, "Pega already provides this one".
210
+
211
+ Show every entry as `<ComponentName> – plain description` — the name first, then the first summary line of its skill file reworded into a few plain words, for example "SimpleTableManual – Table you can edit" or "Date – Pick a date from a calendar". Label each group in plain words with the type in brackets: form fields (field), page layouts (template), panels (widget), display pieces (designSystemExtension), buttons and progress bars (infra).
212
+
213
+ Show the portal shell components from Step 0.5.4a first, as their own group labelled in plain words — for example "Portal frame — header, navigation, and messages" — with every generatable entry **already ticked**. Say why they are included: the portal needs them to draw its frame on every page, whatever else is chosen. If the user unticks a shell entry, warn them once, in plain words, that the portal will show a placeholder instead of that part of its frame, then go with their answer.
175
214
 
176
215
  ⛔ **Wait for the user's answer.** This is a gate, not a notification. Nothing is read, installed, or written until the selection is confirmed.
177
216
 
@@ -180,6 +219,7 @@ Present the grouped list — noting, for any component contributed by more than
180
219
  Add the following to the confirmed selection whether or not the user picked it, and note the addition in the Step 9 summary:
181
220
 
182
221
  - **`FieldValueList`** — whenever the selection contains any field component. Every field renders its display-only mode through it, so the selected fields will not render correctly without it.
222
+ - **`AlertBanner`**, **`AssignmentHeader`**, and **`Toast`** — whenever **Cases** was chosen in Step 0.5.2. The SDK draws the validation and page messages, the step title, and the short failure messages of every case assignment through them, and the server never returns them. Left ungenerated, the project keeps whatever design system they were previously built with.
183
223
 
184
224
  Layout sub-variants are not part of the selection at all — Step 5.2.1 derives them from whichever layout templates were selected, and the user never has to ask for them.
185
225
 
@@ -187,7 +227,7 @@ Layout sub-variants are not part of the selection at all — Step 5.2.1 derives
187
227
 
188
228
  ### 0.5.7 — Derive the generation set
189
229
 
190
- Intersect the confirmed selection with the type scope from Step 0, group the result by type, and record it as **the generation set**. It governs the rest of this prompt:
230
+ Intersect the confirmed selection with the type scope from Step 0, group the result by type, and record it as **the generation set**. Portal shell components the user kept in Step 0.5.5 skip the intersection and always join the generation set; tell the user, in plain words, which ones were kept outside their chosen scope and why. The generation set governs the rest of this prompt:
191
231
 
192
232
  - Steps 1 and 2 read skills and discover design system components for the types present in the generation set.
193
233
  - Step 3 checks for existing files only within the generation set.
@@ -195,7 +235,7 @@ Intersect the confirmed selection with the type scope from Step 0, group the res
195
235
 
196
236
  Generate nothing outside the generation set, with one exception: the registry dependencies that the selected components' own skill files declare. Some components are orchestrators — they render no control of their own and instead resolve other components from the registry at runtime, as reference and embedded data fields do. Those dependencies are building blocks rather than fields, so they never appear in view metadata and no data source above returns them, and a registry lookup that finds nothing degrades to a blank render rather than raising an error. Read each selected component's skill file, collect the registry keys it declares it will resolve, and add any that are neither already registered nor already in the set; repeat until the set stops growing, since a dependency's own skill may declare further ones. Report these additions in the Step 9 summary, naming which component required each.
197
237
 
198
- A dependency a skill file declares is required. A component you believe a portal might need is not — do not add components based on assumptions about what a portal might need.
238
+ A dependency a skill file declares is required. A component you believe a portal might need is not — do not add components based on assumptions about what a portal might need. The portal shell from Step 0.5.4a is the one exception, because it is resolved from the platform's shell view rather than assumed.
199
239
 
200
240
  ---
201
241
 
@@ -203,13 +243,13 @@ A dependency a skill file declares is required. A component you believe a portal
203
243
 
204
244
  Read the general skill file for every type present in the generation set. Do this upfront — do not re-read per component.
205
245
 
206
- | Type | Skill file to read |
207
- | --------------------- | ------------------------------------------ |
208
- | field | `{{SKILL_DIR}}/field-components.md` |
209
- | template | `{{SKILL_DIR}}/template-components.md` |
210
- | widget | `{{SKILL_DIR}}/widget-components.md` |
211
- | designSystemExtension | `{{SKILL_DIR}}/design-system-extension.md` |
212
- | infra | `{{SKILL_DIR}}/infra-components.md` |
246
+ | Type | Skill file to read |
247
+ | --------------------- | ---------------------------------------------------- |
248
+ | field | `{{SKILL_DIR}}/field-components{{SKILL_EXT}}` |
249
+ | template | `{{SKILL_DIR}}/template-components{{SKILL_EXT}}` |
250
+ | widget | `{{SKILL_DIR}}/widget-components{{SKILL_EXT}}` |
251
+ | designSystemExtension | `{{SKILL_DIR}}/design-system-extension{{SKILL_EXT}}` |
252
+ | infra | `{{SKILL_DIR}}/infra-components{{SKILL_EXT}}` |
213
253
 
214
254
  Keep all loaded skill files active throughout the entire session.
215
255
 
@@ -281,6 +321,8 @@ Collect all existing components across all types and report them in one consolid
281
321
 
282
322
  Wait for the user's answer before proceeding. If none exist, continue immediately.
283
323
 
324
+ **Say it in plain words.** Name each existing piece exactly as the user did — if they said "date picker", write "date picker", never a synonym or the component name. For pieces the user did not name, use `<ComponentName> – plain description` (the first summary line of its skill file, reworded into a few plain words). Group them under plain type labels (form fields, page layouts, panels, display pieces, buttons and progress bars). For example: _"You already have 6 form fields and 2 page layouts. Replace them with new ones, keep yours, or stop?"_ — "replace" is **Overwrite all**, "keep" is **Skip existing**, "stop" is **Cancel**.
325
+
284
326
  ⚠️ **This decision is final for the entire session.** Do NOT re-check file existence or re-ask this overwrite question during Steps 4–8. When you encounter a component file that already exists during generation, silently apply the decision made here (overwrite it or skip it) without prompting again. This applies even after retries, transport errors, or subagent restarts — the user's answer here governs all subsequent component generation in this conversation.
285
327
 
286
328
  ---
@@ -293,7 +335,7 @@ Generate each field component in the generation set, in order:
293
335
 
294
336
  ### 4.1 — Read the component-specific skill file (MANDATORY — do not skip)
295
337
 
296
- Read the file `{{SKILL_DIR}}/field-skills/<ComponentName>.md` using your file reading tool. This step is **required** for every component that has a skill file — do not rely solely on the general `field-components.md`.
338
+ Read the file `{{SKILL_DIR}}/field-skills/<ComponentName>{{SKILL_EXT}}` using your file reading tool. This step is **required** for every component that has a skill file — do not rely solely on the general `field-components.md`.
297
339
 
298
340
  After reading, extract and keep active:
299
341
 
@@ -332,7 +374,7 @@ Open the project's component map file (the file that maps component names to the
332
374
 
333
375
  ### 4.4 — Report progress
334
376
 
335
- After each component: "`<ComponentName>` ✓ — using `<DS component name>`"
377
+ After each component, tell the user in plain words what is now ready, described by what it shows on screen, and how far along you are — for example: "Date picker field ready (5 of 23)".
336
378
 
337
379
  ---
338
380
 
@@ -344,7 +386,7 @@ Generate each template component in the generation set, in order:
344
386
 
345
387
  ### 5.1 — Read the component-specific skill file (MANDATORY — do not skip)
346
388
 
347
- Read the file `{{SKILL_DIR}}/template-skills/<ComponentName>.md` using your file reading tool. This step is **required** for every component — do not rely solely on the general `template-components.md`.
389
+ Read the file `{{SKILL_DIR}}/template-skills/<ComponentName>{{SKILL_EXT}}` using your file reading tool. This step is **required** for every component — do not rely solely on the general `template-components.md`.
348
390
 
349
391
  After reading, extract and keep active:
350
392
 
@@ -395,7 +437,7 @@ Open the project's component map file and:
395
437
 
396
438
  ### 5.4 — Report progress
397
439
 
398
- After each component: "`<ComponentName>` ✓ — `<Layout | Form | Page>` template"
440
+ After each component, tell the user in plain words what is now ready, described by what it shows on screen, and how far along you are — for example: "Two-column page layout ready (9 of 23)".
399
441
 
400
442
  ---
401
443
 
@@ -407,7 +449,7 @@ Generate each widget component in the generation set, in order:
407
449
 
408
450
  ### 6.1 — Read the component-specific skill file (MANDATORY — do not skip)
409
451
 
410
- Read the file `{{SKILL_DIR}}/widget-skills/<ComponentName>.md` using your file reading tool. This step is **required** for every component that has a skill file — do not rely solely on the general `widget-components.md`.
452
+ Read the file `{{SKILL_DIR}}/widget-skills/<ComponentName>{{SKILL_EXT}}` using your file reading tool. This step is **required** for every component that has a skill file — do not rely solely on the general `widget-components.md`.
411
453
 
412
454
  After reading, extract and keep active:
413
455
 
@@ -444,7 +486,7 @@ Open the project's component map file and:
444
486
 
445
487
  ### 6.4 — Report progress
446
488
 
447
- After each component: "`<ComponentName>` ✓ — using `<DS card/list primitive>`"
489
+ After each component, tell the user in plain words what is now ready, described by what it shows on screen, and how far along you are — for example: "Attachments panel ready (14 of 23)".
448
490
 
449
491
  ---
450
492
 
@@ -456,11 +498,11 @@ Generate each design system extension component in the generation set, in order:
456
498
 
457
499
  ### 7.1 — Read the component-specific skill file (MANDATORY — do not skip)
458
500
 
459
- Read the file `{{SKILL_DIR}}/design-system-extension-skills/<ComponentName>.md` using your file reading tool. This step is **required** for every component that has a skill file — do not rely solely on the general `design-system-extension.md`.
501
+ Read the file `{{SKILL_DIR}}/design-system-extension-skills/<ComponentName>{{SKILL_EXT}}` using your file reading tool. This step is **required** for every component that has a skill file — do not rely solely on the general `design-system-extension.md`.
460
502
 
461
503
  After reading, extract and keep active:
462
504
 
463
- - **Pattern classification** — B (Pure display) / A (PConnect display) / C (Complex display)
505
+ - **Pattern classification** — B (Pure display) / A (Data display) / C (Complex display)
464
506
  - **Behavioral Contract** — prop handling, variant mapping, rendering logic, edge cases
465
507
  - **Design System Mapping** table — the recommended DS primitive (Pattern B components only)
466
508
 
@@ -474,7 +516,7 @@ Create the directory `<base>/designSystemExtension/<ComponentName>/`.
474
516
 
475
517
  Create the component's main implementation file using the file naming convention and extension appropriate to the project's framework.
476
518
 
477
- Follow the implementation structure described in `design-system-extension.md` (loaded in Step 1). That file specifies the pattern variants (pure display, PConnect display, complex display) for this project's framework.
519
+ Follow the implementation structure described in `design-system-extension.md` (loaded in Step 1). That file specifies the pattern variants (pure display, data display, complex display) for this project's framework.
478
520
 
479
521
  Apply the Behavioral Contract from the component skill file (prop handling, variant mapping, rendering logic, edge cases).
480
522
 
@@ -489,7 +531,7 @@ Open the project's component map file and:
489
531
 
490
532
  ### 7.4 — Report progress
491
533
 
492
- After each component: "`<ComponentName>` ✓ — Pattern `<B/A/C>`"
534
+ After each component, tell the user in plain words what is now ready, described by what it shows on screen, and how far along you are — for example: "Message banner ready (18 of 23)".
493
535
 
494
536
  ---
495
537
 
@@ -511,7 +553,7 @@ Generate each infra component in the generation set that is one of the three ove
511
553
 
512
554
  ### 8.1 — Read the component-specific skill file (MANDATORY — do not skip)
513
555
 
514
- Read the file `{{SKILL_DIR}}/infra-skills/<ComponentName>.md` using your file reading tool. This step is **required** for every component — do not rely solely on the general `infra-components.md`.
556
+ Read the file `{{SKILL_DIR}}/infra-skills/<ComponentName>{{SKILL_EXT}}` using your file reading tool. This step is **required** for every component — do not rely solely on the general `infra-components.md`.
515
557
 
516
558
  After reading, extract and keep active:
517
559
 
@@ -556,7 +598,7 @@ Open the project's component map file and apply the case that matches what you f
556
598
 
557
599
  ### 8.4 — Report progress
558
600
 
559
- After each component: "`<ComponentName>` ✓ — `<display-only | case-aware | container>` chrome"
601
+ After each component, tell the user in plain words what is now ready, described by what it shows on screen, and how far along you are — for example: "Submit and Cancel buttons ready (22 of 23)".
560
602
 
561
603
  ---
562
604
 
@@ -587,7 +629,14 @@ Report a final summary:
587
629
  - The portal resolved in Step 0.5.1, the scope chosen in Step 0.5.2 (Landing pages / Cases / Both), and which pages and/or case types were selected
588
630
  - How many components the server returned in total versus how many were selected to generate
589
631
  - Total components generated, grouped by type
590
- - `FieldValueList`, if it was added automatically under Step 0.5.6
632
+ - `FieldValueList`, `AlertBanner`, `AssignmentHeader`, and `Toast`, for each one added automatically under Step 0.5.6
633
+ - The portal shell components from Step 0.5.4a — which came from the server's shell view, which were added as companions, whether the fallback set was used, and any kept outside the type scope
591
634
  - All entries added to the component map
592
- - Any components skipped (if "skip existing" was chosen in Step 3, or because they are SDK-provided infrastructure)
635
+ - Any components skipped (if "skip existing" was chosen in Step 3, because they are SDK-provided infrastructure, or because the SDK doesn't support them yet, such as `GenAICoach`)
593
636
  - Any name the server returned that resolved to a **different** canonical name, with the stage that produced the match (normalized name, alias, behaviour class, or the user's choice). Say it in your reply as well — the user must never discover a substitution only by reading the generated files
637
+
638
+ ---
639
+
640
+ ## Step 10 — Try the portal
641
+
642
+ Once the Step 9 build passes, read and execute `{{SKILL_DIR}}/portal-flow/run-and-verify-portal{{SKILL_EXT}}`. Hand it the generation set with the page or case type each component came from, the portal resolved in Step 0.5.1, and the case types selected in Step 0.5.4 — when Cases was not chosen, it asks the user which case types to walk through. Report its verification summary together with the Step 9 summary.