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,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic tests for the MCP tool: get_isml_categories
|
|
3
|
+
* Mirrors YAML tests but adds deeper JSON parsing & resilience checks.
|
|
4
|
+
*
|
|
5
|
+
* Validates:
|
|
6
|
+
* 1. Tool is registered
|
|
7
|
+
* 2. Basic successful invocation returns non-empty array JSON string
|
|
8
|
+
* 3. JSON parse yields objects with required keys (name, displayName, description, elementCount)
|
|
9
|
+
* 4. All expected categories present (analytics, cache, control-flow, decorators, includes, output, payment, scripting, special)
|
|
10
|
+
* 5. Element count accuracy and reasonableness
|
|
11
|
+
* 6. Extraneous argument tolerance
|
|
12
|
+
* 7. Negative error paths
|
|
13
|
+
* 8. Response stability and determinism
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { test, describe, before, after, beforeEach } from 'node:test';
|
|
17
|
+
import { strict as assert } from 'node:assert';
|
|
18
|
+
import { connect } from 'mcp-aegis';
|
|
19
|
+
|
|
20
|
+
describe('get_isml_categories (programmatic)', () => {
|
|
21
|
+
let client;
|
|
22
|
+
const CONFIG = './aegis.config.docs-only.json';
|
|
23
|
+
|
|
24
|
+
before(async () => {
|
|
25
|
+
client = await connect(CONFIG);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
after(async () => {
|
|
29
|
+
if (client?.connected) {
|
|
30
|
+
await client.disconnect();
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
client.clearAllBuffers();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const TOOL_NAME = 'get_isml_categories';
|
|
39
|
+
const REQUIRED_KEYS = ['name', 'displayName', 'description', 'count'];
|
|
40
|
+
const EXPECTED_CATEGORIES = [
|
|
41
|
+
'analytics',
|
|
42
|
+
'cache',
|
|
43
|
+
'control-flow',
|
|
44
|
+
'decorators',
|
|
45
|
+
'includes',
|
|
46
|
+
'output',
|
|
47
|
+
'payment',
|
|
48
|
+
'scripting',
|
|
49
|
+
'special'
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
test('tool should be registered', async () => {
|
|
53
|
+
const tools = await client.listTools();
|
|
54
|
+
const names = tools.map(t => t.name);
|
|
55
|
+
assert.ok(names.includes(TOOL_NAME), 'Tool not found in listTools');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
async function invoke(extraArgs = {}) {
|
|
59
|
+
const result = await client.callTool(TOOL_NAME, { ...extraArgs });
|
|
60
|
+
assert.equal(result.isError, false, 'Tool invocation should not be error');
|
|
61
|
+
assert.ok(result.content && Array.isArray(result.content) && result.content.length > 0, 'Content array expected');
|
|
62
|
+
const textBlocks = result.content.filter(c => c.type === 'text');
|
|
63
|
+
assert.ok(textBlocks.length > 0, 'At least one text block expected');
|
|
64
|
+
const raw = textBlocks.map(t => t.text).join('\n');
|
|
65
|
+
return { raw, result };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function safeParseCategories(raw) {
|
|
69
|
+
let categories;
|
|
70
|
+
try {
|
|
71
|
+
categories = JSON.parse(raw);
|
|
72
|
+
} catch (err) {
|
|
73
|
+
assert.fail(`Failed to parse response as JSON: ${err.message}\nRaw: ${raw.substring(0, 500)}`);
|
|
74
|
+
}
|
|
75
|
+
assert.ok(Array.isArray(categories), 'Parsed categories should be array');
|
|
76
|
+
assert.equal(categories.length, EXPECTED_CATEGORIES.length, `Should have exactly ${EXPECTED_CATEGORIES.length} categories`);
|
|
77
|
+
return categories;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
test('basic invocation returns valid JSON array with required keys', async () => {
|
|
81
|
+
const { raw } = await invoke();
|
|
82
|
+
const categories = safeParseCategories(raw);
|
|
83
|
+
|
|
84
|
+
for (const cat of categories) {
|
|
85
|
+
for (const key of REQUIRED_KEYS) {
|
|
86
|
+
assert.ok(Object.prototype.hasOwnProperty.call(cat, key), `Category should have ${key}: ${JSON.stringify(cat)}`);
|
|
87
|
+
if (key === 'count') {
|
|
88
|
+
assert.ok(typeof cat[key] === 'number', `${key} should be number`);
|
|
89
|
+
assert.ok(cat[key] > 0, `${key} should be positive`);
|
|
90
|
+
} else {
|
|
91
|
+
assert.ok(typeof cat[key] === 'string', `${key} should be string`);
|
|
92
|
+
assert.ok(cat[key].length > 0, `${key} should be non-empty string`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('all expected categories present', async () => {
|
|
99
|
+
const { raw } = await invoke();
|
|
100
|
+
const categories = safeParseCategories(raw);
|
|
101
|
+
const categoryNames = new Set(categories.map(cat => cat.name));
|
|
102
|
+
|
|
103
|
+
for (const expected of EXPECTED_CATEGORIES) {
|
|
104
|
+
assert.ok(categoryNames.has(expected), `Expected category ${expected} not found`);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test('no unexpected categories', async () => {
|
|
109
|
+
const { raw } = await invoke();
|
|
110
|
+
const categories = safeParseCategories(raw);
|
|
111
|
+
const categoryNames = categories.map(cat => cat.name);
|
|
112
|
+
|
|
113
|
+
for (const name of categoryNames) {
|
|
114
|
+
assert.ok(EXPECTED_CATEGORIES.includes(name), `Unexpected category found: ${name}`);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test('category name uniqueness', async () => {
|
|
119
|
+
const { raw } = await invoke();
|
|
120
|
+
const categories = safeParseCategories(raw);
|
|
121
|
+
const names = categories.map(cat => cat.name);
|
|
122
|
+
const nameSet = new Set(names);
|
|
123
|
+
assert.equal(nameSet.size, names.length, 'Category names must be unique');
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test('element count total reasonableness (expect 25-40 total elements)', async () => {
|
|
127
|
+
const { raw } = await invoke();
|
|
128
|
+
const categories = safeParseCategories(raw);
|
|
129
|
+
const totalElements = categories.reduce((sum, cat) => sum + cat.count, 0);
|
|
130
|
+
assert.ok(totalElements >= 25, `Total element count too low: ${totalElements}`);
|
|
131
|
+
assert.ok(totalElements <= 40, `Total element count too high: ${totalElements}`);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test('control-flow category has expected element count', async () => {
|
|
135
|
+
const { raw } = await invoke();
|
|
136
|
+
const categories = safeParseCategories(raw);
|
|
137
|
+
const controlFlow = categories.find(cat => cat.name === 'control-flow');
|
|
138
|
+
assert.ok(controlFlow, 'control-flow category should exist');
|
|
139
|
+
assert.ok(controlFlow.count >= 5, `control-flow should have at least 5 elements, got ${controlFlow.count}`);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test('extraneous argument is ignored', async () => {
|
|
143
|
+
const { raw } = await invoke({ unused: 'value', extra: 123 });
|
|
144
|
+
const categories = safeParseCategories(raw);
|
|
145
|
+
assert.equal(categories.length, EXPECTED_CATEGORIES.length, 'Should return same number of categories with extraneous args');
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('deterministic ordering (two calls produce identical category order)', async () => {
|
|
149
|
+
const first = safeParseCategories((await invoke()).raw).map(cat => cat.name);
|
|
150
|
+
const second = safeParseCategories((await invoke()).raw).map(cat => cat.name);
|
|
151
|
+
assert.deepEqual(second, first, 'Category order should be stable across calls');
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
test('displayName formatting quality (capitalized, reasonable length)', async () => {
|
|
155
|
+
const { raw } = await invoke();
|
|
156
|
+
const categories = safeParseCategories(raw);
|
|
157
|
+
|
|
158
|
+
for (const cat of categories) {
|
|
159
|
+
assert.ok(cat.displayName.length >= 4, `displayName too short: ${cat.displayName}`);
|
|
160
|
+
assert.ok(cat.displayName.length <= 30, `displayName too long: ${cat.displayName}`);
|
|
161
|
+
// Should start with capital letter
|
|
162
|
+
assert.match(cat.displayName, /^[A-Z]/, `displayName should start with capital: ${cat.displayName}`);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('description quality (reasonable length 30-150 chars)', async () => {
|
|
167
|
+
const { raw } = await invoke();
|
|
168
|
+
const categories = safeParseCategories(raw);
|
|
169
|
+
|
|
170
|
+
for (const cat of categories) {
|
|
171
|
+
assert.ok(cat.description.length >= 30, `Description too short for ${cat.name}: ${cat.description.length} chars`);
|
|
172
|
+
assert.ok(cat.description.length <= 150, `Description too long for ${cat.name}: ${cat.description.length} chars`);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test('name format (kebab-case)', async () => {
|
|
177
|
+
const { raw } = await invoke();
|
|
178
|
+
const categories = safeParseCategories(raw);
|
|
179
|
+
|
|
180
|
+
for (const cat of categories) {
|
|
181
|
+
assert.match(cat.name, /^[a-z]+(-[a-z]+)*$/, `Category name should be kebab-case: ${cat.name}`);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test('round-trip JSON parse reproducibility', async () => {
|
|
186
|
+
const { raw } = await invoke();
|
|
187
|
+
const categories = safeParseCategories(raw);
|
|
188
|
+
const roundTrip = JSON.parse(JSON.stringify(categories));
|
|
189
|
+
assert.deepEqual(roundTrip, categories, 'Round trip serialization must preserve categories');
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
test('no empty or placeholder names/descriptions', async () => {
|
|
193
|
+
const { raw } = await invoke();
|
|
194
|
+
const categories = safeParseCategories(raw);
|
|
195
|
+
|
|
196
|
+
for (const cat of categories) {
|
|
197
|
+
assert.ok(cat.name && cat.name.trim().length > 0, 'Name should not be empty');
|
|
198
|
+
assert.ok(cat.displayName && cat.displayName.trim().length > 0, 'DisplayName should not be empty');
|
|
199
|
+
assert.ok(cat.description && cat.description.trim().length > 0, 'Description should not be empty');
|
|
200
|
+
assert.ok(!cat.name.toLowerCase().includes('placeholder'), `Name should not be placeholder: ${cat.name}`);
|
|
201
|
+
assert.ok(!cat.description.toLowerCase().includes('todo'), `Description should not be TODO: ${cat.description}`);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
test('category count stable across two invocations', async () => {
|
|
206
|
+
const firstLen = safeParseCategories((await invoke()).raw).length;
|
|
207
|
+
const secondLen = safeParseCategories((await invoke()).raw).length;
|
|
208
|
+
assert.equal(secondLen, firstLen, 'Category count should be identical across calls');
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
test('element count histogram logged for diagnostic insight (non-asserting)', async () => {
|
|
212
|
+
const { raw } = await invoke();
|
|
213
|
+
const categories = safeParseCategories(raw);
|
|
214
|
+
const histogram = categories.reduce((acc, cat) => {
|
|
215
|
+
acc[cat.name] = cat.count;
|
|
216
|
+
return acc;
|
|
217
|
+
}, {});
|
|
218
|
+
console.log('Element Count by Category:', histogram);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
test('negative path: invalid method should return JSON-RPC error', async () => {
|
|
222
|
+
const response = await client.sendMessage({
|
|
223
|
+
jsonrpc: '2.0',
|
|
224
|
+
id: 'bad-method-1',
|
|
225
|
+
method: 'tools/call_WRONG',
|
|
226
|
+
params: { name: TOOL_NAME, arguments: {} }
|
|
227
|
+
});
|
|
228
|
+
assert.ok(response.error, 'Expected JSON-RPC error object');
|
|
229
|
+
assert.match(response.error.message || '', /method/i, 'Error message should mention method');
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test('performance: response time under 500ms', async () => {
|
|
233
|
+
const start = Date.now();
|
|
234
|
+
await invoke();
|
|
235
|
+
const duration = Date.now() - start;
|
|
236
|
+
assert.ok(duration < 500, `Response should be under 500ms, got ${duration}ms`);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
test('alphabetical name sorting verification', async () => {
|
|
240
|
+
const { raw } = await invoke();
|
|
241
|
+
const categories = safeParseCategories(raw);
|
|
242
|
+
const names = categories.map(cat => cat.name);
|
|
243
|
+
const sorted = [...names].sort();
|
|
244
|
+
assert.deepEqual(names, sorted, 'Category names should be alphabetically sorted');
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
test('element count consistency with list_isml_elements tool', async () => {
|
|
248
|
+
// Get categories
|
|
249
|
+
const { raw: catRaw } = await invoke();
|
|
250
|
+
const categories = safeParseCategories(catRaw);
|
|
251
|
+
const totalByCat = categories.reduce((sum, cat) => sum + cat.count, 0);
|
|
252
|
+
|
|
253
|
+
// Get elements
|
|
254
|
+
const elemResult = await client.callTool('list_isml_elements', {});
|
|
255
|
+
const elemRaw = elemResult.content[0].text;
|
|
256
|
+
const elements = JSON.parse(elemRaw);
|
|
257
|
+
|
|
258
|
+
// Counts should match
|
|
259
|
+
assert.equal(elements.length, totalByCat, 'Total element count should match sum of category counts');
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test('each category name matches elements in list_isml_elements', async () => {
|
|
263
|
+
// Get categories
|
|
264
|
+
const { raw: catRaw } = await invoke();
|
|
265
|
+
const categories = safeParseCategories(catRaw);
|
|
266
|
+
|
|
267
|
+
// Get elements
|
|
268
|
+
const elemResult = await client.callTool('list_isml_elements', {});
|
|
269
|
+
const elemRaw = elemResult.content[0].text;
|
|
270
|
+
const elements = JSON.parse(elemRaw);
|
|
271
|
+
const elementCategories = new Set(elements.map(el => el.category));
|
|
272
|
+
|
|
273
|
+
// All categories should be represented in elements
|
|
274
|
+
for (const cat of categories) {
|
|
275
|
+
assert.ok(elementCategories.has(cat.name), `Category ${cat.name} should have elements in list_isml_elements`);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
});
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic tests for the MCP tool: get_isml_element
|
|
3
|
+
* Mirrors YAML tests but adds deeper JSON parsing & resilience checks.
|
|
4
|
+
*
|
|
5
|
+
* Validates:
|
|
6
|
+
* 1. Tool is registered
|
|
7
|
+
* 2. Successful retrieval of valid elements (isif, isloop, isprint)
|
|
8
|
+
* 3. Element normalization (with/without 'is' prefix)
|
|
9
|
+
* 4. JSON structure validation (name, title, description, sections, content, category, attributes, filename)
|
|
10
|
+
* 5. Include options (sections, attributes, content)
|
|
11
|
+
* 6. Error handling for non-existent elements
|
|
12
|
+
* 7. Error handling for missing parameters
|
|
13
|
+
* 8. Content quality and completeness
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { test, describe, before, after, beforeEach } from 'node:test';
|
|
17
|
+
import { strict as assert } from 'node:assert';
|
|
18
|
+
import { connect } from 'mcp-aegis';
|
|
19
|
+
|
|
20
|
+
describe('get_isml_element (programmatic)', () => {
|
|
21
|
+
let client;
|
|
22
|
+
const CONFIG = './aegis.config.docs-only.json';
|
|
23
|
+
|
|
24
|
+
before(async () => {
|
|
25
|
+
client = await connect(CONFIG);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
after(async () => {
|
|
29
|
+
if (client?.connected) {
|
|
30
|
+
await client.disconnect();
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
client.clearAllBuffers();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const TOOL_NAME = 'get_isml_element';
|
|
39
|
+
const REQUIRED_KEYS = ['name', 'title', 'description', 'sections', 'content', 'category', 'attributes', 'filename'];
|
|
40
|
+
|
|
41
|
+
test('tool should be registered', async () => {
|
|
42
|
+
const tools = await client.listTools();
|
|
43
|
+
const names = tools.map(t => t.name);
|
|
44
|
+
assert.ok(names.includes(TOOL_NAME), 'Tool not found in listTools');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
async function invoke(elementName, options = {}) {
|
|
48
|
+
const result = await client.callTool(TOOL_NAME, { elementName, ...options });
|
|
49
|
+
return { result, raw: result.content[0]?.text };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function safeParseElement(raw) {
|
|
53
|
+
let element;
|
|
54
|
+
try {
|
|
55
|
+
element = JSON.parse(raw);
|
|
56
|
+
} catch (err) {
|
|
57
|
+
assert.fail(`Failed to parse response as JSON: ${err.message}\nRaw: ${raw.substring(0, 500)}`);
|
|
58
|
+
}
|
|
59
|
+
assert.ok(typeof element === 'object' && element !== null, 'Parsed element should be object');
|
|
60
|
+
return element;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
test('retrieve isif element with full details', async () => {
|
|
64
|
+
const { result, raw } = await invoke('isif');
|
|
65
|
+
assert.equal(result.isError, false, 'Should not be error');
|
|
66
|
+
|
|
67
|
+
const element = safeParseElement(raw);
|
|
68
|
+
assert.equal(element.name, 'isif', 'Element name should be isif');
|
|
69
|
+
assert.ok(element.title.includes('isif'), 'Title should mention isif');
|
|
70
|
+
assert.ok(element.description.length > 50, 'Description should be substantial');
|
|
71
|
+
assert.equal(element.category, 'control-flow', 'Should be control-flow category');
|
|
72
|
+
assert.match(element.filename, /isif\.md$/, 'Filename should be isif.md');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('retrieve isloop element details', async () => {
|
|
76
|
+
const { result, raw } = await invoke('isloop');
|
|
77
|
+
assert.equal(result.isError, false, 'Should not be error');
|
|
78
|
+
|
|
79
|
+
const element = safeParseElement(raw);
|
|
80
|
+
assert.equal(element.name, 'isloop', 'Element name should be isloop');
|
|
81
|
+
assert.ok(element.title.includes('isloop'), 'Title should mention isloop');
|
|
82
|
+
assert.equal(element.category, 'control-flow', 'Should be control-flow category');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('retrieve isprint element details', async () => {
|
|
86
|
+
const { result, raw } = await invoke('isprint');
|
|
87
|
+
assert.equal(result.isError, false, 'Should not be error');
|
|
88
|
+
|
|
89
|
+
const element = safeParseElement(raw);
|
|
90
|
+
assert.equal(element.name, 'isprint', 'Element name should be isprint');
|
|
91
|
+
assert.ok(element.title.includes('isprint'), 'Title should mention isprint');
|
|
92
|
+
assert.equal(element.category, 'output', 'Should be output category');
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test('normalize element name without is prefix', async () => {
|
|
96
|
+
const { result, raw } = await invoke('print');
|
|
97
|
+
assert.equal(result.isError, false, 'Should not be error');
|
|
98
|
+
|
|
99
|
+
const element = safeParseElement(raw);
|
|
100
|
+
assert.equal(element.name, 'isprint', 'Should normalize to isprint');
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('all required keys present in response', async () => {
|
|
104
|
+
const { raw } = await invoke('isif');
|
|
105
|
+
const element = safeParseElement(raw);
|
|
106
|
+
|
|
107
|
+
for (const key of REQUIRED_KEYS) {
|
|
108
|
+
assert.ok(Object.prototype.hasOwnProperty.call(element, key), `Element should have ${key}`);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('sections array is populated and reasonable', async () => {
|
|
113
|
+
const { raw } = await invoke('isif');
|
|
114
|
+
const element = safeParseElement(raw);
|
|
115
|
+
|
|
116
|
+
assert.ok(Array.isArray(element.sections), 'Sections should be array');
|
|
117
|
+
assert.ok(element.sections.length >= 5, 'Should have at least 5 sections');
|
|
118
|
+
assert.ok(element.sections.every(s => typeof s === 'string'), 'All sections should be strings');
|
|
119
|
+
assert.ok(element.sections.every(s => s.length > 0), 'All sections should be non-empty');
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('attributes array is present', async () => {
|
|
123
|
+
const { raw } = await invoke('isloop');
|
|
124
|
+
const element = safeParseElement(raw);
|
|
125
|
+
|
|
126
|
+
assert.ok(Array.isArray(element.attributes), 'Attributes should be array');
|
|
127
|
+
// Some elements may have empty attributes array, that's ok
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
test('content is substantial markdown text', async () => {
|
|
131
|
+
const { raw } = await invoke('isif');
|
|
132
|
+
const element = safeParseElement(raw);
|
|
133
|
+
|
|
134
|
+
assert.ok(typeof element.content === 'string', 'Content should be string');
|
|
135
|
+
assert.ok(element.content.length > 1000, 'Content should be substantial (>1000 chars)');
|
|
136
|
+
assert.ok(element.content.includes('#'), 'Content should include markdown headers');
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test('error for non-existent element', async () => {
|
|
140
|
+
const { result } = await invoke('nonexistent');
|
|
141
|
+
assert.equal(result.isError, true, 'Should be error');
|
|
142
|
+
assert.ok(result.content[0].text.includes('not found'), 'Error should mention not found');
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test('error for missing elementName parameter', async () => {
|
|
146
|
+
const result = await client.callTool(TOOL_NAME, {});
|
|
147
|
+
assert.equal(result.isError, true, 'Should be error for missing parameter');
|
|
148
|
+
assert.match(result.content[0].text, /elementName/i, 'Error should mention elementName');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('include sections option', async () => {
|
|
152
|
+
const { raw } = await invoke('isif', { includeSections: true });
|
|
153
|
+
const element = safeParseElement(raw);
|
|
154
|
+
|
|
155
|
+
assert.ok(Array.isArray(element.sections), 'Sections should be included');
|
|
156
|
+
assert.ok(element.sections.length > 0, 'Sections should not be empty');
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test('include attributes option', async () => {
|
|
160
|
+
const { raw } = await invoke('isloop', { includeAttributes: true });
|
|
161
|
+
const element = safeParseElement(raw);
|
|
162
|
+
|
|
163
|
+
assert.ok(Array.isArray(element.attributes), 'Attributes should be included');
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('include content option', async () => {
|
|
167
|
+
const { raw } = await invoke('isif', { includeContent: true });
|
|
168
|
+
const element = safeParseElement(raw);
|
|
169
|
+
|
|
170
|
+
assert.ok(element.content, 'Content should be included');
|
|
171
|
+
assert.ok(element.content.length > 0, 'Content should not be empty');
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test('filename pattern validation', async () => {
|
|
175
|
+
const { raw } = await invoke('isif');
|
|
176
|
+
const element = safeParseElement(raw);
|
|
177
|
+
|
|
178
|
+
assert.match(element.filename, /^[a-z0-9-]+\.md$/, 'Filename should be kebab-case .md');
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test('lastModified timestamp present and valid', async () => {
|
|
182
|
+
const { raw } = await invoke('isif');
|
|
183
|
+
const element = safeParseElement(raw);
|
|
184
|
+
|
|
185
|
+
assert.ok(element.lastModified, 'lastModified should be present');
|
|
186
|
+
const timestamp = new Date(element.lastModified);
|
|
187
|
+
assert.ok(!isNaN(timestamp.getTime()), 'lastModified should be valid date');
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test('round-trip JSON parse reproducibility', async () => {
|
|
191
|
+
const { raw } = await invoke('isif');
|
|
192
|
+
const element = safeParseElement(raw);
|
|
193
|
+
const roundTrip = JSON.parse(JSON.stringify(element));
|
|
194
|
+
assert.deepEqual(roundTrip, element, 'Round trip serialization must preserve element');
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test('retrieve multiple different elements successfully', async () => {
|
|
198
|
+
const elements = ['isif', 'isloop', 'isprint', 'isscript', 'isset'];
|
|
199
|
+
|
|
200
|
+
for (const elemName of elements) {
|
|
201
|
+
const { result, raw } = await invoke(elemName);
|
|
202
|
+
assert.equal(result.isError, false, `Should retrieve ${elemName} successfully`);
|
|
203
|
+
const element = safeParseElement(raw);
|
|
204
|
+
assert.equal(element.name, elemName, `Element name should match ${elemName}`);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
test('description quality (min 50 chars)', async () => {
|
|
209
|
+
const { raw } = await invoke('isif');
|
|
210
|
+
const element = safeParseElement(raw);
|
|
211
|
+
|
|
212
|
+
assert.ok(element.description.length >= 50, `Description should be at least 50 chars, got ${element.description.length}`);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
test('title quality (reasonable length)', async () => {
|
|
216
|
+
const { raw } = await invoke('isif');
|
|
217
|
+
const element = safeParseElement(raw);
|
|
218
|
+
|
|
219
|
+
assert.ok(element.title.length >= 10, 'Title should be at least 10 chars');
|
|
220
|
+
assert.ok(element.title.length <= 100, 'Title should be at most 100 chars');
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
test('negative path: invalid method should return JSON-RPC error', async () => {
|
|
224
|
+
const response = await client.sendMessage({
|
|
225
|
+
jsonrpc: '2.0',
|
|
226
|
+
id: 'bad-method-1',
|
|
227
|
+
method: 'tools/call_WRONG',
|
|
228
|
+
params: { name: TOOL_NAME, arguments: { elementName: 'isif' } }
|
|
229
|
+
});
|
|
230
|
+
assert.ok(response.error, 'Expected JSON-RPC error object');
|
|
231
|
+
assert.match(response.error.message || '', /method/i, 'Error message should mention method');
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
test('performance: response time under 1000ms', async () => {
|
|
235
|
+
const start = Date.now();
|
|
236
|
+
await invoke('isif');
|
|
237
|
+
const duration = Date.now() - start;
|
|
238
|
+
assert.ok(duration < 1000, `Response should be under 1000ms, got ${duration}ms`);
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
test('case insensitive element name lookup', async () => {
|
|
242
|
+
const { result, raw } = await invoke('ISIF');
|
|
243
|
+
assert.equal(result.isError, false, 'Should handle uppercase');
|
|
244
|
+
const element = safeParseElement(raw);
|
|
245
|
+
assert.equal(element.name, 'isif', 'Should normalize to lowercase');
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
test('mixed case element name lookup', async () => {
|
|
249
|
+
const { result, raw } = await invoke('IsIf');
|
|
250
|
+
assert.equal(result.isError, false, 'Should handle mixed case');
|
|
251
|
+
const element = safeParseElement(raw);
|
|
252
|
+
assert.equal(element.name, 'isif', 'Should normalize to lowercase');
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
test('extraneous parameters are ignored', async () => {
|
|
256
|
+
const { result, raw } = await invoke('isif', { unused: 'value', extra: 123 });
|
|
257
|
+
assert.equal(result.isError, false, 'Should ignore extraneous params');
|
|
258
|
+
const element = safeParseElement(raw);
|
|
259
|
+
assert.equal(element.name, 'isif', 'Should still retrieve element');
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test('content contains expected markdown structure', async () => {
|
|
263
|
+
const { raw } = await invoke('isif');
|
|
264
|
+
const element = safeParseElement(raw);
|
|
265
|
+
|
|
266
|
+
// Should contain typical markdown elements
|
|
267
|
+
assert.ok(element.content.includes('##'), 'Should have H2 headers');
|
|
268
|
+
assert.ok(element.content.includes('```'), 'Should have code blocks');
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test('requiredAttributes and optionalAttributes arrays present', async () => {
|
|
272
|
+
const { raw } = await invoke('isif');
|
|
273
|
+
const element = safeParseElement(raw);
|
|
274
|
+
|
|
275
|
+
assert.ok(Array.isArray(element.requiredAttributes), 'requiredAttributes should be array');
|
|
276
|
+
assert.ok(Array.isArray(element.optionalAttributes), 'optionalAttributes should be array');
|
|
277
|
+
});
|
|
278
|
+
});
|