@salesforce/afv-skills 1.41.0 → 1.43.0

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 (288) hide show
  1. package/package.json +2 -6
  2. package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +3 -0
  3. package/skills/automation-sandbox-post-copy-configure/SKILL.md +4 -0
  4. package/skills/design-systems-slds-validate/SKILL.md +2 -2
  5. package/skills/dx-app-analytics-query/SKILL.md +1 -3
  6. package/skills/dx-devops-conflict-resolve/SKILL.md +205 -0
  7. package/skills/dx-devops-conflict-resolve/examples/conflict-workflows.md +165 -0
  8. package/skills/dx-devops-conflict-resolve/references/deploy-failure-resolution.md +75 -0
  9. package/skills/dx-devops-conflict-resolve/references/git-conflict-resolution.md +124 -0
  10. package/skills/dx-devops-conflict-resolve/scripts/detect-conflicts.sh +91 -0
  11. package/skills/dx-devops-conflict-resolve/scripts/diagnose-deploy-failure.sh +156 -0
  12. package/skills/dx-devops-request-status/SKILL.md +160 -0
  13. package/skills/dx-devops-request-status/examples/polling-workflows.md +101 -0
  14. package/skills/dx-devops-request-status/references/cli-commands.md +176 -0
  15. package/skills/dx-devops-request-status/scripts/poll-status.sh +134 -0
  16. package/skills/dx-devops-test-failures-analyze/SKILL.md +6 -6
  17. package/skills/dx-devops-test-pipeline-configure/SKILL.md +7 -7
  18. package/skills/dx-devops-test-suite-assignments-configure/SKILL.md +6 -6
  19. package/skills/dx-devops-test-suite-run/SKILL.md +6 -6
  20. package/skills/dx-devops-work-item-manage/SKILL.md +2 -0
  21. package/skills/dx-org-manage/references/creating-scratch-org.md +5 -2
  22. package/skills/dx-org-manage/references/creating-snapshot.md +1 -0
  23. package/skills/dx-org-shape-manage/SKILL.md +152 -0
  24. package/skills/dx-org-shape-manage/examples/create_error_output.json +9 -0
  25. package/skills/dx-org-shape-manage/examples/create_success_output.json +9 -0
  26. package/skills/dx-org-shape-manage/examples/delete_output.json +11 -0
  27. package/skills/dx-org-shape-manage/examples/list_inactive_output.json +32 -0
  28. package/skills/dx-org-shape-manage/examples/list_output.json +24 -0
  29. package/skills/dx-org-shape-manage/references/cli_flags.md +135 -0
  30. package/skills/dx-org-switch/SKILL.md +2 -2
  31. package/skills/dx-org-trial-expiration-check/SKILL.md +2 -0
  32. package/skills/dx-pkg-post-install-configure/SKILL.md +3 -0
  33. package/skills/education-cloud-multi-campus-configure/SKILL.md +211 -0
  34. package/skills/education-cloud-multi-campus-configure/examples/hierarchy_visualization.md +174 -0
  35. package/skills/education-cloud-multi-campus-configure/examples/output_examples.md +54 -0
  36. package/skills/education-cloud-multi-campus-configure/examples/sample_hierarchy_input.csv +29 -0
  37. package/skills/education-cloud-multi-campus-configure/examples/sample_hierarchy_input_edgecases.csv +16 -0
  38. package/skills/education-cloud-multi-campus-configure/references/account_recordtype_prerequisite.md +44 -0
  39. package/skills/education-cloud-multi-campus-configure/references/delta_computation.md +33 -0
  40. package/skills/education-cloud-multi-campus-configure/references/error_handling.md +198 -0
  41. package/skills/education-cloud-multi-campus-configure/references/foundation_prerequisites.md +54 -0
  42. package/skills/education-cloud-multi-campus-configure/references/gotchas.md +16 -0
  43. package/skills/education-cloud-multi-campus-configure/references/hierarchy_parsing_rules.md +133 -0
  44. package/skills/education-cloud-multi-campus-configure/references/mcp-invocation.md +75 -0
  45. package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/SKILL.md +1 -1
  46. package/skills/experience-cms-brand-apply/SKILL.md +4 -1
  47. package/skills/experience-cms-brand-create/SKILL.md +197 -0
  48. package/skills/experience-cms-brand-create/assets/brand-template.json +329 -0
  49. package/skills/experience-cms-brand-create/references/brand-anatomy.md +120 -0
  50. package/skills/experience-cms-brand-create/references/disk-contract.md +84 -0
  51. package/skills/experience-cms-content-generate/SKILL.md +190 -0
  52. package/skills/experience-cms-content-generate/assets/display-formats.md +84 -0
  53. package/skills/experience-cms-content-generate/assets/payloads/create-content-bulk.json +11 -0
  54. package/skills/experience-cms-content-generate/assets/payloads/create-content-single.json +11 -0
  55. package/skills/experience-cms-content-generate/assets/payloads/publish-content.json +4 -0
  56. package/skills/experience-cms-content-generate/assets/payloads/update-content.json +9 -0
  57. package/skills/experience-cms-content-generate/assets/questions.md +241 -0
  58. package/skills/experience-cms-content-generate/examples/create-content-call.md +81 -0
  59. package/skills/experience-cms-content-generate/references/bulk-batching.md +56 -0
  60. package/skills/experience-cms-content-generate/references/content-type-classification.md +88 -0
  61. package/skills/experience-cms-content-generate/references/content-write-tool.md +95 -0
  62. package/skills/experience-cms-content-generate/references/delegation-protocol.md +37 -0
  63. package/skills/experience-cms-content-generate/references/edit-publish-workflow.md +63 -0
  64. package/skills/experience-cms-content-generate/references/error-recovery.md +72 -0
  65. package/skills/experience-cms-content-generate/references/identifier-resolution.md +26 -0
  66. package/skills/experience-cms-content-generate/references/intent-routing.md +45 -0
  67. package/skills/experience-cms-content-generate/references/principles.md +19 -0
  68. package/skills/experience-cms-content-generate/references/ux-rules.md +68 -0
  69. package/skills/experience-cms-content-generate/references/workspace-resolution.md +33 -0
  70. package/skills/experience-cms-content-type-generate/SKILL.md +449 -0
  71. package/skills/experience-cms-content-type-generate/assets/discovery-prompts.md +79 -0
  72. package/skills/experience-cms-content-type-generate/assets/schema-example.json +70 -0
  73. package/skills/experience-cms-content-type-generate/references/agent-checklist.md +50 -0
  74. package/skills/experience-cms-content-type-generate/references/anti-patterns.md +39 -0
  75. package/skills/experience-cms-content-type-generate/references/deployment-errors.md +27 -0
  76. package/skills/experience-cms-content-type-generate/references/discovery-details.md +106 -0
  77. package/skills/experience-cms-content-type-generate/references/discovery-query-rules.md +85 -0
  78. package/skills/experience-cms-content-type-generate/references/edit-fields-loop.md +48 -0
  79. package/skills/experience-cms-content-type-generate/references/pre-deploy-checklist.md +21 -0
  80. package/skills/experience-cms-content-type-generate/references/retrieve-and-reconcile.md +105 -0
  81. package/skills/experience-cms-content-type-generate/references/schema-rules.md +51 -0
  82. package/skills/experience-cms-content-type-generate/references/schema-summary-format.md +60 -0
  83. package/skills/experience-lds-graphql-generate/SKILL.md +4 -0
  84. package/skills/experience-lwc-accessibility-jest-run/SKILL.md +79 -0
  85. package/skills/experience-lwc-accessibility-jest-run/references/running-sa11y-jest-tests.md +205 -0
  86. package/skills/experience-lwc-design-generate/SKILL.md +5 -4
  87. package/skills/experience-lwc-generate/SKILL.md +10 -9
  88. package/skills/experience-ui-bundle-deploy/references/dev-preview.md +21 -0
  89. package/skills/experience-ui-bundle-deploy/references/social-login.md +1 -0
  90. package/skills/experience-ui-bundle-file-upload-generate/SKILL.md +6 -6
  91. package/skills/experience-ui-bundle-localize/SKILL.md +30 -37
  92. package/skills/experience-ui-bundle-localize/references/gotchas.md +23 -7
  93. package/skills/experience-ui-bundle-localize/references/i18n-setup.md +48 -4
  94. package/skills/experience-ui-bundle-localize/references/label-xml.md +22 -8
  95. package/skills/experience-ui-bundle-localize/references/verifying.md +39 -11
  96. package/skills/experience-ui-bundle-localize/scripts/detect-bundle-type.sh +118 -15
  97. package/skills/experience-ui-bundle-localize/scripts/tests/test-detect-bundle-type.sh +187 -0
  98. package/skills/experience-ui-bundle-mfa-configure/SKILL.md +13 -2
  99. package/skills/experience-ui-bundle-mfa-configure/references/social-login.md +1 -0
  100. package/skills/experience-ui-bundle-project-generate/SKILL.md +2 -2
  101. package/skills/integration-connectivity-generate/SKILL.md +11 -10
  102. package/skills/integration-eventing-cdc-configure/SKILL.md +6 -6
  103. package/skills/integration-eventing-subscription-configure/SKILL.md +6 -5
  104. package/skills/mobile-platform-native-capabilities-integrate/SKILL.md +2 -2
  105. package/skills/mobile-platform-offline-validate/scripts/package.json +1 -1
  106. package/skills/platform-agentexchange-partner-offers-configure/SKILL.md +8 -8
  107. package/skills/platform-custom-application-generate/SKILL.md +2 -0
  108. package/skills/platform-custom-field-generate/SKILL.md +8 -6
  109. package/skills/platform-custom-metadata-type-generate/SKILL.md +460 -0
  110. package/skills/platform-custom-metadata-type-generate/references/cmdt-records.md +251 -0
  111. package/skills/platform-custom-metadata-type-generate/scripts/sanitize-developer-name.sh +46 -0
  112. package/skills/platform-custom-setting-generate/SKILL.md +419 -0
  113. package/skills/platform-dataspace-access-configure/SKILL.md +3 -3
  114. package/skills/platform-sharing-owd-configure/SKILL.md +3 -0
  115. package/skills/platform-value-set-generate/SKILL.md +2 -0
  116. package/skills/service-agentforce-channel-configure/SKILL.md +29 -20
  117. package/skills/service-agentforce-channel-configure/assets/BotEmailDefinition.botEmailDefinition-meta.xml +36 -0
  118. package/skills/service-agentforce-channel-configure/assets/email/unfiled$public/AgentforceForServiceEmailTemplate.email +17 -0
  119. package/skills/service-agentforce-channel-configure/assets/email/unfiled$public/AgentforceForServiceEmailTemplate.email-meta.xml +29 -0
  120. package/skills/service-agentforce-channel-configure/assets/mdapi-package.xml +25 -0
  121. package/skills/service-agentforce-channel-configure/assets/settings-mdapi-package.xml +30 -0
  122. package/skills/service-agentforce-channel-configure/references/agent-wiring.md +20 -0
  123. package/skills/service-agentforce-channel-configure/references/botemaildefinition.md +107 -0
  124. package/skills/service-agentforce-channel-configure/references/channel-branch-email.md +203 -50
  125. package/skills/service-agentforce-channel-configure/references/channel-types.md +30 -3
  126. package/skills/service-agentforce-channel-configure/references/queue-resolution.md +17 -8
  127. package/skills/service-agentforce-channel-configure/references/routing-flow.md +14 -3
  128. package/skills/service-agentforce-channel-configure/scripts/validate-botemaildefinition.py +126 -0
  129. package/skills/service-agentforce-channel-configure/scripts/validate-emailtemplate.py +133 -0
  130. package/skills/service-de-channel-activate/SKILL.md +271 -0
  131. package/skills/service-de-channel-activate/references/gotchas.md +31 -0
  132. package/skills/service-de-channel-activate/references/phone-verification.md +96 -0
  133. package/skills/service-de-channel-activate/references/worked-examples.md +14 -0
  134. package/skills/service-de-channel-consent-configure/SKILL.md +230 -0
  135. package/skills/service-de-channel-consent-configure/references/gotchas.md +41 -0
  136. package/skills/service-de-channel-consent-configure/references/language-keywords.md +84 -0
  137. package/skills/service-de-channel-consent-configure/references/worked-examples.md +134 -0
  138. package/skills/service-de-channel-create/SKILL.md +369 -0
  139. package/skills/service-de-channel-create/references/apple.md +59 -0
  140. package/skills/service-de-channel-create/references/connect-insert.md +84 -0
  141. package/skills/service-de-channel-create/references/facebook.md +154 -0
  142. package/skills/service-de-channel-create/references/line.md +66 -0
  143. package/skills/service-de-channel-create/references/sms.md +98 -0
  144. package/skills/service-de-channel-create/references/whatsapp.md +98 -0
  145. package/skills/service-de-channel-create/references/worked-examples.md +70 -0
  146. package/skills/service-de-channel-routing-configure/SKILL.md +345 -0
  147. package/skills/service-de-channel-routing-configure/references/asa-routing.md +90 -0
  148. package/skills/service-de-channel-routing-configure/references/gotchas.md +27 -0
  149. package/skills/service-de-channel-routing-configure/references/queue-creation.md +123 -0
  150. package/skills/service-de-channel-routing-configure/references/target-locate.md +98 -0
  151. package/skills/service-de-channel-routing-configure/references/worked-examples.md +174 -0
  152. package/skills/service-de-headless-channel-configure/SKILL.md +305 -0
  153. package/skills/service-de-headless-channel-configure/references/gotchas.md +27 -0
  154. package/skills/service-de-headless-channel-configure/references/inputs.md +49 -0
  155. package/skills/service-de-headless-channel-configure/references/output-envelopes.md +53 -0
  156. package/skills/service-de-headless-channel-configure/references/partial-success.md +24 -0
  157. package/skills/service-de-headless-channel-configure/references/terms-and-conditions.md +54 -0
  158. package/skills/service-de-headless-channel-configure/references/worked-examples.md +108 -0
  159. package/skills/service-de-waba-integrate/SKILL.md +227 -0
  160. package/skills/service-digital-engagement-channel-configure/scripts/check-api-version.sh +29 -0
  161. package/skills/service-digital-engagement-messaging-site-integrate/SKILL.md +10 -9
  162. package/skills/service-digital-engagement-messaging-site-integrate/references/lwr_patch.md +39 -21
  163. package/skills/service-digital-engagement-messaging-site-integrate/scripts/patch_lwr_bundle.sh +157 -96
  164. package/skills/service-email-to-case-configure/SKILL.md +190 -0
  165. package/skills/service-email-to-case-configure/assets/CaseSettings.settings-meta.xml +45 -0
  166. package/skills/service-email-to-case-configure/examples/CaseSettings-two-addresses.settings-meta.xml +36 -0
  167. package/skills/service-email-to-case-configure/references/apply-mechanics.md +73 -0
  168. package/skills/service-email-to-case-configure/references/routing_address_reference.md +73 -0
  169. package/skills/service-email-to-case-configure/references/troubleshooting.md +25 -0
  170. package/skills/service-email-to-case-configure/scripts/apply-casesettings.py +1315 -0
  171. package/skills/service-email-to-case-configure/scripts/check-agent-email-capability.sh +26 -0
  172. package/skills/service-email-to-case-configure/scripts/tests/__init__.py +0 -0
  173. package/skills/service-email-to-case-configure/scripts/tests/_bootstrap.py +45 -0
  174. package/skills/service-email-to-case-configure/scripts/tests/_fakeorg.py +366 -0
  175. package/skills/service-email-to-case-configure/scripts/tests/_run.py +84 -0
  176. package/skills/service-email-to-case-configure/scripts/tests/test_apply_org_scenarios.py +655 -0
  177. package/skills/service-email-to-case-configure/scripts/tests/test_get_session.py +134 -0
  178. package/skills/service-email-to-case-configure/scripts/tests/test_new_capabilities.py +193 -0
  179. package/skills/service-email-to-case-configure/scripts/tests/test_validate_casesettings.py +170 -0
  180. package/skills/service-email-to-case-configure/scripts/validate-casesettings.py +229 -0
  181. package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +33 -15
  182. package/skills/service-itsm-agentic-setup-agentforce-coordinate/examples/output-templates.md +63 -47
  183. package/skills/service-itsm-agentic-setup-agentforce-studio-configure/SKILL.md +17 -12
  184. package/skills/service-itsm-agentic-setup-agentforce-studio-configure/references/cli-invocation.md +5 -3
  185. package/skills/service-itsm-agentic-setup-agentforce-studio-configure/scripts/classify-enable-plan.mjs +11 -3
  186. package/skills/service-itsm-agentic-setup-agentforce-studio-validate/SKILL.md +8 -6
  187. package/skills/service-itsm-agentic-setup-agentforce-studio-validate/references/cli-invocation.md +3 -3
  188. package/skills/service-itsm-agentic-setup-agentforce-studio-validate/scripts/classify-readiness.mjs +11 -3
  189. package/skills/service-itsm-agentic-setup-configure/SKILL.md +5 -5
  190. package/skills/service-itsm-agentic-setup-configure/examples/output-templates.md +5 -5
  191. package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +2 -2
  192. package/skills/service-itsm-agentic-setup-employee-agent-configure/references/report-format.md +11 -7
  193. package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/render-report.mjs +20 -7
  194. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +10 -6
  195. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/action-availability.md +7 -7
  196. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/report-format.md +11 -7
  197. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/build-create-body.mjs +24 -17
  198. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/classify-action-availability.mjs +98 -58
  199. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/render-report.mjs +20 -7
  200. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/strip-release-management.mjs +176 -0
  201. package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/SKILL.md +19 -19
  202. package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/references/cli-invocation.md +3 -4
  203. package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/references/helper-contracts.md +6 -6
  204. package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/references/permset-topology.md +3 -10
  205. package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/scripts/classify-permset-availability.mjs +7 -9
  206. package/skills/service-itsm-incident-mgmt-configure/SKILL.md +2 -0
  207. package/skills/service-itsm-incident-priority-configure/SKILL.md +15 -12
  208. package/skills/service-itsm-incident-priority-configure/examples/matrix-operations.md +27 -1
  209. package/skills/service-itsm-incident-priority-configure/references/sf-cli-invocation.md +37 -6
  210. package/skills/service-native-voice-recording-transcription-configure/SKILL.md +146 -0
  211. package/skills/service-native-voice-recording-transcription-configure/assets/confirmation-output.json +16 -0
  212. package/skills/service-native-voice-recording-transcription-configure/assets/package.xml +22 -0
  213. package/skills/service-native-voice-recording-transcription-configure/references/thunderbird-voice-settings.md +101 -0
  214. package/skills/service-native-voice-recording-transcription-configure/scripts/enable-recording-transcription.sh +181 -0
  215. package/skills/data360-activate/README.md +0 -38
  216. package/skills/data360-activate/SKILL.md +0 -127
  217. package/skills/data360-connect/README.md +0 -57
  218. package/skills/data360-connect/SKILL.md +0 -163
  219. package/skills/data360-connect/examples/connections/heroku-postgres.json +0 -15
  220. package/skills/data360-connect/examples/connections/ingest-api-connection.json +0 -5
  221. package/skills/data360-connect/examples/connections/ingest-api-schema.json +0 -31
  222. package/skills/data360-connect/examples/connections/redshift.json +0 -16
  223. package/skills/data360-connect/examples/connections/sharepoint-unstructured.json +0 -20
  224. package/skills/data360-connect/examples/connections/snowflake-connection.json +0 -42
  225. package/skills/data360-harmonize/README.md +0 -31
  226. package/skills/data360-harmonize/SKILL.md +0 -126
  227. package/skills/data360-orchestrate/README.md +0 -120
  228. package/skills/data360-orchestrate/SKILL.md +0 -263
  229. package/skills/data360-orchestrate/assets/definitions/activation-target.template.json +0 -5
  230. package/skills/data360-orchestrate/assets/definitions/activation.template.json +0 -7
  231. package/skills/data360-orchestrate/assets/definitions/calculated-insight.template.json +0 -7
  232. package/skills/data360-orchestrate/assets/definitions/data-action-target.template.json +0 -5
  233. package/skills/data360-orchestrate/assets/definitions/data-action.template.json +0 -5
  234. package/skills/data360-orchestrate/assets/definitions/data-graph.template.json +0 -21
  235. package/skills/data360-orchestrate/assets/definitions/data-stream.template.json +0 -55
  236. package/skills/data360-orchestrate/assets/definitions/dmo.template.json +0 -17
  237. package/skills/data360-orchestrate/assets/definitions/identity-resolution.template.json +0 -30
  238. package/skills/data360-orchestrate/assets/definitions/mapping.template.json +0 -14
  239. package/skills/data360-orchestrate/assets/definitions/relationship.template.json +0 -12
  240. package/skills/data360-orchestrate/assets/definitions/search-index.template.json +0 -9
  241. package/skills/data360-orchestrate/assets/definitions/segment.template.json +0 -16
  242. package/skills/data360-orchestrate/references/feature-readiness.md +0 -157
  243. package/skills/data360-orchestrate/references/plugin-setup.md +0 -138
  244. package/skills/data360-orchestrate/scripts/bootstrap-plugin.sh +0 -53
  245. package/skills/data360-orchestrate/scripts/diagnose-org.mjs +0 -511
  246. package/skills/data360-orchestrate/scripts/generate-manifest.mjs +0 -68
  247. package/skills/data360-orchestrate/scripts/verify-plugin.sh +0 -58
  248. package/skills/data360-prepare/README.md +0 -50
  249. package/skills/data360-prepare/SKILL.md +0 -203
  250. package/skills/data360-prepare/examples/ingestion-api/.env.example +0 -8
  251. package/skills/data360-prepare/examples/ingestion-api/README.md +0 -48
  252. package/skills/data360-prepare/examples/ingestion-api/send-data.py +0 -144
  253. package/skills/data360-query/README.md +0 -43
  254. package/skills/data360-query/SKILL.md +0 -128
  255. package/skills/data360-query/examples/search-indexes/hybrid-structured.json +0 -44
  256. package/skills/data360-query/examples/search-indexes/vector-knowledge.json +0 -43
  257. package/skills/data360-segment/README.md +0 -35
  258. package/skills/data360-segment/SKILL.md +0 -123
  259. package/skills/service-helpagent-coordinate/references/channel-help-portal.md +0 -22
  260. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-1-1-non-text-content.md +0 -0
  261. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-3-1-i-lists.md +0 -0
  262. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-3-1-ii-tables.md +0 -0
  263. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-3-1-iii-form-labels.md +0 -0
  264. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-3-1-iv-regions.md +0 -0
  265. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-3-1-v-groups.md +0 -0
  266. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-3-5-identify-input.md +0 -0
  267. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-4-3-contrast.md +0 -0
  268. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-1-1-keyboard.md +0 -0
  269. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-4-4-link-purpose.md +0 -0
  270. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-4-6-headings-labels.md +0 -0
  271. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-5-1-pointer-gestures.md +0 -0
  272. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-5-2-pointer-cancellation.md +0 -0
  273. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-5-3-label-in-name.md +0 -0
  274. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-5-7-dragging-movement.md +0 -0
  275. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-3-2-1-on-focus.md +0 -0
  276. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-3-2-2-on-input.md +0 -0
  277. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-3-3-1-error-identification.md +0 -0
  278. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-3-3-2-labels-instructions.md +0 -0
  279. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-3-3-3-error-suggestion.md +0 -0
  280. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-4-1-2-i-name.md +0 -0
  281. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-4-1-2-ii-role.md +0 -0
  282. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-4-1-2-iii-value.md +0 -0
  283. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/vision/sc-1-1-1-non-text-content.md +0 -0
  284. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/vision/sc-1-4-1-use-of-color.md +0 -0
  285. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/vision/sc-1-4-10-resize-reflow.md +0 -0
  286. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/vision/sc-1-4-11-non-text-contrast.md +0 -0
  287. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/vision/sc-1-4-3-contrast.md +0 -0
  288. /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/scripts/contrast-ratio.py +0 -0
@@ -1,15 +1,17 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail # exit on error (-e), undefined vars (-u), and propagate pipeline failures (-o pipefail)
3
3
  #
4
- # detect-bundle-type.sh — Classify a UI Bundle as authenticated (supported) or
5
- # a site (not yet supported) before localizing it.
4
+ # detect-bundle-type.sh — Classify a UI Bundle as authenticated, a bound public
5
+ # site candidate, or a bound non-public/unsupported site before localizing it.
6
6
  #
7
7
  # The bundle's type is decided by deterministic file and string checks, so run
8
- # this rather than interpreting them by hand. It classifies in a fixed order and
9
- # stops at the first hit:
8
+ # this rather than interpreting them by hand. It classifies in a fixed order:
10
9
  # - in-core internal: ui-bundle.json accessCheck starts with "LwrInternalApp." -> proceed
11
10
  # - B2E: a CustomApplication whose <uiBundle> names this bundle -> proceed
12
- # - site: a digitalExperienceConfigs/*.digitalExperienceConfig-meta.xml -> NOT supported, stop
11
+ # - public site candidate: content.json binds this appSpace and its
12
+ # app-container metadata enables guest access -> ask product type
13
+ # - non-public/unsupported site: the site binds this bundle without that
14
+ # public app-container shape -> stop
13
15
  # - anything else: unbound / cannot auto-detect -> ask the user
14
16
  #
15
17
  # The B2E and site checks are package-local: CustomApplication and site config
@@ -25,9 +27,15 @@ set -euo pipefail # exit on error (-e), undefined vars (-u), and propagate pipe
25
27
  #
26
28
  # Exit codes:
27
29
  # 0 authenticated app (in-core internal or B2E) — proceed
28
- # 1 site (B2C/B2B) — NOT supported; stop and tell the user
29
- # 2 unbound / cannot auto-detect — ask the user to confirm the bundle is
30
- # an authenticated app (B2E or in-core internal); stop if they cannot
30
+ # 2 unbound / cannot auto-detect — report the result and stop rather than
31
+ # guessing the bundle type
32
+ # 10 bound public site app-container candidate — metadata proves binding and
33
+ # guest access, not B2C versus B2B product type
34
+ # 11 bound non-public/unsupported site — stop
35
+ # 12 bundle has both CustomApplication and site bindings — ask which runtime
36
+ # context is being localized
37
+ # 13 bundle has multiple matching Experience site bindings — show every
38
+ # matching site and ask which site/runtime context is being localized
31
39
 
32
40
  if [ "$#" -ne 1 ] || [ -z "${1:-}" ]; then
33
41
  echo "ERROR: pass exactly one bundle directory. Usage: detect-bundle-type.sh <path-to-uiBundles/<name>/ dir>" >&2
@@ -45,13 +53,108 @@ case "$bundleDir" in
45
53
  */uiBundles/*) metaRoot="${bundleDir%/uiBundles/*}" ;;
46
54
  esac
47
55
 
56
+ classify_site() {
57
+ local config config_xml space site content app_namespace app_name app_space auth_type app_container
58
+ local -a matches=() matched_sites=()
59
+ app_namespace="c"
60
+ app_name="$bundle"
61
+ if [ -f "${bundleDir}/ui-bundle.json" ]; then
62
+ app_namespace=$(jq -r '.appNamespace // "c"' "${bundleDir}/ui-bundle.json" 2>/dev/null || printf 'c')
63
+ app_name=$(jq -r '.appName // empty' "${bundleDir}/ui-bundle.json" 2>/dev/null || true)
64
+ [ -n "$app_name" ] || app_name="$bundle"
65
+ fi
66
+ app_space="${app_namespace}__${app_name}"
67
+
68
+ for config in "${metaRoot}"/digitalExperienceConfigs/*.digitalExperienceConfig-meta.xml; do
69
+ [ -f "$config" ] || continue
70
+ config_xml=""
71
+ while IFS= read -r line || [ -n "$line" ]; do
72
+ config_xml+="$line"
73
+ done <"$config"
74
+ space=""
75
+ if [[ "$config_xml" =~ \<space\>[[:space:]]*site/([^\<[:space:]]+) ]]; then
76
+ space="${BASH_REMATCH[1]}"
77
+ fi
78
+ [ -n "$space" ] || continue
79
+ site="${metaRoot}/digitalExperiences/site/${space}"
80
+ content="${site}/sfdc_cms__site/${space}/content.json"
81
+ [ -f "$content" ] || continue
82
+ [ "$(jq -r '.contentBody.appSpace // empty' "$content" 2>/dev/null)" = "$app_space" ] || continue
83
+
84
+ auth_type=$(jq -r '.contentBody.authenticationType // empty' "$content" 2>/dev/null)
85
+ app_container=$(jq -r '.contentBody.appContainer // false' "$content" 2>/dev/null)
86
+ if [ "$app_container" = "true" ] \
87
+ && { [ "$auth_type" = "AUTHENTICATED_WITH_PUBLIC_ACCESS_ENABLED" ] \
88
+ || [ "$auth_type" = "UNAUTHENTICATED" ]; }; then
89
+ matches+=("${space} (public)")
90
+ else
91
+ matches+=("${space} (non-public)")
92
+ fi
93
+ matched_sites+=("$space")
94
+ done
95
+
96
+ if [ "${#matches[@]}" -gt 1 ]; then
97
+ local joined="" match
98
+ for match in "${matches[@]}"; do
99
+ [ -z "$joined" ] || joined+=", "
100
+ joined+="$match"
101
+ done
102
+ echo "multiple Experience site bindings: ${joined} -> ask which site/runtime context is being localized"
103
+ return 13
104
+ fi
105
+ if [ "${#matches[@]}" -eq 1 ]; then
106
+ if [[ "${matches[0]}" == *" (public)" ]]; then
107
+ echo "bound public site app-container candidate (site DeveloperName: ${matched_sites[0]}; guest access enabled; product type not inferred)"
108
+ return 10
109
+ fi
110
+ echo "bound non-public/unsupported site (site DeveloperName: ${matched_sites[0]}; DigitalExperienceConfig-bound)"
111
+ return 11
112
+ fi
113
+ return 2
114
+ }
115
+
116
+ internal_bound=false
48
117
  if [ -f "${bundleDir}/ui-bundle.json" ] \
49
118
  && jq -e '(.accessCheck // "") | startswith("LwrInternalApp.")' "${bundleDir}/ui-bundle.json" >/dev/null 2>&1; then
50
- echo "in-core internal app -> proceed"; exit 0
51
- elif grep -rlq --include='*.app-meta.xml' "<uiBundle>${bundle}</uiBundle>" "${metaRoot}/applications" 2>/dev/null; then
52
- echo "B2E (CustomApplication-bound) -> proceed"; exit 0
53
- elif ls "${metaRoot}"/digitalExperienceConfigs/*.digitalExperienceConfig-meta.xml >/dev/null 2>&1; then
54
- echo "site (B2C/B2B) -> NOT supported; stop"; exit 1
55
- else
56
- echo "unbound / cannot auto-detect -> ask the user"; exit 2
119
+ internal_bound=true
120
+ fi
121
+
122
+ b2e_bound=false
123
+ if grep -rlq --include='*.app-meta.xml' "<uiBundle>${bundle}</uiBundle>" "${metaRoot}/applications" 2>/dev/null; then
124
+ b2e_bound=true
125
+ fi
126
+
127
+ set +e
128
+ site_output=$(classify_site)
129
+ status=$?
130
+ set -e
131
+ if { [ "$internal_bound" = "true" ] || [ "$b2e_bound" = "true" ]; } \
132
+ && { [ "$status" -eq 10 ] || [ "$status" -eq 11 ]; }; then
133
+ echo "dual-bound bundle (authenticated app and $site_output) -> ask for target runtime context"
134
+ exit 12
135
+ fi
136
+ if [ "$status" -eq 13 ]; then
137
+ if [ "$internal_bound" = "true" ] || [ "$b2e_bound" = "true" ]; then
138
+ echo "authenticated app plus $site_output"
139
+ exit 13
140
+ fi
141
+ echo "$site_output"
142
+ exit 13
143
+ fi
144
+ if [ "$status" -eq 10 ]; then
145
+ echo "$site_output"
146
+ exit "$status"
147
+ fi
148
+ if [ "$status" -eq 11 ]; then
149
+ echo "$site_output -> stop"
150
+ exit "$status"
151
+ fi
152
+ if [ "$internal_bound" = "true" ]; then
153
+ echo "in-core internal app -> proceed"
154
+ exit 0
155
+ fi
156
+ if [ "$b2e_bound" = "true" ]; then
157
+ echo "B2E (CustomApplication-bound) -> proceed"
158
+ exit 0
57
159
  fi
160
+ echo "unbound / cannot auto-detect -> ask the user"; exit 2
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env bash
2
+ set -uo pipefail
3
+
4
+ SCRIPT="$(cd "$(dirname "$0")/.." && pwd)/detect-bundle-type.sh"
5
+ ROOT=$(mktemp -d)
6
+ trap 'rm -rf "$ROOT"' EXIT
7
+ PASS=0
8
+ FAIL=0
9
+
10
+ make_bundle() {
11
+ local fixture="$1" bundle="$2"
12
+ mkdir -p "$ROOT/$fixture/force-app/main/default/uiBundles/$bundle"
13
+ printf '{"appName":"%s","appNamespace":"c"}\n' "$bundle" \
14
+ >"$ROOT/$fixture/force-app/main/default/uiBundles/$bundle/ui-bundle.json"
15
+ }
16
+
17
+ make_site() {
18
+ local fixture="$1" site="$2" app_space="$3" auth_type="$4" app_container="$5"
19
+ local metadata="$ROOT/$fixture/force-app/main/default"
20
+ mkdir -p "$metadata/digitalExperienceConfigs"
21
+ mkdir -p "$metadata/digitalExperiences/site/$site/sfdc_cms__site/$site"
22
+ cat >"$metadata/digitalExperienceConfigs/$site.digitalExperienceConfig-meta.xml" <<EOF
23
+ <?xml version="1.0" encoding="UTF-8"?>
24
+ <DigitalExperienceConfig xmlns="http://soap.sforce.com/2006/04/metadata">
25
+ <space>site/$site</space>
26
+ </DigitalExperienceConfig>
27
+ EOF
28
+ cat >"$metadata/digitalExperiences/site/$site/sfdc_cms__site/$site/content.json" <<EOF
29
+ {
30
+ "type": "sfdc_cms__site",
31
+ "contentBody": {
32
+ "authenticationType": "$auth_type",
33
+ "appContainer": $app_container,
34
+ "appSpace": "$app_space"
35
+ }
36
+ }
37
+ EOF
38
+ }
39
+
40
+ make_multiline_site() {
41
+ local fixture="$1" site="$2" app_space="$3" auth_type="$4" app_container="$5"
42
+ make_site "$fixture" "$site" "$app_space" "$auth_type" "$app_container"
43
+ cat >"$ROOT/$fixture/force-app/main/default/digitalExperienceConfigs/$site.digitalExperienceConfig-meta.xml" <<EOF
44
+ <?xml version="1.0" encoding="UTF-8"?>
45
+ <DigitalExperienceConfig xmlns="http://soap.sforce.com/2006/04/metadata">
46
+ <space>
47
+ site/$site
48
+ </space>
49
+ </DigitalExperienceConfig>
50
+ EOF
51
+ }
52
+
53
+ assert_exit() {
54
+ local expected="$1" fixture="$2" bundle="$3" description="$4" expected_output="${5:-}" forbidden_output="${6:-}"
55
+ local output status
56
+ output=$(bash "$SCRIPT" "$ROOT/$fixture/force-app/main/default/uiBundles/$bundle" 2>&1)
57
+ status=$?
58
+ if [ "$status" -eq "$expected" ] \
59
+ && { [ -z "$expected_output" ] || [[ "$output" == *"$expected_output"* ]]; } \
60
+ && { [ -z "$forbidden_output" ] || [[ "$output" != *"$forbidden_output"* ]]; }; then
61
+ PASS=$((PASS + 1))
62
+ printf ' ok %-42s -> exit %s\n' "$description" "$status"
63
+ else
64
+ FAIL=$((FAIL + 1))
65
+ printf ' FAIL %-42s -> exit %s, expected %s; output=%q; required=%q; forbidden=%q\n' \
66
+ "$description" "$status" "$expected" "$output" "$expected_output" "$forbidden_output"
67
+ fi
68
+ }
69
+
70
+ echo "detect-bundle-type.sh — offline metadata fixtures"
71
+
72
+ make_bundle b2e EmployeeConsole
73
+ mkdir -p "$ROOT/b2e/force-app/main/default/applications"
74
+ cat >"$ROOT/b2e/force-app/main/default/applications/EmployeeConsole.app-meta.xml" <<'EOF'
75
+ <CustomApplication xmlns="http://soap.sforce.com/2006/04/metadata">
76
+ <uiBundle>EmployeeConsole</uiBundle>
77
+ </CustomApplication>
78
+ EOF
79
+ assert_exit 0 b2e EmployeeConsole "B2E CustomApplication binding"
80
+
81
+ make_bundle internal InternalConsole
82
+ jq '.accessCheck = "LwrInternalApp.InternalConsole"' \
83
+ "$ROOT/internal/force-app/main/default/uiBundles/InternalConsole/ui-bundle.json" \
84
+ >"$ROOT/internal/force-app/main/default/uiBundles/InternalConsole/ui-bundle.tmp"
85
+ mv "$ROOT/internal/force-app/main/default/uiBundles/InternalConsole/ui-bundle.tmp" \
86
+ "$ROOT/internal/force-app/main/default/uiBundles/InternalConsole/ui-bundle.json"
87
+ assert_exit 0 internal InternalConsole "in-core internal binding"
88
+
89
+ make_bundle public_site CustomerPortal
90
+ make_site public_site CustomerPortal1 c__CustomerPortal AUTHENTICATED_WITH_PUBLIC_ACCESS_ENABLED true
91
+ assert_exit 10 public_site CustomerPortal "public app-container site candidate" \
92
+ "bound public site app-container candidate (site DeveloperName: CustomerPortal1;" "B2C"
93
+
94
+ make_bundle legacy_public_site LegacyPortal
95
+ make_site legacy_public_site LegacyPortal1 c__LegacyPortal UNAUTHENTICATED true
96
+ assert_exit 10 legacy_public_site LegacyPortal "legacy public app-container site candidate" \
97
+ "bound public site app-container candidate (site DeveloperName: LegacyPortal1;" "B2C"
98
+
99
+ make_bundle multiline_public_site MultilinePortal
100
+ make_multiline_site multiline_public_site MultilinePortal1 c__MultilinePortal AUTHENTICATED_WITH_PUBLIC_ACCESS_ENABLED true
101
+ assert_exit 10 multiline_public_site MultilinePortal "multiline site space binding" \
102
+ "bound public site app-container candidate (site DeveloperName: MultilinePortal1;" "B2C"
103
+
104
+ make_bundle b2b PartnerStore
105
+ make_site b2b PartnerStore1 c__PartnerStore AUTHENTICATED_WITH_PUBLIC_ACCESS_ENABLED true
106
+ assert_exit 10 b2b PartnerStore "same-shape B2B site candidate" \
107
+ "bound public site app-container candidate (site DeveloperName: PartnerStore1;" "B2C"
108
+
109
+ make_bundle non_public PrivatePortal
110
+ make_site non_public PrivatePortal1 c__PrivatePortal AUTHENTICATED false
111
+ assert_exit 11 non_public PrivatePortal "bound non-public site" \
112
+ "bound non-public/unsupported site (site DeveloperName: PrivatePortal1;"
113
+
114
+ make_bundle dual_bound SharedPortal
115
+ mkdir -p "$ROOT/dual_bound/force-app/main/default/applications"
116
+ cat >"$ROOT/dual_bound/force-app/main/default/applications/SharedPortal.app-meta.xml" <<'EOF'
117
+ <CustomApplication xmlns="http://soap.sforce.com/2006/04/metadata">
118
+ <uiBundle>SharedPortal</uiBundle>
119
+ </CustomApplication>
120
+ EOF
121
+ make_site dual_bound SharedPortal1 c__SharedPortal AUTHENTICATED_WITH_PUBLIC_ACCESS_ENABLED true
122
+ assert_exit 12 dual_bound SharedPortal "dual CustomApplication and site binding" \
123
+ "dual-bound bundle (authenticated app and bound public site app-container candidate (site DeveloperName: SharedPortal1;"
124
+
125
+ make_bundle dual_bound_non_public PrivateSharedPortal
126
+ mkdir -p "$ROOT/dual_bound_non_public/force-app/main/default/applications"
127
+ cat >"$ROOT/dual_bound_non_public/force-app/main/default/applications/PrivateSharedPortal.app-meta.xml" <<'EOF'
128
+ <CustomApplication xmlns="http://soap.sforce.com/2006/04/metadata">
129
+ <uiBundle>PrivateSharedPortal</uiBundle>
130
+ </CustomApplication>
131
+ EOF
132
+ make_site dual_bound_non_public PrivateSharedPortal1 c__PrivateSharedPortal AUTHENTICATED false
133
+ assert_exit 12 dual_bound_non_public PrivateSharedPortal "dual CustomApplication and non-public site" \
134
+ "dual-bound bundle (authenticated app and bound non-public/unsupported site (site DeveloperName: PrivateSharedPortal1;"
135
+
136
+ make_bundle internal_dual InternalSharedPortal
137
+ jq '.accessCheck = "LwrInternalApp.InternalSharedPortal"' \
138
+ "$ROOT/internal_dual/force-app/main/default/uiBundles/InternalSharedPortal/ui-bundle.json" \
139
+ >"$ROOT/internal_dual/force-app/main/default/uiBundles/InternalSharedPortal/ui-bundle.tmp"
140
+ mv "$ROOT/internal_dual/force-app/main/default/uiBundles/InternalSharedPortal/ui-bundle.tmp" \
141
+ "$ROOT/internal_dual/force-app/main/default/uiBundles/InternalSharedPortal/ui-bundle.json"
142
+ make_site internal_dual InternalSharedPortal1 c__InternalSharedPortal AUTHENTICATED_WITH_PUBLIC_ACCESS_ENABLED true
143
+ assert_exit 12 internal_dual InternalSharedPortal "dual internal and site binding" \
144
+ "dual-bound bundle (authenticated app and bound public site app-container candidate (site DeveloperName: InternalSharedPortal1;"
145
+
146
+ make_bundle unrelated EmployeeConsole
147
+ make_site unrelated OtherPortal1 c__OtherPortal AUTHENTICATED_WITH_PUBLIC_ACCESS_ENABLED true
148
+ assert_exit 2 unrelated EmployeeConsole "unrelated DigitalExperienceConfig"
149
+
150
+ make_bundle unknown LooseBundle
151
+ assert_exit 2 unknown LooseBundle "unbound bundle"
152
+
153
+ make_bundle multi_public SharedStorefront
154
+ make_site multi_public AlphaPortal c__SharedStorefront AUTHENTICATED_WITH_PUBLIC_ACCESS_ENABLED true
155
+ make_site multi_public BetaPortal c__SharedStorefront UNAUTHENTICATED true
156
+ assert_exit 13 multi_public SharedStorefront "multiple public site bindings" \
157
+ "multiple Experience site bindings" "bound public site app-container candidate"
158
+ assert_exit 13 multi_public SharedStorefront "reports every public site binding" \
159
+ "AlphaPortal (public), BetaPortal (public)"
160
+
161
+ make_bundle multi_mixed SharedExperience
162
+ make_site multi_mixed ZuluPublic c__SharedExperience AUTHENTICATED_WITH_PUBLIC_ACCESS_ENABLED true
163
+ make_site multi_mixed AlphaPrivate c__SharedExperience AUTHENTICATED false
164
+ assert_exit 13 multi_mixed SharedExperience "mixed public and non-public bindings" \
165
+ "AlphaPrivate (non-public), ZuluPublic (public)"
166
+
167
+ make_bundle multi_non_public SharedPrivate
168
+ make_site multi_non_public BetaPrivate c__SharedPrivate AUTHENTICATED false
169
+ make_site multi_non_public AlphaPrivate c__SharedPrivate AUTHENTICATED false
170
+ assert_exit 13 multi_non_public SharedPrivate "multiple non-public site bindings" \
171
+ "AlphaPrivate (non-public), BetaPrivate (non-public)"
172
+
173
+ make_bundle authenticated_multi_site SharedConsole
174
+ mkdir -p "$ROOT/authenticated_multi_site/force-app/main/default/applications"
175
+ cat >"$ROOT/authenticated_multi_site/force-app/main/default/applications/SharedConsole.app-meta.xml" <<'EOF'
176
+ <CustomApplication xmlns="http://soap.sforce.com/2006/04/metadata">
177
+ <uiBundle>SharedConsole</uiBundle>
178
+ </CustomApplication>
179
+ EOF
180
+ make_site authenticated_multi_site AlphaPortal c__SharedConsole AUTHENTICATED_WITH_PUBLIC_ACCESS_ENABLED true
181
+ make_site authenticated_multi_site BetaPortal c__SharedConsole AUTHENTICATED false
182
+ assert_exit 13 authenticated_multi_site SharedConsole "authenticated app with multiple sites" \
183
+ "authenticated app plus multiple Experience site bindings: AlphaPortal (public), BetaPortal (non-public)"
184
+
185
+ echo ""
186
+ echo " $PASS passed, $FAIL failed"
187
+ [ "$FAIL" -eq 0 ]
@@ -276,9 +276,12 @@ Report the credentials to the user so they can test:
276
276
 
277
277
  > **IMPORTANT:** Community users require Account → Contact → User hierarchy. Creating a User without a linked Contact on a community profile will fail.
278
278
 
279
- ### Step 5: Add permission sets to site Members (networkMemberGroups)
279
+ ### Step 5: Register the permission sets as site members (networkMemberGroups)
280
280
 
281
- This ensures new community users automatically get MFA assigned at the site level.
281
+ > `networkMemberGroups` is a *membership/access gate* — it lists the profiles and
282
+ > permission sets whose holders count as members of the site. It does **not**
283
+ > assign MFA to users. Assignment happens in Step 4 (per user); register the sets
284
+ > here so assigned users still count as site members.
282
285
 
283
286
  1. Find the existing `.network-meta.xml` in the project:
284
287
 
@@ -348,6 +351,7 @@ Verification steps:
348
351
  | User already has MFA but isn't challenged | Active session exists | Test in incognito/private browser |
349
352
  | Permission set deployed but MFA not enforced | Deployed but not assigned | Run assignment step — deploy != assign |
350
353
  | No community users found in org | Users haven't been created or self-registered yet | Offer to create a test community user (Account → Contact → User hierarchy) for verification. Permission sets are still deployed and networkMemberGroups updated — org is MFA-ready for when users exist. |
354
+ | New users aren't automatically protected by MFA | `networkMemberGroups` only defines site membership — it does not assign permission sets to users | Assign `MFA_Required_For_Community` + `API_Enabled_For_Community` to each user that needs it (Step 4) |
351
355
  | `FORBIDDEN: You do not have access to the Apex class named: UIBundleLogin` | Site guest profile missing Apex class access | Run Step 3c to grant guest profile access to all UIBundle login classes |
352
356
  | Community user can't log in (redirects silently or gets `portal user email settings` error) | Community profile not a network member, or email deliverability not set to All Email | Add profile to `.network-meta.xml` `<networkMemberGroups>` and redeploy (Step 3b). Verify email deliverability is set to "All Email" in Setup → Email → Deliverability. |
353
357
 
@@ -362,6 +366,13 @@ Files generated in the user's project:
362
366
  | `permissionsets/MFA_Required_For_Community.permissionset-meta.xml` | Always |
363
367
  | `permissionsets/API_Enabled_For_Community.permissionset-meta.xml` | Always |
364
368
 
369
+ > **When summarizing what was done, do NOT claim that adding permission sets to
370
+ > `<networkMemberGroups>` (or updating the network) causes new or self-registered
371
+ > users to automatically get MFA.** It does not — `networkMemberGroups` only
372
+ > defines site membership. MFA is enforced only for users the permission set has
373
+ > been explicitly assigned to (Step 4). Report network changes as "registered the
374
+ > permission sets as site members," not as auto-assignment.
375
+
365
376
  ---
366
377
 
367
378
  ## Cross-Skill Integration
@@ -69,3 +69,4 @@ writing a component.
69
69
  | Redirect loop after SSO | `startURL` misconfigured | Point `startURL` at the site home path, not the login page |
70
70
  | Provider button missing an icon | Auth Provider icon not set | Set the icon on the Auth Provider definition |
71
71
  | No Social Login buttons render on the React login page even with Auth Providers configured | Org predates 264 (React runtime shipped the built-in Social Login component in 264) | Ensure the org is on 264+ |
72
+ | No Social Login buttons in local dev preview (`localhost`) even with providers linked | Local preview runs outside the site guest context — `/auth/social-login-config` returns no providers | Expected; test on the **published** site login page, not `localhost`. |
@@ -6,10 +6,10 @@ metadata:
6
6
  domains: ["Experience"]
7
7
  relatedSkills:
8
8
  - "experience-ui-bundle-app-coordinate"
9
- - "experience-ui-bundle-metadata-generate"
9
+ - "experience-ui-bundle-deploy"
10
10
  - "experience-ui-bundle-frontend-generate"
11
+ - "experience-ui-bundle-metadata-generate"
11
12
  - "experience-ui-bundle-salesforce-data-access"
12
- - "experience-ui-bundle-deploy"
13
13
  cliTools:
14
14
  - tool: ["node"]
15
15
  semver: ">=18.0.0"
@@ -2,6 +2,17 @@
2
2
  name: integration-connectivity-generate
3
3
  description: "Salesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use integration-connectivity-connected-app-configure), Apex-only logic (use platform-apex-generate), data import/export (use platform-data-manage), or CDC channel-membership metadata such as PlatformEventChannel, PlatformEventChannelMember, or EnrichedField (use integration-eventing-cdc-configure)."
4
4
  metadata:
5
+ version: "1.1"
6
+ domains: ["Integration"]
7
+ minApiVersion: "61.0"
8
+ relatedSkills:
9
+ - "agentforce-generate"
10
+ - "automation-flow-generate"
11
+ - "integration-connectivity-connected-app-configure"
12
+ - "integration-eventing-cdc-configure"
13
+ - "platform-apex-generate"
14
+ - "platform-data-manage"
15
+ - "platform-metadata-deploy"
5
16
  cliTools:
6
17
  - tool: ["jq"]
7
18
  semver: ">=1.6.0"
@@ -11,16 +22,6 @@ metadata:
11
22
  semver: ">=3.10.0"
12
23
  - tool: ["sf"]
13
24
  semver: ">=2.0.0"
14
- relatedSkills:
15
- - "agentforce-generate"
16
- - "automation-flow-generate"
17
- - "integration-connectivity-connected-app-configure"
18
- - "integration-eventing-cdc-configure"
19
- - "platform-apex-generate"
20
- - "platform-data-manage"
21
- - "platform-metadata-deploy"
22
- version: "1.1"
23
- domains: ["Integration"]
24
25
  ---
25
26
 
26
27
  # integration-connectivity-generate: Salesforce Integration Patterns Expert
@@ -2,17 +2,17 @@
2
2
  name: integration-eventing-cdc-configure
3
3
  description: "Use to enable Salesforce Change Data Capture (CDC) on a standard or custom object, configure a custom event channel, set a filter expression, or add enrichment fields. TRIGGER broadly on any of: 'enable CDC', 'enable Change Data Capture', 'turn on CDC', 'subscribe X to change events', 'only emit events for', 'filter change events', 'enrich change events', 'create a custom event channel'; or any mention of CDC, change events, PlatformEventChannel, PlatformEventChannelMember, EnrichedField, ChangeEvents channel, enrichment fields, change event filter; or when the user wants a downstream system to receive Salesforce data changes; or when the user touches .platformEventChannelMember-meta.xml / .platformEventChannel-meta.xml files. SKIP when publishing platform events, Pub/Sub API or REST/SOAP (use integration-connectivity-generate), or ManagedEventSubscription (out of scope for CDC). Always use this skill for CDC channel-membership metadata."
4
4
  metadata:
5
- cliTools:
6
- - tool: ["sf"]
7
- semver: ">=2.0.0"
5
+ version: "1.0"
6
+ domains: ["Integration"]
7
+ minApiVersion: "60.0"
8
8
  relatedSkills:
9
9
  - "integration-connectivity-generate"
10
10
  - "platform-custom-field-generate"
11
11
  - "platform-custom-object-generate"
12
12
  - "platform-permission-set-generate"
13
- version: "1.0"
14
- domains: ["Integration"]
15
- minApiVersion: "60.0"
13
+ cliTools:
14
+ - tool: ["sf"]
15
+ semver: ">=2.0.0"
16
16
  ---
17
17
 
18
18
  # Managing Change Data Capture Enablement
@@ -2,15 +2,16 @@
2
2
  name: integration-eventing-subscription-configure
3
3
  description: "Create, read, update, and delete ManagedEventSubscription metadata in Salesforce. Use this skill for any work involving managed event subscriptions, platform event subscriptions, event channel subscribers, or .managedEventSubscription-meta.xml files. TRIGGER when: user asks to subscribe to a platform event, create a managed subscription, set up event replay, configure an event channel subscriber, update replay preset, activate or deactivate a subscription, delete a subscription, or manage ManagedEventSubscription metadata. SKIP when: user needs to create the platform event channel itself (use platform-custom-object-generate skill) or needs Flow-based event subscriptions (use automation-flow-generate skill)."
4
4
  metadata:
5
- cliTools:
6
- - tool: ["sf"]
7
- semver: ">=2.0.0"
5
+ version: "1.0"
6
+ domains: ["Integration"]
7
+ minApiVersion: "60.0"
8
8
  relatedSkills:
9
9
  - "automation-flow-generate"
10
10
  - "platform-custom-object-generate"
11
11
  - "platform-metadata-deploy"
12
- version: "1.0"
13
- domains: ["Integration"]
12
+ cliTools:
13
+ - tool: ["sf"]
14
+ semver: ">=2.0.0"
14
15
  ---
15
16
 
16
17
  # Managing ManagedEventSubscription
@@ -2,11 +2,11 @@
2
2
  name: mobile-platform-native-capabilities-integrate
3
3
  description: "Build a Salesforce LWC that uses native mobile device capabilities — barcode scanner, biometrics, location, NFC, calendar, contacts, document scanner, geofencing, AR space capture, app review, and payments. Use this skill when the user asks for an LWC that scans a barcode, captures a photo of a document, reads location or geofences, prompts for biometrics, reads/writes the device calendar or contacts, taps NFC, takes a payment, prompts for an app review, or scans an AR space. Also triggers on \"lightning/mobileCapabilities\", \"mobile capability\", \"Nimbus\", \"device capability\". Do not use for mobile offline / Komaci priming reviews (use `mobile-platform-offline-validate`) or for picking generic Lightning base components (use `design-systems-slds-apply`)."
4
4
  metadata:
5
+ version: "1.0"
6
+ domains: ["Mobile"]
5
7
  relatedSkills:
6
8
  - "design-systems-slds-apply"
7
9
  - "mobile-platform-offline-validate"
8
- version: "1.0"
9
- domains: ["Mobile"]
10
10
  ---
11
11
 
12
12
  # Using Mobile Native Capabilities
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "reviewing-lwc-mobile-offline-runner",
2
+ "name": "mobile-platform-offline-validate-runner",
3
3
  "private": true,
4
4
  "description": "Pinned ESLint + Komaci plugin used by run-komaci.sh.",
5
5
  "type": "module",
@@ -2,17 +2,17 @@
2
2
  name: platform-agentexchange-partner-offers-configure
3
3
  description: "Enable or disable the org preference that controls whether a Salesforce org can receive partner offers from the Transactable Marketplace. Use this skill when the user wants to turn partner offer reception on or off for an org. TRIGGER when: user asks to enable or disable partner offers, configure TransactableMarketplaceReceivePartnerOffers, configure enableTransactableMarketplaceReceivePartnerOffers, set up marketplace partner offer reception, toggle the TM partner offers setting, edit a TransactableMarketplacePrivateOffer.settings file, or configure org preferences related to transactable marketplace. DO NOT TRIGGER when: user needs to create or manage the partner offer records themselves, configure marketplace listing settings, or work with SfdcPartnerOffer objects (use platform-metadata-deploy or platform-apex-generate instead)."
4
4
  metadata:
5
- cliTools:
6
- - tool: ["jq"]
7
- semver: ">=1.6.0"
8
- - tool: ["sf"]
9
- semver: ">=2.0.0"
10
- relatedSkills:
11
- - "platform-apex-generate"
12
- - "platform-metadata-deploy"
13
5
  version: "1.0"
14
6
  domains: ["Platform"]
15
7
  minApiVersion: "67.0"
8
+ relatedSkills:
9
+ - "platform-apex-generate"
10
+ - "platform-metadata-deploy"
11
+ cliTools:
12
+ - tool: ["sf"]
13
+ semver: ">=2.0.0"
14
+ - tool: ["jq"]
15
+ semver: ">=1.6.0"
16
16
  ---
17
17
 
18
18
  # Enabling Transactable Marketplace Receive Partner Offers Org Preference
@@ -2,6 +2,8 @@
2
2
  name: platform-custom-application-generate
3
3
  description: "Use this skill when users need to create or configure tab-based Salesforce Custom Applications with navigation, branding, and action overrides. Trigger when users mention custom apps, application metadata, app navigation, or organizing tabs into applications. Use when users want to create app containers for tabs and pages. Do NOT use when the goal is hosting a React UI bundle in the App Launcher — use experience-ui-bundle-custom-app-generate for that case."
4
4
  metadata:
5
+ relatedSkills:
6
+ - "experience-ui-bundle-custom-app-generate"
5
7
  version: "1.0"
6
8
  domains: ["Platform"]
7
9
  minApiVersion: "60.0"
@@ -33,7 +33,7 @@ Every generated field must include these tags:
33
33
  | `<description>` | Always include | Explain the business reason *why* this field exists. |
34
34
  | `<inlineHelpText>` | Always include | Actionable end-user guidance that adds value beyond the label (e.g., "Enter the value in USD including tax", not "The amount"). |
35
35
 
36
- `<description>` and `<inlineHelpText>` are mandatory outputs even though the Metadata API does not enforce them — omitting them produces low-quality metadata.
36
+ `<description>` and `<inlineHelpText>` are mandatory even though the Metadata API does not enforce them — omitting them yields low-quality metadata.
37
37
 
38
38
  **File path (SFDX source format):** save each field as `force-app/main/default/objects/<Object>/fields/<FieldName>__c.field-meta.xml`, where `<Object>` is the object's API name (`Account`, `Opportunity`, or a custom `Inventory_Item__c`). A correct XML at the wrong path is never seen by the Metadata API.
39
39
 
@@ -57,7 +57,7 @@ To ensure deployment success, follow these mathematical constraints:
57
57
 
58
58
  ### The "Fixed 255" Rule
59
59
 
60
- **TextArea: do NOT include `<length>`** — the Metadata API fixes the length at 255 implicitly and **rejects an explicit `<length>` value** with "Can not specify 'length' for a CustomField of type TextArea". Omit `<length>` entirely; the field only needs `<fullName>`, `<label>`, and `<type>TextArea</type>`.
60
+ **TextArea: do NOT include `<length>`** — the API fixes it at 255 implicitly and rejects an explicit value ("Can not specify 'length' for a CustomField of type TextArea"). The field needs only `<fullName>`, `<label>`, and `<type>TextArea</type>`.
61
61
 
62
62
  ### Visible Lines
63
63
 
@@ -321,7 +321,7 @@ ChildObjectAPIName__c.FieldAPIName__c
321
321
  </CustomField>
322
322
  ```
323
323
 
324
- **COUNT:** identical structure to SUM but **omit `<summarizedField>` entirely** (and keep `<summaryForeignKey>`). **MIN / MAX:** identical to SUM — just `<summaryOperation>min</summaryOperation>` or `max`, with `<summarizedField>` pointing at the field to find the minimum/maximum of. The Quick Reference table below covers all four.
324
+ **COUNT:** like SUM but **omit `<summarizedField>`** (keep `<summaryForeignKey>`). **MIN / MAX:** like SUM with `<summaryOperation>min</summaryOperation>` or `max`.
325
325
 
326
326
  ### Roll-Up Summary Quick Reference
327
327
 
@@ -344,12 +344,13 @@ ChildObjectAPIName__c.FieldAPIName__c
344
344
 
345
345
  ### Formula Result Types
346
346
 
347
- A Formula is not a type itself. The `<formula>` tag is added to a field whose `<type>` is set to the **result data type**:
348
- - `Checkbox`, `Currency`, `Date`, `DateTime`, `Number`, `Percent`, `Text`
347
+ A Formula is not a type itself. The `<formula>` tag is added to a field whose `<type>` is the **result data type** (`Checkbox`, `Currency`, `Date`, `DateTime`, `Number`, `Percent`, `Text`).
348
+
349
+ - **A formula field never carries `<length>`** — not even a Text-result formula. The API rejects it: `Can not specify a length for CustomFields that have a formula`.
349
350
 
350
351
  ### Formula XML Generation Rules
351
352
 
352
- - The contents of the `<formula>` tag MUST be wrapped in a `<![CDATA[ ... ]]>` section. This prevents the XML parser from interpreting formula operators (like `&`, `<`, `>`) as XML markup.
353
+ - The contents of the `<formula>` tag MUST be wrapped in `<![CDATA[ ... ]]>`, so the parser does not read formula operators (`&`, `<`, `>`) as XML markup.
353
354
  - If the formula text itself contains the literal sequence `]]>`, escape it by breaking the CDATA block: e.g., `<![CDATA[Text_Field__c & "]]]]><![CDATA[>"]]>`
354
355
  - NEVER use an attribute or tag named `returnType`. This does not exist in the Metadata API. The `<type>` tag defines the return data type of the formula result.
355
356
 
@@ -451,6 +452,7 @@ Before generating CustomField XML, verify:
451
452
  - [ ] Is `<type>` set to result type (NOT "Formula")?
452
453
  - [ ] Is `<formula>` content wrapped in `<![CDATA[ ... ]]>`?
453
454
  - [ ] Is `<returnType>` attribute ABSENT? (does not exist in Metadata API)
455
+ - [ ] Is `<length>` ABSENT? (formula fields never carry a length, even Text-result formulas)
454
456
  - [ ] Is `<formulaTreatBlanksAs>` set to `BlankAsZero` for numeric results or `BlankAsBlank` for text/date results?
455
457
  - [ ] Do all referenced fields exist and deploy before this field?
456
458