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