@salesforce/afv-skills 1.55.0 → 1.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/skills/agentforce-generate/SKILL.md +8 -0
- package/skills/agentforce-generate/references/actions-reference.md +2 -2
- package/skills/agentforce-generate/references/voice-modality-reference.md +51 -15
- package/skills/agentforce-generate/references/voice-telephony-cli.md +193 -0
- package/skills/agentforce-observe/SKILL.md +13 -9
- package/skills/agentforce-observe/references/ahm-alerts.md +193 -14
- package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +24 -15
- package/skills/automation-sandbox-post-copy-config-generate/assets/config_template.json +11 -0
- package/skills/automation-sandbox-post-copy-config-generate/assets/json_schema.json +33 -1
- package/skills/automation-sandbox-post-copy-config-generate/references/configuration_catalog.md +32 -1
- package/skills/automation-sandbox-post-copy-configure/SKILL.md +75 -71
- package/skills/automation-sandbox-post-copy-configure/assets/scheduled_apex_template.apex +13 -0
- package/skills/automation-sandbox-post-copy-configure/examples/sample_scheduled_apex_config.json +13 -0
- package/skills/automation-sandbox-post-copy-configure/references/scheduled_apex_path.md +155 -0
- package/skills/automation-sandbox-post-copy-configure/scripts/build-scheduled-apex.mjs +62 -0
- package/skills/automation-sandbox-post-copy-configure/scripts/soql-escape-job-name.mjs +28 -0
- package/skills/commerce-b2b-open-code-components-integrate/SKILL.md +1 -1
- package/skills/commerce-b2b-open-code-components-replace/SKILL.md +16 -16
- package/skills/consumer-goods-accruals-datakit-deploy/SKILL.md +383 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/setup.js +324 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/00-check-prerequisites.js +63 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/01-download-static-resource.js +100 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/02-replace-org-id.js +46 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/03-deploy-metadata.js +46 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/04-deploy-engine.js +198 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/05-deploy-tpm-accruals.js +231 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/06-create-dataspace.js +82 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/07-deploy-accruals-reports.js +517 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/08-deploy-ui.js +416 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/09-completion.js +44 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/utils.js +514 -0
- package/skills/consumer-goods-sync-management-configure/SKILL.md +137 -0
- package/skills/consumer-goods-sync-management-configure/examples/scenarios.md +294 -0
- package/skills/consumer-goods-sync-management-configure/references/act1-setup-sync.md +333 -0
- package/skills/consumer-goods-sync-management-configure/references/act2-assign-users.md +324 -0
- package/skills/consumer-goods-sync-management-configure/references/act3-plan-verify.md +113 -0
- package/skills/consumer-goods-sync-management-configure/references/readiness-and-enablement.md +164 -0
- package/skills/consumer-goods-sync-management-configure/references/sync-management-app-install-backbone.md +159 -0
- package/skills/consumer-goods-sync-management-configure/references/transports-and-namespace.md +220 -0
- package/skills/consumer-goods-sync-management-configure/references/verify-and-smoke.md +175 -0
- package/skills/dx-devops-project-manage/SKILL.md +1 -1
- package/skills/dx-org-analyze/SKILL.md +0 -1
- package/skills/dx-org-analyze/scripts/collect_org_data.py +2 -2
- package/skills/dx-org-analyze/scripts/compute_diff.py +2 -4
- package/skills/dx-org-analyze/scripts/introspect_org.py +4 -40
- package/skills/dx-org-manage/SKILL.md +6 -50
- package/skills/dx-org-manage/examples/README.md +10 -16
- package/skills/dx-org-manage/references/scratch-org-create.md +1 -1
- package/skills/dx-org-manage/references/scratch-org-operations.md +1 -1
- package/skills/dx-org-shape-manage/SKILL.md +4 -3
- package/skills/education-cloud-domain-configure/references/gotchas-extended.md +1 -0
- package/skills/experience-accessibility-validate/SKILL.md +8 -5
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-1-1-non-text-content.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-i-lists.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-ii-tables.md +20 -85
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-iii-form-labels.md +4 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-iv-regions.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-v-groups.md +2 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-5-identify-input.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-4-3-contrast.md +4 -14
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-1-1-keyboard.md +9 -5
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-4-4-link-purpose.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-4-6-headings-labels.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-1-pointer-gestures.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-2-pointer-cancellation.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-3-label-in-name.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-7-dragging-movement.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-2-1-on-focus.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-2-2-on-input.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-1-error-identification.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-2-labels-instructions.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-3-error-suggestion.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-i-name.md +4 -5
- package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-ii-role.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-iii-value.md +0 -4
- package/skills/experience-cms-content-generate/SKILL.md +1 -1
- package/skills/experience-cms-content-render/SKILL.md +3 -3
- package/skills/experience-cms-content-render/assets/angular/MediaRenderer.component.ts +35 -7
- package/skills/experience-cms-content-render/assets/angular/cms-item.service.ts +13 -4
- package/skills/experience-cms-content-render/assets/react/MediaRenderer.tsx +30 -8
- package/skills/experience-cms-content-render/assets/react/useCmsItem.ts +14 -4
- package/skills/experience-cms-content-render/assets/shared/cmsCore.types.ts +11 -1
- package/skills/experience-cms-content-render/assets/shared/externalRefs.ts +1 -1
- package/skills/experience-cms-content-render/assets/shared/mediaLabels.ts +62 -0
- package/skills/experience-cms-content-render/references/init-scaffold.md +13 -6
- package/skills/experience-content-media-stock-image-search/SKILL.md +0 -1
- package/skills/experience-lwc-accessibility-jest-run/SKILL.md +104 -25
- package/skills/experience-lwc-accessibility-jest-run/assets/jest.config.js +4 -0
- package/skills/experience-lwc-accessibility-jest-run/assets/sa11y-jest-setup.js +5 -0
- package/skills/experience-lwc-design-generate/SKILL.md +1 -1
- package/skills/experience-lwc-legacy-migrate/SKILL.md +212 -0
- package/skills/experience-lwc-legacy-migrate/assets/lo20-host-page-template.html +192 -0
- package/skills/experience-lwc-legacy-migrate/references/aura-to-lwc-completeness-checklist.md +188 -0
- package/skills/experience-lwc-legacy-migrate/references/lightning-out-2-system-reference.md +495 -0
- package/skills/experience-lwc-legacy-migrate/references/lightning-out-beta-to-2-migration.md +824 -0
- package/skills/experience-lwc-legacy-migrate/scripts/convert-lo-names.py +94 -0
- package/skills/experience-lwc-legacy-migrate/scripts/validate-lo20-page.py +133 -0
- package/skills/experience-ui-bundle-app-coordinate/SKILL.md +5 -5
- package/skills/experience-ui-bundle-features-generate/SKILL.md +65 -36
- package/skills/experience-ui-bundle-features-generate/references/angular/features.md +74 -0
- package/skills/experience-ui-bundle-features-generate/references/react/features.md +59 -0
- package/skills/experience-ui-bundle-features-generate/scripts/detect-framework.sh +73 -0
- package/skills/experience-ui-bundle-frontend-generate/SKILL.md +2 -2
- package/skills/experience-ui-bundle-metadata-generate/SKILL.md +26 -14
- package/skills/experience-ui-bundle-metadata-generate/references/angular-metadata-generate.md +37 -0
- package/skills/experience-ui-bundle-metadata-generate/references/react-metadata-generate.md +32 -0
- package/skills/experience-ui-bundle-metadata-generate/scripts/detect-framework.sh +73 -0
- package/skills/experience-ui-bundle-metadata-generate/scripts/verify-bundle-location.sh +30 -8
- package/skills/experience-ui-bundle-project-generate/SKILL.md +1 -1
- package/skills/field-service-data-capture-migrate/SKILL.md +391 -0
- package/skills/field-service-data-capture-migrate/assets/sample-legacy-flow.flow-meta.xml +163 -0
- package/skills/field-service-data-capture-migrate/references/architecture-notes.md +40 -0
- package/skills/field-service-data-capture-migrate/references/component-mapping.md +278 -0
- package/skills/field-service-data-capture-migrate/references/converter-builder-contract.md +183 -0
- package/skills/field-service-data-capture-migrate/references/dc-platform-rules.md +130 -0
- package/skills/field-service-data-capture-migrate/references/fsm-dc-capability-catalog.md +215 -0
- package/skills/field-service-data-capture-migrate/references/known-deploy-errors.md +36 -0
- package/skills/field-service-data-capture-migrate/references/migration-checklist.md +121 -0
- package/skills/field-service-data-capture-migrate/references/transformer-rules.md +132 -0
- package/skills/field-service-data-capture-migrate/scripts/analyze_flow.py +277 -0
- package/skills/field-service-data-capture-migrate/scripts/convert_to_dc_spec.py +1311 -0
- package/skills/field-service-data-capture-migrate/scripts/cud_analysis.py +402 -0
- package/skills/field-service-data-capture-migrate/scripts/deploy_flow.sh +230 -0
- package/skills/field-service-data-capture-migrate/scripts/discover_subflow_tree.py +230 -0
- package/skills/field-service-data-capture-migrate/scripts/flow_input.py +186 -0
- package/skills/field-service-data-capture-migrate/scripts/flow_xml_utils.py +39 -0
- package/skills/field-service-data-capture-migrate/scripts/fsm_dc_catalog.py +413 -0
- package/skills/field-service-data-capture-migrate/scripts/generate_summary.py +199 -0
- package/skills/field-service-data-capture-migrate/scripts/json_to_flow_xml.py +146 -0
- package/skills/field-service-data-capture-migrate/scripts/manual_review_flags.py +42 -0
- package/skills/field-service-data-capture-migrate/scripts/retrieve_flow_rest.sh +155 -0
- package/skills/field-service-data-capture-migrate/scripts/subflow_names.py +49 -0
- package/skills/field-service-data-capture-migrate/scripts/transform_flow.py +1661 -0
- package/skills/field-service-data-capture-migrate/scripts/validate_flow.sh +147 -0
- package/skills/field-service-data-capture-migrate/scripts/vendor/build_flow.py +1258 -0
- package/skills/integration-connectivity-connected-app-configure/SKILL.md +5 -5
- package/skills/integration-connectivity-generate/SKILL.md +10 -10
- package/skills/integration-connectivity-generate/scripts/configure-named-credential.sh +2 -2
- package/skills/life-sciences-fieldsalesrep-coordinate/SKILL.md +1 -1
- package/skills/life-sciences-fieldsalesrep-coordinate/references/orchestration-flow.md +1 -1
- package/skills/life-sciences-kam-coordinate/references/stage-5-data-and-plan-templates-overview.md +14 -1
- package/skills/mobile-apps-create/SKILL.md +1 -1
- package/skills/{platform-agentsetup-categories-fetch → platform-agenticsetup-categories-get}/SKILL.md +7 -7
- package/skills/platform-apex-test-generate/SKILL.md +1 -1
- package/skills/platform-apex-test-run/SKILL.md +1 -1
- package/skills/platform-custom-field-generate/SKILL.md +1 -1
- package/skills/platform-custom-lightning-type-generate/SKILL.md +1 -1
- package/skills/platform-custom-metadata-type-generate/SKILL.md +1 -1
- package/skills/platform-custom-object-generate/SKILL.md +1 -1
- package/skills/platform-custom-report-type-generate/SKILL.md +1 -1
- package/skills/platform-custom-setting-generate/SKILL.md +1 -1
- package/skills/platform-data-and-tooling-api-context-get/SKILL.md +1 -1
- package/skills/platform-data-manage/SKILL.md +10 -10
- package/skills/platform-flexipage-generate/SKILL.md +1 -1
- package/skills/platform-lightning-app-coordinate/SKILL.md +1 -1
- package/skills/platform-metadata-api-context-get/SKILL.md +1 -1
- package/skills/platform-metadata-retrieve/SKILL.md +1 -1
- package/skills/platform-permission-set-generate/SKILL.md +1 -1
- package/skills/platform-report-generate/SKILL.md +1 -1
- package/skills/platform-salesforce-connect-adapter-generate/SKILL.md +4 -4
- package/skills/platform-sandbox-configure/SKILL.md +108 -133
- package/skills/platform-sandbox-configure/references/api-response-shapes.md +39 -0
- package/skills/platform-sandbox-configure/references/definition-file-approach.md +73 -0
- package/skills/platform-sharing-owd-configure/SKILL.md +1 -1
- package/skills/platform-sharing-rules-generate/SKILL.md +1 -1
- package/skills/platform-soql-query/SKILL.md +1 -1
- package/skills/platform-value-set-generate/SKILL.md +1 -1
- package/skills/platform-widget-generate/SKILL.md +26 -18
- package/skills/platform-widget-generate/examples/formulas.json +191 -0
- package/skills/platform-widget-generate/references/widget-formulas.md +123 -0
- package/skills/platform-widget-generate/references/widget-meta-directives.md +4 -4
- package/skills/sales-call-scoring-configure/SKILL.md +318 -0
- package/skills/sales-call-scoring-configure/assets/best-practice-competencies.json +67 -0
- package/skills/sales-call-scoring-configure/assets/ootb-competencies.json +58 -0
- package/skills/sales-call-scoring-configure/references/admin-communication.md +79 -0
- package/skills/sales-call-scoring-configure/references/competency-crud.md +130 -0
- package/skills/sales-call-scoring-configure/scripts/create-competency.sh +166 -0
- package/skills/sales-call-scoring-configure/scripts/create-custom-competency.sh +166 -0
- package/skills/sales-call-scoring-configure/scripts/edit-competency.sh +185 -0
- package/skills/sales-call-scoring-configure/scripts/edit-custom-competency.sh +190 -0
- package/skills/sales-call-scoring-configure/scripts/enable-call-scoring.sh +436 -0
- package/skills/sales-call-scoring-configure/scripts/get-competency.sh +72 -0
- package/skills/sales-call-scoring-configure/scripts/get-custom-competency.sh +78 -0
- package/skills/sales-call-scoring-configure/scripts/install-best-practice-competencies.sh +223 -0
- package/skills/sales-call-scoring-configure/scripts/install-ootb-competencies.sh +237 -0
- package/skills/sales-call-scoring-configure/scripts/list-competencies.sh +99 -0
- package/skills/sales-call-scoring-configure/scripts/shared/auth.sh +116 -0
- package/skills/sales-call-scoring-configure/scripts/shared/cap.sh +86 -0
- package/skills/sales-call-scoring-configure/scripts/shared/soap.sh +267 -0
- package/skills/sales-call-scoring-configure/scripts/shared/soql.sh +25 -0
- package/skills/sales-call-scoring-configure/scripts/toggle-competency.sh +112 -0
- package/skills/sales-call-scoring-configure/scripts/toggle-custom-competency.sh +125 -0
- package/skills/sales-call-scoring-configure/scripts/verify-ootb-competencies.sh +116 -0
- package/skills/service-agentforce-human-escalation-configure/SKILL.md +4 -0
- package/skills/service-agentforce-human-escalation-configure/scripts/tests/_bootstrap.py +26 -6
- package/skills/service-agentforce-human-escalation-configure/scripts/tests/test_escalation_contracts.py +5 -4
- package/skills/service-concierge-portal-generate/references/portal-deploy-runbook.md +1 -0
- package/skills/service-de-channel-activate/SKILL.md +6 -5
- package/skills/service-de-channel-create/SKILL.md +3 -3
- package/skills/service-de-channel-routing-configure/SKILL.md +3 -3
- package/skills/service-de-channel-settings-configure/SKILL.md +195 -0
- package/skills/service-de-channel-settings-configure/references/channel-settings-facets.md +152 -0
- package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/gotchas.md +3 -3
- package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/language-keywords.md +4 -4
- package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/worked-examples.md +14 -14
- package/skills/service-de-headless-channel-configure/SKILL.md +6 -6
- package/skills/service-de-headless-channel-configure/references/worked-examples.md +1 -1
- package/skills/service-de-waba-integrate/SKILL.md +2 -1
- package/skills/service-digital-engagement-deployment-configure/SKILL.md +2 -0
- package/skills/service-digital-engagement-deployment-configure/scripts/check-api-version.sh +29 -0
- package/skills/service-email-to-case-configure/SKILL.md +1 -1
- package/skills/service-helpagent-coordinate/SKILL.md +3 -2
- package/skills/service-helpagent-coordinate/references/channel-voice.md +15 -4
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +49 -31
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/examples/output-templates.md +71 -6
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs +26 -4
- package/skills/service-itsm-agentic-setup-cmdb-access-assign/SKILL.md +35 -10
- package/skills/service-itsm-agentic-setup-cmdb-access-assign/references/mcp-invocation.md +25 -5
- package/skills/service-itsm-agentic-setup-cmdb-bundle-deploy/SKILL.md +1 -1
- package/skills/service-itsm-agentic-setup-cmdb-configure/SKILL.md +5 -5
- package/skills/service-itsm-agentic-setup-cmdb-configure/references/mcp-invocation.md +1 -1
- package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +2 -2
- package/skills/service-itsm-agentic-setup-cmdb-coordinate/examples/output-templates.md +1 -1
- package/skills/service-itsm-agentic-setup-cmdb-discovery-configure/SKILL.md +25 -15
- package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +8 -5
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/report-format.md +4 -2
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/workflow-detail.md +1 -1
- package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/render-report.mjs +29 -16
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +8 -5
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/report-format.md +4 -2
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/workflow-detail.md +1 -1
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/render-report.mjs +29 -16
- package/skills/service-itsm-agentic-setup-incident-management/SKILL.md +138 -68
- package/skills/service-itsm-agentic-setup-incident-management/examples/output-templates.md +31 -15
- package/skills/service-itsm-agentic-setup-incident-management/references/incident-persona-psg.md +156 -0
- package/skills/service-itsm-agentic-setup-incident-management/references/incident-preferences.md +148 -0
- package/skills/service-itsm-agentic-setup-incident-management/references/major-incident-management.md +162 -0
- package/skills/service-itsm-agentic-setup-incident-management/references/service-mgmt-privilege.md +149 -0
- package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +103 -89
- package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/attach-milestone.json +2 -2
- package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/predefined-incident-policy.json +21 -39
- package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/milestone-patterns.md +3 -3
- package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/output-templates.md +18 -1
- package/skills/service-itsm-agentic-setup-incident-sla-configure/references/mcp-invocation.md +63 -37
- package/skills/service-omni-attribute-routing-configure/SKILL.md +53 -0
- package/skills/service-omni-attribute-routing-configure/references/api-notes.md +7 -0
- package/skills/service-omni-attribute-routing-configure/scripts/configure-and-report.sh +224 -0
- package/skills/service-omni-attribute-routing-configure/scripts/tests/test_attribute_routing_contracts.py +137 -0
- package/skills/service-omni-channel-inventory-analyze/SKILL.md +96 -0
- package/skills/service-omni-channel-inventory-analyze/references/api-notes.md +52 -0
- package/skills/service-omni-channel-inventory-analyze/scripts/analyze.sh +185 -0
- package/skills/service-omni-channel-inventory-analyze/scripts/tests/_bootstrap.py +84 -0
- package/skills/service-omni-channel-inventory-analyze/scripts/tests/test_inventory_analyze_contracts.py +141 -0
- package/skills/service-omni-channel-limits-analyze/SKILL.md +70 -0
- package/skills/service-omni-channel-limits-analyze/references/api-notes.md +22 -0
- package/skills/service-omni-channel-limits-analyze/scripts/analyze.sh +159 -0
- package/skills/service-omni-channel-limits-analyze/scripts/tests/_bootstrap.py +87 -0
- package/skills/service-omni-channel-limits-analyze/scripts/tests/test_limits_analyze_contracts.py +99 -0
- package/skills/service-omni-channel-setup-coordinate/SKILL.md +12 -20
- package/skills/service-omni-channel-setup-coordinate/scripts/integration-driver.sh +55 -5
- package/skills/service-omni-channel-setup-coordinate/scripts/tests/test_omni_contracts.py +38 -0
- package/skills/service-omni-command-center-analyze/SKILL.md +2 -2
- package/skills/service-omni-command-center-analyze/scripts/analyze.sh +3 -3
- package/skills/dx-org-manage/examples/snapshots/error_output.json +0 -9
- package/skills/dx-org-manage/examples/snapshots/success_output.json +0 -15
- package/skills/dx-org-manage/references/cli_flags.md +0 -67
- package/skills/dx-org-manage/references/creating-snapshot.md +0 -103
- package/skills/dx-org-manage/references/snapshot_usage.md +0 -74
- package/skills/experience-accessibility-validate/scripts/contrast-ratio.py +0 -153
- package/skills/experience-lwc-accessibility-jest-run/references/running-sa11y-jest-tests.md +0 -205
- package/skills/experience-ui-bundle-features-generate/scripts/verify-react-bundle.sh +0 -14
- /package/skills/experience-ui-bundle-features-generate/references/{conflict-resolution-schema.json → common/conflict-resolution-schema.json} +0 -0
- /package/skills/{platform-agentsetup-categories-fetch → platform-agenticsetup-categories-get}/references/api-response-schema.md +0 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Deterministic Lightning Out Beta -> LO 2.0 name/URL transforms.
|
|
3
|
+
|
|
4
|
+
The Beta -> LO 2.0 migration includes a few *purely mechanical* string
|
|
5
|
+
conversions that must be applied identically every time (Workflow B, Step B3):
|
|
6
|
+
|
|
7
|
+
* Aura component id ``c:myComponent`` -> LWC custom-element tag ``c-my-component``
|
|
8
|
+
* camelCase attribute names -> kebab-case HTML attribute names
|
|
9
|
+
* the org My Domain -> the versioned LO 2.0 library ``<script>`` URL
|
|
10
|
+
|
|
11
|
+
This script performs those conversions so the workflow never has to hand-derive
|
|
12
|
+
them. It does NOT make any judgement calls (target DOM location, whether an LO
|
|
13
|
+
2.0 App id is needed, placeholder values) -- those stay in the skill body.
|
|
14
|
+
|
|
15
|
+
Usage:
|
|
16
|
+
python3 scripts/convert-lo-names.py \
|
|
17
|
+
--component c:myComponent \
|
|
18
|
+
--attributes recordId,ownerId,showRevenue \
|
|
19
|
+
--my-domain https://acme.my.salesforce.com
|
|
20
|
+
|
|
21
|
+
Any of the flags may be omitted; only the requested conversions are printed.
|
|
22
|
+
Exit code is 0 on success, 2 on a malformed argument.
|
|
23
|
+
"""
|
|
24
|
+
import argparse
|
|
25
|
+
import re
|
|
26
|
+
import sys
|
|
27
|
+
|
|
28
|
+
LO2_LIBRARY_PATH = "/lightning/lightning.out.latest/index.iife.prod.js"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def camel_to_kebab(name: str) -> str:
|
|
32
|
+
"""myComponent / MyComponent / my_component -> my-component."""
|
|
33
|
+
name = name.strip().replace("_", "-")
|
|
34
|
+
# split camelCase / PascalCase boundaries
|
|
35
|
+
name = re.sub(r"([a-z0-9])([A-Z])", r"\1-\2", name)
|
|
36
|
+
name = re.sub(r"([A-Z]+)([A-Z][a-z])", r"\1-\2", name)
|
|
37
|
+
return name.lower()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def component_tag(aura_id: str) -> str:
|
|
41
|
+
"""c:myComponent -> c-my-component (namespace preserved)."""
|
|
42
|
+
aura_id = aura_id.strip()
|
|
43
|
+
if ":" in aura_id:
|
|
44
|
+
ns, name = aura_id.split(":", 1)
|
|
45
|
+
else:
|
|
46
|
+
ns, name = "c", aura_id
|
|
47
|
+
return f"{ns.strip().lower()}-{camel_to_kebab(name)}"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def library_url(my_domain: str) -> str:
|
|
51
|
+
"""Normalize a My Domain to the versioned LO 2.0 library URL."""
|
|
52
|
+
d = my_domain.strip().rstrip("/")
|
|
53
|
+
if not d.startswith("http"):
|
|
54
|
+
d = "https://" + d
|
|
55
|
+
# Beta hosts on *.lightning.force.com; LO 2.0 must load from *.my.salesforce.com
|
|
56
|
+
d = d.replace(".lightning.force.com", ".my.salesforce.com")
|
|
57
|
+
# strip any path the caller pasted, keep scheme://host
|
|
58
|
+
m = re.match(r"(https?://[^/]+)", d)
|
|
59
|
+
host = m.group(1) if m else d
|
|
60
|
+
return f"{host}{LO2_LIBRARY_PATH}"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def main(argv=None) -> int:
|
|
64
|
+
p = argparse.ArgumentParser(description=__doc__,
|
|
65
|
+
formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
66
|
+
p.add_argument("--component", help="Beta component id, e.g. c:myComponent")
|
|
67
|
+
p.add_argument("--attributes",
|
|
68
|
+
help="comma/space separated camelCase attribute names")
|
|
69
|
+
p.add_argument("--my-domain",
|
|
70
|
+
help="org My Domain or Beta host URL")
|
|
71
|
+
args = p.parse_args(argv)
|
|
72
|
+
|
|
73
|
+
if not (args.component or args.attributes or args.my_domain):
|
|
74
|
+
p.print_help()
|
|
75
|
+
return 2
|
|
76
|
+
|
|
77
|
+
if args.component:
|
|
78
|
+
print(f"component-tag: <{component_tag(args.component)}>")
|
|
79
|
+
|
|
80
|
+
if args.attributes:
|
|
81
|
+
raw = [a for a in re.split(r"[,\s]+", args.attributes) if a]
|
|
82
|
+
pairs = [(a, camel_to_kebab(a)) for a in raw]
|
|
83
|
+
print("attributes:")
|
|
84
|
+
for src, dst in pairs:
|
|
85
|
+
print(f" {src} -> {dst}")
|
|
86
|
+
|
|
87
|
+
if args.my_domain:
|
|
88
|
+
print(f"library-url: {library_url(args.my_domain)} (add the `async` attribute)")
|
|
89
|
+
|
|
90
|
+
return 0
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
if __name__ == "__main__":
|
|
94
|
+
sys.exit(main())
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Mechanically validate a migrated Lightning Out 2.0 host page.
|
|
3
|
+
|
|
4
|
+
The six non-negotiable LO 2.0 rules (Workflow B, Step B4) plus the core
|
|
5
|
+
library/component checklist items are all *deterministic code-structure*
|
|
6
|
+
checks. This script runs them against a migrated HTML host page so the
|
|
7
|
+
workflow gates on a repeatable pass/fail instead of prose interpretation.
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
python3 scripts/validate-lo20-page.py <path-to-migrated.html>
|
|
11
|
+
|
|
12
|
+
Prints one PASS/FAIL line per rule. Exits 0 only when every rule passes;
|
|
13
|
+
exits 1 if any rule fails, 2 on a usage/IO error.
|
|
14
|
+
"""
|
|
15
|
+
import re
|
|
16
|
+
import sys
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def check(src: str):
|
|
20
|
+
"""Return a list of (ok: bool, label: str, detail: str)."""
|
|
21
|
+
results = []
|
|
22
|
+
|
|
23
|
+
def add(ok, label, detail=""):
|
|
24
|
+
results.append((ok, label, detail))
|
|
25
|
+
|
|
26
|
+
# --- Library / Beta removal -------------------------------------------
|
|
27
|
+
# Locate the versioned library path, then scan back to the opening
|
|
28
|
+
# <script to check for `async`. We do NOT isolate the tag with [^>]*
|
|
29
|
+
# because placeholder URLs like https://<DOMAIN>.my.salesforce.com
|
|
30
|
+
# legitimately contain a '>' inside the attribute value.
|
|
31
|
+
lib_path = "lightning.out.latest/index.iife.prod.js"
|
|
32
|
+
idx = src.find(lib_path)
|
|
33
|
+
has_lo2_lib = idx != -1
|
|
34
|
+
lib_async = False
|
|
35
|
+
if has_lo2_lib:
|
|
36
|
+
start = src.rfind("<script", 0, idx)
|
|
37
|
+
if start != -1:
|
|
38
|
+
lib_async = bool(re.search(r"\basync\b", src[start:idx]))
|
|
39
|
+
add(has_lo2_lib and lib_async, "LO 2.0 library script tag",
|
|
40
|
+
"must load .../lightning.out.latest/index.iife.prod.js with `async`")
|
|
41
|
+
|
|
42
|
+
beta_lib = bool(re.search(r"lightning\.force\.com/[^\"']*lightning\.out\.js", src))
|
|
43
|
+
beta_calls = bool(re.search(r"\$Lightning\.(use|createComponent)", src))
|
|
44
|
+
add(not beta_lib and not beta_calls, "No Lightning Out Beta remnants",
|
|
45
|
+
"no lightning.out.js / $Lightning.use / $Lightning.createComponent")
|
|
46
|
+
|
|
47
|
+
# --- Rule 1: customElements.whenDefined must use a literal string ------
|
|
48
|
+
wd = re.findall(r"customElements\.whenDefined\(\s*([^)]*?)\s*\)", src)
|
|
49
|
+
if not wd:
|
|
50
|
+
add(False, "Rule 1: whenDefined literal string",
|
|
51
|
+
"no customElements.whenDefined(...) call found")
|
|
52
|
+
else:
|
|
53
|
+
# Require the ENTIRE trimmed argument to be a single quoted string
|
|
54
|
+
# literal. A prefix-only check (starts with a quote) would let
|
|
55
|
+
# expressions like `'c-' + componentTag` slip through.
|
|
56
|
+
all_literal = all(
|
|
57
|
+
re.fullmatch(r"""(['"]).*?\1""", arg.strip()) for arg in wd)
|
|
58
|
+
add(all_literal, "Rule 1: whenDefined literal string",
|
|
59
|
+
"argument must be a quoted string, not the `components` variable")
|
|
60
|
+
|
|
61
|
+
# --- Rule 2: mountLo20 declared with two parameters -------------------
|
|
62
|
+
decl = re.search(r"function\s+mountLo20\s*\(([^)]*)\)", src)
|
|
63
|
+
if not decl:
|
|
64
|
+
add(False, "Rule 2: mountLo20(frontdoorUrl, orgUrl)",
|
|
65
|
+
"no `function mountLo20(...)` declaration found")
|
|
66
|
+
else:
|
|
67
|
+
params = [p for p in decl.group(1).split(",") if p.strip()]
|
|
68
|
+
add(len(params) == 2, "Rule 2: mountLo20(frontdoorUrl, orgUrl)",
|
|
69
|
+
f"declaration has {len(params)} parameter(s), expected 2")
|
|
70
|
+
|
|
71
|
+
# --- Rule 3: clearCachedResult present (called before mounting) -------
|
|
72
|
+
add(bool(re.search(r"clearCachedResult\s*\(", src)),
|
|
73
|
+
"Rule 3: clearCachedResult() before mount",
|
|
74
|
+
"clearCachedResult() must run before every mountLo20() call")
|
|
75
|
+
|
|
76
|
+
# --- Rule 4: every mountLo20 call passes two arguments ----------------
|
|
77
|
+
calls = re.findall(r"(?<!function\s)\bmountLo20\s*\(([^)]*)\)", src)
|
|
78
|
+
# Count args for EVERY call site (the declaration is excluded by the
|
|
79
|
+
# lookbehind). Do NOT skip empty argument lists: a zero-arg
|
|
80
|
+
# `mountLo20()` has an arg count of 0, which is != 2 and must fail.
|
|
81
|
+
bad_calls = [c for c in calls
|
|
82
|
+
if len([a for a in c.split(",") if a.strip()]) != 2]
|
|
83
|
+
add(len(bad_calls) == 0, "Rule 4: mountLo20 calls pass two args",
|
|
84
|
+
f"{len(bad_calls)} call(s) do not pass exactly two arguments")
|
|
85
|
+
|
|
86
|
+
# --- Rule 5: boot() wrapper defined and invoked -----------------------
|
|
87
|
+
boot_def = bool(re.search(r"function\s+boot\s*\(", src))
|
|
88
|
+
boot_call = bool(re.search(r"(?<!function\s)\bboot\s*\(\s*\)", src))
|
|
89
|
+
add(boot_def and boot_call, "Rule 5: boot() wrapper",
|
|
90
|
+
"define function boot() and call boot() once at the end")
|
|
91
|
+
|
|
92
|
+
# --- Rule 6: component tag has no inline display style ----------------
|
|
93
|
+
comp_tags = re.findall(r"<c-[a-z0-9-]+[^>]*>", src)
|
|
94
|
+
add(len(comp_tags) > 0, "Component tag present",
|
|
95
|
+
"expected a <c-...> custom element in the HTML")
|
|
96
|
+
inline_hidden = any(re.search(r"style\s*=\s*['\"][^'\"]*display\s*:\s*none",
|
|
97
|
+
t) for t in comp_tags)
|
|
98
|
+
add(not inline_hidden, "Rule 6: no inline display:none on component tag",
|
|
99
|
+
"control visibility via the loading indicator, not the component tag")
|
|
100
|
+
|
|
101
|
+
return results
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def main(argv=None) -> int:
|
|
105
|
+
argv = argv if argv is not None else sys.argv[1:]
|
|
106
|
+
if len(argv) != 1:
|
|
107
|
+
print("usage: validate-lo20-page.py <path-to-migrated.html>",
|
|
108
|
+
file=sys.stderr)
|
|
109
|
+
return 2
|
|
110
|
+
try:
|
|
111
|
+
with open(argv[0], "r", encoding="utf-8") as fh:
|
|
112
|
+
src = fh.read()
|
|
113
|
+
except OSError as e:
|
|
114
|
+
print(f"error: cannot read {argv[0]}: {e}", file=sys.stderr)
|
|
115
|
+
return 2
|
|
116
|
+
|
|
117
|
+
results = check(src)
|
|
118
|
+
failed = 0
|
|
119
|
+
for ok, label, detail in results:
|
|
120
|
+
mark = "PASS" if ok else "FAIL"
|
|
121
|
+
line = f"[{mark}] {label}"
|
|
122
|
+
if not ok and detail:
|
|
123
|
+
line += f" -- {detail}"
|
|
124
|
+
print(line)
|
|
125
|
+
if not ok:
|
|
126
|
+
failed += 1
|
|
127
|
+
|
|
128
|
+
print(f"\n{len(results) - failed}/{len(results)} checks passed")
|
|
129
|
+
return 0 if failed == 0 else 1
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
if __name__ == "__main__":
|
|
133
|
+
sys.exit(main())
|
|
@@ -163,16 +163,16 @@ Search project code (src/) for existing implementations
|
|
|
163
163
|
v
|
|
164
164
|
Install dependencies (npm install)
|
|
165
165
|
v
|
|
166
|
-
Search, describe, and
|
|
166
|
+
Search, describe, and adopt features (auth, shadcn, search, navigation, GraphQL)
|
|
167
167
|
v
|
|
168
168
|
Resolve conflicts (two-pass: --on-conflict error, then --conflict-resolution)
|
|
169
169
|
v
|
|
170
170
|
Integrate __examples__ files into target files (verify build succeeds), then delete them
|
|
171
171
|
```
|
|
172
172
|
|
|
173
|
-
|
|
173
|
+
Loads the feature skill to install pre-built packages, or adopt ones the template already shipped — never build your own version of a catalog feature. See "Prompt Classification Keywords" for triggers and negative-phrasing handling.
|
|
174
174
|
|
|
175
|
-
|
|
175
|
+
Skip only for a minimal "hello world" with no interactive features; pre-shipped features still require this phase.
|
|
176
176
|
|
|
177
177
|
### Phase 2.5: Custom Objects (Required if the prompt requires a new custom Salesforce object the org doesn't have)
|
|
178
178
|
|
|
@@ -378,14 +378,14 @@ Execute each phase sequentially following the standard pattern in `references/ph
|
|
|
378
378
|
---
|
|
379
379
|
|
|
380
380
|
**Phase 0 -- Template Offer & Bootstrap**
|
|
381
|
-
- Load `experience-ui-bundle-project-generate`, offer templates. If chosen: skip Phase 1, continue at Phase
|
|
381
|
+
- Load `experience-ui-bundle-project-generate`, offer templates. If chosen: skip Phase 1, continue at Phase 2. If declined: run `scripts/check-sfdx-project.sh`, create project if missing.
|
|
382
382
|
|
|
383
383
|
**Phase 1 -- Scaffolding** (skip if template used in Phase 0)
|
|
384
384
|
- **Precondition**: `scripts/check-sfdx-project.sh` passes
|
|
385
385
|
- Load `experience-ui-bundle-metadata-generate`. Determine hosting target FIRST. Run `sf template generate ui-bundle --template reactbasic`, configure meta XML with `<target>`.
|
|
386
386
|
- **Post-verification**: `scripts/check-phase-1-complete.sh` passes
|
|
387
387
|
|
|
388
|
-
**Phase 2 -- Features** (
|
|
388
|
+
**Phase 2 -- Features** (run on any feature keyword, even if pre-installed — see "Prompt Classification Keywords")
|
|
389
389
|
- Load `experience-ui-bundle-features-generate`. Install features, integrate examples. Verify with `npm run build`.
|
|
390
390
|
|
|
391
391
|
**Phase 2.5 -- Custom Objects** (skip if org has all needed objects)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: experience-ui-bundle-features-generate
|
|
3
|
-
description: "MUST activate when the project contains a uiBundles/*/src/ directory and the user wants to add a pre-built feature — such as authentication (login, logout, protected routes, session management) or search (global search across pages and content) — instead of building it from scratch. Always run list first to see the current feature catalog, since it can include more than authentication and search. Always use this skill for installing pre-built features rather than hand-building them. DO NOT TRIGGER for Agentforce conversational client or file-upload features — use experience-ui-bundle-agentforce-client-generate and experience-ui-bundle-file-upload-generate respectively."
|
|
3
|
+
description: "MUST activate when the project contains a uiBundles/*/src/ directory (React or Angular) and the user wants to add a pre-built feature — such as authentication (login, logout, protected routes, session management) or search (global search across pages and content) — instead of building it from scratch. Always run list first to see the current feature catalog, since it can include more than authentication and search. Always use this skill for installing pre-built features rather than hand-building them. DO NOT TRIGGER for Agentforce conversational client or file-upload features — use experience-ui-bundle-agentforce-client-generate and experience-ui-bundle-file-upload-generate respectively."
|
|
4
4
|
metadata:
|
|
5
|
-
version: "1.
|
|
5
|
+
version: "1.2"
|
|
6
6
|
domains: ["Experience"]
|
|
7
7
|
relatedSkills: ["experience-ui-bundle-agentforce-client-generate", "experience-ui-bundle-file-upload-generate"]
|
|
8
8
|
cliTools:
|
|
@@ -19,41 +19,79 @@ metadata:
|
|
|
19
19
|
|
|
20
20
|
# UI Bundle Features
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Install pre-built, tested feature packages into a Salesforce UI bundle with the
|
|
23
|
+
`@salesforce/ui-bundle-features` CLI instead of hand-building them. This file is the
|
|
24
|
+
**framework-neutral workflow spine**; the framework-specific detail — example file
|
|
25
|
+
extensions, the files features rewrite, how a feature's entry component is mounted, and the
|
|
26
|
+
build command — lives in a per-framework reference under `<SKILL_DIR>/references/<framework>/`.
|
|
23
27
|
|
|
24
|
-
Always check for an existing feature before building something from scratch. The
|
|
28
|
+
Always check for an existing feature before building something from scratch. The CLI is
|
|
29
|
+
framework-agnostic: it installs the framework-appropriate variant of each feature into the
|
|
30
|
+
detected bundle. Authentication and search are the most commonly used today; run
|
|
31
|
+
`list --verbose` for the full current catalog, since it can grow over time.
|
|
25
32
|
|
|
26
33
|
> **Ownership note:** Agentforce AI conversation clients and file-upload are owned by separate skills (`experience-ui-bundle-agentforce-client-generate`, `experience-ui-bundle-file-upload-generate`). If the catalog also lists an Agentforce or file-upload entry, do not install it from both places — confirm with the user which delivery path they want, and never install the same capability twice in one bundle.
|
|
27
34
|
|
|
28
35
|
> **Package name:** `@salesforce/ui-bundle-features` is the canonical package name. Some older templates/samples still reference the deprecated `@salesforce/ui-bundle-features-experimental` name — never use the `-experimental` suffix. If a command fails to resolve, confirm the published version with `npm view @salesforce/ui-bundle-features version` before assuming the package name is wrong.
|
|
29
36
|
|
|
30
|
-
|
|
37
|
+
## Step 0: Determine the framework
|
|
31
38
|
|
|
32
|
-
|
|
39
|
+
`<SKILL_DIR>` = the absolute path to **this skill's own directory** (the folder holding this
|
|
40
|
+
`SKILL.md`); resolve it from the skill path in context.
|
|
33
41
|
|
|
34
|
-
|
|
42
|
+
The framework is normally already decided by the calling context — passed down by the
|
|
43
|
+
coordinator skill that invoked this one, or stated in the user's request. Use that.
|
|
44
|
+
|
|
45
|
+
The frameworks this skill supports are exactly the reference folders under
|
|
46
|
+
`<SKILL_DIR>/references/`, each containing a `features.md` (so `react` →
|
|
47
|
+
`<SKILL_DIR>/references/react/features.md`). This is the single source of truth — adding a
|
|
48
|
+
framework means adding a reference folder, nothing here changes.
|
|
49
|
+
|
|
50
|
+
- **If the framework is known** — open `<SKILL_DIR>/references/<framework>/features.md` and
|
|
51
|
+
keep it alongside this spine. It supplies the example extensions, the integration targets,
|
|
52
|
+
the mount example, and the build command.
|
|
53
|
+
- **If it is unknown** (a standalone run where nobody said which) — run the deterministic
|
|
54
|
+
detector on the UI bundle root before asking anyone:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
bash "<SKILL_DIR>/scripts/detect-framework.sh" "<path-to-uiBundles/<name>/ dir>"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Branch on the exit code (do not parse prose):
|
|
61
|
+
- `react` or `angular` (exit 0) → use that framework. **Do not ask the user** — detection is
|
|
62
|
+
deterministic. Open `<SKILL_DIR>/references/<framework>/features.md`.
|
|
63
|
+
- `ambiguous` (exit 2) → both frameworks present. List `<SKILL_DIR>/references/` and ask the
|
|
64
|
+
user which bundle to install into. If they name a framework with no matching reference
|
|
65
|
+
folder, it is not supported here — stop.
|
|
66
|
+
- `unknown` (exit 3) → **no supported framework detected. Terminate.** Report that neither
|
|
67
|
+
React nor Angular signals were found in the bundle, so features cannot be installed, and
|
|
68
|
+
stop. Do not guess.
|
|
69
|
+
|
|
70
|
+
Throughout the steps below, `<framework>` means the folder chosen here.
|
|
71
|
+
|
|
72
|
+
## Workflow
|
|
35
73
|
|
|
36
74
|
1. **Search project code first** — check `src/` for existing implementations before installing anything. Scope searches to `src/` to avoid matching `node_modules/` or `dist/`.
|
|
37
75
|
|
|
38
76
|
2. **Search available features** — use `npx @salesforce/ui-bundle-features list` with `--search <query>` to filter by keyword. Use `--verbose` for full descriptions.
|
|
39
77
|
|
|
40
|
-
3. **Describe a feature — MANDATORY before wiring.** Run `npx @salesforce/ui-bundle-features describe <feature>` and read the feature's README via `npm view <package> readme` (using the `Package:` name from that output) before wiring it. The README is the contract: it tells you how the feature is meant to be wired — including any drop-in entry component and the file each integration example belongs in. Cross-check against the copied-in source under `describe`'s `Copy Operations` destination — that source (and its JSDoc) is the version-matched truth for what's actually installed. Do not wire from assumptions about file names or component APIs. Skipping this is the most common reason a feature installs successfully but never actually runs.
|
|
78
|
+
3. **Describe a feature — MANDATORY before wiring.** Run `npx @salesforce/ui-bundle-features describe <feature>` and read the feature's README via `npm view <package> readme` (using the `Package:` name from that output) before wiring it. The README is the contract: it tells you how the feature is meant to be wired — including any drop-in entry component and the file each integration example belongs in. Cross-check against the copied-in source under `describe`'s `Copy Operations` destination — that source (and its JSDoc/comments) is the version-matched truth for what's actually installed, in the detected framework's file types. Do not wire from assumptions about file names or component APIs. Skipping this is the most common reason a feature installs successfully but never actually runs.
|
|
41
79
|
|
|
42
80
|
4. **Install** — use `npx @salesforce/ui-bundle-features install <feature> --ui-bundle-dir <name>`. Key options:
|
|
43
81
|
- `--dry-run` to preview changes
|
|
44
82
|
- `--yes` for non-interactive mode (skips conflicts)
|
|
45
83
|
- `--on-conflict error` to detect conflicts, then `--conflict-resolution <file>` to resolve them
|
|
46
84
|
|
|
47
|
-
Install features **before** doing custom frontend/layout work in this bundle — features may rewrite
|
|
85
|
+
Install features **before** doing custom frontend/layout work in this bundle — features may rewrite the app layout and routing files (see the framework reference for their names), and installing after hand-built layout changes risks collisions.
|
|
48
86
|
|
|
49
87
|
If no matching feature is found, ask the user before building a custom implementation — a relevant feature may exist under a different name.
|
|
50
88
|
|
|
51
|
-
|
|
89
|
+
## Conflict Handling
|
|
52
90
|
|
|
53
91
|
In non-interactive environments, use the two-pass approach:
|
|
54
92
|
|
|
55
93
|
1. Run install with `--on-conflict error` to detect conflicts without applying them.
|
|
56
|
-
2. Before writing the resolution file, read `references/conflict-resolution-schema.json` for the allowed keys and enum values.
|
|
94
|
+
2. Before writing the resolution file, read `references/common/conflict-resolution-schema.json` for the allowed keys and enum values.
|
|
57
95
|
3. Write a resolution file at `<ui-bundle-dir>/conflict-resolution.json` (path is relative to the UI bundle directory being installed into, not the repo root). Key it by the exact paths the CLI printed as conflicts in pass 1, verbatim:
|
|
58
96
|
```json
|
|
59
97
|
{
|
|
@@ -61,59 +99,52 @@ In non-interactive environments, use the two-pass approach:
|
|
|
61
99
|
"src/routes.tsx": "skip"
|
|
62
100
|
}
|
|
63
101
|
```
|
|
64
|
-
Any conflicting path *not* listed
|
|
102
|
+
(The conflict paths are whatever the CLI printed for the detected framework — the keys above are illustrative.) Any conflicting path *not* listed defaults to `skip` — the CLI will not overwrite a file you didn't explicitly mark `overwrite`.
|
|
65
103
|
4. Re-run install with `--conflict-resolution <path-to-that-file>`.
|
|
66
104
|
|
|
67
|
-
|
|
105
|
+
## Post-install: Integrating Example Files
|
|
68
106
|
|
|
69
|
-
Features may include example files under an `__examples__/` directory (plural) showing integration patterns. These are often full, working pages with concrete names
|
|
107
|
+
Features may include example files under an `__examples__/` directory (plural) showing integration patterns. These are often full, working pages with concrete names, not bare placeholder templates — in the detected framework's file types (see the framework reference). For each:
|
|
70
108
|
|
|
71
109
|
1. Read the example file to understand the pattern — treat it as a working reference implementation, not necessarily a stub.
|
|
72
110
|
2. Read the target file (shown in `describe` output).
|
|
73
111
|
3. Apply the pattern from the example into the target.
|
|
74
112
|
4. **CRITICAL — verify before deleting:**
|
|
75
113
|
```bash
|
|
76
|
-
# Verify the build passes with the integrated pattern
|
|
114
|
+
# Verify the build passes with the integrated pattern (build command per framework reference)
|
|
77
115
|
npm run build || {
|
|
78
116
|
echo "ERROR: Build failed after integration - do NOT delete __examples__/"
|
|
79
117
|
exit 1
|
|
80
118
|
}
|
|
81
|
-
|
|
82
|
-
# Verify the pattern from the example is actually present in the target
|
|
83
|
-
#
|
|
84
|
-
#
|
|
85
|
-
grep -q "SearchInput\|useSearch" src/pages/*.tsx src/components/*.tsx 2>/dev/null || {
|
|
86
|
-
echo "ERROR: Pattern from example not found in target files - integration incomplete"
|
|
87
|
-
echo "Do NOT delete __examples__/ until the pattern is confirmed present"
|
|
88
|
-
exit 1
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
# Only delete after both checks pass
|
|
92
|
-
rm -rf __examples__/
|
|
119
|
+
|
|
120
|
+
# Verify the pattern from the example is actually present in the target.
|
|
121
|
+
# Adjust the grep to a key symbol/import/component from the example, over the
|
|
122
|
+
# detected framework's source files (see the framework reference for a worked pattern).
|
|
93
123
|
```
|
|
124
|
+
Only delete `__examples__/` after **both** the build passes and the pattern is confirmed present in the target.
|
|
94
125
|
|
|
95
126
|
If either check fails, **do NOT delete `__examples__/`** — the integration is incomplete. Fix the integration first, then re-run the verification.
|
|
96
127
|
|
|
97
|
-
|
|
128
|
+
## Post-install: Mount the OOTB component, don't hand-roll a parallel one
|
|
98
129
|
|
|
99
|
-
When a feature ships an integration point, the UI **must** use it rather than a parallel hand-rolled version. For features that ship an entry component, mount it
|
|
130
|
+
When a feature ships an integration point, the UI **must** use it rather than a parallel hand-rolled version. For features that ship an entry component, mount it (the framework reference shows the mount idiom); do **not** author a bespoke page that queries data directly. A custom results page against seed data or a raw GraphQL call bypasses the installed, tested feature, so the deployed sObject/CMS logic never runs. The only exception is when the user **explicitly** opts out and asks for a custom one — confirm that intent, don't infer it.
|
|
100
131
|
|
|
101
|
-
|
|
132
|
+
## Hint Placeholders
|
|
102
133
|
|
|
103
134
|
Some copy paths use `<descriptive-name>` placeholders (e.g., `<desired-page-with-search-input>`) that the CLI does not resolve. After installation, rename or relocate these files to the intended target, or integrate their patterns into an existing file. This is separate from the `__examples__/` convention above — a single copy path can use either mechanism.
|
|
104
135
|
|
|
105
|
-
|
|
136
|
+
## Auth Feature: Org-Side Prerequisites
|
|
106
137
|
|
|
107
|
-
Installing the authentication feature only copies files — it does not configure the org. Before telling the user auth is done, flag that these org-side steps still need to happen (outside this skill's scope, but required for the feature to actually work):
|
|
138
|
+
Installing the authentication feature only copies files — it does not configure the org. This is framework-agnostic (pure org/metadata config). Before telling the user auth is done, flag that these org-side steps still need to happen (outside this skill's scope, but required for the feature to actually work):
|
|
108
139
|
|
|
109
140
|
- Digital Experiences (Experience Cloud) must be enabled, with Customer Community / Customer Community Plus licenses assigned to the relevant users, and Salesforce Sites enabled.
|
|
110
141
|
- The community and guest profiles need explicit Apex class access granted for the auth utility, login/registration, and password-reset classes — the CLI does not grant this automatically.
|
|
111
142
|
- Guest-profile sharing rules / org-wide defaults for any objects the auth flow touches.
|
|
112
143
|
- **Known limitation:** logout has a documented CSRF-handling gap (tracked as W-21253864) — call this out to the user rather than presenting logout as fully solved.
|
|
113
144
|
|
|
114
|
-
|
|
145
|
+
## CRITICAL: Resolve `<sfdxRoot>` After Every Install
|
|
115
146
|
|
|
116
|
-
The CLI may copy files under a literal `<sfdxRoot>` folder — an unresolved placeholder for this project's Salesforce DX metadata root (from `sfdx-project.json`'s `packageDirectories[].path`, e.g. `force-app/main/default`). Files left there are undeployable.
|
|
147
|
+
The CLI may copy files under a literal `<sfdxRoot>` folder — an unresolved placeholder for this project's Salesforce DX metadata root (from `sfdx-project.json`'s `packageDirectories[].path`, e.g. `force-app/main/default`). Files left there are undeployable. This is framework-agnostic.
|
|
117
148
|
|
|
118
149
|
**After every install:**
|
|
119
150
|
```bash
|
|
@@ -123,5 +154,3 @@ If found, move each file to `<metadata-root>/<same-relative-subpath>` (keep `-me
|
|
|
123
154
|
|
|
124
155
|
**Verification:**
|
|
125
156
|
- [ ] Re-run `find uiBundles/<AppName> -type d -regex '.*/<[^/]+>$'` — output must be empty before proceeding.
|
|
126
|
-
|
|
127
|
-
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Angular UI Bundle Features
|
|
2
|
+
|
|
3
|
+
Framework reference for the **Angular** path of `experience-ui-bundle-features-generate`. Read
|
|
4
|
+
this alongside the workflow spine in `SKILL.md`. The `@salesforce/ui-bundle-features` CLI
|
|
5
|
+
installs the Angular variant of each feature into an Angular UI bundle (an `angular.json` at/
|
|
6
|
+
above the bundle, `@angular/core` in `package.json`, standalone components as `.ts` + `.html`
|
|
7
|
+
pairs under `src/app/`).
|
|
8
|
+
|
|
9
|
+
## Example files
|
|
10
|
+
|
|
11
|
+
Features ship integration examples under `__examples__/` as Angular sources — a standalone
|
|
12
|
+
component is a **`.ts`** class + its **`.html`** template (e.g. `account-search.ts` +
|
|
13
|
+
`account-search.html`), often full working pages, not bare stubs. Integrate the pattern into
|
|
14
|
+
the target named in `describe` output, then verify before deleting the `__examples__/` dir.
|
|
15
|
+
|
|
16
|
+
> Do not assume file names or a `.component` infix — Angular UI bundle starters name
|
|
17
|
+
> components without it (`home.ts`, not `home.component.ts`). The `describe` `Copy Operations`
|
|
18
|
+
> destination and the copied-in source are the version-matched truth for what was installed.
|
|
19
|
+
|
|
20
|
+
## Files features may rewrite
|
|
21
|
+
|
|
22
|
+
Angular features commonly touch app wiring:
|
|
23
|
+
|
|
24
|
+
- `src/app/app.routes.ts` — route registration (route-based features add routes here)
|
|
25
|
+
- `src/app/app.ts` + `src/app/app.html` — root component and its template
|
|
26
|
+
- the app-layout component under `src/app/components/layout/` — the shell some features mount into
|
|
27
|
+
|
|
28
|
+
These are the paths to expect as conflicts in the two-pass conflict flow; resolve them per
|
|
29
|
+
`SKILL.md` → *Conflict Handling* (the exact paths are whatever the CLI prints).
|
|
30
|
+
|
|
31
|
+
## Mount the feature's entry component
|
|
32
|
+
|
|
33
|
+
Mount the OOTB component the feature ships rather than hand-rolling a parallel one. Angular
|
|
34
|
+
mounts by **selector** (in a template) or by **route** (lazy-loaded standalone component) —
|
|
35
|
+
use whichever `describe`/README specifies. For search mounted on a results page template:
|
|
36
|
+
|
|
37
|
+
```html
|
|
38
|
+
<!-- search-results.html — use the feature's selector; do NOT hand-roll a results page -->
|
|
39
|
+
<sf-search />
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Or as a route in `src/app/app.routes.ts`:
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
export const routes: Routes = [
|
|
46
|
+
{ path: "search", loadComponent: () =>
|
|
47
|
+
import("./features/search/search").then((m) => m.Search) }, // path per describe output
|
|
48
|
+
];
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Import the feature's standalone component into whichever component's `imports:` array hosts it.
|
|
52
|
+
|
|
53
|
+
## Build & verify
|
|
54
|
+
|
|
55
|
+
Build command (run from the UI bundle dir):
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm run build
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Worked grep for the *verify-before-delete* check — Angular splits usage across `.ts` (selector
|
|
62
|
+
registration, service imports, route entry) and `.html` (the mounted selector). Adjust the
|
|
63
|
+
symbol to one from the example you integrated:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
grep -rq "sf-search\|SearchService" src/app --include='*.ts' --include='*.html' 2>/dev/null || {
|
|
67
|
+
echo "ERROR: Pattern from example not found in target files - integration incomplete"
|
|
68
|
+
echo "Do NOT delete __examples__/ until the pattern is confirmed present"
|
|
69
|
+
exit 1
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Only `rm -rf __examples__/` after the build passes **and** this grep confirms the pattern is
|
|
74
|
+
present in the target.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# React UI Bundle Features
|
|
2
|
+
|
|
3
|
+
Framework reference for the **React** path of `experience-ui-bundle-features-generate`. Read
|
|
4
|
+
this alongside the workflow spine in `SKILL.md`. The `@salesforce/ui-bundle-features` CLI
|
|
5
|
+
installs the React variant of each feature into a React/Vite UI bundle (`"react"` in the
|
|
6
|
+
bundle `package.json`, `.tsx` sources under `src/`).
|
|
7
|
+
|
|
8
|
+
## Example files
|
|
9
|
+
|
|
10
|
+
Features ship integration examples under `__examples__/` as **`.tsx`** files — often full,
|
|
11
|
+
working pages with concrete names (e.g. `AccountSearch.tsx`), not bare stubs. Integrate the
|
|
12
|
+
pattern into the target file named in `describe` output, then verify before deleting the
|
|
13
|
+
`__examples__/` dir.
|
|
14
|
+
|
|
15
|
+
## Files features may rewrite
|
|
16
|
+
|
|
17
|
+
React features commonly touch the app shell and routing:
|
|
18
|
+
|
|
19
|
+
- `src/appLayout.tsx` — the app layout/shell
|
|
20
|
+
- `src/routes.tsx` — route registration
|
|
21
|
+
- `src/App.tsx` — app entry (some features mount here)
|
|
22
|
+
|
|
23
|
+
These are the paths to expect as conflicts in the two-pass conflict flow; resolve them per
|
|
24
|
+
`SKILL.md` → *Conflict Handling* (the exact paths are whatever the CLI prints).
|
|
25
|
+
|
|
26
|
+
## Mount the feature's entry component
|
|
27
|
+
|
|
28
|
+
Mount the OOTB component the feature ships rather than hand-rolling a parallel one. For search,
|
|
29
|
+
mount the feature's `<Search>` component (JSX) on the search-results page:
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { Search } from "./features/search"; // path per describe output
|
|
33
|
+
// ...
|
|
34
|
+
export default function SearchResults() {
|
|
35
|
+
return <Search />; // do NOT hand-roll a results page
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Build & verify
|
|
40
|
+
|
|
41
|
+
Build command (run from the UI bundle dir):
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm run build
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Worked grep for the *verify-before-delete* check (adjust the symbol to one from the example
|
|
48
|
+
you integrated — here the `SearchInput`/`useSearch` pattern integrated into a page):
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
grep -q "SearchInput\|useSearch" src/pages/*.tsx src/components/*.tsx 2>/dev/null || {
|
|
52
|
+
echo "ERROR: Pattern from example not found in target files - integration incomplete"
|
|
53
|
+
echo "Do NOT delete __examples__/ until the pattern is confirmed present"
|
|
54
|
+
exit 1
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Only `rm -rf __examples__/` after the build passes **and** this grep confirms the pattern is
|
|
59
|
+
present in the target.
|