@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,74 @@
1
+ /**
2
+ * @description Callable implementation for calculateTotal (converted from VlocityOpenInterface2).
3
+ * Accepts price and quantity from inputMap, returns total in response envelope.
4
+ * Original: MyCustomRemoteClass implements omnistudio.VlocityOpenInterface2.
5
+ * @author building-omnistudio-callable-apex
6
+ */
7
+ public with sharing class MyCustomCallable implements System.Callable {
8
+
9
+ public Object call(String action, Map<String, Object> args) {
10
+ Map<String, Object> inputMap = (args != null && args.containsKey('inputMap'))
11
+ ? (Map<String, Object>) args.get('inputMap') : (args != null ? args : new Map<String, Object>());
12
+ Map<String, Object> options = (args != null && args.containsKey('options'))
13
+ ? (Map<String, Object>) args.get('options') : new Map<String, Object>();
14
+ if (inputMap == null) { inputMap = new Map<String, Object>(); }
15
+ if (options == null) { options = new Map<String, Object>(); }
16
+
17
+ switch on action {
18
+ when 'calculateTotal' {
19
+ return calculateTotal(inputMap, options);
20
+ }
21
+ when else {
22
+ throw new IndustriesCallableException('Unsupported action: ' + action);
23
+ }
24
+ }
25
+ }
26
+
27
+ private Map<String, Object> calculateTotal(Map<String, Object> inputMap, Map<String, Object> options) {
28
+ Decimal price = toDecimal(inputMap.get('price'));
29
+ Integer qty = toInteger(inputMap.get('quantity'));
30
+
31
+ if (price == null || qty == null) {
32
+ return new Map<String, Object>{
33
+ 'success' => false,
34
+ 'data' => new Map<String, Object>(),
35
+ 'errors' => new List<Map<String, Object>>{
36
+ new Map<String, Object>{
37
+ 'code' => 'INVALID_INPUT',
38
+ 'message' => 'price and quantity are required and must be numeric'
39
+ }
40
+ }
41
+ };
42
+ }
43
+
44
+ Decimal total = price * qty;
45
+
46
+ return new Map<String, Object>{
47
+ 'success' => true,
48
+ 'data' => new Map<String, Object>{ 'total' => total },
49
+ 'errors' => new List<Map<String, Object>>()
50
+ };
51
+ }
52
+
53
+ private Decimal toDecimal(Object o) {
54
+ if (o == null) return null;
55
+ if (o instanceof Decimal) return (Decimal) o;
56
+ if (o instanceof Integer) return Decimal.valueOf((Integer) o);
57
+ if (o instanceof Double) return Decimal.valueOf((Double) o);
58
+ if (o instanceof String) {
59
+ try { return Decimal.valueOf((String) o); } catch (TypeException e) { return null; }
60
+ }
61
+ return null;
62
+ }
63
+
64
+ private Integer toInteger(Object o) {
65
+ if (o == null) return null;
66
+ if (o instanceof Integer) return (Integer) o;
67
+ if (o instanceof Long) return ((Long) o).intValue();
68
+ if (o instanceof Decimal) return ((Decimal) o).intValue();
69
+ if (o instanceof String) {
70
+ try { return Integer.valueOf((String) o); } catch (TypeException e) { return null; }
71
+ }
72
+ return null;
73
+ }
74
+ }
@@ -0,0 +1,146 @@
1
+ /**
2
+ * @description Test class for MyCustomCallable (converted from MyCustomRemoteClass VlocityOpenInterface2).
3
+ * Covers positive, negative, contract, and unsupported action scenarios.
4
+ * @author building-omnistudio-callable-apex
5
+ */
6
+ @IsTest
7
+ private class MyCustomCallableTest {
8
+
9
+ // ═══════════════════════════════════════════════════════════════════════════
10
+ // POSITIVE TESTS
11
+ // ═══════════════════════════════════════════════════════════════════════════
12
+
13
+ /**
14
+ * @description Tests calculateTotal returns total with inputMap/options format
15
+ */
16
+ @IsTest
17
+ static void testCalculateTotal_Success() {
18
+ System.Callable svc = new MyCustomCallable();
19
+ Map<String, Object> args = new Map<String, Object>{
20
+ 'inputMap' => new Map<String, Object>{
21
+ 'price' => 10.50,
22
+ 'quantity' => 3
23
+ },
24
+ 'options' => new Map<String, Object>()
25
+ };
26
+
27
+ Test.startTest();
28
+ Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
29
+ Test.stopTest();
30
+
31
+ Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
32
+ Map<String, Object> data = (Map<String, Object>) result.get('data');
33
+ Assert.areEqual(31.50, (Decimal) data.get('total'), 'total should be 10.50 * 3');
34
+ }
35
+
36
+ /**
37
+ * @description Tests calculateTotal with flat args (backward compatibility)
38
+ */
39
+ @IsTest
40
+ static void testCalculateTotal_FlatArgs_Success() {
41
+ System.Callable svc = new MyCustomCallable();
42
+ Map<String, Object> args = new Map<String, Object>{
43
+ 'price' => 100,
44
+ 'quantity' => 5
45
+ };
46
+
47
+ Test.startTest();
48
+ Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
49
+ Test.stopTest();
50
+
51
+ Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
52
+ Map<String, Object> data = (Map<String, Object>) result.get('data');
53
+ Assert.areEqual(500, (Decimal) data.get('total'), 'total should be 100 * 5');
54
+ }
55
+
56
+ /**
57
+ * @description Tests calculateTotal with string inputs (type coercion from OmniScript)
58
+ */
59
+ @IsTest
60
+ static void testCalculateTotal_StringInputs_Success() {
61
+ System.Callable svc = new MyCustomCallable();
62
+ Map<String, Object> args = new Map<String, Object>{
63
+ 'inputMap' => new Map<String, Object>{
64
+ 'price' => '25.00',
65
+ 'quantity' => '4'
66
+ },
67
+ 'options' => new Map<String, Object>()
68
+ };
69
+
70
+ Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
71
+
72
+ Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
73
+ Map<String, Object> data = (Map<String, Object>) result.get('data');
74
+ Assert.areEqual(100, (Decimal) data.get('total'), 'total should be 25 * 4');
75
+ }
76
+
77
+ // ═══════════════════════════════════════════════════════════════════════════
78
+ // NEGATIVE / CONTRACT TESTS
79
+ // ═══════════════════════════════════════════════════════════════════════════
80
+
81
+ /**
82
+ * @description Tests unsupported action throws IndustriesCallableException
83
+ */
84
+ @IsTest
85
+ static void testUnsupportedAction_Throws() {
86
+ try {
87
+ System.Callable svc = new MyCustomCallable();
88
+ svc.call('unknownAction', new Map<String, Object>{
89
+ 'inputMap' => new Map<String, Object>(),
90
+ 'options' => new Map<String, Object>()
91
+ });
92
+ Assert.fail('Expected IndustriesCallableException');
93
+ } catch (IndustriesCallableException e) {
94
+ Assert.isTrue(e.getMessage().contains('Unsupported action'), 'Message should mention unsupported action');
95
+ }
96
+ }
97
+
98
+ /**
99
+ * @description Tests missing price returns error envelope
100
+ */
101
+ @IsTest
102
+ static void testCalculateTotal_MissingPrice_ReturnsError() {
103
+ System.Callable svc = new MyCustomCallable();
104
+ Map<String, Object> args = new Map<String, Object>{
105
+ 'inputMap' => new Map<String, Object>{ 'quantity' => 2 },
106
+ 'options' => new Map<String, Object>()
107
+ };
108
+
109
+ Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
110
+
111
+ Assert.isFalse((Boolean) result.get('success'), 'Should fail');
112
+ List<Object> errors = (List<Object>) result.get('errors');
113
+ Assert.isNotNull(errors, 'errors should not be null');
114
+ Assert.areEqual(1, errors.size(), 'Should have one error');
115
+ }
116
+
117
+ /**
118
+ * @description Tests missing quantity returns error envelope
119
+ */
120
+ @IsTest
121
+ static void testCalculateTotal_MissingQuantity_ReturnsError() {
122
+ System.Callable svc = new MyCustomCallable();
123
+ Map<String, Object> args = new Map<String, Object>{
124
+ 'inputMap' => new Map<String, Object>{ 'price' => 50 },
125
+ 'options' => new Map<String, Object>()
126
+ };
127
+
128
+ Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
129
+
130
+ Assert.isFalse((Boolean) result.get('success'), 'Should fail');
131
+ List<Object> errors = (List<Object>) result.get('errors');
132
+ Assert.isNotNull(errors, 'errors should not be null');
133
+ }
134
+
135
+ /**
136
+ * @description Tests null args handled gracefully
137
+ */
138
+ @IsTest
139
+ static void testCalculateTotal_NullArgs_ReturnsError() {
140
+ System.Callable svc = new MyCustomCallable();
141
+
142
+ Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', null);
143
+
144
+ Assert.isFalse((Boolean) result.get('success'), 'Should fail with null inputMap');
145
+ }
146
+ }
@@ -0,0 +1,16 @@
1
+ global with sharing class MyCustomRemoteClass implements omnistudio.VlocityOpenInterface2 {
2
+
3
+ global Boolean invokeMethod(String methodName, Map<String,Object> inputMap, Map<String,Object> outputMap, Map<String,Object> options) {
4
+ if (methodName.equals('calculateTotal')) {
5
+ calculateTotal(inputMap, outputMap);
6
+ return true;
7
+ }
8
+ return false;
9
+ }
10
+
11
+ private void calculateTotal(Map<String,Object> inputMap, Map<String,Object> outputMap) {
12
+ Decimal price = (Decimal)inputMap.get('price');
13
+ Decimal qty = (Decimal)inputMap.get('quantity');
14
+ outputMap.put('total', price * qty);
15
+ }
16
+ }
@@ -0,0 +1,120 @@
1
+ # Reasoning Transcript: VlocityOpenInterface2 → Callable Conversion (MyCustomRemoteClass)
2
+
3
+ This document records the reasoning process and skills used to convert `MyCustomRemoteClass.cls` (VlocityOpenInterface2) to `MyCustomCallable.cls` and create `MyCustomCallableTest.cls`.
4
+
5
+ ---
6
+
7
+ ## Task Summary
8
+
9
+ Convert a VlocityOpenInterface2 implementation (`MyCustomRemoteClass`) to `System.Callable`, add a test class, and document reasoning and skills used.
10
+
11
+ ---
12
+
13
+ ## Source Analysis
14
+
15
+ **Original class:** `MyCustomRemoteClass.cls`
16
+
17
+ - **Implements:** `omnistudio.VlocityOpenInterface2`
18
+ - **Action:** `calculateTotal`
19
+ - **Input contract:** `inputMap` with keys `price` (Decimal), `quantity` (Decimal)
20
+ - **Output contract:** `outputMap.put('total', price * qty)`
21
+ - **Behavior:** Single action; returns `true` on success, `false` for unsupported methods
22
+
23
+ ---
24
+
25
+ ## Skills Applied
26
+
27
+ ### 1. **building-omnistudio-callable-apex** (Primary)
28
+
29
+ **Path:** `skills/building-omnistudio-callable-apex/SKILL.md`
30
+ **Trigger:** Callable implementations, VlocityOpenInterface, migration to System.Callable
31
+
32
+ **Application:**
33
+
34
+ - **Migration guidance (SKILL § Migration: VlocityOpenInterface to System.Callable):**
35
+ - Preserved action name: `calculateTotal` → `action` in `call()`
36
+ - Pass `inputMap` and `options` as keys in `args`: `{ 'inputMap' => inputMap, 'options' => options }`
37
+ - Return response envelope instead of mutating `outputMap`
38
+ - Keep `call()` thin; delegate to `calculateTotal(inputMap, options)`
39
+ - Backward compatibility: if `args` lacks `inputMap`, treat `args` as `inputMap`
40
+
41
+ - **Callable skeleton (SKILL § Phase 3 – Callable skeleton):**
42
+ - Extracted `inputMap` and `options` from `args` with null guards
43
+ - `switch on action` with `when else` throwing `IndustriesCallableException`
44
+
45
+ - **Response envelope:**
46
+ ```
47
+ { success, data: { total }, errors }
48
+ ```
49
+
50
+ - **Input validation:** Added `toDecimal()` and `toInteger()` type coercion (OmniScript often passes strings); return error envelope when `price` or `quantity` is null or invalid.
51
+
52
+ - **Contract & Dispatch:** Explicit action list; typed exception for unsupported actions.
53
+
54
+ ---
55
+
56
+ ### 2. **generating-apex** (Reference)
57
+
58
+ **Path:** `~/.claude/skills/generating-apex/SKILL.md`
59
+ **Trigger:** Apex classes, code quality
60
+
61
+ **Application:**
62
+
63
+ - ApexDoc on class and key methods
64
+ - `with sharing` on the callable class
65
+ - Null-safe input handling; no direct casts without validation
66
+ - Naming: `MyCustomCallable` (callable pattern; preserves "MyCustom" from source)
67
+
68
+ ---
69
+
70
+ ### 3. **running-apex-tests** (Reference)
71
+
72
+ **Path:** `~/.claude/skills/running-apex-tests/SKILL.md`
73
+ **Trigger:** Apex tests
74
+
75
+ **Application:**
76
+
77
+ - **Positive:** Success with `inputMap`/`options`, flat args, and string inputs (type coercion)
78
+ - **Contract:** Missing `price`, missing `quantity`, null args → error envelope
79
+ - **Negative:** Unsupported action throws `IndustriesCallableException`
80
+ - GIVEN/WHEN/THEN implied via clear assertions and method names
81
+
82
+ ---
83
+
84
+ ## Design Decisions
85
+
86
+ | Decision | Rationale |
87
+ |----------|-----------|
88
+ | **Preserve lowercase keys** (`price`, `quantity`, `total`) | Original `MyCustomRemoteClass` used lowercase; maintains contract for existing Integration Procedures / OmniScripts |
89
+ | **Response envelope** | Aligns with Industries pattern; callers get consistent `success`, `data`, `errors` shape |
90
+ | **Error envelope for validation** | Return structured errors instead of throwing; callers can handle without try/catch |
91
+ | **Exception for unsupported action** | Skill pattern; `IndustriesCallableException` makes misuse explicit |
92
+ | **Type coercion helpers** | OmniScript/Integration Procedures often pass strings; `toDecimal`/`toInteger` allow `'25.00'`, `'4'` etc. |
93
+ | **Flat args fallback** | When `args` lacks `inputMap`, treat `args` as `inputMap` for backward compatibility |
94
+
95
+ ---
96
+
97
+ ## Artifacts Produced
98
+
99
+ 1. **IndustriesCallableException.cls** – Custom exception for unsupported actions
100
+ 2. **MyCustomCallable.cls** – Callable implementation (converted from MyCustomRemoteClass)
101
+ 3. **MyCustomCallableTest.cls** – Test class (7 methods)
102
+ 4. **TRANSCRIPT.md** – This reasoning transcript
103
+
104
+ ---
105
+
106
+ ## Contract Mapping (Before → After)
107
+
108
+ | VlocityOpenInterface2 | System.Callable |
109
+ |----------------------|-----------------|
110
+ | `methodName` = `'calculateTotal'` | `action` = `'calculateTotal'` |
111
+ | `inputMap.get('price')`, `inputMap.get('quantity')` | Same keys in `args.inputMap` or flat `args` |
112
+ | `outputMap.put('total', ...)` | `return { success => true, data => { total => ... } }` |
113
+ | `return false` for unsupported | `throw IndustriesCallableException` |
114
+ | `options` (unused in original) | Passed through for future use |
115
+
116
+ ---
117
+
118
+ ## Deployment Notes
119
+
120
+ Copy the `.cls` files into your Salesforce project under `force-app/main/default/classes/` and add the corresponding `-meta.xml` files. No SOQL/DML; no special API version requirements.
@@ -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,73 @@
1
+ /**
2
+ * @description Callable implementation for calculateTotal (converted from VlocityOpenInterface).
3
+ * Accepts Price and Quantity, returns TotalAmount in response envelope.
4
+ * @author building-omnistudio-callable-apex
5
+ */
6
+ public with sharing class MyCustomCallable implements System.Callable {
7
+
8
+ public Object call(String action, Map<String, Object> args) {
9
+ Map<String, Object> inputMap = (args != null && args.containsKey('inputMap'))
10
+ ? (Map<String, Object>) args.get('inputMap') : (args != null ? args : new Map<String, Object>());
11
+ Map<String, Object> options = (args != null && args.containsKey('options'))
12
+ ? (Map<String, Object>) args.get('options') : new Map<String, Object>();
13
+ if (inputMap == null) { inputMap = new Map<String, Object>(); }
14
+ if (options == null) { options = new Map<String, Object>(); }
15
+
16
+ switch on action {
17
+ when 'calculateTotal' {
18
+ return calculateTotal(inputMap, options);
19
+ }
20
+ when else {
21
+ throw new IndustriesCallableException('Unsupported action: ' + action);
22
+ }
23
+ }
24
+ }
25
+
26
+ private Map<String, Object> calculateTotal(Map<String, Object> inputMap, Map<String, Object> options) {
27
+ Decimal price = toDecimal(inputMap.get('Price'));
28
+ Integer qty = toInteger(inputMap.get('Quantity'));
29
+
30
+ if (price == null || qty == null) {
31
+ return new Map<String, Object>{
32
+ 'success' => false,
33
+ 'data' => new Map<String, Object>(),
34
+ 'errors' => new List<Map<String, Object>>{
35
+ new Map<String, Object>{
36
+ 'code' => 'INVALID_INPUT',
37
+ 'message' => 'Price and Quantity are required and must be numeric'
38
+ }
39
+ }
40
+ };
41
+ }
42
+
43
+ Decimal total = price * qty;
44
+
45
+ return new Map<String, Object>{
46
+ 'success' => true,
47
+ 'data' => new Map<String, Object>{ 'TotalAmount' => total },
48
+ 'errors' => new List<Map<String, Object>>()
49
+ };
50
+ }
51
+
52
+ private Decimal toDecimal(Object o) {
53
+ if (o == null) return null;
54
+ if (o instanceof Decimal) return (Decimal) o;
55
+ if (o instanceof Integer) return Decimal.valueOf((Integer) o);
56
+ if (o instanceof Double) return Decimal.valueOf((Double) o);
57
+ if (o instanceof String) {
58
+ try { return Decimal.valueOf((String) o); } catch (TypeException e) { return null; }
59
+ }
60
+ return null;
61
+ }
62
+
63
+ private Integer toInteger(Object o) {
64
+ if (o == null) return null;
65
+ if (o instanceof Integer) return (Integer) o;
66
+ if (o instanceof Long) return ((Long) o).intValue();
67
+ if (o instanceof Decimal) return ((Decimal) o).intValue();
68
+ if (o instanceof String) {
69
+ try { return Integer.valueOf((String) o); } catch (TypeException e) { return null; }
70
+ }
71
+ return null;
72
+ }
73
+ }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * @description Test class for MyCustomCallable.
3
+ * Covers positive, negative, contract, and unsupported action scenarios.
4
+ * @author building-omnistudio-callable-apex
5
+ */
6
+ @IsTest
7
+ private class MyCustomCallableTest {
8
+
9
+ // ═══════════════════════════════════════════════════════════════════════════
10
+ // POSITIVE TESTS
11
+ // ═══════════════════════════════════════════════════════════════════════════
12
+
13
+ /**
14
+ * @description Tests calculateTotal returns TotalAmount with inputMap/options format
15
+ */
16
+ @IsTest
17
+ static void testCalculateTotal_Success() {
18
+ System.Callable svc = new MyCustomCallable();
19
+ Map<String, Object> args = new Map<String, Object>{
20
+ 'inputMap' => new Map<String, Object>{
21
+ 'Price' => 10.50,
22
+ 'Quantity' => 3
23
+ },
24
+ 'options' => new Map<String, Object>()
25
+ };
26
+
27
+ Test.startTest();
28
+ Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
29
+ Test.stopTest();
30
+
31
+ Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
32
+ Map<String, Object> data = (Map<String, Object>) result.get('data');
33
+ Assert.areEqual(31.50, (Decimal) data.get('TotalAmount'), 'TotalAmount should be 10.50 * 3');
34
+ }
35
+
36
+ /**
37
+ * @description Tests calculateTotal with flat args (backward compatibility)
38
+ */
39
+ @IsTest
40
+ static void testCalculateTotal_FlatArgs_Success() {
41
+ System.Callable svc = new MyCustomCallable();
42
+ Map<String, Object> args = new Map<String, Object>{
43
+ 'Price' => 100,
44
+ 'Quantity' => 5
45
+ };
46
+
47
+ Test.startTest();
48
+ Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
49
+ Test.stopTest();
50
+
51
+ Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
52
+ Map<String, Object> data = (Map<String, Object>) result.get('data');
53
+ Assert.areEqual(500, (Decimal) data.get('TotalAmount'), 'TotalAmount should be 100 * 5');
54
+ }
55
+
56
+ /**
57
+ * @description Tests calculateTotal with string inputs (type coercion from OmniScript)
58
+ */
59
+ @IsTest
60
+ static void testCalculateTotal_StringInputs_Success() {
61
+ System.Callable svc = new MyCustomCallable();
62
+ Map<String, Object> args = new Map<String, Object>{
63
+ 'inputMap' => new Map<String, Object>{
64
+ 'Price' => '25.00',
65
+ 'Quantity' => '4'
66
+ },
67
+ 'options' => new Map<String, Object>()
68
+ };
69
+
70
+ Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
71
+
72
+ Assert.isTrue((Boolean) result.get('success'), 'Should succeed');
73
+ Map<String, Object> data = (Map<String, Object>) result.get('data');
74
+ Assert.areEqual(100, (Decimal) data.get('TotalAmount'), 'TotalAmount should be 25 * 4');
75
+ }
76
+
77
+ // ═══════════════════════════════════════════════════════════════════════════
78
+ // NEGATIVE / CONTRACT TESTS
79
+ // ═══════════════════════════════════════════════════════════════════════════
80
+
81
+ /**
82
+ * @description Tests unsupported action throws IndustriesCallableException
83
+ */
84
+ @IsTest
85
+ static void testUnsupportedAction_Throws() {
86
+ try {
87
+ System.Callable svc = new MyCustomCallable();
88
+ svc.call('unknownAction', new Map<String, Object>{
89
+ 'inputMap' => new Map<String, Object>(),
90
+ 'options' => new Map<String, Object>()
91
+ });
92
+ Assert.fail('Expected IndustriesCallableException');
93
+ } catch (IndustriesCallableException e) {
94
+ Assert.isTrue(e.getMessage().contains('Unsupported action'), 'Message should mention unsupported action');
95
+ }
96
+ }
97
+
98
+ /**
99
+ * @description Tests missing Price returns error envelope
100
+ */
101
+ @IsTest
102
+ static void testCalculateTotal_MissingPrice_ReturnsError() {
103
+ System.Callable svc = new MyCustomCallable();
104
+ Map<String, Object> args = new Map<String, Object>{
105
+ 'inputMap' => new Map<String, Object>{ 'Quantity' => 2 },
106
+ 'options' => new Map<String, Object>()
107
+ };
108
+
109
+ Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', args);
110
+
111
+ Assert.isFalse((Boolean) result.get('success'), 'Should fail');
112
+ List<Object> errors = (List<Object>) result.get('errors');
113
+ Assert.isNotNull(errors, 'errors should not be null');
114
+ Assert.areEqual(1, errors.size(), 'Should have one error');
115
+ }
116
+
117
+ /**
118
+ * @description Tests null args handled gracefully
119
+ */
120
+ @IsTest
121
+ static void testCalculateTotal_NullArgs_ReturnsError() {
122
+ System.Callable svc = new MyCustomCallable();
123
+
124
+ Map<String, Object> result = (Map<String, Object>) svc.call('calculateTotal', null);
125
+
126
+ Assert.isFalse((Boolean) result.get('success'), 'Should fail with null inputMap');
127
+ }
128
+ }
@@ -0,0 +1,23 @@
1
+ global class MyCustomClass implements vlocity_cmt.VlocityOpenInterface {
2
+
3
+ global Boolean invokeMethod(String methodName, Map<String, Object> inputs,
4
+ Map<String, Object> output, Map<String, Object> options) {
5
+
6
+ if (methodName == 'calculateTotal') {
7
+ calculateTotal(inputs, output);
8
+ }
9
+ return true;
10
+ }
11
+
12
+ private void calculateTotal(Map<String, Object> inputs, Map<String, Object> output) {
13
+ // Retrieve inputs from OmniScript/IP
14
+ Decimal price = (Decimal)inputs.get('Price');
15
+ Integer qty = (Integer)inputs.get('Quantity');
16
+
17
+ // Perform calculation
18
+ Decimal total = price * qty;
19
+
20
+ // Return result to JSON
21
+ output.put('TotalAmount', total);
22
+ }
23
+ }
@@ -0,0 +1,75 @@
1
+ # TRANSCRIPT: VlocityOpenInterface → System.Callable Conversion
2
+
3
+ ## Task
4
+
5
+ Convert `MyCustomVlocityOpenInterface2.cls` (VlocityOpenInterface) to System.Callable and create a test class. Keep a transcript of reasoning and skills used.
6
+
7
+ ---
8
+
9
+ ## Skills Used
10
+
11
+ | Skill | Purpose |
12
+ |-------|---------|
13
+ | **building-omnistudio-callable-apex** | Migration pattern, response envelope, action dispatch, inputMap/options contract, test patterns |
14
+ | **generating-apex** (implicit) | ApexDoc, type coercion, null safety, exception handling |
15
+
16
+ ---
17
+
18
+ ## Reasoning
19
+
20
+ ### 1. Source Analysis
21
+
22
+ **Original class**: `MyCustomClass` implements `vlocity_cmt.VlocityOpenInterface`
23
+
24
+ - **Action**: `calculateTotal`
25
+ - **Inputs**: `Price` (Decimal), `Quantity` (Integer) from `inputs` map
26
+ - **Output**: Mutates `output` map with `TotalAmount`
27
+ - **Observation**: Original returns `true` for all method names (no unsupported-action handling)
28
+
29
+ ### 2. Design Decisions
30
+
31
+ | Decision | Rationale |
32
+ |----------|------------|
33
+ | **Open Interface–compatible args** | Use `inputMap` and `options` keys per skill Phase 3 so OmniScript/IP callers can pass the same structure |
34
+ | **Flat args fallback** | Skill allows flat args when `inputMap` is absent; supports both calling styles |
35
+ | **Response envelope** | Return `{ success, data, errors }` instead of mutating `outputMap` per migration guidance |
36
+ | **Input validation** | Skill requires null-safe type coercion; OmniScript can send numbers as String |
37
+ | **Unsupported action** | Skill: use `switch on action` and throw `IndustriesCallableException` |
38
+ | **`with sharing`** | Skill guardrail: enforce sharing on callable classes |
39
+
40
+ ### 3. Implementation Pattern
41
+
42
+ - **Entry point**: Extract `inputMap` and `options` from `args` (or treat flat `args` as `inputMap`)
43
+ - **Action dispatch**: `switch on action` with `when 'calculateTotal'` and `when else` throwing
44
+ - **Business logic**: `calculateTotal(inputMap, options)` returns envelope
45
+ - **Type coercion**: `toDecimal()` and `toInteger()` handle Decimal, Integer, Long, String (OmniScript casts)
46
+ - **Error envelope**: Missing/invalid inputs → `success: false` with `INVALID_INPUT` error code
47
+
48
+ ### 4. Test Coverage (Phase 4)
49
+
50
+ | Test | Category | Purpose |
51
+ |------|----------|---------|
52
+ | `testCalculateTotal_Success` | Positive | InputMap/options format, validates TotalAmount |
53
+ | `testCalculateTotal_FlatArgs_Success` | Positive | Flat args backward compatibility |
54
+ | `testCalculateTotal_StringInputs_Success` | Contract | String coercion from OmniScript |
55
+ | `testUnsupportedAction_Throws` | Negative | Unsupported action throws `IndustriesCallableException` |
56
+ | `testCalculateTotal_MissingPrice_ReturnsError` | Contract | Missing required key returns error envelope |
57
+ | `testCalculateTotal_NullArgs_ReturnsError` | Contract | Null args handled without NPE |
58
+
59
+ ### 5. Files Produced
60
+
61
+ | File | Role |
62
+ |------|------|
63
+ | `MyCustomCallable.cls` | Converted System.Callable |
64
+ | `MyCustomCallableTest.cls` | Test class |
65
+ | `IndustriesCallableException.cls` | Custom exception (skill pattern) |
66
+ | `TRANSCRIPT.md` | This transcript |
67
+
68
+ ---
69
+
70
+ ## Skill References
71
+
72
+ - **Phase 2 (Design)**: Contract mapping (`methodName`→`action`, `inputMap`/`options`→`args`)
73
+ - **Phase 3 (Implementation)**: Callable skeleton (inputMap/options), implementation rules (validate early, null-safe)
74
+ - **Phase 4 (Testing)**: Positive, negative, contract tests
75
+ - **Migration**: Preserve action names, return envelope instead of mutating output
@@ -0,0 +1,5 @@
1
+ # Credits & Acknowledgments
2
+
3
+ This skill reflects the collective knowledge and conventions of the Salesforce OmniStudio ecosystem.
4
+
5
+ ---