@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,287 @@
|
|
|
1
|
+
<!-- Parent: debugging-apex-logs/SKILL.md -->
|
|
2
|
+
# Apex Benchmarking Guide
|
|
3
|
+
|
|
4
|
+
Performance testing is essential for writing efficient Apex code. This guide covers reliable benchmarking techniques and real-world performance data based on established Apex community practices and Salesforce governor limit behavior.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Why Benchmark?
|
|
9
|
+
|
|
10
|
+
"Premature optimization is the root of all evil" - but **informed optimization** is essential. Benchmarking answers:
|
|
11
|
+
|
|
12
|
+
1. **Which approach is faster?** (Loop styles, data structures)
|
|
13
|
+
2. **Will this scale?** (200 records vs 10,000)
|
|
14
|
+
3. **Where are the bottlenecks?** (CPU, heap, SOQL)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Apex Benchmarking Technique
|
|
19
|
+
|
|
20
|
+
The recommended approach for reliable Apex performance testing:
|
|
21
|
+
|
|
22
|
+
### The Pattern
|
|
23
|
+
|
|
24
|
+
```apex
|
|
25
|
+
// Run in Anonymous Apex for consistent environment
|
|
26
|
+
Long startTime = System.currentTimeMillis();
|
|
27
|
+
|
|
28
|
+
// Your code to benchmark
|
|
29
|
+
for (Integer i = 0; i < 10000; i++) {
|
|
30
|
+
// Operation being tested
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
Long endTime = System.currentTimeMillis();
|
|
34
|
+
System.debug('Duration: ' + (endTime - startTime) + 'ms');
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Key Principles
|
|
38
|
+
|
|
39
|
+
| Principle | Why It Matters |
|
|
40
|
+
|-----------|----------------|
|
|
41
|
+
| **Use Anonymous Apex** | Consistent execution environment, no trigger interference |
|
|
42
|
+
| **Run Multiple Iterations** | Averages out JIT compilation and garbage collection |
|
|
43
|
+
| **Test at Scale** | 200 records ≠ 10,000 records in terms of performance |
|
|
44
|
+
| **Isolate the Operation** | Test one thing at a time |
|
|
45
|
+
| **Run Multiple Times** | First run often slower due to JIT compilation |
|
|
46
|
+
|
|
47
|
+
### Example: Complete Benchmark
|
|
48
|
+
|
|
49
|
+
```apex
|
|
50
|
+
// Comprehensive benchmark template
|
|
51
|
+
public class BenchmarkRunner {
|
|
52
|
+
|
|
53
|
+
public static void compareMethods() {
|
|
54
|
+
Integer iterations = 10000;
|
|
55
|
+
|
|
56
|
+
// Warm-up run (JIT compilation)
|
|
57
|
+
warmUp();
|
|
58
|
+
|
|
59
|
+
// Method A
|
|
60
|
+
Long startA = System.currentTimeMillis();
|
|
61
|
+
for (Integer i = 0; i < iterations; i++) {
|
|
62
|
+
methodA();
|
|
63
|
+
}
|
|
64
|
+
Long durationA = System.currentTimeMillis() - startA;
|
|
65
|
+
|
|
66
|
+
// Method B
|
|
67
|
+
Long startB = System.currentTimeMillis();
|
|
68
|
+
for (Integer i = 0; i < iterations; i++) {
|
|
69
|
+
methodB();
|
|
70
|
+
}
|
|
71
|
+
Long durationB = System.currentTimeMillis() - startB;
|
|
72
|
+
|
|
73
|
+
// Results
|
|
74
|
+
System.debug('Method A: ' + durationA + 'ms');
|
|
75
|
+
System.debug('Method B: ' + durationB + 'ms');
|
|
76
|
+
System.debug('Difference: ' + Math.abs(durationA - durationB) + 'ms');
|
|
77
|
+
System.debug('Winner: ' + (durationA < durationB ? 'Method A' : 'Method B'));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private static void warmUp() {
|
|
81
|
+
for (Integer i = 0; i < 100; i++) {
|
|
82
|
+
methodA();
|
|
83
|
+
methodB();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private static void methodA() { /* Implementation A */ }
|
|
88
|
+
private static void methodB() { /* Implementation B */ }
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Real-World Benchmark Results
|
|
95
|
+
|
|
96
|
+
### String Concatenation vs String.join()
|
|
97
|
+
|
|
98
|
+
From documented Apex benchmarks:
|
|
99
|
+
|
|
100
|
+
| Method | Records | Duration | Result |
|
|
101
|
+
|--------|---------|----------|--------|
|
|
102
|
+
| String `+=` in loop | 1,750 | 11,767ms | CPU LIMIT HIT |
|
|
103
|
+
| `String.join()` | 7,500 | 539ms | Still running |
|
|
104
|
+
| **Improvement** | - | **22x faster** | - |
|
|
105
|
+
|
|
106
|
+
```apex
|
|
107
|
+
// ❌ SLOW: String concatenation in loop (O(n²) string copies)
|
|
108
|
+
String result = '';
|
|
109
|
+
for (Account acc : accounts) {
|
|
110
|
+
result += acc.Name + '\n'; // Creates new string each time!
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ✅ FAST: String.join() (O(n) single allocation)
|
|
114
|
+
List<String> names = new List<String>();
|
|
115
|
+
for (Account acc : accounts) {
|
|
116
|
+
names.add(acc.Name);
|
|
117
|
+
}
|
|
118
|
+
String result = String.join(names, '\n');
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Loop Performance Comparison
|
|
122
|
+
|
|
123
|
+
From documented Apex loop benchmarks (10,000 iterations):
|
|
124
|
+
|
|
125
|
+
| Loop Type | Duration | Notes |
|
|
126
|
+
|-----------|----------|-------|
|
|
127
|
+
| While loop | ~0.4s | Fastest |
|
|
128
|
+
| Cached iterator | ~0.8s | Good alternative |
|
|
129
|
+
| For loop (index) | ~1.4s | Acceptable |
|
|
130
|
+
| Enhanced for-each | ~2.4s | Convenient but slower |
|
|
131
|
+
| Uncached iterator | CPU LIMIT | Avoid |
|
|
132
|
+
|
|
133
|
+
```apex
|
|
134
|
+
// 🏆 FASTEST: While loop
|
|
135
|
+
Iterator<Account> iter = accounts.iterator();
|
|
136
|
+
while (iter.hasNext()) {
|
|
137
|
+
Account acc = iter.next();
|
|
138
|
+
// process
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// ✅ GOOD: Traditional for loop
|
|
142
|
+
for (Integer i = 0; i < accounts.size(); i++) {
|
|
143
|
+
Account acc = accounts[i];
|
|
144
|
+
// process
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ⚠️ CONVENIENT BUT SLOWER: Enhanced for-each
|
|
148
|
+
for (Account acc : accounts) {
|
|
149
|
+
// process - OK for small collections
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Map vs List Lookup
|
|
154
|
+
|
|
155
|
+
| Operation | Complexity | 10,000 lookups |
|
|
156
|
+
|-----------|------------|----------------|
|
|
157
|
+
| List.contains() | O(n) | ~500ms |
|
|
158
|
+
| Set.contains() | O(1) | ~5ms |
|
|
159
|
+
| Map.containsKey() | O(1) | ~5ms |
|
|
160
|
+
|
|
161
|
+
```apex
|
|
162
|
+
// ❌ SLOW: List lookup
|
|
163
|
+
List<Id> processedIds = new List<Id>();
|
|
164
|
+
for (Account acc : accounts) {
|
|
165
|
+
if (!processedIds.contains(acc.Id)) { // O(n) each time!
|
|
166
|
+
processedIds.add(acc.Id);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ✅ FAST: Set lookup
|
|
171
|
+
Set<Id> processedIds = new Set<Id>();
|
|
172
|
+
for (Account acc : accounts) {
|
|
173
|
+
if (!processedIds.contains(acc.Id)) { // O(1) constant time
|
|
174
|
+
processedIds.add(acc.Id);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Governor Limit Ceilings
|
|
182
|
+
|
|
183
|
+
### Official Limits
|
|
184
|
+
|
|
185
|
+
| Limit | Synchronous | Asynchronous |
|
|
186
|
+
|-------|-------------|--------------|
|
|
187
|
+
| CPU Time | 10,000 ms | 60,000 ms |
|
|
188
|
+
| Heap Size | 6 MB | 12 MB |
|
|
189
|
+
| SOQL Queries | 100 | 200 |
|
|
190
|
+
| DML Statements | 150 | 150 |
|
|
191
|
+
|
|
192
|
+
### Practical Thresholds
|
|
193
|
+
|
|
194
|
+
| Limit | Warning (80%) | Critical (95%) |
|
|
195
|
+
|-------|---------------|----------------|
|
|
196
|
+
| CPU Time | 8,000 ms | 9,500 ms |
|
|
197
|
+
| Heap Size | 4.8 MB | 5.7 MB |
|
|
198
|
+
| SOQL Queries | 80 | 95 |
|
|
199
|
+
|
|
200
|
+
### Runtime Limit Checking
|
|
201
|
+
|
|
202
|
+
```apex
|
|
203
|
+
public void processWithSafety(List<Account> accounts) {
|
|
204
|
+
Integer cpuWarning = 8000;
|
|
205
|
+
Integer heapWarning = 4800000;
|
|
206
|
+
|
|
207
|
+
for (Account acc : accounts) {
|
|
208
|
+
// Check before each operation
|
|
209
|
+
if (Limits.getCpuTime() > cpuWarning) {
|
|
210
|
+
System.debug(LoggingLevel.WARN,
|
|
211
|
+
'CPU approaching limit: ' + Limits.getCpuTime() + 'ms');
|
|
212
|
+
// Consider switching to async or chunking
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (Limits.getHeapSize() > heapWarning) {
|
|
217
|
+
System.debug(LoggingLevel.WARN,
|
|
218
|
+
'Heap approaching limit: ' + Limits.getHeapSize() + ' bytes');
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
processAccount(acc);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## Benchmarking Anti-Patterns
|
|
230
|
+
|
|
231
|
+
### ❌ Don't Do These
|
|
232
|
+
|
|
233
|
+
| Anti-Pattern | Problem | Solution |
|
|
234
|
+
|--------------|---------|----------|
|
|
235
|
+
| Testing in triggers | Inconsistent environment | Use Anonymous Apex |
|
|
236
|
+
| Single iteration | JIT variance affects results | Run 1000+ iterations |
|
|
237
|
+
| Testing with 10 records | Doesn't reveal O(n²) issues | Test with 200+ records |
|
|
238
|
+
| Ignoring warm-up | First run skewed by JIT | Add warm-up phase |
|
|
239
|
+
| Mixing operations | Can't isolate bottleneck | Test one thing at a time |
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## Benchmarking Checklist
|
|
244
|
+
|
|
245
|
+
Before optimizing, verify:
|
|
246
|
+
|
|
247
|
+
- [ ] Ran benchmark multiple times (3-5 runs)
|
|
248
|
+
- [ ] Used 1000+ iterations for micro-benchmarks
|
|
249
|
+
- [ ] Tested with production-scale data (200+ records)
|
|
250
|
+
- [ ] Included warm-up phase
|
|
251
|
+
- [ ] Ran in Anonymous Apex (not test context)
|
|
252
|
+
- [ ] Compared both approaches fairly
|
|
253
|
+
- [ ] Considered readability trade-offs
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## When NOT to Optimize
|
|
258
|
+
|
|
259
|
+
Sometimes clarity beats performance:
|
|
260
|
+
|
|
261
|
+
```apex
|
|
262
|
+
// More readable, negligible performance difference for small collections
|
|
263
|
+
for (Account acc : accounts) {
|
|
264
|
+
acc.Description = acc.Name + ' - Updated';
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// vs micro-optimized but harder to read
|
|
268
|
+
Iterator<Account> iter = accounts.iterator();
|
|
269
|
+
while (iter.hasNext()) {
|
|
270
|
+
Account acc = iter.next();
|
|
271
|
+
acc.Description = acc.Name + ' - Updated';
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**Rule of thumb**: Optimize when:
|
|
276
|
+
1. Processing 200+ records regularly
|
|
277
|
+
2. Approaching governor limits
|
|
278
|
+
3. User experience is affected
|
|
279
|
+
4. Benchmarks show measurable improvement
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## Related Resources
|
|
284
|
+
|
|
285
|
+
- [assets/benchmarking-template.cls](../assets/benchmarking-template.cls) - Ready-to-use benchmark template
|
|
286
|
+
- [assets/cpu-heap-optimization.cls](../assets/cpu-heap-optimization.cls) - Optimization patterns
|
|
287
|
+
- [Apex Log Analyzer](./log-analysis-tools.md) - Visual performance analysis
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
<!-- Parent: debugging-apex-logs/SKILL.md -->
|
|
2
|
+
# Salesforce CLI Debug Commands Reference
|
|
3
|
+
|
|
4
|
+
## Quick Reference
|
|
5
|
+
|
|
6
|
+
| Task | Command |
|
|
7
|
+
|------|---------|
|
|
8
|
+
| List recent logs | `sf apex list log --target-org my-org` |
|
|
9
|
+
| Get specific log | `sf apex get log --log-id 07Lxx0000000000` |
|
|
10
|
+
| Stream real-time | `sf apex tail log --target-org my-org` |
|
|
11
|
+
| Delete log | `sf data delete record --sobject ApexLog --record-id <id> --target-org my-org` |
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Log Retrieval
|
|
16
|
+
|
|
17
|
+
### List Available Logs
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# List all logs for current user
|
|
21
|
+
sf apex list log --target-org my-org
|
|
22
|
+
|
|
23
|
+
# JSON output for parsing
|
|
24
|
+
sf apex list log --target-org my-org --json
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Output Fields:**
|
|
28
|
+
- `Id` - Log ID for retrieval
|
|
29
|
+
- `LogUser.Name` - Who generated the log
|
|
30
|
+
- `Operation` - What triggered the log
|
|
31
|
+
- `Status` - Success/Failure
|
|
32
|
+
- `LogLength` - Size in bytes
|
|
33
|
+
- `StartTime` - When it was generated
|
|
34
|
+
|
|
35
|
+
### Get Specific Log
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# Download log by ID
|
|
39
|
+
sf apex get log \
|
|
40
|
+
--log-id 07Lxx0000000000AAA \
|
|
41
|
+
--target-org my-org
|
|
42
|
+
|
|
43
|
+
# Save to file
|
|
44
|
+
sf apex get log \
|
|
45
|
+
--log-id 07Lxx0000000000AAA \
|
|
46
|
+
--target-org my-org \
|
|
47
|
+
--output-dir ./logs
|
|
48
|
+
|
|
49
|
+
# Get most recent log
|
|
50
|
+
sf apex list log --target-org my-org --json | \
|
|
51
|
+
jq -r '.result[0].Id' | \
|
|
52
|
+
xargs -I {} sf apex get log --log-id {} --target-org my-org
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Stream Logs Real-Time
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# Tail logs with color highlighting
|
|
59
|
+
sf apex tail log --target-org my-org --color
|
|
60
|
+
|
|
61
|
+
# Tail with color highlighting
|
|
62
|
+
sf apex tail log \
|
|
63
|
+
--target-org my-org \
|
|
64
|
+
--color
|
|
65
|
+
# Note: Debug levels are configured via TraceFlag records in Setup, not CLI flags
|
|
66
|
+
|
|
67
|
+
# Tail with skip flag (don't show historical logs)
|
|
68
|
+
sf apex tail log --target-org my-org --skip-trace-flag
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Log Management
|
|
74
|
+
|
|
75
|
+
### Delete Logs
|
|
76
|
+
|
|
77
|
+
> **Note**: `sf apex log delete` does not exist in sf CLI v2. Use `sf data delete record` instead.
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Delete specific log
|
|
81
|
+
sf data delete record \
|
|
82
|
+
--sobject ApexLog \
|
|
83
|
+
--record-id 07Lxx0000000000AAA \
|
|
84
|
+
--target-org my-org
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Debug Level Configuration
|
|
90
|
+
|
|
91
|
+
### Using Trace Flags
|
|
92
|
+
|
|
93
|
+
Trace flags control what gets logged and for which users.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Create trace flag for specific user
|
|
97
|
+
sf data create record \
|
|
98
|
+
--sobject TraceFlag \
|
|
99
|
+
--values "TracedEntityId='005xx0000001234' LogType='USER_DEBUG' DebugLevelId='7dlxx0000000000' StartDate='2025-01-01T00:00:00Z' ExpirationDate='2025-01-02T00:00:00Z'" \
|
|
100
|
+
--target-org my-org
|
|
101
|
+
|
|
102
|
+
# Query existing trace flags
|
|
103
|
+
sf data query \
|
|
104
|
+
--query "SELECT Id, TracedEntityId, DebugLevel.MasterLabel, ExpirationDate FROM TraceFlag" \
|
|
105
|
+
--target-org my-org
|
|
106
|
+
|
|
107
|
+
# Delete trace flag
|
|
108
|
+
sf data delete record \
|
|
109
|
+
--sobject TraceFlag \
|
|
110
|
+
--record-id 7tfxx0000000000AAA \
|
|
111
|
+
--target-org my-org
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Debug Levels
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
# List available debug levels
|
|
118
|
+
sf data query \
|
|
119
|
+
--query "SELECT Id, MasterLabel, ApexCode, ApexProfiling, Callout, Database, System, Workflow FROM DebugLevel" \
|
|
120
|
+
--target-org my-org
|
|
121
|
+
|
|
122
|
+
# Create custom debug level
|
|
123
|
+
sf data create record \
|
|
124
|
+
--sobject DebugLevel \
|
|
125
|
+
--values "MasterLabel='PerformanceDebug' DeveloperName='PerformanceDebug' ApexCode='FINE' ApexProfiling='FINEST' Database='FINE' System='DEBUG'" \
|
|
126
|
+
--target-org my-org
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Advanced Usage
|
|
132
|
+
|
|
133
|
+
### Execute Anonymous with Logging
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
# Run anonymous Apex and capture log
|
|
137
|
+
echo "System.debug('Test'); Account a = [SELECT Id FROM Account LIMIT 1];" | \
|
|
138
|
+
sf apex run --target-org my-org
|
|
139
|
+
|
|
140
|
+
# Run from file
|
|
141
|
+
sf apex run \
|
|
142
|
+
--file ./scripts/debug-script.apex \
|
|
143
|
+
--target-org my-org
|
|
144
|
+
|
|
145
|
+
# Get the log from that execution
|
|
146
|
+
sf apex list log --target-org my-org --json | \
|
|
147
|
+
jq -r '.result[0].Id' | \
|
|
148
|
+
xargs -I {} sf apex get log --log-id {} --target-org my-org
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Query Plan Analysis
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# Analyze query plan using Tooling API
|
|
155
|
+
sf data query \
|
|
156
|
+
--query "SELECT Id FROM Account WHERE Name = 'Test'" \
|
|
157
|
+
--target-org my-org \
|
|
158
|
+
--use-tooling-api
|
|
159
|
+
# Note: --explain does not exist. Use REST API for query plans:
|
|
160
|
+
# GET /services/data/v66.0/query/?explain=SELECT+Id+FROM+Account+WHERE+Name='Test'
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Log Analysis with grep
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# Find SOQL queries in log
|
|
167
|
+
sf apex get log --log-id 07Lxx0000000000 --target-org my-org | \
|
|
168
|
+
rg "SOQL_EXECUTE"
|
|
169
|
+
|
|
170
|
+
# Count SOQL queries
|
|
171
|
+
sf apex get log --log-id 07Lxx0000000000 --target-org my-org | \
|
|
172
|
+
rg -c "SOQL_EXECUTE_BEGIN"
|
|
173
|
+
|
|
174
|
+
# Find exceptions
|
|
175
|
+
sf apex get log --log-id 07Lxx0000000000 --target-org my-org | \
|
|
176
|
+
rg "EXCEPTION_THROWN|FATAL_ERROR"
|
|
177
|
+
|
|
178
|
+
# Find limit usage
|
|
179
|
+
sf apex get log --log-id 07Lxx0000000000 --target-org my-org | \
|
|
180
|
+
rg "LIMIT_USAGE"
|
|
181
|
+
|
|
182
|
+
# Find slow operations (method timing)
|
|
183
|
+
sf apex get log --log-id 07Lxx0000000000 --target-org my-org | \
|
|
184
|
+
rg "METHOD_EXIT.*\|([0-9]{4,})\|"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Automation Scripts
|
|
190
|
+
|
|
191
|
+
### Save and Analyze Latest Log
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
#!/bin/bash
|
|
195
|
+
# save-latest-log.sh
|
|
196
|
+
|
|
197
|
+
ORG_ALIAS=${1:-"my-org"}
|
|
198
|
+
OUTPUT_DIR=${2:-"./logs"}
|
|
199
|
+
|
|
200
|
+
mkdir -p $OUTPUT_DIR
|
|
201
|
+
|
|
202
|
+
# Get latest log ID
|
|
203
|
+
LOG_ID=$(sf apex list log --target-org $ORG_ALIAS --json | jq -r '.result[0].Id')
|
|
204
|
+
|
|
205
|
+
if [ "$LOG_ID" == "null" ]; then
|
|
206
|
+
echo "No logs found"
|
|
207
|
+
exit 1
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
# Save log
|
|
211
|
+
FILENAME="$OUTPUT_DIR/$(date +%Y%m%d_%H%M%S)_$LOG_ID.log"
|
|
212
|
+
sf apex get log --log-id $LOG_ID --target-org $ORG_ALIAS > $FILENAME
|
|
213
|
+
|
|
214
|
+
echo "Log saved to: $FILENAME"
|
|
215
|
+
|
|
216
|
+
# Quick analysis
|
|
217
|
+
echo ""
|
|
218
|
+
echo "=== QUICK ANALYSIS ==="
|
|
219
|
+
echo "SOQL Queries: $(rg -c 'SOQL_EXECUTE_BEGIN' $FILENAME || echo 0)"
|
|
220
|
+
echo "DML Statements: $(rg -c 'DML_BEGIN' $FILENAME || echo 0)"
|
|
221
|
+
echo "Exceptions: $(rg -c 'EXCEPTION_THROWN|FATAL_ERROR' $FILENAME || echo 0)"
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Monitor for Errors
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
#!/bin/bash
|
|
228
|
+
# monitor-errors.sh
|
|
229
|
+
|
|
230
|
+
ORG_ALIAS=${1:-"my-org"}
|
|
231
|
+
|
|
232
|
+
echo "Monitoring $ORG_ALIAS for errors..."
|
|
233
|
+
echo "Press Ctrl+C to stop"
|
|
234
|
+
|
|
235
|
+
sf apex tail log --target-org $ORG_ALIAS --color 2>&1 | \
|
|
236
|
+
while read line; do
|
|
237
|
+
if echo "$line" | rg -q "EXCEPTION|FATAL_ERROR|LimitException"; then
|
|
238
|
+
echo "🔴 ERROR DETECTED: $line"
|
|
239
|
+
# Optional: Send alert
|
|
240
|
+
# osascript -e 'display notification "Error in Salesforce" with title "debugging-apex-logs"'
|
|
241
|
+
fi
|
|
242
|
+
done
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Bulk Log Cleanup
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
#!/bin/bash
|
|
249
|
+
# cleanup-logs.sh
|
|
250
|
+
|
|
251
|
+
ORG_ALIAS=${1:-"my-org"}
|
|
252
|
+
DAYS_OLD=${2:-7}
|
|
253
|
+
|
|
254
|
+
echo "Deleting logs older than $DAYS_OLD days from $ORG_ALIAS..."
|
|
255
|
+
|
|
256
|
+
# Get old log IDs
|
|
257
|
+
OLD_LOGS=$(sf data query \
|
|
258
|
+
--query "SELECT Id FROM ApexLog WHERE StartTime < LAST_N_DAYS:$DAYS_OLD" \
|
|
259
|
+
--target-org $ORG_ALIAS \
|
|
260
|
+
--json | jq -r '.result.records[].Id')
|
|
261
|
+
|
|
262
|
+
COUNT=0
|
|
263
|
+
for LOG_ID in $OLD_LOGS; do
|
|
264
|
+
sf data delete record --sobject ApexLog --record-id $LOG_ID --target-org $ORG_ALIAS --json > /dev/null
|
|
265
|
+
((COUNT++))
|
|
266
|
+
done
|
|
267
|
+
|
|
268
|
+
echo "Deleted $COUNT logs"
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Troubleshooting
|
|
274
|
+
|
|
275
|
+
### No Logs Appearing
|
|
276
|
+
|
|
277
|
+
1. **Check trace flags exist:**
|
|
278
|
+
```bash
|
|
279
|
+
sf data query \
|
|
280
|
+
--query "SELECT Id, TracedEntityId, ExpirationDate FROM TraceFlag WHERE ExpirationDate > TODAY" \
|
|
281
|
+
--target-org my-org
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
2. **Check log retention:**
|
|
285
|
+
```bash
|
|
286
|
+
sf data query \
|
|
287
|
+
--query "SELECT Id, StartTime FROM ApexLog ORDER BY StartTime DESC LIMIT 5" \
|
|
288
|
+
--target-org my-org
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
3. **Verify user has API access:**
|
|
292
|
+
- User must have "API Enabled" permission
|
|
293
|
+
- User must have "Author Apex" for trace flags
|
|
294
|
+
|
|
295
|
+
### Log Too Large
|
|
296
|
+
|
|
297
|
+
Logs over 2MB are truncated. Solutions:
|
|
298
|
+
|
|
299
|
+
1. **Reduce debug level:**
|
|
300
|
+
```
|
|
301
|
+
ApexCode: DEBUG → INFO
|
|
302
|
+
ApexProfiling: FINEST → FINE
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
2. **Focus on specific operation:**
|
|
306
|
+
- Create trace flag just before the operation
|
|
307
|
+
- Delete after capturing
|
|
308
|
+
|
|
309
|
+
3. **Use targeted logging:**
|
|
310
|
+
- Add `System.debug()` only where needed
|
|
311
|
+
- Use `LoggingLevel.ERROR` for critical info
|
|
312
|
+
|
|
313
|
+
### Logs Not Persisting
|
|
314
|
+
|
|
315
|
+
Default log retention is 24 hours. To keep logs longer:
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
# Export log to file immediately
|
|
319
|
+
sf apex get log --log-id 07Lxx0000000000 --target-org my-org > ./saved-log.txt
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Integration with debugging-apex-logs Skill
|
|
325
|
+
|
|
326
|
+
The debugging-apex-logs skill automatically:
|
|
327
|
+
|
|
328
|
+
1. **Fetches logs** when you run `sf apex get log` or `sf apex tail log`
|
|
329
|
+
2. **Parses content** for SOQL in loops, DML in loops, exceptions
|
|
330
|
+
3. **Displays analysis** with governor limit usage
|
|
331
|
+
4. **Suggests fixes** using sf-apex skill integration
|
|
332
|
+
|
|
333
|
+
Example workflow:
|
|
334
|
+
```bash
|
|
335
|
+
# Run a test that generates a log
|
|
336
|
+
sf apex run test --class-names MyTestClass --target-org my-org
|
|
337
|
+
|
|
338
|
+
# Get the log (debugging-apex-logs hook auto-analyzes)
|
|
339
|
+
sf apex list log --target-org my-org --json | \
|
|
340
|
+
jq -r '.result[0].Id' | \
|
|
341
|
+
xargs -I {} sf apex get log --log-id {} --target-org my-org
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
The hook will output analysis like:
|
|
345
|
+
```
|
|
346
|
+
============================================================
|
|
347
|
+
🔍 DEBUG LOG ANALYSIS
|
|
348
|
+
============================================================
|
|
349
|
+
|
|
350
|
+
🔴 CRITICAL ISSUES
|
|
351
|
+
------------------------------------------------------------
|
|
352
|
+
• SOQL in loop detected: 50 queries executed inside loops
|
|
353
|
+
• CPU limit critical: 9500/10000ms (95.0%)
|
|
354
|
+
|
|
355
|
+
📊 GOVERNOR LIMIT USAGE
|
|
356
|
+
------------------------------------------------------------
|
|
357
|
+
✅ SOQL Queries: 50/100 (50.0%)
|
|
358
|
+
✅ DML Statements: 25/150 (16.7%)
|
|
359
|
+
🔴 CPU Time (ms): 9500/10000 (95.0%)
|
|
360
|
+
|
|
361
|
+
🤖 AGENTIC FIX RECOMMENDATIONS
|
|
362
|
+
============================================================
|
|
363
|
+
|
|
364
|
+
For SOQL in loop:
|
|
365
|
+
1. Move query BEFORE the loop
|
|
366
|
+
2. Store results in Map<Id, SObject>
|
|
367
|
+
3. Access from Map inside loop
|
|
368
|
+
```
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Common Debug Log Issues
|
|
2
|
+
|
|
3
|
+
## SOQL in loop
|
|
4
|
+
|
|
5
|
+
**Signals**
|
|
6
|
+
- repeating `SOQL_EXECUTE_BEGIN`
|
|
7
|
+
- query appears inside repeated method path
|
|
8
|
+
|
|
9
|
+
**Fix pattern**
|
|
10
|
+
- query once outside the loop
|
|
11
|
+
- use `Map<Id, SObject>` or grouped collections
|
|
12
|
+
|
|
13
|
+
## DML in loop
|
|
14
|
+
|
|
15
|
+
**Signals**
|
|
16
|
+
- repeated `DML_BEGIN`
|
|
17
|
+
- high DML statement count for small transactions
|
|
18
|
+
|
|
19
|
+
**Fix pattern**
|
|
20
|
+
- collect changes
|
|
21
|
+
- do one bulk DML operation
|
|
22
|
+
|
|
23
|
+
## Non-selective query
|
|
24
|
+
|
|
25
|
+
**Signals**
|
|
26
|
+
- high rows scanned
|
|
27
|
+
- slow query timing
|
|
28
|
+
- table-scan indicators
|
|
29
|
+
|
|
30
|
+
**Fix pattern**
|
|
31
|
+
- add indexed filters
|
|
32
|
+
- reduce scope
|
|
33
|
+
- use query-plan guidance
|
|
34
|
+
|
|
35
|
+
## CPU pressure
|
|
36
|
+
|
|
37
|
+
**Signals**
|
|
38
|
+
- CPU usage trending toward sync limit
|
|
39
|
+
- repeated expensive helper methods
|
|
40
|
+
- nested loops / repeated string work
|
|
41
|
+
|
|
42
|
+
**Fix pattern**
|
|
43
|
+
- reduce algorithmic complexity
|
|
44
|
+
- cache repeated work
|
|
45
|
+
- move heavy processing async where appropriate
|
|
46
|
+
|
|
47
|
+
## Heap pressure
|
|
48
|
+
|
|
49
|
+
**Signals**
|
|
50
|
+
- large collection allocations
|
|
51
|
+
- heap usage approaching sync limit
|
|
52
|
+
|
|
53
|
+
**Fix pattern**
|
|
54
|
+
- use SOQL for-loops
|
|
55
|
+
- reduce in-memory object size
|
|
56
|
+
- clear collections when done
|
|
57
|
+
|
|
58
|
+
## Null pointer / unhandled exceptions
|
|
59
|
+
|
|
60
|
+
**Signals**
|
|
61
|
+
- `EXCEPTION_THROWN`
|
|
62
|
+
- `FATAL_ERROR`
|
|
63
|
+
- clear stack trace with line numbers
|
|
64
|
+
|
|
65
|
+
**Fix pattern**
|
|
66
|
+
- guard null values
|
|
67
|
+
- make assumptions explicit
|
|
68
|
+
- improve result handling for empty query results
|