@salesforce/afv-skills 1.8.0 → 1.9.1

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,40 @@
1
+ /**
2
+ * System.Callable skeleton — same inputMap/options structure as VlocityOpenInterface.
3
+ * Use when integrating with Open Interface callers or when callers pass { inputMap, options }.
4
+ * Backward-compatible: if args lacks 'inputMap', treats args itself as inputMap.
5
+ *
6
+ * Replace Industries_XxxCallable and actionOne with the actual class/action names.
7
+ */
8
+ public with sharing class Industries_XxxCallable implements System.Callable {
9
+
10
+ public Object call(String action, Map<String, Object> args) {
11
+ Map<String, Object> inputMap = (args != null && args.containsKey('inputMap'))
12
+ ? (Map<String, Object>) args.get('inputMap')
13
+ : (args != null ? args : new Map<String, Object>());
14
+ Map<String, Object> options = (args != null && args.containsKey('options'))
15
+ ? (Map<String, Object>) args.get('options')
16
+ : new Map<String, Object>();
17
+ if (inputMap == null) { inputMap = new Map<String, Object>(); }
18
+ if (options == null) { options = new Map<String, Object>(); }
19
+
20
+ switch on action {
21
+ when 'actionOne' {
22
+ return actionOne(inputMap, options);
23
+ }
24
+ when else {
25
+ throw new IndustriesCallableException('Unsupported action: ' + action);
26
+ }
27
+ }
28
+ }
29
+
30
+ private Map<String, Object> actionOne(Map<String, Object> inputMap, Map<String, Object> options) {
31
+ // 1. Validate required keys from inputMap
32
+ // 2. Coerce types safely
33
+ // 3. Run business logic (SOQL with WITH USER_MODE, DML with sharing)
34
+ // 4. Return response envelope
35
+ return new Map<String, Object>{
36
+ 'success' => true,
37
+ 'data' => new Map<String, Object>()
38
+ };
39
+ }
40
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Vanilla System.Callable skeleton — flat args, no Open Interface coupling.
3
+ * Use when callers pass flat args and no VlocityOpenInterface integration is required.
4
+ *
5
+ * Replace Industries_XxxCallable and actionOne with the actual class/action names.
6
+ */
7
+ public with sharing class Industries_XxxCallable implements System.Callable {
8
+
9
+ public Object call(String action, Map<String, Object> args) {
10
+ Map<String, Object> input = args != null ? args : new Map<String, Object>();
11
+
12
+ switch on action {
13
+ when 'actionOne' {
14
+ return actionOne(input);
15
+ }
16
+ when else {
17
+ throw new IndustriesCallableException('Unsupported action: ' + action);
18
+ }
19
+ }
20
+ }
21
+
22
+ private Map<String, Object> actionOne(Map<String, Object> args) {
23
+ // 1. Validate required keys (e.g. args.get('requiredKey'))
24
+ // 2. Coerce types safely
25
+ // 3. Run business logic (SOQL with WITH USER_MODE, DML with sharing)
26
+ // 4. Return response envelope
27
+ return new Map<String, Object>{
28
+ 'success' => true,
29
+ 'data' => new Map<String, Object>()
30
+ };
31
+ }
32
+ }
@@ -0,0 +1,54 @@
1
+ // ─────────────────────────────────────────────────────────────────────────────
2
+ // BEFORE: VlocityOpenInterface2
3
+ // Results written into outputMap by reference; return value is Boolean success flag.
4
+ // ─────────────────────────────────────────────────────────────────────────────
5
+ // global class OrderOpenInterface implements omnistudio.VlocityOpenInterface2 {
6
+ // global Boolean invokeMethod(String methodName, Map<String, Object> input,
7
+ // Map<String, Object> output,
8
+ // Map<String, Object> options) {
9
+ // if (methodName == 'createOrder') {
10
+ // output.putAll(createOrder(input, options));
11
+ // return true;
12
+ // }
13
+ // return false;
14
+ // }
15
+ //
16
+ // private Map<String, Object> createOrder(Map<String, Object> inputMap,
17
+ // Map<String, Object> options) {
18
+ // return new Map<String, Object>{ 'success' => true };
19
+ // }
20
+ // }
21
+
22
+ // ─────────────────────────────────────────────────────────────────────────────
23
+ // AFTER: System.Callable
24
+ // Same inputs (inputMap, options); return value replaces outputMap mutation.
25
+ // Action strings mirror the original methodName values to keep callers stable.
26
+ // ─────────────────────────────────────────────────────────────────────────────
27
+ public with sharing class Industries_XxxCallable implements System.Callable {
28
+
29
+ public Object call(String action, Map<String, Object> args) {
30
+ Map<String, Object> inputMap = (args != null && args.containsKey('inputMap'))
31
+ ? (Map<String, Object>) args.get('inputMap')
32
+ : (args != null ? args : new Map<String, Object>());
33
+ Map<String, Object> options = (args != null && args.containsKey('options'))
34
+ ? (Map<String, Object>) args.get('options')
35
+ : new Map<String, Object>();
36
+ if (inputMap == null) { inputMap = new Map<String, Object>(); }
37
+ if (options == null) { options = new Map<String, Object>(); }
38
+
39
+ switch on action {
40
+ when 'createOrder' {
41
+ return createOrder(inputMap, options);
42
+ }
43
+ when else {
44
+ throw new IndustriesCallableException('Unsupported action: ' + action);
45
+ }
46
+ }
47
+ }
48
+
49
+ private Map<String, Object> createOrder(Map<String, Object> inputMap,
50
+ Map<String, Object> options) {
51
+ // Validate input, run business logic, return response envelope
52
+ return new Map<String, Object>{ 'success' => true, 'data' => new Map<String, Object>() };
53
+ }
54
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * VlocityOpenInterface2 implementation skeleton.
3
+ * Use when the Industries extension point requires the legacy Open Interface contract.
4
+ *
5
+ * Key rules:
6
+ * - Write results into outputMap via putAll(); do NOT return the envelope from invokeMethod
7
+ * - Return true for success, false for unsupported/failed actions
8
+ * - Delegate to the same private methods as the Callable (same inputMap, options signature)
9
+ * - Populate outputMap with the same envelope shape (success, data, errors)
10
+ *
11
+ * Replace Industries_XxxOpenInterface and actionOne with the actual class/action names.
12
+ */
13
+ global with sharing class Industries_XxxOpenInterface implements omnistudio.VlocityOpenInterface2 {
14
+
15
+ global Boolean invokeMethod(String methodName, Map<String, Object> inputMap,
16
+ Map<String, Object> outputMap, Map<String, Object> options) {
17
+ switch on methodName {
18
+ when 'actionOne' {
19
+ Map<String, Object> result = actionOne(inputMap, options);
20
+ outputMap.putAll(result);
21
+ return true;
22
+ }
23
+ when else {
24
+ outputMap.put('success', false);
25
+ outputMap.put('errors', new List<Map<String, Object>>{
26
+ new Map<String, Object>{
27
+ 'code' => 'UNSUPPORTED_ACTION',
28
+ 'message' => 'Unsupported action: ' + methodName
29
+ }
30
+ });
31
+ return false;
32
+ }
33
+ }
34
+ }
35
+
36
+ private Map<String, Object> actionOne(Map<String, Object> inputMap, Map<String, Object> options) {
37
+ // 1. Validate required keys from inputMap
38
+ // 2. Run business logic (SOQL with WITH USER_MODE, DML with sharing)
39
+ // 3. Return response envelope (written into outputMap by the caller above)
40
+ return new Map<String, Object>{
41
+ 'success' => true,
42
+ 'data' => new Map<String, Object>()
43
+ };
44
+ }
45
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Test class skeleton for System.Callable implementations.
3
+ * Covers: positive, negative (missing input), unsupported action, and null-args cases.
4
+ *
5
+ * Replace Industries_XxxCallable, Industries_XxxCallableTest, and actionOne
6
+ * with the actual class/action names. Add @TestSetup data for your specific SObjects.
7
+ */
8
+ @IsTest
9
+ private class Industries_XxxCallableTest {
10
+
11
+ @TestSetup
12
+ static void setup() {
13
+ // Insert test SObject records needed by the callable here.
14
+ // Example:
15
+ // Account acc = new Account(Name = 'Test Account');
16
+ // insert acc;
17
+ }
18
+
19
+ @IsTest
20
+ static void testActionOne_success() {
21
+ System.Callable svc = new Industries_XxxCallable();
22
+ Map<String, Object> args = new Map<String, Object>{
23
+ 'inputMap' => new Map<String, Object>{ 'requiredKey' => 'requiredValue' },
24
+ 'options' => new Map<String, Object>()
25
+ };
26
+
27
+ Map<String, Object> result = (Map<String, Object>) svc.call('actionOne', args);
28
+
29
+ Assert.isTrue((Boolean) result.get('success'), 'Expected success=true');
30
+ Assert.isNotNull(result.get('data'), 'Expected data to be present');
31
+ }
32
+
33
+ @IsTest
34
+ static void testActionOne_missingInput() {
35
+ System.Callable svc = new Industries_XxxCallable();
36
+ Map<String, Object> args = new Map<String, Object>{
37
+ 'inputMap' => new Map<String, Object>(),
38
+ 'options' => new Map<String, Object>()
39
+ };
40
+
41
+ Map<String, Object> result = (Map<String, Object>) svc.call('actionOne', args);
42
+
43
+ Assert.isFalse((Boolean) result.get('success'), 'Expected success=false for missing input');
44
+ }
45
+
46
+ @IsTest
47
+ static void testUnsupportedAction() {
48
+ try {
49
+ System.Callable svc = new Industries_XxxCallable();
50
+ svc.call('unknownAction', new Map<String, Object>());
51
+ Assert.fail('Expected IndustriesCallableException');
52
+ } catch (IndustriesCallableException e) {
53
+ Assert.isTrue(e.getMessage().contains('Unsupported action'),
54
+ 'Expected unsupported action message');
55
+ }
56
+ }
57
+
58
+ @IsTest
59
+ static void testNullArgs() {
60
+ System.Callable svc = new Industries_XxxCallable();
61
+ // Null args must be handled defensively; must not throw NullPointerException
62
+ Map<String, Object> result = (Map<String, Object>) svc.call('actionOne', null);
63
+ Assert.isNotNull(result, 'Result must not be null even with null args');
64
+ }
65
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @description Custom exception for Industries callable implementations.
3
+ * Thrown when an unsupported or invalid action is requested.
4
+ * @author building-omnistudio-callable-apex
5
+ */
6
+ public class IndustriesCallableException extends Exception {
7
+ }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * @description Industries callable that finds Quotes on an Account that have at least one
3
+ * QuoteLineItem with a specified Product2.ProductCode.
4
+ * Integrates with OmniStudio/Industries extension points.
5
+ * @author building-omnistudio-callable-apex
6
+ *
7
+ * Actions:
8
+ * - findQuotesByProductCode: Returns Quotes for an Account with QuoteLineItems matching productCode
9
+ *
10
+ * Input (findQuotesByProductCode):
11
+ * - accountId (String, required): Id of the Account
12
+ * - productCode (String, required): Product2.ProductCode to match on QuoteLineItems
13
+ *
14
+ * Output envelope:
15
+ * - success (Boolean)
16
+ * - data (Map): quotes (List<Map> with Id, Name, QuoteNumber)
17
+ * - errors (List<Map>)
18
+ */
19
+ public with sharing class Industries_QuoteByProductCallable implements System.Callable {
20
+
21
+ private static final String ACTION_FIND_QUOTES = 'findQuotesByProductCode';
22
+
23
+ /**
24
+ * @description Dispatches to the appropriate action handler.
25
+ * @param action Action name (e.g. 'findQuotesByProductCode')
26
+ * @param args Input map with accountId and productCode
27
+ * @return Response envelope: success, data, errors
28
+ */
29
+ public Object call(String action, Map<String, Object> args) {
30
+ switch on action {
31
+ when ACTION_FIND_QUOTES {
32
+ return findQuotesByProductCode(args);
33
+ }
34
+ when else {
35
+ throw new IndustriesCallableException('Unsupported action: ' + action);
36
+ }
37
+ }
38
+ }
39
+
40
+ /**
41
+ * @description Finds all Quotes on an Account that have at least one QuoteLineItem
42
+ * with the specified Product2.ProductCode.
43
+ * @param args Map with keys: accountId (String), productCode (String)
44
+ * @return Response envelope with quotes list or errors
45
+ */
46
+ private Map<String, Object> findQuotesByProductCode(Map<String, Object> args) {
47
+ List<Map<String, Object>> errors = new List<Map<String, Object>>();
48
+
49
+ Object accountIdObj = args != null ? args.get('accountId') : null;
50
+ Object productCodeObj = args != null ? args.get('productCode') : null;
51
+
52
+ String accountId = accountIdObj != null ? String.valueOf(accountIdObj).trim() : null;
53
+ String productCode = productCodeObj != null ? String.valueOf(productCodeObj).trim() : null;
54
+
55
+ if (String.isBlank(accountId)) {
56
+ errors.add(new Map<String, Object>{
57
+ 'code' => 'MISSING_ACCOUNT_ID',
58
+ 'message' => 'accountId is required'
59
+ });
60
+ }
61
+ if (String.isBlank(productCode)) {
62
+ errors.add(new Map<String, Object>{
63
+ 'code' => 'MISSING_PRODUCT_CODE',
64
+ 'message' => 'productCode is required'
65
+ });
66
+ }
67
+ if (!errors.isEmpty()) {
68
+ return new Map<String, Object>{
69
+ 'success' => false,
70
+ 'data' => new Map<String, Object>{ 'quotes' => new List<Map<String, Object>>() },
71
+ 'errors' => errors
72
+ };
73
+ }
74
+
75
+ try {
76
+ List<Quote> quotes = [
77
+ SELECT Id, Name, QuoteNumber, OpportunityId
78
+ FROM Quote
79
+ WITH USER_MODE
80
+ WHERE Opportunity.AccountId = :accountId
81
+ AND Id IN (
82
+ SELECT QuoteId
83
+ FROM QuoteLineItem
84
+ WHERE Product2.ProductCode = :productCode
85
+ )
86
+ ];
87
+
88
+ List<Map<String, Object>> quoteMaps = new List<Map<String, Object>>();
89
+ for (Quote q : quotes) {
90
+ quoteMaps.add(new Map<String, Object>{
91
+ 'Id' => q.Id,
92
+ 'Name' => q.Name,
93
+ 'QuoteNumber' => q.QuoteNumber
94
+ });
95
+ }
96
+
97
+ return new Map<String, Object>{
98
+ 'success' => true,
99
+ 'data' => new Map<String, Object>{ 'quotes' => quoteMaps },
100
+ 'errors' => new List<Map<String, Object>>()
101
+ };
102
+ } catch (Exception e) {
103
+ return new Map<String, Object>{
104
+ 'success' => false,
105
+ 'data' => new Map<String, Object>{ 'quotes' => new List<Map<String, Object>>() },
106
+ 'errors' => new List<Map<String, Object>>{
107
+ new Map<String, Object>{
108
+ 'code' => 'QUERY_ERROR',
109
+ 'message' => e.getMessage()
110
+ }
111
+ }
112
+ };
113
+ }
114
+ }
115
+ }
@@ -0,0 +1,189 @@
1
+ /**
2
+ * @description Test class for Industries_QuoteByProductCallable.
3
+ * Covers positive, negative, contract, and unsupported action scenarios.
4
+ * @author building-omnistudio-callable-apex
5
+ */
6
+ @IsTest
7
+ private class Industries_QuoteByProductCallableTest {
8
+
9
+ // ═══════════════════════════════════════════════════════════════════════════
10
+ // TEST DATA SETUP
11
+ // ═══════════════════════════════════════════════════════════════════════════
12
+
13
+ @TestSetup
14
+ static void setupTestData() {
15
+ Account acc = new Account(Name = 'Test Account');
16
+ insert acc;
17
+
18
+ Pricebook2 pb = [SELECT Id FROM Pricebook2 WHERE IsStandard = true LIMIT 1];
19
+
20
+ Opportunity opp = new Opportunity(
21
+ Name = 'Test Opp',
22
+ AccountId = acc.Id,
23
+ Pricebook2Id = pb.Id,
24
+ StageName = 'Prospecting',
25
+ CloseDate = Date.today().addMonths(1)
26
+ );
27
+ insert opp;
28
+
29
+ Product2 prod = new Product2(
30
+ Name = 'Test Product',
31
+ ProductCode = 'PROD-001',
32
+ IsActive = true
33
+ );
34
+ insert prod;
35
+
36
+ PricebookEntry pbe = new PricebookEntry(
37
+ Pricebook2Id = pb.Id,
38
+ Product2Id = prod.Id,
39
+ UnitPrice = 100,
40
+ IsActive = true
41
+ );
42
+ insert pbe;
43
+
44
+ Quote q = new Quote(
45
+ Name = 'Test Quote',
46
+ OpportunityId = opp.Id,
47
+ Pricebook2Id = pb.Id
48
+ );
49
+ insert q;
50
+
51
+ QuoteLineItem qli = new QuoteLineItem(
52
+ QuoteId = q.Id,
53
+ PricebookEntryId = pbe.Id,
54
+ Quantity = 1,
55
+ UnitPrice = 100
56
+ );
57
+ insert qli;
58
+ }
59
+
60
+ // ═══════════════════════════════════════════════════════════════════════════
61
+ // POSITIVE TESTS
62
+ // ═══════════════════════════════════════════════════════════════════════════
63
+
64
+ /**
65
+ * @description Tests findQuotesByProductCode returns Quotes with matching productCode
66
+ */
67
+ @IsTest
68
+ static void testFindQuotesByProductCode_Success() {
69
+ Account acc = [SELECT Id FROM Account LIMIT 1];
70
+ System.Callable svc = new Industries_QuoteByProductCallable();
71
+ Map<String, Object> args = new Map<String, Object>{
72
+ 'accountId' => acc.Id,
73
+ 'productCode' => 'PROD-001'
74
+ };
75
+
76
+ Test.startTest();
77
+ Map<String, Object> result = (Map<String, Object>) svc.call('findQuotesByProductCode', args);
78
+ Test.stopTest();
79
+
80
+ Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
81
+ Map<String, Object> data = (Map<String, Object>) result.get('data');
82
+ List<Object> quotes = (List<Object>) data.get('quotes');
83
+ Assert.isNotNull(quotes, 'quotes list should not be null');
84
+ Assert.areEqual(1, quotes.size(), 'Should return 1 Quote');
85
+ }
86
+
87
+ /**
88
+ * @description Tests findQuotesByProductCode returns empty list when no match
89
+ */
90
+ @IsTest
91
+ static void testFindQuotesByProductCode_NoMatch_ReturnsEmpty() {
92
+ Account acc = [SELECT Id FROM Account LIMIT 1];
93
+ System.Callable svc = new Industries_QuoteByProductCallable();
94
+ Map<String, Object> args = new Map<String, Object>{
95
+ 'accountId' => acc.Id,
96
+ 'productCode' => 'NONEXISTENT'
97
+ };
98
+
99
+ Test.startTest();
100
+ Map<String, Object> result = (Map<String, Object>) svc.call('findQuotesByProductCode', args);
101
+ Test.stopTest();
102
+
103
+ Assert.isTrue((Boolean) result.get('success'), 'Should succeed with empty result');
104
+ Map<String, Object> data = (Map<String, Object>) result.get('data');
105
+ List<Object> quotes = (List<Object>) data.get('quotes');
106
+ Assert.areEqual(0, quotes.size(), 'Should return 0 Quotes');
107
+ }
108
+
109
+ // ═══════════════════════════════════════════════════════════════════════════
110
+ // CONTRACT / INPUT VALIDATION TESTS
111
+ // ═══════════════════════════════════════════════════════════════════════════
112
+
113
+ /**
114
+ * @description Tests missing accountId returns error envelope
115
+ */
116
+ @IsTest
117
+ static void testFindQuotesByProductCode_MissingAccountId_ReturnsError() {
118
+ Map<String, Object> args = new Map<String, Object>{
119
+ 'productCode' => 'PROD-001'
120
+ };
121
+ System.Callable svc = new Industries_QuoteByProductCallable();
122
+
123
+ Test.startTest();
124
+ Map<String, Object> result = (Map<String, Object>) svc.call('findQuotesByProductCode', args);
125
+ Test.stopTest();
126
+
127
+ Assert.isFalse((Boolean) result.get('success'), 'Should fail');
128
+ List<Object> errors = (List<Object>) result.get('errors');
129
+ Assert.isTrue(errors.size() >= 1, 'Should have at least one error');
130
+ }
131
+
132
+ /**
133
+ * @description Tests missing productCode returns error envelope
134
+ */
135
+ @IsTest
136
+ static void testFindQuotesByProductCode_MissingProductCode_ReturnsError() {
137
+ Account acc = [SELECT Id FROM Account LIMIT 1];
138
+ Map<String, Object> args = new Map<String, Object>{
139
+ 'accountId' => acc.Id
140
+ };
141
+ System.Callable svc = new Industries_QuoteByProductCallable();
142
+
143
+ Test.startTest();
144
+ Map<String, Object> result = (Map<String, Object>) svc.call('findQuotesByProductCode', args);
145
+ Test.stopTest();
146
+
147
+ Assert.isFalse((Boolean) result.get('success'), 'Should fail');
148
+ List<Object> errors = (List<Object>) result.get('errors');
149
+ Assert.isTrue(errors.size() >= 1, 'Should have at least one error');
150
+ }
151
+
152
+ /**
153
+ * @description Tests null args returns error envelope
154
+ */
155
+ @IsTest
156
+ static void testFindQuotesByProductCode_NullArgs_ReturnsError() {
157
+ System.Callable svc = new Industries_QuoteByProductCallable();
158
+
159
+ Test.startTest();
160
+ Map<String, Object> result = (Map<String, Object>) svc.call('findQuotesByProductCode', null);
161
+ Test.stopTest();
162
+
163
+ Assert.isFalse((Boolean) result.get('success'), 'Should fail');
164
+ }
165
+
166
+ // ═══════════════════════════════════════════════════════════════════════════
167
+ // NEGATIVE TESTS (Unsupported Action)
168
+ // ═══════════════════════════════════════════════════════════════════════════
169
+
170
+ /**
171
+ * @description Tests unsupported action throws IndustriesCallableException
172
+ */
173
+ @IsTest
174
+ static void testUnsupportedAction_ThrowsException() {
175
+ System.Callable svc = new Industries_QuoteByProductCallable();
176
+
177
+ Test.startTest();
178
+ try {
179
+ svc.call('unknownAction', new Map<String, Object>());
180
+ Assert.fail('Expected IndustriesCallableException');
181
+ } catch (IndustriesCallableException e) {
182
+ Assert.isTrue(
183
+ e.getMessage().contains('Unsupported action'),
184
+ 'Error message should mention unsupported action: ' + e.getMessage()
185
+ );
186
+ }
187
+ Test.stopTest();
188
+ }
189
+ }
@@ -0,0 +1,115 @@
1
+ # Reasoning Transcript: Industries Quote-by-Product Callable
2
+
3
+ This document records the reasoning process and skills used to generate `Industries_QuoteByProductCallable.cls` and `Industries_QuoteByProductCallableTest.cls`.
4
+
5
+ ---
6
+
7
+ ## Task Summary
8
+
9
+ Create a callable Apex class that finds all Quotes on an Account that have at least one QuoteLineItem with a specified Product2.ProductCode, plus a supporting test class.
10
+
11
+ ---
12
+
13
+ ## Skills Applied
14
+
15
+ ### 1. **building-omnistudio-callable-apex** (Primary)
16
+
17
+ **Path:** `~/.claude/skills/building-omnistudio-callable-apex/SKILL.md`
18
+ **Trigger:** Callable implementations, OmniStudio, Vlocity, Industries Apex extensions
19
+
20
+ **Application:**
21
+
22
+ - **Phase 1 – Requirements Gathering:**
23
+ Entry point: Integration Procedure / OmniScript. Action: `findQuotesByProductCode`.
24
+ Inputs: `accountId` (String), `productCode` (String).
25
+ Data: Quote, QuoteLineItem, Product2. No side effects (read-only).
26
+
27
+ - **Phase 2 – Contract Definition:**
28
+ Response envelope: `{ success, data: { quotes }, errors }`.
29
+ Action dispatch via `switch on action` with typed exception for unsupported actions.
30
+
31
+ - **Phase 3 – Implementation Pattern:**
32
+ - `call()` kept thin; logic delegated to `findQuotesByProductCode(args)`
33
+ - Input validation for `accountId` and `productCode` (blank checks)
34
+ - `with sharing` on the callable class
35
+ - SOQL with `WITH USER_MODE` for CRUD/FLS
36
+ - No SOQL/DML in loops
37
+ - Consistent envelope shape
38
+
39
+ - **Phase 4 – Testing:**
40
+ Positive, negative, contract, and unsupported-action tests per skill requirements.
41
+
42
+ - **Exception Class:**
43
+ `IndustriesCallableException` used per skill pattern for unsupported actions.
44
+
45
+ ---
46
+
47
+ ### 2. **generating-apex** (Reference)
48
+
49
+ **Path:** `~/.claude/skills/generating-apex/SKILL.md`
50
+ **Trigger:** Apex classes, code quality
51
+
52
+ **Application:**
53
+
54
+ - ApexDoc on the class and action method
55
+ - Naming: `Industries_QuoteByProductCallable` (callable pattern)
56
+ - Null-safe input handling
57
+ - Clear separation of concerns
58
+
59
+ ---
60
+
61
+ ### 3. **running-apex-tests** (Reference)
62
+
63
+ **Path:** `~/.claude/skills/running-apex-tests/SKILL.md`
64
+ **Trigger:** Apex tests
65
+
66
+ **Application:**
67
+
68
+ - `@TestSetup` for shared data (Account, Opportunity, Product2, PricebookEntry, Quote, QuoteLineItem)
69
+ - Positive: success case and empty-result case
70
+ - Contract: missing `accountId`, missing `productCode`, null args
71
+ - Negative: unsupported action throws `IndustriesCallableException`
72
+ - GIVEN/WHEN/THEN comments (adapted from basic-test template)
73
+
74
+ ---
75
+
76
+ ### 4. **querying-soql / handling-sf-data** (Reference)
77
+
78
+ **Paths:** `skills/handling-sf-data/assets/soql/`, `skills/generating-mermaid-diagrams/assets/datamodel/`
79
+ **Trigger:** SOQL and data model
80
+
81
+ **Application:**
82
+
83
+ - Quote–Opportunity–Account: `Quote.Opportunity.AccountId`
84
+ - QuoteLineItem–Product2: `QuoteLineItem.Product2.ProductCode`
85
+ - Subquery: `Id IN (SELECT QuoteId FROM QuoteLineItem WHERE Product2.ProductCode = :productCode)`
86
+ - Confirmation that Product2.ProductCode is queryable from QuoteLineItem
87
+
88
+ ---
89
+
90
+ ## Design Decisions
91
+
92
+ | Decision | Rationale |
93
+ |----------|-----------|
94
+ | **Response envelope** | Aligns with Industries pattern: `success`, `data`, `errors` for consistent handling by Integration Procedures |
95
+ | **Error envelope for validation** | Return structured errors instead of throwing; callers can handle without try/catch |
96
+ | **Exception for unsupported action** | Follows skill pattern; `IndustriesCallableException` makes misuse explicit |
97
+ | **`IndustriesCallableException` in separate class** | Reusable across callable classes, matches skill examples |
98
+ | **`WITH USER_MODE` on SOQL** | Enforces CRUD/FLS; requires API 59+ |
99
+ | **Quote ↔ Account path** | Standard model: `Quote.Opportunity.AccountId` (no direct Quote → Account) |
100
+ | **Product code on Product2** | Standard `Product2.ProductCode` via `QuoteLineItem.Product2` relationship |
101
+
102
+ ---
103
+
104
+ ## Artifacts Produced
105
+
106
+ 1. **IndustriesCallableException.cls** – Custom exception for unsupported actions
107
+ 2. **Industries_QuoteByProductCallable.cls** – Callable implementation
108
+ 3. **Industries_QuoteByProductCallableTest.cls** – Test class (6 methods)
109
+ 4. **TRANSCRIPT.md** – This reasoning transcript
110
+
111
+ ---
112
+
113
+ ## Deployment Notes
114
+
115
+ Copy the `.cls` files into your Salesforce project under `force-app/main/default/classes/` and add the corresponding `-meta.xml` files with `apiVersion` 59.0 or higher (for `WITH USER_MODE`). If your org uses an older API, remove `WITH USER_MODE` from the SOQL query.
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @description Custom exception for Industries callable implementations.
3
+ * Thrown when an unsupported or invalid action is requested.
4
+ * @author building-omnistudio-callable-apex
5
+ */
6
+ public class IndustriesCallableException extends Exception {
7
+ }