@salesforce/b2c-cli 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/bin/dev.js +8 -8
  2. package/bin/run.js +5 -7
  3. package/content/guidance/b2c/b2c-business-manager-extensions/SKILL.md +361 -0
  4. package/content/guidance/b2c/b2c-business-manager-extensions/references/EXTENSIONS-XML.md +458 -0
  5. package/content/guidance/b2c/b2c-controllers/SKILL.md +301 -0
  6. package/content/guidance/b2c/b2c-controllers/references/CLASSIC-PATTERNS.md +335 -0
  7. package/content/guidance/b2c/b2c-controllers/references/SFRA-PATTERNS.md +400 -0
  8. package/content/guidance/b2c/b2c-custom-api-development/SKILL.md +281 -0
  9. package/content/guidance/b2c/b2c-custom-api-development/references/CONTRACT.md +142 -0
  10. package/content/guidance/b2c/b2c-custom-api-development/references/IMPLEMENTATION.md +153 -0
  11. package/content/guidance/b2c/b2c-custom-api-development/references/TESTING.md +118 -0
  12. package/content/guidance/b2c/b2c-custom-caches/SKILL.md +279 -0
  13. package/content/guidance/b2c/b2c-custom-job-steps/SKILL.md +520 -0
  14. package/content/guidance/b2c/b2c-custom-job-steps/references/CHUNK-ORIENTED.md +377 -0
  15. package/content/guidance/b2c/b2c-custom-job-steps/references/JOBS-XML.md +212 -0
  16. package/content/guidance/b2c/b2c-custom-job-steps/references/STEPTYPES-JSON.md +373 -0
  17. package/content/guidance/b2c/b2c-custom-job-steps/references/TASK-ORIENTED.md +344 -0
  18. package/content/guidance/b2c/b2c-custom-objects/SKILL.md +327 -0
  19. package/content/guidance/b2c/b2c-custom-objects/references/OCAPI-SEARCH.md +298 -0
  20. package/content/guidance/b2c/b2c-forms/SKILL.md +242 -0
  21. package/content/guidance/b2c/b2c-forms/references/FORM-XML.md +409 -0
  22. package/content/guidance/b2c/b2c-hooks/SKILL.md +500 -0
  23. package/content/guidance/b2c/b2c-hooks/references/OCAPI-SCAPI-HOOKS.md +403 -0
  24. package/content/guidance/b2c/b2c-hooks/references/ORDER-HOOK-LIFECYCLE.md +169 -0
  25. package/content/guidance/b2c/b2c-hooks/references/SYSTEM-HOOKS.md +433 -0
  26. package/content/guidance/b2c/b2c-isml/SKILL.md +320 -0
  27. package/content/guidance/b2c/b2c-isml/references/EXPRESSIONS.md +366 -0
  28. package/content/guidance/b2c/b2c-isml/references/TAGS.md +443 -0
  29. package/content/guidance/b2c/b2c-localization/SKILL.md +344 -0
  30. package/content/guidance/b2c/b2c-localization/references/PATTERNS.md +407 -0
  31. package/content/guidance/b2c/b2c-logging/SKILL.md +352 -0
  32. package/content/guidance/b2c/b2c-logging/references/LOG-FILES.md +282 -0
  33. package/content/guidance/b2c/b2c-metadata/SKILL.md +406 -0
  34. package/content/guidance/b2c/b2c-metadata/references/SYSTEM-OBJECTS.md +320 -0
  35. package/content/guidance/b2c/b2c-metadata/references/XML-EXAMPLES.md +366 -0
  36. package/content/guidance/b2c/b2c-onboarding/SKILL.md +154 -0
  37. package/content/guidance/b2c/b2c-ordering/SKILL.md +391 -0
  38. package/content/guidance/b2c/b2c-page-designer/SKILL.md +410 -0
  39. package/content/guidance/b2c/b2c-page-designer/references/ATTRIBUTE-TYPES.md +436 -0
  40. package/content/guidance/b2c/b2c-page-designer/references/META-DEFINITIONS.md +340 -0
  41. package/content/guidance/b2c/b2c-querying-data/SKILL.md +289 -0
  42. package/content/guidance/b2c/b2c-querying-data/references/PERFORMANCE-APIS.md +74 -0
  43. package/content/guidance/b2c/b2c-scapi-admin/SKILL.md +53 -0
  44. package/content/guidance/b2c/b2c-scapi-admin/references/CLIENT-EXAMPLES.md +440 -0
  45. package/content/guidance/b2c/b2c-scapi-admin/references/INTEGRATION-PATTERNS.md +518 -0
  46. package/content/guidance/b2c/b2c-scapi-admin/references/OAUTH-SCOPES.md +337 -0
  47. package/content/guidance/b2c/b2c-scapi-shopper/SKILL.md +56 -0
  48. package/content/guidance/b2c/b2c-scapi-shopper/references/CHECKOUT-FLOW.md +466 -0
  49. package/content/guidance/b2c/b2c-scapi-shopper/references/CLIENT-EXAMPLES.md +351 -0
  50. package/content/guidance/b2c/b2c-scapi-shopper/references/COMMON-PATTERNS.md +390 -0
  51. package/content/guidance/b2c/b2c-scapi-shopper/references/SCOPES.md +290 -0
  52. package/content/guidance/b2c/b2c-slas-auth-patterns/SKILL.md +420 -0
  53. package/content/guidance/b2c/b2c-slas-auth-patterns/references/PASSKEYS.md +126 -0
  54. package/content/guidance/b2c/b2c-slas-auth-patterns/references/SESSION-BRIDGE.md +267 -0
  55. package/content/guidance/b2c/b2c-slas-auth-patterns/references/TOKEN-LIFECYCLE.md +367 -0
  56. package/content/guidance/b2c/b2c-webservices/SKILL.md +318 -0
  57. package/content/guidance/b2c/b2c-webservices/references/FTP-SERVICES.md +524 -0
  58. package/content/guidance/b2c/b2c-webservices/references/HTTP-SERVICES.md +578 -0
  59. package/content/guidance/b2c/b2c-webservices/references/SERVICES-XML.md +351 -0
  60. package/content/guidance/b2c/b2c-webservices/references/SOAP-SERVICES.md +587 -0
  61. package/content/guidance/b2c-cli/b2c-am/SKILL.md +277 -0
  62. package/content/guidance/b2c-cli/b2c-bm-users-roles/SKILL.md +210 -0
  63. package/content/guidance/b2c-cli/b2c-cap/SKILL.md +131 -0
  64. package/content/guidance/b2c-cli/b2c-cip/SKILL.md +116 -0
  65. package/content/guidance/b2c-cli/b2c-cip/references/KNOWN_TABLES.md +105 -0
  66. package/content/guidance/b2c-cli/b2c-cip/references/SALES_ANALYSIS.md +50 -0
  67. package/content/guidance/b2c-cli/b2c-cip/references/STARTER_QUERIES.md +147 -0
  68. package/content/guidance/b2c-cli/b2c-code/SKILL.md +146 -0
  69. package/content/guidance/b2c-cli/b2c-config/SKILL.md +462 -0
  70. package/content/guidance/b2c-cli/b2c-content/SKILL.md +176 -0
  71. package/content/guidance/b2c-cli/b2c-debug/SKILL.md +138 -0
  72. package/content/guidance/b2c-cli/b2c-docs/SKILL.md +301 -0
  73. package/content/guidance/b2c-cli/b2c-ecdn/SKILL.md +135 -0
  74. package/content/guidance/b2c-cli/b2c-ecdn/references/ADVANCED.md +97 -0
  75. package/content/guidance/b2c-cli/b2c-ecdn/references/SECURITY.md +75 -0
  76. package/content/guidance/b2c-cli/b2c-import-set-migrations/SKILL.md +265 -0
  77. package/content/guidance/b2c-cli/b2c-job/SKILL.md +64 -0
  78. package/content/guidance/b2c-cli/b2c-job/references/EXPORT.md +121 -0
  79. package/content/guidance/b2c-cli/b2c-job/references/IMPORT.md +55 -0
  80. package/content/guidance/b2c-cli/b2c-job/references/RUN-AND-MONITOR.md +119 -0
  81. package/content/guidance/b2c-cli/b2c-logs/SKILL.md +249 -0
  82. package/content/guidance/b2c-cli/b2c-metrics/SKILL.md +315 -0
  83. package/content/guidance/b2c-cli/b2c-mrt/SKILL.md +207 -0
  84. package/content/guidance/b2c-cli/b2c-mrt/references/BUNDLE-COMMANDS.md +203 -0
  85. package/content/guidance/b2c-cli/b2c-mrt/references/ENVIRONMENT-COMMANDS.md +218 -0
  86. package/content/guidance/b2c-cli/b2c-mrt/references/PROJECT-COMMANDS.md +154 -0
  87. package/content/guidance/b2c-cli/b2c-sandbox/SKILL.md +112 -0
  88. package/content/guidance/b2c-cli/b2c-scapi-custom/SKILL.md +126 -0
  89. package/content/guidance/b2c-cli/b2c-scapi-schemas/SKILL.md +66 -0
  90. package/content/guidance/b2c-cli/b2c-scapi-schemas/references/CLI-EXAMPLES.md +108 -0
  91. package/content/guidance/b2c-cli/b2c-site-import-export/SKILL.md +57 -0
  92. package/content/guidance/b2c-cli/b2c-site-import-export/references/IMPORT-OPTIONS.md +118 -0
  93. package/content/guidance/b2c-cli/b2c-site-import-export/references/METADATA-XML.md +381 -0
  94. package/content/guidance/b2c-cli/b2c-site-import-export/references/WORKFLOWS.md +182 -0
  95. package/content/guidance/b2c-cli/b2c-sites/SKILL.md +112 -0
  96. package/content/guidance/b2c-cli/b2c-slas/SKILL.md +182 -0
  97. package/content/guidance/b2c-cli/b2c-webdav/SKILL.md +186 -0
  98. package/content/guidance/b2c-ops/b2c-checkout-triage/SKILL.md +68 -0
  99. package/content/guidance/b2c-ops/b2c-job-health/SKILL.md +75 -0
  100. package/content/guidance/b2c-ops/b2c-job-health/references/job-logs.md +21 -0
  101. package/content/guidance/b2c-ops/b2c-order-failure-triage/SKILL.md +66 -0
  102. package/content/guidance/b2c-ops/b2c-order-failure-triage/references/order-evidence.md +87 -0
  103. package/content/guidance/b2c-ops/b2c-production-triage/SKILL.md +87 -0
  104. package/content/guidance/b2c-ops/b2c-production-triage/references/escalation.md +57 -0
  105. package/content/guidance/index.json +1949 -0
  106. package/content/guidance/storefront-next/sfnext-accessibility/SKILL.md +103 -0
  107. package/content/guidance/storefront-next/sfnext-accessibility/references/checklist.md +64 -0
  108. package/content/guidance/storefront-next/sfnext-analytics-consent/SKILL.md +91 -0
  109. package/content/guidance/storefront-next/sfnext-analytics-consent/references/CUSTOM-ADAPTER.md +49 -0
  110. package/content/guidance/storefront-next/sfnext-authentication/SKILL.md +127 -0
  111. package/content/guidance/storefront-next/sfnext-authentication/references/COOKIES.md +39 -0
  112. package/content/guidance/storefront-next/sfnext-authentication/references/LOGIN-FLOWS.md +59 -0
  113. package/content/guidance/storefront-next/sfnext-commerce-features/SKILL.md +67 -0
  114. package/content/guidance/storefront-next/sfnext-commerce-features/references/FEATURE-PREREQUISITES.md +37 -0
  115. package/content/guidance/storefront-next/sfnext-components/SKILL.md +153 -0
  116. package/content/guidance/storefront-next/sfnext-components/references/COMPONENT-AUTHORING.md +118 -0
  117. package/content/guidance/storefront-next/sfnext-components/references/SHAPE-TOKENS.md +51 -0
  118. package/content/guidance/storefront-next/sfnext-components/references/STORYBOOK.md +54 -0
  119. package/content/guidance/storefront-next/sfnext-components/references/TOKEN-SYSTEM.md +53 -0
  120. package/content/guidance/storefront-next/sfnext-components/references/TROUBLESHOOTING.md +19 -0
  121. package/content/guidance/storefront-next/sfnext-configuration/SKILL.md +163 -0
  122. package/content/guidance/storefront-next/sfnext-configuration/references/ENV-VARIABLES.md +55 -0
  123. package/content/guidance/storefront-next/sfnext-configuration/references/MULTI-SITE-URLS.md +137 -0
  124. package/content/guidance/storefront-next/sfnext-data-fetching/SKILL.md +140 -0
  125. package/content/guidance/storefront-next/sfnext-data-fetching/references/ACTIONS.md +53 -0
  126. package/content/guidance/storefront-next/sfnext-data-fetching/references/API-CLIENTS.md +34 -0
  127. package/content/guidance/storefront-next/sfnext-data-fetching/references/LOADERS.md +73 -0
  128. package/content/guidance/storefront-next/sfnext-data-fetching/references/SCAPI-FETCHER.md +39 -0
  129. package/content/guidance/storefront-next/sfnext-deployment/SKILL.md +127 -0
  130. package/content/guidance/storefront-next/sfnext-deployment/references/MRT-DEPLOYMENT.md +59 -0
  131. package/content/guidance/storefront-next/sfnext-extensions/SKILL.md +118 -0
  132. package/content/guidance/storefront-next/sfnext-extensions/references/ACTION-HOOKS.md +57 -0
  133. package/content/guidance/storefront-next/sfnext-extensions/references/BASE-AUDIT.md +68 -0
  134. package/content/guidance/storefront-next/sfnext-extensions/references/CLI-AND-INSTALL.md +58 -0
  135. package/content/guidance/storefront-next/sfnext-extensions/references/EXTENSION-EXAMPLES.md +79 -0
  136. package/content/guidance/storefront-next/sfnext-hybrid-storefronts/SKILL.md +93 -0
  137. package/content/guidance/storefront-next/sfnext-hybrid-storefronts/references/HYBRID-PROXY-CONFIG.md +86 -0
  138. package/content/guidance/storefront-next/sfnext-i18n/SKILL.md +152 -0
  139. package/content/guidance/storefront-next/sfnext-i18n/references/locale-config.md +35 -0
  140. package/content/guidance/storefront-next/sfnext-overview/SKILL.md +101 -0
  141. package/content/guidance/storefront-next/sfnext-page-designer/SKILL.md +202 -0
  142. package/content/guidance/storefront-next/sfnext-page-designer/references/BUSINESS-MANAGER.md +46 -0
  143. package/content/guidance/storefront-next/sfnext-page-designer/references/COMPONENT-REGISTRY.md +111 -0
  144. package/content/guidance/storefront-next/sfnext-page-designer/references/DECORATOR-PATTERNS.md +168 -0
  145. package/content/guidance/storefront-next/sfnext-page-designer/references/REVIEW-CHECKLIST.md +83 -0
  146. package/content/guidance/storefront-next/sfnext-page-designer/references/TROUBLESHOOTING.md +35 -0
  147. package/content/guidance/storefront-next/sfnext-performance/SKILL.md +102 -0
  148. package/content/guidance/storefront-next/sfnext-performance/references/PERFORMANCE-REVIEW-CHECKLIST.md +85 -0
  149. package/content/guidance/storefront-next/sfnext-performance/references/SUSPENSE-AND-STREAMING.md +58 -0
  150. package/content/guidance/storefront-next/sfnext-project-setup/SKILL.md +147 -0
  151. package/content/guidance/storefront-next/sfnext-project-setup/references/PROJECT-STRUCTURE.md +61 -0
  152. package/content/guidance/storefront-next/sfnext-project-setup/references/SCRIPTS.md +47 -0
  153. package/content/guidance/storefront-next/sfnext-project-setup/references/SFNEXT-CLI.md +63 -0
  154. package/content/guidance/storefront-next/sfnext-quality-gates/SKILL.md +70 -0
  155. package/content/guidance/storefront-next/sfnext-quality-gates/references/lint-and-budgets.md +39 -0
  156. package/content/guidance/storefront-next/sfnext-revalidation/SKILL.md +121 -0
  157. package/content/guidance/storefront-next/sfnext-revalidation/references/POLICIES-AND-TAGS.md +55 -0
  158. package/content/guidance/storefront-next/sfnext-routing/SKILL.md +123 -0
  159. package/content/guidance/storefront-next/sfnext-routing/references/ROUTE-CONVENTIONS.md +65 -0
  160. package/content/guidance/storefront-next/sfnext-routing/references/URLS-AND-SEO-ROUTES.md +22 -0
  161. package/content/guidance/storefront-next/sfnext-scapi/SKILL.md +126 -0
  162. package/content/guidance/storefront-next/sfnext-scapi/references/WORKED-EXAMPLE.md +39 -0
  163. package/content/guidance/storefront-next/sfnext-security/SKILL.md +129 -0
  164. package/content/guidance/storefront-next/sfnext-security/references/COOKIE-DOMAIN.md +39 -0
  165. package/content/guidance/storefront-next/sfnext-security/references/TURNSTILE.md +43 -0
  166. package/content/guidance/storefront-next/sfnext-seo/SKILL.md +95 -0
  167. package/content/guidance/storefront-next/sfnext-seo/references/MULTI-DOMAIN-BASE-PATH.md +17 -0
  168. package/content/guidance/storefront-next/sfnext-seo/references/SEO-ROUTES.md +31 -0
  169. package/content/guidance/storefront-next/sfnext-state-management/SKILL.md +114 -0
  170. package/content/guidance/storefront-next/sfnext-state-management/references/PATTERNS.md +45 -0
  171. package/content/guidance/storefront-next/sfnext-testing/SKILL.md +151 -0
  172. package/content/guidance/storefront-next/sfnext-testing/references/E2E.md +38 -0
  173. package/content/guidance/storefront-next/sfnext-testing/references/STORYBOOK-PATTERNS.md +97 -0
  174. package/content/guidance/storefront-next/sfnext-testing/references/UNIT-AND-ROUTE-TESTS.md +60 -0
  175. package/content/guidance/storefront-next/sfnext-theming/SKILL.md +104 -0
  176. package/content/guidance/storefront-next/sfnext-theming/references/REBRAND-CHECKLIST.md +29 -0
  177. package/dist/commands/cap/install.d.ts +1 -0
  178. package/dist/commands/cap/list.d.ts +1 -0
  179. package/dist/commands/cap/pull.d.ts +1 -0
  180. package/dist/commands/cap/tasks.d.ts +1 -0
  181. package/dist/commands/cap/uninstall.d.ts +1 -0
  182. package/dist/commands/cip/describe.d.ts +1 -0
  183. package/dist/commands/cip/query.d.ts +1 -0
  184. package/dist/commands/cip/report/bot-traffic-share.d.ts +1 -0
  185. package/dist/commands/cip/report/checkout-funnel-dropoff.d.ts +1 -0
  186. package/dist/commands/cip/report/controller-error-rate-trend.d.ts +1 -0
  187. package/dist/commands/cip/report/controller-health-scorecard.d.ts +1 -0
  188. package/dist/commands/cip/report/customer-registration-trends.d.ts +1 -0
  189. package/dist/commands/cip/report/discount-depth-breakdown.d.ts +1 -0
  190. package/dist/commands/cip/report/inventory-stockout-by-location.d.ts +1 -0
  191. package/dist/commands/cip/report/new-vs-returning-buyer-revenue.d.ts +1 -0
  192. package/dist/commands/cip/report/ocapi-client-usage.d.ts +1 -0
  193. package/dist/commands/cip/report/ocapi-requests.d.ts +1 -0
  194. package/dist/commands/cip/report/payment-method-performance.d.ts +1 -0
  195. package/dist/commands/cip/report/product-co-purchase-analysis.d.ts +1 -0
  196. package/dist/commands/cip/report/promotion-discount-analysis.d.ts +1 -0
  197. package/dist/commands/cip/report/promotion-roi-leaderboard.d.ts +1 -0
  198. package/dist/commands/cip/report/recommender-effectiveness.d.ts +1 -0
  199. package/dist/commands/cip/report/remote-include-performance.d.ts +1 -0
  200. package/dist/commands/cip/report/revenue-by-channel.d.ts +1 -0
  201. package/dist/commands/cip/report/sales-analytics.d.ts +1 -0
  202. package/dist/commands/cip/report/sales-summary.d.ts +1 -0
  203. package/dist/commands/cip/report/scapi-cache-hit-ratio.d.ts +1 -0
  204. package/dist/commands/cip/report/scapi-error-rate-by-status.d.ts +1 -0
  205. package/dist/commands/cip/report/scapi-latency-distribution.d.ts +1 -0
  206. package/dist/commands/cip/report/scapi-traffic-latency.d.ts +1 -0
  207. package/dist/commands/cip/report/search-query-performance.d.ts +1 -0
  208. package/dist/commands/cip/report/top-referrers.d.ts +1 -0
  209. package/dist/commands/cip/report/top-selling-products.d.ts +1 -0
  210. package/dist/commands/cip/report/zero-result-searches.d.ts +1 -0
  211. package/dist/commands/cip/tables.d.ts +1 -0
  212. package/dist/commands/code/activate.d.ts +1 -0
  213. package/dist/commands/code/delete.d.ts +1 -0
  214. package/dist/commands/code/deploy.d.ts +1 -0
  215. package/dist/commands/code/download.d.ts +1 -0
  216. package/dist/commands/code/watch.d.ts +1 -0
  217. package/dist/commands/commands/search.d.ts +35 -0
  218. package/dist/commands/commands/search.js +85 -0
  219. package/dist/commands/commands/search.js.map +1 -0
  220. package/dist/commands/content/export.d.ts +1 -0
  221. package/dist/commands/content/list.d.ts +1 -0
  222. package/dist/commands/content/validate.d.ts +1 -0
  223. package/dist/commands/debug/cli.d.ts +1 -0
  224. package/dist/commands/debug/index.d.ts +1 -0
  225. package/dist/commands/docs/cache.d.ts +1 -0
  226. package/dist/commands/docs/download.d.ts +1 -0
  227. package/dist/commands/docs/read.d.ts +1 -0
  228. package/dist/commands/docs/schema.d.ts +1 -0
  229. package/dist/commands/docs/search.d.ts +1 -0
  230. package/dist/commands/docs/skill.d.ts +41 -0
  231. package/dist/commands/docs/skill.js +183 -0
  232. package/dist/commands/docs/skill.js.map +1 -0
  233. package/dist/commands/ecdn/cache/purge.d.ts +1 -0
  234. package/dist/commands/ecdn/certificates/add.d.ts +1 -0
  235. package/dist/commands/ecdn/certificates/delete.d.ts +1 -0
  236. package/dist/commands/ecdn/certificates/list.d.ts +1 -0
  237. package/dist/commands/ecdn/certificates/update.d.ts +1 -0
  238. package/dist/commands/ecdn/certificates/validate.d.ts +1 -0
  239. package/dist/commands/ecdn/cipher-suites/get.d.ts +1 -0
  240. package/dist/commands/ecdn/cipher-suites/update.d.ts +1 -0
  241. package/dist/commands/ecdn/firewall/create.d.ts +1 -0
  242. package/dist/commands/ecdn/firewall/delete.d.ts +1 -0
  243. package/dist/commands/ecdn/firewall/get.d.ts +1 -0
  244. package/dist/commands/ecdn/firewall/list.d.ts +1 -0
  245. package/dist/commands/ecdn/firewall/reorder.d.ts +1 -0
  246. package/dist/commands/ecdn/firewall/update.d.ts +1 -0
  247. package/dist/commands/ecdn/logpush/jobs/create.d.ts +1 -0
  248. package/dist/commands/ecdn/logpush/jobs/delete.d.ts +1 -0
  249. package/dist/commands/ecdn/logpush/jobs/get.d.ts +1 -0
  250. package/dist/commands/ecdn/logpush/jobs/list.d.ts +1 -0
  251. package/dist/commands/ecdn/logpush/jobs/update.d.ts +1 -0
  252. package/dist/commands/ecdn/logpush/ownership.d.ts +1 -0
  253. package/dist/commands/ecdn/mrt-rules/create.d.ts +1 -0
  254. package/dist/commands/ecdn/mrt-rules/delete.d.ts +1 -0
  255. package/dist/commands/ecdn/mrt-rules/get.d.ts +1 -0
  256. package/dist/commands/ecdn/mrt-rules/rules/delete.d.ts +1 -0
  257. package/dist/commands/ecdn/mrt-rules/rules/update.d.ts +1 -0
  258. package/dist/commands/ecdn/mrt-rules/update.d.ts +1 -0
  259. package/dist/commands/ecdn/mtls/create.d.ts +1 -0
  260. package/dist/commands/ecdn/mtls/delete.d.ts +1 -0
  261. package/dist/commands/ecdn/mtls/get.d.ts +1 -0
  262. package/dist/commands/ecdn/mtls/issue.d.ts +1 -0
  263. package/dist/commands/ecdn/mtls/list.d.ts +1 -0
  264. package/dist/commands/ecdn/mtls/setup.d.ts +1 -0
  265. package/dist/commands/ecdn/origin-headers/delete.d.ts +1 -0
  266. package/dist/commands/ecdn/origin-headers/get.d.ts +1 -0
  267. package/dist/commands/ecdn/origin-headers/set.d.ts +1 -0
  268. package/dist/commands/ecdn/page-shield/notifications/create.d.ts +1 -0
  269. package/dist/commands/ecdn/page-shield/notifications/delete.d.ts +1 -0
  270. package/dist/commands/ecdn/page-shield/notifications/list.d.ts +1 -0
  271. package/dist/commands/ecdn/page-shield/policies/create.d.ts +1 -0
  272. package/dist/commands/ecdn/page-shield/policies/delete.d.ts +1 -0
  273. package/dist/commands/ecdn/page-shield/policies/get.d.ts +1 -0
  274. package/dist/commands/ecdn/page-shield/policies/list.d.ts +1 -0
  275. package/dist/commands/ecdn/page-shield/policies/update.d.ts +1 -0
  276. package/dist/commands/ecdn/page-shield/scripts/get.d.ts +1 -0
  277. package/dist/commands/ecdn/page-shield/scripts/list.d.ts +1 -0
  278. package/dist/commands/ecdn/rate-limit/create.d.ts +1 -0
  279. package/dist/commands/ecdn/rate-limit/delete.d.ts +1 -0
  280. package/dist/commands/ecdn/rate-limit/get.d.ts +1 -0
  281. package/dist/commands/ecdn/rate-limit/list.d.ts +1 -0
  282. package/dist/commands/ecdn/rate-limit/update.d.ts +1 -0
  283. package/dist/commands/ecdn/security/get.d.ts +1 -0
  284. package/dist/commands/ecdn/security/update.d.ts +1 -0
  285. package/dist/commands/ecdn/speed/get.d.ts +1 -0
  286. package/dist/commands/ecdn/speed/update.d.ts +1 -0
  287. package/dist/commands/ecdn/waf/groups/list.d.ts +1 -0
  288. package/dist/commands/ecdn/waf/groups/update.d.ts +1 -0
  289. package/dist/commands/ecdn/waf/managed-rules/list.d.ts +1 -0
  290. package/dist/commands/ecdn/waf/managed-rules/update.d.ts +1 -0
  291. package/dist/commands/ecdn/waf/migrate.d.ts +1 -0
  292. package/dist/commands/ecdn/waf/owasp/get.d.ts +1 -0
  293. package/dist/commands/ecdn/waf/owasp/update.d.ts +1 -0
  294. package/dist/commands/ecdn/waf/rules/get.d.ts +1 -0
  295. package/dist/commands/ecdn/waf/rules/list.d.ts +1 -0
  296. package/dist/commands/ecdn/waf/rules/update.d.ts +1 -0
  297. package/dist/commands/ecdn/waf/rulesets/list.d.ts +1 -0
  298. package/dist/commands/ecdn/waf/rulesets/update.d.ts +1 -0
  299. package/dist/commands/ecdn/zones/create.d.ts +1 -0
  300. package/dist/commands/ecdn/zones/list.d.ts +1 -0
  301. package/dist/commands/job/execution/delete.d.ts +1 -0
  302. package/dist/commands/job/export.d.ts +1 -0
  303. package/dist/commands/job/import-set.d.ts +1 -0
  304. package/dist/commands/job/import.d.ts +1 -0
  305. package/dist/commands/job/log.d.ts +1 -0
  306. package/dist/commands/job/run.d.ts +1 -0
  307. package/dist/commands/job/search.d.ts +1 -0
  308. package/dist/commands/job/wait.d.ts +1 -0
  309. package/dist/commands/logs/get.d.ts +1 -0
  310. package/dist/commands/logs/list.d.ts +1 -0
  311. package/dist/commands/logs/tail.d.ts +1 -0
  312. package/dist/commands/metrics/controller.d.ts +1 -0
  313. package/dist/commands/metrics/ecdn.d.ts +1 -0
  314. package/dist/commands/metrics/mrt.d.ts +1 -0
  315. package/dist/commands/metrics/ocapi.d.ts +1 -0
  316. package/dist/commands/metrics/overall.d.ts +1 -0
  317. package/dist/commands/metrics/sales.d.ts +1 -0
  318. package/dist/commands/metrics/scapi-hooks.d.ts +1 -0
  319. package/dist/commands/metrics/scapi.d.ts +1 -0
  320. package/dist/commands/metrics/third-party.d.ts +1 -0
  321. package/dist/commands/mrt/bundle/delete.d.ts +1 -0
  322. package/dist/commands/mrt/bundle/deploy.d.ts +1 -0
  323. package/dist/commands/mrt/bundle/download.d.ts +1 -0
  324. package/dist/commands/mrt/bundle/history.d.ts +1 -0
  325. package/dist/commands/mrt/bundle/list.d.ts +1 -0
  326. package/dist/commands/mrt/bundle/save.d.ts +1 -0
  327. package/dist/commands/mrt/bundle/upload-v2.d.ts +1 -0
  328. package/dist/commands/mrt/env/access-control/list.d.ts +1 -0
  329. package/dist/commands/mrt/env/b2c.d.ts +1 -0
  330. package/dist/commands/mrt/env/clone.d.ts +1 -0
  331. package/dist/commands/mrt/env/create.d.ts +1 -0
  332. package/dist/commands/mrt/env/delete.d.ts +1 -0
  333. package/dist/commands/mrt/env/get.d.ts +1 -0
  334. package/dist/commands/mrt/env/invalidate.d.ts +1 -0
  335. package/dist/commands/mrt/env/list.d.ts +1 -0
  336. package/dist/commands/mrt/env/redirect/clone.d.ts +1 -0
  337. package/dist/commands/mrt/env/redirect/create.d.ts +1 -0
  338. package/dist/commands/mrt/env/redirect/delete.d.ts +1 -0
  339. package/dist/commands/mrt/env/redirect/list.d.ts +1 -0
  340. package/dist/commands/mrt/env/update.d.ts +1 -0
  341. package/dist/commands/mrt/env/var/delete.d.ts +1 -0
  342. package/dist/commands/mrt/env/var/list.d.ts +1 -0
  343. package/dist/commands/mrt/env/var/push.d.ts +1 -0
  344. package/dist/commands/mrt/env/var/set.d.ts +1 -0
  345. package/dist/commands/mrt/org/b2c.d.ts +1 -0
  346. package/dist/commands/mrt/org/cert/create.d.ts +1 -0
  347. package/dist/commands/mrt/org/cert/delete.d.ts +1 -0
  348. package/dist/commands/mrt/org/cert/get.d.ts +1 -0
  349. package/dist/commands/mrt/org/cert/list.d.ts +1 -0
  350. package/dist/commands/mrt/org/cert/restart-validation.d.ts +1 -0
  351. package/dist/commands/mrt/org/list.d.ts +1 -0
  352. package/dist/commands/mrt/org/member/add.d.ts +1 -0
  353. package/dist/commands/mrt/org/member/get.d.ts +1 -0
  354. package/dist/commands/mrt/org/member/list.d.ts +1 -0
  355. package/dist/commands/mrt/org/member/remove.d.ts +1 -0
  356. package/dist/commands/mrt/org/member/update.d.ts +1 -0
  357. package/dist/commands/mrt/project/create.d.ts +1 -0
  358. package/dist/commands/mrt/project/delete.d.ts +1 -0
  359. package/dist/commands/mrt/project/get.d.ts +1 -0
  360. package/dist/commands/mrt/project/list.d.ts +1 -0
  361. package/dist/commands/mrt/project/member/add.d.ts +1 -0
  362. package/dist/commands/mrt/project/member/get.d.ts +1 -0
  363. package/dist/commands/mrt/project/member/list.d.ts +1 -0
  364. package/dist/commands/mrt/project/member/remove.d.ts +1 -0
  365. package/dist/commands/mrt/project/member/update.d.ts +1 -0
  366. package/dist/commands/mrt/project/notification/delete.d.ts +1 -0
  367. package/dist/commands/mrt/project/notification/get.d.ts +1 -0
  368. package/dist/commands/mrt/project/update.d.ts +1 -0
  369. package/dist/commands/mrt/save-credentials.d.ts +1 -0
  370. package/dist/commands/mrt/tail-logs.d.ts +1 -0
  371. package/dist/commands/mrt/user/api-key.d.ts +1 -0
  372. package/dist/commands/mrt/user/email-prefs.d.ts +1 -0
  373. package/dist/commands/mrt/user/profile.d.ts +1 -0
  374. package/dist/commands/scaffold/init.js +2 -1
  375. package/dist/commands/scaffold/init.js.map +1 -1
  376. package/dist/commands/scapi/custom/status.d.ts +1 -0
  377. package/dist/commands/scapi/schemas/get.d.ts +1 -0
  378. package/dist/commands/scapi/schemas/list.d.ts +1 -0
  379. package/dist/commands/setup/ide/tsserver-plugin.d.ts +1 -0
  380. package/dist/commands/setup/ide/vscode-types.d.ts +1 -0
  381. package/dist/commands/setup/index.js +4 -3
  382. package/dist/commands/setup/index.js.map +1 -1
  383. package/dist/commands/setup/inspect.d.ts +1 -0
  384. package/dist/commands/setup/inspect.js +17 -2
  385. package/dist/commands/setup/inspect.js.map +1 -1
  386. package/dist/commands/setup/instance/create.d.ts +1 -0
  387. package/dist/commands/setup/instance/list.d.ts +1 -0
  388. package/dist/commands/setup/instance/remove.d.ts +1 -0
  389. package/dist/commands/setup/instance/set-active.d.ts +1 -0
  390. package/dist/commands/setup/openshell.d.ts +1 -0
  391. package/dist/commands/setup/skills.d.ts +1 -0
  392. package/dist/commands/slas/client/create.d.ts +1 -0
  393. package/dist/commands/slas/client/delete.d.ts +1 -0
  394. package/dist/commands/slas/client/get.d.ts +1 -0
  395. package/dist/commands/slas/client/list.d.ts +1 -0
  396. package/dist/commands/slas/client/open.d.ts +1 -0
  397. package/dist/commands/slas/client/update.d.ts +1 -0
  398. package/dist/commands/slas/token.d.ts +1 -0
  399. package/dist/commands/slas/token.js +2 -1
  400. package/dist/commands/slas/token.js.map +1 -1
  401. package/dist/commands/webdav/get.d.ts +1 -0
  402. package/dist/commands/webdav/mkdir.d.ts +2 -0
  403. package/dist/commands/webdav/mkdir.js +5 -3
  404. package/dist/commands/webdav/mkdir.js.map +1 -1
  405. package/dist/commands/webdav/put.d.ts +2 -0
  406. package/dist/commands/webdav/put.js +5 -3
  407. package/dist/commands/webdav/put.js.map +1 -1
  408. package/dist/commands/webdav/rm.d.ts +1 -0
  409. package/dist/help.d.ts +25 -0
  410. package/dist/help.js +96 -0
  411. package/dist/help.js.map +1 -0
  412. package/dist/lib/scaffold/generate-helper.js +3 -2
  413. package/dist/lib/scaffold/generate-helper.js.map +1 -1
  414. package/dist/lib/skills.d.ts +19 -0
  415. package/dist/lib/skills.js +75 -0
  416. package/dist/lib/skills.js.map +1 -0
  417. package/dist/utils/cip/command.d.ts +1 -0
  418. package/dist/utils/ecdn/zone-command.d.ts +1 -0
  419. package/dist/utils/slas/client.d.ts +1 -0
  420. package/oclif.manifest.json +10994 -7653
  421. package/package.json +11 -5
@@ -0,0 +1,377 @@
1
+ # Chunk-Oriented Job Steps Reference
2
+
3
+ Complete patterns for chunk-oriented job steps.
4
+
5
+ ## When to Use
6
+
7
+ - Product exports/imports
8
+ - Order processing
9
+ - Customer data sync
10
+ - Inventory updates
11
+ - Any bulk data operation with countable items
12
+
13
+ **Important:** Chunk-oriented steps **cannot** define custom exit status. They always finish with either **OK** or **ERROR**.
14
+
15
+ ## Basic Structure
16
+
17
+ ```javascript
18
+ 'use strict';
19
+
20
+ var iterator;
21
+
22
+ exports.beforeStep = function (parameters, stepExecution) {
23
+ // Initialize: open files, start queries
24
+ };
25
+
26
+ exports.getTotalCount = function (parameters, stepExecution) {
27
+ return iterator.count;
28
+ };
29
+
30
+ exports.read = function (parameters, stepExecution) {
31
+ if (iterator.hasNext()) {
32
+ return iterator.next();
33
+ }
34
+ };
35
+
36
+ exports.process = function (item, parameters, stepExecution) {
37
+ // Transform item
38
+ return transformedItem;
39
+ };
40
+
41
+ exports.write = function (items, parameters, stepExecution) {
42
+ // Write chunk
43
+ };
44
+
45
+ exports.afterStep = function (success, parameters, stepExecution) {
46
+ // Cleanup
47
+ };
48
+ ```
49
+
50
+ ## Product Export Example
51
+
52
+ ```javascript
53
+ 'use strict';
54
+
55
+ var ProductMgr = require('dw/catalog/ProductMgr');
56
+ var File = require('dw/io/File');
57
+ var FileWriter = require('dw/io/FileWriter');
58
+ var Logger = require('dw/system/Logger');
59
+
60
+ var log = Logger.getLogger('job', 'ProductExport');
61
+ var products;
62
+ var writer;
63
+
64
+ exports.beforeStep = function (parameters, stepExecution) {
65
+ var outputPath = parameters.OutputFile || '/export/products.csv';
66
+ var outputFile = new File(File.IMPEX + outputPath);
67
+
68
+ // Ensure the directory exists. dw.io.File has no parent accessor, so
69
+ // derive the directory from the path and create it directly.
70
+ var dirPath = outputPath.substring(0, outputPath.lastIndexOf('/'));
71
+ new File(File.IMPEX + dirPath).mkdirs();
72
+
73
+ writer = new FileWriter(outputFile, 'UTF-8');
74
+ writer.writeLine('ID,Name,Brand,Price,Online');
75
+
76
+ // Query all products
77
+ products = ProductMgr.queryAllSiteProducts();
78
+
79
+ log.info('Starting product export');
80
+ };
81
+
82
+ exports.getTotalCount = function (parameters, stepExecution) {
83
+ return products.count;
84
+ };
85
+
86
+ exports.read = function (parameters, stepExecution) {
87
+ if (products.hasNext()) {
88
+ return products.next();
89
+ }
90
+ };
91
+
92
+ exports.process = function (product, parameters, stepExecution) {
93
+ // Skip masters (export variants only) or filter as needed
94
+ if (product.master) {
95
+ return; // Filter out
96
+ }
97
+
98
+ // Extract and transform data
99
+ return {
100
+ id: product.ID,
101
+ name: escapeCsv(product.name || ''),
102
+ brand: product.brand ? escapeCsv(product.brand) : '',
103
+ price: product.priceModel.price ? product.priceModel.price.value : 0,
104
+ online: product.online ? 'Y' : 'N'
105
+ };
106
+ };
107
+
108
+ exports.write = function (items, parameters, stepExecution) {
109
+ for (var i = 0; i < items.size(); i++) {
110
+ var item = items.get(i);
111
+ writer.writeLine([
112
+ item.id,
113
+ item.name,
114
+ item.brand,
115
+ item.price,
116
+ item.online
117
+ ].join(','));
118
+ }
119
+ };
120
+
121
+ exports.afterStep = function (success, parameters, stepExecution) {
122
+ if (products) {
123
+ products.close();
124
+ }
125
+ if (writer) {
126
+ writer.close();
127
+ }
128
+
129
+ if (success) {
130
+ log.info('Product export completed successfully');
131
+ } else {
132
+ log.error('Product export failed');
133
+ }
134
+ };
135
+
136
+ function escapeCsv(str) {
137
+ if (str.indexOf(',') >= 0 || str.indexOf('"') >= 0) {
138
+ return '"' + str.replace(/"/g, '""') + '"';
139
+ }
140
+ return str;
141
+ }
142
+ ```
143
+
144
+ ## Order Processing Example
145
+
146
+ ```javascript
147
+ 'use strict';
148
+
149
+ var OrderMgr = require('dw/order/OrderMgr');
150
+ var Transaction = require('dw/system/Transaction');
151
+ var Logger = require('dw/system/Logger');
152
+
153
+ var log = Logger.getLogger('job', 'OrderProcess');
154
+ var orders;
155
+
156
+ exports.beforeStep = function (parameters, stepExecution) {
157
+ var status = parameters.OrderStatus || 'NEW';
158
+
159
+ // Query orders by status
160
+ orders = OrderMgr.searchOrders(
161
+ 'status = {0}',
162
+ 'creationDate asc',
163
+ require('dw/order/Order')[status]
164
+ );
165
+
166
+ log.info('Found ' + orders.count + ' orders to process');
167
+ };
168
+
169
+ exports.getTotalCount = function (parameters, stepExecution) {
170
+ return orders.count;
171
+ };
172
+
173
+ exports.read = function (parameters, stepExecution) {
174
+ if (orders.hasNext()) {
175
+ return orders.next();
176
+ }
177
+ };
178
+
179
+ exports.process = function (order, parameters, stepExecution) {
180
+ // Validate order can be processed
181
+ if (order.paymentStatus.value !== require('dw/order/Order').PAYMENT_STATUS_PAID) {
182
+ log.warn('Skipping order ' + order.orderNo + ' - not paid');
183
+ return; // Filter out
184
+ }
185
+
186
+ return order;
187
+ };
188
+
189
+ exports.write = function (orders, parameters, stepExecution) {
190
+ for (var i = 0; i < orders.size(); i++) {
191
+ var order = orders.get(i);
192
+
193
+ Transaction.wrap(function () {
194
+ // Update order status
195
+ order.setExportStatus(require('dw/order/Order').EXPORT_STATUS_EXPORTED);
196
+ log.info('Processed order: ' + order.orderNo);
197
+ });
198
+ }
199
+ };
200
+
201
+ exports.afterStep = function (success, parameters, stepExecution) {
202
+ if (orders) {
203
+ orders.close();
204
+ }
205
+ };
206
+ ```
207
+
208
+ ## Customer Sync Example
209
+
210
+ ```javascript
211
+ 'use strict';
212
+
213
+ var CustomerMgr = require('dw/customer/CustomerMgr');
214
+ var HTTPClient = require('dw/net/HTTPClient');
215
+ var Transaction = require('dw/system/Transaction');
216
+ var Logger = require('dw/system/Logger');
217
+
218
+ var log = Logger.getLogger('job', 'CustomerSync');
219
+ var customers;
220
+ var apiUrl;
221
+ var apiKey;
222
+
223
+ exports.beforeStep = function (parameters, stepExecution) {
224
+ apiUrl = parameters.APIEndpoint;
225
+ apiKey = parameters.APIKey;
226
+
227
+ // Query customers modified since last sync
228
+ var lastSync = parameters.LastSyncDate;
229
+ if (lastSync) {
230
+ customers = CustomerMgr.searchProfiles(
231
+ 'lastModified >= {0}',
232
+ 'lastModified asc',
233
+ new Date(lastSync)
234
+ );
235
+ } else {
236
+ customers = CustomerMgr.searchProfiles('', 'lastModified asc');
237
+ }
238
+ };
239
+
240
+ exports.getTotalCount = function (parameters, stepExecution) {
241
+ return customers.count;
242
+ };
243
+
244
+ exports.read = function (parameters, stepExecution) {
245
+ if (customers.hasNext()) {
246
+ return customers.next();
247
+ }
248
+ };
249
+
250
+ exports.process = function (profile, parameters, stepExecution) {
251
+ return {
252
+ customerId: profile.customerNo,
253
+ email: profile.email,
254
+ firstName: profile.firstName,
255
+ lastName: profile.lastName,
256
+ lastModified: profile.lastModified.toISOString()
257
+ };
258
+ };
259
+
260
+ exports.write = function (items, parameters, stepExecution) {
261
+ var http = new HTTPClient();
262
+ http.setTimeout(30000);
263
+ http.setRequestHeader('Authorization', 'Bearer ' + apiKey);
264
+ http.setRequestHeader('Content-Type', 'application/json');
265
+
266
+ // Convert Java List to array
267
+ var payload = [];
268
+ for (var i = 0; i < items.size(); i++) {
269
+ payload.push(items.get(i));
270
+ }
271
+
272
+ try {
273
+ http.open('POST', apiUrl + '/customers/batch');
274
+ http.send(JSON.stringify({ customers: payload }));
275
+
276
+ if (http.statusCode >= 200 && http.statusCode < 300) {
277
+ log.info('Synced ' + payload.length + ' customers');
278
+ } else {
279
+ log.error('API error: ' + http.statusCode);
280
+ throw new Error('API returned ' + http.statusCode);
281
+ }
282
+ } catch (e) {
283
+ log.error('Sync error: ' + e.message);
284
+ throw e; // Causes step to fail
285
+ }
286
+ };
287
+
288
+ exports.afterStep = function (success, parameters, stepExecution) {
289
+ if (customers) {
290
+ customers.close();
291
+ }
292
+ };
293
+ ```
294
+
295
+ ## Chunk Lifecycle
296
+
297
+ 1. `beforeStep()` - Called once at start
298
+ 2. For each chunk:
299
+ - `beforeChunk()` - Before chunk (optional)
300
+ - `read()` - Called repeatedly until returns nothing
301
+ - `process()` - Called for each item from read()
302
+ - `write()` - Called with chunk of processed items
303
+ - `afterChunk()` - After chunk (optional)
304
+ 3. `afterStep(success)` - Called once at end
305
+
306
+ ## Chunk Size Considerations
307
+
308
+ | Chunk Size | Pros | Cons |
309
+ |------------|------|------|
310
+ | Small (10-50) | More frequent progress updates | Higher overhead |
311
+ | Medium (100-500) | Good balance | Default choice |
312
+ | Large (1000+) | Less overhead | Less granular progress |
313
+
314
+ ## Transaction Handling
315
+
316
+ Two approaches:
317
+
318
+ **1. transactional="true" in steptypes.json:**
319
+ ```json
320
+ {
321
+ "transactional": "true",
322
+ "chunk-size": 100
323
+ }
324
+ ```
325
+ Each chunk wrapped in single transaction. Rollback on error.
326
+
327
+ **2. Manual Transaction.wrap():**
328
+ ```javascript
329
+ exports.write = function (items, parameters, stepExecution) {
330
+ for (var i = 0; i < items.size(); i++) {
331
+ var item = items.get(i);
332
+ Transaction.wrap(function () {
333
+ // Per-item transaction
334
+ });
335
+ }
336
+ };
337
+ ```
338
+ More control, item-level error handling.
339
+
340
+ ## steptypes.json for Chunk Steps
341
+
342
+ ```json
343
+ {
344
+ "step-types": {
345
+ "chunk-script-module-step": [
346
+ {
347
+ "@type-id": "custom.ProductExport",
348
+ "@supports-parallel-execution": "true",
349
+ "@supports-site-context": "true",
350
+ "@supports-organization-context": "false",
351
+ "description": "Export products to CSV",
352
+ "module": "my_cartridge/cartridge/scripts/steps/productExport.js",
353
+ "before-step-function": "beforeStep",
354
+ "total-count-function": "getTotalCount",
355
+ "read-function": "read",
356
+ "process-function": "process",
357
+ "write-function": "write",
358
+ "after-step-function": "afterStep",
359
+ "chunk-size": 100,
360
+ "transactional": "false",
361
+ "timeout-in-seconds": 3600,
362
+ "parameters": {
363
+ "parameter": [
364
+ {
365
+ "@name": "OutputFile",
366
+ "@type": "string",
367
+ "@required": "false",
368
+ "default-value": "/export/products.csv",
369
+ "description": "Output file path"
370
+ }
371
+ ]
372
+ }
373
+ }
374
+ ]
375
+ }
376
+ }
377
+ ```
@@ -0,0 +1,212 @@
1
+ # jobs.xml Reference (Job Definitions)
2
+
3
+ `steptypes.json` makes a step *type* available; a **job definition** (`jobs.xml`) is what actually creates a runnable, schedulable job out of one or more steps. This is the missing link between *defining* steps and *running* a job: without a job definition there is no job for `b2c job run` to execute or for Business Manager to schedule.
4
+
5
+ You author `jobs.xml` and import it with the CLI:
6
+
7
+ ```bash
8
+ b2c job import ./my-job-archive
9
+ ```
10
+
11
+ `jobs.xml` lives at the **root of a site import archive** (alongside `services.xml`, `meta/`, `sites/`, …):
12
+
13
+ ```
14
+ my-job-archive/
15
+ └── jobs.xml # <-- archive root
16
+ ```
17
+
18
+ After import, the job appears in **Business Manager > Administration > Operations > Jobs** and can be triggered with `b2c job run <job-id>` (see the `b2c-cli:b2c-job` skill).
19
+
20
+ ## Namespace & Schema
21
+
22
+ Use the jobs impex namespace exactly. The schema is `jobs.xsd`.
23
+
24
+ ```xml
25
+ <?xml version="1.0" encoding="UTF-8"?>
26
+ <jobs xmlns="http://www.demandware.com/xml/impex/jobs/2015-07-01">
27
+ <!-- one or more <job> elements -->
28
+ </jobs>
29
+ ```
30
+
31
+ ## Document Structure (element order matters)
32
+
33
+ A `<job>` child elements **must appear in this order** (enforced by the XSD):
34
+
35
+ ```
36
+ <job>
37
+ <description>? (0..1)
38
+ <parameters>? (0..1) job-level parameters
39
+ (<flow> | <split>)* (0..n) one or more step flows
40
+ <rules>? (0..1) on-running / on-retry / on-exit notifications
41
+ <triggers> (1..1) REQUIRED — see below
42
+ </job>
43
+ ```
44
+
45
+ | Element | Required | Notes |
46
+ |---------|----------|-------|
47
+ | `<job job-id="...">` | Yes | `job-id` attribute is required and unique; it is the name you pass to `b2c job run`. |
48
+ | `<description>` | No | Free text (max 4000 chars). |
49
+ | `<parameters>` | No | Job-level parameters; steps can reference them via `job-parameter-ref`. |
50
+ | `<flow>` / `<split>` | No* | Contains the ordered `<step>` elements. A job with no flow does nothing. |
51
+ | `<rules>` | No | Hanging-job / retry / exit email notifications. |
52
+ | **`<triggers>`** | **Yes** | **Required by the schema.** A `jobs.xml` without `<triggers>` fails import validation. Use `<run-once>` for an on-demand/manually-run job. |
53
+
54
+ ## Minimal Single-Step Job
55
+
56
+ The smallest valid definition: one flow, one step referencing a custom step type, and the **required `<triggers>`** element. `<run-once>` registers the job for manual/on-demand execution (you still run it with `b2c job run`).
57
+
58
+ ```xml
59
+ <?xml version="1.0" encoding="UTF-8"?>
60
+ <jobs xmlns="http://www.demandware.com/xml/impex/jobs/2015-07-01">
61
+ <job job-id="MyNightlyExport">
62
+ <description>Exports products to a CSV feed</description>
63
+ <flow>
64
+ <context site-id="RefArch"/>
65
+ <step step-id="ExportStep" type="custom.ProductExport">
66
+ <parameters>
67
+ <parameter name="OutputFile">/export/products.csv</parameter>
68
+ <parameter name="OnlineOnly">true</parameter>
69
+ </parameters>
70
+ </step>
71
+ </flow>
72
+ <triggers>
73
+ <run-once enabled="false">
74
+ <date>2025-01-01</date>
75
+ <time>00:00:00.000Z</time>
76
+ </run-once>
77
+ </triggers>
78
+ </job>
79
+ </jobs>
80
+ ```
81
+
82
+ ## Step Element
83
+
84
+ ```xml
85
+ <step step-id="UniqueStepId" type="custom.ProductExport" enforce-restart="false">
86
+ <description>...</description>?
87
+ <parameters>?
88
+ <parameter name="ParamName">value</parameter>
89
+ <parameter name="OtherParam" job-parameter-ref="GlobalParam"/>
90
+ </parameters>
91
+ <rules>?
92
+ <on-exit status="ERROR"><stop-job/></on-exit>
93
+ </rules>
94
+ </step>
95
+ ```
96
+
97
+ | Attribute / element | Required | Notes |
98
+ |---------------------|----------|-------|
99
+ | `step-id` | Yes | Unique within the flow. |
100
+ | **`type`** | **Yes** | **References the step type to run.** This is the key distinction from `steptypes.json`: in `jobs.xml` you use the attribute **`type`** (e.g. `type="custom.ProductExport"`); the value matches the **`@type-id`** declared in `steptypes.json` for custom steps, or a built-in/system step `type-id` (e.g. `ImportCatalog`, `ExecuteScriptModule`). |
101
+ | `<parameters>/<parameter name="...">` | No | Per-step parameter values. The `name` must match a `@name` declared in the step type's `parameters` in `steptypes.json`. The value is the element text. |
102
+ | `job-parameter-ref` | No | On a `<parameter>`, binds this step parameter to a job-level `<parameter>` instead of a literal value (lets one job parameter feed many steps). |
103
+ | `<rules>/<on-exit status="...">` | No | Per-step flow control: `<stop/>`, `<stop-job/>`, `<stop-flow/>`, or `<continue next-step="..."/>` keyed on the step's exit status code. |
104
+
105
+ > **`type` (jobs.xml) vs `@type-id` (steptypes.json)** — a common stumbling block. `steptypes.json` *declares* a step type with `"@type-id": "custom.ProductExport"`. `jobs.xml` *uses* it with `<step type="custom.ProductExport">`. They must match exactly (custom type-ids start with `custom.`).
106
+
107
+ ## Multi-Step Job
108
+
109
+ Steps run in document order within a flow. Use `<context site-id="...">` to scope a site-aware flow; omit it (or use a `<split>`) for organization-scoped steps.
110
+
111
+ ```xml
112
+ <?xml version="1.0" encoding="UTF-8"?>
113
+ <jobs xmlns="http://www.demandware.com/xml/impex/jobs/2015-07-01">
114
+ <job job-id="OrderFulfillmentSync">
115
+ <parameters>
116
+ <parameter name="Site">RefArch</parameter>
117
+ </parameters>
118
+ <flow>
119
+ <context site-id="RefArch"/>
120
+ <step step-id="PullOrders" type="custom.PullOpenOrders">
121
+ <parameters>
122
+ <parameter name="SiteId" job-parameter-ref="Site"/>
123
+ </parameters>
124
+ <rules>
125
+ <on-exit status="ERROR"><stop-job/></on-exit>
126
+ </rules>
127
+ </step>
128
+ <step step-id="ExportToOMS" type="custom.ExportOrdersToOMS">
129
+ <parameters>
130
+ <parameter name="BatchSize">100</parameter>
131
+ </parameters>
132
+ </step>
133
+ </flow>
134
+ <triggers>
135
+ <run-once enabled="false">
136
+ <date>2025-01-01</date>
137
+ <time>00:00:00.000Z</time>
138
+ </run-once>
139
+ </triggers>
140
+ </job>
141
+ </jobs>
142
+ ```
143
+
144
+ ## Triggers (required)
145
+
146
+ `<triggers>` is **mandatory** and holds exactly one of `<run-once>` or `<run-recurring>`.
147
+
148
+ ### run-once (on-demand / manual)
149
+
150
+ Use for jobs you trigger from the CLI or Business Manager rather than on a schedule. `enabled="false"` keeps the one-time scheduled fire from auto-running; you still run it manually.
151
+
152
+ ```xml
153
+ <triggers>
154
+ <run-once enabled="false">
155
+ <date>2025-01-01</date>
156
+ <time>00:00:00.000Z</time>
157
+ </run-once>
158
+ </triggers>
159
+ ```
160
+
161
+ ### run-recurring (scheduled)
162
+
163
+ ```xml
164
+ <triggers>
165
+ <run-recurring enabled="true">
166
+ <recurrence>
167
+ <date-from>2025-01-01</date-from>
168
+ <start-time>02:00:00.000Z</start-time>
169
+ <interval>1d</interval>
170
+ <day-of-week>
171
+ <weekday>Monday</weekday>
172
+ <weekday>Wednesday</weekday>
173
+ <weekday>Friday</weekday>
174
+ </day-of-week>
175
+ </recurrence>
176
+ </run-recurring>
177
+ </triggers>
178
+ ```
179
+
180
+ | `<recurrence>` child | Required | Notes |
181
+ |----------------------|----------|-------|
182
+ | `<date-from>` | Yes | Start date (`YYYY-MM-DD`). |
183
+ | `<date-to>` | No | Optional end date. |
184
+ | `<start-time>` | Yes | Time of day (`HH:MM:SS.SSSZ`). |
185
+ | `<interval>` | No | e.g. `1d`, `30m`, `1h` (max 10 chars). |
186
+ | `<day-of-week>/<weekday>` | No | One or more of `Monday`…`Sunday`. |
187
+
188
+ ## Importing & Running
189
+
190
+ ```bash
191
+ # import the archive containing jobs.xml (waits for completion by default)
192
+ b2c job import ./my-job-archive
193
+
194
+ # verify / run the job after import
195
+ b2c job run MyNightlyExport --wait --show-log
196
+ ```
197
+
198
+ If the import fails with a schema validation error, the most common causes are a **missing `<triggers>` element**, children out of the required order, or a `<step type="...">` whose value doesn't match a declared `@type-id` (custom step types must be imported via `steptypes.json` in a deployed cartridge first). Use `b2c job import ./my-job-archive --show-log` to see the validation detail.
199
+
200
+ ## Common Pitfalls
201
+
202
+ - **Missing `<triggers>`** — the element is required by the XSD; import fails without it. For a manually-run job, use `<run-once enabled="false">`.
203
+ - **Child order** — `description → parameters → flow/split → rules → triggers`. Out-of-order children fail validation.
204
+ - **`type` vs `@type-id`** — `jobs.xml` uses the `type` attribute on `<step>`; it must match the `@type-id` in `steptypes.json` (or a system step type-id).
205
+ - **Custom step not deployed** — the cartridge carrying the step's `steptypes.json` and module must be on the active code version (and on the cartridge path) before the job can resolve the step type.
206
+ - **Wrong context scope** — site-scoped steps need a `<context site-id="...">`; org-scoped steps must not be placed under a site context. This must agree with `@supports-site-context` / `@supports-organization-context` in `steptypes.json`.
207
+
208
+ ## Related
209
+
210
+ - [steptypes.json Reference](STEPTYPES-JSON.md) — declaring the step types referenced by `<step type="...">`.
211
+ - `b2c-cli:b2c-job` — running the imported job (`b2c job run`) and importing the archive (`b2c job import`).
212
+ - `b2c-cli:b2c-site-import-export` — site archive structure (`jobs.xml` is a root-level archive file).