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
|
@@ -3,12 +3,68 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This module handles secure loading and validation of dw.json files
|
|
5
5
|
* with comprehensive security checks for file access.
|
|
6
|
+
*
|
|
7
|
+
* Security features:
|
|
8
|
+
* - Path traversal attack prevention
|
|
9
|
+
* - System directory access blocking
|
|
10
|
+
* - File size limits to prevent DoS
|
|
11
|
+
* - JSON content validation
|
|
12
|
+
* - Symlink resolution and validation
|
|
6
13
|
*/
|
|
7
14
|
|
|
8
|
-
import { readFileSync, existsSync, statSync } from 'fs';
|
|
9
|
-
import { resolve, basename, extname } from 'path';
|
|
15
|
+
import { readFileSync, existsSync, statSync, realpathSync } from 'fs';
|
|
16
|
+
import { resolve, basename, extname, normalize, isAbsolute } from 'path';
|
|
10
17
|
import { DwJsonConfig } from '../types/types.js';
|
|
11
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Dangerous system paths that should never be accessed
|
|
21
|
+
* These are blocked to prevent accidental or malicious access to sensitive areas
|
|
22
|
+
*/
|
|
23
|
+
const BLOCKED_SYSTEM_PATHS: readonly string[] = [
|
|
24
|
+
'/etc',
|
|
25
|
+
'/proc',
|
|
26
|
+
'/sys',
|
|
27
|
+
'/dev',
|
|
28
|
+
'/root',
|
|
29
|
+
'/var/log',
|
|
30
|
+
'/var/run',
|
|
31
|
+
'/boot',
|
|
32
|
+
'/sbin',
|
|
33
|
+
'/bin',
|
|
34
|
+
// Windows system paths
|
|
35
|
+
'C:\\Windows',
|
|
36
|
+
'C:\\Program Files',
|
|
37
|
+
'C:\\ProgramData',
|
|
38
|
+
// Common sensitive directories
|
|
39
|
+
'.ssh',
|
|
40
|
+
'.gnupg',
|
|
41
|
+
'.aws',
|
|
42
|
+
'.config/gcloud',
|
|
43
|
+
] as const;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Allowed path prefixes for configuration file access
|
|
47
|
+
* These are the typical locations where development projects and configs reside
|
|
48
|
+
*/
|
|
49
|
+
const ALLOWED_PATH_PATTERNS: readonly RegExp[] = [
|
|
50
|
+
// User home directories
|
|
51
|
+
/^\/Users\/[^/]+\//i, // macOS
|
|
52
|
+
/^\/home\/[^/]+\//i, // Linux (allow all users for development)
|
|
53
|
+
/^C:\\Users\\[^\\]+\\/i, // Windows
|
|
54
|
+
// Common project directories
|
|
55
|
+
/^\/opt\//i,
|
|
56
|
+
/^\/var\/www\//i,
|
|
57
|
+
/^\/srv\//i,
|
|
58
|
+
// Temp directories (for testing)
|
|
59
|
+
/^\/tmp\//i,
|
|
60
|
+
/^\/private\/tmp\//i, // macOS real temp path
|
|
61
|
+
/^\/var\/folders\//i, // macOS temp
|
|
62
|
+
/^\/private\/var\/folders\//i, // macOS real temp path (symlink resolved)
|
|
63
|
+
/^C:\\Temp\\/i, // Windows temp
|
|
64
|
+
// CI workspace paths
|
|
65
|
+
/^\/home\/runner\/work\//i, // GitHub Actions
|
|
66
|
+
] as const;
|
|
67
|
+
|
|
12
68
|
/**
|
|
13
69
|
* Validates that a file path is safe to access and prevents path traversal attacks
|
|
14
70
|
*
|
|
@@ -23,7 +79,7 @@ function validateSecurePath(filePath: string): string {
|
|
|
23
79
|
}
|
|
24
80
|
|
|
25
81
|
// Prevent excessively long paths that could cause DoS
|
|
26
|
-
if (filePath.length >
|
|
82
|
+
if (filePath.length > 4096) {
|
|
27
83
|
throw new Error('File path too long');
|
|
28
84
|
}
|
|
29
85
|
|
|
@@ -33,28 +89,53 @@ function validateSecurePath(filePath: string): string {
|
|
|
33
89
|
throw new Error('Only .json files are allowed');
|
|
34
90
|
}
|
|
35
91
|
|
|
36
|
-
// Normalize the path to prevent path traversal
|
|
37
|
-
const resolvedPath = resolve(filePath);
|
|
92
|
+
// Normalize and resolve the path to prevent path traversal
|
|
93
|
+
const resolvedPath = normalize(resolve(filePath));
|
|
94
|
+
|
|
95
|
+
// Verify it's an absolute path after resolution
|
|
96
|
+
if (!isAbsolute(resolvedPath)) {
|
|
97
|
+
throw new Error('Path must resolve to an absolute path');
|
|
98
|
+
}
|
|
38
99
|
|
|
39
100
|
// Additional check: ensure the resolved path still ends with .json
|
|
40
101
|
// This prevents attacks like "file.json/../../../etc/passwd"
|
|
41
102
|
if (!resolvedPath.toLowerCase().endsWith('.json')) {
|
|
42
|
-
throw new Error('Invalid file path');
|
|
103
|
+
throw new Error('Invalid file path after normalization');
|
|
43
104
|
}
|
|
44
105
|
|
|
45
|
-
//
|
|
46
|
-
// Allow CI workspace paths like /home/runner/work/ but block sensitive system paths
|
|
47
|
-
const dangerousPaths = ['/etc/', '/proc/', '/sys/', '/dev/', '/root/'];
|
|
106
|
+
// Check against blocked system paths
|
|
48
107
|
const lowerPath = resolvedPath.toLowerCase();
|
|
108
|
+
for (const blocked of BLOCKED_SYSTEM_PATHS) {
|
|
109
|
+
const blockedLower = blocked.toLowerCase();
|
|
110
|
+
if (
|
|
111
|
+
lowerPath === blockedLower ||
|
|
112
|
+
lowerPath.startsWith(`${blockedLower }/`) ||
|
|
113
|
+
lowerPath.startsWith(`${blockedLower }\\`) ||
|
|
114
|
+
lowerPath.includes(`/${ blockedLower }/`) ||
|
|
115
|
+
lowerPath.includes(`\\${ blockedLower }\\`)
|
|
116
|
+
) {
|
|
117
|
+
throw new Error('Access to system directories not allowed');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
49
120
|
|
|
50
|
-
// Check
|
|
51
|
-
|
|
52
|
-
|
|
121
|
+
// Check that path matches allowed patterns
|
|
122
|
+
const matchesAllowed = ALLOWED_PATH_PATTERNS.some(pattern => pattern.test(resolvedPath));
|
|
123
|
+
if (!matchesAllowed) {
|
|
124
|
+
throw new Error('Path is outside of allowed configuration directories');
|
|
53
125
|
}
|
|
54
126
|
|
|
55
|
-
//
|
|
56
|
-
if (
|
|
57
|
-
|
|
127
|
+
// If the file exists, resolve symlinks and re-validate the real path
|
|
128
|
+
if (existsSync(resolvedPath)) {
|
|
129
|
+
try {
|
|
130
|
+
const realPath = realpathSync(resolvedPath);
|
|
131
|
+
if (realPath !== resolvedPath) {
|
|
132
|
+
// Recursively validate the symlink target (but limit recursion)
|
|
133
|
+
return validateSecurePath(realPath);
|
|
134
|
+
}
|
|
135
|
+
} catch {
|
|
136
|
+
// If we can't resolve symlinks, continue with the original path
|
|
137
|
+
// The file might not exist yet, which is handled later
|
|
138
|
+
}
|
|
58
139
|
}
|
|
59
140
|
|
|
60
141
|
return resolvedPath;
|
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace Roots Management for SFCC MCP Server
|
|
3
|
+
*
|
|
4
|
+
* This module handles secure discovery and validation of workspace roots
|
|
5
|
+
* provided by MCP clients, enabling automatic dw.json discovery from the
|
|
6
|
+
* VS Code workspace without requiring absolute paths.
|
|
7
|
+
*
|
|
8
|
+
* Configuration Discovery Priority:
|
|
9
|
+
* 1. CLI parameter (--dw-json) - handled in main.ts
|
|
10
|
+
* 2. Environment variables (SFCC_*) - handled in main.ts
|
|
11
|
+
* 3. MCP workspace roots (this module) - called after client connects
|
|
12
|
+
*
|
|
13
|
+
* This discovery mechanism is preferred over CWD-based search because
|
|
14
|
+
* MCP servers often start with cwd set to the user's home directory,
|
|
15
|
+
* not the project directory. The MCP workspace roots capability provides
|
|
16
|
+
* the correct project context from VS Code/Copilot/Cursor.
|
|
17
|
+
*
|
|
18
|
+
* Security considerations:
|
|
19
|
+
* - Only file:// URIs are accepted (per MCP spec)
|
|
20
|
+
* - Path traversal attacks are prevented
|
|
21
|
+
* - System directories are blocked
|
|
22
|
+
* - Symlink resolution is handled securely
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { existsSync, realpathSync, statSync } from 'fs';
|
|
26
|
+
import { resolve, normalize, join, isAbsolute } from 'path';
|
|
27
|
+
import { fileURLToPath } from 'url';
|
|
28
|
+
import { Logger } from '../utils/logger.js';
|
|
29
|
+
import { DwJsonConfig } from '../types/types.js';
|
|
30
|
+
import { loadSecureDwJson } from './dw-json-loader.js';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* MCP client root from roots/list response
|
|
34
|
+
*/
|
|
35
|
+
export interface MCPClientRoot {
|
|
36
|
+
uri: string;
|
|
37
|
+
name?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Represents a validated workspace root
|
|
42
|
+
*/
|
|
43
|
+
export interface ValidatedWorkspaceRoot {
|
|
44
|
+
/** Original URI from the client */
|
|
45
|
+
uri: string;
|
|
46
|
+
/** Resolved absolute path */
|
|
47
|
+
path: string;
|
|
48
|
+
/** Optional name for the root */
|
|
49
|
+
name?: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Result of workspace roots discovery
|
|
54
|
+
*/
|
|
55
|
+
export interface WorkspaceDiscoveryResult {
|
|
56
|
+
/** Whether discovery was successful */
|
|
57
|
+
success: boolean;
|
|
58
|
+
/** Discovered dw.json configuration if found */
|
|
59
|
+
config?: DwJsonConfig;
|
|
60
|
+
/** Path to the discovered dw.json file */
|
|
61
|
+
dwJsonPath?: string;
|
|
62
|
+
/** Reason for failure or skip */
|
|
63
|
+
reason?: string;
|
|
64
|
+
/** Number of workspace roots received from client */
|
|
65
|
+
rootsReceived?: number;
|
|
66
|
+
/** Number of valid roots after security validation */
|
|
67
|
+
validRoots?: number;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Security validation result
|
|
72
|
+
*/
|
|
73
|
+
interface ValidationResult {
|
|
74
|
+
isValid: boolean;
|
|
75
|
+
error?: string;
|
|
76
|
+
resolvedPath?: string;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Dangerous system paths that should never be accessed
|
|
81
|
+
* These are blocked to prevent accidental or malicious access to sensitive areas
|
|
82
|
+
*/
|
|
83
|
+
const BLOCKED_SYSTEM_PATHS: readonly string[] = [
|
|
84
|
+
'/etc',
|
|
85
|
+
'/proc',
|
|
86
|
+
'/sys',
|
|
87
|
+
'/dev',
|
|
88
|
+
'/root',
|
|
89
|
+
'/var/log',
|
|
90
|
+
'/var/run',
|
|
91
|
+
'/boot',
|
|
92
|
+
'/sbin',
|
|
93
|
+
'/bin',
|
|
94
|
+
// Windows system paths
|
|
95
|
+
'C:\\Windows',
|
|
96
|
+
'C:\\Program Files',
|
|
97
|
+
'C:\\ProgramData',
|
|
98
|
+
// Common sensitive directories
|
|
99
|
+
'.ssh',
|
|
100
|
+
'.gnupg',
|
|
101
|
+
'.aws',
|
|
102
|
+
'.config/gcloud',
|
|
103
|
+
] as const;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Allowed path prefixes for workspace roots
|
|
107
|
+
* These are the typical locations where development projects reside
|
|
108
|
+
*/
|
|
109
|
+
const ALLOWED_PATH_PATTERNS: readonly RegExp[] = [
|
|
110
|
+
// User home directories
|
|
111
|
+
/^\/Users\/[^/]+\//i, // macOS
|
|
112
|
+
/^\/home\/[^/]+\//i, // Linux (allow all users, not just runner)
|
|
113
|
+
/^C:\\Users\\[^\\]+\\/i, // Windows
|
|
114
|
+
// Common project directories
|
|
115
|
+
/^\/opt\//i,
|
|
116
|
+
/^\/var\/www\//i,
|
|
117
|
+
/^\/srv\//i,
|
|
118
|
+
// Temp directories (for testing)
|
|
119
|
+
/^\/tmp\//i,
|
|
120
|
+
/^\/private\/tmp\//i, // macOS real temp path
|
|
121
|
+
/^\/var\/folders\//i, // macOS temp
|
|
122
|
+
/^\/private\/var\/folders\//i, // macOS real temp path (symlink resolved)
|
|
123
|
+
/^C:\\Temp\\/i, // Windows temp
|
|
124
|
+
// CI workspace paths
|
|
125
|
+
/^\/home\/runner\/work\//i, // GitHub Actions
|
|
126
|
+
] as const;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Validates that a file URI is safe and converts it to an absolute path
|
|
130
|
+
*
|
|
131
|
+
* @param uri - The file:// URI to validate
|
|
132
|
+
* @returns Validation result with resolved path or error
|
|
133
|
+
*/
|
|
134
|
+
function validateFileUri(uri: string): ValidationResult {
|
|
135
|
+
// Check for null bytes and other dangerous characters
|
|
136
|
+
if (uri.includes('\0') || uri.includes('\x00')) {
|
|
137
|
+
return { isValid: false, error: 'URI contains invalid characters' };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Verify it's a file:// URI
|
|
141
|
+
if (!uri.startsWith('file://')) {
|
|
142
|
+
return { isValid: false, error: 'Only file:// URIs are supported for workspace roots' };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
try {
|
|
146
|
+
// Convert file URI to path securely
|
|
147
|
+
const path = fileURLToPath(uri);
|
|
148
|
+
return validatePath(path);
|
|
149
|
+
} catch (error) {
|
|
150
|
+
return {
|
|
151
|
+
isValid: false,
|
|
152
|
+
error: `Invalid file URI: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Validates that a file path is safe to use as a workspace root
|
|
159
|
+
*
|
|
160
|
+
* @param inputPath - The path to validate
|
|
161
|
+
* @returns Validation result with resolved path or error
|
|
162
|
+
*/
|
|
163
|
+
function validatePath(inputPath: string): ValidationResult {
|
|
164
|
+
// Check for null bytes
|
|
165
|
+
if (inputPath.includes('\0')) {
|
|
166
|
+
return { isValid: false, error: 'Path contains invalid characters' };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Check for excessively long paths (DoS prevention)
|
|
170
|
+
if (inputPath.length > 4096) {
|
|
171
|
+
return { isValid: false, error: 'Path is too long' };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Normalize and resolve the path
|
|
175
|
+
let resolvedPath: string;
|
|
176
|
+
try {
|
|
177
|
+
resolvedPath = normalize(resolve(inputPath));
|
|
178
|
+
} catch {
|
|
179
|
+
return { isValid: false, error: 'Failed to resolve path' };
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Verify it's an absolute path
|
|
183
|
+
if (!isAbsolute(resolvedPath)) {
|
|
184
|
+
return { isValid: false, error: 'Path must be absolute' };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Check against blocked system paths
|
|
188
|
+
const lowerPath = resolvedPath.toLowerCase();
|
|
189
|
+
for (const blocked of BLOCKED_SYSTEM_PATHS) {
|
|
190
|
+
const blockedLower = blocked.toLowerCase();
|
|
191
|
+
if (lowerPath === blockedLower || lowerPath.startsWith(`${blockedLower }/`) || lowerPath.startsWith(`${blockedLower }\\`)) {
|
|
192
|
+
return { isValid: false, error: 'Access to system directories is not allowed' };
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Check that path matches allowed patterns
|
|
197
|
+
const matchesAllowed = ALLOWED_PATH_PATTERNS.some(pattern => pattern.test(resolvedPath));
|
|
198
|
+
if (!matchesAllowed) {
|
|
199
|
+
return {
|
|
200
|
+
isValid: false,
|
|
201
|
+
error: 'Path is outside of allowed workspace directories',
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Verify the path exists and is a directory
|
|
206
|
+
try {
|
|
207
|
+
if (!existsSync(resolvedPath)) {
|
|
208
|
+
return { isValid: false, error: 'Path does not exist' };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const stats = statSync(resolvedPath);
|
|
212
|
+
if (!stats.isDirectory()) {
|
|
213
|
+
return { isValid: false, error: 'Path is not a directory' };
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Resolve symlinks to verify the real path is also safe
|
|
217
|
+
const realPath = realpathSync(resolvedPath);
|
|
218
|
+
if (realPath !== resolvedPath) {
|
|
219
|
+
// Re-validate the resolved symlink path
|
|
220
|
+
const symlinkValidation = validatePath(realPath);
|
|
221
|
+
if (!symlinkValidation.isValid) {
|
|
222
|
+
return {
|
|
223
|
+
isValid: false,
|
|
224
|
+
error: `Symlink target is not allowed: ${symlinkValidation.error}`,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
resolvedPath = realPath;
|
|
228
|
+
}
|
|
229
|
+
} catch (error) {
|
|
230
|
+
return {
|
|
231
|
+
isValid: false,
|
|
232
|
+
error: `Cannot access path: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return { isValid: true, resolvedPath };
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Service for managing workspace roots from MCP clients
|
|
241
|
+
*
|
|
242
|
+
* This class provides secure handling of workspace roots, enabling
|
|
243
|
+
* automatic discovery of configuration files (like dw.json) in the
|
|
244
|
+
* agent's working directories.
|
|
245
|
+
*/
|
|
246
|
+
export class WorkspaceRootsService {
|
|
247
|
+
private roots: ValidatedWorkspaceRoot[] = [];
|
|
248
|
+
private logger: Logger;
|
|
249
|
+
|
|
250
|
+
constructor(logger?: Logger) {
|
|
251
|
+
this.logger = logger ?? Logger.getInstance();
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Update workspace roots from MCP client response
|
|
256
|
+
*
|
|
257
|
+
* @param clientRoots - Array of roots from the MCP client (roots/list response)
|
|
258
|
+
* @returns Array of successfully validated roots
|
|
259
|
+
*/
|
|
260
|
+
updateRoots(clientRoots: Array<{ uri: string; name?: string }>): ValidatedWorkspaceRoot[] {
|
|
261
|
+
this.roots = [];
|
|
262
|
+
|
|
263
|
+
for (const root of clientRoots) {
|
|
264
|
+
const validation = validateFileUri(root.uri);
|
|
265
|
+
|
|
266
|
+
if (validation.isValid && validation.resolvedPath) {
|
|
267
|
+
this.roots.push({
|
|
268
|
+
uri: root.uri,
|
|
269
|
+
path: validation.resolvedPath,
|
|
270
|
+
name: root.name,
|
|
271
|
+
});
|
|
272
|
+
this.logger.debug(`Validated workspace root: ${root.name ?? root.uri} -> ${validation.resolvedPath}`);
|
|
273
|
+
} else {
|
|
274
|
+
this.logger.debug(`Rejected workspace root: ${root.uri} - ${validation.error}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
this.logger.log(`Workspace roots updated: ${this.roots.length} valid root(s)`);
|
|
279
|
+
return [...this.roots];
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Get all validated workspace roots
|
|
284
|
+
*/
|
|
285
|
+
getRoots(): ValidatedWorkspaceRoot[] {
|
|
286
|
+
return [...this.roots];
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Search for a file in all workspace roots
|
|
291
|
+
*
|
|
292
|
+
* @param filename - The filename to search for (e.g., 'dw.json')
|
|
293
|
+
* @param maxDepth - Maximum directory depth to search (default: 2)
|
|
294
|
+
* @returns The first matching file path, or undefined if not found
|
|
295
|
+
*/
|
|
296
|
+
findFile(filename: string, maxDepth: number = 2): string | undefined {
|
|
297
|
+
// Validate filename to prevent path traversal
|
|
298
|
+
if (filename.includes('/') || filename.includes('\\') || filename.includes('..')) {
|
|
299
|
+
this.logger.debug(`Invalid filename rejected: ${filename}`);
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
for (const root of this.roots) {
|
|
304
|
+
const found = this.searchInDirectory(root.path, filename, 0, maxDepth);
|
|
305
|
+
if (found) {
|
|
306
|
+
this.logger.debug(`Found ${filename} in workspace root: ${found}`);
|
|
307
|
+
return found;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return undefined;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Recursively search for a file in a directory
|
|
316
|
+
*
|
|
317
|
+
* @param directory - Directory to search
|
|
318
|
+
* @param filename - Filename to find
|
|
319
|
+
* @param currentDepth - Current recursion depth
|
|
320
|
+
* @param maxDepth - Maximum depth to search
|
|
321
|
+
* @returns File path if found, undefined otherwise
|
|
322
|
+
*/
|
|
323
|
+
private searchInDirectory(
|
|
324
|
+
directory: string,
|
|
325
|
+
filename: string,
|
|
326
|
+
currentDepth: number,
|
|
327
|
+
maxDepth: number,
|
|
328
|
+
): string | undefined {
|
|
329
|
+
// Check immediate file
|
|
330
|
+
const filePath = join(directory, filename);
|
|
331
|
+
if (existsSync(filePath)) {
|
|
332
|
+
try {
|
|
333
|
+
const stats = statSync(filePath);
|
|
334
|
+
if (stats.isFile()) {
|
|
335
|
+
return filePath;
|
|
336
|
+
}
|
|
337
|
+
} catch {
|
|
338
|
+
// Ignore access errors
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Don't recurse deeper if at max depth
|
|
343
|
+
if (currentDepth >= maxDepth) {
|
|
344
|
+
return undefined;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Search subdirectories (limited set to avoid excessive scanning)
|
|
348
|
+
const allowedSubdirs = ['cartridges', 'config', '.vscode', 'sfcc'];
|
|
349
|
+
for (const subdir of allowedSubdirs) {
|
|
350
|
+
const subdirPath = join(directory, subdir);
|
|
351
|
+
try {
|
|
352
|
+
if (existsSync(subdirPath) && statSync(subdirPath).isDirectory()) {
|
|
353
|
+
const found = this.searchInDirectory(subdirPath, filename, currentDepth + 1, maxDepth);
|
|
354
|
+
if (found) {
|
|
355
|
+
return found;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
} catch {
|
|
359
|
+
// Ignore access errors
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
return undefined;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Check if a given path is within any of the validated workspace roots
|
|
368
|
+
*
|
|
369
|
+
* This is useful for validating that file operations stay within
|
|
370
|
+
* the allowed workspace boundaries.
|
|
371
|
+
*
|
|
372
|
+
* @param filePath - The path to check
|
|
373
|
+
* @returns true if the path is within a workspace root
|
|
374
|
+
*/
|
|
375
|
+
isPathWithinRoots(filePath: string): boolean {
|
|
376
|
+
try {
|
|
377
|
+
// Normalize and resolve the path
|
|
378
|
+
const normalizedPath = normalize(resolve(filePath));
|
|
379
|
+
|
|
380
|
+
// For existing paths, resolve symlinks to get the real path
|
|
381
|
+
// For non-existing paths (like potential new files), use the normalized path
|
|
382
|
+
let checkPath = normalizedPath;
|
|
383
|
+
if (existsSync(normalizedPath)) {
|
|
384
|
+
checkPath = realpathSync(normalizedPath);
|
|
385
|
+
} else {
|
|
386
|
+
// For non-existing paths, try to resolve symlinks in the parent directory chain
|
|
387
|
+
// This handles cases like /var/folders on macOS which is a symlink to /private/var/folders
|
|
388
|
+
let parentPath = normalizedPath;
|
|
389
|
+
while (parentPath !== '/') {
|
|
390
|
+
const parent = resolve(parentPath, '..');
|
|
391
|
+
if (parent === parentPath) {break;}
|
|
392
|
+
parentPath = parent;
|
|
393
|
+
if (existsSync(parentPath)) {
|
|
394
|
+
// Found an existing parent, resolve its realpath and reconstruct
|
|
395
|
+
const realParent = realpathSync(parentPath);
|
|
396
|
+
const relativePart = normalizedPath.substring(parentPath.length);
|
|
397
|
+
checkPath = realParent + relativePart;
|
|
398
|
+
break;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
return this.roots.some(root => {
|
|
404
|
+
return checkPath.startsWith(`${root.path }/`) || checkPath.startsWith(`${root.path }\\`) || checkPath === root.path;
|
|
405
|
+
});
|
|
406
|
+
} catch {
|
|
407
|
+
return false;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Clear all workspace roots
|
|
413
|
+
*/
|
|
414
|
+
clear(): void {
|
|
415
|
+
this.roots = [];
|
|
416
|
+
this.logger.debug('Workspace roots cleared');
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Discover dw.json from MCP client workspace roots
|
|
421
|
+
*
|
|
422
|
+
* This is the main entry point for workspace-based config discovery.
|
|
423
|
+
* It takes raw roots from the MCP client, validates them, searches for
|
|
424
|
+
* dw.json, and loads the configuration.
|
|
425
|
+
*
|
|
426
|
+
* @param clientRoots - Raw roots array from server.listRoots() response
|
|
427
|
+
* @returns Discovery result with config if found
|
|
428
|
+
*/
|
|
429
|
+
discoverDwJson(clientRoots: MCPClientRoot[] | undefined): WorkspaceDiscoveryResult {
|
|
430
|
+
this.logger.log('[WorkspaceRoots] Starting dw.json discovery from client roots');
|
|
431
|
+
|
|
432
|
+
// Log what we received from the client
|
|
433
|
+
if (!clientRoots) {
|
|
434
|
+
this.logger.log('[WorkspaceRoots] No roots array received from client (undefined)');
|
|
435
|
+
return { success: false, reason: 'No roots array received from client' };
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
this.logger.log(`[WorkspaceRoots] Received ${clientRoots.length} root(s) from client`);
|
|
439
|
+
|
|
440
|
+
if (clientRoots.length === 0) {
|
|
441
|
+
this.logger.log('[WorkspaceRoots] Client returned empty roots array');
|
|
442
|
+
return { success: false, reason: 'Client returned empty roots array', rootsReceived: 0 };
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// Log each root we received
|
|
446
|
+
clientRoots.forEach((root, index) => {
|
|
447
|
+
this.logger.log(`[WorkspaceRoots] Root ${index + 1}: uri="${root.uri}", name="${root.name ?? '(none)'}"`);
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
// Validate and store the workspace roots
|
|
451
|
+
const validRoots = this.updateRoots(clientRoots);
|
|
452
|
+
this.logger.log(`[WorkspaceRoots] After validation: ${validRoots.length} valid root(s)`);
|
|
453
|
+
|
|
454
|
+
if (validRoots.length === 0) {
|
|
455
|
+
this.logger.log('[WorkspaceRoots] No valid roots after security validation');
|
|
456
|
+
return {
|
|
457
|
+
success: false,
|
|
458
|
+
reason: 'No valid workspace roots after security validation',
|
|
459
|
+
rootsReceived: clientRoots.length,
|
|
460
|
+
validRoots: 0,
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// Log validated roots
|
|
465
|
+
validRoots.forEach((root, index) => {
|
|
466
|
+
this.logger.log(`[WorkspaceRoots] Valid root ${index + 1}: path="${root.path}"`);
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
// Search for dw.json in workspace roots
|
|
470
|
+
this.logger.log('[WorkspaceRoots] Searching for dw.json in workspace roots...');
|
|
471
|
+
const dwJsonPath = this.findFile('dw.json');
|
|
472
|
+
|
|
473
|
+
if (!dwJsonPath) {
|
|
474
|
+
this.logger.log('[WorkspaceRoots] No dw.json found in any workspace root');
|
|
475
|
+
return {
|
|
476
|
+
success: false,
|
|
477
|
+
reason: 'No dw.json found in workspace roots',
|
|
478
|
+
rootsReceived: clientRoots.length,
|
|
479
|
+
validRoots: validRoots.length,
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
this.logger.log(`[WorkspaceRoots] Found dw.json at: ${dwJsonPath}`);
|
|
484
|
+
|
|
485
|
+
// Load and validate the dw.json
|
|
486
|
+
try {
|
|
487
|
+
const config = loadSecureDwJson(dwJsonPath);
|
|
488
|
+
this.logger.log('[WorkspaceRoots] Successfully loaded dw.json');
|
|
489
|
+
this.logger.log(`[WorkspaceRoots] hostname: ${config.hostname}`);
|
|
490
|
+
this.logger.log(`[WorkspaceRoots] username: ${config.username ? '(set)' : '(not set)'}`);
|
|
491
|
+
this.logger.log(`[WorkspaceRoots] password: ${config.password ? '(set)' : '(not set)'}`);
|
|
492
|
+
this.logger.log(`[WorkspaceRoots] client-id: ${config['client-id'] ? '(set)' : '(not set)'}`);
|
|
493
|
+
this.logger.log(`[WorkspaceRoots] client-secret: ${config['client-secret'] ? '(set)' : '(not set)'}`);
|
|
494
|
+
|
|
495
|
+
return {
|
|
496
|
+
success: true,
|
|
497
|
+
config,
|
|
498
|
+
dwJsonPath,
|
|
499
|
+
rootsReceived: clientRoots.length,
|
|
500
|
+
validRoots: validRoots.length,
|
|
501
|
+
};
|
|
502
|
+
} catch (error) {
|
|
503
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
504
|
+
this.logger.error(`[WorkspaceRoots] Failed to load dw.json: ${errorMessage}`);
|
|
505
|
+
return {
|
|
506
|
+
success: false,
|
|
507
|
+
reason: `Failed to load dw.json: ${errorMessage}`,
|
|
508
|
+
dwJsonPath,
|
|
509
|
+
rootsReceived: clientRoots.length,
|
|
510
|
+
validRoots: validRoots.length,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* Validate a path for dw.json access
|
|
518
|
+
*
|
|
519
|
+
* This is a standalone function that can be used by the dw-json-loader
|
|
520
|
+
* to validate paths before attempting to read them.
|
|
521
|
+
*
|
|
522
|
+
* @param filePath - The path to validate
|
|
523
|
+
* @returns Object with isValid flag and optional error message
|
|
524
|
+
*/
|
|
525
|
+
export function validateDwJsonPath(filePath: string): { isValid: boolean; error?: string } {
|
|
526
|
+
// First validate the directory containing the file
|
|
527
|
+
const directory = resolve(filePath, '..');
|
|
528
|
+
const validation = validatePath(directory);
|
|
529
|
+
|
|
530
|
+
if (!validation.isValid) {
|
|
531
|
+
return validation;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// Additional validation: ensure it's a .json file
|
|
535
|
+
if (!filePath.toLowerCase().endsWith('.json')) {
|
|
536
|
+
return { isValid: false, error: 'Only .json files are allowed' };
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
return { isValid: true };
|
|
540
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// Constants module currently has no re-exports; reserved for future shared constants.
|