sfcc-dev-mcp 1.0.15 → 1.0.19

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 (865) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.yml +3 -1
  2. package/.github/ISSUE_TEMPLATE/documentation.yml +2 -2
  3. package/.github/ISSUE_TEMPLATE/question.yml +1 -1
  4. package/.github/PULL_REQUEST_TEMPLATE/documentation.md +1 -1
  5. package/.github/PULL_REQUEST_TEMPLATE/new_tool.md +1 -1
  6. package/.github/agents/official-docs-researcher.agent.md +56 -0
  7. package/.github/instructions/mcp-node-tests.instructions.md +12 -916
  8. package/.github/instructions/mcp-yml-tests.instructions.md +14 -742
  9. package/.github/pull_request_template.md +1 -1
  10. package/.github/skills/agent-authoring/SKILL.md +66 -0
  11. package/.github/skills/mcp-log-debugging/SKILL.md +69 -0
  12. package/.github/skills/mcp-programmatic-testing/SKILL.md +142 -0
  13. package/.github/skills/mcp-yaml-testing/SKILL.md +136 -0
  14. package/.github/skills/salesforce-developer-site-scraper/SKILL.md +102 -0
  15. package/.github/skills/salesforce-developer-site-scraper/scripts/scrape-to-markdown.js +205 -0
  16. package/.github/skills/salesforce-help-site-scraper/SKILL.md +84 -0
  17. package/.github/skills/salesforce-help-site-scraper/scripts/scrape-help-to-markdown.js +212 -0
  18. package/.github/skills/skill-authoring/SKILL.md +228 -0
  19. package/.github/skills/skill-authoring/references/PATTERNS.md +384 -0
  20. package/.github/workflows/ci.yml +3 -3
  21. package/.github/workflows/deploy-pages.yml +9 -19
  22. package/.github/workflows/publish.yml +5 -2
  23. package/.github/workflows/update-docs.yml +1 -1
  24. package/AGENTS.md +140 -286
  25. package/CONTRIBUTING.md +10 -22
  26. package/README.md +48 -16
  27. package/ai-instructions/{github-copilot/copilot-instructions.md → AGENTS.md} +99 -127
  28. package/ai-instructions/skills/sfcc-caching/SKILL.md +89 -0
  29. package/{dist/docs/best-practices/cartridge_creation.md → ai-instructions/skills/sfcc-cartridge-development/SKILL.md} +31 -7
  30. package/ai-instructions/skills/sfcc-forms-development/SKILL.md +261 -0
  31. package/ai-instructions/skills/sfcc-forms-development/references/ARCHITECTURE-SGJC-SFRA.md +143 -0
  32. package/ai-instructions/skills/sfcc-forms-development/references/FORM-XML-CHEATSHEET.md +127 -0
  33. package/ai-instructions/skills/sfcc-fraud-prevention/SKILL.md +95 -0
  34. package/ai-instructions/skills/sfcc-hooks-registration/SKILL.md +39 -0
  35. package/ai-instructions/skills/sfcc-isml-development/SKILL.md +370 -0
  36. package/ai-instructions/skills/sfcc-isml-development/references/REMOTE-INCLUDES.md +116 -0
  37. package/ai-instructions/skills/sfcc-isml-development/references/SFRA-LAYOUTS.md +50 -0
  38. package/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CART-ACCOUNT-AUTH.md +45 -0
  39. package/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CATALOG.md +85 -0
  40. package/ai-instructions/skills/sfcc-isml-development/references/SFRA-STRUCTURE-COMPONENTS.md +63 -0
  41. package/ai-instructions/skills/sfcc-isml-development/references/UTILITIES-EXPRESSIONS.md +159 -0
  42. package/ai-instructions/skills/sfcc-isml-development/references/sfra-base-templates-architecture.md +13 -0
  43. package/ai-instructions/skills/sfcc-job-development/SKILL.md +334 -0
  44. package/ai-instructions/skills/sfcc-job-development/references/CHUNK-ORIENTED.md +393 -0
  45. package/ai-instructions/skills/sfcc-job-development/references/STEPTYPES-JSON.md +271 -0
  46. package/ai-instructions/skills/sfcc-job-development/references/TASK-ORIENTED.md +257 -0
  47. package/ai-instructions/skills/sfcc-localization/SKILL.md +92 -0
  48. package/ai-instructions/skills/sfcc-localization/references/CONTROLLERS.md +63 -0
  49. package/ai-instructions/skills/sfcc-localization/references/FORMATTING.md +29 -0
  50. package/ai-instructions/skills/sfcc-localization/references/FORMS-LOCALIZATION.md +33 -0
  51. package/ai-instructions/skills/sfcc-localization/references/JAVASCRIPT-LOCALIZATION.md +41 -0
  52. package/ai-instructions/skills/sfcc-localization/references/LOCALE-SWITCHING.md +35 -0
  53. package/ai-instructions/skills/sfcc-localization/references/PATTERNS.md +740 -0
  54. package/ai-instructions/skills/sfcc-localization/references/PROPERTIES-ENCODING.md +25 -0
  55. package/ai-instructions/skills/sfcc-localization/references/RESOURCE-BUNDLES.md +67 -0
  56. package/ai-instructions/skills/sfcc-localization/references/STATIC-FILES.md +23 -0
  57. package/ai-instructions/skills/sfcc-localization/references/TESTING.md +21 -0
  58. package/{docs/best-practices/localserviceregistry.md → ai-instructions/skills/sfcc-localserviceregistry/SKILL.md} +65 -31
  59. package/ai-instructions/skills/sfcc-logging/SKILL.md +352 -0
  60. package/ai-instructions/skills/sfcc-logging/references/LOG-FILES.md +282 -0
  61. package/{docs/best-practices/ocapi_hooks.md → ai-instructions/skills/sfcc-ocapi-hooks/SKILL.md} +51 -16
  62. package/ai-instructions/skills/sfcc-ocapi-scapi-slas/SKILL.md +108 -0
  63. package/ai-instructions/skills/sfcc-page-designer/SKILL.md +353 -0
  64. package/ai-instructions/skills/sfcc-page-designer/references/ATTRIBUTE-TYPES.md +436 -0
  65. package/ai-instructions/skills/sfcc-page-designer/references/META-DEFINITIONS.md +322 -0
  66. package/{dist/docs/best-practices/performance.md → ai-instructions/skills/sfcc-performance/SKILL.md} +35 -3
  67. package/ai-instructions/skills/sfcc-platform-limits/SKILL.md +89 -0
  68. package/ai-instructions/skills/sfcc-scapi-custom-endpoints/SKILL.md +237 -0
  69. package/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/AUTHENTICATION.md +214 -0
  70. package/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/URL-MAPPING.md +253 -0
  71. package/{docs/best-practices/scapi_hooks.md → ai-instructions/skills/sfcc-scapi-hooks/SKILL.md} +44 -17
  72. package/ai-instructions/skills/sfcc-script-evaluation/SKILL.md +380 -0
  73. package/{docs/best-practices/security.md → ai-instructions/skills/sfcc-security/SKILL.md} +12 -3
  74. package/ai-instructions/skills/sfcc-sfra-client-side-js/SKILL.md +270 -0
  75. package/ai-instructions/skills/sfcc-sfra-client-side-js/references/AJAX-CSRF-VALIDATION.md +285 -0
  76. package/ai-instructions/skills/sfcc-sfra-client-side-js/references/BASE-MODULE-INDEX.md +206 -0
  77. package/ai-instructions/skills/sfcc-sfra-client-side-js/references/EXTENSION-PATTERNS.md +165 -0
  78. package/ai-instructions/skills/sfcc-sfra-client-side-js/references/PLUGIN-PATTERNS.md +185 -0
  79. package/ai-instructions/skills/sfcc-sfra-controllers/SKILL.md +347 -0
  80. package/ai-instructions/skills/sfcc-sfra-controllers/references/MIDDLEWARE-REFERENCE.md +257 -0
  81. package/ai-instructions/skills/sfcc-sfra-controllers/references/REMOTE-INCLUDES.md +193 -0
  82. package/{dist/docs/best-practices/sfra_controllers.md → ai-instructions/skills/sfcc-sfra-controllers/references/standard-sfra-controllers.md} +0 -670
  83. package/ai-instructions/skills/sfcc-sfra-models/SKILL.md +322 -0
  84. package/ai-instructions/skills/sfcc-sfra-models/references/MODEL-PATTERNS.md +530 -0
  85. package/ai-instructions/skills/sfcc-sfra-models/references/MODEL-STRUCTURE.md +234 -0
  86. package/ai-instructions/skills/sfcc-sfra-models/references/TESTING-SECURITY.md +417 -0
  87. package/{dist/docs/best-practices/sfra_scss.md → ai-instructions/skills/sfcc-sfra-scss/SKILL.md} +5 -0
  88. package/ai-instructions/skills/sfcc-webdav-workflows/SKILL.md +111 -0
  89. package/dist/ai-instructions/AGENTS.md +628 -0
  90. package/dist/ai-instructions/skills/sfcc-caching/SKILL.md +89 -0
  91. package/{docs/best-practices/cartridge_creation.md → dist/ai-instructions/skills/sfcc-cartridge-development/SKILL.md} +31 -7
  92. package/dist/ai-instructions/skills/sfcc-forms-development/SKILL.md +261 -0
  93. package/dist/ai-instructions/skills/sfcc-forms-development/references/ARCHITECTURE-SGJC-SFRA.md +143 -0
  94. package/dist/ai-instructions/skills/sfcc-forms-development/references/FORM-XML-CHEATSHEET.md +127 -0
  95. package/dist/ai-instructions/skills/sfcc-fraud-prevention/SKILL.md +95 -0
  96. package/dist/ai-instructions/skills/sfcc-hooks-registration/SKILL.md +39 -0
  97. package/dist/ai-instructions/skills/sfcc-isml-development/SKILL.md +370 -0
  98. package/dist/ai-instructions/skills/sfcc-isml-development/references/REMOTE-INCLUDES.md +116 -0
  99. package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-LAYOUTS.md +50 -0
  100. package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CART-ACCOUNT-AUTH.md +45 -0
  101. package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CATALOG.md +85 -0
  102. package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-STRUCTURE-COMPONENTS.md +63 -0
  103. package/dist/ai-instructions/skills/sfcc-isml-development/references/UTILITIES-EXPRESSIONS.md +159 -0
  104. package/dist/ai-instructions/skills/sfcc-isml-development/references/sfra-base-templates-architecture.md +13 -0
  105. package/dist/ai-instructions/skills/sfcc-job-development/SKILL.md +334 -0
  106. package/dist/ai-instructions/skills/sfcc-job-development/references/CHUNK-ORIENTED.md +393 -0
  107. package/dist/ai-instructions/skills/sfcc-job-development/references/STEPTYPES-JSON.md +271 -0
  108. package/dist/ai-instructions/skills/sfcc-job-development/references/TASK-ORIENTED.md +257 -0
  109. package/dist/ai-instructions/skills/sfcc-localization/SKILL.md +92 -0
  110. package/dist/ai-instructions/skills/sfcc-localization/references/CONTROLLERS.md +63 -0
  111. package/dist/ai-instructions/skills/sfcc-localization/references/FORMATTING.md +29 -0
  112. package/dist/ai-instructions/skills/sfcc-localization/references/FORMS-LOCALIZATION.md +33 -0
  113. package/dist/ai-instructions/skills/sfcc-localization/references/JAVASCRIPT-LOCALIZATION.md +41 -0
  114. package/dist/ai-instructions/skills/sfcc-localization/references/LOCALE-SWITCHING.md +35 -0
  115. package/dist/ai-instructions/skills/sfcc-localization/references/PATTERNS.md +740 -0
  116. package/dist/ai-instructions/skills/sfcc-localization/references/PROPERTIES-ENCODING.md +25 -0
  117. package/dist/ai-instructions/skills/sfcc-localization/references/RESOURCE-BUNDLES.md +67 -0
  118. package/dist/ai-instructions/skills/sfcc-localization/references/STATIC-FILES.md +23 -0
  119. package/dist/ai-instructions/skills/sfcc-localization/references/TESTING.md +21 -0
  120. package/dist/{docs/best-practices/localserviceregistry.md → ai-instructions/skills/sfcc-localserviceregistry/SKILL.md} +65 -31
  121. package/dist/ai-instructions/skills/sfcc-logging/SKILL.md +352 -0
  122. package/dist/ai-instructions/skills/sfcc-logging/references/LOG-FILES.md +282 -0
  123. package/dist/{docs/best-practices/ocapi_hooks.md → ai-instructions/skills/sfcc-ocapi-hooks/SKILL.md} +51 -16
  124. package/dist/ai-instructions/skills/sfcc-ocapi-scapi-slas/SKILL.md +108 -0
  125. package/dist/ai-instructions/skills/sfcc-page-designer/SKILL.md +353 -0
  126. package/dist/ai-instructions/skills/sfcc-page-designer/references/ATTRIBUTE-TYPES.md +436 -0
  127. package/dist/ai-instructions/skills/sfcc-page-designer/references/META-DEFINITIONS.md +322 -0
  128. package/{docs/best-practices/performance.md → dist/ai-instructions/skills/sfcc-performance/SKILL.md} +35 -3
  129. package/dist/ai-instructions/skills/sfcc-platform-limits/SKILL.md +89 -0
  130. package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/SKILL.md +237 -0
  131. package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/AUTHENTICATION.md +214 -0
  132. package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/URL-MAPPING.md +253 -0
  133. package/dist/{docs/best-practices/scapi_hooks.md → ai-instructions/skills/sfcc-scapi-hooks/SKILL.md} +44 -17
  134. package/dist/ai-instructions/skills/sfcc-script-evaluation/SKILL.md +380 -0
  135. package/dist/{docs/best-practices/security.md → ai-instructions/skills/sfcc-security/SKILL.md} +12 -3
  136. package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/SKILL.md +270 -0
  137. package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/AJAX-CSRF-VALIDATION.md +285 -0
  138. package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/BASE-MODULE-INDEX.md +206 -0
  139. package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/EXTENSION-PATTERNS.md +165 -0
  140. package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/PLUGIN-PATTERNS.md +185 -0
  141. package/dist/ai-instructions/skills/sfcc-sfra-controllers/SKILL.md +347 -0
  142. package/dist/ai-instructions/skills/sfcc-sfra-controllers/references/MIDDLEWARE-REFERENCE.md +257 -0
  143. package/dist/ai-instructions/skills/sfcc-sfra-controllers/references/REMOTE-INCLUDES.md +193 -0
  144. package/{docs/best-practices/sfra_controllers.md → dist/ai-instructions/skills/sfcc-sfra-controllers/references/standard-sfra-controllers.md} +0 -670
  145. package/dist/ai-instructions/skills/sfcc-sfra-models/SKILL.md +322 -0
  146. package/dist/ai-instructions/skills/sfcc-sfra-models/references/MODEL-PATTERNS.md +530 -0
  147. package/dist/ai-instructions/skills/sfcc-sfra-models/references/MODEL-STRUCTURE.md +234 -0
  148. package/dist/ai-instructions/skills/sfcc-sfra-models/references/TESTING-SECURITY.md +417 -0
  149. package/{docs/best-practices/sfra_scss.md → dist/ai-instructions/skills/sfcc-sfra-scss/SKILL.md} +5 -0
  150. package/dist/ai-instructions/skills/sfcc-webdav-workflows/SKILL.md +111 -0
  151. package/dist/clients/agent-instructions-client.d.ts +66 -0
  152. package/dist/clients/agent-instructions-client.d.ts.map +1 -0
  153. package/dist/clients/agent-instructions-client.js +277 -0
  154. package/dist/clients/agent-instructions-client.js.map +1 -0
  155. package/dist/clients/base/abstract-documentation-client.d.ts +146 -0
  156. package/dist/clients/base/abstract-documentation-client.d.ts.map +1 -0
  157. package/dist/clients/base/abstract-documentation-client.js +265 -0
  158. package/dist/clients/base/abstract-documentation-client.js.map +1 -0
  159. package/dist/clients/base/oauth-token.d.ts +18 -0
  160. package/dist/clients/base/oauth-token.d.ts.map +1 -1
  161. package/dist/clients/base/oauth-token.js +45 -2
  162. package/dist/clients/base/oauth-token.js.map +1 -1
  163. package/dist/clients/cartridge/cartridge-generation-client.d.ts +59 -0
  164. package/dist/clients/cartridge/cartridge-generation-client.d.ts.map +1 -0
  165. package/dist/clients/cartridge/cartridge-generation-client.js +224 -0
  166. package/dist/clients/cartridge/cartridge-generation-client.js.map +1 -0
  167. package/dist/clients/cartridge/cartridge-structure.d.ts +17 -0
  168. package/dist/clients/cartridge/cartridge-structure.d.ts.map +1 -0
  169. package/dist/clients/cartridge/cartridge-structure.js +33 -0
  170. package/dist/clients/cartridge/cartridge-structure.js.map +1 -0
  171. package/dist/clients/cartridge/cartridge-templates.d.ts +22 -0
  172. package/dist/clients/cartridge/cartridge-templates.d.ts.map +1 -0
  173. package/dist/clients/cartridge/cartridge-templates.js +225 -0
  174. package/dist/clients/cartridge/cartridge-templates.js.map +1 -0
  175. package/dist/clients/cartridge/index.d.ts +7 -0
  176. package/dist/clients/cartridge/index.d.ts.map +1 -0
  177. package/dist/clients/cartridge/index.js +7 -0
  178. package/dist/clients/cartridge/index.js.map +1 -0
  179. package/dist/clients/docs/documentation-scanner.d.ts +5 -2
  180. package/dist/clients/docs/documentation-scanner.d.ts.map +1 -1
  181. package/dist/clients/docs/documentation-scanner.js +38 -23
  182. package/dist/clients/docs/documentation-scanner.js.map +1 -1
  183. package/dist/clients/docs-client.d.ts +13 -4
  184. package/dist/clients/docs-client.d.ts.map +1 -1
  185. package/dist/clients/docs-client.js +44 -11
  186. package/dist/clients/docs-client.js.map +1 -1
  187. package/dist/clients/isml-client.d.ts +71 -0
  188. package/dist/clients/isml-client.d.ts.map +1 -0
  189. package/dist/clients/isml-client.js +252 -0
  190. package/dist/clients/isml-client.js.map +1 -0
  191. package/dist/clients/ocapi/code-versions-client.d.ts.map +1 -1
  192. package/dist/clients/ocapi/code-versions-client.js +6 -1
  193. package/dist/clients/ocapi/code-versions-client.js.map +1 -1
  194. package/dist/clients/ocapi-client.d.ts +9 -101
  195. package/dist/clients/ocapi-client.d.ts.map +1 -1
  196. package/dist/clients/ocapi-client.js +11 -93
  197. package/dist/clients/ocapi-client.js.map +1 -1
  198. package/dist/clients/script-debugger/index.d.ts +5 -0
  199. package/dist/clients/script-debugger/index.d.ts.map +1 -0
  200. package/dist/clients/script-debugger/index.js +5 -0
  201. package/dist/clients/script-debugger/index.js.map +1 -0
  202. package/dist/clients/script-debugger/script-debugger-client.d.ts +147 -0
  203. package/dist/clients/script-debugger/script-debugger-client.d.ts.map +1 -0
  204. package/dist/clients/script-debugger/script-debugger-client.js +591 -0
  205. package/dist/clients/script-debugger/script-debugger-client.js.map +1 -0
  206. package/dist/clients/sfra-client.d.ts +13 -62
  207. package/dist/clients/sfra-client.d.ts.map +1 -1
  208. package/dist/clients/sfra-client.js +105 -326
  209. package/dist/clients/sfra-client.js.map +1 -1
  210. package/dist/config/configuration-factory.d.ts +1 -1
  211. package/dist/config/configuration-factory.d.ts.map +1 -1
  212. package/dist/config/configuration-factory.js +5 -1
  213. package/dist/config/configuration-factory.js.map +1 -1
  214. package/dist/config/dw-json-loader.d.ts +7 -0
  215. package/dist/config/dw-json-loader.d.ts.map +1 -1
  216. package/dist/config/dw-json-loader.js +92 -15
  217. package/dist/config/dw-json-loader.js.map +1 -1
  218. package/dist/config/workspace-roots.d.ts +143 -0
  219. package/dist/config/workspace-roots.d.ts.map +1 -0
  220. package/dist/config/workspace-roots.js +448 -0
  221. package/dist/config/workspace-roots.js.map +1 -0
  222. package/dist/constants/index.d.ts +1 -0
  223. package/dist/constants/index.d.ts.map +1 -0
  224. package/dist/constants/index.js +3 -0
  225. package/dist/constants/index.js.map +1 -0
  226. package/dist/core/handlers/abstract-client-handler.d.ts +52 -0
  227. package/dist/core/handlers/abstract-client-handler.d.ts.map +1 -0
  228. package/dist/core/handlers/abstract-client-handler.js +51 -0
  229. package/dist/core/handlers/abstract-client-handler.js.map +1 -0
  230. package/dist/core/handlers/agent-instructions-handler.d.ts +17 -0
  231. package/dist/core/handlers/agent-instructions-handler.d.ts.map +1 -0
  232. package/dist/core/handlers/agent-instructions-handler.js +38 -0
  233. package/dist/core/handlers/agent-instructions-handler.js.map +1 -0
  234. package/dist/core/handlers/base-handler.d.ts +3 -68
  235. package/dist/core/handlers/base-handler.d.ts.map +1 -1
  236. package/dist/core/handlers/base-handler.js +11 -84
  237. package/dist/core/handlers/base-handler.js.map +1 -1
  238. package/dist/core/handlers/cartridge-handler.d.ts +10 -11
  239. package/dist/core/handlers/cartridge-handler.d.ts.map +1 -1
  240. package/dist/core/handlers/cartridge-handler.js +10 -28
  241. package/dist/core/handlers/cartridge-handler.js.map +1 -1
  242. package/dist/core/handlers/client-factory.d.ts +12 -2
  243. package/dist/core/handlers/client-factory.d.ts.map +1 -1
  244. package/dist/core/handlers/client-factory.js +28 -1
  245. package/dist/core/handlers/client-factory.js.map +1 -1
  246. package/dist/core/handlers/code-version-handler.d.ts +11 -11
  247. package/dist/core/handlers/code-version-handler.d.ts.map +1 -1
  248. package/dist/core/handlers/code-version-handler.js +13 -27
  249. package/dist/core/handlers/code-version-handler.js.map +1 -1
  250. package/dist/core/handlers/docs-handler.d.ts +6 -12
  251. package/dist/core/handlers/docs-handler.d.ts.map +1 -1
  252. package/dist/core/handlers/docs-handler.js +11 -36
  253. package/dist/core/handlers/docs-handler.js.map +1 -1
  254. package/dist/core/handlers/isml-handler.d.ts +11 -0
  255. package/dist/core/handlers/isml-handler.d.ts.map +1 -0
  256. package/dist/core/handlers/isml-handler.js +18 -0
  257. package/dist/core/handlers/isml-handler.js.map +1 -0
  258. package/dist/core/handlers/job-log-handler.d.ts +8 -7
  259. package/dist/core/handlers/job-log-handler.d.ts.map +1 -1
  260. package/dist/core/handlers/job-log-handler.js +14 -5
  261. package/dist/core/handlers/job-log-handler.js.map +1 -1
  262. package/dist/core/handlers/log-handler.d.ts +8 -7
  263. package/dist/core/handlers/log-handler.d.ts.map +1 -1
  264. package/dist/core/handlers/log-handler.js +14 -5
  265. package/dist/core/handlers/log-handler.js.map +1 -1
  266. package/dist/core/handlers/script-debugger-handler.d.ts +18 -0
  267. package/dist/core/handlers/script-debugger-handler.d.ts.map +1 -0
  268. package/dist/core/handlers/script-debugger-handler.js +31 -0
  269. package/dist/core/handlers/script-debugger-handler.js.map +1 -0
  270. package/dist/core/handlers/sfra-handler.d.ts +6 -12
  271. package/dist/core/handlers/sfra-handler.d.ts.map +1 -1
  272. package/dist/core/handlers/sfra-handler.js +11 -36
  273. package/dist/core/handlers/sfra-handler.js.map +1 -1
  274. package/dist/core/handlers/simple-client-handler.d.ts +41 -0
  275. package/dist/core/handlers/simple-client-handler.d.ts.map +1 -0
  276. package/dist/core/handlers/simple-client-handler.js +49 -0
  277. package/dist/core/handlers/simple-client-handler.js.map +1 -0
  278. package/dist/core/handlers/system-object-handler.d.ts +11 -11
  279. package/dist/core/handlers/system-object-handler.d.ts.map +1 -1
  280. package/dist/core/handlers/system-object-handler.js +13 -27
  281. package/dist/core/handlers/system-object-handler.js.map +1 -1
  282. package/dist/core/handlers/validation-helpers.d.ts +22 -24
  283. package/dist/core/handlers/validation-helpers.d.ts.map +1 -1
  284. package/dist/core/handlers/validation-helpers.js +89 -39
  285. package/dist/core/handlers/validation-helpers.js.map +1 -1
  286. package/dist/core/instruction-advisor.d.ts +28 -0
  287. package/dist/core/instruction-advisor.d.ts.map +1 -0
  288. package/dist/core/instruction-advisor.js +114 -0
  289. package/dist/core/instruction-advisor.js.map +1 -0
  290. package/dist/core/server.d.ts +25 -0
  291. package/dist/core/server.d.ts.map +1 -1
  292. package/dist/core/server.js +151 -11
  293. package/dist/core/server.js.map +1 -1
  294. package/dist/core/tool-definitions.d.ts +6 -854
  295. package/dist/core/tool-definitions.d.ts.map +1 -1
  296. package/dist/core/tool-definitions.js +8 -1064
  297. package/dist/core/tool-definitions.js.map +1 -1
  298. package/dist/core/tool-schemas/agent-instruction-tools.d.ts +77 -0
  299. package/dist/core/tool-schemas/agent-instruction-tools.d.ts.map +1 -0
  300. package/dist/core/tool-schemas/agent-instruction-tools.js +72 -0
  301. package/dist/core/tool-schemas/agent-instruction-tools.js.map +1 -0
  302. package/dist/core/tool-schemas/cartridge-tools.d.ts +27 -0
  303. package/dist/core/tool-schemas/cartridge-tools.d.ts.map +1 -0
  304. package/dist/core/tool-schemas/cartridge-tools.js +29 -0
  305. package/dist/core/tool-schemas/cartridge-tools.js.map +1 -0
  306. package/dist/core/tool-schemas/code-version-tools.d.ts +28 -0
  307. package/dist/core/tool-schemas/code-version-tools.d.ts.map +1 -0
  308. package/dist/core/tool-schemas/code-version-tools.js +28 -0
  309. package/dist/core/tool-schemas/code-version-tools.js.map +1 -0
  310. package/dist/core/tool-schemas/documentation-tools.d.ts +139 -0
  311. package/dist/core/tool-schemas/documentation-tools.d.ts.map +1 -0
  312. package/dist/core/tool-schemas/documentation-tools.js +104 -0
  313. package/dist/core/tool-schemas/documentation-tools.js.map +1 -0
  314. package/dist/core/tool-schemas/index.d.ts +17 -0
  315. package/dist/core/tool-schemas/index.d.ts.map +1 -0
  316. package/dist/core/tool-schemas/index.js +19 -0
  317. package/dist/core/tool-schemas/index.js.map +1 -0
  318. package/dist/core/tool-schemas/isml-tools.d.ts +98 -0
  319. package/dist/core/tool-schemas/isml-tools.d.ts.map +1 -0
  320. package/dist/core/tool-schemas/isml-tools.js +89 -0
  321. package/dist/core/tool-schemas/isml-tools.js.map +1 -0
  322. package/dist/core/tool-schemas/log-tools.d.ts +221 -0
  323. package/dist/core/tool-schemas/log-tools.d.ts.map +1 -0
  324. package/dist/core/tool-schemas/log-tools.js +180 -0
  325. package/dist/core/tool-schemas/log-tools.js.map +1 -0
  326. package/dist/core/tool-schemas/script-debugger-tools.d.ts +44 -0
  327. package/dist/core/tool-schemas/script-debugger-tools.d.ts.map +1 -0
  328. package/dist/core/tool-schemas/script-debugger-tools.js +83 -0
  329. package/dist/core/tool-schemas/script-debugger-tools.js.map +1 -0
  330. package/dist/core/tool-schemas/sfra-tools.d.ts +63 -0
  331. package/dist/core/tool-schemas/sfra-tools.d.ts.map +1 -0
  332. package/dist/core/tool-schemas/sfra-tools.js +65 -0
  333. package/dist/core/tool-schemas/sfra-tools.js.map +1 -0
  334. package/dist/core/tool-schemas/shared-schemas.d.ts +350 -0
  335. package/dist/core/tool-schemas/shared-schemas.d.ts.map +1 -0
  336. package/dist/core/tool-schemas/shared-schemas.js +153 -0
  337. package/dist/core/tool-schemas/shared-schemas.js.map +1 -0
  338. package/dist/core/tool-schemas/system-object-tools.d.ts +511 -0
  339. package/dist/core/tool-schemas/system-object-tools.d.ts.map +1 -0
  340. package/dist/core/tool-schemas/system-object-tools.js +126 -0
  341. package/dist/core/tool-schemas/system-object-tools.js.map +1 -0
  342. package/dist/docs/dw_net/HTTPClient.md +46 -2
  343. package/dist/docs/dw_net/HTTPClientLoggingConfig.md +296 -0
  344. package/dist/docs/dw_order/Basket.md +7 -7
  345. package/dist/docs/dw_order/BasketMgr.md +22 -6
  346. package/dist/docs/dw_order.hooks/BasketMergeHooks.md +42 -0
  347. package/dist/docs/dw_svc/ServiceCallback.md +2 -2
  348. package/dist/docs/isml/isactivedatacontext.md +382 -0
  349. package/dist/docs/isml/isactivedatahead.md +566 -0
  350. package/dist/docs/isml/isanalyticsoff.md +537 -0
  351. package/dist/docs/isml/isapplepay.md +667 -0
  352. package/dist/docs/isml/isbreak.md +687 -0
  353. package/dist/docs/isml/isbuynow.md +682 -0
  354. package/dist/docs/isml/iscache.md +802 -0
  355. package/dist/docs/isml/iscomment.md +794 -0
  356. package/dist/docs/isml/iscomponent.md +797 -0
  357. package/dist/docs/isml/iscontent.md +594 -0
  358. package/dist/docs/isml/iscontinue.md +563 -0
  359. package/dist/docs/isml/iscookie.md +798 -0
  360. package/dist/docs/isml/isdecorate.md +818 -0
  361. package/dist/docs/isml/isif.md +737 -0
  362. package/dist/docs/isml/isinclude.md +874 -0
  363. package/dist/docs/isml/isloop.md +377 -0
  364. package/dist/docs/isml/ismodule.md +844 -0
  365. package/dist/docs/isml/isnext.md +672 -0
  366. package/dist/docs/isml/isobject.md +760 -0
  367. package/dist/docs/isml/ispayment.md +577 -0
  368. package/dist/docs/isml/ispaymentmessages.md +664 -0
  369. package/dist/docs/isml/isprint.md +875 -0
  370. package/dist/docs/isml/isredirect.md +716 -0
  371. package/dist/docs/isml/isremove.md +725 -0
  372. package/dist/docs/isml/isreplace.md +783 -0
  373. package/dist/docs/isml/isscript.md +859 -0
  374. package/dist/docs/isml/isselect.md +908 -0
  375. package/dist/docs/isml/isset.md +585 -0
  376. package/dist/docs/isml/isslot.md +824 -0
  377. package/dist/docs/isml/isstatus.md +711 -0
  378. package/dist/main.d.ts +16 -0
  379. package/dist/main.d.ts.map +1 -1
  380. package/dist/main.js +60 -28
  381. package/dist/main.js.map +1 -1
  382. package/dist/services/index.d.ts +4 -2
  383. package/dist/services/index.d.ts.map +1 -1
  384. package/dist/services/index.js +2 -2
  385. package/dist/services/index.js.map +1 -1
  386. package/dist/tool-configs/agent-instructions-tool-config.d.ts +6 -0
  387. package/dist/tool-configs/agent-instructions-tool-config.d.ts.map +1 -0
  388. package/dist/tool-configs/agent-instructions-tool-config.js +74 -0
  389. package/dist/tool-configs/agent-instructions-tool-config.js.map +1 -0
  390. package/dist/tool-configs/code-version-tool-config.d.ts.map +1 -1
  391. package/dist/tool-configs/code-version-tool-config.js +0 -5
  392. package/dist/tool-configs/code-version-tool-config.js.map +1 -1
  393. package/dist/tool-configs/docs-tool-config.d.ts.map +1 -1
  394. package/dist/tool-configs/docs-tool-config.js +0 -7
  395. package/dist/tool-configs/docs-tool-config.js.map +1 -1
  396. package/dist/tool-configs/isml-tool-config.d.ts +11 -0
  397. package/dist/tool-configs/isml-tool-config.d.ts.map +1 -0
  398. package/dist/tool-configs/isml-tool-config.js +77 -0
  399. package/dist/tool-configs/isml-tool-config.js.map +1 -0
  400. package/dist/tool-configs/job-log-tool-config.d.ts +1 -2
  401. package/dist/tool-configs/job-log-tool-config.d.ts.map +1 -1
  402. package/dist/tool-configs/job-log-tool-config.js +11 -15
  403. package/dist/tool-configs/job-log-tool-config.js.map +1 -1
  404. package/dist/tool-configs/log-tool-config.d.ts +1 -2
  405. package/dist/tool-configs/log-tool-config.d.ts.map +1 -1
  406. package/dist/tool-configs/log-tool-config.js +35 -51
  407. package/dist/tool-configs/log-tool-config.js.map +1 -1
  408. package/dist/tool-configs/script-debugger-tool-config.d.ts +11 -0
  409. package/dist/tool-configs/script-debugger-tool-config.d.ts.map +1 -0
  410. package/dist/tool-configs/script-debugger-tool-config.js +35 -0
  411. package/dist/tool-configs/script-debugger-tool-config.js.map +1 -0
  412. package/dist/tool-configs/sfra-tool-config.d.ts.map +1 -1
  413. package/dist/tool-configs/sfra-tool-config.js +0 -11
  414. package/dist/tool-configs/sfra-tool-config.js.map +1 -1
  415. package/dist/tool-configs/system-object-tool-config.d.ts.map +1 -1
  416. package/dist/tool-configs/system-object-tool-config.js +0 -5
  417. package/dist/tool-configs/system-object-tool-config.js.map +1 -1
  418. package/dist/types/types.d.ts +2 -0
  419. package/dist/types/types.d.ts.map +1 -1
  420. package/dist/utils/cache.d.ts +12 -10
  421. package/dist/utils/cache.d.ts.map +1 -1
  422. package/dist/utils/cache.js +47 -47
  423. package/dist/utils/cache.js.map +1 -1
  424. package/dist/utils/category-utils.d.ts +31 -0
  425. package/dist/utils/category-utils.d.ts.map +1 -0
  426. package/dist/utils/category-utils.js +45 -0
  427. package/dist/utils/category-utils.js.map +1 -0
  428. package/dist/utils/log-tool-constants.d.ts +16 -13
  429. package/dist/utils/log-tool-constants.d.ts.map +1 -1
  430. package/dist/utils/log-tool-constants.js +10 -11
  431. package/dist/utils/log-tool-constants.js.map +1 -1
  432. package/dist/utils/logger.d.ts +11 -0
  433. package/dist/utils/logger.d.ts.map +1 -1
  434. package/dist/utils/logger.js +35 -1
  435. package/dist/utils/logger.js.map +1 -1
  436. package/dist/utils/markdown-utils.d.ts +60 -0
  437. package/dist/utils/markdown-utils.d.ts.map +1 -0
  438. package/dist/utils/markdown-utils.js +206 -0
  439. package/dist/utils/markdown-utils.js.map +1 -0
  440. package/dist/utils/path-resolver.d.ts +12 -4
  441. package/dist/utils/path-resolver.d.ts.map +1 -1
  442. package/dist/utils/path-resolver.js +22 -8
  443. package/dist/utils/path-resolver.js.map +1 -1
  444. package/dist/utils/path-validation.d.ts +40 -0
  445. package/dist/utils/path-validation.d.ts.map +1 -0
  446. package/dist/utils/path-validation.js +84 -0
  447. package/dist/utils/path-validation.js.map +1 -0
  448. package/docs/dw_net/HTTPClient.md +46 -2
  449. package/docs/dw_net/HTTPClientLoggingConfig.md +296 -0
  450. package/docs/dw_order/Basket.md +7 -7
  451. package/docs/dw_order/BasketMgr.md +22 -6
  452. package/docs/dw_order.hooks/BasketMergeHooks.md +42 -0
  453. package/docs/dw_svc/ServiceCallback.md +2 -2
  454. package/docs/isml/isactivedatacontext.md +382 -0
  455. package/docs/isml/isactivedatahead.md +566 -0
  456. package/docs/isml/isanalyticsoff.md +537 -0
  457. package/docs/isml/isapplepay.md +667 -0
  458. package/docs/isml/isbreak.md +687 -0
  459. package/docs/isml/isbuynow.md +682 -0
  460. package/docs/isml/iscache.md +802 -0
  461. package/docs/isml/iscomment.md +794 -0
  462. package/docs/isml/iscomponent.md +797 -0
  463. package/docs/isml/iscontent.md +594 -0
  464. package/docs/isml/iscontinue.md +563 -0
  465. package/docs/isml/iscookie.md +798 -0
  466. package/docs/isml/isdecorate.md +818 -0
  467. package/docs/isml/isif.md +737 -0
  468. package/docs/isml/isinclude.md +874 -0
  469. package/docs/isml/isloop.md +377 -0
  470. package/docs/isml/ismodule.md +844 -0
  471. package/docs/isml/isnext.md +672 -0
  472. package/docs/isml/isobject.md +760 -0
  473. package/docs/isml/ispayment.md +577 -0
  474. package/docs/isml/ispaymentmessages.md +664 -0
  475. package/docs/isml/isprint.md +875 -0
  476. package/docs/isml/isredirect.md +716 -0
  477. package/docs/isml/isremove.md +725 -0
  478. package/docs/isml/isreplace.md +783 -0
  479. package/docs/isml/isscript.md +859 -0
  480. package/docs/isml/isselect.md +908 -0
  481. package/docs/isml/isset.md +585 -0
  482. package/docs/isml/isslot.md +824 -0
  483. package/docs/isml/isstatus.md +711 -0
  484. package/docs-site-v2/.vitepress/config.mts +190 -0
  485. package/docs-site-v2/.vitepress/theme/components/AssistantTabs.vue +96 -0
  486. package/docs-site-v2/.vitepress/theme/components/Callout.vue +10 -0
  487. package/docs-site-v2/.vitepress/theme/components/Collapsible.vue +14 -0
  488. package/docs-site-v2/.vitepress/theme/components/DwJsonBuilder.vue +82 -0
  489. package/docs-site-v2/.vitepress/theme/components/HomeSections.vue +552 -0
  490. package/docs-site-v2/.vitepress/theme/components/InstructionFilesTabs.vue +87 -0
  491. package/docs-site-v2/.vitepress/theme/components/ModeTabs.vue +70 -0
  492. package/docs-site-v2/.vitepress/theme/components/NewcomerCTA.vue +14 -0
  493. package/docs-site-v2/.vitepress/theme/components/QuickStartCards.vue +20 -0
  494. package/docs-site-v2/.vitepress/theme/components/QuickStartHero.vue +20 -0
  495. package/docs-site-v2/.vitepress/theme/components/SkillsList.vue +48 -0
  496. package/docs-site-v2/.vitepress/theme/components/ToolExplorer.vue +85 -0
  497. package/docs-site-v2/.vitepress/theme/custom.css +1373 -0
  498. package/docs-site-v2/.vitepress/theme/index.ts +39 -0
  499. package/docs-site-v2/data/skills.ts +147 -0
  500. package/docs-site-v2/data/tools.ts +490 -0
  501. package/docs-site-v2/development/index.md +151 -0
  502. package/docs-site-v2/examples/index.md +333 -0
  503. package/docs-site-v2/features/index.md +144 -0
  504. package/docs-site-v2/guide/ai-interfaces.md +58 -0
  505. package/docs-site-v2/guide/configuration.md +208 -0
  506. package/docs-site-v2/guide/index.md +50 -0
  507. package/docs-site-v2/index.md +32 -0
  508. package/docs-site-v2/package-lock.json +2511 -0
  509. package/docs-site-v2/package.json +15 -0
  510. package/docs-site-v2/public/android-chrome-192x192.png +0 -0
  511. package/docs-site-v2/public/android-chrome-512x512.png +0 -0
  512. package/docs-site-v2/public/apple-touch-icon.png +0 -0
  513. package/docs-site-v2/public/favicon-16x16.png +0 -0
  514. package/docs-site-v2/public/favicon-32x32.png +0 -0
  515. package/docs-site-v2/public/favicon.ico +0 -0
  516. package/docs-site-v2/public/index.css +4174 -0
  517. package/docs-site-v2/public/llms.txt +44 -0
  518. package/docs-site-v2/public/logo-dark.svg +8 -0
  519. package/docs-site-v2/public/logo.svg +8 -0
  520. package/{docs-site → docs-site-v2}/public/robots.txt +1 -6
  521. package/{docs-site → docs-site-v2}/public/site.webmanifest +1 -1
  522. package/{docs-site → docs-site-v2}/public/sitemap.xml +33 -12
  523. package/docs-site-v2/script-debugger/index.md +105 -0
  524. package/docs-site-v2/scripts/generate-llms.js +71 -0
  525. package/docs-site-v2/scripts/generate-sitemap.js +97 -0
  526. package/docs-site-v2/security/index.md +115 -0
  527. package/docs-site-v2/skills/index.md +40 -0
  528. package/docs-site-v2/tools/index.md +36 -0
  529. package/docs-site-v2/troubleshooting/index.md +204 -0
  530. package/eslint.config.js +3 -1
  531. package/memories/repo/docs-site-v2-build.json +11 -0
  532. package/package.json +18 -14
  533. package/scripts/validate-server-json.js +68 -0
  534. package/server.json +4 -6
  535. package/src/clients/agent-instructions-client.ts +370 -0
  536. package/src/clients/base/abstract-documentation-client.ts +405 -0
  537. package/src/clients/base/oauth-token.ts +52 -2
  538. package/src/clients/cartridge/cartridge-generation-client.ts +302 -0
  539. package/src/clients/cartridge/cartridge-structure.ts +37 -0
  540. package/src/clients/cartridge/cartridge-templates.ts +246 -0
  541. package/src/clients/cartridge/index.ts +6 -0
  542. package/src/clients/docs/documentation-scanner.ts +44 -28
  543. package/src/clients/docs-client.ts +54 -14
  544. package/src/clients/isml-client.ts +353 -0
  545. package/src/clients/ocapi/code-versions-client.ts +7 -1
  546. package/src/clients/ocapi-client.ts +11 -166
  547. package/src/clients/script-debugger/index.ts +5 -0
  548. package/src/clients/script-debugger/script-debugger-client.ts +754 -0
  549. package/src/clients/sfra-client.ts +134 -397
  550. package/src/config/configuration-factory.ts +6 -1
  551. package/src/config/dw-json-loader.ts +96 -15
  552. package/src/config/workspace-roots.ts +540 -0
  553. package/src/constants/index.ts +1 -0
  554. package/src/core/handlers/abstract-client-handler.ts +85 -0
  555. package/src/core/handlers/agent-instructions-handler.ts +48 -0
  556. package/src/core/handlers/base-handler.ts +17 -127
  557. package/src/core/handlers/cartridge-handler.ts +13 -33
  558. package/src/core/handlers/client-factory.ts +32 -2
  559. package/src/core/handlers/code-version-handler.ts +17 -32
  560. package/src/core/handlers/docs-handler.ts +12 -44
  561. package/src/core/handlers/isml-handler.ts +19 -0
  562. package/src/core/handlers/job-log-handler.ts +19 -8
  563. package/src/core/handlers/log-handler.ts +19 -8
  564. package/src/core/handlers/script-debugger-handler.ts +46 -0
  565. package/src/core/handlers/sfra-handler.ts +12 -44
  566. package/src/core/handlers/simple-client-handler.ts +78 -0
  567. package/src/core/handlers/system-object-handler.ts +17 -32
  568. package/src/core/handlers/validation-helpers.ts +87 -47
  569. package/src/core/instruction-advisor.ts +122 -0
  570. package/src/core/server.ts +178 -13
  571. package/src/core/tool-definitions.ts +25 -1071
  572. package/src/core/tool-schemas/agent-instruction-tools.ts +72 -0
  573. package/src/core/tool-schemas/cartridge-tools.ts +29 -0
  574. package/src/core/tool-schemas/code-version-tools.ts +28 -0
  575. package/src/core/tool-schemas/documentation-tools.ts +104 -0
  576. package/src/core/tool-schemas/index.ts +27 -0
  577. package/src/core/tool-schemas/isml-tools.ts +89 -0
  578. package/src/core/tool-schemas/log-tools.ts +196 -0
  579. package/src/core/tool-schemas/script-debugger-tools.ts +83 -0
  580. package/src/core/tool-schemas/sfra-tools.ts +65 -0
  581. package/src/core/tool-schemas/shared-schemas.ts +158 -0
  582. package/src/core/tool-schemas/system-object-tools.ts +127 -0
  583. package/src/main.ts +63 -30
  584. package/src/services/index.ts +4 -10
  585. package/src/tool-configs/agent-instructions-tool-config.ts +83 -0
  586. package/src/tool-configs/cartridge-tool-config.ts +1 -1
  587. package/src/tool-configs/code-version-tool-config.ts +0 -5
  588. package/src/tool-configs/docs-tool-config.ts +0 -7
  589. package/src/tool-configs/isml-tool-config.ts +87 -0
  590. package/src/tool-configs/job-log-tool-config.ts +18 -17
  591. package/src/tool-configs/log-tool-config.ts +49 -64
  592. package/src/tool-configs/script-debugger-tool-config.ts +69 -0
  593. package/src/tool-configs/sfra-tool-config.ts +0 -11
  594. package/src/tool-configs/system-object-tool-config.ts +0 -5
  595. package/src/types/types.ts +2 -0
  596. package/src/utils/cache.ts +49 -54
  597. package/src/utils/category-utils.ts +70 -0
  598. package/src/utils/log-tool-constants.ts +25 -17
  599. package/src/utils/logger.ts +38 -1
  600. package/src/utils/markdown-utils.ts +280 -0
  601. package/src/utils/path-resolver.ts +25 -9
  602. package/src/utils/path-validation.ts +113 -0
  603. package/tests/base-handler.test.ts +1 -1
  604. package/tests/cache.test.ts +2 -2
  605. package/tests/cartridge-handler.test.ts +4 -4
  606. package/tests/client-factory.test.ts +1 -1
  607. package/tests/code-version-handler.test.ts +3 -3
  608. package/tests/docs-handler.test.ts +2 -2
  609. package/tests/documentation-scanner.test.ts +4 -4
  610. package/tests/isml-client.test.ts +463 -0
  611. package/tests/isml-handler.test.ts +375 -0
  612. package/tests/job-log-handler.test.ts +1 -1
  613. package/tests/log-handler.test.ts +8 -8
  614. package/tests/log-validation.test.ts +149 -0
  615. package/tests/mcp/README.md +22 -18
  616. package/tests/mcp/node/activate-code-version-advanced.full-mode.programmatic.test.js +30 -12
  617. package/tests/mcp/node/evaluate-script.full-mode.programmatic.test.js +387 -0
  618. package/tests/mcp/node/generate-cartridge-structure.docs-only.programmatic.test.js +14 -8
  619. package/tests/mcp/node/get-isml-categories.programmatic.test.js +278 -0
  620. package/tests/mcp/node/get-isml-element.programmatic.test.js +278 -0
  621. package/tests/mcp/node/get-isml-elements-by-category.programmatic.test.js +363 -0
  622. package/tests/mcp/node/get-sfra-categories.docs-only.programmatic.test.js +24 -24
  623. package/tests/mcp/node/get-sfra-document.programmatic.test.js +4 -2
  624. package/tests/mcp/node/list-isml-elements.programmatic.test.js +311 -0
  625. package/tests/mcp/node/list-sfcc-classes.docs-only.programmatic.test.js +2 -33
  626. package/tests/mcp/node/search-isml-elements.programmatic.test.js +325 -0
  627. package/tests/mcp/node/search-sfcc-classes.docs-only.programmatic.test.js +5 -9
  628. package/tests/mcp/node/search-sfcc-methods.docs-only.programmatic.test.js +7 -9
  629. package/tests/mcp/node/tools.docs-only.programmatic.test.js +42 -65
  630. package/tests/mcp/node/tools.full-mode.programmatic.test.js +7 -8
  631. package/tests/mcp/yaml/activate-code-version.full-mode.test.mcp.yml +2 -2
  632. package/tests/mcp/yaml/evaluate-script.full-mode.test.mcp.yml +281 -0
  633. package/tests/mcp/yaml/get-isml-categories.docs-only.test.mcp.yml +330 -0
  634. package/tests/mcp/yaml/get-isml-element.docs-only.test.mcp.yml +294 -0
  635. package/tests/mcp/yaml/get-isml-elements-by-category.docs-only.test.mcp.yml +334 -0
  636. package/tests/mcp/yaml/get-sfcc-class-info.docs-only.test.mcp.yml +2 -2
  637. package/tests/mcp/yaml/get-sfra-categories.docs-only.test.mcp.yml +13 -13
  638. package/tests/mcp/yaml/get-sfra-categories.full-mode.test.mcp.yml +13 -13
  639. package/tests/mcp/yaml/get-system-object-definitions.docs-only.test.mcp.yml +1 -16
  640. package/tests/mcp/yaml/list-isml-elements.docs-only.test.mcp.yml +212 -0
  641. package/tests/mcp/yaml/search-isml-elements.docs-only.test.mcp.yml +312 -0
  642. package/tests/mcp/yaml/search-sfcc-classes.docs-only.test.mcp.yml +1 -1
  643. package/tests/mcp/yaml/search-sfcc-classes.full-mode.test.mcp.yml +1 -1
  644. package/tests/mcp/yaml/search-site-preferences.docs-only.test.mcp.yml +1 -1
  645. package/tests/mcp/yaml/tools.docs-only.test.mcp.yml +3 -57
  646. package/tests/mcp/yaml/tools.full-mode.test.mcp.yml +3 -3
  647. package/tests/oauth-token.test.ts +107 -12
  648. package/tests/ocapi-client.test.ts +53 -106
  649. package/tests/script-debugger-client.test.ts +430 -0
  650. package/tests/servers/sfcc-mock-server/src/app.js +15 -0
  651. package/tests/servers/sfcc-mock-server/src/routes/cartridge-webdav.js +258 -0
  652. package/tests/servers/sfcc-mock-server/src/routes/ocapi/debugger-handler.js +396 -0
  653. package/tests/servers/sfcc-mock-server/src/routes/ocapi.js +5 -0
  654. package/tests/servers/sfcc-mock-server/src/routes/storefront.js +86 -0
  655. package/tests/servers/sfcc-mock-server/src/routes/webdav.js +6 -4
  656. package/tests/validation-helpers.test.ts +0 -31
  657. package/tests/workspace-roots.test.ts +227 -0
  658. package/ai-instructions/claude-desktop/claude_custom_instructions.md +0 -321
  659. package/ai-instructions/cursor/.cursor/rules/debugging-workflows.mdc +0 -171
  660. package/ai-instructions/cursor/.cursor/rules/hooks-development.mdc +0 -168
  661. package/ai-instructions/cursor/.cursor/rules/isml-templates.mdc +0 -209
  662. package/ai-instructions/cursor/.cursor/rules/job-framework.mdc +0 -379
  663. package/ai-instructions/cursor/.cursor/rules/performance-optimization.mdc +0 -215
  664. package/ai-instructions/cursor/.cursor/rules/scapi-endpoints.mdc +0 -98
  665. package/ai-instructions/cursor/.cursor/rules/security-patterns.mdc +0 -375
  666. package/ai-instructions/cursor/.cursor/rules/sfcc-development.mdc +0 -144
  667. package/ai-instructions/cursor/.cursor/rules/sfra-controllers.mdc +0 -376
  668. package/ai-instructions/cursor/.cursor/rules/sfra-models.mdc +0 -412
  669. package/ai-instructions/cursor/.cursor/rules/system-objects.mdc +0 -383
  670. package/ai-instructions/cursor/.cursor/rules/testing-patterns.mdc +0 -418
  671. package/dist/clients/best-practices-client.d.ts +0 -57
  672. package/dist/clients/best-practices-client.d.ts.map +0 -1
  673. package/dist/clients/best-practices-client.js +0 -288
  674. package/dist/clients/best-practices-client.js.map +0 -1
  675. package/dist/clients/cartridge-generation-client.d.ts +0 -57
  676. package/dist/clients/cartridge-generation-client.d.ts.map +0 -1
  677. package/dist/clients/cartridge-generation-client.js +0 -384
  678. package/dist/clients/cartridge-generation-client.js.map +0 -1
  679. package/dist/clients/logs/index.d.ts +0 -13
  680. package/dist/clients/logs/index.d.ts.map +0 -1
  681. package/dist/clients/logs/index.js +0 -15
  682. package/dist/clients/logs/index.js.map +0 -1
  683. package/dist/clients/logs/log-analyzer.d.ts +0 -55
  684. package/dist/clients/logs/log-analyzer.d.ts.map +0 -1
  685. package/dist/clients/logs/log-analyzer.js +0 -228
  686. package/dist/clients/logs/log-analyzer.js.map +0 -1
  687. package/dist/clients/logs/log-client.d.ts +0 -87
  688. package/dist/clients/logs/log-client.d.ts.map +0 -1
  689. package/dist/clients/logs/log-client.js +0 -418
  690. package/dist/clients/logs/log-client.js.map +0 -1
  691. package/dist/clients/logs/log-constants.d.ts +0 -37
  692. package/dist/clients/logs/log-constants.d.ts.map +0 -1
  693. package/dist/clients/logs/log-constants.js +0 -37
  694. package/dist/clients/logs/log-constants.js.map +0 -1
  695. package/dist/clients/logs/log-file-discovery.d.ts +0 -62
  696. package/dist/clients/logs/log-file-discovery.d.ts.map +0 -1
  697. package/dist/clients/logs/log-file-discovery.js +0 -238
  698. package/dist/clients/logs/log-file-discovery.js.map +0 -1
  699. package/dist/clients/logs/log-file-reader.d.ts +0 -53
  700. package/dist/clients/logs/log-file-reader.d.ts.map +0 -1
  701. package/dist/clients/logs/log-file-reader.js +0 -194
  702. package/dist/clients/logs/log-file-reader.js.map +0 -1
  703. package/dist/clients/logs/log-formatter.d.ts +0 -90
  704. package/dist/clients/logs/log-formatter.d.ts.map +0 -1
  705. package/dist/clients/logs/log-formatter.js +0 -189
  706. package/dist/clients/logs/log-formatter.js.map +0 -1
  707. package/dist/clients/logs/log-processor.d.ts +0 -91
  708. package/dist/clients/logs/log-processor.d.ts.map +0 -1
  709. package/dist/clients/logs/log-processor.js +0 -328
  710. package/dist/clients/logs/log-processor.js.map +0 -1
  711. package/dist/clients/logs/log-types.d.ts +0 -69
  712. package/dist/clients/logs/log-types.d.ts.map +0 -1
  713. package/dist/clients/logs/log-types.js +0 -5
  714. package/dist/clients/logs/log-types.js.map +0 -1
  715. package/dist/clients/logs/webdav-client-manager.d.ts +0 -28
  716. package/dist/clients/logs/webdav-client-manager.d.ts.map +0 -1
  717. package/dist/clients/logs/webdav-client-manager.js +0 -77
  718. package/dist/clients/logs/webdav-client-manager.js.map +0 -1
  719. package/dist/core/handlers/abstract-log-tool-handler.d.ts +0 -35
  720. package/dist/core/handlers/abstract-log-tool-handler.d.ts.map +0 -1
  721. package/dist/core/handlers/abstract-log-tool-handler.js +0 -46
  722. package/dist/core/handlers/abstract-log-tool-handler.js.map +0 -1
  723. package/dist/core/handlers/best-practices-handler.d.ts +0 -17
  724. package/dist/core/handlers/best-practices-handler.d.ts.map +0 -1
  725. package/dist/core/handlers/best-practices-handler.js +0 -43
  726. package/dist/core/handlers/best-practices-handler.js.map +0 -1
  727. package/dist/core/handlers/job-log-tool-config.d.ts +0 -8
  728. package/dist/core/handlers/job-log-tool-config.d.ts.map +0 -1
  729. package/dist/core/handlers/job-log-tool-config.js +0 -76
  730. package/dist/core/handlers/job-log-tool-config.js.map +0 -1
  731. package/dist/core/handlers/log-tool-config.d.ts +0 -8
  732. package/dist/core/handlers/log-tool-config.d.ts.map +0 -1
  733. package/dist/core/handlers/log-tool-config.js +0 -73
  734. package/dist/core/handlers/log-tool-config.js.map +0 -1
  735. package/dist/docs/best-practices/isml_templates.md +0 -1933
  736. package/dist/docs/best-practices/job_framework.md +0 -1173
  737. package/dist/docs/best-practices/scapi_custom_endpoint.md +0 -963
  738. package/dist/docs/best-practices/sfra_client_side_js.md +0 -736
  739. package/dist/docs/best-practices/sfra_models.md +0 -1142
  740. package/dist/tool-configs/best-practices-tool-config.d.ts +0 -11
  741. package/dist/tool-configs/best-practices-tool-config.d.ts.map +0 -1
  742. package/dist/tool-configs/best-practices-tool-config.js +0 -59
  743. package/dist/tool-configs/best-practices-tool-config.js.map +0 -1
  744. package/dist/utils/job-log-tool-config.d.ts +0 -8
  745. package/dist/utils/job-log-tool-config.d.ts.map +0 -1
  746. package/dist/utils/job-log-tool-config.js +0 -76
  747. package/dist/utils/job-log-tool-config.js.map +0 -1
  748. package/dist/utils/job-log-utils.d.ts +0 -34
  749. package/dist/utils/job-log-utils.d.ts.map +0 -1
  750. package/dist/utils/job-log-utils.js +0 -60
  751. package/dist/utils/job-log-utils.js.map +0 -1
  752. package/dist/utils/log-cache.d.ts +0 -53
  753. package/dist/utils/log-cache.d.ts.map +0 -1
  754. package/dist/utils/log-cache.js +0 -114
  755. package/dist/utils/log-cache.js.map +0 -1
  756. package/dist/utils/log-tool-config.d.ts +0 -8
  757. package/dist/utils/log-tool-config.d.ts.map +0 -1
  758. package/dist/utils/log-tool-config.js +0 -73
  759. package/dist/utils/log-tool-config.js.map +0 -1
  760. package/dist/utils/log-tool-utils.d.ts +0 -39
  761. package/dist/utils/log-tool-utils.d.ts.map +0 -1
  762. package/dist/utils/log-tool-utils.js +0 -94
  763. package/dist/utils/log-tool-utils.js.map +0 -1
  764. package/docs/best-practices/isml_templates.md +0 -1933
  765. package/docs/best-practices/job_framework.md +0 -1173
  766. package/docs/best-practices/scapi_custom_endpoint.md +0 -963
  767. package/docs/best-practices/sfra_client_side_js.md +0 -736
  768. package/docs/best-practices/sfra_models.md +0 -1142
  769. package/docs-site/App.tsx +0 -103
  770. package/docs-site/README.md +0 -113
  771. package/docs-site/components/Badge.tsx +0 -38
  772. package/docs-site/components/BreadcrumbSchema.tsx +0 -34
  773. package/docs-site/components/CodeBlock.tsx +0 -132
  774. package/docs-site/components/Collapsible.tsx +0 -40
  775. package/docs-site/components/ConfigBuilder.tsx +0 -118
  776. package/docs-site/components/ConfigHero.tsx +0 -19
  777. package/docs-site/components/ConfigModeTabs.tsx +0 -42
  778. package/docs-site/components/Layout.tsx +0 -174
  779. package/docs-site/components/LightCodeContainer.tsx +0 -44
  780. package/docs-site/components/NewcomerCTA.tsx +0 -57
  781. package/docs-site/components/NextStepsStrip.tsx +0 -23
  782. package/docs-site/components/OnThisPage.tsx +0 -91
  783. package/docs-site/components/SEO.tsx +0 -79
  784. package/docs-site/components/Search.tsx +0 -207
  785. package/docs-site/components/Sidebar.tsx +0 -96
  786. package/docs-site/components/StructuredData.tsx +0 -72
  787. package/docs-site/components/ToolCard.tsx +0 -84
  788. package/docs-site/components/ToolFilters.tsx +0 -39
  789. package/docs-site/components/Typography.tsx +0 -30
  790. package/docs-site/components/VersionBadge.tsx +0 -18
  791. package/docs-site/components/icons.tsx +0 -37
  792. package/docs-site/constants.tsx +0 -34
  793. package/docs-site/index.html +0 -62
  794. package/docs-site/main.tsx +0 -16
  795. package/docs-site/metadata.json +0 -5
  796. package/docs-site/package-lock.json +0 -3966
  797. package/docs-site/package.json +0 -35
  798. package/docs-site/pages/AIInterfacesPage.tsx +0 -610
  799. package/docs-site/pages/ConfigurationPage.tsx +0 -315
  800. package/docs-site/pages/DevelopmentPage.tsx +0 -607
  801. package/docs-site/pages/ExamplesPage.tsx +0 -558
  802. package/docs-site/pages/FeaturesPage.tsx +0 -353
  803. package/docs-site/pages/HomePage.tsx +0 -1046
  804. package/docs-site/pages/SecurityPage.tsx +0 -372
  805. package/docs-site/pages/ToolsPage.tsx +0 -205
  806. package/docs-site/pages/TroubleshootingPage.tsx +0 -590
  807. package/docs-site/postcss.config.js +0 -6
  808. package/docs-site/public/.well-known/security.txt +0 -6
  809. package/docs-site/public/android-chrome-192x192.png +0 -0
  810. package/docs-site/public/android-chrome-512x512.png +0 -0
  811. package/docs-site/public/apple-touch-icon.png +0 -0
  812. package/docs-site/public/favicon-16x16.png +0 -0
  813. package/docs-site/public/favicon-32x32.png +0 -0
  814. package/docs-site/public/favicon.ico +0 -0
  815. package/docs-site/public/llms.txt +0 -47
  816. package/docs-site/scripts/generate-search-index.js +0 -323
  817. package/docs-site/scripts/generate-sitemap.js +0 -156
  818. package/docs-site/scripts/search-dev.js +0 -112
  819. package/docs-site/src/styles/input.css +0 -248
  820. package/docs-site/src/styles/prism-theme.css +0 -124
  821. package/docs-site/tailwind.config.js +0 -70
  822. package/docs-site/tsconfig.json +0 -29
  823. package/docs-site/types.ts +0 -16
  824. package/docs-site/utils/search.ts +0 -132
  825. package/docs-site/utils/toolsData.ts +0 -116
  826. package/docs-site/vite.config.ts +0 -63
  827. package/src/clients/best-practices-client.ts +0 -332
  828. package/src/clients/cartridge-generation-client.ts +0 -507
  829. package/src/clients/logs/index.ts +0 -18
  830. package/src/clients/logs/log-analyzer.ts +0 -289
  831. package/src/clients/logs/log-client.ts +0 -540
  832. package/src/clients/logs/log-constants.ts +0 -53
  833. package/src/clients/logs/log-file-discovery.ts +0 -299
  834. package/src/clients/logs/log-file-reader.ts +0 -227
  835. package/src/clients/logs/log-formatter.ts +0 -258
  836. package/src/clients/logs/log-processor.ts +0 -402
  837. package/src/clients/logs/log-types.ts +0 -80
  838. package/src/clients/logs/webdav-client-manager.ts +0 -93
  839. package/src/core/handlers/abstract-log-tool-handler.ts +0 -64
  840. package/src/core/handlers/best-practices-handler.ts +0 -55
  841. package/src/core/handlers/job-log-tool-config.ts +0 -89
  842. package/src/core/handlers/log-tool-config.ts +0 -98
  843. package/src/tool-configs/best-practices-tool-config.ts +0 -68
  844. package/src/utils/job-log-tool-config.ts +0 -89
  845. package/src/utils/job-log-utils.ts +0 -78
  846. package/src/utils/log-cache.ts +0 -134
  847. package/src/utils/log-tool-config.ts +0 -98
  848. package/src/utils/log-tool-utils.ts +0 -122
  849. package/tests/best-practices-handler.test.ts +0 -236
  850. package/tests/job-log-utils.test.ts +0 -182
  851. package/tests/mcp/node/get-available-best-practice-guides.docs-only.programmatic.test.js +0 -516
  852. package/tests/mcp/node/get-best-practice-guide.docs-only.programmatic.test.js +0 -733
  853. package/tests/mcp/node/get-hook-reference.docs-only.programmatic.test.js +0 -185
  854. package/tests/mcp/node/search-best-practices.docs-only.programmatic.test.js +0 -836
  855. package/tests/mcp/yaml/get-available-best-practice-guides.docs-only.test.mcp.yml +0 -885
  856. package/tests/mcp/yaml/get-available-best-practice-guides.full-mode.test.mcp.yml +0 -885
  857. package/tests/mcp/yaml/get-best-practice-guide.docs-only.test.mcp.yml +0 -462
  858. package/tests/mcp/yaml/get-best-practice-guide.full-mode.test.mcp.yml +0 -462
  859. package/tests/mcp/yaml/get-hook-reference.docs-only.test.mcp.yml +0 -321
  860. package/tests/mcp/yaml/get-hook-reference.full-mode.test.mcp.yml +0 -321
  861. package/tests/mcp/yaml/search-best-practices.docs-only.test.mcp.yml +0 -655
  862. package/tests/mcp/yaml/search-best-practices.full-mode.test.mcp.yml +0 -655
  863. /package/{docs-site → docs-site-v2}/public/404.html +0 -0
  864. /package/{docs-site → docs-site-v2}/public/explain-product-pricing-methods-no-mcp.png +0 -0
  865. /package/{docs-site → docs-site-v2}/public/explain-product-pricing-methods.png +0 -0
@@ -1,1173 +0,0 @@
1
- # Salesforce B2C Commerce Job Framework: Best Practices & Development Guide
2
-
3
- This guide provides comprehensive best practices for developing custom jobs within the Salesforce B2C Commerce Cloud Job Framework. Master these principles to build robust, scalable, and high-performing batch processing solutions that can handle enterprise-scale data operations.
4
-
5
- **IMPORTANT**: Before developing custom jobs, consult the **Performance and Stability Best Practices** and **Security Best Practices** guides from this MCP server. Understanding performance optimization strategies, database-friendly APIs, and security guidelines is essential for building production-ready job solutions.
6
-
7
- ## Core Concepts
8
-
9
- ### The SFCC Job Framework Architecture
10
-
11
- The Job Framework is the cornerstone of back-end automation for any e-commerce implementation on SFCC. It provides a robust, scalable mechanism for executing asynchronous processes essential for site operations, data management, and system integration.
12
-
13
- **Key Components:**
14
- - **Jobs**: Highest-level containers that encapsulate complete business processes
15
- - **Flows**: Logical sequences of steps within a job (can be sequential or parallel)
16
- - **Steps**: Smallest units of execution representing discrete tasks
17
-
18
- ### Modern Job Development Paradigms
19
-
20
- SFCC offers two distinct development models for custom jobs:
21
-
22
- | Aspect | Task-Oriented ("Normal") | Chunk-Oriented |
23
- |--------|-------------------------|----------------|
24
- | **Best For** | Simple, monolithic tasks; quick operations | Large-scale data processing |
25
- | **Data Volume** | Low (prone to timeouts with large datasets) | High (designed for massive datasets) |
26
- | **Progress Monitoring** | Limited (running or finished) | Granular (updated per chunk) |
27
- | **Transaction Control** | Typically one transaction | Fine-grained per chunk |
28
- | **Code Complexity** | Low (single main function) | Moderate (callback functions) |
29
- | **Resumability** | Difficult (requires full restart) | Easier (failures isolated to chunks) |
30
-
31
- ## Task-Oriented Jobs: Best Practices
32
-
33
- ### When to Use Task-Oriented Jobs
34
-
35
- Choose task-oriented jobs for:
36
- - Single configuration file downloads
37
- - Single API calls to external services
38
- - Quick, targeted database updates
39
- - Tasks where calculating progress is impractical
40
-
41
- ### Essential Implementation Patterns
42
-
43
- #### 1. Proper Script Module Structure
44
-
45
- ```javascript
46
- 'use strict';
47
-
48
- var Status = require('dw/system/Status');
49
- var Transaction = require('dw/system/Transaction');
50
- var Logger = require('dw/system/Logger');
51
-
52
- /**
53
- * Main function for task-oriented job step
54
- * @param {Object} parameters - Parameters from Business Manager
55
- * @param {dw.job.JobStepExecution} stepExecution - Job context and logging
56
- * @returns {dw.system.Status} - Exit status
57
- */
58
- exports.execute = function (parameters, stepExecution) {
59
- var logger = Logger.getLogger('jobs', 'TaskOrientedJob');
60
-
61
- try {
62
- logger.info('Starting job with parameters: {0}', JSON.stringify(parameters));
63
-
64
- // Your business logic here
65
- var result = performBusinessLogic(parameters, logger);
66
-
67
- if (result.success) {
68
- logger.info('Job completed successfully');
69
- return new Status(Status.OK);
70
- } else {
71
- logger.warn('Job completed with warnings: {0}', result.message);
72
- return new Status(Status.OK, 'OK', result.message);
73
- }
74
-
75
- } catch (e) {
76
- logger.error('Job failed with error: {0}', e.message);
77
- return new Status(Status.ERROR, 'ERROR', e.message);
78
- }
79
- };
80
-
81
- function performBusinessLogic(parameters, logger) {
82
- // Implementation here
83
- return { success: true, message: 'Operation completed' };
84
- }
85
- ```
86
-
87
- #### 2. Advanced Status Control for Flow Management
88
-
89
- ```javascript
90
- // Status codes must be either OK or ERROR only
91
- exports.execute = function (parameters, stepExecution) {
92
- var logger = Logger.getLogger('jobs', 'StatusControlJob');
93
-
94
- try {
95
- var inputFile = new File(File.IMPEX + parameters.fileName);
96
-
97
- if (!inputFile.exists()) {
98
- logger.info('Input file not found: {0}', parameters.fileName);
99
- // Use OK status with descriptive message for conditional flow control
100
- return new Status(Status.OK, 'OK', 'Input file was not present - skipping processing');
101
- }
102
-
103
- if (inputFile.length() === 0) {
104
- logger.info('Input file is empty: {0}', parameters.fileName);
105
- return new Status(Status.OK, 'OK', 'No data to process - file is empty');
106
- }
107
-
108
- // Process file...
109
- return new Status(Status.OK, 'OK', 'File processed successfully');
110
-
111
- } catch (e) {
112
- logger.error('Processing failed: {0}', e.message);
113
- return new Status(Status.ERROR, 'ERROR', e.message);
114
- }
115
- };
116
- ```
117
-
118
- #### 3. Proper Transaction Management
119
-
120
- ```javascript
121
- // RECOMMENDED: Use Transaction.wrap for automatic lifecycle management
122
- exports.execute = function (parameters, stepExecution) {
123
- var logger = Logger.getLogger('jobs', 'TransactionJob');
124
-
125
- try {
126
- var category = CatalogMgr.getCategory(parameters.categoryID);
127
- var products = ProductMgr.queryProductsInCatalog(category.getCatalog());
128
- var updateCount = 0;
129
-
130
- // Transaction.wrap handles begin/commit/rollback automatically
131
- Transaction.wrap(function () {
132
- while (products.hasNext()) {
133
- var product = products.next();
134
- // Filter by category assignment and online status
135
- if (product.isOnline() && product.isAssignedToCategory(category)) {
136
- product.setOnlineFlag(false);
137
- updateCount++;
138
- }
139
- }
140
- });
141
-
142
- products.close();
143
- logger.info('Updated {0} products', updateCount);
144
- return new Status(Status.OK);
145
-
146
- } catch (e) {
147
- logger.error('Transaction failed: {0}', e.message);
148
- return new Status(Status.ERROR);
149
- }
150
- };
151
- ```
152
-
153
- ### Task-Oriented Job Configuration
154
-
155
- #### steptypes.json Structure
156
-
157
- ```json
158
- {
159
- "step-types": {
160
- "script-module-step": [
161
- {
162
- "@type-id": "custom.DeactivateProducts",
163
- "@supports-site-context": true,
164
- "@supports-organization-context": false,
165
- "description": "Deactivates all online products in a specified category",
166
- "module": "plugin_examplecartridge/cartridge/scripts/jobs/deactivateProducts.js",
167
- "function": "execute",
168
- "parameters": [
169
- {
170
- "@name": "categoryID",
171
- "@type": "string",
172
- "@required": true,
173
- "description": "ID of the category containing products to deactivate"
174
- }
175
- ],
176
- "status-codes": {
177
- "status": [
178
- { "@code": "OK", "description": "Products deactivated successfully" },
179
- { "@code": "ERROR", "description": "An error occurred during processing" }
180
- ]
181
- }
182
- }
183
- ]
184
- }
185
- }
186
- ```
187
-
188
- ## Chunk-Oriented Jobs: Enterprise-Scale Processing
189
-
190
- ### The Chunking Philosophy
191
-
192
- Chunk-oriented jobs are SFCC's architectural solution for processing large datasets without hitting platform limits. They break massive tasks into manageable segments, providing:
193
-
194
- - **Stability**: Eliminates memory and timeout issues
195
- - **Performance**: Fine-tuned transaction management
196
- - **Monitoring**: Granular progress tracking
197
- - **Resilience**: Isolated failure handling
198
-
199
- ### Core Lifecycle Functions
200
-
201
- #### Required Functions (Data Pipeline)
202
-
203
- ```javascript
204
- 'use strict';
205
-
206
- var File = require('dw/io/File');
207
- var FileReader = require('dw/io/FileReader');
208
- var CSVStreamReader = require('dw/io/CSVStreamReader');
209
- var ProductMgr = require('dw/catalog/ProductMgr');
210
- var Transaction = require('dw/system/Transaction');
211
- var Logger = require('dw/system/Logger');
212
-
213
- var csvReader;
214
- var totalLines = 0;
215
- var processedLines = 0;
216
- var logger = Logger.getLogger('jobs', 'BulkProductUpdate');
217
-
218
- /**
219
- * Setup function - opens input file and prepares for processing
220
- */
221
- exports.beforeStep = function (parameters, stepExecution) {
222
- try {
223
- var inputFile = new File(File.IMPEX + parameters.inputFileName);
224
- if (!inputFile.exists()) {
225
- throw new Error('Input file not found: ' + parameters.inputFileName);
226
- }
227
-
228
- var fileReader = new FileReader(inputFile);
229
- csvReader = new CSVStreamReader(fileReader);
230
-
231
- // Skip header row if present
232
- if (parameters.hasHeader === 'true') {
233
- csvReader.readNext();
234
- }
235
-
236
- logger.info('Started processing file: {0}', parameters.inputFileName);
237
-
238
- } catch (e) {
239
- logger.error('Setup failed: {0}', e.message);
240
- throw e;
241
- }
242
- };
243
-
244
- /**
245
- * Returns total count for progress monitoring (optional but recommended)
246
- */
247
- exports.getTotalCount = function (parameters, stepExecution) {
248
- // Return estimated count for progress tracking
249
- // This could be based on file size or pre-calculated value
250
- return totalLines > 0 ? totalLines : null;
251
- };
252
-
253
- /**
254
- * Reads next item from data source
255
- * @returns {Object|null} Next item or null when finished
256
- */
257
- exports.read = function (parameters, stepExecution) {
258
- var line = csvReader.readNext();
259
- if (line && line.length > 0) {
260
- return {
261
- productID: line[0],
262
- newOnlineStatus: line[1] === 'true',
263
- lineNumber: ++processedLines
264
- };
265
- }
266
- return null; // Signals end of data
267
- };
268
-
269
- /**
270
- * Processes a single item
271
- * @param {Object} item - Item from read()
272
- * @returns {Object|null} Processed item or null to filter out
273
- */
274
- exports.process = function (item, parameters, stepExecution) {
275
- try {
276
- var product = ProductMgr.getProduct(item.productID);
277
- if (!product) {
278
- return {
279
- productID: item.productID,
280
- status: 'ERROR',
281
- message: 'Product not found',
282
- lineNumber: item.lineNumber
283
- };
284
- }
285
-
286
- if (typeof item.newOnlineStatus !== 'boolean') {
287
- return {
288
- productID: item.productID,
289
- status: 'SKIPPED',
290
- message: 'Invalid online status value',
291
- lineNumber: item.lineNumber
292
- };
293
- }
294
-
295
- return {
296
- product: product,
297
- productID: item.productID,
298
- newOnlineStatus: item.newOnlineStatus,
299
- status: 'READY',
300
- lineNumber: item.lineNumber
301
- };
302
-
303
- } catch (e) {
304
- logger.warn('Error processing product {0}: {1}', item.productID, e.message);
305
- return {
306
- productID: item.productID,
307
- status: 'ERROR',
308
- message: e.message,
309
- lineNumber: item.lineNumber
310
- };
311
- }
312
- };
313
-
314
- /**
315
- * Writes a chunk of processed items
316
- * @param {dw.util.ArrayList} chunk - Collection of processed items
317
- */
318
- exports.write = function (chunk, parameters, stepExecution) {
319
- var successCount = 0;
320
- var errorCount = 0;
321
-
322
- for (var i = 0; i < chunk.size(); i++) {
323
- var item = chunk.get(i);
324
-
325
- if (item.status === 'READY') {
326
- try {
327
- // Update product attribute - transaction will be committed in afterChunk
328
- item.product.setOnlineFlag(item.newOnlineStatus);
329
- successCount++;
330
- } catch (e) {
331
- errorCount++;
332
- logger.error('Failed to update product {0}: {1}', item.productID, e.message);
333
- }
334
- } else {
335
- errorCount++;
336
- }
337
- }
338
-
339
- logger.info('Chunk processed: {0} success, {1} errors', successCount, errorCount);
340
- };
341
-
342
- /**
343
- * Pre-chunk setup to begin a transaction (Optional but recommended)
344
- */
345
- exports.beforeChunk = function (parameters, stepExecution) {
346
- // Begin transaction for this chunk
347
- Transaction.begin();
348
- };
349
-
350
- /**
351
- * Commits transaction after successful chunk processing (Optional but recommended)
352
- */
353
- exports.afterChunk = function (parameters, stepExecution) {
354
- // CRITICAL: Commit transaction per chunk for resilience
355
- Transaction.commit();
356
- };
357
-
358
- /**
359
- * Cleanup function - closes resources
360
- */
361
- exports.afterStep = function (success, parameters, stepExecution) {
362
- if (csvReader) {
363
- csvReader.close();
364
- }
365
-
366
- logger.info('Processing completed. Total lines processed: {0}', processedLines);
367
-
368
- if (!success) {
369
- logger.error('Job completed with errors');
370
- }
371
- };
372
- ```
373
-
374
- #### Optional Lifecycle Hooks
375
-
376
- ```javascript
377
-
378
- /**
379
- * Post-step reporting (optional)
380
- */
381
- exports.afterStep = function (success, parameters, stepExecution) {
382
- var logger = Logger.getLogger('jobs', 'ReportingJob');
383
-
384
- if (success) {
385
- // Send success notification
386
- sendProcessingReport(parameters, 'SUCCESS', processedLines);
387
- } else {
388
- // Handle failure case
389
- sendProcessingReport(parameters, 'FAILED', processedLines);
390
- }
391
- };
392
- ```
393
-
394
- ### Chunk-Oriented Job Configuration
395
-
396
- #### steptypes.json Structure
397
-
398
- ```json
399
- {
400
- "step-types": {
401
- "chunk-script-module-step": [
402
- {
403
- "@type-id": "custom.BulkProductUpdate",
404
- "@supports-site-context": true,
405
- "@supports-organization-context": false,
406
- "description": "Updates product online status from CSV file in chunks",
407
- "module": "plugin_examplecartridge/cartridge/scripts/jobs/bulkProductUpdate.js",
408
- "before-step-function": "beforeStep",
409
- "total-count-function": "getTotalCount",
410
- "before-chunk-function": "beforeChunk",
411
- "read-function": "read",
412
- "process-function": "process",
413
- "write-function": "write",
414
- "after-chunk-function": "afterChunk",
415
- "after-step-function": "afterStep",
416
- "chunk-size": 200,
417
- "transactional": false,
418
- "parameters": [
419
- {
420
- "@name": "inputFileName",
421
- "@type": "string",
422
- "@required": true,
423
- "description": "Name of CSV file in IMPEX folder"
424
- },
425
- {
426
- "@name": "hasHeader",
427
- "@type": "boolean",
428
- "@required": false,
429
- "description": "Whether CSV file has header row"
430
- }
431
- ],
432
- "status-codes": {
433
- "status": [
434
- { "@code": "OK", "description": "Processing completed successfully" },
435
- { "@code": "ERROR", "description": "An error occurred during processing" }
436
- ]
437
- }
438
- }
439
- ]
440
- }
441
- }
442
- ```
443
-
444
- ## Performance Optimization Strategies
445
-
446
- ### Memory Management Best Practices
447
-
448
- #### 1. Always Use Streaming APIs
449
-
450
- ```javascript
451
- // ❌ WRONG: Loading entire file into memory
452
- var content = new FileReader(file).readBytes();
453
- var lines = content.toString().split('\n');
454
-
455
- // ✅ CORRECT: Stream processing
456
- var csvReader = new CSVStreamReader(new FileReader(file));
457
- var line;
458
- while ((line = csvReader.readNext()) !== null) {
459
- // Process one line at a time
460
- }
461
- csvReader.close();
462
- ```
463
-
464
- #### 2. Proper Iterator Management
465
-
466
- ```javascript
467
- // ✅ CORRECT: Always close iterators
468
- exports.execute = function (parameters, stepExecution) {
469
- var products = null;
470
- try {
471
- products = ProductMgr.queryAllSiteProducts();
472
- while (products.hasNext()) {
473
- var product = products.next();
474
- // Process product
475
- }
476
- } finally {
477
- if (products) {
478
- products.close(); // Critical: prevents memory leaks
479
- }
480
- }
481
- };
482
- ```
483
-
484
- #### 3. Avoid Object Retention
485
-
486
- ```javascript
487
- // ❌ WRONG: Accumulating objects in memory
488
- var allProducts = [];
489
- while (products.hasNext()) {
490
- allProducts.push(products.next()); // Memory will grow linearly
491
- }
492
-
493
- // ✅ CORRECT: Process and release
494
- while (products.hasNext()) {
495
- var product = products.next();
496
- processProduct(product);
497
- // Product reference goes out of scope and can be garbage collected
498
- }
499
- ```
500
-
501
- ### Transaction Management Strategies
502
-
503
- #### 1. Optimal Chunk Sizing
504
-
505
- ```javascript
506
- // Chunk size guidelines based on operation complexity:
507
- // - Simple attribute updates: 500-1000 items
508
- // - Complex object creation: 100-300 items
509
- // - File I/O operations: 200-500 items
510
-
511
- // Example configuration for different scenarios:
512
- "chunk-size": 250 // Good balance for most operations
513
- ```
514
-
515
- #### 2. Transaction Per Chunk Pattern
516
-
517
- ```javascript
518
- exports.beforeChunk = function (parameters, stepExecution) {
519
- Transaction.begin();
520
- };
521
-
522
- exports.write = function (chunk, parameters, stepExecution) {
523
- // Perform all database modifications here
524
- for (var i = 0; i < chunk.size(); i++) {
525
- var item = chunk.get(i);
526
- // Database updates happen within the transaction
527
- updateDatabaseObject(item);
528
- }
529
- };
530
-
531
- exports.afterChunk = function (parameters, stepExecution) {
532
- try {
533
- Transaction.commit(); // Commit successful chunk
534
- } catch (e) {
535
- Transaction.rollback(); // Rollback failed chunk
536
- throw e; // Re-throw to mark chunk as failed
537
- }
538
- };
539
- ```
540
-
541
- ### Efficient API Usage Patterns
542
-
543
- #### 1. Minimize API Calls in Loops
544
-
545
- ```javascript
546
- // ❌ WRONG: API call per iteration
547
- for (var i = 0; i < productIDs.length; i++) {
548
- var product = ProductMgr.getProduct(productIDs[i]); // Expensive!
549
- processProduct(product);
550
- }
551
-
552
- // ✅ BETTER: Batch processing where possible
553
- var ProductSearchModel = require('dw/catalog/ProductSearchModel');
554
- var productSearchModel = new ProductSearchModel();
555
- productSearchModel.setSearchPhrase(productIDs.join(' OR '));
556
- var products = productSearchModel.getProductSearchHits();
557
- ```
558
-
559
- #### 2. Smart Caching Strategies
560
-
561
- ```javascript
562
- var categoryCache = {};
563
-
564
- function getCachedCategory(categoryID) {
565
- if (!categoryCache[categoryID]) {
566
- categoryCache[categoryID] = CatalogMgr.getCategory(categoryID);
567
- }
568
- return categoryCache[categoryID];
569
- }
570
- ```
571
-
572
- #### 3. 🔥 Critical Performance Pattern: Leverage SeekableIterator Built-in Count
573
-
574
- **ALWAYS use the SeekableIterator's built-in count property instead of creating separate iterators for counting.** A common but severely inefficient anti-pattern is implementing getTotalCount() by creating a dedicated iterator just to count records (e.g., creating a second ProductMgr.queryAllSiteProducts() call). SFCC's SeekableIterator provides a getCount() method and count property that returns the total count without any additional database queries or iteration.
575
-
576
- ##### ✅ OPTIMAL Pattern:
577
-
578
- ```javascript
579
- var products; // Declare at module level
580
-
581
- // Initialize iterator once in beforeStep
582
- exports.beforeStep = function(parameters) {
583
- products = ProductMgr.queryAllSiteProductsSorted(); // Single query
584
- }
585
-
586
- // Use iterator's built-in count - no additional overhead!
587
- exports.getTotalCount = function() {
588
- if (products && products.getCount) {
589
- var totalCount = products.getCount(); // Instant, no DB hit
590
- return totalCount >= 0 ? totalCount : null;
591
- }
592
- return null;
593
- }
594
-
595
- // Use the same iterator for reading
596
- exports.read = function() {
597
- return products.hasNext() ? products.next() : null;
598
- }
599
- ```
600
-
601
- ##### ❌ SEVERELY INEFFICIENT Anti-Pattern:
602
-
603
- ```javascript
604
- // This creates TWO expensive database queries!
605
- exports.getTotalCount = function() {
606
- var counter = ProductMgr.queryAllSiteProducts(); // Unnecessary Query #1
607
- var count = 0;
608
- while (counter.hasNext()) { counter.next(); count++; } // Manual counting!
609
- counter.close();
610
- return count;
611
- }
612
-
613
- exports.read = function() {
614
- if (!products) {
615
- products = ProductMgr.queryAllSiteProductsSorted(); // Query #2
616
- }
617
- return products.hasNext() ? products.next() : null;
618
- }
619
- ```
620
-
621
- ##### 📊 Performance Impact
622
-
623
- The anti-pattern increases database load by **100%** and can add **1-5 minutes** to job startup for large catalogs. Using SeekableIterator.getCount() provides instant total count retrieval with zero additional overhead.
624
-
625
- ##### 🎯 Key Insight
626
-
627
- SFCC's query methods return SeekableIterator instances that already know their total count from the database query execution. Leveraging this built-in capability eliminates the need for manual counting entirely while providing accurate progress tracking for Business Manager users.
628
-
629
- ## Security Best Practices
630
-
631
- ### Secure Logging Practices
632
-
633
- ```javascript
634
- // ❌ WRONG: Logging sensitive data
635
- logger.info('Processing customer: {0}', customer.getProfile().getEmail());
636
-
637
- // ✅ CORRECT: Log only necessary identifiers
638
- logger.info('Processing customer ID: {0}', customer.getProfile().getCustomerNo());
639
- ```
640
-
641
- ### Input Validation and Sanitization
642
-
643
- ```javascript
644
- exports.process = function (item, parameters, stepExecution) {
645
- var logger = Logger.getLogger('jobs', 'ReportingJob');
646
-
647
- // Validate input data
648
- if (!item.productID || typeof item.productID !== 'string') {
649
- return {
650
- status: 'ERROR',
651
- message: 'Invalid product ID format'
652
- };
653
- }
654
-
655
- // Sanitize string inputs
656
- var sanitizedID = item.productID.trim().substring(0, 100);
657
-
658
- // Validate business rules
659
- if (item.price !== undefined && (isNaN(item.price) || item.price < 0)) {
660
- return {
661
- status: 'ERROR',
662
- message: 'Invalid price value'
663
- };
664
- }
665
-
666
- // Process validated data
667
- return processValidatedItem(sanitizedID, item);
668
- };
669
- ```
670
-
671
- ## Debugging and Troubleshooting
672
-
673
- ### Common Issues and Solutions
674
-
675
- #### 1. Memory-Related Failures
676
-
677
- ```javascript
678
- // OutOfMemoryError prevention checklist:
679
- // ✓ Use streaming APIs for file processing
680
- // ✓ Close all SeekableIterators
681
- // ✓ Avoid accumulating objects in global scope
682
- // ✓ Set appropriate chunk size (start with 250)
683
- // ✓ Process items and release references quickly
684
-
685
- exports.read = function (parameters, stepExecution) {
686
- // Good: Read one item at a time
687
- return csvReader.readNext();
688
- };
689
-
690
- exports.afterStep = function (success, parameters, stepExecution) {
691
- // Critical: Clean up resources
692
- if (csvReader) csvReader.close();
693
- if (xmlReader) xmlReader.close();
694
- if (iterator) iterator.close();
695
- };
696
- ```
697
-
698
- #### 2. Transaction Timeout Prevention
699
-
700
- ```javascript
701
- // Prevent long-running transactions
702
- exports.beforeChunk = function (parameters, stepExecution) {
703
- Transaction.begin();
704
- // Keep transaction scope limited to single chunk
705
- };
706
-
707
- exports.afterChunk = function (parameters, stepExecution) {
708
- Transaction.commit();
709
- // Transaction released - prevents long-running locks
710
- };
711
- ```
712
-
713
- #### 3. Effective Error Handling
714
-
715
- ```javascript
716
- exports.process = function (item, parameters, stepExecution) {
717
- var logger = stepExecution.log;
718
-
719
- try {
720
- return processItem(item);
721
- } catch (e) {
722
- // Log detailed error for debugging
723
- logger.error('Failed to process item {0}: {1}',
724
- item.id, e.message + '\n' + e.stack);
725
-
726
- // Return error result instead of throwing
727
- return {
728
- id: item.id,
729
- status: 'ERROR',
730
- message: e.message
731
- };
732
- }
733
- };
734
- ```
735
-
736
- ### Diagnostic Tools and Techniques
737
-
738
- #### 1. Comprehensive Logging Strategy
739
-
740
- ```javascript
741
- exports.beforeStep = function (parameters, stepExecution) {
742
- var logger = Logger.getLogger('jobs', 'ReportingJob');
743
-
744
- logger.info('Job started with parameters: {0}', JSON.stringify(parameters));
745
- // Memory monitoring not available in SFCC environment
746
- };
747
-
748
- exports.afterChunk = function (parameters, stepExecution) {
749
- var logger = Logger.getLogger('jobs', 'ReportingJob');
750
- // Memory monitoring not available in SFCC environment
751
- logger.info('Chunk completed successfully');
752
- };
753
- ```
754
-
755
- #### 2. Performance Monitoring
756
-
757
- ```javascript
758
- var startTime = Date.now();
759
- var itemCount = 0;
760
-
761
- exports.process = function (item, parameters, stepExecution) {
762
- itemCount++;
763
-
764
- // Log performance metrics periodically
765
- if (itemCount % 1000 === 0) {
766
- var elapsed = Date.now() - startTime;
767
- var rate = itemCount / (elapsed / 1000);
768
- Logger.getLogger('jobs', 'ReportingJob');
769
- .info('Processed {0} items at {1} items/second', itemCount, rate.toFixed(2));
770
- }
771
-
772
- return processItem(item);
773
- };
774
- ```
775
-
776
- ## Deployment and Configuration Best Practices
777
-
778
- ### Steptypes.json Configuration File
779
-
780
- #### File Placement and Structure
781
-
782
- Custom step types are registered in the SFCC system using a `steptypes.json` file. This file defines the step types, their parameters, and status codes for your cartridge.
783
-
784
- **Critical Requirements:**
785
- - File must be named **exactly** `steptypes.json`
786
- - Must be placed in the **root folder** of your custom cartridge (not inside the cartridge subfolder)
787
- - Only **one** `steptypes.json` file per cartridge is allowed
788
- - Cannot coexist with `steptypes.xml` - choose one format only
789
-
790
- **Correct File Structure:**
791
- ```
792
- my_cartridge/
793
- ├── cartridge/
794
- │ ├── controllers/
795
- │ ├── scripts/
796
- │ ├── (other cartridge folders)
797
- │ └── my_cartridge.properties
798
- └── steptypes.json ← Must be here, not inside cartridge/
799
- ```
800
-
801
- #### Root Structure
802
-
803
- All steptypes.json files must follow this root structure:
804
-
805
- ```json
806
- {
807
- "step-types": {
808
- "script-module-step": [],
809
- "chunk-script-module-step": [],
810
- "pipeline-step": []
811
- }
812
- }
813
- ```
814
-
815
- **Note**: You must define at least one step type category, but all three are optional as long as one is present.
816
-
817
- ### Task-Oriented Job Configuration (script-module-step)
818
-
819
- #### Complete Attribute Reference
820
-
821
- ```json
822
- {
823
- "step-types": {
824
- "script-module-step": [
825
- {
826
- "@type-id": "custom.DeactivateProducts",
827
- "@supports-parallel-execution": true,
828
- "@supports-site-context": true,
829
- "@supports-organization-context": false,
830
- "description": "Deactivates all online products in a specified category",
831
- "module": "plugin_examplecartridge/cartridge/scripts/jobs/deactivateProducts.js",
832
- "function": "execute",
833
- "transactional": false,
834
- "timeout-in-seconds": 900,
835
- "parameters": {
836
- "parameter": [
837
- {
838
- "@name": "categoryID",
839
- "@type": "string",
840
- "@required": true,
841
- "description": "ID of the category containing products to deactivate"
842
- },
843
- {
844
- "@name": "dryRun",
845
- "@type": "boolean",
846
- "@required": false,
847
- "description": "If true, only logs what would be deactivated"
848
- }
849
- ]
850
- },
851
- "status-codes": {
852
- "status": [
853
- { "@code": "OK", "description": "Products deactivated successfully" },
854
- { "@code": "ERROR", "description": "An error occurred during processing" }
855
- ]
856
- }
857
- }
858
- ]
859
- }
860
- }
861
- ```
862
-
863
- #### Attribute Details
864
-
865
- | Attribute | Required | Description | Validation Rules |
866
- |-----------|----------|-------------|------------------|
867
- | `@type-id` | ✅ **Required** | Unique identifier for the step type | Must start with `custom.`, max 100 chars, no whitespace, unique across all cartridges |
868
- | `@supports-parallel-execution` | Optional | Enables parallel execution with other steps | `true` or `false` (default: `true`) |
869
- | `@supports-site-context` | Optional | Can be used in site-scoped flows | `true` or `false` (default: `true`) |
870
- | `@supports-organization-context` | Optional | Can be used in organization-scoped flows | `true` or `false` (default: `true`) |
871
- | `description` | Optional | Internal description (not shown in Business Manager) | Max 4000 characters |
872
- | `module` | ✅ **Required** | Path to script module | No leading/trailing whitespace |
873
- | `function` | ✅ **Required** | Function name to execute | No leading/trailing whitespace, defaults to `execute` |
874
- | `transactional` | Optional | Wraps execution in single transaction | `true` or `false` (default: `false`) |
875
- | `timeout-in-seconds` | Optional | Execution timeout limit | Integer > 0, no default |
876
- | `parameters` | Optional | User-configurable parameters | Contains `parameter` array |
877
- | `status-codes` | Optional | Custom status code definitions | Contains `status` array |
878
-
879
- **Important Notes:**
880
- - `@supports-site-context` and `@supports-organization-context` cannot both be `true` or both be `false`
881
- - `@type-id` cannot conflict with system step types like `ExecutePipeline` or `IncludeStepsFromJob`
882
- - Setting `transactional: true` creates one large transaction - avoid for performance reasons
883
-
884
- ### Chunk-Oriented Job Configuration (chunk-script-module-step)
885
-
886
- #### Complete Attribute Reference
887
-
888
- ```json
889
- {
890
- "step-types": {
891
- "chunk-script-module-step": [
892
- {
893
- "@type-id": "custom.BulkPriceUpdate",
894
- "@supports-parallel-execution": false,
895
- "@supports-site-context": true,
896
- "@supports-organization-context": false,
897
- "description": "Updates product prices from CSV file in chunks",
898
- "module": "plugin_examplecartridge/cartridge/scripts/jobs/bulkPriceUpdate.js",
899
- "before-step-function": "beforeStep",
900
- "total-count-function": "getTotalCount",
901
- "before-chunk-function": "beforeChunk",
902
- "read-function": "read",
903
- "process-function": "process",
904
- "write-function": "write",
905
- "after-chunk-function": "afterChunk",
906
- "after-step-function": "afterStep",
907
- "chunk-size": 200,
908
- "transactional": false,
909
- "parameters": {
910
- "parameter": [
911
- {
912
- "@name": "inputFileName",
913
- "@type": "string",
914
- "@required": true,
915
- "description": "Name of CSV file in IMPEX folder"
916
- },
917
- {
918
- "@name": "hasHeader",
919
- "@type": "boolean",
920
- "@required": false,
921
- "description": "Whether CSV file has header row"
922
- }
923
- ]
924
- },
925
- "status-codes": {
926
- "status": [
927
- { "@code": "OK", "description": "Processing completed successfully" },
928
- { "@code": "ERROR", "description": "An error occurred during processing" }
929
- ]
930
- }
931
- }
932
- ]
933
- }
934
- }
935
- ```
936
-
937
- #### Chunk-Specific Attributes
938
-
939
- | Attribute | Required | Description | Default Function |
940
- |-----------|----------|-------------|------------------|
941
- | `before-step-function` | Optional | Setup function before processing starts | None |
942
- | `total-count-function` | Optional | Returns total items for progress tracking | None |
943
- | `before-chunk-function` | Optional | Setup before each chunk | None |
944
- | `read-function` | Optional | Reads next item from data source | `read` |
945
- | `process-function` | Optional | Processes individual items | `process` |
946
- | `write-function` | Optional | Writes processed chunk | `write` |
947
- | `after-chunk-function` | Optional | Cleanup after each chunk | None |
948
- | `after-step-function` | Optional | Final cleanup after all chunks | None |
949
- | `chunk-size` | ✅ **Required** | Number of items per chunk | Must be numeric > 0 |
950
-
951
- ### Parameter Configuration
952
-
953
- Parameters allow Business Manager users to configure job execution. Each parameter supports these attributes:
954
-
955
- ```json
956
- {
957
- "@name": "parameterName",
958
- "@type": "string|boolean|number|password",
959
- "@required": true,
960
- "description": "User-friendly description shown in Business Manager"
961
- }
962
- ```
963
-
964
- #### Supported Parameter Types
965
- - `string`: Text input
966
- - `boolean`: Checkbox (true/false)
967
- - `number`: Numeric input
968
- - `password`: Masked text input (use for sensitive data)
969
-
970
- ### Status Code Configuration
971
-
972
- Custom status codes enable sophisticated flow control in Business Manager:
973
-
974
- ```json
975
- {
976
- "status-codes": {
977
- "status": [
978
- { "@code": "OK", "description": "Standard success" },
979
- { "@code": "CUSTOM_STATUS", "description": "Custom workflow trigger" },
980
- { "@code": "ERROR", "description": "Processing failed" }
981
- ]
982
- }
983
- }
984
- ```
985
-
986
- **Flow Control Usage:**
987
- - Use custom status codes to branch job flows
988
- - Configure different follow-up steps based on status
989
- - Enable conditional processing in complex workflows
990
-
991
- ### Pipeline Step Configuration
992
-
993
- For legacy pipeline-based steps (not recommended for new development):
994
-
995
- ```json
996
- {
997
- "step-types": {
998
- "pipeline-step": [
999
- {
1000
- "@type-id": "custom.LegacyPipelineStep",
1001
- "@supports-site-context": true,
1002
- "@supports-organization-context": false,
1003
- "description": "Legacy pipeline step",
1004
- "pipeline": "cartridge/pipelines/jobs/LegacyPipeline.xml",
1005
- "start-node": "Start"
1006
- }
1007
- ]
1008
- }
1009
- }
1010
- ```
1011
-
1012
- **Note**: Pipeline steps are legacy - use script-module-step or chunk-script-module-step for new development.
1013
-
1014
- ### Resource Management
1015
-
1016
- #### 1. Proper Resource Locking
1017
-
1018
- Configure resource locks in Business Manager to prevent conflicts:
1019
- - Lock catalogs when modifying products
1020
- - Lock inventory lists during inventory updates
1021
- - Lock price books during price modifications
1022
-
1023
- #### 2. Optimal Scheduling Strategies
1024
-
1025
- ```javascript
1026
- // Stagger job start times to distribute load
1027
- // Good: 01:17, 02:23, 03:08
1028
- // Bad: 01:00, 02:00, 03:00 (creates load spikes)
1029
-
1030
- // Keep job load factor below 0.20
1031
- // Monitor total job execution time per day
1032
- ```
1033
-
1034
- #### 3. Environment-Specific Considerations
1035
-
1036
- ```javascript
1037
- exports.beforeStep = function (parameters, stepExecution) {
1038
- var logger = Logger.getLogger('jobs', 'ReportingJob');
1039
- var System = require('dw/system/System');
1040
-
1041
- if (System.getInstanceType() === System.DEVELOPMENT_SYSTEM) {
1042
- logger.debug('Running in development mode');
1043
- // Enable verbose logging for development
1044
- } else if (System.getInstanceType() === System.STAGING_SYSTEM) {
1045
- logger.debug('Running in staging mode');
1046
- // Moderate logging for staging
1047
- } else if (System.getInstanceType() === System.PRODUCTION_SYSTEM) {
1048
- logger.info('Running in production mode');
1049
- // Minimal logging for performance
1050
- }
1051
- };
1052
- ```
1053
-
1054
- ## Advanced Patterns and Integration
1055
-
1056
- ### External Service Integration
1057
-
1058
- ```javascript
1059
- var ServiceRegistry = require('dw/svc/ServiceRegistry');
1060
-
1061
- exports.process = function (item, parameters, stepExecution) {
1062
- var logger = Logger.getLogger('jobs', 'ReportingJob');
1063
-
1064
- try {
1065
- var service = ServiceRegistry.get('MyExternalService');
1066
- var result = service.call({
1067
- productID: item.productID,
1068
- action: 'update'
1069
- });
1070
-
1071
- if (result.isOk()) {
1072
- return {
1073
- productID: item.productID,
1074
- status: 'SUCCESS',
1075
- externalID: result.object.id
1076
- };
1077
- } else {
1078
- logger.warn('Service call failed for {0}: {1}',
1079
- item.productID, result.getErrorMessage());
1080
- return {
1081
- productID: item.productID,
1082
- status: 'ERROR',
1083
- message: result.getErrorMessage()
1084
- };
1085
- }
1086
- } catch (e) {
1087
- logger.error('Service error for {0}: {1}', item.productID, e.message);
1088
- return {
1089
- productID: item.productID,
1090
- status: 'ERROR',
1091
- message: e.message
1092
- };
1093
- }
1094
- };
1095
- ```
1096
-
1097
- ### Idempotent Job Design
1098
-
1099
- ```javascript
1100
- // Design jobs to be safely re-runnable
1101
- exports.beforeStep = function (parameters, stepExecution) {
1102
- var logger = Logger.getLogger('jobs', 'ReportingJob');
1103
-
1104
- // Check for previous successful run
1105
- var statusFile = new File(File.IMPEX + 'status/' + parameters.jobRunID + '.complete');
1106
- if (statusFile.exists()) {
1107
- logger.info('Job already completed successfully. Skipping.');
1108
- return new Status(Status.OK, 'ALREADY_COMPLETED');
1109
- }
1110
-
1111
- // Create processing flag
1112
- var processingFile = new File(File.IMPEX + 'status/' + parameters.jobRunID + '.processing');
1113
- var writer = new FileWriter(processingFile);
1114
- writer.writeLine(new Date().toISOString());
1115
- writer.close();
1116
- };
1117
-
1118
- exports.afterStep = function (success, parameters, stepExecution) {
1119
- if (success) {
1120
- // Mark job as completed
1121
- var statusFile = new File(File.IMPEX + 'status/' + parameters.jobRunID + '.complete');
1122
- var writer = new FileWriter(statusFile);
1123
- writer.writeLine(new Date().toISOString());
1124
- writer.close();
1125
-
1126
- // Clean up processing flag
1127
- var processingFile = new File(File.IMPEX + 'status/' + parameters.jobRunID + '.processing');
1128
- processingFile.remove();
1129
- }
1130
- };
1131
- ```
1132
-
1133
- ## Quick Reference
1134
-
1135
- ### Choosing the Right Job Model
1136
-
1137
- **Use Task-Oriented When:**
1138
- - Processing single files or making single API calls
1139
- - Quick database updates affecting known small datasets
1140
- - Simple configuration or setup tasks
1141
- - Progress tracking is not important
1142
-
1143
- **Use Chunk-Oriented When:**
1144
- - Processing large datasets (>1000 items)
1145
- - Iterating over products, orders, customers, or file rows
1146
- - Progress monitoring is required
1147
- - Failure resilience is critical
1148
- - Transaction control is important
1149
-
1150
- ### Essential Performance Guidelines
1151
-
1152
- 1. **Always use streaming APIs** for file processing
1153
- 2. **Close all SeekableIterators** to prevent memory leaks
1154
- 3. **Keep chunk sizes between 100-500** for most operations
1155
- 4. **Commit transactions per chunk** for resilience
1156
- 5. **Avoid accumulating objects** in global scope
1157
- 6. **Log appropriately** - info for milestones, debug for development only
1158
- 7. **Validate inputs** and handle errors gracefully
1159
- 8. **Design for idempotency** to enable safe re-runs
1160
-
1161
- ### Common Troubleshooting Steps
1162
-
1163
- 1. **OutOfMemoryError**: Check streaming APIs, iterator closure, chunk size
1164
- 2. **ScriptingTimeoutError**: Consider chunk-oriented model, review algorithm efficiency
1165
- 3. **Transaction timeouts**: Reduce chunk size, commit per chunk
1166
- 4. **Job hangs**: Check resource locks, review for infinite loops
1167
- 5. **Poor performance**: Use Code Profiler, review API usage patterns
1168
- 6. **Job Not Visible in Business Manager**: If custom jobs don't appear in Administration > Operations > Jobs after deployment:
1169
- - **Check Available Versions**: Use MCP `get_code_versions` tool to see all code versions on the instance
1170
- - **Activate Different Version**: Use MCP `activate_code_version` tool to switch code versions
1171
- - **Alternative Manual Method**: Switch code versions in Business Manager (`Administration > Site Development > Code Deployment > Activate`)
1172
-
1173
- Remember: **The Job Framework is critical infrastructure**. Always prioritize stability, performance, and maintainability over quick implementation.