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.
- package/.github/ISSUE_TEMPLATE/bug_report.yml +3 -1
- package/.github/ISSUE_TEMPLATE/documentation.yml +2 -2
- package/.github/ISSUE_TEMPLATE/question.yml +1 -1
- package/.github/PULL_REQUEST_TEMPLATE/documentation.md +1 -1
- package/.github/PULL_REQUEST_TEMPLATE/new_tool.md +1 -1
- package/.github/agents/official-docs-researcher.agent.md +56 -0
- package/.github/instructions/mcp-node-tests.instructions.md +12 -916
- package/.github/instructions/mcp-yml-tests.instructions.md +14 -742
- package/.github/pull_request_template.md +1 -1
- package/.github/skills/agent-authoring/SKILL.md +66 -0
- package/.github/skills/mcp-log-debugging/SKILL.md +69 -0
- package/.github/skills/mcp-programmatic-testing/SKILL.md +142 -0
- package/.github/skills/mcp-yaml-testing/SKILL.md +136 -0
- package/.github/skills/salesforce-developer-site-scraper/SKILL.md +102 -0
- package/.github/skills/salesforce-developer-site-scraper/scripts/scrape-to-markdown.js +205 -0
- package/.github/skills/salesforce-help-site-scraper/SKILL.md +84 -0
- package/.github/skills/salesforce-help-site-scraper/scripts/scrape-help-to-markdown.js +212 -0
- package/.github/skills/skill-authoring/SKILL.md +228 -0
- package/.github/skills/skill-authoring/references/PATTERNS.md +384 -0
- package/.github/workflows/ci.yml +3 -3
- package/.github/workflows/deploy-pages.yml +9 -19
- package/.github/workflows/publish.yml +5 -2
- package/.github/workflows/update-docs.yml +1 -1
- package/AGENTS.md +140 -286
- package/CONTRIBUTING.md +10 -22
- package/README.md +48 -16
- package/ai-instructions/{github-copilot/copilot-instructions.md → AGENTS.md} +99 -127
- package/ai-instructions/skills/sfcc-caching/SKILL.md +89 -0
- package/{dist/docs/best-practices/cartridge_creation.md → ai-instructions/skills/sfcc-cartridge-development/SKILL.md} +31 -7
- package/ai-instructions/skills/sfcc-forms-development/SKILL.md +261 -0
- package/ai-instructions/skills/sfcc-forms-development/references/ARCHITECTURE-SGJC-SFRA.md +143 -0
- package/ai-instructions/skills/sfcc-forms-development/references/FORM-XML-CHEATSHEET.md +127 -0
- package/ai-instructions/skills/sfcc-fraud-prevention/SKILL.md +95 -0
- package/ai-instructions/skills/sfcc-hooks-registration/SKILL.md +39 -0
- package/ai-instructions/skills/sfcc-isml-development/SKILL.md +370 -0
- package/ai-instructions/skills/sfcc-isml-development/references/REMOTE-INCLUDES.md +116 -0
- package/ai-instructions/skills/sfcc-isml-development/references/SFRA-LAYOUTS.md +50 -0
- package/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CART-ACCOUNT-AUTH.md +45 -0
- package/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CATALOG.md +85 -0
- package/ai-instructions/skills/sfcc-isml-development/references/SFRA-STRUCTURE-COMPONENTS.md +63 -0
- package/ai-instructions/skills/sfcc-isml-development/references/UTILITIES-EXPRESSIONS.md +159 -0
- package/ai-instructions/skills/sfcc-isml-development/references/sfra-base-templates-architecture.md +13 -0
- package/ai-instructions/skills/sfcc-job-development/SKILL.md +334 -0
- package/ai-instructions/skills/sfcc-job-development/references/CHUNK-ORIENTED.md +393 -0
- package/ai-instructions/skills/sfcc-job-development/references/STEPTYPES-JSON.md +271 -0
- package/ai-instructions/skills/sfcc-job-development/references/TASK-ORIENTED.md +257 -0
- package/ai-instructions/skills/sfcc-localization/SKILL.md +92 -0
- package/ai-instructions/skills/sfcc-localization/references/CONTROLLERS.md +63 -0
- package/ai-instructions/skills/sfcc-localization/references/FORMATTING.md +29 -0
- package/ai-instructions/skills/sfcc-localization/references/FORMS-LOCALIZATION.md +33 -0
- package/ai-instructions/skills/sfcc-localization/references/JAVASCRIPT-LOCALIZATION.md +41 -0
- package/ai-instructions/skills/sfcc-localization/references/LOCALE-SWITCHING.md +35 -0
- package/ai-instructions/skills/sfcc-localization/references/PATTERNS.md +740 -0
- package/ai-instructions/skills/sfcc-localization/references/PROPERTIES-ENCODING.md +25 -0
- package/ai-instructions/skills/sfcc-localization/references/RESOURCE-BUNDLES.md +67 -0
- package/ai-instructions/skills/sfcc-localization/references/STATIC-FILES.md +23 -0
- package/ai-instructions/skills/sfcc-localization/references/TESTING.md +21 -0
- package/{docs/best-practices/localserviceregistry.md → ai-instructions/skills/sfcc-localserviceregistry/SKILL.md} +65 -31
- package/ai-instructions/skills/sfcc-logging/SKILL.md +352 -0
- package/ai-instructions/skills/sfcc-logging/references/LOG-FILES.md +282 -0
- package/{docs/best-practices/ocapi_hooks.md → ai-instructions/skills/sfcc-ocapi-hooks/SKILL.md} +51 -16
- package/ai-instructions/skills/sfcc-ocapi-scapi-slas/SKILL.md +108 -0
- package/ai-instructions/skills/sfcc-page-designer/SKILL.md +353 -0
- package/ai-instructions/skills/sfcc-page-designer/references/ATTRIBUTE-TYPES.md +436 -0
- package/ai-instructions/skills/sfcc-page-designer/references/META-DEFINITIONS.md +322 -0
- package/{dist/docs/best-practices/performance.md → ai-instructions/skills/sfcc-performance/SKILL.md} +35 -3
- package/ai-instructions/skills/sfcc-platform-limits/SKILL.md +89 -0
- package/ai-instructions/skills/sfcc-scapi-custom-endpoints/SKILL.md +237 -0
- package/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/AUTHENTICATION.md +214 -0
- package/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/URL-MAPPING.md +253 -0
- package/{docs/best-practices/scapi_hooks.md → ai-instructions/skills/sfcc-scapi-hooks/SKILL.md} +44 -17
- package/ai-instructions/skills/sfcc-script-evaluation/SKILL.md +380 -0
- package/{docs/best-practices/security.md → ai-instructions/skills/sfcc-security/SKILL.md} +12 -3
- package/ai-instructions/skills/sfcc-sfra-client-side-js/SKILL.md +270 -0
- package/ai-instructions/skills/sfcc-sfra-client-side-js/references/AJAX-CSRF-VALIDATION.md +285 -0
- package/ai-instructions/skills/sfcc-sfra-client-side-js/references/BASE-MODULE-INDEX.md +206 -0
- package/ai-instructions/skills/sfcc-sfra-client-side-js/references/EXTENSION-PATTERNS.md +165 -0
- package/ai-instructions/skills/sfcc-sfra-client-side-js/references/PLUGIN-PATTERNS.md +185 -0
- package/ai-instructions/skills/sfcc-sfra-controllers/SKILL.md +347 -0
- package/ai-instructions/skills/sfcc-sfra-controllers/references/MIDDLEWARE-REFERENCE.md +257 -0
- package/ai-instructions/skills/sfcc-sfra-controllers/references/REMOTE-INCLUDES.md +193 -0
- package/{dist/docs/best-practices/sfra_controllers.md → ai-instructions/skills/sfcc-sfra-controllers/references/standard-sfra-controllers.md} +0 -670
- package/ai-instructions/skills/sfcc-sfra-models/SKILL.md +322 -0
- package/ai-instructions/skills/sfcc-sfra-models/references/MODEL-PATTERNS.md +530 -0
- package/ai-instructions/skills/sfcc-sfra-models/references/MODEL-STRUCTURE.md +234 -0
- package/ai-instructions/skills/sfcc-sfra-models/references/TESTING-SECURITY.md +417 -0
- package/{dist/docs/best-practices/sfra_scss.md → ai-instructions/skills/sfcc-sfra-scss/SKILL.md} +5 -0
- package/ai-instructions/skills/sfcc-webdav-workflows/SKILL.md +111 -0
- package/dist/ai-instructions/AGENTS.md +628 -0
- package/dist/ai-instructions/skills/sfcc-caching/SKILL.md +89 -0
- package/{docs/best-practices/cartridge_creation.md → dist/ai-instructions/skills/sfcc-cartridge-development/SKILL.md} +31 -7
- package/dist/ai-instructions/skills/sfcc-forms-development/SKILL.md +261 -0
- package/dist/ai-instructions/skills/sfcc-forms-development/references/ARCHITECTURE-SGJC-SFRA.md +143 -0
- package/dist/ai-instructions/skills/sfcc-forms-development/references/FORM-XML-CHEATSHEET.md +127 -0
- package/dist/ai-instructions/skills/sfcc-fraud-prevention/SKILL.md +95 -0
- package/dist/ai-instructions/skills/sfcc-hooks-registration/SKILL.md +39 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/SKILL.md +370 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/REMOTE-INCLUDES.md +116 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-LAYOUTS.md +50 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CART-ACCOUNT-AUTH.md +45 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CATALOG.md +85 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-STRUCTURE-COMPONENTS.md +63 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/UTILITIES-EXPRESSIONS.md +159 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/sfra-base-templates-architecture.md +13 -0
- package/dist/ai-instructions/skills/sfcc-job-development/SKILL.md +334 -0
- package/dist/ai-instructions/skills/sfcc-job-development/references/CHUNK-ORIENTED.md +393 -0
- package/dist/ai-instructions/skills/sfcc-job-development/references/STEPTYPES-JSON.md +271 -0
- package/dist/ai-instructions/skills/sfcc-job-development/references/TASK-ORIENTED.md +257 -0
- package/dist/ai-instructions/skills/sfcc-localization/SKILL.md +92 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/CONTROLLERS.md +63 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/FORMATTING.md +29 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/FORMS-LOCALIZATION.md +33 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/JAVASCRIPT-LOCALIZATION.md +41 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/LOCALE-SWITCHING.md +35 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/PATTERNS.md +740 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/PROPERTIES-ENCODING.md +25 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/RESOURCE-BUNDLES.md +67 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/STATIC-FILES.md +23 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/TESTING.md +21 -0
- package/dist/{docs/best-practices/localserviceregistry.md → ai-instructions/skills/sfcc-localserviceregistry/SKILL.md} +65 -31
- package/dist/ai-instructions/skills/sfcc-logging/SKILL.md +352 -0
- package/dist/ai-instructions/skills/sfcc-logging/references/LOG-FILES.md +282 -0
- package/dist/{docs/best-practices/ocapi_hooks.md → ai-instructions/skills/sfcc-ocapi-hooks/SKILL.md} +51 -16
- package/dist/ai-instructions/skills/sfcc-ocapi-scapi-slas/SKILL.md +108 -0
- package/dist/ai-instructions/skills/sfcc-page-designer/SKILL.md +353 -0
- package/dist/ai-instructions/skills/sfcc-page-designer/references/ATTRIBUTE-TYPES.md +436 -0
- package/dist/ai-instructions/skills/sfcc-page-designer/references/META-DEFINITIONS.md +322 -0
- package/{docs/best-practices/performance.md → dist/ai-instructions/skills/sfcc-performance/SKILL.md} +35 -3
- package/dist/ai-instructions/skills/sfcc-platform-limits/SKILL.md +89 -0
- package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/SKILL.md +237 -0
- package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/AUTHENTICATION.md +214 -0
- package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/URL-MAPPING.md +253 -0
- package/dist/{docs/best-practices/scapi_hooks.md → ai-instructions/skills/sfcc-scapi-hooks/SKILL.md} +44 -17
- package/dist/ai-instructions/skills/sfcc-script-evaluation/SKILL.md +380 -0
- package/dist/{docs/best-practices/security.md → ai-instructions/skills/sfcc-security/SKILL.md} +12 -3
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/SKILL.md +270 -0
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/AJAX-CSRF-VALIDATION.md +285 -0
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/BASE-MODULE-INDEX.md +206 -0
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/EXTENSION-PATTERNS.md +165 -0
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/PLUGIN-PATTERNS.md +185 -0
- package/dist/ai-instructions/skills/sfcc-sfra-controllers/SKILL.md +347 -0
- package/dist/ai-instructions/skills/sfcc-sfra-controllers/references/MIDDLEWARE-REFERENCE.md +257 -0
- package/dist/ai-instructions/skills/sfcc-sfra-controllers/references/REMOTE-INCLUDES.md +193 -0
- package/{docs/best-practices/sfra_controllers.md → dist/ai-instructions/skills/sfcc-sfra-controllers/references/standard-sfra-controllers.md} +0 -670
- package/dist/ai-instructions/skills/sfcc-sfra-models/SKILL.md +322 -0
- package/dist/ai-instructions/skills/sfcc-sfra-models/references/MODEL-PATTERNS.md +530 -0
- package/dist/ai-instructions/skills/sfcc-sfra-models/references/MODEL-STRUCTURE.md +234 -0
- package/dist/ai-instructions/skills/sfcc-sfra-models/references/TESTING-SECURITY.md +417 -0
- package/{docs/best-practices/sfra_scss.md → dist/ai-instructions/skills/sfcc-sfra-scss/SKILL.md} +5 -0
- package/dist/ai-instructions/skills/sfcc-webdav-workflows/SKILL.md +111 -0
- package/dist/clients/agent-instructions-client.d.ts +66 -0
- package/dist/clients/agent-instructions-client.d.ts.map +1 -0
- package/dist/clients/agent-instructions-client.js +277 -0
- package/dist/clients/agent-instructions-client.js.map +1 -0
- package/dist/clients/base/abstract-documentation-client.d.ts +146 -0
- package/dist/clients/base/abstract-documentation-client.d.ts.map +1 -0
- package/dist/clients/base/abstract-documentation-client.js +265 -0
- package/dist/clients/base/abstract-documentation-client.js.map +1 -0
- package/dist/clients/base/oauth-token.d.ts +18 -0
- package/dist/clients/base/oauth-token.d.ts.map +1 -1
- package/dist/clients/base/oauth-token.js +45 -2
- package/dist/clients/base/oauth-token.js.map +1 -1
- package/dist/clients/cartridge/cartridge-generation-client.d.ts +59 -0
- package/dist/clients/cartridge/cartridge-generation-client.d.ts.map +1 -0
- package/dist/clients/cartridge/cartridge-generation-client.js +224 -0
- package/dist/clients/cartridge/cartridge-generation-client.js.map +1 -0
- package/dist/clients/cartridge/cartridge-structure.d.ts +17 -0
- package/dist/clients/cartridge/cartridge-structure.d.ts.map +1 -0
- package/dist/clients/cartridge/cartridge-structure.js +33 -0
- package/dist/clients/cartridge/cartridge-structure.js.map +1 -0
- package/dist/clients/cartridge/cartridge-templates.d.ts +22 -0
- package/dist/clients/cartridge/cartridge-templates.d.ts.map +1 -0
- package/dist/clients/cartridge/cartridge-templates.js +225 -0
- package/dist/clients/cartridge/cartridge-templates.js.map +1 -0
- package/dist/clients/cartridge/index.d.ts +7 -0
- package/dist/clients/cartridge/index.d.ts.map +1 -0
- package/dist/clients/cartridge/index.js +7 -0
- package/dist/clients/cartridge/index.js.map +1 -0
- package/dist/clients/docs/documentation-scanner.d.ts +5 -2
- package/dist/clients/docs/documentation-scanner.d.ts.map +1 -1
- package/dist/clients/docs/documentation-scanner.js +38 -23
- package/dist/clients/docs/documentation-scanner.js.map +1 -1
- package/dist/clients/docs-client.d.ts +13 -4
- package/dist/clients/docs-client.d.ts.map +1 -1
- package/dist/clients/docs-client.js +44 -11
- package/dist/clients/docs-client.js.map +1 -1
- package/dist/clients/isml-client.d.ts +71 -0
- package/dist/clients/isml-client.d.ts.map +1 -0
- package/dist/clients/isml-client.js +252 -0
- package/dist/clients/isml-client.js.map +1 -0
- package/dist/clients/ocapi/code-versions-client.d.ts.map +1 -1
- package/dist/clients/ocapi/code-versions-client.js +6 -1
- package/dist/clients/ocapi/code-versions-client.js.map +1 -1
- package/dist/clients/ocapi-client.d.ts +9 -101
- package/dist/clients/ocapi-client.d.ts.map +1 -1
- package/dist/clients/ocapi-client.js +11 -93
- package/dist/clients/ocapi-client.js.map +1 -1
- package/dist/clients/script-debugger/index.d.ts +5 -0
- package/dist/clients/script-debugger/index.d.ts.map +1 -0
- package/dist/clients/script-debugger/index.js +5 -0
- package/dist/clients/script-debugger/index.js.map +1 -0
- package/dist/clients/script-debugger/script-debugger-client.d.ts +147 -0
- package/dist/clients/script-debugger/script-debugger-client.d.ts.map +1 -0
- package/dist/clients/script-debugger/script-debugger-client.js +591 -0
- package/dist/clients/script-debugger/script-debugger-client.js.map +1 -0
- package/dist/clients/sfra-client.d.ts +13 -62
- package/dist/clients/sfra-client.d.ts.map +1 -1
- package/dist/clients/sfra-client.js +105 -326
- package/dist/clients/sfra-client.js.map +1 -1
- package/dist/config/configuration-factory.d.ts +1 -1
- package/dist/config/configuration-factory.d.ts.map +1 -1
- package/dist/config/configuration-factory.js +5 -1
- package/dist/config/configuration-factory.js.map +1 -1
- package/dist/config/dw-json-loader.d.ts +7 -0
- package/dist/config/dw-json-loader.d.ts.map +1 -1
- package/dist/config/dw-json-loader.js +92 -15
- package/dist/config/dw-json-loader.js.map +1 -1
- package/dist/config/workspace-roots.d.ts +143 -0
- package/dist/config/workspace-roots.d.ts.map +1 -0
- package/dist/config/workspace-roots.js +448 -0
- package/dist/config/workspace-roots.js.map +1 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +3 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/core/handlers/abstract-client-handler.d.ts +52 -0
- package/dist/core/handlers/abstract-client-handler.d.ts.map +1 -0
- package/dist/core/handlers/abstract-client-handler.js +51 -0
- package/dist/core/handlers/abstract-client-handler.js.map +1 -0
- package/dist/core/handlers/agent-instructions-handler.d.ts +17 -0
- package/dist/core/handlers/agent-instructions-handler.d.ts.map +1 -0
- package/dist/core/handlers/agent-instructions-handler.js +38 -0
- package/dist/core/handlers/agent-instructions-handler.js.map +1 -0
- package/dist/core/handlers/base-handler.d.ts +3 -68
- package/dist/core/handlers/base-handler.d.ts.map +1 -1
- package/dist/core/handlers/base-handler.js +11 -84
- package/dist/core/handlers/base-handler.js.map +1 -1
- package/dist/core/handlers/cartridge-handler.d.ts +10 -11
- package/dist/core/handlers/cartridge-handler.d.ts.map +1 -1
- package/dist/core/handlers/cartridge-handler.js +10 -28
- package/dist/core/handlers/cartridge-handler.js.map +1 -1
- package/dist/core/handlers/client-factory.d.ts +12 -2
- package/dist/core/handlers/client-factory.d.ts.map +1 -1
- package/dist/core/handlers/client-factory.js +28 -1
- package/dist/core/handlers/client-factory.js.map +1 -1
- package/dist/core/handlers/code-version-handler.d.ts +11 -11
- package/dist/core/handlers/code-version-handler.d.ts.map +1 -1
- package/dist/core/handlers/code-version-handler.js +13 -27
- package/dist/core/handlers/code-version-handler.js.map +1 -1
- package/dist/core/handlers/docs-handler.d.ts +6 -12
- package/dist/core/handlers/docs-handler.d.ts.map +1 -1
- package/dist/core/handlers/docs-handler.js +11 -36
- package/dist/core/handlers/docs-handler.js.map +1 -1
- package/dist/core/handlers/isml-handler.d.ts +11 -0
- package/dist/core/handlers/isml-handler.d.ts.map +1 -0
- package/dist/core/handlers/isml-handler.js +18 -0
- package/dist/core/handlers/isml-handler.js.map +1 -0
- package/dist/core/handlers/job-log-handler.d.ts +8 -7
- package/dist/core/handlers/job-log-handler.d.ts.map +1 -1
- package/dist/core/handlers/job-log-handler.js +14 -5
- package/dist/core/handlers/job-log-handler.js.map +1 -1
- package/dist/core/handlers/log-handler.d.ts +8 -7
- package/dist/core/handlers/log-handler.d.ts.map +1 -1
- package/dist/core/handlers/log-handler.js +14 -5
- package/dist/core/handlers/log-handler.js.map +1 -1
- package/dist/core/handlers/script-debugger-handler.d.ts +18 -0
- package/dist/core/handlers/script-debugger-handler.d.ts.map +1 -0
- package/dist/core/handlers/script-debugger-handler.js +31 -0
- package/dist/core/handlers/script-debugger-handler.js.map +1 -0
- package/dist/core/handlers/sfra-handler.d.ts +6 -12
- package/dist/core/handlers/sfra-handler.d.ts.map +1 -1
- package/dist/core/handlers/sfra-handler.js +11 -36
- package/dist/core/handlers/sfra-handler.js.map +1 -1
- package/dist/core/handlers/simple-client-handler.d.ts +41 -0
- package/dist/core/handlers/simple-client-handler.d.ts.map +1 -0
- package/dist/core/handlers/simple-client-handler.js +49 -0
- package/dist/core/handlers/simple-client-handler.js.map +1 -0
- package/dist/core/handlers/system-object-handler.d.ts +11 -11
- package/dist/core/handlers/system-object-handler.d.ts.map +1 -1
- package/dist/core/handlers/system-object-handler.js +13 -27
- package/dist/core/handlers/system-object-handler.js.map +1 -1
- package/dist/core/handlers/validation-helpers.d.ts +22 -24
- package/dist/core/handlers/validation-helpers.d.ts.map +1 -1
- package/dist/core/handlers/validation-helpers.js +89 -39
- package/dist/core/handlers/validation-helpers.js.map +1 -1
- package/dist/core/instruction-advisor.d.ts +28 -0
- package/dist/core/instruction-advisor.d.ts.map +1 -0
- package/dist/core/instruction-advisor.js +114 -0
- package/dist/core/instruction-advisor.js.map +1 -0
- package/dist/core/server.d.ts +25 -0
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +151 -11
- package/dist/core/server.js.map +1 -1
- package/dist/core/tool-definitions.d.ts +6 -854
- package/dist/core/tool-definitions.d.ts.map +1 -1
- package/dist/core/tool-definitions.js +8 -1064
- package/dist/core/tool-definitions.js.map +1 -1
- package/dist/core/tool-schemas/agent-instruction-tools.d.ts +77 -0
- package/dist/core/tool-schemas/agent-instruction-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/agent-instruction-tools.js +72 -0
- package/dist/core/tool-schemas/agent-instruction-tools.js.map +1 -0
- package/dist/core/tool-schemas/cartridge-tools.d.ts +27 -0
- package/dist/core/tool-schemas/cartridge-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/cartridge-tools.js +29 -0
- package/dist/core/tool-schemas/cartridge-tools.js.map +1 -0
- package/dist/core/tool-schemas/code-version-tools.d.ts +28 -0
- package/dist/core/tool-schemas/code-version-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/code-version-tools.js +28 -0
- package/dist/core/tool-schemas/code-version-tools.js.map +1 -0
- package/dist/core/tool-schemas/documentation-tools.d.ts +139 -0
- package/dist/core/tool-schemas/documentation-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/documentation-tools.js +104 -0
- package/dist/core/tool-schemas/documentation-tools.js.map +1 -0
- package/dist/core/tool-schemas/index.d.ts +17 -0
- package/dist/core/tool-schemas/index.d.ts.map +1 -0
- package/dist/core/tool-schemas/index.js +19 -0
- package/dist/core/tool-schemas/index.js.map +1 -0
- package/dist/core/tool-schemas/isml-tools.d.ts +98 -0
- package/dist/core/tool-schemas/isml-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/isml-tools.js +89 -0
- package/dist/core/tool-schemas/isml-tools.js.map +1 -0
- package/dist/core/tool-schemas/log-tools.d.ts +221 -0
- package/dist/core/tool-schemas/log-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/log-tools.js +180 -0
- package/dist/core/tool-schemas/log-tools.js.map +1 -0
- package/dist/core/tool-schemas/script-debugger-tools.d.ts +44 -0
- package/dist/core/tool-schemas/script-debugger-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/script-debugger-tools.js +83 -0
- package/dist/core/tool-schemas/script-debugger-tools.js.map +1 -0
- package/dist/core/tool-schemas/sfra-tools.d.ts +63 -0
- package/dist/core/tool-schemas/sfra-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/sfra-tools.js +65 -0
- package/dist/core/tool-schemas/sfra-tools.js.map +1 -0
- package/dist/core/tool-schemas/shared-schemas.d.ts +350 -0
- package/dist/core/tool-schemas/shared-schemas.d.ts.map +1 -0
- package/dist/core/tool-schemas/shared-schemas.js +153 -0
- package/dist/core/tool-schemas/shared-schemas.js.map +1 -0
- package/dist/core/tool-schemas/system-object-tools.d.ts +511 -0
- package/dist/core/tool-schemas/system-object-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/system-object-tools.js +126 -0
- package/dist/core/tool-schemas/system-object-tools.js.map +1 -0
- package/dist/docs/dw_net/HTTPClient.md +46 -2
- package/dist/docs/dw_net/HTTPClientLoggingConfig.md +296 -0
- package/dist/docs/dw_order/Basket.md +7 -7
- package/dist/docs/dw_order/BasketMgr.md +22 -6
- package/dist/docs/dw_order.hooks/BasketMergeHooks.md +42 -0
- package/dist/docs/dw_svc/ServiceCallback.md +2 -2
- package/dist/docs/isml/isactivedatacontext.md +382 -0
- package/dist/docs/isml/isactivedatahead.md +566 -0
- package/dist/docs/isml/isanalyticsoff.md +537 -0
- package/dist/docs/isml/isapplepay.md +667 -0
- package/dist/docs/isml/isbreak.md +687 -0
- package/dist/docs/isml/isbuynow.md +682 -0
- package/dist/docs/isml/iscache.md +802 -0
- package/dist/docs/isml/iscomment.md +794 -0
- package/dist/docs/isml/iscomponent.md +797 -0
- package/dist/docs/isml/iscontent.md +594 -0
- package/dist/docs/isml/iscontinue.md +563 -0
- package/dist/docs/isml/iscookie.md +798 -0
- package/dist/docs/isml/isdecorate.md +818 -0
- package/dist/docs/isml/isif.md +737 -0
- package/dist/docs/isml/isinclude.md +874 -0
- package/dist/docs/isml/isloop.md +377 -0
- package/dist/docs/isml/ismodule.md +844 -0
- package/dist/docs/isml/isnext.md +672 -0
- package/dist/docs/isml/isobject.md +760 -0
- package/dist/docs/isml/ispayment.md +577 -0
- package/dist/docs/isml/ispaymentmessages.md +664 -0
- package/dist/docs/isml/isprint.md +875 -0
- package/dist/docs/isml/isredirect.md +716 -0
- package/dist/docs/isml/isremove.md +725 -0
- package/dist/docs/isml/isreplace.md +783 -0
- package/dist/docs/isml/isscript.md +859 -0
- package/dist/docs/isml/isselect.md +908 -0
- package/dist/docs/isml/isset.md +585 -0
- package/dist/docs/isml/isslot.md +824 -0
- package/dist/docs/isml/isstatus.md +711 -0
- package/dist/main.d.ts +16 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +60 -28
- package/dist/main.js.map +1 -1
- package/dist/services/index.d.ts +4 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -2
- package/dist/services/index.js.map +1 -1
- package/dist/tool-configs/agent-instructions-tool-config.d.ts +6 -0
- package/dist/tool-configs/agent-instructions-tool-config.d.ts.map +1 -0
- package/dist/tool-configs/agent-instructions-tool-config.js +74 -0
- package/dist/tool-configs/agent-instructions-tool-config.js.map +1 -0
- package/dist/tool-configs/code-version-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/code-version-tool-config.js +0 -5
- package/dist/tool-configs/code-version-tool-config.js.map +1 -1
- package/dist/tool-configs/docs-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/docs-tool-config.js +0 -7
- package/dist/tool-configs/docs-tool-config.js.map +1 -1
- package/dist/tool-configs/isml-tool-config.d.ts +11 -0
- package/dist/tool-configs/isml-tool-config.d.ts.map +1 -0
- package/dist/tool-configs/isml-tool-config.js +77 -0
- package/dist/tool-configs/isml-tool-config.js.map +1 -0
- package/dist/tool-configs/job-log-tool-config.d.ts +1 -2
- package/dist/tool-configs/job-log-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/job-log-tool-config.js +11 -15
- package/dist/tool-configs/job-log-tool-config.js.map +1 -1
- package/dist/tool-configs/log-tool-config.d.ts +1 -2
- package/dist/tool-configs/log-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/log-tool-config.js +35 -51
- package/dist/tool-configs/log-tool-config.js.map +1 -1
- package/dist/tool-configs/script-debugger-tool-config.d.ts +11 -0
- package/dist/tool-configs/script-debugger-tool-config.d.ts.map +1 -0
- package/dist/tool-configs/script-debugger-tool-config.js +35 -0
- package/dist/tool-configs/script-debugger-tool-config.js.map +1 -0
- package/dist/tool-configs/sfra-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/sfra-tool-config.js +0 -11
- package/dist/tool-configs/sfra-tool-config.js.map +1 -1
- package/dist/tool-configs/system-object-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/system-object-tool-config.js +0 -5
- package/dist/tool-configs/system-object-tool-config.js.map +1 -1
- package/dist/types/types.d.ts +2 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/utils/cache.d.ts +12 -10
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +47 -47
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/category-utils.d.ts +31 -0
- package/dist/utils/category-utils.d.ts.map +1 -0
- package/dist/utils/category-utils.js +45 -0
- package/dist/utils/category-utils.js.map +1 -0
- package/dist/utils/log-tool-constants.d.ts +16 -13
- package/dist/utils/log-tool-constants.d.ts.map +1 -1
- package/dist/utils/log-tool-constants.js +10 -11
- package/dist/utils/log-tool-constants.js.map +1 -1
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +35 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/markdown-utils.d.ts +60 -0
- package/dist/utils/markdown-utils.d.ts.map +1 -0
- package/dist/utils/markdown-utils.js +206 -0
- package/dist/utils/markdown-utils.js.map +1 -0
- package/dist/utils/path-resolver.d.ts +12 -4
- package/dist/utils/path-resolver.d.ts.map +1 -1
- package/dist/utils/path-resolver.js +22 -8
- package/dist/utils/path-resolver.js.map +1 -1
- package/dist/utils/path-validation.d.ts +40 -0
- package/dist/utils/path-validation.d.ts.map +1 -0
- package/dist/utils/path-validation.js +84 -0
- package/dist/utils/path-validation.js.map +1 -0
- package/docs/dw_net/HTTPClient.md +46 -2
- package/docs/dw_net/HTTPClientLoggingConfig.md +296 -0
- package/docs/dw_order/Basket.md +7 -7
- package/docs/dw_order/BasketMgr.md +22 -6
- package/docs/dw_order.hooks/BasketMergeHooks.md +42 -0
- package/docs/dw_svc/ServiceCallback.md +2 -2
- package/docs/isml/isactivedatacontext.md +382 -0
- package/docs/isml/isactivedatahead.md +566 -0
- package/docs/isml/isanalyticsoff.md +537 -0
- package/docs/isml/isapplepay.md +667 -0
- package/docs/isml/isbreak.md +687 -0
- package/docs/isml/isbuynow.md +682 -0
- package/docs/isml/iscache.md +802 -0
- package/docs/isml/iscomment.md +794 -0
- package/docs/isml/iscomponent.md +797 -0
- package/docs/isml/iscontent.md +594 -0
- package/docs/isml/iscontinue.md +563 -0
- package/docs/isml/iscookie.md +798 -0
- package/docs/isml/isdecorate.md +818 -0
- package/docs/isml/isif.md +737 -0
- package/docs/isml/isinclude.md +874 -0
- package/docs/isml/isloop.md +377 -0
- package/docs/isml/ismodule.md +844 -0
- package/docs/isml/isnext.md +672 -0
- package/docs/isml/isobject.md +760 -0
- package/docs/isml/ispayment.md +577 -0
- package/docs/isml/ispaymentmessages.md +664 -0
- package/docs/isml/isprint.md +875 -0
- package/docs/isml/isredirect.md +716 -0
- package/docs/isml/isremove.md +725 -0
- package/docs/isml/isreplace.md +783 -0
- package/docs/isml/isscript.md +859 -0
- package/docs/isml/isselect.md +908 -0
- package/docs/isml/isset.md +585 -0
- package/docs/isml/isslot.md +824 -0
- package/docs/isml/isstatus.md +711 -0
- package/docs-site-v2/.vitepress/config.mts +190 -0
- package/docs-site-v2/.vitepress/theme/components/AssistantTabs.vue +96 -0
- package/docs-site-v2/.vitepress/theme/components/Callout.vue +10 -0
- package/docs-site-v2/.vitepress/theme/components/Collapsible.vue +14 -0
- package/docs-site-v2/.vitepress/theme/components/DwJsonBuilder.vue +82 -0
- package/docs-site-v2/.vitepress/theme/components/HomeSections.vue +552 -0
- package/docs-site-v2/.vitepress/theme/components/InstructionFilesTabs.vue +87 -0
- package/docs-site-v2/.vitepress/theme/components/ModeTabs.vue +70 -0
- package/docs-site-v2/.vitepress/theme/components/NewcomerCTA.vue +14 -0
- package/docs-site-v2/.vitepress/theme/components/QuickStartCards.vue +20 -0
- package/docs-site-v2/.vitepress/theme/components/QuickStartHero.vue +20 -0
- package/docs-site-v2/.vitepress/theme/components/SkillsList.vue +48 -0
- package/docs-site-v2/.vitepress/theme/components/ToolExplorer.vue +85 -0
- package/docs-site-v2/.vitepress/theme/custom.css +1373 -0
- package/docs-site-v2/.vitepress/theme/index.ts +39 -0
- package/docs-site-v2/data/skills.ts +147 -0
- package/docs-site-v2/data/tools.ts +490 -0
- package/docs-site-v2/development/index.md +151 -0
- package/docs-site-v2/examples/index.md +333 -0
- package/docs-site-v2/features/index.md +144 -0
- package/docs-site-v2/guide/ai-interfaces.md +58 -0
- package/docs-site-v2/guide/configuration.md +208 -0
- package/docs-site-v2/guide/index.md +50 -0
- package/docs-site-v2/index.md +32 -0
- package/docs-site-v2/package-lock.json +2511 -0
- package/docs-site-v2/package.json +15 -0
- package/docs-site-v2/public/android-chrome-192x192.png +0 -0
- package/docs-site-v2/public/android-chrome-512x512.png +0 -0
- package/docs-site-v2/public/apple-touch-icon.png +0 -0
- package/docs-site-v2/public/favicon-16x16.png +0 -0
- package/docs-site-v2/public/favicon-32x32.png +0 -0
- package/docs-site-v2/public/favicon.ico +0 -0
- package/docs-site-v2/public/index.css +4174 -0
- package/docs-site-v2/public/llms.txt +44 -0
- package/docs-site-v2/public/logo-dark.svg +8 -0
- package/docs-site-v2/public/logo.svg +8 -0
- package/{docs-site → docs-site-v2}/public/robots.txt +1 -6
- package/{docs-site → docs-site-v2}/public/site.webmanifest +1 -1
- package/{docs-site → docs-site-v2}/public/sitemap.xml +33 -12
- package/docs-site-v2/script-debugger/index.md +105 -0
- package/docs-site-v2/scripts/generate-llms.js +71 -0
- package/docs-site-v2/scripts/generate-sitemap.js +97 -0
- package/docs-site-v2/security/index.md +115 -0
- package/docs-site-v2/skills/index.md +40 -0
- package/docs-site-v2/tools/index.md +36 -0
- package/docs-site-v2/troubleshooting/index.md +204 -0
- package/eslint.config.js +3 -1
- package/memories/repo/docs-site-v2-build.json +11 -0
- package/package.json +18 -14
- package/scripts/validate-server-json.js +68 -0
- package/server.json +4 -6
- package/src/clients/agent-instructions-client.ts +370 -0
- package/src/clients/base/abstract-documentation-client.ts +405 -0
- package/src/clients/base/oauth-token.ts +52 -2
- package/src/clients/cartridge/cartridge-generation-client.ts +302 -0
- package/src/clients/cartridge/cartridge-structure.ts +37 -0
- package/src/clients/cartridge/cartridge-templates.ts +246 -0
- package/src/clients/cartridge/index.ts +6 -0
- package/src/clients/docs/documentation-scanner.ts +44 -28
- package/src/clients/docs-client.ts +54 -14
- package/src/clients/isml-client.ts +353 -0
- package/src/clients/ocapi/code-versions-client.ts +7 -1
- package/src/clients/ocapi-client.ts +11 -166
- package/src/clients/script-debugger/index.ts +5 -0
- package/src/clients/script-debugger/script-debugger-client.ts +754 -0
- package/src/clients/sfra-client.ts +134 -397
- package/src/config/configuration-factory.ts +6 -1
- package/src/config/dw-json-loader.ts +96 -15
- package/src/config/workspace-roots.ts +540 -0
- package/src/constants/index.ts +1 -0
- package/src/core/handlers/abstract-client-handler.ts +85 -0
- package/src/core/handlers/agent-instructions-handler.ts +48 -0
- package/src/core/handlers/base-handler.ts +17 -127
- package/src/core/handlers/cartridge-handler.ts +13 -33
- package/src/core/handlers/client-factory.ts +32 -2
- package/src/core/handlers/code-version-handler.ts +17 -32
- package/src/core/handlers/docs-handler.ts +12 -44
- package/src/core/handlers/isml-handler.ts +19 -0
- package/src/core/handlers/job-log-handler.ts +19 -8
- package/src/core/handlers/log-handler.ts +19 -8
- package/src/core/handlers/script-debugger-handler.ts +46 -0
- package/src/core/handlers/sfra-handler.ts +12 -44
- package/src/core/handlers/simple-client-handler.ts +78 -0
- package/src/core/handlers/system-object-handler.ts +17 -32
- package/src/core/handlers/validation-helpers.ts +87 -47
- package/src/core/instruction-advisor.ts +122 -0
- package/src/core/server.ts +178 -13
- package/src/core/tool-definitions.ts +25 -1071
- package/src/core/tool-schemas/agent-instruction-tools.ts +72 -0
- package/src/core/tool-schemas/cartridge-tools.ts +29 -0
- package/src/core/tool-schemas/code-version-tools.ts +28 -0
- package/src/core/tool-schemas/documentation-tools.ts +104 -0
- package/src/core/tool-schemas/index.ts +27 -0
- package/src/core/tool-schemas/isml-tools.ts +89 -0
- package/src/core/tool-schemas/log-tools.ts +196 -0
- package/src/core/tool-schemas/script-debugger-tools.ts +83 -0
- package/src/core/tool-schemas/sfra-tools.ts +65 -0
- package/src/core/tool-schemas/shared-schemas.ts +158 -0
- package/src/core/tool-schemas/system-object-tools.ts +127 -0
- package/src/main.ts +63 -30
- package/src/services/index.ts +4 -10
- package/src/tool-configs/agent-instructions-tool-config.ts +83 -0
- package/src/tool-configs/cartridge-tool-config.ts +1 -1
- package/src/tool-configs/code-version-tool-config.ts +0 -5
- package/src/tool-configs/docs-tool-config.ts +0 -7
- package/src/tool-configs/isml-tool-config.ts +87 -0
- package/src/tool-configs/job-log-tool-config.ts +18 -17
- package/src/tool-configs/log-tool-config.ts +49 -64
- package/src/tool-configs/script-debugger-tool-config.ts +69 -0
- package/src/tool-configs/sfra-tool-config.ts +0 -11
- package/src/tool-configs/system-object-tool-config.ts +0 -5
- package/src/types/types.ts +2 -0
- package/src/utils/cache.ts +49 -54
- package/src/utils/category-utils.ts +70 -0
- package/src/utils/log-tool-constants.ts +25 -17
- package/src/utils/logger.ts +38 -1
- package/src/utils/markdown-utils.ts +280 -0
- package/src/utils/path-resolver.ts +25 -9
- package/src/utils/path-validation.ts +113 -0
- package/tests/base-handler.test.ts +1 -1
- package/tests/cache.test.ts +2 -2
- package/tests/cartridge-handler.test.ts +4 -4
- package/tests/client-factory.test.ts +1 -1
- package/tests/code-version-handler.test.ts +3 -3
- package/tests/docs-handler.test.ts +2 -2
- package/tests/documentation-scanner.test.ts +4 -4
- package/tests/isml-client.test.ts +463 -0
- package/tests/isml-handler.test.ts +375 -0
- package/tests/job-log-handler.test.ts +1 -1
- package/tests/log-handler.test.ts +8 -8
- package/tests/log-validation.test.ts +149 -0
- package/tests/mcp/README.md +22 -18
- package/tests/mcp/node/activate-code-version-advanced.full-mode.programmatic.test.js +30 -12
- package/tests/mcp/node/evaluate-script.full-mode.programmatic.test.js +387 -0
- package/tests/mcp/node/generate-cartridge-structure.docs-only.programmatic.test.js +14 -8
- package/tests/mcp/node/get-isml-categories.programmatic.test.js +278 -0
- package/tests/mcp/node/get-isml-element.programmatic.test.js +278 -0
- package/tests/mcp/node/get-isml-elements-by-category.programmatic.test.js +363 -0
- package/tests/mcp/node/get-sfra-categories.docs-only.programmatic.test.js +24 -24
- package/tests/mcp/node/get-sfra-document.programmatic.test.js +4 -2
- package/tests/mcp/node/list-isml-elements.programmatic.test.js +311 -0
- package/tests/mcp/node/list-sfcc-classes.docs-only.programmatic.test.js +2 -33
- package/tests/mcp/node/search-isml-elements.programmatic.test.js +325 -0
- package/tests/mcp/node/search-sfcc-classes.docs-only.programmatic.test.js +5 -9
- package/tests/mcp/node/search-sfcc-methods.docs-only.programmatic.test.js +7 -9
- package/tests/mcp/node/tools.docs-only.programmatic.test.js +42 -65
- package/tests/mcp/node/tools.full-mode.programmatic.test.js +7 -8
- package/tests/mcp/yaml/activate-code-version.full-mode.test.mcp.yml +2 -2
- package/tests/mcp/yaml/evaluate-script.full-mode.test.mcp.yml +281 -0
- package/tests/mcp/yaml/get-isml-categories.docs-only.test.mcp.yml +330 -0
- package/tests/mcp/yaml/get-isml-element.docs-only.test.mcp.yml +294 -0
- package/tests/mcp/yaml/get-isml-elements-by-category.docs-only.test.mcp.yml +334 -0
- package/tests/mcp/yaml/get-sfcc-class-info.docs-only.test.mcp.yml +2 -2
- package/tests/mcp/yaml/get-sfra-categories.docs-only.test.mcp.yml +13 -13
- package/tests/mcp/yaml/get-sfra-categories.full-mode.test.mcp.yml +13 -13
- package/tests/mcp/yaml/get-system-object-definitions.docs-only.test.mcp.yml +1 -16
- package/tests/mcp/yaml/list-isml-elements.docs-only.test.mcp.yml +212 -0
- package/tests/mcp/yaml/search-isml-elements.docs-only.test.mcp.yml +312 -0
- package/tests/mcp/yaml/search-sfcc-classes.docs-only.test.mcp.yml +1 -1
- package/tests/mcp/yaml/search-sfcc-classes.full-mode.test.mcp.yml +1 -1
- package/tests/mcp/yaml/search-site-preferences.docs-only.test.mcp.yml +1 -1
- package/tests/mcp/yaml/tools.docs-only.test.mcp.yml +3 -57
- package/tests/mcp/yaml/tools.full-mode.test.mcp.yml +3 -3
- package/tests/oauth-token.test.ts +107 -12
- package/tests/ocapi-client.test.ts +53 -106
- package/tests/script-debugger-client.test.ts +430 -0
- package/tests/servers/sfcc-mock-server/src/app.js +15 -0
- package/tests/servers/sfcc-mock-server/src/routes/cartridge-webdav.js +258 -0
- package/tests/servers/sfcc-mock-server/src/routes/ocapi/debugger-handler.js +396 -0
- package/tests/servers/sfcc-mock-server/src/routes/ocapi.js +5 -0
- package/tests/servers/sfcc-mock-server/src/routes/storefront.js +86 -0
- package/tests/servers/sfcc-mock-server/src/routes/webdav.js +6 -4
- package/tests/validation-helpers.test.ts +0 -31
- package/tests/workspace-roots.test.ts +227 -0
- package/ai-instructions/claude-desktop/claude_custom_instructions.md +0 -321
- package/ai-instructions/cursor/.cursor/rules/debugging-workflows.mdc +0 -171
- package/ai-instructions/cursor/.cursor/rules/hooks-development.mdc +0 -168
- package/ai-instructions/cursor/.cursor/rules/isml-templates.mdc +0 -209
- package/ai-instructions/cursor/.cursor/rules/job-framework.mdc +0 -379
- package/ai-instructions/cursor/.cursor/rules/performance-optimization.mdc +0 -215
- package/ai-instructions/cursor/.cursor/rules/scapi-endpoints.mdc +0 -98
- package/ai-instructions/cursor/.cursor/rules/security-patterns.mdc +0 -375
- package/ai-instructions/cursor/.cursor/rules/sfcc-development.mdc +0 -144
- package/ai-instructions/cursor/.cursor/rules/sfra-controllers.mdc +0 -376
- package/ai-instructions/cursor/.cursor/rules/sfra-models.mdc +0 -412
- package/ai-instructions/cursor/.cursor/rules/system-objects.mdc +0 -383
- package/ai-instructions/cursor/.cursor/rules/testing-patterns.mdc +0 -418
- package/dist/clients/best-practices-client.d.ts +0 -57
- package/dist/clients/best-practices-client.d.ts.map +0 -1
- package/dist/clients/best-practices-client.js +0 -288
- package/dist/clients/best-practices-client.js.map +0 -1
- package/dist/clients/cartridge-generation-client.d.ts +0 -57
- package/dist/clients/cartridge-generation-client.d.ts.map +0 -1
- package/dist/clients/cartridge-generation-client.js +0 -384
- package/dist/clients/cartridge-generation-client.js.map +0 -1
- package/dist/clients/logs/index.d.ts +0 -13
- package/dist/clients/logs/index.d.ts.map +0 -1
- package/dist/clients/logs/index.js +0 -15
- package/dist/clients/logs/index.js.map +0 -1
- package/dist/clients/logs/log-analyzer.d.ts +0 -55
- package/dist/clients/logs/log-analyzer.d.ts.map +0 -1
- package/dist/clients/logs/log-analyzer.js +0 -228
- package/dist/clients/logs/log-analyzer.js.map +0 -1
- package/dist/clients/logs/log-client.d.ts +0 -87
- package/dist/clients/logs/log-client.d.ts.map +0 -1
- package/dist/clients/logs/log-client.js +0 -418
- package/dist/clients/logs/log-client.js.map +0 -1
- package/dist/clients/logs/log-constants.d.ts +0 -37
- package/dist/clients/logs/log-constants.d.ts.map +0 -1
- package/dist/clients/logs/log-constants.js +0 -37
- package/dist/clients/logs/log-constants.js.map +0 -1
- package/dist/clients/logs/log-file-discovery.d.ts +0 -62
- package/dist/clients/logs/log-file-discovery.d.ts.map +0 -1
- package/dist/clients/logs/log-file-discovery.js +0 -238
- package/dist/clients/logs/log-file-discovery.js.map +0 -1
- package/dist/clients/logs/log-file-reader.d.ts +0 -53
- package/dist/clients/logs/log-file-reader.d.ts.map +0 -1
- package/dist/clients/logs/log-file-reader.js +0 -194
- package/dist/clients/logs/log-file-reader.js.map +0 -1
- package/dist/clients/logs/log-formatter.d.ts +0 -90
- package/dist/clients/logs/log-formatter.d.ts.map +0 -1
- package/dist/clients/logs/log-formatter.js +0 -189
- package/dist/clients/logs/log-formatter.js.map +0 -1
- package/dist/clients/logs/log-processor.d.ts +0 -91
- package/dist/clients/logs/log-processor.d.ts.map +0 -1
- package/dist/clients/logs/log-processor.js +0 -328
- package/dist/clients/logs/log-processor.js.map +0 -1
- package/dist/clients/logs/log-types.d.ts +0 -69
- package/dist/clients/logs/log-types.d.ts.map +0 -1
- package/dist/clients/logs/log-types.js +0 -5
- package/dist/clients/logs/log-types.js.map +0 -1
- package/dist/clients/logs/webdav-client-manager.d.ts +0 -28
- package/dist/clients/logs/webdav-client-manager.d.ts.map +0 -1
- package/dist/clients/logs/webdav-client-manager.js +0 -77
- package/dist/clients/logs/webdav-client-manager.js.map +0 -1
- package/dist/core/handlers/abstract-log-tool-handler.d.ts +0 -35
- package/dist/core/handlers/abstract-log-tool-handler.d.ts.map +0 -1
- package/dist/core/handlers/abstract-log-tool-handler.js +0 -46
- package/dist/core/handlers/abstract-log-tool-handler.js.map +0 -1
- package/dist/core/handlers/best-practices-handler.d.ts +0 -17
- package/dist/core/handlers/best-practices-handler.d.ts.map +0 -1
- package/dist/core/handlers/best-practices-handler.js +0 -43
- package/dist/core/handlers/best-practices-handler.js.map +0 -1
- package/dist/core/handlers/job-log-tool-config.d.ts +0 -8
- package/dist/core/handlers/job-log-tool-config.d.ts.map +0 -1
- package/dist/core/handlers/job-log-tool-config.js +0 -76
- package/dist/core/handlers/job-log-tool-config.js.map +0 -1
- package/dist/core/handlers/log-tool-config.d.ts +0 -8
- package/dist/core/handlers/log-tool-config.d.ts.map +0 -1
- package/dist/core/handlers/log-tool-config.js +0 -73
- package/dist/core/handlers/log-tool-config.js.map +0 -1
- package/dist/docs/best-practices/isml_templates.md +0 -1933
- package/dist/docs/best-practices/job_framework.md +0 -1173
- package/dist/docs/best-practices/scapi_custom_endpoint.md +0 -963
- package/dist/docs/best-practices/sfra_client_side_js.md +0 -736
- package/dist/docs/best-practices/sfra_models.md +0 -1142
- package/dist/tool-configs/best-practices-tool-config.d.ts +0 -11
- package/dist/tool-configs/best-practices-tool-config.d.ts.map +0 -1
- package/dist/tool-configs/best-practices-tool-config.js +0 -59
- package/dist/tool-configs/best-practices-tool-config.js.map +0 -1
- package/dist/utils/job-log-tool-config.d.ts +0 -8
- package/dist/utils/job-log-tool-config.d.ts.map +0 -1
- package/dist/utils/job-log-tool-config.js +0 -76
- package/dist/utils/job-log-tool-config.js.map +0 -1
- package/dist/utils/job-log-utils.d.ts +0 -34
- package/dist/utils/job-log-utils.d.ts.map +0 -1
- package/dist/utils/job-log-utils.js +0 -60
- package/dist/utils/job-log-utils.js.map +0 -1
- package/dist/utils/log-cache.d.ts +0 -53
- package/dist/utils/log-cache.d.ts.map +0 -1
- package/dist/utils/log-cache.js +0 -114
- package/dist/utils/log-cache.js.map +0 -1
- package/dist/utils/log-tool-config.d.ts +0 -8
- package/dist/utils/log-tool-config.d.ts.map +0 -1
- package/dist/utils/log-tool-config.js +0 -73
- package/dist/utils/log-tool-config.js.map +0 -1
- package/dist/utils/log-tool-utils.d.ts +0 -39
- package/dist/utils/log-tool-utils.d.ts.map +0 -1
- package/dist/utils/log-tool-utils.js +0 -94
- package/dist/utils/log-tool-utils.js.map +0 -1
- package/docs/best-practices/isml_templates.md +0 -1933
- package/docs/best-practices/job_framework.md +0 -1173
- package/docs/best-practices/scapi_custom_endpoint.md +0 -963
- package/docs/best-practices/sfra_client_side_js.md +0 -736
- package/docs/best-practices/sfra_models.md +0 -1142
- package/docs-site/App.tsx +0 -103
- package/docs-site/README.md +0 -113
- package/docs-site/components/Badge.tsx +0 -38
- package/docs-site/components/BreadcrumbSchema.tsx +0 -34
- package/docs-site/components/CodeBlock.tsx +0 -132
- package/docs-site/components/Collapsible.tsx +0 -40
- package/docs-site/components/ConfigBuilder.tsx +0 -118
- package/docs-site/components/ConfigHero.tsx +0 -19
- package/docs-site/components/ConfigModeTabs.tsx +0 -42
- package/docs-site/components/Layout.tsx +0 -174
- package/docs-site/components/LightCodeContainer.tsx +0 -44
- package/docs-site/components/NewcomerCTA.tsx +0 -57
- package/docs-site/components/NextStepsStrip.tsx +0 -23
- package/docs-site/components/OnThisPage.tsx +0 -91
- package/docs-site/components/SEO.tsx +0 -79
- package/docs-site/components/Search.tsx +0 -207
- package/docs-site/components/Sidebar.tsx +0 -96
- package/docs-site/components/StructuredData.tsx +0 -72
- package/docs-site/components/ToolCard.tsx +0 -84
- package/docs-site/components/ToolFilters.tsx +0 -39
- package/docs-site/components/Typography.tsx +0 -30
- package/docs-site/components/VersionBadge.tsx +0 -18
- package/docs-site/components/icons.tsx +0 -37
- package/docs-site/constants.tsx +0 -34
- package/docs-site/index.html +0 -62
- package/docs-site/main.tsx +0 -16
- package/docs-site/metadata.json +0 -5
- package/docs-site/package-lock.json +0 -3966
- package/docs-site/package.json +0 -35
- package/docs-site/pages/AIInterfacesPage.tsx +0 -610
- package/docs-site/pages/ConfigurationPage.tsx +0 -315
- package/docs-site/pages/DevelopmentPage.tsx +0 -607
- package/docs-site/pages/ExamplesPage.tsx +0 -558
- package/docs-site/pages/FeaturesPage.tsx +0 -353
- package/docs-site/pages/HomePage.tsx +0 -1046
- package/docs-site/pages/SecurityPage.tsx +0 -372
- package/docs-site/pages/ToolsPage.tsx +0 -205
- package/docs-site/pages/TroubleshootingPage.tsx +0 -590
- package/docs-site/postcss.config.js +0 -6
- package/docs-site/public/.well-known/security.txt +0 -6
- package/docs-site/public/android-chrome-192x192.png +0 -0
- package/docs-site/public/android-chrome-512x512.png +0 -0
- package/docs-site/public/apple-touch-icon.png +0 -0
- package/docs-site/public/favicon-16x16.png +0 -0
- package/docs-site/public/favicon-32x32.png +0 -0
- package/docs-site/public/favicon.ico +0 -0
- package/docs-site/public/llms.txt +0 -47
- package/docs-site/scripts/generate-search-index.js +0 -323
- package/docs-site/scripts/generate-sitemap.js +0 -156
- package/docs-site/scripts/search-dev.js +0 -112
- package/docs-site/src/styles/input.css +0 -248
- package/docs-site/src/styles/prism-theme.css +0 -124
- package/docs-site/tailwind.config.js +0 -70
- package/docs-site/tsconfig.json +0 -29
- package/docs-site/types.ts +0 -16
- package/docs-site/utils/search.ts +0 -132
- package/docs-site/utils/toolsData.ts +0 -116
- package/docs-site/vite.config.ts +0 -63
- package/src/clients/best-practices-client.ts +0 -332
- package/src/clients/cartridge-generation-client.ts +0 -507
- package/src/clients/logs/index.ts +0 -18
- package/src/clients/logs/log-analyzer.ts +0 -289
- package/src/clients/logs/log-client.ts +0 -540
- package/src/clients/logs/log-constants.ts +0 -53
- package/src/clients/logs/log-file-discovery.ts +0 -299
- package/src/clients/logs/log-file-reader.ts +0 -227
- package/src/clients/logs/log-formatter.ts +0 -258
- package/src/clients/logs/log-processor.ts +0 -402
- package/src/clients/logs/log-types.ts +0 -80
- package/src/clients/logs/webdav-client-manager.ts +0 -93
- package/src/core/handlers/abstract-log-tool-handler.ts +0 -64
- package/src/core/handlers/best-practices-handler.ts +0 -55
- package/src/core/handlers/job-log-tool-config.ts +0 -89
- package/src/core/handlers/log-tool-config.ts +0 -98
- package/src/tool-configs/best-practices-tool-config.ts +0 -68
- package/src/utils/job-log-tool-config.ts +0 -89
- package/src/utils/job-log-utils.ts +0 -78
- package/src/utils/log-cache.ts +0 -134
- package/src/utils/log-tool-config.ts +0 -98
- package/src/utils/log-tool-utils.ts +0 -122
- package/tests/best-practices-handler.test.ts +0 -236
- package/tests/job-log-utils.test.ts +0 -182
- package/tests/mcp/node/get-available-best-practice-guides.docs-only.programmatic.test.js +0 -516
- package/tests/mcp/node/get-best-practice-guide.docs-only.programmatic.test.js +0 -733
- package/tests/mcp/node/get-hook-reference.docs-only.programmatic.test.js +0 -185
- package/tests/mcp/node/search-best-practices.docs-only.programmatic.test.js +0 -836
- package/tests/mcp/yaml/get-available-best-practice-guides.docs-only.test.mcp.yml +0 -885
- package/tests/mcp/yaml/get-available-best-practice-guides.full-mode.test.mcp.yml +0 -885
- package/tests/mcp/yaml/get-best-practice-guide.docs-only.test.mcp.yml +0 -462
- package/tests/mcp/yaml/get-best-practice-guide.full-mode.test.mcp.yml +0 -462
- package/tests/mcp/yaml/get-hook-reference.docs-only.test.mcp.yml +0 -321
- package/tests/mcp/yaml/get-hook-reference.full-mode.test.mcp.yml +0 -321
- package/tests/mcp/yaml/search-best-practices.docs-only.test.mcp.yml +0 -655
- package/tests/mcp/yaml/search-best-practices.full-mode.test.mcp.yml +0 -655
- /package/{docs-site → docs-site-v2}/public/404.html +0 -0
- /package/{docs-site → docs-site-v2}/public/explain-product-pricing-methods-no-mcp.png +0 -0
- /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.
|