@salesforce/afv-skills 1.55.0 → 1.57.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 (274) hide show
  1. package/package.json +1 -1
  2. package/skills/agentforce-generate/SKILL.md +8 -0
  3. package/skills/agentforce-generate/references/actions-reference.md +2 -2
  4. package/skills/agentforce-generate/references/voice-modality-reference.md +51 -15
  5. package/skills/agentforce-generate/references/voice-telephony-cli.md +193 -0
  6. package/skills/agentforce-observe/SKILL.md +13 -9
  7. package/skills/agentforce-observe/references/ahm-alerts.md +193 -14
  8. package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +24 -15
  9. package/skills/automation-sandbox-post-copy-config-generate/assets/config_template.json +11 -0
  10. package/skills/automation-sandbox-post-copy-config-generate/assets/json_schema.json +33 -1
  11. package/skills/automation-sandbox-post-copy-config-generate/references/configuration_catalog.md +32 -1
  12. package/skills/automation-sandbox-post-copy-configure/SKILL.md +75 -71
  13. package/skills/automation-sandbox-post-copy-configure/assets/scheduled_apex_template.apex +13 -0
  14. package/skills/automation-sandbox-post-copy-configure/examples/sample_scheduled_apex_config.json +13 -0
  15. package/skills/automation-sandbox-post-copy-configure/references/scheduled_apex_path.md +155 -0
  16. package/skills/automation-sandbox-post-copy-configure/scripts/build-scheduled-apex.mjs +62 -0
  17. package/skills/automation-sandbox-post-copy-configure/scripts/soql-escape-job-name.mjs +28 -0
  18. package/skills/commerce-b2b-open-code-components-integrate/SKILL.md +1 -1
  19. package/skills/commerce-b2b-open-code-components-replace/SKILL.md +16 -16
  20. package/skills/consumer-goods-accruals-datakit-deploy/SKILL.md +383 -0
  21. package/skills/consumer-goods-accruals-datakit-deploy/scripts/setup.js +324 -0
  22. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/00-check-prerequisites.js +63 -0
  23. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/01-download-static-resource.js +100 -0
  24. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/02-replace-org-id.js +46 -0
  25. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/03-deploy-metadata.js +46 -0
  26. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/04-deploy-engine.js +198 -0
  27. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/05-deploy-tpm-accruals.js +231 -0
  28. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/06-create-dataspace.js +82 -0
  29. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/07-deploy-accruals-reports.js +517 -0
  30. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/08-deploy-ui.js +416 -0
  31. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/09-completion.js +44 -0
  32. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/utils.js +514 -0
  33. package/skills/consumer-goods-sync-management-configure/SKILL.md +137 -0
  34. package/skills/consumer-goods-sync-management-configure/examples/scenarios.md +294 -0
  35. package/skills/consumer-goods-sync-management-configure/references/act1-setup-sync.md +333 -0
  36. package/skills/consumer-goods-sync-management-configure/references/act2-assign-users.md +324 -0
  37. package/skills/consumer-goods-sync-management-configure/references/act3-plan-verify.md +113 -0
  38. package/skills/consumer-goods-sync-management-configure/references/readiness-and-enablement.md +164 -0
  39. package/skills/consumer-goods-sync-management-configure/references/sync-management-app-install-backbone.md +159 -0
  40. package/skills/consumer-goods-sync-management-configure/references/transports-and-namespace.md +220 -0
  41. package/skills/consumer-goods-sync-management-configure/references/verify-and-smoke.md +175 -0
  42. package/skills/dx-devops-project-manage/SKILL.md +1 -1
  43. package/skills/dx-org-analyze/SKILL.md +0 -1
  44. package/skills/dx-org-analyze/scripts/collect_org_data.py +2 -2
  45. package/skills/dx-org-analyze/scripts/compute_diff.py +2 -4
  46. package/skills/dx-org-analyze/scripts/introspect_org.py +4 -40
  47. package/skills/dx-org-manage/SKILL.md +6 -50
  48. package/skills/dx-org-manage/examples/README.md +10 -16
  49. package/skills/dx-org-manage/references/scratch-org-create.md +1 -1
  50. package/skills/dx-org-manage/references/scratch-org-operations.md +1 -1
  51. package/skills/dx-org-shape-manage/SKILL.md +4 -3
  52. package/skills/education-cloud-domain-configure/references/gotchas-extended.md +1 -0
  53. package/skills/experience-accessibility-validate/SKILL.md +8 -5
  54. package/skills/experience-accessibility-validate/references/reviewers/sc-1-1-1-non-text-content.md +1 -4
  55. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-i-lists.md +0 -4
  56. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-ii-tables.md +20 -85
  57. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-iii-form-labels.md +4 -4
  58. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-iv-regions.md +0 -4
  59. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-v-groups.md +2 -4
  60. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-5-identify-input.md +0 -4
  61. package/skills/experience-accessibility-validate/references/reviewers/sc-1-4-3-contrast.md +4 -14
  62. package/skills/experience-accessibility-validate/references/reviewers/sc-2-1-1-keyboard.md +9 -5
  63. package/skills/experience-accessibility-validate/references/reviewers/sc-2-4-4-link-purpose.md +1 -4
  64. package/skills/experience-accessibility-validate/references/reviewers/sc-2-4-6-headings-labels.md +0 -4
  65. package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-1-pointer-gestures.md +0 -4
  66. package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-2-pointer-cancellation.md +0 -4
  67. package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-3-label-in-name.md +0 -4
  68. package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-7-dragging-movement.md +0 -4
  69. package/skills/experience-accessibility-validate/references/reviewers/sc-3-2-1-on-focus.md +0 -4
  70. package/skills/experience-accessibility-validate/references/reviewers/sc-3-2-2-on-input.md +1 -4
  71. package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-1-error-identification.md +1 -4
  72. package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-2-labels-instructions.md +1 -4
  73. package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-3-error-suggestion.md +1 -4
  74. package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-i-name.md +4 -5
  75. package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-ii-role.md +1 -4
  76. package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-iii-value.md +0 -4
  77. package/skills/experience-cms-content-generate/SKILL.md +1 -1
  78. package/skills/experience-cms-content-render/SKILL.md +3 -3
  79. package/skills/experience-cms-content-render/assets/angular/MediaRenderer.component.ts +35 -7
  80. package/skills/experience-cms-content-render/assets/angular/cms-item.service.ts +13 -4
  81. package/skills/experience-cms-content-render/assets/react/MediaRenderer.tsx +30 -8
  82. package/skills/experience-cms-content-render/assets/react/useCmsItem.ts +14 -4
  83. package/skills/experience-cms-content-render/assets/shared/cmsCore.types.ts +11 -1
  84. package/skills/experience-cms-content-render/assets/shared/externalRefs.ts +1 -1
  85. package/skills/experience-cms-content-render/assets/shared/mediaLabels.ts +62 -0
  86. package/skills/experience-cms-content-render/references/init-scaffold.md +13 -6
  87. package/skills/experience-content-media-stock-image-search/SKILL.md +0 -1
  88. package/skills/experience-lwc-accessibility-jest-run/SKILL.md +104 -25
  89. package/skills/experience-lwc-accessibility-jest-run/assets/jest.config.js +4 -0
  90. package/skills/experience-lwc-accessibility-jest-run/assets/sa11y-jest-setup.js +5 -0
  91. package/skills/experience-lwc-design-generate/SKILL.md +1 -1
  92. package/skills/experience-lwc-legacy-migrate/SKILL.md +212 -0
  93. package/skills/experience-lwc-legacy-migrate/assets/lo20-host-page-template.html +192 -0
  94. package/skills/experience-lwc-legacy-migrate/references/aura-to-lwc-completeness-checklist.md +188 -0
  95. package/skills/experience-lwc-legacy-migrate/references/lightning-out-2-system-reference.md +495 -0
  96. package/skills/experience-lwc-legacy-migrate/references/lightning-out-beta-to-2-migration.md +824 -0
  97. package/skills/experience-lwc-legacy-migrate/scripts/convert-lo-names.py +94 -0
  98. package/skills/experience-lwc-legacy-migrate/scripts/validate-lo20-page.py +133 -0
  99. package/skills/experience-ui-bundle-app-coordinate/SKILL.md +5 -5
  100. package/skills/experience-ui-bundle-features-generate/SKILL.md +65 -36
  101. package/skills/experience-ui-bundle-features-generate/references/angular/features.md +74 -0
  102. package/skills/experience-ui-bundle-features-generate/references/react/features.md +59 -0
  103. package/skills/experience-ui-bundle-features-generate/scripts/detect-framework.sh +73 -0
  104. package/skills/experience-ui-bundle-frontend-generate/SKILL.md +2 -2
  105. package/skills/experience-ui-bundle-metadata-generate/SKILL.md +26 -14
  106. package/skills/experience-ui-bundle-metadata-generate/references/angular-metadata-generate.md +37 -0
  107. package/skills/experience-ui-bundle-metadata-generate/references/react-metadata-generate.md +32 -0
  108. package/skills/experience-ui-bundle-metadata-generate/scripts/detect-framework.sh +73 -0
  109. package/skills/experience-ui-bundle-metadata-generate/scripts/verify-bundle-location.sh +30 -8
  110. package/skills/experience-ui-bundle-project-generate/SKILL.md +1 -1
  111. package/skills/field-service-data-capture-migrate/SKILL.md +391 -0
  112. package/skills/field-service-data-capture-migrate/assets/sample-legacy-flow.flow-meta.xml +163 -0
  113. package/skills/field-service-data-capture-migrate/references/architecture-notes.md +40 -0
  114. package/skills/field-service-data-capture-migrate/references/component-mapping.md +278 -0
  115. package/skills/field-service-data-capture-migrate/references/converter-builder-contract.md +183 -0
  116. package/skills/field-service-data-capture-migrate/references/dc-platform-rules.md +130 -0
  117. package/skills/field-service-data-capture-migrate/references/fsm-dc-capability-catalog.md +215 -0
  118. package/skills/field-service-data-capture-migrate/references/known-deploy-errors.md +36 -0
  119. package/skills/field-service-data-capture-migrate/references/migration-checklist.md +121 -0
  120. package/skills/field-service-data-capture-migrate/references/transformer-rules.md +132 -0
  121. package/skills/field-service-data-capture-migrate/scripts/analyze_flow.py +277 -0
  122. package/skills/field-service-data-capture-migrate/scripts/convert_to_dc_spec.py +1311 -0
  123. package/skills/field-service-data-capture-migrate/scripts/cud_analysis.py +402 -0
  124. package/skills/field-service-data-capture-migrate/scripts/deploy_flow.sh +230 -0
  125. package/skills/field-service-data-capture-migrate/scripts/discover_subflow_tree.py +230 -0
  126. package/skills/field-service-data-capture-migrate/scripts/flow_input.py +186 -0
  127. package/skills/field-service-data-capture-migrate/scripts/flow_xml_utils.py +39 -0
  128. package/skills/field-service-data-capture-migrate/scripts/fsm_dc_catalog.py +413 -0
  129. package/skills/field-service-data-capture-migrate/scripts/generate_summary.py +199 -0
  130. package/skills/field-service-data-capture-migrate/scripts/json_to_flow_xml.py +146 -0
  131. package/skills/field-service-data-capture-migrate/scripts/manual_review_flags.py +42 -0
  132. package/skills/field-service-data-capture-migrate/scripts/retrieve_flow_rest.sh +155 -0
  133. package/skills/field-service-data-capture-migrate/scripts/subflow_names.py +49 -0
  134. package/skills/field-service-data-capture-migrate/scripts/transform_flow.py +1661 -0
  135. package/skills/field-service-data-capture-migrate/scripts/validate_flow.sh +147 -0
  136. package/skills/field-service-data-capture-migrate/scripts/vendor/build_flow.py +1258 -0
  137. package/skills/integration-connectivity-connected-app-configure/SKILL.md +5 -5
  138. package/skills/integration-connectivity-generate/SKILL.md +10 -10
  139. package/skills/integration-connectivity-generate/scripts/configure-named-credential.sh +2 -2
  140. package/skills/life-sciences-fieldsalesrep-coordinate/SKILL.md +1 -1
  141. package/skills/life-sciences-fieldsalesrep-coordinate/references/orchestration-flow.md +1 -1
  142. package/skills/life-sciences-kam-coordinate/references/stage-5-data-and-plan-templates-overview.md +14 -1
  143. package/skills/mobile-apps-create/SKILL.md +1 -1
  144. package/skills/{platform-agentsetup-categories-fetch → platform-agenticsetup-categories-get}/SKILL.md +7 -7
  145. package/skills/platform-apex-test-generate/SKILL.md +1 -1
  146. package/skills/platform-apex-test-run/SKILL.md +1 -1
  147. package/skills/platform-custom-field-generate/SKILL.md +1 -1
  148. package/skills/platform-custom-lightning-type-generate/SKILL.md +1 -1
  149. package/skills/platform-custom-metadata-type-generate/SKILL.md +1 -1
  150. package/skills/platform-custom-object-generate/SKILL.md +1 -1
  151. package/skills/platform-custom-report-type-generate/SKILL.md +1 -1
  152. package/skills/platform-custom-setting-generate/SKILL.md +1 -1
  153. package/skills/platform-data-and-tooling-api-context-get/SKILL.md +1 -1
  154. package/skills/platform-data-manage/SKILL.md +10 -10
  155. package/skills/platform-flexipage-generate/SKILL.md +1 -1
  156. package/skills/platform-lightning-app-coordinate/SKILL.md +1 -1
  157. package/skills/platform-metadata-api-context-get/SKILL.md +1 -1
  158. package/skills/platform-metadata-retrieve/SKILL.md +1 -1
  159. package/skills/platform-permission-set-generate/SKILL.md +1 -1
  160. package/skills/platform-report-generate/SKILL.md +1 -1
  161. package/skills/platform-salesforce-connect-adapter-generate/SKILL.md +4 -4
  162. package/skills/platform-sandbox-configure/SKILL.md +108 -133
  163. package/skills/platform-sandbox-configure/references/api-response-shapes.md +39 -0
  164. package/skills/platform-sandbox-configure/references/definition-file-approach.md +73 -0
  165. package/skills/platform-sharing-owd-configure/SKILL.md +1 -1
  166. package/skills/platform-sharing-rules-generate/SKILL.md +1 -1
  167. package/skills/platform-soql-query/SKILL.md +1 -1
  168. package/skills/platform-value-set-generate/SKILL.md +1 -1
  169. package/skills/platform-widget-generate/SKILL.md +26 -18
  170. package/skills/platform-widget-generate/examples/formulas.json +191 -0
  171. package/skills/platform-widget-generate/references/widget-formulas.md +123 -0
  172. package/skills/platform-widget-generate/references/widget-meta-directives.md +4 -4
  173. package/skills/sales-call-scoring-configure/SKILL.md +318 -0
  174. package/skills/sales-call-scoring-configure/assets/best-practice-competencies.json +67 -0
  175. package/skills/sales-call-scoring-configure/assets/ootb-competencies.json +58 -0
  176. package/skills/sales-call-scoring-configure/references/admin-communication.md +79 -0
  177. package/skills/sales-call-scoring-configure/references/competency-crud.md +130 -0
  178. package/skills/sales-call-scoring-configure/scripts/create-competency.sh +166 -0
  179. package/skills/sales-call-scoring-configure/scripts/create-custom-competency.sh +166 -0
  180. package/skills/sales-call-scoring-configure/scripts/edit-competency.sh +185 -0
  181. package/skills/sales-call-scoring-configure/scripts/edit-custom-competency.sh +190 -0
  182. package/skills/sales-call-scoring-configure/scripts/enable-call-scoring.sh +436 -0
  183. package/skills/sales-call-scoring-configure/scripts/get-competency.sh +72 -0
  184. package/skills/sales-call-scoring-configure/scripts/get-custom-competency.sh +78 -0
  185. package/skills/sales-call-scoring-configure/scripts/install-best-practice-competencies.sh +223 -0
  186. package/skills/sales-call-scoring-configure/scripts/install-ootb-competencies.sh +237 -0
  187. package/skills/sales-call-scoring-configure/scripts/list-competencies.sh +99 -0
  188. package/skills/sales-call-scoring-configure/scripts/shared/auth.sh +116 -0
  189. package/skills/sales-call-scoring-configure/scripts/shared/cap.sh +86 -0
  190. package/skills/sales-call-scoring-configure/scripts/shared/soap.sh +267 -0
  191. package/skills/sales-call-scoring-configure/scripts/shared/soql.sh +25 -0
  192. package/skills/sales-call-scoring-configure/scripts/toggle-competency.sh +112 -0
  193. package/skills/sales-call-scoring-configure/scripts/toggle-custom-competency.sh +125 -0
  194. package/skills/sales-call-scoring-configure/scripts/verify-ootb-competencies.sh +116 -0
  195. package/skills/service-agentforce-human-escalation-configure/SKILL.md +4 -0
  196. package/skills/service-agentforce-human-escalation-configure/scripts/tests/_bootstrap.py +26 -6
  197. package/skills/service-agentforce-human-escalation-configure/scripts/tests/test_escalation_contracts.py +5 -4
  198. package/skills/service-concierge-portal-generate/references/portal-deploy-runbook.md +1 -0
  199. package/skills/service-de-channel-activate/SKILL.md +6 -5
  200. package/skills/service-de-channel-create/SKILL.md +3 -3
  201. package/skills/service-de-channel-routing-configure/SKILL.md +3 -3
  202. package/skills/service-de-channel-settings-configure/SKILL.md +195 -0
  203. package/skills/service-de-channel-settings-configure/references/channel-settings-facets.md +152 -0
  204. package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/gotchas.md +3 -3
  205. package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/language-keywords.md +4 -4
  206. package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/worked-examples.md +14 -14
  207. package/skills/service-de-headless-channel-configure/SKILL.md +6 -6
  208. package/skills/service-de-headless-channel-configure/references/worked-examples.md +1 -1
  209. package/skills/service-de-waba-integrate/SKILL.md +2 -1
  210. package/skills/service-digital-engagement-deployment-configure/SKILL.md +2 -0
  211. package/skills/service-digital-engagement-deployment-configure/scripts/check-api-version.sh +29 -0
  212. package/skills/service-email-to-case-configure/SKILL.md +1 -1
  213. package/skills/service-helpagent-coordinate/SKILL.md +3 -2
  214. package/skills/service-helpagent-coordinate/references/channel-voice.md +15 -4
  215. package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +49 -31
  216. package/skills/service-itsm-agentic-setup-agentforce-coordinate/examples/output-templates.md +71 -6
  217. package/skills/service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs +26 -4
  218. package/skills/service-itsm-agentic-setup-cmdb-access-assign/SKILL.md +35 -10
  219. package/skills/service-itsm-agentic-setup-cmdb-access-assign/references/mcp-invocation.md +25 -5
  220. package/skills/service-itsm-agentic-setup-cmdb-bundle-deploy/SKILL.md +1 -1
  221. package/skills/service-itsm-agentic-setup-cmdb-configure/SKILL.md +5 -5
  222. package/skills/service-itsm-agentic-setup-cmdb-configure/references/mcp-invocation.md +1 -1
  223. package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +2 -2
  224. package/skills/service-itsm-agentic-setup-cmdb-coordinate/examples/output-templates.md +1 -1
  225. package/skills/service-itsm-agentic-setup-cmdb-discovery-configure/SKILL.md +25 -15
  226. package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +8 -5
  227. package/skills/service-itsm-agentic-setup-employee-agent-configure/references/report-format.md +4 -2
  228. package/skills/service-itsm-agentic-setup-employee-agent-configure/references/workflow-detail.md +1 -1
  229. package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/render-report.mjs +29 -16
  230. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +8 -5
  231. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/report-format.md +4 -2
  232. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/workflow-detail.md +1 -1
  233. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/render-report.mjs +29 -16
  234. package/skills/service-itsm-agentic-setup-incident-management/SKILL.md +138 -68
  235. package/skills/service-itsm-agentic-setup-incident-management/examples/output-templates.md +31 -15
  236. package/skills/service-itsm-agentic-setup-incident-management/references/incident-persona-psg.md +156 -0
  237. package/skills/service-itsm-agentic-setup-incident-management/references/incident-preferences.md +148 -0
  238. package/skills/service-itsm-agentic-setup-incident-management/references/major-incident-management.md +162 -0
  239. package/skills/service-itsm-agentic-setup-incident-management/references/service-mgmt-privilege.md +149 -0
  240. package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +103 -89
  241. package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/attach-milestone.json +2 -2
  242. package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/predefined-incident-policy.json +21 -39
  243. package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/milestone-patterns.md +3 -3
  244. package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/output-templates.md +18 -1
  245. package/skills/service-itsm-agentic-setup-incident-sla-configure/references/mcp-invocation.md +63 -37
  246. package/skills/service-omni-attribute-routing-configure/SKILL.md +53 -0
  247. package/skills/service-omni-attribute-routing-configure/references/api-notes.md +7 -0
  248. package/skills/service-omni-attribute-routing-configure/scripts/configure-and-report.sh +224 -0
  249. package/skills/service-omni-attribute-routing-configure/scripts/tests/test_attribute_routing_contracts.py +137 -0
  250. package/skills/service-omni-channel-inventory-analyze/SKILL.md +96 -0
  251. package/skills/service-omni-channel-inventory-analyze/references/api-notes.md +52 -0
  252. package/skills/service-omni-channel-inventory-analyze/scripts/analyze.sh +185 -0
  253. package/skills/service-omni-channel-inventory-analyze/scripts/tests/_bootstrap.py +84 -0
  254. package/skills/service-omni-channel-inventory-analyze/scripts/tests/test_inventory_analyze_contracts.py +141 -0
  255. package/skills/service-omni-channel-limits-analyze/SKILL.md +70 -0
  256. package/skills/service-omni-channel-limits-analyze/references/api-notes.md +22 -0
  257. package/skills/service-omni-channel-limits-analyze/scripts/analyze.sh +159 -0
  258. package/skills/service-omni-channel-limits-analyze/scripts/tests/_bootstrap.py +87 -0
  259. package/skills/service-omni-channel-limits-analyze/scripts/tests/test_limits_analyze_contracts.py +99 -0
  260. package/skills/service-omni-channel-setup-coordinate/SKILL.md +12 -20
  261. package/skills/service-omni-channel-setup-coordinate/scripts/integration-driver.sh +55 -5
  262. package/skills/service-omni-channel-setup-coordinate/scripts/tests/test_omni_contracts.py +38 -0
  263. package/skills/service-omni-command-center-analyze/SKILL.md +2 -2
  264. package/skills/service-omni-command-center-analyze/scripts/analyze.sh +3 -3
  265. package/skills/dx-org-manage/examples/snapshots/error_output.json +0 -9
  266. package/skills/dx-org-manage/examples/snapshots/success_output.json +0 -15
  267. package/skills/dx-org-manage/references/cli_flags.md +0 -67
  268. package/skills/dx-org-manage/references/creating-snapshot.md +0 -103
  269. package/skills/dx-org-manage/references/snapshot_usage.md +0 -74
  270. package/skills/experience-accessibility-validate/scripts/contrast-ratio.py +0 -153
  271. package/skills/experience-lwc-accessibility-jest-run/references/running-sa11y-jest-tests.md +0 -205
  272. package/skills/experience-ui-bundle-features-generate/scripts/verify-react-bundle.sh +0 -14
  273. /package/skills/experience-ui-bundle-features-generate/references/{conflict-resolution-schema.json → common/conflict-resolution-schema.json} +0 -0
  274. /package/skills/{platform-agentsetup-categories-fetch → platform-agenticsetup-categories-get}/references/api-response-schema.md +0 -0
@@ -0,0 +1,112 @@
1
+ #!/bin/bash
2
+
3
+ # Activate or deactivate a Coaching Competency by DeveloperName or Id.
4
+ # Toggles IsActive via Tooling API PATCH.
5
+ #
6
+ # Deactivation preserves historical EnablementCompetencyEval scores (per the
7
+ # entity XML comment on IsActive).
8
+ #
9
+ # Usage: ./toggle-competency.sh <org-alias> <name-or-id> <activate|deactivate>
10
+
11
+ set -euo pipefail
12
+
13
+ export NO_COLOR=1
14
+ export FORCE_COLOR=0
15
+
16
+ ORG_ALIAS="${1:-}"
17
+ IDENT="${2:-}"
18
+ ACTION="${3:-}"
19
+
20
+ if [[ -z "$ORG_ALIAS" || -z "$IDENT" || -z "$ACTION" ]]; then
21
+ echo "Usage: $0 <org-alias> <name-or-id> <activate|deactivate>"
22
+ exit 1
23
+ fi
24
+
25
+ if [[ "$ACTION" != "activate" && "$ACTION" != "deactivate" ]]; then
26
+ echo "Action must be 'activate' or 'deactivate'"
27
+ exit 1
28
+ fi
29
+
30
+ TARGET=$([[ "$ACTION" == "activate" ]] && echo "true" || echo "false")
31
+
32
+ # ---------------------------------------------------------------------------
33
+ # Auth
34
+ # ---------------------------------------------------------------------------
35
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
36
+ # shellcheck source=shared/auth.sh
37
+ source "$SCRIPT_DIR/shared/auth.sh"
38
+ # shellcheck source=shared/soql.sh
39
+ source "$SCRIPT_DIR/shared/soql.sh"
40
+
41
+ resolve_org_auth "$ORG_ALIAS" || exit 1
42
+
43
+ TOOLING_BASE="services/data/v68.0/tooling"
44
+
45
+ # ---------------------------------------------------------------------------
46
+ # Resolve identifier → Id + current state
47
+ # ---------------------------------------------------------------------------
48
+ # Ids start with 1nA (keyPrefix). Anything else is treated as DeveloperName or MasterLabel.
49
+ if [[ "$IDENT" =~ ^1nA[0-9a-zA-Z]{12,15}$ ]]; then
50
+ WHERE="Id='${IDENT}'"
51
+ else
52
+ SAFE=$(soql_escape "$IDENT")
53
+ WHERE="DeveloperName='${SAFE}' OR MasterLabel='${SAFE}'"
54
+ fi
55
+
56
+ QUERY="SELECT+Id,MasterLabel,IsActive+FROM+EnablementCompetencyDef+WHERE+$(printf '%s' "$WHERE" | jq -sRr @uri)"
57
+ LOOKUP=$(sf api request rest "${TOOLING_BASE}/query/?q=${QUERY}" --target-org "$ORG_ALIAS" 2>/dev/null) || true
58
+
59
+ RECORD_COUNT=$(echo "$LOOKUP" | jq -r '.totalSize // 0')
60
+ if [[ "$RECORD_COUNT" == "0" ]]; then
61
+ echo "No competency found matching: $IDENT"
62
+ exit 1
63
+ fi
64
+ if [[ "$RECORD_COUNT" != "1" ]]; then
65
+ echo "Multiple competencies matched '$IDENT' — refusing to bulk-toggle."
66
+ echo "$LOOKUP" | jq -r '.records[] | " \(.Id) \(.MasterLabel)"'
67
+ exit 1
68
+ fi
69
+
70
+ REC_ID=$(echo "$LOOKUP" | jq -r '.records[0].Id')
71
+ REC_LABEL=$(echo "$LOOKUP" | jq -r '.records[0].MasterLabel')
72
+ REC_STATE=$(echo "$LOOKUP" | jq -r '.records[0].IsActive')
73
+
74
+ echo "$REC_LABEL ($REC_ID) — currently IsActive=$REC_STATE"
75
+
76
+ # Idempotency
77
+ if [[ "$REC_STATE" == "$TARGET" ]]; then
78
+ echo "Already $ACTION'd — no-op."
79
+ exit 0
80
+ fi
81
+
82
+ # Enforce 8-active cap when activating.
83
+ if [[ "$ACTION" == "activate" ]]; then
84
+ ACTIVE_COUNT=$( (sf api request rest \
85
+ "${TOOLING_BASE}/query/?q=SELECT+COUNT()+FROM+EnablementCompetencyDef+WHERE+IsActive=true" \
86
+ --target-org "$ORG_ALIAS" 2>/dev/null || true) | jq -r '.totalSize // 0' 2>/dev/null)
87
+ ACTIVE_COUNT="${ACTIVE_COUNT:-0}"
88
+ if [[ "$ACTIVE_COUNT" -ge 8 ]]; then
89
+ echo "Cannot activate: org already has $ACTIVE_COUNT active competencies (max 8)."
90
+ echo " Deactivate one first, then retry."
91
+ exit 1
92
+ fi
93
+ fi
94
+
95
+ # ---------------------------------------------------------------------------
96
+ # PATCH
97
+ # ---------------------------------------------------------------------------
98
+ PAYLOAD=$(jq -n --argjson v "$TARGET" '{IsActive: $v}')
99
+
100
+ if RESP_BODY=$(sf api request rest "${TOOLING_BASE}/sobjects/EnablementCompetencyDef/${REC_ID}" \
101
+ --target-org "$ORG_ALIAS" \
102
+ --method PATCH \
103
+ --header 'Content-Type: application/json' \
104
+ --body "$PAYLOAD" \
105
+ 2>/dev/null); then
106
+ echo "${ACTION}d $REC_LABEL — IsActive now $TARGET"
107
+ exit 0
108
+ else
109
+ echo "Error: PATCH failed"
110
+ echo " $RESP_BODY"
111
+ exit 1
112
+ fi
@@ -0,0 +1,125 @@
1
+ #!/bin/bash
2
+ # sales_call_scoring: story="custom-competency-crud" owner="W-CUSTOM-CRUD"
3
+ #
4
+ # Activate or deactivate a Coaching Competency by DeveloperName or Id.
5
+ # Toggles IsActive via Tooling API PATCH.
6
+ #
7
+ # Deactivation preserves historical EnablementCompetencyEval scores (per the
8
+ # entity XML comment on IsActive) so a rehired competency picks up its
9
+ # existing evaluation history.
10
+ #
11
+ # Companion of create-custom-competency.sh — parallel to toggle-competency.sh
12
+ # so the custom-CRUD story can iterate the activate/deactivate surface
13
+ # independently.
14
+ #
15
+ # Usage: ./toggle-custom-competency.sh <org-alias> <name-or-id> <activate|deactivate>
16
+
17
+ set -euo pipefail
18
+
19
+ export NO_COLOR=1
20
+ export FORCE_COLOR=0
21
+
22
+ ORG_ALIAS="${1:-}"
23
+ IDENT="${2:-}"
24
+ ACTION="${3:-}"
25
+
26
+ if [[ -z "$ORG_ALIAS" || -z "$IDENT" || -z "$ACTION" ]]; then
27
+ echo "Usage: $0 <org-alias> <name-or-id> <activate|deactivate>"
28
+ exit 1
29
+ fi
30
+
31
+ if [[ "$ACTION" != "activate" && "$ACTION" != "deactivate" ]]; then
32
+ echo "Action must be 'activate' or 'deactivate'"
33
+ exit 1
34
+ fi
35
+
36
+ TARGET=$([[ "$ACTION" == "activate" ]] && echo "true" || echo "false")
37
+
38
+ # ---------------------------------------------------------------------------
39
+ # Auth
40
+ # ---------------------------------------------------------------------------
41
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
42
+ # shellcheck source=shared/auth.sh
43
+ source "$SCRIPT_DIR/shared/auth.sh"
44
+ # shellcheck source=shared/soql.sh
45
+ source "$SCRIPT_DIR/shared/soql.sh"
46
+
47
+ resolve_org_auth "$ORG_ALIAS" || exit 1
48
+
49
+ TOOLING_BASE="services/data/v68.0/tooling"
50
+
51
+ # ---------------------------------------------------------------------------
52
+ # Resolve identifier
53
+ # ---------------------------------------------------------------------------
54
+ if [[ "$IDENT" =~ ^1nA[0-9a-zA-Z]{12,15}$ ]]; then
55
+ WHERE="Id='${IDENT}'"
56
+ else
57
+ SAFE=$(soql_escape "$IDENT")
58
+ WHERE="DeveloperName='${SAFE}' OR MasterLabel='${SAFE}'"
59
+ fi
60
+
61
+ QUERY="SELECT+Id,MasterLabel,IsActive+FROM+EnablementCompetencyDef+WHERE+$(printf '%s' "$WHERE" | jq -sRr @uri)"
62
+ LOOKUP=$(sf api request rest "${TOOLING_BASE}/query/?q=${QUERY}" --target-org "$ORG_ALIAS" 2>/dev/null || true)
63
+
64
+ RECORD_COUNT=$(echo "$LOOKUP" | jq -r '.totalSize // 0' 2>/dev/null || echo "0")
65
+ if [[ "$RECORD_COUNT" == "0" ]]; then
66
+ echo "No competency found matching: $IDENT"
67
+ exit 1
68
+ fi
69
+ if [[ "$RECORD_COUNT" != "1" ]]; then
70
+ echo "Multiple competencies matched '$IDENT' — refusing to bulk-toggle."
71
+ echo "$LOOKUP" | jq -r '.records[] | " \(.Id) \(.MasterLabel)"'
72
+ exit 1
73
+ fi
74
+
75
+ REC_ID=$(echo "$LOOKUP" | jq -r '.records[0].Id')
76
+ REC_LABEL=$(echo "$LOOKUP" | jq -r '.records[0].MasterLabel')
77
+ REC_STATE=$(echo "$LOOKUP" | jq -r '.records[0].IsActive')
78
+
79
+ echo "$REC_LABEL ($REC_ID) — currently IsActive=$REC_STATE"
80
+
81
+ # Idempotency
82
+ if [[ "$REC_STATE" == "$TARGET" ]]; then
83
+ echo "Already $ACTION'd — no-op."
84
+ exit 0
85
+ fi
86
+
87
+ # Enforce 8-active cap when activating. Refuse with a rich report — the
88
+ # activate path can't auto-fallback because "activate to inactive" is a
89
+ # no-op; the admin must actively free a slot.
90
+ if [[ "$ACTION" == "activate" ]]; then
91
+ # shellcheck source=shared/cap.sh
92
+ source "$SCRIPT_DIR/shared/cap.sh"
93
+
94
+ ACTIVE_COUNT=$(query_active_count "$ORG_ALIAS")
95
+ if [[ "$ACTIVE_COUNT" -ge "$MAX_ACTIVE_COMPETENCIES" ]]; then
96
+ echo "Cannot activate '$REC_LABEL' — org is at the 8-active competency cap."
97
+ print_cap_report "$ORG_ALIAS" "activating '$REC_LABEL'"
98
+ echo " Once a slot is free, retry:"
99
+ echo ""
100
+ echo " $0 $ORG_ALIAS $REC_ID activate"
101
+ echo ""
102
+ exit 1
103
+ fi
104
+ fi
105
+
106
+ # ---------------------------------------------------------------------------
107
+ # PATCH
108
+ # ---------------------------------------------------------------------------
109
+ PAYLOAD=$(jq -n --argjson v "$TARGET" '{IsActive: $v}')
110
+
111
+ # sf api request rest exits non-zero on HTTP failure; success on Tooling
112
+ # PATCH is HTTP 204 (empty body). Capture both stdout and exit status.
113
+ if RESP_BODY=$(sf api request rest "${TOOLING_BASE}/sobjects/EnablementCompetencyDef/${REC_ID}" \
114
+ --target-org "$ORG_ALIAS" \
115
+ --method PATCH \
116
+ --header 'Content-Type: application/json' \
117
+ --body "$PAYLOAD" \
118
+ 2>&1); then
119
+ echo "${ACTION}d $REC_LABEL — IsActive now $TARGET"
120
+ exit 0
121
+ else
122
+ echo "Error: PATCH failed"
123
+ echo " $RESP_BODY"
124
+ exit 1
125
+ fi
@@ -0,0 +1,116 @@
1
+ #!/bin/bash
2
+
3
+ # Verify that a set of expected Coaching Competencies exist and are active,
4
+ # displaying each one's name + EvaluationInstructions in a markdown table so
5
+ # the admin can review what's actually configured. Defaults to the 6 OOTB
6
+ # competencies (assets/ootb-competencies.json); pass explicit names to verify
7
+ # a custom subset instead (e.g. after the admin chose only some of the OOTB
8
+ # set, or created custom competencies).
9
+ #
10
+ # Exit 0 only if every expected name exists AND is active. Exit 1 otherwise,
11
+ # listing what's missing or inactive.
12
+ #
13
+ # Usage:
14
+ # ./verify-ootb-competencies.sh <org-alias> # verify full OOTB set
15
+ # ./verify-ootb-competencies.sh <org-alias> "Name One" "Name Two" # verify specific names
16
+
17
+ set -euo pipefail
18
+
19
+ export NO_COLOR=1
20
+ export FORCE_COLOR=0
21
+
22
+ ORG_ALIAS="${1:-}"
23
+ shift || true
24
+
25
+ if [[ -z "$ORG_ALIAS" ]]; then
26
+ echo "Error: Missing org alias"
27
+ echo "Usage: $0 <org-alias> [\"Competency Name\" ...]"
28
+ exit 1
29
+ fi
30
+
31
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
32
+ ASSETS_FILE="$SCRIPT_DIR/../assets/ootb-competencies.json"
33
+
34
+ # ---------------------------------------------------------------------------
35
+ # Expected names: caller-supplied args, else the full OOTB set.
36
+ # ---------------------------------------------------------------------------
37
+ EXPECTED_NAMES=()
38
+ if [[ "$#" -gt 0 ]]; then
39
+ EXPECTED_NAMES=("$@")
40
+ else
41
+ if [[ ! -f "$ASSETS_FILE" ]]; then
42
+ echo "Cannot find $ASSETS_FILE"
43
+ exit 1
44
+ fi
45
+ while IFS= read -r name; do
46
+ EXPECTED_NAMES+=("$name")
47
+ done < <(jq -r '.competencies[].MasterLabel' "$ASSETS_FILE")
48
+ fi
49
+
50
+ echo "Verifying Coaching Competencies on org: $ORG_ALIAS"
51
+ echo ""
52
+ echo " Expecting ${#EXPECTED_NAMES[@]} competenc$([[ ${#EXPECTED_NAMES[@]} == 1 ]] && echo "y" || echo "ies"):"
53
+ for n in "${EXPECTED_NAMES[@]}"; do
54
+ echo " - $n"
55
+ done
56
+ echo ""
57
+
58
+ # ---------------------------------------------------------------------------
59
+ # Fetch all existing competencies once, then check expected names against them.
60
+ # Auth is handled internally by `sf api request rest` (no token extraction).
61
+ # ---------------------------------------------------------------------------
62
+ EXISTING_RAW=$(sf api request rest \
63
+ "services/data/v68.0/tooling/query/?q=SELECT+Id,DeveloperName,MasterLabel,Description,EvaluationInstructions,IsActive,EvaluationScope,SourceCompetencyTemplate+FROM+EnablementCompetencyDef" \
64
+ --target-org "$ORG_ALIAS" 2>/dev/null)
65
+
66
+ if ! echo "$EXISTING_RAW" | jq -e 'has("records")' >/dev/null 2>&1; then
67
+ echo "Error: Tooling API query failed. Is the org authenticated?"
68
+ echo "$EXISTING_RAW" | jq -r '.[0].message // .message // .' 2>/dev/null || echo "$EXISTING_RAW"
69
+ exit 1
70
+ fi
71
+
72
+ MISSING=()
73
+ INACTIVE=()
74
+ OK=()
75
+ ROWS=()
76
+
77
+ for NAME in "${EXPECTED_NAMES[@]}"; do
78
+ MATCH=$(echo "$EXISTING_RAW" | jq -c --arg n "$NAME" '.records[] | select(.MasterLabel == $n)' | head -1)
79
+
80
+ if [[ -z "$MATCH" ]]; then
81
+ MISSING+=("$NAME")
82
+ ROWS+=("missing | $NAME | _not found on this org_")
83
+ continue
84
+ fi
85
+
86
+ IS_ACTIVE=$(echo "$MATCH" | jq -r '.IsActive')
87
+ INSTRUCTIONS=$(echo "$MATCH" | jq -r '.EvaluationInstructions // "(none)"' | tr '\n' ' ' | sed 's/|/\\|/g')
88
+
89
+ if [[ "$IS_ACTIVE" == "true" ]]; then
90
+ OK+=("$NAME")
91
+ STATUS_ICON="OK"
92
+ else
93
+ INACTIVE+=("$NAME")
94
+ STATUS_ICON="--"
95
+ fi
96
+
97
+ ROWS+=("$STATUS_ICON | $NAME | $INSTRUCTIONS")
98
+ done
99
+
100
+ echo "Results:"
101
+ echo ""
102
+ echo "| | Competency | Evaluation Instructions |"
103
+ echo "|---|---|---|"
104
+ for ROW in "${ROWS[@]}"; do
105
+ echo "| $ROW |"
106
+ done
107
+ echo ""
108
+
109
+ echo "Summary: ${#OK[@]} ok, ${#INACTIVE[@]} inactive, ${#MISSING[@]} missing (of ${#EXPECTED_NAMES[@]} expected)"
110
+
111
+ if [[ "${#MISSING[@]}" -gt 0 || "${#INACTIVE[@]}" -gt 0 ]]; then
112
+ exit 1
113
+ fi
114
+
115
+ echo "All expected competencies exist and are active."
116
+ exit 0
@@ -196,6 +196,10 @@ A single JSON object to stdout:
196
196
 
197
197
  Existing queue, `QueueSobject`, `QueueRoutingConfig`, queue members, and an already-active outbound flow are reused, not recreated (members are only added when the queue has zero active members and `QUEUE_MEMBER_USERNAMES` is supplied; already-present members are left untouched). The doc-driven edits (`canEscalate`, `outboundRouteConfigs`) are set-if-absent. A second run against a fully configured org performs no writes and returns `CONFIGURED`.
198
198
 
199
+ ## Classifier contracts
200
+
201
+ Before investigating or changing any of the deterministic Node classifiers referenced above (`scripts/classify-agent-active.mjs`, `scripts/verify-escalation-config.mjs`, `scripts/extract-outbound-route.mjs`, `scripts/classify-nga-escalation.mjs`), read [references/classifier-contracts.md](references/classifier-contracts.md) for each one's exact input/output contract.
202
+
199
203
  ## Verification
200
204
 
201
205
  Run the bundled escalation contract tests after changing this skill or its scripts:
@@ -6,12 +6,30 @@ import subprocess
6
6
  import tempfile
7
7
  from pathlib import Path
8
8
 
9
- # skills/ root is three levels up (.../<skill>/scripts/tests/_bootstrap.py).
9
+ # skills/ root is three levels up (.../<skill>/scripts/tests/_bootstrap.py). In the flat copy
10
+ # this is the repo's skills/ directory; in a plugin mirror it is that plugin's own bundled
11
+ # skills/ directory, which only contains its own roster.
10
12
  SKILLS_ROOT = Path(__file__).resolve().parents[3]
11
13
 
14
+
15
+ def _find_flat_skills_root(start: Path) -> Path:
16
+ """Walk up from this file to the repo's flat skills/ root, which bundles every skill
17
+ exactly once. Cross-skill references that aren't part of this skill's own plugin roster
18
+ (like the ITSM coordinator's verdict script below) must resolve here, not under
19
+ SKILLS_ROOT, since a plugin mirror's SKILLS_ROOT only contains its own bundled skills."""
20
+ for parent in start.parents:
21
+ candidate = parent / "skills" / "service-itsm-agentic-setup-agentforce-coordinate"
22
+ if candidate.is_dir():
23
+ return parent / "skills"
24
+ raise RuntimeError("could not locate the repo's flat skills/ root")
25
+
26
+
27
+ FLAT_SKILLS_ROOT = _find_flat_skills_root(Path(__file__).resolve())
28
+
12
29
  SKILL_DIR = "service-agentforce-human-escalation-configure"
13
30
  SCRIPT = f"{SKILL_DIR}/scripts/verify-and-configure.sh"
14
- # The ITSM coordinator's advancement gate - exercised for the escalation verdict mapping.
31
+ # The ITSM coordinator's advancement gate - exercised for the escalation verdict mapping. Not
32
+ # bundled per-plugin, so resolved against FLAT_SKILLS_ROOT (see run_node's root parameter).
15
33
  VERDICT_SCRIPT = "service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs"
16
34
 
17
35
  # A fake `sf` that reports a PRODUCTION customer org so the safe_to_write guard must refuse.
@@ -220,11 +238,13 @@ def run(args, path_prefix=None, scrub_sf=False, extra_env=None):
220
238
  return proc.returncode, (proc.stdout or "") + (proc.stderr or "")
221
239
 
222
240
 
223
- def run_node(script_rel, args):
224
- """Run a bundled Node helper; return (returncode, stdout)."""
241
+ def run_node(script_rel, args, root=None):
242
+ """Run a bundled Node helper; return (returncode, stdout). Pass `root=FLAT_SKILLS_ROOT`
243
+ for cross-skill scripts not bundled in this skill's own plugin roster."""
244
+ base = root if root is not None else SKILLS_ROOT
225
245
  proc = subprocess.run(
226
- ["node", str(SKILLS_ROOT / script_rel), *args],
227
- capture_output=True, text=True, cwd=str(SKILLS_ROOT),
246
+ ["node", str(base / script_rel), *args],
247
+ capture_output=True, text=True, cwd=str(base),
228
248
  )
229
249
  return proc.returncode, (proc.stdout or "")
230
250
 
@@ -17,6 +17,7 @@ from pathlib import Path
17
17
  sys.path.insert(0, str(Path(__file__).resolve().parent))
18
18
  from _bootstrap import ( # noqa: E402
19
19
  SKILLS_ROOT,
20
+ FLAT_SKILLS_ROOT,
20
21
  SKILL_DIR,
21
22
  SCRIPT,
22
23
  VERDICT_SCRIPT,
@@ -700,13 +701,13 @@ class NgaClassifierHardeningTests(unittest.TestCase):
700
701
 
701
702
  class CoordinatorGateTests(unittest.TestCase):
702
703
  def test_escalation_verdict_mapping(self):
703
- rc, out = run_node(VERDICT_SCRIPT, ["escalation", "CONFIGURED"])
704
+ rc, out = run_node(VERDICT_SCRIPT, ["escalation", "CONFIGURED"], root=FLAT_SKILLS_ROOT)
704
705
  self.assertEqual(rc, 0, out)
705
- rc, _ = run_node(VERDICT_SCRIPT, ["escalation", "ALREADY-CONFIGURED"])
706
+ rc, _ = run_node(VERDICT_SCRIPT, ["escalation", "ALREADY-CONFIGURED"], root=FLAT_SKILLS_ROOT)
706
707
  self.assertEqual(rc, 0)
707
- rc, _ = run_node(VERDICT_SCRIPT, ["escalation", "INCOMPLETE"])
708
+ rc, _ = run_node(VERDICT_SCRIPT, ["escalation", "INCOMPLETE"], root=FLAT_SKILLS_ROOT)
708
709
  self.assertEqual(rc, 1)
709
- rc, _ = run_node(VERDICT_SCRIPT, ["escalation", "BLOCKED"])
710
+ rc, _ = run_node(VERDICT_SCRIPT, ["escalation", "BLOCKED"], root=FLAT_SKILLS_ROOT)
710
711
  self.assertEqual(rc, 1)
711
712
 
712
713
 
@@ -43,6 +43,7 @@ At the end of the run, print the live customer-facing portal URL for the operato
43
43
  >
44
44
  > | # | Step | Command / surface | Verify |
45
45
  > |---|---|---|---|
46
+ > | 0 | **MCP authorization pre-check** | Confirm the `metadata-experts` MCP server (tool `execute_metadata_action`) is authorized *before* asking §A's branding questions — Stage 6 below hard-depends on it to author `sfdc_cms__brandingSet/*/content.json` (no reliable static fallback for the exhaustive branding-token schema). If the server is unauthorized, tell the operator now and ask whether to (a) pause here and authorize it via `claude mcp` / `/mcp`, or (b) proceed and stop before Stage 6 once colors are already collected. Do not silently discover this at Stage 6. | MCP tool call succeeds, or operator has explicitly chosen how to proceed |
46
47
  > | 1 | Collect branding + access | §A `AskUserQuestion` × 7 | User confirms values |
47
48
  > | 2 | Prerequisite check | §B — `GET /connect/communities` returns 200 | JSON has `communities` array |
48
49
  > | 3 | Provision the site | §C — `POST /connect/communities` | Returns `id` (Network Id) |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: service-de-channel-activate
3
- description: "Activate an Enhanced `MessagingChannel` (WhatsApp / Apple / Facebook / SMS / RCS) by PATCHing `MessagingChannelUsage.DeploymentStatus` from `Disabled` to `Provisioning` via the standard REST sobject endpoint. The UDD save-hook fires on the REST write, dispatches by `MessageType` for the external callout (`WHATS_APP` → Meta `/register`, `FACEBOOK` → `subscribeFacebookPage`, `TEXT` → `registerCsotSms`; Apple, LINE, and others need no external call), writes the terminal `Active` or `Error`, and flips `MessagingChannel.IsActive`. The chain is synchronous on the HTTP response — WhatsApp returns 204 only after Meta confirms registration (~15-21s); channels with no external callout are near-instant (~1s on Apple). No Aura RPC; no CSRF cookies. Use this skill when the user needs to activate an already-inserted Enhanced messaging channel headlessly via REST."
3
+ description: "Activate an Enhanced `MessagingChannel` (WhatsApp/Apple/Facebook/SMS/RCS) by PATCHing `MessagingChannelUsage.DeploymentStatus` from `Disabled` to `Provisioning` via the REST sobject endpoint. The UDD save-hook dispatches by `MessageType` for the external callout (`WHATS_APP`→Meta `/register`, `FACEBOOK`→`subscribeFacebookPage`, `TEXT`→`registerCsotSms`; Apple/LINE need none), writes the terminal `Active`/`Error`, and flips `IsActive`. Synchronous on the HTTP response — WhatsApp returns 204 after Meta confirms (~15-21s); no-callout channels are near-instant. No Aura RPC, no CSRF cookies. Use to activate an already-inserted Enhanced channel headlessly via REST. Do not use for full end-to-end setup — use `service-de-headless-channel-configure`."
4
4
  metadata:
5
5
  version: "1.0"
6
6
  minApiVersion: "67.0"
@@ -13,9 +13,10 @@ metadata:
13
13
  - tool: ["sf"]
14
14
  semver: ">=2.0.0"
15
15
  relatedSkills:
16
- - "service-de-channel-consent-configure"
17
16
  - "service-de-channel-create"
18
17
  - "service-de-channel-routing-configure"
18
+ - "service-de-channel-settings-configure"
19
+ - "service-de-headless-channel-configure"
19
20
  ---
20
21
 
21
22
  # Activating a Messaging Channel
@@ -88,7 +89,7 @@ Unlike the old Aura-based version of this skill, there are no `{POLL_TIMEOUT_S}`
88
89
  **Failure — validator or server-side provisioning error:**
89
90
  ```json
90
91
  {"ok": false, "kind": "readiness-failed", "errorCode": "FIELD_INTEGRITY_EXCEPTION",
91
- "message": "...", "hint": "validateChannelReadinessOnProvisioning rejected the write — most commonly missing consent; run service-de-channel-consent-configure first"}
92
+ "message": "...", "hint": "validateChannelReadinessOnProvisioning rejected the write — most commonly missing consent; run service-de-channel-settings-configure first"}
92
93
  {"ok": false, "kind": "provisioning-error", "mcuId": "0gL...", "errorReason": "MetaRegistrationFailed", "errorDetails": "..."}
93
94
  {"ok": false, "kind": "verification-failed", "hint": "WhatsApp phone number verification failed or was declined by user"}
94
95
  {"ok": false, "kind": "verification-request-failed", "errorCode": "...", "message": "...", "hint": "Could not request verification code from Meta"}
@@ -170,7 +171,7 @@ Classify by HTTP status:
170
171
  | Message fragment | Meaning | Envelope |
171
172
  | --- | --- | --- |
172
173
  | "invalid deployment status transition" | The current status doesn't allow `→ Provisioning` (e.g. MCU is already `Active` — Stage 1 should have caught this, but there's a race window). | Re-read MCU; if now `Active`, emit success-noop. If `Provisioning`, Stage 3 poll. Otherwise emit `{ok:false, kind:"readiness-failed", ...}`. |
173
- | "consent" / "keyword" / mentions of STOP/HELP | `validateChannelReadinessOnProvisioning` rejected — channel doesn't have required consent configured. | `{ok:false, kind:"readiness-failed", errorCode:"FIELD_INTEGRITY_EXCEPTION", message, hint:"channel requires a ConsentType and a matching MsgChannelLanguageKeyword record (opt-out keyword + confirmation) before activation — run service-de-channel-consent-configure"}`. |
174
+ | "consent" / "keyword" / mentions of STOP/HELP | `validateChannelReadinessOnProvisioning` rejected — channel doesn't have required consent configured. | `{ok:false, kind:"readiness-failed", errorCode:"FIELD_INTEGRITY_EXCEPTION", message, hint:"channel requires a ConsentType and a matching MsgChannelLanguageKeyword record (opt-out keyword + confirmation) before activation — run service-de-channel-settings-configure"}`. |
174
175
  | "routing" / "queue" / "SessionHandler" | Routing precondition (Stage 1 should have caught, but the validator re-checks). | `{ok:false, kind:"no-routing", message, hint:"run service-de-channel-routing-configure first"}`. |
175
176
  | other | Unrecognized validator error. | `{ok:false, kind:"readiness-failed", errorCode, message}`. |
176
177
 
@@ -252,7 +253,7 @@ If this skill is the leaf (user invoked it directly), render:
252
253
  - `Info: Already active — MessagingChannel {CHANNEL_ID} is IsActive=true. No changes.` (no-op path)
253
254
  - `Error: Routing not configured — run 'service-de-channel-routing-configure' skill first.` (no-routing)
254
255
  - `Error: No MessagingChannelUsage row — run the insertion skill first.` (no-mcu)
255
- - `Error: Readiness check failed: {message} — if it mentions consent/keywords, run 'service-de-channel-consent-configure' first.` (readiness-failed)
256
+ - `Error: Readiness check failed: {message} — if it mentions consent/keywords, run 'service-de-channel-settings-configure' first.` (readiness-failed)
256
257
  - `Error: Activation failed: {errorReason} — {errorDetails}` (provisioning-error)
257
258
  - `Error: WhatsApp phone number verification failed: {hint}` (verification-failed)
258
259
  - `Error: Could not request verification code: {message}` (verification-request-failed)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: service-de-channel-create
3
- description: "**INTERNAL USE ONLY — invoked by `service-de-headless-channel-configure` orchestrator.** Insert an Enhanced messaging `MessagingChannel` record (plus its child `MessagingChannelUsage` as a free server-side side-effect) of any supported type — WhatsApp, LINE, Apple Business Chat, Facebook, or SMS (Text). Given a `{MESSAGE_TYPE}` and the corresponding type-specific inputs, runs the shared preflight → Connect-insert → verify flow and branches only where a type genuinely differs (request body, prerequisites, error classes). Uses the sanctioned `POST /services/data/v{V}/connect/livemessage/channels` Connect REST endpoint — no Aura session, no token extracted into shell state. **Users should always invoke `service-de-headless-channel-configure` instead — it handles insert → route → activate in one flow.** Use this skill when inserting a messaging channel of any type; it replaces the four former per-type creation skills."
3
+ description: "**INTERNAL USE ONLY — invoked by `service-de-headless-channel-configure`.** Insert an Enhanced messaging `MessagingChannel` (plus child `MessagingChannelUsage` as a free side-effect) of any type — WhatsApp, LINE, Apple Business Chat, Facebook, or SMS. Given a `{MESSAGE_TYPE}` and its inputs, runs the shared preflight → Connect-insert → verify flow, branching only where a type differs. Uses `POST /services/data/v{V}/connect/livemessage/channels` — no Aura session, no shell-stored token. **Invoke `service-de-headless-channel-configure` instead** — it handles insert → route → activate in one flow; replaces the four former per-type creation skills."
4
4
  metadata:
5
5
  version: "1.0"
6
6
  minApiVersion: "67.0"
@@ -14,8 +14,8 @@ metadata:
14
14
  semver: ">=2.0.0"
15
15
  relatedSkills:
16
16
  - "service-de-channel-activate"
17
- - "service-de-channel-consent-configure"
18
17
  - "service-de-channel-routing-configure"
18
+ - "service-de-channel-settings-configure"
19
19
  - "service-de-headless-channel-configure"
20
20
  - "service-de-waba-integrate"
21
21
  ---
@@ -349,7 +349,7 @@ Rendered (when invoked directly rather than by the orchestrator):
349
349
  - `Error: {kind}: {message or hint}`
350
350
 
351
351
  On success the caller can immediately invoke `service-de-channel-routing-configure` with the
352
- returned `channelId`, then `service-de-channel-consent-configure`, then
352
+ returned `channelId`, then `service-de-channel-settings-configure`, then
353
353
  `service-de-channel-activate`. Those three are message-type-agnostic (they operate on
354
354
  `MessagingChannel.Id` + `MessagingChannelUsage.Id`), so there's no downstream dispatch concern.
355
355
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: service-de-channel-routing-configure
3
- description: "Configure routing on a newly-inserted Enhanced `MessagingChannel` so that activation will accept it. Given a `{CHANNEL_ID}`, walks the user through picking a routing type (Omni-Channel Queue, Omni-Flow, Agentforce Service Agent, Digital Worker, or direct User), locates or provisions the routing target, then PATCHes the channel's `SessionHandlerId` (plus `FallbackQueueId` where required) to it. Use between the insertion skill and the activation skill — activation fails server-side with `nullQueueId` / `LiveMessageSetupException` if no valid `SessionHandlerId` is set on the channel."
3
+ description: "Configure routing on a newly-inserted Enhanced `MessagingChannel` so activation will accept it. Given a `{CHANNEL_ID}`, walks through picking a routing type (Omni-Channel Queue, Omni-Flow, Agentforce Service Agent, Digital Worker, or direct User), locates or provisions the target, then PATCHes `SessionHandlerId` (plus `FallbackQueueId` where required). Use between insertion and activation — activation fails server-side with `nullQueueId`/`LiveMessageSetupException` if no valid `SessionHandlerId` is set. Do not use for full end-to-end setup — use `service-de-headless-channel-configure`."
4
4
  metadata:
5
5
  version: "1.1"
6
6
  minApiVersion: "67.0"
@@ -14,8 +14,8 @@ metadata:
14
14
  semver: ">=2.0.0"
15
15
  relatedSkills:
16
16
  - "service-de-channel-activate"
17
- - "service-de-channel-consent-configure"
18
17
  - "service-de-channel-create"
18
+ - "service-de-channel-settings-configure"
19
19
  - "service-de-headless-channel-configure"
20
20
  ---
21
21
 
@@ -27,7 +27,7 @@ Ensures a `MessagingChannel` has valid routing configured before activation. The
27
27
 
28
28
  These skills create **Enhanced** channels (`PlatformType=Enhanced`, SCRT2). All five SessionHandler domains are writable on Enhanced channels. (A Standard/SCRT1 channel would only accept a Flow as SessionHandler — the server rejects any other domain with "Only flows of type Omni-Channel are supported". These skills never create Standard channels, so that path isn't handled here.)
29
29
 
30
- **Where this fits:** the channel is inserted by `service-de-channel-create` (or a per-type leaf); this skill sets routing; `service-de-channel-consent-configure` sets consent; then `service-de-channel-activate` flips it live — activation requires both routing and consent. The `service-de-headless-channel-configure` orchestrator runs all four in sequence.
30
+ **Where this fits:** the channel is inserted by `service-de-channel-create` (or a per-type leaf); this skill sets routing; `service-de-channel-settings-configure` sets consent; then `service-de-channel-activate` flips it live — activation requires both routing and consent. The `service-de-headless-channel-configure` orchestrator runs all four in sequence.
31
31
 
32
32
  Supported routing types — all set `SessionHandlerId`, some also set `FallbackQueueId`:
33
33