@salesforce/afv-skills 1.8.0 → 1.9.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/activating-datacloud/CREDITS.md +5 -0
- package/skills/activating-datacloud/README.md +39 -0
- package/skills/activating-datacloud/SKILL.md +118 -0
- package/skills/analyzing-omnistudio-dependencies/CREDITS.md +5 -0
- package/skills/analyzing-omnistudio-dependencies/SKILL.md +477 -0
- package/skills/analyzing-omnistudio-dependencies/references/dependency-patterns.md +508 -0
- package/skills/analyzing-omnistudio-dependencies/references/namespace-guide.md +300 -0
- package/skills/building-omnistudio-callable-apex/CREDITS.md +9 -0
- package/skills/building-omnistudio-callable-apex/README.md +80 -0
- package/skills/building-omnistudio-callable-apex/SKILL.md +276 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_callable_openinterface.cls +40 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_callable_vanilla.cls +32 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_migration.cls +54 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_openinterface.cls +45 -0
- package/skills/building-omnistudio-callable-apex/assets/pattern_test_class.cls +65 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls +115 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls +189 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/TRANSCRIPT.md +115 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls +74 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls +146 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls +16 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md +120 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls +7 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls +73 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls +128 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls +23 -0
- package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md +75 -0
- package/skills/building-omnistudio-datamapper/CREDITS.md +5 -0
- package/skills/building-omnistudio-datamapper/SKILL.md +270 -0
- package/skills/building-omnistudio-datamapper/assets/completion-summary-template.md +28 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-extract.json +6 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-item.json +12 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-load.json +6 -0
- package/skills/building-omnistudio-datamapper/assets/omni-data-transform-transform.json +6 -0
- package/skills/building-omnistudio-datamapper/references/best-practices.md +277 -0
- package/skills/building-omnistudio-datamapper/references/naming-conventions.md +145 -0
- package/skills/building-omnistudio-flexcard/CREDITS.md +5 -0
- package/skills/building-omnistudio-flexcard/SKILL.md +325 -0
- package/skills/building-omnistudio-flexcard/assets/omni-ui-card.json +10 -0
- package/skills/building-omnistudio-flexcard/references/best-practices.md +291 -0
- package/skills/building-omnistudio-flexcard/references/data-binding-guide.md +311 -0
- package/skills/building-omnistudio-flexcard/references/scoring-rubric.md +66 -0
- package/skills/building-omnistudio-flexcard/scripts/flexcard-commands.sh +24 -0
- package/skills/building-omnistudio-integration-procedure/CREDITS.md +5 -0
- package/skills/building-omnistudio-integration-procedure/SKILL.md +275 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-dr-extract.json +10 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-set-values.json +10 -0
- package/skills/building-omnistudio-integration-procedure/assets/omni-process-ip.json +12 -0
- package/skills/building-omnistudio-integration-procedure/assets/scoring-report-format.txt +14 -0
- package/skills/building-omnistudio-integration-procedure/references/best-practices.md +388 -0
- package/skills/building-omnistudio-integration-procedure/references/element-types.md +588 -0
- package/skills/building-omnistudio-integration-procedure/scripts/cli-commands.sh +18 -0
- package/skills/building-omnistudio-omniscript/CREDITS.md +5 -0
- package/skills/building-omnistudio-omniscript/SKILL.md +367 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-element-step.json +10 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-element-text-block.json +11 -0
- package/skills/building-omnistudio-omniscript/assets/omni-process-omniscript.json +12 -0
- package/skills/building-omnistudio-omniscript/references/best-practices.md +480 -0
- package/skills/building-omnistudio-omniscript/references/element-types.md +1172 -0
- package/skills/building-omnistudio-omniscript/scripts/check-duplicate-omniscript.sh +13 -0
- package/skills/building-omnistudio-omniscript/scripts/cli-reference.sh +21 -0
- package/skills/building-omnistudio-omniscript/scripts/deploy-omniscript.sh +29 -0
- package/skills/building-sf-integrations/CREDITS.md +5 -0
- package/skills/building-sf-integrations/README.md +95 -0
- package/skills/building-sf-integrations/SKILL.md +192 -0
- package/skills/building-sf-integrations/assets/callouts/callout-retry-handler.cls +167 -0
- package/skills/building-sf-integrations/assets/callouts/http-response-handler.cls +257 -0
- package/skills/building-sf-integrations/assets/callouts/rest-queueable-callout.cls +262 -0
- package/skills/building-sf-integrations/assets/callouts/rest-sync-callout.cls +211 -0
- package/skills/building-sf-integrations/assets/cdc/cdc-handler.cls +246 -0
- package/skills/building-sf-integrations/assets/cdc/cdc-subscriber-trigger.trigger +139 -0
- package/skills/building-sf-integrations/assets/endpoint-security/example.cspTrustedSite-meta.xml +58 -0
- package/skills/building-sf-integrations/assets/endpoint-security/example.remoteSite-meta.xml +39 -0
- package/skills/building-sf-integrations/assets/external-credentials/jwt-external-credential.externalCredential-meta.xml +90 -0
- package/skills/building-sf-integrations/assets/external-credentials/oauth-external-credential.externalCredential-meta.xml +87 -0
- package/skills/building-sf-integrations/assets/external-services/external-service-operations.md +221 -0
- package/skills/building-sf-integrations/assets/external-services/openapi-registration.externalServiceRegistration-meta.xml +193 -0
- package/skills/building-sf-integrations/assets/named-credentials/certificate-auth.namedCredential-meta.xml +62 -0
- package/skills/building-sf-integrations/assets/named-credentials/custom-auth.namedCredential-meta.xml +71 -0
- package/skills/building-sf-integrations/assets/named-credentials/oauth-client-credentials.namedCredential-meta.xml +51 -0
- package/skills/building-sf-integrations/assets/named-credentials/oauth-jwt-bearer.namedCredential-meta.xml +67 -0
- package/skills/building-sf-integrations/assets/platform-events/event-publisher.cls +191 -0
- package/skills/building-sf-integrations/assets/platform-events/event-subscriber-action.cls +295 -0
- package/skills/building-sf-integrations/assets/platform-events/event-subscriber-trigger.trigger +108 -0
- package/skills/building-sf-integrations/assets/platform-events/platform-event-definition.object-meta.xml +124 -0
- package/skills/building-sf-integrations/assets/soap/soap-callout-service.cls +186 -0
- package/skills/building-sf-integrations/assets/soap/wsdl2apex-guide.md +213 -0
- package/skills/building-sf-integrations/hooks/scripts/suggest_credential_setup.py +271 -0
- package/skills/building-sf-integrations/hooks/scripts/validate_integration.py +363 -0
- package/skills/building-sf-integrations/references/callout-patterns.md +719 -0
- package/skills/building-sf-integrations/references/cdc-guide.md +288 -0
- package/skills/building-sf-integrations/references/cli-reference.md +94 -0
- package/skills/building-sf-integrations/references/event-driven-architecture-guide.md +266 -0
- package/skills/building-sf-integrations/references/event-patterns.md +838 -0
- package/skills/building-sf-integrations/references/external-services-guide.md +303 -0
- package/skills/building-sf-integrations/references/messaging-api-v2.md +609 -0
- package/skills/building-sf-integrations/references/named-credentials-automation.md +201 -0
- package/skills/building-sf-integrations/references/named-credentials-guide.md +173 -0
- package/skills/building-sf-integrations/references/platform-events-guide.md +288 -0
- package/skills/building-sf-integrations/references/rest-callout-patterns.md +288 -0
- package/skills/building-sf-integrations/references/scoring-rubric.md +59 -0
- package/skills/building-sf-integrations/references/security-best-practices.md +248 -0
- package/skills/building-sf-integrations/scripts/README.md +100 -0
- package/skills/building-sf-integrations/scripts/configure-named-credential.sh +236 -0
- package/skills/building-sf-integrations/scripts/set-api-credential.sh +146 -0
- package/skills/building-sf-integrations/scripts/templates/setup-credentials-with-csp.sh +158 -0
- package/skills/configuring-connected-apps/CREDITS.md +3 -0
- package/skills/configuring-connected-apps/README.md +99 -0
- package/skills/configuring-connected-apps/SKILL.md +224 -0
- package/skills/configuring-connected-apps/assets/connected-app-basic.xml +29 -0
- package/skills/configuring-connected-apps/assets/connected-app-canvas.xml +62 -0
- package/skills/configuring-connected-apps/assets/connected-app-jwt.xml +49 -0
- package/skills/configuring-connected-apps/assets/connected-app-oauth.xml +65 -0
- package/skills/configuring-connected-apps/assets/eca-global-oauth.xml +36 -0
- package/skills/configuring-connected-apps/assets/eca-oauth-settings.xml +36 -0
- package/skills/configuring-connected-apps/assets/eca-policies.xml +36 -0
- package/skills/configuring-connected-apps/assets/external-client-app.xml +35 -0
- package/skills/configuring-connected-apps/references/example-usage.md +256 -0
- package/skills/configuring-connected-apps/references/migration-guide.md +328 -0
- package/skills/configuring-connected-apps/references/oauth-flows-reference.md +660 -0
- package/skills/configuring-connected-apps/references/security-checklist.md +209 -0
- package/skills/configuring-connected-apps/references/testing-validation-guide.md +275 -0
- package/skills/connecting-datacloud/CREDITS.md +5 -0
- package/skills/connecting-datacloud/README.md +59 -0
- package/skills/connecting-datacloud/SKILL.md +155 -0
- package/skills/connecting-datacloud/examples/connections/heroku-postgres.json +15 -0
- package/skills/connecting-datacloud/examples/connections/ingest-api-connection.json +5 -0
- package/skills/connecting-datacloud/examples/connections/ingest-api-schema.json +31 -0
- package/skills/connecting-datacloud/examples/connections/redshift.json +16 -0
- package/skills/connecting-datacloud/examples/connections/sharepoint-unstructured.json +20 -0
- package/skills/connecting-datacloud/examples/connections/snowflake-connection.json +42 -0
- package/skills/debugging-apex-logs/CREDITS.md +22 -0
- package/skills/debugging-apex-logs/README.md +74 -0
- package/skills/debugging-apex-logs/SKILL.md +172 -0
- package/skills/debugging-apex-logs/assets/benchmarking-template.cls +327 -0
- package/skills/debugging-apex-logs/assets/cpu-heap-optimization.cls +307 -0
- package/skills/debugging-apex-logs/assets/dml-in-loop-fix.cls +219 -0
- package/skills/debugging-apex-logs/assets/null-pointer-fix.cls +252 -0
- package/skills/debugging-apex-logs/assets/soql-in-loop-fix.cls +157 -0
- package/skills/debugging-apex-logs/references/analysis-playbook.md +53 -0
- package/skills/debugging-apex-logs/references/benchmarking-guide.md +287 -0
- package/skills/debugging-apex-logs/references/cli-commands.md +368 -0
- package/skills/debugging-apex-logs/references/common-issues.md +68 -0
- package/skills/debugging-apex-logs/references/debug-log-reference.md +328 -0
- package/skills/debugging-apex-logs/references/log-analysis-tools.md +248 -0
- package/skills/debugging-apex-logs/references/scoring-rubric.md +21 -0
- package/skills/deploying-metadata/CREDITS.md +25 -0
- package/skills/deploying-metadata/README.md +104 -0
- package/skills/deploying-metadata/SKILL.md +214 -0
- package/skills/deploying-metadata/assets/destructiveChanges.xml +143 -0
- package/skills/deploying-metadata/assets/package.xml +121 -0
- package/skills/deploying-metadata/references/agent-deployment-guide.md +628 -0
- package/skills/deploying-metadata/references/deploy.sh +73 -0
- package/skills/deploying-metadata/references/deployment-report-template.md +89 -0
- package/skills/deploying-metadata/references/deployment-workflows.md +395 -0
- package/skills/deploying-metadata/references/orchestration.md +183 -0
- package/skills/deploying-metadata/references/trigger-deployment-safety.md +376 -0
- package/skills/deploying-omnistudio-datapacks/CREDITS.md +5 -0
- package/skills/deploying-omnistudio-datapacks/README.md +88 -0
- package/skills/deploying-omnistudio-datapacks/SKILL.md +174 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/TRANSCRIPT.md +124 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/deploy-business-internet-plus-bundle.yaml +11 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/TRANSCRIPT.md +142 -0
- package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/deploy-business-internet-plus-bundle.yaml +10 -0
- package/skills/deploying-omnistudio-datapacks/references/job-file-template.md +42 -0
- package/skills/deploying-omnistudio-datapacks/references/troubleshooting-matrix.md +24 -0
- package/skills/developing-agentforce/assets/metadata/http-callout-flow.flow-meta.xml +1 -1
- package/skills/developing-agentforce/references/actions-reference.md +8 -8
- package/skills/fetching-salesforce-docs/README.md +66 -0
- package/skills/fetching-salesforce-docs/SKILL.md +209 -0
- package/skills/fetching-salesforce-docs/requirements.txt +2 -0
- package/skills/fetching-salesforce-docs/scripts/extract_help_salesforce.py +497 -0
- package/skills/fetching-salesforce-docs/scripts/extract_salesforce_doc.py +357 -0
- package/skills/fetching-salesforce-docs/scripts/runtime_bootstrap.py +58 -0
- package/skills/generating-apex/CREDITS.md +1 -26
- package/skills/generating-apex-test/CREDITS.md +2 -27
- package/skills/generating-lwc-components/CREDITS.md +5 -0
- package/skills/generating-lwc-components/README.md +126 -0
- package/skills/generating-lwc-components/SKILL.md +191 -0
- package/skills/generating-lwc-components/assets/apex-controller/LwcController.cls +327 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.css +72 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.html +111 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.js +163 -0
- package/skills/generating-lwc-components/assets/basic-component/basicComponent.js-meta.xml +137 -0
- package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.html +111 -0
- package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.js +367 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.css +63 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.html +154 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js +348 -0
- package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js-meta.xml +87 -0
- package/skills/generating-lwc-components/assets/form-component/formComponent.html +165 -0
- package/skills/generating-lwc-components/assets/form-component/formComponent.js +275 -0
- package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.html +100 -0
- package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.js +336 -0
- package/skills/generating-lwc-components/assets/jest-test/componentName.test.js.example +371 -0
- package/skills/generating-lwc-components/assets/message-channel/RecordSelected.messageChannel-meta.xml +71 -0
- package/skills/generating-lwc-components/assets/message-channel/lmsPublisher.js +103 -0
- package/skills/generating-lwc-components/assets/message-channel/lmsSubscriber.js +181 -0
- package/skills/generating-lwc-components/assets/modal-component/modalComponent.html +85 -0
- package/skills/generating-lwc-components/assets/modal-component/modalComponent.js +199 -0
- package/skills/generating-lwc-components/assets/record-picker/recordPicker.html +55 -0
- package/skills/generating-lwc-components/assets/record-picker/recordPicker.js +199 -0
- package/skills/generating-lwc-components/assets/state-store/store.js +282 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.css +65 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.html +95 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.js-meta.xml +75 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.test.ts.example +301 -0
- package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.ts +295 -0
- package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.html +71 -0
- package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.js +316 -0
- package/skills/generating-lwc-components/hooks/scripts/lwc-lsp-validate.py +295 -0
- package/skills/generating-lwc-components/hooks/scripts/post-tool-validate.py +347 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/deprecated_patterns.json +74 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/styling_hooks.json +111 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_data/valid_slds_classes.json +127 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_linter_wrapper.py +294 -0
- package/skills/generating-lwc-components/hooks/scripts/slds_rules/__init__.py +22 -0
- package/skills/generating-lwc-components/hooks/scripts/template_validator.py +332 -0
- package/skills/generating-lwc-components/hooks/scripts/validate_slds.py +595 -0
- package/skills/generating-lwc-components/references/accessibility-guide.md +843 -0
- package/skills/generating-lwc-components/references/advanced-features.md +108 -0
- package/skills/generating-lwc-components/references/async-notification-patterns.md +661 -0
- package/skills/generating-lwc-components/references/cli-commands.md +545 -0
- package/skills/generating-lwc-components/references/component-patterns.md +1476 -0
- package/skills/generating-lwc-components/references/flow-integration-guide.md +675 -0
- package/skills/generating-lwc-components/references/jest-testing.md +1011 -0
- package/skills/generating-lwc-components/references/lms-guide.md +860 -0
- package/skills/generating-lwc-components/references/lwc-best-practices.md +1310 -0
- package/skills/generating-lwc-components/references/performance-guide.md +861 -0
- package/skills/generating-lwc-components/references/scoring-and-testing.md +116 -0
- package/skills/generating-lwc-components/references/slds-blueprints.json +14389 -0
- package/skills/generating-lwc-components/references/slds-design-guide.md +166 -0
- package/skills/generating-lwc-components/references/state-management.md +642 -0
- package/skills/generating-lwc-components/references/template-anti-patterns.md +948 -0
- package/skills/generating-lwc-components/references/triangle-pattern.md +365 -0
- package/skills/generating-lwc-components/scripts/local-dev-preview.sh +34 -0
- package/skills/generating-mermaid-diagrams/CREDITS.md +46 -0
- package/skills/generating-mermaid-diagrams/README.md +114 -0
- package/skills/generating-mermaid-diagrams/SKILL.md +218 -0
- package/skills/generating-mermaid-diagrams/assets/agentforce/agent-flow.md +313 -0
- package/skills/generating-mermaid-diagrams/assets/architecture/system-landscape.md +351 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/b2b-commerce-erd.md +317 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/campaigns-erd.md +195 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/consent-erd.md +262 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/files-erd.md +266 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/forecasting-erd.md +261 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/fsl-erd.md +332 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/party-model-erd.md +237 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/quote-order-erd.md +277 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/revenue-cloud-erd.md +343 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/sales-cloud-erd.md +192 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/salesforce-erd.md +209 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/scheduler-erd.md +276 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/service-cloud-erd.md +217 -0
- package/skills/generating-mermaid-diagrams/assets/datamodel/territory-management-erd.md +241 -0
- package/skills/generating-mermaid-diagrams/assets/integration/api-sequence.md +387 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code-pkce.md +197 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code.md +152 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/client-credentials.md +233 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/device-authorization.md +295 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/jwt-bearer.md +256 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/refresh-token.md +281 -0
- package/skills/generating-mermaid-diagrams/assets/oauth/user-agent-social-sign-on.md +281 -0
- package/skills/generating-mermaid-diagrams/assets/role-hierarchy/user-hierarchy.md +322 -0
- package/skills/generating-mermaid-diagrams/references/color-palette.md +464 -0
- package/skills/generating-mermaid-diagrams/references/diagram-conventions.md +313 -0
- package/skills/generating-mermaid-diagrams/references/erd-conventions.md +320 -0
- package/skills/generating-mermaid-diagrams/references/mermaid-reference.md +434 -0
- package/skills/generating-mermaid-diagrams/references/mermaid-styling.md +81 -0
- package/skills/generating-mermaid-diagrams/references/preview-guide.md +49 -0
- package/skills/generating-mermaid-diagrams/references/usage-examples.md +340 -0
- package/skills/generating-mermaid-diagrams/scripts/README.md +160 -0
- package/skills/generating-mermaid-diagrams/scripts/mermaid_preview.py +654 -0
- package/skills/generating-mermaid-diagrams/scripts/query-org-metadata.py +293 -0
- package/skills/generating-visual-diagrams/CREDITS.md +80 -0
- package/skills/generating-visual-diagrams/README.md +83 -0
- package/skills/generating-visual-diagrams/SKILL.md +208 -0
- package/skills/generating-visual-diagrams/assets/architecture/integration-flow.md +55 -0
- package/skills/generating-visual-diagrams/assets/erd/core-objects.md +131 -0
- package/skills/generating-visual-diagrams/assets/erd/custom-objects.md +60 -0
- package/skills/generating-visual-diagrams/assets/lwc/dashboard-card.md +45 -0
- package/skills/generating-visual-diagrams/assets/lwc/data-table.md +57 -0
- package/skills/generating-visual-diagrams/assets/lwc/record-form.md +60 -0
- package/skills/generating-visual-diagrams/assets/review/apex-review.md +57 -0
- package/skills/generating-visual-diagrams/assets/review/lwc-review.md +48 -0
- package/skills/generating-visual-diagrams/references/architect-aesthetic-guide.md +257 -0
- package/skills/generating-visual-diagrams/references/examples-index.md +35 -0
- package/skills/generating-visual-diagrams/references/gemini-cli-setup.md +65 -0
- package/skills/generating-visual-diagrams/references/interview-questions.md +529 -0
- package/skills/generating-visual-diagrams/references/iteration-workflow.md +173 -0
- package/skills/generating-visual-diagrams/scripts/check-prerequisites.sh +101 -0
- package/skills/generating-visual-diagrams/scripts/generate_image.py +243 -0
- package/skills/handling-sf-data/CREDITS.md +5 -0
- package/skills/handling-sf-data/README.md +112 -0
- package/skills/handling-sf-data/SKILL.md +235 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-10000.apex +293 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-200.apex +208 -0
- package/skills/handling-sf-data/assets/bulk/bulk-insert-500.apex +219 -0
- package/skills/handling-sf-data/assets/bulk/bulk-upsert-external-id.apex +324 -0
- package/skills/handling-sf-data/assets/cleanup/delete-by-created-date.apex +319 -0
- package/skills/handling-sf-data/assets/cleanup/delete-by-name.apex +240 -0
- package/skills/handling-sf-data/assets/cleanup/delete-test-data.apex +311 -0
- package/skills/handling-sf-data/assets/cleanup/rollback-transaction.apex +266 -0
- package/skills/handling-sf-data/assets/csv/account-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/contact-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/custom-object-import.csv +11 -0
- package/skills/handling-sf-data/assets/csv/opportunity-import.csv +11 -0
- package/skills/handling-sf-data/assets/factories/account-factory.apex +165 -0
- package/skills/handling-sf-data/assets/factories/case-factory.apex +237 -0
- package/skills/handling-sf-data/assets/factories/contact-factory.apex +168 -0
- package/skills/handling-sf-data/assets/factories/custom-object-factory.apex +260 -0
- package/skills/handling-sf-data/assets/factories/event-factory.apex +275 -0
- package/skills/handling-sf-data/assets/factories/hierarchy-factory.apex +372 -0
- package/skills/handling-sf-data/assets/factories/lead-factory.apex +190 -0
- package/skills/handling-sf-data/assets/factories/opportunity-factory.apex +206 -0
- package/skills/handling-sf-data/assets/factories/task-factory.apex +246 -0
- package/skills/handling-sf-data/assets/factories/user-factory.apex +278 -0
- package/skills/handling-sf-data/assets/json/account-contact-tree.json +130 -0
- package/skills/handling-sf-data/assets/json/account-opportunity-tree.json +110 -0
- package/skills/handling-sf-data/assets/json/full-hierarchy-tree.json +188 -0
- package/skills/handling-sf-data/assets/soql/aggregate.soql +226 -0
- package/skills/handling-sf-data/assets/soql/child-to-parent.soql +162 -0
- package/skills/handling-sf-data/assets/soql/parent-to-child.soql +153 -0
- package/skills/handling-sf-data/assets/soql/polymorphic.soql +198 -0
- package/skills/handling-sf-data/assets/soql/subquery.soql +287 -0
- package/skills/handling-sf-data/references/anonymous-apex-guide.md +98 -0
- package/skills/handling-sf-data/references/bulk-operations-guide.md +94 -0
- package/skills/handling-sf-data/references/bulk-testing-example.md +194 -0
- package/skills/handling-sf-data/references/cleanup-rollback-example.md +322 -0
- package/skills/handling-sf-data/references/cleanup-rollback-guide.md +84 -0
- package/skills/handling-sf-data/references/crud-workflow-example.md +183 -0
- package/skills/handling-sf-data/references/governor-limits-reference.md +74 -0
- package/skills/handling-sf-data/references/orchestration.md +174 -0
- package/skills/handling-sf-data/references/relationship-query-examples.md +249 -0
- package/skills/handling-sf-data/references/sf-cli-data-commands.md +158 -0
- package/skills/handling-sf-data/references/soql-relationship-guide.md +84 -0
- package/skills/handling-sf-data/references/test-data-best-practices.md +104 -0
- package/skills/handling-sf-data/references/test-data-factory-usage.md +290 -0
- package/skills/handling-sf-data/references/test-data-patterns.md +98 -0
- package/skills/handling-sf-data/scripts/soql_validator.py +292 -0
- package/skills/handling-sf-data/scripts/validate_data_operation.py +379 -0
- package/skills/harmonizing-datacloud/CREDITS.md +3 -0
- package/skills/harmonizing-datacloud/README.md +31 -0
- package/skills/harmonizing-datacloud/SKILL.md +117 -0
- package/skills/modeling-omnistudio-epc-catalog/CREDITS.md +14 -0
- package/skills/modeling-omnistudio-epc-catalog/README.md +89 -0
- package/skills/modeling-omnistudio-epc-catalog/SKILL.md +395 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/attribute-assignment-template.json +402 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/compiled-attribute-overrides-template.json +43 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/completion-block-template.txt +8 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/decomposition-relationships-template.json +233 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_AttributeAssignments.json +514 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_CompiledAttributeOverrides.json +21 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DataPack.json +649 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DecompositionRelationships.json +200 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ObjectFieldAttributes.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OrchestrationScenarios.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OverrideDefinitions.json +266 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ParentKeys.json +23 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PriceListEntries.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ProductChildItems.json +34 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_RuleAssignments.json +21 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_AttributeAssignments.json +410 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DataPack.json +535 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ObjectFieldAttributes.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_OrchestrationScenarios.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ParentKeys.json +23 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PriceListEntries.json +220 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ProductChildItems.json +414 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_AttributeAssignments.json +382 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DataPack.json +565 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ObjectFieldAttributes.json +104 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_OrchestrationScenarios.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ParentKeys.json +13 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PriceListEntries.json +106 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ProductChildItems.json +72 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_AttributeAssignments.json +142 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DataPack.json +377 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DecompositionRelationships.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ObjectFieldAttributes.json +36 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ParentKeys.json +8 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PriceListEntries.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PricebookEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ProductChildItems.json +34 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/object-field-attributes-template.json +138 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/orchestration-scenarios-template.json +54 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/override-definitions-template.json +134 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/parent-keys-template.json +29 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/price-list-entries-template.json +158 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/pricebook-entries-template.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/product-child-item-template.json +338 -0
- package/skills/modeling-omnistudio-epc-catalog/assets/product2-offer-template.json +527 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/.gitkeep +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_AttributeAssignments.json +95 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_CompiledAttributeOverrides.json +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DataPack.json +214 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DecompositionRelationships.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ObjectFieldAttributes.json +98 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OrchestrationScenarios.json +22 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OverrideDefinitions.json +1 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ParentKeys.json +13 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PriceListEntries.json +35 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PricebookEntries.json +28 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ProductChildItems.json +110 -0
- package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/TRANSCRIPT.md +58 -0
- package/skills/modeling-omnistudio-epc-catalog/references/epc-field-guide.md +90 -0
- package/skills/modeling-omnistudio-epc-catalog/references/naming-conventions.md +80 -0
- package/skills/modeling-omnistudio-epc-catalog/references/scoring-model.md +57 -0
- package/skills/modeling-omnistudio-epc-catalog/scripts/cli-validation-commands.sh +19 -0
- package/skills/modeling-omnistudio-epc-catalog/scripts/sample-invocations.sh +18 -0
- package/skills/orchestrating-datacloud/CREDITS.md +15 -0
- package/skills/orchestrating-datacloud/README.md +129 -0
- package/skills/orchestrating-datacloud/SKILL.md +236 -0
- package/skills/orchestrating-datacloud/UPSTREAM.md +45 -0
- package/skills/orchestrating-datacloud/assets/definitions/activation-target.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/activation.template.json +7 -0
- package/skills/orchestrating-datacloud/assets/definitions/calculated-insight.template.json +7 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-action-target.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-action.template.json +5 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-graph.template.json +21 -0
- package/skills/orchestrating-datacloud/assets/definitions/data-stream.template.json +55 -0
- package/skills/orchestrating-datacloud/assets/definitions/dmo.template.json +17 -0
- package/skills/orchestrating-datacloud/assets/definitions/identity-resolution.template.json +30 -0
- package/skills/orchestrating-datacloud/assets/definitions/mapping.template.json +14 -0
- package/skills/orchestrating-datacloud/assets/definitions/relationship.template.json +12 -0
- package/skills/orchestrating-datacloud/assets/definitions/search-index.template.json +9 -0
- package/skills/orchestrating-datacloud/assets/definitions/segment.template.json +16 -0
- package/skills/orchestrating-datacloud/references/feature-readiness.md +157 -0
- package/skills/orchestrating-datacloud/references/plugin-setup.md +140 -0
- package/skills/orchestrating-datacloud/scripts/bootstrap-plugin.sh +53 -0
- package/skills/orchestrating-datacloud/scripts/diagnose-org.mjs +511 -0
- package/skills/orchestrating-datacloud/scripts/generate-manifest.mjs +68 -0
- package/skills/orchestrating-datacloud/scripts/verify-plugin.sh +58 -0
- package/skills/preparing-datacloud/CREDITS.md +7 -0
- package/skills/preparing-datacloud/README.md +51 -0
- package/skills/preparing-datacloud/SKILL.md +191 -0
- package/skills/preparing-datacloud/examples/ingestion-api/.env.example +8 -0
- package/skills/preparing-datacloud/examples/ingestion-api/README.md +48 -0
- package/skills/preparing-datacloud/examples/ingestion-api/send-data.py +144 -0
- package/skills/querying-soql/CREDITS.md +21 -0
- package/skills/querying-soql/README.md +41 -0
- package/skills/querying-soql/SKILL.md +143 -0
- package/skills/querying-soql/assets/aggregate-queries.soql +242 -0
- package/skills/querying-soql/assets/basic-queries.soql +188 -0
- package/skills/querying-soql/assets/bulkified-query-pattern.cls +280 -0
- package/skills/querying-soql/assets/optimization-patterns.soql +259 -0
- package/skills/querying-soql/assets/relationship-queries.soql +203 -0
- package/skills/querying-soql/assets/selector-class.cls +219 -0
- package/skills/querying-soql/references/anti-patterns.md +348 -0
- package/skills/querying-soql/references/cli-commands.md +358 -0
- package/skills/querying-soql/references/field-coverage-rules.md +514 -0
- package/skills/querying-soql/references/query-optimization.md +142 -0
- package/skills/querying-soql/references/selector-patterns.md +479 -0
- package/skills/querying-soql/references/soql-reference.md +227 -0
- package/skills/querying-soql/references/soql-syntax-reference.md +208 -0
- package/skills/querying-soql/scripts/post-tool-validate.py +322 -0
- package/skills/retrieving-datacloud/CREDITS.md +7 -0
- package/skills/retrieving-datacloud/README.md +44 -0
- package/skills/retrieving-datacloud/SKILL.md +120 -0
- package/skills/retrieving-datacloud/examples/search-indexes/hybrid-structured.json +44 -0
- package/skills/retrieving-datacloud/examples/search-indexes/vector-knowledge.json +43 -0
- package/skills/running-apex-tests/CREDITS.md +22 -0
- package/skills/running-apex-tests/README.md +94 -0
- package/skills/running-apex-tests/SKILL.md +158 -0
- package/skills/running-apex-tests/assets/basic-test.cls +169 -0
- package/skills/running-apex-tests/assets/bulk-test.cls +255 -0
- package/skills/running-apex-tests/assets/dml-mock.cls +339 -0
- package/skills/running-apex-tests/assets/mock-callout-test.cls +353 -0
- package/skills/running-apex-tests/assets/stub-provider-example.cls +364 -0
- package/skills/running-apex-tests/assets/test-data-factory.cls +328 -0
- package/skills/running-apex-tests/hooks/scripts/parse-test-results.py +364 -0
- package/skills/running-apex-tests/references/cli-commands.md +289 -0
- package/skills/running-apex-tests/references/mocking-patterns.md +500 -0
- package/skills/running-apex-tests/references/performance-optimization.md +283 -0
- package/skills/running-apex-tests/references/test-fix-loop.md +49 -0
- package/skills/running-apex-tests/references/test-patterns.md +154 -0
- package/skills/running-apex-tests/references/testing-best-practices.md +509 -0
- package/skills/segmenting-datacloud/CREDITS.md +3 -0
- package/skills/segmenting-datacloud/README.md +36 -0
- package/skills/segmenting-datacloud/SKILL.md +115 -0
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
<!-- Parent: building-sf-integrations/SKILL.md -->
|
|
2
|
+
# REST Callout Patterns
|
|
3
|
+
|
|
4
|
+
## Overview
|
|
5
|
+
|
|
6
|
+
This guide covers patterns for making HTTP callouts from Salesforce Apex to external REST APIs.
|
|
7
|
+
|
|
8
|
+
## Synchronous vs Asynchronous
|
|
9
|
+
|
|
10
|
+
### When to Use Synchronous
|
|
11
|
+
|
|
12
|
+
- User needs immediate response
|
|
13
|
+
- Called from Visualforce, LWC, or Aura
|
|
14
|
+
- NOT triggered by DML operations
|
|
15
|
+
- Response required before next action
|
|
16
|
+
|
|
17
|
+
### When to Use Asynchronous
|
|
18
|
+
|
|
19
|
+
- Called from triggers (REQUIRED)
|
|
20
|
+
- Fire-and-forget operations
|
|
21
|
+
- Background processing
|
|
22
|
+
- Long-running operations
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
26
|
+
│ CALLOUT CONTEXT DECISION │
|
|
27
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
28
|
+
│ │
|
|
29
|
+
│ Is this called from a trigger or after DML? │
|
|
30
|
+
│ ├── YES → Use Queueable with Database.AllowsCallouts │
|
|
31
|
+
│ └── NO → Synchronous OK │
|
|
32
|
+
│ │
|
|
33
|
+
│ Does user need immediate response? │
|
|
34
|
+
│ ├── YES → Synchronous (if allowed) │
|
|
35
|
+
│ └── NO → Consider async for better UX │
|
|
36
|
+
│ │
|
|
37
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Basic Request Pattern
|
|
41
|
+
|
|
42
|
+
```apex
|
|
43
|
+
public class RestCallout {
|
|
44
|
+
|
|
45
|
+
public static HttpResponse makeRequest(String method, String endpoint, String body) {
|
|
46
|
+
HttpRequest req = new HttpRequest();
|
|
47
|
+
req.setEndpoint('callout:MyCredential' + endpoint);
|
|
48
|
+
req.setMethod(method);
|
|
49
|
+
req.setHeader('Content-Type', 'application/json');
|
|
50
|
+
req.setHeader('Accept', 'application/json');
|
|
51
|
+
req.setTimeout(120000); // 120 seconds max
|
|
52
|
+
|
|
53
|
+
if (String.isNotBlank(body)) {
|
|
54
|
+
req.setBody(body);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return new Http().send(req);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## HTTP Methods
|
|
63
|
+
|
|
64
|
+
| Method | Use Case | Body |
|
|
65
|
+
|--------|----------|------|
|
|
66
|
+
| GET | Retrieve resource | No |
|
|
67
|
+
| POST | Create resource | Yes |
|
|
68
|
+
| PUT | Full update | Yes |
|
|
69
|
+
| PATCH | Partial update | Yes |
|
|
70
|
+
| DELETE | Remove resource | Usually No |
|
|
71
|
+
|
|
72
|
+
## Response Handling
|
|
73
|
+
|
|
74
|
+
### Status Code Categories
|
|
75
|
+
|
|
76
|
+
```apex
|
|
77
|
+
Integer statusCode = response.getStatusCode();
|
|
78
|
+
|
|
79
|
+
if (statusCode >= 200 && statusCode < 300) {
|
|
80
|
+
// Success (2xx)
|
|
81
|
+
} else if (statusCode >= 400 && statusCode < 500) {
|
|
82
|
+
// Client error (4xx) - don't retry
|
|
83
|
+
} else if (statusCode >= 500) {
|
|
84
|
+
// Server error (5xx) - may retry
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Common Status Codes
|
|
89
|
+
|
|
90
|
+
| Code | Meaning | Action |
|
|
91
|
+
|------|---------|--------|
|
|
92
|
+
| 200 | OK | Process response |
|
|
93
|
+
| 201 | Created | Resource created |
|
|
94
|
+
| 204 | No Content | Success, no body |
|
|
95
|
+
| 400 | Bad Request | Fix request |
|
|
96
|
+
| 401 | Unauthorized | Check credentials |
|
|
97
|
+
| 403 | Forbidden | Check permissions |
|
|
98
|
+
| 404 | Not Found | Resource doesn't exist |
|
|
99
|
+
| 429 | Too Many Requests | Rate limited, retry later |
|
|
100
|
+
| 500 | Server Error | Retry with backoff |
|
|
101
|
+
| 503 | Service Unavailable | Retry later |
|
|
102
|
+
|
|
103
|
+
## Error Handling Pattern
|
|
104
|
+
|
|
105
|
+
```apex
|
|
106
|
+
public class ApiClient {
|
|
107
|
+
|
|
108
|
+
public static Map<String, Object> callApi(String endpoint) {
|
|
109
|
+
try {
|
|
110
|
+
HttpResponse res = makeRequest('GET', endpoint, null);
|
|
111
|
+
|
|
112
|
+
if (res.getStatusCode() == 200) {
|
|
113
|
+
return (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Handle specific errors
|
|
117
|
+
if (res.getStatusCode() == 404) {
|
|
118
|
+
throw new NotFoundException('Resource not found: ' + endpoint);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (res.getStatusCode() == 429) {
|
|
122
|
+
String retryAfter = res.getHeader('Retry-After');
|
|
123
|
+
throw new RateLimitedException('Rate limited. Retry after: ' + retryAfter);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
throw new ApiException('API Error: ' + res.getStatusCode() + ' - ' + res.getBody());
|
|
127
|
+
|
|
128
|
+
} catch (CalloutException e) {
|
|
129
|
+
// Network error, timeout, SSL error
|
|
130
|
+
throw new ApiException('Connection failed: ' + e.getMessage(), e);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
public class ApiException extends Exception {}
|
|
135
|
+
public class NotFoundException extends Exception {}
|
|
136
|
+
public class RateLimitedException extends Exception {}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Retry Pattern
|
|
141
|
+
|
|
142
|
+
```apex
|
|
143
|
+
public class RetryableCallout {
|
|
144
|
+
|
|
145
|
+
private static final Integer MAX_RETRIES = 3;
|
|
146
|
+
private static final Set<Integer> RETRYABLE_CODES = new Set<Integer>{
|
|
147
|
+
408, 429, 500, 502, 503, 504
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
public static HttpResponse callWithRetry(HttpRequest request) {
|
|
151
|
+
Integer attempts = 0;
|
|
152
|
+
|
|
153
|
+
while (attempts < MAX_RETRIES) {
|
|
154
|
+
HttpResponse res = new Http().send(request);
|
|
155
|
+
|
|
156
|
+
if (!RETRYABLE_CODES.contains(res.getStatusCode())) {
|
|
157
|
+
return res;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
attempts++;
|
|
161
|
+
System.debug('Retry ' + attempts + ' for ' + res.getStatusCode());
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
throw new CalloutException('Max retries exceeded');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Queueable Pattern (Async)
|
|
170
|
+
|
|
171
|
+
```apex
|
|
172
|
+
public class AsyncCallout implements Queueable, Database.AllowsCallouts {
|
|
173
|
+
|
|
174
|
+
private Id recordId;
|
|
175
|
+
|
|
176
|
+
public AsyncCallout(Id recordId) {
|
|
177
|
+
this.recordId = recordId;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public void execute(QueueableContext context) {
|
|
181
|
+
// Query record
|
|
182
|
+
Account acc = [SELECT Id, Name FROM Account WHERE Id = :recordId];
|
|
183
|
+
|
|
184
|
+
// Make callout
|
|
185
|
+
HttpRequest req = new HttpRequest();
|
|
186
|
+
req.setEndpoint('callout:MyAPI/accounts');
|
|
187
|
+
req.setMethod('POST');
|
|
188
|
+
req.setBody(JSON.serialize(new Map<String, Object>{
|
|
189
|
+
'name' => acc.Name,
|
|
190
|
+
'sfId' => acc.Id
|
|
191
|
+
}));
|
|
192
|
+
|
|
193
|
+
HttpResponse res = new Http().send(req);
|
|
194
|
+
|
|
195
|
+
// Update record with result
|
|
196
|
+
if (res.getStatusCode() == 201) {
|
|
197
|
+
acc.External_Id__c = extractId(res.getBody());
|
|
198
|
+
update acc;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
private String extractId(String body) {
|
|
203
|
+
Map<String, Object> result = (Map<String, Object>) JSON.deserializeUntyped(body);
|
|
204
|
+
return (String) result.get('id');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Usage from trigger:
|
|
209
|
+
// System.enqueueJob(new AsyncCallout(accountId));
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Pagination Pattern
|
|
213
|
+
|
|
214
|
+
```apex
|
|
215
|
+
public class PaginatedApiClient {
|
|
216
|
+
|
|
217
|
+
public static List<Map<String, Object>> getAllRecords(String endpoint) {
|
|
218
|
+
List<Map<String, Object>> allRecords = new List<Map<String, Object>>();
|
|
219
|
+
String nextPageUrl = endpoint;
|
|
220
|
+
|
|
221
|
+
while (String.isNotBlank(nextPageUrl)) {
|
|
222
|
+
HttpResponse res = makeRequest('GET', nextPageUrl, null);
|
|
223
|
+
Map<String, Object> response = (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
|
|
224
|
+
|
|
225
|
+
// Add records from this page
|
|
226
|
+
List<Object> records = (List<Object>) response.get('data');
|
|
227
|
+
for (Object rec : records) {
|
|
228
|
+
allRecords.add((Map<String, Object>) rec);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Get next page URL
|
|
232
|
+
nextPageUrl = (String) response.get('nextPage');
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return allRecords;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Governor Limits
|
|
241
|
+
|
|
242
|
+
| Limit | Value |
|
|
243
|
+
|-------|-------|
|
|
244
|
+
| Callouts per transaction | 100 |
|
|
245
|
+
| Maximum timeout | 120,000 ms (120 seconds) |
|
|
246
|
+
| Maximum request size | 6 MB |
|
|
247
|
+
| Maximum response size | 6 MB |
|
|
248
|
+
| Concurrent long-running requests | 10 |
|
|
249
|
+
|
|
250
|
+
## Testing Callouts
|
|
251
|
+
|
|
252
|
+
```apex
|
|
253
|
+
@isTest
|
|
254
|
+
private class ApiClientTest {
|
|
255
|
+
|
|
256
|
+
@isTest
|
|
257
|
+
static void testSuccessfulCallout() {
|
|
258
|
+
// Set mock
|
|
259
|
+
Test.setMock(HttpCalloutMock.class, new MockSuccess());
|
|
260
|
+
|
|
261
|
+
Test.startTest();
|
|
262
|
+
Map<String, Object> result = ApiClient.callApi('/endpoint');
|
|
263
|
+
Test.stopTest();
|
|
264
|
+
|
|
265
|
+
System.assertEquals('value', result.get('key'));
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
private class MockSuccess implements HttpCalloutMock {
|
|
269
|
+
public HttpResponse respond(HttpRequest req) {
|
|
270
|
+
HttpResponse res = new HttpResponse();
|
|
271
|
+
res.setStatusCode(200);
|
|
272
|
+
res.setBody('{"key": "value"}');
|
|
273
|
+
return res;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Best Practices
|
|
280
|
+
|
|
281
|
+
1. **Always use Named Credentials** - Never hardcode endpoints or credentials
|
|
282
|
+
2. **Set appropriate timeouts** - Default may be too short for slow APIs
|
|
283
|
+
3. **Handle all error cases** - Don't assume success
|
|
284
|
+
4. **Log requests and responses** - Essential for debugging
|
|
285
|
+
5. **Use async for trigger contexts** - Queueable with AllowsCallouts
|
|
286
|
+
6. **Implement retry logic** - For transient failures
|
|
287
|
+
7. **Monitor governor limits** - Especially callout count
|
|
288
|
+
8. **Parse errors gracefully** - APIs return errors in various formats
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<!-- Parent: building-sf-integrations/SKILL.md -->
|
|
2
|
+
|
|
3
|
+
# Scoring System (120 Points)
|
|
4
|
+
|
|
5
|
+
## Category Breakdown
|
|
6
|
+
|
|
7
|
+
| Category | Points | Evaluation Criteria |
|
|
8
|
+
|----------|--------|---------------------|
|
|
9
|
+
| **Security** | 30 | Named Credentials used (no hardcoded secrets), OAuth scopes minimized, certificate auth where applicable |
|
|
10
|
+
| **Error Handling** | 25 | Retry logic present, timeout handling (120s max), specific exception types, logging implemented |
|
|
11
|
+
| **Bulkification** | 20 | Batch callouts considered, CDC bulk handling, event batching for Platform Events |
|
|
12
|
+
| **Architecture** | 20 | Async patterns for DML-triggered callouts, proper service layer separation, single responsibility |
|
|
13
|
+
| **Best Practices** | 15 | Governor limit awareness, proper HTTP methods, idempotency for retries |
|
|
14
|
+
| **Documentation** | 10 | Clear intent documented, endpoint versioning noted, API contract documented |
|
|
15
|
+
|
|
16
|
+
## Scoring Thresholds
|
|
17
|
+
|
|
18
|
+
| Rating | Score Range | Description |
|
|
19
|
+
|--------|------------|-------------|
|
|
20
|
+
| Excellent | 108-120 | Production-ready, follows all best practices |
|
|
21
|
+
| Very Good | 90-107 | Minor improvements suggested |
|
|
22
|
+
| Good | 72-89 | Acceptable with noted improvements |
|
|
23
|
+
| Needs Work | 54-71 | Address issues before deployment |
|
|
24
|
+
| Block | <54 | CRITICAL issues, do not deploy |
|
|
25
|
+
|
|
26
|
+
## Scoring Output Format
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
📊 INTEGRATION SCORE: XX/120 ⭐⭐⭐⭐ Rating
|
|
30
|
+
════════════════════════════════════════════════════
|
|
31
|
+
|
|
32
|
+
🔐 Security XX/30 ████████░░ XX%
|
|
33
|
+
├─ Named Credentials used: ✅
|
|
34
|
+
├─ No hardcoded secrets: ✅
|
|
35
|
+
└─ OAuth scopes minimal: ✅
|
|
36
|
+
|
|
37
|
+
⚠️ Error Handling XX/25 ████████░░ XX%
|
|
38
|
+
├─ Retry logic: ✅
|
|
39
|
+
├─ Timeout handling: ✅
|
|
40
|
+
└─ Logging: ✅
|
|
41
|
+
|
|
42
|
+
📦 Bulkification XX/20 ████████░░ XX%
|
|
43
|
+
├─ Batch callouts: ✅
|
|
44
|
+
└─ Event batching: ✅
|
|
45
|
+
|
|
46
|
+
🏗️ Architecture XX/20 ████████░░ XX%
|
|
47
|
+
├─ Async patterns: ✅
|
|
48
|
+
└─ Service separation: ✅
|
|
49
|
+
|
|
50
|
+
✅ Best Practices XX/15 ████████░░ XX%
|
|
51
|
+
├─ Governor limits: ✅
|
|
52
|
+
└─ Idempotency: ✅
|
|
53
|
+
|
|
54
|
+
📝 Documentation XX/10 ████████░░ XX%
|
|
55
|
+
├─ Clear intent: ✅
|
|
56
|
+
└─ API versioning: ✅
|
|
57
|
+
|
|
58
|
+
════════════════════════════════════════════════════
|
|
59
|
+
```
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
<!-- Parent: building-sf-integrations/SKILL.md -->
|
|
2
|
+
# Integration Security Best Practices
|
|
3
|
+
|
|
4
|
+
## Overview
|
|
5
|
+
|
|
6
|
+
Security is critical for integrations. This guide covers best practices for securing Salesforce integrations with external systems.
|
|
7
|
+
|
|
8
|
+
## Credential Management
|
|
9
|
+
|
|
10
|
+
### DO: Use Named Credentials
|
|
11
|
+
|
|
12
|
+
```apex
|
|
13
|
+
// ✅ CORRECT - Named Credential handles auth
|
|
14
|
+
HttpRequest req = new HttpRequest();
|
|
15
|
+
req.setEndpoint('callout:MySecureAPI/resource');
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### DON'T: Hardcode Credentials
|
|
19
|
+
|
|
20
|
+
```apex
|
|
21
|
+
// ❌ WRONG - Never hardcode credentials
|
|
22
|
+
req.setHeader('Authorization', 'Bearer sk_live_abc123...');
|
|
23
|
+
req.setEndpoint('https://api.example.com');
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Credential Storage Rules
|
|
27
|
+
|
|
28
|
+
| Item | Storage Location | Never Store In |
|
|
29
|
+
|------|------------------|----------------|
|
|
30
|
+
| API Keys | Named Credential | Apex code, Custom Settings |
|
|
31
|
+
| Client Secrets | Named Credential / External Credential | Source control |
|
|
32
|
+
| Certificates | Certificate & Key Management | Static Resources |
|
|
33
|
+
| Passwords | Named Credential | Custom Metadata |
|
|
34
|
+
|
|
35
|
+
## OAuth Best Practices
|
|
36
|
+
|
|
37
|
+
### Scope Minimization
|
|
38
|
+
|
|
39
|
+
Request only necessary scopes:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
✅ read:orders write:orders
|
|
43
|
+
❌ admin:* read:* write:*
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Token Handling
|
|
47
|
+
|
|
48
|
+
- Never log access tokens
|
|
49
|
+
- Don't expose tokens in error messages
|
|
50
|
+
- Use short-lived tokens when possible
|
|
51
|
+
- Implement token refresh handling
|
|
52
|
+
|
|
53
|
+
### PKCE for Public Clients
|
|
54
|
+
|
|
55
|
+
For mobile or SPA clients:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
Use Authorization Code with PKCE, not Implicit flow
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Network Security
|
|
62
|
+
|
|
63
|
+
### Remote Site Settings
|
|
64
|
+
|
|
65
|
+
- Only allow necessary domains
|
|
66
|
+
- Don't use wildcard domains
|
|
67
|
+
- Review and audit regularly
|
|
68
|
+
|
|
69
|
+
### Certificate Validation
|
|
70
|
+
|
|
71
|
+
- Use trusted CA certificates
|
|
72
|
+
- Don't disable SSL/TLS verification
|
|
73
|
+
- Monitor certificate expiration
|
|
74
|
+
|
|
75
|
+
### IP Restrictions
|
|
76
|
+
|
|
77
|
+
For Connected Apps:
|
|
78
|
+
- Configure IP relaxation carefully
|
|
79
|
+
- Use "Enforce IP restrictions" when possible
|
|
80
|
+
|
|
81
|
+
## Input Validation
|
|
82
|
+
|
|
83
|
+
### Validate External Data
|
|
84
|
+
|
|
85
|
+
```apex
|
|
86
|
+
// Validate before processing
|
|
87
|
+
public static void processExternalData(String externalId) {
|
|
88
|
+
// Validate format
|
|
89
|
+
if (!Pattern.matches('[A-Za-z0-9]{10,20}', externalId)) {
|
|
90
|
+
throw new ValidationException('Invalid external ID format');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Sanitize for SOQL
|
|
94
|
+
String safeId = String.escapeSingleQuotes(externalId);
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Output Encoding
|
|
99
|
+
|
|
100
|
+
```apex
|
|
101
|
+
// Encode data sent to external systems
|
|
102
|
+
String encodedData = EncodingUtil.urlEncode(userData, 'UTF-8');
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Error Handling Security
|
|
106
|
+
|
|
107
|
+
### Don't Expose Internal Details
|
|
108
|
+
|
|
109
|
+
```apex
|
|
110
|
+
// ❌ WRONG - Exposes internal structure
|
|
111
|
+
throw new CalloutException('Failed: ' + response.getBody());
|
|
112
|
+
|
|
113
|
+
// ✅ CORRECT - User-friendly, log details separately
|
|
114
|
+
System.debug(LoggingLevel.ERROR, 'API Error: ' + response.getBody());
|
|
115
|
+
throw new CalloutException('Unable to complete request. Contact support.');
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Log Securely
|
|
119
|
+
|
|
120
|
+
```apex
|
|
121
|
+
// ❌ WRONG - Logs sensitive data
|
|
122
|
+
System.debug('Request: ' + JSON.serialize(request)); // May contain PII
|
|
123
|
+
|
|
124
|
+
// ✅ CORRECT - Redact sensitive fields
|
|
125
|
+
System.debug('Request to: ' + endpoint + ', Status: ' + statusCode);
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## API Security Patterns
|
|
129
|
+
|
|
130
|
+
### Rate Limiting Awareness
|
|
131
|
+
|
|
132
|
+
```apex
|
|
133
|
+
if (response.getStatusCode() == 429) {
|
|
134
|
+
String retryAfter = response.getHeader('Retry-After');
|
|
135
|
+
// Implement backoff, don't hammer the API
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Idempotency Keys
|
|
140
|
+
|
|
141
|
+
For POST requests that shouldn't duplicate:
|
|
142
|
+
|
|
143
|
+
```apex
|
|
144
|
+
req.setHeader('Idempotency-Key', generateUniqueKey());
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Request Signing
|
|
148
|
+
|
|
149
|
+
For APIs requiring signature:
|
|
150
|
+
|
|
151
|
+
```apex
|
|
152
|
+
String signature = generateHmacSignature(payload, secretKey);
|
|
153
|
+
req.setHeader('X-Signature', signature);
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## User Context Security
|
|
157
|
+
|
|
158
|
+
### Per-User vs Named Principal
|
|
159
|
+
|
|
160
|
+
| Scenario | Use |
|
|
161
|
+
|----------|-----|
|
|
162
|
+
| User-specific data access | Per-User Principal |
|
|
163
|
+
| Background/batch jobs | Named Principal |
|
|
164
|
+
| Service integrations | Named Principal |
|
|
165
|
+
| User-initiated with audit | Per-User Principal |
|
|
166
|
+
|
|
167
|
+
### Audit Logging
|
|
168
|
+
|
|
169
|
+
```apex
|
|
170
|
+
public static void logIntegrationActivity(String operation, Id userId, String externalSystem) {
|
|
171
|
+
Integration_Log__c log = new Integration_Log__c(
|
|
172
|
+
Operation__c = operation,
|
|
173
|
+
User__c = userId,
|
|
174
|
+
External_System__c = externalSystem,
|
|
175
|
+
Timestamp__c = Datetime.now()
|
|
176
|
+
);
|
|
177
|
+
insert log;
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Platform Event Security
|
|
182
|
+
|
|
183
|
+
### Sensitive Data in Events
|
|
184
|
+
|
|
185
|
+
- Don't include PII in event payloads when avoidable
|
|
186
|
+
- Use record IDs and query for details
|
|
187
|
+
- Consider encryption for sensitive fields
|
|
188
|
+
|
|
189
|
+
### Event Consumer Validation
|
|
190
|
+
|
|
191
|
+
```apex
|
|
192
|
+
trigger SecureEventHandler on My_Event__e (after insert) {
|
|
193
|
+
for (My_Event__e event : Trigger.new) {
|
|
194
|
+
// Validate event source/origin if possible
|
|
195
|
+
if (!isValidEventSource(event)) {
|
|
196
|
+
System.debug(LoggingLevel.WARN, 'Suspicious event: ' + event.ReplayId);
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
processEvent(event);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Security Checklist
|
|
205
|
+
|
|
206
|
+
### Before Deployment
|
|
207
|
+
|
|
208
|
+
- [ ] Named Credentials used for all external calls
|
|
209
|
+
- [ ] No hardcoded credentials in code
|
|
210
|
+
- [ ] OAuth scopes minimized
|
|
211
|
+
- [ ] Remote Site Settings restricted
|
|
212
|
+
- [ ] Error messages don't expose internals
|
|
213
|
+
- [ ] Sensitive data not logged
|
|
214
|
+
- [ ] Input validation implemented
|
|
215
|
+
- [ ] Rate limiting handled
|
|
216
|
+
- [ ] Certificate expiration monitored
|
|
217
|
+
|
|
218
|
+
### Regular Review
|
|
219
|
+
|
|
220
|
+
- [ ] Audit Named Credential usage
|
|
221
|
+
- [ ] Review integration user permissions
|
|
222
|
+
- [ ] Check for unused credentials
|
|
223
|
+
- [ ] Monitor integration error logs
|
|
224
|
+
- [ ] Validate certificate validity
|
|
225
|
+
- [ ] Review OAuth app authorizations
|
|
226
|
+
|
|
227
|
+
## Compliance Considerations
|
|
228
|
+
|
|
229
|
+
### GDPR / Data Privacy
|
|
230
|
+
|
|
231
|
+
- Minimize data transferred
|
|
232
|
+
- Document data flows
|
|
233
|
+
- Implement data deletion for integrated records
|
|
234
|
+
- Encrypt PII in transit and at rest
|
|
235
|
+
|
|
236
|
+
### SOC 2 / Security Audits
|
|
237
|
+
|
|
238
|
+
- Maintain integration documentation
|
|
239
|
+
- Log all external access
|
|
240
|
+
- Implement change management
|
|
241
|
+
- Regular security assessments
|
|
242
|
+
|
|
243
|
+
### HIPAA (Healthcare)
|
|
244
|
+
|
|
245
|
+
- Business Associate Agreements
|
|
246
|
+
- Encryption requirements
|
|
247
|
+
- Access logging
|
|
248
|
+
- Minimum necessary standard
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# building-sf-integrations Helper Scripts
|
|
2
|
+
|
|
3
|
+
Automation scripts for configuring Salesforce integrations without manual UI steps.
|
|
4
|
+
|
|
5
|
+
> **Mirror note:** These files mirror the canonical generic helpers in the repository root `scripts/` directory. Keep both locations aligned until the packaging layout is consolidated.
|
|
6
|
+
|
|
7
|
+
## Scripts
|
|
8
|
+
|
|
9
|
+
| Script | Purpose | Auth Type |
|
|
10
|
+
|--------|---------|-----------|
|
|
11
|
+
| `configure-named-credential.sh` | Set API keys via ConnectApi | Enhanced Named Credentials |
|
|
12
|
+
| `set-api-credential.sh` | Store keys in Custom Settings | Legacy (dev/test) |
|
|
13
|
+
|
|
14
|
+
## Quick Start
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# Enhanced Named Credentials (recommended for production)
|
|
18
|
+
./configure-named-credential.sh <external-credential-name> <principal-name> <org-alias>
|
|
19
|
+
|
|
20
|
+
# Custom Settings (legacy, for dev/test)
|
|
21
|
+
./set-api-credential.sh <setting-name> - <org-alias>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Prerequisites
|
|
25
|
+
|
|
26
|
+
- **Salesforce CLI v2+** (`sf` command)
|
|
27
|
+
- **Authenticated org** (`sf org login web -a <alias>`)
|
|
28
|
+
- **Deployed metadata** (External Credential, Named Credential, CSP)
|
|
29
|
+
|
|
30
|
+
## Usage Examples
|
|
31
|
+
|
|
32
|
+
### Configure Named Credential
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Interactive mode - prompts for API key securely
|
|
36
|
+
./configure-named-credential.sh VisualCrossingWeather weatherAPIKey MyDevOrg
|
|
37
|
+
|
|
38
|
+
# The script will:
|
|
39
|
+
# 1. Validate org connection
|
|
40
|
+
# 2. Check External Credential exists
|
|
41
|
+
# 3. Prompt for API key (hidden input)
|
|
42
|
+
# 4. Execute ConnectApi Apex to store encrypted
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Custom Settings (Legacy)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Secure input (dash prompts for hidden input)
|
|
49
|
+
./set-api-credential.sh WeatherAPI - MyDevOrg
|
|
50
|
+
|
|
51
|
+
# Direct input (less secure, for CI/CD)
|
|
52
|
+
./set-api-credential.sh WeatherAPI sk_live_abc123 MyDevOrg
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Templates
|
|
56
|
+
|
|
57
|
+
The `templates/` directory contains customizable scripts for new integrations:
|
|
58
|
+
|
|
59
|
+
| Template | Purpose |
|
|
60
|
+
|----------|---------|
|
|
61
|
+
| `setup-credentials-with-csp.sh` | Full setup with CSP Trusted Sites |
|
|
62
|
+
|
|
63
|
+
### Using Templates
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Copy template for your integration
|
|
67
|
+
cp templates/setup-credentials-with-csp.sh my-integration-setup.sh
|
|
68
|
+
|
|
69
|
+
# Edit configuration variables
|
|
70
|
+
# - SKILL_NAME
|
|
71
|
+
# - CSP_NAME
|
|
72
|
+
# - API_KEY_URL
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Auto-Run Behavior
|
|
76
|
+
|
|
77
|
+
When you create credential metadata files, Claude will automatically suggest running these scripts:
|
|
78
|
+
|
|
79
|
+
| File Pattern | Suggested Script |
|
|
80
|
+
|--------------|------------------|
|
|
81
|
+
| `*.namedCredential-meta.xml` | `configure-named-credential.sh` |
|
|
82
|
+
| `*.externalCredential-meta.xml` | `configure-named-credential.sh` |
|
|
83
|
+
|
|
84
|
+
## Troubleshooting
|
|
85
|
+
|
|
86
|
+
**"sf: command not found"**
|
|
87
|
+
- Install Salesforce CLI: `npm install -g @salesforce/cli`
|
|
88
|
+
|
|
89
|
+
**"Not authenticated"**
|
|
90
|
+
- Run: `sf org login web -a <alias>`
|
|
91
|
+
|
|
92
|
+
**"External Credential not found"**
|
|
93
|
+
- Deploy External Credential first
|
|
94
|
+
- Check developer name matches
|
|
95
|
+
|
|
96
|
+
## Related Documentation
|
|
97
|
+
|
|
98
|
+
- [Named Credentials Automation Guide](../references/named-credentials-automation.md)
|
|
99
|
+
- [Named Credentials Template Reference](../references/named-credentials-guide.md)
|
|
100
|
+
- [Security Best Practices](../references/security-best-practices.md)
|