@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,364 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Parse Apex test results and format for Claude auto-fix loop.
|
|
4
|
+
|
|
5
|
+
This hook parses the JSON output from `sf apex run test` and provides
|
|
6
|
+
structured feedback that enables Claude to automatically fix failing tests.
|
|
7
|
+
|
|
8
|
+
Environment Variables:
|
|
9
|
+
TOOL_OUTPUT: The stdout from the Bash command
|
|
10
|
+
TOOL_INPUT: The command that was executed
|
|
11
|
+
|
|
12
|
+
Output:
|
|
13
|
+
Formatted test results with failure analysis and fix suggestions
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import json
|
|
17
|
+
import os
|
|
18
|
+
import sys
|
|
19
|
+
import re
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from datetime import datetime
|
|
22
|
+
|
|
23
|
+
# Only process sf apex run test commands
|
|
24
|
+
def should_process():
|
|
25
|
+
"""Check if this is an apex test command we should process."""
|
|
26
|
+
tool_input = os.environ.get('TOOL_INPUT', '')
|
|
27
|
+
return 'sf apex run test' in tool_input or 'sf apex get test' in tool_input
|
|
28
|
+
|
|
29
|
+
def parse_test_results(output: str) -> dict:
|
|
30
|
+
"""
|
|
31
|
+
Parse test results from sf CLI JSON output.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
dict with summary, failures, and coverage data
|
|
35
|
+
"""
|
|
36
|
+
try:
|
|
37
|
+
# Try to parse as JSON (if --result-format json was used)
|
|
38
|
+
data = json.loads(output)
|
|
39
|
+
return parse_json_results(data)
|
|
40
|
+
except json.JSONDecodeError:
|
|
41
|
+
# Parse human-readable output
|
|
42
|
+
return parse_text_results(output)
|
|
43
|
+
|
|
44
|
+
def parse_json_results(data: dict) -> dict:
|
|
45
|
+
"""Parse JSON format test results."""
|
|
46
|
+
result = data.get('result', data)
|
|
47
|
+
|
|
48
|
+
summary = {
|
|
49
|
+
'passed': 0,
|
|
50
|
+
'failed': 0,
|
|
51
|
+
'skipped': 0,
|
|
52
|
+
'total': 0,
|
|
53
|
+
'duration_ms': 0,
|
|
54
|
+
'coverage_percent': 0
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
failures = []
|
|
58
|
+
coverage = []
|
|
59
|
+
|
|
60
|
+
# Parse test results
|
|
61
|
+
tests = result.get('tests', [])
|
|
62
|
+
for test in tests:
|
|
63
|
+
outcome = test.get('Outcome', test.get('outcome', '')).lower()
|
|
64
|
+
if outcome == 'pass':
|
|
65
|
+
summary['passed'] += 1
|
|
66
|
+
elif outcome == 'fail':
|
|
67
|
+
summary['failed'] += 1
|
|
68
|
+
failures.append({
|
|
69
|
+
'class': test.get('ApexClass', {}).get('Name', test.get('className', 'Unknown')),
|
|
70
|
+
'method': test.get('MethodName', test.get('methodName', 'Unknown')),
|
|
71
|
+
'message': test.get('Message', test.get('message', '')),
|
|
72
|
+
'stack_trace': test.get('StackTrace', test.get('stackTrace', '')),
|
|
73
|
+
'run_time': test.get('RunTime', test.get('runTime', 0))
|
|
74
|
+
})
|
|
75
|
+
elif outcome == 'skip':
|
|
76
|
+
summary['skipped'] += 1
|
|
77
|
+
|
|
78
|
+
summary['total'] = summary['passed'] + summary['failed'] + summary['skipped']
|
|
79
|
+
|
|
80
|
+
# Parse coverage
|
|
81
|
+
coverage_data = result.get('coverage', {}).get('coverage', [])
|
|
82
|
+
if not coverage_data:
|
|
83
|
+
coverage_data = result.get('codecoverage', [])
|
|
84
|
+
|
|
85
|
+
total_lines = 0
|
|
86
|
+
covered_lines = 0
|
|
87
|
+
|
|
88
|
+
for cov in coverage_data:
|
|
89
|
+
class_name = cov.get('name', cov.get('apexClassOrTriggerName', 'Unknown'))
|
|
90
|
+
num_lines = cov.get('totalLines', cov.get('numLinesCovered', 0) + cov.get('numLinesUncovered', 0))
|
|
91
|
+
num_covered = cov.get('coveredLines', cov.get('numLinesCovered', 0))
|
|
92
|
+
if isinstance(num_covered, list):
|
|
93
|
+
num_covered = len(num_covered)
|
|
94
|
+
|
|
95
|
+
uncovered = cov.get('uncoveredLines', [])
|
|
96
|
+
if isinstance(uncovered, int):
|
|
97
|
+
uncovered = []
|
|
98
|
+
|
|
99
|
+
pct = (num_covered / num_lines * 100) if num_lines > 0 else 0
|
|
100
|
+
|
|
101
|
+
coverage.append({
|
|
102
|
+
'class': class_name,
|
|
103
|
+
'total_lines': num_lines,
|
|
104
|
+
'covered_lines': num_covered,
|
|
105
|
+
'uncovered_lines': uncovered[:10] if uncovered else [], # Limit to first 10
|
|
106
|
+
'percent': round(pct, 1)
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
total_lines += num_lines
|
|
110
|
+
covered_lines += num_covered if isinstance(num_covered, int) else 0
|
|
111
|
+
|
|
112
|
+
summary['coverage_percent'] = round(covered_lines / total_lines * 100, 1) if total_lines > 0 else 0
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
'summary': summary,
|
|
116
|
+
'failures': failures,
|
|
117
|
+
'coverage': coverage
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
def parse_text_results(output: str) -> dict:
|
|
121
|
+
"""Parse human-readable test output."""
|
|
122
|
+
summary = {
|
|
123
|
+
'passed': 0,
|
|
124
|
+
'failed': 0,
|
|
125
|
+
'skipped': 0,
|
|
126
|
+
'total': 0,
|
|
127
|
+
'duration_ms': 0,
|
|
128
|
+
'coverage_percent': 0
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
failures = []
|
|
132
|
+
|
|
133
|
+
# Look for pass/fail patterns
|
|
134
|
+
pass_match = re.search(r'(\d+)\s+(?:test[s]?\s+)?pass(?:ed|ing)?', output, re.IGNORECASE)
|
|
135
|
+
fail_match = re.search(r'(\d+)\s+(?:test[s]?\s+)?fail(?:ed|ing|ure)?', output, re.IGNORECASE)
|
|
136
|
+
|
|
137
|
+
if pass_match:
|
|
138
|
+
summary['passed'] = int(pass_match.group(1))
|
|
139
|
+
if fail_match:
|
|
140
|
+
summary['failed'] = int(fail_match.group(1))
|
|
141
|
+
|
|
142
|
+
summary['total'] = summary['passed'] + summary['failed']
|
|
143
|
+
|
|
144
|
+
# Look for failure details
|
|
145
|
+
failure_pattern = re.compile(
|
|
146
|
+
r'([\w]+)\.([\w]+)\s*[-:]\s*(.*?)(?=\n\n|\n[A-Z]|$)',
|
|
147
|
+
re.MULTILINE | re.DOTALL
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
for match in failure_pattern.finditer(output):
|
|
151
|
+
if 'fail' in match.group(3).lower() or 'error' in match.group(3).lower():
|
|
152
|
+
failures.append({
|
|
153
|
+
'class': match.group(1),
|
|
154
|
+
'method': match.group(2),
|
|
155
|
+
'message': match.group(3).strip(),
|
|
156
|
+
'stack_trace': ''
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
'summary': summary,
|
|
161
|
+
'failures': failures,
|
|
162
|
+
'coverage': []
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
def analyze_failure(failure: dict) -> dict:
|
|
166
|
+
"""
|
|
167
|
+
Analyze a test failure and suggest fix strategy.
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
dict with error_type, root_cause, and suggested_fix
|
|
171
|
+
"""
|
|
172
|
+
message = failure.get('message', '')
|
|
173
|
+
stack_trace = failure.get('stack_trace', '')
|
|
174
|
+
|
|
175
|
+
analysis = {
|
|
176
|
+
'error_type': 'Unknown',
|
|
177
|
+
'root_cause': 'Unable to determine root cause',
|
|
178
|
+
'suggested_fix': 'Review the test and code under test',
|
|
179
|
+
'auto_fixable': False
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
# Assertion failures
|
|
183
|
+
if 'AssertException' in message or 'Assertion Failed' in message:
|
|
184
|
+
analysis['error_type'] = 'Assertion Failure'
|
|
185
|
+
|
|
186
|
+
# Extract expected vs actual
|
|
187
|
+
expected_match = re.search(r'[Ee]xpected[:\s]+(\S+)', message)
|
|
188
|
+
actual_match = re.search(r'[Aa]ctual[:\s]+(\S+)', message)
|
|
189
|
+
|
|
190
|
+
if expected_match and actual_match:
|
|
191
|
+
analysis['root_cause'] = f"Expected {expected_match.group(1)} but got {actual_match.group(1)}"
|
|
192
|
+
analysis['suggested_fix'] = "Check if the test expectation is correct, or if the code logic needs fixing"
|
|
193
|
+
else:
|
|
194
|
+
analysis['root_cause'] = "Test assertion did not match expected outcome"
|
|
195
|
+
analysis['suggested_fix'] = "Review the assertion and verify expected vs actual values"
|
|
196
|
+
|
|
197
|
+
analysis['auto_fixable'] = True
|
|
198
|
+
|
|
199
|
+
# Null pointer
|
|
200
|
+
elif 'NullPointerException' in message:
|
|
201
|
+
analysis['error_type'] = 'Null Pointer Exception'
|
|
202
|
+
|
|
203
|
+
# Try to extract line number
|
|
204
|
+
line_match = re.search(r'[Ll]ine[:\s]+(\d+)', stack_trace or message)
|
|
205
|
+
if line_match:
|
|
206
|
+
analysis['root_cause'] = f"Null reference at line {line_match.group(1)}"
|
|
207
|
+
else:
|
|
208
|
+
analysis['root_cause'] = "Attempting to access a property or method on a null reference"
|
|
209
|
+
|
|
210
|
+
analysis['suggested_fix'] = "Add null check before accessing the object, or ensure test data setup creates required records"
|
|
211
|
+
analysis['auto_fixable'] = True
|
|
212
|
+
|
|
213
|
+
# DML exceptions
|
|
214
|
+
elif 'DmlException' in message:
|
|
215
|
+
analysis['error_type'] = 'DML Exception'
|
|
216
|
+
|
|
217
|
+
if 'REQUIRED_FIELD_MISSING' in message:
|
|
218
|
+
analysis['root_cause'] = "Required field not populated in test data"
|
|
219
|
+
analysis['suggested_fix'] = "Add the missing required field to TestDataFactory or test setup"
|
|
220
|
+
elif 'FIELD_CUSTOM_VALIDATION_EXCEPTION' in message:
|
|
221
|
+
analysis['root_cause'] = "Record fails validation rule"
|
|
222
|
+
analysis['suggested_fix'] = "Modify test data to meet validation rule requirements"
|
|
223
|
+
elif 'DUPLICATE_VALUE' in message:
|
|
224
|
+
analysis['root_cause'] = "Unique field constraint violation"
|
|
225
|
+
analysis['suggested_fix'] = "Use unique values in test data (e.g., add timestamp or random suffix)"
|
|
226
|
+
else:
|
|
227
|
+
analysis['root_cause'] = "DML operation failed"
|
|
228
|
+
analysis['suggested_fix'] = "Review the DML error message and adjust test data accordingly"
|
|
229
|
+
|
|
230
|
+
analysis['auto_fixable'] = True
|
|
231
|
+
|
|
232
|
+
# Query exceptions
|
|
233
|
+
elif 'QueryException' in message:
|
|
234
|
+
analysis['error_type'] = 'Query Exception'
|
|
235
|
+
analysis['root_cause'] = "SOQL query returned no results or too many results"
|
|
236
|
+
analysis['suggested_fix'] = "Ensure test data exists before querying, or handle empty results"
|
|
237
|
+
analysis['auto_fixable'] = True
|
|
238
|
+
|
|
239
|
+
# Limit exceptions
|
|
240
|
+
elif 'LimitException' in message:
|
|
241
|
+
analysis['error_type'] = 'Governor Limit Exception'
|
|
242
|
+
|
|
243
|
+
if 'Too many SOQL' in message:
|
|
244
|
+
analysis['root_cause'] = "SOQL query limit exceeded (100 queries)"
|
|
245
|
+
analysis['suggested_fix'] = "Bulkify queries - query before loops, use maps for lookups"
|
|
246
|
+
elif 'Too many DML' in message:
|
|
247
|
+
analysis['root_cause'] = "DML statement limit exceeded (150 statements)"
|
|
248
|
+
analysis['suggested_fix'] = "Bulkify DML - collect records in list, single DML after loop"
|
|
249
|
+
else:
|
|
250
|
+
analysis['root_cause'] = "Governor limit exceeded"
|
|
251
|
+
analysis['suggested_fix'] = "Review code for bulkification issues"
|
|
252
|
+
|
|
253
|
+
analysis['auto_fixable'] = True
|
|
254
|
+
|
|
255
|
+
# Mixed DML
|
|
256
|
+
elif 'MIXED_DML_OPERATION' in message:
|
|
257
|
+
analysis['error_type'] = 'Mixed DML Exception'
|
|
258
|
+
analysis['root_cause'] = "Setup and non-setup objects modified in same transaction"
|
|
259
|
+
analysis['suggested_fix'] = "Use System.runAs() to separate User operations from data operations"
|
|
260
|
+
analysis['auto_fixable'] = True
|
|
261
|
+
|
|
262
|
+
return analysis
|
|
263
|
+
|
|
264
|
+
def format_output(results: dict) -> str:
|
|
265
|
+
"""Format test results for Claude consumption."""
|
|
266
|
+
summary = results['summary']
|
|
267
|
+
failures = results['failures']
|
|
268
|
+
coverage = results['coverage']
|
|
269
|
+
|
|
270
|
+
lines = []
|
|
271
|
+
lines.append("=" * 60)
|
|
272
|
+
lines.append("📊 APEX TEST RESULTS")
|
|
273
|
+
lines.append("=" * 60)
|
|
274
|
+
lines.append("")
|
|
275
|
+
|
|
276
|
+
# Summary
|
|
277
|
+
status_icon = "✅" if summary['failed'] == 0 else "❌"
|
|
278
|
+
lines.append(f"{status_icon} SUMMARY")
|
|
279
|
+
lines.append("-" * 60)
|
|
280
|
+
lines.append(f" Passed: {summary['passed']}")
|
|
281
|
+
lines.append(f" Failed: {summary['failed']}")
|
|
282
|
+
lines.append(f" Skipped: {summary['skipped']}")
|
|
283
|
+
lines.append(f" Total: {summary['total']}")
|
|
284
|
+
|
|
285
|
+
if summary['coverage_percent'] > 0:
|
|
286
|
+
cov_icon = "✅" if summary['coverage_percent'] >= 75 else "⚠️"
|
|
287
|
+
lines.append(f" Coverage: {summary['coverage_percent']}% {cov_icon}")
|
|
288
|
+
|
|
289
|
+
lines.append("")
|
|
290
|
+
|
|
291
|
+
# Failures with analysis
|
|
292
|
+
if failures:
|
|
293
|
+
lines.append("❌ FAILED TESTS")
|
|
294
|
+
lines.append("-" * 60)
|
|
295
|
+
|
|
296
|
+
for i, failure in enumerate(failures, 1):
|
|
297
|
+
analysis = analyze_failure(failure)
|
|
298
|
+
|
|
299
|
+
lines.append(f"\n{i}. {failure['class']}.{failure['method']}")
|
|
300
|
+
lines.append(f" Error Type: {analysis['error_type']}")
|
|
301
|
+
lines.append(f" Message: {failure['message'][:200]}...")
|
|
302
|
+
lines.append(f" Root Cause: {analysis['root_cause']}")
|
|
303
|
+
lines.append(f" Suggested Fix: {analysis['suggested_fix']}")
|
|
304
|
+
|
|
305
|
+
if analysis['auto_fixable']:
|
|
306
|
+
lines.append(" 🤖 AUTO-FIXABLE: Yes - Claude can attempt automatic fix")
|
|
307
|
+
|
|
308
|
+
lines.append("")
|
|
309
|
+
lines.append("=" * 60)
|
|
310
|
+
lines.append("🤖 AGENTIC FIX INSTRUCTIONS")
|
|
311
|
+
lines.append("=" * 60)
|
|
312
|
+
lines.append("")
|
|
313
|
+
lines.append("To automatically fix these failures:")
|
|
314
|
+
lines.append("1. Read the failing test class")
|
|
315
|
+
lines.append("2. Read the class under test")
|
|
316
|
+
lines.append("3. Apply the suggested fix")
|
|
317
|
+
lines.append("4. Re-run: sf apex run test --tests [ClassName].[methodName]")
|
|
318
|
+
lines.append("")
|
|
319
|
+
|
|
320
|
+
# Coverage details (if below threshold)
|
|
321
|
+
low_coverage = [c for c in coverage if c['percent'] < 75]
|
|
322
|
+
if low_coverage:
|
|
323
|
+
lines.append("⚠️ LOW COVERAGE CLASSES (<75%)")
|
|
324
|
+
lines.append("-" * 60)
|
|
325
|
+
|
|
326
|
+
for cov in sorted(low_coverage, key=lambda x: x['percent']):
|
|
327
|
+
lines.append(f" {cov['class']}: {cov['percent']}%")
|
|
328
|
+
if cov.get('uncovered_lines'):
|
|
329
|
+
lines.append(f" Uncovered lines: {cov['uncovered_lines']}")
|
|
330
|
+
|
|
331
|
+
lines.append("")
|
|
332
|
+
|
|
333
|
+
lines.append("=" * 60)
|
|
334
|
+
|
|
335
|
+
return "\n".join(lines)
|
|
336
|
+
|
|
337
|
+
def main():
|
|
338
|
+
"""Main entry point."""
|
|
339
|
+
if not should_process():
|
|
340
|
+
# Not an apex test command, exit silently
|
|
341
|
+
sys.exit(0)
|
|
342
|
+
|
|
343
|
+
output = os.environ.get('TOOL_OUTPUT', '')
|
|
344
|
+
|
|
345
|
+
if not output:
|
|
346
|
+
sys.exit(0)
|
|
347
|
+
|
|
348
|
+
# Check if this looks like test output
|
|
349
|
+
if 'test' not in output.lower() and 'coverage' not in output.lower():
|
|
350
|
+
sys.exit(0)
|
|
351
|
+
|
|
352
|
+
try:
|
|
353
|
+
results = parse_test_results(output)
|
|
354
|
+
|
|
355
|
+
# Only output if there were tests or failures
|
|
356
|
+
if results['summary']['total'] > 0 or results['failures']:
|
|
357
|
+
formatted = format_output(results)
|
|
358
|
+
print(formatted)
|
|
359
|
+
except Exception as e:
|
|
360
|
+
# Silently fail - don't block on parsing errors
|
|
361
|
+
sys.exit(0)
|
|
362
|
+
|
|
363
|
+
if __name__ == "__main__":
|
|
364
|
+
main()
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
<!-- Parent: running-apex-tests/SKILL.md -->
|
|
2
|
+
# Salesforce CLI Test Commands Reference
|
|
3
|
+
|
|
4
|
+
## Quick Reference
|
|
5
|
+
|
|
6
|
+
| Task | Command |
|
|
7
|
+
|------|---------|
|
|
8
|
+
| Run single test class | `sf apex run test --class-names MyTest` |
|
|
9
|
+
| Run all local tests | `sf apex run test --test-level RunLocalTests` |
|
|
10
|
+
| Run with coverage | `sf apex run test --class-names MyTest --code-coverage` |
|
|
11
|
+
| Get JSON output | `sf apex run test --class-names MyTest --result-format json` |
|
|
12
|
+
| Run specific methods | `sf apex run test --tests MyTest.method1 --tests MyTest.method2` |
|
|
13
|
+
|
|
14
|
+
## Test Execution
|
|
15
|
+
|
|
16
|
+
### Run Single Test Class
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
sf apex run test \
|
|
20
|
+
--class-names AccountServiceTest \
|
|
21
|
+
--target-org my-sandbox \
|
|
22
|
+
--code-coverage \
|
|
23
|
+
--result-format human
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Run Multiple Test Classes
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
sf apex run test \
|
|
30
|
+
--class-names AccountServiceTest \
|
|
31
|
+
--class-names ContactServiceTest \
|
|
32
|
+
--class-names LeadServiceTest \
|
|
33
|
+
--target-org my-sandbox \
|
|
34
|
+
--code-coverage
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Run Specific Test Methods
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
sf apex run test \
|
|
41
|
+
--tests AccountServiceTest.testCreate \
|
|
42
|
+
--tests AccountServiceTest.testUpdate \
|
|
43
|
+
--target-org my-sandbox
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Run All Local Tests
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
sf apex run test \
|
|
50
|
+
--test-level RunLocalTests \
|
|
51
|
+
--target-org my-sandbox \
|
|
52
|
+
--code-coverage \
|
|
53
|
+
--output-dir test-results
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Run Test Suite
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
sf apex run test \
|
|
60
|
+
--suite-names RegressionSuite \
|
|
61
|
+
--target-org my-sandbox \
|
|
62
|
+
--code-coverage
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Test Levels
|
|
66
|
+
|
|
67
|
+
| Level | Description |
|
|
68
|
+
|-------|-------------|
|
|
69
|
+
| `RunSpecifiedTests` | Only specified tests (default when using --class-names) |
|
|
70
|
+
| `RunLocalTests` | All tests except managed packages |
|
|
71
|
+
| `RunAllTestsInOrg` | All tests including managed packages |
|
|
72
|
+
|
|
73
|
+
## Output Formats
|
|
74
|
+
|
|
75
|
+
### Human Readable (Default)
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
sf apex run test --class-names MyTest --result-format human
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### JSON (For Parsing)
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
sf apex run test --class-names MyTest --result-format json
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### JUnit XML (For CI/CD)
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
sf apex run test --class-names MyTest --result-format junit
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### TAP (Test Anything Protocol)
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
sf apex run test --class-names MyTest --result-format tap
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Code Coverage
|
|
100
|
+
|
|
101
|
+
### Basic Coverage
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
sf apex run test \
|
|
105
|
+
--class-names MyTest \
|
|
106
|
+
--code-coverage \
|
|
107
|
+
--target-org my-sandbox
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Detailed Line-by-Line Coverage
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
sf apex run test \
|
|
114
|
+
--class-names MyTest \
|
|
115
|
+
--code-coverage \
|
|
116
|
+
--detailed-coverage \
|
|
117
|
+
--target-org my-sandbox
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Save Results to Directory
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
sf apex run test \
|
|
124
|
+
--class-names MyTest \
|
|
125
|
+
--code-coverage \
|
|
126
|
+
--output-dir ./test-results \
|
|
127
|
+
--target-org my-sandbox
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Output files:
|
|
131
|
+
- `test-run-id.json` - Test results
|
|
132
|
+
- `test-run-id-codecoverage.json` - Coverage data
|
|
133
|
+
|
|
134
|
+
## Async Test Execution
|
|
135
|
+
|
|
136
|
+
### Run Tests Asynchronously
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
sf apex run test \
|
|
140
|
+
--test-level RunLocalTests \
|
|
141
|
+
--target-org my-sandbox \
|
|
142
|
+
--async
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Returns a test run ID for checking status later.
|
|
146
|
+
|
|
147
|
+
### Check Async Test Status
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
sf apex get test \
|
|
151
|
+
--test-run-id 707xx0000000000AAA \
|
|
152
|
+
--target-org my-sandbox
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Wait for Test Completion
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
sf apex run test \
|
|
159
|
+
--test-level RunLocalTests \
|
|
160
|
+
--target-org my-sandbox \
|
|
161
|
+
--wait 10 # Wait up to 10 minutes
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Debug Logs During Tests
|
|
165
|
+
|
|
166
|
+
### Enable Debug Logs
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# List current log levels
|
|
170
|
+
sf apex list log --target-org my-sandbox
|
|
171
|
+
|
|
172
|
+
# Tail logs in real-time
|
|
173
|
+
sf apex tail log --target-org my-sandbox --color
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Get Specific Log
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
sf apex get log \
|
|
180
|
+
--log-id 07Lxx0000000000AAA \
|
|
181
|
+
--target-org my-sandbox
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Useful Flags
|
|
185
|
+
|
|
186
|
+
| Flag | Description |
|
|
187
|
+
|------|-------------|
|
|
188
|
+
| `--code-coverage` | Include coverage in results |
|
|
189
|
+
| `--detailed-coverage` | Line-by-line coverage (slower) |
|
|
190
|
+
| `--result-format` | Output format (human, json, junit, tap) |
|
|
191
|
+
| `--output-dir` | Save results to directory |
|
|
192
|
+
| `--synchronous` | Wait for completion (default) |
|
|
193
|
+
| `--wait` | Max minutes to wait |
|
|
194
|
+
| `--async` | Return immediately with run ID |
|
|
195
|
+
| `--verbose` | Show additional details |
|
|
196
|
+
| `--concise` | Suppress passing test details (show only failures) |
|
|
197
|
+
| `--poll-interval <seconds>` | Customize polling interval (v2.116.6+) |
|
|
198
|
+
|
|
199
|
+
## Common Patterns
|
|
200
|
+
|
|
201
|
+
### Full Test Run with Coverage Report
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
sf apex run test \
|
|
205
|
+
--test-level RunLocalTests \
|
|
206
|
+
--code-coverage \
|
|
207
|
+
--result-format json \
|
|
208
|
+
--output-dir ./test-results \
|
|
209
|
+
--target-org my-sandbox \
|
|
210
|
+
--wait 30
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Quick Validation (Single Test)
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
sf apex run test \
|
|
217
|
+
--tests AccountServiceTest.testCreate \
|
|
218
|
+
--target-org my-sandbox
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### CI/CD Pipeline Pattern
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
# Run tests with JUnit output for CI tools
|
|
225
|
+
sf apex run test \
|
|
226
|
+
--test-level RunLocalTests \
|
|
227
|
+
--result-format junit \
|
|
228
|
+
--output-dir ./test-results \
|
|
229
|
+
--code-coverage \
|
|
230
|
+
--target-org ci-sandbox \
|
|
231
|
+
--wait 60
|
|
232
|
+
|
|
233
|
+
# Check exit code
|
|
234
|
+
if [ $? -ne 0 ]; then
|
|
235
|
+
echo "Tests failed!"
|
|
236
|
+
exit 1
|
|
237
|
+
fi
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Coverage Validation
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
# Run tests and check minimum coverage
|
|
244
|
+
sf apex run test \
|
|
245
|
+
--test-level RunLocalTests \
|
|
246
|
+
--code-coverage \
|
|
247
|
+
--result-format json \
|
|
248
|
+
--output-dir ./test-results \
|
|
249
|
+
--target-org my-sandbox
|
|
250
|
+
|
|
251
|
+
# Parse coverage from JSON (requires jq)
|
|
252
|
+
coverage=$(jq '.result.summary.orgWideCoverage' ./test-results/*.json | tr -d '"' | tr -d '%')
|
|
253
|
+
if [ "$coverage" -lt 75 ]; then
|
|
254
|
+
echo "Coverage $coverage% is below 75% threshold!"
|
|
255
|
+
exit 1
|
|
256
|
+
fi
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Troubleshooting
|
|
260
|
+
|
|
261
|
+
### Test Timeout
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
# Increase wait time for long-running tests
|
|
265
|
+
sf apex run test \
|
|
266
|
+
--test-level RunAllTestsInOrg \
|
|
267
|
+
--wait 120 \
|
|
268
|
+
--target-org my-sandbox
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### No Test Results
|
|
272
|
+
|
|
273
|
+
Check if tests exist:
|
|
274
|
+
```bash
|
|
275
|
+
sf data query --query "SELECT Id, Name FROM ApexClass WHERE Name LIKE '%Test%'" --target-org my-sandbox
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Permission Errors
|
|
279
|
+
|
|
280
|
+
Ensure user has "Author Apex" permission and API access.
|
|
281
|
+
|
|
282
|
+
### Async Test Not Completing
|
|
283
|
+
|
|
284
|
+
Check system status:
|
|
285
|
+
```bash
|
|
286
|
+
sf apex get test \
|
|
287
|
+
--test-run-id 707xx0000000000AAA \
|
|
288
|
+
--target-org my-sandbox
|
|
289
|
+
```
|