sfcc-dev-mcp 1.0.15 → 1.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.yml +3 -1
- package/.github/ISSUE_TEMPLATE/documentation.yml +2 -2
- package/.github/ISSUE_TEMPLATE/question.yml +1 -1
- package/.github/PULL_REQUEST_TEMPLATE/documentation.md +1 -1
- package/.github/PULL_REQUEST_TEMPLATE/new_tool.md +1 -1
- package/.github/agents/official-docs-researcher.agent.md +56 -0
- package/.github/instructions/mcp-node-tests.instructions.md +12 -916
- package/.github/instructions/mcp-yml-tests.instructions.md +14 -742
- package/.github/pull_request_template.md +1 -1
- package/.github/skills/agent-authoring/SKILL.md +66 -0
- package/.github/skills/mcp-log-debugging/SKILL.md +69 -0
- package/.github/skills/mcp-programmatic-testing/SKILL.md +142 -0
- package/.github/skills/mcp-yaml-testing/SKILL.md +136 -0
- package/.github/skills/salesforce-developer-site-scraper/SKILL.md +102 -0
- package/.github/skills/salesforce-developer-site-scraper/scripts/scrape-to-markdown.js +205 -0
- package/.github/skills/salesforce-help-site-scraper/SKILL.md +84 -0
- package/.github/skills/salesforce-help-site-scraper/scripts/scrape-help-to-markdown.js +212 -0
- package/.github/skills/skill-authoring/SKILL.md +228 -0
- package/.github/skills/skill-authoring/references/PATTERNS.md +384 -0
- package/.github/workflows/ci.yml +3 -3
- package/.github/workflows/deploy-pages.yml +9 -19
- package/.github/workflows/publish.yml +5 -2
- package/.github/workflows/update-docs.yml +1 -1
- package/AGENTS.md +140 -286
- package/CONTRIBUTING.md +10 -22
- package/README.md +48 -16
- package/ai-instructions/{github-copilot/copilot-instructions.md → AGENTS.md} +99 -127
- package/ai-instructions/skills/sfcc-caching/SKILL.md +89 -0
- package/{dist/docs/best-practices/cartridge_creation.md → ai-instructions/skills/sfcc-cartridge-development/SKILL.md} +31 -7
- package/ai-instructions/skills/sfcc-forms-development/SKILL.md +261 -0
- package/ai-instructions/skills/sfcc-forms-development/references/ARCHITECTURE-SGJC-SFRA.md +143 -0
- package/ai-instructions/skills/sfcc-forms-development/references/FORM-XML-CHEATSHEET.md +127 -0
- package/ai-instructions/skills/sfcc-fraud-prevention/SKILL.md +95 -0
- package/ai-instructions/skills/sfcc-hooks-registration/SKILL.md +39 -0
- package/ai-instructions/skills/sfcc-isml-development/SKILL.md +370 -0
- package/ai-instructions/skills/sfcc-isml-development/references/REMOTE-INCLUDES.md +116 -0
- package/ai-instructions/skills/sfcc-isml-development/references/SFRA-LAYOUTS.md +50 -0
- package/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CART-ACCOUNT-AUTH.md +45 -0
- package/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CATALOG.md +85 -0
- package/ai-instructions/skills/sfcc-isml-development/references/SFRA-STRUCTURE-COMPONENTS.md +63 -0
- package/ai-instructions/skills/sfcc-isml-development/references/UTILITIES-EXPRESSIONS.md +159 -0
- package/ai-instructions/skills/sfcc-isml-development/references/sfra-base-templates-architecture.md +13 -0
- package/ai-instructions/skills/sfcc-job-development/SKILL.md +334 -0
- package/ai-instructions/skills/sfcc-job-development/references/CHUNK-ORIENTED.md +393 -0
- package/ai-instructions/skills/sfcc-job-development/references/STEPTYPES-JSON.md +271 -0
- package/ai-instructions/skills/sfcc-job-development/references/TASK-ORIENTED.md +257 -0
- package/ai-instructions/skills/sfcc-localization/SKILL.md +92 -0
- package/ai-instructions/skills/sfcc-localization/references/CONTROLLERS.md +63 -0
- package/ai-instructions/skills/sfcc-localization/references/FORMATTING.md +29 -0
- package/ai-instructions/skills/sfcc-localization/references/FORMS-LOCALIZATION.md +33 -0
- package/ai-instructions/skills/sfcc-localization/references/JAVASCRIPT-LOCALIZATION.md +41 -0
- package/ai-instructions/skills/sfcc-localization/references/LOCALE-SWITCHING.md +35 -0
- package/ai-instructions/skills/sfcc-localization/references/PATTERNS.md +740 -0
- package/ai-instructions/skills/sfcc-localization/references/PROPERTIES-ENCODING.md +25 -0
- package/ai-instructions/skills/sfcc-localization/references/RESOURCE-BUNDLES.md +67 -0
- package/ai-instructions/skills/sfcc-localization/references/STATIC-FILES.md +23 -0
- package/ai-instructions/skills/sfcc-localization/references/TESTING.md +21 -0
- package/{docs/best-practices/localserviceregistry.md → ai-instructions/skills/sfcc-localserviceregistry/SKILL.md} +65 -31
- package/ai-instructions/skills/sfcc-logging/SKILL.md +352 -0
- package/ai-instructions/skills/sfcc-logging/references/LOG-FILES.md +282 -0
- package/{docs/best-practices/ocapi_hooks.md → ai-instructions/skills/sfcc-ocapi-hooks/SKILL.md} +51 -16
- package/ai-instructions/skills/sfcc-ocapi-scapi-slas/SKILL.md +108 -0
- package/ai-instructions/skills/sfcc-page-designer/SKILL.md +353 -0
- package/ai-instructions/skills/sfcc-page-designer/references/ATTRIBUTE-TYPES.md +436 -0
- package/ai-instructions/skills/sfcc-page-designer/references/META-DEFINITIONS.md +322 -0
- package/{dist/docs/best-practices/performance.md → ai-instructions/skills/sfcc-performance/SKILL.md} +35 -3
- package/ai-instructions/skills/sfcc-platform-limits/SKILL.md +89 -0
- package/ai-instructions/skills/sfcc-scapi-custom-endpoints/SKILL.md +237 -0
- package/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/AUTHENTICATION.md +214 -0
- package/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/URL-MAPPING.md +253 -0
- package/{docs/best-practices/scapi_hooks.md → ai-instructions/skills/sfcc-scapi-hooks/SKILL.md} +44 -17
- package/ai-instructions/skills/sfcc-script-evaluation/SKILL.md +380 -0
- package/{docs/best-practices/security.md → ai-instructions/skills/sfcc-security/SKILL.md} +12 -3
- package/ai-instructions/skills/sfcc-sfra-client-side-js/SKILL.md +270 -0
- package/ai-instructions/skills/sfcc-sfra-client-side-js/references/AJAX-CSRF-VALIDATION.md +285 -0
- package/ai-instructions/skills/sfcc-sfra-client-side-js/references/BASE-MODULE-INDEX.md +206 -0
- package/ai-instructions/skills/sfcc-sfra-client-side-js/references/EXTENSION-PATTERNS.md +165 -0
- package/ai-instructions/skills/sfcc-sfra-client-side-js/references/PLUGIN-PATTERNS.md +185 -0
- package/ai-instructions/skills/sfcc-sfra-controllers/SKILL.md +347 -0
- package/ai-instructions/skills/sfcc-sfra-controllers/references/MIDDLEWARE-REFERENCE.md +257 -0
- package/ai-instructions/skills/sfcc-sfra-controllers/references/REMOTE-INCLUDES.md +193 -0
- package/{dist/docs/best-practices/sfra_controllers.md → ai-instructions/skills/sfcc-sfra-controllers/references/standard-sfra-controllers.md} +0 -670
- package/ai-instructions/skills/sfcc-sfra-models/SKILL.md +322 -0
- package/ai-instructions/skills/sfcc-sfra-models/references/MODEL-PATTERNS.md +530 -0
- package/ai-instructions/skills/sfcc-sfra-models/references/MODEL-STRUCTURE.md +234 -0
- package/ai-instructions/skills/sfcc-sfra-models/references/TESTING-SECURITY.md +417 -0
- package/{dist/docs/best-practices/sfra_scss.md → ai-instructions/skills/sfcc-sfra-scss/SKILL.md} +5 -0
- package/ai-instructions/skills/sfcc-webdav-workflows/SKILL.md +111 -0
- package/dist/ai-instructions/AGENTS.md +628 -0
- package/dist/ai-instructions/skills/sfcc-caching/SKILL.md +89 -0
- package/{docs/best-practices/cartridge_creation.md → dist/ai-instructions/skills/sfcc-cartridge-development/SKILL.md} +31 -7
- package/dist/ai-instructions/skills/sfcc-forms-development/SKILL.md +261 -0
- package/dist/ai-instructions/skills/sfcc-forms-development/references/ARCHITECTURE-SGJC-SFRA.md +143 -0
- package/dist/ai-instructions/skills/sfcc-forms-development/references/FORM-XML-CHEATSHEET.md +127 -0
- package/dist/ai-instructions/skills/sfcc-fraud-prevention/SKILL.md +95 -0
- package/dist/ai-instructions/skills/sfcc-hooks-registration/SKILL.md +39 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/SKILL.md +370 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/REMOTE-INCLUDES.md +116 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-LAYOUTS.md +50 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CART-ACCOUNT-AUTH.md +45 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CATALOG.md +85 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-STRUCTURE-COMPONENTS.md +63 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/UTILITIES-EXPRESSIONS.md +159 -0
- package/dist/ai-instructions/skills/sfcc-isml-development/references/sfra-base-templates-architecture.md +13 -0
- package/dist/ai-instructions/skills/sfcc-job-development/SKILL.md +334 -0
- package/dist/ai-instructions/skills/sfcc-job-development/references/CHUNK-ORIENTED.md +393 -0
- package/dist/ai-instructions/skills/sfcc-job-development/references/STEPTYPES-JSON.md +271 -0
- package/dist/ai-instructions/skills/sfcc-job-development/references/TASK-ORIENTED.md +257 -0
- package/dist/ai-instructions/skills/sfcc-localization/SKILL.md +92 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/CONTROLLERS.md +63 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/FORMATTING.md +29 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/FORMS-LOCALIZATION.md +33 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/JAVASCRIPT-LOCALIZATION.md +41 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/LOCALE-SWITCHING.md +35 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/PATTERNS.md +740 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/PROPERTIES-ENCODING.md +25 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/RESOURCE-BUNDLES.md +67 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/STATIC-FILES.md +23 -0
- package/dist/ai-instructions/skills/sfcc-localization/references/TESTING.md +21 -0
- package/dist/{docs/best-practices/localserviceregistry.md → ai-instructions/skills/sfcc-localserviceregistry/SKILL.md} +65 -31
- package/dist/ai-instructions/skills/sfcc-logging/SKILL.md +352 -0
- package/dist/ai-instructions/skills/sfcc-logging/references/LOG-FILES.md +282 -0
- package/dist/{docs/best-practices/ocapi_hooks.md → ai-instructions/skills/sfcc-ocapi-hooks/SKILL.md} +51 -16
- package/dist/ai-instructions/skills/sfcc-ocapi-scapi-slas/SKILL.md +108 -0
- package/dist/ai-instructions/skills/sfcc-page-designer/SKILL.md +353 -0
- package/dist/ai-instructions/skills/sfcc-page-designer/references/ATTRIBUTE-TYPES.md +436 -0
- package/dist/ai-instructions/skills/sfcc-page-designer/references/META-DEFINITIONS.md +322 -0
- package/{docs/best-practices/performance.md → dist/ai-instructions/skills/sfcc-performance/SKILL.md} +35 -3
- package/dist/ai-instructions/skills/sfcc-platform-limits/SKILL.md +89 -0
- package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/SKILL.md +237 -0
- package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/AUTHENTICATION.md +214 -0
- package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/URL-MAPPING.md +253 -0
- package/dist/{docs/best-practices/scapi_hooks.md → ai-instructions/skills/sfcc-scapi-hooks/SKILL.md} +44 -17
- package/dist/ai-instructions/skills/sfcc-script-evaluation/SKILL.md +380 -0
- package/dist/{docs/best-practices/security.md → ai-instructions/skills/sfcc-security/SKILL.md} +12 -3
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/SKILL.md +270 -0
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/AJAX-CSRF-VALIDATION.md +285 -0
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/BASE-MODULE-INDEX.md +206 -0
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/EXTENSION-PATTERNS.md +165 -0
- package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/PLUGIN-PATTERNS.md +185 -0
- package/dist/ai-instructions/skills/sfcc-sfra-controllers/SKILL.md +347 -0
- package/dist/ai-instructions/skills/sfcc-sfra-controllers/references/MIDDLEWARE-REFERENCE.md +257 -0
- package/dist/ai-instructions/skills/sfcc-sfra-controllers/references/REMOTE-INCLUDES.md +193 -0
- package/{docs/best-practices/sfra_controllers.md → dist/ai-instructions/skills/sfcc-sfra-controllers/references/standard-sfra-controllers.md} +0 -670
- package/dist/ai-instructions/skills/sfcc-sfra-models/SKILL.md +322 -0
- package/dist/ai-instructions/skills/sfcc-sfra-models/references/MODEL-PATTERNS.md +530 -0
- package/dist/ai-instructions/skills/sfcc-sfra-models/references/MODEL-STRUCTURE.md +234 -0
- package/dist/ai-instructions/skills/sfcc-sfra-models/references/TESTING-SECURITY.md +417 -0
- package/{docs/best-practices/sfra_scss.md → dist/ai-instructions/skills/sfcc-sfra-scss/SKILL.md} +5 -0
- package/dist/ai-instructions/skills/sfcc-webdav-workflows/SKILL.md +111 -0
- package/dist/clients/agent-instructions-client.d.ts +66 -0
- package/dist/clients/agent-instructions-client.d.ts.map +1 -0
- package/dist/clients/agent-instructions-client.js +277 -0
- package/dist/clients/agent-instructions-client.js.map +1 -0
- package/dist/clients/base/abstract-documentation-client.d.ts +146 -0
- package/dist/clients/base/abstract-documentation-client.d.ts.map +1 -0
- package/dist/clients/base/abstract-documentation-client.js +265 -0
- package/dist/clients/base/abstract-documentation-client.js.map +1 -0
- package/dist/clients/base/oauth-token.d.ts +18 -0
- package/dist/clients/base/oauth-token.d.ts.map +1 -1
- package/dist/clients/base/oauth-token.js +45 -2
- package/dist/clients/base/oauth-token.js.map +1 -1
- package/dist/clients/cartridge/cartridge-generation-client.d.ts +59 -0
- package/dist/clients/cartridge/cartridge-generation-client.d.ts.map +1 -0
- package/dist/clients/cartridge/cartridge-generation-client.js +224 -0
- package/dist/clients/cartridge/cartridge-generation-client.js.map +1 -0
- package/dist/clients/cartridge/cartridge-structure.d.ts +17 -0
- package/dist/clients/cartridge/cartridge-structure.d.ts.map +1 -0
- package/dist/clients/cartridge/cartridge-structure.js +33 -0
- package/dist/clients/cartridge/cartridge-structure.js.map +1 -0
- package/dist/clients/cartridge/cartridge-templates.d.ts +22 -0
- package/dist/clients/cartridge/cartridge-templates.d.ts.map +1 -0
- package/dist/clients/cartridge/cartridge-templates.js +225 -0
- package/dist/clients/cartridge/cartridge-templates.js.map +1 -0
- package/dist/clients/cartridge/index.d.ts +7 -0
- package/dist/clients/cartridge/index.d.ts.map +1 -0
- package/dist/clients/cartridge/index.js +7 -0
- package/dist/clients/cartridge/index.js.map +1 -0
- package/dist/clients/docs/documentation-scanner.d.ts +5 -2
- package/dist/clients/docs/documentation-scanner.d.ts.map +1 -1
- package/dist/clients/docs/documentation-scanner.js +38 -23
- package/dist/clients/docs/documentation-scanner.js.map +1 -1
- package/dist/clients/docs-client.d.ts +13 -4
- package/dist/clients/docs-client.d.ts.map +1 -1
- package/dist/clients/docs-client.js +44 -11
- package/dist/clients/docs-client.js.map +1 -1
- package/dist/clients/isml-client.d.ts +71 -0
- package/dist/clients/isml-client.d.ts.map +1 -0
- package/dist/clients/isml-client.js +252 -0
- package/dist/clients/isml-client.js.map +1 -0
- package/dist/clients/ocapi/code-versions-client.d.ts.map +1 -1
- package/dist/clients/ocapi/code-versions-client.js +6 -1
- package/dist/clients/ocapi/code-versions-client.js.map +1 -1
- package/dist/clients/ocapi-client.d.ts +9 -101
- package/dist/clients/ocapi-client.d.ts.map +1 -1
- package/dist/clients/ocapi-client.js +11 -93
- package/dist/clients/ocapi-client.js.map +1 -1
- package/dist/clients/script-debugger/index.d.ts +5 -0
- package/dist/clients/script-debugger/index.d.ts.map +1 -0
- package/dist/clients/script-debugger/index.js +5 -0
- package/dist/clients/script-debugger/index.js.map +1 -0
- package/dist/clients/script-debugger/script-debugger-client.d.ts +147 -0
- package/dist/clients/script-debugger/script-debugger-client.d.ts.map +1 -0
- package/dist/clients/script-debugger/script-debugger-client.js +591 -0
- package/dist/clients/script-debugger/script-debugger-client.js.map +1 -0
- package/dist/clients/sfra-client.d.ts +13 -62
- package/dist/clients/sfra-client.d.ts.map +1 -1
- package/dist/clients/sfra-client.js +105 -326
- package/dist/clients/sfra-client.js.map +1 -1
- package/dist/config/configuration-factory.d.ts +1 -1
- package/dist/config/configuration-factory.d.ts.map +1 -1
- package/dist/config/configuration-factory.js +5 -1
- package/dist/config/configuration-factory.js.map +1 -1
- package/dist/config/dw-json-loader.d.ts +7 -0
- package/dist/config/dw-json-loader.d.ts.map +1 -1
- package/dist/config/dw-json-loader.js +92 -15
- package/dist/config/dw-json-loader.js.map +1 -1
- package/dist/config/workspace-roots.d.ts +143 -0
- package/dist/config/workspace-roots.d.ts.map +1 -0
- package/dist/config/workspace-roots.js +448 -0
- package/dist/config/workspace-roots.js.map +1 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +3 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/core/handlers/abstract-client-handler.d.ts +52 -0
- package/dist/core/handlers/abstract-client-handler.d.ts.map +1 -0
- package/dist/core/handlers/abstract-client-handler.js +51 -0
- package/dist/core/handlers/abstract-client-handler.js.map +1 -0
- package/dist/core/handlers/agent-instructions-handler.d.ts +17 -0
- package/dist/core/handlers/agent-instructions-handler.d.ts.map +1 -0
- package/dist/core/handlers/agent-instructions-handler.js +38 -0
- package/dist/core/handlers/agent-instructions-handler.js.map +1 -0
- package/dist/core/handlers/base-handler.d.ts +3 -68
- package/dist/core/handlers/base-handler.d.ts.map +1 -1
- package/dist/core/handlers/base-handler.js +11 -84
- package/dist/core/handlers/base-handler.js.map +1 -1
- package/dist/core/handlers/cartridge-handler.d.ts +10 -11
- package/dist/core/handlers/cartridge-handler.d.ts.map +1 -1
- package/dist/core/handlers/cartridge-handler.js +10 -28
- package/dist/core/handlers/cartridge-handler.js.map +1 -1
- package/dist/core/handlers/client-factory.d.ts +12 -2
- package/dist/core/handlers/client-factory.d.ts.map +1 -1
- package/dist/core/handlers/client-factory.js +28 -1
- package/dist/core/handlers/client-factory.js.map +1 -1
- package/dist/core/handlers/code-version-handler.d.ts +11 -11
- package/dist/core/handlers/code-version-handler.d.ts.map +1 -1
- package/dist/core/handlers/code-version-handler.js +13 -27
- package/dist/core/handlers/code-version-handler.js.map +1 -1
- package/dist/core/handlers/docs-handler.d.ts +6 -12
- package/dist/core/handlers/docs-handler.d.ts.map +1 -1
- package/dist/core/handlers/docs-handler.js +11 -36
- package/dist/core/handlers/docs-handler.js.map +1 -1
- package/dist/core/handlers/isml-handler.d.ts +11 -0
- package/dist/core/handlers/isml-handler.d.ts.map +1 -0
- package/dist/core/handlers/isml-handler.js +18 -0
- package/dist/core/handlers/isml-handler.js.map +1 -0
- package/dist/core/handlers/job-log-handler.d.ts +8 -7
- package/dist/core/handlers/job-log-handler.d.ts.map +1 -1
- package/dist/core/handlers/job-log-handler.js +14 -5
- package/dist/core/handlers/job-log-handler.js.map +1 -1
- package/dist/core/handlers/log-handler.d.ts +8 -7
- package/dist/core/handlers/log-handler.d.ts.map +1 -1
- package/dist/core/handlers/log-handler.js +14 -5
- package/dist/core/handlers/log-handler.js.map +1 -1
- package/dist/core/handlers/script-debugger-handler.d.ts +18 -0
- package/dist/core/handlers/script-debugger-handler.d.ts.map +1 -0
- package/dist/core/handlers/script-debugger-handler.js +31 -0
- package/dist/core/handlers/script-debugger-handler.js.map +1 -0
- package/dist/core/handlers/sfra-handler.d.ts +6 -12
- package/dist/core/handlers/sfra-handler.d.ts.map +1 -1
- package/dist/core/handlers/sfra-handler.js +11 -36
- package/dist/core/handlers/sfra-handler.js.map +1 -1
- package/dist/core/handlers/simple-client-handler.d.ts +41 -0
- package/dist/core/handlers/simple-client-handler.d.ts.map +1 -0
- package/dist/core/handlers/simple-client-handler.js +49 -0
- package/dist/core/handlers/simple-client-handler.js.map +1 -0
- package/dist/core/handlers/system-object-handler.d.ts +11 -11
- package/dist/core/handlers/system-object-handler.d.ts.map +1 -1
- package/dist/core/handlers/system-object-handler.js +13 -27
- package/dist/core/handlers/system-object-handler.js.map +1 -1
- package/dist/core/handlers/validation-helpers.d.ts +22 -24
- package/dist/core/handlers/validation-helpers.d.ts.map +1 -1
- package/dist/core/handlers/validation-helpers.js +89 -39
- package/dist/core/handlers/validation-helpers.js.map +1 -1
- package/dist/core/instruction-advisor.d.ts +28 -0
- package/dist/core/instruction-advisor.d.ts.map +1 -0
- package/dist/core/instruction-advisor.js +114 -0
- package/dist/core/instruction-advisor.js.map +1 -0
- package/dist/core/server.d.ts +25 -0
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +151 -11
- package/dist/core/server.js.map +1 -1
- package/dist/core/tool-definitions.d.ts +6 -854
- package/dist/core/tool-definitions.d.ts.map +1 -1
- package/dist/core/tool-definitions.js +8 -1064
- package/dist/core/tool-definitions.js.map +1 -1
- package/dist/core/tool-schemas/agent-instruction-tools.d.ts +77 -0
- package/dist/core/tool-schemas/agent-instruction-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/agent-instruction-tools.js +72 -0
- package/dist/core/tool-schemas/agent-instruction-tools.js.map +1 -0
- package/dist/core/tool-schemas/cartridge-tools.d.ts +27 -0
- package/dist/core/tool-schemas/cartridge-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/cartridge-tools.js +29 -0
- package/dist/core/tool-schemas/cartridge-tools.js.map +1 -0
- package/dist/core/tool-schemas/code-version-tools.d.ts +28 -0
- package/dist/core/tool-schemas/code-version-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/code-version-tools.js +28 -0
- package/dist/core/tool-schemas/code-version-tools.js.map +1 -0
- package/dist/core/tool-schemas/documentation-tools.d.ts +139 -0
- package/dist/core/tool-schemas/documentation-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/documentation-tools.js +104 -0
- package/dist/core/tool-schemas/documentation-tools.js.map +1 -0
- package/dist/core/tool-schemas/index.d.ts +17 -0
- package/dist/core/tool-schemas/index.d.ts.map +1 -0
- package/dist/core/tool-schemas/index.js +19 -0
- package/dist/core/tool-schemas/index.js.map +1 -0
- package/dist/core/tool-schemas/isml-tools.d.ts +98 -0
- package/dist/core/tool-schemas/isml-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/isml-tools.js +89 -0
- package/dist/core/tool-schemas/isml-tools.js.map +1 -0
- package/dist/core/tool-schemas/log-tools.d.ts +221 -0
- package/dist/core/tool-schemas/log-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/log-tools.js +180 -0
- package/dist/core/tool-schemas/log-tools.js.map +1 -0
- package/dist/core/tool-schemas/script-debugger-tools.d.ts +44 -0
- package/dist/core/tool-schemas/script-debugger-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/script-debugger-tools.js +83 -0
- package/dist/core/tool-schemas/script-debugger-tools.js.map +1 -0
- package/dist/core/tool-schemas/sfra-tools.d.ts +63 -0
- package/dist/core/tool-schemas/sfra-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/sfra-tools.js +65 -0
- package/dist/core/tool-schemas/sfra-tools.js.map +1 -0
- package/dist/core/tool-schemas/shared-schemas.d.ts +350 -0
- package/dist/core/tool-schemas/shared-schemas.d.ts.map +1 -0
- package/dist/core/tool-schemas/shared-schemas.js +153 -0
- package/dist/core/tool-schemas/shared-schemas.js.map +1 -0
- package/dist/core/tool-schemas/system-object-tools.d.ts +511 -0
- package/dist/core/tool-schemas/system-object-tools.d.ts.map +1 -0
- package/dist/core/tool-schemas/system-object-tools.js +126 -0
- package/dist/core/tool-schemas/system-object-tools.js.map +1 -0
- package/dist/docs/dw_net/HTTPClient.md +46 -2
- package/dist/docs/dw_net/HTTPClientLoggingConfig.md +296 -0
- package/dist/docs/dw_order/Basket.md +7 -7
- package/dist/docs/dw_order/BasketMgr.md +22 -6
- package/dist/docs/dw_order.hooks/BasketMergeHooks.md +42 -0
- package/dist/docs/dw_svc/ServiceCallback.md +2 -2
- package/dist/docs/isml/isactivedatacontext.md +382 -0
- package/dist/docs/isml/isactivedatahead.md +566 -0
- package/dist/docs/isml/isanalyticsoff.md +537 -0
- package/dist/docs/isml/isapplepay.md +667 -0
- package/dist/docs/isml/isbreak.md +687 -0
- package/dist/docs/isml/isbuynow.md +682 -0
- package/dist/docs/isml/iscache.md +802 -0
- package/dist/docs/isml/iscomment.md +794 -0
- package/dist/docs/isml/iscomponent.md +797 -0
- package/dist/docs/isml/iscontent.md +594 -0
- package/dist/docs/isml/iscontinue.md +563 -0
- package/dist/docs/isml/iscookie.md +798 -0
- package/dist/docs/isml/isdecorate.md +818 -0
- package/dist/docs/isml/isif.md +737 -0
- package/dist/docs/isml/isinclude.md +874 -0
- package/dist/docs/isml/isloop.md +377 -0
- package/dist/docs/isml/ismodule.md +844 -0
- package/dist/docs/isml/isnext.md +672 -0
- package/dist/docs/isml/isobject.md +760 -0
- package/dist/docs/isml/ispayment.md +577 -0
- package/dist/docs/isml/ispaymentmessages.md +664 -0
- package/dist/docs/isml/isprint.md +875 -0
- package/dist/docs/isml/isredirect.md +716 -0
- package/dist/docs/isml/isremove.md +725 -0
- package/dist/docs/isml/isreplace.md +783 -0
- package/dist/docs/isml/isscript.md +859 -0
- package/dist/docs/isml/isselect.md +908 -0
- package/dist/docs/isml/isset.md +585 -0
- package/dist/docs/isml/isslot.md +824 -0
- package/dist/docs/isml/isstatus.md +711 -0
- package/dist/main.d.ts +16 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +60 -28
- package/dist/main.js.map +1 -1
- package/dist/services/index.d.ts +4 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -2
- package/dist/services/index.js.map +1 -1
- package/dist/tool-configs/agent-instructions-tool-config.d.ts +6 -0
- package/dist/tool-configs/agent-instructions-tool-config.d.ts.map +1 -0
- package/dist/tool-configs/agent-instructions-tool-config.js +74 -0
- package/dist/tool-configs/agent-instructions-tool-config.js.map +1 -0
- package/dist/tool-configs/code-version-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/code-version-tool-config.js +0 -5
- package/dist/tool-configs/code-version-tool-config.js.map +1 -1
- package/dist/tool-configs/docs-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/docs-tool-config.js +0 -7
- package/dist/tool-configs/docs-tool-config.js.map +1 -1
- package/dist/tool-configs/isml-tool-config.d.ts +11 -0
- package/dist/tool-configs/isml-tool-config.d.ts.map +1 -0
- package/dist/tool-configs/isml-tool-config.js +77 -0
- package/dist/tool-configs/isml-tool-config.js.map +1 -0
- package/dist/tool-configs/job-log-tool-config.d.ts +1 -2
- package/dist/tool-configs/job-log-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/job-log-tool-config.js +11 -15
- package/dist/tool-configs/job-log-tool-config.js.map +1 -1
- package/dist/tool-configs/log-tool-config.d.ts +1 -2
- package/dist/tool-configs/log-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/log-tool-config.js +35 -51
- package/dist/tool-configs/log-tool-config.js.map +1 -1
- package/dist/tool-configs/script-debugger-tool-config.d.ts +11 -0
- package/dist/tool-configs/script-debugger-tool-config.d.ts.map +1 -0
- package/dist/tool-configs/script-debugger-tool-config.js +35 -0
- package/dist/tool-configs/script-debugger-tool-config.js.map +1 -0
- package/dist/tool-configs/sfra-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/sfra-tool-config.js +0 -11
- package/dist/tool-configs/sfra-tool-config.js.map +1 -1
- package/dist/tool-configs/system-object-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/system-object-tool-config.js +0 -5
- package/dist/tool-configs/system-object-tool-config.js.map +1 -1
- package/dist/types/types.d.ts +2 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/utils/cache.d.ts +12 -10
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +47 -47
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/category-utils.d.ts +31 -0
- package/dist/utils/category-utils.d.ts.map +1 -0
- package/dist/utils/category-utils.js +45 -0
- package/dist/utils/category-utils.js.map +1 -0
- package/dist/utils/log-tool-constants.d.ts +16 -13
- package/dist/utils/log-tool-constants.d.ts.map +1 -1
- package/dist/utils/log-tool-constants.js +10 -11
- package/dist/utils/log-tool-constants.js.map +1 -1
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +35 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/markdown-utils.d.ts +60 -0
- package/dist/utils/markdown-utils.d.ts.map +1 -0
- package/dist/utils/markdown-utils.js +206 -0
- package/dist/utils/markdown-utils.js.map +1 -0
- package/dist/utils/path-resolver.d.ts +12 -4
- package/dist/utils/path-resolver.d.ts.map +1 -1
- package/dist/utils/path-resolver.js +22 -8
- package/dist/utils/path-resolver.js.map +1 -1
- package/dist/utils/path-validation.d.ts +40 -0
- package/dist/utils/path-validation.d.ts.map +1 -0
- package/dist/utils/path-validation.js +84 -0
- package/dist/utils/path-validation.js.map +1 -0
- package/docs/dw_net/HTTPClient.md +46 -2
- package/docs/dw_net/HTTPClientLoggingConfig.md +296 -0
- package/docs/dw_order/Basket.md +7 -7
- package/docs/dw_order/BasketMgr.md +22 -6
- package/docs/dw_order.hooks/BasketMergeHooks.md +42 -0
- package/docs/dw_svc/ServiceCallback.md +2 -2
- package/docs/isml/isactivedatacontext.md +382 -0
- package/docs/isml/isactivedatahead.md +566 -0
- package/docs/isml/isanalyticsoff.md +537 -0
- package/docs/isml/isapplepay.md +667 -0
- package/docs/isml/isbreak.md +687 -0
- package/docs/isml/isbuynow.md +682 -0
- package/docs/isml/iscache.md +802 -0
- package/docs/isml/iscomment.md +794 -0
- package/docs/isml/iscomponent.md +797 -0
- package/docs/isml/iscontent.md +594 -0
- package/docs/isml/iscontinue.md +563 -0
- package/docs/isml/iscookie.md +798 -0
- package/docs/isml/isdecorate.md +818 -0
- package/docs/isml/isif.md +737 -0
- package/docs/isml/isinclude.md +874 -0
- package/docs/isml/isloop.md +377 -0
- package/docs/isml/ismodule.md +844 -0
- package/docs/isml/isnext.md +672 -0
- package/docs/isml/isobject.md +760 -0
- package/docs/isml/ispayment.md +577 -0
- package/docs/isml/ispaymentmessages.md +664 -0
- package/docs/isml/isprint.md +875 -0
- package/docs/isml/isredirect.md +716 -0
- package/docs/isml/isremove.md +725 -0
- package/docs/isml/isreplace.md +783 -0
- package/docs/isml/isscript.md +859 -0
- package/docs/isml/isselect.md +908 -0
- package/docs/isml/isset.md +585 -0
- package/docs/isml/isslot.md +824 -0
- package/docs/isml/isstatus.md +711 -0
- package/docs-site-v2/.vitepress/config.mts +190 -0
- package/docs-site-v2/.vitepress/theme/components/AssistantTabs.vue +96 -0
- package/docs-site-v2/.vitepress/theme/components/Callout.vue +10 -0
- package/docs-site-v2/.vitepress/theme/components/Collapsible.vue +14 -0
- package/docs-site-v2/.vitepress/theme/components/DwJsonBuilder.vue +82 -0
- package/docs-site-v2/.vitepress/theme/components/HomeSections.vue +552 -0
- package/docs-site-v2/.vitepress/theme/components/InstructionFilesTabs.vue +87 -0
- package/docs-site-v2/.vitepress/theme/components/ModeTabs.vue +70 -0
- package/docs-site-v2/.vitepress/theme/components/NewcomerCTA.vue +14 -0
- package/docs-site-v2/.vitepress/theme/components/QuickStartCards.vue +20 -0
- package/docs-site-v2/.vitepress/theme/components/QuickStartHero.vue +20 -0
- package/docs-site-v2/.vitepress/theme/components/SkillsList.vue +48 -0
- package/docs-site-v2/.vitepress/theme/components/ToolExplorer.vue +85 -0
- package/docs-site-v2/.vitepress/theme/custom.css +1373 -0
- package/docs-site-v2/.vitepress/theme/index.ts +39 -0
- package/docs-site-v2/data/skills.ts +147 -0
- package/docs-site-v2/data/tools.ts +490 -0
- package/docs-site-v2/development/index.md +151 -0
- package/docs-site-v2/examples/index.md +333 -0
- package/docs-site-v2/features/index.md +144 -0
- package/docs-site-v2/guide/ai-interfaces.md +58 -0
- package/docs-site-v2/guide/configuration.md +208 -0
- package/docs-site-v2/guide/index.md +50 -0
- package/docs-site-v2/index.md +32 -0
- package/docs-site-v2/package-lock.json +2511 -0
- package/docs-site-v2/package.json +15 -0
- package/docs-site-v2/public/android-chrome-192x192.png +0 -0
- package/docs-site-v2/public/android-chrome-512x512.png +0 -0
- package/docs-site-v2/public/apple-touch-icon.png +0 -0
- package/docs-site-v2/public/favicon-16x16.png +0 -0
- package/docs-site-v2/public/favicon-32x32.png +0 -0
- package/docs-site-v2/public/favicon.ico +0 -0
- package/docs-site-v2/public/index.css +4174 -0
- package/docs-site-v2/public/llms.txt +44 -0
- package/docs-site-v2/public/logo-dark.svg +8 -0
- package/docs-site-v2/public/logo.svg +8 -0
- package/{docs-site → docs-site-v2}/public/robots.txt +1 -6
- package/{docs-site → docs-site-v2}/public/site.webmanifest +1 -1
- package/{docs-site → docs-site-v2}/public/sitemap.xml +33 -12
- package/docs-site-v2/script-debugger/index.md +105 -0
- package/docs-site-v2/scripts/generate-llms.js +71 -0
- package/docs-site-v2/scripts/generate-sitemap.js +97 -0
- package/docs-site-v2/security/index.md +115 -0
- package/docs-site-v2/skills/index.md +40 -0
- package/docs-site-v2/tools/index.md +36 -0
- package/docs-site-v2/troubleshooting/index.md +204 -0
- package/eslint.config.js +3 -1
- package/memories/repo/docs-site-v2-build.json +11 -0
- package/package.json +18 -14
- package/scripts/validate-server-json.js +68 -0
- package/server.json +4 -6
- package/src/clients/agent-instructions-client.ts +370 -0
- package/src/clients/base/abstract-documentation-client.ts +405 -0
- package/src/clients/base/oauth-token.ts +52 -2
- package/src/clients/cartridge/cartridge-generation-client.ts +302 -0
- package/src/clients/cartridge/cartridge-structure.ts +37 -0
- package/src/clients/cartridge/cartridge-templates.ts +246 -0
- package/src/clients/cartridge/index.ts +6 -0
- package/src/clients/docs/documentation-scanner.ts +44 -28
- package/src/clients/docs-client.ts +54 -14
- package/src/clients/isml-client.ts +353 -0
- package/src/clients/ocapi/code-versions-client.ts +7 -1
- package/src/clients/ocapi-client.ts +11 -166
- package/src/clients/script-debugger/index.ts +5 -0
- package/src/clients/script-debugger/script-debugger-client.ts +754 -0
- package/src/clients/sfra-client.ts +134 -397
- package/src/config/configuration-factory.ts +6 -1
- package/src/config/dw-json-loader.ts +96 -15
- package/src/config/workspace-roots.ts +540 -0
- package/src/constants/index.ts +1 -0
- package/src/core/handlers/abstract-client-handler.ts +85 -0
- package/src/core/handlers/agent-instructions-handler.ts +48 -0
- package/src/core/handlers/base-handler.ts +17 -127
- package/src/core/handlers/cartridge-handler.ts +13 -33
- package/src/core/handlers/client-factory.ts +32 -2
- package/src/core/handlers/code-version-handler.ts +17 -32
- package/src/core/handlers/docs-handler.ts +12 -44
- package/src/core/handlers/isml-handler.ts +19 -0
- package/src/core/handlers/job-log-handler.ts +19 -8
- package/src/core/handlers/log-handler.ts +19 -8
- package/src/core/handlers/script-debugger-handler.ts +46 -0
- package/src/core/handlers/sfra-handler.ts +12 -44
- package/src/core/handlers/simple-client-handler.ts +78 -0
- package/src/core/handlers/system-object-handler.ts +17 -32
- package/src/core/handlers/validation-helpers.ts +87 -47
- package/src/core/instruction-advisor.ts +122 -0
- package/src/core/server.ts +178 -13
- package/src/core/tool-definitions.ts +25 -1071
- package/src/core/tool-schemas/agent-instruction-tools.ts +72 -0
- package/src/core/tool-schemas/cartridge-tools.ts +29 -0
- package/src/core/tool-schemas/code-version-tools.ts +28 -0
- package/src/core/tool-schemas/documentation-tools.ts +104 -0
- package/src/core/tool-schemas/index.ts +27 -0
- package/src/core/tool-schemas/isml-tools.ts +89 -0
- package/src/core/tool-schemas/log-tools.ts +196 -0
- package/src/core/tool-schemas/script-debugger-tools.ts +83 -0
- package/src/core/tool-schemas/sfra-tools.ts +65 -0
- package/src/core/tool-schemas/shared-schemas.ts +158 -0
- package/src/core/tool-schemas/system-object-tools.ts +127 -0
- package/src/main.ts +63 -30
- package/src/services/index.ts +4 -10
- package/src/tool-configs/agent-instructions-tool-config.ts +83 -0
- package/src/tool-configs/cartridge-tool-config.ts +1 -1
- package/src/tool-configs/code-version-tool-config.ts +0 -5
- package/src/tool-configs/docs-tool-config.ts +0 -7
- package/src/tool-configs/isml-tool-config.ts +87 -0
- package/src/tool-configs/job-log-tool-config.ts +18 -17
- package/src/tool-configs/log-tool-config.ts +49 -64
- package/src/tool-configs/script-debugger-tool-config.ts +69 -0
- package/src/tool-configs/sfra-tool-config.ts +0 -11
- package/src/tool-configs/system-object-tool-config.ts +0 -5
- package/src/types/types.ts +2 -0
- package/src/utils/cache.ts +49 -54
- package/src/utils/category-utils.ts +70 -0
- package/src/utils/log-tool-constants.ts +25 -17
- package/src/utils/logger.ts +38 -1
- package/src/utils/markdown-utils.ts +280 -0
- package/src/utils/path-resolver.ts +25 -9
- package/src/utils/path-validation.ts +113 -0
- package/tests/base-handler.test.ts +1 -1
- package/tests/cache.test.ts +2 -2
- package/tests/cartridge-handler.test.ts +4 -4
- package/tests/client-factory.test.ts +1 -1
- package/tests/code-version-handler.test.ts +3 -3
- package/tests/docs-handler.test.ts +2 -2
- package/tests/documentation-scanner.test.ts +4 -4
- package/tests/isml-client.test.ts +463 -0
- package/tests/isml-handler.test.ts +375 -0
- package/tests/job-log-handler.test.ts +1 -1
- package/tests/log-handler.test.ts +8 -8
- package/tests/log-validation.test.ts +149 -0
- package/tests/mcp/README.md +22 -18
- package/tests/mcp/node/activate-code-version-advanced.full-mode.programmatic.test.js +30 -12
- package/tests/mcp/node/evaluate-script.full-mode.programmatic.test.js +387 -0
- package/tests/mcp/node/generate-cartridge-structure.docs-only.programmatic.test.js +14 -8
- package/tests/mcp/node/get-isml-categories.programmatic.test.js +278 -0
- package/tests/mcp/node/get-isml-element.programmatic.test.js +278 -0
- package/tests/mcp/node/get-isml-elements-by-category.programmatic.test.js +363 -0
- package/tests/mcp/node/get-sfra-categories.docs-only.programmatic.test.js +24 -24
- package/tests/mcp/node/get-sfra-document.programmatic.test.js +4 -2
- package/tests/mcp/node/list-isml-elements.programmatic.test.js +311 -0
- package/tests/mcp/node/list-sfcc-classes.docs-only.programmatic.test.js +2 -33
- package/tests/mcp/node/search-isml-elements.programmatic.test.js +325 -0
- package/tests/mcp/node/search-sfcc-classes.docs-only.programmatic.test.js +5 -9
- package/tests/mcp/node/search-sfcc-methods.docs-only.programmatic.test.js +7 -9
- package/tests/mcp/node/tools.docs-only.programmatic.test.js +42 -65
- package/tests/mcp/node/tools.full-mode.programmatic.test.js +7 -8
- package/tests/mcp/yaml/activate-code-version.full-mode.test.mcp.yml +2 -2
- package/tests/mcp/yaml/evaluate-script.full-mode.test.mcp.yml +281 -0
- package/tests/mcp/yaml/get-isml-categories.docs-only.test.mcp.yml +330 -0
- package/tests/mcp/yaml/get-isml-element.docs-only.test.mcp.yml +294 -0
- package/tests/mcp/yaml/get-isml-elements-by-category.docs-only.test.mcp.yml +334 -0
- package/tests/mcp/yaml/get-sfcc-class-info.docs-only.test.mcp.yml +2 -2
- package/tests/mcp/yaml/get-sfra-categories.docs-only.test.mcp.yml +13 -13
- package/tests/mcp/yaml/get-sfra-categories.full-mode.test.mcp.yml +13 -13
- package/tests/mcp/yaml/get-system-object-definitions.docs-only.test.mcp.yml +1 -16
- package/tests/mcp/yaml/list-isml-elements.docs-only.test.mcp.yml +212 -0
- package/tests/mcp/yaml/search-isml-elements.docs-only.test.mcp.yml +312 -0
- package/tests/mcp/yaml/search-sfcc-classes.docs-only.test.mcp.yml +1 -1
- package/tests/mcp/yaml/search-sfcc-classes.full-mode.test.mcp.yml +1 -1
- package/tests/mcp/yaml/search-site-preferences.docs-only.test.mcp.yml +1 -1
- package/tests/mcp/yaml/tools.docs-only.test.mcp.yml +3 -57
- package/tests/mcp/yaml/tools.full-mode.test.mcp.yml +3 -3
- package/tests/oauth-token.test.ts +107 -12
- package/tests/ocapi-client.test.ts +53 -106
- package/tests/script-debugger-client.test.ts +430 -0
- package/tests/servers/sfcc-mock-server/src/app.js +15 -0
- package/tests/servers/sfcc-mock-server/src/routes/cartridge-webdav.js +258 -0
- package/tests/servers/sfcc-mock-server/src/routes/ocapi/debugger-handler.js +396 -0
- package/tests/servers/sfcc-mock-server/src/routes/ocapi.js +5 -0
- package/tests/servers/sfcc-mock-server/src/routes/storefront.js +86 -0
- package/tests/servers/sfcc-mock-server/src/routes/webdav.js +6 -4
- package/tests/validation-helpers.test.ts +0 -31
- package/tests/workspace-roots.test.ts +227 -0
- package/ai-instructions/claude-desktop/claude_custom_instructions.md +0 -321
- package/ai-instructions/cursor/.cursor/rules/debugging-workflows.mdc +0 -171
- package/ai-instructions/cursor/.cursor/rules/hooks-development.mdc +0 -168
- package/ai-instructions/cursor/.cursor/rules/isml-templates.mdc +0 -209
- package/ai-instructions/cursor/.cursor/rules/job-framework.mdc +0 -379
- package/ai-instructions/cursor/.cursor/rules/performance-optimization.mdc +0 -215
- package/ai-instructions/cursor/.cursor/rules/scapi-endpoints.mdc +0 -98
- package/ai-instructions/cursor/.cursor/rules/security-patterns.mdc +0 -375
- package/ai-instructions/cursor/.cursor/rules/sfcc-development.mdc +0 -144
- package/ai-instructions/cursor/.cursor/rules/sfra-controllers.mdc +0 -376
- package/ai-instructions/cursor/.cursor/rules/sfra-models.mdc +0 -412
- package/ai-instructions/cursor/.cursor/rules/system-objects.mdc +0 -383
- package/ai-instructions/cursor/.cursor/rules/testing-patterns.mdc +0 -418
- package/dist/clients/best-practices-client.d.ts +0 -57
- package/dist/clients/best-practices-client.d.ts.map +0 -1
- package/dist/clients/best-practices-client.js +0 -288
- package/dist/clients/best-practices-client.js.map +0 -1
- package/dist/clients/cartridge-generation-client.d.ts +0 -57
- package/dist/clients/cartridge-generation-client.d.ts.map +0 -1
- package/dist/clients/cartridge-generation-client.js +0 -384
- package/dist/clients/cartridge-generation-client.js.map +0 -1
- package/dist/clients/logs/index.d.ts +0 -13
- package/dist/clients/logs/index.d.ts.map +0 -1
- package/dist/clients/logs/index.js +0 -15
- package/dist/clients/logs/index.js.map +0 -1
- package/dist/clients/logs/log-analyzer.d.ts +0 -55
- package/dist/clients/logs/log-analyzer.d.ts.map +0 -1
- package/dist/clients/logs/log-analyzer.js +0 -228
- package/dist/clients/logs/log-analyzer.js.map +0 -1
- package/dist/clients/logs/log-client.d.ts +0 -87
- package/dist/clients/logs/log-client.d.ts.map +0 -1
- package/dist/clients/logs/log-client.js +0 -418
- package/dist/clients/logs/log-client.js.map +0 -1
- package/dist/clients/logs/log-constants.d.ts +0 -37
- package/dist/clients/logs/log-constants.d.ts.map +0 -1
- package/dist/clients/logs/log-constants.js +0 -37
- package/dist/clients/logs/log-constants.js.map +0 -1
- package/dist/clients/logs/log-file-discovery.d.ts +0 -62
- package/dist/clients/logs/log-file-discovery.d.ts.map +0 -1
- package/dist/clients/logs/log-file-discovery.js +0 -238
- package/dist/clients/logs/log-file-discovery.js.map +0 -1
- package/dist/clients/logs/log-file-reader.d.ts +0 -53
- package/dist/clients/logs/log-file-reader.d.ts.map +0 -1
- package/dist/clients/logs/log-file-reader.js +0 -194
- package/dist/clients/logs/log-file-reader.js.map +0 -1
- package/dist/clients/logs/log-formatter.d.ts +0 -90
- package/dist/clients/logs/log-formatter.d.ts.map +0 -1
- package/dist/clients/logs/log-formatter.js +0 -189
- package/dist/clients/logs/log-formatter.js.map +0 -1
- package/dist/clients/logs/log-processor.d.ts +0 -91
- package/dist/clients/logs/log-processor.d.ts.map +0 -1
- package/dist/clients/logs/log-processor.js +0 -328
- package/dist/clients/logs/log-processor.js.map +0 -1
- package/dist/clients/logs/log-types.d.ts +0 -69
- package/dist/clients/logs/log-types.d.ts.map +0 -1
- package/dist/clients/logs/log-types.js +0 -5
- package/dist/clients/logs/log-types.js.map +0 -1
- package/dist/clients/logs/webdav-client-manager.d.ts +0 -28
- package/dist/clients/logs/webdav-client-manager.d.ts.map +0 -1
- package/dist/clients/logs/webdav-client-manager.js +0 -77
- package/dist/clients/logs/webdav-client-manager.js.map +0 -1
- package/dist/core/handlers/abstract-log-tool-handler.d.ts +0 -35
- package/dist/core/handlers/abstract-log-tool-handler.d.ts.map +0 -1
- package/dist/core/handlers/abstract-log-tool-handler.js +0 -46
- package/dist/core/handlers/abstract-log-tool-handler.js.map +0 -1
- package/dist/core/handlers/best-practices-handler.d.ts +0 -17
- package/dist/core/handlers/best-practices-handler.d.ts.map +0 -1
- package/dist/core/handlers/best-practices-handler.js +0 -43
- package/dist/core/handlers/best-practices-handler.js.map +0 -1
- package/dist/core/handlers/job-log-tool-config.d.ts +0 -8
- package/dist/core/handlers/job-log-tool-config.d.ts.map +0 -1
- package/dist/core/handlers/job-log-tool-config.js +0 -76
- package/dist/core/handlers/job-log-tool-config.js.map +0 -1
- package/dist/core/handlers/log-tool-config.d.ts +0 -8
- package/dist/core/handlers/log-tool-config.d.ts.map +0 -1
- package/dist/core/handlers/log-tool-config.js +0 -73
- package/dist/core/handlers/log-tool-config.js.map +0 -1
- package/dist/docs/best-practices/isml_templates.md +0 -1933
- package/dist/docs/best-practices/job_framework.md +0 -1173
- package/dist/docs/best-practices/scapi_custom_endpoint.md +0 -963
- package/dist/docs/best-practices/sfra_client_side_js.md +0 -736
- package/dist/docs/best-practices/sfra_models.md +0 -1142
- package/dist/tool-configs/best-practices-tool-config.d.ts +0 -11
- package/dist/tool-configs/best-practices-tool-config.d.ts.map +0 -1
- package/dist/tool-configs/best-practices-tool-config.js +0 -59
- package/dist/tool-configs/best-practices-tool-config.js.map +0 -1
- package/dist/utils/job-log-tool-config.d.ts +0 -8
- package/dist/utils/job-log-tool-config.d.ts.map +0 -1
- package/dist/utils/job-log-tool-config.js +0 -76
- package/dist/utils/job-log-tool-config.js.map +0 -1
- package/dist/utils/job-log-utils.d.ts +0 -34
- package/dist/utils/job-log-utils.d.ts.map +0 -1
- package/dist/utils/job-log-utils.js +0 -60
- package/dist/utils/job-log-utils.js.map +0 -1
- package/dist/utils/log-cache.d.ts +0 -53
- package/dist/utils/log-cache.d.ts.map +0 -1
- package/dist/utils/log-cache.js +0 -114
- package/dist/utils/log-cache.js.map +0 -1
- package/dist/utils/log-tool-config.d.ts +0 -8
- package/dist/utils/log-tool-config.d.ts.map +0 -1
- package/dist/utils/log-tool-config.js +0 -73
- package/dist/utils/log-tool-config.js.map +0 -1
- package/dist/utils/log-tool-utils.d.ts +0 -39
- package/dist/utils/log-tool-utils.d.ts.map +0 -1
- package/dist/utils/log-tool-utils.js +0 -94
- package/dist/utils/log-tool-utils.js.map +0 -1
- package/docs/best-practices/isml_templates.md +0 -1933
- package/docs/best-practices/job_framework.md +0 -1173
- package/docs/best-practices/scapi_custom_endpoint.md +0 -963
- package/docs/best-practices/sfra_client_side_js.md +0 -736
- package/docs/best-practices/sfra_models.md +0 -1142
- package/docs-site/App.tsx +0 -103
- package/docs-site/README.md +0 -113
- package/docs-site/components/Badge.tsx +0 -38
- package/docs-site/components/BreadcrumbSchema.tsx +0 -34
- package/docs-site/components/CodeBlock.tsx +0 -132
- package/docs-site/components/Collapsible.tsx +0 -40
- package/docs-site/components/ConfigBuilder.tsx +0 -118
- package/docs-site/components/ConfigHero.tsx +0 -19
- package/docs-site/components/ConfigModeTabs.tsx +0 -42
- package/docs-site/components/Layout.tsx +0 -174
- package/docs-site/components/LightCodeContainer.tsx +0 -44
- package/docs-site/components/NewcomerCTA.tsx +0 -57
- package/docs-site/components/NextStepsStrip.tsx +0 -23
- package/docs-site/components/OnThisPage.tsx +0 -91
- package/docs-site/components/SEO.tsx +0 -79
- package/docs-site/components/Search.tsx +0 -207
- package/docs-site/components/Sidebar.tsx +0 -96
- package/docs-site/components/StructuredData.tsx +0 -72
- package/docs-site/components/ToolCard.tsx +0 -84
- package/docs-site/components/ToolFilters.tsx +0 -39
- package/docs-site/components/Typography.tsx +0 -30
- package/docs-site/components/VersionBadge.tsx +0 -18
- package/docs-site/components/icons.tsx +0 -37
- package/docs-site/constants.tsx +0 -34
- package/docs-site/index.html +0 -62
- package/docs-site/main.tsx +0 -16
- package/docs-site/metadata.json +0 -5
- package/docs-site/package-lock.json +0 -3966
- package/docs-site/package.json +0 -35
- package/docs-site/pages/AIInterfacesPage.tsx +0 -610
- package/docs-site/pages/ConfigurationPage.tsx +0 -315
- package/docs-site/pages/DevelopmentPage.tsx +0 -607
- package/docs-site/pages/ExamplesPage.tsx +0 -558
- package/docs-site/pages/FeaturesPage.tsx +0 -353
- package/docs-site/pages/HomePage.tsx +0 -1046
- package/docs-site/pages/SecurityPage.tsx +0 -372
- package/docs-site/pages/ToolsPage.tsx +0 -205
- package/docs-site/pages/TroubleshootingPage.tsx +0 -590
- package/docs-site/postcss.config.js +0 -6
- package/docs-site/public/.well-known/security.txt +0 -6
- package/docs-site/public/android-chrome-192x192.png +0 -0
- package/docs-site/public/android-chrome-512x512.png +0 -0
- package/docs-site/public/apple-touch-icon.png +0 -0
- package/docs-site/public/favicon-16x16.png +0 -0
- package/docs-site/public/favicon-32x32.png +0 -0
- package/docs-site/public/favicon.ico +0 -0
- package/docs-site/public/llms.txt +0 -47
- package/docs-site/scripts/generate-search-index.js +0 -323
- package/docs-site/scripts/generate-sitemap.js +0 -156
- package/docs-site/scripts/search-dev.js +0 -112
- package/docs-site/src/styles/input.css +0 -248
- package/docs-site/src/styles/prism-theme.css +0 -124
- package/docs-site/tailwind.config.js +0 -70
- package/docs-site/tsconfig.json +0 -29
- package/docs-site/types.ts +0 -16
- package/docs-site/utils/search.ts +0 -132
- package/docs-site/utils/toolsData.ts +0 -116
- package/docs-site/vite.config.ts +0 -63
- package/src/clients/best-practices-client.ts +0 -332
- package/src/clients/cartridge-generation-client.ts +0 -507
- package/src/clients/logs/index.ts +0 -18
- package/src/clients/logs/log-analyzer.ts +0 -289
- package/src/clients/logs/log-client.ts +0 -540
- package/src/clients/logs/log-constants.ts +0 -53
- package/src/clients/logs/log-file-discovery.ts +0 -299
- package/src/clients/logs/log-file-reader.ts +0 -227
- package/src/clients/logs/log-formatter.ts +0 -258
- package/src/clients/logs/log-processor.ts +0 -402
- package/src/clients/logs/log-types.ts +0 -80
- package/src/clients/logs/webdav-client-manager.ts +0 -93
- package/src/core/handlers/abstract-log-tool-handler.ts +0 -64
- package/src/core/handlers/best-practices-handler.ts +0 -55
- package/src/core/handlers/job-log-tool-config.ts +0 -89
- package/src/core/handlers/log-tool-config.ts +0 -98
- package/src/tool-configs/best-practices-tool-config.ts +0 -68
- package/src/utils/job-log-tool-config.ts +0 -89
- package/src/utils/job-log-utils.ts +0 -78
- package/src/utils/log-cache.ts +0 -134
- package/src/utils/log-tool-config.ts +0 -98
- package/src/utils/log-tool-utils.ts +0 -122
- package/tests/best-practices-handler.test.ts +0 -236
- package/tests/job-log-utils.test.ts +0 -182
- package/tests/mcp/node/get-available-best-practice-guides.docs-only.programmatic.test.js +0 -516
- package/tests/mcp/node/get-best-practice-guide.docs-only.programmatic.test.js +0 -733
- package/tests/mcp/node/get-hook-reference.docs-only.programmatic.test.js +0 -185
- package/tests/mcp/node/search-best-practices.docs-only.programmatic.test.js +0 -836
- package/tests/mcp/yaml/get-available-best-practice-guides.docs-only.test.mcp.yml +0 -885
- package/tests/mcp/yaml/get-available-best-practice-guides.full-mode.test.mcp.yml +0 -885
- package/tests/mcp/yaml/get-best-practice-guide.docs-only.test.mcp.yml +0 -462
- package/tests/mcp/yaml/get-best-practice-guide.full-mode.test.mcp.yml +0 -462
- package/tests/mcp/yaml/get-hook-reference.docs-only.test.mcp.yml +0 -321
- package/tests/mcp/yaml/get-hook-reference.full-mode.test.mcp.yml +0 -321
- package/tests/mcp/yaml/search-best-practices.docs-only.test.mcp.yml +0 -655
- package/tests/mcp/yaml/search-best-practices.full-mode.test.mcp.yml +0 -655
- /package/{docs-site → docs-site-v2}/public/404.html +0 -0
- /package/{docs-site → docs-site-v2}/public/explain-product-pricing-methods-no-mcp.png +0 -0
- /package/{docs-site → docs-site-v2}/public/explain-product-pricing-methods.png +0 -0
|
@@ -1,934 +1,30 @@
|
|
|
1
1
|
---
|
|
2
2
|
applyTo: "**/*.programmatic.test.js"
|
|
3
3
|
---
|
|
4
|
-
# MCP
|
|
4
|
+
# MCP Programmatic Testing Instructions
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
const stderr = client.getStderr(); // Get captured stderr
|
|
8
|
-
client.clearStderr(); // Clear stderr buffer (REQUIRED in beforeEach!)
|
|
6
|
+
For detailed guidance on writing programmatic tests, use the `mcp-programmatic-testing` skill located at `.github/skills/mcp-programmatic-testing/SKILL.md`.
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
## Quick Reference
|
|
11
9
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
**Programmatic Testing** provides JavaScript/TypeScript API for complex MCP server testing scenarios that require dynamic validation logic, multi-step workflows, and integration with existing test suites. **For basic functional testing, the YAML-based testing approach (see `../yaml/AGENTS.md`) is more than sufficient and recommended.**
|
|
15
|
-
|
|
16
|
-
### When to Use Programmatic vs YAML Testing
|
|
17
|
-
|
|
18
|
-
**Use YAML Testing for:**
|
|
19
|
-
- ✅ Basic functional validation (tool discovery, parameter validation, response structure)
|
|
20
|
-
- ✅ Standard error handling scenarios
|
|
21
|
-
- ✅ Simple input/output verification
|
|
22
|
-
- ✅ CI/CD pipeline testing (more reliable across environments)
|
|
23
|
-
- ✅ Quick test development and maintenance
|
|
24
|
-
|
|
25
|
-
**Use Programmatic Testing for:**
|
|
26
|
-
- Complex business logic validation requiring code execution
|
|
27
|
-
- Multi-step workflows with state management
|
|
28
|
-
- Dynamic test case generation based on server configuration
|
|
29
|
-
- Integration with existing JavaScript/TypeScript test suites
|
|
30
|
-
- Advanced error recovery and resilience testing
|
|
31
|
-
|
|
32
|
-
### 📚 Key Resources
|
|
33
|
-
- **[Programmatic Testing Documentation](https://aegis.rhino-inquisitor.com/programmatic-testing.html)** - Complete guide
|
|
34
|
-
- **[API Reference](https://aegis.rhino-inquisitor.com/api-reference.html)** - All methods and properties
|
|
35
|
-
- **[Examples Directory](../../examples/)** - Real-world programmatic test files
|
|
36
|
-
- **[YAML Testing Guide](../yaml/AGENTS.md)** - Recommended for basic testing scenarios
|
|
37
|
-
|
|
38
|
-
## Quick Setup
|
|
39
|
-
|
|
40
|
-
### 1. Installation and Initialization
|
|
41
|
-
```bash
|
|
42
|
-
# Install in project
|
|
43
|
-
npm install --save-dev mcp-aegis
|
|
44
|
-
# OR
|
|
45
|
-
npx mcp-aegis init
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### 2. Configuration File
|
|
49
|
-
Always create `aegis.config.json` first:
|
|
50
|
-
|
|
51
|
-
```json
|
|
52
|
-
{
|
|
53
|
-
"name": "My MCP Server",
|
|
54
|
-
"command": "node",
|
|
55
|
-
"args": ["./server.js"],
|
|
56
|
-
"startupTimeout": 5000,
|
|
57
|
-
"env": {
|
|
58
|
-
"NODE_ENV": "test"
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### 3. Basic Programmatic Test Structure
|
|
64
|
-
File naming convention: `*.programmatic.test.js`
|
|
65
|
-
|
|
66
|
-
```javascript
|
|
67
|
-
import { test, describe, before, after, beforeEach } from 'node:test';
|
|
68
|
-
import { strict as assert } from 'node:assert';
|
|
69
|
-
import { connect } from 'mcp-aegis';
|
|
70
|
-
|
|
71
|
-
describe('[SERVER_NAME] Programmatic Tests', () => {
|
|
72
|
-
let client;
|
|
73
|
-
|
|
74
|
-
before(async () => {
|
|
75
|
-
client = await connect('./aegis.config.json');
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
after(async () => {
|
|
79
|
-
if (client?.connected) {
|
|
80
|
-
await client.disconnect();
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
beforeEach(() => {
|
|
85
|
-
// CRITICAL: Clear all buffers to prevent leaking into next tests
|
|
86
|
-
client.clearAllBuffers(); // Recommended - comprehensive protection
|
|
87
|
-
// OR: client.clearStderr(); // Minimum - stderr only
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
test('should list available tools', async () => {
|
|
91
|
-
const tools = await client.listTools();
|
|
92
|
-
assert.ok(Array.isArray(tools), 'Tools should be array');
|
|
93
|
-
assert.ok(tools.length > 0, 'Should have at least one tool');
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
test('should execute tool successfully', async () => {
|
|
97
|
-
const result = await client.callTool('[TOOL_NAME]', { param: 'value' });
|
|
98
|
-
assert.ok(result.content, 'Should return content');
|
|
99
|
-
assert.equal(result.isError, false, 'Should not be error');
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
## Quick Debugging with Query Command
|
|
105
|
-
|
|
106
|
-
Before writing comprehensive programmatic tests, use the `query` command to rapidly test your server:
|
|
107
|
-
|
|
108
|
-
```bash
|
|
109
|
-
# List all available tools
|
|
110
|
-
aegis query --config aegis.config.json
|
|
111
|
-
|
|
112
|
-
# Test specific tool with arguments
|
|
113
|
-
aegis query read_file '{"path": "test.txt"}' --config aegis.config.json
|
|
114
|
-
|
|
115
|
-
# Get JSON output for inspection
|
|
116
|
-
aegis query calculator '{"operation": "add", "a": 5, "b": 3}' --config aegis.config.json --json
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
**Benefits for programmatic testing workflow**:
|
|
120
|
-
- **Rapid prototyping**: Verify server behavior before writing test code
|
|
121
|
-
- **API exploration**: Discover tool signatures and response formats
|
|
122
|
-
- **Debug assistance**: Inspect actual responses to design assertions
|
|
123
|
-
- **Development speed**: Test changes instantly without rebuilding test suite
|
|
124
|
-
|
|
125
|
-
**Integration with programmatic tests**:
|
|
126
|
-
```javascript
|
|
127
|
-
// Use query command findings to create targeted tests
|
|
128
|
-
test('should handle file reading as discovered via query', async () => {
|
|
129
|
-
// Based on: aegis query read_file '{"path": "test.txt"}'
|
|
130
|
-
const result = await client.callTool('read_file', { path: 'test.txt' });
|
|
131
|
-
|
|
132
|
-
// Query command showed this response structure:
|
|
133
|
-
assert.ok(result.content);
|
|
134
|
-
assert.equal(result.content[0].type, 'text');
|
|
135
|
-
assert.ok(result.content[0].text.includes('expected content'));
|
|
136
|
-
});
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
## API Reference
|
|
140
|
-
|
|
141
|
-
### Main Entry Points
|
|
142
|
-
```javascript
|
|
143
|
-
import { createClient, connect } from 'mcp-aegis';
|
|
144
|
-
|
|
145
|
-
// Option 1: Create client (not connected)
|
|
146
|
-
const client = await createClient('./aegis.config.json');
|
|
147
|
-
await client.connect();
|
|
148
|
-
|
|
149
|
-
// Option 2: Create and auto-connect
|
|
150
|
-
const connectedClient = await connect('./aegis.config.json');
|
|
151
|
-
|
|
152
|
-
// Option 3: Inline configuration
|
|
153
|
-
const client = await connect({
|
|
154
|
-
name: 'My Server',
|
|
155
|
-
command: 'node',
|
|
156
|
-
args: ['./server.js'],
|
|
157
|
-
cwd: './server-directory',
|
|
158
|
-
startupTimeout: 5000
|
|
159
|
-
});
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### Core Methods
|
|
163
|
-
```javascript
|
|
164
|
-
// Server lifecycle
|
|
165
|
-
await client.connect(); // Start server + MCP handshake
|
|
166
|
-
await client.disconnect(); // Graceful shutdown
|
|
167
|
-
const isConnected = client.connected; // Connection status
|
|
168
|
-
|
|
169
|
-
// Tool operations
|
|
170
|
-
const tools = await client.listTools(); // Get available tools
|
|
171
|
-
const result = await client.callTool(name, arguments); // Execute tool
|
|
172
|
-
const response = await client.sendMessage(jsonRpcMessage); // Raw JSON-RPC
|
|
173
|
-
|
|
174
|
-
// Debugging and monitoring
|
|
175
|
-
const stderr = client.getStderr(); // Get captured stderr
|
|
176
|
-
client.clearStderr(); // Clear stderr buffer
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
### Error Handling
|
|
180
|
-
```javascript
|
|
181
|
-
try {
|
|
182
|
-
const result = await client.callTool('nonexistent_tool', {});
|
|
183
|
-
} catch (error) {
|
|
184
|
-
assert.ok(error.message.includes('Failed to call tool'));
|
|
185
|
-
// Error details available in error object
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Check for execution errors (not exceptions)
|
|
189
|
-
const result = await client.callTool('tool_name', { invalid: 'param' });
|
|
190
|
-
if (result.isError) {
|
|
191
|
-
assert.ok(result.content[0].text.includes('error message'));
|
|
192
|
-
}
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
## Critical: Preventing Test Interference
|
|
196
|
-
|
|
197
|
-
### Buffer Leaking Prevention
|
|
198
|
-
**The most common source of flaky programmatic tests is buffer leaking between tests.** When one test generates output (stderr, partial stdout messages) and doesn't clear it, subsequent tests may see the output from previous tests, causing unexpected failures.
|
|
199
|
-
|
|
200
|
-
#### Always Include beforeEach Hook
|
|
201
|
-
```javascript
|
|
202
|
-
beforeEach(() => {
|
|
203
|
-
// RECOMMENDED: Clear all buffers to prevent any leaking
|
|
204
|
-
client.clearAllBuffers();
|
|
205
|
-
|
|
206
|
-
// OR minimum: Clear only stderr (less comprehensive)
|
|
207
|
-
// client.clearStderr();
|
|
208
|
-
});
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
#### Buffer Bleeding Sources
|
|
212
|
-
- **Stderr buffer**: Error messages and debug output
|
|
213
|
-
- **Stdout buffer**: Partial JSON messages from previous requests
|
|
214
|
-
- **Ready state**: Server readiness flag not reset
|
|
215
|
-
- **Pending reads**: Lingering message handlers
|
|
216
|
-
|
|
217
|
-
**Best Practice**: Use `client.clearAllBuffers()` instead of just `clearStderr()` for comprehensive protection.
|
|
218
|
-
|
|
219
|
-
#### Common Anti-Patterns to Avoid
|
|
220
|
-
```javascript
|
|
221
|
-
// ❌ WRONG - Missing beforeEach entirely
|
|
222
|
-
describe('My Tests', () => {
|
|
223
|
-
let client;
|
|
224
|
-
|
|
225
|
-
before(async () => {
|
|
226
|
-
client = await connect('./config.json');
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
// Missing beforeEach - tests will leak buffers!
|
|
230
|
-
|
|
231
|
-
test('first test', async () => {
|
|
232
|
-
const result = await client.callTool('tool', {});
|
|
233
|
-
// This test might generate stderr or leave stdout buffer data
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
test('second test', async () => {
|
|
237
|
-
// This test might see output from first test!
|
|
238
|
-
assert.equal(client.getStderr(), ''); // Will fail if first test had stderr
|
|
239
|
-
});
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
// ✅ CORRECT - Include beforeEach with clearStderr
|
|
243
|
-
describe('My Tests', () => {
|
|
244
|
-
let client;
|
|
245
|
-
|
|
246
|
-
before(async () => {
|
|
247
|
-
client = await connect('./config.json');
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
beforeEach(() => {
|
|
251
|
-
client.clearAllBuffers(); // Prevents all buffer leaking between tests
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
test('first test', async () => {
|
|
255
|
-
const result = await client.callTool('tool', {});
|
|
256
|
-
// Any stderr is isolated to this test
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
test('second test', async () => {
|
|
260
|
-
// Clean slate - no stderr from previous tests
|
|
261
|
-
assert.equal(client.getStderr(), ''); // Will pass
|
|
262
|
-
});
|
|
263
|
-
});
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
#### Debugging Stderr Issues
|
|
267
|
-
If you're experiencing flaky test failures related to unexpected stderr content:
|
|
268
|
-
|
|
269
|
-
1. **Add clearStderr() to beforeEach** - Most common fix
|
|
270
|
-
2. **Check test isolation** - Ensure each test starts with clean state
|
|
271
|
-
3. **Debug stderr content** - Log `client.getStderr()` to see what's leaking
|
|
272
|
-
4. **Use afterEach cleanup** - Optional additional cleanup
|
|
10
|
+
**File naming**: `*.programmatic.test.js`
|
|
273
11
|
|
|
12
|
+
**Critical Setup**:
|
|
274
13
|
```javascript
|
|
275
14
|
beforeEach(() => {
|
|
276
|
-
client.
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
afterEach(() => {
|
|
280
|
-
// Optional: Debug what stderr was generated
|
|
281
|
-
const stderr = client.getStderr();
|
|
282
|
-
if (stderr) {
|
|
283
|
-
console.log('Test generated stderr:', stderr);
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
## Testing Patterns
|
|
289
|
-
|
|
290
|
-
### 1. Tool Discovery and Validation
|
|
291
|
-
```javascript
|
|
292
|
-
describe('Tool Discovery', () => {
|
|
293
|
-
test('should list all expected tools', async () => {
|
|
294
|
-
const tools = await client.listTools();
|
|
295
|
-
|
|
296
|
-
assert.equal(tools.length, 4, 'Should have 4 tools');
|
|
297
|
-
|
|
298
|
-
const toolNames = tools.map(tool => tool.name);
|
|
299
|
-
assert.ok(toolNames.includes('calculator'));
|
|
300
|
-
assert.ok(toolNames.includes('text_processor'));
|
|
301
|
-
assert.ok(toolNames.includes('data_validator'));
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
test('should validate tool schemas', async () => {
|
|
305
|
-
const tools = await client.listTools();
|
|
306
|
-
|
|
307
|
-
tools.forEach(tool => {
|
|
308
|
-
assert.ok(tool.name, 'Tool should have name');
|
|
309
|
-
assert.ok(tool.description, 'Tool should have description');
|
|
310
|
-
assert.ok(tool.inputSchema, 'Tool should have input schema');
|
|
311
|
-
assert.equal(tool.inputSchema.type, 'object');
|
|
312
|
-
});
|
|
313
|
-
});
|
|
314
|
-
});
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
### 2. Tool Execution Testing
|
|
318
|
-
```javascript
|
|
319
|
-
describe('Calculator Tool', () => {
|
|
320
|
-
test('should perform basic arithmetic', async () => {
|
|
321
|
-
const result = await client.callTool('calculator', {
|
|
322
|
-
operation: 'add',
|
|
323
|
-
a: 15,
|
|
324
|
-
b: 27
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
assert.equal(result.isError, false);
|
|
328
|
-
assert.equal(result.content.length, 1);
|
|
329
|
-
assert.equal(result.content[0].type, 'text');
|
|
330
|
-
assert.equal(result.content[0].text, 'Result: 42');
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
test('should handle division by zero', async () => {
|
|
334
|
-
const result = await client.callTool('calculator', {
|
|
335
|
-
operation: 'divide',
|
|
336
|
-
a: 10,
|
|
337
|
-
b: 0
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
assert.equal(result.isError, true);
|
|
341
|
-
assert.ok(result.content[0].text.includes('division by zero'));
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
test('should validate required parameters', async () => {
|
|
345
|
-
const result = await client.callTool('calculator', {
|
|
346
|
-
operation: 'add'
|
|
347
|
-
// Missing a and b parameters
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
assert.equal(result.isError, true);
|
|
351
|
-
assert.ok(result.content[0].text.includes('required'));
|
|
352
|
-
});
|
|
353
|
-
});
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
### 3. Multi-Step Workflows
|
|
357
|
-
```javascript
|
|
358
|
-
describe('Multi-Step Agent Workflows', () => {
|
|
359
|
-
test('should support complex decision chains', async () => {
|
|
360
|
-
// Step 1: Search for information
|
|
361
|
-
const searchResult = await client.callTool('search_knowledge', {
|
|
362
|
-
query: 'customer support best practices'
|
|
363
|
-
});
|
|
364
|
-
assert.equal(searchResult.isError, false);
|
|
365
|
-
|
|
366
|
-
// Step 2: Analyze findings
|
|
367
|
-
const analysisResult = await client.callTool('analyze_content', {
|
|
368
|
-
content: searchResult.content[0].text,
|
|
369
|
-
focus: 'actionable recommendations'
|
|
370
|
-
});
|
|
371
|
-
assert.equal(analysisResult.isError, false);
|
|
372
|
-
|
|
373
|
-
// Step 3: Generate summary based on analysis
|
|
374
|
-
const summaryResult = await client.callTool('generate_summary', {
|
|
375
|
-
source_data: analysisResult.content[0].text,
|
|
376
|
-
format: 'executive_summary'
|
|
377
|
-
});
|
|
378
|
-
assert.equal(summaryResult.isError, false);
|
|
379
|
-
assert.ok(summaryResult.content[0].text.includes('Executive Summary'));
|
|
380
|
-
});
|
|
381
|
-
|
|
382
|
-
test('should maintain context across tool calls', async () => {
|
|
383
|
-
// Initialize conversation context
|
|
384
|
-
const initResult = await client.callTool('conversation_manager', {
|
|
385
|
-
action: 'initialize',
|
|
386
|
-
user_id: 'test_user_123'
|
|
387
|
-
});
|
|
388
|
-
assert.equal(initResult.isError, false);
|
|
389
|
-
|
|
390
|
-
const sessionId = extractSessionId(initResult.content[0].text);
|
|
391
|
-
|
|
392
|
-
// Make context-dependent call
|
|
393
|
-
const contextResult = await client.callTool('conversation_manager', {
|
|
394
|
-
action: 'recall',
|
|
395
|
-
user_id: 'test_user_123',
|
|
396
|
-
session_id: sessionId
|
|
397
|
-
});
|
|
398
|
-
assert.equal(contextResult.isError, false);
|
|
399
|
-
assert.ok(contextResult.content[0].text.includes('session found'));
|
|
400
|
-
});
|
|
401
|
-
});
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
### 4. Error Recovery and Resilience
|
|
405
|
-
```javascript
|
|
406
|
-
describe('Error Recovery', () => {
|
|
407
|
-
test('should handle failures gracefully', async () => {
|
|
408
|
-
// Test normal operation
|
|
409
|
-
const normalResult = await client.callTool('external_api_call', {
|
|
410
|
-
endpoint: 'users',
|
|
411
|
-
action: 'list'
|
|
412
|
-
});
|
|
413
|
-
assert.equal(normalResult.isError, false);
|
|
414
|
-
|
|
415
|
-
// Test failure scenario - should not throw
|
|
416
|
-
const failureResult = await client.callTool('external_api_call', {
|
|
417
|
-
endpoint: 'invalid_endpoint',
|
|
418
|
-
action: 'list'
|
|
419
|
-
});
|
|
420
|
-
assert.equal(failureResult.isError, true);
|
|
421
|
-
assert.ok(failureResult.content[0].text.includes('not found'));
|
|
422
|
-
|
|
423
|
-
// Test recovery - should work again
|
|
424
|
-
const recoveryResult = await client.callTool('external_api_call', {
|
|
425
|
-
endpoint: 'users',
|
|
426
|
-
action: 'list'
|
|
427
|
-
});
|
|
428
|
-
assert.equal(recoveryResult.isError, false);
|
|
429
|
-
});
|
|
430
|
-
|
|
431
|
-
test('should handle server restart scenarios', async () => {
|
|
432
|
-
// Verify initial connection
|
|
433
|
-
const tools = await client.listTools();
|
|
434
|
-
assert.ok(tools.length > 0);
|
|
435
|
-
|
|
436
|
-
// Simulate server issue by calling invalid method
|
|
437
|
-
try {
|
|
438
|
-
await client.sendMessage({
|
|
439
|
-
jsonrpc: '2.0',
|
|
440
|
-
id: 'test-1',
|
|
441
|
-
method: 'invalid_method',
|
|
442
|
-
params: {}
|
|
443
|
-
});
|
|
444
|
-
} catch (error) {
|
|
445
|
-
// Expected error
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
// Verify connection still works
|
|
449
|
-
const toolsAfter = await client.listTools();
|
|
450
|
-
assert.ok(toolsAfter.length > 0);
|
|
451
|
-
});
|
|
15
|
+
client.clearAllBuffers(); // REQUIRED - prevents test interference
|
|
452
16
|
});
|
|
453
17
|
```
|
|
454
18
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
**Never use `Promise.all()` or concurrent requests** with MCP Aegis's programmatic API. MCP communication uses a single stdio process with shared message handlers and buffers. Concurrent requests can cause:
|
|
458
|
-
|
|
459
|
-
- **Buffer conflicts**: Multiple requests writing to the same stdout/stderr streams
|
|
460
|
-
- **Message handler interference**: JSON-RPC messages getting mixed or corrupted
|
|
461
|
-
- **Race conditions**: Responses arriving out of order or getting lost
|
|
462
|
-
- **Unpredictable test failures**: Flaky tests that pass/fail randomly
|
|
463
|
-
|
|
464
|
-
```javascript
|
|
465
|
-
// ❌ NEVER DO THIS - Causes buffer/message handler conflicts
|
|
466
|
-
const promises = tools.map(tool => client.callTool(tool.name, {}));
|
|
467
|
-
const results = await Promise.all(promises); // WILL CAUSE ISSUES!
|
|
468
|
-
|
|
469
|
-
// ✅ ALWAYS DO THIS - Sequential requests work reliably
|
|
470
|
-
const results = [];
|
|
471
|
-
for (const tool of tools) {
|
|
472
|
-
const result = await client.callTool(tool.name, {});
|
|
473
|
-
results.push(result);
|
|
474
|
-
}
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
### 5. Sequential Request Testing
|
|
478
|
-
```javascript
|
|
479
|
-
describe('Sequential Request Testing', () => {
|
|
480
|
-
test('should handle sequential requests correctly', async () => {
|
|
481
|
-
const results = [];
|
|
482
|
-
|
|
483
|
-
// Execute requests sequentially to avoid buffer/message handler conflicts
|
|
484
|
-
for (let i = 0; i < 10; i++) {
|
|
485
|
-
const result = await client.callTool('sequential_operation', { id: i });
|
|
486
|
-
results.push(result);
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
results.forEach((result, i) => {
|
|
490
|
-
assert.equal(result.isError, false, `Request ${i} should succeed`);
|
|
491
|
-
assert.ok(result.content[0].text.includes(`id: ${i}`));
|
|
492
|
-
});
|
|
493
|
-
});
|
|
494
|
-
|
|
495
|
-
test('should handle large payload processing', async () => {
|
|
496
|
-
const largeText = 'x'.repeat(50000); // 50KB text
|
|
497
|
-
|
|
498
|
-
const result = await client.callTool('text_processor', {
|
|
499
|
-
text: largeText,
|
|
500
|
-
operation: 'word_count'
|
|
501
|
-
});
|
|
502
|
-
|
|
503
|
-
assert.equal(result.isError, false);
|
|
504
|
-
assert.ok(result.content[0].text.includes('50000'));
|
|
505
|
-
});
|
|
506
|
-
});
|
|
507
|
-
```
|
|
508
|
-
|
|
509
|
-
### ⚠️ Performance Testing Not Recommended
|
|
510
|
-
|
|
511
|
-
**Performance testing is not recommended in programmatic tests** due to CI environment variability. CI environments have:
|
|
512
|
-
- Highly variable resource allocation and sharing
|
|
513
|
-
- Unpredictable I/O performance and network latency
|
|
514
|
-
- JIT compilation delays and garbage collection interference
|
|
515
|
-
- Container and process initialization overhead
|
|
516
|
-
|
|
517
|
-
**Use dedicated performance testing tools instead:**
|
|
518
|
-
- Load testing frameworks (Artillery, k6, Apache JMeter)
|
|
519
|
-
- APM tools (New Relic, DataDog, AppDynamics)
|
|
520
|
-
- Custom monitoring with controlled environments
|
|
521
|
-
- Synthetic monitoring services
|
|
522
|
-
|
|
523
|
-
**If you must include timing validation**, use extremely lenient thresholds (5+ seconds) and focus on detecting major regressions rather than precise performance requirements.
|
|
524
|
-
|
|
525
|
-
### 6. Dynamic Validation Logic
|
|
526
|
-
```javascript
|
|
527
|
-
describe('Dynamic Validation', () => {
|
|
528
|
-
test('should validate business rules dynamically', async () => {
|
|
529
|
-
const tools = await client.listTools();
|
|
530
|
-
|
|
531
|
-
// Dynamic validation based on actual tools
|
|
532
|
-
const calculatorTool = tools.find(t => t.name === 'calculator');
|
|
533
|
-
if (calculatorTool) {
|
|
534
|
-
const supportedOps = calculatorTool.inputSchema.properties.operation.enum;
|
|
535
|
-
|
|
536
|
-
for (const operation of supportedOps) {
|
|
537
|
-
const result = await client.callTool('calculator', {
|
|
538
|
-
operation,
|
|
539
|
-
a: 10,
|
|
540
|
-
b: 5
|
|
541
|
-
});
|
|
542
|
-
assert.equal(result.isError, false, `Operation ${operation} should work`);
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
});
|
|
546
|
-
|
|
547
|
-
test('should generate test cases from schema', async () => {
|
|
548
|
-
const tools = await client.listTools();
|
|
549
|
-
|
|
550
|
-
for (const tool of tools) {
|
|
551
|
-
const schema = tool.inputSchema;
|
|
552
|
-
const testCases = generateTestCases(schema);
|
|
553
|
-
|
|
554
|
-
for (const testCase of testCases) {
|
|
555
|
-
const result = await client.callTool(tool.name, testCase.input);
|
|
556
|
-
|
|
557
|
-
if (testCase.shouldSucceed) {
|
|
558
|
-
assert.equal(result.isError, false,
|
|
559
|
-
`${tool.name} should succeed with ${JSON.stringify(testCase.input)}`);
|
|
560
|
-
} else {
|
|
561
|
-
assert.equal(result.isError, true,
|
|
562
|
-
`${tool.name} should fail with ${JSON.stringify(testCase.input)}`);
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
});
|
|
567
|
-
});
|
|
568
|
-
|
|
569
|
-
function generateTestCases(schema) {
|
|
570
|
-
// Generate test cases based on JSON schema
|
|
571
|
-
const testCases = [];
|
|
572
|
-
|
|
573
|
-
// Valid case with all required properties
|
|
574
|
-
const validCase = {};
|
|
575
|
-
for (const [prop, propSchema] of Object.entries(schema.properties || {})) {
|
|
576
|
-
if (propSchema.type === 'string') {
|
|
577
|
-
validCase[prop] = 'test_value';
|
|
578
|
-
} else if (propSchema.type === 'number') {
|
|
579
|
-
validCase[prop] = 42;
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
testCases.push({ input: validCase, shouldSucceed: true });
|
|
583
|
-
|
|
584
|
-
// Invalid case missing required properties
|
|
585
|
-
if (schema.required?.length > 0) {
|
|
586
|
-
testCases.push({ input: {}, shouldSucceed: false });
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
return testCases;
|
|
590
|
-
}
|
|
591
|
-
```
|
|
592
|
-
|
|
593
|
-
## Advanced Testing Scenarios
|
|
594
|
-
|
|
595
|
-
### State Management Testing
|
|
596
|
-
```javascript
|
|
597
|
-
describe('State Management', () => {
|
|
598
|
-
test('should maintain state across multiple calls', async () => {
|
|
599
|
-
// Initialize state
|
|
600
|
-
await client.callTool('state_manager', {
|
|
601
|
-
action: 'set',
|
|
602
|
-
key: 'test_key',
|
|
603
|
-
value: 'test_value'
|
|
604
|
-
});
|
|
605
|
-
|
|
606
|
-
// Verify state persists
|
|
607
|
-
const result = await client.callTool('state_manager', {
|
|
608
|
-
action: 'get',
|
|
609
|
-
key: 'test_key'
|
|
610
|
-
});
|
|
611
|
-
|
|
612
|
-
assert.equal(result.content[0].text, 'test_value');
|
|
613
|
-
});
|
|
614
|
-
});
|
|
615
|
-
```
|
|
616
|
-
|
|
617
|
-
### Integration Testing with External Services
|
|
618
|
-
```javascript
|
|
619
|
-
describe('External Service Integration', () => {
|
|
620
|
-
test('should handle API dependencies', async () => {
|
|
621
|
-
// Mock external service responses if needed
|
|
622
|
-
const result = await client.callTool('api_client', {
|
|
623
|
-
endpoint: 'https://jsonplaceholder.typicode.com/posts/1',
|
|
624
|
-
method: 'GET'
|
|
625
|
-
});
|
|
626
|
-
|
|
627
|
-
assert.equal(result.isError, false);
|
|
628
|
-
const responseData = JSON.parse(result.content[0].text);
|
|
629
|
-
assert.ok(responseData.id);
|
|
630
|
-
assert.ok(responseData.title);
|
|
631
|
-
});
|
|
632
|
-
});
|
|
633
|
-
```
|
|
634
|
-
|
|
635
|
-
### Custom Assertion Helpers
|
|
636
|
-
```javascript
|
|
637
|
-
// Helper functions for common assertions
|
|
638
|
-
function assertValidMCPResponse(result) {
|
|
639
|
-
assert.ok(result.content, 'Should have content');
|
|
640
|
-
assert.ok(Array.isArray(result.content), 'Content should be array');
|
|
641
|
-
assert.equal(typeof result.isError, 'boolean', 'isError should be boolean');
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
function assertTextContent(result, expectedSubstring) {
|
|
645
|
-
assertValidMCPResponse(result);
|
|
646
|
-
assert.equal(result.content[0].type, 'text');
|
|
647
|
-
assert.ok(result.content[0].text.includes(expectedSubstring));
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
function assertToolSchema(tool) {
|
|
651
|
-
assert.ok(tool.name, 'Tool should have name');
|
|
652
|
-
assert.ok(tool.description, 'Tool should have description');
|
|
653
|
-
assert.ok(tool.inputSchema, 'Tool should have schema');
|
|
654
|
-
assert.equal(tool.inputSchema.type, 'object');
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
// Usage
|
|
658
|
-
test('should return valid calculation result', async () => {
|
|
659
|
-
const result = await client.callTool('calculator', { operation: 'add', a: 2, b: 3 });
|
|
660
|
-
assertTextContent(result, 'Result: 5');
|
|
661
|
-
});
|
|
662
|
-
```
|
|
663
|
-
|
|
664
|
-
## Framework Integration
|
|
665
|
-
|
|
666
|
-
### Jest Integration
|
|
667
|
-
```javascript
|
|
668
|
-
// jest.config.js
|
|
669
|
-
module.exports = {
|
|
670
|
-
testEnvironment: 'node',
|
|
671
|
-
setupFilesAfterEnv: ['<rootDir>/test/setup.js'],
|
|
672
|
-
testMatch: ['**/*.programmatic.test.js']
|
|
673
|
-
};
|
|
674
|
-
|
|
675
|
-
// test/setup.js
|
|
676
|
-
global.mcpClient = null;
|
|
677
|
-
|
|
678
|
-
beforeAll(async () => {
|
|
679
|
-
const { connect } = require('mcp-aegis');
|
|
680
|
-
global.mcpClient = await connect('./aegis.config.json');
|
|
681
|
-
});
|
|
682
|
-
|
|
683
|
-
afterAll(async () => {
|
|
684
|
-
if (global.mcpClient) {
|
|
685
|
-
await global.mcpClient.disconnect();
|
|
686
|
-
}
|
|
687
|
-
});
|
|
688
|
-
```
|
|
689
|
-
|
|
690
|
-
### Mocha Integration
|
|
691
|
-
```javascript
|
|
692
|
-
// test/helpers/mcp-setup.js
|
|
693
|
-
const { connect } = require('mcp-aegis');
|
|
694
|
-
|
|
695
|
-
let client;
|
|
696
|
-
|
|
697
|
-
exports.mochaHooks = {
|
|
698
|
-
beforeAll: async () => {
|
|
699
|
-
client = await connect('./aegis.config.json');
|
|
700
|
-
},
|
|
701
|
-
afterAll: async () => {
|
|
702
|
-
if (client) {
|
|
703
|
-
await client.disconnect();
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
};
|
|
707
|
-
|
|
708
|
-
exports.getClient = () => client;
|
|
709
|
-
```
|
|
710
|
-
|
|
711
|
-
### TypeScript Support
|
|
712
|
-
```typescript
|
|
713
|
-
import { test, describe, before, after } from 'node:test';
|
|
714
|
-
import { strict as assert } from 'node:assert';
|
|
715
|
-
import { connect, MCPClient } from 'mcp-aegis';
|
|
716
|
-
|
|
717
|
-
describe('TypeScript MCP Tests', () => {
|
|
718
|
-
let client: MCPClient;
|
|
719
|
-
|
|
720
|
-
before(async () => {
|
|
721
|
-
client = await connect('./aegis.config.json');
|
|
722
|
-
});
|
|
723
|
-
|
|
724
|
-
after(async () => {
|
|
725
|
-
await client.disconnect();
|
|
726
|
-
});
|
|
727
|
-
|
|
728
|
-
test('should have typed responses', async () => {
|
|
729
|
-
const tools = await client.listTools();
|
|
730
|
-
|
|
731
|
-
// TypeScript provides full type safety
|
|
732
|
-
assert.ok(Array.isArray(tools));
|
|
733
|
-
tools.forEach(tool => {
|
|
734
|
-
assert.ok(typeof tool.name === 'string');
|
|
735
|
-
assert.ok(typeof tool.description === 'string');
|
|
736
|
-
assert.ok(typeof tool.inputSchema === 'object');
|
|
737
|
-
});
|
|
738
|
-
});
|
|
739
|
-
});
|
|
740
|
-
```
|
|
741
|
-
|
|
742
|
-
## Best Practices for AI Agents
|
|
743
|
-
|
|
744
|
-
### 1. Test Structure Generation
|
|
745
|
-
```javascript
|
|
746
|
-
// Template for generating comprehensive test suites
|
|
747
|
-
function generateTestSuite(serverConfig, toolList) {
|
|
748
|
-
return `
|
|
749
|
-
describe('${serverConfig.name} Programmatic Tests', () => {
|
|
750
|
-
let client;
|
|
751
|
-
|
|
752
|
-
before(async () => {
|
|
753
|
-
client = await connect('${serverConfig.configPath}');
|
|
754
|
-
});
|
|
755
|
-
|
|
756
|
-
after(async () => {
|
|
757
|
-
if (client?.connected) {
|
|
758
|
-
await client.disconnect();
|
|
759
|
-
}
|
|
760
|
-
});
|
|
761
|
-
|
|
762
|
-
beforeEach(() => {
|
|
763
|
-
client.clearStderr();
|
|
764
|
-
});
|
|
765
|
-
|
|
766
|
-
describe('Protocol Compliance', () => {
|
|
767
|
-
test('should complete MCP handshake', async () => {
|
|
768
|
-
assert.ok(client.connected, 'Client should be connected');
|
|
769
|
-
});
|
|
770
|
-
|
|
771
|
-
test('should list available tools', async () => {
|
|
772
|
-
const tools = await client.listTools();
|
|
773
|
-
assert.ok(Array.isArray(tools));
|
|
774
|
-
assert.equal(tools.length, ${toolList.length});
|
|
775
|
-
});
|
|
776
|
-
});
|
|
777
|
-
|
|
778
|
-
${toolList.map(tool => generateToolTests(tool)).join('\n\n')}
|
|
779
|
-
});`;
|
|
780
|
-
}
|
|
781
|
-
|
|
782
|
-
function generateToolTests(tool) {
|
|
783
|
-
return `
|
|
784
|
-
describe('${tool.name} Tool', () => {
|
|
785
|
-
test('should execute successfully with valid parameters', async () => {
|
|
786
|
-
const result = await client.callTool('${tool.name}', ${JSON.stringify(tool.validParams)});
|
|
787
|
-
assert.equal(result.isError, false);
|
|
788
|
-
assertValidMCPResponse(result);
|
|
789
|
-
});
|
|
790
|
-
|
|
791
|
-
test('should handle invalid parameters gracefully', async () => {
|
|
792
|
-
const result = await client.callTool('${tool.name}', {});
|
|
793
|
-
assert.equal(result.isError, true);
|
|
794
|
-
assertTextContent(result, 'required');
|
|
795
|
-
});
|
|
796
|
-
});`;
|
|
797
|
-
}
|
|
798
|
-
```
|
|
799
|
-
|
|
800
|
-
### 2. Configuration Management
|
|
801
|
-
```javascript
|
|
802
|
-
// Detect server configuration from project structure
|
|
803
|
-
function detectServerConfig(projectPath) {
|
|
804
|
-
const packageJson = readPackageJson(projectPath);
|
|
805
|
-
|
|
806
|
-
return {
|
|
807
|
-
name: packageJson.name || 'MCP Server',
|
|
808
|
-
command: detectRuntime(packageJson.engines),
|
|
809
|
-
args: [detectServerFile(projectPath)],
|
|
810
|
-
cwd: projectPath,
|
|
811
|
-
startupTimeout: 5000,
|
|
812
|
-
env: {
|
|
813
|
-
NODE_ENV: 'test',
|
|
814
|
-
...(packageJson.mcpConfig?.testEnv || {})
|
|
815
|
-
}
|
|
816
|
-
};
|
|
817
|
-
}
|
|
818
|
-
|
|
819
|
-
function detectRuntime(engines = {}) {
|
|
820
|
-
if (engines.node) return 'node';
|
|
821
|
-
if (engines.python) return 'python';
|
|
822
|
-
return 'node'; // default
|
|
823
|
-
}
|
|
824
|
-
```
|
|
825
|
-
|
|
826
|
-
### 3. Error Pattern Recognition
|
|
827
|
-
```javascript
|
|
828
|
-
// Common error patterns to test for
|
|
829
|
-
const errorPatterns = [
|
|
830
|
-
{ type: 'validation', keywords: ['required', 'invalid', 'missing'] },
|
|
831
|
-
{ type: 'not_found', keywords: ['not found', 'does not exist'] },
|
|
832
|
-
{ type: 'permission', keywords: ['permission', 'unauthorized', 'forbidden'] },
|
|
833
|
-
{ type: 'network', keywords: ['connection', 'timeout', 'unreachable'] }
|
|
834
|
-
];
|
|
835
|
-
|
|
836
|
-
function categorizeError(errorText) {
|
|
837
|
-
for (const pattern of errorPatterns) {
|
|
838
|
-
if (pattern.keywords.some(keyword =>
|
|
839
|
-
errorText.toLowerCase().includes(keyword))) {
|
|
840
|
-
return pattern.type;
|
|
841
|
-
}
|
|
842
|
-
}
|
|
843
|
-
return 'unknown';
|
|
844
|
-
}
|
|
845
|
-
```
|
|
846
|
-
|
|
847
|
-
### 4. Built-in Functional Monitoring
|
|
848
|
-
```javascript
|
|
849
|
-
// Focus on functional correctness rather than timing
|
|
850
|
-
class FunctionalMonitor {
|
|
851
|
-
constructor() {
|
|
852
|
-
this.results = new Map();
|
|
853
|
-
}
|
|
854
|
-
|
|
855
|
-
async validateTool(client, toolName, params) {
|
|
856
|
-
const result = await client.callTool(toolName, params);
|
|
857
|
-
|
|
858
|
-
const validation = {
|
|
859
|
-
success: !result.isError,
|
|
860
|
-
hasContent: result.content && result.content.length > 0,
|
|
861
|
-
contentType: result.content?.[0]?.type,
|
|
862
|
-
timestamp: new Date().toISOString()
|
|
863
|
-
};
|
|
864
|
-
|
|
865
|
-
if (!this.results.has(toolName)) {
|
|
866
|
-
this.results.set(toolName, []);
|
|
867
|
-
}
|
|
868
|
-
this.results.get(toolName).push(validation);
|
|
869
|
-
|
|
870
|
-
return { result, validation };
|
|
871
|
-
}
|
|
872
|
-
|
|
873
|
-
getReliabilityStats(toolName) {
|
|
874
|
-
const validations = this.results.get(toolName) || [];
|
|
875
|
-
const successful = validations.filter(v => v.success).length;
|
|
876
|
-
|
|
877
|
-
return {
|
|
878
|
-
totalCalls: validations.length,
|
|
879
|
-
successRate: successful / validations.length,
|
|
880
|
-
failureRate: (validations.length - successful) / validations.length,
|
|
881
|
-
lastValidation: validations[validations.length - 1]?.timestamp
|
|
882
|
-
};
|
|
883
|
-
}
|
|
884
|
-
}
|
|
885
|
-
```
|
|
886
|
-
|
|
887
|
-
## Test Execution Commands
|
|
888
|
-
|
|
889
|
-
**CRITICAL**: Use the correct test commands for this SFCC Dev MCP project:
|
|
890
|
-
|
|
19
|
+
**Test Execution**:
|
|
891
20
|
```bash
|
|
892
|
-
# Run individual MCP programmatic test (CORRECT for this project)
|
|
893
21
|
node --test tests/mcp/node/specific-test.programmatic.test.js
|
|
894
|
-
|
|
895
|
-
# Run all MCP programmatic tests (CORRECT for this project)
|
|
896
22
|
npm run test:mcp:node
|
|
897
|
-
|
|
898
|
-
# Run all MCP tests (YAML + programmatic) (CORRECT for this project)
|
|
899
|
-
npm run test:mcp:all
|
|
900
|
-
|
|
901
|
-
# ❌ WRONG: Don't use npm test with individual files for MCP tests
|
|
902
|
-
# npm test -- tests/mcp/node/specific-test.programmatic.test.js # This runs Jest!
|
|
903
|
-
|
|
904
|
-
# ❌ WRONG: Don't use Jest for MCP programmatic tests
|
|
905
|
-
# npx jest --testMatch="**/*.programmatic.test.js" # Jest doesn't handle MCP tests
|
|
906
|
-
|
|
907
|
-
# Watch mode for development (Node.js test runner)
|
|
908
|
-
node --test --watch tests/mcp/node/*.programmatic.test.js
|
|
909
|
-
|
|
910
|
-
# Jest is used for unit tests only (src/ directory)
|
|
911
|
-
jest base-handler.test.ts
|
|
912
|
-
|
|
913
|
-
# Complete test suite (Jest + MCP tests)
|
|
914
|
-
npm test
|
|
915
23
|
```
|
|
916
24
|
|
|
917
|
-
**
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
- `npm run test:mcp:all` → All MCP tests (YAML + programmatic)
|
|
922
|
-
- `npm test` → Jest unit tests + MCP tests
|
|
923
|
-
|
|
924
|
-
---
|
|
25
|
+
**Critical Rules**:
|
|
26
|
+
1. Never use `Promise.all()` with MCP requests
|
|
27
|
+
2. Always include `beforeEach` with buffer clearing
|
|
28
|
+
3. Use `node --test`, NOT `npm test` for individual MCP tests
|
|
925
29
|
|
|
926
|
-
|
|
927
|
-
1. Always use proper lifecycle management (before/after hooks)
|
|
928
|
-
2. Clear stderr between tests for isolation
|
|
929
|
-
3. Use appropriate assertion libraries and helpers
|
|
930
|
-
4. Include comprehensive error handling tests
|
|
931
|
-
5. Test both success and failure scenarios
|
|
932
|
-
6. Implement performance monitoring for critical operations
|
|
933
|
-
7. Use TypeScript for better development experience
|
|
934
|
-
8. Integrate with existing testing frameworks and CI/CD pipelines
|
|
30
|
+
For complete API reference and patterns, see the skill file.
|