@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
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: service-de-headless-channel-configure-inputs
3
+ description: "Load when you need the full input list for the headless channel setup orchestrator — the base MESSAGE_TYPE/ORG_ALIAS prompt plus the type-specific fields required for WhatsApp, LINE, AppleBusinessChat, Facebook, and Text (SMS). Covers exactly which fields are required vs optional per channel type and the prompt text shown when MESSAGE_TYPE is omitted. DO NOT load for Stage 0's preflight-key derivation logic, which lives inline in the parent skill."
4
+ metadata:
5
+ version: "1.0"
6
+ related-skills: service-de-headless-channel-configure
7
+ ---
8
+
9
+ # Inputs (from user)
10
+
11
+ - `{MESSAGE_TYPE}` — one of `WhatsApp`, `Line`, `AppleBusinessChat`, `Facebook`, `Text` (`Text` is the enum value for SMS — there is no `SMS` type). If omitted, the orchestrator prompts:
12
+ ```text
13
+ Which channel type are you setting up?
14
+ 1) WhatsApp
15
+ 2) Line
16
+ 3) AppleBusinessChat
17
+ 4) Facebook
18
+ 5) Text (SMS)
19
+ Pick [1-5]:
20
+ ```
21
+ - `{ORG_ALIAS}` — optional. `sf` CLI target-org alias. Defaults to `sf config get target-org`.
22
+ - Plus the type-specific inputs, which are forwarded to the dispatcher:
23
+
24
+ ## If `MESSAGE_TYPE=WhatsApp`
25
+ - `{WABA_ID}` — WhatsApp Business Account ID
26
+ - `{PHONE_NUMBER_ID}` — Meta phone number ID (not the display number)
27
+ - `{CHANNEL_NAME}` — optional
28
+ - `{ISO_COUNTRY_CODE}` — optional, default `US`
29
+
30
+ ## If `MESSAGE_TYPE=Line`
31
+ - `{LINE_CHANNEL_ID}` — numeric LINE channel id
32
+ - `{LINE_CHANNEL_SECRET}`, `{LINE_ACCESS_TOKEN}`
33
+ - `{CHANNEL_NAME}` — optional
34
+
35
+ ## If `MESSAGE_TYPE=AppleBusinessChat`
36
+ - `{APPLE_BC_ID}` — Apple Business Chat Account ID
37
+ - `{CHANNEL_NAME}` — required
38
+
39
+ ## If `MESSAGE_TYPE=Facebook`
40
+ - `{PAGE_ID}` — optional. Facebook Page ID (numeric string). If not provided, the insertion skill runs OAuth, fetches available pages, and prompts for selection.
41
+ - `{CHANNEL_NAME}` — optional. If not provided, the insertion skill prompts for it.
42
+
43
+ ## If `MESSAGE_TYPE=Text` (SMS)
44
+ - `{SMS_NUMBER}` — the phone number / short code / toll-free number the channel sends from, already provisioned to the org. It's the platform key. **Required.**
45
+ - `{SMS_PROVIDER}` — optional. The code provider for the number (e.g. `Sinch`). The insertion skill always sends the `smsProvider` key to satisfy the Connect request shape (omitting it trips a `400`), but the value is neither validated nor persisted — it leaves no observable trace on the record. If the caller doesn't supply one it defaults to `""`; pass a real value only when you have it, since nothing downstream reads it.
46
+ - `{CHANNEL_NAME}` — optional. Falls back to the number if omitted.
47
+ - `{ISO_COUNTRY_CODE}` — optional, default `US`. Pass the real country if the number is non-US.
48
+
49
+ The orchestrator validates type-specific inputs upfront; missing ones raise a prompt before we burn a Stage 0 SOQL.
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: service-de-headless-channel-configure-output-envelopes
3
+ description: "Load when you need the canonical JSON envelope shapes this orchestrator emits — success, step-annotated failure, and terms-declined — before wiring error handling or parsing a leaf skill's response. Covers the exact field names (channelId, mcuId, stepsRun, failedStep, resumeHint, etc.) for each of the three top-level outcomes. DO NOT load for the per-stage envelope-handling tables in Stage 2-4, which already reference these shapes."
4
+ metadata:
5
+ version: "1.0"
6
+ related-skills: service-de-headless-channel-configure
7
+ ---
8
+
9
+ # Output (to user)
10
+
11
+ **Success:**
12
+ ```json
13
+ {"ok": true, "messageType": "{MESSAGE_TYPE}", "channelId": "0Mj...",
14
+ "mcuId": "0gL...", "channelName": "...", "sessionHandlerId": "00G...",
15
+ "queueName": "...", "isActive": true,
16
+ "stepsRun": ["insert","route","activate"], "stepsSkipped": ["consent"],
17
+ "totalDurationMs": 12345}
18
+ ```
19
+
20
+ On a typical fresh run `consent` lands in `stepsSkipped`, not `stepsRun`: the Connect insert
21
+ auto-seeds `ConsentType=ImplicitOptIn` + a default opt-out keyword, so the consent leaf no-ops
22
+ (`noop: true`) and the orchestrator appends `"consent"` to `stepsSkipped`. It appears in `stepsRun`
23
+ only when the caller asked for an upgrade (ExplicitOptIn/DoubleOptIn) or custom keywords, which
24
+ triggers a real write.
25
+
26
+ **Failure** (with step annotation):
27
+ ```json
28
+ {"ok": false, "failedStep": "route", "failedStepIndex": 2, "failedStepTotal": 4,
29
+ "leafEnvelope": { ...whatever the failing leaf skill returned... },
30
+ "stateSoFar": { "channelId": "0Mj...", "mcuId": "0gL...", "isActive": false,
31
+ "stepsRun": ["insert"], "stepsSkipped": [] },
32
+ "resumeHint": "fix the routing issue above, then re-run this skill — step 1 will be skipped automatically"}
33
+ ```
34
+
35
+ `stateSoFar` carries only what landed *before* the failure — the failed step itself is NOT in
36
+ `stepsRun`, and that step's output fields are absent. In this `failedStep: "route"` example routing
37
+ never completed, so `stepsRun` is `["insert"]` and there is no `sessionHandlerId`/`queueName` (Stage 3
38
+ records those and appends `"route"` only on a successful routing envelope). `stateSoFar` **always
39
+ includes both `stepsRun` and `stepsSkipped`** (each an array, possibly empty) so the renderer can read
40
+ either without a guard; here `stepsSkipped` is `[]` because the failure happened before Stage 3.5.
41
+ `stepsRun` (the ordered list of *completed* steps) is what the partial-success renderer reads to
42
+ report each step's status.
43
+ **Consent is the exception:** there is no separate `consentConfigured` flag, but because the insert
44
+ auto-seeds `ImplicitOptIn`, a consent-ready channel usually lands `"consent"` in `stepsSkipped`
45
+ (no-op), not `stepsRun`. So to answer "is consent configured?", treat *either* list — a `"consent"`
46
+ in `stepsRun` OR `stepsSkipped` means consent is activation-ready; only its total absence (a failure
47
+ before Stage 3.5) means unconfigured.
48
+
49
+ **Terms declined** (Stage 0.5 gate — returned before any org work):
50
+ ```json
51
+ {"ok": false, "kind": "terms-not-accepted",
52
+ "hint": "user did not accept the Enhanced Messaging Terms and Conditions — channel setup cannot proceed. Re-run when ready to accept."}
53
+ ```
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: service-de-headless-channel-configure-partial-success
3
+ description: "Load when the orchestrator fails mid-way through Stage 2-4 and you need to render the partial-success/resume message to the user. Covers the stateSoFar rendering template showing which of insert/route/consent/activate landed before the failure and the retry instructions. DO NOT load for the success-path Stage 5 final summary or the terms-not-accepted envelope."
4
+ metadata:
5
+ version: "1.0"
6
+ related-skills: service-de-headless-channel-configure
7
+ ---
8
+
9
+ # Partial-success and resume reporting
10
+
11
+ If the orchestrator fails mid-way, the envelope always includes `stateSoFar` describing what landed. Render as:
12
+
13
+ ```text
14
+ Error: Step {N} of 4 ({stepName}) failed: {leafEnvelope.kind} — {leafEnvelope.message or hint}
15
+
16
+ What's already in place:
17
+ - Channel inserted: {channelId ? "yes — " + channelId : "no"}
18
+ - Routing configured: {sessionHandlerId ? "yes — " + queueName : "no"}
19
+ - Consent configured: {(stepsRun.includes("consent") || (stepsSkipped || []).includes("consent")) ? "yes" : "no"}
20
+ - Activation: {isActive ? "yes" : "no"}
21
+
22
+ To retry: fix the issue above, then re-run this skill with the same
23
+ inputs. The orchestrator will skip completed steps.
24
+ ```
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: service-de-headless-channel-configure-terms-and-conditions
3
+ description: "Load when rendering the Stage 0.5 Enhanced Messaging Terms and Conditions disclaimer and certification prompt for any channel type (WhatsApp, LINE, Facebook Messenger, Apple Messages for Business, SMS/Text). Covers the verbatim disclaimer text, the per-type CHANNEL_LABEL/THIRD_PARTY substitution table, and the certification prompt wording. DO NOT load for the gate's accept/decline behavior or the terms-not-accepted envelope — those stay inline in the parent skill's Stage 0.5 section."
4
+ metadata:
5
+ version: "1.0"
6
+ related-skills: service-de-headless-channel-configure
7
+ ---
8
+
9
+ # Enhanced Messaging Terms and Conditions — disclaimer text and mappings
10
+
11
+ Render the disclaimer verbatim, substituting the human-readable channel name for `{MESSAGE_TYPE}` (`Facebook Messenger`, `WhatsApp`, `LINE`, `Apple Messages for Business`, `SMS (Text)`):
12
+
13
+ ```text
14
+ ────────────────────────────────────────────────────────────────────
15
+ Terms and Conditions
16
+ ────────────────────────────────────────────────────────────────────
17
+
18
+ The {CHANNEL_LABEL} channel you have selected is part of the service
19
+ branded as Enhanced Messaging. Enhanced Messaging features are provided
20
+ using infrastructure technology different from Messaging. Any service
21
+ level commitments and any security, privacy, data storage or processing
22
+ locations or data recovery measures that are specific to Messaging do
23
+ not apply to Enhanced Messaging features, and such information for
24
+ Enhanced Messaging features is as described in the applicable Trust and
25
+ Compliance Documentation available at
26
+ https://www.salesforce.com/company/legal/trust-and-compliance-documentation/.
27
+
28
+ The {CHANNEL_LABEL} channel integrates with third-party functionality
29
+ powered by {THIRD_PARTY}. By enabling an integration with such
30
+ functionality, you acknowledge and agree that the {CHANNEL_LABEL}
31
+ channel is a Non-SFDC Application (as defined in your main services
32
+ agreement), and your use of the {CHANNEL_LABEL} channel is subject to
33
+ the applicable third-party terms in the Enhanced Messaging Notices and
34
+ License Information Documentation.
35
+
36
+ Enhanced Messaging is also subject to the relevant Documentation and
37
+ terms on your order form for Digital Engagement.
38
+ ────────────────────────────────────────────────────────────────────
39
+
40
+ Do you certify that you have the authority to accept and bind your
41
+ organization to these terms? [yes/no]
42
+ ```
43
+
44
+ `{CHANNEL_LABEL}` and `{THIRD_PARTY}` by type:
45
+
46
+ | `{MESSAGE_TYPE}` | `{CHANNEL_LABEL}` | `{THIRD_PARTY}` |
47
+ | --- | --- | --- |
48
+ | `Facebook` | `Facebook Messenger` | `Meta Platforms, Inc. or its affiliates` |
49
+ | `WhatsApp` | `WhatsApp` | `Meta Platforms, Inc. or its affiliates` |
50
+ | `Line` | `LINE` | `LINE Corporation or its affiliates` |
51
+ | `AppleBusinessChat` | `Apple Messages for Business` | `Apple Inc. or its affiliates` |
52
+ | `Text` | `SMS (Text)` | the supplied `{SMS_PROVIDER}` (e.g. `Sinch`), else `your SMS provider` |
53
+
54
+ The certification prompt mirrors the wizard's checkbox — *"I hereby certify that I have the authority to accept and bind my organization to these terms."*
@@ -0,0 +1,108 @@
1
+ # Worked examples: `service-de-headless-channel-configure`
2
+
3
+ Four reference traces: a fresh WhatsApp run (the most common path), a resume after a mid-flow failure, an Apple Business Chat dispatch (to show type-agnostic flow), and an unsupported-type rejection. Read these when you need to see the exact envelope shapes the orchestrator emits at each outcome.
4
+
5
+ ---
6
+
7
+ ## Worked example: fresh WhatsApp channel on test1
8
+
9
+ Input (hypothetical, against `test1`):
10
+ - `MESSAGE_TYPE=WhatsApp`
11
+ - `WABA_ID=1558753535400324`
12
+ - `PHONE_NUMBER_ID=1005595132638768`
13
+ - `CHANNEL_NAME` = (omitted)
14
+
15
+ **Stage 0**: type known from input. `{PLATFORM_KEY} = PHONE_NUMBER_ID`. Required WhatsApp inputs (`WABA_ID`, `PHONE_NUMBER_ID`) both present — proceed.
16
+
17
+ **Stage 1**: preflight SOQL keyed off `MessagingPlatformKey=1005595132638768 AND MessageType='WhatsApp'` returns 0 records → `CURRENT_STATE=fresh`. First step: insert.
18
+
19
+ **Stage 2** (insert): `service-de-channel-create` runs (with `MESSAGE_TYPE=WhatsApp`):
20
+ - Its Stage 1 preflight (same SOQL; still empty)
21
+ - Its Stage 2 linking prereq (`service-de-waba-integrate`) — user confirms Meta partnership is in place
22
+ - Its Stage 3 Connect API POST — inserts `MessagingChannel 0MjSG...` + MCU `0gLSG...`
23
+ - Its Stage 4 verify — MCU subquery returns one row with `DeploymentType=Conversation`, `DeploymentStatus=Disabled`
24
+
25
+ Returns `{ok:true, channelId:"0MjSG...", mcuId:"0gLSG...", developerName:"WHATSAPP_US_...", isActive:false, messageType:"WhatsApp", path:"connect", created:true, durationMs:3210}` to the orchestrator. `STEPS_RUN=["insert"]`.
26
+
27
+ **Stage 3** (route): `service-de-channel-routing-configure` prompts user. User picks existing `Messaging_Queue` (`00GSG0000000LSf2AM`). PATCH lands. `STEPS_RUN=["insert","route"]`.
28
+
29
+ **Stage 3.5** (consent): `service-de-channel-consent-configure` runs. The insert auto-seeded `ConsentType=ImplicitOptIn` + a default opt-out `MsgChannelLanguageKeyword` (STOP-family + confirmation), so the leaf's Stage 1 finds the channel already activation-ready and returns `noop:true` — no write needed. (Had the user asked for ExplicitOptIn/DoubleOptIn or custom keywords, the leaf would upgrade it here.) `STEPS_RUN=["insert","route"]`, `STEPS_SKIPPED=["consent"]`.
30
+
31
+ **Stage 4** (activate): `service-de-channel-activate` PATCHes `MessagingChannelUsage.DeploymentStatus='Provisioning'` via REST. The PATCH blocks synchronously until the server-side observer chain finishes, then returns 204 with `DeploymentStatus=Active` → `channel.IsActive=true` in ~15-21s (Meta `/register` round-trip). `STEPS_RUN=["insert","route","activate"]`.
32
+
33
+ **Stage 5**: Emits:
34
+ ```json
35
+ {"ok":true, "messageType":"WhatsApp", "channelId":"0MjSG...", "mcuId":"0gLSG...",
36
+ "channelName":"+1 650-555-0199", "sessionHandlerId":"00GSG0000000LSf2AM",
37
+ "queueName":"Messaging Queue", "isActive":true,
38
+ "stepsRun":["insert","route","activate"], "stepsSkipped":["consent"], "totalDurationMs":8421}
39
+ ```
40
+
41
+ User sees `Success — WhatsApp channel '+1 650-555-0199' is live on test1.` plus the detail lines.
42
+
43
+ ---
44
+
45
+ ## Worked example: resume after routing failure
46
+
47
+ Same inputs as above, but imagine Stage 3 failed the first time because the user's session lost permission to deploy Queue metadata.
48
+
49
+ **First run** — orchestrator gets through stages 0-2, stage 3 fails:
50
+ ```json
51
+ {"ok":false, "failedStep":"route", "failedStepIndex":2, "failedStepTotal":4,
52
+ "leafEnvelope":{"ok":false,"kind":"metadata-deploy-failed","message":"INSUFFICIENT_ACCESS_OR_READONLY"},
53
+ "stateSoFar":{"channelId":"0MjSG...", "mcuId":"0gLSG...",
54
+ "sessionHandlerId":null, "isActive":false,
55
+ "stepsRun":["insert"], "stepsSkipped":[]},
56
+ "resumeHint":"fix the routing issue above, then re-run this skill — step 1 will be skipped automatically"}
57
+ ```
58
+
59
+ User fixes the permission, re-runs with the same inputs.
60
+
61
+ **Second run**:
62
+ - **Stage 0** type known (user provided `WhatsApp` again). Inputs validated.
63
+ - **Stage 1** preflight now returns 1 record: `{channelId, IsActive:false, SessionHandlerId:null, FallbackQueueId:null, ...}` → `CURRENT_STATE=inserted-no-routing`. First step: route.
64
+ - **Stage 2** (insert): skipped. `STEPS_SKIPPED=["insert"]`. The dispatcher + all per-type prereqs (including the WABA linking prompt) are skipped entirely, which is the whole point of preflight short-circuiting.
65
+ - **Stage 3** (route): runs fresh, succeeds this time. `STEPS_RUN=["route"]`.
66
+ - **Stage 3.5** (consent): the channel was inserted on the *first* run, so its consent was auto-seeded then (`ConsentType=ImplicitOptIn` + default opt-out keyword). The leaf's Stage 1 finds it already activation-ready and returns `noop:true` — no write. `STEPS_SKIPPED=["consent"]`. (Only an explicit Explicit/DoubleOptIn or custom-keyword request would make this a real write.)
67
+ - **Stage 4** (activate): runs. `STEPS_RUN=["route","activate"]`.
68
+ - **Stage 5**: success, with `stepsRun: ["route","activate"]` and `stepsSkipped: ["insert","consent"]` visible in the report.
69
+
70
+ The user sees that resume happened, and the total time reflects only what was re-done.
71
+
72
+ ---
73
+
74
+ ## Worked example: Apple Business Chat dispatch
75
+
76
+ Shows the type-agnostic flow — same orchestrator, different leaf via the dispatcher.
77
+
78
+ Input:
79
+ - `MESSAGE_TYPE=AppleBusinessChat`
80
+ - `APPLE_BC_ID=abc123-def456-...` (GUID)
81
+ - `CHANNEL_NAME="Acme Apple Support"`
82
+
83
+ **Stage 0**: type known. `{PLATFORM_KEY} = APPLE_BC_ID`. Apple-required inputs (`APPLE_BC_ID`, `CHANNEL_NAME`) present — proceed.
84
+
85
+ **Stage 1**: preflight SOQL keyed off `MessagingPlatformKey='abc123-...' AND MessageType='AppleBusinessChat'` returns 0 records → `CURRENT_STATE=fresh`.
86
+
87
+ **Stage 2** (insert): `service-de-channel-create` runs with `MESSAGE_TYPE=AppleBusinessChat`. The user supplies the Apple BC Account ID (obtained on the Apple Business Register side beforehand), and the skill inserts the channel. Returns with `messageType:"AppleBusinessChat"`.
88
+
89
+ **Stages 3-5**: routing and activation are identical to the WhatsApp path — they operate on `MessagingChannel.Id` + `MessagingChannelUsage.Id`, which don't care about message type.
90
+
91
+ Final envelope identical shape to the WhatsApp run but with `messageType: "AppleBusinessChat"`.
92
+
93
+ ---
94
+
95
+ ## Worked example: unsupported type rejection
96
+
97
+ User invokes without specifying a type, gets the prompt, then types `wechat`.
98
+
99
+ **Stage 0**: prompt shows `1) WhatsApp / 2) Line / 3) AppleBusinessChat / 4) Facebook / 5) Text (SMS)`. Input `wechat` doesn't match any — orchestrator re-prompts or halts with:
100
+ ```json
101
+ {"ok":false, "kind":"unsupported-type", "messageType":"wechat",
102
+ "supportedTypes":["WhatsApp","Line","AppleBusinessChat","Facebook","Text"],
103
+ "hint":"WeChat needs its own insertion leaf, not yet built — supported types are WhatsApp, Line, AppleBusinessChat, Facebook, Text"}
104
+ ```
105
+
106
+ Alternatively, if the orchestrator forwards `WeChat` directly to the dispatcher without validating upfront, the dispatcher (`service-de-channel-create`) emits the same `unsupported-type` envelope and the orchestrator passes it through with `failedStep: "insert"`.
107
+
108
+ Either way the user gets a clear "this type isn't supported" message rather than a confusing mid-flow error.
@@ -0,0 +1,227 @@
1
+ ---
2
+ name: service-de-waba-integrate
3
+ description: "Confirm the customer's WhatsApp Business Account is shared with Salesforce on Meta's side. Pure instruction + one user-confirmation prompt — no API calls, no token handling. The actual sharing happens in Meta Business Suite (UI-only; Meta provides no Graph endpoint to automate this step). Renders step-by-step instructions with Salesforce's Business Manager ID substituted in, then asks the user to confirm whether \"Salesforce\" appears in the WABA's Partners list."
4
+ metadata:
5
+ version: "1.0"
6
+ minApiVersion: "67.0"
7
+ domains: ["Service"]
8
+ relatedSkills:
9
+ - "service-de-channel-create"
10
+ ---
11
+
12
+ # Linking a WABA to Salesforce
13
+
14
+ ## What this skill does
15
+
16
+ Gets the customer from "I have a WABA" to "my WABA is linked to Salesforce" — entirely by instruction. Meta intentionally gates this behind the human-approval UI at business.facebook.com; there's no Graph write endpoint that scripts the partnership. The two GET endpoints that would let us probe state (`/{waba-id}/subscribed_apps`, `/{waba-id}/assigned_users`) need a Meta access token with `whatsapp_business_management` scope that the customer would have to generate — a bigger ask than just "check your Partners tab."
17
+
18
+ So the skill is 100% instruction rendering + one confirmation prompt. No API calls. No SF DB writes. No Meta tokens.
19
+
20
+ After this skill returns success, downstream insertion (`service-de-channel-create`) can proceed: the SF-side `setupLiveMessageChannelEnhanced` path doesn't require us to have proven the partnership — it'll fail with a clear Meta-precondition error if the customer lied, and our skill trusts the customer's confirmation.
21
+
22
+ ## When NOT to use this skill
23
+
24
+ - **You've already confirmed the partnership on a previous run.** The orchestrator's resume logic doesn't short-circuit Stage 1 (no cheap SF-side probe exists), so this skill always runs — but it's just text + a prompt, no round trip.
25
+ - **You're inserting a non-WhatsApp channel.** Line / Apple / Facebook don't use Meta Business Manager partnerships. Skip this skill entirely for those paths.
26
+ - **The customer is using the Embedded Signup popup instead.** That's a different flow (popup-driven, SF-UI-side OAuth); this skill is specifically the headless alternative.
27
+
28
+ ## Inputs (from caller)
29
+
30
+ - `{WABA_ID}` — WhatsApp Business Account ID. Used only for rendering (so the instructions say "open YOUR WABA" with the right id visible).
31
+ - `{SF_BM_ID}` — optional. Defaults to `10152614792574154` (Salesforce's Business Manager ID, confirmed by user 2026-04-29; see IMPLEMENTATION.md §13 journey log). Override only if Salesforce issues a different BM ID for a specific partner program.
32
+
33
+ ## Output (to caller)
34
+
35
+ **Success — user confirmed the partnership is in place:**
36
+ ```json
37
+ {"ok": true, "linked": true, "path": "user-confirmed",
38
+ "note": "partnership confirmed by user; subsequent channel insert will
39
+ surface any server-side issues clearly"}
40
+ ```
41
+
42
+ **Failure — partnership not yet in place:**
43
+ ```json
44
+ {"ok": false, "kind": "partnership-blocked",
45
+ "hint": "customer reported Salesforce is not in the Partners tab;
46
+ most likely causes: (a) WABA ID typo, (b) user lacks admin
47
+ role in the Business Manager, (c) partnership request still
48
+ pending Meta approval. Retry this skill after resolving."}
49
+ ```
50
+
51
+ **Failure — user-declined or dropped:**
52
+ ```json
53
+ {"ok": false, "kind": "user-declined",
54
+ "hint": "user cancelled the linking step; re-run the orchestrator
55
+ when the customer is ready to click through Business Suite"}
56
+ ```
57
+
58
+ ---
59
+
60
+ ## Stage 1: Render the instructions
61
+
62
+ Substitute `{WABA_ID}` and `{SF_BM_ID}` and **output the following directly as markdown text to the user** (do NOT use `cat`, `echo`, or any Bash command that would collapse the output):
63
+
64
+ ```markdown
65
+ ──────────────────────────────────────────────────────────────
66
+ **Before we can insert the WhatsApp channel in Salesforce, your
67
+ WhatsApp Business Account must be shared with Salesforce on
68
+ Meta's side.** Meta gates this step behind business.facebook.com —
69
+ there's no API we can call to automate it.
70
+
71
+ ## One-time steps (takes ~2 minutes):
72
+
73
+ 1. Go to https://business.facebook.com
74
+ 2. In the left nav, open "WhatsApp Accounts" and click your
75
+ WABA (ID: **{WABA_ID}**)
76
+ 3. Click the "Partners" tab at the top of the WABA page
77
+ 4. Look at the list:
78
+ - **If "Salesforce" (or "Salesforce.com") is already listed
79
+ with Full control** — you're done, nothing to do.
80
+ - **If NOT listed** (or listed with only partial access):
81
+
82
+ a. Click "Add partners" → "Share account with partner"
83
+
84
+ b. Paste this Business Manager ID in "Enter partner
85
+ business ID":
86
+
87
+ ```
88
+ {SF_BM_ID}
89
+ ```
90
+
91
+ c. Scroll to the "Full control" section at the bottom
92
+ and toggle ON "Everything":
93
+
94
+ ```
95
+ [x] Everything — manage all settings, assign users,
96
+ view payment information and send messages
97
+ ```
98
+
99
+ This is the option Salesforce needs. The Partial
100
+ access toggles above (Phone numbers / Message
101
+ templates / Messages) do NOT cover assigning users
102
+ or managing webhook subscriptions — those require
103
+ the Full control option. Don't try to grant access
104
+ piecemeal through Partial access.
105
+
106
+ d. Click "Assign"
107
+
108
+ ## Notes:
109
+ - Your Meta Business Manager must be business-verified for Meta
110
+ to accept the partnership. If it's not verified, Meta will
111
+ block the "Assign" step with a clear error.
112
+ - You need admin role on the Business Manager to assign partners.
113
+ If you're a regular employee, ask an admin on your team.
114
+ - Max 2 partners per WABA. If you've already shared with another
115
+ BSP, Salesforce would be the second — which is fine.
116
+ ──────────────────────────────────────────────────────────────
117
+ ```
118
+
119
+ **CRITICAL:** Output this text directly in your response to the user, not via Bash/cat/echo. Tool results get collapsed; direct text output stays visible.
120
+
121
+ ---
122
+
123
+ ## Stage 2: Ask for confirmation
124
+
125
+ Use AskUserQuestion to prompt:
126
+
127
+ ```text
128
+ Question: Is "Salesforce" now showing in the Partners tab for this WABA?
129
+ Header: Partnership
130
+ Options:
131
+ 1. Yes — already there or just added it
132
+ (Salesforce appears in the Partners tab with Full control)
133
+ 2. No — still not showing
134
+ (Partnership not yet in place after attempting to add it)
135
+ 3. Skip — abort setup for now
136
+ (Not going to complete this step right now)
137
+ ```
138
+
139
+ Do not try to validate the answer with Meta. Trust the user. If they said yes and lied, downstream `service-de-channel-create` will fail with a `meta-precondition` envelope that clearly names the issue — that's a cleaner failure than fabricating a probe here that would need a customer Meta token.
140
+
141
+ ---
142
+
143
+ ## Stage 3: Emit the envelope
144
+
145
+ Based on the user's answer, construct the appropriate envelope and **write it to `/tmp/linking-waba-result.json`** so the calling skill can parse it:
146
+
147
+ | User's answer | Envelope to write |
148
+ | --- | --- |
149
+ | `y` | `{"ok":true, "linked":true, "path":"user-confirmed", "note":"partnership confirmed by user; subsequent channel insert will surface any server-side issues clearly"}` |
150
+ | `n` | `{"ok":false, "kind":"partnership-blocked", "hint":"customer reported Salesforce is not in the Partners tab; most likely causes: (a) WABA ID typo, (b) user lacks admin role in the Business Manager, (c) partnership request still pending Meta approval. Retry this skill after resolving."}` |
151
+ | `s` | `{"ok":false, "kind":"user-declined", "hint":"user cancelled the linking step; re-run the orchestrator when the customer is ready to click through Business Suite"}` |
152
+
153
+ Write the envelope using:
154
+ ```bash
155
+ echo '{envelope json}' > /tmp/linking-waba-result.json
156
+ ```
157
+
158
+ Then display the human-readable summary to the user:
159
+
160
+ - For `y`: `Success — WABA linked — Salesforce confirmed as a partner on WABA {WABA_ID}. Proceed to service-de-channel-create.`
161
+ - For `n`: `Error: Partnership not yet in place — fix the issue on Meta's side (see instructions above) and re-run. Common fixes: check WABA ID, confirm your Business Manager is business-verified, confirm you have admin role.`
162
+ - For `s`: `⏸ Linking skipped by user — re-run when ready.`
163
+
164
+ ---
165
+
166
+ ## Worked example: customer already has Salesforce shared
167
+
168
+ Input: `{WABA_ID}=1558753535400324`
169
+
170
+ **Stage 1**: skill renders the instructions with the WABA ID visible. Customer opens Business Suite → WhatsApp Accounts → 1558753535400324 → Partners. Sees "Salesforce" in the list.
171
+
172
+ **Stage 2**: customer answers `y`.
173
+
174
+ **Stage 3**: emits:
175
+ ```json
176
+ {"ok":true, "linked":true, "path":"user-confirmed",
177
+ "note":"partnership confirmed by user; subsequent channel insert will surface any server-side issues clearly"}
178
+ ```
179
+
180
+ Orchestrator continues to `service-de-channel-create`.
181
+
182
+ ## Worked example: customer needs to add the partnership
183
+
184
+ Same input. Customer opens Business Suite, doesn't see Salesforce in Partners, clicks Add partners → Share account with partner → pastes `10152614792574154` → scrolls down to the "Full control" section → toggles ON "Everything" → Assign. Meta shows "Partnership request sent" or similar. Partnership lands (usually instant; occasionally pending for a few minutes if Meta needs to review).
185
+
186
+ Customer answers `y` after confirming Salesforce now shows up.
187
+
188
+ Orchestrator continues.
189
+
190
+ ## Worked example: Business Manager not business-verified
191
+
192
+ Customer clicks Assign and Meta rejects with "Your business must be verified to assign partners." Customer answers `n` in our prompt.
193
+
194
+ **Stage 3**: emits:
195
+ ```json
196
+ {"ok":false, "kind":"partnership-blocked",
197
+ "hint":"customer reported Salesforce is not in the Partners tab; most likely causes: (a) WABA ID typo, (b) user lacks admin role in the Business Manager, (c) partnership request still pending Meta approval. Retry this skill after resolving."}
198
+ ```
199
+
200
+ Orchestrator emits a step-annotated failure pointing at this skill; user pursues business verification through Meta separately and re-runs later.
201
+
202
+ ---
203
+
204
+ ## Gotchas
205
+
206
+ 1. **We can't probe state without a customer Meta token.** `GET /{waba-id}/subscribed_apps` and `GET /{waba-id}/assigned_users` would confirm SF's app is subscribed / user is assigned, but both need a token the customer would have to generate in a Meta app — a 20-minute detour to save one prompt. Not worth it. Trust the customer's eyeballs.
207
+
208
+ 2. **"Salesforce in Partners" ≠ "SF webhook subscription landed."** Subscription is a separate server-side event that happens *after* the partnership is in place, when SF's BSP app notices and calls its own internal setup. The customer's confirmation in this skill is about the *partnership*, not subscription state — subscription will catch up by the time `service-de-channel-create` runs. If it hasn't, the insert fails clearly with a Meta-precondition error and we retry.
209
+
210
+ 3. **The `SF_BM_ID` is a single static value.** `10152614792574154` is Salesforce's Business Manager ID, the same for every customer in every org. Confirmed 2026-04-29 (IMPLEMENTATION.md §13). Don't let callers override it casually — if someone passes a different value, they've likely misunderstood what the field is for. Keep the override capability for edge cases (SF issuing a partner-specific BM ID at some future date), but don't document it prominently.
211
+
212
+ 4. **The "Users" tab and the "Partners" tab are different.** Older IMPLEMENTATION.md drafts used the "add SF admin user" framing (users tab); the current canonical flow is "add SF as Partner" with the BM ID above. Both end up granting Salesforce access to the WABA, but the Partners flow is cleaner (no per-user maintenance, permission scoping is by partner role). Stick with Partners.
213
+
214
+ 5. **Embedded Signup is an alternative, not a complement.** Customers using the Embedded Signup popup skip this skill entirely — the popup handles partnership grant inline via Meta's OAuth flow. This skill is for the headless path (customer prefers Business Suite click-through over a browser popup). Don't try to run both.
215
+
216
+ 6. **Orchestrator calls this skill even on resume.** There's no SF-side state to check (the subscription landing is silent), so re-runs re-render the instructions and re-prompt. That's fine — the prompt is near-instant if the customer already confirmed before, and this skill produces no side-effects. Idempotency is inherent.
217
+
218
+ 7. **No `sf` CLI commands, no SOQL, no HTTP.** This skill should be pure text + one prompt. If a future version wants to probe state (customer-supplied Meta token via env var, etc.), that's an additive enhancement — don't let it crowd the happy path. The instruction-only design is the feature.
219
+
220
+ 8. **Max 2 partners per WABA.** If the customer is already sharing with another BSP (Twilio, 360dialog, etc.), Salesforce would be partner #2 — fine. If they've got 2 BSPs already, Meta blocks the Assign — customer would need to remove one first. This is rare but documented in the Stage 1 rendered text so customers hit a known error message rather than a mysterious failure.
221
+
222
+ 9. **"Full control / Everything" is required, not just the Partial access toggles.** Meta's partner-share dialog has two sections: "Partial access" (individual toggles: Phone numbers view/manage, Message templates view/manage, Manage phone numbers and message templates, Messages) and "Full control" (a single "Everything" toggle). Salesforce needs **Full control / Everything** because:
223
+ - **Assigning users** — SF provisions service accounts on the WABA to operate it. Only the Everything toggle grants this; none of the Partial access toggles cover it.
224
+ - **Webhook subscription management** — `POST /{waba-id}/subscribed_apps` (which lets SF's BSP app receive inbound messages) requires `whatsapp_business_management` scope, which maps to Full control, not the partial toggles.
225
+ - **Credit-line / payment method visibility** — needed so SF can route sends through the customer's own billing. Explicitly only in the "Everything" description ("view payment information").
226
+
227
+ If a customer grants only partial access (e.g. just "Manage phone numbers and message templates"), the channel *may* insert successfully on the SF side but activation/send will fail later with opaque Meta errors about missing permissions. The Partial access path is for non-BSP integrations (marketing tools that only need to send templated messages, etc.), not BSPs. Don't let anyone "optimize" the rendered instructions toward narrower permissions — it's a false economy that surfaces as a confusing failure much later in the flow.
@@ -0,0 +1,29 @@
1
+ #!/bin/bash
2
+ # Verifies the target org's API version meets the minimum requirement.
3
+ # Usage: check-api-version.sh <min-version> <org-alias>
4
+ # Exits 0 if version >= min-version, exits 1 with error message otherwise.
5
+
6
+ MIN_VERSION="${1:?Usage: check-api-version.sh <min-version> <org-alias>}"
7
+ ORG_ALIAS="${2:?Usage: check-api-version.sh <min-version> <org-alias>}"
8
+
9
+ API_VERSION=$(sf org display --target-org "$ORG_ALIAS" --json 2>/dev/null | python3 -c "
10
+ import json, sys
11
+ try:
12
+ data = json.load(sys.stdin)
13
+ print(data.get('result', {}).get('apiVersion', ''))
14
+ except Exception:
15
+ print('')
16
+ ")
17
+
18
+ if [ -z "$API_VERSION" ]; then
19
+ echo "ERROR: Could not determine API version for org '$ORG_ALIAS'."
20
+ exit 1
21
+ fi
22
+
23
+ if python3 -c "import sys; sys.exit(0 if float(sys.argv[1]) >= float(sys.argv[2]) else 1)" "$API_VERSION" "$MIN_VERSION"; then
24
+ echo "OK: Org API version $API_VERSION meets minimum $MIN_VERSION."
25
+ exit 0
26
+ else
27
+ echo "ERROR: Org API version $API_VERSION is below minimum $MIN_VERSION. Generate a sfdx-project.json with \"sourceApiVersion\": \"$MIN_VERSION\" in the metadata output folder."
28
+ exit 1
29
+ fi
@@ -28,7 +28,7 @@ The operation is idempotent: if the component is already present it is updated i
28
28
 
29
29
  ## Scope
30
30
 
31
- - **In scope**: Detecting LWR vs Aura bundle type; scaffolding missing LWR template routes required by the site template (e.g. `too-many-requests`); patching the home-page JSON to insert or update the Embedded Messaging component; staging the bundle into `force-app`; async deploy with polling; resolving the `Network.Name` and publishing the site; guest-URL smoke test; manual Experience Builder fallback with a deep link.
31
+ - **In scope**: Detecting LWR vs Aura bundle type; scaffolding missing LWR template routes required by the site template (e.g. `too-many-requests`); patching all `sfdc_cms__themeLayout/*/content.json` files to insert or update the Embedded Messaging component in the footer region (site-wide placement); staging the bundle into `force-app`; async deploy with polling; resolving the `Network.Name` and publishing the site; guest-URL smoke test; manual Experience Builder fallback with a deep link.
32
32
  - **Out of scope**: Creating the `EmbeddedServiceConfig` (Embedded Service Deployment) itself — use `service-digital-engagement-deployment-configure`; creating the `MessagingChannel` — use `service-digital-engagement-channel-configure`; creating the Experience Cloud site itself — use `experience-lwr-site-generate`; generating a standalone JS snippet for a non-Experience website.
33
33
 
34
34
  ---
@@ -92,15 +92,15 @@ Read `references/bundle_detection.md` for retrieval command shapes and troublesh
92
92
 
93
93
  3. **Scaffold any missing LWR template routes** (commonly `too-many-requests`) before patching — missing routes fail the deploy. Route+view scaffolding is owned by `experience-lwr-site-generate` (see its `configure-content-route.md`, `configure-content-view.md`, and `handle-component-and-region-ids.md`). Delegate to that skill for the actual scaffold; this skill only supplies the messaging-specific context (which route the deploy is complaining about, and confirmation that the scaffolded pair resolves that specific deploy error). See `references/lwr_route_scaffolding.md` for the delegation pointer.
94
94
 
95
- 4. **Patch the home page** by running:
95
+ 4. **Patch all themeLayout files** by running:
96
96
 
97
97
  ```bash
98
98
  scripts/patch_lwr_bundle.sh \
99
- <retrieve-dir>/digitalExperiences/site/<siteName>/sfdc_cms__view/home/content.json \
99
+ <retrieve-dir>/digitalExperiences/site/<siteName> \
100
100
  <deploymentName> <scrtUrl> <siteEndpoint>
101
101
  ```
102
102
 
103
- The script deterministically walks `.contentBody.component.children[]`, targets the region with `.type == "region"` and `.name == "content"`, and either updates the existing `.definition == "experience_messaging:embeddedMessaging"` component in place (preserving its `id`) or appends a fresh `community_layout:section` wrapper with a JSON-string `sectionConfig`. See `references/lwr_patch.md` for the JSON shapes it emits and how to verify.
103
+ The script iterates every `sfdc_cms__themeLayout/*/content.json` file. For each, it locates the `footer` region at `.contentBody.component.children[]`, walks into the existing `community_layout:section` wrapper's inner slot region, and either updates the existing `experience_messaging:embeddedMessaging` component in place (preserving its `id`) or appends a fresh component node. Targeting the themeLayout footer makes the widget site-wide (floating overlay on every page), equivalent to the Aura themeFooter placement. See `references/lwr_patch.md` for the JSON shapes and how to verify.
104
104
 
105
105
  5. Proceed to Phase 4.
106
106
 
@@ -195,7 +195,7 @@ Read `references/bundle_detection.md` for retrieval command shapes and troublesh
195
195
  | Preserve the existing component `id` when updating in place | Ensures idempotency; the Experience runtime keys off `id` |
196
196
  | Every new `id` must be a fresh UUID | Duplicate IDs corrupt the layout and can fail render |
197
197
  | LWR uses `definition` / `attributes`; Aura uses `componentName` / `componentAttributes` | Wrong key names silently drop the component from render |
198
- | LWR `community_layout:section` `sectionConfig` is a JSON string, not a nested object | The Experience CMS serializer expects a string |
198
+ | LWR `community_layout:section` `sectionConfig` lives inside `.attributes` as a JSON string (not a top-level property, not a nested object) | Top-level placement violates the schema's `additionalProperties: false` constraint; the serializer also expects a string not an object |
199
199
  | Aura sibling `<siteName>.site-meta.xml` must be copied alongside the bundle | Deploy is rejected without it |
200
200
  | Poll the async deploy; do not fire-and-forget | Publish must run only after deploy succeeds |
201
201
  | Resolve `Network.Name` from `UrlPathPrefix`, do not reuse site `DeveloperName` | The two are frequently different |
@@ -215,7 +215,7 @@ Read `references/bundle_detection.md` for retrieval command shapes and troublesh
215
215
  | `sf community publish` fails with "community not found" | The `Network.Name` differs from site `DeveloperName`; resolve via `UrlPathPrefix` query |
216
216
  | Guest URL returns `403` or `503` after publish | Publish is async — retry the smoke test after 60s before falling back to manual |
217
217
  | Re-run adds a second messaging component | The recursive search matched on the wrong key name; component detection must use `definition` (LWR) or `componentName` (Aura) |
218
- | Deploy succeeds but widget does not appear | The messaging component is present in a region that is not on the site's home page — patch `home/content.json` (LWR) or `homeGuestLayout.json` (Aura), not another view |
218
+ | Deploy succeeds but widget does not appear on all pages | For LWR, confirm the component was injected into `sfdc_cms__themeLayout/*/content.json` footer (not `sfdc_cms__view/home/content.json` — that is page-specific). For Aura, confirm `homeGuestLayout.json` was patched (themeFooter region). |
219
219
  | `sectionConfig` written as an object | Serialize it as a JSON string; the CMS parser will not accept an object |
220
220
 
221
221
  ---
@@ -231,8 +231,9 @@ Read `references/bundle_detection.md` for retrieval command shapes and troublesh
231
231
  - [ ] For Aura, are the keys `componentName` and `componentAttributes`?
232
232
  - [ ] When updating in place, was the existing `id` preserved?
233
233
  - [ ] When appending, are all new `id` values fresh UUIDs?
234
- - [ ] For LWR, is `sectionConfig` a JSON *string* (not a nested object)?
235
- - [ ] For LWR, do the UUIDs referenced inside `sectionConfig` match the section `id` and child region `id`?
234
+ - [ ] For LWR, did the script patch every `sfdc_cms__themeLayout/*/content.json` (not just `home/content.json`)?
235
+ - [ ] For LWR, does the messaging node appear inside the `footer` region's subtree in each themeLayout?
236
+ - [ ] For LWR, is `clientVersion` set to `"WebV2"` in the messaging node attributes?
236
237
 
237
238
  ### Deploy
238
239
  - [ ] For Aura, was `<siteName>.site-meta.xml` copied alongside the bundle?
@@ -253,7 +254,7 @@ Read `references/bundle_detection.md` for retrieval command shapes and troublesh
253
254
 
254
255
  Deliverables:
255
256
 
256
- - Modified home-page JSON in the retrieval directory and in `force-app/main/default/...`
257
+ - Modified `sfdc_cms__themeLayout/*/content.json` files (one per themeLayout) in the retrieval directory and in `force-app/main/default/...` (LWR); or modified `homeGuestLayout.json` (Aura)
257
258
  - (LWR only, if needed) new `sfdc_cms__route/<RouteApiName>/` + `sfdc_cms__view/<viewId>/` pair for any scaffolded missing route
258
259
  - Deploy `job-id` and the final deploy report
259
260
  - Publish confirmation