@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,271 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Credential Setup Suggestion Hook for building-sf-integrations
4
+
5
+ Detects when credential metadata files are created and suggests
6
+ running the appropriate automation scripts.
7
+
8
+ File patterns detected:
9
+ - *.namedCredential-meta.xml → configure-named-credential.sh
10
+ - *.externalCredential-meta.xml → configure-named-credential.sh
11
+ - *cspTrustedSite-meta.xml → Endpoint security configured
12
+ - *remoteSite-meta.xml → Endpoint security configured
13
+
14
+ Called automatically via PostToolUse hook on Write operations.
15
+ """
16
+
17
+ import json
18
+ import os
19
+ import re
20
+ import sys
21
+ from pathlib import Path
22
+
23
+ # File pattern matchers
24
+ PATTERNS = {
25
+ 'named_credential': re.compile(r'\.namedCredential-meta\.xml$', re.IGNORECASE),
26
+ 'external_credential': re.compile(r'\.externalCredential-meta\.xml$', re.IGNORECASE),
27
+ 'csp_trusted_site': re.compile(r'\.cspTrustedSite-meta\.xml$', re.IGNORECASE),
28
+ 'remote_site': re.compile(r'\.remoteSiteSetting-meta\.xml$|\.remoteSite-meta\.xml$', re.IGNORECASE),
29
+ 'external_service': re.compile(r'\.externalServiceRegistration-meta\.xml$', re.IGNORECASE),
30
+ }
31
+
32
+ # Script recommendations per file type
33
+ SCRIPT_RECOMMENDATIONS = {
34
+ 'named_credential': {
35
+ 'script': 'configure-named-credential.sh',
36
+ 'description': 'Set API key securely via ConnectApi (Enhanced Named Credentials)',
37
+ 'usage': './scripts/configure-named-credential.sh <org-alias>',
38
+ 'next_steps': [
39
+ 'Deploy metadata: sf project deploy start --metadata NamedCredential:<name>',
40
+ 'Run script to configure API key securely',
41
+ 'Test connection in Setup → Named Credentials'
42
+ ]
43
+ },
44
+ 'external_credential': {
45
+ 'script': 'configure-named-credential.sh',
46
+ 'description': 'Configure External Credential with ConnectApi',
47
+ 'usage': './scripts/configure-named-credential.sh <org-alias>',
48
+ 'next_steps': [
49
+ 'Deploy External Credential first',
50
+ 'Deploy associated Named Credential',
51
+ 'Run script to set authentication parameters'
52
+ ]
53
+ },
54
+ 'csp_trusted_site': {
55
+ 'script': None,
56
+ 'description': 'CSP Trusted Site created for endpoint security',
57
+ 'usage': None,
58
+ 'next_steps': [
59
+ 'Deploy: sf project deploy start --metadata CspTrustedSite:<name>',
60
+ 'Verify in Setup → CSP Trusted Sites'
61
+ ]
62
+ },
63
+ 'remote_site': {
64
+ 'script': None,
65
+ 'description': 'Remote Site Setting created (legacy endpoint security)',
66
+ 'usage': None,
67
+ 'next_steps': [
68
+ 'Deploy: sf project deploy start --metadata RemoteSiteSetting:<name>',
69
+ 'Consider migrating to CSP Trusted Sites for modern approach'
70
+ ]
71
+ },
72
+ 'external_service': {
73
+ 'script': None,
74
+ 'description': 'External Service registration created',
75
+ 'usage': None,
76
+ 'next_steps': [
77
+ 'Ensure Named Credential is configured first',
78
+ 'Deploy: sf project deploy start --metadata ExternalServiceRegistration:<name>',
79
+ 'Apex classes will be auto-generated from OpenAPI spec'
80
+ ]
81
+ }
82
+ }
83
+
84
+
85
+ def detect_file_type(file_path: str) -> str | None:
86
+ """Detect the credential file type from the file path."""
87
+ filename = os.path.basename(file_path)
88
+
89
+ for file_type, pattern in PATTERNS.items():
90
+ if pattern.search(filename):
91
+ return file_type
92
+
93
+ return None
94
+
95
+
96
+ def extract_credential_name(file_path: str, file_type: str) -> str:
97
+ """Extract the credential name from the file path."""
98
+ filename = os.path.basename(file_path)
99
+
100
+ # Remove the metadata suffix to get the credential name
101
+ patterns = {
102
+ 'named_credential': r'(.+)\.namedCredential-meta\.xml$',
103
+ 'external_credential': r'(.+)\.externalCredential-meta\.xml$',
104
+ 'csp_trusted_site': r'(.+)\.cspTrustedSite-meta\.xml$',
105
+ 'remote_site': r'(.+)\.(?:remoteSiteSetting|remoteSite)-meta\.xml$',
106
+ 'external_service': r'(.+)\.externalServiceRegistration-meta\.xml$',
107
+ }
108
+
109
+ pattern = patterns.get(file_type)
110
+ if pattern:
111
+ match = re.match(pattern, filename, re.IGNORECASE)
112
+ if match:
113
+ return match.group(1)
114
+
115
+ return filename
116
+
117
+
118
+ def analyze_file_content(file_path: str) -> dict:
119
+ """Analyze the file content for additional context."""
120
+ context = {
121
+ 'auth_protocol': None,
122
+ 'endpoint_url': None,
123
+ 'has_oauth': False,
124
+ 'has_certificate': False
125
+ }
126
+
127
+ try:
128
+ with open(file_path, 'r', encoding='utf-8') as f:
129
+ content = f.read()
130
+
131
+ # Detect authentication protocol
132
+ if '<authProtocol>OAuth</authProtocol>' in content:
133
+ context['auth_protocol'] = 'OAuth 2.0'
134
+ context['has_oauth'] = True
135
+ elif '<authProtocol>Jwt</authProtocol>' in content:
136
+ context['auth_protocol'] = 'JWT Bearer'
137
+ elif '<authProtocol>Custom</authProtocol>' in content:
138
+ context['auth_protocol'] = 'Custom (API Key)'
139
+ elif '<authProtocol>Certificate</authProtocol>' in content:
140
+ context['auth_protocol'] = 'Certificate'
141
+ context['has_certificate'] = True
142
+
143
+ # Extract endpoint URL
144
+ url_match = re.search(r'<endpoint>([^<]+)</endpoint>', content)
145
+ if url_match:
146
+ context['endpoint_url'] = url_match.group(1)
147
+
148
+ # Check for Named Credential URL pattern
149
+ url_match = re.search(r'<url>([^<]+)</url>', content)
150
+ if url_match:
151
+ context['endpoint_url'] = url_match.group(1)
152
+
153
+ except Exception:
154
+ pass # File analysis is optional
155
+
156
+ return context
157
+
158
+
159
+ def generate_suggestion_message(file_type: str, cred_name: str, file_context: dict) -> str:
160
+ """Generate the suggestion message for Claude."""
161
+ recommendation = SCRIPT_RECOMMENDATIONS.get(file_type, {})
162
+
163
+ lines = [
164
+ '',
165
+ '═' * 60,
166
+ '🔐 CREDENTIAL CONFIGURATION DETECTED',
167
+ '═' * 60,
168
+ '',
169
+ f'📄 File Type: {file_type.replace("_", " ").title()}',
170
+ f'📛 Name: {cred_name}',
171
+ ]
172
+
173
+ if file_context.get('auth_protocol'):
174
+ lines.append(f'🔑 Auth Protocol: {file_context["auth_protocol"]}')
175
+
176
+ if file_context.get('endpoint_url'):
177
+ lines.append(f'🌐 Endpoint: {file_context["endpoint_url"]}')
178
+
179
+ lines.append('')
180
+
181
+ if recommendation.get('script'):
182
+ lines.extend([
183
+ '┌─────────────────────────────────────────────────────────┐',
184
+ '│ 🚀 AUTOMATION SCRIPT AVAILABLE │',
185
+ '├─────────────────────────────────────────────────────────┤',
186
+ f'│ Script: {recommendation["script"]:<46} │',
187
+ f'│ Purpose: {recommendation["description"][:44]:<44} │',
188
+ '├─────────────────────────────────────────────────────────┤',
189
+ '│ 💡 OFFER TO RUN: │',
190
+ f'│ {recommendation["usage"]:<55} │',
191
+ '└─────────────────────────────────────────────────────────┘',
192
+ '',
193
+ ])
194
+
195
+ lines.extend([
196
+ '📋 NEXT STEPS:',
197
+ '─' * 60,
198
+ ])
199
+
200
+ for i, step in enumerate(recommendation.get('next_steps', []), 1):
201
+ lines.append(f' {i}. {step}')
202
+
203
+ # Add OAuth-specific suggestion
204
+ if file_context.get('has_oauth'):
205
+ lines.extend([
206
+ '',
207
+ '⚠️ OAuth detected: Consider using /configuring-connected-apps to',
208
+ ' create the Connected App for this credential.',
209
+ ])
210
+
211
+ lines.extend([
212
+ '',
213
+ '═' * 60,
214
+ ])
215
+
216
+ return '\n'.join(lines)
217
+
218
+
219
+ def main():
220
+ """Main entry point for the hook."""
221
+ # Get file path from command line or stdin
222
+ file_path = None
223
+
224
+ if len(sys.argv) > 1:
225
+ file_path = sys.argv[1]
226
+ else:
227
+ # Try to read from stdin (hook input)
228
+ try:
229
+ hook_input = json.load(sys.stdin)
230
+ tool_input = hook_input.get('tool_input', {})
231
+ file_path = tool_input.get('file_path', '')
232
+ except (json.JSONDecodeError, IOError):
233
+ pass
234
+
235
+ if not file_path:
236
+ # No file path, exit silently
237
+ print(json.dumps({'continue': True}))
238
+ return 0
239
+
240
+ # Detect file type
241
+ file_type = detect_file_type(file_path)
242
+
243
+ if not file_type:
244
+ # Not a credential file, exit silently
245
+ print(json.dumps({'continue': True}))
246
+ return 0
247
+
248
+ # Extract credential name
249
+ cred_name = extract_credential_name(file_path, file_type)
250
+
251
+ # Analyze file content
252
+ file_context = analyze_file_content(file_path)
253
+
254
+ # Generate suggestion message
255
+ message = generate_suggestion_message(file_type, cred_name, file_context)
256
+
257
+ # Output hook result
258
+ result = {
259
+ 'continue': True,
260
+ 'hookSpecificOutput': {
261
+ 'hookEventName': 'PostToolUse',
262
+ 'additionalContext': message
263
+ }
264
+ }
265
+
266
+ print(json.dumps(result))
267
+ return 0
268
+
269
+
270
+ if __name__ == '__main__':
271
+ sys.exit(main())
@@ -0,0 +1,363 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ building-sf-integrations Validation Script
4
+
5
+ Validates integration-related files against best practices.
6
+ Scoring: 120 points across 6 categories.
7
+
8
+ Categories:
9
+ - Security (30 points)
10
+ - Error Handling (25 points)
11
+ - Bulkification (20 points)
12
+ - Architecture (20 points)
13
+ - Best Practices (15 points)
14
+ - Documentation (10 points)
15
+ """
16
+
17
+ import sys
18
+ import re
19
+ import os
20
+ from pathlib import Path
21
+
22
+ # Scoring configuration
23
+ MAX_SCORE = 120
24
+ CATEGORIES = {
25
+ 'security': {'max': 30, 'score': 0, 'issues': []},
26
+ 'error_handling': {'max': 25, 'score': 0, 'issues': []},
27
+ 'bulkification': {'max': 20, 'score': 0, 'issues': []},
28
+ 'architecture': {'max': 20, 'score': 0, 'issues': []},
29
+ 'best_practices': {'max': 15, 'score': 0, 'issues': []},
30
+ 'documentation': {'max': 10, 'score': 0, 'issues': []}
31
+ }
32
+
33
+ # File type patterns
34
+ APEX_PATTERN = re.compile(r'\.cls$|\.trigger$')
35
+ XML_PATTERN = re.compile(r'\.xml$')
36
+ NAMED_CRED_PATTERN = re.compile(r'namedCredential.*\.xml$', re.IGNORECASE)
37
+
38
+
39
+ def validate_apex_file(content: str, filename: str) -> None:
40
+ """Validate Apex class/trigger for integration patterns."""
41
+
42
+ # Security checks (30 points)
43
+ security_score = 30
44
+
45
+ # Check for hardcoded credentials
46
+ if re.search(r'Authorization.*Bearer\s+[a-zA-Z0-9_\-]{20,}', content):
47
+ security_score -= 15
48
+ CATEGORIES['security']['issues'].append('❌ Hardcoded Bearer token detected')
49
+
50
+ if re.search(r'api[_-]?key\s*=\s*[\'"][a-zA-Z0-9]{10,}', content, re.IGNORECASE):
51
+ security_score -= 15
52
+ CATEGORIES['security']['issues'].append('❌ Hardcoded API key detected')
53
+
54
+ if re.search(r'password\s*=\s*[\'"][^\'"]{5,}', content, re.IGNORECASE):
55
+ security_score -= 15
56
+ CATEGORIES['security']['issues'].append('❌ Hardcoded password detected')
57
+
58
+ # Check for Named Credential usage
59
+ if 'HttpRequest' in content:
60
+ if 'callout:' in content:
61
+ if not CATEGORIES['security']['issues']:
62
+ CATEGORIES['security']['issues'].append('✅ Named Credential used')
63
+ else:
64
+ security_score -= 10
65
+ CATEGORIES['security']['issues'].append('⚠️ HttpRequest without Named Credential')
66
+
67
+ CATEGORIES['security']['score'] = max(0, security_score)
68
+
69
+ # Error Handling checks (25 points)
70
+ error_score = 25
71
+
72
+ if 'HttpRequest' in content or 'Http().send' in content:
73
+ # Check for try-catch
74
+ if 'try' not in content or 'catch' not in content:
75
+ error_score -= 10
76
+ CATEGORIES['error_handling']['issues'].append('❌ Missing try-catch for callout')
77
+ else:
78
+ CATEGORIES['error_handling']['issues'].append('✅ Try-catch present')
79
+
80
+ # Check for CalloutException handling
81
+ if 'CalloutException' in content:
82
+ CATEGORIES['error_handling']['issues'].append('✅ CalloutException handled')
83
+ else:
84
+ error_score -= 5
85
+ CATEGORIES['error_handling']['issues'].append('⚠️ CalloutException not explicitly caught')
86
+
87
+ # Check for status code handling
88
+ if 'getStatusCode()' in content:
89
+ CATEGORIES['error_handling']['issues'].append('✅ Status code checked')
90
+ else:
91
+ error_score -= 5
92
+ CATEGORIES['error_handling']['issues'].append('⚠️ Status code not checked')
93
+
94
+ # Check for timeout setting
95
+ if 'setTimeout' in content:
96
+ CATEGORIES['error_handling']['issues'].append('✅ Timeout configured')
97
+ else:
98
+ error_score -= 5
99
+ CATEGORIES['error_handling']['issues'].append('⚠️ No timeout set (default may be too short)')
100
+
101
+ CATEGORIES['error_handling']['score'] = max(0, error_score)
102
+
103
+ # Bulkification checks (20 points)
104
+ bulk_score = 20
105
+
106
+ # Check for SOQL in loops
107
+ if re.search(r'for\s*\([^)]+\)\s*\{[^}]*\[SELECT', content, re.DOTALL | re.IGNORECASE):
108
+ bulk_score -= 10
109
+ CATEGORIES['bulkification']['issues'].append('❌ SOQL in loop')
110
+
111
+ # Check for DML in loops
112
+ if re.search(r'for\s*\([^)]+\)\s*\{[^}]*(insert|update|delete)\s+', content, re.DOTALL | re.IGNORECASE):
113
+ bulk_score -= 10
114
+ CATEGORIES['bulkification']['issues'].append('❌ DML in loop')
115
+
116
+ # Check for HTTP callout in loops (expensive)
117
+ if re.search(r'for\s*\([^)]+\)\s*\{[^}]*\.send\(', content, re.DOTALL):
118
+ bulk_score -= 5
119
+ CATEGORIES['bulkification']['issues'].append('⚠️ HTTP callout in loop (consider batching)')
120
+
121
+ if bulk_score == 20:
122
+ CATEGORIES['bulkification']['issues'].append('✅ No obvious bulkification issues')
123
+
124
+ CATEGORIES['bulkification']['score'] = max(0, bulk_score)
125
+
126
+ # Architecture checks (20 points)
127
+ arch_score = 20
128
+
129
+ # Check if class implements proper interfaces for callouts
130
+ if 'implements Queueable' in content and 'Database.AllowsCallouts' in content:
131
+ CATEGORIES['architecture']['issues'].append('✅ Proper Queueable + AllowsCallouts pattern')
132
+ elif 'Queueable' in content and 'AllowsCallouts' not in content:
133
+ if 'HttpRequest' in content or 'Http(' in content:
134
+ arch_score -= 10
135
+ CATEGORIES['architecture']['issues'].append('❌ Queueable with callout missing AllowsCallouts')
136
+
137
+ # Check for trigger context callout (should be async)
138
+ if '.trigger' in filename.lower():
139
+ if 'Http(' in content or 'HttpRequest' in content:
140
+ arch_score -= 15
141
+ CATEGORIES['architecture']['issues'].append('❌ Synchronous callout in trigger (must use async)')
142
+
143
+ CATEGORIES['architecture']['score'] = max(0, arch_score)
144
+
145
+ # Best Practices checks (15 points)
146
+ bp_score = 15
147
+
148
+ # Check for logging
149
+ if 'System.debug' in content:
150
+ CATEGORIES['best_practices']['issues'].append('✅ Debug logging present')
151
+ else:
152
+ bp_score -= 5
153
+ CATEGORIES['best_practices']['issues'].append('⚠️ No debug logging')
154
+
155
+ # Check for proper HTTP methods
156
+ if re.search(r'setMethod\s*\(\s*[\'"](?:GET|POST|PUT|PATCH|DELETE)[\'"]\s*\)', content):
157
+ CATEGORIES['best_practices']['issues'].append('✅ Standard HTTP method used')
158
+
159
+ CATEGORIES['best_practices']['score'] = max(0, bp_score)
160
+
161
+ # Documentation checks (10 points)
162
+ doc_score = 10
163
+
164
+ # Check for ApexDoc
165
+ if '/**' in content and '@description' in content:
166
+ CATEGORIES['documentation']['issues'].append('✅ ApexDoc present')
167
+ else:
168
+ doc_score -= 5
169
+ CATEGORIES['documentation']['issues'].append('⚠️ Missing ApexDoc comments')
170
+
171
+ # Check for class-level documentation
172
+ if re.search(r'/\*\*[\s\S]*?\*/\s*public\s+(with sharing\s+)?class', content):
173
+ CATEGORIES['documentation']['issues'].append('✅ Class-level documentation')
174
+
175
+ CATEGORIES['documentation']['score'] = max(0, doc_score)
176
+
177
+
178
+ def validate_named_credential(content: str) -> None:
179
+ """Validate Named Credential XML."""
180
+
181
+ # Security checks
182
+ security_score = 30
183
+
184
+ # Check for hardcoded password in XML (should never be there)
185
+ if '<password>' in content and re.search(r'<password>[^<]+</password>', content):
186
+ password_value = re.search(r'<password>([^<]+)</password>', content)
187
+ if password_value and len(password_value.group(1)) > 0:
188
+ security_score -= 15
189
+ CATEGORIES['security']['issues'].append('⚠️ Password value in metadata (should be empty, set via UI)')
190
+
191
+ # Check for protocol
192
+ if '<protocol>Oauth</protocol>' in content:
193
+ CATEGORIES['security']['issues'].append('✅ OAuth authentication configured')
194
+ elif '<protocol>Password</protocol>' in content:
195
+ CATEGORIES['security']['issues'].append('✅ Password authentication configured')
196
+ security_score -= 5 # OAuth preferred over password
197
+ elif '<protocol>NoAuthentication</protocol>' in content:
198
+ CATEGORIES['security']['issues'].append('⚠️ No authentication (verify this is intentional)')
199
+ security_score -= 10
200
+
201
+ CATEGORIES['security']['score'] = max(0, security_score)
202
+
203
+ # Best practices
204
+ bp_score = 15
205
+
206
+ if '<allowMergeFieldsInBody>true</allowMergeFieldsInBody>' in content:
207
+ CATEGORIES['best_practices']['issues'].append('✅ Merge fields in body enabled')
208
+
209
+ if '<allowMergeFieldsInHeader>true</allowMergeFieldsInHeader>' in content:
210
+ CATEGORIES['best_practices']['issues'].append('✅ Merge fields in header enabled')
211
+
212
+ CATEGORIES['best_practices']['score'] = bp_score
213
+
214
+ # Named Credential XML files are configuration-only — Error Handling,
215
+ # Bulkification, Architecture, and Documentation categories are not
216
+ # applicable. Grant full marks for non-applicable categories so that
217
+ # valid XML files are not penalized by the Apex-oriented rubric.
218
+ CATEGORIES['error_handling']['score'] = CATEGORIES['error_handling']['max']
219
+ CATEGORIES['bulkification']['score'] = CATEGORIES['bulkification']['max']
220
+ CATEGORIES['architecture']['score'] = CATEGORIES['architecture']['max']
221
+ CATEGORIES['documentation']['score'] = CATEGORIES['documentation']['max']
222
+
223
+
224
+ def validate_platform_event(content: str) -> None:
225
+ """Validate Platform Event definition."""
226
+
227
+ # Check event type
228
+ if '<eventType>HighVolume</eventType>' in content:
229
+ CATEGORIES['best_practices']['issues'].append('✅ High Volume event type')
230
+ CATEGORIES['best_practices']['score'] = 15
231
+ elif '<eventType>StandardVolume</eventType>' in content:
232
+ CATEGORIES['best_practices']['issues'].append('✅ Standard Volume event type')
233
+ CATEGORIES['best_practices']['score'] = 15
234
+
235
+ # Check publish behavior
236
+ if '<publishBehavior>PublishAfterCommit</publishBehavior>' in content:
237
+ CATEGORIES['architecture']['issues'].append('✅ PublishAfterCommit (recommended)')
238
+ CATEGORIES['architecture']['score'] = 20
239
+ elif '<publishBehavior>PublishImmediately</publishBehavior>' in content:
240
+ CATEGORIES['architecture']['issues'].append('⚠️ PublishImmediately (verify this is intentional)')
241
+ CATEGORIES['architecture']['score'] = 15
242
+
243
+
244
+ def calculate_total_score() -> int:
245
+ """Calculate total score from all categories."""
246
+ return sum(cat['score'] for cat in CATEGORIES.values())
247
+
248
+
249
+ def get_rating(score: int) -> str:
250
+ """Get star rating based on score."""
251
+ percentage = (score / MAX_SCORE) * 100
252
+ if percentage >= 90:
253
+ return '⭐⭐⭐⭐⭐ Excellent'
254
+ elif percentage >= 80:
255
+ return '⭐⭐⭐⭐ Very Good'
256
+ elif percentage >= 70:
257
+ return '⭐⭐⭐ Good'
258
+ elif percentage >= 60:
259
+ return '⭐⭐ Needs Work'
260
+ else:
261
+ return '⭐ Critical'
262
+
263
+
264
+ def print_score_report(filename: str) -> None:
265
+ """Print formatted score report."""
266
+ total = calculate_total_score()
267
+ rating = get_rating(total)
268
+
269
+ print(f'\n📊 INTEGRATION SCORE: {total}/{MAX_SCORE} {rating}')
270
+ print('═' * 50)
271
+
272
+ category_icons = {
273
+ 'security': '🔐',
274
+ 'error_handling': '⚠️',
275
+ 'bulkification': '📦',
276
+ 'architecture': '🏗️',
277
+ 'best_practices': '✅',
278
+ 'documentation': '📝'
279
+ }
280
+
281
+ for cat_name, cat_data in CATEGORIES.items():
282
+ icon = category_icons.get(cat_name, '•')
283
+ max_score = cat_data['max']
284
+ score = cat_data['score']
285
+ pct = (score / max_score * 100) if max_score > 0 else 0
286
+ bar = '█' * int(pct / 10) + '░' * (10 - int(pct / 10))
287
+
288
+ print(f'\n{icon} {cat_name.replace("_", " ").title():18} {score:2}/{max_score:2} {bar} {pct:.0f}%')
289
+
290
+ for issue in cat_data['issues']:
291
+ print(f' {issue}')
292
+
293
+ print('\n' + '═' * 50)
294
+
295
+ if total < 54:
296
+ print('🚫 DEPLOYMENT BLOCKED - Score below 45% threshold')
297
+ elif total < 72:
298
+ print('⚠️ WARNING - Review issues before deployment')
299
+ else:
300
+ print('✅ PASSED - Ready for deployment')
301
+
302
+
303
+ def main():
304
+ import json
305
+
306
+ file_path = None
307
+
308
+ # Mode 1: Hook mode - read from stdin JSON (PostToolUse hooks)
309
+ if not sys.stdin.isatty():
310
+ try:
311
+ hook_input = json.load(sys.stdin)
312
+ tool_input = hook_input.get("tool_input", {})
313
+ file_path = tool_input.get("file_path", "")
314
+ except (json.JSONDecodeError, EOFError):
315
+ pass
316
+
317
+ # Mode 2: CLI mode - read from command-line argument
318
+ if not file_path and len(sys.argv) >= 2:
319
+ file_path = sys.argv[1]
320
+
321
+ # Skip if no file path
322
+ if not file_path:
323
+ print('Usage: validate_integration.py <file_path>')
324
+ sys.exit(1)
325
+
326
+ filename = os.path.basename(file_path)
327
+
328
+ # Determine file type and validate
329
+ try:
330
+ with open(file_path, 'r', encoding='utf-8') as f:
331
+ content = f.read()
332
+ except Exception as e:
333
+ print(f'Error reading file: {e}')
334
+ sys.exit(1)
335
+
336
+ # Skip if file is too small (likely not a real integration file)
337
+ if len(content) < 50:
338
+ sys.exit(0)
339
+
340
+ # Skip template files (contain placeholders)
341
+ if '{{' in content and '}}' in content:
342
+ print(f'ℹ️ Skipping template file: {filename}')
343
+ sys.exit(0)
344
+
345
+ # Validate based on file type
346
+ if APEX_PATTERN.search(filename):
347
+ # Only validate if it looks like integration code
348
+ if any(keyword in content for keyword in ['HttpRequest', 'Http(', 'callout:', 'EventBus', 'ChangeEvent']):
349
+ validate_apex_file(content, filename)
350
+ print_score_report(filename)
351
+ elif NAMED_CRED_PATTERN.search(filename):
352
+ validate_named_credential(content)
353
+ print_score_report(filename)
354
+ elif '__e.object-meta.xml' in filename:
355
+ validate_platform_event(content)
356
+ print_score_report(filename)
357
+ else:
358
+ # Not an integration file we validate
359
+ sys.exit(0)
360
+
361
+
362
+ if __name__ == '__main__':
363
+ main()