@salesforce/afv-skills 1.41.0 → 1.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -6
- package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +3 -0
- package/skills/automation-sandbox-post-copy-configure/SKILL.md +4 -0
- package/skills/design-systems-slds-validate/SKILL.md +2 -2
- package/skills/dx-app-analytics-query/SKILL.md +1 -3
- package/skills/dx-devops-conflict-resolve/SKILL.md +205 -0
- package/skills/dx-devops-conflict-resolve/examples/conflict-workflows.md +165 -0
- package/skills/dx-devops-conflict-resolve/references/deploy-failure-resolution.md +75 -0
- package/skills/dx-devops-conflict-resolve/references/git-conflict-resolution.md +124 -0
- package/skills/dx-devops-conflict-resolve/scripts/detect-conflicts.sh +91 -0
- package/skills/dx-devops-conflict-resolve/scripts/diagnose-deploy-failure.sh +156 -0
- package/skills/dx-devops-request-status/SKILL.md +160 -0
- package/skills/dx-devops-request-status/examples/polling-workflows.md +101 -0
- package/skills/dx-devops-request-status/references/cli-commands.md +176 -0
- package/skills/dx-devops-request-status/scripts/poll-status.sh +134 -0
- package/skills/dx-devops-test-failures-analyze/SKILL.md +6 -6
- package/skills/dx-devops-test-pipeline-configure/SKILL.md +7 -7
- package/skills/dx-devops-test-suite-assignments-configure/SKILL.md +6 -6
- package/skills/dx-devops-test-suite-run/SKILL.md +6 -6
- package/skills/dx-devops-work-item-manage/SKILL.md +2 -0
- package/skills/dx-org-manage/references/creating-scratch-org.md +5 -2
- package/skills/dx-org-manage/references/creating-snapshot.md +1 -0
- package/skills/dx-org-shape-manage/SKILL.md +152 -0
- package/skills/dx-org-shape-manage/examples/create_error_output.json +9 -0
- package/skills/dx-org-shape-manage/examples/create_success_output.json +9 -0
- package/skills/dx-org-shape-manage/examples/delete_output.json +11 -0
- package/skills/dx-org-shape-manage/examples/list_inactive_output.json +32 -0
- package/skills/dx-org-shape-manage/examples/list_output.json +24 -0
- package/skills/dx-org-shape-manage/references/cli_flags.md +135 -0
- package/skills/dx-org-switch/SKILL.md +2 -2
- package/skills/dx-org-trial-expiration-check/SKILL.md +2 -0
- package/skills/dx-pkg-post-install-configure/SKILL.md +3 -0
- package/skills/education-cloud-multi-campus-configure/SKILL.md +211 -0
- package/skills/education-cloud-multi-campus-configure/examples/hierarchy_visualization.md +174 -0
- package/skills/education-cloud-multi-campus-configure/examples/output_examples.md +54 -0
- package/skills/education-cloud-multi-campus-configure/examples/sample_hierarchy_input.csv +29 -0
- package/skills/education-cloud-multi-campus-configure/examples/sample_hierarchy_input_edgecases.csv +16 -0
- package/skills/education-cloud-multi-campus-configure/references/account_recordtype_prerequisite.md +44 -0
- package/skills/education-cloud-multi-campus-configure/references/delta_computation.md +33 -0
- package/skills/education-cloud-multi-campus-configure/references/error_handling.md +198 -0
- package/skills/education-cloud-multi-campus-configure/references/foundation_prerequisites.md +54 -0
- package/skills/education-cloud-multi-campus-configure/references/gotchas.md +16 -0
- package/skills/education-cloud-multi-campus-configure/references/hierarchy_parsing_rules.md +133 -0
- package/skills/education-cloud-multi-campus-configure/references/mcp-invocation.md +75 -0
- package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/SKILL.md +1 -1
- package/skills/experience-cms-brand-apply/SKILL.md +4 -1
- package/skills/experience-cms-brand-create/SKILL.md +197 -0
- package/skills/experience-cms-brand-create/assets/brand-template.json +329 -0
- package/skills/experience-cms-brand-create/references/brand-anatomy.md +120 -0
- package/skills/experience-cms-brand-create/references/disk-contract.md +84 -0
- package/skills/experience-cms-content-generate/SKILL.md +190 -0
- package/skills/experience-cms-content-generate/assets/display-formats.md +84 -0
- package/skills/experience-cms-content-generate/assets/payloads/create-content-bulk.json +11 -0
- package/skills/experience-cms-content-generate/assets/payloads/create-content-single.json +11 -0
- package/skills/experience-cms-content-generate/assets/payloads/publish-content.json +4 -0
- package/skills/experience-cms-content-generate/assets/payloads/update-content.json +9 -0
- package/skills/experience-cms-content-generate/assets/questions.md +241 -0
- package/skills/experience-cms-content-generate/examples/create-content-call.md +81 -0
- package/skills/experience-cms-content-generate/references/bulk-batching.md +56 -0
- package/skills/experience-cms-content-generate/references/content-type-classification.md +88 -0
- package/skills/experience-cms-content-generate/references/content-write-tool.md +95 -0
- package/skills/experience-cms-content-generate/references/delegation-protocol.md +37 -0
- package/skills/experience-cms-content-generate/references/edit-publish-workflow.md +63 -0
- package/skills/experience-cms-content-generate/references/error-recovery.md +72 -0
- package/skills/experience-cms-content-generate/references/identifier-resolution.md +26 -0
- package/skills/experience-cms-content-generate/references/intent-routing.md +45 -0
- package/skills/experience-cms-content-generate/references/principles.md +19 -0
- package/skills/experience-cms-content-generate/references/ux-rules.md +68 -0
- package/skills/experience-cms-content-generate/references/workspace-resolution.md +33 -0
- package/skills/experience-cms-content-type-generate/SKILL.md +449 -0
- package/skills/experience-cms-content-type-generate/assets/discovery-prompts.md +79 -0
- package/skills/experience-cms-content-type-generate/assets/schema-example.json +70 -0
- package/skills/experience-cms-content-type-generate/references/agent-checklist.md +50 -0
- package/skills/experience-cms-content-type-generate/references/anti-patterns.md +39 -0
- package/skills/experience-cms-content-type-generate/references/deployment-errors.md +27 -0
- package/skills/experience-cms-content-type-generate/references/discovery-details.md +106 -0
- package/skills/experience-cms-content-type-generate/references/discovery-query-rules.md +85 -0
- package/skills/experience-cms-content-type-generate/references/edit-fields-loop.md +48 -0
- package/skills/experience-cms-content-type-generate/references/pre-deploy-checklist.md +21 -0
- package/skills/experience-cms-content-type-generate/references/retrieve-and-reconcile.md +105 -0
- package/skills/experience-cms-content-type-generate/references/schema-rules.md +51 -0
- package/skills/experience-cms-content-type-generate/references/schema-summary-format.md +60 -0
- package/skills/experience-lds-graphql-generate/SKILL.md +4 -0
- package/skills/experience-lwc-accessibility-jest-run/SKILL.md +79 -0
- package/skills/experience-lwc-accessibility-jest-run/references/running-sa11y-jest-tests.md +205 -0
- package/skills/experience-lwc-design-generate/SKILL.md +5 -4
- package/skills/experience-lwc-generate/SKILL.md +10 -9
- package/skills/experience-ui-bundle-deploy/references/dev-preview.md +21 -0
- package/skills/experience-ui-bundle-deploy/references/social-login.md +1 -0
- package/skills/experience-ui-bundle-file-upload-generate/SKILL.md +6 -6
- package/skills/experience-ui-bundle-localize/SKILL.md +30 -37
- package/skills/experience-ui-bundle-localize/references/gotchas.md +23 -7
- package/skills/experience-ui-bundle-localize/references/i18n-setup.md +48 -4
- package/skills/experience-ui-bundle-localize/references/label-xml.md +22 -8
- package/skills/experience-ui-bundle-localize/references/verifying.md +39 -11
- package/skills/experience-ui-bundle-localize/scripts/detect-bundle-type.sh +118 -15
- package/skills/experience-ui-bundle-localize/scripts/tests/test-detect-bundle-type.sh +187 -0
- package/skills/experience-ui-bundle-mfa-configure/SKILL.md +13 -2
- package/skills/experience-ui-bundle-mfa-configure/references/social-login.md +1 -0
- package/skills/experience-ui-bundle-project-generate/SKILL.md +2 -2
- package/skills/integration-connectivity-generate/SKILL.md +11 -10
- package/skills/integration-eventing-cdc-configure/SKILL.md +6 -6
- package/skills/integration-eventing-subscription-configure/SKILL.md +6 -5
- package/skills/mobile-platform-native-capabilities-integrate/SKILL.md +2 -2
- package/skills/mobile-platform-offline-validate/scripts/package.json +1 -1
- package/skills/platform-agentexchange-partner-offers-configure/SKILL.md +8 -8
- package/skills/platform-custom-application-generate/SKILL.md +2 -0
- package/skills/platform-custom-field-generate/SKILL.md +8 -6
- package/skills/platform-custom-metadata-type-generate/SKILL.md +460 -0
- package/skills/platform-custom-metadata-type-generate/references/cmdt-records.md +251 -0
- package/skills/platform-custom-metadata-type-generate/scripts/sanitize-developer-name.sh +46 -0
- package/skills/platform-custom-setting-generate/SKILL.md +419 -0
- package/skills/platform-dataspace-access-configure/SKILL.md +3 -3
- package/skills/platform-sharing-owd-configure/SKILL.md +3 -0
- package/skills/platform-value-set-generate/SKILL.md +2 -0
- package/skills/service-agentforce-channel-configure/SKILL.md +29 -20
- package/skills/service-agentforce-channel-configure/assets/BotEmailDefinition.botEmailDefinition-meta.xml +36 -0
- package/skills/service-agentforce-channel-configure/assets/email/unfiled$public/AgentforceForServiceEmailTemplate.email +17 -0
- package/skills/service-agentforce-channel-configure/assets/email/unfiled$public/AgentforceForServiceEmailTemplate.email-meta.xml +29 -0
- package/skills/service-agentforce-channel-configure/assets/mdapi-package.xml +25 -0
- package/skills/service-agentforce-channel-configure/assets/settings-mdapi-package.xml +30 -0
- package/skills/service-agentforce-channel-configure/references/agent-wiring.md +20 -0
- package/skills/service-agentforce-channel-configure/references/botemaildefinition.md +107 -0
- package/skills/service-agentforce-channel-configure/references/channel-branch-email.md +203 -50
- package/skills/service-agentforce-channel-configure/references/channel-types.md +30 -3
- package/skills/service-agentforce-channel-configure/references/queue-resolution.md +17 -8
- package/skills/service-agentforce-channel-configure/references/routing-flow.md +14 -3
- package/skills/service-agentforce-channel-configure/scripts/validate-botemaildefinition.py +126 -0
- package/skills/service-agentforce-channel-configure/scripts/validate-emailtemplate.py +133 -0
- package/skills/service-de-channel-activate/SKILL.md +271 -0
- package/skills/service-de-channel-activate/references/gotchas.md +31 -0
- package/skills/service-de-channel-activate/references/phone-verification.md +96 -0
- package/skills/service-de-channel-activate/references/worked-examples.md +14 -0
- package/skills/service-de-channel-consent-configure/SKILL.md +230 -0
- package/skills/service-de-channel-consent-configure/references/gotchas.md +41 -0
- package/skills/service-de-channel-consent-configure/references/language-keywords.md +84 -0
- package/skills/service-de-channel-consent-configure/references/worked-examples.md +134 -0
- package/skills/service-de-channel-create/SKILL.md +369 -0
- package/skills/service-de-channel-create/references/apple.md +59 -0
- package/skills/service-de-channel-create/references/connect-insert.md +84 -0
- package/skills/service-de-channel-create/references/facebook.md +154 -0
- package/skills/service-de-channel-create/references/line.md +66 -0
- package/skills/service-de-channel-create/references/sms.md +98 -0
- package/skills/service-de-channel-create/references/whatsapp.md +98 -0
- package/skills/service-de-channel-create/references/worked-examples.md +70 -0
- package/skills/service-de-channel-routing-configure/SKILL.md +345 -0
- package/skills/service-de-channel-routing-configure/references/asa-routing.md +90 -0
- package/skills/service-de-channel-routing-configure/references/gotchas.md +27 -0
- package/skills/service-de-channel-routing-configure/references/queue-creation.md +123 -0
- package/skills/service-de-channel-routing-configure/references/target-locate.md +98 -0
- package/skills/service-de-channel-routing-configure/references/worked-examples.md +174 -0
- package/skills/service-de-headless-channel-configure/SKILL.md +305 -0
- package/skills/service-de-headless-channel-configure/references/gotchas.md +27 -0
- package/skills/service-de-headless-channel-configure/references/inputs.md +49 -0
- package/skills/service-de-headless-channel-configure/references/output-envelopes.md +53 -0
- package/skills/service-de-headless-channel-configure/references/partial-success.md +24 -0
- package/skills/service-de-headless-channel-configure/references/terms-and-conditions.md +54 -0
- package/skills/service-de-headless-channel-configure/references/worked-examples.md +108 -0
- package/skills/service-de-waba-integrate/SKILL.md +227 -0
- package/skills/service-digital-engagement-channel-configure/scripts/check-api-version.sh +29 -0
- package/skills/service-digital-engagement-messaging-site-integrate/SKILL.md +10 -9
- package/skills/service-digital-engagement-messaging-site-integrate/references/lwr_patch.md +39 -21
- package/skills/service-digital-engagement-messaging-site-integrate/scripts/patch_lwr_bundle.sh +157 -96
- package/skills/service-email-to-case-configure/SKILL.md +190 -0
- package/skills/service-email-to-case-configure/assets/CaseSettings.settings-meta.xml +45 -0
- package/skills/service-email-to-case-configure/examples/CaseSettings-two-addresses.settings-meta.xml +36 -0
- package/skills/service-email-to-case-configure/references/apply-mechanics.md +73 -0
- package/skills/service-email-to-case-configure/references/routing_address_reference.md +73 -0
- package/skills/service-email-to-case-configure/references/troubleshooting.md +25 -0
- package/skills/service-email-to-case-configure/scripts/apply-casesettings.py +1315 -0
- package/skills/service-email-to-case-configure/scripts/check-agent-email-capability.sh +26 -0
- package/skills/service-email-to-case-configure/scripts/tests/__init__.py +0 -0
- package/skills/service-email-to-case-configure/scripts/tests/_bootstrap.py +45 -0
- package/skills/service-email-to-case-configure/scripts/tests/_fakeorg.py +366 -0
- package/skills/service-email-to-case-configure/scripts/tests/_run.py +84 -0
- package/skills/service-email-to-case-configure/scripts/tests/test_apply_org_scenarios.py +655 -0
- package/skills/service-email-to-case-configure/scripts/tests/test_get_session.py +134 -0
- package/skills/service-email-to-case-configure/scripts/tests/test_new_capabilities.py +193 -0
- package/skills/service-email-to-case-configure/scripts/tests/test_validate_casesettings.py +170 -0
- package/skills/service-email-to-case-configure/scripts/validate-casesettings.py +229 -0
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +33 -15
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/examples/output-templates.md +63 -47
- package/skills/service-itsm-agentic-setup-agentforce-studio-configure/SKILL.md +17 -12
- package/skills/service-itsm-agentic-setup-agentforce-studio-configure/references/cli-invocation.md +5 -3
- package/skills/service-itsm-agentic-setup-agentforce-studio-configure/scripts/classify-enable-plan.mjs +11 -3
- package/skills/service-itsm-agentic-setup-agentforce-studio-validate/SKILL.md +8 -6
- package/skills/service-itsm-agentic-setup-agentforce-studio-validate/references/cli-invocation.md +3 -3
- package/skills/service-itsm-agentic-setup-agentforce-studio-validate/scripts/classify-readiness.mjs +11 -3
- package/skills/service-itsm-agentic-setup-configure/SKILL.md +5 -5
- package/skills/service-itsm-agentic-setup-configure/examples/output-templates.md +5 -5
- package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +2 -2
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/report-format.md +11 -7
- package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/render-report.mjs +20 -7
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +10 -6
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/action-availability.md +7 -7
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/report-format.md +11 -7
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/build-create-body.mjs +24 -17
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/classify-action-availability.mjs +98 -58
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/render-report.mjs +20 -7
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/strip-release-management.mjs +176 -0
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/SKILL.md +19 -19
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/references/cli-invocation.md +3 -4
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/references/helper-contracts.md +6 -6
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/references/permset-topology.md +3 -10
- package/skills/service-itsm-agentic-setup-itsm-agentforce-permset-assign/scripts/classify-permset-availability.mjs +7 -9
- package/skills/service-itsm-incident-mgmt-configure/SKILL.md +2 -0
- package/skills/service-itsm-incident-priority-configure/SKILL.md +15 -12
- package/skills/service-itsm-incident-priority-configure/examples/matrix-operations.md +27 -1
- package/skills/service-itsm-incident-priority-configure/references/sf-cli-invocation.md +37 -6
- package/skills/service-native-voice-recording-transcription-configure/SKILL.md +146 -0
- package/skills/service-native-voice-recording-transcription-configure/assets/confirmation-output.json +16 -0
- package/skills/service-native-voice-recording-transcription-configure/assets/package.xml +22 -0
- package/skills/service-native-voice-recording-transcription-configure/references/thunderbird-voice-settings.md +101 -0
- package/skills/service-native-voice-recording-transcription-configure/scripts/enable-recording-transcription.sh +181 -0
- package/skills/data360-activate/README.md +0 -38
- package/skills/data360-activate/SKILL.md +0 -127
- package/skills/data360-connect/README.md +0 -57
- package/skills/data360-connect/SKILL.md +0 -163
- package/skills/data360-connect/examples/connections/heroku-postgres.json +0 -15
- package/skills/data360-connect/examples/connections/ingest-api-connection.json +0 -5
- package/skills/data360-connect/examples/connections/ingest-api-schema.json +0 -31
- package/skills/data360-connect/examples/connections/redshift.json +0 -16
- package/skills/data360-connect/examples/connections/sharepoint-unstructured.json +0 -20
- package/skills/data360-connect/examples/connections/snowflake-connection.json +0 -42
- package/skills/data360-harmonize/README.md +0 -31
- package/skills/data360-harmonize/SKILL.md +0 -126
- package/skills/data360-orchestrate/README.md +0 -120
- package/skills/data360-orchestrate/SKILL.md +0 -263
- package/skills/data360-orchestrate/assets/definitions/activation-target.template.json +0 -5
- package/skills/data360-orchestrate/assets/definitions/activation.template.json +0 -7
- package/skills/data360-orchestrate/assets/definitions/calculated-insight.template.json +0 -7
- package/skills/data360-orchestrate/assets/definitions/data-action-target.template.json +0 -5
- package/skills/data360-orchestrate/assets/definitions/data-action.template.json +0 -5
- package/skills/data360-orchestrate/assets/definitions/data-graph.template.json +0 -21
- package/skills/data360-orchestrate/assets/definitions/data-stream.template.json +0 -55
- package/skills/data360-orchestrate/assets/definitions/dmo.template.json +0 -17
- package/skills/data360-orchestrate/assets/definitions/identity-resolution.template.json +0 -30
- package/skills/data360-orchestrate/assets/definitions/mapping.template.json +0 -14
- package/skills/data360-orchestrate/assets/definitions/relationship.template.json +0 -12
- package/skills/data360-orchestrate/assets/definitions/search-index.template.json +0 -9
- package/skills/data360-orchestrate/assets/definitions/segment.template.json +0 -16
- package/skills/data360-orchestrate/references/feature-readiness.md +0 -157
- package/skills/data360-orchestrate/references/plugin-setup.md +0 -138
- package/skills/data360-orchestrate/scripts/bootstrap-plugin.sh +0 -53
- package/skills/data360-orchestrate/scripts/diagnose-org.mjs +0 -511
- package/skills/data360-orchestrate/scripts/generate-manifest.mjs +0 -68
- package/skills/data360-orchestrate/scripts/verify-plugin.sh +0 -58
- package/skills/data360-prepare/README.md +0 -50
- package/skills/data360-prepare/SKILL.md +0 -203
- package/skills/data360-prepare/examples/ingestion-api/.env.example +0 -8
- package/skills/data360-prepare/examples/ingestion-api/README.md +0 -48
- package/skills/data360-prepare/examples/ingestion-api/send-data.py +0 -144
- package/skills/data360-query/README.md +0 -43
- package/skills/data360-query/SKILL.md +0 -128
- package/skills/data360-query/examples/search-indexes/hybrid-structured.json +0 -44
- package/skills/data360-query/examples/search-indexes/vector-knowledge.json +0 -43
- package/skills/data360-segment/README.md +0 -35
- package/skills/data360-segment/SKILL.md +0 -123
- package/skills/service-helpagent-coordinate/references/channel-help-portal.md +0 -22
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-1-1-non-text-content.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-3-1-i-lists.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-3-1-ii-tables.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-3-1-iii-form-labels.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-3-1-iv-regions.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-3-1-v-groups.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-3-5-identify-input.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-1-4-3-contrast.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-1-1-keyboard.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-4-4-link-purpose.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-4-6-headings-labels.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-5-1-pointer-gestures.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-5-2-pointer-cancellation.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-5-3-label-in-name.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-2-5-7-dragging-movement.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-3-2-1-on-focus.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-3-2-2-on-input.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-3-3-1-error-identification.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-3-3-2-labels-instructions.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-3-3-3-error-suggestion.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-4-1-2-i-name.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-4-1-2-ii-role.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/reviewers/sc-4-1-2-iii-value.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/vision/sc-1-1-1-non-text-content.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/vision/sc-1-4-1-use-of-color.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/vision/sc-1-4-10-resize-reflow.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/vision/sc-1-4-11-non-text-contrast.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/references/vision/sc-1-4-3-contrast.md +0 -0
- /package/skills/{experience-lwc-accessibility-validate → experience-accessibility-validate}/scripts/contrast-ratio.py +0 -0
|
@@ -1,511 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { spawnSync } from 'node:child_process';
|
|
3
|
-
|
|
4
|
-
const HELP = `Data Cloud org readiness classifier
|
|
5
|
-
|
|
6
|
-
Usage:
|
|
7
|
-
node diagnose-org.mjs -o <orgAlias> [--json] [--phase <phase>] [--describe-table <table>] [--timeout <seconds>]
|
|
8
|
-
|
|
9
|
-
Options:
|
|
10
|
-
-o, --target-org Salesforce org alias or username (required)
|
|
11
|
-
--json Print machine-readable JSON
|
|
12
|
-
--phase Optional phase focus: all | connect | prepare | harmonize | segment | act | retrieve
|
|
13
|
-
--describe-table Optional DMO/DLO table name for a retrieve-plane probe
|
|
14
|
-
--timeout Per-command timeout in seconds (default: 45)
|
|
15
|
-
-h, --help Show this help text
|
|
16
|
-
`;
|
|
17
|
-
|
|
18
|
-
const FEATURE_GUIDANCE = {
|
|
19
|
-
CdpDataStreams: 'Data Streams are unavailable for this org/user. Review Data Cloud Setup provisioning, ingestion-related feature availability, and source connector permissions before using preparing-datacloud.',
|
|
20
|
-
CdpIdentityResolution: 'Identity Resolution is unavailable for this org/user. Review Data Cloud harmonization/identity-resolution entitlements and the user\'s Data Cloud permissions before using harmonizing-datacloud for IR work.',
|
|
21
|
-
CdpActivationTarget: 'Activation Targets are unavailable for this org/user. Review activation permissions, destination setup, and any org-specific activation enablement before using activating-datacloud.',
|
|
22
|
-
CdpActivationExternalPlatform: 'Activation destination platforms are unavailable for this org/user. Review Activation Targets setup, destination auth/configuration, and any feature toggles exposed in Data Cloud Setup → Feature Manager.',
|
|
23
|
-
CdpDataSpace: 'Data Spaces are unavailable for this org/user. Review core Data Cloud provisioning and user permissions in Data Cloud Setup before assuming downstream phases can work.',
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
const CAVEATS = [
|
|
27
|
-
'sf data360 doctor is advisory only: the current upstream command checks the search-index endpoint, not every Data Cloud module.',
|
|
28
|
-
'Do not use query describe as a universal tenant probe. Run it only after confirming broader readiness and only against a known DMO or DLO table.',
|
|
29
|
-
'Core Data Cloud provisioning, tenant creation, and license assignment are not reliably exposed as a full CLI enablement flow. Use CLI detection plus Setup guidance instead of promising fully programmatic enablement.',
|
|
30
|
-
];
|
|
31
|
-
|
|
32
|
-
function parseArgs(argv) {
|
|
33
|
-
const args = { phase: 'all', timeout: 45, json: false, describeTable: null };
|
|
34
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
35
|
-
const arg = argv[i];
|
|
36
|
-
switch (arg) {
|
|
37
|
-
case '-o':
|
|
38
|
-
case '--target-org':
|
|
39
|
-
args.targetOrg = argv[++i];
|
|
40
|
-
break;
|
|
41
|
-
case '--phase':
|
|
42
|
-
args.phase = argv[++i] ?? 'all';
|
|
43
|
-
break;
|
|
44
|
-
case '--describe-table':
|
|
45
|
-
args.describeTable = argv[++i] ?? null;
|
|
46
|
-
break;
|
|
47
|
-
case '--timeout':
|
|
48
|
-
args.timeout = Number(argv[++i] ?? '45');
|
|
49
|
-
break;
|
|
50
|
-
case '--json':
|
|
51
|
-
args.json = true;
|
|
52
|
-
break;
|
|
53
|
-
case '-h':
|
|
54
|
-
case '--help':
|
|
55
|
-
args.help = true;
|
|
56
|
-
break;
|
|
57
|
-
default:
|
|
58
|
-
throw new Error(`Unknown argument: ${arg}`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return args;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function trimText(text) {
|
|
65
|
-
return (text || '').replace(/\u001b\[[0-?]*[ -/]*[@-~]/g, '').trim();
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function runCommand(command, args, { json = false, timeoutSeconds = 45 } = {}) {
|
|
69
|
-
const finalArgs = [...args];
|
|
70
|
-
if (json && !finalArgs.includes('--json')) finalArgs.push('--json');
|
|
71
|
-
const result = spawnSync(command, finalArgs, {
|
|
72
|
-
encoding: 'utf8',
|
|
73
|
-
timeout: timeoutSeconds * 1000,
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
const stdout = result.stdout || '';
|
|
77
|
-
const stderr = result.stderr || '';
|
|
78
|
-
let parsed = null;
|
|
79
|
-
if (stdout.trim()) {
|
|
80
|
-
try {
|
|
81
|
-
parsed = JSON.parse(stdout);
|
|
82
|
-
} catch {
|
|
83
|
-
parsed = null;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
let errorMessage = null;
|
|
88
|
-
if (result.error) {
|
|
89
|
-
if (result.error.code === 'ENOENT') {
|
|
90
|
-
errorMessage = `${command} is not installed or not on PATH.`;
|
|
91
|
-
} else if (result.error.code === 'ETIMEDOUT') {
|
|
92
|
-
errorMessage = `Timed out after ${timeoutSeconds}s`;
|
|
93
|
-
} else {
|
|
94
|
-
errorMessage = result.error.message;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return {
|
|
99
|
-
command: [command, ...finalArgs].join(' '),
|
|
100
|
-
exitCode: typeof result.status === 'number' ? result.status : 1,
|
|
101
|
-
stdout: trimText(stdout),
|
|
102
|
-
stderr: trimText(stderr),
|
|
103
|
-
parsed,
|
|
104
|
-
errorMessage,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
function extractSuccessSample(parsed) {
|
|
109
|
-
const result = parsed?.result ?? {};
|
|
110
|
-
|
|
111
|
-
if (Array.isArray(result?.data)) {
|
|
112
|
-
return result.data[0] ?? null;
|
|
113
|
-
}
|
|
114
|
-
if (Array.isArray(result?.data?.platforms)) {
|
|
115
|
-
return result.data.platforms[0] ?? null;
|
|
116
|
-
}
|
|
117
|
-
if (Array.isArray(result?.semanticSearchDefinitionDetails)) {
|
|
118
|
-
return result.semanticSearchDefinitionDetails[0] ?? null;
|
|
119
|
-
}
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
function extractDetails(parsed) {
|
|
124
|
-
const result = parsed?.result ?? {};
|
|
125
|
-
if (result && typeof result === 'object' && !Array.isArray(result)) {
|
|
126
|
-
const details = { ...result };
|
|
127
|
-
delete details.data;
|
|
128
|
-
if (details.status || details.indexCount !== undefined || details.apiVersion || details.instanceUrl) {
|
|
129
|
-
return details;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return undefined;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
function extractCount(parsed) {
|
|
136
|
-
const result = parsed?.result ?? {};
|
|
137
|
-
if (Array.isArray(result?.data)) return result.data.length;
|
|
138
|
-
if (typeof result?.totalSize === 'number') return result.totalSize;
|
|
139
|
-
if (Array.isArray(result?.data?.platforms)) return result.data.platforms.length;
|
|
140
|
-
if (typeof result?.indexCount === 'number') return result.indexCount;
|
|
141
|
-
return null;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function classifyError(message) {
|
|
145
|
-
const text = message || '';
|
|
146
|
-
const gateMatch = text.match(/\[([A-Za-z0-9]+)\]/);
|
|
147
|
-
|
|
148
|
-
if (text.includes("Couldn't find CDP tenant ID")) {
|
|
149
|
-
return {
|
|
150
|
-
state: 'query_service_unavailable',
|
|
151
|
-
code: 'QUERY_SERVICE_TENANT_LOOKUP_FAILED',
|
|
152
|
-
reason: 'The query service could not resolve a CDP tenant for this org context. Confirm broader readiness with data-space, DMO, or doctor probes before declaring Data Cloud fully disabled.',
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
if (text.includes('This feature is not currently enabled for this user type or org')) {
|
|
156
|
-
const featureCode = gateMatch?.[1] ?? 'UNKNOWN_FEATURE_GATE';
|
|
157
|
-
return {
|
|
158
|
-
state: 'feature_gated',
|
|
159
|
-
code: featureCode,
|
|
160
|
-
reason: FEATURE_GUIDANCE[featureCode] ?? 'This capability is gated for the current org or user. Review provisioning, permissions, and any relevant setup toggles before proceeding.',
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
if (text.includes('NOT_FOUND: DataModelEntity')) {
|
|
164
|
-
return {
|
|
165
|
-
state: 'table_not_found',
|
|
166
|
-
code: 'DATA_MODEL_ENTITY_NOT_FOUND',
|
|
167
|
-
reason: 'The specified DMO or DLO table name is not queryable in this org. Pick a real table from dmo list / dlo list or use dmo get first.',
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
if (text.includes('Request failed')) {
|
|
171
|
-
return {
|
|
172
|
-
state: 'request_failed',
|
|
173
|
-
code: 'REQUEST_FAILED',
|
|
174
|
-
reason: 'The endpoint returned a generic request failure. Treat this as inconclusive and confirm readiness with adjacent read-only probes.',
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
if (text.includes('is not a sf command') || text.includes('not installed or not on PATH')) {
|
|
178
|
-
return {
|
|
179
|
-
state: 'runtime_missing',
|
|
180
|
-
code: 'RUNTIME_MISSING',
|
|
181
|
-
reason: 'The sf data360 runtime is not available. Install or relink the community plugin first.',
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
if (text.includes('Timed out after')) {
|
|
185
|
-
return {
|
|
186
|
-
state: 'timeout',
|
|
187
|
-
code: 'TIMEOUT',
|
|
188
|
-
reason: 'The probe timed out. Retry, reduce the scope, or fall back to a smaller read-only command family.',
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
return {
|
|
192
|
-
state: 'unknown_error',
|
|
193
|
-
code: 'UNKNOWN_ERROR',
|
|
194
|
-
reason: 'The probe failed for an unclassified reason. Inspect the raw message and confirm readiness with neighboring probes.',
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
function normalizeProbe(name, raw, meta = {}) {
|
|
199
|
-
const base = {
|
|
200
|
-
name,
|
|
201
|
-
command: raw.command,
|
|
202
|
-
exitCode: raw.exitCode,
|
|
203
|
-
stderr: raw.stderr || undefined,
|
|
204
|
-
...meta,
|
|
205
|
-
};
|
|
206
|
-
|
|
207
|
-
if (raw.errorMessage) {
|
|
208
|
-
const error = classifyError(raw.errorMessage);
|
|
209
|
-
return { ...base, ...error, message: raw.errorMessage };
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
if (raw.parsed && (raw.parsed.status === 0 || raw.exitCode === 0)) {
|
|
213
|
-
const count = extractCount(raw.parsed);
|
|
214
|
-
const sample = extractSuccessSample(raw.parsed);
|
|
215
|
-
const details = extractDetails(raw.parsed);
|
|
216
|
-
let state = 'ok';
|
|
217
|
-
if (count !== null) {
|
|
218
|
-
state = count > 0 ? 'enabled_populated' : 'enabled_empty';
|
|
219
|
-
}
|
|
220
|
-
if (raw.parsed?.result?.status === 'ok') {
|
|
221
|
-
state = 'ok';
|
|
222
|
-
}
|
|
223
|
-
return {
|
|
224
|
-
...base,
|
|
225
|
-
state,
|
|
226
|
-
count,
|
|
227
|
-
sample: sample ?? undefined,
|
|
228
|
-
details,
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const message = raw.parsed?.message || raw.stdout || raw.stderr || `Command failed with exit code ${raw.exitCode}`;
|
|
233
|
-
const error = classifyError(message);
|
|
234
|
-
return { ...base, ...error, message };
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
function summarizePhase(checks) {
|
|
238
|
-
const states = Object.values(checks).map((check) => check.state);
|
|
239
|
-
if (states.length === 0) return 'skipped';
|
|
240
|
-
if (states.every((state) => state === 'skipped')) return 'skipped';
|
|
241
|
-
const hasSuccess = states.some((state) => ['ok', 'enabled_empty', 'enabled_populated'].includes(state));
|
|
242
|
-
const hasPopulated = states.includes('enabled_populated');
|
|
243
|
-
const hasBlocking = states.some((state) => ['feature_gated', 'query_service_unavailable', 'request_failed', 'table_not_found', 'timeout', 'unknown_error'].includes(state));
|
|
244
|
-
if (hasSuccess && hasBlocking) return 'partial';
|
|
245
|
-
if (hasPopulated) return 'ready';
|
|
246
|
-
if (hasSuccess) return 'ready_empty';
|
|
247
|
-
if (states.every((state) => state === 'feature_gated')) return 'feature_gated';
|
|
248
|
-
if (states.every((state) => state === 'query_service_unavailable')) return 'query_unavailable';
|
|
249
|
-
if (states.every((state) => ['request_failed', 'timeout', 'unknown_error'].includes(state))) return 'blocked';
|
|
250
|
-
return 'unknown';
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
function guidanceFromProbe(scope, probe) {
|
|
254
|
-
if (!probe) return [];
|
|
255
|
-
if (['ok', 'enabled_empty', 'enabled_populated', 'skipped'].includes(probe.state)) return [];
|
|
256
|
-
|
|
257
|
-
if (probe.state === 'runtime_missing') {
|
|
258
|
-
return [
|
|
259
|
-
'Install or relink the community sf data360 runtime before attempting Data Cloud work.',
|
|
260
|
-
'Use python3 ~/.claude/sf-skills-install.py --with-datacloud-runtime or bash ./scripts/bootstrap-plugin.sh.',
|
|
261
|
-
];
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
if (probe.state === 'query_service_unavailable') {
|
|
265
|
-
return [
|
|
266
|
-
`${scope}: query-specific tenant lookup failed. Do not treat this as a global Data Cloud outage by itself. Re-check core probes such as data-space list, dmo list, and doctor, then use a known table name if you retry query describe.`,
|
|
267
|
-
];
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
if (probe.state === 'feature_gated') {
|
|
271
|
-
return [`${scope}: ${probe.reason}`];
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
if (probe.state === 'table_not_found') {
|
|
275
|
-
return [`${scope}: ${probe.reason}`];
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
if (probe.state === 'request_failed') {
|
|
279
|
-
return [
|
|
280
|
-
`${scope}: ${probe.reason}`,
|
|
281
|
-
'If doctor is the failing probe, remember that it only checks search indexes; use adjacent read-only probes before deciding the whole org is blocked.',
|
|
282
|
-
];
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
if (probe.state === 'timeout') {
|
|
286
|
-
return [`${scope}: ${probe.reason}`];
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
return [`${scope}: ${probe.reason}`];
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
function parseOrgDisplay(raw, targetOrg) {
|
|
293
|
-
const base = {
|
|
294
|
-
alias: targetOrg,
|
|
295
|
-
state: 'ok',
|
|
296
|
-
};
|
|
297
|
-
|
|
298
|
-
if (raw.errorMessage) {
|
|
299
|
-
return { ...base, state: 'org_not_authenticated', message: raw.errorMessage };
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
if (raw.parsed && raw.parsed.status === 0) {
|
|
303
|
-
const result = raw.parsed.result || {};
|
|
304
|
-
return {
|
|
305
|
-
...base,
|
|
306
|
-
alias: result.alias || targetOrg,
|
|
307
|
-
username: result.username,
|
|
308
|
-
instanceUrl: result.instanceUrl,
|
|
309
|
-
apiVersion: result.apiVersion,
|
|
310
|
-
connectedStatus: result.connectedStatus,
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
const message = raw.parsed?.message || raw.stdout || raw.stderr || `Failed to resolve org ${targetOrg}`;
|
|
315
|
-
return {
|
|
316
|
-
...base,
|
|
317
|
-
state: 'org_not_authenticated',
|
|
318
|
-
message,
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
function buildProbeMatrix(orgAlias, describeTable) {
|
|
323
|
-
return {
|
|
324
|
-
core: {
|
|
325
|
-
doctor: ['data360', 'doctor', '-o', orgAlias],
|
|
326
|
-
dataSpaces: ['data360', 'data-space', 'list', '-o', orgAlias],
|
|
327
|
-
dmos: ['data360', 'dmo', 'list', '-o', orgAlias],
|
|
328
|
-
},
|
|
329
|
-
phases: {
|
|
330
|
-
connect: {
|
|
331
|
-
connectorCatalog: ['data360', 'connection', 'connector-list', '-o', orgAlias],
|
|
332
|
-
connectionsSalesforceCRM: ['data360', 'connection', 'list', '-o', orgAlias, '--connector-type', 'SalesforceCRM'],
|
|
333
|
-
},
|
|
334
|
-
prepare: {
|
|
335
|
-
dataStreams: ['data360', 'data-stream', 'list', '-o', orgAlias],
|
|
336
|
-
dlos: ['data360', 'dlo', 'list', '-o', orgAlias],
|
|
337
|
-
},
|
|
338
|
-
harmonize: {
|
|
339
|
-
dmos: ['data360', 'dmo', 'list', '-o', orgAlias],
|
|
340
|
-
identityResolution: ['data360', 'identity-resolution', 'list', '-o', orgAlias],
|
|
341
|
-
},
|
|
342
|
-
segment: {
|
|
343
|
-
segments: ['data360', 'segment', 'list', '-o', orgAlias],
|
|
344
|
-
calculatedInsights: ['data360', 'calculated-insight', 'list', '-o', orgAlias],
|
|
345
|
-
},
|
|
346
|
-
act: {
|
|
347
|
-
activationPlatforms: ['data360', 'activation', 'platforms', '-o', orgAlias],
|
|
348
|
-
activationTargets: ['data360', 'activation-target', 'list', '-o', orgAlias],
|
|
349
|
-
dataActionTargets: ['data360', 'data-action-target', 'list', '-o', orgAlias],
|
|
350
|
-
},
|
|
351
|
-
retrieve: {
|
|
352
|
-
searchIndexes: ['data360', 'search-index', 'list', '-o', orgAlias],
|
|
353
|
-
queryDescribe: describeTable
|
|
354
|
-
? ['data360', 'query', 'describe', '-o', orgAlias, '--table', describeTable]
|
|
355
|
-
: null,
|
|
356
|
-
},
|
|
357
|
-
},
|
|
358
|
-
};
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
function printTextReport(report) {
|
|
362
|
-
const lines = [];
|
|
363
|
-
lines.push(`Data Cloud readiness for ${report.org.alias}`);
|
|
364
|
-
lines.push(`Runtime: ${report.runtime.state}`);
|
|
365
|
-
if (report.runtime.message) lines.push(` ${report.runtime.message}`);
|
|
366
|
-
lines.push(`Org auth: ${report.org.state}`);
|
|
367
|
-
if (report.org.username) lines.push(` User: ${report.org.username}`);
|
|
368
|
-
if (report.org.instanceUrl) lines.push(` Instance: ${report.org.instanceUrl}`);
|
|
369
|
-
lines.push('');
|
|
370
|
-
lines.push('Core probes:');
|
|
371
|
-
for (const [name, probe] of Object.entries(report.core)) {
|
|
372
|
-
lines.push(` - ${name}: ${probe.state}${probe.count !== null && probe.count !== undefined ? ` (${probe.count})` : ''}`);
|
|
373
|
-
if (probe.code) lines.push(` code: ${probe.code}`);
|
|
374
|
-
if (probe.message) lines.push(` ${probe.message}`);
|
|
375
|
-
}
|
|
376
|
-
lines.push('');
|
|
377
|
-
lines.push('Phase readiness:');
|
|
378
|
-
for (const [phase, entry] of Object.entries(report.phases)) {
|
|
379
|
-
lines.push(` ${phase}: ${entry.summary}`);
|
|
380
|
-
for (const [name, probe] of Object.entries(entry.checks)) {
|
|
381
|
-
lines.push(` - ${name}: ${probe.state}${probe.count !== null && probe.count !== undefined ? ` (${probe.count})` : ''}`);
|
|
382
|
-
if (probe.code) lines.push(` code: ${probe.code}`);
|
|
383
|
-
if (probe.message) lines.push(` ${probe.message}`);
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
lines.push('');
|
|
387
|
-
lines.push('Caveats:');
|
|
388
|
-
for (const caveat of report.caveats) {
|
|
389
|
-
lines.push(` - ${caveat}`);
|
|
390
|
-
}
|
|
391
|
-
lines.push('');
|
|
392
|
-
lines.push('Guidance:');
|
|
393
|
-
if (report.guidance.length === 0) {
|
|
394
|
-
lines.push(' - No blocking issues detected from the chosen probes. Continue with read-only inspection, then mutate intentionally.');
|
|
395
|
-
} else {
|
|
396
|
-
for (const item of report.guidance) {
|
|
397
|
-
lines.push(` - ${item}`);
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
console.log(lines.join('\n'));
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
function main() {
|
|
404
|
-
let args;
|
|
405
|
-
try {
|
|
406
|
-
args = parseArgs(process.argv.slice(2));
|
|
407
|
-
} catch (error) {
|
|
408
|
-
console.error(error.message);
|
|
409
|
-
console.error('');
|
|
410
|
-
console.error(HELP);
|
|
411
|
-
process.exit(1);
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
if (args.help) {
|
|
415
|
-
console.log(HELP);
|
|
416
|
-
process.exit(0);
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
if (!args.targetOrg) {
|
|
420
|
-
console.error('Missing required --target-org / -o argument.');
|
|
421
|
-
console.error('');
|
|
422
|
-
console.error(HELP);
|
|
423
|
-
process.exit(1);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
const runtimeCheck = runCommand('sf', ['data360', 'man'], { json: false, timeoutSeconds: args.timeout });
|
|
427
|
-
const runtime = runtimeCheck.exitCode === 0
|
|
428
|
-
? { state: 'ok', command: runtimeCheck.command }
|
|
429
|
-
: { ...classifyError(runtimeCheck.stderr || runtimeCheck.stdout || runtimeCheck.errorMessage || 'sf data360 runtime is unavailable'), command: runtimeCheck.command };
|
|
430
|
-
|
|
431
|
-
const orgDisplay = parseOrgDisplay(
|
|
432
|
-
runCommand('sf', ['org', 'display', '-o', args.targetOrg], { json: true, timeoutSeconds: args.timeout }),
|
|
433
|
-
args.targetOrg
|
|
434
|
-
);
|
|
435
|
-
|
|
436
|
-
const matrix = buildProbeMatrix(args.targetOrg, args.describeTable);
|
|
437
|
-
const report = {
|
|
438
|
-
runtime,
|
|
439
|
-
org: orgDisplay,
|
|
440
|
-
core: {},
|
|
441
|
-
phases: {},
|
|
442
|
-
caveats: [...CAVEATS],
|
|
443
|
-
guidance: [],
|
|
444
|
-
};
|
|
445
|
-
|
|
446
|
-
if (runtime.state !== 'ok' || orgDisplay.state !== 'ok') {
|
|
447
|
-
report.guidance.push(...guidanceFromProbe('runtime', runtime));
|
|
448
|
-
if (orgDisplay.state !== 'ok') {
|
|
449
|
-
report.guidance.push(`Authenticate the target org first: sf org login web -a ${args.targetOrg}`);
|
|
450
|
-
}
|
|
451
|
-
if (args.json) {
|
|
452
|
-
console.log(JSON.stringify(report, null, 2));
|
|
453
|
-
} else {
|
|
454
|
-
printTextReport(report);
|
|
455
|
-
}
|
|
456
|
-
process.exit(runtime.state === 'ok' && orgDisplay.state === 'ok' ? 0 : 1);
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
for (const [name, commandArgs] of Object.entries(matrix.core)) {
|
|
460
|
-
report.core[name] = normalizeProbe(name, runCommand('sf', commandArgs, { json: true, timeoutSeconds: args.timeout }));
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
const selectedPhases = args.phase === 'all'
|
|
464
|
-
? Object.keys(matrix.phases)
|
|
465
|
-
: [args.phase];
|
|
466
|
-
|
|
467
|
-
for (const phase of selectedPhases) {
|
|
468
|
-
const checks = {};
|
|
469
|
-
const phaseMatrix = matrix.phases[phase] || {};
|
|
470
|
-
for (const [name, commandArgs] of Object.entries(phaseMatrix)) {
|
|
471
|
-
if (!commandArgs) {
|
|
472
|
-
checks[name] = { name, state: 'skipped', reason: 'No describe table was supplied for the query probe.' };
|
|
473
|
-
continue;
|
|
474
|
-
}
|
|
475
|
-
checks[name] = normalizeProbe(name, runCommand('sf', commandArgs, { json: true, timeoutSeconds: args.timeout }));
|
|
476
|
-
}
|
|
477
|
-
report.phases[phase] = {
|
|
478
|
-
summary: summarizePhase(checks),
|
|
479
|
-
checks,
|
|
480
|
-
};
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
const uniqueGuidance = new Set();
|
|
484
|
-
for (const [name, probe] of Object.entries(report.core)) {
|
|
485
|
-
for (const item of guidanceFromProbe(`core.${name}`, probe)) uniqueGuidance.add(item);
|
|
486
|
-
}
|
|
487
|
-
for (const [phase, entry] of Object.entries(report.phases)) {
|
|
488
|
-
for (const [name, probe] of Object.entries(entry.checks)) {
|
|
489
|
-
for (const item of guidanceFromProbe(`${phase}.${name}`, probe)) uniqueGuidance.add(item);
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
const coreSignals = Object.values(report.core).map((probe) => probe.state);
|
|
494
|
-
if (coreSignals.some((state) => ['ok', 'enabled_empty', 'enabled_populated'].includes(state))) {
|
|
495
|
-
uniqueGuidance.add('At least one core Data Cloud probe succeeded. Treat individual query or feature-gate failures as scoped issues, not automatic proof that the whole product is disabled.');
|
|
496
|
-
}
|
|
497
|
-
uniqueGuidance.add('For core provisioning, tenant creation, or license assignment gaps, use Setup → Data Cloud Setup and the current standard Data Cloud permission sets. Feature Manager can expose some org-specific toggles, but it is not the source of truth for every missing capability.');
|
|
498
|
-
uniqueGuidance.add('Reference: skills/orchestrating-datacloud/references/feature-readiness.md');
|
|
499
|
-
|
|
500
|
-
report.guidance = [...uniqueGuidance];
|
|
501
|
-
|
|
502
|
-
if (args.json) {
|
|
503
|
-
console.log(JSON.stringify(report, null, 2));
|
|
504
|
-
} else {
|
|
505
|
-
printTextReport(report);
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
process.exit(0);
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
main();
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Generate oclif.manifest.json for the sf-cli-plugin-data360 community plugin.
|
|
4
|
-
*
|
|
5
|
-
* Why this exists:
|
|
6
|
-
* `npx oclif manifest` imports every command class, which triggers the
|
|
7
|
-
* @oclif/core class hierarchy. When the plugin's pinned @oclif/core is
|
|
8
|
-
* older than what the current Node.js version expects, the import fails
|
|
9
|
-
* with "Cannot read properties of undefined (reading 'prototype')".
|
|
10
|
-
*
|
|
11
|
-
* This script avoids importing commands entirely. It walks the compiled
|
|
12
|
-
* lib/commands/ directory and extracts static metadata from source text
|
|
13
|
-
* via regex, producing a valid manifest that tells oclif to skip
|
|
14
|
-
* auto-discovery and auto-transpilation.
|
|
15
|
-
*
|
|
16
|
-
* Usage:
|
|
17
|
-
* node generate-manifest.mjs # uses cwd
|
|
18
|
-
* node generate-manifest.mjs /path/to # uses explicit plugin root
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import { readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';
|
|
22
|
-
import { join, relative, sep } from 'node:path';
|
|
23
|
-
|
|
24
|
-
const pluginRoot = process.argv[2] || process.cwd();
|
|
25
|
-
const pkg = JSON.parse(readFileSync(join(pluginRoot, 'package.json'), 'utf8'));
|
|
26
|
-
const commandsDir = join(pluginRoot, (pkg.oclif?.commands || './lib/commands').replace('./', ''));
|
|
27
|
-
|
|
28
|
-
function walk(dir) {
|
|
29
|
-
const files = [];
|
|
30
|
-
for (const entry of readdirSync(dir)) {
|
|
31
|
-
const full = join(dir, entry);
|
|
32
|
-
if (statSync(full).isDirectory()) files.push(...walk(full));
|
|
33
|
-
else if (entry.endsWith('.js') && !entry.endsWith('.test.js')) files.push(full);
|
|
34
|
-
}
|
|
35
|
-
return files;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function parseCommandSource(source, id) {
|
|
39
|
-
const cmd = { id, pluginName: pkg.name, pluginType: 'link', aliases: [] };
|
|
40
|
-
|
|
41
|
-
const summaryMatch = source.match(/static\s+summary\s*=\s*['"`]([^'"`]+)/);
|
|
42
|
-
if (summaryMatch) cmd.summary = summaryMatch[1];
|
|
43
|
-
|
|
44
|
-
const descMatch = source.match(/static\s+description\s*=\s*['"`]([^'"`]+)/);
|
|
45
|
-
if (descMatch) cmd.description = descMatch[1];
|
|
46
|
-
|
|
47
|
-
if (/static\s+hidden\s*=\s*true/.test(source)) cmd.hidden = true;
|
|
48
|
-
if (/static\s+strict\s*=\s*false/.test(source)) cmd.strict = false;
|
|
49
|
-
if (/static\s+enableJsonFlag\s*=\s*true/.test(source)) cmd.enableJsonFlag = true;
|
|
50
|
-
|
|
51
|
-
return cmd;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const commands = {};
|
|
55
|
-
for (const file of walk(commandsDir)) {
|
|
56
|
-
const rel = relative(commandsDir, file).replace(/\.js$/, '');
|
|
57
|
-
const id = rel.split(sep).join(':');
|
|
58
|
-
try {
|
|
59
|
-
commands[id] = parseCommandSource(readFileSync(file, 'utf8'), id);
|
|
60
|
-
} catch {
|
|
61
|
-
commands[id] = { id, pluginName: pkg.name, pluginType: 'link', aliases: [] };
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const manifest = { version: pkg.version, commands };
|
|
66
|
-
const outPath = join(pluginRoot, 'oclif.manifest.json');
|
|
67
|
-
writeFileSync(outPath, JSON.stringify(manifest, null, 2));
|
|
68
|
-
console.log(`Generated oclif.manifest.json: ${Object.keys(commands).length} commands (v${pkg.version})`);
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
ORG="${1:-}"
|
|
5
|
-
|
|
6
|
-
if ! command -v sf >/dev/null 2>&1; then
|
|
7
|
-
echo "Salesforce CLI (sf) is not installed or not on PATH." >&2
|
|
8
|
-
exit 1
|
|
9
|
-
fi
|
|
10
|
-
|
|
11
|
-
if ! sf data360 man >/dev/null 2>&1; then
|
|
12
|
-
echo "The community 'sf data360' runtime is not available." >&2
|
|
13
|
-
echo "Run bash ./scripts/bootstrap-plugin.sh first." >&2
|
|
14
|
-
exit 1
|
|
15
|
-
fi
|
|
16
|
-
|
|
17
|
-
echo "✓ sf data360 runtime detected"
|
|
18
|
-
|
|
19
|
-
if [[ -n "${ORG}" ]]; then
|
|
20
|
-
if sf org display -o "${ORG}" >/dev/null 2>&1; then
|
|
21
|
-
echo "✓ org alias '${ORG}' is authenticated"
|
|
22
|
-
else
|
|
23
|
-
echo "Org alias '${ORG}' is not authenticated." >&2
|
|
24
|
-
exit 1
|
|
25
|
-
fi
|
|
26
|
-
|
|
27
|
-
if sf data360 doctor -o "${ORG}" >/dev/null 2>&1; then
|
|
28
|
-
echo "✓ sf data360 doctor completed for '${ORG}'"
|
|
29
|
-
else
|
|
30
|
-
echo "! sf data360 doctor did not complete cleanly for '${ORG}'. Falling back to read-only smoke checks." >&2
|
|
31
|
-
|
|
32
|
-
smoke_passed=0
|
|
33
|
-
while IFS='|' read -r label command; do
|
|
34
|
-
[[ -z "${label}" ]] && continue
|
|
35
|
-
if bash -lc "${command}" >/dev/null 2>&1; then
|
|
36
|
-
echo "✓ ${label} smoke check passed for '${ORG}'"
|
|
37
|
-
smoke_passed=1
|
|
38
|
-
fi
|
|
39
|
-
done <<EOF
|
|
40
|
-
connectors|sf data360 connection connector-list -o "${ORG}"
|
|
41
|
-
dmos|sf data360 dmo list --all -o "${ORG}"
|
|
42
|
-
segments|sf data360 segment list -o "${ORG}"
|
|
43
|
-
data-action-targets|sf data360 data-action-target list -o "${ORG}"
|
|
44
|
-
EOF
|
|
45
|
-
|
|
46
|
-
if [[ "${smoke_passed}" -ne 1 ]]; then
|
|
47
|
-
echo "No fallback Data Cloud smoke checks succeeded for '${ORG}'. Check org access and Data Cloud provisioning." >&2
|
|
48
|
-
exit 1
|
|
49
|
-
fi
|
|
50
|
-
|
|
51
|
-
echo "! Doctor remains advisory for partially provisioned orgs; at least one read-only Data Cloud command succeeded." >&2
|
|
52
|
-
fi
|
|
53
|
-
fi
|
|
54
|
-
|
|
55
|
-
echo "Verification complete."
|
|
56
|
-
if [[ -n "${ORG}" ]]; then
|
|
57
|
-
echo "Next: node ./scripts/diagnose-org.mjs -o '${ORG}' --json"
|
|
58
|
-
fi
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# data360-prepare
|
|
2
|
-
|
|
3
|
-
Ingestion and lake-preparation workflows for Salesforce Data Cloud.
|
|
4
|
-
|
|
5
|
-
## Use this skill for
|
|
6
|
-
|
|
7
|
-
- data streams
|
|
8
|
-
- Data Lake Objects (DLOs)
|
|
9
|
-
- data transforms
|
|
10
|
-
- Document AI setup and extraction
|
|
11
|
-
- unstructured ingestion and re-scan workflows
|
|
12
|
-
- deciding how a source dataset should enter Data Cloud
|
|
13
|
-
- classifying a dataset as `Profile`, `Engagement`, or `Other`
|
|
14
|
-
- using the Ingestion API send-data example after connector setup
|
|
15
|
-
|
|
16
|
-
## Example requests
|
|
17
|
-
|
|
18
|
-
```text
|
|
19
|
-
"Create a Data Cloud stream from Contact"
|
|
20
|
-
"Inspect the DLO created by this stream"
|
|
21
|
-
"Help me create a transform for ingested data"
|
|
22
|
-
"Re-run this SharePoint document stream so it picks up new files"
|
|
23
|
-
"Show me how to send records to Data Cloud through the Ingestion API"
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Common commands
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
sf data360 data-stream list -o myorg 2>/dev/null
|
|
30
|
-
sf data360 data-stream create-from-object -o myorg --object Contact --connection SalesforceDotCom_Home 2>/dev/null
|
|
31
|
-
sf data360 data-stream run -o myorg --name Contact_Home 2>/dev/null
|
|
32
|
-
sf data360 dlo get -o myorg --name Contact_Home__dll 2>/dev/null
|
|
33
|
-
sf data360 transform list -o myorg 2>/dev/null
|
|
34
|
-
sf data360 connection run-existing -o myorg --name <connection-id> 2>/dev/null
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Key reminders
|
|
38
|
-
|
|
39
|
-
- confirm whether a dataset should be treated as `Profile`, `Engagement`, or `Other` before creating the stream
|
|
40
|
-
- `data-stream run` is the preferred re-scan path for unstructured document ingestion
|
|
41
|
-
- `connection run-existing` is a connection-level rerun and is not a full substitute for stream refresh
|
|
42
|
-
- some external database and Ingestion API stream-creation flows still require UI setup
|
|
43
|
-
- initial unstructured DLO setup can be richer in the UI than in a minimal CLI payload
|
|
44
|
-
- use the local [examples/ingestion-api/](examples/ingestion-api/) folder for the send-data flow
|
|
45
|
-
|
|
46
|
-
## References
|
|
47
|
-
|
|
48
|
-
- [SKILL.md](SKILL.md)
|
|
49
|
-
- [examples/ingestion-api/README.md](examples/ingestion-api/README.md)
|
|
50
|
-
- [../data360-orchestrate/assets/definitions/data-stream.template.json](../data360-orchestrate/assets/definitions/data-stream.template.json)
|