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
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sfcc-caching
|
|
3
|
+
description: Unified caching playbook for SFCC (page cache vs custom cache vs service response cache). Use this when improving performance, reducing external calls, designing cache keys/TTLs, or debugging stale cache behavior.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SFCC Caching (Unified Playbook)
|
|
7
|
+
|
|
8
|
+
Caching in SFCC has multiple layers. The most common failures come from:
|
|
9
|
+
- choosing the wrong cache layer
|
|
10
|
+
- unsafe population patterns
|
|
11
|
+
- invalidation assumptions (multi-node)
|
|
12
|
+
- caching the wrong data types (heavy API objects)
|
|
13
|
+
|
|
14
|
+
## Quick Checklist
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
[ ] Choose cache layer: page cache (HTML) vs custom cache (data) vs service response cache
|
|
18
|
+
[ ] Design keys with site + locale scoping where needed
|
|
19
|
+
[ ] Use atomic get-or-load patterns (avoid double loaders)
|
|
20
|
+
[ ] Cache POJOs/DTOs, not dw.* API objects
|
|
21
|
+
[ ] Treat cache values as immutable snapshots; re-put updated copies
|
|
22
|
+
[ ] Design around TTL, not cross-node invalidation
|
|
23
|
+
[ ] Monitor hit ratios and write failures in Business Manager
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Cache Layers (Pick the Right Tool)
|
|
27
|
+
|
|
28
|
+
| Layer | What it caches | When to use |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| Page cache | Rendered responses / fragments | High-traffic pages where output can be cached |
|
|
31
|
+
| Custom cache (`CacheMgr`) | Application data | Expensive computations, repeated DB lookups, third-party responses |
|
|
32
|
+
| Service response cache | HTTP responses inside service framework | Repeated calls to stable third-party APIs |
|
|
33
|
+
|
|
34
|
+
## Scope: request vs session vs CacheMgr
|
|
35
|
+
|
|
36
|
+
- `request.custom`: per-request scratchpad
|
|
37
|
+
- `session.custom` / `session.privacy`: per-user, per-session data (keep small)
|
|
38
|
+
- `CacheMgr`: app-server local cache shared by users on the same node
|
|
39
|
+
|
|
40
|
+
Never store user-specific data in a global custom cache.
|
|
41
|
+
|
|
42
|
+
## Custom Cache Mechanics (Non-Negotiable Rules)
|
|
43
|
+
|
|
44
|
+
### 1) Define caches in `caches.json` and register in cartridge `package.json`
|
|
45
|
+
- Cache IDs must be globally unique across the cartridge path.
|
|
46
|
+
- The `package.json` that declares `"caches"` must live in the cartridge root (cartridges/{{mycartridge}}/package.json), and the `caches.json` path is relative to that.
|
|
47
|
+
|
|
48
|
+
### 2) Use atomic “get-or-load”
|
|
49
|
+
Prefer `cache.get(key, loader)` (single step). Avoid:
|
|
50
|
+
- `if (!cache.get(key)) cache.put(key, load())`
|
|
51
|
+
|
|
52
|
+
### 3) Cache POJOs, not API objects
|
|
53
|
+
Don’t cache `dw.catalog.Product`, `dw.order.Order`, etc.
|
|
54
|
+
Map to a lightweight object with only the fields you need.
|
|
55
|
+
|
|
56
|
+
### 4) Treat cached values as immutable
|
|
57
|
+
Values returned by `cache.get` are immutable copies. Do not mutate them in-place.
|
|
58
|
+
If you need to update cached data, write a new object back with `cache.put(key, newValue)`.
|
|
59
|
+
|
|
60
|
+
### 5) TTL over invalidation
|
|
61
|
+
Per-key invalidation across all nodes is unreliable.
|
|
62
|
+
Design for a small staleness window using `expireAfterSeconds`.
|
|
63
|
+
|
|
64
|
+
### 6) Watch size limits and monitoring
|
|
65
|
+
- Large entries can fail to store without throwing exceptions.
|
|
66
|
+
- Use Business Manager stats (hit ratio, write failures) to validate effectiveness.
|
|
67
|
+
|
|
68
|
+
## Service Response Caching (LocalServiceRegistry)
|
|
69
|
+
|
|
70
|
+
If your third-party data is stable for short periods:
|
|
71
|
+
- Enable response caching on the underlying HTTP client in the service definition
|
|
72
|
+
- Ensure you understand how to clear it (BM invalidation is typically global)
|
|
73
|
+
|
|
74
|
+
Key warnings:
|
|
75
|
+
- stale data risk
|
|
76
|
+
- debugging surprises (you may not hit the network)
|
|
77
|
+
- cached calls can still affect service stats / circuit breakers
|
|
78
|
+
|
|
79
|
+
## References
|
|
80
|
+
- Rhino Inquisitor: Field Guide to Custom Caches
|
|
81
|
+
- https://www.rhino-inquisitor.com/field-guide-to-custom-caches-in-sfcc/
|
|
82
|
+
- Rhino Inquisitor: Third-Party API Caching in Commerce Cloud
|
|
83
|
+
- https://www.rhino-inquisitor.com/third-party-api-caching-in-commerce-cloud/
|
|
84
|
+
- SFCC Docs: Custom Caches
|
|
85
|
+
- https://developer.salesforce.com/docs/commerce/b2c-commerce/guide/b2c-custom-caches.html
|
|
86
|
+
- SFCC Script API: `dw.system.Cache` (immutable copies + value constraints)
|
|
87
|
+
- https://salesforcecommercecloud.github.io/b2c-dev-doc/docs/current/scriptapi/html/api/class_dw_system_Cache.html
|
|
88
|
+
- SFCC Script API: `dw.system.CacheMgr` (cartridge `package.json` cache registration)
|
|
89
|
+
- https://salesforcecommercecloud.github.io/b2c-dev-doc/docs/current/scriptapi/html/api/class_dw_system_CacheMgr.html
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sfcc-cartridge-development
|
|
3
|
+
description: Guide for creating, configuring, and deploying custom SFRA cartridges in Salesforce B2C Commerce. Use this when asked to create a new cartridge, set up a cartridge structure, or work with cartridge paths.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# Instructions for Creating a Salesforce B2C Commerce (SFRA) Cartridge
|
|
2
7
|
|
|
3
8
|
This document provides instructions to create, configure, and deploy a new custom cartridge for Salesforce B2C Commerce using the Storefront Reference Architecture (SFRA).
|
|
4
9
|
|
|
5
|
-
**NOTE**: When doing this, also
|
|
10
|
+
**NOTE**: When doing this, also consult the **sfcc-sfra-controllers** skill for controller development patterns and the **sfcc-performance** skill to ensure your cartridge follows performance optimization strategies and coding standards.
|
|
6
11
|
|
|
7
12
|
## 1. Core Principles
|
|
8
13
|
|
|
@@ -60,6 +65,7 @@ dw.json
|
|
|
60
65
|
webpack.config.js
|
|
61
66
|
cartridges/
|
|
62
67
|
└── plugin_my_custom_cartridge/
|
|
68
|
+
|── package.json
|
|
63
69
|
└── cartridge/
|
|
64
70
|
├── client/
|
|
65
71
|
│ └── default/
|
|
@@ -79,6 +85,25 @@ Optional but common directories:
|
|
|
79
85
|
- `cartridge/scripts/jobs/`: Scripts for automated tasks scheduled in Business Manager.
|
|
80
86
|
- `cartridge/properties/`: Localization string files (.properties).
|
|
81
87
|
|
|
88
|
+
## 4.1 Cartridge `package.json` Capabilities (Often Missed)
|
|
89
|
+
|
|
90
|
+
Beyond basic metadata, `package.json` can declare cartridge-owned configuration files that the platform consumes.
|
|
91
|
+
The `package.json` must be in the cartridge root (cartridges/{{mycartridge}}/package.json), and paths are relative to that.
|
|
92
|
+
|
|
93
|
+
- **Hooks**: add a `hooks` entry pointing to your `hooks.json` (commonly under `cartridge/scripts/hooks.json`).
|
|
94
|
+
- **Custom Caches**: add a `caches` entry pointing to `caches.json` so `CacheMgr.getCache('<id>')` can resolve your cache.
|
|
95
|
+
- **Custom SCAPI APIs**: custom endpoints live under `cartridge/rest-apis/{api-name}/` (with `schema.yaml`, `script.js`, `api.json`).
|
|
96
|
+
|
|
97
|
+
Example snippet:
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"name": "plugin_my_custom_cartridge",
|
|
102
|
+
"hooks": "./cartridge/scripts/hooks.json",
|
|
103
|
+
"caches": "./caches.json"
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
82
107
|
## 5. Creating a New Cartridge
|
|
83
108
|
|
|
84
109
|
### Step 1: Generate the Cartridge Structure
|
|
@@ -86,7 +111,7 @@ Optional but common directories:
|
|
|
86
111
|
!IMPORTANT!: Always do this step, don't attempt to create the cartridge structure manually. The MCP server ensures all necessary files and configurations are created correctly.
|
|
87
112
|
|
|
88
113
|
**Using MCP Server (Recommended)**
|
|
89
|
-
Use the `generate_cartridge_structure` tool from
|
|
114
|
+
Use the `generate_cartridge_structure` tool from the sfcc-dev-mcp server to automatically create the cartridge structure:
|
|
90
115
|
|
|
91
116
|
```json
|
|
92
117
|
{
|
|
@@ -190,14 +215,13 @@ For continuous development, use `npm run watch`.
|
|
|
190
215
|
|
|
191
216
|
## 9. MCP Integration Workflow
|
|
192
217
|
|
|
193
|
-
When using
|
|
218
|
+
When using the sfcc-dev-mcp server for cartridge development, follow this enhanced workflow:
|
|
194
219
|
|
|
195
220
|
1. **Generate Cartridge Structure**: Use the `generate_cartridge_structure` tool to create the initial cartridge with all necessary files and configurations
|
|
196
|
-
2. **
|
|
221
|
+
2. **Consult Skills**: Use the relevant skills for controller development patterns (sfcc-sfra-controllers), security (sfcc-security), and performance (sfcc-performance)
|
|
197
222
|
3. **Search Documentation**: Use `search_sfcc_classes` and `get_sfcc_class_info` for API reference
|
|
198
|
-
4. **
|
|
199
|
-
5. **
|
|
200
|
-
6. **Handle Deployment Issues**: If new cartridge features (jobs, SCAPI endpoints, hooks) don't appear after upload:
|
|
223
|
+
4. **Debug Issues**: Use log analysis tools to troubleshoot deployment or runtime issues
|
|
224
|
+
5. **Handle Deployment Issues**: If new cartridge features (jobs, SCAPI endpoints, hooks) don't appear after upload:
|
|
201
225
|
- **Check Code Versions**: Use `get_code_versions` tool to see available versions
|
|
202
226
|
- **Activate Version**: Use `activate_code_version` tool to ensure proper registration
|
|
203
227
|
- **Alternative**: Manually switch code versions in Business Manager (Administration > Site Development > Code Deployment)
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sfcc-forms-development
|
|
3
|
+
description: Guide for building, validating, securing, and persisting SFCC storefront forms (SFRA + SiteGenesis patterns). Use this when creating or troubleshooting form XML, controller handling, CSRF, and validation.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SFCC Forms Development Skill
|
|
7
|
+
|
|
8
|
+
This skill guides you through implementing and troubleshooting the Salesforce B2C Commerce Forms Framework.
|
|
9
|
+
|
|
10
|
+
It covers:
|
|
11
|
+
- XML form definitions (schema, constraints, localization, reuse)
|
|
12
|
+
- Controller patterns (SFRA middleware, request handling, persistence)
|
|
13
|
+
- Secure validation (server-side first, CSRF/XSS protections)
|
|
14
|
+
- Migration guidance (SiteGenesis ➜ SFRA)
|
|
15
|
+
|
|
16
|
+
## When to Use
|
|
17
|
+
|
|
18
|
+
Use this skill when you need to:
|
|
19
|
+
- Create or modify a form definition in `cartridge/forms/**`.
|
|
20
|
+
- Render forms in ISML using the platform’s generated field metadata.
|
|
21
|
+
- Process POST submissions safely (CSRF, server-side validation, transactions).
|
|
22
|
+
- Add custom validation beyond XML constraints.
|
|
23
|
+
- Migrate legacy SiteGenesis form flows to SFRA.
|
|
24
|
+
|
|
25
|
+
## Quick Checklist (Production-Grade Forms)
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
[ ] Form routes are POST-only and HTTPS-only
|
|
29
|
+
[ ] CSRF token is generated on GET and validated on POST
|
|
30
|
+
[ ] Server-side validation gate exists (do not trust client validation)
|
|
31
|
+
[ ] All string fields have max-length (DoS & storage safety)
|
|
32
|
+
[ ] Regex is conservative (avoid catastrophic backtracking)
|
|
33
|
+
[ ] Persistence happens inside Transaction.wrap
|
|
34
|
+
[ ] SFRA persistence is isolated in route:BeforeComplete where appropriate
|
|
35
|
+
[ ] Explicit mapping for writes (avoid mass assignment)
|
|
36
|
+
[ ] Form state cleared when appropriate (pre-render or after success)
|
|
37
|
+
[ ] User-provided values are output-encoded in ISML
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## File Locations
|
|
41
|
+
|
|
42
|
+
### Form XML
|
|
43
|
+
|
|
44
|
+
Forms are defined per cartridge:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
/my-cartridge
|
|
48
|
+
/cartridge
|
|
49
|
+
/forms
|
|
50
|
+
/default
|
|
51
|
+
profile.xml
|
|
52
|
+
contact.xml
|
|
53
|
+
/de_DE
|
|
54
|
+
profile.xml
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Form Labels + Error Messages (Localization)
|
|
58
|
+
|
|
59
|
+
Resource bundles typically live in:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
/my-cartridge
|
|
63
|
+
/cartridge
|
|
64
|
+
/templates
|
|
65
|
+
/resources
|
|
66
|
+
forms.properties
|
|
67
|
+
forms_de_DE.properties
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Architecture Notes (Know the Moving Parts)
|
|
71
|
+
|
|
72
|
+
- Form XML is a strict server-side contract: it defines types, constraints, and errors.
|
|
73
|
+
- Form instances are stored in session scope (stateful across requests) and must be cleared deliberately.
|
|
74
|
+
- Client-side validation is UX; server-side validation is authoritative.
|
|
75
|
+
|
|
76
|
+
For deeper context and SFRA vs SiteGenesis architectural differences, see:
|
|
77
|
+
- [references/ARCHITECTURE-SGJC-SFRA.md](references/ARCHITECTURE-SGJC-SFRA.md)
|
|
78
|
+
|
|
79
|
+
## Form Definition (XML)
|
|
80
|
+
|
|
81
|
+
### Minimal Example
|
|
82
|
+
|
|
83
|
+
Keep examples small, but always include:
|
|
84
|
+
- strict types
|
|
85
|
+
- max-length for strings
|
|
86
|
+
- mandatory + missing-error where needed
|
|
87
|
+
- parse/range errors for format/constraint enforcement
|
|
88
|
+
|
|
89
|
+
```xml
|
|
90
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
91
|
+
<form xmlns="http://www.demandware.com/xml/form/2008-04-19">
|
|
92
|
+
<field formid="email" type="string"
|
|
93
|
+
label="form.email.label"
|
|
94
|
+
mandatory="true"
|
|
95
|
+
max-length="254"
|
|
96
|
+
regexp="^[^@\s]+@[^@\s]+\.[^@\s]+$"
|
|
97
|
+
missing-error="form.email.required"
|
|
98
|
+
parse-error="form.email.invalid"/>
|
|
99
|
+
|
|
100
|
+
<action formid="submit" valid-form="true"/>
|
|
101
|
+
</form>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Reuse and Modularity
|
|
105
|
+
|
|
106
|
+
Prefer `include` to avoid duplicating complex groups (e.g., an address group reused in checkout, profile, and gift registry).
|
|
107
|
+
|
|
108
|
+
See the cheat sheet:
|
|
109
|
+
- [references/FORM-XML-CHEATSHEET.md](references/FORM-XML-CHEATSHEET.md)
|
|
110
|
+
|
|
111
|
+
## Controller Patterns
|
|
112
|
+
|
|
113
|
+
### SFRA: Render Form (GET)
|
|
114
|
+
|
|
115
|
+
Goals:
|
|
116
|
+
- clear stale state when rendering an “empty” form
|
|
117
|
+
- generate a CSRF token
|
|
118
|
+
|
|
119
|
+
```javascript
|
|
120
|
+
'use strict';
|
|
121
|
+
|
|
122
|
+
var server = require('server');
|
|
123
|
+
var csrfProtection = require('*/cartridge/scripts/middleware/csrf');
|
|
124
|
+
|
|
125
|
+
server.get('Show',
|
|
126
|
+
server.middleware.https,
|
|
127
|
+
csrfProtection.generateToken,
|
|
128
|
+
function (req, res, next) {
|
|
129
|
+
var form = server.forms.getForm('contact');
|
|
130
|
+
form.clear();
|
|
131
|
+
|
|
132
|
+
res.render('forms/contact', {
|
|
133
|
+
contactForm: form
|
|
134
|
+
});
|
|
135
|
+
next();
|
|
136
|
+
}
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
module.exports = server.exports();
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### SFRA: Handle Submission (POST)
|
|
143
|
+
|
|
144
|
+
Goals:
|
|
145
|
+
- validate CSRF first
|
|
146
|
+
- gate all business logic on `form.valid`
|
|
147
|
+
- isolate DB writes inside `Transaction.wrap`
|
|
148
|
+
- prefer `route:BeforeComplete` for persistence to keep transaction boundaries tight
|
|
149
|
+
|
|
150
|
+
```javascript
|
|
151
|
+
'use strict';
|
|
152
|
+
|
|
153
|
+
var server = require('server');
|
|
154
|
+
var Transaction = require('dw/system/Transaction');
|
|
155
|
+
var csrfProtection = require('*/cartridge/scripts/middleware/csrf');
|
|
156
|
+
|
|
157
|
+
server.post('Submit',
|
|
158
|
+
server.middleware.https,
|
|
159
|
+
csrfProtection.validateRequest,
|
|
160
|
+
function (req, res, next) {
|
|
161
|
+
var form = server.forms.getForm('contact');
|
|
162
|
+
|
|
163
|
+
if (!form.valid) {
|
|
164
|
+
// SFRA base commonly provides a helper like */cartridge/scripts/formErrors.
|
|
165
|
+
// Prefer using it when available.
|
|
166
|
+
res.json({
|
|
167
|
+
success: false,
|
|
168
|
+
fieldErrors: getFormErrorsSafe(form)
|
|
169
|
+
});
|
|
170
|
+
return next();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
var email = form.email.value;
|
|
174
|
+
var message = form.message && form.message.value;
|
|
175
|
+
|
|
176
|
+
this.on('route:BeforeComplete', function () {
|
|
177
|
+
Transaction.wrap(function () {
|
|
178
|
+
// Persist explicitly (no mass assignment)
|
|
179
|
+
// e.g. save a Custom Object, update profile, create a case, etc.
|
|
180
|
+
// Keep only assignments inside the transaction.
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
form.clear();
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
res.json({ success: true });
|
|
187
|
+
next();
|
|
188
|
+
}
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
function getFormErrorsSafe(form) {
|
|
192
|
+
try {
|
|
193
|
+
var formErrors = require('*/cartridge/scripts/formErrors');
|
|
194
|
+
if (formErrors && typeof formErrors.getFormErrors === 'function') {
|
|
195
|
+
return formErrors.getFormErrors(form);
|
|
196
|
+
}
|
|
197
|
+
} catch (e) {
|
|
198
|
+
// Optional dependency; fall back if not present.
|
|
199
|
+
}
|
|
200
|
+
return {};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
module.exports = server.exports();
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Notes:
|
|
207
|
+
- Use `csrfProtection.validateAjaxRequest` if your route expects AJAX conventions.
|
|
208
|
+
- Keep transactions short: no remote API calls, no heavy computation inside `Transaction.wrap`.
|
|
209
|
+
|
|
210
|
+
### SiteGenesis (SGJC): Key Differences
|
|
211
|
+
|
|
212
|
+
- Form is typically accessed via `app.getForm('id')` and rendered via `pdict.CurrentForms`.
|
|
213
|
+
- Templates must use generated `htmlName` (SiteGenesis uses `dwfrm_` prefixes + session-specific IDs).
|
|
214
|
+
- CSRF is often handled manually via `dw.web.CSRFProtection`.
|
|
215
|
+
|
|
216
|
+
Use this for migration and pitfalls:
|
|
217
|
+
- [references/ARCHITECTURE-SGJC-SFRA.md](references/ARCHITECTURE-SGJC-SFRA.md)
|
|
218
|
+
|
|
219
|
+
## ISML Rendering Rules
|
|
220
|
+
|
|
221
|
+
### Always Use Generated Field Metadata
|
|
222
|
+
|
|
223
|
+
- Prefer `field.htmlName` over hardcoded names.
|
|
224
|
+
- Use server-provided `pdict.csrf.*` when using SFRA CSRF middleware.
|
|
225
|
+
|
|
226
|
+
Typical SFRA token:
|
|
227
|
+
|
|
228
|
+
```html
|
|
229
|
+
<input type="hidden" name="${pdict.csrf.tokenName}" value="${pdict.csrf.token}" />
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### XSS Safety
|
|
233
|
+
|
|
234
|
+
When outputting user-provided values, ensure the context is encoded (default output encoding is usually safe, but be deliberate):
|
|
235
|
+
|
|
236
|
+
```html
|
|
237
|
+
<isprint value="${pdict.contactForm.email.value}" encoding="htmlcontent" />
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Custom Validation
|
|
241
|
+
|
|
242
|
+
Use custom validation for business rules that XML cannot express (uniqueness checks, cross-field constraints, etc.).
|
|
243
|
+
|
|
244
|
+
Patterns:
|
|
245
|
+
- Field-level: invalidate a specific field.
|
|
246
|
+
- Group-level: invalidate the group for cross-field rules.
|
|
247
|
+
- Form-level: invalidate the form for global errors.
|
|
248
|
+
|
|
249
|
+
Keep custom validation server-side. Client-side validation is optional and must never be the security gate.
|
|
250
|
+
|
|
251
|
+
## Related Skills
|
|
252
|
+
|
|
253
|
+
- `sfcc-security` (CSRF, XSS, input validation)
|
|
254
|
+
- `sfcc-sfra-controllers` (middleware patterns, response handling)
|
|
255
|
+
- `sfcc-isml-development` (safe output encoding, template constraints)
|
|
256
|
+
- `sfcc-localization` (resource bundles, locale fallback)
|
|
257
|
+
|
|
258
|
+
## References
|
|
259
|
+
|
|
260
|
+
- [references/FORM-XML-CHEATSHEET.md](references/FORM-XML-CHEATSHEET.md)
|
|
261
|
+
- [references/ARCHITECTURE-SGJC-SFRA.md](references/ARCHITECTURE-SGJC-SFRA.md)
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Advanced SFCC Forms Architecture (SiteGenesis vs SFRA)
|
|
2
|
+
|
|
3
|
+
This reference is for architects and senior devs designing or migrating form flows (login, registration, checkout, account, complex configuration).
|
|
4
|
+
|
|
5
|
+
## 1) Architectural Foundations
|
|
6
|
+
|
|
7
|
+
The SFCC Forms Framework is not “just HTML forms.” It is a stateful, server-side framework that:
|
|
8
|
+
- instantiates a form object from XML definitions
|
|
9
|
+
- maintains state across requests (session-scoped)
|
|
10
|
+
- enforces server-side type/constrain validation
|
|
11
|
+
- supports complex multi-step flows
|
|
12
|
+
|
|
13
|
+
### XML Form Definition = Server-Side Contract
|
|
14
|
+
|
|
15
|
+
Form XML defines:
|
|
16
|
+
- structure (fields/groups/lists)
|
|
17
|
+
- parsing rules + constraints
|
|
18
|
+
- resource keys (labels + errors)
|
|
19
|
+
- action-level validation behavior
|
|
20
|
+
|
|
21
|
+
Treat it like a schema contract between templates and controllers.
|
|
22
|
+
|
|
23
|
+
## 2) Form Object Lifecycle
|
|
24
|
+
|
|
25
|
+
- Form instances are stored in session scope.
|
|
26
|
+
- State persists unless cleared.
|
|
27
|
+
- Locale changes can invalidate/clear session form values.
|
|
28
|
+
|
|
29
|
+
Operational rules:
|
|
30
|
+
- Clear before rendering a “fresh” form.
|
|
31
|
+
- Clear after successful submission to prevent resubmission and leakage.
|
|
32
|
+
|
|
33
|
+
## 3) Validation Strategy (Defense in Depth)
|
|
34
|
+
|
|
35
|
+
### Client-side validation
|
|
36
|
+
|
|
37
|
+
- Purpose: UX and immediate feedback.
|
|
38
|
+
- Security: none (can be bypassed).
|
|
39
|
+
|
|
40
|
+
### Server-side validation
|
|
41
|
+
|
|
42
|
+
- Authoritative gate.
|
|
43
|
+
- Runs against XML constraints automatically.
|
|
44
|
+
|
|
45
|
+
Per-field precedence (typical):
|
|
46
|
+
1. parsing/type/regexp
|
|
47
|
+
2. mandatory
|
|
48
|
+
3. range/length bounds
|
|
49
|
+
4. custom invalidation
|
|
50
|
+
|
|
51
|
+
## 4) Security Architecture
|
|
52
|
+
|
|
53
|
+
### CSRF
|
|
54
|
+
|
|
55
|
+
Use the platform’s synchronizer token pattern correctly:
|
|
56
|
+
- Generate token on form render.
|
|
57
|
+
- Require token on any state-changing POST.
|
|
58
|
+
|
|
59
|
+
SFRA:
|
|
60
|
+
- Use CSRF middleware (`generateToken` on GET; `validateRequest` / `validateAjaxRequest` on POST).
|
|
61
|
+
|
|
62
|
+
SiteGenesis:
|
|
63
|
+
- Use `dw.web.CSRFProtection` explicitly (validate early, before processing).
|
|
64
|
+
|
|
65
|
+
### XSS
|
|
66
|
+
|
|
67
|
+
Forms are major injection vectors.
|
|
68
|
+
|
|
69
|
+
Rule:
|
|
70
|
+
- Always output-encode user-provided values in ISML.
|
|
71
|
+
|
|
72
|
+
When rendering user data, prefer explicit encoding contexts (e.g., HTML content).
|
|
73
|
+
|
|
74
|
+
### DoS / Payload abuse
|
|
75
|
+
|
|
76
|
+
- Always set `max-length` on string fields.
|
|
77
|
+
- Avoid expensive regex patterns.
|
|
78
|
+
- Keep server-side validation and error generation efficient.
|
|
79
|
+
|
|
80
|
+
## 5) Persistence and Transaction Management
|
|
81
|
+
|
|
82
|
+
All writes to persistent objects must occur inside a transaction:
|
|
83
|
+
- Use `dw.system.Transaction.wrap`.
|
|
84
|
+
|
|
85
|
+
Guidelines:
|
|
86
|
+
- Keep transactions short.
|
|
87
|
+
- Do not do network calls inside transactions.
|
|
88
|
+
- Map values explicitly when persisting (avoid mass assignment).
|
|
89
|
+
|
|
90
|
+
### SFRA: route:BeforeComplete pattern
|
|
91
|
+
|
|
92
|
+
A robust pattern is:
|
|
93
|
+
- validate + decide outside the transaction
|
|
94
|
+
- register persistence in `route:BeforeComplete`
|
|
95
|
+
- write data inside `Transaction.wrap`
|
|
96
|
+
|
|
97
|
+
This keeps the request pipeline clean and reduces accidental double-writes.
|
|
98
|
+
|
|
99
|
+
## 6) SiteGenesis (SGJC) vs SFRA: Key Differences
|
|
100
|
+
|
|
101
|
+
| Concern | SiteGenesis (SGJC) | SFRA |
|
|
102
|
+
|---|---|---|
|
|
103
|
+
| Controller model | guard-driven actions (classic) | middleware chains (`server.get/post`) |
|
|
104
|
+
| Form access | `pdict.CurrentForms` / `app.getForm` | `server.forms.getForm()` |
|
|
105
|
+
| Template coupling | templates can touch live session form | templates should consume serialized form data |
|
|
106
|
+
| CSRF | often manual validation | middleware-driven |
|
|
107
|
+
| Persistence | mixed into controller callbacks | often isolated via `route:BeforeComplete` |
|
|
108
|
+
| Binding style | can be implicit/mass assignment | explicit assignment encouraged |
|
|
109
|
+
|
|
110
|
+
### SiteGenesis specifics
|
|
111
|
+
|
|
112
|
+
- Input names are generated and can vary (commonly `dwfrm_...`).
|
|
113
|
+
- Templates must use generated names (e.g., `field.htmlName`) rather than hardcoding.
|
|
114
|
+
|
|
115
|
+
## 7) Migration Checklist (SiteGenesis ➜ SFRA)
|
|
116
|
+
|
|
117
|
+
1. Copy XML form definitions into the SFRA cartridge.
|
|
118
|
+
2. Ensure labels/errors live in resource bundles (`templates/resources/*.properties`).
|
|
119
|
+
3. Replace guard controller logic with SFRA routes.
|
|
120
|
+
4. Enforce:
|
|
121
|
+
- HTTPS
|
|
122
|
+
- POST-only for state changes
|
|
123
|
+
- CSRF middleware validation
|
|
124
|
+
5. Replace implicit binding with explicit mapping inside `Transaction.wrap`.
|
|
125
|
+
6. Update templates to:
|
|
126
|
+
- use SFRA view model
|
|
127
|
+
- inject CSRF using `pdict.csrf.*`
|
|
128
|
+
- output-encode displayed values
|
|
129
|
+
7. Clear form state at appropriate times.
|
|
130
|
+
|
|
131
|
+
## 8) Secure Forms Checklist
|
|
132
|
+
|
|
133
|
+
```text
|
|
134
|
+
[ ] POST + HTTPS enforced
|
|
135
|
+
[ ] CSRF validate before touching form data
|
|
136
|
+
[ ] Server-side validation gates all writes
|
|
137
|
+
[ ] Transactions are short and isolated
|
|
138
|
+
[ ] Explicit mapping for writes
|
|
139
|
+
[ ] max-length on strings
|
|
140
|
+
[ ] Regex patterns are conservative
|
|
141
|
+
[ ] Output encoding for any user data
|
|
142
|
+
[ ] Clear session form state (pre-render and/or post-success)
|
|
143
|
+
```
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# SFCC Form XML Cheat Sheet
|
|
2
|
+
|
|
3
|
+
This is a practical reference for the storefront Forms Framework XML definitions found under `cartridge/forms/**`.
|
|
4
|
+
|
|
5
|
+
## What the XML Controls
|
|
6
|
+
|
|
7
|
+
- Form structure (fields, groups, lists)
|
|
8
|
+
- Data types and parsing
|
|
9
|
+
- Built-in constraint validation
|
|
10
|
+
- Resource keys for labels/descriptions/errors
|
|
11
|
+
- Actions (which submissions trigger full validation)
|
|
12
|
+
|
|
13
|
+
## Minimum Recommended Constraints
|
|
14
|
+
|
|
15
|
+
| Field Type | Must Have | Why |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| `string` | `max-length` | Prevent overly large payloads; reduce DoS/storage risk |
|
|
18
|
+
| `string` + regexp | conservative `regexp` | Avoid ReDoS and ambiguous formats |
|
|
19
|
+
| `integer` / `number` | `min`/`max` (when applicable) | Prevent negative/invalid ranges |
|
|
20
|
+
| any mandatory | `missing-error` | Clear, localized feedback |
|
|
21
|
+
|
|
22
|
+
## Core Elements
|
|
23
|
+
|
|
24
|
+
### `<form>`
|
|
25
|
+
|
|
26
|
+
```xml
|
|
27
|
+
<form xmlns="http://www.demandware.com/xml/form/2008-04-19">
|
|
28
|
+
<!-- fields / groups / lists / actions -->
|
|
29
|
+
</form>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### `<field>`
|
|
33
|
+
|
|
34
|
+
Common attributes (subset):
|
|
35
|
+
|
|
36
|
+
- `formid` (required): identifier
|
|
37
|
+
- `type` (required): `string`, `integer`, `number`, `boolean`, `date`
|
|
38
|
+
- `label`: resource key
|
|
39
|
+
- `mandatory`: `true|false`
|
|
40
|
+
- `max-length` / `min-length` (strings)
|
|
41
|
+
- `min` / `max` (numbers)
|
|
42
|
+
- `regexp` (strings)
|
|
43
|
+
- `format` (dates)
|
|
44
|
+
- error keys: `missing-error`, `parse-error`, `range-error`, `value-error`
|
|
45
|
+
|
|
46
|
+
Example:
|
|
47
|
+
|
|
48
|
+
```xml
|
|
49
|
+
<field formid="postalCode" type="string"
|
|
50
|
+
label="form.address.postal"
|
|
51
|
+
mandatory="true"
|
|
52
|
+
max-length="20"
|
|
53
|
+
regexp="^[A-Za-z0-9\-\s]{3,20}$"
|
|
54
|
+
missing-error="form.address.postal.required"
|
|
55
|
+
parse-error="form.address.postal.invalid"/>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Error Key Semantics (Server-Side)
|
|
59
|
+
|
|
60
|
+
When a form is submitted, constraint checks are evaluated in a predictable “first failing rule wins” manner for each field:
|
|
61
|
+
|
|
62
|
+
1. Parse/type/regexp problems → `parse-error`
|
|
63
|
+
2. Mandatory empty → `missing-error`
|
|
64
|
+
3. Range / min/max / length bounds → `range-error`
|
|
65
|
+
4. Script-triggered invalidation → `value-error` (or custom key)
|
|
66
|
+
|
|
67
|
+
### `<group>`
|
|
68
|
+
|
|
69
|
+
Use groups to namespace complex objects like addresses.
|
|
70
|
+
|
|
71
|
+
```xml
|
|
72
|
+
<group formid="shippingAddress">
|
|
73
|
+
<field formid="firstName" type="string" mandatory="true" max-length="50"/>
|
|
74
|
+
<field formid="lastName" type="string" mandatory="true" max-length="50"/>
|
|
75
|
+
</group>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Controller access pattern:
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
form.shippingAddress.firstName.value
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### `<list>`
|
|
85
|
+
|
|
86
|
+
Use lists for repeated groups (saved addresses, payment instruments, etc.).
|
|
87
|
+
|
|
88
|
+
Guideline:
|
|
89
|
+
- Treat list items as independent sub-forms with their own validity.
|
|
90
|
+
- Avoid deeply nested lists; keep templates and controller logic readable.
|
|
91
|
+
|
|
92
|
+
### `<action>`
|
|
93
|
+
|
|
94
|
+
Actions decide whether “valid form” constraints run.
|
|
95
|
+
|
|
96
|
+
```xml
|
|
97
|
+
<action formid="submit" valid-form="true"/>
|
|
98
|
+
<action formid="cancel" valid-form="false"/>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Reuse via `<include>`
|
|
102
|
+
|
|
103
|
+
Use includes to avoid repeating canonical definitions (address, phone, etc.).
|
|
104
|
+
|
|
105
|
+
Pattern:
|
|
106
|
+
- Create an address form definition once.
|
|
107
|
+
- Include it into checkout/profile forms.
|
|
108
|
+
|
|
109
|
+
This keeps validation consistent and reduces drift.
|
|
110
|
+
|
|
111
|
+
## Locale-Specific Definitions
|
|
112
|
+
|
|
113
|
+
If the structure truly differs by locale (not just labels), define locale-specific XML:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
/forms/default/profile.xml
|
|
117
|
+
/forms/pt_BR/profile.xml
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The platform loads the best match for the current request locale.
|
|
121
|
+
|
|
122
|
+
## Anti-Patterns
|
|
123
|
+
|
|
124
|
+
- No `max-length` on string fields.
|
|
125
|
+
- Aggressive, complex regex patterns (risk of catastrophic backtracking).
|
|
126
|
+
- Hardcoding labels/errors instead of resource keys.
|
|
127
|
+
- Depending on implicit binding/mass assignment to persist sensitive fields.
|