@salesforce/afv-skills 1.63.0 → 1.65.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 (484) hide show
  1. package/package.json +1 -1
  2. package/skills/agentforce-gpt-email-generation-configure/SKILL.md +312 -0
  3. package/skills/agentforce-offline-experimentation-run/SKILL.md +253 -0
  4. package/skills/agentforce-offline-experimentation-run/scripts/build_report.py +796 -0
  5. package/skills/agentforce-offline-experimentation-run/scripts/resolve-token.sh +111 -0
  6. package/skills/agentforce-offline-experimentation-run/scripts/sfap_replay.py +1053 -0
  7. package/skills/agentforce-wizard-ui-forecasting-analytics-components-configure/SKILL.md +64 -0
  8. package/skills/agentforce-wizard-ui-sales-einstein-components-configure/SKILL.md +46 -0
  9. package/skills/automation-company-profile-info-query/SKILL.md +51 -0
  10. package/skills/automation-digital-wallet-configure/SKILL.md +689 -0
  11. package/skills/automation-flow-coordinate/SKILL.md +95 -0
  12. package/skills/automation-flow-coordinate/references/elements/action-call/action-call.md +1569 -0
  13. package/skills/automation-flow-coordinate/references/elements/action-call/conversation-messaging.md +96 -0
  14. package/skills/automation-flow-coordinate/references/elements/action-call/examples/send-sms-message.json +23 -0
  15. package/skills/automation-flow-coordinate/references/elements/action-call/examples/send-to-journey-no-fields.json +31 -0
  16. package/skills/automation-flow-coordinate/references/elements/action-call/send-to-journey.md +179 -0
  17. package/skills/automation-flow-coordinate/references/elements/exit-rule/examples/event-email-link-click.json +13 -0
  18. package/skills/automation-flow-coordinate/references/elements/exit-rule/exit-rule.md +83 -0
  19. package/skills/automation-flow-coordinate/references/elements/forward-to-bot-or-agent/examples/forward-to-bot-or-agent.json +69 -0
  20. package/skills/automation-flow-coordinate/references/elements/forward-to-bot-or-agent/forward-to-bot-or-agent.md +274 -0
  21. package/skills/automation-flow-coordinate/references/elements/start/audience-common.md +192 -0
  22. package/skills/automation-flow-coordinate/references/elements/start/automation-event-triggered.md +130 -0
  23. package/skills/automation-flow-coordinate/references/elements/start/data-cloud-data-change-triggered.md +92 -0
  24. package/skills/automation-flow-coordinate/references/elements/start/form-submission-triggered.md +88 -0
  25. package/skills/automation-flow-coordinate/references/elements/start/segment-triggered.md +152 -0
  26. package/skills/automation-flow-coordinate/references/elements/start/start.md +539 -0
  27. package/skills/automation-flow-coordinate/references/elements/subflow/subflow.md +152 -0
  28. package/skills/automation-flow-coordinate/references/elements/wait/wait.md +497 -0
  29. package/skills/automation-flow-coordinate/references/recipes/author/author.md +868 -0
  30. package/skills/automation-flow-coordinate/references/recipes/summarize/element-generic.md +300 -0
  31. package/skills/automation-flow-coordinate/references/recipes/summarize/reference-resolution.md +292 -0
  32. package/skills/automation-flow-coordinate/references/recipes/summarize/summarize.md +323 -0
  33. package/skills/automation-flow-coordinate/references/recipes/testing/examples/debug-output-template.md +109 -0
  34. package/skills/automation-flow-coordinate/references/recipes/testing/shape.md +219 -0
  35. package/skills/automation-flow-coordinate/references/recipes/testing/shared-stages/intent-analyzer.md +180 -0
  36. package/skills/automation-flow-coordinate/references/recipes/testing/workflows/debug.md +175 -0
  37. package/skills/automation-flow-coordinate/references/recipes/testing/workflows/promote.md +255 -0
  38. package/skills/automation-flow-coordinate/references/recipes/testing/workflows/save-debug.md +212 -0
  39. package/skills/automation-flow-coordinate/references/resources/variable/variable.md +171 -0
  40. package/skills/automation-flow-coordinate/references/shared/anti-patterns.md +786 -0
  41. package/skills/automation-flow-coordinate/references/shared/end/end.md +267 -0
  42. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/README.md +69 -0
  43. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/predictions.jsonl +80 -0
  44. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/eval/prompts.jsonl +116 -0
  45. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/flow-type-resolver.md +321 -0
  46. package/skills/automation-flow-coordinate/references/shared/flow-type-resolver/taxonomy.json +320 -0
  47. package/skills/automation-flow-coordinate/references/shared/server-functions.md +597 -0
  48. package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +21 -11
  49. package/skills/automation-sandbox-post-copy-config-generate/assets/config_template.json +10 -0
  50. package/skills/automation-sandbox-post-copy-config-generate/assets/json_schema.json +33 -1
  51. package/skills/automation-sandbox-post-copy-config-generate/references/configuration_catalog.md +44 -1
  52. package/skills/automation-sandbox-post-copy-configure/SKILL.md +132 -124
  53. package/skills/automation-sandbox-post-copy-configure/references/flow_activation_path.md +151 -0
  54. package/skills/automation-sandbox-post-copy-configure/references/scheduled_apex_path.md +55 -9
  55. package/skills/automotive-cloud-appraisal-management-settings-configure/SKILL.md +69 -0
  56. package/skills/automotive-cloud-dealer-essentials-configure/SKILL.md +78 -0
  57. package/skills/automotive-cloud-ground-agent-data-pipelines-configure/SKILL.md +373 -0
  58. package/skills/automotive-cloud-ground-mfg-agent-data-pipelines-configure/SKILL.md +273 -0
  59. package/skills/automotive-cloud-mfg-agent-data-pipelines-configure/SKILL.md +259 -0
  60. package/skills/automotive-cloud-mfg-sales-concierge-agent-create/SKILL.md +369 -0
  61. package/skills/automotive-cloud-mfg-sales-concierge-foundation-configure/SKILL.md +542 -0
  62. package/skills/automotive-cloud-mfg-sales-concierge-foundation-coordinate/SKILL.md +159 -0
  63. package/skills/automotive-cloud-mfg-sales-concierge-orchestrator-agent-create/SKILL.md +349 -0
  64. package/skills/automotive-cloud-mfg-sales-concierge-orchestrator-configure/SKILL.md +505 -0
  65. package/skills/automotive-cloud-sales-concierge-agent-create/SKILL.md +380 -0
  66. package/skills/automotive-cloud-sales-concierge-foundation-configure/SKILL.md +567 -0
  67. package/skills/automotive-cloud-sales-concierge-foundation-coordinate/SKILL.md +159 -0
  68. package/skills/automotive-cloud-sales-concierge-orchestrator-agent-create/SKILL.md +360 -0
  69. package/skills/automotive-cloud-sales-concierge-orchestrator-configure/SKILL.md +539 -0
  70. package/skills/automotive-cloud-sales-concierge-search-grounding-configure/SKILL.md +358 -0
  71. package/skills/commerce-b2b-merchant-quote-configure/SKILL.md +602 -0
  72. package/skills/commerce-b2b-store-configure/SKILL.md +251 -0
  73. package/skills/commerce-credit-memo-create/SKILL.md +139 -0
  74. package/skills/commerce-delivery-business-hours-configure/SKILL.md +277 -0
  75. package/skills/commerce-delivery-estimation-apply/SKILL.md +155 -0
  76. package/skills/commerce-delivery-estimation-configure/SKILL.md +377 -0
  77. package/skills/commerce-delivery-routing-specs-integrate/SKILL.md +174 -0
  78. package/skills/commerce-estimate-bopis-query/SKILL.md +279 -0
  79. package/skills/commerce-estimate-delivery-date-query/SKILL.md +349 -0
  80. package/skills/commerce-fees-apply/SKILL.md +227 -0
  81. package/skills/commerce-fulfillment-routing-analyze/SKILL.md +200 -0
  82. package/skills/commerce-guest-buyer-create/SKILL.md +173 -0
  83. package/skills/commerce-location-bopis-configure/SKILL.md +378 -0
  84. package/skills/commerce-location-business-hours-configure/SKILL.md +235 -0
  85. package/skills/commerce-location-delivery-processing-time-configure/SKILL.md +309 -0
  86. package/skills/commerce-location-graph-integrate/SKILL.md +131 -0
  87. package/skills/commerce-location-shipping-carrier-method-configure/SKILL.md +755 -0
  88. package/skills/commerce-location-temporary-operating-hours-configure/SKILL.md +331 -0
  89. package/skills/commerce-merchant-buyer-groups-configure/SKILL.md +579 -0
  90. package/skills/commerce-merchant-buyer-user-onboarding-create/SKILL.md +626 -0
  91. package/skills/commerce-merchant-catalog-configure/SKILL.md +614 -0
  92. package/skills/commerce-merchant-extension-provider-configure/SKILL.md +368 -0
  93. package/skills/commerce-merchant-insights-account-health-churn-analyze/SKILL.md +118 -0
  94. package/skills/commerce-merchant-insights-inventory-returns-analyze/SKILL.md +65 -0
  95. package/skills/commerce-merchant-insights-order-shopper-get/SKILL.md +90 -0
  96. package/skills/commerce-merchant-insights-product-performance-analyze/SKILL.md +72 -0
  97. package/skills/commerce-merchant-insights-query/SKILL.md +279 -0
  98. package/skills/commerce-merchant-storefront-guest-access-configure/SKILL.md +656 -0
  99. package/skills/commerce-order-summary-change-apply/SKILL.md +375 -0
  100. package/skills/commerce-product-details-get/SKILL.md +363 -0
  101. package/skills/commerce-product-search/SKILL.md +563 -0
  102. package/skills/commerce-react-storefront-create/SKILL.md +350 -0
  103. package/skills/commerce-return-order-summary-create/SKILL.md +513 -0
  104. package/skills/commerce-search-relevance-analyze/SKILL.md +757 -0
  105. package/skills/commerce-temporary-processing-time-override-create/SKILL.md +274 -0
  106. package/skills/communications-initial-setup-configure/SKILL.md +630 -0
  107. package/skills/communications-multisite-configure/SKILL.md +571 -0
  108. package/skills/communications-revenue-cloud-settings-configure/SKILL.md +74 -0
  109. package/skills/communications-smb-fiber-catalog-create/SKILL.md +413 -0
  110. package/skills/communications-tmf-integrate/SKILL.md +1368 -0
  111. package/skills/consumer-goods-promotion-bo-api-deploy/SKILL.md +54 -107
  112. package/skills/consumer-goods-promotion-bo-api-deploy/assets/set-comment-value/payloads/copy.json +1 -1
  113. package/skills/consumer-goods-promotion-bo-api-deploy/references/conventions-and-payload-rules.md +82 -5
  114. package/skills/consumer-goods-promotion-bo-api-deploy/references/generate-and-wire.md +35 -2
  115. package/skills/consumer-goods-promotion-bo-api-deploy/references/preflight-and-seed-queries.md +149 -0
  116. package/skills/consumer-goods-promotion-bo-api-deploy/references/smoke-and-verify.md +17 -1
  117. package/skills/consumer-goods-visit-activity-act4-questions-assign/SKILL.md +448 -0
  118. package/skills/consumer-goods-visit-activity-act5-standard-create/SKILL.md +269 -0
  119. package/skills/consumer-goods-visit-activity-act6-assortment-configure/SKILL.md +271 -0
  120. package/skills/consumer-goods-visit-activity-act7-account-scoping-create/SKILL.md +382 -0
  121. package/skills/consumer-goods-visit-activity-act8-plan-attach-create/SKILL.md +373 -0
  122. package/skills/consumer-goods-visit-activity-act9-proof-validate/SKILL.md +389 -0
  123. package/skills/consumer-goods-visit-and-activity-act1-specification-create/SKILL.md +338 -0
  124. package/skills/consumer-goods-visit-and-activity-act2-template-create/SKILL.md +547 -0
  125. package/skills/consumer-goods-visit-and-activity-act3-definition-create/SKILL.md +346 -0
  126. package/skills/consumer-goods-visit-and-activity-configure/SKILL.md +1110 -0
  127. package/skills/crm-analytics-adoption-insights-configure/SKILL.md +224 -0
  128. package/skills/crm-analytics-custom-report-type-lightning-configure/SKILL.md +418 -0
  129. package/skills/crm-analytics-dashboards-configure/SKILL.md +731 -0
  130. package/skills/crm-analytics-operational-analytics-metadata-bridge-migrate/SKILL.md +233 -0
  131. package/skills/crm-analytics-report-notifications-ui-configure/SKILL.md +184 -0
  132. package/skills/crm-analytics-sharing-inheritance-coverage-analyze/SKILL.md +167 -0
  133. package/skills/crm-analytics-sonic-getting-started-configure/SKILL.md +55 -0
  134. package/skills/crm-analytics-tableau-next-app-deploy/SKILL.md +1350 -0
  135. package/skills/crm-analytics-tableau-next-c360-basemodel-validate/SKILL.md +1862 -0
  136. package/skills/crm-analytics-tableau-next-datacloud-validate/SKILL.md +83 -0
  137. package/skills/crm-analytics-tableau-next-provisioning-validate/SKILL.md +81 -0
  138. package/skills/data360-activation-create/SKILL.md +104 -0
  139. package/skills/data360-activation-external-platform-get/SKILL.md +49 -0
  140. package/skills/data360-activation-target-create/SKILL.md +93 -0
  141. package/skills/data360-activation-v2-create/SKILL.md +456 -0
  142. package/skills/data360-audience-dmo-get/SKILL.md +38 -0
  143. package/skills/data360-calculated-affinity-create/SKILL.md +82 -0
  144. package/skills/data360-calculated-insight-create/SKILL.md +148 -0
  145. package/skills/data360-catalog-metadata-create/SKILL.md +183 -0
  146. package/skills/data360-code-extension-create/SKILL.md +115 -0
  147. package/skills/data360-communication-capping-create/SKILL.md +227 -0
  148. package/skills/data360-connection-create/SKILL.md +491 -0
  149. package/skills/data360-content-lens-create/SKILL.md +181 -0
  150. package/skills/data360-data-action-create/SKILL.md +126 -0
  151. package/skills/data360-data-action-target-create/SKILL.md +181 -0
  152. package/skills/data360-data-clean-room-create/SKILL.md +238 -0
  153. package/skills/data360-data-governance-create/SKILL.md +746 -0
  154. package/skills/data360-data-graph-create/SKILL.md +82 -0
  155. package/skills/data360-data-harmonized-model-object-reference-create/SKILL.md +38 -0
  156. package/skills/data360-data-lake-object-create/SKILL.md +207 -0
  157. package/skills/data360-data-model-object-catalog-get/SKILL.md +49 -0
  158. package/skills/data360-data-model-object-create/SKILL.md +128 -0
  159. package/skills/data360-data-model-object-mapping-create/SKILL.md +106 -0
  160. package/skills/data360-data-space-create/SKILL.md +161 -0
  161. package/skills/data360-data-streams-create/SKILL.md +324 -0
  162. package/skills/data360-engagement-signal-get/SKILL.md +38 -0
  163. package/skills/data360-experiment-create/SKILL.md +82 -0
  164. package/skills/data360-goal-based-campaign-create/SKILL.md +192 -0
  165. package/skills/data360-harmonization-process-history-get/SKILL.md +38 -0
  166. package/skills/data360-harmonized-unstructured-dmo-create/SKILL.md +84 -0
  167. package/skills/data360-identity-resolution-create/SKILL.md +115 -0
  168. package/skills/data360-intelligent-document-processing-create/SKILL.md +148 -0
  169. package/skills/data360-knowledge-graph-construction-create/SKILL.md +93 -0
  170. package/skills/data360-knowledge-graph-create/SKILL.md +216 -0
  171. package/skills/data360-knowledge-space-mcp-configure/SKILL.md +475 -0
  172. package/skills/data360-machine-learning-mcp-configure/SKILL.md +697 -0
  173. package/skills/data360-multi-org-mcp-configure/SKILL.md +117 -0
  174. package/skills/data360-secondary-index-mcp-configure/SKILL.md +126 -0
  175. package/skills/data360-segment-mcp-configure/SKILL.md +159 -0
  176. package/skills/data360-semantic-calculated-dimension-mcp-configure/SKILL.md +93 -0
  177. package/skills/data360-semantic-calculated-measurement-mcp-configure/SKILL.md +93 -0
  178. package/skills/data360-semantic-data-object-mcp-configure/SKILL.md +93 -0
  179. package/skills/data360-semantic-dimension-mcp-configure/SKILL.md +38 -0
  180. package/skills/data360-semantic-engine-mcp-configure/SKILL.md +62 -0
  181. package/skills/data360-semantic-measurement-mcp-configure/SKILL.md +38 -0
  182. package/skills/data360-semantic-metric-mcp-configure/SKILL.md +93 -0
  183. package/skills/data360-semantic-model-mcp-configure/SKILL.md +115 -0
  184. package/skills/data360-standard-mapping-mcp-configure/SKILL.md +38 -0
  185. package/skills/data360-tenant-lifecycle-mcp-configure/SKILL.md +73 -0
  186. package/skills/dx-devops-conflict-resolve/SKILL.md +1 -5
  187. package/skills/dx-devops-pipeline-manage/SKILL.md +1 -5
  188. package/skills/dx-devops-project-manage/SKILL.md +1 -5
  189. package/skills/dx-devops-promote/SKILL.md +1 -5
  190. package/skills/dx-devops-request-status/SKILL.md +1 -5
  191. package/skills/dx-lifecycle-center/SKILL.md +120 -0
  192. package/skills/dx-lifecycle-center/examples/workflows.md +175 -0
  193. package/skills/dx-lifecycle-center/references/connect-api.md +123 -0
  194. package/skills/dx-lifecycle-center/references/connect-org.md +184 -0
  195. package/skills/dx-lifecycle-center/references/deploy.md +153 -0
  196. package/skills/dx-lifecycle-center/references/error-handling.md +21 -0
  197. package/skills/dx-lifecycle-center/references/hub-org.md +37 -0
  198. package/skills/dx-lifecycle-center/references/list-orgs.md +99 -0
  199. package/skills/dx-lifecycle-center/references/request-body.md +75 -0
  200. package/skills/dx-lifecycle-center/references/troubleshooting.md +31 -0
  201. package/skills/dx-lifecycle-center/scripts/poll-deploy-status.sh +200 -0
  202. package/skills/dx-lifecycle-center/scripts/resolve-environment.sh +120 -0
  203. package/skills/dx-org-devhub-configure/SKILL.md +1 -3
  204. package/skills/dx-org-shape-manage/SKILL.md +1 -5
  205. package/skills/dx-org-snapshot-manage/SKILL.md +1 -3
  206. package/skills/education-cloud-academic-calendar-generate/SKILL.md +1 -3
  207. package/skills/education-cloud-course-catalog-migrate/SKILL.md +1 -3
  208. package/skills/education-cloud-domain-configure/SKILL.md +1 -3
  209. package/skills/education-cloud-multi-campus-configure/SKILL.md +1 -3
  210. package/skills/education-cloud-student-recruitment-agent-configure/SKILL.md +1 -5
  211. package/skills/experience-afv-query/SKILL.md +234 -0
  212. package/skills/experience-agentforce-vibes-in-react-configure/SKILL.md +63 -0
  213. package/skills/experience-apex-components-configure/SKILL.md +69 -0
  214. package/skills/experience-apex-pages-configure/SKILL.md +107 -0
  215. package/skills/experience-app-home-configure/SKILL.md +76 -0
  216. package/skills/experience-aura-lightning-out-access-configure/SKILL.md +58 -0
  217. package/skills/experience-briefcase-configure/SKILL.md +287 -0
  218. package/skills/experience-community-flexi-page-list-create/SKILL.md +74 -0
  219. package/skills/experience-community-template-definition-list-query/SKILL.md +48 -0
  220. package/skills/experience-community-theme-definition-list-query/SKILL.md +38 -0
  221. package/skills/experience-content-assets-configure/SKILL.md +86 -0
  222. package/skills/experience-custom-domain-create/SKILL.md +727 -0
  223. package/skills/experience-defer-rendering-workspace-page-setup-configure/SKILL.md +41 -0
  224. package/skills/experience-field-service-app-builder-configure/SKILL.md +187 -0
  225. package/skills/experience-flow-category-configure/SKILL.md +117 -0
  226. package/skills/experience-formula-configure/SKILL.md +358 -0
  227. package/skills/experience-global-actions-configure/SKILL.md +69 -0
  228. package/skills/experience-global-publisher-layouts-configure/SKILL.md +79 -0
  229. package/skills/experience-instrumentation-configure/SKILL.md +64 -0
  230. package/skills/experience-lex-engagement-configure/SKILL.md +50 -0
  231. package/skills/experience-lightning-bolt-open/SKILL.md +12 -0
  232. package/skills/experience-lightning-out-configure/SKILL.md +129 -0
  233. package/skills/experience-lightning-preview-configure/SKILL.md +67 -0
  234. package/skills/experience-lightning-types-query/SKILL.md +98 -0
  235. package/skills/experience-malware-scan-configure/SKILL.md +71 -0
  236. package/skills/experience-my-salesforce-configure/SKILL.md +126 -0
  237. package/skills/experience-navigation-menus-configure/SKILL.md +235 -0
  238. package/skills/experience-notification-types-configure/SKILL.md +206 -0
  239. package/skills/experience-notifications-configure/SKILL.md +75 -0
  240. package/skills/experience-record-discovery-query/SKILL.md +227 -0
  241. package/skills/experience-regenerate-previews-open/SKILL.md +94 -0
  242. package/skills/experience-sales-cloud-mab-configure/SKILL.md +254 -0
  243. package/skills/experience-schema-builder-open/SKILL.md +38 -0
  244. package/skills/experience-simple-record-home-configure/SKILL.md +110 -0
  245. package/skills/experience-static-resources-configure/SKILL.md +74 -0
  246. package/skills/experience-ui-bundle-2gp-deploy/SKILL.md +1 -3
  247. package/skills/experience-ui-bundle-features-generate/SKILL.md +1 -5
  248. package/skills/experience-ui-bundle-mfa-configure/SKILL.md +1 -3
  249. package/skills/field-service-data-capture-form-deployer-configure/SKILL.md +23 -2
  250. package/skills/field-service-data-capture-form-designer-configure/SKILL.md +13 -3
  251. package/skills/field-service-data-capture-migrate/SKILL.md +1 -3
  252. package/skills/field-service-mobile-branding-configure/SKILL.md +17 -3
  253. package/skills/field-service-objective-designer-configure/SKILL.md +72 -379
  254. package/skills/field-service-prework-brief-deployer-configure/SKILL.md +10 -537
  255. package/skills/field-service-scheduling-policy-designer-query/SKILL.md +65 -1093
  256. package/skills/{field-service-setup-orchestrator-get → field-service-setup-coordinate}/SKILL.md +18 -3
  257. package/skills/field-service-sobject-create-configure/SKILL.md +13 -213
  258. package/skills/field-service-voice-to-form-configure/SKILL.md +40 -11
  259. package/skills/field-service-work-plan-configure/SKILL.md +253 -0
  260. package/skills/field-service-work-rule-designer-configure/SKILL.md +121 -95
  261. package/skills/fsc-actionable-segmentation-settings-configure/SKILL.md +180 -0
  262. package/skills/fsc-digital-origination-bre-decision-matrix-foundation-create/SKILL.md +196 -0
  263. package/skills/fsc-digital-origination-bre-disclosures-consent-configure/SKILL.md +106 -0
  264. package/skills/fsc-digital-origination-bre-document-upload-configure/SKILL.md +96 -0
  265. package/skills/fsc-digital-origination-bre-permissions-assign/SKILL.md +111 -0
  266. package/skills/fsc-digital-origination-bre-setup-coordinate/SKILL.md +250 -0
  267. package/skills/fsc-digital-origination-bre-stp-eligibility-configure/SKILL.md +122 -0
  268. package/skills/fsc-digital-origination-coordinate/SKILL.md +653 -0
  269. package/skills/fsc-digital-origination-demo-run/SKILL.md +225 -0
  270. package/skills/fsc-digital-origination-execution-guardrails-validate/SKILL.md +112 -0
  271. package/skills/fsc-digital-origination-initial-setup-configure/SKILL.md +396 -0
  272. package/skills/fsc-digital-origination-pricing-setup-coordinate/SKILL.md +336 -0
  273. package/skills/fsc-digital-origination-pricing-setup-data-foundation-create/SKILL.md +208 -0
  274. package/skills/fsc-digital-origination-pricing-setup-procedure-create/SKILL.md +375 -0
  275. package/skills/fsc-digital-origination-product-setup-act1-permissions-assign/SKILL.md +83 -0
  276. package/skills/fsc-digital-origination-product-setup-coordinate/SKILL.md +248 -0
  277. package/skills/fsc-digital-origination-sample-data-create/SKILL.md +206 -0
  278. package/skills/fsc-document-checklist-settings-configure/SKILL.md +57 -0
  279. package/skills/fsc-flexible-hierarchy-configure/SKILL.md +148 -0
  280. package/skills/fsc-flexible-hierarchy-foundation-configure/SKILL.md +1430 -0
  281. package/skills/fsc-flexible-hierarchy-graph-config-create/SKILL.md +471 -0
  282. package/skills/fsc-flexible-hierarchy-rule-based-graph-deploy/SKILL.md +429 -0
  283. package/skills/fsc-pricing-product-configurator-configure/SKILL.md +150 -0
  284. package/skills/fsc-pricing-salesforce-omnistudio-switch/SKILL.md +123 -0
  285. package/skills/fsc-product-act2-catalog-categories-create/SKILL.md +82 -0
  286. package/skills/fsc-product-act3-attributes-create/SKILL.md +249 -0
  287. package/skills/fsc-product-act4-classification-assignment-create/SKILL.md +196 -0
  288. package/skills/fsc-product-act5-considerations-get/SKILL.md +44 -0
  289. package/skills/fsc-stage-management-apex-flow-deploy/SKILL.md +384 -0
  290. package/skills/fsc-stage-management-compliant-data-sharing-configure/SKILL.md +144 -0
  291. package/skills/fsc-stage-management-decision-matrices-create/SKILL.md +107 -0
  292. package/skills/fsc-stage-management-definition-assignments-create/SKILL.md +189 -0
  293. package/skills/fsc-stage-management-definition-create/SKILL.md +108 -0
  294. package/skills/fsc-stage-management-permissions-assign/SKILL.md +143 -0
  295. package/skills/fsc-stage-management-transitions-configure/SKILL.md +139 -0
  296. package/skills/health-cloud-appt-booking-config-configure/SKILL.md +135 -0
  297. package/skills/health-cloud-appt-booking-url-config-configure/SKILL.md +134 -0
  298. package/skills/health-cloud-care-provider-affl-role-config-configure/SKILL.md +136 -0
  299. package/skills/health-cloud-care-provider-search-config-configure/SKILL.md +134 -0
  300. package/skills/health-cloud-care-requests-create/SKILL.md +178 -0
  301. package/skills/health-cloud-initial-configure/SKILL.md +511 -0
  302. package/skills/health-cloud-patient-appointment-scheduling-configure/SKILL.md +1374 -0
  303. package/skills/health-cloud-provider-search-settings-configure/SKILL.md +924 -0
  304. package/skills/health-cloud-referral-management-coordinate/SKILL.md +513 -0
  305. package/skills/health-cloud-timeline-configure/SKILL.md +622 -0
  306. package/skills/health-cloud-virtual-visit-config-configure/SKILL.md +135 -0
  307. package/skills/industries-account-score-settings-query/SKILL.md +78 -0
  308. package/skills/industries-actionable-list-data-sources-dmo-configure/SKILL.md +177 -0
  309. package/skills/industries-ad-product-availability-search/SKILL.md +399 -0
  310. package/skills/industries-advanced-account-forecast-settings-configure/SKILL.md +628 -0
  311. package/skills/industries-advanced-therapy-management-settings-configure/SKILL.md +73 -0
  312. package/skills/industries-atm-settings-starter-configure/SKILL.md +76 -0
  313. package/skills/industries-batch-document-ai-configure/SKILL.md +196 -0
  314. package/skills/industries-behavioral-health-app-settings-configure/SKILL.md +71 -0
  315. package/skills/industries-branch-management-settings-configure/SKILL.md +89 -0
  316. package/skills/industries-bre-decision-table-access-configure/SKILL.md +367 -0
  317. package/skills/industries-brokerage-settings-configure/SKILL.md +41 -0
  318. package/skills/industries-calendar-sync-settings-configure/SKILL.md +89 -0
  319. package/skills/industries-care-request-settings-configure/SKILL.md +218 -0
  320. package/skills/industries-case-management-intelligence-settings-configure/SKILL.md +54 -0
  321. package/skills/industries-catalog-process-attributes-products-configure/SKILL.md +380 -0
  322. package/skills/industries-catalog-process-fulfillment-configure/SKILL.md +216 -0
  323. package/skills/industries-catalog-process-intake-configure/SKILL.md +219 -0
  324. package/skills/industries-catalog-process-knowledge-configure/SKILL.md +153 -0
  325. package/skills/industries-catalog-process-preprocessor-configure/SKILL.md +168 -0
  326. package/skills/industries-cds-general-settings-configure/SKILL.md +69 -0
  327. package/skills/industries-claim-financial-settings-configure/SKILL.md +169 -0
  328. package/skills/industries-clinical-data-model-settings-configure/SKILL.md +136 -0
  329. package/skills/industries-clinical-data-model-settings-starter-configure/SKILL.md +105 -0
  330. package/skills/industries-collection-plan-settings-configure/SKILL.md +132 -0
  331. package/skills/industries-comms-service-console-settings-configure/SKILL.md +159 -0
  332. package/skills/industries-compliance-configure/SKILL.md +102 -0
  333. package/skills/industries-compliance-document-extraction-setup-configure/SKILL.md +76 -0
  334. package/skills/industries-contact-center-app-layout-configure/SKILL.md +88 -0
  335. package/skills/industries-contact-center-components-configure/SKILL.md +96 -0
  336. package/skills/industries-contact-center-path-knowledge-configure/SKILL.md +95 -0
  337. package/skills/industries-contact-center-user-access-assign/SKILL.md +96 -0
  338. package/skills/industries-course-waitlist-config-configure/SKILL.md +162 -0
  339. package/skills/industries-crisis-center-settings-configure/SKILL.md +84 -0
  340. package/skills/industries-custom-object-settings-configure/SKILL.md +94 -0
  341. package/skills/industries-data-cloud-integration-configure/SKILL.md +88 -0
  342. package/skills/industries-data-space-feature-mappings-configure/SKILL.md +245 -0
  343. package/skills/industries-decision-matrix-builder-configure/SKILL.md +78 -0
  344. package/skills/industries-decision-table-hbase-configure/SKILL.md +87 -0
  345. package/skills/industries-decision-table-version-configure/SKILL.md +74 -0
  346. package/skills/industries-decision-tables-builder-configure/SKILL.md +253 -0
  347. package/skills/industries-decision-tables-configure/SKILL.md +439 -0
  348. package/skills/industries-energy-utilities-configure/SKILL.md +251 -0
  349. package/skills/industries-eu-cloud-multisite-configure/SKILL.md +1008 -0
  350. package/skills/industries-eu-new-connections-configure/SKILL.md +30 -0
  351. package/skills/industries-explainability-msg-template-configure/SKILL.md +135 -0
  352. package/skills/industries-expression-set-message-token-configure/SKILL.md +135 -0
  353. package/skills/industries-field-service-settings-configure/SKILL.md +82 -0
  354. package/skills/industries-form-framework-settings-configure/SKILL.md +30 -0
  355. package/skills/industries-fsc-ai-settings-configure/SKILL.md +57 -0
  356. package/skills/industries-fsc-association-engine-settings-configure/SKILL.md +172 -0
  357. package/skills/industries-fsc-b2b-settings-configure/SKILL.md +61 -0
  358. package/skills/industries-fsc-insurance-settings-configure/SKILL.md +58 -0
  359. package/skills/industries-fsc-visa-fulfillment-setup-configure/SKILL.md +103 -0
  360. package/skills/industries-fsc-wealth-agent-settings-configure/SKILL.md +117 -0
  361. package/skills/industries-fsc-wealth-settings-configure/SKILL.md +99 -0
  362. package/skills/industries-fundraising-gift-entry-settings-configure/SKILL.md +120 -0
  363. package/skills/industries-fundraising-rfm-configure/SKILL.md +128 -0
  364. package/skills/industries-fundraising-settings-configure/SKILL.md +145 -0
  365. package/skills/industries-fundraising-source-code-gen-configure/SKILL.md +299 -0
  366. package/skills/industries-google-maps-api-key-settings-configure/SKILL.md +87 -0
  367. package/skills/industries-grantmaking-intelligence-settings-open/SKILL.md +58 -0
  368. package/skills/industries-hc-score-category-settings-configure/SKILL.md +167 -0
  369. package/skills/industries-health-engagement-settings-configure/SKILL.md +218 -0
  370. package/skills/industries-home-health-agentforce-setup-configure/SKILL.md +131 -0
  371. package/skills/industries-home-health-bundling-policy-create/SKILL.md +50 -0
  372. package/skills/industries-home-health-entity-labels-configure/SKILL.md +29 -0
  373. package/skills/industries-home-health-fsl-package-deploy/SKILL.md +71 -0
  374. package/skills/industries-home-health-fsl-settings-validate/SKILL.md +27 -0
  375. package/skills/industries-home-health-guided-setup-care-and-skill-get/SKILL.md +80 -0
  376. package/skills/industries-home-health-guided-setup-configure/SKILL.md +836 -0
  377. package/skills/industries-home-health-guided-setup-enable-org-fsl-get/SKILL.md +55 -0
  378. package/skills/industries-home-health-guided-setup-get-org-ready-get/SKILL.md +61 -0
  379. package/skills/industries-home-health-licenses-assign/SKILL.md +27 -0
  380. package/skills/industries-home-health-operating-hours-create/SKILL.md +40 -0
  381. package/skills/industries-home-health-scheduling-policy-create/SKILL.md +41 -0
  382. package/skills/industries-home-health-service-objective-create/SKILL.md +22 -0
  383. package/skills/industries-home-health-skills-create/SKILL.md +31 -0
  384. package/skills/industries-home-health-users-create/SKILL.md +29 -0
  385. package/skills/industries-icm-act3-toggles-configure/SKILL.md +198 -0
  386. package/skills/industries-icm-act5-genai-suggested-assessments-configure/SKILL.md +361 -0
  387. package/skills/industries-icm-act6-mcg-integration-configure/SKILL.md +550 -0
  388. package/skills/industries-integrated-care-management-configure/SKILL.md +168 -0
  389. package/skills/industries-object-enablement-configure/SKILL.md +86 -0
  390. package/skills/industries-tpm-system-processing-service-configure/SKILL.md +64 -0
  391. package/skills/insurance-brokerage-agency-billing-configure/SKILL.md +1 -3
  392. package/skills/integration-apex-settings-configure/SKILL.md +61 -0
  393. package/skills/marketing-e360-email-archiving-configure/SKILL.md +73 -0
  394. package/skills/marketing-message-test/SKILL.md +1 -3
  395. package/skills/nonprofit-fundraising-configure/SKILL.md +240 -0
  396. package/skills/nonprofit-fundraising-configure/references/gotchas.md +26 -0
  397. package/skills/nonprofit-fundraising-configure/references/mcp-invocation.md +678 -0
  398. package/skills/nonprofit-fundraising-configure/references/permission-targeting.md +35 -0
  399. package/skills/nonprofit-volunteer-management-model-get/SKILL.md +166 -0
  400. package/skills/nonprofit-volunteer-management-model-get/references/entities.md +315 -0
  401. package/skills/nonprofit-volunteer-management-model-get/references/relationships.md +175 -0
  402. package/skills/nonprofit-volunteer-management-model-get/references/themes.md +143 -0
  403. package/skills/nonprofit-volunteer-management-records-create/SKILL.md +121 -0
  404. package/skills/nonprofit-volunteer-management-records-create/references/field-guide.md +284 -0
  405. package/skills/nonprofit-volunteer-management-records-create/references/mcp-invocation.md +248 -0
  406. package/skills/nonprofit-volunteer-management-records-create/references/review-format.md +140 -0
  407. package/skills/nonprofit-volunteer-management-records-create/scripts/expand-series.py +632 -0
  408. package/skills/nonprofit-volunteer-management-records-create/scripts/render-review-table.py +419 -0
  409. package/skills/nonprofit-volunteer-management-records-create/scripts/tests/test_expand_series.py +690 -0
  410. package/skills/nonprofit-volunteer-management-records-create/scripts/tests/test_render_review_table.py +421 -0
  411. package/skills/nonprofit-volunteer-management-structure-generate/SKILL.md +119 -0
  412. package/skills/nonprofit-volunteer-management-structure-generate/references/configuration-decisions.md +159 -0
  413. package/skills/nonprofit-volunteer-management-structure-generate/references/discovery-interview.md +137 -0
  414. package/skills/nonprofit-volunteer-management-structure-generate/references/edge-cases.md +48 -0
  415. package/skills/nonprofit-volunteer-management-structure-generate/references/mcp-invocation.md +75 -0
  416. package/skills/nonprofit-volunteer-management-structure-generate/references/plan-output.md +141 -0
  417. package/skills/platform-custom-field-generate/SKILL.md +1 -0
  418. package/skills/platform-custom-field-generate/references/advanced-picklists.md +5 -5
  419. package/skills/platform-custom-metadata-type-generate/SKILL.md +3 -0
  420. package/skills/platform-custom-object-generate/SKILL.md +4 -0
  421. package/skills/platform-custom-permissions-configure/SKILL.md +687 -0
  422. package/skills/platform-custom-setting-generate/SKILL.md +3 -0
  423. package/skills/platform-datamask-run/SKILL.md +1 -5
  424. package/skills/platform-label-workbench-import-create/SKILL.md +67 -0
  425. package/skills/platform-permission-set-generate/SKILL.md +3 -0
  426. package/skills/platform-privacy-agent-settings-configure/SKILL.md +752 -0
  427. package/skills/platform-salesforce-connect-adapter-generate/SKILL.md +1 -3
  428. package/skills/platform-sandbox-configure/SKILL.md +1 -3
  429. package/skills/platform-value-set-generate/SKILL.md +3 -0
  430. package/skills/sales-call-scoring-configure/SKILL.md +1 -5
  431. package/skills/service-agentforce-channel-configure/SKILL.md +1 -3
  432. package/skills/service-agentforce-human-escalation-configure/SKILL.md +1 -3
  433. package/skills/service-catalog-template-coordinate/SKILL.md +1 -3
  434. package/skills/service-concierge-portal-generate/SKILL.md +1 -3
  435. package/skills/service-email-to-case-configure/SKILL.md +1 -5
  436. package/skills/service-itsm-agentic-setup-agent-runtime-access-assign/SKILL.md +1 -3
  437. package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +1 -3
  438. package/skills/service-itsm-agentic-setup-agentforce-studio-configure/SKILL.md +1 -3
  439. package/skills/service-itsm-agentic-setup-agentforce-studio-validate/SKILL.md +1 -3
  440. package/skills/service-itsm-agentic-setup-cmdb-access-assign/SKILL.md +1 -3
  441. package/skills/service-itsm-agentic-setup-cmdb-bundle-deploy/SKILL.md +1 -5
  442. package/skills/service-itsm-agentic-setup-cmdb-configure/SKILL.md +1 -3
  443. package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +1 -3
  444. package/skills/service-itsm-agentic-setup-cmdb-discovery-configure/SKILL.md +1 -3
  445. package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +1 -3
  446. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +1 -3
  447. package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +1 -0
  448. package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/SKILL.md +1 -3
  449. package/skills/service-itsm-agentic-setup-uel-user-create/SKILL.md +1 -9
  450. package/skills/service-itsm-incident-mgmt-configure/SKILL.md +1 -5
  451. package/skills/service-itsm-incident-priority-configure/SKILL.md +1 -3
  452. package/skills/service-itsm-slack-itservice-configure/SKILL.md +1 -3
  453. package/skills/service-itsm-swarming-configure/SKILL.md +1 -3
  454. package/skills/service-itsm-teams-configure/SKILL.md +1 -3
  455. package/skills/service-itsm-teams-debug/SKILL.md +1 -3
  456. package/skills/service-itsm-teams-employee-agent-configure/SKILL.md +1 -3
  457. package/skills/service-itsm-teams-itdesk-configure/SKILL.md +1 -3
  458. package/skills/service-itsm-teams-itservice-configure/SKILL.md +1 -3
  459. package/skills/service-native-voice-recording-transcription-configure/SKILL.md +1 -3
  460. package/skills/service-omni-agent-users-create/SKILL.md +1 -3
  461. package/skills/service-omni-agent-work-sharing-configure/SKILL.md +1 -3
  462. package/skills/service-omni-attribute-routing-configure/SKILL.md +1 -3
  463. package/skills/service-omni-base-settings-configure/SKILL.md +1 -3
  464. package/skills/service-omni-channel-inventory-analyze/SKILL.md +1 -3
  465. package/skills/service-omni-channel-limits-analyze/SKILL.md +1 -3
  466. package/skills/service-omni-channel-setup-coordinate/SKILL.md +1 -3
  467. package/skills/service-omni-command-center-analyze/SKILL.md +1 -3
  468. package/skills/service-omni-command-center-configure/SKILL.md +1 -3
  469. package/skills/service-omni-permission-set-assign/SKILL.md +1 -3
  470. package/skills/service-omni-presence-status-deploy/SKILL.md +1 -3
  471. package/skills/service-omni-presence-user-config-deploy/SKILL.md +1 -3
  472. package/skills/service-omni-queue-deploy/SKILL.md +1 -3
  473. package/skills/service-omni-queue-members-assign/SKILL.md +1 -3
  474. package/skills/service-omni-queue-routing-config-deploy/SKILL.md +1 -3
  475. package/skills/service-omni-routing-flow-deploy/SKILL.md +1 -3
  476. package/skills/service-omni-service-channel-configure/SKILL.md +1 -3
  477. package/skills/service-omni-sidebar-configure/SKILL.md +1 -3
  478. package/skills/service-omni-skills-based-routing-configure/SKILL.md +1 -3
  479. package/skills/service-omni-supervisor-config-deploy/SKILL.md +1 -3
  480. package/skills/service-omni-supervisor-permset-assign/SKILL.md +1 -3
  481. package/skills/service-omni-supervisor-surface-deploy/SKILL.md +1 -3
  482. package/skills/service-omni-supervisor-users-create/SKILL.md +1 -3
  483. package/skills/service-omni-work-skill-routing-configure/SKILL.md +1 -3
  484. package/skills/tableau-next-asset-create/README.md +0 -65
@@ -0,0 +1,727 @@
1
+ ---
2
+ name: experience-custom-domain-create
3
+ description: "System-of-record describing the Salesforce Connect REST API routes for managing custom domains — onboard a new domain to Cloudflare (the only supported CDN partner), list registered domains, check pending-configuration status, activate a domain, list / fetch custom URLs for a domain or site, and associate a domain to a site. Routes only — runtime dispatch (auth, transport, retries) is handled by the MCP tool that consumes this description."
4
+ metadata:
5
+ version: "1.0"
6
+ ---
7
+
8
+ # sf-custom-domain
9
+
10
+ System-of-record for the Salesforce Connect REST API routes used to manage custom domains. **This skill describes the API contract only — it does not invoke any CLI or shell commands.** Runtime dispatch (auth, transport, retries) is the responsibility of the MCP tool that consumes this description.
11
+
12
+ Nine user-facing operations against `/services/data/v<version>/connect/custom-domain/...`:
13
+
14
+ - **Onboard** — trigger phrases: "onboard `<domain>`", "register `<domain>` to cloudflare", "add custom domain `<domain>`". Primary route: `POST /connect/custom-domain/domains`.
15
+ - **List domains** — trigger phrases: "list custom domains", "show all custom domains", "what domains are registered". Primary route: `GET /connect/custom-domain/domains`.
16
+ - **Pending status** — trigger phrases: "status of `<domain>`", "pending configuration for `<domain>`", "is `<domain>` activated yet". Primary route: `GET /connect/custom-domain/domains/{domainId}/pending-configuration`.
17
+ - **Activate** — trigger phrases: "activate `<domain>`", "activate custom domain `<domain>`", "move `<domain>` to active". Primary route: `POST /connect/custom-domain/domains/{domainId}/activate`.
18
+ - **List URLs by domain** — trigger phrases: "list urls for `<domain>`", "custom urls on `<domain>`", "what urls point at `<domain>`". Primary route: `GET /connect/custom-domain/domains/{domainId}/custom-urls`.
19
+ - **List all URLs** — trigger phrases: "list all custom urls", "all custom urls", "every custom url in the org", "show me all the urls". Composes **List domains** + **List URLs by domain** for each.
20
+ - **Get URL** — trigger phrases: "show url `<customUrlId>`", "details of url `<customUrlId>` on `<domain>`". Primary route: `GET /connect/custom-domain/domains/{domainId}/custom-urls/{customUrlId}`.
21
+ - **List URLs by site** — trigger phrases: "list urls for site `<siteId>`", "custom urls on site `<storeOrSiteId>`". Primary route: `GET /connect/custom-domain/domains/sites/{storeOrSiteId}/custom-urls`.
22
+ - **Associate domain to site** — trigger phrases: "associate `<domain>` with site `<siteName|siteId>`", "attach site `<siteName|siteId>` to `<domain>` at path `<path>`", "associate site `<siteName>` with `<domain>`", "add a custom url". Primary route: `POST /connect/custom-domain/domains/{domainId}/custom-urls`.
23
+
24
+ API version is read from `constants.json`, which pins `apiVersion` to **v67.0** for every operation in this skill — always call these routes at v67.0 or higher.
25
+
26
+ See the companion `references.md` for DNS-prerequisite documentation and Connect API reference material.
27
+
28
+ ## Output rules — strict (applies to all ops)
29
+
30
+ - The skill produces *exactly one* result message and stops. No follow-up verification, no extra tables, no "should I also..." questions.
31
+ - Do not run additional checks after the result message. If something needs verifying, the user will ask separately.
32
+ - Confirmation prompts are allowed only at the points called out below ("proceed despite warnings"). Nowhere else.
33
+
34
+ ## Common — error-shape contract
35
+
36
+ All Connect API errors follow the standard Salesforce shape: an array of `{errorCode, message}`. When mapping errors, surface the first entry's message verbatim and apply the per-operation error tables below. If the response indicates an unknown / unsupported endpoint, suggest checking the API version on https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/connect_resources_custom_domain_resources.htm and confirm the org supports v67.0+ — see `constants.json`. Never retry automatically — the user retries.
37
+
38
+ ---
39
+
40
+ ## Operation: Onboard
41
+
42
+ Register a new custom domain. The CDN partner is always Cloudflare (the only supported `cdnPartner` enum value).
43
+
44
+ ### Required inputs
45
+
46
+ - `domainName` — required. Strip leading/trailing whitespace, lowercase. Reject if it doesn't match a basic FQDN pattern (`^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$`). If not supplied, ask:
47
+ > What domain do you want to onboard? (e.g. `www.example.com`)
48
+ - `cdnPartner` — always `Cloudflare`. This is the only supported enum value. If the user supplies any value other than `cloudflare`/`Cloudflare` (case-insensitive), reject the request (see edge cases). Normalize to the exact string `Cloudflare` before sending.
49
+ - `configurationOption` — always `CdnPartner` for this skill. Other options (`ExternalHttps`, `NoHttps`, `SitesRuntime`) are out of scope.
50
+
51
+ ### Helper routes (optional, for remediation only)
52
+
53
+ Two read-only Connect API routes return the authoritative CNAME-target values for a domain. They are **not** invoked as part of onboarding — Salesforce runs its own validation when the registration POST is called and returns a clear error if DNS isn't ready. These routes exist so the consumer can surface the expected target in error remediation when Salesforce's own message doesn't include it.
54
+
55
+ **Route — ownership CNAME**
56
+ - **Method/path:** `GET /services/data/v<version>/connect/custom-domain/domains/{domainName}/expected-cname`
57
+ - **Request:** no body.
58
+ - **Response shape (200):** JSON object containing the CNAME target the domain's DNS must point to.
59
+
60
+ **Route — CDN validation CNAME**
61
+ - **Method/path:** `GET /services/data/v<version>/connect/custom-domain/domains/{domainName}/expected-cdn-validation-cname`
62
+ - **Request:** no body.
63
+ - **Response shape (200):** JSON object containing the `_acme-challenge.<domain>` CNAME target the CDN partner uses for cert provisioning.
64
+
65
+ If both routes return `NOT_FOUND` at the configured API version, the documented format is `[domainName].[orgId-lowercased].live.siteforce.com` (see `references.md`). On internal/non-production stacks the actual provisioned target may include extra path segments before `siteforce.com` — the API routes above are the source of truth; the constructed format is best-effort.
66
+
67
+ ### Step 1: Register the domain
68
+
69
+ - **Method/path:** `POST /services/data/v<version>/connect/custom-domain/domains`
70
+ - **Response shape (success, HTTP 2xx):** JSON object with `domainId` and `domainName` (and additional metadata fields).
71
+
72
+ **Request body:**
73
+
74
+ ```json
75
+ {
76
+ "domainName": "<domainName>",
77
+ "configurationOption": "CdnPartner",
78
+ "cdnPartner": "Cloudflare"
79
+ }
80
+ ```
81
+
82
+ `cdnPartner` is fixed to the literal string `"Cloudflare"`; it is the only supported enum value.
83
+
84
+ ### Step 2: Interpret the response
85
+
86
+ **On success:**
87
+ ```text
88
+ ## ✅ Domain submitted for provisioning
89
+
90
+ - **Domain**: `<domainName>`
91
+ - **CDN partner**: `<cdnPartner>`
92
+ - **API version**: v<version>
93
+
94
+ The domain has been submitted to Salesforce for provisioning — it is **not active yet**. Provisioning can take up to 24 hours.
95
+
96
+ Salesforce response (pretty-printed JSON):
97
+ <pretty-printed response>
98
+
99
+ Next step: check provisioning status with `pending configuration for <domainName>`.
100
+ ```
101
+
102
+ **On error** — map the first entry of the JSON error array. Standard known error patterns:
103
+
104
+ - **`can't validate the domain` AND `CNAME record may still be processing`** → DNS not ready. **Extract the expected CNAME target from the error message itself** — Salesforce includes it in the message ("Make sure the domain name X uses Y as its CNAME target"). Quote that target verbatim to the user. DNS can take up to 24 hours to propagate. If the error message doesn't include the target, fall back to calling `GET /connect/custom-domain/domains/<domainName>/expected-cname` (or the documented format `<domain>.<orgIdLower>.live.siteforce.com`).
105
+ - **`domain may not belong to you`** (without the CNAME-processing phrase) → Salesforce can't prove ownership of `<domain>`. Get the authoritative CNAME target via `GET /connect/custom-domain/domains/<domainName>/expected-cname` and tell the user the CNAME must point there so Salesforce can verify control.
106
+ - **`DUPLICATE_VALUE` / `already exists` / `already registered`** → `<domain>` is already registered in this org. Use the `list custom domains` op to see all registered domains, or check pending-configuration.
107
+ - **`INVALID_INPUT` and message mentions `domainName`** → `<domain>` failed format validation by Salesforce. Confirm it's a valid public FQDN you control (no leading/trailing dots, no underscores, valid TLD).
108
+ - **`INSUFFICIENT_ACCESS` / `INSUFFICIENT_ACCESS_OR_READONLY`** → the user doesn't have permission to register custom domains. Ask an admin to grant the relevant permission set (often `Modify All Data` or a custom-domain-specific perm set).
109
+ - **`NOT_FOUND` and the path is `/connect/custom-domain/domains`** → the API endpoint isn't available at v<version>. Check https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/connect_resources_custom_domain_resources.htm for the current "Available Version" of `POST /connect/custom-domain/domains`.
110
+ - **Anything else** → surface the raw `errorCode` + `message` verbatim, then suggest: "If this looks like a wrong API version, check the endpoint's Available Version on https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/connect_resources_custom_domain_resources.htm."
111
+
112
+ Always wrap the error in:
113
+
114
+ ```text
115
+ ## ❌ Onboarding failed
116
+
117
+ - **Domain**: `<domainName>`
118
+ - **CDN partner**: `<cdnPartner>`
119
+
120
+ **Error**: `<errorCode>` — `<one-line summary>`
121
+
122
+ **What this means:** <plain-English from the table above>
123
+
124
+ **What to try:** <action from the table above>
125
+
126
+ Raw response (JSON):
127
+ <error JSON>
128
+ ```
129
+
130
+ ---
131
+
132
+ ## Operation: List
133
+
134
+ List all custom domains registered in the org.
135
+
136
+ ### API call
137
+
138
+ - **Method/path:** `GET /services/data/v<version>/connect/custom-domain/domains`
139
+ - **Request:** no body.
140
+ - **Response shape (success):** JSON object whose primary array contains entries with `domainId` and `domainName` (and additional metadata fields).
141
+
142
+ ### Display
143
+
144
+ **Success:** render as a markdown table.
145
+ ```text
146
+ ## Custom domains
147
+
148
+ | Domain ID | Domain Name |
149
+ |---|---|
150
+ | 0I4… | <name1> |
151
+ | 0I4… | <name2> |
152
+ ```
153
+ If the array is empty: `No custom domains are registered.`
154
+
155
+ **Error:** same wrapper as Onboard's error block, minus the domain-specific fields.
156
+
157
+ ---
158
+
159
+ ## Operation: Pending status
160
+
161
+ Fetch the in-flight provisioning status of a single domain.
162
+
163
+ ### Required input
164
+
165
+ - `domainName` — required. If not given, ask for it.
166
+
167
+ ### Step 1: Resolve domainId from domainName
168
+
169
+ Call the **List** route to get the full `{domainId, domainName}` mapping. Find the entry with `domainName == <user-supplied>` (case-insensitive match).
170
+
171
+ - **Found** → carry `domainId` forward.
172
+ - **Not found** → surface a clear error and list valid choices, then stop (no further calls):
173
+
174
+ ```text
175
+ ## ❌ Domain not found
176
+
177
+ `<user-supplied>` is not registered. Registered domains:
178
+
179
+ - `<name1>` — `<id1>`
180
+ - `<name2>` — `<id2>`
181
+ …
182
+ ```
183
+
184
+ ### Step 2: Fetch pending configuration
185
+
186
+ - **Method/path:** `GET /services/data/v<version>/connect/custom-domain/domains/{domainId}/pending-configuration`
187
+ - **Request:** no body.
188
+ - **Response shape (success, HTTP 2xx with body):** JSON object containing `domainStatus`, `configurationOption`, `cdnPartnerOptions`, `associateType` (and additional metadata fields).
189
+ - **Special-case response:** `NOT_FOUND` / `The requested resource does not exist` is the **expected** outcome when the domain is fully provisioned with no pending configuration — render this as success, not as an error.
190
+
191
+ ### Step 3: Display
192
+
193
+ **On success (HTTP 2xx with body):** pretty-print the JSON inside a result block; surface the key fields if present (`domainStatus`, `configurationOption`, `cdnPartnerOptions`, `associateType`).
194
+ ```text
195
+ ## Pending configuration — `<domainName>`
196
+
197
+ - **Domain ID**: `<domainId>`
198
+ - **Status**: `<domainStatus>`
199
+ - **Config option**: `<configurationOption>`
200
+ - **CDN partner**: `<cdnPartner if any>`
201
+ - **Associate type**: `<associateType>`
202
+
203
+ Full response (pretty-printed JSON):
204
+ <pretty-printed body>
205
+ ```
206
+
207
+ **`NOT_FOUND` / `The requested resource does not exist`:**
208
+ ```text
209
+ ## ✅ No pending configuration
210
+
211
+ `<domainName>` (`<domainId>`) has no pending configuration — it appears to be fully provisioned and active.
212
+ ```
213
+
214
+ This is *not* an error. Do not show a red ❌ block.
215
+
216
+ **Other errors:** generic error wrapper, surface `errorCode` + `message` verbatim.
217
+
218
+ ---
219
+
220
+ ## Operation: Activate
221
+
222
+ Move a domain whose `domainStatus` is `AwaitingActivation` to `Completed`.
223
+
224
+ ### Required input
225
+
226
+ - `domainName` — required. If not given, ask for it.
227
+
228
+ ### Step 1: Resolve domainId from domainName
229
+
230
+ Call the **List** route (using the global `apiVersion`) to get the full `{domainId, domainName}` mapping. Find the entry with `domainName == <user-supplied>` (case-insensitive match).
231
+
232
+ - **Found** → carry `domainId` forward.
233
+ - **Not found** → same "Domain not found" block as Pending status. Stop.
234
+
235
+ ### Step 2: Activate
236
+
237
+ Use the global `apiVersion` (v67.0).
238
+
239
+ - **Method/path:** `POST /services/data/v<version>/connect/custom-domain/domains/{domainId}/activate`
240
+ - **Request body:** `{}` (empty JSON object — required even though the operation takes no parameters).
241
+ - **Response shape (success, HTTP 2xx):** JSON object containing `domainName` and the new `domainStatus` (and additional metadata fields).
242
+
243
+ ### Step 3: Interpret the response
244
+
245
+ **On success:**
246
+ ```text
247
+ ## ✅ Domain activated
248
+
249
+ - **Domain**: `<domainName>`
250
+ - **Domain ID**: `<domainId>`
251
+ - **Status**: `<domainStatus>`
252
+ - **API version**: v<version>
253
+
254
+ Salesforce response (pretty-printed JSON):
255
+ <pretty-printed response>
256
+ ```
257
+
258
+ **Known error patterns:**
259
+
260
+ - **`INVALID_INPUT` and message contains `must be in AwaitingActivation status`** → `<domainName>` is not in `AwaitingActivation` status — it cannot be activated right now. Check current status with `pending configuration for <domainName>`. If it's already `Completed`, no action is needed.
261
+ - **`NOT_FOUND` / `The requested resource does not exist`** → the activate endpoint isn't available at the configured version. Check https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/connect_resources_custom_domain_resources.htm for the current Available Version.
262
+ - **`INSUFFICIENT_ACCESS` / `INSUFFICIENT_ACCESS_OR_READONLY`** → the user doesn't have permission to activate custom domains. Ask an admin to grant the relevant permission set.
263
+ - **Anything else** → surface raw `errorCode` + `message` verbatim.
264
+
265
+ Wrap errors in:
266
+ ```text
267
+ ## ❌ Activation failed
268
+
269
+ - **Domain**: `<domainName>`
270
+ - **Domain ID**: `<domainId>`
271
+ - **API version**: v<version>
272
+
273
+ **Error**: `<errorCode>` — `<one-line summary>`
274
+
275
+ **What this means:** <plain-English from the table above>
276
+
277
+ **What to try:** <action from the table above>
278
+
279
+ Raw response (JSON):
280
+ <error JSON>
281
+ ```
282
+
283
+ ---
284
+
285
+ ## Operation: List URLs by domain
286
+
287
+ List every custom URL bound to a registered custom domain. Each row carries the domain ↔ site association (a single domain can serve multiple paths, each routed to a different site).
288
+
289
+ ### Required input
290
+
291
+ - `domainName` *or* `domainId` — exactly one is required. If only `domainName` is given, resolve `domainId` via the **List domains** route (case-insensitive match). If neither is given, ask:
292
+ > Which domain do you want the custom URLs for? (`<domainName>` or `<domainId>`)
293
+
294
+ ### API call
295
+
296
+ - **Method/path:** `GET /services/data/v<version>/connect/custom-domain/domains/{domainId}/custom-urls`
297
+ - **Request:** no body.
298
+ - **Response shape (success, HTTP 2xx):** JSON object with a `customUrls` array. Each entry contains: `customUrlId`, `domainId`, `domainName`, `path`, `primarySiteUrl`, `siteId`, `siteName`, `siteType` (Community / LightningExperience / etc.). May also include `lastModified` and `status` (`Published`, `Preview`, etc.). The response shape does **not** carry site description — use the [Site metadata enrichment](#site-metadata-enrichment-site-entity) section below if needed.
299
+
300
+ ### Display
301
+
302
+ Render as a markdown table.
303
+
304
+ ```text
305
+ ## Custom URLs on `<domainName>` (`<domainId>`)
306
+
307
+ | customUrlId | path | siteId | siteName | siteType | primary | status |
308
+ |---|---|---|---|---|---|---|
309
+ | 0Jf… | / | 0DM… | t1 | Community | false | Published |
310
+ …
311
+ ```
312
+
313
+ If the array is empty: `No custom URLs are associated with <domainName> yet.`
314
+
315
+ **Error:** generic error wrapper from Onboard.
316
+
317
+ ---
318
+
319
+ ## Operation: List all URLs
320
+
321
+ Aggregate every custom URL across every registered domain in the org. The Connect API does **not** expose an org-wide custom-URL list — this op is a composition of two existing routes: **List domains** to discover the domain set, then **List URLs by domain** for each `domainId`.
322
+
323
+ Use when the user asks "show me all the custom urls", "list all custom urls", or any phrasing that implies org-wide scope without naming a specific domain or site.
324
+
325
+ ### No additional inputs
326
+
327
+ Take no arguments. Do not ask the user to narrow scope — the whole point of this op is "everything." If the user already named a domain or site, route to **List URLs by domain** or **List URLs by site** instead.
328
+
329
+ ### Step 1: List all domains
330
+
331
+ Call **List domains**:
332
+ - **Method/path:** `GET /services/data/v<version>/connect/custom-domain/domains`
333
+ - **Request:** no body.
334
+ - **Response shape:** JSON object whose primary array contains entries with `domainId` and `domainName`.
335
+
336
+ If the array is empty:
337
+ ```text
338
+ ## No custom URLs
339
+
340
+ No custom domains are registered in this org, so there are no custom URLs to list.
341
+ ```
342
+ Stop. No further calls.
343
+
344
+ If the call errors, surface the generic error wrapper from Onboard. Stop.
345
+
346
+ ### Step 2: For each `domainId`, fetch its custom URLs
347
+
348
+ For each `(domainId, domainName)` from Step 1, call **List URLs by domain**:
349
+ - **Method/path:** `GET /services/data/v<version>/connect/custom-domain/domains/{domainId}/custom-urls`
350
+ - **Request:** no body.
351
+ - **Response shape:** JSON object with a `customUrls` array (per-row shape: `customUrlId`, `domainId`, `domainName`, `path`, `primarySiteUrl`, `siteId`, `siteName`, `siteType`, optional `lastModified`, `status`).
352
+
353
+ These calls are independent and **may be issued in parallel** (the consuming runtime decides — this skill does not constrain concurrency). Treat each per-domain call independently:
354
+ - Per-domain success → append rows to the aggregate.
355
+ - Per-domain failure → record the error with its `domainName` and `domainId`, but **do not abort the whole op**. Continue with the remaining domains.
356
+ - Per-domain empty array → silently include 0 rows for that domain (no error, no separate "empty" annotation in the per-row table).
357
+
358
+ ### Step 3: Display
359
+
360
+ Render one consolidated table sorted by `domainName`, then `path`. Domains with zero URLs are listed in a separate one-liner block at the bottom so they're not lost.
361
+
362
+ ```text
363
+ ## All custom URLs in the org
364
+
365
+ | Domain | customUrlId | path | siteId | siteName | siteType | primary | status |
366
+ |---|---|---|---|---|---|---|---|
367
+ | <domainName1> | 0Jf… | / | 0DM… | t1 | Community | false | Published |
368
+ | <domainName1> | 0Jf… | /lwr2vforcesite | 0DM… | lwr2 | Community | false | Published |
369
+ | <domainName2> | 0Jf… | / | 0DM… | s1 | Communities | true | Published |
370
+ …
371
+
372
+ **Totals**: <N> URLs across <M> domain(s).
373
+
374
+ **Domains with no URLs yet**: `<domainName3>`, `<domainName4>` (if any — omit this line otherwise).
375
+
376
+ **Per-domain failures** (if any — omit this block otherwise):
377
+ - `<domainName>` (`<domainId>`) — `<errorCode>`: `<message>`
378
+ ```
379
+
380
+ If the aggregate row count is zero AND every per-domain call succeeded:
381
+ ```text
382
+ ## No custom URLs
383
+
384
+ <M> domain(s) registered, none with any custom URLs yet:
385
+ - `<domainName1>` (`<domainId>`)
386
+ …
387
+ ```
388
+
389
+ If **every** per-domain call errored, surface the failures and stop:
390
+ ```text
391
+ ## ❌ List all URLs failed
392
+
393
+ All <M> per-domain `GET .../custom-urls` calls returned errors. Likely a permission, version, or auth issue affecting the whole org rather than one domain.
394
+
395
+ Per-domain errors:
396
+ - `<domainName>` — `<errorCode>`: `<message>`
397
+ …
398
+ ```
399
+
400
+ ### Output rules (specific to this op)
401
+
402
+ - **Single result message.** Even though the op makes N+1 API calls, render exactly one consolidated message at the end. Do not stream per-domain progress updates.
403
+ - **Don't auto-fall-back.** If `GET /domains/{domainId}/custom-urls` returns the same shape of server-side bug as `GET /custom-urls/{customUrlId}` (`INTERNAL_ERROR / query returned more than one row`), record the failure for that domain and move on — do not rerun anything for that domain.
404
+ - **No per-URL details fetch.** This op does not call `Get URL` for each row; the **List URLs by domain** response carries everything needed for the table.
405
+
406
+ ---
407
+
408
+ ## Operation: Get URL
409
+
410
+ Fetch metadata for a single custom URL by its `customUrlId`.
411
+
412
+ ### Required input
413
+
414
+ - `domainId` (or `domainName` resolved via List) and `customUrlId` — both required. If only `customUrlId` is given without a domain, resolve via **List URLs by site** or **List URLs by domain** first.
415
+
416
+ ### API call
417
+
418
+ - **Method/path:** `GET /services/data/v<version>/connect/custom-domain/domains/{domainId}/custom-urls/{customUrlId}`
419
+ - **Request:** no body.
420
+ - **Response shape (success, HTTP 2xx):** single JSON object with the same per-row fields as **List URLs by domain** (`customUrlId`, `domainId`, `domainName`, `path`, `primarySiteUrl`, `siteId`, `siteName`, `siteType`, plus optional `lastModified`, `status`).
421
+
422
+ ### Display
423
+
424
+ Pretty-print as a key/value block:
425
+
426
+ ```text
427
+ ## Custom URL `<customUrlId>` on `<domainName>`
428
+
429
+ - **Path**: `<path>`
430
+ - **Primary**: `<primarySiteUrl>`
431
+ - **Site**: `<siteName>` (`<siteId>`, `<siteType>`)
432
+ - **Status**: `<status>`
433
+ - **Last modified**: `<lastModified>`
434
+
435
+ Full response (pretty-printed JSON):
436
+ <pretty-printed body>
437
+ ```
438
+
439
+ ### Known issue: `INTERNAL_ERROR` / `query returned more than one row`
440
+
441
+ The endpoint occasionally returns HTTP 500 with:
442
+ ```text
443
+ errorCode: INTERNAL_ERROR
444
+ message: "ERROR: query returned more than one row ..."
445
+ ```
446
+ Reason: if the site behind the requested `customUrlId` is published under more than one domain/path mapping, the lookup matches multiple rows and can't disambiguate. Site-side ambiguity, not a `customUrlId` collision — `customUrlId` itself is unique.
447
+
448
+ **When this fires:** surface a clear, plain-English message and **fall back** to the **List URLs by domain** op so the user can locate the row by `path` instead. Do not retry the same call.
449
+
450
+ ```text
451
+ ## ⚠ Custom URL lookup failed (server-side issue)
452
+
453
+ The `GET .../custom-urls/<customUrlId>` endpoint returned `INTERNAL_ERROR` on `<domainName>` — this is a known server-side bug where the stored procedure can't pick a single row.
454
+
455
+ Falling back to listing all custom URLs on the domain instead.
456
+ ```
457
+
458
+ Then immediately render the **List URLs by domain** result for the same `domainId`.
459
+
460
+ **Other errors:** generic error wrapper.
461
+
462
+ ---
463
+
464
+ ## Operation: List URLs by site
465
+
466
+ Fetch every custom URL associated with a given site / store, across all custom domains in the org. Useful when you have a `siteId` and want to discover which domain(s) it sits behind.
467
+
468
+ ### Required input
469
+
470
+ - `storeOrSiteId` — required. The 15-char or 18-char Salesforce ID of the site or store (`0DM…` for Communities, `0DR…` etc.). If not given, ask for it.
471
+
472
+ ### API call
473
+
474
+ - **Method/path:** `GET /services/data/v<version>/connect/custom-domain/domains/sites/{storeOrSiteId}/custom-urls`
475
+ - **Request:** no body.
476
+ - **Response shape (success, HTTP 2xx):** JSON object with a `customUrls` array using the same per-row shape as **List URLs by domain**. May also surface `lastModified` and `status`.
477
+
478
+ ### Display
479
+
480
+ ```text
481
+ ## Custom URLs for site `<siteName>` (`<storeOrSiteId>`)
482
+
483
+ | customUrlId | domainName | path | primary | status |
484
+ |---|---|---|---|---|
485
+ | 0Jf… | <name> | / | false | Preview |
486
+ …
487
+ ```
488
+
489
+ If the array is empty: `No custom URLs are bound to site <storeOrSiteId>.`
490
+
491
+ **Error:** generic error wrapper.
492
+
493
+ ---
494
+
495
+ ## Operation: Associate domain to site
496
+
497
+ Bind an existing custom domain to a site (or store) at a given path. Uses the global `apiVersion` (v67.0), same as every other operation in this skill.
498
+
499
+ **Wire-verified behavior** (one POST, two rows):
500
+ - The server creates **two** `customUrl` records per call:
501
+ - **Row 1** — the `path` as-supplied (the LWR sub-site row).
502
+ - **Row 2** — `path` with the site's `Site.UrlPathPrefix` appended. Example: POST `/testpath` against a site whose `UrlPathPrefix` is `vforcesite` ⇒ a second row at `/testpathvforcesite`.
503
+ - The POST response body returns **only Row 1**. Use **List URLs by domain** on the same `domainId` to see both rows.
504
+ - An 18-char `siteId` in the request is normalised to 15-char in the response.
505
+ - **Not idempotent.** A repeat POST at the same `(domainId, path)` returns `400 DUPLICATE_VALUE`.
506
+
507
+ ### Required inputs
508
+
509
+ - `domainName` *or* `domainId` — exactly one. Resolve `domainName → domainId` via **List domains** (Step 1).
510
+ - `siteName` *or* `siteId` — exactly one. The site (Site / store) to bind. Must already exist; this skill does not create sites. If `siteName` is given, resolve `siteName → siteId` via the [Site metadata enrichment](#site-metadata-enrichment-site-entity) SOQL against `Site` (Step 2). If multiple sites match the same name, ask the user to disambiguate before proceeding.
511
+ - `path` — optional. Site-relative URL prefix (e.g. `/`, `/lwr2`, `/store`). Must start with `/` if given. Default: `/` (the apex). The empty string is invalid.
512
+
513
+ If `domainName`/`domainId` or `siteName`/`siteId` is missing, ask:
514
+ > Which domain and site should I associate? (`<domainName|domainId>` and `<siteName|siteId>`, optionally a `<path>` — defaults to `/`)
515
+
516
+ This op is intentionally agnostic about whether the user gives names or IDs. "associate `acme.com` to site `Storefront`" must work end-to-end without further ID prompts when the names are unambiguous.
517
+
518
+ ### Step 1: Resolve domainId from domainName (if `domainId` not supplied)
519
+
520
+ Call **List domains**, case-insensitive match on `domainName`. Stop with the "Domain not found" block if the user-supplied name is not registered. If a `domainId` was supplied directly, skip this step.
521
+
522
+ ### Step 2: Resolve siteId from siteName (if `siteId` not supplied)
523
+
524
+ The Custom Domain Connect API has no site-by-name lookup, so this resolution goes through the platform `Site` SObject (the underlying record for every Experience Cloud site / store). The consuming runtime executes the SOQL — this skill specifies the query and how to interpret the result.
525
+
526
+ **Query** (case-insensitive name match; surface `Description` so the user can disambiguate among same-named sites):
527
+
528
+ ```sql
529
+ SELECT Id, Name, Description, UrlPathPrefix, Status
530
+ FROM Site
531
+ WHERE Name = '<siteName-escaped>'
532
+ ```
533
+
534
+ Where `<siteName-escaped>` is the user-supplied name with single quotes / backslashes escaped per SOQL string-literal rules. If the consumer is unsure about case, use `WHERE Name LIKE '<siteName-escaped>'` instead — the consumer is free to widen, but the skill defaults to exact case-insensitive match.
535
+
536
+ **Interpret the result:**
537
+
538
+ - **Exactly one row** → carry `siteId = result[0].Id` forward to Step 3. Capture `Description` and `UrlPathPrefix` for the eventual success block; you'll need them for the display.
539
+ - **Zero rows** → surface a clear error and stop. No further calls.
540
+ - **Two or more rows** → **do not pick one automatically.** Ask the user to disambiguate, surfacing every candidate's `Description` so the choice is informed. Stop. Do not POST. The user re-issues the command with `siteId` chosen explicitly.
541
+
542
+ **Zero rows:**
543
+
544
+ ```text
545
+ ## ❌ Site not found
546
+
547
+ No site named `<siteName>` exists in this org (queried `Site` via SOQL).
548
+
549
+ - Check the spelling of the site name.
550
+ - If the site is a store, confirm it's published / accessible to your user.
551
+ - You can also pass the site ID directly (`0DM…` for Communities).
552
+ ```
553
+
554
+ **Two or more rows:**
555
+
556
+ ```text
557
+ ## ⚠ Multiple sites named `<siteName>`
558
+
559
+ <N> sites in this org share that name. Pick one by ID before I proceed:
560
+
561
+ | siteId | Description | UrlPathPrefix | Status |
562
+ |---|---|---|---|
563
+ | 0DM…1 | <description1 or "(no description)"> | <prefix1 or "(none)"> | <status1> |
564
+ | 0DM…2 | <description2 or "(no description)"> | <prefix2 or "(none)"> | <status2> |
565
+ …
566
+
567
+ Re-run with the explicit `siteId` you want. (No site has been associated yet.)
568
+ ```
569
+
570
+ If the SOQL itself errors (e.g. no read on `Site`, malformed query), surface the error verbatim under a `## ❌ Site lookup failed` block and stop. The user retries with `siteId`.
571
+
572
+ If a `siteId` was supplied directly, skip this step entirely. Optionally fetch the row for that `siteId` (`SELECT Id, Name, Description, UrlPathPrefix FROM Site WHERE Id = '<siteId>'`) to enrich the success block; if the lookup fails, fall through and use only the API-returned `siteName`/`siteType` in the display.
573
+
574
+ ### Step 3: POST the association
575
+
576
+ After Steps 1 and 2, both `domainId` and `siteId` are known. The user may have supplied them directly, or this skill may have resolved them from `domainName` and `siteName` via List domains + the `Site` SOQL.
577
+
578
+ Use the global `apiVersion` (v67.0).
579
+
580
+ - **Method/path:** `POST /services/data/v<version>/connect/custom-domain/domains/{domainId}/custom-urls`
581
+ - **Request body fields:**
582
+ - `siteId` — required. 15- or 18-char `0DM…`; server normalises to 15-char.
583
+ - `path` — required. Must begin with `/`. Omitting it returns `400 DUPLICATE_VALUE` (not `REQUIRED_FIELD_MISSING` — wire-verified).
584
+ - No other fields are accepted by this skill. Do not pass `customUrlId` (server-assigned), `domainId` (from URL path), `siteName`, or `siteType` (server-resolved).
585
+ - **Response shape (HTTP 201):** the Row-1 record only (see example below). Row 2 (`path + UrlPathPrefix`) is created server-side but **not** returned in this response. Run **List URLs by domain** on the same `domainId` to inspect it.
586
+
587
+ **Request body:**
588
+
589
+ ```json
590
+ {
591
+ "siteId": "0DM…",
592
+ "path": "/<path>"
593
+ }
594
+ ```
595
+
596
+ **Response shape (HTTP 201):**
597
+
598
+ ```json
599
+ {
600
+ "customUrlId": "0Jf…",
601
+ "domainId": "0I4…",
602
+ "domainName": "<domainName>",
603
+ "path": "/your-path",
604
+ "primarySiteUrl": false,
605
+ "siteId": "0DM… (15-char)",
606
+ "siteName": "<site name>",
607
+ "siteType": "Community",
608
+ "status": "Published"
609
+ }
610
+ ```
611
+
612
+ ### Step 4: Display
613
+
614
+ ```text
615
+ ## ✅ Site associated with domain
616
+
617
+ - **Domain**: `<domainName>` (`<domainId>`)
618
+ - **Site**: `<siteName>` (`<siteId>`, `<siteType>`)
619
+ - **Site description**: `<Site.Description from Step 2 — or "(no description)" if blank, or omit this line entirely if Step 2 was skipped>`
620
+ - **Path (server-normalised)**: `<path>`
621
+ - **Custom URL ID**: `<customUrlId>`
622
+ - **Status**: `<status>`
623
+ - **API version**: v<version>
624
+
625
+ Salesforce response (pretty-printed JSON):
626
+ <pretty-printed response>
627
+ ```
628
+
629
+ If the server-normalised `path` differs from the requested input, surface a one-line note above the success block:
630
+
631
+ ```text
632
+ ℹ Server normalised the path: requested `<requested>` → stored `<stored>`. (Salesforce appends the site's URL path prefix when the site has one.)
633
+ ```
634
+
635
+ ### Known error patterns
636
+
637
+ - **`404 NOT_FOUND` / `The requested resource does not exist`** — endpoint not exposed at this org's version at all. Check https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/connect_resources_custom_domain_resources.htm for the current Available Version.
638
+ - **`500 UNKNOWN_EXCEPTION`** — bogus / non-existent `siteId`. `<siteId>` cannot be resolved by the server. Confirm the ID format (`0DM…` for Communities) and that the site exists in this org. The server returns 500 (not 400) for unknown siteIds — wire-verified.
639
+ - **`400 DUPLICATE_VALUE` — `A custom URL already exists for this domain and path`** — repeat POST at same `(domainId, path)`. A custom URL already exists at `<path>` on `<domainName>`. The op is **not idempotent** — use **List URLs by domain** to inspect the existing binding.
640
+ - **`400 DUPLICATE_VALUE`** (no `path` field) — `path` missing from the request body. `path` is required and must begin with `/`. The server returns `DUPLICATE_VALUE` (not `REQUIRED_FIELD_MISSING`) for this case — wire-verified.
641
+ - **`400 INVALID_INPUT` and message mentions `path`** — malformed path. Must start with `/` and contain only URL-safe characters. The empty string is invalid; use `/` for the apex.
642
+ - **`403 INSUFFICIENT_ACCESS` / `INSUFFICIENT_ACCESS_OR_READONLY`** — caller lacks the perm. Ask an admin to grant the relevant permission set.
643
+ - **Anything else** — surface raw `errorCode` + `message` verbatim.
644
+
645
+ Wrap errors in:
646
+
647
+ ```text
648
+ ## ❌ Site association failed
649
+
650
+ - **Domain**: `<domainName>` (`<domainId>`)
651
+ - **Site**: `<siteId>`
652
+ - **Path**: `<path>`
653
+ - **API version**: v<version>
654
+
655
+ **Error**: `<errorCode>` — `<one-line summary>`
656
+
657
+ **What this means:** <plain-English from the table above>
658
+
659
+ **What to try:** <action from the table above>
660
+
661
+ Raw response (JSON):
662
+ <error JSON>
663
+ ```
664
+
665
+ ---
666
+
667
+ ## Site metadata enrichment (Site entity)
668
+
669
+ The custom-URL routes return `siteId`, `siteName`, and `siteType`, but **not** the human-friendly `Description` or the site's own `UrlPathPrefix`. The Connect API also has no site-by-name lookup, so resolving a user-supplied site name to its `siteId` likewise depends on the platform `Site` SObject.
670
+
671
+ - **Object:** `Site` (the platform-internal record for every Experience Cloud / Communities site / store; one row per site).
672
+ - **Join key:** `Site.Id == customUrls[*].siteId` — the site IDs returned by the custom-URL routes are `Site.Id` values.
673
+ - **Fields worth surfacing:** `Id`, `Name`, `Description`, `UrlPathPrefix`, `Status`, `SiteType`, `MasterLabel`.
674
+
675
+ This metadata source is consumed by the skill in two distinct ways:
676
+
677
+ 1. **Display enrichment (optional).** Custom-URL display ops (List URLs by domain / List URLs by site / List all URLs / Get URL) may fold `Description` and `UrlPathPrefix` into the per-row table alongside `siteName`. **Do not block** the primary custom-URL display on this enrichment — render with API fields first, layer on `Site` data when present.
678
+
679
+ 2. **Name resolution (required when used).** [Operation: Associate domain to site](#operation-associate-domain-to-site) uses this object to resolve a user-supplied `siteName` to a `siteId` before the POST. That resolution **is** load-bearing: zero rows ⇒ stop with a "site not found" error; multiple rows ⇒ stop and ask the user to disambiguate using the per-row `Description`. See Associate's Step 2 for the exact behavior.
680
+
681
+ **Example SOQL queries** (the consumer constructs and executes these — this skill specifies the queries but does not invoke SOQL itself):
682
+
683
+ Bulk display enrichment:
684
+ ```sql
685
+ SELECT Id, Name, Description, UrlPathPrefix, Status
686
+ FROM Site
687
+ WHERE Id IN ('<siteId1>', '<siteId2>', …)
688
+ ```
689
+
690
+ Name resolution for Associate Step 2:
691
+ ```sql
692
+ SELECT Id, Name, Description, UrlPathPrefix, Status
693
+ FROM Site
694
+ WHERE Name = '<siteName-escaped>'
695
+ ```
696
+
697
+ ---
698
+
699
+ ## Edge cases (all ops)
700
+
701
+ - **User asks for a CDN partner other than Cloudflare** — reject with: "Only `Cloudflare` is supported. Use `cloudflare`."
702
+ - **User passes a domain with a wildcard** (`*.example.com`) — reject in input validation.
703
+ - **Pending-configuration response with anything OTHER than `NOT_FOUND`** is an error — generic error wrapper.
704
+ - **`GET /custom-urls/{customUrlId}` returns `INTERNAL_ERROR` / `query returned more than one row`** — fall back to **List URLs by domain** for the same `domainId` (see [Get URL — Known issue](#known-issue-internal_error--query-returned-more-than-one-row)).
705
+ - **`POST /custom-urls` returns `NOT_FOUND` at v67.0** — confirm the org has the version of the API that exposes the associate endpoint; older patches resolve only at v67+.
706
+
707
+ <!-- skill-validate: ignore-start -->
708
+ <!-- codey:operations start -->
709
+ ## Operations Reference
710
+
711
+ Operations this skill uses — routing and dependency reference.
712
+
713
+ | Operation | Purpose | Status | Call | Depends on |
714
+ |-----------|---------|--------|------|------------|
715
+ | `get-expected-cname` | read | — | `GET /services/data/v67.0/connect/custom-domain/domains/{domainName}/expected-cname` | — |
716
+ | `get-expected-cdn-validation-cname` | read | — | `GET /services/data/v67.0/connect/custom-domain/domains/{domainName}/expected-cdn-validation-cname` | — |
717
+ | `onboard-custom-domain` | write | — | `POST /services/data/v67.0/connect/custom-domain/domains` | `get-expected-cname`, `get-expected-cdn-validation-cname` |
718
+ | `list-custom-domains` | read | — | `GET /services/data/v67.0/connect/custom-domain/domains` | — |
719
+ | `get-pending-configuration` | read | — | `GET /services/data/v67.0/connect/custom-domain/domains/{domainId}/pending-configuration` | `list-custom-domains` |
720
+ | `activate-custom-domain` | write | — | `POST /services/data/v67.0/connect/custom-domain/domains/{domainId}/activate` | `list-custom-domains`, `get-pending-configuration` |
721
+ | `list-custom-urls-by-domain` | read | — | `GET /services/data/v67.0/connect/custom-domain/domains/{domainId}/custom-urls` | `list-custom-domains` |
722
+ | `list-custom-urls-by-site` | read | — | `GET /services/data/v67.0/connect/custom-domain/domains/sites/{storeOrSiteId}/custom-urls` | — |
723
+ | `get-custom-url-detail` | read | — | `GET /services/data/v67.0/connect/custom-domain/domains/{domainId}/custom-urls/{customUrlId}` | `list-custom-urls-by-domain` |
724
+ | `associate-domain-to-site` | write | — | `POST /services/data/v67.0/connect/custom-domain/domains/{domainId}/custom-urls` | `list-custom-domains`, `resolve-site-name-to-id` |
725
+ | `resolve-site-name-to-id` | read | — | `GET /services/data/v67.0/query` | — |
726
+ <!-- codey:operations end -->
727
+ <!-- skill-validate: ignore-end -->