This is page 40 of 43. Use http://codebase.md/taurgis/sfcc-dev-mcp?page={x} to view the full context. # Directory Structure ``` ├── .DS_Store ├── .github │ ├── dependabot.yml │ ├── instructions │ │ ├── mcp-node-tests.instructions.md │ │ └── mcp-yml-tests.instructions.md │ ├── ISSUE_TEMPLATE │ │ ├── bug_report.yml │ │ ├── config.yml │ │ ├── documentation.yml │ │ ├── feature_request.yml │ │ └── question.yml │ ├── PULL_REQUEST_TEMPLATE │ │ ├── bug_fix.md │ │ ├── documentation.md │ │ └── new_tool.md │ ├── pull_request_template.md │ └── workflows │ ├── ci.yml │ ├── deploy-pages.yml │ ├── publish.yml │ └── update-docs.yml ├── .gitignore ├── .husky │ └── pre-commit ├── aegis.config.docs-only.json ├── aegis.config.json ├── aegis.config.with-dw.json ├── AGENTS.md ├── ai-instructions │ ├── claude-desktop │ │ └── claude_custom_instructions.md │ ├── cursor │ │ └── .cursor │ │ └── rules │ │ ├── debugging-workflows.mdc │ │ ├── hooks-development.mdc │ │ ├── isml-templates.mdc │ │ ├── job-framework.mdc │ │ ├── performance-optimization.mdc │ │ ├── scapi-endpoints.mdc │ │ ├── security-patterns.mdc │ │ ├── sfcc-development.mdc │ │ ├── sfra-controllers.mdc │ │ ├── sfra-models.mdc │ │ ├── system-objects.mdc │ │ └── testing-patterns.mdc │ └── github-copilot │ └── copilot-instructions.md ├── CHANGELOG.md ├── CONTRIBUTING.md ├── docs │ ├── best-practices │ │ ├── cartridge_creation.md │ │ ├── isml_templates.md │ │ ├── job_framework.md │ │ ├── localserviceregistry.md │ │ ├── ocapi_hooks.md │ │ ├── performance.md │ │ ├── scapi_custom_endpoint.md │ │ ├── scapi_hooks.md │ │ ├── security.md │ │ ├── sfra_client_side_js.md │ │ ├── sfra_controllers.md │ │ ├── sfra_models.md │ │ └── sfra_scss.md │ ├── dw_campaign │ │ ├── ABTest.md │ │ ├── ABTestMgr.md │ │ ├── ABTestSegment.md │ │ ├── AmountDiscount.md │ │ ├── ApproachingDiscount.md │ │ ├── BonusChoiceDiscount.md │ │ ├── BonusDiscount.md │ │ ├── Campaign.md │ │ ├── CampaignMgr.md │ │ ├── CampaignStatusCodes.md │ │ ├── Coupon.md │ │ ├── CouponMgr.md │ │ ├── CouponRedemption.md │ │ ├── CouponStatusCodes.md │ │ ├── Discount.md │ │ ├── DiscountPlan.md │ │ ├── FixedPriceDiscount.md │ │ ├── FixedPriceShippingDiscount.md │ │ ├── FreeDiscount.md │ │ ├── FreeShippingDiscount.md │ │ ├── PercentageDiscount.md │ │ ├── PercentageOptionDiscount.md │ │ ├── PriceBookPriceDiscount.md │ │ ├── Promotion.md │ │ ├── PromotionMgr.md │ │ ├── PromotionPlan.md │ │ ├── SlotContent.md │ │ ├── SourceCodeGroup.md │ │ ├── SourceCodeInfo.md │ │ ├── SourceCodeStatusCodes.md │ │ └── TotalFixedPriceDiscount.md │ ├── dw_catalog │ │ ├── Catalog.md │ │ ├── CatalogMgr.md │ │ ├── Category.md │ │ ├── CategoryAssignment.md │ │ ├── CategoryLink.md │ │ ├── PriceBook.md │ │ ├── PriceBookMgr.md │ │ ├── Product.md │ │ ├── ProductActiveData.md │ │ ├── ProductAttributeModel.md │ │ ├── ProductAvailabilityLevels.md │ │ ├── ProductAvailabilityModel.md │ │ ├── ProductInventoryList.md │ │ ├── ProductInventoryMgr.md │ │ ├── ProductInventoryRecord.md │ │ ├── ProductLink.md │ │ ├── ProductMgr.md │ │ ├── ProductOption.md │ │ ├── ProductOptionModel.md │ │ ├── ProductOptionValue.md │ │ ├── ProductPriceInfo.md │ │ ├── ProductPriceModel.md │ │ ├── ProductPriceTable.md │ │ ├── ProductSearchHit.md │ │ ├── ProductSearchModel.md │ │ ├── ProductSearchRefinementDefinition.md │ │ ├── ProductSearchRefinements.md │ │ ├── ProductSearchRefinementValue.md │ │ ├── ProductVariationAttribute.md │ │ ├── ProductVariationAttributeValue.md │ │ ├── ProductVariationModel.md │ │ ├── Recommendation.md │ │ ├── SearchModel.md │ │ ├── SearchRefinementDefinition.md │ │ ├── SearchRefinements.md │ │ ├── SearchRefinementValue.md │ │ ├── SortingOption.md │ │ ├── SortingRule.md │ │ ├── Store.md │ │ ├── StoreGroup.md │ │ ├── StoreInventoryFilter.md │ │ ├── StoreInventoryFilterValue.md │ │ ├── StoreMgr.md │ │ ├── Variant.md │ │ └── VariationGroup.md │ ├── dw_content │ │ ├── Content.md │ │ ├── ContentMgr.md │ │ ├── ContentSearchModel.md │ │ ├── ContentSearchRefinementDefinition.md │ │ ├── ContentSearchRefinements.md │ │ ├── ContentSearchRefinementValue.md │ │ ├── Folder.md │ │ ├── Library.md │ │ ├── MarkupText.md │ │ └── MediaFile.md │ ├── dw_crypto │ │ ├── CertificateRef.md │ │ ├── CertificateUtils.md │ │ ├── Cipher.md │ │ ├── Encoding.md │ │ ├── JWE.md │ │ ├── JWEHeader.md │ │ ├── JWS.md │ │ ├── JWSHeader.md │ │ ├── KeyRef.md │ │ ├── Mac.md │ │ ├── MessageDigest.md │ │ ├── SecureRandom.md │ │ ├── Signature.md │ │ ├── WeakCipher.md │ │ ├── WeakMac.md │ │ ├── WeakMessageDigest.md │ │ ├── WeakSignature.md │ │ └── X509Certificate.md │ ├── dw_customer │ │ ├── AddressBook.md │ │ ├── AgentUserMgr.md │ │ ├── AgentUserStatusCodes.md │ │ ├── AuthenticationStatus.md │ │ ├── Credentials.md │ │ ├── Customer.md │ │ ├── CustomerActiveData.md │ │ ├── CustomerAddress.md │ │ ├── CustomerCDPData.md │ │ ├── CustomerContextMgr.md │ │ ├── CustomerGroup.md │ │ ├── CustomerList.md │ │ ├── CustomerMgr.md │ │ ├── CustomerPasswordConstraints.md │ │ ├── CustomerPaymentInstrument.md │ │ ├── CustomerStatusCodes.md │ │ ├── EncryptedObject.md │ │ ├── ExternalProfile.md │ │ ├── OrderHistory.md │ │ ├── ProductList.md │ │ ├── ProductListItem.md │ │ ├── ProductListItemPurchase.md │ │ ├── ProductListMgr.md │ │ ├── ProductListRegistrant.md │ │ ├── Profile.md │ │ └── Wallet.md │ ├── dw_extensions.applepay │ │ ├── ApplePayHookResult.md │ │ └── ApplePayHooks.md │ ├── dw_extensions.facebook │ │ ├── FacebookFeedHooks.md │ │ └── FacebookProduct.md │ ├── dw_extensions.paymentrequest │ │ ├── PaymentRequestHookResult.md │ │ └── PaymentRequestHooks.md │ ├── dw_extensions.payments │ │ ├── SalesforceBancontactPaymentDetails.md │ │ ├── SalesforceCardPaymentDetails.md │ │ ├── SalesforceEpsPaymentDetails.md │ │ ├── SalesforceIdealPaymentDetails.md │ │ ├── SalesforceKlarnaPaymentDetails.md │ │ ├── SalesforcePaymentDetails.md │ │ ├── SalesforcePaymentIntent.md │ │ ├── SalesforcePaymentMethod.md │ │ ├── SalesforcePaymentRequest.md │ │ ├── SalesforcePaymentsHooks.md │ │ ├── SalesforcePaymentsMgr.md │ │ ├── SalesforcePaymentsSiteConfiguration.md │ │ ├── SalesforcePayPalOrder.md │ │ ├── SalesforcePayPalOrderAddress.md │ │ ├── SalesforcePayPalOrderPayer.md │ │ ├── SalesforcePayPalPaymentDetails.md │ │ ├── SalesforceSepaDebitPaymentDetails.md │ │ └── SalesforceVenmoPaymentDetails.md │ ├── dw_extensions.pinterest │ │ ├── PinterestAvailability.md │ │ ├── PinterestFeedHooks.md │ │ ├── PinterestOrder.md │ │ ├── PinterestOrderHooks.md │ │ └── PinterestProduct.md │ ├── dw_io │ │ ├── CSVStreamReader.md │ │ ├── CSVStreamWriter.md │ │ ├── File.md │ │ ├── FileReader.md │ │ ├── FileWriter.md │ │ ├── InputStream.md │ │ ├── OutputStream.md │ │ ├── PrintWriter.md │ │ ├── RandomAccessFileReader.md │ │ ├── Reader.md │ │ ├── StringWriter.md │ │ ├── Writer.md │ │ ├── XMLIndentingStreamWriter.md │ │ ├── XMLStreamConstants.md │ │ ├── XMLStreamReader.md │ │ └── XMLStreamWriter.md │ ├── dw_job │ │ ├── JobExecution.md │ │ └── JobStepExecution.md │ ├── dw_net │ │ ├── FTPClient.md │ │ ├── FTPFileInfo.md │ │ ├── HTTPClient.md │ │ ├── HTTPRequestPart.md │ │ ├── Mail.md │ │ ├── SFTPClient.md │ │ ├── SFTPFileInfo.md │ │ ├── WebDAVClient.md │ │ └── WebDAVFileInfo.md │ ├── dw_object │ │ ├── ActiveData.md │ │ ├── CustomAttributes.md │ │ ├── CustomObject.md │ │ ├── CustomObjectMgr.md │ │ ├── Extensible.md │ │ ├── ExtensibleObject.md │ │ ├── Note.md │ │ ├── ObjectAttributeDefinition.md │ │ ├── ObjectAttributeGroup.md │ │ ├── ObjectAttributeValueDefinition.md │ │ ├── ObjectTypeDefinition.md │ │ ├── PersistentObject.md │ │ ├── SimpleExtensible.md │ │ └── SystemObjectMgr.md │ ├── dw_order │ │ ├── AbstractItem.md │ │ ├── AbstractItemCtnr.md │ │ ├── Appeasement.md │ │ ├── AppeasementItem.md │ │ ├── Basket.md │ │ ├── BasketMgr.md │ │ ├── BonusDiscountLineItem.md │ │ ├── CouponLineItem.md │ │ ├── CreateAgentBasketLimitExceededException.md │ │ ├── CreateBasketFromOrderException.md │ │ ├── CreateCouponLineItemException.md │ │ ├── CreateOrderException.md │ │ ├── CreateTemporaryBasketLimitExceededException.md │ │ ├── GiftCertificate.md │ │ ├── GiftCertificateLineItem.md │ │ ├── GiftCertificateMgr.md │ │ ├── GiftCertificateStatusCodes.md │ │ ├── Invoice.md │ │ ├── InvoiceItem.md │ │ ├── LineItem.md │ │ ├── LineItemCtnr.md │ │ ├── Order.md │ │ ├── OrderAddress.md │ │ ├── OrderItem.md │ │ ├── OrderMgr.md │ │ ├── OrderPaymentInstrument.md │ │ ├── OrderProcessStatusCodes.md │ │ ├── PaymentCard.md │ │ ├── PaymentInstrument.md │ │ ├── PaymentMethod.md │ │ ├── PaymentMgr.md │ │ ├── PaymentProcessor.md │ │ ├── PaymentStatusCodes.md │ │ ├── PaymentTransaction.md │ │ ├── PriceAdjustment.md │ │ ├── PriceAdjustmentLimitTypes.md │ │ ├── ProductLineItem.md │ │ ├── ProductShippingCost.md │ │ ├── ProductShippingLineItem.md │ │ ├── ProductShippingModel.md │ │ ├── Return.md │ │ ├── ReturnCase.md │ │ ├── ReturnCaseItem.md │ │ ├── ReturnItem.md │ │ ├── Shipment.md │ │ ├── ShipmentShippingCost.md │ │ ├── ShipmentShippingModel.md │ │ ├── ShippingLineItem.md │ │ ├── ShippingLocation.md │ │ ├── ShippingMethod.md │ │ ├── ShippingMgr.md │ │ ├── ShippingOrder.md │ │ ├── ShippingOrderItem.md │ │ ├── SumItem.md │ │ ├── TaxGroup.md │ │ ├── TaxItem.md │ │ ├── TaxMgr.md │ │ ├── TrackingInfo.md │ │ └── TrackingRef.md │ ├── dw_order.hooks │ │ ├── CalculateHooks.md │ │ ├── OrderHooks.md │ │ ├── PaymentHooks.md │ │ ├── ReturnHooks.md │ │ └── ShippingOrderHooks.md │ ├── dw_rpc │ │ ├── SOAPUtil.md │ │ ├── Stub.md │ │ └── WebReference.md │ ├── dw_suggest │ │ ├── BrandSuggestions.md │ │ ├── CategorySuggestions.md │ │ ├── ContentSuggestions.md │ │ ├── CustomSuggestions.md │ │ ├── ProductSuggestions.md │ │ ├── SearchPhraseSuggestions.md │ │ ├── SuggestedCategory.md │ │ ├── SuggestedContent.md │ │ ├── SuggestedPhrase.md │ │ ├── SuggestedProduct.md │ │ ├── SuggestedTerm.md │ │ ├── SuggestedTerms.md │ │ ├── Suggestions.md │ │ └── SuggestModel.md │ ├── dw_svc │ │ ├── FTPService.md │ │ ├── FTPServiceDefinition.md │ │ ├── HTTPFormService.md │ │ ├── HTTPFormServiceDefinition.md │ │ ├── HTTPService.md │ │ ├── HTTPServiceDefinition.md │ │ ├── LocalServiceRegistry.md │ │ ├── Result.md │ │ ├── Service.md │ │ ├── ServiceCallback.md │ │ ├── ServiceConfig.md │ │ ├── ServiceCredential.md │ │ ├── ServiceDefinition.md │ │ ├── ServiceProfile.md │ │ ├── ServiceRegistry.md │ │ ├── SOAPService.md │ │ └── SOAPServiceDefinition.md │ ├── dw_system │ │ ├── AgentUserStatusCodes.md │ │ ├── Cache.md │ │ ├── CacheMgr.md │ │ ├── HookMgr.md │ │ ├── InternalObject.md │ │ ├── JobProcessMonitor.md │ │ ├── Log.md │ │ ├── Logger.md │ │ ├── LogNDC.md │ │ ├── OrganizationPreferences.md │ │ ├── Pipeline.md │ │ ├── PipelineDictionary.md │ │ ├── RemoteInclude.md │ │ ├── Request.md │ │ ├── RequestHooks.md │ │ ├── Response.md │ │ ├── RESTErrorResponse.md │ │ ├── RESTResponseMgr.md │ │ ├── RESTSuccessResponse.md │ │ ├── SearchStatus.md │ │ ├── Session.md │ │ ├── Site.md │ │ ├── SitePreferences.md │ │ ├── Status.md │ │ ├── StatusItem.md │ │ ├── System.md │ │ └── Transaction.md │ ├── dw_util │ │ ├── ArrayList.md │ │ ├── Assert.md │ │ ├── BigInteger.md │ │ ├── Bytes.md │ │ ├── Calendar.md │ │ ├── Collection.md │ │ ├── Currency.md │ │ ├── DateUtils.md │ │ ├── Decimal.md │ │ ├── FilteringCollection.md │ │ ├── Geolocation.md │ │ ├── HashMap.md │ │ ├── HashSet.md │ │ ├── Iterator.md │ │ ├── LinkedHashMap.md │ │ ├── LinkedHashSet.md │ │ ├── List.md │ │ ├── Locale.md │ │ ├── Map.md │ │ ├── MapEntry.md │ │ ├── MappingKey.md │ │ ├── MappingMgr.md │ │ ├── PropertyComparator.md │ │ ├── SecureEncoder.md │ │ ├── SecureFilter.md │ │ ├── SeekableIterator.md │ │ ├── Set.md │ │ ├── SortedMap.md │ │ ├── SortedSet.md │ │ ├── StringUtils.md │ │ ├── Template.md │ │ └── UUIDUtils.md │ ├── dw_value │ │ ├── EnumValue.md │ │ ├── MimeEncodedText.md │ │ ├── Money.md │ │ └── Quantity.md │ ├── dw_web │ │ ├── ClickStream.md │ │ ├── ClickStreamEntry.md │ │ ├── Cookie.md │ │ ├── Cookies.md │ │ ├── CSRFProtection.md │ │ ├── Form.md │ │ ├── FormAction.md │ │ ├── FormElement.md │ │ ├── FormElementValidationResult.md │ │ ├── FormField.md │ │ ├── FormFieldOption.md │ │ ├── FormFieldOptions.md │ │ ├── FormGroup.md │ │ ├── FormList.md │ │ ├── FormListItem.md │ │ ├── Forms.md │ │ ├── HttpParameter.md │ │ ├── HttpParameterMap.md │ │ ├── LoopIterator.md │ │ ├── PageMetaData.md │ │ ├── PageMetaTag.md │ │ ├── PagingModel.md │ │ ├── Resource.md │ │ ├── URL.md │ │ ├── URLAction.md │ │ ├── URLParameter.md │ │ ├── URLRedirect.md │ │ ├── URLRedirectMgr.md │ │ └── URLUtils.md │ ├── sfra │ │ ├── account.md │ │ ├── address.md │ │ ├── billing.md │ │ ├── cart.md │ │ ├── categories.md │ │ ├── content.md │ │ ├── locale.md │ │ ├── order.md │ │ ├── payment.md │ │ ├── price-default.md │ │ ├── price-range.md │ │ ├── price-tiered.md │ │ ├── product-bundle.md │ │ ├── product-full.md │ │ ├── product-line-items.md │ │ ├── product-search.md │ │ ├── product-tile.md │ │ ├── querystring.md │ │ ├── render.md │ │ ├── request.md │ │ ├── response.md │ │ ├── server.md │ │ ├── shipping.md │ │ ├── store.md │ │ ├── stores.md │ │ └── totals.md │ └── TopLevel │ ├── APIException.md │ ├── arguments.md │ ├── Array.md │ ├── ArrayBuffer.md │ ├── BigInt.md │ ├── Boolean.md │ ├── ConversionError.md │ ├── DataView.md │ ├── Date.md │ ├── Error.md │ ├── ES6Iterator.md │ ├── EvalError.md │ ├── Fault.md │ ├── Float32Array.md │ ├── Float64Array.md │ ├── Function.md │ ├── Generator.md │ ├── global.md │ ├── Int16Array.md │ ├── Int32Array.md │ ├── Int8Array.md │ ├── InternalError.md │ ├── IOError.md │ ├── Iterable.md │ ├── Iterator.md │ ├── JSON.md │ ├── Map.md │ ├── Math.md │ ├── Module.md │ ├── Namespace.md │ ├── Number.md │ ├── Object.md │ ├── QName.md │ ├── RangeError.md │ ├── ReferenceError.md │ ├── RegExp.md │ ├── Set.md │ ├── StopIteration.md │ ├── String.md │ ├── Symbol.md │ ├── SyntaxError.md │ ├── SystemError.md │ ├── TypeError.md │ ├── Uint16Array.md │ ├── Uint32Array.md │ ├── Uint8Array.md │ ├── Uint8ClampedArray.md │ ├── URIError.md │ ├── WeakMap.md │ ├── WeakSet.md │ ├── XML.md │ ├── XMLList.md │ └── XMLStreamError.md ├── docs-site │ ├── .gitignore │ ├── App.tsx │ ├── components │ │ ├── Badge.tsx │ │ ├── BreadcrumbSchema.tsx │ │ ├── CodeBlock.tsx │ │ ├── Collapsible.tsx │ │ ├── ConfigBuilder.tsx │ │ ├── ConfigHero.tsx │ │ ├── ConfigModeTabs.tsx │ │ ├── icons.tsx │ │ ├── Layout.tsx │ │ ├── LightCodeContainer.tsx │ │ ├── NewcomerCTA.tsx │ │ ├── NextStepsStrip.tsx │ │ ├── OnThisPage.tsx │ │ ├── Search.tsx │ │ ├── SEO.tsx │ │ ├── Sidebar.tsx │ │ ├── StructuredData.tsx │ │ ├── ToolCard.tsx │ │ ├── ToolFilters.tsx │ │ ├── Typography.tsx │ │ └── VersionBadge.tsx │ ├── constants.tsx │ ├── index.html │ ├── main.tsx │ ├── metadata.json │ ├── package-lock.json │ ├── package.json │ ├── pages │ │ ├── AIInterfacesPage.tsx │ │ ├── ConfigurationPage.tsx │ │ ├── DevelopmentPage.tsx │ │ ├── ExamplesPage.tsx │ │ ├── FeaturesPage.tsx │ │ ├── HomePage.tsx │ │ ├── SecurityPage.tsx │ │ ├── ToolsPage.tsx │ │ └── TroubleshootingPage.tsx │ ├── postcss.config.js │ ├── public │ │ ├── .well-known │ │ │ └── security.txt │ │ ├── 404.html │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── apple-touch-icon.png │ │ ├── explain-product-pricing-methods-no-mcp.png │ │ ├── explain-product-pricing-methods.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon.ico │ │ ├── llms.txt │ │ ├── robots.txt │ │ ├── site.webmanifest │ │ └── sitemap.xml │ ├── README.md │ ├── scripts │ │ ├── generate-search-index.js │ │ ├── generate-sitemap.js │ │ └── search-dev.js │ ├── src │ │ └── styles │ │ ├── input.css │ │ └── prism-theme.css │ ├── tailwind.config.js │ ├── tsconfig.json │ ├── types.ts │ ├── utils │ │ ├── search.ts │ │ └── toolsData.ts │ └── vite.config.ts ├── eslint.config.js ├── jest.config.js ├── LICENSE ├── package-lock.json ├── package.json ├── README.md ├── scripts │ └── convert-docs.js ├── SECURITY.md ├── server.json ├── src │ ├── clients │ │ ├── base │ │ │ ├── http-client.ts │ │ │ ├── oauth-token.ts │ │ │ └── ocapi-auth-client.ts │ │ ├── best-practices-client.ts │ │ ├── cartridge-generation-client.ts │ │ ├── docs │ │ │ ├── class-content-parser.ts │ │ │ ├── class-name-resolver.ts │ │ │ ├── documentation-scanner.ts │ │ │ ├── index.ts │ │ │ └── referenced-types-extractor.ts │ │ ├── docs-client.ts │ │ ├── log-client.ts │ │ ├── logs │ │ │ ├── index.ts │ │ │ ├── log-analyzer.ts │ │ │ ├── log-client.ts │ │ │ ├── log-constants.ts │ │ │ ├── log-file-discovery.ts │ │ │ ├── log-file-reader.ts │ │ │ ├── log-formatter.ts │ │ │ ├── log-processor.ts │ │ │ ├── log-types.ts │ │ │ └── webdav-client-manager.ts │ │ ├── ocapi │ │ │ ├── code-versions-client.ts │ │ │ ├── site-preferences-client.ts │ │ │ └── system-objects-client.ts │ │ ├── ocapi-client.ts │ │ └── sfra-client.ts │ ├── config │ │ ├── configuration-factory.ts │ │ └── dw-json-loader.ts │ ├── core │ │ ├── handlers │ │ │ ├── abstract-log-tool-handler.ts │ │ │ ├── base-handler.ts │ │ │ ├── best-practices-handler.ts │ │ │ ├── cartridge-handler.ts │ │ │ ├── client-factory.ts │ │ │ ├── code-version-handler.ts │ │ │ ├── docs-handler.ts │ │ │ ├── job-log-handler.ts │ │ │ ├── job-log-tool-config.ts │ │ │ ├── log-handler.ts │ │ │ ├── log-tool-config.ts │ │ │ ├── sfra-handler.ts │ │ │ ├── system-object-handler.ts │ │ │ └── validation-helpers.ts │ │ ├── server.ts │ │ └── tool-definitions.ts │ ├── index.ts │ ├── main.ts │ ├── services │ │ ├── file-system-service.ts │ │ ├── index.ts │ │ └── path-service.ts │ ├── tool-configs │ │ ├── best-practices-tool-config.ts │ │ ├── cartridge-tool-config.ts │ │ ├── code-version-tool-config.ts │ │ ├── docs-tool-config.ts │ │ ├── job-log-tool-config.ts │ │ ├── log-tool-config.ts │ │ ├── sfra-tool-config.ts │ │ └── system-object-tool-config.ts │ ├── types │ │ └── types.ts │ └── utils │ ├── cache.ts │ ├── job-log-tool-config.ts │ ├── job-log-utils.ts │ ├── log-cache.ts │ ├── log-tool-config.ts │ ├── log-tool-constants.ts │ ├── log-tool-utils.ts │ ├── logger.ts │ ├── ocapi-url-builder.ts │ ├── path-resolver.ts │ ├── query-builder.ts │ ├── utils.ts │ └── validator.ts ├── tests │ ├── __mocks__ │ │ ├── docs-client.ts │ │ ├── src │ │ │ └── clients │ │ │ └── base │ │ │ └── http-client.js │ │ └── webdav.js │ ├── base-handler.test.ts │ ├── base-http-client.test.ts │ ├── best-practices-handler.test.ts │ ├── cache.test.ts │ ├── cartridge-handler.test.ts │ ├── class-content-parser.test.ts │ ├── class-name-resolver.test.ts │ ├── client-factory.test.ts │ ├── code-version-handler.test.ts │ ├── code-versions-client.test.ts │ ├── config.test.ts │ ├── configuration-factory.test.ts │ ├── docs-handler.test.ts │ ├── documentation-scanner.test.ts │ ├── file-system-service.test.ts │ ├── job-log-handler.test.ts │ ├── job-log-utils.test.ts │ ├── log-client.test.ts │ ├── log-handler.test.ts │ ├── log-processor.test.ts │ ├── logger.test.ts │ ├── mcp │ │ ├── AGENTS.md │ │ ├── node │ │ │ ├── activate-code-version-advanced.full-mode.programmatic.test.js │ │ │ ├── code-versions.full-mode.programmatic.test.js │ │ │ ├── generate-cartridge-structure.docs-only.programmatic.test.js │ │ │ ├── get-available-best-practice-guides.docs-only.programmatic.test.js │ │ │ ├── get-available-sfra-documents.programmatic.test.js │ │ │ ├── get-best-practice-guide.docs-only.programmatic.test.js │ │ │ ├── get-hook-reference.docs-only.programmatic.test.js │ │ │ ├── get-job-execution-summary.full-mode.programmatic.test.js │ │ │ ├── get-job-log-entries.full-mode.programmatic.test.js │ │ │ ├── get-latest-debug.full-mode.programmatic.test.js │ │ │ ├── get-latest-error.full-mode.programmatic.test.js │ │ │ ├── get-latest-info.full-mode.programmatic.test.js │ │ │ ├── get-latest-job-log-files.full-mode.programmatic.test.js │ │ │ ├── get-latest-warn.full-mode.programmatic.test.js │ │ │ ├── get-log-file-contents.full-mode.programmatic.test.js │ │ │ ├── get-sfcc-class-documentation.docs-only.programmatic.test.js │ │ │ ├── get-sfcc-class-info.docs-only.programmatic.test.js │ │ │ ├── get-sfra-categories.docs-only.programmatic.test.js │ │ │ ├── get-sfra-document.programmatic.test.js │ │ │ ├── get-sfra-documents-by-category.docs-only.programmatic.test.js │ │ │ ├── get-system-object-definition.full-mode.programmatic.test.js │ │ │ ├── get-system-object-definitions.docs-only.programmatic.test.js │ │ │ ├── get-system-object-definitions.full-mode.programmatic.test.js │ │ │ ├── list-log-files.full-mode.programmatic.test.js │ │ │ ├── list-sfcc-classes.docs-only.programmatic.test.js │ │ │ ├── search-best-practices.docs-only.programmatic.test.js │ │ │ ├── search-custom-object-attribute-definitions.full-mode.programmatic.test.js │ │ │ ├── search-job-logs-by-name.full-mode.programmatic.test.js │ │ │ ├── search-job-logs.full-mode.programmatic.test.js │ │ │ ├── search-logs.full-mode.programmatic.test.js │ │ │ ├── search-sfcc-classes.docs-only.programmatic.test.js │ │ │ ├── search-sfcc-methods.docs-only.programmatic.test.js │ │ │ ├── search-sfra-documentation.docs-only.programmatic.test.js │ │ │ ├── search-site-preferences.full-mode.programmatic.test.js │ │ │ ├── search-system-object-attribute-definitions.full-mode.programmatic.test.js │ │ │ ├── search-system-object-attribute-groups.full-mode.programmatic.test.js │ │ │ ├── summarize-logs.full-mode.programmatic.test.js │ │ │ ├── tools.docs-only.programmatic.test.js │ │ │ └── tools.full-mode.programmatic.test.js │ │ ├── README.md │ │ ├── test-fixtures │ │ │ └── dw.json │ │ └── yaml │ │ ├── activate-code-version.docs-only.test.mcp.yml │ │ ├── activate-code-version.full-mode.test.mcp.yml │ │ ├── get_latest_error.test.mcp.yml │ │ ├── get-available-best-practice-guides.docs-only.test.mcp.yml │ │ ├── get-available-best-practice-guides.full-mode.test.mcp.yml │ │ ├── get-available-sfra-documents.docs-only.test.mcp.yml │ │ ├── get-available-sfra-documents.full-mode.test.mcp.yml │ │ ├── get-best-practice-guide.docs-only.test.mcp.yml │ │ ├── get-best-practice-guide.full-mode.test.mcp.yml │ │ ├── get-code-versions.docs-only.test.mcp.yml │ │ ├── get-code-versions.full-mode.test.mcp.yml │ │ ├── get-hook-reference.docs-only.test.mcp.yml │ │ ├── get-hook-reference.full-mode.test.mcp.yml │ │ ├── get-job-execution-summary.full-mode.test.mcp.yml │ │ ├── get-job-log-entries.full-mode.test.mcp.yml │ │ ├── get-latest-debug.full-mode.test.mcp.yml │ │ ├── get-latest-error.full-mode.test.mcp.yml │ │ ├── get-latest-info.full-mode.test.mcp.yml │ │ ├── get-latest-job-log-files.full-mode.test.mcp.yml │ │ ├── get-latest-warn.full-mode.test.mcp.yml │ │ ├── get-log-file-contents.full-mode.test.mcp.yml │ │ ├── get-sfcc-class-documentation.docs-only.test.mcp.yml │ │ ├── get-sfcc-class-documentation.full-mode.test.mcp.yml │ │ ├── get-sfcc-class-info.docs-only.test.mcp.yml │ │ ├── get-sfcc-class-info.full-mode.test.mcp.yml │ │ ├── get-sfra-categories.docs-only.test.mcp.yml │ │ ├── get-sfra-categories.full-mode.test.mcp.yml │ │ ├── get-sfra-document.docs-only.test.mcp.yml │ │ ├── get-sfra-document.full-mode.test.mcp.yml │ │ ├── get-sfra-documents-by-category.docs-only.test.mcp.yml │ │ ├── get-sfra-documents-by-category.full-mode.test.mcp.yml │ │ ├── get-system-object-definition.docs-only.test.mcp.yml │ │ ├── get-system-object-definition.full-mode.test.mcp.yml │ │ ├── get-system-object-definitions.docs-only.test.mcp.yml │ │ ├── get-system-object-definitions.full-mode.test.mcp.yml │ │ ├── list-log-files.full-mode.test.mcp.yml │ │ ├── list-sfcc-classes.docs-only.test.mcp.yml │ │ ├── list-sfcc-classes.full-mode.test.mcp.yml │ │ ├── search-best-practices.docs-only.test.mcp.yml │ │ ├── search-best-practices.full-mode.test.mcp.yml │ │ ├── search-custom-object-attribute-definitions.docs-only.test.mcp.yml │ │ ├── search-custom-object-attribute-definitions.test.mcp.yml │ │ ├── search-job-logs-by-name.full-mode.test.mcp.yml │ │ ├── search-job-logs.full-mode.test.mcp.yml │ │ ├── search-logs.full-mode.test.mcp.yml │ │ ├── search-sfcc-classes.docs-only.test.mcp.yml │ │ ├── search-sfcc-classes.full-mode.test.mcp.yml │ │ ├── search-sfcc-methods.docs-only.test.mcp.yml │ │ ├── search-sfcc-methods.full-mode.test.mcp.yml │ │ ├── search-sfra-documentation.docs-only.test.mcp.yml │ │ ├── search-sfra-documentation.full-mode.test.mcp.yml │ │ ├── search-site-preferences.docs-only.test.mcp.yml │ │ ├── search-site-preferences.full-mode.test.mcp.yml │ │ ├── search-system-object-attribute-definitions.docs-only.test.mcp.yml │ │ ├── search-system-object-attribute-definitions.full-mode.test.mcp.yml │ │ ├── search-system-object-attribute-groups.docs-only.test.mcp.yml │ │ ├── search-system-object-attribute-groups.full-mode.test.mcp.yml │ │ ├── summarize-logs.full-mode.test.mcp.yml │ │ ├── tools.docs-only.test.mcp.yml │ │ └── tools.full-mode.test.mcp.yml │ ├── oauth-token.test.ts │ ├── ocapi-auth-client.test.ts │ ├── ocapi-client.test.ts │ ├── path-service.test.ts │ ├── query-builder.test.ts │ ├── referenced-types-extractor.test.ts │ ├── servers │ │ ├── sfcc-mock-server │ │ │ ├── mock-data │ │ │ │ └── ocapi │ │ │ │ ├── code-versions.json │ │ │ │ ├── custom-object-attributes-customapi.json │ │ │ │ ├── custom-object-attributes-globalsettings.json │ │ │ │ ├── custom-object-attributes-versionhistory.json │ │ │ │ ├── site-preferences-ccv.json │ │ │ │ ├── site-preferences-fastforward.json │ │ │ │ ├── site-preferences-sfra.json │ │ │ │ ├── site-preferences-storefront.json │ │ │ │ ├── site-preferences-system.json │ │ │ │ ├── system-object-attribute-groups-campaign.json │ │ │ │ ├── system-object-attribute-groups-category.json │ │ │ │ ├── system-object-attribute-groups-order.json │ │ │ │ ├── system-object-attribute-groups-product.json │ │ │ │ ├── system-object-attribute-groups-sitepreferences.json │ │ │ │ ├── system-object-attributes-customeraddress.json │ │ │ │ ├── system-object-attributes-product-expanded.json │ │ │ │ ├── system-object-attributes-product.json │ │ │ │ ├── system-object-definition-category.json │ │ │ │ ├── system-object-definition-customer.json │ │ │ │ ├── system-object-definition-customeraddress.json │ │ │ │ ├── system-object-definition-order.json │ │ │ │ ├── system-object-definition-product.json │ │ │ │ ├── system-object-definitions-old.json │ │ │ │ └── system-object-definitions.json │ │ │ ├── package-lock.json │ │ │ ├── package.json │ │ │ ├── README.md │ │ │ ├── scripts │ │ │ │ └── setup-logs.js │ │ │ ├── server.js │ │ │ └── src │ │ │ ├── app.js │ │ │ ├── config │ │ │ │ └── server-config.js │ │ │ ├── middleware │ │ │ │ ├── auth.js │ │ │ │ ├── cors.js │ │ │ │ └── logging.js │ │ │ ├── routes │ │ │ │ ├── ocapi │ │ │ │ │ ├── code-versions-handler.js │ │ │ │ │ ├── oauth-handler.js │ │ │ │ │ ├── ocapi-error-utils.js │ │ │ │ │ ├── ocapi-utils.js │ │ │ │ │ ├── site-preferences-handler.js │ │ │ │ │ └── system-objects-handler.js │ │ │ │ ├── ocapi.js │ │ │ │ └── webdav.js │ │ │ └── utils │ │ │ ├── mock-data-loader.js │ │ │ └── webdav-xml.js │ │ └── sfcc-mock-server-manager.ts │ ├── sfcc-mock-server.test.ts │ ├── site-preferences-client.test.ts │ ├── system-objects-client.test.ts │ ├── utils.test.ts │ ├── validation-helpers.test.ts │ └── validator.test.ts ├── tsconfig.json └── tsconfig.test.json ``` # Files -------------------------------------------------------------------------------- /docs-site/pages/HomePage.tsx: -------------------------------------------------------------------------------- ```typescript import React, { useState, useRef, useCallback } from 'react'; import { NavLink } from 'react-router-dom'; import SEO from '../components/SEO'; import BreadcrumbSchema from '../components/BreadcrumbSchema'; import StructuredData from '../components/StructuredData'; import { H1, H2, H3, PageSubtitle } from '../components/Typography'; import CodeBlock, { InlineCode } from '../components/CodeBlock'; import LightCodeContainer from '../components/LightCodeContainer'; import NewcomerCTA from '../components/NewcomerCTA'; const HomePage: React.FC = () => { const [isWithoutMcpModalOpen, setIsWithoutMcpModalOpen] = useState(false); const [isWithMcpModalOpen, setIsWithMcpModalOpen] = useState(false); const [zoomPosition1, setZoomPosition1] = useState({ x: 0, y: 0 }); const [isZooming1, setIsZooming1] = useState(false); const [zoomPosition2, setZoomPosition2] = useState({ x: 0, y: 0 }); const [isZooming2, setIsZooming2] = useState(false); const imageRef1 = useRef<HTMLImageElement>(null); const imageRef2 = useRef<HTMLImageElement>(null); const handleMouseMove1 = useCallback((e: React.MouseEvent<HTMLImageElement>) => { if (!imageRef1.current) return; const rect = imageRef1.current.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; setZoomPosition1({ x, y }); }, []); const handleMouseEnter1 = useCallback(() => { setIsZooming1(true); }, []); const handleMouseLeave1 = useCallback(() => { setIsZooming1(false); }, []); const handleMouseMove2 = useCallback((e: React.MouseEvent<HTMLImageElement>) => { if (!imageRef2.current) return; const rect = imageRef2.current.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; setZoomPosition2({ x, y }); }, []); const handleMouseEnter2 = useCallback(() => { setIsZooming2(true); }, []); const handleMouseLeave2 = useCallback(() => { setIsZooming2(false); }, []); const homePageStructuredData = { "@context": "https://schema.org", "@type": "WebPage", "name": "SFCC Development MCP Server - AI-Powered Commerce Cloud Development Tools", "description": "Model Context Protocol server for Salesforce B2C Commerce Cloud development with comprehensive documentation access, log analysis, and development best practices.", "url": "https://sfcc-mcp-dev.rhino-inquisitor.com/", "mainEntity": { "@type": "SoftwareApplication", "name": "SFCC Development MCP Server", "applicationCategory": "DeveloperApplication", "description": "A comprehensive MCP server providing AI assistants with direct access to SFCC development tools, documentation, and debugging capabilities.", "operatingSystem": "Node.js", "downloadUrl": "https://www.npmjs.com/package/sfcc-dev-mcp", "offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD", "availability": "https://schema.org/InStock" } }, "breadcrumb": { "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://sfcc-mcp-dev.rhino-inquisitor.com/" }] } }; return ( <div className="max-w-6xl mx-auto px-6 py-8"> <SEO title="SFCC Development MCP Server - AI-Powered Commerce Cloud Development Tools" description="Model Context Protocol server for Salesforce B2C Commerce Cloud development. Access comprehensive documentation, analyze logs, explore system objects, and get best practices with AI assistance." keywords="SFCC, Salesforce Commerce Cloud, Model Context Protocol, MCP server, AI development tools, SFCC documentation, Commerce Cloud development, SFCC debugging, AI-assisted development, SFCC best practices" canonical="/" ogType="website" /> <BreadcrumbSchema items={[ { name: "Home", url: "/" } ]} /> <StructuredData structuredData={homePageStructuredData} /> {/* Hero Section */} <div className="text-center mb-16"> <div className="inline-flex items-center gap-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white px-4 py-2 rounded-full text-sm font-medium mb-6"> <span className="bg-white/20 rounded-full p-1"> <svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z" clipRule="evenodd" /> </svg> </span> AI-Powered Development Tools for SFCC </div> <H1 id="sfcc-development-mcp-server" className="text-5xl md:text-6xl font-extrabold bg-gradient-to-r from-gray-900 via-blue-900 to-purple-900 bg-clip-text text-transparent mb-6"> SFCC Development MCP Server </H1> <PageSubtitle className="text-xl md:text-2xl text-gray-600 max-w-4xl mx-auto leading-relaxed"> Supercharge your Salesforce B2C Commerce Cloud development with AI-powered documentation access, real-time log analysis, and intelligent best practices guidance </PageSubtitle> </div> {/* Quick Start Section */} <div className="mb-16 bg-gradient-to-r from-blue-50 via-indigo-50 to-purple-50 rounded-2xl p-8 shadow-xl border border-blue-100"> <div className="text-center mb-8"> <div className="inline-flex items-center gap-2 bg-green-100 text-green-800 px-4 py-2 rounded-full text-sm font-medium mb-4"> <svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> No Credentials Required </div> <H2 id="quick-start" className="text-3xl font-bold mb-4">🚀 Zero-Config Quick Start</H2> <p className="text-lg text-gray-700 max-w-3xl mx-auto"> Jump straight into SFCC development with AI assistance. Get access to comprehensive documentation, best practices, and cartridge generation tools instantly. </p> </div> {/* Newcomer CTA */} <NewcomerCTA className="mb-8" /> <div className="grid md:grid-cols-2 gap-8 items-center"> <div> <h3 className="text-lg font-semibold text-gray-900 mb-4">Add to your AI client:</h3> <LightCodeContainer> <CodeBlock language="json" code={`{ "mcpServers": { "sfcc-dev": { "command": "npx", "args": ["sfcc-dev-mcp"] } } }`} /> </LightCodeContainer> </div> <div className="space-y-4"> <div className="flex items-start gap-3 md:mt-24"> <div className="bg-blue-100 rounded-full p-2 mt-1"> <svg className="w-5 h-5 text-blue-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M6.267 3.455a3.066 3.066 0 001.745-.723 3.066 3.066 0 013.976 0 3.066 3.066 0 001.745.723 3.066 3.066 0 012.812 2.812c.051.643.304 1.254.723 1.745a3.066 3.066 0 010 3.976 3.066 3.066 0 00-.723 1.745 3.066 3.066 0 01-2.812 2.812 3.066 3.066 0 00-1.745.723 3.066 3.066 0 01-3.976 0 3.066 3.066 0 00-1.745-.723 3.066 3.066 0 01-2.812-2.812 3.066 3.066 0 00-.723-1.745 3.066 3.066 0 010-3.976 3.066 3.066 0 00.723-1.745 3.066 3.066 0 012.812-2.812zm7.44 5.252a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> </div> <div> <h4 className="font-semibold text-gray-900 mt-0">Instant Access</h4> <p className="text-gray-600 text-sm">Start using SFCC documentation and tools immediately</p> </div> </div> <div className="flex items-start gap-3"> <div className="bg-green-100 rounded-full p-2 mt-1"> <svg className="w-5 h-5 text-green-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> </div> <div> <h4 className="font-semibold text-gray-900 mt-0">No Setup Required</h4> <p className="text-gray-600 text-sm">Works out of the box with documentation-only mode</p> </div> </div> <div className="flex items-start gap-3"> <div className="bg-purple-100 rounded-full p-2 mt-1"> <svg className="w-5 h-5 text-purple-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clipRule="evenodd" /> </svg> </div> <div> <h4 className="font-semibold text-gray-900 mt-0">Full Documentation</h4> <p className="text-gray-600 text-sm">Complete SFCC API docs, SFRA guides, and best practices</p> </div> </div> </div> </div> <div className="mt-6 p-4 bg-blue-50 border border-blue-200 rounded-lg"> <p className="text-sm text-blue-800 text-center"> 💡 <strong>Want more features?</strong> Add SFCC credentials via <InlineCode>--dw-json</InlineCode> for real-time log analysis, system & custom object exploration, and advanced debugging tools. </p> </div> </div> {/* CTA Buttons */} <div className="flex flex-col sm:flex-row gap-4 justify-center mt-8 mb-8"> <NavLink to="/ai-interfaces/" className="group bg-gradient-to-r from-blue-600 to-purple-600 text-white px-8 py-4 rounded-xl font-semibold text-lg shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1 no-underline hover:no-underline focus:no-underline" > Get Started in 2 Minutes <span className="ml-2 group-hover:translate-x-1 inline-block transition-transform">→</span> </NavLink> <NavLink to="/examples/" className="border-2 border-gray-300 text-gray-700 px-8 py-4 rounded-xl font-semibold text-lg hover:border-blue-500 hover:text-blue-600 transition-all duration-300 no-underline hover:no-underline focus:no-underline" > See Examples </NavLink> </div> {/* AI Instructions Warning */} <div className="mb-16 bg-gradient-to-r from-red-100 to-orange-100 border-l-4 border-red-500 rounded-xl p-6 shadow-lg"> <div className="flex items-start gap-4"> <div className="bg-red-100 rounded-full p-3 flex-shrink-0"> <svg className="w-6 h-6 text-red-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" /> </svg> </div> <div className="flex-1"> <H3 id="important-ai-instructions" className="text-red-800 text-xl font-bold mb-3"> ⚠️ Essential: AI Instructions Required </H3> <p className="text-red-800 mb-4"> Your AI needs specific instructions to use the MCP server effectively. We've created ready-to-use instruction files for GitHub Copilot, Claude, and Cursor. </p> <div className="flex items-center gap-4"> <a href="https://github.com/taurgis/sfcc-dev-mcp/tree/main/ai-instructions" className="inline-flex items-center gap-2 bg-red-600 text-white px-4 py-2 rounded-lg font-medium hover:bg-red-700 transition-colors no-underline hover:no-underline focus:no-underline" target="_blank" rel="noopener noreferrer" > <svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M3 4a1 1 0 011-1h4a1 1 0 010 2H6.414l2.293 2.293a1 1 0 01-1.414 1.414L5 6.414V8a1 1 0 01-2 0V4zm9 1a1 1 0 010-2h4a1 1 0 011 1v4a1 1 0 01-2 0V6.414l-2.293 2.293a1 1 0 11-1.414-1.414L13.586 5H12zm-9 7a1 1 0 012 0v1.586l2.293-2.293a1 1 0 111.414 1.414L6.414 15H8a1 1 0 010 2H4a1 1 0 01-1-1v-4zm13-1a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 010-2h1.586l-2.293-2.293a1 1 0 111.414-1.414L15 13.586V12a1 1 0 011-1z" clipRule="evenodd" /> </svg> Download AI Instructions </a> <NavLink to="/ai-interfaces/" className="inline-flex no-underline items-center gap-1 text-red-600 hover:text-red-800 font-medium transition-colors" > 📖 Setup Guide <svg className="w-3 h-3" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10.293 3.293a1 1 0 011.414 0l6 6a1 1 0 010 1.414l-6 6a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-4.293-4.293a1 1 0 010-1.414z" clipRule="evenodd" /> </svg> </NavLink> </div> </div> </div> </div> {/* Value Proposition Section */} <div className="mb-16"> <div className="text-center mb-12"> <H2 id="why-use-this" className="text-4xl font-bold mb-6"> <span className="bg-gradient-to-r from-gray-900 via-blue-900 to-purple-900 bg-clip-text text-transparent"> Stop Fighting Documentation </span> </H2> <p className="text-xl text-gray-600 max-w-4xl mx-auto leading-relaxed"> Transform your SFCC development workflow from manual documentation hunting to AI-powered assistance </p> </div> {/* Before/After Comparison */} <div className="mb-12 bg-gradient-to-r from-blue-50/50 via-purple-50/50 to-pink-50/50 rounded-3xl p-8 shadow-2xl border border-gray-200"> {/* Timeline Header */} <div className="text-center mb-8"> <div className="inline-flex items-center gap-4 bg-gradient-to-r from-gray-800 to-gray-900 text-white px-6 py-3 rounded-full text-sm font-medium"> <span className="bg-white/20 rounded-full p-1"> <svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z" clipRule="evenodd" /> </svg> </span> Development Timeline Comparison </div> </div> <div className="grid lg:grid-cols-2 gap-8 relative"> {/* Connecting Line */} <div className="hidden lg:block absolute left-1/2 top-16 bottom-16 w-px bg-gradient-to-b from-red-300 via-yellow-300 to-green-300 transform -translate-x-1/2"></div> {/* Before Timeline */} <div className="relative"> <div className="flex items-center gap-3 mb-6"> <div className="bg-gradient-to-r from-red-500 to-orange-500 rounded-xl p-3 shadow-lg"> <svg className="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" /> </svg> </div> <div> <h3 className="text-2xl font-bold text-gray-900">Traditional</h3> <p className="text-red-600 font-medium">Frustrating & Time-Consuming</p> </div> </div> {/* Timeline Steps */} <div className="space-y-4"> <div className="flex gap-4 p-4 bg-red-50 border border-red-200 rounded-xl transition-all hover:shadow-md"> <div className="bg-red-100 rounded-full p-2 mt-1 flex-shrink-0"> <span className="text-red-600 font-bold text-sm">1</span> </div> <div> <h4 className="font-semibold text-gray-900 mb-1">Documentation Hunt</h4> <p className="text-sm text-gray-600">Open 10+ browser tabs searching for method signatures</p> <div className="text-xs text-red-600 font-medium mt-1">⏱️ 15-30 minutes</div> </div> </div> <div className="flex gap-4 p-4 bg-red-50 border border-red-200 rounded-xl transition-all hover:shadow-md"> <div className="bg-red-100 rounded-full p-2 mt-1 flex-shrink-0"> <span className="text-red-600 font-bold text-sm">2</span> </div> <div> <h4 className="font-semibold text-gray-900 mb-1">Copy-Paste Engineering</h4> <p className="text-sm text-gray-600">Hunt for code examples across forums and docs</p> <div className="text-xs text-red-600 font-medium mt-1">⏱️ 20-45 minutes</div> </div> </div> <div className="flex gap-4 p-4 bg-red-50 border border-red-200 rounded-xl transition-all hover:shadow-md"> <div className="bg-red-100 rounded-full p-2 mt-1 flex-shrink-0"> <span className="text-red-600 font-bold text-sm">3</span> </div> <div> <h4 className="font-semibold text-gray-900 mb-1">Debug Blindly</h4> <p className="text-sm text-gray-600">Manual log analysis without proper context</p> <div className="text-xs text-red-600 font-medium mt-1">⏱️ 1-3 hours</div> </div> </div> <div className="flex gap-4 p-4 bg-red-50 border border-red-200 rounded-xl transition-all hover:shadow-md"> <div className="bg-red-100 rounded-full p-2 mt-1 flex-shrink-0"> <span className="text-red-600 font-bold text-sm">4</span> </div> <div> <h4 className="font-semibold text-gray-900 mb-1">Feature Scaffolding</h4> <p className="text-sm text-gray-600">Manually create cartridge structures and boilerplate code for new cartridges, new SCAPI endpoints, ...</p> <div className="text-xs text-red-600 font-medium mt-1">⏱️ 30-60 minutes</div> </div> </div> <div className="flex gap-4 p-4 bg-red-50 border border-red-200 rounded-xl transition-all hover:shadow-md"> <div className="bg-red-100 rounded-full p-2 mt-1 flex-shrink-0"> <span className="text-red-600 font-bold text-sm">5</span> </div> <div> <h4 className="font-semibold text-gray-900 mb-1">Context Switching</h4> <p className="text-sm text-gray-600">Jump between IDE, browser, logs, and documentation</p> <div className="text-xs text-red-600 font-medium mt-1">⏱️ Constant overhead</div> </div> </div> </div> <div className="mt-6 p-4 bg-red-100 border border-red-300 rounded-xl"> <div className="flex items-center gap-2 text-red-800"> <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" /> </svg> <span className="font-bold">Total Time Lost: 2-4 hours daily</span> </div> </div> </div> {/* After Timeline */} <div className="relative"> <div className="flex items-center gap-3 mb-6"> <div className="bg-gradient-to-r from-green-500 to-emerald-500 rounded-xl p-3 shadow-lg"> <svg className="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z" clipRule="evenodd" /> </svg> </div> <div> <h3 className="text-2xl font-bold text-gray-900">AI-Enhanced</h3> <p className="text-green-600 font-medium">Efficient & Intelligent</p> </div> </div> {/* Timeline Steps */} <div className="space-y-4"> <div className="flex gap-4 p-4 bg-green-50 border border-green-200 rounded-xl transition-all hover:shadow-md"> <div className="bg-green-100 rounded-full p-2 mt-1 flex-shrink-0"> <span className="text-green-600 font-bold text-sm">1</span> </div> <div> <h4 className="font-semibold text-gray-900 mb-1">Ask AI Directly</h4> <p className="text-sm text-gray-600">"Show me Product pricing methods" → instant comprehensive answer</p> <div className="text-xs text-green-600 font-medium mt-1">⏱️ 30 seconds</div> </div> </div> <div className="flex gap-4 p-4 bg-green-50 border border-green-200 rounded-xl transition-all hover:shadow-md"> <div className="bg-green-100 rounded-full p-2 mt-1 flex-shrink-0"> <span className="text-green-600 font-bold text-sm">2</span> </div> <div> <h4 className="font-semibold text-gray-900 mb-1">Get Complete Examples</h4> <p className="text-sm text-gray-600">AI generates proper SFCC patterns with best practices</p> <div className="text-xs text-green-600 font-medium mt-1">⏱️ 1-2 minutes</div> </div> </div> <div className="flex gap-4 p-4 bg-green-50 border border-green-200 rounded-xl transition-all hover:shadow-md"> <div className="bg-green-100 rounded-full p-2 mt-1 flex-shrink-0"> <span className="text-green-600 font-bold text-sm">3</span> </div> <div> <h4 className="font-semibold text-gray-900 mb-1">Smart Debugging</h4> <p className="text-sm text-gray-600">"Find errors from last 24h" → AI analyzes and filters logs</p> <div className="text-xs text-green-600 font-medium mt-1">⏱️ 2-5 minutes</div> </div> </div> <div className="flex gap-4 p-4 bg-green-50 border border-green-200 rounded-xl transition-all hover:shadow-md"> <div className="bg-green-100 rounded-full p-2 mt-1 flex-shrink-0"> <span className="text-green-600 font-bold text-sm">4</span> </div> <div> <h4 className="font-semibold text-gray-900 mb-1">Instant Scaffolding</h4> <p className="text-sm text-gray-600">"Create custom SCAPI endpoint for wishlist" → complete cartridge with routes</p> <div className="text-xs text-green-600 font-medium mt-1">⏱️ 1-2 minutes</div> </div> </div> <div className="flex gap-4 p-4 bg-green-50 border border-green-200 rounded-xl transition-all hover:shadow-md"> <div className="bg-green-100 rounded-full p-2 mt-1 flex-shrink-0"> <span className="text-green-600 font-bold text-sm">5</span> </div> <div> <h4 className="font-semibold text-gray-900 mb-1">Stay in Flow</h4> <p className="text-sm text-gray-600">All SFCC knowledge accessible within your editor</p> <div className="text-xs text-green-600 font-medium mt-1">⏱️ Zero context switching</div> </div> </div> </div> <div className="mt-6 p-4 bg-green-100 border border-green-300 rounded-xl"> <div className="flex items-center gap-2 text-green-800"> <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> <span className="font-bold">Total Time Saved: 2-3 hours daily</span> </div> </div> </div> </div> {/* Bottom CTA */} <div className="mt-10 text-center"> <div className="inline-flex items-center gap-4 bg-gradient-to-r from-blue-600 via-purple-600 to-pink-600 text-white px-8 py-4 rounded-2xl shadow-lg"> <svg className="w-6 h-6" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M11.3 1.046A1 1 0 0112 2v5h4a1 1 0 01.82 1.573l-7 10A1 1 0 018 18v-5H4a1 1 0 01-.82-1.573l7-10a1 1 0 011.12-.38z" clipRule="evenodd" /> </svg> <div className="text-left"> <div className="font-bold text-lg">Ready to 10x your SFCC productivity?</div> <div className="text-blue-100 text-sm">Set up in under 2 minutes • No SFCC credentials required to start</div> </div> </div> </div> </div> </div> {/* What You Get */} <div className="mb-16"> <div className="text-center mb-10"> <H2 id="what-you-get" className="text-3xl font-bold mb-4">🎯 What You Get</H2> <p className="text-lg text-gray-600 max-w-3xl mx-auto"> Two modes to match your needs: start instantly with documentation-only mode, then upgrade to full mode for live data analysis </p> </div> <div className="grid lg:grid-cols-2 gap-8"> {/* Documentation Mode */} <div className="bg-gradient-to-br from-green-50 to-emerald-50 rounded-2xl p-8 border border-green-200"> <div className="flex items-center gap-3 mb-6"> <div className="bg-green-500 rounded-full p-3"> <svg className="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> </div> <div> <H3 id="documentation-mode" className="text-2xl font-bold text-green-800">Documentation Mode</H3> <p className="text-green-600 font-medium" style={{ marginTop: '-12px' }}>Zero setup required</p> </div> </div> <ul className="space-y-3"> <li className="flex items-center gap-3"> <svg className="w-5 h-5 text-green-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> <span className="text-gray-700">Complete SFCC API documentation</span> </li> <li className="flex items-center gap-3"> <svg className="w-5 h-5 text-green-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> <span className="text-gray-700">SFRA guides and best practices</span> </li> <li className="flex items-center gap-3"> <svg className="w-5 h-5 text-green-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> <span className="text-gray-700">Cartridge generation tools</span> </li> <li className="flex items-center gap-3"> <svg className="w-5 h-5 text-green-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> <span className="text-gray-700">Security and performance guidance</span> </li> </ul> </div> {/* Full Mode */} <div className="bg-gradient-to-br from-blue-50 to-purple-50 rounded-2xl p-8 border border-blue-200"> <div className="flex items-center gap-3 mb-6"> <div className="bg-gradient-to-r from-blue-500 to-purple-500 rounded-full p-3"> <svg className="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z" clipRule="evenodd" /> </svg> </div> <div> <H3 id="full-mode" className="text-2xl font-bold text-blue-800 mb-">Full Mode</H3> <p className="text-blue-600 font-medium" style={{ marginTop: '-12px' }}>Everything + live data</p> </div> </div> <ul className="space-y-3"> <li className="flex items-center gap-3"> <svg className="w-5 h-5 text-blue-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> <span className="text-gray-700">All documentation features</span> </li> <li className="flex items-center gap-3"> <svg className="w-5 h-5 text-blue-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> <span className="text-gray-700">Real-time log analysis</span> </li> <li className="flex items-center gap-3"> <svg className="w-5 h-5 text-blue-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> <span className="text-gray-700">System & custom object exploration</span> </li> <li className="flex items-center gap-3"> <svg className="w-5 h-5 text-blue-500 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> <span className="text-gray-700">Code version management</span> </li> </ul> <div className="mt-6 p-4 bg-blue-100 rounded-lg"> <p className="text-blue-800 text-sm font-medium">🔐 Requires SFCC credentials</p> </div> </div> </div> </div> {/* Key Features Overview */} <div className="mb-16"> <div className="text-center mb-8"> <H2 id="key-features" className="text-3xl font-bold mb-4">✨ Everything You Need</H2> <p className="text-lg text-gray-600 max-w-3xl mx-auto"> 36+ specialized tools for comprehensive SFCC development support </p> </div> <div className="grid grid-cols-2 md:grid-cols-5 gap-6"> <div className="text-center"> <div className="bg-blue-100 rounded-full p-4 w-16 h-16 mx-auto mb-3"> <svg className="w-8 h-8 text-blue-600" fill="currentColor" viewBox="0 0 20 20"> <path d="M9 4.804A7.968 7.968 0 005.5 4c-1.255 0-2.443.29-3.5.804v10A7.969 7.969 0 005.5 14c1.669 0 3.218.51 4.5 1.385A7.962 7.962 0 0114.5 14c1.255 0 2.443.29 3.5.804v-10A7.968 7.968 0 0014.5 4c-1.255 0-2.443.29-3.5.804V12a1 1 0 11-2 0V4.804z" /> </svg> </div> <h3 className="font-semibold text-gray-900">Documentation</h3> <p className="text-sm text-gray-600">Complete API docs</p> </div> <div className="text-center"> <div className="bg-green-100 rounded-full p-4 w-16 h-16 mx-auto mb-3"> <svg className="w-8 h-8 text-green-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M3 3a1 1 0 000 2v8a2 2 0 002 2h2.586l-1.293 1.293a1 1 0 101.414 1.414L10 15.414l2.293 2.293a1 1 0 001.414-1.414L12.414 15H15a2 2 0 002-2V5a1 1 0 100-2H3zm11.707 4.707a1 1 0 00-1.414-1.414L10 9.586 8.707 8.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> </div> <h3 className="font-semibold text-gray-900">Log Analysis</h3> <p className="text-sm text-gray-600">Real-time monitoring</p> </div> <div className="text-center"> <div className="bg-purple-100 rounded-full p-4 w-16 h-16 mx-auto mb-3"> <svg className="w-8 h-8 text-purple-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M4 4a2 2 0 00-2 2v8a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2H4zm2 6a2 2 0 104 0 2 2 0 00-4 0zm6 0a2 2 0 104 0 2 2 0 00-4 0z" clipRule="evenodd" /> </svg> </div> <h3 className="font-semibold text-gray-900">System Objects</h3> <p className="text-sm text-gray-600">Live exploration</p> </div> <div className="text-center"> <div className="bg-orange-100 rounded-full p-4 w-16 h-16 mx-auto mb-3"> <svg className="w-8 h-8 text-orange-600" fill="currentColor" viewBox="0 0 20 20"> <path d="M3 4a1 1 0 011-1h12a1 1 0 011 1v2a1 1 0 01-1 1H4a1 1 0 01-1-1V4zm0 4a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H4a1 1 0 01-1-1V8zm8 0a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1h-6a1 1 0 01-1-1V8z" /> </svg> </div> <h3 className="font-semibold text-gray-900">Cartridges</h3> <p className="text-sm text-gray-600">Auto generation</p> </div> <div className="text-center"> <div className="bg-yellow-100 rounded-full p-4 w-16 h-16 mx-auto mb-3"> <svg className="w-8 h-8 text-yellow-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3-9a1 1 0 00-1-1H8a1 1 0 100 2h1v3a1 1 0 102 0v-3h1a1 1 0 001-1z" clipRule="evenodd" /> </svg> </div> <h3 className="font-semibold text-gray-900">Job Logs</h3> <p className="text-sm text-gray-600">Execution insights</p> </div> </div> </div> {/* Quick Test Drive Section */} <div className="mb-16 bg-gradient-to-r from-emerald-50 via-teal-50 to-cyan-50 rounded-2xl p-8 shadow-xl border border-emerald-200"> <div className="text-center mb-8"> <div className="inline-flex items-center gap-2 bg-emerald-100 text-emerald-800 px-4 py-2 rounded-full text-sm font-medium mb-4"> <svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> Test Drive </div> <H2 id="quick-test-drive" className="text-3xl font-bold mb-4">🧪 Try It Right Now</H2> <p className="text-lg text-gray-600 max-w-3xl mx-auto"> After setup, ask your AI assistant this question to see the MCP server in action. No SFCC credentials needed. </p> </div> <div className="space-y-8"> <div> <h3 className="text-lg font-semibold text-gray-900 mb-4 text-center">Ask Your AI This</h3> <div className="bg-gradient-to-r from-blue-50 to-indigo-50 border border-blue-200 rounded-xl p-6"> <div className="flex items-start gap-4"> <div className="flex-1"> <p className="font-medium text-blue-900 mb-3">Copy this prompt:</p> <div className="bg-white rounded-lg p-4 border border-blue-200"> <p className="text-base font-mono text-gray-800 leading-relaxed"> "Explain how to get the sale price for a product variant in SFCC. Keep it short and a quick example" </p> </div> <div className="mt-3 flex justify-center gap-2 flex-wrap"> <button onClick={() => navigator.clipboard.writeText('Explain how to get the sale price for a product variant in SFCC. Keep it short and a quick example')} className="inline-flex items-center gap-2 bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg transition font-medium text-sm" > <svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20"> <path d="M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z" /> <path d="M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z" /> </svg> Copy Prompt </button> <button onClick={() => setIsWithoutMcpModalOpen(true)} className="inline-flex items-center gap-2 bg-red-600 hover:bg-red-700 text-white px-4 py-2 rounded-lg transition font-medium text-sm" > <svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clipRule="evenodd" /> </svg> View Without MCP </button> <button onClick={() => setIsWithMcpModalOpen(true)} className="inline-flex items-center gap-2 bg-green-600 hover:bg-green-700 text-white px-4 py-2 rounded-lg transition font-medium text-sm" > <svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> View With MCP </button> </div> </div> </div> </div> </div> <div> <h3 className="text-lg font-semibold text-gray-900 mb-4 text-center">What You Should See</h3> <div className="grid md:grid-cols-3 gap-4"> <div className="bg-green-50 border border-green-200 rounded-lg p-4 flex flex-col h-full"> <div className="grid grid-cols-[auto_1fr] gap-2 items-center mb-3"> <div className="bg-green-100 rounded-full p-1"> <svg className="w-4 h-4 text-green-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> </div> <p className="font-medium text-green-800">SFCC Methods</p> </div> <p className="text-sm text-green-700 flex-grow">Lists actual methods like getPriceModel(), getVariationModel()</p> </div> <div className="bg-green-50 border border-green-200 rounded-lg p-4 flex flex-col h-full"> <div className="grid grid-cols-[auto_1fr] gap-2 items-center mb-3"> <div className="bg-green-100 rounded-full p-1"> <svg className="w-4 h-4 text-green-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> </div> <p className="font-medium text-green-800">Code Examples</p> </div> <p className="text-sm text-green-700 flex-grow">Shows real SFCC code patterns with proper syntax</p> </div> <div className="bg-green-50 border border-green-200 rounded-lg p-4 flex flex-col h-full"> <div className="grid grid-cols-[auto_1fr] gap-2 items-center mb-3"> <div className="bg-green-100 rounded-full p-1"> <svg className="w-4 h-4 text-green-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> </div> <p className="font-medium text-green-800">Documentation</p> </div> <p className="text-sm text-green-700 flex-grow">References accurate SFCC API information</p> </div> </div> </div> </div> <div className="mt-8 p-4 bg-yellow-50 border border-yellow-200 rounded-lg"> <div className="flex items-start gap-3"> <div className="bg-yellow-100 rounded-full p-1 mt-0.5"> <svg className="w-4 h-4 text-yellow-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" /> </svg> </div> <div className="flex-1"> <p className="font-medium text-yellow-800 mb-1">Without MCP Server</p> <p className="text-sm text-yellow-700"> Your AI would give generic responses or outdated information. With MCP, it accesses live SFCC documentation and provides accurate, specific answers. </p> </div> </div> </div> <div className="mt-8 text-center"> <p className="text-gray-600 mb-4">✅ Getting SFCC-specific answers? Your setup is working perfectly!</p> <div className="flex flex-col sm:flex-row gap-3 justify-center"> <NavLink to="/examples/" className="inline-flex items-center justify-center px-6 py-3 rounded-full text-sm font-semibold bg-emerald-600 text-white shadow hover:bg-emerald-700 transition group no-underline hover:no-underline focus:no-underline"> Try More Examples <span className="ml-2 transition group-hover:translate-x-0.5">→</span> </NavLink> <NavLink to="/configuration/" className="inline-flex items-center justify-center px-6 py-3 rounded-full text-sm font-semibold bg-white text-gray-800 border border-gray-300 hover:border-gray-400 hover:bg-gray-50 transition no-underline hover:no-underline focus:no-underline"> Add Full Mode </NavLink> </div> </div> </div> {/* Final CTA */} <div className="text-center"> <div className="bg-gradient-to-r from-gray-50 to-blue-50 rounded-2xl p-8 border border-gray-200 mb-8"> <p className="text-lg text-gray-700 italic leading-relaxed max-w-4xl mx-auto mb-6"> "Empower your AI assistant with comprehensive SFCC knowledge for faster, more accurate development assistance." </p> <div className="flex flex-col sm:flex-row gap-4 justify-center"> <NavLink to="/ai-interfaces/" className="group bg-gradient-to-r from-blue-600 to-purple-600 text-white px-8 py-4 rounded-xl font-semibold text-lg shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1 no-underline hover:no-underline focus:no-underline" > Get Started Now <span className="ml-2 group-hover:translate-x-1 inline-block transition-transform">→</span> </NavLink> <NavLink to="/features/" className="border-2 border-gray-300 text-gray-700 px-8 py-4 rounded-xl font-semibold text-lg hover:border-blue-500 hover:text-blue-600 transition-all duration-300 no-underline hover:no-underline focus:no-underline" > Explore Features </NavLink> </div> </div> </div> {/* Modal for WITHOUT MCP screenshot */} {isWithoutMcpModalOpen && ( <div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50" onClick={() => setIsWithoutMcpModalOpen(false)} > <div className="bg-white rounded-2xl shadow-2xl max-w-5xl max-h-[90vh] overflow-auto" onClick={(e) => e.stopPropagation()} > <div className="sticky top-0 bg-white border-b border-gray-200 px-6 py-4 rounded-t-2xl"> <div className="flex items-center justify-between"> <h3 className="text-xl font-semibold text-gray-900 flex items-center gap-2"> <svg className="w-5 h-5 text-red-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clipRule="evenodd" /> </svg> AI Response Without MCP Server </h3> <button onClick={() => setIsWithoutMcpModalOpen(false)} className="text-gray-400 hover:text-gray-600 transition-colors" aria-label="Close modal" > <svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" /> </svg> </button> </div> </div> <div className="p-6"> <div className="mb-6 relative"> <div className="relative overflow-hidden rounded-lg shadow-lg border border-gray-200"> <img ref={imageRef1} src="/explain-product-pricing-methods-no-mcp.png" alt="AI response without MCP server - generic and potentially inaccurate information" className="w-full h-auto cursor-crosshair" onMouseMove={handleMouseMove1} onMouseEnter={handleMouseEnter1} onMouseLeave={handleMouseLeave1} /> {/* Zoom circle */} {isZooming1 && ( <div className="absolute pointer-events-none border-4 border-white shadow-lg rounded-full overflow-hidden" style={{ width: '300px', height: '300px', left: `${zoomPosition1.x - 150}px`, top: `${zoomPosition1.y - 150}px`, backgroundImage: `url('/explain-product-pricing-methods-no-mcp.png')`, backgroundSize: `${imageRef1.current ? imageRef1.current.offsetWidth * 2 : 0}px ${imageRef1.current ? imageRef1.current.offsetHeight * 2 : 0}px`, backgroundPosition: `-${zoomPosition1.x * 2 - 150}px -${zoomPosition1.y * 2 - 150}px`, backgroundRepeat: 'no-repeat', transform: 'translate(0, 0)', zIndex: 1000 }} > <div className="absolute inset-0 ring-2 ring-red-500 ring-opacity-50 rounded-full"></div> </div> )} </div> </div> <div className="bg-red-50 border border-red-200 rounded-xl p-6"> <h4 className="text-lg font-semibold text-red-900 mb-4 flex items-center gap-2"> <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clipRule="evenodd" /> </svg> Problems with This Response </h4> <div className="space-y-4"> <div className="p-4 bg-white border border-red-300 rounded-lg"> <p className="font-semibold text-red-800 mb-2">🎯 Wrong API Usage:</p> <p className="text-sm text-red-700"> Suggests non-existent methods like <code className="bg-red-200 px-1 rounded font-mono">product.getVariant('variant-id')</code> and shows client-side fetch to non-standard endpoints. These approaches don't exist in SFCC and would cause runtime errors in production. </p> </div> <div className="p-4 bg-white border border-red-300 rounded-lg"> <p className="font-semibold text-red-800 mb-2">📚 Outdated Patterns:</p> <p className="text-sm text-red-700"> Shows generic client-side fetch patterns to non-standard endpoints like <code className="bg-red-200 px-1 rounded font-mono">/on/demandware.store/Sites-SiteGenesis-Site/</code> instead of current SFRA controller patterns. This leads developers down the wrong implementation path. </p> </div> <div className="p-4 bg-white border border-red-300 rounded-lg"> <p className="font-semibold text-red-800 mb-2">🤔 Generic Assumptions:</p> <p className="text-sm text-red-700"> Makes assumptions about SFCC architecture without understanding the actual API structure. Provides general e-commerce patterns that don't align with SFCC's specific implementation. </p> </div> <div className="grid md:grid-cols-2 gap-4"> <div> <h5 className="font-semibold text-red-800 mb-2">Other Issues:</h5> <ul className="text-sm text-red-700 space-y-1"> <li>Non-existent API methods suggested</li> <li>Generic client-side fetch patterns</li> <li>Broken endpoint examples</li> <li>Generic assumptions about SFCC</li> </ul> </div> <div> <h5 className="font-semibold text-red-800 mb-2">Developer Impact:</h5> <ul className="text-sm text-red-700 space-y-1"> <li>Runtime errors from wrong API calls</li> <li>Time wasted on deprecated patterns</li> <li>Following incorrect implementation paths</li> <li>Loss of confidence in AI guidance</li> </ul> </div> </div> </div> </div> </div> </div> </div> )} {/* Modal for WITH MCP screenshot */} {isWithMcpModalOpen && ( <div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50" onClick={() => setIsWithMcpModalOpen(false)} > <div className="bg-white rounded-2xl shadow-2xl max-w-5xl max-h-[90vh] overflow-auto" onClick={(e) => e.stopPropagation()} > <div className="sticky top-0 bg-white border-b border-gray-200 px-6 py-4 rounded-t-2xl"> <div className="flex items-center justify-between"> <h3 className="text-xl font-semibold text-gray-900 flex items-center gap-2"> <svg className="w-5 h-5 text-green-600" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> AI Response With MCP Server </h3> <button onClick={() => setIsWithMcpModalOpen(false)} className="text-gray-400 hover:text-gray-600 transition-colors" aria-label="Close modal" > <svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" /> </svg> </button> </div> </div> <div className="p-6"> <div className="mb-6 relative"> <div className="relative overflow-hidden rounded-lg shadow-lg border border-gray-200"> <img ref={imageRef2} src="/explain-product-pricing-methods.png" alt="AI response with MCP server - accurate SFCC-specific information and code examples" className="w-full h-auto cursor-crosshair" onMouseMove={handleMouseMove2} onMouseEnter={handleMouseEnter2} onMouseLeave={handleMouseLeave2} /> {/* Zoom circle */} {isZooming2 && ( <div className="absolute pointer-events-none border-4 border-white shadow-lg rounded-full overflow-hidden" style={{ width: '300px', height: '300px', left: `${zoomPosition2.x - 150}px`, top: `${zoomPosition2.y - 150}px`, backgroundImage: `url('/explain-product-pricing-methods.png')`, backgroundSize: `${imageRef2.current ? imageRef2.current.offsetWidth * 2 : 0}px ${imageRef2.current ? imageRef2.current.offsetHeight * 2 : 0}px`, backgroundPosition: `-${zoomPosition2.x * 2 - 150}px -${zoomPosition2.y * 2 - 150}px`, backgroundRepeat: 'no-repeat', transform: 'translate(0, 0)', zIndex: 1000 }} > <div className="absolute inset-0 ring-2 ring-green-500 ring-opacity-50 rounded-full"></div> </div> )} </div> </div> <div className="bg-green-50 border border-green-200 rounded-xl p-6"> <h4 className="text-lg font-semibold text-green-900 mb-4 flex items-center gap-2"> <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"> <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" /> </svg> Why This Response is Accurate </h4> <div className="space-y-4"> <div className="p-4 bg-white border border-green-300 rounded-lg"> <p className="font-semibold text-green-800 mb-2">✅ Accurate SFCC Implementation:</p> <p className="text-sm text-green-700"> The AI correctly uses <code className="bg-green-200 px-1 rounded font-mono">ProductMgr.getProduct()</code> and <code className="bg-green-200 px-1 rounded font-mono">getPriceModel().getPrice()</code> with proper syntax. It also mentions the correct <code className="bg-green-200 px-1 rounded font-mono">Money</code> object return type and <code className="bg-green-200 px-1 rounded font-mono">toFormattedString()</code> method. </p> </div> <div className="p-4 bg-white border border-green-300 rounded-lg"> <p className="font-semibold text-green-800 mb-2">🔍 Comprehensive Context:</p> <p className="text-sm text-green-700"> Explains important details like <code className="bg-green-200 px-1 rounded font-mono">Money.NOT_AVAILABLE</code> handling, quantity-based pricing options, and <code className="bg-green-200 px-1 rounded font-mono">getPriceInfo()</code> for additional price book details. Shows understanding of SFCC pricing architecture. </p> </div> <div className="p-4 bg-white border border-green-300 rounded-lg"> <p className="font-semibold text-green-800 mb-2">🎯 Real-World Ready:</p> <p className="text-sm text-green-700"> Code examples are production-ready and follow current SFRA patterns. The AI shows MCP server integration by using actual SFCC documentation tools during the response. </p> </div> <div className="grid md:grid-cols-2 gap-4"> <div> <h5 className="font-semibold text-green-800 mb-2">Key Benefits:</h5> <ul className="text-sm text-green-700 space-y-1"> <li>Syntactically correct SFCC code</li> <li>Proper ProductPriceModel usage</li> <li>Current SFRA best practices</li> <li>Real-time documentation access</li> </ul> </div> <div> <h5 className="font-semibold text-green-800 mb-2">Developer Impact:</h5> <ul className="text-sm text-green-700 space-y-1"> <li>Copy-paste ready code examples</li> <li>Production-ready implementations</li> <li>Comprehensive error handling info</li> <li>Advanced API usage patterns</li> </ul> </div> </div> </div> </div> </div> </div> </div> )} </div> ); }; export default HomePage; ``` -------------------------------------------------------------------------------- /tests/mcp/yaml/get-sfcc-class-documentation.full-mode.test.mcp.yml: -------------------------------------------------------------------------------- ```yaml # ================================================================================== # SFCC MCP Server - get_sfcc_class_documentation Tool YAML Tests # Comprehensive testing for SFCC class documentation retrieval functionality # Tests both successful responses and error handling scenarios # # Quick Test Commands: # aegis "tests/mcp/yaml/get-sfcc-class-documentation.full-mode.test.mcp.yml" --config "aegis.config.with-dw.json" --verbose # aegis "tests/mcp/yaml/get-sfcc-class-documentation.full-mode.test.mcp.yml" --config "aegis.config.with-dw.json" --debug --timing # aegis query get_sfcc_class_documentation '{"className": "dw.catalog.Product"}' --config "aegis.config.with-dw.json" # aegis query get_sfcc_class_documentation '{"className": "dw.order.Order"}' --config "aegis.config.with-dw.json" # ================================================================================== description: "SFCC MCP Server get_sfcc_class_documentation tool - comprehensive validation" # ================================================================================== # BASIC TOOL STRUCTURE VALIDATION # ================================================================================== tests: - it: "should list get_sfcc_class_documentation tool in available tools" request: jsonrpc: "2.0" id: "tool-available" method: "tools/list" params: {} expect: response: jsonrpc: "2.0" id: "tool-available" result: match:extractField: "tools.*.name" value: "match:arrayContains:get_sfcc_class_documentation" stderr: "toBeEmpty" - it: "should have get_sfcc_class_documentation in tools list with proper structure" request: jsonrpc: "2.0" id: "tool-metadata" method: "tools/list" params: {} expect: response: jsonrpc: "2.0" id: "tool-metadata" result: tools: "match:arrayContains:name:get_sfcc_class_documentation" stderr: "toBeEmpty" - it: "should have tool with meaningful description" request: jsonrpc: "2.0" id: "tool-description-quality" method: "tools/list" params: {} expect: response: jsonrpc: "2.0" id: "tool-description-quality" result: tools: match:arrayElements: match:partial: name: "match:type:string" description: "match:regex:.{20,}" # At least 20 characters stderr: "toBeEmpty" - it: "should have proper inputSchema structure for get_sfcc_class_documentation" request: jsonrpc: "2.0" id: "tool-schema-structure" method: "tools/list" params: {} expect: response: jsonrpc: "2.0" id: "tool-schema-structure" result: tools: match:arrayElements: match:partial: name: "match:type:string" inputSchema: type: "object" properties: "match:type:object" stderr: "toBeEmpty" # ================================================================================== # SUCCESSFUL EXECUTION TESTS - CORE CLASSES # ================================================================================== - it: "should execute with dw.catalog.Product class" request: jsonrpc: "2.0" id: "exec-product-basic" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "exec-product-basic" result: content: - type: "text" text: "match:contains:## Package: dw.catalog" isError: false stderr: "toBeEmpty" - it: "should return complete documentation for dw.catalog.Product" request: jsonrpc: "2.0" id: "exec-product-complete" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "exec-product-complete" result: content: - type: "text" text: "match:contains:# Class Product" isError: false stderr: "toBeEmpty" - it: "should include inheritance hierarchy in Product documentation" request: jsonrpc: "2.0" id: "exec-product-inheritance" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "exec-product-inheritance" result: content: - type: "text" text: "match:contains:## Inheritance Hierarchy" isError: false stderr: "toBeEmpty" - it: "should include properties section in Product documentation" request: jsonrpc: "2.0" id: "exec-product-properties" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "exec-product-properties" result: content: - type: "text" text: "match:contains:## Properties" isError: false stderr: "toBeEmpty" - it: "should include method summary in Product documentation" request: jsonrpc: "2.0" id: "exec-product-methods" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "exec-product-methods" result: content: - type: "text" text: "match:contains:## Method Summary" isError: false stderr: "toBeEmpty" - it: "should include method details in Product documentation" request: jsonrpc: "2.0" id: "exec-product-method-details" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "exec-product-method-details" result: content: - type: "text" text: "match:contains:## Method Details" isError: false stderr: "toBeEmpty" # ================================================================================== # CLASS NAME VARIATIONS TESTING # ================================================================================== - it: "should work with fully qualified class names" request: jsonrpc: "2.0" id: "exec-fqn" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "exec-fqn" result: content: - type: "text" text: "match:contains:dw.catalog.Product" isError: false stderr: "toBeEmpty" - it: "should work with dw.order.Order class" request: jsonrpc: "2.0" id: "exec-order-class" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.Order" expect: response: jsonrpc: "2.0" id: "exec-order-class" result: content: - type: "text" text: "match:contains:## Package: dw.order" isError: false stderr: "toBeEmpty" - it: "should work with dw.system.Site class" request: jsonrpc: "2.0" id: "exec-site-class" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.system.Site" expect: response: jsonrpc: "2.0" id: "exec-site-class" result: content: - type: "text" text: "match:contains:# Class Site" isError: false stderr: "toBeEmpty" - it: "should work with dw.customer.Customer class" request: jsonrpc: "2.0" id: "exec-customer-class" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.customer.Customer" expect: response: jsonrpc: "2.0" id: "exec-customer-class" result: content: - type: "text" text: "match:contains:dw.customer.Customer" isError: false stderr: "toBeEmpty" # ================================================================================== # CORE SFCC CLASSES VALIDATION - TOP 15 MOST IMPORTANT CLASSES # ================================================================================== - it: "should return documentation for dw.catalog.Catalog class" request: jsonrpc: "2.0" id: "core-catalog" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Catalog" expect: response: jsonrpc: "2.0" id: "core-catalog" result: content: - type: "text" text: "match:contains:# Class Catalog" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.catalog.Category class" request: jsonrpc: "2.0" id: "core-category" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Category" expect: response: jsonrpc: "2.0" id: "core-category" result: content: - type: "text" text: "match:contains:## Package: dw.catalog" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.order.Basket class" request: jsonrpc: "2.0" id: "core-basket" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.Basket" expect: response: jsonrpc: "2.0" id: "core-basket" result: content: - type: "text" text: "match:contains:# Class Basket" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.order.ProductLineItem class" request: jsonrpc: "2.0" id: "core-lineitem" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.ProductLineItem" expect: response: jsonrpc: "2.0" id: "core-lineitem" result: content: - type: "text" text: "match:contains:ProductLineItem" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.customer.CustomerMgr class" request: jsonrpc: "2.0" id: "core-customermgr" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.customer.CustomerMgr" expect: response: jsonrpc: "2.0" id: "core-customermgr" result: content: - type: "text" text: "match:contains:CustomerMgr" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.system.Session class" request: jsonrpc: "2.0" id: "core-session" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.system.Session" expect: response: jsonrpc: "2.0" id: "core-session" result: content: - type: "text" text: "match:contains:# Class Session" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.system.Request class" request: jsonrpc: "2.0" id: "core-request" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.system.Request" expect: response: jsonrpc: "2.0" id: "core-request" result: content: - type: "text" text: "match:contains:## Package: dw.system" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.system.Response class" request: jsonrpc: "2.0" id: "core-response" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.system.Response" expect: response: jsonrpc: "2.0" id: "core-response" result: content: - type: "text" text: "match:contains:# Class Response" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.web.URLUtils class" request: jsonrpc: "2.0" id: "core-urlutils" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.web.URLUtils" expect: response: jsonrpc: "2.0" id: "core-urlutils" result: content: - type: "text" text: "match:contains:URLUtils" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.catalog.ProductMgr class" request: jsonrpc: "2.0" id: "core-productmgr" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.ProductMgr" expect: response: jsonrpc: "2.0" id: "core-productmgr" result: content: - type: "text" text: "match:contains:ProductMgr" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.order.OrderMgr class" request: jsonrpc: "2.0" id: "core-ordermgr" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.OrderMgr" expect: response: jsonrpc: "2.0" id: "core-ordermgr" result: content: - type: "text" text: "match:contains:# Class OrderMgr" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.order.BasketMgr class" request: jsonrpc: "2.0" id: "core-basketmgr" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.BasketMgr" expect: response: jsonrpc: "2.0" id: "core-basketmgr" result: content: - type: "text" text: "match:contains:BasketMgr" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.util.ArrayList class" request: jsonrpc: "2.0" id: "core-arraylist" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.util.ArrayList" expect: response: jsonrpc: "2.0" id: "core-arraylist" result: content: - type: "text" text: "match:contains:ArrayList" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.util.HashMap class" request: jsonrpc: "2.0" id: "core-hashmap" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.util.HashMap" expect: response: jsonrpc: "2.0" id: "core-hashmap" result: content: - type: "text" text: "match:contains:# Class HashMap" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.value.Money class" request: jsonrpc: "2.0" id: "core-money" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.value.Money" expect: response: jsonrpc: "2.0" id: "core-money" result: content: - type: "text" text: "match:contains:## Package: dw.value" isError: false stderr: "toBeEmpty" # ================================================================================== # EXTENDED SFCC CLASSES VALIDATION - 30 ADDITIONAL IMPORTANT CLASSES # ================================================================================== - it: "should return documentation for dw.content.ContentMgr class" request: jsonrpc: "2.0" id: "ext-contentmgr" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.content.ContentMgr" expect: response: jsonrpc: "2.0" id: "ext-contentmgr" result: content: - type: "text" text: "match:contains:ContentMgr" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.content.Content class" request: jsonrpc: "2.0" id: "ext-content" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.content.Content" expect: response: jsonrpc: "2.0" id: "ext-content" result: content: - type: "text" text: "match:contains:# Class Content" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.catalog.ProductSearchModel class" request: jsonrpc: "2.0" id: "ext-productsearch" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.ProductSearchModel" expect: response: jsonrpc: "2.0" id: "ext-productsearch" result: content: - type: "text" text: "match:contains:ProductSearchModel" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.catalog.SearchModel class" request: jsonrpc: "2.0" id: "ext-searchmodel" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.SearchModel" expect: response: jsonrpc: "2.0" id: "ext-searchmodel" result: content: - type: "text" text: "match:contains:SearchModel" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.catalog.PriceBook class" request: jsonrpc: "2.0" id: "ext-pricebook" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.PriceBook" expect: response: jsonrpc: "2.0" id: "ext-pricebook" result: content: - type: "text" text: "match:contains:PriceBook" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.catalog.Variant class" request: jsonrpc: "2.0" id: "ext-variant" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Variant" expect: response: jsonrpc: "2.0" id: "ext-variant" result: content: - type: "text" text: "match:contains:# Class Variant" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.order.PaymentInstrument class" request: jsonrpc: "2.0" id: "ext-paymentinstrument" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.PaymentInstrument" expect: response: jsonrpc: "2.0" id: "ext-paymentinstrument" result: content: - type: "text" text: "match:contains:PaymentInstrument" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.order.Shipment class" request: jsonrpc: "2.0" id: "ext-shipment" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.Shipment" expect: response: jsonrpc: "2.0" id: "ext-shipment" result: content: - type: "text" text: "match:contains:# Class Shipment" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.order.ShippingMethod class" request: jsonrpc: "2.0" id: "ext-shippingmethod" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.ShippingMethod" expect: response: jsonrpc: "2.0" id: "ext-shippingmethod" result: content: - type: "text" text: "match:contains:ShippingMethod" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.customer.CustomerGroup class" request: jsonrpc: "2.0" id: "ext-customergroup" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.customer.CustomerGroup" expect: response: jsonrpc: "2.0" id: "ext-customergroup" result: content: - type: "text" text: "match:contains:CustomerGroup" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.customer.Profile class" request: jsonrpc: "2.0" id: "ext-profile" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.customer.Profile" expect: response: jsonrpc: "2.0" id: "ext-profile" result: content: - type: "text" text: "match:contains:# Class Profile" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.system.Logger class" request: jsonrpc: "2.0" id: "ext-logger" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.system.Logger" expect: response: jsonrpc: "2.0" id: "ext-logger" result: content: - type: "text" text: "match:contains:# Class Logger" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.system.Transaction class" request: jsonrpc: "2.0" id: "ext-transaction" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.system.Transaction" expect: response: jsonrpc: "2.0" id: "ext-transaction" result: content: - type: "text" text: "match:contains:Transaction" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.web.Cookie class" request: jsonrpc: "2.0" id: "ext-cookie" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.web.Cookie" expect: response: jsonrpc: "2.0" id: "ext-cookie" result: content: - type: "text" text: "match:contains:# Class Cookie" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.web.Resource class" request: jsonrpc: "2.0" id: "ext-resource" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.web.Resource" expect: response: jsonrpc: "2.0" id: "ext-resource" result: content: - type: "text" text: "match:contains:Resource" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.web.Form class" request: jsonrpc: "2.0" id: "ext-form" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.web.Form" expect: response: jsonrpc: "2.0" id: "ext-form" result: content: - type: "text" text: "match:contains:# Class Form" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.util.Collection class" request: jsonrpc: "2.0" id: "ext-collection" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.util.Collection" expect: response: jsonrpc: "2.0" id: "ext-collection" result: content: - type: "text" text: "match:contains:Collection" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.util.Iterator class" request: jsonrpc: "2.0" id: "ext-iterator" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.util.Iterator" expect: response: jsonrpc: "2.0" id: "ext-iterator" result: content: - type: "text" text: "match:contains:Iterator" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.util.Calendar class" request: jsonrpc: "2.0" id: "ext-calendar" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.util.Calendar" expect: response: jsonrpc: "2.0" id: "ext-calendar" result: content: - type: "text" text: "match:contains:# Class Calendar" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.value.Quantity class" request: jsonrpc: "2.0" id: "ext-quantity" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.value.Quantity" expect: response: jsonrpc: "2.0" id: "ext-quantity" result: content: - type: "text" text: "match:contains:Quantity" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.net.HTTPClient class" request: jsonrpc: "2.0" id: "ext-httpclient" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.net.HTTPClient" expect: response: jsonrpc: "2.0" id: "ext-httpclient" result: content: - type: "text" text: "match:contains:HTTPClient" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.net.Mail class" request: jsonrpc: "2.0" id: "ext-mail" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.net.Mail" expect: response: jsonrpc: "2.0" id: "ext-mail" result: content: - type: "text" text: "match:contains:# Class Mail" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.io.File class" request: jsonrpc: "2.0" id: "ext-file" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.io.File" expect: response: jsonrpc: "2.0" id: "ext-file" result: content: - type: "text" text: "match:contains:# Class File" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.io.Reader class" request: jsonrpc: "2.0" id: "ext-reader" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.io.Reader" expect: response: jsonrpc: "2.0" id: "ext-reader" result: content: - type: "text" text: "match:contains:Reader" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.svc.ServiceRegistry class" request: jsonrpc: "2.0" id: "ext-serviceregistry" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.svc.ServiceRegistry" expect: response: jsonrpc: "2.0" id: "ext-serviceregistry" result: content: - type: "text" text: "match:contains:ServiceRegistry" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.svc.HTTPService class" request: jsonrpc: "2.0" id: "ext-httpservice" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.svc.HTTPService" expect: response: jsonrpc: "2.0" id: "ext-httpservice" result: content: - type: "text" text: "match:contains:HTTPService" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.campaign.Campaign class" request: jsonrpc: "2.0" id: "ext-campaign" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.campaign.Campaign" expect: response: jsonrpc: "2.0" id: "ext-campaign" result: content: - type: "text" text: "match:contains:# Class Campaign" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.campaign.Promotion class" request: jsonrpc: "2.0" id: "ext-promotion" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.campaign.Promotion" expect: response: jsonrpc: "2.0" id: "ext-promotion" result: content: - type: "text" text: "match:contains:Promotion" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.object.CustomObject class" request: jsonrpc: "2.0" id: "ext-customobject" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.object.CustomObject" expect: response: jsonrpc: "2.0" id: "ext-customobject" result: content: - type: "text" text: "match:contains:CustomObject" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.object.CustomObjectMgr class" request: jsonrpc: "2.0" id: "ext-customobjectmgr" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.object.CustomObjectMgr" expect: response: jsonrpc: "2.0" id: "ext-customobjectmgr" result: content: - type: "text" text: "match:contains:CustomObjectMgr" isError: false stderr: "toBeEmpty" # ================================================================================== # ADVANCED SFCC CLASSES VALIDATION - 30 MORE SPECIALIZED CLASSES # ================================================================================== - it: "should return documentation for dw.catalog.CatalogMgr class" request: jsonrpc: "2.0" id: "adv-catalogmgr" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.CatalogMgr" expect: response: jsonrpc: "2.0" id: "adv-catalogmgr" result: content: - type: "text" text: "match:contains:CatalogMgr" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.catalog.ProductOption class" request: jsonrpc: "2.0" id: "adv-productoption" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.ProductOption" expect: response: jsonrpc: "2.0" id: "adv-productoption" result: content: - type: "text" text: "match:contains:ProductOption" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.catalog.ProductOptionModel class" request: jsonrpc: "2.0" id: "adv-productoptionmodel" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.ProductOptionModel" expect: response: jsonrpc: "2.0" id: "adv-productoptionmodel" result: content: - type: "text" text: "match:contains:ProductOptionModel" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.catalog.Recommendation class" request: jsonrpc: "2.0" id: "adv-recommendation" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Recommendation" expect: response: jsonrpc: "2.0" id: "adv-recommendation" result: content: - type: "text" text: "match:contains:# Class Recommendation" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.catalog.ProductAttributeModel class" request: jsonrpc: "2.0" id: "adv-productattributemodel" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.ProductAttributeModel" expect: response: jsonrpc: "2.0" id: "adv-productattributemodel" result: content: - type: "text" text: "match:contains:ProductAttributeModel" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.order.LineItem class" request: jsonrpc: "2.0" id: "adv-lineitem" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.LineItem" expect: response: jsonrpc: "2.0" id: "adv-lineitem" result: content: - type: "text" text: "match:contains:# Class LineItem" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.order.OrderAddress class" request: jsonrpc: "2.0" id: "adv-orderaddress" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.OrderAddress" expect: response: jsonrpc: "2.0" id: "adv-orderaddress" result: content: - type: "text" text: "match:contains:OrderAddress" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.order.PaymentMethod class" request: jsonrpc: "2.0" id: "adv-paymentmethod" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.PaymentMethod" expect: response: jsonrpc: "2.0" id: "adv-paymentmethod" result: content: - type: "text" text: "match:contains:PaymentMethod" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.order.PaymentMgr class" request: jsonrpc: "2.0" id: "adv-paymentmgr" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.PaymentMgr" expect: response: jsonrpc: "2.0" id: "adv-paymentmgr" result: content: - type: "text" text: "match:contains:PaymentMgr" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.order.ShippingMgr class" request: jsonrpc: "2.0" id: "adv-shippingmgr" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.ShippingMgr" expect: response: jsonrpc: "2.0" id: "adv-shippingmgr" result: content: - type: "text" text: "match:contains:ShippingMgr" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.customer.AddressBook class" request: jsonrpc: "2.0" id: "adv-addressbook" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.customer.AddressBook" expect: response: jsonrpc: "2.0" id: "adv-addressbook" result: content: - type: "text" text: "match:contains:AddressBook" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.customer.CustomerAddress class" request: jsonrpc: "2.0" id: "adv-customeraddress" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.customer.CustomerAddress" expect: response: jsonrpc: "2.0" id: "adv-customeraddress" result: content: - type: "text" text: "match:contains:CustomerAddress" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.customer.CustomerPaymentInstrument class" request: jsonrpc: "2.0" id: "adv-custpaymentinstrument" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.customer.CustomerPaymentInstrument" expect: response: jsonrpc: "2.0" id: "adv-custpaymentinstrument" result: content: - type: "text" text: "match:contains:CustomerPaymentInstrument" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.customer.Wallet class" request: jsonrpc: "2.0" id: "adv-wallet" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.customer.Wallet" expect: response: jsonrpc: "2.0" id: "adv-wallet" result: content: - type: "text" text: "match:contains:# Class Wallet" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.system.Pipeline class" request: jsonrpc: "2.0" id: "adv-pipeline" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.system.Pipeline" expect: response: jsonrpc: "2.0" id: "adv-pipeline" result: content: - type: "text" text: "match:contains:Pipeline" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.system.HookMgr class" request: jsonrpc: "2.0" id: "adv-hookmgr" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.system.HookMgr" expect: response: jsonrpc: "2.0" id: "adv-hookmgr" result: content: - type: "text" text: "match:contains:HookMgr" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.system.CacheMgr class" request: jsonrpc: "2.0" id: "adv-cachemgr" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.system.CacheMgr" expect: response: jsonrpc: "2.0" id: "adv-cachemgr" result: content: - type: "text" text: "match:contains:CacheMgr" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.web.Forms class" request: jsonrpc: "2.0" id: "adv-forms" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.web.Forms" expect: response: jsonrpc: "2.0" id: "adv-forms" result: content: - type: "text" text: "match:contains:# Class Forms" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.web.PageMetaData class" request: jsonrpc: "2.0" id: "adv-pagemetadata" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.web.PageMetaData" expect: response: jsonrpc: "2.0" id: "adv-pagemetadata" result: content: - type: "text" text: "match:contains:PageMetaData" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.web.PagingModel class" request: jsonrpc: "2.0" id: "adv-pagingmodel" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.web.PagingModel" expect: response: jsonrpc: "2.0" id: "adv-pagingmodel" result: content: - type: "text" text: "match:contains:PagingModel" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.util.StringUtils class" request: jsonrpc: "2.0" id: "adv-stringutils" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.util.StringUtils" expect: response: jsonrpc: "2.0" id: "adv-stringutils" result: content: - type: "text" text: "match:contains:StringUtils" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.util.Map class" request: jsonrpc: "2.0" id: "adv-map" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.util.Map" expect: response: jsonrpc: "2.0" id: "adv-map" result: content: - type: "text" text: "match:contains:# Class Map" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.util.Locale class" request: jsonrpc: "2.0" id: "adv-locale" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.util.Locale" expect: response: jsonrpc: "2.0" id: "adv-locale" result: content: - type: "text" text: "match:contains:# Class Locale" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.util.List class" request: jsonrpc: "2.0" id: "adv-list" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.util.List" expect: response: jsonrpc: "2.0" id: "adv-list" result: content: - type: "text" text: "match:contains:# Class List" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.value.EnumValue class" request: jsonrpc: "2.0" id: "adv-enumvalue" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.value.EnumValue" expect: response: jsonrpc: "2.0" id: "adv-enumvalue" result: content: - type: "text" text: "match:contains:EnumValue" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.net.FTPClient class" request: jsonrpc: "2.0" id: "adv-ftpclient" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.net.FTPClient" expect: response: jsonrpc: "2.0" id: "adv-ftpclient" result: content: - type: "text" text: "match:contains:FTPClient" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.net.SFTPClient class" request: jsonrpc: "2.0" id: "adv-sftpclient" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.net.SFTPClient" expect: response: jsonrpc: "2.0" id: "adv-sftpclient" result: content: - type: "text" text: "match:contains:SFTPClient" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.io.CSVStreamWriter class" request: jsonrpc: "2.0" id: "adv-csvstreamwriter" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.io.CSVStreamWriter" expect: response: jsonrpc: "2.0" id: "adv-csvstreamwriter" result: content: - type: "text" text: "match:contains:CSVStreamWriter" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.io.XMLStreamWriter class" request: jsonrpc: "2.0" id: "adv-xmlstreamwriter" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.io.XMLStreamWriter" expect: response: jsonrpc: "2.0" id: "adv-xmlstreamwriter" result: content: - type: "text" text: "match:contains:XMLStreamWriter" isError: false stderr: "toBeEmpty" - it: "should return documentation for dw.system.Status class" request: jsonrpc: "2.0" id: "adv-status" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.system.Status" expect: response: jsonrpc: "2.0" id: "adv-status" result: content: - type: "text" text: "match:contains:# Class Status" isError: false stderr: "toBeEmpty" # ================================================================================== # DOCUMENTATION CONTENT VALIDATION # ================================================================================== - it: "should include class description in Order documentation" request: jsonrpc: "2.0" id: "exec-order-description" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.Order" expect: response: jsonrpc: "2.0" id: "exec-order-description" result: content: - type: "text" text: "match:contains:## Description" isError: false stderr: "toBeEmpty" - it: "should include constants in Order documentation" request: jsonrpc: "2.0" id: "exec-order-constants" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.Order" expect: response: jsonrpc: "2.0" id: "exec-order-constants" result: content: - type: "text" text: "match:contains:## Constants" isError: false stderr: "toBeEmpty" - it: "should include constructor summary in Order documentation" request: jsonrpc: "2.0" id: "exec-order-constructors" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.Order" expect: response: jsonrpc: "2.0" id: "exec-order-constructors" result: content: - type: "text" text: "match:contains:## Constructor Summary" isError: false stderr: "toBeEmpty" - it: "should include method signatures in documentation" request: jsonrpc: "2.0" id: "exec-method-signatures" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "exec-method-signatures" result: content: - type: "text" text: "match:contains:**Signature:**" isError: false stderr: "toBeEmpty" - it: "should include property types in documentation" request: jsonrpc: "2.0" id: "exec-property-types" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "exec-property-types" result: content: - type: "text" text: "match:contains:**Type:**" isError: false stderr: "toBeEmpty" - it: "should include return valid markdown format" request: jsonrpc: "2.0" id: "exec-markdown-format" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "exec-markdown-format" result: content: - type: "text" text: "match:regex:[\\s\\S]*#{1,6}[\\s\\S]*" # Contains markdown headers isError: false stderr: "toBeEmpty" # ================================================================================== # ERROR HANDLING TESTS # ================================================================================== - it: "should handle invalid class names gracefully" request: jsonrpc: "2.0" id: "error-invalid-class" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "NonExistentClass" expect: response: jsonrpc: "2.0" id: "error-invalid-class" result: content: - type: "text" text: "match:contains:Error" isError: true stderr: "toBeEmpty" - it: "should handle invalid class with specific error message" request: jsonrpc: "2.0" id: "error-invalid-specific" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "InvalidClassName" expect: response: jsonrpc: "2.0" id: "error-invalid-specific" result: content: - type: "text" text: "match:contains:not found" isError: true stderr: "toBeEmpty" - it: "should handle empty class name" request: jsonrpc: "2.0" id: "error-empty-class" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "" expect: response: jsonrpc: "2.0" id: "error-empty-class" result: content: - type: "text" text: "match:contains:non-empty string" isError: true stderr: "toBeEmpty" - it: "should handle missing className parameter with error response" request: jsonrpc: "2.0" id: "error-missing-param" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: {} expect: response: jsonrpc: "2.0" id: "error-missing-param" result: content: - type: "text" text: "match:contains:non-empty string" isError: true stderr: "toBeEmpty" - it: "should handle null className gracefully" request: jsonrpc: "2.0" id: "error-null-class" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: null expect: response: jsonrpc: "2.0" id: "error-null-class" result: content: - type: "text" text: "match:contains:Error" isError: true stderr: "toBeEmpty" - it: "should handle numeric className gracefully" request: jsonrpc: "2.0" id: "error-numeric-class" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: 123 expect: response: jsonrpc: "2.0" id: "error-numeric-class" result: content: - type: "text" text: "match:contains:Error" isError: true stderr: "toBeEmpty" # ================================================================================== # EDGE CASE TESTING # ================================================================================== - it: "should handle whitespace-only className" request: jsonrpc: "2.0" id: "edge-whitespace" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: " " expect: response: jsonrpc: "2.0" id: "edge-whitespace" result: content: - type: "text" text: "match:contains:Error" isError: true stderr: "toBeEmpty" - it: "should handle class names with special characters" request: jsonrpc: "2.0" id: "edge-special-chars" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product@#$" expect: response: jsonrpc: "2.0" id: "edge-special-chars" result: content: - type: "text" text: "match:contains:Error" isError: true stderr: "toBeEmpty" - it: "should handle very long invalid class names" request: jsonrpc: "2.0" id: "edge-long-invalid" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.very.long.nonexistent.package.that.does.not.exist.anywhere.InvalidClass" expect: response: jsonrpc: "2.0" id: "edge-long-invalid" result: content: - type: "text" text: "match:contains:Error" isError: true stderr: "toBeEmpty" # ================================================================================== # COMPREHENSIVE CONTENT VALIDATION # ================================================================================== - it: "should return substantial documentation content for Product class" request: jsonrpc: "2.0" id: "content-substantial" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "content-substantial" result: content: - type: "text" text: "match:regex:[\\s\\S]{5000,}" # At least 5000 characters isError: false stderr: "toBeEmpty" - it: "should include multiple sections in complete documentation" request: jsonrpc: "2.0" id: "content-multiple-sections" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "content-multiple-sections" result: content: - type: "text" text: "match:contains:## Properties" isError: false stderr: "toBeEmpty" - it: "should include detailed method information" request: jsonrpc: "2.0" id: "content-method-info" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "content-method-info" result: content: - type: "text" text: "match:contains:**Parameters:**" isError: false stderr: "toBeEmpty" - it: "should include return value information" request: jsonrpc: "2.0" id: "content-return-info" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "content-return-info" result: content: - type: "text" text: "match:contains:**Returns:**" isError: false stderr: "toBeEmpty" # ================================================================================== # PERFORMANCE AND CONSISTENCY VALIDATION # ================================================================================== - it: "should have consistent response structure across different classes" request: jsonrpc: "2.0" id: "consistency-structure" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.Order" expect: response: jsonrpc: "2.0" id: "consistency-structure" result: content: - type: "text" text: "match:type:string" isError: false stderr: "toBeEmpty" - it: "should not include isError field for successful responses" request: jsonrpc: "2.0" id: "success-no-error-flag" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "success-no-error-flag" result: content: "match:type:array" isError: false stderr: "toBeEmpty" # ================================================================================== # PERFORMANCE TIMING TESTS - CI-FRIENDLY # ================================================================================== - it: "should respond within reasonable time for Product class lookup" request: jsonrpc: "2.0" id: "perf-product-timing" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "perf-product-timing" result: content: - type: "text" text: "match:contains:dw.catalog.Product" isError: false performance: maxResponseTime: "500ms" # CI-friendly timeout for documentation lookup stderr: "toBeEmpty" - it: "should respond within reasonable time for Order class lookup" request: jsonrpc: "2.0" id: "perf-order-timing" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.order.Order" expect: response: jsonrpc: "2.0" id: "perf-order-timing" result: content: - type: "text" text: "match:contains:dw.order.Order" isError: false performance: maxResponseTime: "500ms" # CI-friendly timeout for documentation lookup stderr: "toBeEmpty" - it: "should respond within reasonable time for Customer class lookup" request: jsonrpc: "2.0" id: "perf-customer-timing" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.customer.Customer" expect: response: jsonrpc: "2.0" id: "perf-customer-timing" result: content: - type: "text" text: "match:contains:dw.customer.Customer" isError: false performance: maxResponseTime: "500ms" # CI-friendly timeout for documentation lookup stderr: "toBeEmpty" - it: "should handle error cases quickly" request: jsonrpc: "2.0" id: "perf-error-timing" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "NonExistentClass" expect: response: jsonrpc: "2.0" id: "perf-error-timing" result: content: - type: "text" text: "match:contains:Error" isError: true performance: maxResponseTime: "300ms" # Error handling should be faster stderr: "toBeEmpty" - it: "should handle validation errors very quickly" request: jsonrpc: "2.0" id: "perf-validation-timing" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "" expect: response: jsonrpc: "2.0" id: "perf-validation-timing" result: content: - type: "text" text: "match:contains:non-empty string" isError: true performance: maxResponseTime: "200ms" # Validation errors should be very fast stderr: "toBeEmpty" # ================================================================================== # RESPONSE FORMAT VALIDATION # ================================================================================== - it: "should return proper content array structure" request: jsonrpc: "2.0" id: "format-content-array" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "format-content-array" result: content: "match:arrayLength:1" isError: false stderr: "toBeEmpty" - it: "should return content with proper type field" request: jsonrpc: "2.0" id: "format-content-type" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "dw.catalog.Product" expect: response: jsonrpc: "2.0" id: "format-content-type" result: content: - type: "text" text: "match:type:string" isError: false stderr: "toBeEmpty" - it: "should maintain consistent error response format" request: jsonrpc: "2.0" id: "format-error-consistent" method: "tools/call" params: name: "get_sfcc_class_documentation" arguments: className: "InvalidClass" expect: response: jsonrpc: "2.0" id: "format-error-consistent" result: content: - type: "text" text: "match:type:string" isError: true stderr: "toBeEmpty" ```