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.
Files changed (865) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.yml +3 -1
  2. package/.github/ISSUE_TEMPLATE/documentation.yml +2 -2
  3. package/.github/ISSUE_TEMPLATE/question.yml +1 -1
  4. package/.github/PULL_REQUEST_TEMPLATE/documentation.md +1 -1
  5. package/.github/PULL_REQUEST_TEMPLATE/new_tool.md +1 -1
  6. package/.github/agents/official-docs-researcher.agent.md +56 -0
  7. package/.github/instructions/mcp-node-tests.instructions.md +12 -916
  8. package/.github/instructions/mcp-yml-tests.instructions.md +14 -742
  9. package/.github/pull_request_template.md +1 -1
  10. package/.github/skills/agent-authoring/SKILL.md +66 -0
  11. package/.github/skills/mcp-log-debugging/SKILL.md +69 -0
  12. package/.github/skills/mcp-programmatic-testing/SKILL.md +142 -0
  13. package/.github/skills/mcp-yaml-testing/SKILL.md +136 -0
  14. package/.github/skills/salesforce-developer-site-scraper/SKILL.md +102 -0
  15. package/.github/skills/salesforce-developer-site-scraper/scripts/scrape-to-markdown.js +205 -0
  16. package/.github/skills/salesforce-help-site-scraper/SKILL.md +84 -0
  17. package/.github/skills/salesforce-help-site-scraper/scripts/scrape-help-to-markdown.js +212 -0
  18. package/.github/skills/skill-authoring/SKILL.md +228 -0
  19. package/.github/skills/skill-authoring/references/PATTERNS.md +384 -0
  20. package/.github/workflows/ci.yml +3 -3
  21. package/.github/workflows/deploy-pages.yml +9 -19
  22. package/.github/workflows/publish.yml +5 -2
  23. package/.github/workflows/update-docs.yml +1 -1
  24. package/AGENTS.md +140 -286
  25. package/CONTRIBUTING.md +10 -22
  26. package/README.md +48 -16
  27. package/ai-instructions/{github-copilot/copilot-instructions.md → AGENTS.md} +99 -127
  28. package/ai-instructions/skills/sfcc-caching/SKILL.md +89 -0
  29. package/{dist/docs/best-practices/cartridge_creation.md → ai-instructions/skills/sfcc-cartridge-development/SKILL.md} +31 -7
  30. package/ai-instructions/skills/sfcc-forms-development/SKILL.md +261 -0
  31. package/ai-instructions/skills/sfcc-forms-development/references/ARCHITECTURE-SGJC-SFRA.md +143 -0
  32. package/ai-instructions/skills/sfcc-forms-development/references/FORM-XML-CHEATSHEET.md +127 -0
  33. package/ai-instructions/skills/sfcc-fraud-prevention/SKILL.md +95 -0
  34. package/ai-instructions/skills/sfcc-hooks-registration/SKILL.md +39 -0
  35. package/ai-instructions/skills/sfcc-isml-development/SKILL.md +370 -0
  36. package/ai-instructions/skills/sfcc-isml-development/references/REMOTE-INCLUDES.md +116 -0
  37. package/ai-instructions/skills/sfcc-isml-development/references/SFRA-LAYOUTS.md +50 -0
  38. package/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CART-ACCOUNT-AUTH.md +45 -0
  39. package/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CATALOG.md +85 -0
  40. package/ai-instructions/skills/sfcc-isml-development/references/SFRA-STRUCTURE-COMPONENTS.md +63 -0
  41. package/ai-instructions/skills/sfcc-isml-development/references/UTILITIES-EXPRESSIONS.md +159 -0
  42. package/ai-instructions/skills/sfcc-isml-development/references/sfra-base-templates-architecture.md +13 -0
  43. package/ai-instructions/skills/sfcc-job-development/SKILL.md +334 -0
  44. package/ai-instructions/skills/sfcc-job-development/references/CHUNK-ORIENTED.md +393 -0
  45. package/ai-instructions/skills/sfcc-job-development/references/STEPTYPES-JSON.md +271 -0
  46. package/ai-instructions/skills/sfcc-job-development/references/TASK-ORIENTED.md +257 -0
  47. package/ai-instructions/skills/sfcc-localization/SKILL.md +92 -0
  48. package/ai-instructions/skills/sfcc-localization/references/CONTROLLERS.md +63 -0
  49. package/ai-instructions/skills/sfcc-localization/references/FORMATTING.md +29 -0
  50. package/ai-instructions/skills/sfcc-localization/references/FORMS-LOCALIZATION.md +33 -0
  51. package/ai-instructions/skills/sfcc-localization/references/JAVASCRIPT-LOCALIZATION.md +41 -0
  52. package/ai-instructions/skills/sfcc-localization/references/LOCALE-SWITCHING.md +35 -0
  53. package/ai-instructions/skills/sfcc-localization/references/PATTERNS.md +740 -0
  54. package/ai-instructions/skills/sfcc-localization/references/PROPERTIES-ENCODING.md +25 -0
  55. package/ai-instructions/skills/sfcc-localization/references/RESOURCE-BUNDLES.md +67 -0
  56. package/ai-instructions/skills/sfcc-localization/references/STATIC-FILES.md +23 -0
  57. package/ai-instructions/skills/sfcc-localization/references/TESTING.md +21 -0
  58. package/{docs/best-practices/localserviceregistry.md → ai-instructions/skills/sfcc-localserviceregistry/SKILL.md} +65 -31
  59. package/ai-instructions/skills/sfcc-logging/SKILL.md +352 -0
  60. package/ai-instructions/skills/sfcc-logging/references/LOG-FILES.md +282 -0
  61. package/{docs/best-practices/ocapi_hooks.md → ai-instructions/skills/sfcc-ocapi-hooks/SKILL.md} +51 -16
  62. package/ai-instructions/skills/sfcc-ocapi-scapi-slas/SKILL.md +108 -0
  63. package/ai-instructions/skills/sfcc-page-designer/SKILL.md +353 -0
  64. package/ai-instructions/skills/sfcc-page-designer/references/ATTRIBUTE-TYPES.md +436 -0
  65. package/ai-instructions/skills/sfcc-page-designer/references/META-DEFINITIONS.md +322 -0
  66. package/{dist/docs/best-practices/performance.md → ai-instructions/skills/sfcc-performance/SKILL.md} +35 -3
  67. package/ai-instructions/skills/sfcc-platform-limits/SKILL.md +89 -0
  68. package/ai-instructions/skills/sfcc-scapi-custom-endpoints/SKILL.md +237 -0
  69. package/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/AUTHENTICATION.md +214 -0
  70. package/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/URL-MAPPING.md +253 -0
  71. package/{docs/best-practices/scapi_hooks.md → ai-instructions/skills/sfcc-scapi-hooks/SKILL.md} +44 -17
  72. package/ai-instructions/skills/sfcc-script-evaluation/SKILL.md +380 -0
  73. package/{docs/best-practices/security.md → ai-instructions/skills/sfcc-security/SKILL.md} +12 -3
  74. package/ai-instructions/skills/sfcc-sfra-client-side-js/SKILL.md +270 -0
  75. package/ai-instructions/skills/sfcc-sfra-client-side-js/references/AJAX-CSRF-VALIDATION.md +285 -0
  76. package/ai-instructions/skills/sfcc-sfra-client-side-js/references/BASE-MODULE-INDEX.md +206 -0
  77. package/ai-instructions/skills/sfcc-sfra-client-side-js/references/EXTENSION-PATTERNS.md +165 -0
  78. package/ai-instructions/skills/sfcc-sfra-client-side-js/references/PLUGIN-PATTERNS.md +185 -0
  79. package/ai-instructions/skills/sfcc-sfra-controllers/SKILL.md +347 -0
  80. package/ai-instructions/skills/sfcc-sfra-controllers/references/MIDDLEWARE-REFERENCE.md +257 -0
  81. package/ai-instructions/skills/sfcc-sfra-controllers/references/REMOTE-INCLUDES.md +193 -0
  82. package/{dist/docs/best-practices/sfra_controllers.md → ai-instructions/skills/sfcc-sfra-controllers/references/standard-sfra-controllers.md} +0 -670
  83. package/ai-instructions/skills/sfcc-sfra-models/SKILL.md +322 -0
  84. package/ai-instructions/skills/sfcc-sfra-models/references/MODEL-PATTERNS.md +530 -0
  85. package/ai-instructions/skills/sfcc-sfra-models/references/MODEL-STRUCTURE.md +234 -0
  86. package/ai-instructions/skills/sfcc-sfra-models/references/TESTING-SECURITY.md +417 -0
  87. package/{dist/docs/best-practices/sfra_scss.md → ai-instructions/skills/sfcc-sfra-scss/SKILL.md} +5 -0
  88. package/ai-instructions/skills/sfcc-webdav-workflows/SKILL.md +111 -0
  89. package/dist/ai-instructions/AGENTS.md +628 -0
  90. package/dist/ai-instructions/skills/sfcc-caching/SKILL.md +89 -0
  91. package/{docs/best-practices/cartridge_creation.md → dist/ai-instructions/skills/sfcc-cartridge-development/SKILL.md} +31 -7
  92. package/dist/ai-instructions/skills/sfcc-forms-development/SKILL.md +261 -0
  93. package/dist/ai-instructions/skills/sfcc-forms-development/references/ARCHITECTURE-SGJC-SFRA.md +143 -0
  94. package/dist/ai-instructions/skills/sfcc-forms-development/references/FORM-XML-CHEATSHEET.md +127 -0
  95. package/dist/ai-instructions/skills/sfcc-fraud-prevention/SKILL.md +95 -0
  96. package/dist/ai-instructions/skills/sfcc-hooks-registration/SKILL.md +39 -0
  97. package/dist/ai-instructions/skills/sfcc-isml-development/SKILL.md +370 -0
  98. package/dist/ai-instructions/skills/sfcc-isml-development/references/REMOTE-INCLUDES.md +116 -0
  99. package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-LAYOUTS.md +50 -0
  100. package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CART-ACCOUNT-AUTH.md +45 -0
  101. package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-PAGES-CATALOG.md +85 -0
  102. package/dist/ai-instructions/skills/sfcc-isml-development/references/SFRA-STRUCTURE-COMPONENTS.md +63 -0
  103. package/dist/ai-instructions/skills/sfcc-isml-development/references/UTILITIES-EXPRESSIONS.md +159 -0
  104. package/dist/ai-instructions/skills/sfcc-isml-development/references/sfra-base-templates-architecture.md +13 -0
  105. package/dist/ai-instructions/skills/sfcc-job-development/SKILL.md +334 -0
  106. package/dist/ai-instructions/skills/sfcc-job-development/references/CHUNK-ORIENTED.md +393 -0
  107. package/dist/ai-instructions/skills/sfcc-job-development/references/STEPTYPES-JSON.md +271 -0
  108. package/dist/ai-instructions/skills/sfcc-job-development/references/TASK-ORIENTED.md +257 -0
  109. package/dist/ai-instructions/skills/sfcc-localization/SKILL.md +92 -0
  110. package/dist/ai-instructions/skills/sfcc-localization/references/CONTROLLERS.md +63 -0
  111. package/dist/ai-instructions/skills/sfcc-localization/references/FORMATTING.md +29 -0
  112. package/dist/ai-instructions/skills/sfcc-localization/references/FORMS-LOCALIZATION.md +33 -0
  113. package/dist/ai-instructions/skills/sfcc-localization/references/JAVASCRIPT-LOCALIZATION.md +41 -0
  114. package/dist/ai-instructions/skills/sfcc-localization/references/LOCALE-SWITCHING.md +35 -0
  115. package/dist/ai-instructions/skills/sfcc-localization/references/PATTERNS.md +740 -0
  116. package/dist/ai-instructions/skills/sfcc-localization/references/PROPERTIES-ENCODING.md +25 -0
  117. package/dist/ai-instructions/skills/sfcc-localization/references/RESOURCE-BUNDLES.md +67 -0
  118. package/dist/ai-instructions/skills/sfcc-localization/references/STATIC-FILES.md +23 -0
  119. package/dist/ai-instructions/skills/sfcc-localization/references/TESTING.md +21 -0
  120. package/dist/{docs/best-practices/localserviceregistry.md → ai-instructions/skills/sfcc-localserviceregistry/SKILL.md} +65 -31
  121. package/dist/ai-instructions/skills/sfcc-logging/SKILL.md +352 -0
  122. package/dist/ai-instructions/skills/sfcc-logging/references/LOG-FILES.md +282 -0
  123. package/dist/{docs/best-practices/ocapi_hooks.md → ai-instructions/skills/sfcc-ocapi-hooks/SKILL.md} +51 -16
  124. package/dist/ai-instructions/skills/sfcc-ocapi-scapi-slas/SKILL.md +108 -0
  125. package/dist/ai-instructions/skills/sfcc-page-designer/SKILL.md +353 -0
  126. package/dist/ai-instructions/skills/sfcc-page-designer/references/ATTRIBUTE-TYPES.md +436 -0
  127. package/dist/ai-instructions/skills/sfcc-page-designer/references/META-DEFINITIONS.md +322 -0
  128. package/{docs/best-practices/performance.md → dist/ai-instructions/skills/sfcc-performance/SKILL.md} +35 -3
  129. package/dist/ai-instructions/skills/sfcc-platform-limits/SKILL.md +89 -0
  130. package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/SKILL.md +237 -0
  131. package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/AUTHENTICATION.md +214 -0
  132. package/dist/ai-instructions/skills/sfcc-scapi-custom-endpoints/references/URL-MAPPING.md +253 -0
  133. package/dist/{docs/best-practices/scapi_hooks.md → ai-instructions/skills/sfcc-scapi-hooks/SKILL.md} +44 -17
  134. package/dist/ai-instructions/skills/sfcc-script-evaluation/SKILL.md +380 -0
  135. package/dist/{docs/best-practices/security.md → ai-instructions/skills/sfcc-security/SKILL.md} +12 -3
  136. package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/SKILL.md +270 -0
  137. package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/AJAX-CSRF-VALIDATION.md +285 -0
  138. package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/BASE-MODULE-INDEX.md +206 -0
  139. package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/EXTENSION-PATTERNS.md +165 -0
  140. package/dist/ai-instructions/skills/sfcc-sfra-client-side-js/references/PLUGIN-PATTERNS.md +185 -0
  141. package/dist/ai-instructions/skills/sfcc-sfra-controllers/SKILL.md +347 -0
  142. package/dist/ai-instructions/skills/sfcc-sfra-controllers/references/MIDDLEWARE-REFERENCE.md +257 -0
  143. package/dist/ai-instructions/skills/sfcc-sfra-controllers/references/REMOTE-INCLUDES.md +193 -0
  144. package/{docs/best-practices/sfra_controllers.md → dist/ai-instructions/skills/sfcc-sfra-controllers/references/standard-sfra-controllers.md} +0 -670
  145. package/dist/ai-instructions/skills/sfcc-sfra-models/SKILL.md +322 -0
  146. package/dist/ai-instructions/skills/sfcc-sfra-models/references/MODEL-PATTERNS.md +530 -0
  147. package/dist/ai-instructions/skills/sfcc-sfra-models/references/MODEL-STRUCTURE.md +234 -0
  148. package/dist/ai-instructions/skills/sfcc-sfra-models/references/TESTING-SECURITY.md +417 -0
  149. package/{docs/best-practices/sfra_scss.md → dist/ai-instructions/skills/sfcc-sfra-scss/SKILL.md} +5 -0
  150. package/dist/ai-instructions/skills/sfcc-webdav-workflows/SKILL.md +111 -0
  151. package/dist/clients/agent-instructions-client.d.ts +66 -0
  152. package/dist/clients/agent-instructions-client.d.ts.map +1 -0
  153. package/dist/clients/agent-instructions-client.js +277 -0
  154. package/dist/clients/agent-instructions-client.js.map +1 -0
  155. package/dist/clients/base/abstract-documentation-client.d.ts +146 -0
  156. package/dist/clients/base/abstract-documentation-client.d.ts.map +1 -0
  157. package/dist/clients/base/abstract-documentation-client.js +265 -0
  158. package/dist/clients/base/abstract-documentation-client.js.map +1 -0
  159. package/dist/clients/base/oauth-token.d.ts +18 -0
  160. package/dist/clients/base/oauth-token.d.ts.map +1 -1
  161. package/dist/clients/base/oauth-token.js +45 -2
  162. package/dist/clients/base/oauth-token.js.map +1 -1
  163. package/dist/clients/cartridge/cartridge-generation-client.d.ts +59 -0
  164. package/dist/clients/cartridge/cartridge-generation-client.d.ts.map +1 -0
  165. package/dist/clients/cartridge/cartridge-generation-client.js +224 -0
  166. package/dist/clients/cartridge/cartridge-generation-client.js.map +1 -0
  167. package/dist/clients/cartridge/cartridge-structure.d.ts +17 -0
  168. package/dist/clients/cartridge/cartridge-structure.d.ts.map +1 -0
  169. package/dist/clients/cartridge/cartridge-structure.js +33 -0
  170. package/dist/clients/cartridge/cartridge-structure.js.map +1 -0
  171. package/dist/clients/cartridge/cartridge-templates.d.ts +22 -0
  172. package/dist/clients/cartridge/cartridge-templates.d.ts.map +1 -0
  173. package/dist/clients/cartridge/cartridge-templates.js +225 -0
  174. package/dist/clients/cartridge/cartridge-templates.js.map +1 -0
  175. package/dist/clients/cartridge/index.d.ts +7 -0
  176. package/dist/clients/cartridge/index.d.ts.map +1 -0
  177. package/dist/clients/cartridge/index.js +7 -0
  178. package/dist/clients/cartridge/index.js.map +1 -0
  179. package/dist/clients/docs/documentation-scanner.d.ts +5 -2
  180. package/dist/clients/docs/documentation-scanner.d.ts.map +1 -1
  181. package/dist/clients/docs/documentation-scanner.js +38 -23
  182. package/dist/clients/docs/documentation-scanner.js.map +1 -1
  183. package/dist/clients/docs-client.d.ts +13 -4
  184. package/dist/clients/docs-client.d.ts.map +1 -1
  185. package/dist/clients/docs-client.js +44 -11
  186. package/dist/clients/docs-client.js.map +1 -1
  187. package/dist/clients/isml-client.d.ts +71 -0
  188. package/dist/clients/isml-client.d.ts.map +1 -0
  189. package/dist/clients/isml-client.js +252 -0
  190. package/dist/clients/isml-client.js.map +1 -0
  191. package/dist/clients/ocapi/code-versions-client.d.ts.map +1 -1
  192. package/dist/clients/ocapi/code-versions-client.js +6 -1
  193. package/dist/clients/ocapi/code-versions-client.js.map +1 -1
  194. package/dist/clients/ocapi-client.d.ts +9 -101
  195. package/dist/clients/ocapi-client.d.ts.map +1 -1
  196. package/dist/clients/ocapi-client.js +11 -93
  197. package/dist/clients/ocapi-client.js.map +1 -1
  198. package/dist/clients/script-debugger/index.d.ts +5 -0
  199. package/dist/clients/script-debugger/index.d.ts.map +1 -0
  200. package/dist/clients/script-debugger/index.js +5 -0
  201. package/dist/clients/script-debugger/index.js.map +1 -0
  202. package/dist/clients/script-debugger/script-debugger-client.d.ts +147 -0
  203. package/dist/clients/script-debugger/script-debugger-client.d.ts.map +1 -0
  204. package/dist/clients/script-debugger/script-debugger-client.js +591 -0
  205. package/dist/clients/script-debugger/script-debugger-client.js.map +1 -0
  206. package/dist/clients/sfra-client.d.ts +13 -62
  207. package/dist/clients/sfra-client.d.ts.map +1 -1
  208. package/dist/clients/sfra-client.js +105 -326
  209. package/dist/clients/sfra-client.js.map +1 -1
  210. package/dist/config/configuration-factory.d.ts +1 -1
  211. package/dist/config/configuration-factory.d.ts.map +1 -1
  212. package/dist/config/configuration-factory.js +5 -1
  213. package/dist/config/configuration-factory.js.map +1 -1
  214. package/dist/config/dw-json-loader.d.ts +7 -0
  215. package/dist/config/dw-json-loader.d.ts.map +1 -1
  216. package/dist/config/dw-json-loader.js +92 -15
  217. package/dist/config/dw-json-loader.js.map +1 -1
  218. package/dist/config/workspace-roots.d.ts +143 -0
  219. package/dist/config/workspace-roots.d.ts.map +1 -0
  220. package/dist/config/workspace-roots.js +448 -0
  221. package/dist/config/workspace-roots.js.map +1 -0
  222. package/dist/constants/index.d.ts +1 -0
  223. package/dist/constants/index.d.ts.map +1 -0
  224. package/dist/constants/index.js +3 -0
  225. package/dist/constants/index.js.map +1 -0
  226. package/dist/core/handlers/abstract-client-handler.d.ts +52 -0
  227. package/dist/core/handlers/abstract-client-handler.d.ts.map +1 -0
  228. package/dist/core/handlers/abstract-client-handler.js +51 -0
  229. package/dist/core/handlers/abstract-client-handler.js.map +1 -0
  230. package/dist/core/handlers/agent-instructions-handler.d.ts +17 -0
  231. package/dist/core/handlers/agent-instructions-handler.d.ts.map +1 -0
  232. package/dist/core/handlers/agent-instructions-handler.js +38 -0
  233. package/dist/core/handlers/agent-instructions-handler.js.map +1 -0
  234. package/dist/core/handlers/base-handler.d.ts +3 -68
  235. package/dist/core/handlers/base-handler.d.ts.map +1 -1
  236. package/dist/core/handlers/base-handler.js +11 -84
  237. package/dist/core/handlers/base-handler.js.map +1 -1
  238. package/dist/core/handlers/cartridge-handler.d.ts +10 -11
  239. package/dist/core/handlers/cartridge-handler.d.ts.map +1 -1
  240. package/dist/core/handlers/cartridge-handler.js +10 -28
  241. package/dist/core/handlers/cartridge-handler.js.map +1 -1
  242. package/dist/core/handlers/client-factory.d.ts +12 -2
  243. package/dist/core/handlers/client-factory.d.ts.map +1 -1
  244. package/dist/core/handlers/client-factory.js +28 -1
  245. package/dist/core/handlers/client-factory.js.map +1 -1
  246. package/dist/core/handlers/code-version-handler.d.ts +11 -11
  247. package/dist/core/handlers/code-version-handler.d.ts.map +1 -1
  248. package/dist/core/handlers/code-version-handler.js +13 -27
  249. package/dist/core/handlers/code-version-handler.js.map +1 -1
  250. package/dist/core/handlers/docs-handler.d.ts +6 -12
  251. package/dist/core/handlers/docs-handler.d.ts.map +1 -1
  252. package/dist/core/handlers/docs-handler.js +11 -36
  253. package/dist/core/handlers/docs-handler.js.map +1 -1
  254. package/dist/core/handlers/isml-handler.d.ts +11 -0
  255. package/dist/core/handlers/isml-handler.d.ts.map +1 -0
  256. package/dist/core/handlers/isml-handler.js +18 -0
  257. package/dist/core/handlers/isml-handler.js.map +1 -0
  258. package/dist/core/handlers/job-log-handler.d.ts +8 -7
  259. package/dist/core/handlers/job-log-handler.d.ts.map +1 -1
  260. package/dist/core/handlers/job-log-handler.js +14 -5
  261. package/dist/core/handlers/job-log-handler.js.map +1 -1
  262. package/dist/core/handlers/log-handler.d.ts +8 -7
  263. package/dist/core/handlers/log-handler.d.ts.map +1 -1
  264. package/dist/core/handlers/log-handler.js +14 -5
  265. package/dist/core/handlers/log-handler.js.map +1 -1
  266. package/dist/core/handlers/script-debugger-handler.d.ts +18 -0
  267. package/dist/core/handlers/script-debugger-handler.d.ts.map +1 -0
  268. package/dist/core/handlers/script-debugger-handler.js +31 -0
  269. package/dist/core/handlers/script-debugger-handler.js.map +1 -0
  270. package/dist/core/handlers/sfra-handler.d.ts +6 -12
  271. package/dist/core/handlers/sfra-handler.d.ts.map +1 -1
  272. package/dist/core/handlers/sfra-handler.js +11 -36
  273. package/dist/core/handlers/sfra-handler.js.map +1 -1
  274. package/dist/core/handlers/simple-client-handler.d.ts +41 -0
  275. package/dist/core/handlers/simple-client-handler.d.ts.map +1 -0
  276. package/dist/core/handlers/simple-client-handler.js +49 -0
  277. package/dist/core/handlers/simple-client-handler.js.map +1 -0
  278. package/dist/core/handlers/system-object-handler.d.ts +11 -11
  279. package/dist/core/handlers/system-object-handler.d.ts.map +1 -1
  280. package/dist/core/handlers/system-object-handler.js +13 -27
  281. package/dist/core/handlers/system-object-handler.js.map +1 -1
  282. package/dist/core/handlers/validation-helpers.d.ts +22 -24
  283. package/dist/core/handlers/validation-helpers.d.ts.map +1 -1
  284. package/dist/core/handlers/validation-helpers.js +89 -39
  285. package/dist/core/handlers/validation-helpers.js.map +1 -1
  286. package/dist/core/instruction-advisor.d.ts +28 -0
  287. package/dist/core/instruction-advisor.d.ts.map +1 -0
  288. package/dist/core/instruction-advisor.js +114 -0
  289. package/dist/core/instruction-advisor.js.map +1 -0
  290. package/dist/core/server.d.ts +25 -0
  291. package/dist/core/server.d.ts.map +1 -1
  292. package/dist/core/server.js +151 -11
  293. package/dist/core/server.js.map +1 -1
  294. package/dist/core/tool-definitions.d.ts +6 -854
  295. package/dist/core/tool-definitions.d.ts.map +1 -1
  296. package/dist/core/tool-definitions.js +8 -1064
  297. package/dist/core/tool-definitions.js.map +1 -1
  298. package/dist/core/tool-schemas/agent-instruction-tools.d.ts +77 -0
  299. package/dist/core/tool-schemas/agent-instruction-tools.d.ts.map +1 -0
  300. package/dist/core/tool-schemas/agent-instruction-tools.js +72 -0
  301. package/dist/core/tool-schemas/agent-instruction-tools.js.map +1 -0
  302. package/dist/core/tool-schemas/cartridge-tools.d.ts +27 -0
  303. package/dist/core/tool-schemas/cartridge-tools.d.ts.map +1 -0
  304. package/dist/core/tool-schemas/cartridge-tools.js +29 -0
  305. package/dist/core/tool-schemas/cartridge-tools.js.map +1 -0
  306. package/dist/core/tool-schemas/code-version-tools.d.ts +28 -0
  307. package/dist/core/tool-schemas/code-version-tools.d.ts.map +1 -0
  308. package/dist/core/tool-schemas/code-version-tools.js +28 -0
  309. package/dist/core/tool-schemas/code-version-tools.js.map +1 -0
  310. package/dist/core/tool-schemas/documentation-tools.d.ts +139 -0
  311. package/dist/core/tool-schemas/documentation-tools.d.ts.map +1 -0
  312. package/dist/core/tool-schemas/documentation-tools.js +104 -0
  313. package/dist/core/tool-schemas/documentation-tools.js.map +1 -0
  314. package/dist/core/tool-schemas/index.d.ts +17 -0
  315. package/dist/core/tool-schemas/index.d.ts.map +1 -0
  316. package/dist/core/tool-schemas/index.js +19 -0
  317. package/dist/core/tool-schemas/index.js.map +1 -0
  318. package/dist/core/tool-schemas/isml-tools.d.ts +98 -0
  319. package/dist/core/tool-schemas/isml-tools.d.ts.map +1 -0
  320. package/dist/core/tool-schemas/isml-tools.js +89 -0
  321. package/dist/core/tool-schemas/isml-tools.js.map +1 -0
  322. package/dist/core/tool-schemas/log-tools.d.ts +221 -0
  323. package/dist/core/tool-schemas/log-tools.d.ts.map +1 -0
  324. package/dist/core/tool-schemas/log-tools.js +180 -0
  325. package/dist/core/tool-schemas/log-tools.js.map +1 -0
  326. package/dist/core/tool-schemas/script-debugger-tools.d.ts +44 -0
  327. package/dist/core/tool-schemas/script-debugger-tools.d.ts.map +1 -0
  328. package/dist/core/tool-schemas/script-debugger-tools.js +83 -0
  329. package/dist/core/tool-schemas/script-debugger-tools.js.map +1 -0
  330. package/dist/core/tool-schemas/sfra-tools.d.ts +63 -0
  331. package/dist/core/tool-schemas/sfra-tools.d.ts.map +1 -0
  332. package/dist/core/tool-schemas/sfra-tools.js +65 -0
  333. package/dist/core/tool-schemas/sfra-tools.js.map +1 -0
  334. package/dist/core/tool-schemas/shared-schemas.d.ts +350 -0
  335. package/dist/core/tool-schemas/shared-schemas.d.ts.map +1 -0
  336. package/dist/core/tool-schemas/shared-schemas.js +153 -0
  337. package/dist/core/tool-schemas/shared-schemas.js.map +1 -0
  338. package/dist/core/tool-schemas/system-object-tools.d.ts +511 -0
  339. package/dist/core/tool-schemas/system-object-tools.d.ts.map +1 -0
  340. package/dist/core/tool-schemas/system-object-tools.js +126 -0
  341. package/dist/core/tool-schemas/system-object-tools.js.map +1 -0
  342. package/dist/docs/dw_net/HTTPClient.md +46 -2
  343. package/dist/docs/dw_net/HTTPClientLoggingConfig.md +296 -0
  344. package/dist/docs/dw_order/Basket.md +7 -7
  345. package/dist/docs/dw_order/BasketMgr.md +22 -6
  346. package/dist/docs/dw_order.hooks/BasketMergeHooks.md +42 -0
  347. package/dist/docs/dw_svc/ServiceCallback.md +2 -2
  348. package/dist/docs/isml/isactivedatacontext.md +382 -0
  349. package/dist/docs/isml/isactivedatahead.md +566 -0
  350. package/dist/docs/isml/isanalyticsoff.md +537 -0
  351. package/dist/docs/isml/isapplepay.md +667 -0
  352. package/dist/docs/isml/isbreak.md +687 -0
  353. package/dist/docs/isml/isbuynow.md +682 -0
  354. package/dist/docs/isml/iscache.md +802 -0
  355. package/dist/docs/isml/iscomment.md +794 -0
  356. package/dist/docs/isml/iscomponent.md +797 -0
  357. package/dist/docs/isml/iscontent.md +594 -0
  358. package/dist/docs/isml/iscontinue.md +563 -0
  359. package/dist/docs/isml/iscookie.md +798 -0
  360. package/dist/docs/isml/isdecorate.md +818 -0
  361. package/dist/docs/isml/isif.md +737 -0
  362. package/dist/docs/isml/isinclude.md +874 -0
  363. package/dist/docs/isml/isloop.md +377 -0
  364. package/dist/docs/isml/ismodule.md +844 -0
  365. package/dist/docs/isml/isnext.md +672 -0
  366. package/dist/docs/isml/isobject.md +760 -0
  367. package/dist/docs/isml/ispayment.md +577 -0
  368. package/dist/docs/isml/ispaymentmessages.md +664 -0
  369. package/dist/docs/isml/isprint.md +875 -0
  370. package/dist/docs/isml/isredirect.md +716 -0
  371. package/dist/docs/isml/isremove.md +725 -0
  372. package/dist/docs/isml/isreplace.md +783 -0
  373. package/dist/docs/isml/isscript.md +859 -0
  374. package/dist/docs/isml/isselect.md +908 -0
  375. package/dist/docs/isml/isset.md +585 -0
  376. package/dist/docs/isml/isslot.md +824 -0
  377. package/dist/docs/isml/isstatus.md +711 -0
  378. package/dist/main.d.ts +16 -0
  379. package/dist/main.d.ts.map +1 -1
  380. package/dist/main.js +60 -28
  381. package/dist/main.js.map +1 -1
  382. package/dist/services/index.d.ts +4 -2
  383. package/dist/services/index.d.ts.map +1 -1
  384. package/dist/services/index.js +2 -2
  385. package/dist/services/index.js.map +1 -1
  386. package/dist/tool-configs/agent-instructions-tool-config.d.ts +6 -0
  387. package/dist/tool-configs/agent-instructions-tool-config.d.ts.map +1 -0
  388. package/dist/tool-configs/agent-instructions-tool-config.js +74 -0
  389. package/dist/tool-configs/agent-instructions-tool-config.js.map +1 -0
  390. package/dist/tool-configs/code-version-tool-config.d.ts.map +1 -1
  391. package/dist/tool-configs/code-version-tool-config.js +0 -5
  392. package/dist/tool-configs/code-version-tool-config.js.map +1 -1
  393. package/dist/tool-configs/docs-tool-config.d.ts.map +1 -1
  394. package/dist/tool-configs/docs-tool-config.js +0 -7
  395. package/dist/tool-configs/docs-tool-config.js.map +1 -1
  396. package/dist/tool-configs/isml-tool-config.d.ts +11 -0
  397. package/dist/tool-configs/isml-tool-config.d.ts.map +1 -0
  398. package/dist/tool-configs/isml-tool-config.js +77 -0
  399. package/dist/tool-configs/isml-tool-config.js.map +1 -0
  400. package/dist/tool-configs/job-log-tool-config.d.ts +1 -2
  401. package/dist/tool-configs/job-log-tool-config.d.ts.map +1 -1
  402. package/dist/tool-configs/job-log-tool-config.js +11 -15
  403. package/dist/tool-configs/job-log-tool-config.js.map +1 -1
  404. package/dist/tool-configs/log-tool-config.d.ts +1 -2
  405. package/dist/tool-configs/log-tool-config.d.ts.map +1 -1
  406. package/dist/tool-configs/log-tool-config.js +35 -51
  407. package/dist/tool-configs/log-tool-config.js.map +1 -1
  408. package/dist/tool-configs/script-debugger-tool-config.d.ts +11 -0
  409. package/dist/tool-configs/script-debugger-tool-config.d.ts.map +1 -0
  410. package/dist/tool-configs/script-debugger-tool-config.js +35 -0
  411. package/dist/tool-configs/script-debugger-tool-config.js.map +1 -0
  412. package/dist/tool-configs/sfra-tool-config.d.ts.map +1 -1
  413. package/dist/tool-configs/sfra-tool-config.js +0 -11
  414. package/dist/tool-configs/sfra-tool-config.js.map +1 -1
  415. package/dist/tool-configs/system-object-tool-config.d.ts.map +1 -1
  416. package/dist/tool-configs/system-object-tool-config.js +0 -5
  417. package/dist/tool-configs/system-object-tool-config.js.map +1 -1
  418. package/dist/types/types.d.ts +2 -0
  419. package/dist/types/types.d.ts.map +1 -1
  420. package/dist/utils/cache.d.ts +12 -10
  421. package/dist/utils/cache.d.ts.map +1 -1
  422. package/dist/utils/cache.js +47 -47
  423. package/dist/utils/cache.js.map +1 -1
  424. package/dist/utils/category-utils.d.ts +31 -0
  425. package/dist/utils/category-utils.d.ts.map +1 -0
  426. package/dist/utils/category-utils.js +45 -0
  427. package/dist/utils/category-utils.js.map +1 -0
  428. package/dist/utils/log-tool-constants.d.ts +16 -13
  429. package/dist/utils/log-tool-constants.d.ts.map +1 -1
  430. package/dist/utils/log-tool-constants.js +10 -11
  431. package/dist/utils/log-tool-constants.js.map +1 -1
  432. package/dist/utils/logger.d.ts +11 -0
  433. package/dist/utils/logger.d.ts.map +1 -1
  434. package/dist/utils/logger.js +35 -1
  435. package/dist/utils/logger.js.map +1 -1
  436. package/dist/utils/markdown-utils.d.ts +60 -0
  437. package/dist/utils/markdown-utils.d.ts.map +1 -0
  438. package/dist/utils/markdown-utils.js +206 -0
  439. package/dist/utils/markdown-utils.js.map +1 -0
  440. package/dist/utils/path-resolver.d.ts +12 -4
  441. package/dist/utils/path-resolver.d.ts.map +1 -1
  442. package/dist/utils/path-resolver.js +22 -8
  443. package/dist/utils/path-resolver.js.map +1 -1
  444. package/dist/utils/path-validation.d.ts +40 -0
  445. package/dist/utils/path-validation.d.ts.map +1 -0
  446. package/dist/utils/path-validation.js +84 -0
  447. package/dist/utils/path-validation.js.map +1 -0
  448. package/docs/dw_net/HTTPClient.md +46 -2
  449. package/docs/dw_net/HTTPClientLoggingConfig.md +296 -0
  450. package/docs/dw_order/Basket.md +7 -7
  451. package/docs/dw_order/BasketMgr.md +22 -6
  452. package/docs/dw_order.hooks/BasketMergeHooks.md +42 -0
  453. package/docs/dw_svc/ServiceCallback.md +2 -2
  454. package/docs/isml/isactivedatacontext.md +382 -0
  455. package/docs/isml/isactivedatahead.md +566 -0
  456. package/docs/isml/isanalyticsoff.md +537 -0
  457. package/docs/isml/isapplepay.md +667 -0
  458. package/docs/isml/isbreak.md +687 -0
  459. package/docs/isml/isbuynow.md +682 -0
  460. package/docs/isml/iscache.md +802 -0
  461. package/docs/isml/iscomment.md +794 -0
  462. package/docs/isml/iscomponent.md +797 -0
  463. package/docs/isml/iscontent.md +594 -0
  464. package/docs/isml/iscontinue.md +563 -0
  465. package/docs/isml/iscookie.md +798 -0
  466. package/docs/isml/isdecorate.md +818 -0
  467. package/docs/isml/isif.md +737 -0
  468. package/docs/isml/isinclude.md +874 -0
  469. package/docs/isml/isloop.md +377 -0
  470. package/docs/isml/ismodule.md +844 -0
  471. package/docs/isml/isnext.md +672 -0
  472. package/docs/isml/isobject.md +760 -0
  473. package/docs/isml/ispayment.md +577 -0
  474. package/docs/isml/ispaymentmessages.md +664 -0
  475. package/docs/isml/isprint.md +875 -0
  476. package/docs/isml/isredirect.md +716 -0
  477. package/docs/isml/isremove.md +725 -0
  478. package/docs/isml/isreplace.md +783 -0
  479. package/docs/isml/isscript.md +859 -0
  480. package/docs/isml/isselect.md +908 -0
  481. package/docs/isml/isset.md +585 -0
  482. package/docs/isml/isslot.md +824 -0
  483. package/docs/isml/isstatus.md +711 -0
  484. package/docs-site-v2/.vitepress/config.mts +190 -0
  485. package/docs-site-v2/.vitepress/theme/components/AssistantTabs.vue +96 -0
  486. package/docs-site-v2/.vitepress/theme/components/Callout.vue +10 -0
  487. package/docs-site-v2/.vitepress/theme/components/Collapsible.vue +14 -0
  488. package/docs-site-v2/.vitepress/theme/components/DwJsonBuilder.vue +82 -0
  489. package/docs-site-v2/.vitepress/theme/components/HomeSections.vue +552 -0
  490. package/docs-site-v2/.vitepress/theme/components/InstructionFilesTabs.vue +87 -0
  491. package/docs-site-v2/.vitepress/theme/components/ModeTabs.vue +70 -0
  492. package/docs-site-v2/.vitepress/theme/components/NewcomerCTA.vue +14 -0
  493. package/docs-site-v2/.vitepress/theme/components/QuickStartCards.vue +20 -0
  494. package/docs-site-v2/.vitepress/theme/components/QuickStartHero.vue +20 -0
  495. package/docs-site-v2/.vitepress/theme/components/SkillsList.vue +48 -0
  496. package/docs-site-v2/.vitepress/theme/components/ToolExplorer.vue +85 -0
  497. package/docs-site-v2/.vitepress/theme/custom.css +1373 -0
  498. package/docs-site-v2/.vitepress/theme/index.ts +39 -0
  499. package/docs-site-v2/data/skills.ts +147 -0
  500. package/docs-site-v2/data/tools.ts +490 -0
  501. package/docs-site-v2/development/index.md +151 -0
  502. package/docs-site-v2/examples/index.md +333 -0
  503. package/docs-site-v2/features/index.md +144 -0
  504. package/docs-site-v2/guide/ai-interfaces.md +58 -0
  505. package/docs-site-v2/guide/configuration.md +208 -0
  506. package/docs-site-v2/guide/index.md +50 -0
  507. package/docs-site-v2/index.md +32 -0
  508. package/docs-site-v2/package-lock.json +2511 -0
  509. package/docs-site-v2/package.json +15 -0
  510. package/docs-site-v2/public/android-chrome-192x192.png +0 -0
  511. package/docs-site-v2/public/android-chrome-512x512.png +0 -0
  512. package/docs-site-v2/public/apple-touch-icon.png +0 -0
  513. package/docs-site-v2/public/favicon-16x16.png +0 -0
  514. package/docs-site-v2/public/favicon-32x32.png +0 -0
  515. package/docs-site-v2/public/favicon.ico +0 -0
  516. package/docs-site-v2/public/index.css +4174 -0
  517. package/docs-site-v2/public/llms.txt +44 -0
  518. package/docs-site-v2/public/logo-dark.svg +8 -0
  519. package/docs-site-v2/public/logo.svg +8 -0
  520. package/{docs-site → docs-site-v2}/public/robots.txt +1 -6
  521. package/{docs-site → docs-site-v2}/public/site.webmanifest +1 -1
  522. package/{docs-site → docs-site-v2}/public/sitemap.xml +33 -12
  523. package/docs-site-v2/script-debugger/index.md +105 -0
  524. package/docs-site-v2/scripts/generate-llms.js +71 -0
  525. package/docs-site-v2/scripts/generate-sitemap.js +97 -0
  526. package/docs-site-v2/security/index.md +115 -0
  527. package/docs-site-v2/skills/index.md +40 -0
  528. package/docs-site-v2/tools/index.md +36 -0
  529. package/docs-site-v2/troubleshooting/index.md +204 -0
  530. package/eslint.config.js +3 -1
  531. package/memories/repo/docs-site-v2-build.json +11 -0
  532. package/package.json +18 -14
  533. package/scripts/validate-server-json.js +68 -0
  534. package/server.json +4 -6
  535. package/src/clients/agent-instructions-client.ts +370 -0
  536. package/src/clients/base/abstract-documentation-client.ts +405 -0
  537. package/src/clients/base/oauth-token.ts +52 -2
  538. package/src/clients/cartridge/cartridge-generation-client.ts +302 -0
  539. package/src/clients/cartridge/cartridge-structure.ts +37 -0
  540. package/src/clients/cartridge/cartridge-templates.ts +246 -0
  541. package/src/clients/cartridge/index.ts +6 -0
  542. package/src/clients/docs/documentation-scanner.ts +44 -28
  543. package/src/clients/docs-client.ts +54 -14
  544. package/src/clients/isml-client.ts +353 -0
  545. package/src/clients/ocapi/code-versions-client.ts +7 -1
  546. package/src/clients/ocapi-client.ts +11 -166
  547. package/src/clients/script-debugger/index.ts +5 -0
  548. package/src/clients/script-debugger/script-debugger-client.ts +754 -0
  549. package/src/clients/sfra-client.ts +134 -397
  550. package/src/config/configuration-factory.ts +6 -1
  551. package/src/config/dw-json-loader.ts +96 -15
  552. package/src/config/workspace-roots.ts +540 -0
  553. package/src/constants/index.ts +1 -0
  554. package/src/core/handlers/abstract-client-handler.ts +85 -0
  555. package/src/core/handlers/agent-instructions-handler.ts +48 -0
  556. package/src/core/handlers/base-handler.ts +17 -127
  557. package/src/core/handlers/cartridge-handler.ts +13 -33
  558. package/src/core/handlers/client-factory.ts +32 -2
  559. package/src/core/handlers/code-version-handler.ts +17 -32
  560. package/src/core/handlers/docs-handler.ts +12 -44
  561. package/src/core/handlers/isml-handler.ts +19 -0
  562. package/src/core/handlers/job-log-handler.ts +19 -8
  563. package/src/core/handlers/log-handler.ts +19 -8
  564. package/src/core/handlers/script-debugger-handler.ts +46 -0
  565. package/src/core/handlers/sfra-handler.ts +12 -44
  566. package/src/core/handlers/simple-client-handler.ts +78 -0
  567. package/src/core/handlers/system-object-handler.ts +17 -32
  568. package/src/core/handlers/validation-helpers.ts +87 -47
  569. package/src/core/instruction-advisor.ts +122 -0
  570. package/src/core/server.ts +178 -13
  571. package/src/core/tool-definitions.ts +25 -1071
  572. package/src/core/tool-schemas/agent-instruction-tools.ts +72 -0
  573. package/src/core/tool-schemas/cartridge-tools.ts +29 -0
  574. package/src/core/tool-schemas/code-version-tools.ts +28 -0
  575. package/src/core/tool-schemas/documentation-tools.ts +104 -0
  576. package/src/core/tool-schemas/index.ts +27 -0
  577. package/src/core/tool-schemas/isml-tools.ts +89 -0
  578. package/src/core/tool-schemas/log-tools.ts +196 -0
  579. package/src/core/tool-schemas/script-debugger-tools.ts +83 -0
  580. package/src/core/tool-schemas/sfra-tools.ts +65 -0
  581. package/src/core/tool-schemas/shared-schemas.ts +158 -0
  582. package/src/core/tool-schemas/system-object-tools.ts +127 -0
  583. package/src/main.ts +63 -30
  584. package/src/services/index.ts +4 -10
  585. package/src/tool-configs/agent-instructions-tool-config.ts +83 -0
  586. package/src/tool-configs/cartridge-tool-config.ts +1 -1
  587. package/src/tool-configs/code-version-tool-config.ts +0 -5
  588. package/src/tool-configs/docs-tool-config.ts +0 -7
  589. package/src/tool-configs/isml-tool-config.ts +87 -0
  590. package/src/tool-configs/job-log-tool-config.ts +18 -17
  591. package/src/tool-configs/log-tool-config.ts +49 -64
  592. package/src/tool-configs/script-debugger-tool-config.ts +69 -0
  593. package/src/tool-configs/sfra-tool-config.ts +0 -11
  594. package/src/tool-configs/system-object-tool-config.ts +0 -5
  595. package/src/types/types.ts +2 -0
  596. package/src/utils/cache.ts +49 -54
  597. package/src/utils/category-utils.ts +70 -0
  598. package/src/utils/log-tool-constants.ts +25 -17
  599. package/src/utils/logger.ts +38 -1
  600. package/src/utils/markdown-utils.ts +280 -0
  601. package/src/utils/path-resolver.ts +25 -9
  602. package/src/utils/path-validation.ts +113 -0
  603. package/tests/base-handler.test.ts +1 -1
  604. package/tests/cache.test.ts +2 -2
  605. package/tests/cartridge-handler.test.ts +4 -4
  606. package/tests/client-factory.test.ts +1 -1
  607. package/tests/code-version-handler.test.ts +3 -3
  608. package/tests/docs-handler.test.ts +2 -2
  609. package/tests/documentation-scanner.test.ts +4 -4
  610. package/tests/isml-client.test.ts +463 -0
  611. package/tests/isml-handler.test.ts +375 -0
  612. package/tests/job-log-handler.test.ts +1 -1
  613. package/tests/log-handler.test.ts +8 -8
  614. package/tests/log-validation.test.ts +149 -0
  615. package/tests/mcp/README.md +22 -18
  616. package/tests/mcp/node/activate-code-version-advanced.full-mode.programmatic.test.js +30 -12
  617. package/tests/mcp/node/evaluate-script.full-mode.programmatic.test.js +387 -0
  618. package/tests/mcp/node/generate-cartridge-structure.docs-only.programmatic.test.js +14 -8
  619. package/tests/mcp/node/get-isml-categories.programmatic.test.js +278 -0
  620. package/tests/mcp/node/get-isml-element.programmatic.test.js +278 -0
  621. package/tests/mcp/node/get-isml-elements-by-category.programmatic.test.js +363 -0
  622. package/tests/mcp/node/get-sfra-categories.docs-only.programmatic.test.js +24 -24
  623. package/tests/mcp/node/get-sfra-document.programmatic.test.js +4 -2
  624. package/tests/mcp/node/list-isml-elements.programmatic.test.js +311 -0
  625. package/tests/mcp/node/list-sfcc-classes.docs-only.programmatic.test.js +2 -33
  626. package/tests/mcp/node/search-isml-elements.programmatic.test.js +325 -0
  627. package/tests/mcp/node/search-sfcc-classes.docs-only.programmatic.test.js +5 -9
  628. package/tests/mcp/node/search-sfcc-methods.docs-only.programmatic.test.js +7 -9
  629. package/tests/mcp/node/tools.docs-only.programmatic.test.js +42 -65
  630. package/tests/mcp/node/tools.full-mode.programmatic.test.js +7 -8
  631. package/tests/mcp/yaml/activate-code-version.full-mode.test.mcp.yml +2 -2
  632. package/tests/mcp/yaml/evaluate-script.full-mode.test.mcp.yml +281 -0
  633. package/tests/mcp/yaml/get-isml-categories.docs-only.test.mcp.yml +330 -0
  634. package/tests/mcp/yaml/get-isml-element.docs-only.test.mcp.yml +294 -0
  635. package/tests/mcp/yaml/get-isml-elements-by-category.docs-only.test.mcp.yml +334 -0
  636. package/tests/mcp/yaml/get-sfcc-class-info.docs-only.test.mcp.yml +2 -2
  637. package/tests/mcp/yaml/get-sfra-categories.docs-only.test.mcp.yml +13 -13
  638. package/tests/mcp/yaml/get-sfra-categories.full-mode.test.mcp.yml +13 -13
  639. package/tests/mcp/yaml/get-system-object-definitions.docs-only.test.mcp.yml +1 -16
  640. package/tests/mcp/yaml/list-isml-elements.docs-only.test.mcp.yml +212 -0
  641. package/tests/mcp/yaml/search-isml-elements.docs-only.test.mcp.yml +312 -0
  642. package/tests/mcp/yaml/search-sfcc-classes.docs-only.test.mcp.yml +1 -1
  643. package/tests/mcp/yaml/search-sfcc-classes.full-mode.test.mcp.yml +1 -1
  644. package/tests/mcp/yaml/search-site-preferences.docs-only.test.mcp.yml +1 -1
  645. package/tests/mcp/yaml/tools.docs-only.test.mcp.yml +3 -57
  646. package/tests/mcp/yaml/tools.full-mode.test.mcp.yml +3 -3
  647. package/tests/oauth-token.test.ts +107 -12
  648. package/tests/ocapi-client.test.ts +53 -106
  649. package/tests/script-debugger-client.test.ts +430 -0
  650. package/tests/servers/sfcc-mock-server/src/app.js +15 -0
  651. package/tests/servers/sfcc-mock-server/src/routes/cartridge-webdav.js +258 -0
  652. package/tests/servers/sfcc-mock-server/src/routes/ocapi/debugger-handler.js +396 -0
  653. package/tests/servers/sfcc-mock-server/src/routes/ocapi.js +5 -0
  654. package/tests/servers/sfcc-mock-server/src/routes/storefront.js +86 -0
  655. package/tests/servers/sfcc-mock-server/src/routes/webdav.js +6 -4
  656. package/tests/validation-helpers.test.ts +0 -31
  657. package/tests/workspace-roots.test.ts +227 -0
  658. package/ai-instructions/claude-desktop/claude_custom_instructions.md +0 -321
  659. package/ai-instructions/cursor/.cursor/rules/debugging-workflows.mdc +0 -171
  660. package/ai-instructions/cursor/.cursor/rules/hooks-development.mdc +0 -168
  661. package/ai-instructions/cursor/.cursor/rules/isml-templates.mdc +0 -209
  662. package/ai-instructions/cursor/.cursor/rules/job-framework.mdc +0 -379
  663. package/ai-instructions/cursor/.cursor/rules/performance-optimization.mdc +0 -215
  664. package/ai-instructions/cursor/.cursor/rules/scapi-endpoints.mdc +0 -98
  665. package/ai-instructions/cursor/.cursor/rules/security-patterns.mdc +0 -375
  666. package/ai-instructions/cursor/.cursor/rules/sfcc-development.mdc +0 -144
  667. package/ai-instructions/cursor/.cursor/rules/sfra-controllers.mdc +0 -376
  668. package/ai-instructions/cursor/.cursor/rules/sfra-models.mdc +0 -412
  669. package/ai-instructions/cursor/.cursor/rules/system-objects.mdc +0 -383
  670. package/ai-instructions/cursor/.cursor/rules/testing-patterns.mdc +0 -418
  671. package/dist/clients/best-practices-client.d.ts +0 -57
  672. package/dist/clients/best-practices-client.d.ts.map +0 -1
  673. package/dist/clients/best-practices-client.js +0 -288
  674. package/dist/clients/best-practices-client.js.map +0 -1
  675. package/dist/clients/cartridge-generation-client.d.ts +0 -57
  676. package/dist/clients/cartridge-generation-client.d.ts.map +0 -1
  677. package/dist/clients/cartridge-generation-client.js +0 -384
  678. package/dist/clients/cartridge-generation-client.js.map +0 -1
  679. package/dist/clients/logs/index.d.ts +0 -13
  680. package/dist/clients/logs/index.d.ts.map +0 -1
  681. package/dist/clients/logs/index.js +0 -15
  682. package/dist/clients/logs/index.js.map +0 -1
  683. package/dist/clients/logs/log-analyzer.d.ts +0 -55
  684. package/dist/clients/logs/log-analyzer.d.ts.map +0 -1
  685. package/dist/clients/logs/log-analyzer.js +0 -228
  686. package/dist/clients/logs/log-analyzer.js.map +0 -1
  687. package/dist/clients/logs/log-client.d.ts +0 -87
  688. package/dist/clients/logs/log-client.d.ts.map +0 -1
  689. package/dist/clients/logs/log-client.js +0 -418
  690. package/dist/clients/logs/log-client.js.map +0 -1
  691. package/dist/clients/logs/log-constants.d.ts +0 -37
  692. package/dist/clients/logs/log-constants.d.ts.map +0 -1
  693. package/dist/clients/logs/log-constants.js +0 -37
  694. package/dist/clients/logs/log-constants.js.map +0 -1
  695. package/dist/clients/logs/log-file-discovery.d.ts +0 -62
  696. package/dist/clients/logs/log-file-discovery.d.ts.map +0 -1
  697. package/dist/clients/logs/log-file-discovery.js +0 -238
  698. package/dist/clients/logs/log-file-discovery.js.map +0 -1
  699. package/dist/clients/logs/log-file-reader.d.ts +0 -53
  700. package/dist/clients/logs/log-file-reader.d.ts.map +0 -1
  701. package/dist/clients/logs/log-file-reader.js +0 -194
  702. package/dist/clients/logs/log-file-reader.js.map +0 -1
  703. package/dist/clients/logs/log-formatter.d.ts +0 -90
  704. package/dist/clients/logs/log-formatter.d.ts.map +0 -1
  705. package/dist/clients/logs/log-formatter.js +0 -189
  706. package/dist/clients/logs/log-formatter.js.map +0 -1
  707. package/dist/clients/logs/log-processor.d.ts +0 -91
  708. package/dist/clients/logs/log-processor.d.ts.map +0 -1
  709. package/dist/clients/logs/log-processor.js +0 -328
  710. package/dist/clients/logs/log-processor.js.map +0 -1
  711. package/dist/clients/logs/log-types.d.ts +0 -69
  712. package/dist/clients/logs/log-types.d.ts.map +0 -1
  713. package/dist/clients/logs/log-types.js +0 -5
  714. package/dist/clients/logs/log-types.js.map +0 -1
  715. package/dist/clients/logs/webdav-client-manager.d.ts +0 -28
  716. package/dist/clients/logs/webdav-client-manager.d.ts.map +0 -1
  717. package/dist/clients/logs/webdav-client-manager.js +0 -77
  718. package/dist/clients/logs/webdav-client-manager.js.map +0 -1
  719. package/dist/core/handlers/abstract-log-tool-handler.d.ts +0 -35
  720. package/dist/core/handlers/abstract-log-tool-handler.d.ts.map +0 -1
  721. package/dist/core/handlers/abstract-log-tool-handler.js +0 -46
  722. package/dist/core/handlers/abstract-log-tool-handler.js.map +0 -1
  723. package/dist/core/handlers/best-practices-handler.d.ts +0 -17
  724. package/dist/core/handlers/best-practices-handler.d.ts.map +0 -1
  725. package/dist/core/handlers/best-practices-handler.js +0 -43
  726. package/dist/core/handlers/best-practices-handler.js.map +0 -1
  727. package/dist/core/handlers/job-log-tool-config.d.ts +0 -8
  728. package/dist/core/handlers/job-log-tool-config.d.ts.map +0 -1
  729. package/dist/core/handlers/job-log-tool-config.js +0 -76
  730. package/dist/core/handlers/job-log-tool-config.js.map +0 -1
  731. package/dist/core/handlers/log-tool-config.d.ts +0 -8
  732. package/dist/core/handlers/log-tool-config.d.ts.map +0 -1
  733. package/dist/core/handlers/log-tool-config.js +0 -73
  734. package/dist/core/handlers/log-tool-config.js.map +0 -1
  735. package/dist/docs/best-practices/isml_templates.md +0 -1933
  736. package/dist/docs/best-practices/job_framework.md +0 -1173
  737. package/dist/docs/best-practices/scapi_custom_endpoint.md +0 -963
  738. package/dist/docs/best-practices/sfra_client_side_js.md +0 -736
  739. package/dist/docs/best-practices/sfra_models.md +0 -1142
  740. package/dist/tool-configs/best-practices-tool-config.d.ts +0 -11
  741. package/dist/tool-configs/best-practices-tool-config.d.ts.map +0 -1
  742. package/dist/tool-configs/best-practices-tool-config.js +0 -59
  743. package/dist/tool-configs/best-practices-tool-config.js.map +0 -1
  744. package/dist/utils/job-log-tool-config.d.ts +0 -8
  745. package/dist/utils/job-log-tool-config.d.ts.map +0 -1
  746. package/dist/utils/job-log-tool-config.js +0 -76
  747. package/dist/utils/job-log-tool-config.js.map +0 -1
  748. package/dist/utils/job-log-utils.d.ts +0 -34
  749. package/dist/utils/job-log-utils.d.ts.map +0 -1
  750. package/dist/utils/job-log-utils.js +0 -60
  751. package/dist/utils/job-log-utils.js.map +0 -1
  752. package/dist/utils/log-cache.d.ts +0 -53
  753. package/dist/utils/log-cache.d.ts.map +0 -1
  754. package/dist/utils/log-cache.js +0 -114
  755. package/dist/utils/log-cache.js.map +0 -1
  756. package/dist/utils/log-tool-config.d.ts +0 -8
  757. package/dist/utils/log-tool-config.d.ts.map +0 -1
  758. package/dist/utils/log-tool-config.js +0 -73
  759. package/dist/utils/log-tool-config.js.map +0 -1
  760. package/dist/utils/log-tool-utils.d.ts +0 -39
  761. package/dist/utils/log-tool-utils.d.ts.map +0 -1
  762. package/dist/utils/log-tool-utils.js +0 -94
  763. package/dist/utils/log-tool-utils.js.map +0 -1
  764. package/docs/best-practices/isml_templates.md +0 -1933
  765. package/docs/best-practices/job_framework.md +0 -1173
  766. package/docs/best-practices/scapi_custom_endpoint.md +0 -963
  767. package/docs/best-practices/sfra_client_side_js.md +0 -736
  768. package/docs/best-practices/sfra_models.md +0 -1142
  769. package/docs-site/App.tsx +0 -103
  770. package/docs-site/README.md +0 -113
  771. package/docs-site/components/Badge.tsx +0 -38
  772. package/docs-site/components/BreadcrumbSchema.tsx +0 -34
  773. package/docs-site/components/CodeBlock.tsx +0 -132
  774. package/docs-site/components/Collapsible.tsx +0 -40
  775. package/docs-site/components/ConfigBuilder.tsx +0 -118
  776. package/docs-site/components/ConfigHero.tsx +0 -19
  777. package/docs-site/components/ConfigModeTabs.tsx +0 -42
  778. package/docs-site/components/Layout.tsx +0 -174
  779. package/docs-site/components/LightCodeContainer.tsx +0 -44
  780. package/docs-site/components/NewcomerCTA.tsx +0 -57
  781. package/docs-site/components/NextStepsStrip.tsx +0 -23
  782. package/docs-site/components/OnThisPage.tsx +0 -91
  783. package/docs-site/components/SEO.tsx +0 -79
  784. package/docs-site/components/Search.tsx +0 -207
  785. package/docs-site/components/Sidebar.tsx +0 -96
  786. package/docs-site/components/StructuredData.tsx +0 -72
  787. package/docs-site/components/ToolCard.tsx +0 -84
  788. package/docs-site/components/ToolFilters.tsx +0 -39
  789. package/docs-site/components/Typography.tsx +0 -30
  790. package/docs-site/components/VersionBadge.tsx +0 -18
  791. package/docs-site/components/icons.tsx +0 -37
  792. package/docs-site/constants.tsx +0 -34
  793. package/docs-site/index.html +0 -62
  794. package/docs-site/main.tsx +0 -16
  795. package/docs-site/metadata.json +0 -5
  796. package/docs-site/package-lock.json +0 -3966
  797. package/docs-site/package.json +0 -35
  798. package/docs-site/pages/AIInterfacesPage.tsx +0 -610
  799. package/docs-site/pages/ConfigurationPage.tsx +0 -315
  800. package/docs-site/pages/DevelopmentPage.tsx +0 -607
  801. package/docs-site/pages/ExamplesPage.tsx +0 -558
  802. package/docs-site/pages/FeaturesPage.tsx +0 -353
  803. package/docs-site/pages/HomePage.tsx +0 -1046
  804. package/docs-site/pages/SecurityPage.tsx +0 -372
  805. package/docs-site/pages/ToolsPage.tsx +0 -205
  806. package/docs-site/pages/TroubleshootingPage.tsx +0 -590
  807. package/docs-site/postcss.config.js +0 -6
  808. package/docs-site/public/.well-known/security.txt +0 -6
  809. package/docs-site/public/android-chrome-192x192.png +0 -0
  810. package/docs-site/public/android-chrome-512x512.png +0 -0
  811. package/docs-site/public/apple-touch-icon.png +0 -0
  812. package/docs-site/public/favicon-16x16.png +0 -0
  813. package/docs-site/public/favicon-32x32.png +0 -0
  814. package/docs-site/public/favicon.ico +0 -0
  815. package/docs-site/public/llms.txt +0 -47
  816. package/docs-site/scripts/generate-search-index.js +0 -323
  817. package/docs-site/scripts/generate-sitemap.js +0 -156
  818. package/docs-site/scripts/search-dev.js +0 -112
  819. package/docs-site/src/styles/input.css +0 -248
  820. package/docs-site/src/styles/prism-theme.css +0 -124
  821. package/docs-site/tailwind.config.js +0 -70
  822. package/docs-site/tsconfig.json +0 -29
  823. package/docs-site/types.ts +0 -16
  824. package/docs-site/utils/search.ts +0 -132
  825. package/docs-site/utils/toolsData.ts +0 -116
  826. package/docs-site/vite.config.ts +0 -63
  827. package/src/clients/best-practices-client.ts +0 -332
  828. package/src/clients/cartridge-generation-client.ts +0 -507
  829. package/src/clients/logs/index.ts +0 -18
  830. package/src/clients/logs/log-analyzer.ts +0 -289
  831. package/src/clients/logs/log-client.ts +0 -540
  832. package/src/clients/logs/log-constants.ts +0 -53
  833. package/src/clients/logs/log-file-discovery.ts +0 -299
  834. package/src/clients/logs/log-file-reader.ts +0 -227
  835. package/src/clients/logs/log-formatter.ts +0 -258
  836. package/src/clients/logs/log-processor.ts +0 -402
  837. package/src/clients/logs/log-types.ts +0 -80
  838. package/src/clients/logs/webdav-client-manager.ts +0 -93
  839. package/src/core/handlers/abstract-log-tool-handler.ts +0 -64
  840. package/src/core/handlers/best-practices-handler.ts +0 -55
  841. package/src/core/handlers/job-log-tool-config.ts +0 -89
  842. package/src/core/handlers/log-tool-config.ts +0 -98
  843. package/src/tool-configs/best-practices-tool-config.ts +0 -68
  844. package/src/utils/job-log-tool-config.ts +0 -89
  845. package/src/utils/job-log-utils.ts +0 -78
  846. package/src/utils/log-cache.ts +0 -134
  847. package/src/utils/log-tool-config.ts +0 -98
  848. package/src/utils/log-tool-utils.ts +0 -122
  849. package/tests/best-practices-handler.test.ts +0 -236
  850. package/tests/job-log-utils.test.ts +0 -182
  851. package/tests/mcp/node/get-available-best-practice-guides.docs-only.programmatic.test.js +0 -516
  852. package/tests/mcp/node/get-best-practice-guide.docs-only.programmatic.test.js +0 -733
  853. package/tests/mcp/node/get-hook-reference.docs-only.programmatic.test.js +0 -185
  854. package/tests/mcp/node/search-best-practices.docs-only.programmatic.test.js +0 -836
  855. package/tests/mcp/yaml/get-available-best-practice-guides.docs-only.test.mcp.yml +0 -885
  856. package/tests/mcp/yaml/get-available-best-practice-guides.full-mode.test.mcp.yml +0 -885
  857. package/tests/mcp/yaml/get-best-practice-guide.docs-only.test.mcp.yml +0 -462
  858. package/tests/mcp/yaml/get-best-practice-guide.full-mode.test.mcp.yml +0 -462
  859. package/tests/mcp/yaml/get-hook-reference.docs-only.test.mcp.yml +0 -321
  860. package/tests/mcp/yaml/get-hook-reference.full-mode.test.mcp.yml +0 -321
  861. package/tests/mcp/yaml/search-best-practices.docs-only.test.mcp.yml +0 -655
  862. package/tests/mcp/yaml/search-best-practices.full-mode.test.mcp.yml +0 -655
  863. /package/{docs-site → docs-site-v2}/public/404.html +0 -0
  864. /package/{docs-site → docs-site-v2}/public/explain-product-pricing-methods-no-mcp.png +0 -0
  865. /package/{docs-site → docs-site-v2}/public/explain-product-pricing-methods.png +0 -0
@@ -1,836 +0,0 @@
1
- /**
2
- * Programmatic tests for search_best_practices tool
3
- *
4
- * These tests provide advanced verification capabilities beyond YAML pattern matching,
5
- * including dynamic validation, comprehensive content analysis,
6
- * search quality metrics, cross-guide relationship analysis, pattern recognition,
7
- * and comprehensive error categorization for the SFCC best practices search functionality.
8
- *
9
- * Response format discovered via aegis query:
10
- * - Success: { content: [{ type: "text", text: "[{"name":"guide_name","title":"Guide Title","matches":[...]}]" }], isError: false }
11
- * - Empty: { content: [{ type: "text", text: "[]" }], isError: false }
12
- * - Error: { content: [{ type: "text", text: "Error: ..." }], isError: true }
13
- * - Search results include guide metadata, match relevance, and content excerpts
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
-
21
- /**
22
- * Search results analyzer for comprehensive search quality assessment
23
- */
24
- class SearchResultsAnalyzer {
25
- constructor() {
26
- this.knownGuides = [
27
- 'cartridge_creation', 'isml_templates', 'job_framework', 'localserviceregistry',
28
- 'ocapi_hooks', 'scapi_hooks', 'sfra_controllers', 'sfra_models',
29
- 'sfra_client_side_js', 'sfra_scss', 'scapi_custom_endpoint', 'performance', 'security'
30
- ];
31
-
32
- this.searchTermPatterns = {
33
- validation: {
34
- expectedGuides: ['isml_templates', 'ocapi_hooks', 'scapi_hooks', 'sfra_controllers', 'sfra_client_side_js', 'sfra_scss', 'security'],
35
- requiredTerms: ['validation', 'validate', 'check', 'verify'],
36
- contextTerms: ['form', 'input', 'parameter', 'data', 'error']
37
- },
38
- security: {
39
- expectedGuides: ['security', 'ocapi_hooks', 'scapi_hooks', 'sfra_controllers'],
40
- requiredTerms: ['security', 'secure', 'auth', 'encrypt', 'protect'],
41
- contextTerms: ['CSRF', 'XSS', 'authorization', 'authentication', 'cryptography']
42
- },
43
- performance: {
44
- expectedGuides: ['performance', 'sfra_controllers', 'sfra_client_side_js', 'sfra_scss', 'cartridge_creation'],
45
- requiredTerms: ['performance', 'optimize', 'cache', 'memory', 'speed'],
46
- contextTerms: ['monitoring', 'metrics', 'throughput', 'latency', 'scalability']
47
- },
48
- controller: {
49
- expectedGuides: ['sfra_controllers', 'sfra_models'],
50
- requiredTerms: ['controller', 'middleware', 'route', 'endpoint'],
51
- contextTerms: ['server.get', 'server.post', 'append', 'prepend', 'replace']
52
- },
53
- cartridge: {
54
- expectedGuides: ['cartridge_creation'],
55
- requiredTerms: ['cartridge', 'deployment', 'override', 'path'],
56
- contextTerms: ['plugin', 'app_storefront_base', 'upload', 'structure']
57
- }
58
- };
59
- }
60
-
61
- analyzeResults(searchQuery, resultsArray) {
62
- return {
63
- searchMeta: this.analyzeSearchMetadata(searchQuery, resultsArray),
64
- relevanceScoring: this.calculateRelevanceScores(searchQuery, resultsArray),
65
- contentQuality: this.assessContentQuality(resultsArray),
66
- crossGuideAnalysis: this.analyzeCrossGuideRelationships(resultsArray),
67
- comprehensiveness: this.assessComprehensiveness(searchQuery, resultsArray),
68
- searchEffectiveness: this.calculateSearchEffectiveness(searchQuery, resultsArray)
69
- };
70
- }
71
-
72
- analyzeSearchMetadata(searchQuery, resultsArray) {
73
- const uniqueGuides = new Set(resultsArray.map(result => result.guide));
74
- const totalMatches = resultsArray.reduce((sum, result) => sum + result.matches.length, 0);
75
-
76
- return {
77
- query: searchQuery,
78
- resultCount: resultsArray.length,
79
- uniqueGuides: uniqueGuides.size,
80
- guidesFound: Array.from(uniqueGuides),
81
- totalMatches,
82
- avgMatchesPerGuide: resultsArray.length > 0 ? totalMatches / resultsArray.length : 0,
83
- searchCoverage: (uniqueGuides.size / this.knownGuides.length) * 100
84
- };
85
- }
86
-
87
- calculateRelevanceScores(searchQuery, resultsArray) {
88
- const scores = resultsArray.map(result => {
89
- const titleRelevance = this.calculateTextRelevance(searchQuery, result.title);
90
- const contentRelevance = result.matches.map(match =>
91
- this.calculateTextRelevance(searchQuery, match.content)
92
- );
93
- const avgContentRelevance = contentRelevance.length > 0 ?
94
- contentRelevance.reduce((a, b) => a + b, 0) / contentRelevance.length : 0;
95
-
96
- return {
97
- guide: result.guide,
98
- titleRelevance,
99
- avgContentRelevance,
100
- overallScore: (titleRelevance * 0.3) + (avgContentRelevance * 0.7),
101
- matchCount: result.matches.length
102
- };
103
- });
104
-
105
- return {
106
- individualScores: scores,
107
- avgRelevanceScore: scores.length > 0 ?
108
- scores.reduce((sum, score) => sum + score.overallScore, 0) / scores.length : 0,
109
- mostRelevant: scores.reduce((best, current) =>
110
- current.overallScore > best.overallScore ? current : best, scores[0] || {}),
111
- relevanceDistribution: this.categorizeRelevanceScores(scores)
112
- };
113
- }
114
-
115
- calculateTextRelevance(query, text) {
116
- const queryTerms = query.toLowerCase().split(/\s+/);
117
- const textLower = text.toLowerCase();
118
- let score = 0;
119
-
120
- queryTerms.forEach(term => {
121
- if (textLower.includes(term)) {
122
- // Exact match
123
- score += 1;
124
- // Bonus for word boundaries
125
- if (new RegExp(`\\b${term}\\b`).test(textLower)) {
126
- score += 0.5;
127
- }
128
- }
129
- });
130
-
131
- return score / queryTerms.length;
132
- }
133
-
134
- categorizeRelevanceScores(scores) {
135
- const categories = { high: 0, medium: 0, low: 0 };
136
- scores.forEach(score => {
137
- if (score.overallScore >= 0.7) categories.high++;
138
- else if (score.overallScore >= 0.3) categories.medium++;
139
- else categories.low++;
140
- });
141
- return categories;
142
- }
143
-
144
- assessContentQuality(resultsArray) {
145
- const qualityMetrics = resultsArray.map(result => {
146
- const matches = result.matches;
147
- const avgContentLength = matches.reduce((sum, match) =>
148
- sum + match.content.length, 0) / Math.max(matches.length, 1);
149
-
150
- const hasCodeExamples = matches.some(match =>
151
- /```|`[^`]+`/.test(match.content));
152
- const hasStructuredContent = matches.some(match =>
153
- /#{1,6}\s|\*\*|-\s|\d+\.\s/.test(match.content));
154
- const hasTechnicalTerms = matches.some(match =>
155
- /dw\.|SFRA|OCAPI|SCAPI|server\.|middleware/.test(match.content));
156
-
157
- return {
158
- guide: result.guide,
159
- avgContentLength,
160
- hasCodeExamples,
161
- hasStructuredContent,
162
- hasTechnicalTerms,
163
- matchQualityScore: this.calculateMatchQualityScore(matches)
164
- };
165
- });
166
-
167
- return {
168
- individualQuality: qualityMetrics,
169
- avgContentLength: qualityMetrics.reduce((sum, q) => sum + q.avgContentLength, 0) / Math.max(qualityMetrics.length, 1),
170
- guidesWithCode: qualityMetrics.filter(q => q.hasCodeExamples).length,
171
- guidesWithStructure: qualityMetrics.filter(q => q.hasStructuredContent).length,
172
- technicalAccuracy: qualityMetrics.filter(q => q.hasTechnicalTerms).length / Math.max(qualityMetrics.length, 1)
173
- };
174
- }
175
-
176
- calculateMatchQualityScore(matches) {
177
- let score = 0;
178
- matches.forEach(match => {
179
- if (match.content.length > 100) score += 1; // Substantial content
180
- if (/```[\s\S]*?```/.test(match.content)) score += 2; // Code blocks
181
- if (/#{1,6}\s/.test(match.content)) score += 1; // Headers
182
- if (/\*\*[^*]+\*\*/.test(match.content)) score += 0.5; // Bold text
183
- if (/`[^`]+`/.test(match.content)) score += 0.5; // Inline code
184
- });
185
- return score / Math.max(matches.length, 1);
186
- }
187
-
188
- analyzeCrossGuideRelationships(resultsArray) {
189
- const sharedTopics = new Map();
190
-
191
- resultsArray.forEach(result => {
192
- const guide = result.guide;
193
- result.matches.forEach(match => {
194
- // Extract technical terms and concepts
195
- const terms = this.extractTechnicalTerms(match.content);
196
- terms.forEach(term => {
197
- if (!sharedTopics.has(term)) {
198
- sharedTopics.set(term, new Set());
199
- }
200
- sharedTopics.get(term).add(guide);
201
- });
202
- });
203
- });
204
-
205
- // Find interconnected guides
206
- const interconnections = [];
207
- for (const [topic, guides] of sharedTopics.entries()) {
208
- if (guides.size > 1) {
209
- interconnections.push({
210
- topic,
211
- guides: Array.from(guides),
212
- connectionStrength: guides.size
213
- });
214
- }
215
- }
216
-
217
- return {
218
- totalSharedTopics: sharedTopics.size,
219
- interconnections: interconnections.sort((a, b) => b.connectionStrength - a.connectionStrength),
220
- mostConnectedTopic: interconnections[0] || null,
221
- guideConnectivity: this.calculateGuideConnectivity(interconnections)
222
- };
223
- }
224
-
225
- extractTechnicalTerms(content) {
226
- const terms = new Set();
227
-
228
- // SFCC API patterns
229
- const apiMatches = content.match(/dw\.\w+(\.\w+)*/g) || [];
230
- apiMatches.forEach(match => terms.add(match));
231
-
232
- // SFRA patterns
233
- const sfraMatches = content.match(/server\.\w+|middleware|controller|model/gi) || [];
234
- sfraMatches.forEach(match => terms.add(match.toLowerCase()));
235
-
236
- // Technical concepts
237
- const concepts = ['validation', 'authentication', 'authorization', 'encryption', 'caching', 'transaction', 'middleware', 'hook', 'endpoint'];
238
- concepts.forEach(concept => {
239
- if (new RegExp(concept, 'i').test(content)) {
240
- terms.add(concept);
241
- }
242
- });
243
-
244
- return Array.from(terms);
245
- }
246
-
247
- calculateGuideConnectivity(interconnections) {
248
- const guideConnections = new Map();
249
- interconnections.forEach(connection => {
250
- connection.guides.forEach(guide => {
251
- if (!guideConnections.has(guide)) {
252
- guideConnections.set(guide, 0);
253
- }
254
- guideConnections.set(guide, guideConnections.get(guide) + connection.connectionStrength);
255
- });
256
- });
257
-
258
- return Array.from(guideConnections.entries())
259
- .map(([guide, connectivity]) => ({ guide, connectivity }))
260
- .sort((a, b) => b.connectivity - a.connectivity);
261
- }
262
-
263
- assessComprehensiveness(searchQuery, resultsArray) {
264
- const pattern = this.searchTermPatterns[searchQuery.toLowerCase()];
265
- if (!pattern) {
266
- return { patternRecognized: false, customAnalysis: this.performCustomComprehensiveness(searchQuery, resultsArray) };
267
- }
268
-
269
- const foundGuides = new Set(resultsArray.map(r => r.guide));
270
- const expectedGuides = new Set(pattern.expectedGuides);
271
- const missingGuides = pattern.expectedGuides.filter(guide => !foundGuides.has(guide));
272
- const unexpectedGuides = resultsArray.filter(r => !expectedGuides.has(r.guide)).map(r => r.guide);
273
-
274
- const termCoverage = this.assessTermCoverage(pattern, resultsArray);
275
-
276
- return {
277
- patternRecognized: true,
278
- expectedGuides: pattern.expectedGuides,
279
- foundGuides: Array.from(foundGuides),
280
- missingGuides,
281
- unexpectedGuides,
282
- guideCoverage: (foundGuides.size - unexpectedGuides.length) / Math.max(expectedGuides.size, 1),
283
- termCoverage,
284
- comprehensivenessScore: this.calculateComprehensiveness(foundGuides, expectedGuides, termCoverage)
285
- };
286
- }
287
-
288
- performCustomComprehensiveness(searchQuery, resultsArray) {
289
- return {
290
- message: `No predefined pattern for query: ${searchQuery}`,
291
- resultCount: resultsArray.length,
292
- uniqueGuides: new Set(resultsArray.map(r => r.guide)).size,
293
- avgMatchesPerGuide: resultsArray.reduce((sum, r) => sum + r.matches.length, 0) / Math.max(resultsArray.length, 1)
294
- };
295
- }
296
-
297
- assessTermCoverage(pattern, resultsArray) {
298
- const allContent = resultsArray.flatMap(r => r.matches.map(m => m.content)).join(' ').toLowerCase();
299
-
300
- const requiredTermsFound = pattern.requiredTerms.filter(term => allContent.includes(term));
301
- const contextTermsFound = pattern.contextTerms.filter(term => allContent.includes(term));
302
-
303
- return {
304
- requiredTerms: pattern.requiredTerms.length,
305
- requiredTermsFound: requiredTermsFound.length,
306
- requiredTermsCoverage: requiredTermsFound.length / Math.max(pattern.requiredTerms.length, 1),
307
- contextTerms: pattern.contextTerms.length,
308
- contextTermsFound: contextTermsFound.length,
309
- contextTermsCoverage: contextTermsFound.length / Math.max(pattern.contextTerms.length, 1),
310
- foundTerms: { required: requiredTermsFound, context: contextTermsFound }
311
- };
312
- }
313
-
314
- calculateComprehensiveness(foundGuides, expectedGuides, termCoverage) {
315
- const guideCoverage = foundGuides.size / Math.max(expectedGuides.size, 1);
316
- const termScore = (termCoverage.requiredTermsCoverage * 0.7) + (termCoverage.contextTermsCoverage * 0.3);
317
- return (guideCoverage * 0.6) + (termScore * 0.4);
318
- }
319
-
320
- calculateSearchEffectiveness(searchQuery, resultsArray) {
321
- let totalMatches = 0;
322
- let relevantMatches = 0;
323
-
324
- resultsArray.forEach(result => {
325
- result.matches.forEach(match => {
326
- totalMatches++;
327
- const matchRelevance = this.calculateTextRelevance(searchQuery, match.content);
328
- if (matchRelevance > 0.3) relevantMatches++;
329
- });
330
- });
331
-
332
- const precision = totalMatches > 0 ? relevantMatches / totalMatches : 0;
333
- const diversityScore = new Set(resultsArray.map(r => r.guide)).size / Math.max(resultsArray.length, 1);
334
-
335
- return {
336
- totalMatches,
337
- relevantMatches,
338
- precision,
339
- diversityScore,
340
- effectivenessScore: (precision * 0.7) + (diversityScore * 0.3),
341
- searchQuality: this.categorizeSearchQuality(precision, diversityScore)
342
- };
343
- }
344
-
345
- categorizeSearchQuality(precision, diversityScore) {
346
- const overallScore = (precision * 0.7) + (diversityScore * 0.3);
347
- if (overallScore >= 0.8) return 'excellent';
348
- if (overallScore >= 0.6) return 'good';
349
- if (overallScore >= 0.4) return 'fair';
350
- return 'poor';
351
- }
352
- }
353
-
354
- /**
355
- * Query analyzer for intelligent query pattern recognition and optimization
356
- */
357
- class QueryAnalyzer {
358
- constructor() {
359
- this.queryPatterns = {
360
- technical: /\b(dw\.|server\.|middleware|controller|model|API|endpoint|hook)\b/i,
361
- security: /\b(security|auth|encrypt|CSRF|XSS|validation|sanitiz)\b/i,
362
- performance: /\b(performance|optimize|cache|memory|speed|monitoring)\b/i,
363
- framework: /\b(SFRA|OCAPI|SCAPI|cartridge|ISML|template|SCSS|SASS)\b/i,
364
- development: /\b(development|coding|implementation|best practice|guideline)\b/i
365
- };
366
-
367
- this.commonTerms = [
368
- 'validation', 'security', 'performance', 'controller', 'middleware',
369
- 'cartridge', 'template', 'hook', 'API', 'authentication', 'authorization',
370
- 'encryption', 'caching', 'transaction', 'error', 'configuration',
371
- 'scss', 'styling'
372
- ];
373
- }
374
-
375
- analyzeQuery(query) {
376
- return {
377
- originalQuery: query,
378
- queryLength: query.length,
379
- wordCount: query.split(/\s+/).length,
380
- patterns: this.identifyPatterns(query),
381
- complexity: this.assessComplexity(query),
382
- suggestions: this.generateQuerySuggestions(query),
383
- expectedResultTypes: this.predictResultTypes(query)
384
- };
385
- }
386
-
387
- identifyPatterns(query) {
388
- const patterns = {};
389
- for (const [patternName, regex] of Object.entries(this.queryPatterns)) {
390
- patterns[patternName] = regex.test(query);
391
- }
392
- return patterns;
393
- }
394
-
395
- assessComplexity(query) {
396
- const words = query.split(/\s+/);
397
- let complexityScore = 0;
398
-
399
- if (words.length === 1) complexityScore = 1; // Simple
400
- else if (words.length <= 3) complexityScore = 2; // Moderate
401
- else complexityScore = 3; // Complex
402
-
403
- // Adjust for technical terms
404
- if (this.queryPatterns.technical.test(query)) complexityScore += 1;
405
-
406
- return {
407
- score: Math.min(complexityScore, 4),
408
- category: this.categorizeComplexity(complexityScore),
409
- factors: this.identifyComplexityFactors(query)
410
- };
411
- }
412
-
413
- categorizeComplexity(score) {
414
- if (score <= 1) return 'simple';
415
- if (score <= 2) return 'moderate';
416
- if (score <= 3) return 'complex';
417
- return 'very_complex';
418
- }
419
-
420
- identifyComplexityFactors(query) {
421
- const factors = [];
422
- if (query.split(/\s+/).length > 3) factors.push('multiple_terms');
423
- if (this.queryPatterns.technical.test(query)) factors.push('technical_terminology');
424
- if (query.includes('"')) factors.push('quoted_phrases');
425
- if (query.includes('AND') || query.includes('OR')) factors.push('boolean_operators');
426
- return factors;
427
- }
428
-
429
- generateQuerySuggestions(query) {
430
- const suggestions = [];
431
- const queryLower = query.toLowerCase();
432
-
433
- // Find related terms
434
- this.commonTerms.forEach(term => {
435
- if (queryLower.includes(term.toLowerCase().substring(0, 3)) && !queryLower.includes(term.toLowerCase())) {
436
- suggestions.push(`Try searching for: "${term}"`);
437
- }
438
- });
439
-
440
- // Pattern-based suggestions
441
- if (this.queryPatterns.security.test(query)) {
442
- suggestions.push('Consider also searching: "authentication", "authorization", "CSRF"');
443
- }
444
- if (this.queryPatterns.performance.test(query)) {
445
- suggestions.push('Consider also searching: "caching", "optimization", "monitoring"');
446
- }
447
-
448
- return suggestions;
449
- }
450
-
451
- predictResultTypes(query) {
452
- const predictions = [];
453
-
454
- if (this.queryPatterns.security.test(query)) {
455
- predictions.push({ type: 'security_guides', confidence: 0.9 });
456
- }
457
- if (this.queryPatterns.performance.test(query)) {
458
- predictions.push({ type: 'performance_guides', confidence: 0.8 });
459
- }
460
- if (this.queryPatterns.framework.test(query)) {
461
- predictions.push({ type: 'framework_documentation', confidence: 0.85 });
462
- }
463
- if (this.queryPatterns.development.test(query)) {
464
- predictions.push({ type: 'development_practices', confidence: 0.7 });
465
- }
466
-
467
- return predictions.sort((a, b) => b.confidence - a.confidence);
468
- }
469
- }
470
-
471
- /**
472
- * Error categorization utility for comprehensive error analysis
473
- */
474
- class ErrorAnalyzer {
475
- static categorizeError(errorText) {
476
- const patterns = [
477
- { type: 'validation', keywords: ['required', 'invalid', 'missing', 'empty string', 'non-empty'] },
478
- { type: 'not_found', keywords: ['not found', 'does not exist', 'null'] },
479
- { type: 'permission', keywords: ['permission', 'unauthorized', 'forbidden'] },
480
- { type: 'network', keywords: ['connection', 'timeout', 'unreachable'] },
481
- { type: 'format', keywords: ['format', 'parse', 'json', 'syntax'] }
482
- ];
483
-
484
- const errorLower = errorText.toLowerCase();
485
- for (const pattern of patterns) {
486
- if (pattern.keywords.some(keyword => errorLower.includes(keyword))) {
487
- return pattern.type;
488
- }
489
- }
490
- return 'unknown';
491
- }
492
-
493
- static assessErrorQuality(errorText) {
494
- const hasSpecificMessage = !errorText.includes('generic error');
495
- const hasSuggestion = errorText.includes('should') || errorText.includes('try') || errorText.includes('use');
496
- const isActionable = errorText.includes('required') || errorText.includes('must') || errorText.includes('invalid');
497
-
498
- return {
499
- category: this.categorizeError(errorText),
500
- isInformative: hasSpecificMessage && errorText.length > 20,
501
- isActionable,
502
- hasSuggestion,
503
- qualityScore: [hasSpecificMessage, isActionable, hasSuggestion].filter(Boolean).length / 3
504
- };
505
- }
506
- }
507
-
508
- // Assertion helpers for comprehensive validation
509
- function assertValidMCPResponse(result, expectError = false) {
510
- assert.ok(result.content, 'Should have content');
511
- assert.ok(Array.isArray(result.content), 'Content should be array');
512
- assert.equal(typeof result.isError, 'boolean', 'isError should be boolean');
513
- assert.equal(result.isError, expectError, `isError should be ${expectError}`);
514
- }
515
-
516
- function assertSearchResults(result) {
517
- assertValidMCPResponse(result, false);
518
- assert.equal(result.content[0].type, 'text');
519
-
520
- const responseText = result.content[0].text;
521
- assert.ok(responseText.startsWith('['), 'Response should be JSON array');
522
- assert.ok(responseText.endsWith(']'), 'Response should end with ]');
523
-
524
- const resultsArray = JSON.parse(responseText);
525
- assert.ok(Array.isArray(resultsArray), 'Parsed response should be array');
526
-
527
- // Validate result structure if not empty
528
- if (resultsArray.length > 0) {
529
- resultsArray.forEach(result => {
530
- assert.ok(result.guide, 'Each result should have guide');
531
- assert.ok(result.title, 'Each result should have title');
532
- assert.ok(Array.isArray(result.matches), 'Each result should have matches array');
533
-
534
- result.matches.forEach(match => {
535
- assert.ok(match.section, 'Each match should have section');
536
- assert.ok(match.content, 'Each match should have content');
537
- });
538
- });
539
- }
540
-
541
- return resultsArray;
542
- }
543
-
544
- function assertErrorResponse(result, expectedErrorType) {
545
- assertValidMCPResponse(result, true);
546
- assert.equal(result.content[0].type, 'text');
547
-
548
- const errorText = result.content[0].text;
549
- assert.ok(errorText.includes('Error:'), 'Should be error message');
550
-
551
- const errorAnalysis = ErrorAnalyzer.assessErrorQuality(errorText);
552
- assert.ok(errorAnalysis.isInformative, 'Error should be informative');
553
-
554
- if (expectedErrorType) {
555
- assert.equal(errorAnalysis.category, expectedErrorType,
556
- `Error should be categorized as ${expectedErrorType}`);
557
- }
558
-
559
- return errorAnalysis;
560
- }
561
-
562
- describe('search_best_practices Tool - Advanced Programmatic Tests', () => {
563
- let client;
564
- let searchAnalyzer;
565
- let queryAnalyzer;
566
-
567
- before(async () => {
568
- client = await connect('./aegis.config.docs-only.json');
569
- searchAnalyzer = new SearchResultsAnalyzer();
570
- queryAnalyzer = new QueryAnalyzer();
571
- });
572
-
573
- after(async () => {
574
- if (client?.connected) {
575
- await client.disconnect();
576
- }
577
- });
578
-
579
- beforeEach(() => {
580
- // CRITICAL: Clear all buffers to prevent leaking between tests
581
- client.clearAllBuffers(); // Recommended - comprehensive protection
582
- });
583
-
584
- describe('Basic Search Functionality', () => {
585
- test('should handle common search terms with comprehensive analysis', async () => {
586
- const searchTerms = ['validation', 'security', 'performance', 'controller', 'middleware', 'scss'];
587
-
588
- for (const term of searchTerms) {
589
- const result = await client.callTool('search_best_practices', { query: term });
590
-
591
- const resultsArray = assertSearchResults(result);
592
- const searchAnalysis = searchAnalyzer.analyzeResults(term, resultsArray);
593
-
594
- // Basic validation
595
- assert.ok(resultsArray.length > 0, `Should find results for ${term}`);
596
-
597
- // More lenient analysis - allow for varied content quality
598
- if (resultsArray.length > 0) {
599
- assert.ok(searchAnalysis.relevanceScoring.avgRelevanceScore >= 0,
600
- `Results for ${term} should have valid relevance score (score: ${searchAnalysis.relevanceScoring.avgRelevanceScore})`);
601
- // Some technical terms may not always be present in general searches
602
- }
603
- }
604
- });
605
-
606
- test('should surface SFRA SCSS guide for styling queries', async () => {
607
- const result = await client.callTool('search_best_practices', { query: 'scss' });
608
- const resultsArray = assertSearchResults(result);
609
-
610
- assert.ok(resultsArray.some(r => r.guide === 'sfra_scss'), 'Should include sfra_scss guide in results');
611
- const sfraScssGuide = resultsArray.find(r => r.guide === 'sfra_scss');
612
- assert.ok(sfraScssGuide?.matches?.length > 0, 'SFRA SCSS guide should provide match excerpts');
613
-
614
- const analysis = searchAnalyzer.analyzeResults('scss', resultsArray);
615
- assert.ok(analysis.searchMeta.guidesFound.includes('sfra_scss'), 'Search metadata should track sfra_scss guide');
616
- });
617
-
618
- test('should demonstrate search result quality with detailed metrics', async () => {
619
- const testQuery = 'validation';
620
- const result = await client.callTool('search_best_practices', { query: testQuery });
621
-
622
- const resultsArray = assertSearchResults(result);
623
- const analysis = searchAnalyzer.analyzeResults(testQuery, resultsArray);
624
-
625
- // Comprehensive quality assertions
626
- assert.ok(analysis.contentQuality.avgContentLength > 50, 'Content should be substantial');
627
- assert.ok(analysis.contentQuality.guidesWithCode > 0, 'Should include code examples');
628
- assert.ok(analysis.relevanceScoring.relevanceDistribution.high > 0, 'Should have highly relevant results');
629
- assert.ok(analysis.searchEffectiveness.precision > 0.4, 'Search precision should be reasonable');
630
-
631
- // Cross-guide analysis
632
- if (analysis.crossGuideAnalysis.interconnections.length > 0) {
633
- assert.ok(analysis.crossGuideAnalysis.mostConnectedTopic, 'Should identify connected topics');
634
- }
635
-
636
- // Comprehensiveness assessment
637
- if (analysis.comprehensiveness.patternRecognized) {
638
- assert.ok(analysis.comprehensiveness.guideCoverage >= 0, 'Guide coverage should be measurable');
639
- }
640
- });
641
- });
642
-
643
- describe('Advanced Search Pattern Recognition', () => {
644
- test('should recognize and analyze technical search patterns', async () => {
645
- const technicalQueries = [
646
- { query: 'dw.crypto', expectedPattern: 'technical' },
647
- { query: 'server.middleware', expectedPattern: 'framework' },
648
- { query: 'OCAPI hooks', expectedPattern: 'framework' },
649
- { query: 'authentication security', expectedPattern: 'security' }
650
- ];
651
-
652
- for (const { query, expectedPattern } of technicalQueries) {
653
- const queryAnalysis = queryAnalyzer.analyzeQuery(query);
654
- const result = await client.callTool('search_best_practices', { query });
655
-
656
- const resultsArray = assertSearchResults(result);
657
- const searchAnalysis = searchAnalyzer.analyzeResults(query, resultsArray);
658
-
659
- // Pattern recognition validation - more flexible matching
660
- const hasExpectedPattern = queryAnalysis.patterns[expectedPattern];
661
-
662
- // Allow for pattern flexibility - if expected pattern isn't found, check if any technical pattern is found
663
- const hasTechnicalPattern = Object.keys(queryAnalysis.patterns).some(p => queryAnalysis.patterns[p] &&
664
- ['technical', 'framework', 'security', 'performance'].includes(p));
665
-
666
- assert.ok(hasExpectedPattern || hasTechnicalPattern,
667
- `Query "${query}" should match ${expectedPattern} pattern or another technical pattern`);
668
-
669
- // Result quality for technical queries - more lenient validation
670
- if (resultsArray.length > 0) {
671
- // Technical queries may or may not return technical content depending on the search algorithm
672
- assert.ok(searchAnalysis.relevanceScoring.avgRelevanceScore >= 0,
673
- `Technical query "${query}" should have valid relevance score`);
674
- }
675
-
676
- }
677
- });
678
-
679
- test('should provide intelligent query suggestions and predictions', async () => {
680
- const ambiguousQueries = ['auth', 'perf', 'valid'];
681
-
682
- for (const query of ambiguousQueries) {
683
- const queryAnalysis = queryAnalyzer.analyzeQuery(query);
684
-
685
- assert.ok(queryAnalysis.suggestions.length >= 0, 'Should provide suggestions for ambiguous queries');
686
- assert.ok(queryAnalysis.expectedResultTypes.length >= 0, 'Should predict result types');
687
-
688
- if (queryAnalysis.suggestions.length > 0) {
689
- assert.ok(queryAnalysis.suggestions.every(s => typeof s === 'string'), 'Suggestions should be strings');
690
- }
691
-
692
- if (queryAnalysis.expectedResultTypes.length > 0) {
693
- const topPrediction = queryAnalysis.expectedResultTypes[0];
694
- assert.ok(topPrediction.type, 'Top prediction should have type');
695
- assert.ok(topPrediction.confidence >= 0, 'Top prediction should have valid confidence');
696
- }
697
- }
698
- });
699
- });
700
-
701
-
702
- describe('Cross-Guide Relationship Analysis', () => {
703
- test('should identify relationships between different guides', async () => {
704
- const result = await client.callTool('search_best_practices', { query: 'validation' });
705
-
706
- const resultsArray = assertSearchResults(result);
707
- const analysis = searchAnalyzer.analyzeResults('validation', resultsArray);
708
-
709
- if (analysis.crossGuideAnalysis.interconnections.length > 0) {
710
- const interconnections = analysis.crossGuideAnalysis.interconnections;
711
-
712
- // Should identify shared concepts
713
- assert.ok(interconnections.length > 0, 'Should find interconnected topics');
714
-
715
- // Analyze connection strength
716
- const strongConnections = interconnections.filter(conn => conn.connectionStrength >= 3);
717
- if (strongConnections.length > 0) {
718
- assert.ok(strongConnections.every(conn => conn.topic && conn.guides.length > 0),
719
- 'Strong connections should have valid structure');
720
- }
721
-
722
- // Guide connectivity analysis
723
- const connectivity = analysis.crossGuideAnalysis.guideConnectivity;
724
- if (connectivity.length > 0) {
725
- const mostConnected = connectivity[0];
726
- assert.ok(mostConnected.guide && mostConnected.connectivity >= 0,
727
- 'Most connected guide should have valid structure');
728
- }
729
- }
730
- });
731
-
732
- test('should analyze search comprehensiveness for known patterns', async () => {
733
- const knownPatterns = ['validation', 'security', 'performance'];
734
-
735
- for (const pattern of knownPatterns) {
736
- const result = await client.callTool('search_best_practices', { query: pattern });
737
-
738
- const resultsArray = assertSearchResults(result);
739
- const analysis = searchAnalyzer.analyzeResults(pattern, resultsArray);
740
-
741
- if (analysis.comprehensiveness.patternRecognized) {
742
- const comp = analysis.comprehensiveness;
743
-
744
- assert.ok(Array.isArray(comp.expectedGuides), 'Should have expected guides');
745
- assert.ok(Array.isArray(comp.foundGuides), 'Should have found guides');
746
-
747
- // Analyze coverage
748
- if (comp.missingGuides.length > 0) {
749
- assert.ok(comp.missingGuides.every(g => typeof g === 'string'), 'Missing guides should be strings');
750
- }
751
-
752
- if (comp.unexpectedGuides.length > 0) {
753
- assert.ok(comp.unexpectedGuides.every(g => typeof g === 'string'), 'Unexpected guides should be strings');
754
- }
755
-
756
- assert.ok(comp.guideCoverage >= 0, 'Guide coverage should be calculable');
757
- }
758
- }
759
- });
760
- });
761
-
762
- describe('Error Handling and Edge Cases', () => {
763
- test('should handle various error conditions gracefully', async () => {
764
- const errorTestCases = [
765
- { query: '', expectedError: 'validation', description: 'empty query' },
766
- { query: ' ', expectedError: 'validation', description: 'whitespace only' },
767
- { query: 'zzznomatchesexpected', expectedError: null, description: 'no matches' }
768
- ];
769
-
770
- for (const { query, expectedError, description } of errorTestCases) {
771
- const result = await client.callTool('search_best_practices', { query });
772
-
773
- if (expectedError) {
774
- const errorAnalysis = assertErrorResponse(result, expectedError);
775
- assert.ok(errorAnalysis.isInformative, `Error for ${description} should be informative`);
776
- assert.ok(errorAnalysis.qualityScore > 0.5, `Error quality for ${description} should be good`);
777
- } else {
778
- // No matches case
779
- assertValidMCPResponse(result, false);
780
- const responseText = result.content[0].text;
781
- const resultsArray = JSON.parse(responseText);
782
- assert.equal(resultsArray.length, 0, `${description} should return empty array`);
783
- }
784
- }
785
- });
786
-
787
- test('should handle missing parameters with detailed error analysis', async () => {
788
- try {
789
- const result = await client.callTool('search_best_practices', {});
790
- const errorAnalysis = assertErrorResponse(result, 'validation');
791
-
792
- assert.ok(errorAnalysis.isActionable, 'Missing parameter error should be actionable');
793
- assert.ok(errorAnalysis.category === 'validation', 'Should be categorized as validation error');
794
- } catch (error) {
795
- // Some implementations might throw instead of returning error result
796
- assert.ok(error.message.includes('required') || error.message.includes('query'),
797
- 'Error should mention required query parameter');
798
- }
799
- });
800
- });
801
-
802
- describe('Search Effectiveness and Quality Metrics', () => {
803
- test('should demonstrate high-quality search capabilities', async () => {
804
- const qualityTestQueries = [
805
- 'validation patterns',
806
- 'security best practices',
807
- 'performance optimization',
808
- 'SFRA controller architecture',
809
- 'SFRA SCSS best practices'
810
- ];
811
-
812
- for (const query of qualityTestQueries) {
813
- const result = await client.callTool('search_best_practices', { query });
814
-
815
- const resultsArray = assertSearchResults(result);
816
- const analysis = searchAnalyzer.analyzeResults(query, resultsArray);
817
-
818
- if (resultsArray.length > 0) {
819
- // Quality assertions
820
- assert.ok(analysis.searchEffectiveness.precision > 0.3,
821
- `Search precision for "${query}" should be reasonable`);
822
- assert.ok(analysis.contentQuality.technicalAccuracy > 0.3,
823
- `Technical accuracy for "${query}" should be good`);
824
-
825
- // Effectiveness categorization
826
- const effectiveness = analysis.searchEffectiveness.searchQuality;
827
- assert.ok(['poor', 'fair', 'good', 'excellent'].includes(effectiveness),
828
- 'Search quality should be categorized');
829
-
830
- assert.ok(analysis.searchEffectiveness.precision >= 0 && analysis.searchEffectiveness.precision <= 1,
831
- 'Search precision should be between 0 and 1');
832
- }
833
- }
834
- });
835
- });
836
- });