@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.
Files changed (488) hide show
  1. package/package.json +1 -1
  2. package/skills/activating-datacloud/CREDITS.md +5 -0
  3. package/skills/activating-datacloud/README.md +39 -0
  4. package/skills/activating-datacloud/SKILL.md +118 -0
  5. package/skills/analyzing-omnistudio-dependencies/CREDITS.md +5 -0
  6. package/skills/analyzing-omnistudio-dependencies/SKILL.md +477 -0
  7. package/skills/analyzing-omnistudio-dependencies/references/dependency-patterns.md +508 -0
  8. package/skills/analyzing-omnistudio-dependencies/references/namespace-guide.md +300 -0
  9. package/skills/building-omnistudio-callable-apex/CREDITS.md +9 -0
  10. package/skills/building-omnistudio-callable-apex/README.md +80 -0
  11. package/skills/building-omnistudio-callable-apex/SKILL.md +276 -0
  12. package/skills/building-omnistudio-callable-apex/assets/pattern_callable_openinterface.cls +40 -0
  13. package/skills/building-omnistudio-callable-apex/assets/pattern_callable_vanilla.cls +32 -0
  14. package/skills/building-omnistudio-callable-apex/assets/pattern_migration.cls +54 -0
  15. package/skills/building-omnistudio-callable-apex/assets/pattern_openinterface.cls +45 -0
  16. package/skills/building-omnistudio-callable-apex/assets/pattern_test_class.cls +65 -0
  17. package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/IndustriesCallableException.cls +7 -0
  18. package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallable.cls +115 -0
  19. package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/Industries_QuoteByProductCallableTest.cls +189 -0
  20. package/skills/building-omnistudio-callable-apex/examples/Test_QuoteByProductCallable/TRANSCRIPT.md +115 -0
  21. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/IndustriesCallableException.cls +7 -0
  22. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallable.cls +74 -0
  23. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomCallableTest.cls +146 -0
  24. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/MyCustomRemoteClass.cls +16 -0
  25. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterface2Conversion/TRANSCRIPT.md +120 -0
  26. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/IndustriesCallableException.cls +7 -0
  27. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallable.cls +73 -0
  28. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomCallableTest.cls +128 -0
  29. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/MyCustomVlocityOpenInterface2.cls +23 -0
  30. package/skills/building-omnistudio-callable-apex/examples/Test_VlocityOpenInterfaceConversion/TRANSCRIPT.md +75 -0
  31. package/skills/building-omnistudio-datamapper/CREDITS.md +5 -0
  32. package/skills/building-omnistudio-datamapper/SKILL.md +270 -0
  33. package/skills/building-omnistudio-datamapper/assets/completion-summary-template.md +28 -0
  34. package/skills/building-omnistudio-datamapper/assets/omni-data-transform-extract.json +6 -0
  35. package/skills/building-omnistudio-datamapper/assets/omni-data-transform-item.json +12 -0
  36. package/skills/building-omnistudio-datamapper/assets/omni-data-transform-load.json +6 -0
  37. package/skills/building-omnistudio-datamapper/assets/omni-data-transform-transform.json +6 -0
  38. package/skills/building-omnistudio-datamapper/references/best-practices.md +277 -0
  39. package/skills/building-omnistudio-datamapper/references/naming-conventions.md +145 -0
  40. package/skills/building-omnistudio-flexcard/CREDITS.md +5 -0
  41. package/skills/building-omnistudio-flexcard/SKILL.md +325 -0
  42. package/skills/building-omnistudio-flexcard/assets/omni-ui-card.json +10 -0
  43. package/skills/building-omnistudio-flexcard/references/best-practices.md +291 -0
  44. package/skills/building-omnistudio-flexcard/references/data-binding-guide.md +311 -0
  45. package/skills/building-omnistudio-flexcard/references/scoring-rubric.md +66 -0
  46. package/skills/building-omnistudio-flexcard/scripts/flexcard-commands.sh +24 -0
  47. package/skills/building-omnistudio-integration-procedure/CREDITS.md +5 -0
  48. package/skills/building-omnistudio-integration-procedure/SKILL.md +275 -0
  49. package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-dr-extract.json +10 -0
  50. package/skills/building-omnistudio-integration-procedure/assets/omni-process-element-set-values.json +10 -0
  51. package/skills/building-omnistudio-integration-procedure/assets/omni-process-ip.json +12 -0
  52. package/skills/building-omnistudio-integration-procedure/assets/scoring-report-format.txt +14 -0
  53. package/skills/building-omnistudio-integration-procedure/references/best-practices.md +388 -0
  54. package/skills/building-omnistudio-integration-procedure/references/element-types.md +588 -0
  55. package/skills/building-omnistudio-integration-procedure/scripts/cli-commands.sh +18 -0
  56. package/skills/building-omnistudio-omniscript/CREDITS.md +5 -0
  57. package/skills/building-omnistudio-omniscript/SKILL.md +367 -0
  58. package/skills/building-omnistudio-omniscript/assets/omni-process-element-step.json +10 -0
  59. package/skills/building-omnistudio-omniscript/assets/omni-process-element-text-block.json +11 -0
  60. package/skills/building-omnistudio-omniscript/assets/omni-process-omniscript.json +12 -0
  61. package/skills/building-omnistudio-omniscript/references/best-practices.md +480 -0
  62. package/skills/building-omnistudio-omniscript/references/element-types.md +1172 -0
  63. package/skills/building-omnistudio-omniscript/scripts/check-duplicate-omniscript.sh +13 -0
  64. package/skills/building-omnistudio-omniscript/scripts/cli-reference.sh +21 -0
  65. package/skills/building-omnistudio-omniscript/scripts/deploy-omniscript.sh +29 -0
  66. package/skills/building-sf-integrations/CREDITS.md +5 -0
  67. package/skills/building-sf-integrations/README.md +95 -0
  68. package/skills/building-sf-integrations/SKILL.md +192 -0
  69. package/skills/building-sf-integrations/assets/callouts/callout-retry-handler.cls +167 -0
  70. package/skills/building-sf-integrations/assets/callouts/http-response-handler.cls +257 -0
  71. package/skills/building-sf-integrations/assets/callouts/rest-queueable-callout.cls +262 -0
  72. package/skills/building-sf-integrations/assets/callouts/rest-sync-callout.cls +211 -0
  73. package/skills/building-sf-integrations/assets/cdc/cdc-handler.cls +246 -0
  74. package/skills/building-sf-integrations/assets/cdc/cdc-subscriber-trigger.trigger +139 -0
  75. package/skills/building-sf-integrations/assets/endpoint-security/example.cspTrustedSite-meta.xml +58 -0
  76. package/skills/building-sf-integrations/assets/endpoint-security/example.remoteSite-meta.xml +39 -0
  77. package/skills/building-sf-integrations/assets/external-credentials/jwt-external-credential.externalCredential-meta.xml +90 -0
  78. package/skills/building-sf-integrations/assets/external-credentials/oauth-external-credential.externalCredential-meta.xml +87 -0
  79. package/skills/building-sf-integrations/assets/external-services/external-service-operations.md +221 -0
  80. package/skills/building-sf-integrations/assets/external-services/openapi-registration.externalServiceRegistration-meta.xml +193 -0
  81. package/skills/building-sf-integrations/assets/named-credentials/certificate-auth.namedCredential-meta.xml +62 -0
  82. package/skills/building-sf-integrations/assets/named-credentials/custom-auth.namedCredential-meta.xml +71 -0
  83. package/skills/building-sf-integrations/assets/named-credentials/oauth-client-credentials.namedCredential-meta.xml +51 -0
  84. package/skills/building-sf-integrations/assets/named-credentials/oauth-jwt-bearer.namedCredential-meta.xml +67 -0
  85. package/skills/building-sf-integrations/assets/platform-events/event-publisher.cls +191 -0
  86. package/skills/building-sf-integrations/assets/platform-events/event-subscriber-action.cls +295 -0
  87. package/skills/building-sf-integrations/assets/platform-events/event-subscriber-trigger.trigger +108 -0
  88. package/skills/building-sf-integrations/assets/platform-events/platform-event-definition.object-meta.xml +124 -0
  89. package/skills/building-sf-integrations/assets/soap/soap-callout-service.cls +186 -0
  90. package/skills/building-sf-integrations/assets/soap/wsdl2apex-guide.md +213 -0
  91. package/skills/building-sf-integrations/hooks/scripts/suggest_credential_setup.py +271 -0
  92. package/skills/building-sf-integrations/hooks/scripts/validate_integration.py +363 -0
  93. package/skills/building-sf-integrations/references/callout-patterns.md +719 -0
  94. package/skills/building-sf-integrations/references/cdc-guide.md +288 -0
  95. package/skills/building-sf-integrations/references/cli-reference.md +94 -0
  96. package/skills/building-sf-integrations/references/event-driven-architecture-guide.md +266 -0
  97. package/skills/building-sf-integrations/references/event-patterns.md +838 -0
  98. package/skills/building-sf-integrations/references/external-services-guide.md +303 -0
  99. package/skills/building-sf-integrations/references/messaging-api-v2.md +609 -0
  100. package/skills/building-sf-integrations/references/named-credentials-automation.md +201 -0
  101. package/skills/building-sf-integrations/references/named-credentials-guide.md +173 -0
  102. package/skills/building-sf-integrations/references/platform-events-guide.md +288 -0
  103. package/skills/building-sf-integrations/references/rest-callout-patterns.md +288 -0
  104. package/skills/building-sf-integrations/references/scoring-rubric.md +59 -0
  105. package/skills/building-sf-integrations/references/security-best-practices.md +248 -0
  106. package/skills/building-sf-integrations/scripts/README.md +100 -0
  107. package/skills/building-sf-integrations/scripts/configure-named-credential.sh +236 -0
  108. package/skills/building-sf-integrations/scripts/set-api-credential.sh +146 -0
  109. package/skills/building-sf-integrations/scripts/templates/setup-credentials-with-csp.sh +158 -0
  110. package/skills/configuring-connected-apps/CREDITS.md +3 -0
  111. package/skills/configuring-connected-apps/README.md +99 -0
  112. package/skills/configuring-connected-apps/SKILL.md +224 -0
  113. package/skills/configuring-connected-apps/assets/connected-app-basic.xml +29 -0
  114. package/skills/configuring-connected-apps/assets/connected-app-canvas.xml +62 -0
  115. package/skills/configuring-connected-apps/assets/connected-app-jwt.xml +49 -0
  116. package/skills/configuring-connected-apps/assets/connected-app-oauth.xml +65 -0
  117. package/skills/configuring-connected-apps/assets/eca-global-oauth.xml +36 -0
  118. package/skills/configuring-connected-apps/assets/eca-oauth-settings.xml +36 -0
  119. package/skills/configuring-connected-apps/assets/eca-policies.xml +36 -0
  120. package/skills/configuring-connected-apps/assets/external-client-app.xml +35 -0
  121. package/skills/configuring-connected-apps/references/example-usage.md +256 -0
  122. package/skills/configuring-connected-apps/references/migration-guide.md +328 -0
  123. package/skills/configuring-connected-apps/references/oauth-flows-reference.md +660 -0
  124. package/skills/configuring-connected-apps/references/security-checklist.md +209 -0
  125. package/skills/configuring-connected-apps/references/testing-validation-guide.md +275 -0
  126. package/skills/connecting-datacloud/CREDITS.md +5 -0
  127. package/skills/connecting-datacloud/README.md +59 -0
  128. package/skills/connecting-datacloud/SKILL.md +155 -0
  129. package/skills/connecting-datacloud/examples/connections/heroku-postgres.json +15 -0
  130. package/skills/connecting-datacloud/examples/connections/ingest-api-connection.json +5 -0
  131. package/skills/connecting-datacloud/examples/connections/ingest-api-schema.json +31 -0
  132. package/skills/connecting-datacloud/examples/connections/redshift.json +16 -0
  133. package/skills/connecting-datacloud/examples/connections/sharepoint-unstructured.json +20 -0
  134. package/skills/connecting-datacloud/examples/connections/snowflake-connection.json +42 -0
  135. package/skills/debugging-apex-logs/CREDITS.md +22 -0
  136. package/skills/debugging-apex-logs/README.md +74 -0
  137. package/skills/debugging-apex-logs/SKILL.md +172 -0
  138. package/skills/debugging-apex-logs/assets/benchmarking-template.cls +327 -0
  139. package/skills/debugging-apex-logs/assets/cpu-heap-optimization.cls +307 -0
  140. package/skills/debugging-apex-logs/assets/dml-in-loop-fix.cls +219 -0
  141. package/skills/debugging-apex-logs/assets/null-pointer-fix.cls +252 -0
  142. package/skills/debugging-apex-logs/assets/soql-in-loop-fix.cls +157 -0
  143. package/skills/debugging-apex-logs/references/analysis-playbook.md +53 -0
  144. package/skills/debugging-apex-logs/references/benchmarking-guide.md +287 -0
  145. package/skills/debugging-apex-logs/references/cli-commands.md +368 -0
  146. package/skills/debugging-apex-logs/references/common-issues.md +68 -0
  147. package/skills/debugging-apex-logs/references/debug-log-reference.md +328 -0
  148. package/skills/debugging-apex-logs/references/log-analysis-tools.md +248 -0
  149. package/skills/debugging-apex-logs/references/scoring-rubric.md +21 -0
  150. package/skills/deploying-metadata/CREDITS.md +25 -0
  151. package/skills/deploying-metadata/README.md +104 -0
  152. package/skills/deploying-metadata/SKILL.md +214 -0
  153. package/skills/deploying-metadata/assets/destructiveChanges.xml +143 -0
  154. package/skills/deploying-metadata/assets/package.xml +121 -0
  155. package/skills/deploying-metadata/references/agent-deployment-guide.md +628 -0
  156. package/skills/deploying-metadata/references/deploy.sh +73 -0
  157. package/skills/deploying-metadata/references/deployment-report-template.md +89 -0
  158. package/skills/deploying-metadata/references/deployment-workflows.md +395 -0
  159. package/skills/deploying-metadata/references/orchestration.md +183 -0
  160. package/skills/deploying-metadata/references/trigger-deployment-safety.md +376 -0
  161. package/skills/deploying-omnistudio-datapacks/CREDITS.md +5 -0
  162. package/skills/deploying-omnistudio-datapacks/README.md +88 -0
  163. package/skills/deploying-omnistudio-datapacks/SKILL.md +174 -0
  164. package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/TRANSCRIPT.md +124 -0
  165. package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle/deploy-business-internet-plus-bundle.yaml +11 -0
  166. package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/TRANSCRIPT.md +142 -0
  167. package/skills/deploying-omnistudio-datapacks/examples/business-internet-plus-bundle-deploy/deploy-business-internet-plus-bundle.yaml +10 -0
  168. package/skills/deploying-omnistudio-datapacks/references/job-file-template.md +42 -0
  169. package/skills/deploying-omnistudio-datapacks/references/troubleshooting-matrix.md +24 -0
  170. package/skills/developing-agentforce/assets/metadata/http-callout-flow.flow-meta.xml +1 -1
  171. package/skills/developing-agentforce/references/actions-reference.md +8 -8
  172. package/skills/fetching-salesforce-docs/README.md +66 -0
  173. package/skills/fetching-salesforce-docs/SKILL.md +209 -0
  174. package/skills/fetching-salesforce-docs/requirements.txt +2 -0
  175. package/skills/fetching-salesforce-docs/scripts/extract_help_salesforce.py +497 -0
  176. package/skills/fetching-salesforce-docs/scripts/extract_salesforce_doc.py +357 -0
  177. package/skills/fetching-salesforce-docs/scripts/runtime_bootstrap.py +58 -0
  178. package/skills/generating-apex/CREDITS.md +1 -26
  179. package/skills/generating-apex-test/CREDITS.md +2 -27
  180. package/skills/generating-lwc-components/CREDITS.md +5 -0
  181. package/skills/generating-lwc-components/README.md +126 -0
  182. package/skills/generating-lwc-components/SKILL.md +191 -0
  183. package/skills/generating-lwc-components/assets/apex-controller/LwcController.cls +327 -0
  184. package/skills/generating-lwc-components/assets/basic-component/basicComponent.css +72 -0
  185. package/skills/generating-lwc-components/assets/basic-component/basicComponent.html +111 -0
  186. package/skills/generating-lwc-components/assets/basic-component/basicComponent.js +163 -0
  187. package/skills/generating-lwc-components/assets/basic-component/basicComponent.js-meta.xml +137 -0
  188. package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.html +111 -0
  189. package/skills/generating-lwc-components/assets/datatable-component/datatableComponent.js +367 -0
  190. package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.css +63 -0
  191. package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.html +154 -0
  192. package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js +348 -0
  193. package/skills/generating-lwc-components/assets/flow-screen-component/flowScreenComponent.js-meta.xml +87 -0
  194. package/skills/generating-lwc-components/assets/form-component/formComponent.html +165 -0
  195. package/skills/generating-lwc-components/assets/form-component/formComponent.js +275 -0
  196. package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.html +100 -0
  197. package/skills/generating-lwc-components/assets/graphql-component/graphqlComponent.js +336 -0
  198. package/skills/generating-lwc-components/assets/jest-test/componentName.test.js.example +371 -0
  199. package/skills/generating-lwc-components/assets/message-channel/RecordSelected.messageChannel-meta.xml +71 -0
  200. package/skills/generating-lwc-components/assets/message-channel/lmsPublisher.js +103 -0
  201. package/skills/generating-lwc-components/assets/message-channel/lmsSubscriber.js +181 -0
  202. package/skills/generating-lwc-components/assets/modal-component/modalComponent.html +85 -0
  203. package/skills/generating-lwc-components/assets/modal-component/modalComponent.js +199 -0
  204. package/skills/generating-lwc-components/assets/record-picker/recordPicker.html +55 -0
  205. package/skills/generating-lwc-components/assets/record-picker/recordPicker.js +199 -0
  206. package/skills/generating-lwc-components/assets/state-store/store.js +282 -0
  207. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.css +65 -0
  208. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.html +95 -0
  209. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.js-meta.xml +75 -0
  210. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.test.ts.example +301 -0
  211. package/skills/generating-lwc-components/assets/typescript-component/typescriptComponent.ts +295 -0
  212. package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.html +71 -0
  213. package/skills/generating-lwc-components/assets/workspace-api/workspaceComponent.js +316 -0
  214. package/skills/generating-lwc-components/hooks/scripts/lwc-lsp-validate.py +295 -0
  215. package/skills/generating-lwc-components/hooks/scripts/post-tool-validate.py +347 -0
  216. package/skills/generating-lwc-components/hooks/scripts/slds_data/deprecated_patterns.json +74 -0
  217. package/skills/generating-lwc-components/hooks/scripts/slds_data/styling_hooks.json +111 -0
  218. package/skills/generating-lwc-components/hooks/scripts/slds_data/valid_slds_classes.json +127 -0
  219. package/skills/generating-lwc-components/hooks/scripts/slds_linter_wrapper.py +294 -0
  220. package/skills/generating-lwc-components/hooks/scripts/slds_rules/__init__.py +22 -0
  221. package/skills/generating-lwc-components/hooks/scripts/template_validator.py +332 -0
  222. package/skills/generating-lwc-components/hooks/scripts/validate_slds.py +595 -0
  223. package/skills/generating-lwc-components/references/accessibility-guide.md +843 -0
  224. package/skills/generating-lwc-components/references/advanced-features.md +108 -0
  225. package/skills/generating-lwc-components/references/async-notification-patterns.md +661 -0
  226. package/skills/generating-lwc-components/references/cli-commands.md +545 -0
  227. package/skills/generating-lwc-components/references/component-patterns.md +1476 -0
  228. package/skills/generating-lwc-components/references/flow-integration-guide.md +675 -0
  229. package/skills/generating-lwc-components/references/jest-testing.md +1011 -0
  230. package/skills/generating-lwc-components/references/lms-guide.md +860 -0
  231. package/skills/generating-lwc-components/references/lwc-best-practices.md +1310 -0
  232. package/skills/generating-lwc-components/references/performance-guide.md +861 -0
  233. package/skills/generating-lwc-components/references/scoring-and-testing.md +116 -0
  234. package/skills/generating-lwc-components/references/slds-blueprints.json +14389 -0
  235. package/skills/generating-lwc-components/references/slds-design-guide.md +166 -0
  236. package/skills/generating-lwc-components/references/state-management.md +642 -0
  237. package/skills/generating-lwc-components/references/template-anti-patterns.md +948 -0
  238. package/skills/generating-lwc-components/references/triangle-pattern.md +365 -0
  239. package/skills/generating-lwc-components/scripts/local-dev-preview.sh +34 -0
  240. package/skills/generating-mermaid-diagrams/CREDITS.md +46 -0
  241. package/skills/generating-mermaid-diagrams/README.md +114 -0
  242. package/skills/generating-mermaid-diagrams/SKILL.md +218 -0
  243. package/skills/generating-mermaid-diagrams/assets/agentforce/agent-flow.md +313 -0
  244. package/skills/generating-mermaid-diagrams/assets/architecture/system-landscape.md +351 -0
  245. package/skills/generating-mermaid-diagrams/assets/datamodel/b2b-commerce-erd.md +317 -0
  246. package/skills/generating-mermaid-diagrams/assets/datamodel/campaigns-erd.md +195 -0
  247. package/skills/generating-mermaid-diagrams/assets/datamodel/consent-erd.md +262 -0
  248. package/skills/generating-mermaid-diagrams/assets/datamodel/files-erd.md +266 -0
  249. package/skills/generating-mermaid-diagrams/assets/datamodel/forecasting-erd.md +261 -0
  250. package/skills/generating-mermaid-diagrams/assets/datamodel/fsl-erd.md +332 -0
  251. package/skills/generating-mermaid-diagrams/assets/datamodel/party-model-erd.md +237 -0
  252. package/skills/generating-mermaid-diagrams/assets/datamodel/quote-order-erd.md +277 -0
  253. package/skills/generating-mermaid-diagrams/assets/datamodel/revenue-cloud-erd.md +343 -0
  254. package/skills/generating-mermaid-diagrams/assets/datamodel/sales-cloud-erd.md +192 -0
  255. package/skills/generating-mermaid-diagrams/assets/datamodel/salesforce-erd.md +209 -0
  256. package/skills/generating-mermaid-diagrams/assets/datamodel/scheduler-erd.md +276 -0
  257. package/skills/generating-mermaid-diagrams/assets/datamodel/service-cloud-erd.md +217 -0
  258. package/skills/generating-mermaid-diagrams/assets/datamodel/territory-management-erd.md +241 -0
  259. package/skills/generating-mermaid-diagrams/assets/integration/api-sequence.md +387 -0
  260. package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code-pkce.md +197 -0
  261. package/skills/generating-mermaid-diagrams/assets/oauth/authorization-code.md +152 -0
  262. package/skills/generating-mermaid-diagrams/assets/oauth/client-credentials.md +233 -0
  263. package/skills/generating-mermaid-diagrams/assets/oauth/device-authorization.md +295 -0
  264. package/skills/generating-mermaid-diagrams/assets/oauth/jwt-bearer.md +256 -0
  265. package/skills/generating-mermaid-diagrams/assets/oauth/refresh-token.md +281 -0
  266. package/skills/generating-mermaid-diagrams/assets/oauth/user-agent-social-sign-on.md +281 -0
  267. package/skills/generating-mermaid-diagrams/assets/role-hierarchy/user-hierarchy.md +322 -0
  268. package/skills/generating-mermaid-diagrams/references/color-palette.md +464 -0
  269. package/skills/generating-mermaid-diagrams/references/diagram-conventions.md +313 -0
  270. package/skills/generating-mermaid-diagrams/references/erd-conventions.md +320 -0
  271. package/skills/generating-mermaid-diagrams/references/mermaid-reference.md +434 -0
  272. package/skills/generating-mermaid-diagrams/references/mermaid-styling.md +81 -0
  273. package/skills/generating-mermaid-diagrams/references/preview-guide.md +49 -0
  274. package/skills/generating-mermaid-diagrams/references/usage-examples.md +340 -0
  275. package/skills/generating-mermaid-diagrams/scripts/README.md +160 -0
  276. package/skills/generating-mermaid-diagrams/scripts/mermaid_preview.py +654 -0
  277. package/skills/generating-mermaid-diagrams/scripts/query-org-metadata.py +293 -0
  278. package/skills/generating-visual-diagrams/CREDITS.md +80 -0
  279. package/skills/generating-visual-diagrams/README.md +83 -0
  280. package/skills/generating-visual-diagrams/SKILL.md +208 -0
  281. package/skills/generating-visual-diagrams/assets/architecture/integration-flow.md +55 -0
  282. package/skills/generating-visual-diagrams/assets/erd/core-objects.md +131 -0
  283. package/skills/generating-visual-diagrams/assets/erd/custom-objects.md +60 -0
  284. package/skills/generating-visual-diagrams/assets/lwc/dashboard-card.md +45 -0
  285. package/skills/generating-visual-diagrams/assets/lwc/data-table.md +57 -0
  286. package/skills/generating-visual-diagrams/assets/lwc/record-form.md +60 -0
  287. package/skills/generating-visual-diagrams/assets/review/apex-review.md +57 -0
  288. package/skills/generating-visual-diagrams/assets/review/lwc-review.md +48 -0
  289. package/skills/generating-visual-diagrams/references/architect-aesthetic-guide.md +257 -0
  290. package/skills/generating-visual-diagrams/references/examples-index.md +35 -0
  291. package/skills/generating-visual-diagrams/references/gemini-cli-setup.md +65 -0
  292. package/skills/generating-visual-diagrams/references/interview-questions.md +529 -0
  293. package/skills/generating-visual-diagrams/references/iteration-workflow.md +173 -0
  294. package/skills/generating-visual-diagrams/scripts/check-prerequisites.sh +101 -0
  295. package/skills/generating-visual-diagrams/scripts/generate_image.py +243 -0
  296. package/skills/handling-sf-data/CREDITS.md +5 -0
  297. package/skills/handling-sf-data/README.md +112 -0
  298. package/skills/handling-sf-data/SKILL.md +235 -0
  299. package/skills/handling-sf-data/assets/bulk/bulk-insert-10000.apex +293 -0
  300. package/skills/handling-sf-data/assets/bulk/bulk-insert-200.apex +208 -0
  301. package/skills/handling-sf-data/assets/bulk/bulk-insert-500.apex +219 -0
  302. package/skills/handling-sf-data/assets/bulk/bulk-upsert-external-id.apex +324 -0
  303. package/skills/handling-sf-data/assets/cleanup/delete-by-created-date.apex +319 -0
  304. package/skills/handling-sf-data/assets/cleanup/delete-by-name.apex +240 -0
  305. package/skills/handling-sf-data/assets/cleanup/delete-test-data.apex +311 -0
  306. package/skills/handling-sf-data/assets/cleanup/rollback-transaction.apex +266 -0
  307. package/skills/handling-sf-data/assets/csv/account-import.csv +11 -0
  308. package/skills/handling-sf-data/assets/csv/contact-import.csv +11 -0
  309. package/skills/handling-sf-data/assets/csv/custom-object-import.csv +11 -0
  310. package/skills/handling-sf-data/assets/csv/opportunity-import.csv +11 -0
  311. package/skills/handling-sf-data/assets/factories/account-factory.apex +165 -0
  312. package/skills/handling-sf-data/assets/factories/case-factory.apex +237 -0
  313. package/skills/handling-sf-data/assets/factories/contact-factory.apex +168 -0
  314. package/skills/handling-sf-data/assets/factories/custom-object-factory.apex +260 -0
  315. package/skills/handling-sf-data/assets/factories/event-factory.apex +275 -0
  316. package/skills/handling-sf-data/assets/factories/hierarchy-factory.apex +372 -0
  317. package/skills/handling-sf-data/assets/factories/lead-factory.apex +190 -0
  318. package/skills/handling-sf-data/assets/factories/opportunity-factory.apex +206 -0
  319. package/skills/handling-sf-data/assets/factories/task-factory.apex +246 -0
  320. package/skills/handling-sf-data/assets/factories/user-factory.apex +278 -0
  321. package/skills/handling-sf-data/assets/json/account-contact-tree.json +130 -0
  322. package/skills/handling-sf-data/assets/json/account-opportunity-tree.json +110 -0
  323. package/skills/handling-sf-data/assets/json/full-hierarchy-tree.json +188 -0
  324. package/skills/handling-sf-data/assets/soql/aggregate.soql +226 -0
  325. package/skills/handling-sf-data/assets/soql/child-to-parent.soql +162 -0
  326. package/skills/handling-sf-data/assets/soql/parent-to-child.soql +153 -0
  327. package/skills/handling-sf-data/assets/soql/polymorphic.soql +198 -0
  328. package/skills/handling-sf-data/assets/soql/subquery.soql +287 -0
  329. package/skills/handling-sf-data/references/anonymous-apex-guide.md +98 -0
  330. package/skills/handling-sf-data/references/bulk-operations-guide.md +94 -0
  331. package/skills/handling-sf-data/references/bulk-testing-example.md +194 -0
  332. package/skills/handling-sf-data/references/cleanup-rollback-example.md +322 -0
  333. package/skills/handling-sf-data/references/cleanup-rollback-guide.md +84 -0
  334. package/skills/handling-sf-data/references/crud-workflow-example.md +183 -0
  335. package/skills/handling-sf-data/references/governor-limits-reference.md +74 -0
  336. package/skills/handling-sf-data/references/orchestration.md +174 -0
  337. package/skills/handling-sf-data/references/relationship-query-examples.md +249 -0
  338. package/skills/handling-sf-data/references/sf-cli-data-commands.md +158 -0
  339. package/skills/handling-sf-data/references/soql-relationship-guide.md +84 -0
  340. package/skills/handling-sf-data/references/test-data-best-practices.md +104 -0
  341. package/skills/handling-sf-data/references/test-data-factory-usage.md +290 -0
  342. package/skills/handling-sf-data/references/test-data-patterns.md +98 -0
  343. package/skills/handling-sf-data/scripts/soql_validator.py +292 -0
  344. package/skills/handling-sf-data/scripts/validate_data_operation.py +379 -0
  345. package/skills/harmonizing-datacloud/CREDITS.md +3 -0
  346. package/skills/harmonizing-datacloud/README.md +31 -0
  347. package/skills/harmonizing-datacloud/SKILL.md +117 -0
  348. package/skills/modeling-omnistudio-epc-catalog/CREDITS.md +14 -0
  349. package/skills/modeling-omnistudio-epc-catalog/README.md +89 -0
  350. package/skills/modeling-omnistudio-epc-catalog/SKILL.md +395 -0
  351. package/skills/modeling-omnistudio-epc-catalog/assets/attribute-assignment-template.json +402 -0
  352. package/skills/modeling-omnistudio-epc-catalog/assets/compiled-attribute-overrides-template.json +43 -0
  353. package/skills/modeling-omnistudio-epc-catalog/assets/completion-block-template.txt +8 -0
  354. package/skills/modeling-omnistudio-epc-catalog/assets/decomposition-relationships-template.json +233 -0
  355. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_AttributeAssignments.json +514 -0
  356. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_CompiledAttributeOverrides.json +21 -0
  357. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DataPack.json +649 -0
  358. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_DecompositionRelationships.json +200 -0
  359. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ObjectFieldAttributes.json +138 -0
  360. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OrchestrationScenarios.json +54 -0
  361. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_OverrideDefinitions.json +266 -0
  362. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ParentKeys.json +23 -0
  363. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PriceListEntries.json +54 -0
  364. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_PricebookEntries.json +35 -0
  365. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_ProductChildItems.json +34 -0
  366. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_RuleAssignments.json +21 -0
  367. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_AttributeAssignments.json +410 -0
  368. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DataPack.json +535 -0
  369. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_DecompositionRelationships.json +35 -0
  370. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ObjectFieldAttributes.json +138 -0
  371. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_OrchestrationScenarios.json +28 -0
  372. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ParentKeys.json +23 -0
  373. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PriceListEntries.json +220 -0
  374. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_PricebookEntries.json +35 -0
  375. package/skills/modeling-omnistudio-epc-catalog/assets/examples/business-internet-pro-vpl-simple-offer/Business-Internet-Pro-VPL_ProductChildItems.json +414 -0
  376. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_AttributeAssignments.json +382 -0
  377. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DataPack.json +565 -0
  378. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_DecompositionRelationships.json +35 -0
  379. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ObjectFieldAttributes.json +104 -0
  380. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_OrchestrationScenarios.json +28 -0
  381. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ParentKeys.json +13 -0
  382. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PriceListEntries.json +106 -0
  383. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_PricebookEntries.json +35 -0
  384. package/skills/modeling-omnistudio-epc-catalog/assets/examples/samsung-galaxy-s22-bundle/Samsung-Galaxy-S22-Bundle_ProductChildItems.json +72 -0
  385. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_AttributeAssignments.json +142 -0
  386. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DataPack.json +377 -0
  387. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_DecompositionRelationships.json +35 -0
  388. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ObjectFieldAttributes.json +36 -0
  389. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ParentKeys.json +8 -0
  390. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PriceListEntries.json +54 -0
  391. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_PricebookEntries.json +35 -0
  392. package/skills/modeling-omnistudio-epc-catalog/assets/examples/static-ip-simple-offer/Static-IP_ProductChildItems.json +34 -0
  393. package/skills/modeling-omnistudio-epc-catalog/assets/object-field-attributes-template.json +138 -0
  394. package/skills/modeling-omnistudio-epc-catalog/assets/orchestration-scenarios-template.json +54 -0
  395. package/skills/modeling-omnistudio-epc-catalog/assets/override-definitions-template.json +134 -0
  396. package/skills/modeling-omnistudio-epc-catalog/assets/parent-keys-template.json +29 -0
  397. package/skills/modeling-omnistudio-epc-catalog/assets/price-list-entries-template.json +158 -0
  398. package/skills/modeling-omnistudio-epc-catalog/assets/pricebook-entries-template.json +35 -0
  399. package/skills/modeling-omnistudio-epc-catalog/assets/product-child-item-template.json +338 -0
  400. package/skills/modeling-omnistudio-epc-catalog/assets/product2-offer-template.json +527 -0
  401. package/skills/modeling-omnistudio-epc-catalog/examples/.gitkeep +1 -0
  402. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_AttributeAssignments.json +95 -0
  403. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_CompiledAttributeOverrides.json +1 -0
  404. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DataPack.json +214 -0
  405. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_DecompositionRelationships.json +28 -0
  406. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ObjectFieldAttributes.json +98 -0
  407. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OrchestrationScenarios.json +22 -0
  408. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_OverrideDefinitions.json +1 -0
  409. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ParentKeys.json +13 -0
  410. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PriceListEntries.json +35 -0
  411. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_PricebookEntries.json +28 -0
  412. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/Business-Internet-Plus_ProductChildItems.json +110 -0
  413. package/skills/modeling-omnistudio-epc-catalog/examples/business-internet-plus-bundle/TRANSCRIPT.md +58 -0
  414. package/skills/modeling-omnistudio-epc-catalog/references/epc-field-guide.md +90 -0
  415. package/skills/modeling-omnistudio-epc-catalog/references/naming-conventions.md +80 -0
  416. package/skills/modeling-omnistudio-epc-catalog/references/scoring-model.md +57 -0
  417. package/skills/modeling-omnistudio-epc-catalog/scripts/cli-validation-commands.sh +19 -0
  418. package/skills/modeling-omnistudio-epc-catalog/scripts/sample-invocations.sh +18 -0
  419. package/skills/orchestrating-datacloud/CREDITS.md +15 -0
  420. package/skills/orchestrating-datacloud/README.md +129 -0
  421. package/skills/orchestrating-datacloud/SKILL.md +236 -0
  422. package/skills/orchestrating-datacloud/UPSTREAM.md +45 -0
  423. package/skills/orchestrating-datacloud/assets/definitions/activation-target.template.json +5 -0
  424. package/skills/orchestrating-datacloud/assets/definitions/activation.template.json +7 -0
  425. package/skills/orchestrating-datacloud/assets/definitions/calculated-insight.template.json +7 -0
  426. package/skills/orchestrating-datacloud/assets/definitions/data-action-target.template.json +5 -0
  427. package/skills/orchestrating-datacloud/assets/definitions/data-action.template.json +5 -0
  428. package/skills/orchestrating-datacloud/assets/definitions/data-graph.template.json +21 -0
  429. package/skills/orchestrating-datacloud/assets/definitions/data-stream.template.json +55 -0
  430. package/skills/orchestrating-datacloud/assets/definitions/dmo.template.json +17 -0
  431. package/skills/orchestrating-datacloud/assets/definitions/identity-resolution.template.json +30 -0
  432. package/skills/orchestrating-datacloud/assets/definitions/mapping.template.json +14 -0
  433. package/skills/orchestrating-datacloud/assets/definitions/relationship.template.json +12 -0
  434. package/skills/orchestrating-datacloud/assets/definitions/search-index.template.json +9 -0
  435. package/skills/orchestrating-datacloud/assets/definitions/segment.template.json +16 -0
  436. package/skills/orchestrating-datacloud/references/feature-readiness.md +157 -0
  437. package/skills/orchestrating-datacloud/references/plugin-setup.md +140 -0
  438. package/skills/orchestrating-datacloud/scripts/bootstrap-plugin.sh +53 -0
  439. package/skills/orchestrating-datacloud/scripts/diagnose-org.mjs +511 -0
  440. package/skills/orchestrating-datacloud/scripts/generate-manifest.mjs +68 -0
  441. package/skills/orchestrating-datacloud/scripts/verify-plugin.sh +58 -0
  442. package/skills/preparing-datacloud/CREDITS.md +7 -0
  443. package/skills/preparing-datacloud/README.md +51 -0
  444. package/skills/preparing-datacloud/SKILL.md +191 -0
  445. package/skills/preparing-datacloud/examples/ingestion-api/.env.example +8 -0
  446. package/skills/preparing-datacloud/examples/ingestion-api/README.md +48 -0
  447. package/skills/preparing-datacloud/examples/ingestion-api/send-data.py +144 -0
  448. package/skills/querying-soql/CREDITS.md +21 -0
  449. package/skills/querying-soql/README.md +41 -0
  450. package/skills/querying-soql/SKILL.md +143 -0
  451. package/skills/querying-soql/assets/aggregate-queries.soql +242 -0
  452. package/skills/querying-soql/assets/basic-queries.soql +188 -0
  453. package/skills/querying-soql/assets/bulkified-query-pattern.cls +280 -0
  454. package/skills/querying-soql/assets/optimization-patterns.soql +259 -0
  455. package/skills/querying-soql/assets/relationship-queries.soql +203 -0
  456. package/skills/querying-soql/assets/selector-class.cls +219 -0
  457. package/skills/querying-soql/references/anti-patterns.md +348 -0
  458. package/skills/querying-soql/references/cli-commands.md +358 -0
  459. package/skills/querying-soql/references/field-coverage-rules.md +514 -0
  460. package/skills/querying-soql/references/query-optimization.md +142 -0
  461. package/skills/querying-soql/references/selector-patterns.md +479 -0
  462. package/skills/querying-soql/references/soql-reference.md +227 -0
  463. package/skills/querying-soql/references/soql-syntax-reference.md +208 -0
  464. package/skills/querying-soql/scripts/post-tool-validate.py +322 -0
  465. package/skills/retrieving-datacloud/CREDITS.md +7 -0
  466. package/skills/retrieving-datacloud/README.md +44 -0
  467. package/skills/retrieving-datacloud/SKILL.md +120 -0
  468. package/skills/retrieving-datacloud/examples/search-indexes/hybrid-structured.json +44 -0
  469. package/skills/retrieving-datacloud/examples/search-indexes/vector-knowledge.json +43 -0
  470. package/skills/running-apex-tests/CREDITS.md +22 -0
  471. package/skills/running-apex-tests/README.md +94 -0
  472. package/skills/running-apex-tests/SKILL.md +158 -0
  473. package/skills/running-apex-tests/assets/basic-test.cls +169 -0
  474. package/skills/running-apex-tests/assets/bulk-test.cls +255 -0
  475. package/skills/running-apex-tests/assets/dml-mock.cls +339 -0
  476. package/skills/running-apex-tests/assets/mock-callout-test.cls +353 -0
  477. package/skills/running-apex-tests/assets/stub-provider-example.cls +364 -0
  478. package/skills/running-apex-tests/assets/test-data-factory.cls +328 -0
  479. package/skills/running-apex-tests/hooks/scripts/parse-test-results.py +364 -0
  480. package/skills/running-apex-tests/references/cli-commands.md +289 -0
  481. package/skills/running-apex-tests/references/mocking-patterns.md +500 -0
  482. package/skills/running-apex-tests/references/performance-optimization.md +283 -0
  483. package/skills/running-apex-tests/references/test-fix-loop.md +49 -0
  484. package/skills/running-apex-tests/references/test-patterns.md +154 -0
  485. package/skills/running-apex-tests/references/testing-best-practices.md +509 -0
  486. package/skills/segmenting-datacloud/CREDITS.md +3 -0
  487. package/skills/segmenting-datacloud/README.md +36 -0
  488. package/skills/segmenting-datacloud/SKILL.md +115 -0
@@ -0,0 +1,324 @@
1
+ /**
2
+ * ═══════════════════════════════════════════════════════════════════════════════
3
+ * BULK UPSERT WITH EXTERNAL ID
4
+ * For data synchronization and migration scenarios
5
+ * ═══════════════════════════════════════════════════════════════════════════════
6
+ *
7
+ * PURPOSE:
8
+ * Upsert (insert or update) records using an External ID field.
9
+ * This is essential for:
10
+ * â€ĸ Data synchronization with external systems
11
+ * â€ĸ Data migration from legacy systems
12
+ * â€ĸ Ongoing integrations where records may or may not exist
13
+ *
14
+ * HOW IT WORKS:
15
+ * â€ĸ If External ID matches → UPDATE existing record
16
+ * â€ĸ If External ID not found → INSERT new record
17
+ * â€ĸ External ID field must be marked as "External ID" in Salesforce
18
+ *
19
+ * ═══════════════════════════════════════════════════════════════════════════════
20
+ */
21
+
22
+ // ═══════════════════════════════════════════════════════════════════════════════
23
+ // APEX UPSERT EXAMPLE
24
+ // ═══════════════════════════════════════════════════════════════════════════════
25
+
26
+ /**
27
+ * Example: Upsert Accounts using External_Id__c field
28
+ *
29
+ * Prerequisites:
30
+ * 1. Create a custom field on Account: External_Id__c (Text, External ID, Unique)
31
+ * 2. Ensure field is marked as "External ID" in field settings
32
+ */
33
+
34
+ // Sample data simulating external system records
35
+ List<Map<String, Object>> externalData = new List<Map<String, Object>>{
36
+ new Map<String, Object>{
37
+ 'externalId' => 'EXT-001',
38
+ 'name' => 'External Account One',
39
+ 'industry' => 'Technology',
40
+ 'revenue' => 1000000
41
+ },
42
+ new Map<String, Object>{
43
+ 'externalId' => 'EXT-002',
44
+ 'name' => 'External Account Two',
45
+ 'industry' => 'Healthcare',
46
+ 'revenue' => 2000000
47
+ },
48
+ new Map<String, Object>{
49
+ 'externalId' => 'EXT-003',
50
+ 'name' => 'External Account Three',
51
+ 'industry' => 'Finance',
52
+ 'revenue' => 3000000
53
+ }
54
+ };
55
+
56
+ // Build Account records with External ID
57
+ List<Account> accountsToUpsert = new List<Account>();
58
+
59
+ for (Map<String, Object> data : externalData) {
60
+ accountsToUpsert.add(new Account(
61
+ External_Id__c = (String) data.get('externalId'),
62
+ Name = (String) data.get('name'),
63
+ Industry = (String) data.get('industry'),
64
+ AnnualRevenue = (Decimal) data.get('revenue'),
65
+ Type = 'Prospect',
66
+ Description = 'Synced from external system'
67
+ ));
68
+ }
69
+
70
+ // Upsert using External ID field
71
+ Schema.SObjectField externalIdField = Account.External_Id__c;
72
+ List<Database.UpsertResult> results = Database.upsert(accountsToUpsert, externalIdField, false);
73
+
74
+ // Process results
75
+ Integer insertedCount = 0;
76
+ Integer updatedCount = 0;
77
+ Integer errorCount = 0;
78
+
79
+ for (Integer i = 0; i < results.size(); i++) {
80
+ Database.UpsertResult result = results[i];
81
+ Account acc = accountsToUpsert[i];
82
+
83
+ if (result.isSuccess()) {
84
+ if (result.isCreated()) {
85
+ insertedCount++;
86
+ System.debug('✓ INSERTED: ' + acc.External_Id__c + ' -> ' + result.getId());
87
+ } else {
88
+ updatedCount++;
89
+ System.debug('✓ UPDATED: ' + acc.External_Id__c + ' -> ' + result.getId());
90
+ }
91
+ } else {
92
+ errorCount++;
93
+ for (Database.Error err : result.getErrors()) {
94
+ System.debug('✗ ERROR: ' + acc.External_Id__c + ' -> ' + err.getMessage());
95
+ }
96
+ }
97
+ }
98
+
99
+ System.debug('');
100
+ System.debug('═══════════════════════════════════════════════════════════════');
101
+ System.debug('UPSERT COMPLETE');
102
+ System.debug('═══════════════════════════════════════════════════════════════');
103
+ System.debug('Inserted: ' + insertedCount);
104
+ System.debug('Updated: ' + updatedCount);
105
+ System.debug('Errors: ' + errorCount);
106
+ System.debug('═══════════════════════════════════════════════════════════════');
107
+
108
+ // ═══════════════════════════════════════════════════════════════════════════════
109
+ // SF CLI BULK UPSERT
110
+ // ═══════════════════════════════════════════════════════════════════════════════
111
+
112
+ /*
113
+ STEP 1: Create CSV with External ID column
114
+
115
+ Example accounts-upsert.csv:
116
+ External_Id__c,Name,Industry,Type,AnnualRevenue,BillingCity,BillingState
117
+ EXT-001,External Account One,Technology,Prospect,1000000,San Francisco,CA
118
+ EXT-002,External Account Two,Healthcare,Customer,2000000,New York,NY
119
+ EXT-003,External Account Three,Finance,Partner,3000000,Chicago,IL
120
+
121
+ STEP 2: Run bulk upsert
122
+
123
+ sf data upsert bulk \
124
+ --file accounts-upsert.csv \
125
+ --sobject Account \
126
+ --external-id External_Id__c \
127
+ --target-org myorg \
128
+ --wait 30
129
+
130
+ NOTES:
131
+ â€ĸ The External_Id__c field must exist and be marked as External ID in Salesforce
132
+ â€ĸ To use standard Id field as the external ID: --external-id Id
133
+ â€ĸ CSV must include the external ID column
134
+ */
135
+
136
+ // ═══════════════════════════════════════════════════════════════════════════════
137
+ // EXAMPLE: UPSERT CONTACTS WITH ACCOUNT RELATIONSHIP
138
+ // ═══════════════════════════════════════════════════════════════════════════════
139
+
140
+ /**
141
+ * Upsert Contacts and establish Account relationship via External ID
142
+ *
143
+ * Prerequisites:
144
+ * 1. Account.External_Id__c exists and has values
145
+ * 2. Contact.External_Id__c exists
146
+ */
147
+
148
+ /*
149
+ List<Contact> contactsToUpsert = new List<Contact>();
150
+
151
+ // Create Contacts referencing Accounts by External ID
152
+ for (Map<String, Object> data : externalContactData) {
153
+ Contact con = new Contact(
154
+ External_Id__c = (String) data.get('contactExternalId'),
155
+ FirstName = (String) data.get('firstName'),
156
+ LastName = (String) data.get('lastName'),
157
+ Email = (String) data.get('email')
158
+ );
159
+
160
+ // Set Account relationship via External ID
161
+ // This creates the relationship without querying for the Account first
162
+ con.Account = new Account(
163
+ External_Id__c = (String) data.get('accountExternalId')
164
+ );
165
+
166
+ contactsToUpsert.add(con);
167
+ }
168
+
169
+ // Upsert Contacts
170
+ Database.upsert(contactsToUpsert, Contact.External_Id__c, false);
171
+ */
172
+
173
+ // ═══════════════════════════════════════════════════════════════════════════════
174
+ // CSV FOR CONTACT UPSERT WITH ACCOUNT RELATIONSHIP
175
+ // ═══════════════════════════════════════════════════════════════════════════════
176
+
177
+ /*
178
+ Example contacts-upsert.csv:
179
+
180
+ External_Id__c,FirstName,LastName,Email,Account.External_Id__c
181
+ CON-001,John,Smith,john.smith@example.com,EXT-001
182
+ CON-002,Jane,Doe,jane.doe@example.com,EXT-001
183
+ CON-003,Bob,Johnson,bob.johnson@example.com,EXT-002
184
+
185
+ Note: Use "Account.External_Id__c" to reference parent by External ID
186
+
187
+ sf data upsert bulk \
188
+ --file contacts-upsert.csv \
189
+ --sobject Contact \
190
+ --external-id External_Id__c \
191
+ --target-org myorg \
192
+ --wait 30
193
+ */
194
+
195
+ // ═══════════════════════════════════════════════════════════════════════════════
196
+ // EXAMPLE: UPSERT WITH STANDARD ID (Update existing records)
197
+ // ═══════════════════════════════════════════════════════════════════════════════
198
+
199
+ /*
200
+ When you have Salesforce IDs (from export), use Id as the external ID:
201
+
202
+ Example updates.csv:
203
+ Id,Name,Industry,AnnualRevenue
204
+ 001XXXXXXXXXXXX1,Updated Account One,Technology,1500000
205
+ 001XXXXXXXXXXXX2,Updated Account Two,Healthcare,2500000
206
+
207
+ sf data upsert bulk \
208
+ --file updates.csv \
209
+ --sobject Account \
210
+ --external-id Id \
211
+ --target-org myorg \
212
+ --wait 30
213
+ */
214
+
215
+ // ═══════════════════════════════════════════════════════════════════════════════
216
+ // COMPLETE SYNC WORKFLOW EXAMPLE
217
+ // ═══════════════════════════════════════════════════════════════════════════════
218
+
219
+ /*
220
+ FULL SYNC WORKFLOW:
221
+
222
+ 1. Export current data from Salesforce
223
+ sf data query \
224
+ --query "SELECT External_Id__c, Name, Industry FROM Account WHERE External_Id__c != null" \
225
+ --target-org myorg \
226
+ --result-format csv \
227
+ > current-accounts.csv
228
+
229
+ 2. Generate sync file from external system (your process)
230
+ - Include External_Id__c for each record
231
+ - Include all fields to update/insert
232
+
233
+ 3. Upsert the sync file
234
+ sf data upsert bulk \
235
+ --file sync-accounts.csv \
236
+ --sobject Account \
237
+ --external-id External_Id__c \
238
+ --target-org myorg \
239
+ --wait 30
240
+
241
+ 4. Check results
242
+ sf data bulk results \
243
+ --job-id [job-id-from-step-3] \
244
+ --target-org myorg
245
+ */
246
+
247
+ // ═══════════════════════════════════════════════════════════════════════════════
248
+ // BATCH APEX FOR COMPLEX UPSERT LOGIC
249
+ // ═══════════════════════════════════════════════════════════════════════════════
250
+
251
+ /**
252
+ * Batch class for upserting with custom logic
253
+ */
254
+ public class BulkUpsertProcessor implements Database.Batchable<SObject>, Database.Stateful {
255
+
256
+ private String query;
257
+ private Integer insertedCount = 0;
258
+ private Integer updatedCount = 0;
259
+ private Integer errorCount = 0;
260
+
261
+ public BulkUpsertProcessor(String soqlQuery) {
262
+ this.query = soqlQuery;
263
+ }
264
+
265
+ public Database.QueryLocator start(Database.BatchableContext bc) {
266
+ return Database.getQueryLocator(query);
267
+ }
268
+
269
+ public void execute(Database.BatchableContext bc, List<SObject> records) {
270
+ // Transform and prepare records for upsert
271
+ List<Account> accountsToUpsert = new List<Account>();
272
+
273
+ for (SObject record : records) {
274
+ Account source = (Account) record;
275
+
276
+ // Create upsert record
277
+ Account target = new Account(
278
+ External_Id__c = source.External_Id__c,
279
+ Name = source.Name,
280
+ Industry = source.Industry,
281
+ AnnualRevenue = source.AnnualRevenue,
282
+ LastModifiedDate = DateTime.now() // Will be auto-updated
283
+ );
284
+
285
+ // Apply transformation logic
286
+ if (target.AnnualRevenue != null && target.AnnualRevenue > 1000000) {
287
+ target.Type = 'Enterprise';
288
+ }
289
+
290
+ accountsToUpsert.add(target);
291
+ }
292
+
293
+ // Upsert with partial success
294
+ List<Database.UpsertResult> results = Database.upsert(
295
+ accountsToUpsert,
296
+ Account.External_Id__c,
297
+ false // Allow partial success
298
+ );
299
+
300
+ // Track results
301
+ for (Database.UpsertResult result : results) {
302
+ if (result.isSuccess()) {
303
+ if (result.isCreated()) {
304
+ insertedCount++;
305
+ } else {
306
+ updatedCount++;
307
+ }
308
+ } else {
309
+ errorCount++;
310
+ }
311
+ }
312
+ }
313
+
314
+ public void finish(Database.BatchableContext bc) {
315
+ System.debug('Batch Upsert Complete:');
316
+ System.debug(' Inserted: ' + insertedCount);
317
+ System.debug(' Updated: ' + updatedCount);
318
+ System.debug(' Errors: ' + errorCount);
319
+ }
320
+ }
321
+
322
+ // Execute with:
323
+ // String query = 'SELECT External_Id__c, Name, Industry, AnnualRevenue FROM Account WHERE External_Id__c != null';
324
+ // Database.executeBatch(new BulkUpsertProcessor(query), 200);
@@ -0,0 +1,319 @@
1
+ /**
2
+ * ═══════════════════════════════════════════════════════════════════════════════
3
+ * DELETE RECORDS BY CREATED DATE
4
+ * Clean up test records created within a specific time window
5
+ * ═══════════════════════════════════════════════════════════════════════════════
6
+ *
7
+ * PURPOSE:
8
+ * Delete records created during a testing session or time period.
9
+ * Useful when you know the approximate time test data was created.
10
+ *
11
+ * âš ī¸ WARNING:
12
+ * Always PREVIEW records before deleting!
13
+ * Be careful with date ranges - you might delete production data!
14
+ *
15
+ * ═══════════════════════════════════════════════════════════════════════════════
16
+ */
17
+
18
+ // ═══════════════════════════════════════════════════════════════════════════════
19
+ // CONFIGURATION
20
+ // ═══════════════════════════════════════════════════════════════════════════════
21
+
22
+ // Time window for records to delete
23
+ DateTime startTime = DateTime.now().addHours(-2); // 2 hours ago
24
+ DateTime endTime = DateTime.now(); // Now
25
+
26
+ // Optional: Add name pattern for extra safety
27
+ String namePattern = 'Test%'; // Set to null to skip name filter
28
+ Boolean useNameFilter = true; // Set to false to delete ALL records in time window
29
+
30
+ Boolean previewOnly = true; // Set to false to actually delete
31
+ Integer maxRecords = 10000; // Safety limit per object
32
+
33
+ // ═══════════════════════════════════════════════════════════════════════════════
34
+ // BUILD DYNAMIC QUERY CONDITIONS
35
+ // ═══════════════════════════════════════════════════════════════════════════════
36
+
37
+ String dateCondition = 'CreatedDate >= :startTime AND CreatedDate <= :endTime';
38
+
39
+ System.debug('═══════════════════════════════════════════════════════════════');
40
+ System.debug('DELETE BY CREATED DATE');
41
+ System.debug('═══════════════════════════════════════════════════════════════');
42
+ System.debug('Time Window:');
43
+ System.debug(' Start: ' + startTime.format('yyyy-MM-dd HH:mm:ss'));
44
+ System.debug(' End: ' + endTime.format('yyyy-MM-dd HH:mm:ss'));
45
+ if (useNameFilter) {
46
+ System.debug('Name Filter: ' + namePattern);
47
+ }
48
+ System.debug('Mode: ' + (previewOnly ? 'PREVIEW ONLY' : 'âš ī¸ DELETE MODE'));
49
+ System.debug('═══════════════════════════════════════════════════════════════');
50
+ System.debug('');
51
+
52
+ // ═══════════════════════════════════════════════════════════════════════════════
53
+ // STEP 1: PREVIEW ACCOUNTS
54
+ // ═══════════════════════════════════════════════════════════════════════════════
55
+
56
+ List<Account> accountsToDelete;
57
+ if (useNameFilter) {
58
+ accountsToDelete = [
59
+ SELECT Id, Name, CreatedDate, CreatedBy.Name
60
+ FROM Account
61
+ WHERE CreatedDate >= :startTime
62
+ AND CreatedDate <= :endTime
63
+ AND Name LIKE :namePattern
64
+ ORDER BY CreatedDate DESC
65
+ LIMIT :maxRecords
66
+ ];
67
+ } else {
68
+ accountsToDelete = [
69
+ SELECT Id, Name, CreatedDate, CreatedBy.Name
70
+ FROM Account
71
+ WHERE CreatedDate >= :startTime
72
+ AND CreatedDate <= :endTime
73
+ ORDER BY CreatedDate DESC
74
+ LIMIT :maxRecords
75
+ ];
76
+ }
77
+
78
+ System.debug('📋 ACCOUNTS in time window: ' + accountsToDelete.size());
79
+ if (!accountsToDelete.isEmpty()) {
80
+ System.debug(' Records:');
81
+ for (Integer i = 0; i < Math.min(10, accountsToDelete.size()); i++) {
82
+ Account acc = accountsToDelete[i];
83
+ System.debug(' - ' + acc.Name + ' (Created: ' + acc.CreatedDate.format('HH:mm:ss') + ' by ' + acc.CreatedBy.Name + ')');
84
+ }
85
+ if (accountsToDelete.size() > 10) {
86
+ System.debug(' ... and ' + (accountsToDelete.size() - 10) + ' more');
87
+ }
88
+ }
89
+ System.debug('');
90
+
91
+ // ═══════════════════════════════════════════════════════════════════════════════
92
+ // STEP 2: PREVIEW CONTACTS
93
+ // ═══════════════════════════════════════════════════════════════════════════════
94
+
95
+ List<Contact> contactsToDelete;
96
+ if (useNameFilter) {
97
+ contactsToDelete = [
98
+ SELECT Id, FirstName, LastName, Account.Name, CreatedDate, CreatedBy.Name
99
+ FROM Contact
100
+ WHERE CreatedDate >= :startTime
101
+ AND CreatedDate <= :endTime
102
+ AND (LastName LIKE :namePattern OR Account.Name LIKE :namePattern)
103
+ ORDER BY CreatedDate DESC
104
+ LIMIT :maxRecords
105
+ ];
106
+ } else {
107
+ contactsToDelete = [
108
+ SELECT Id, FirstName, LastName, Account.Name, CreatedDate, CreatedBy.Name
109
+ FROM Contact
110
+ WHERE CreatedDate >= :startTime
111
+ AND CreatedDate <= :endTime
112
+ ORDER BY CreatedDate DESC
113
+ LIMIT :maxRecords
114
+ ];
115
+ }
116
+
117
+ System.debug('📋 CONTACTS in time window: ' + contactsToDelete.size());
118
+ if (!contactsToDelete.isEmpty()) {
119
+ System.debug(' Records:');
120
+ for (Integer i = 0; i < Math.min(5, contactsToDelete.size()); i++) {
121
+ Contact con = contactsToDelete[i];
122
+ System.debug(' - ' + con.FirstName + ' ' + con.LastName + ' (Created: ' + con.CreatedDate.format('HH:mm:ss') + ')');
123
+ }
124
+ }
125
+ System.debug('');
126
+
127
+ // ═══════════════════════════════════════════════════════════════════════════════
128
+ // STEP 3: PREVIEW OPPORTUNITIES
129
+ // ═══════════════════════════════════════════════════════════════════════════════
130
+
131
+ List<Opportunity> opportunitiesToDelete;
132
+ if (useNameFilter) {
133
+ opportunitiesToDelete = [
134
+ SELECT Id, Name, Account.Name, StageName, Amount, CreatedDate
135
+ FROM Opportunity
136
+ WHERE CreatedDate >= :startTime
137
+ AND CreatedDate <= :endTime
138
+ AND (Name LIKE :namePattern OR Account.Name LIKE :namePattern)
139
+ ORDER BY CreatedDate DESC
140
+ LIMIT :maxRecords
141
+ ];
142
+ } else {
143
+ opportunitiesToDelete = [
144
+ SELECT Id, Name, Account.Name, StageName, Amount, CreatedDate
145
+ FROM Opportunity
146
+ WHERE CreatedDate >= :startTime
147
+ AND CreatedDate <= :endTime
148
+ ORDER BY CreatedDate DESC
149
+ LIMIT :maxRecords
150
+ ];
151
+ }
152
+
153
+ System.debug('📋 OPPORTUNITIES in time window: ' + opportunitiesToDelete.size());
154
+ System.debug('');
155
+
156
+ // ═══════════════════════════════════════════════════════════════════════════════
157
+ // STEP 4: PREVIEW TASKS
158
+ // ═══════════════════════════════════════════════════════════════════════════════
159
+
160
+ List<Task> tasksToDelete;
161
+ if (useNameFilter) {
162
+ tasksToDelete = [
163
+ SELECT Id, Subject, Status, CreatedDate
164
+ FROM Task
165
+ WHERE CreatedDate >= :startTime
166
+ AND CreatedDate <= :endTime
167
+ AND Subject LIKE :namePattern
168
+ ORDER BY CreatedDate DESC
169
+ LIMIT :maxRecords
170
+ ];
171
+ } else {
172
+ tasksToDelete = [
173
+ SELECT Id, Subject, Status, CreatedDate
174
+ FROM Task
175
+ WHERE CreatedDate >= :startTime
176
+ AND CreatedDate <= :endTime
177
+ ORDER BY CreatedDate DESC
178
+ LIMIT :maxRecords
179
+ ];
180
+ }
181
+
182
+ System.debug('📋 TASKS in time window: ' + tasksToDelete.size());
183
+ System.debug('');
184
+
185
+ // ═══════════════════════════════════════════════════════════════════════════════
186
+ // STEP 5: PREVIEW LEADS
187
+ // ═══════════════════════════════════════════════════════════════════════════════
188
+
189
+ List<Lead> leadsToDelete;
190
+ if (useNameFilter) {
191
+ leadsToDelete = [
192
+ SELECT Id, FirstName, LastName, Company, Status, CreatedDate
193
+ FROM Lead
194
+ WHERE CreatedDate >= :startTime
195
+ AND CreatedDate <= :endTime
196
+ AND (LastName LIKE :namePattern OR Company LIKE :namePattern)
197
+ ORDER BY CreatedDate DESC
198
+ LIMIT :maxRecords
199
+ ];
200
+ } else {
201
+ leadsToDelete = [
202
+ SELECT Id, FirstName, LastName, Company, Status, CreatedDate
203
+ FROM Lead
204
+ WHERE CreatedDate >= :startTime
205
+ AND CreatedDate <= :endTime
206
+ ORDER BY CreatedDate DESC
207
+ LIMIT :maxRecords
208
+ ];
209
+ }
210
+
211
+ System.debug('📋 LEADS in time window: ' + leadsToDelete.size());
212
+ System.debug('');
213
+
214
+ // ═══════════════════════════════════════════════════════════════════════════════
215
+ // SUMMARY
216
+ // ═══════════════════════════════════════════════════════════════════════════════
217
+
218
+ Integer totalRecords = accountsToDelete.size() + contactsToDelete.size() +
219
+ opportunitiesToDelete.size() + tasksToDelete.size() +
220
+ leadsToDelete.size();
221
+
222
+ System.debug('═══════════════════════════════════════════════════════════════');
223
+ System.debug('SUMMARY - Records in time window');
224
+ System.debug('═══════════════════════════════════════════════════════════════');
225
+ System.debug(' Accounts: ' + accountsToDelete.size());
226
+ System.debug(' Contacts: ' + contactsToDelete.size());
227
+ System.debug(' Opportunities: ' + opportunitiesToDelete.size());
228
+ System.debug(' Tasks: ' + tasksToDelete.size());
229
+ System.debug(' Leads: ' + leadsToDelete.size());
230
+ System.debug(' ─────────────────────────────────');
231
+ System.debug(' TOTAL: ' + totalRecords);
232
+ System.debug('═══════════════════════════════════════════════════════════════');
233
+
234
+ // ═══════════════════════════════════════════════════════════════════════════════
235
+ // STEP 6: DELETE (if not preview mode)
236
+ // ═══════════════════════════════════════════════════════════════════════════════
237
+
238
+ if (!previewOnly && totalRecords > 0) {
239
+ System.debug('');
240
+ System.debug('âš ī¸ DELETING RECORDS...');
241
+
242
+ Integer deletedCount = 0;
243
+
244
+ // Delete in correct order (children first, then parents)
245
+ if (!tasksToDelete.isEmpty()) {
246
+ delete tasksToDelete;
247
+ deletedCount += tasksToDelete.size();
248
+ System.debug(' ✓ Deleted ' + tasksToDelete.size() + ' Tasks');
249
+ }
250
+
251
+ if (!opportunitiesToDelete.isEmpty()) {
252
+ delete opportunitiesToDelete;
253
+ deletedCount += opportunitiesToDelete.size();
254
+ System.debug(' ✓ Deleted ' + opportunitiesToDelete.size() + ' Opportunities');
255
+ }
256
+
257
+ if (!contactsToDelete.isEmpty()) {
258
+ delete contactsToDelete;
259
+ deletedCount += contactsToDelete.size();
260
+ System.debug(' ✓ Deleted ' + contactsToDelete.size() + ' Contacts');
261
+ }
262
+
263
+ if (!leadsToDelete.isEmpty()) {
264
+ delete leadsToDelete;
265
+ deletedCount += leadsToDelete.size();
266
+ System.debug(' ✓ Deleted ' + leadsToDelete.size() + ' Leads');
267
+ }
268
+
269
+ if (!accountsToDelete.isEmpty()) {
270
+ delete accountsToDelete;
271
+ deletedCount += accountsToDelete.size();
272
+ System.debug(' ✓ Deleted ' + accountsToDelete.size() + ' Accounts');
273
+ }
274
+
275
+ System.debug('');
276
+ System.debug('═══════════════════════════════════════════════════════════════');
277
+ System.debug('DELETE COMPLETE: ' + deletedCount + ' records moved to Recycle Bin');
278
+ System.debug('═══════════════════════════════════════════════════════════════');
279
+ } else if (previewOnly) {
280
+ System.debug('');
281
+ System.debug('â„šī¸ PREVIEW MODE - No records deleted');
282
+ System.debug(' To delete, set previewOnly = false and run again');
283
+ }
284
+
285
+ // ═══════════════════════════════════════════════════════════════════════════════
286
+ // SF CLI ALTERNATIVE WITH DATE LITERALS
287
+ // ═══════════════════════════════════════════════════════════════════════════════
288
+
289
+ /*
290
+ Using SOQL date literals:
291
+
292
+ # Records created today
293
+ sf data query \
294
+ --query "SELECT Id FROM Account WHERE CreatedDate = TODAY AND Name LIKE 'Test%'" \
295
+ --target-org myorg \
296
+ --result-format csv \
297
+ > delete-today.csv
298
+
299
+ # Records created in the last hour
300
+ sf data query \
301
+ --query "SELECT Id FROM Account WHERE CreatedDate = LAST_N_HOURS:1 AND Name LIKE 'Test%'" \
302
+ --target-org myorg \
303
+ --result-format csv \
304
+ > delete-lasthour.csv
305
+
306
+ # Records created this week
307
+ sf data query \
308
+ --query "SELECT Id FROM Account WHERE CreatedDate = THIS_WEEK AND Name LIKE 'Test%'" \
309
+ --target-org myorg \
310
+ --result-format csv \
311
+ > delete-thisweek.csv
312
+
313
+ # Then bulk delete
314
+ sf data delete bulk \
315
+ --file delete-today.csv \
316
+ --sobject Account \
317
+ --target-org myorg \
318
+ --wait 30
319
+ */