@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,278 @@
|
|
|
1
|
+
# Component Mapping Reference
|
|
2
|
+
|
|
3
|
+
Mapping from legacy Field Service Mobile (`FieldServiceMobile` process type) flow
|
|
4
|
+
components to Data Capture Flow (`DataCaptureFlow` process type) equivalents.
|
|
5
|
+
|
|
6
|
+
> **Source of truth.** The authoritative supported/unsupported decisions live in
|
|
7
|
+
> [`fsm-dc-capability-catalog.md`](./fsm-dc-capability-catalog.md) and its
|
|
8
|
+
> executable twin `scripts/fsm_dc_catalog.py`. This file is a human-readable
|
|
9
|
+
> companion; where the two ever disagree, the catalog wins.
|
|
10
|
+
|
|
11
|
+
## Keyed on the real FSM vocabulary — not Lightning names
|
|
12
|
+
|
|
13
|
+
FSM Flow screen fields use the standard Flow `FlowScreenFieldType` enum:
|
|
14
|
+
`InputField`, `DropdownBox`, `RadioButtons`, `MultiSelectCheckboxes`,
|
|
15
|
+
`DisplayText`, `LargeTextArea`, `PasswordField`, `ComponentInstance`, …
|
|
16
|
+
|
|
17
|
+
A `lightning:*` / `forceContent:*` / `c:*` name is **not** a field type — it only
|
|
18
|
+
ever appears as the `<extensionName>` *inside* a `ComponentInstance` field. So
|
|
19
|
+
classification is always **`fieldType` first, `extensionName` second**. An earlier
|
|
20
|
+
version of this skill keyed its decisions off `lightning:input` /
|
|
21
|
+
`lightning:fileUpload` names; that was wrong and produced the two errors corrected
|
|
22
|
+
in the catalog (signature, file-upload). See W-23364461.
|
|
23
|
+
|
|
24
|
+
## Class 1 — Direct mappings (clean FSM → DC path)
|
|
25
|
+
|
|
26
|
+
Keyed by the FSM `<fieldType>`; `InputField` is further resolved by its
|
|
27
|
+
`<dataType>`, and `ComponentInstance` by its `<extensionName>`.
|
|
28
|
+
|
|
29
|
+
| FSM `<fieldType>` | Discriminator | Data Capture | DC extension |
|
|
30
|
+
|---|---|---|---|
|
|
31
|
+
| `InputField` | dataType `String` | ShortText | `dcTextInput` |
|
|
32
|
+
| `InputField` | dataType `TextArea`/`LongTextArea` | LongText | `dcLongText` |
|
|
33
|
+
| `InputField` | dataType `Email` | Email | `dcEmail` |
|
|
34
|
+
| `InputField` | dataType `Phone` | Phone | `dcPhone` |
|
|
35
|
+
| `InputField` | dataType `Number`/`Double`/`Currency` | Numeric | `dcNumeric` |
|
|
36
|
+
| `InputField` | dataType `Date` | Date | `dcDate` |
|
|
37
|
+
| `InputField` | dataType `DateTime` | DateTime | `dcDateTime` |
|
|
38
|
+
| `InputField` | dataType `Boolean` | Checkbox | `dcCheckbox` — *(see discrepancy in catalog)* |
|
|
39
|
+
| `InputField` | dataType `Picklist` | Picklist | `dcPicklist` |
|
|
40
|
+
| `InputField` | dataType `MultiselectPicklist` | CheckboxGroup | `dcCbGroup` |
|
|
41
|
+
| `LargeTextArea` | — | LongText | `dcLongText` |
|
|
42
|
+
| `DropdownBox` | — | Picklist | `dcPicklist` |
|
|
43
|
+
| `RadioButtons` | — | Radio | `dcRbGroup` |
|
|
44
|
+
| `RadioButtonGroup` | — | Radio | `dcRbGroup` |
|
|
45
|
+
| `MultiSelectCheckboxes` | — | CheckboxGroup | `dcCbGroup` |
|
|
46
|
+
| `MultiSelectPicklist` | — | CheckboxGroup | `dcCbGroup` *(or `dcPicklist` multi-mode)* |
|
|
47
|
+
| `DisplayText` | — | DisplayText | *(pass-through; review formulas)* |
|
|
48
|
+
| `ComponentInstance` | ext `forceContent:fileUpload` | UploadFile | `dcUpFile` |
|
|
49
|
+
| `ComponentInstance` | ext `forceContent:imageUpload` | UploadImage | `dcUpImage` |
|
|
50
|
+
| `ComponentInstance` | ext already `runtime_service_fieldservice:dc*` | *(pass-through, cleaned)* | — |
|
|
51
|
+
|
|
52
|
+
`DisplayText` is the only field type valid in **both** flow types.
|
|
53
|
+
`forceContent:fileUpload` is the **only** screen extension core allows inside an
|
|
54
|
+
FSM flow (per `FieldServiceMobileFlowValidator`).
|
|
55
|
+
|
|
56
|
+
## Class 2 — No DC equivalent (flag, never silently drop)
|
|
57
|
+
|
|
58
|
+
These FSM field types have nothing on the DC side and cannot auto-migrate. The
|
|
59
|
+
analyzer flags each in its Data Capture Gap Report.
|
|
60
|
+
|
|
61
|
+
| FSM `<fieldType>` | Reason | Recommended approach |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| `PasswordField` | No DC password component | Capture as `dcTextInput` only if non-secret, else drop |
|
|
64
|
+
| `DisplayRichText` | No DC rich-text display | Downgrade to `DisplayText`; rich formatting lost |
|
|
65
|
+
| `PlainButtons` | **Capability gap** — DC has no action buttons | Remove or redesign; no migration path |
|
|
66
|
+
| `ComponentInstance` w/ any custom ext (`c:*`, or `lightning:*` other than the whitelisted `forceContent:fileUpload`) | DC has no custom-component extension point | Rebuild with a native `dc*` component or flag as unmigratable |
|
|
67
|
+
|
|
68
|
+
Multi-select choice types (`MultiSelectPicklist`, `MultiSelectCheckboxes`) and
|
|
69
|
+
`RadioButtonGroup` are **not** gaps — they map to DC via `ComponentMultiChoice` /
|
|
70
|
+
`ComponentChoice` (see Class 1). DC has no *single* component covering both single-
|
|
71
|
+
and multi-select, but `dcPicklist` covers both modes and `dcCbGroup` covers multi.
|
|
72
|
+
|
|
73
|
+
## Class 3 — DC-only components (no FSM source produces them)
|
|
74
|
+
|
|
75
|
+
These exist only in Data Capture; **nothing in a source FSM flow migrates into
|
|
76
|
+
them**, so the converter never emits them from a migration.
|
|
77
|
+
|
|
78
|
+
| DC component | Notes |
|
|
79
|
+
|---|---|
|
|
80
|
+
| `dcSignature` | Signature capture — **FSM has no signature component** (see correction below) |
|
|
81
|
+
| `dcEmail` / `dcPhone` / `dcName` | Dedicated inputs (FSM approximates via `InputField`) |
|
|
82
|
+
| `dcAddress` | Address input (optional GPS) |
|
|
83
|
+
| `dcLookup` | Record lookup |
|
|
84
|
+
| `dcMatrix` | Matrix / grid input |
|
|
85
|
+
| `dcCounter` | Numeric stepper |
|
|
86
|
+
| `dcCheckbox` | Single checkbox — distinct from Boolean/Toggle (see discrepancy in catalog) |
|
|
87
|
+
| `dcFileView` | Read-only file/image viewer (requires `fileName`) |
|
|
88
|
+
| `dcUpImage` | Image upload (dedicated component) |
|
|
89
|
+
| `Region` / `RegionContainer` / `Repeater` / `ObjectProvided` | Layout/structural — FSM disallows |
|
|
90
|
+
|
|
91
|
+
> **`dcImages` does not exist.** Image upload is `dcUpImage`; the read-only
|
|
92
|
+
> file/image viewer is `dcFileView`.
|
|
93
|
+
|
|
94
|
+
### Correction: Signature is DC-only (WI-3 reversal)
|
|
95
|
+
|
|
96
|
+
An earlier decision (WI-3 / W-23364096) recorded that file-upload **and
|
|
97
|
+
signature** were supported FSM → DC migration targets. Core disproves the
|
|
98
|
+
signature half: `FieldServiceMobileFlowValidator` whitelists exactly one screen
|
|
99
|
+
extension — `forceContent:fileUpload` — and there is **no** native FSM signature
|
|
100
|
+
component anywhere in the FSM path. `dcSignature` is DataCaptureFlow-only. There
|
|
101
|
+
is no FSM signature source to migrate *from*, so the skill emits no `dcSignature`
|
|
102
|
+
and the downstream signature-emission task (WI-7 / W-23364093) is reverted. The
|
|
103
|
+
file-upload half of WI-3 stands, but keyed on `forceContent:fileUpload → dcUpFile`,
|
|
104
|
+
never `lightning:fileUpload`.
|
|
105
|
+
|
|
106
|
+
## Automation element mapping
|
|
107
|
+
|
|
108
|
+
| Legacy element | Data Capture | Notes |
|
|
109
|
+
|---|---|---|
|
|
110
|
+
| Record Lookup | `<recordLookups>` | Direct map; verify offline behavior |
|
|
111
|
+
| Record Create | `<recordCreates>` | Must follow the last screen (CUD-at-end) |
|
|
112
|
+
| Record Update | `<recordUpdates>` | Must follow the last screen (CUD-at-end) |
|
|
113
|
+
| Record Delete | `<recordDeletes>` | Must follow the last screen (CUD-at-end) |
|
|
114
|
+
| Decision | `<decisions>` | Direct map; review cross-screen routing |
|
|
115
|
+
| Loop | `<loops>` | Direct map |
|
|
116
|
+
| Assignment | `<assignments>` | Direct map |
|
|
117
|
+
| Action Call (Apex) | **BLOCKER** | DC forbids `<actionCalls>`/Apex; only `AGX_FLOW` actions. Convert to record lookups |
|
|
118
|
+
| Subflow Call | **BLOCKER** | DC can only call other DC flows and subflows cannot contain CUD; inline or convert |
|
|
119
|
+
| Formula | `<assignments>` or Decision | Limited DisplayText formula support at DC runtime; pre-calculate |
|
|
120
|
+
| Fault path | **Not supported** | Fault connectors stripped; `$Flow.FaultMessage` blocked |
|
|
121
|
+
|
|
122
|
+
These are the capability-level gaps returned by
|
|
123
|
+
`fsm_dc_catalog.capability_gaps()` and surfaced per-flow by `analyze_flow.py`.
|
|
124
|
+
|
|
125
|
+
## Visibility rules
|
|
126
|
+
|
|
127
|
+
| Legacy pattern | Data Capture | Migration notes |
|
|
128
|
+
|---|---|---|
|
|
129
|
+
| Simple field visibility | `<visibilityRule>` | Direct map; same XML structure |
|
|
130
|
+
| Complex formula visibility | `<visibilityRule>` | Review formula; DC runtime support is limited |
|
|
131
|
+
| Cross-screen visibility | Not directly supported | Redesign with decision-based routing |
|
|
132
|
+
|
|
133
|
+
## Choice set patterns
|
|
134
|
+
|
|
135
|
+
### Legacy: picklist with static choices
|
|
136
|
+
|
|
137
|
+
```xml
|
|
138
|
+
<choices>
|
|
139
|
+
<name>choice_Yes</name>
|
|
140
|
+
<choiceText>Yes</choiceText>
|
|
141
|
+
<dataType>String</dataType>
|
|
142
|
+
<value><stringValue>Yes</stringValue></value>
|
|
143
|
+
</choices>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Data Capture equivalent
|
|
147
|
+
|
|
148
|
+
In spec JSON:
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"fieldType": "Picklist",
|
|
152
|
+
"choices": ["Yes", "No", "Maybe"]
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Converter auto-generates `<choices>` blocks with deduplication.
|
|
157
|
+
|
|
158
|
+
### Legacy: dynamic choice set (record-backed)
|
|
159
|
+
|
|
160
|
+
```xml
|
|
161
|
+
<dynamicChoiceSets>
|
|
162
|
+
<name>AssetChoices</name>
|
|
163
|
+
<object>Asset</object>
|
|
164
|
+
<displayField>Name</displayField>
|
|
165
|
+
<valueField>Id</valueField>
|
|
166
|
+
</dynamicChoiceSets>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Data Capture supports `dynamicChoiceSets` with the same structure. Converter
|
|
170
|
+
preserves these but flags for offline-priming verification.
|
|
171
|
+
|
|
172
|
+
## Input parameter mapping
|
|
173
|
+
|
|
174
|
+
| Legacy parameter | DC parameter | Notes |
|
|
175
|
+
|---|---|---|
|
|
176
|
+
| `label` | `label` | Direct map for ComponentInstance fields |
|
|
177
|
+
| `required` | Field-level `<isRequired>` | Moved from parameter to field attribute |
|
|
178
|
+
| `placeholder` | *(not supported)* | Bake into label text |
|
|
179
|
+
| `disabled` / `readOnly` | `isDisabled` / `isReadonly` | Available on some DC components |
|
|
180
|
+
| `helpText` | *(not supported)* | Bake into label or use DisplayText |
|
|
181
|
+
| `min` / `max` (Counter) | `min` / `max` | Direct map for `dcCounter` |
|
|
182
|
+
| `minDate` / `maxDate` | `minDate` / `maxDate` | Direct map for `dcDate` / `dcDateTime` |
|
|
183
|
+
|
|
184
|
+
## Common migration pitfalls
|
|
185
|
+
|
|
186
|
+
### 1. Apex dependency
|
|
187
|
+
|
|
188
|
+
**Legacy:** Flow calls Apex to compute pricing, validate inventory, etc.
|
|
189
|
+
**Migration:** DC flows are offline-first and cannot call Apex at runtime.
|
|
190
|
+
**Fix:** Convert Apex logic to record lookups, or gate the flow behind an online detector and degrade gracefully.
|
|
191
|
+
|
|
192
|
+
### 2. AutoLaunched subflows
|
|
193
|
+
|
|
194
|
+
**Legacy:** Flow calls an AutoLaunched subflow for reusable logic.
|
|
195
|
+
**Migration:** DC can only call other DC flows (`processType=DataCaptureFlow`), and subflows cannot contain CUD.
|
|
196
|
+
**Fix:** Inline the subflow logic or convert the subflow to DC format.
|
|
197
|
+
|
|
198
|
+
### 3. Cross-screen formula references
|
|
199
|
+
|
|
200
|
+
**Legacy:** Screen 3's DisplayText references fields from Screen 1 via formula.
|
|
201
|
+
**Migration:** DC has limited formula support in DisplayText.
|
|
202
|
+
**Fix:** Use `<assignments>` between screens to pre-calculate values into variables.
|
|
203
|
+
|
|
204
|
+
### 4. Custom components (`ComponentInstance`)
|
|
205
|
+
|
|
206
|
+
**Legacy:** Custom LWC (`c:*`) or non-whitelisted `lightning:*` component embedded in a `ComponentInstance` field.
|
|
207
|
+
**Migration:** No custom component extension points in DC.
|
|
208
|
+
**Fix:** Rebuild with native DC components or flag as incompatible.
|
|
209
|
+
|
|
210
|
+
### 5. Action buttons (`PlainButtons`)
|
|
211
|
+
|
|
212
|
+
**Legacy:** `PlainButtons` field drives in-screen navigation or actions.
|
|
213
|
+
**Migration:** DC has no user-facing action buttons (only `AGX_FLOW`).
|
|
214
|
+
**Fix:** Redesign the interaction; there is no direct migration path.
|
|
215
|
+
|
|
216
|
+
## Validation checklist
|
|
217
|
+
|
|
218
|
+
After migration, verify:
|
|
219
|
+
|
|
220
|
+
- [ ] All screens render
|
|
221
|
+
- [ ] All field types display correctly
|
|
222
|
+
- [ ] Required validation fires
|
|
223
|
+
- [ ] Conditional visibility works
|
|
224
|
+
- [ ] Choices populate (picklists, radios, checkboxes)
|
|
225
|
+
- [ ] Lookups search the correct object
|
|
226
|
+
- [ ] File-upload components accept input
|
|
227
|
+
- [ ] Record creates/updates succeed
|
|
228
|
+
- [ ] Loops iterate correctly
|
|
229
|
+
- [ ] Decisions route to correct next steps
|
|
230
|
+
- [ ] Offline behavior: drafts queue when airplane mode on
|
|
231
|
+
- [ ] Form appears in FSL Mobile "Forms" tab
|
|
232
|
+
|
|
233
|
+
## Conversion confidence levels
|
|
234
|
+
|
|
235
|
+
### GREEN (high confidence, automated)
|
|
236
|
+
|
|
237
|
+
- Simple data-entry forms
|
|
238
|
+
- Standard `InputField` types (text, number, date, boolean)
|
|
239
|
+
- Static picklists (`DropdownBox`) and radio groups (`RadioButtons`)
|
|
240
|
+
- File upload via `forceContent:fileUpload`
|
|
241
|
+
- Single record create at end
|
|
242
|
+
- No Apex, no custom components
|
|
243
|
+
|
|
244
|
+
### YELLOW (medium confidence, requires review)
|
|
245
|
+
|
|
246
|
+
- Visibility rules with formulas
|
|
247
|
+
- Decision-based routing
|
|
248
|
+
- Dynamic choice sets (requires offline-priming verification)
|
|
249
|
+
- Record updates with conditional logic
|
|
250
|
+
- `MultiSelectPicklist` / `RadioButtonGroup` rebuilt as `dcCbGroup` / `dcRbGroup`
|
|
251
|
+
|
|
252
|
+
### RED (low confidence, manual redesign)
|
|
253
|
+
|
|
254
|
+
- Custom `ComponentInstance` components (`c:*`, non-whitelisted `lightning:*`)
|
|
255
|
+
- `PlainButtons` action buttons
|
|
256
|
+
- Apex callouts
|
|
257
|
+
- AutoLaunched subflows
|
|
258
|
+
- Complex nested decisions
|
|
259
|
+
- Cross-screen formula dependencies in DisplayText
|
|
260
|
+
- `DisplayRichText`
|
|
261
|
+
|
|
262
|
+
## Testing strategy
|
|
263
|
+
|
|
264
|
+
1. **Desktop first:** Open migrated flow via `<instanceUrl>/flow/<FlowApiName>_v2`, complete the form end-to-end
|
|
265
|
+
2. **Offline priming:** Verify Briefcase includes all objects/fields the flow touches
|
|
266
|
+
3. **Mobile render:** Attach to a test record, open on FSL Mobile device
|
|
267
|
+
4. **Offline mode:** Airplane mode + complete form + verify draft queues
|
|
268
|
+
5. **Data integrity:** Compare output records from legacy vs. migrated flow
|
|
269
|
+
6. **Edge cases:** Test all branches, visibility conditions, validation rules
|
|
270
|
+
|
|
271
|
+
## Rollback procedure
|
|
272
|
+
|
|
273
|
+
If migrated flow has issues:
|
|
274
|
+
|
|
275
|
+
1. Keep legacy flow active (don't deactivate)
|
|
276
|
+
2. Remove `DynamicDataCapture` attachment for migrated flow
|
|
277
|
+
3. Iterate on spec, rebuild, redeploy as `_v3`, `_v4`, etc.
|
|
278
|
+
4. Once validated, deactivate legacy flow and clean up test versions
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Converter → Builder integration contract
|
|
2
|
+
|
|
3
|
+
This is the authoritative contract between the two scripts that form the
|
|
4
|
+
migration pipeline:
|
|
5
|
+
|
|
6
|
+
```text
|
|
7
|
+
legacy Digital Forms XML
|
|
8
|
+
└─▶ scripts/convert_to_dc_spec.py (producer)
|
|
9
|
+
└─▶ spec JSON
|
|
10
|
+
└─▶ scripts/vendor/build_flow.py (consumer)
|
|
11
|
+
└─▶ .flow-meta.xml (DataCaptureFlow)
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Before `collapse_gating_decisions`, the converter runs `normalize_inverted_gates`,
|
|
15
|
+
which rewrites inverted-shape gates (default branch shows the gated field) into
|
|
16
|
+
equivalent positive gates by negating the rule condition and swapping connectors.
|
|
17
|
+
Collapse then handles them unchanged (field or section). Inverted gates whose
|
|
18
|
+
condition uses a non-invertible operator or custom logic are left flagged (see the
|
|
19
|
+
capability catalog).
|
|
20
|
+
|
|
21
|
+
`build_flow.py` (`parse_spec`) is the source of truth for the JSON shape.
|
|
22
|
+
`convert_to_dc_spec.py` MUST emit exactly this shape.
|
|
23
|
+
|
|
24
|
+
> **History:** an earlier converter emitted `screens` as a *list* of
|
|
25
|
+
> `{title, fields:[{name, label, fieldType, required, choices}]}`, while the
|
|
26
|
+
> builder consumes `screens` as a *dict* of `{ScreenName: [{fieldName,
|
|
27
|
+
> fieldLabel, isRequired, options, visibility}]}`. Piping one into the other
|
|
28
|
+
> raised `ValueError: spec must have a non-empty 'screens' object` and produced
|
|
29
|
+
> no output. This doc + the smoke test exist to prevent that regression.
|
|
30
|
+
|
|
31
|
+
## Top-level spec object
|
|
32
|
+
|
|
33
|
+
| Key | Type | Required | Notes |
|
|
34
|
+
|-----|------|----------|-------|
|
|
35
|
+
| `formTitle` | string | yes | Flow label / interview label. |
|
|
36
|
+
| `formType` | string | no | Free text; converter sets `"DataCaptureFlow"`. |
|
|
37
|
+
| `screens` | **object (dict)** | yes | Keyed by screen name → list of field objects. Must be non-empty. |
|
|
38
|
+
| `decisions` | list | no | Pre-CUD screen-routing decisions. Each: `{name, label, defaultConnector, defaultLabel, rules:[{name, label, conditionLogic, conditions:[{leftValueReference, operator, rightValue}], connectsTo}]}`. Emitted by the converter (WI-6a) **only when the decision passes the deployability gate** — every target resolves to an element 6a actually builds (another surviving decision) AND the decision is reachable from a screen connector. Decisions that fail either bar are routed to `_decisionFlags`, never emitted, so no `<decisions>` element ever carries a dangling `<targetReference>`. |
|
|
39
|
+
| `_screenConnectors` | object | no | `{screen_key: target_api_name}` — a source screen's outgoing connector, **filtered to targets that are emitted decisions**. Connectors whose target is not an emitted decision are dropped so the screen falls through sequentially rather than dangling. Full connector-graph wiring to renamed `Screen_` api-names and to assignments/lookups is deferred to WI-6b/6c. |
|
|
40
|
+
| `_decisionFlags` | list | no | `{name, reason}` for **decisions** the routing gate did not emit. Two reason families: (1) **Decision→CUD** — routes directly to a CUD element (forbidden by the CUD-at-end rule); (2) **target not yet wired** — routes to screens/assignments/lookups 6a does not build, or is unreachable — deferred to WI-6b/6c. Decision-routing only; structural ceilings live in `_ceilingFlags`. Migration annotation only. |
|
|
41
|
+
| `_ceilingFlags` | list | no | `{name, reason}` for **structural** DC deploy-time ceilings the converter cannot translate (WI-7), in document order: (1) any element reachable only after a CUD node (CUD-at-end rule); (2) any element carrying a `<faultConnector>`; (3) any `<loops>`. Kept SEPARATE from `_decisionFlags` because the same element name can legitimately appear in both surfaces (a decision that is both unwired and post-CUD), so a single name-keyed list would collide. Migration annotation only. |
|
|
42
|
+
| `_cudAnalysis` | object | no | WI-8 ordinal CUD-placement analysis. `{consolidated:[{node,op,from,to}], manualRestructure:[{node,op,position,reason,blockers}], hasMidFlowCud:bool}`. Present only when the flow has ≥1 CUD element. `consolidated` lists safe record-creates the converter moved to `postScreen`; `manualRestructure` lists CUD needing hand-restructuring (unsafe, or safe update/delete with no `postScreen` emission path). Migration annotation only. |
|
|
43
|
+
| `_collapsedDecisions` | list | no | `{decision, field?, section?, fields?, clearedRequired?}` for gates the converter collapsed into visibility. Field-level collapses (WI-6b) populate `field`; section-level collapses (WI-6c) populate `section` and `fields` (the list of field api-names the section contained) and `clearedRequired` (field names whose required flag was unset because they became conditionally visible). Migration annotation only. |
|
|
44
|
+
| `_incompleteMigration` | list | no | Unsupported elements from the source flow that have no Data Capture equivalent. Each: `{type, name, reason}` where `type ∈ {apex, subflow, faultPath, customComponent, unknownField}`. Present **only when** the source flow has ≥1 unsupported element; the key is omitted entirely (not emitted as an empty list) for clean flows. Ordering: flow-level (`apex`, `subflow`, `faultPath`) in document order, then field-level (`customComponent`, `unknownField`) in screen/field document order — deterministic. See "Incomplete Migration Marker" section below. |
|
|
45
|
+
| `postScreen` | object | no | End-of-flow automation (decisions/lookups/loop/creates). As of WI-8, `_automationNote` fires only when mid-flow CUD is detected and its body is ordering-based (points at `_cudAnalysis`); the former count-based note is removed. Safe record-creates are emitted into `postScreen.recordCreates`. |
|
|
46
|
+
| `_migrationSummary` | list of strings | no | Human-readable rollup, one line per migration action: section/field collapses, cleared-required fields (WI-6c), and WI-7 ceiling flags (post-CUD / fault / loop). The human-facing mirror of the machine keys `_collapsedDecisions` and `_ceilingFlags`. Only present when at least one action occurred. Migration annotation only. |
|
|
47
|
+
|
|
48
|
+
Any key beginning with `_` (e.g. `_automationNote`, `_migrationNote`, `_incompleteMigration`, `_screenConnectors`, `_decisionFlags`) is a
|
|
49
|
+
migration annotation. As of WI-8, `_automationNote` fires only when mid-flow CUD is detected and its body is ordering-based (points at `_cudAnalysis`); the former count-based note is removed. Safe record-creates are emitted into `postScreen.recordCreates`. The builder ignores unknown keys, so annotations pass
|
|
50
|
+
through harmlessly.
|
|
51
|
+
|
|
52
|
+
## `screens` — dict, not list
|
|
53
|
+
|
|
54
|
+
- **Key**: the screen name/label as a string (e.g. `"Asset Details"`). It does
|
|
55
|
+
not need to be pre-sanitized — the builder derives the display label via
|
|
56
|
+
`humanize_screen_key` and produces the screen api-name by running the key
|
|
57
|
+
through `coerce_api_name` with a `Screen_` prefix (so `"Asset Details"` →
|
|
58
|
+
api-name `Screen_Asset_Details`, label "Asset Details"). Keys must be unique
|
|
59
|
+
within the `screens` dict.
|
|
60
|
+
- **Value**: a **non-empty** list of field objects or **section-sentinel dicts**. The builder raises if any
|
|
61
|
+
screen maps to an empty list, so the converter drops screens that yield no
|
|
62
|
+
convertible fields rather than emit an empty one. Section-sentinels (WI-6c) are expressed as `{"section": label, "visibility"?: {...}, "fields": [...]}` for self-contained / nestable sections, or `{"section": label}` (no `fields` key) for legacy inline openers.
|
|
63
|
+
|
|
64
|
+
## Field object
|
|
65
|
+
|
|
66
|
+
| Key | Type | Required | Emitted by converter | Notes |
|
|
67
|
+
|-----|------|----------|----------------------|-------|
|
|
68
|
+
| `fieldName` | string | yes | yes | Source field api-name. Builder re-sanitizes and uniquifies it. |
|
|
69
|
+
| `fieldLabel` | string | yes | yes | Display label. |
|
|
70
|
+
| `fieldType` | string | yes | yes | One of the builder's `TYPE_MAP` keys (see below). Unknown types fall back to `ShortText` with a `[Unknown type: X]` label prefix. |
|
|
71
|
+
| `isRequired` | bool | yes | yes | Coerced with `bool()` by the builder. |
|
|
72
|
+
| `options` | list[string] | for choice types | when choices present | Choice display values for `Picklist` / `Radio` / `CheckboxGroup` / `Matrix`. |
|
|
73
|
+
| `visibility` | object | no | yes (6b/6c) | `{ field, operator, value }`; `field` must reference a choice field, `value` one of its options. Field-level visibility collapse delivered in WI-6b. A `visibility` key on a **section sentinel** (WI-6c) gates the entire section (builder emits a `<visibilityRule>` on the `RegionContainer` field). Note: legacy FSM has no component-level visibility — all conditionality arrives via the top-level `decisions` list (decision routing delivered in WI-6a). |
|
|
74
|
+
| `defaultValue` | string/number/bool | no | not yet | Pre-fill / DisplayText body. |
|
|
75
|
+
| `_migrationNote` | string | no | yes (when needed) | Migration annotation; ignored by builder. |
|
|
76
|
+
|
|
77
|
+
Repeater/Matrix/Counter/Lookup/FileView carry extra keys (`repeaterFields`,
|
|
78
|
+
`matrixRows`, `min`/`max`/`value`, `lookupObject`, `fileName`) — see
|
|
79
|
+
`build-data-capture-form/reference/field-types.md`. The converter does not emit
|
|
80
|
+
these yet.
|
|
81
|
+
|
|
82
|
+
### Sections & nesting
|
|
83
|
+
|
|
84
|
+
Sections (WI-6c) are expressed as **section-sentinel dicts** within a screen's field list. Two forms exist:
|
|
85
|
+
|
|
86
|
+
- **Self-contained / nestable**: `{"section": label, "visibility"?: {...}, "fields": [...]}` — the `fields` array contains the section's child fields (and may itself contain nested section sentinels, up to `MAX_SECTION_DEPTH = 5`). The builder emits a `RegionContainer` field wrapping the children. If `visibility` is present, the builder emits a `<visibilityRule>` on the `RegionContainer`.
|
|
87
|
+
- **Legacy inline opener**: `{"section": label}` (no `fields` key) — the legacy converter emitted this form; it opens a section that extends to the next section sentinel or end-of-screen. Not nested. The current converter (WI-6c) emits only the self-contained form.
|
|
88
|
+
|
|
89
|
+
**Cascade rule**: each section carries only its own `visibility` conditions. The Data Capture runtime auto-hides children when a parent section is hidden, so the converter does not need to propagate parent conditions downward into child field visibility rules.
|
|
90
|
+
|
|
91
|
+
## Decision conditions
|
|
92
|
+
|
|
93
|
+
Each decision in the top-level `decisions` list contains `rules`, and each rule contains `conditions`. Condition structure:
|
|
94
|
+
|
|
95
|
+
| Key | Type | Notes |
|
|
96
|
+
|-----|------|-------|
|
|
97
|
+
| `leftValueReference` | string | Field api-name or merge-field reference. |
|
|
98
|
+
| `operator` | string | Flow operator (e.g. `EqualTo`, `NotEqualTo`, `IsNull`, `GreaterThan`). Defaults to `EqualTo` if omitted. |
|
|
99
|
+
| `rightValue` | object | Typed single-key dict: one of `{booleanValue: bool}`, `{numberValue: float}`, `{stringValue: string}`, or `{elementReference: string}`. May be omitted for null-check operators. |
|
|
100
|
+
|
|
101
|
+
The `conditionLogic` field (string) is copied verbatim from the source Flow decision, including custom logic strings like `3 and (1 OR 2) and 4`. Defaults to `"and"` if omitted.
|
|
102
|
+
|
|
103
|
+
## Field-type vocabulary
|
|
104
|
+
|
|
105
|
+
`fieldType` values MUST be keys in `build_flow.py`'s `TYPE_MAP`. As of this
|
|
106
|
+
writing:
|
|
107
|
+
|
|
108
|
+
```text
|
|
109
|
+
ShortText, LongText, Name, Email, Phone, Numeric, Counter, Date, DateTime,
|
|
110
|
+
Checkbox, Toggle, Picklist, Radio, CheckboxGroup, DisplayText, Repeater,
|
|
111
|
+
Signature, UploadFile, UploadImage, Address, Matrix, Images, Lookup, FileView
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The converter maps legacy `extensionName`s to a subset of these (see
|
|
115
|
+
`reference/component-mapping.md`). Any legacy component with no mapping is
|
|
116
|
+
emitted as `ShortText` with a `_migrationNote`.
|
|
117
|
+
|
|
118
|
+
## Renamed keys (legacy converter → current contract)
|
|
119
|
+
|
|
120
|
+
If you are updating older code or docs, these are the renames that closed the
|
|
121
|
+
contract gap:
|
|
122
|
+
|
|
123
|
+
| Old converter key | Current contract key |
|
|
124
|
+
|-------------------|----------------------|
|
|
125
|
+
| `screens` (list) | `screens` (dict, keyed by screen name) |
|
|
126
|
+
| screen `title` | (dropped — label derived from the dict key) |
|
|
127
|
+
| screen `fields` | (dropped — the dict value *is* the field list) |
|
|
128
|
+
| `name` | `fieldName` |
|
|
129
|
+
| `label` | `fieldLabel` |
|
|
130
|
+
| `required` | `isRequired` |
|
|
131
|
+
| `choices` | `options` |
|
|
132
|
+
|
|
133
|
+
## Incomplete Migration Marker
|
|
134
|
+
|
|
135
|
+
When the converter encounters source flow elements that have no Data Capture equivalent, it emits `_incompleteMigration`: a top-level list of `{type, name, reason}` dictionaries. This key is present **only when** the source flow has ≥1 unsupported element; it is omitted entirely (not emitted as an empty list) for clean flows.
|
|
136
|
+
|
|
137
|
+
### Type vocabulary
|
|
138
|
+
|
|
139
|
+
`type` is a closed set with exactly five values:
|
|
140
|
+
|
|
141
|
+
| Type | Meaning | Example |
|
|
142
|
+
|------|---------|---------|
|
|
143
|
+
| `apex` | Apex action call or invocable action | EmailAlert, Apex class invocation |
|
|
144
|
+
| `subflow` | Subflow invocation | DataCaptureFlow can call other DC subflows, but this flags manual review |
|
|
145
|
+
| `faultPath` | Fault connector (error path) | DC has no fault paths; error handling is stripped |
|
|
146
|
+
| `customComponent` | Custom Lightning component in a field slot | Non-runtime_service_fieldservice component |
|
|
147
|
+
| `unknownField` | Field with no recognized type mapping | Unrecognized extensionName or fieldType |
|
|
148
|
+
|
|
149
|
+
### Ordering
|
|
150
|
+
|
|
151
|
+
The list is deterministic:
|
|
152
|
+
1. **Flow-level** (`apex`, `subflow`, `faultPath`) in source-document order (from `detect_unsupported_elements`)
|
|
153
|
+
2. **Field-level** (`customComponent`, `unknownField`) in screen/field document order (collected during the screen loop)
|
|
154
|
+
|
|
155
|
+
### Builder behavior
|
|
156
|
+
|
|
157
|
+
`build_flow.py` reads `_incompleteMigration` via `parse_spec` into `FormSpec.incomplete_migration` (a list). When present and non-empty, `build_xml` renders ONE `<!-- INCOMPLETE MIGRATION ... -->` comment block between the `<?xml version="1.0"?>` declaration and the `<Flow>` opening tag. Each entry is formatted as:
|
|
158
|
+
|
|
159
|
+
```text
|
|
160
|
+
- [type] name: reason
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
If the key is absent, no comment is emitted. (In practice the converter omits the key rather than emitting an empty list, but the builder tolerates an empty list too.)
|
|
164
|
+
|
|
165
|
+
### Coexistence with other annotations
|
|
166
|
+
|
|
167
|
+
`_incompleteMigration` coexists with `_subflowNote`, `_automationNote`, and per-field `_migrationNote`. These annotations were **not consolidated** — each serves a distinct purpose:
|
|
168
|
+
- `_incompleteMigration`: top-level spec key listing all unsupported elements → XML comment block
|
|
169
|
+
- `_subflowNote` / `_automationNote`: converter stdout warnings about CUD/subflow review needs
|
|
170
|
+
- `_migrationNote`: per-field note embedded in the spec field dict (not promoted to `_incompleteMigration` unless the field is also unsupported)
|
|
171
|
+
|
|
172
|
+
A subflow is intentionally surfaced by **both** mechanisms: it is flagged in `_incompleteMigration` (type `subflow`) **and** may still trigger a `_subflowNote` stdout warning. The two are independent and were deliberately left un-deduplicated (consolidation is out of scope for WI-7).
|
|
173
|
+
|
|
174
|
+
### Unsupported field placeholder behavior
|
|
175
|
+
|
|
176
|
+
Unsupported field slots (those with `meta['unsupported'] = True`) are emitted as **read-only `DisplayText` placeholders** with the `fieldLabel` set to `[UNSUPPORTED: <fieldName> — <reason>]` (em-dash U+2014 separator). They are NOT emitted as silent `ShortText` inputs (the WI-7 silent-downgrade behavior was removed). The placeholder ensures the unsupported field is visible in the built XML and flagged for manual attention.
|
|
177
|
+
|
|
178
|
+
## Verifying the contract
|
|
179
|
+
|
|
180
|
+
Run `scripts/convert_to_dc_spec.py` against `assets/sample-legacy-flow.flow-meta.xml`, then
|
|
181
|
+
`scripts/vendor/build_flow.py` against the resulting spec, and confirm the output XML has a
|
|
182
|
+
non-empty `screens` section. If it fails, the converter output and builder input have drifted —
|
|
183
|
+
reconcile against `build_flow.parse_spec`, which remains the source of truth.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# DC platform rules reference
|
|
2
|
+
|
|
3
|
+
These rules govern any valid DataCaptureFlow. The transformer enforces them automatically. This section is the authoritative reference for debugging deploy errors or validating migrated flows manually.
|
|
4
|
+
|
|
5
|
+
## Required flow headers
|
|
6
|
+
|
|
7
|
+
```xml
|
|
8
|
+
<processType>DataCaptureFlow</processType>
|
|
9
|
+
<areMetricsLoggedToDataCloud>false</areMetricsLoggedToDataCloud>
|
|
10
|
+
<environments>Offline</environments>
|
|
11
|
+
<!-- NO <apiVersion> tag — causes: "You can't specify the field API Version" -->
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Required input variables (platform launch contract)
|
|
15
|
+
|
|
16
|
+
SFS Mobile passes these on launch — every DataCaptureFlow must declare them:
|
|
17
|
+
```xml
|
|
18
|
+
<variables><name>recordId</name><dataType>String</dataType><isInput>true</isInput>...</variables>
|
|
19
|
+
<variables><name>parentRecordId</name><dataType>String</dataType><isInput>true</isInput>...</variables>
|
|
20
|
+
<variables><name>parentObjectType</name><dataType>String</dataType><isInput>true</isInput>...</variables>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Flow structure rules
|
|
24
|
+
|
|
25
|
+
| Rule | Detail |
|
|
26
|
+
|---|---|
|
|
27
|
+
| First element after `<start>` | **Must be a `<screens>` element** — connecting `<start>` directly to recordLookups or decisions causes mobile offline rendering failure |
|
|
28
|
+
| DML placement | Create, Update, Delete MUST be at the END of the flow |
|
|
29
|
+
| Screens after DML | NOT allowed |
|
|
30
|
+
| Decision between sequential CUD nodes | A Decision CAN route to which CUD chain starts; once a CUD chain begins, no Decision may appear between sequential CUD nodes |
|
|
31
|
+
| Subflows (CUD) | Subflows CANNOT contain Create, Update, or Delete operations |
|
|
32
|
+
| Subflows (type) | Can only call another DataCaptureFlow — calling an AutoLaunched subflow is blocked |
|
|
33
|
+
| `<actionCalls>` | Not allowed in DataCaptureFlow |
|
|
34
|
+
| Fault connectors | Not supported — must be stripped |
|
|
35
|
+
| XML element grouping | All elements of the same type must appear in a contiguous block — mixing them causes "Element X is duplicated" deploy error |
|
|
36
|
+
|
|
37
|
+
## Visibility rule accessor suffixes
|
|
38
|
+
|
|
39
|
+
```xml
|
|
40
|
+
<leftValueReference>componentName.SUFFIX</leftValueReference>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
| Component type | Suffix |
|
|
44
|
+
|---|---|
|
|
45
|
+
| Input components (`dcTextInput`, `dcNumeric`, `dcCheckbox`, `dcDate`, etc.) | `.value` |
|
|
46
|
+
| Choice components (`dcPicklist`, `dcRbGroup`, `dcCbGroup`) | `.selectedChoiceValues` |
|
|
47
|
+
| Toggle (`dcToggle`) | `.isActive` |
|
|
48
|
+
| Name component (`dcName`) | `.firstName` / `.lastName` |
|
|
49
|
+
| Lookup single select (`dcLookup`) | `.recordId` |
|
|
50
|
+
| Lookup multi-select (`dcLookup` with `isMultiSelection=true`) | `.recordIds` |
|
|
51
|
+
|
|
52
|
+
## Decision IsNull canonical pattern
|
|
53
|
+
|
|
54
|
+
`IsNull` uses a `booleanValue` on the right — NOT a null literal:
|
|
55
|
+
```xml
|
|
56
|
+
<conditions>
|
|
57
|
+
<leftValueReference>v_ParentId</leftValueReference>
|
|
58
|
+
<operator>IsNull</operator>
|
|
59
|
+
<rightValue><booleanValue>false</booleanValue></rightValue>
|
|
60
|
+
<!-- false = "is not null"; true = "is null" -->
|
|
61
|
+
</conditions>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Calculation timing (critical)
|
|
65
|
+
|
|
66
|
+
Calculated values **cannot display on the same screen that collects the inputs** — calculations run only after the user taps Next.
|
|
67
|
+
|
|
68
|
+
Required pattern:
|
|
69
|
+
```text
|
|
70
|
+
Screen N (collect inputs) → Assignment / recordLookups / decisions → Screen N+1 (display results)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Screen N's connector must point to the calculation element, NOT directly to Screen N+1.
|
|
74
|
+
|
|
75
|
+
## DisplayText formula limitations
|
|
76
|
+
|
|
77
|
+
`DisplayText` has severely limited formula support at mobile runtime. Complex formulas deploy and preview in Flow Builder but **fail at runtime** with `Error while resolving default value reference`.
|
|
78
|
+
|
|
79
|
+
| Pattern | Works in DC DisplayText? |
|
|
80
|
+
|---|---|
|
|
81
|
+
| Simple variable reference: `{!var_RiskScore}` | Yes |
|
|
82
|
+
| Component ref: `{!MyPicklist.selectedChoiceValues}` | Yes |
|
|
83
|
+
| Global vars: `{!$Flow.CurrentDate}`, `{!$User.FirstName}` | Yes |
|
|
84
|
+
| `IF(Toggle.isActive, "YES", "NO")` | No — fails at mobile runtime |
|
|
85
|
+
| `TEXT(CASE(...))`, `ADDMONTHS(...)`, nested date math | No — fails at mobile runtime |
|
|
86
|
+
| Mixing multiple component refs + formulas in one `fieldText` | No — fails at mobile runtime |
|
|
87
|
+
|
|
88
|
+
**Pattern**: pre-calculate in an `<assignments>` element → store in a variable → reference that variable in DisplayText.
|
|
89
|
+
|
|
90
|
+
## `isRequired=true` behind a `visibilityRule`
|
|
91
|
+
|
|
92
|
+
**Never** mark a field `isRequired=true` if it is behind a `visibilityRule`. The required check fires even while the field is hidden — the mobile worker cannot proceed.
|
|
93
|
+
|
|
94
|
+
Set `isRequired=false` and add a `validationRule` instead:
|
|
95
|
+
```text
|
|
96
|
+
IF(TriggerField.isActive, AND(NOT(ISBLANK(value)), value >= 0), TRUE)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Lookup component specifics
|
|
100
|
+
|
|
101
|
+
| Property | Behaviour |
|
|
102
|
+
|---|---|
|
|
103
|
+
| Display label in results | Driven by the object's **Primary Compact Layout** — first field in that layout. To change: Setup → Compact Layouts → reorder → assign as Primary. No `displayField` inputParameter exists. |
|
|
104
|
+
| Multi-select | Set `isMultiSelection=true`; output is `{!Lookup.recordIds}` (collection) |
|
|
105
|
+
| Scoping filter | Use `recordIdCollection` (not `recordIds`) — only effective when `isMultiSelection=true`; silently ignored in single-select |
|
|
106
|
+
| Attribute names | `isDisabled` and `isReadonly` (lowercase `o`) — `disabled`/`readOnly` cause deploy errors |
|
|
107
|
+
|
|
108
|
+
## Repeater specifics
|
|
109
|
+
|
|
110
|
+
- Output collection: **`.AllItems` only** (confirmed API v66) — `AddedItems`, `PrepopulatedItems`, `RemovedItems` all cause deploy errors
|
|
111
|
+
- Loop body references: use `Loop_Name.fieldName.value` (the loop variable's name), NOT `Repeater_Name.fieldName.value`
|
|
112
|
+
- Prepopulate: bind an existing SObject collection via the `collection` inputParameter
|
|
113
|
+
- Inside nested fields: reference source rows via `SourceCollection[$EachItem].FieldApiName` — `$EachItem` only resolves inside Repeater-nested fields; downstream loops still iterate `Repeater_Name.AllItems` normally
|
|
114
|
+
- The Repeater itself must NOT have `storeOutputAutomatically` — causes deploy error; only nested fields inside the Repeater get it
|
|
115
|
+
|
|
116
|
+
## Global variable allowlist
|
|
117
|
+
|
|
118
|
+
Only these global variables are supported in DataCaptureFlow (all others blocked):
|
|
119
|
+
|
|
120
|
+
- `$Api`, `$Label`, `$Organization`, `$Profile`, `$System`, `$User`, `$UserRole`
|
|
121
|
+
- `$Flow.CurrentDate`, `$Flow.CurrentDateTime`, `$Flow.InterviewStartTime`, `$Flow.InterviewGuid`
|
|
122
|
+
|
|
123
|
+
Input default binding behavior:
|
|
124
|
+
|
|
125
|
+
| Default binding | Component | Works? |
|
|
126
|
+
|---|---|---|
|
|
127
|
+
| `$User.Username` | `dcTextInput` | Yes |
|
|
128
|
+
| `$User.Name` | `dcTextInput` | No — type mismatch, use `$User.Username` |
|
|
129
|
+
| `$Flow.InterviewStartTime` | `dcDateTime` | Yes |
|
|
130
|
+
| `$Flow.CurrentDate` | `dcDate` | Yes |
|