#
tokens: 44156/50000 5/825 files (page 32/43)
lines: off (toggle) GitHub
raw markdown copy
This is page 32 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/dw_extensions.facebook/FacebookProduct.md:
--------------------------------------------------------------------------------

```markdown
## Package: dw.extensions.facebook

# Class FacebookProduct

## Inheritance Hierarchy

- Object
  - dw.extensions.facebook.FacebookProduct

## Description

Represents a row in the Facebook catalog feed export.

## Constants

### AGE_GROUP_ADULT

**Type:** String = "adult"

Indicates that the product is for adults.

### AGE_GROUP_INFANT

**Type:** String = "infant"

Indicates that the product is for infant children.

### AGE_GROUP_KIDS

**Type:** String = "kids"

Indicates that the product is for children.

### AGE_GROUP_NEWBORN

**Type:** String = "newborn"

Indicates that the product is for newborn children.

### AGE_GROUP_TODDLER

**Type:** String = "toddler"

Indicates that the product is for toddler children.

### AVAILABILITY_AVAILABLE_FOR_ORDER

**Type:** String = "available

Indicates that the product can be ordered for later shipment.

### AVAILABILITY_IN_STOCK

**Type:** String = "in

Indicates that the product is available to ship immediately.

### AVAILABILITY_OUT_OF_STOCK

**Type:** String = "out

Indicates that the product is out of stock.

### AVAILABILITY_PREORDER

**Type:** String = "preorder"

Indicates that the product will be available in the future.

### CONDITION_NEW

**Type:** String = "new"

Indicates that the product is new.

### CONDITION_REFURBISHED

**Type:** String = "refurbished"

Indicates that the product is used but has been refurbished.

### CONDITION_USED

**Type:** String = "used"

Indicates that the product has been used.

### GENDER_FEMALE

**Type:** String = "female"

Indicates that the product is for females.

### GENDER_MALE

**Type:** String = "male"

Indicates that the product is for males.

### GENDER_UNISEX

**Type:** String = "unisex"

Indicates that the product is for both males and females.

### SHIPPING_SIZE_UNIT_CM

**Type:** String = "cm"

Indicates that the product is measured in centimeters.

### SHIPPING_SIZE_UNIT_FT

**Type:** String = "ft"

Indicates that the product is measured in feet.

### SHIPPING_SIZE_UNIT_IN

**Type:** String = "in"

Indicates that the product is measured in inches.

### SHIPPING_SIZE_UNIT_M

**Type:** String = "m"

Indicates that the product is measured in meters.

### SHIPPING_WEIGHT_UNIT_G

**Type:** String = "g"

Indicates that the product is weighed in grams.

### SHIPPING_WEIGHT_UNIT_KG

**Type:** String = "kg"

Indicates that the product is weighed in kilograms.

### SHIPPING_WEIGHT_UNIT_LB

**Type:** String = "lb"

Indicates that the product is weighed in pounds.

### SHIPPING_WEIGHT_UNIT_OZ

**Type:** String = "oz"

Indicates that the product is weighed in ounces.

## Properties

### ageGroup

**Type:** String

The age group for the Facebook product.

### availability

**Type:** String

The availability of the Facebook product.

### brand

**Type:** String

The Facebook brand of the product.

### color

**Type:** String

The Facebook color value label of the product.

### condition

**Type:** String

The condition of the Facebook product.

### customLabel0

**Type:** String

The Facebook custom label 0 value of the product.

### customLabel1

**Type:** String

The Facebook custom label 1 value of the product.

### customLabel2

**Type:** String

The Facebook custom label 2 value of the product.

### customLabel3

**Type:** String

The Facebook custom label 3 value of the product.

### customLabel4

**Type:** String

The Facebook custom label 4 value of the product.

### description

**Type:** String

The description of the Facebook product.

### expirationDate

**Type:** Date

The Facebook expiration date of the product. If the product is expired it will not be shown.

### gender

**Type:** String

The gender for the Facebook product.

### googleProductCategory

**Type:** String

The category of this product in the Google category taxonomy. If the value is longer than 250 characters
 it is truncated.

### gtin

**Type:** String

The Facebook GTIN of the product.

### ID

**Type:** String (Read Only)

The ID of the Facebook product. This is the same as the ID of the Demandware product.

### imageLinks

**Type:** List

A list containing the URLs of the images to show in Facebook for the product.

### itemGroupID

**Type:** String

The ID of the Facebook item group for the product, that is, its master product.

### link

**Type:** URL

The URL of the Demandware storefront link to the product.

### material

**Type:** String

The Facebook material value label of the product.

### mpn

**Type:** String

The Facebook MPN of the product.

### pattern

**Type:** String

The Facebook pattern value label of the product.

### price

**Type:** Money

The price to show in Facebook for the product.

### productType

**Type:** String

The Facebook product type. This is the retailer-defined category of the item.

### salePrice

**Type:** Money

The sale price to show in Facebook for the product.

### salePriceEffectiveDateEnd

**Type:** Date

The end date of the Facebook sale price of the product.

### salePriceEffectiveDateStart

**Type:** Date

The start date of the Facebook sale price of the product.

### shippingHeight

**Type:** Number

The shipping height of the product.

### shippingLength

**Type:** Number

The shipping length of the product.

### shippingSizeUnit

**Type:** String

The shipping size unit of the product.

### shippingWeight

**Type:** Quantity

The shipping weight for the product.

### shippingWidth

**Type:** Number

The shipping width of the product.

### size

**Type:** String

The Facebook size value label of the product.

### title

**Type:** String

The title of the Facebook product.

## Constructor Summary

## Method Summary

### getAgeGroup

**Signature:** `getAgeGroup() : String`

Returns the age group for the Facebook product.

### getAvailability

**Signature:** `getAvailability() : String`

Returns the availability of the Facebook product.

### getBrand

**Signature:** `getBrand() : String`

Returns the Facebook brand of the product.

### getColor

**Signature:** `getColor() : String`

Returns the Facebook color value label of the product.

### getCondition

**Signature:** `getCondition() : String`

Returns the condition of the Facebook product.

### getCustomLabel0

**Signature:** `getCustomLabel0() : String`

Returns the Facebook custom label 0 value of the product.

### getCustomLabel1

**Signature:** `getCustomLabel1() : String`

Returns the Facebook custom label 1 value of the product.

### getCustomLabel2

**Signature:** `getCustomLabel2() : String`

Returns the Facebook custom label 2 value of the product.

### getCustomLabel3

**Signature:** `getCustomLabel3() : String`

Returns the Facebook custom label 3 value of the product.

### getCustomLabel4

**Signature:** `getCustomLabel4() : String`

Returns the Facebook custom label 4 value of the product.

### getDescription

**Signature:** `getDescription() : String`

Returns the description of the Facebook product.

### getExpirationDate

**Signature:** `getExpirationDate() : Date`

Returns the Facebook expiration date of the product.

### getGender

**Signature:** `getGender() : String`

Returns the gender for the Facebook product.

### getGoogleProductCategory

**Signature:** `getGoogleProductCategory() : String`

Returns the category of this product in the Google category taxonomy.

### getGtin

**Signature:** `getGtin() : String`

Returns the Facebook GTIN of the product.

### getID

**Signature:** `getID() : String`

Returns the ID of the Facebook product.

### getImageLinks

**Signature:** `getImageLinks() : List`

Returns a list containing the URLs of the images to show in Facebook for the product.

### getItemGroupID

**Signature:** `getItemGroupID() : String`

Returns the ID of the Facebook item group for the product, that is, its master product.

### getLink

**Signature:** `getLink() : URL`

Returns the URL of the Demandware storefront link to the product.

### getMaterial

**Signature:** `getMaterial() : String`

Returns the Facebook material value label of the product.

### getMpn

**Signature:** `getMpn() : String`

Returns the Facebook MPN of the product.

### getPattern

**Signature:** `getPattern() : String`

Returns the Facebook pattern value label of the product.

### getPrice

**Signature:** `getPrice() : Money`

Returns the price to show in Facebook for the product.

### getProductType

**Signature:** `getProductType() : String`

Returns the Facebook product type.

### getSalePrice

**Signature:** `getSalePrice() : Money`

Returns the sale price to show in Facebook for the product.

### getSalePriceEffectiveDateEnd

**Signature:** `getSalePriceEffectiveDateEnd() : Date`

Returns the end date of the Facebook sale price of the product.

### getSalePriceEffectiveDateStart

**Signature:** `getSalePriceEffectiveDateStart() : Date`

Returns the start date of the Facebook sale price of the product.

### getShippingHeight

**Signature:** `getShippingHeight() : Number`

Returns the shipping height of the product.

### getShippingLength

**Signature:** `getShippingLength() : Number`

Returns the shipping length of the product.

### getShippingSizeUnit

**Signature:** `getShippingSizeUnit() : String`

Returns the shipping size unit of the product.

### getShippingWeight

**Signature:** `getShippingWeight() : Quantity`

Returns the shipping weight for the product.

### getShippingWidth

**Signature:** `getShippingWidth() : Number`

Returns the shipping width of the product.

### getSize

**Signature:** `getSize() : String`

Returns the Facebook size value label of the product.

### getTitle

**Signature:** `getTitle() : String`

Returns the title of the Facebook product.

### setAgeGroup

**Signature:** `setAgeGroup(ageGroup : String) : void`

Sets the age group for the Facebook product.

### setAvailability

**Signature:** `setAvailability(availability : String) : void`

Sets the availability of the Facebook product.

### setBrand

**Signature:** `setBrand(brand : String) : void`

Sets the Facebook brand of the product.

### setColor

**Signature:** `setColor(color : String) : void`

Sets the Facebook color value label of the product.

### setCondition

**Signature:** `setCondition(condition : String) : void`

Sets the condition of the Facebook product.

### setCustomLabel0

**Signature:** `setCustomLabel0(customLabel0 : String) : void`

Sets the Facebook custom label 0 value of the product.

### setCustomLabel1

**Signature:** `setCustomLabel1(customLabel1 : String) : void`

Sets the Facebook custom label 1 value of the product.

### setCustomLabel2

**Signature:** `setCustomLabel2(customLabel2 : String) : void`

Sets the Facebook custom label 2 value of the product.

### setCustomLabel3

**Signature:** `setCustomLabel3(customLabel3 : String) : void`

Sets the Facebook custom label 3 value of the product.

### setCustomLabel4

**Signature:** `setCustomLabel4(customLabel4 : String) : void`

Sets the Facebook custom label 4 value of the product.

### setDescription

**Signature:** `setDescription(description : String) : void`

Sets the description of the Facebook product.

### setExpirationDate

**Signature:** `setExpirationDate(expirationDate : Date) : void`

Sets the Facebook expiration date of the product.

### setGender

**Signature:** `setGender(gender : String) : void`

Sets the gender for the Facebook product.

### setGoogleProductCategory

**Signature:** `setGoogleProductCategory(googleProductCategory : String) : void`

Sets the category of this product in the Google category taxonomy.

### setGtin

**Signature:** `setGtin(gtin : String) : void`

Sets the Facebook GTIN of the product.

### setImageLinks

**Signature:** `setImageLinks(imageLinks : List) : void`

Sets the list of URLs of images to show in Facebook for the product.

### setItemGroupID

**Signature:** `setItemGroupID(itemGroupID : String) : void`

Sets the ID of the Facebook item group for the product, that is, its master product.

### setLink

**Signature:** `setLink(link : URL) : void`

Sets the URL of the Demandware storefront link to the product.

### setMaterial

**Signature:** `setMaterial(material : String) : void`

Sets the Facebook material value label of the product.

### setMpn

**Signature:** `setMpn(mpn : String) : void`

Sets the Facebook MPN of the product.

### setPattern

**Signature:** `setPattern(pattern : String) : void`

Sets the Facebook pattern value label of the product.

### setPrice

**Signature:** `setPrice(price : Money) : void`

Sets the price to show in Facebook for the product.

### setProductType

**Signature:** `setProductType(productType : String) : void`

Sets the Facebook product type.

### setSalePrice

**Signature:** `setSalePrice(salePrice : Money) : void`

Sets the sale price to show in Facebook for the product.

### setSalePriceEffectiveDateEnd

**Signature:** `setSalePriceEffectiveDateEnd(salePriceEffectiveDateEnd : Date) : void`

Sets the end date of the Facebook sale price of the product.

### setSalePriceEffectiveDateStart

**Signature:** `setSalePriceEffectiveDateStart(salePriceEffectiveDateStart : Date) : void`

Sets the start date of the Facebook sale price of the product.

### setShippingHeight

**Signature:** `setShippingHeight(shippingHeight : Number) : void`

Sets the shipping height of the product.

### setShippingLength

**Signature:** `setShippingLength(shippingLength : Number) : void`

Sets the shipping length of the product.

### setShippingSizeUnit

**Signature:** `setShippingSizeUnit(shippingSizeUnit : String) : void`

Sets the shipping size unit of the product.

### setShippingWeight

**Signature:** `setShippingWeight(shippingWeight : Quantity) : void`

Sets the shipping weight for the product.

### setShippingWidth

**Signature:** `setShippingWidth(shippingWidth : Number) : void`

Sets the shipping width of the product.

### setSize

**Signature:** `setSize(size : String) : void`

Sets the Facebook size value label of the product.

### setTitle

**Signature:** `setTitle(title : String) : void`

Sets the title of the Facebook product.

## Method Detail

## Method Details

### getAgeGroup

**Signature:** `getAgeGroup() : String`

**Description:** Returns the age group for the Facebook product.

**Returns:**

product age group

---

### getAvailability

**Signature:** `getAvailability() : String`

**Description:** Returns the availability of the Facebook product.

**Returns:**

product availability

---

### getBrand

**Signature:** `getBrand() : String`

**Description:** Returns the Facebook brand of the product.

**Returns:**

the brand

---

### getColor

**Signature:** `getColor() : String`

**Description:** Returns the Facebook color value label of the product.

**Returns:**

the color value label

---

### getCondition

**Signature:** `getCondition() : String`

**Description:** Returns the condition of the Facebook product.

**Returns:**

product condition

---

### getCustomLabel0

**Signature:** `getCustomLabel0() : String`

**Description:** Returns the Facebook custom label 0 value of the product.

**Returns:**

the custom label 0 value

---

### getCustomLabel1

**Signature:** `getCustomLabel1() : String`

**Description:** Returns the Facebook custom label 1 value of the product.

**Returns:**

the custom label 1 value

---

### getCustomLabel2

**Signature:** `getCustomLabel2() : String`

**Description:** Returns the Facebook custom label 2 value of the product.

**Returns:**

the custom label 2 value

---

### getCustomLabel3

**Signature:** `getCustomLabel3() : String`

**Description:** Returns the Facebook custom label 3 value of the product.

**Returns:**

the custom label 3 value

---

### getCustomLabel4

**Signature:** `getCustomLabel4() : String`

**Description:** Returns the Facebook custom label 4 value of the product.

**Returns:**

the custom label 4 value

---

### getDescription

**Signature:** `getDescription() : String`

**Description:** Returns the description of the Facebook product.

**Returns:**

product description

---

### getExpirationDate

**Signature:** `getExpirationDate() : Date`

**Description:** Returns the Facebook expiration date of the product. If the product is expired it will not be shown.

**Returns:**

the expiration date

---

### getGender

**Signature:** `getGender() : String`

**Description:** Returns the gender for the Facebook product.

**Returns:**

product gender

---

### getGoogleProductCategory

**Signature:** `getGoogleProductCategory() : String`

**Description:** Returns the category of this product in the Google category taxonomy. If the value is longer than 250 characters it is truncated.

**Returns:**

the category of this product in the Google category taxonomy

---

### getGtin

**Signature:** `getGtin() : String`

**Description:** Returns the Facebook GTIN of the product.

**Returns:**

the GTIN

---

### getID

**Signature:** `getID() : String`

**Description:** Returns the ID of the Facebook product. This is the same as the ID of the Demandware product.

**Returns:**

product ID

---

### getImageLinks

**Signature:** `getImageLinks() : List`

**Description:** Returns a list containing the URLs of the images to show in Facebook for the product.

**Returns:**

the URLs of the images

---

### getItemGroupID

**Signature:** `getItemGroupID() : String`

**Description:** Returns the ID of the Facebook item group for the product, that is, its master product.

**Returns:**

the ID of the Facebook item group

---

### getLink

**Signature:** `getLink() : URL`

**Description:** Returns the URL of the Demandware storefront link to the product.

**Returns:**

the URL of the storefront link

---

### getMaterial

**Signature:** `getMaterial() : String`

**Description:** Returns the Facebook material value label of the product.

**Returns:**

the material value label

---

### getMpn

**Signature:** `getMpn() : String`

**Description:** Returns the Facebook MPN of the product.

**Returns:**

the MPN

---

### getPattern

**Signature:** `getPattern() : String`

**Description:** Returns the Facebook pattern value label of the product.

**Returns:**

the pattern value label

---

### getPrice

**Signature:** `getPrice() : Money`

**Description:** Returns the price to show in Facebook for the product.

**Returns:**

the price to show in Facebook

---

### getProductType

**Signature:** `getProductType() : String`

**Description:** Returns the Facebook product type. This is the retailer-defined category of the item.

**Returns:**

the Facebook product type

---

### getSalePrice

**Signature:** `getSalePrice() : Money`

**Description:** Returns the sale price to show in Facebook for the product.

**Returns:**

the sale price to show in Facebook

---

### getSalePriceEffectiveDateEnd

**Signature:** `getSalePriceEffectiveDateEnd() : Date`

**Description:** Returns the end date of the Facebook sale price of the product.

**Returns:**

the end date of the Facebook sale price

---

### getSalePriceEffectiveDateStart

**Signature:** `getSalePriceEffectiveDateStart() : Date`

**Description:** Returns the start date of the Facebook sale price of the product.

**Returns:**

the start date of the Facebook sale price

---

### getShippingHeight

**Signature:** `getShippingHeight() : Number`

**Description:** Returns the shipping height of the product.

**Returns:**

the shipping height

**See Also:**

getShippingLength()
getShippingWidth()
getShippingSizeUnit()

---

### getShippingLength

**Signature:** `getShippingLength() : Number`

**Description:** Returns the shipping length of the product.

**Returns:**

the shipping length

**See Also:**

getShippingWidth()
getShippingHeight()
getShippingSizeUnit()

---

### getShippingSizeUnit

**Signature:** `getShippingSizeUnit() : String`

**Description:** Returns the shipping size unit of the product.

**Returns:**

the shipping size unit

**See Also:**

getShippingLength()
getShippingWidth()
getShippingHeight()

---

### getShippingWeight

**Signature:** `getShippingWeight() : Quantity`

**Description:** Returns the shipping weight for the product.

**Returns:**

the shipping weight

---

### getShippingWidth

**Signature:** `getShippingWidth() : Number`

**Description:** Returns the shipping width of the product.

**Returns:**

the shipping width

**See Also:**

getShippingLength()
getShippingHeight()
getShippingSizeUnit()

---

### getSize

**Signature:** `getSize() : String`

**Description:** Returns the Facebook size value label of the product.

**Returns:**

the size value label

---

### getTitle

**Signature:** `getTitle() : String`

**Description:** Returns the title of the Facebook product.

**Returns:**

product title

---

### setAgeGroup

**Signature:** `setAgeGroup(ageGroup : String) : void`

**Description:** Sets the age group for the Facebook product. Possible values are AGE_GROUP_ADULT, AGE_GROUP_INFANT, AGE_GROUP_KIDS, AGE_GROUP_NEWBORN, AGE_GROUP_TODDLER, or null.

**Parameters:**

- `ageGroup`: the ageGroup to set for this product

---

### setAvailability

**Signature:** `setAvailability(availability : String) : void`

**Description:** Sets the availability of the Facebook product. Possible values are AVAILABILITY_AVAILABLE_FOR_ORDER, AVAILABILITY_IN_STOCK, AVAILABILITY_OUT_OF_STOCK, or AVAILABILITY_PREORDER

**Parameters:**

- `availability`: the availability status to set for this product

---

### setBrand

**Signature:** `setBrand(brand : String) : void`

**Description:** Sets the Facebook brand of the product. If the value is longer than 70 characters it is truncated.

**Parameters:**

- `brand`: Facebook brand, up to 70 characters

---

### setColor

**Signature:** `setColor(color : String) : void`

**Description:** Sets the Facebook color value label of the product. If the value is longer than 100 characters it is truncated.

**Parameters:**

- `color`: Facebook color value label, up to 100 characters

---

### setCondition

**Signature:** `setCondition(condition : String) : void`

**Description:** Sets the condition of the Facebook product. Possible values are CONDITION_NEW, CONDITION_REFURBISHED, or CONDITION_USED.

**Parameters:**

- `condition`: the condition status to set for this product

---

### setCustomLabel0

**Signature:** `setCustomLabel0(customLabel0 : String) : void`

**Description:** Sets the Facebook custom label 0 value of the product.

**Parameters:**

- `customLabel0`: custom label 0 value

---

### setCustomLabel1

**Signature:** `setCustomLabel1(customLabel1 : String) : void`

**Description:** Sets the Facebook custom label 1 value of the product.

**Parameters:**

- `customLabel1`: custom label 1 value

---

### setCustomLabel2

**Signature:** `setCustomLabel2(customLabel2 : String) : void`

**Description:** Sets the Facebook custom label 2 value of the product.

**Parameters:**

- `customLabel2`: custom label 2 value

---

### setCustomLabel3

**Signature:** `setCustomLabel3(customLabel3 : String) : void`

**Description:** Sets the Facebook custom label 3 value of the product.

**Parameters:**

- `customLabel3`: custom label 3 value

---

### setCustomLabel4

**Signature:** `setCustomLabel4(customLabel4 : String) : void`

**Description:** Sets the Facebook custom label 4 value of the product.

**Parameters:**

- `customLabel4`: custom label 4 value

---

### setDescription

**Signature:** `setDescription(description : String) : void`

**Description:** Sets the description of the Facebook product. If the value is longer than 5000 characters it is truncated.

**Parameters:**

- `description`: product description, up to 5000 characters

---

### setExpirationDate

**Signature:** `setExpirationDate(expirationDate : Date) : void`

**Description:** Sets the Facebook expiration date of the product.

**Parameters:**

- `expirationDate`: Facebook expiration date

---

### setGender

**Signature:** `setGender(gender : String) : void`

**Description:** Sets the gender for the Facebook product. Possible values are GENDER_MALE, GENDER_FEMALE, GENDER_UNISEX, or null.

**Parameters:**

- `gender`: the gender to set for this product

---

### setGoogleProductCategory

**Signature:** `setGoogleProductCategory(googleProductCategory : String) : void`

**Description:** Sets the category of this product in the Google category taxonomy.

**Parameters:**

- `googleProductCategory`: Google product category

---

### setGtin

**Signature:** `setGtin(gtin : String) : void`

**Description:** Sets the Facebook GTIN of the product. If the value is longer than 70 characters it is truncated.

**Parameters:**

- `gtin`: Facebook GTIN, up to 70 characters

---

### setImageLinks

**Signature:** `setImageLinks(imageLinks : List) : void`

**Description:** Sets the list of URLs of images to show in Facebook for the product.

**Parameters:**

- `imageLinks`: links to the product images

---

### setItemGroupID

**Signature:** `setItemGroupID(itemGroupID : String) : void`

**Description:** Sets the ID of the Facebook item group for the product, that is, its master product.

**Parameters:**

- `itemGroupID`: ID of Facebook item group

---

### setLink

**Signature:** `setLink(link : URL) : void`

**Description:** Sets the URL of the Demandware storefront link to the product.

**Parameters:**

- `link`: Demandware storefront link to the product

---

### setMaterial

**Signature:** `setMaterial(material : String) : void`

**Description:** Sets the Facebook material value label of the product. If the value is longer than 200 characters it is truncated.

**Parameters:**

- `material`: Facebook material value label, up to 200 characters

---

### setMpn

**Signature:** `setMpn(mpn : String) : void`

**Description:** Sets the Facebook MPN of the product. If the value is longer than 70 characters it is truncated.

**Parameters:**

- `mpn`: Facebook MPN, up to 70 characters

---

### setPattern

**Signature:** `setPattern(pattern : String) : void`

**Description:** Sets the Facebook pattern value label of the product. If the value is longer than 100 characters it is truncated.

**Parameters:**

- `pattern`: Facebook pattern value label, up to 100 characters

---

### setPrice

**Signature:** `setPrice(price : Money) : void`

**Description:** Sets the price to show in Facebook for the product.

**Parameters:**

- `price`: Facebook price

---

### setProductType

**Signature:** `setProductType(productType : String) : void`

**Description:** Sets the Facebook product type. If the value is longer than 750 characters it is truncated.

**Parameters:**

- `productType`: Facebook product type, up to 750 characters

---

### setSalePrice

**Signature:** `setSalePrice(salePrice : Money) : void`

**Description:** Sets the sale price to show in Facebook for the product.

**Parameters:**

- `salePrice`: Facebook sale price

---

### setSalePriceEffectiveDateEnd

**Signature:** `setSalePriceEffectiveDateEnd(salePriceEffectiveDateEnd : Date) : void`

**Description:** Sets the end date of the Facebook sale price of the product.

**Parameters:**

- `salePriceEffectiveDateEnd`: end date of Facebook sale price

---

### setSalePriceEffectiveDateStart

**Signature:** `setSalePriceEffectiveDateStart(salePriceEffectiveDateStart : Date) : void`

**Description:** Sets the start date of the Facebook sale price of the product.

**Parameters:**

- `salePriceEffectiveDateStart`: start date of Facebook sale price

---

### setShippingHeight

**Signature:** `setShippingHeight(shippingHeight : Number) : void`

**Description:** Sets the shipping height of the product. If the value is negative it is truncated to 0.

**Parameters:**

- `shippingHeight`: shipping height, may not be negative

**See Also:**

setShippingLength(Number)
setShippingWidth(Number)
setShippingSizeUnit(String)

---

### setShippingLength

**Signature:** `setShippingLength(shippingLength : Number) : void`

**Description:** Sets the shipping length of the product. If the value is negative it is truncated to 0.

**Parameters:**

- `shippingLength`: shipping length, may not be negative

**See Also:**

setShippingWidth(Number)
setShippingHeight(Number)
setShippingSizeUnit(String)

---

### setShippingSizeUnit

**Signature:** `setShippingSizeUnit(shippingSizeUnit : String) : void`

**Description:** Sets the shipping size unit of the product.

**Parameters:**

- `shippingSizeUnit`: shipping size unit

**See Also:**

setShippingLength(Number)
setShippingWidth(Number)
setShippingHeight(Number)

---

### setShippingWeight

**Signature:** `setShippingWeight(shippingWeight : Quantity) : void`

**Description:** Sets the shipping weight for the product. Possible unit values are SHIPPING_WEIGHT_UNIT_LB, SHIPPING_WEIGHT_UNIT_OZ, SHIPPING_WEIGHT_UNIT_G, or SHIPPING_WEIGHT_UNIT_KG.

**Parameters:**

- `shippingWeight`: product shipping weight

---

### setShippingWidth

**Signature:** `setShippingWidth(shippingWidth : Number) : void`

**Description:** Sets the shipping width of the product. If the value is negative it is truncated to 0.

**Parameters:**

- `shippingWidth`: shipping width, may not be negative

**See Also:**

setShippingLength(Number)
setShippingHeight(Number)
setShippingSizeUnit(String)

---

### setSize

**Signature:** `setSize(size : String) : void`

**Description:** Sets the Facebook size value label of the product. If the value is longer than 100 characters it is truncated.

**Parameters:**

- `size`: Facebook size value label, up to 100 characters

---

### setTitle

**Signature:** `setTitle(title : String) : void`

**Description:** Sets the title of the Facebook product. If the value is longer than 100 characters it is truncated.

**Parameters:**

- `title`: product title, up to 100 characters

---
```

--------------------------------------------------------------------------------
/tests/mcp/node/activate-code-version-advanced.full-mode.programmatic.test.js:
--------------------------------------------------------------------------------

```javascript
// ==================================================================================
// SFCC MCP Server - activate_code_version Advanced Programmatic Tests (Full Mode)
// Comprehensive testing for complex scenarios, workflows, and edge cases
// 
// Test Coverage:
// - Multi-step code version management workflows
// - Error recovery and resilience testing  
// - Integration with get_code_versions tool
// - Advanced parameter validation and edge cases
// - State consistency and transaction-like behavior
// - Performance characteristics under various loads
// - Complex business logic validation
//
// Usage:
// node --test tests/mcp/node/activate-code-version-advanced.full-mode.programmatic.test.js
// npm run test:mcp:node
// ==================================================================================

import { test, describe, before, after, beforeEach } from 'node:test';
import { strict as assert } from 'node:assert';
import { connect } from 'mcp-aegis';

describe('activate_code_version Advanced Programmatic Tests (Full Mode)', () => {
  let client;

  before(async () => {
    client = await connect('./aegis.config.with-dw.json');
    assert.ok(client.connected, 'Client should be connected to server');
  });

  after(async () => {
    if (client?.connected) {
      await client.disconnect();
    }
  });

  beforeEach(() => {
    // CRITICAL: Clear all buffers to prevent test interference
    client.clearAllBuffers();
  });

  // ==================================================================================
  // TOOL AVAILABILITY AND SCHEMA VALIDATION
  // ==================================================================================
  describe('Tool Availability and Schema Validation', () => {
    test('should have activate_code_version tool available in full mode', async () => {
      const tools = await client.listTools();
      const activateTool = tools.find(tool => tool.name === 'activate_code_version');
      
      assert.ok(activateTool, 'activate_code_version tool should be available');
      assert.equal(activateTool.name, 'activate_code_version');
      assert.ok(activateTool.description.includes('Activate a specific code version'));
      
      // Validate input schema
      assert.equal(activateTool.inputSchema.type, 'object');
      assert.ok(activateTool.inputSchema.properties.codeVersionId);
      assert.equal(activateTool.inputSchema.properties.codeVersionId.type, 'string');
      assert.ok(Array.isArray(activateTool.inputSchema.required));
      assert.ok(activateTool.inputSchema.required.includes('codeVersionId'));
    });

    test('should have companion get_code_versions tool for workflow integration', async () => {
      const tools = await client.listTools();
      const getCodeVersionsTool = tools.find(tool => tool.name === 'get_code_versions');
      
      assert.ok(getCodeVersionsTool, 'get_code_versions tool should be available for workflow integration');
      assert.equal(getCodeVersionsTool.inputSchema.type, 'object');
    });
  });

  // ==================================================================================
  // COMPREHENSIVE PARAMETER VALIDATION
  // ==================================================================================
  describe('Comprehensive Parameter Validation', () => {
    test('should validate codeVersionId parameter types and formats', async () => {
      // Test missing parameter
      const missingResult = await client.callTool('activate_code_version', {});
      assert.equal(missingResult.isError, true);
      assert.ok(missingResult.content[0].text.includes('codeVersionId must be a non-empty string'));

      // Test empty string
      const emptyResult = await client.callTool('activate_code_version', { codeVersionId: '' });
      assert.equal(emptyResult.isError, true);
      assert.ok(emptyResult.content[0].text.includes('codeVersionId must be a non-empty string'));

      // Test null value
      const nullResult = await client.callTool('activate_code_version', { codeVersionId: null });
      assert.equal(nullResult.isError, true);
      assert.ok(nullResult.content[0].text.includes('codeVersionId must be a non-empty string'));

      // Test undefined value
      const undefinedResult = await client.callTool('activate_code_version', { codeVersionId: undefined });
      assert.equal(undefinedResult.isError, true);
      assert.ok(undefinedResult.content[0].text.includes('codeVersionId must be a non-empty string'));
    });

    test('should handle various invalid codeVersionId formats gracefully', async () => {
      const invalidFormats = [
        123,                    // number
        true,                   // boolean
        [],                     // array
        {},                     // object
        '   ',                  // whitespace only
        '\n\t',                 // whitespace characters
      ];

      for (const invalidFormat of invalidFormats) {
        const result = await client.callTool('activate_code_version', { codeVersionId: invalidFormat });
        assert.equal(result.isError, true, `Should reject ${typeof invalidFormat}: ${JSON.stringify(invalidFormat)}`);
        assert.ok(result.content[0].text.includes('codeVersionId must be a non-empty string'));
      }
    });

    test('should handle edge case codeVersionId values', async () => {
      const edgeCases = [
        'a'.repeat(1000),                    // Very long ID
        'test-version-with-special-chars!@#$%^&*()', // Special characters
        'version with spaces',                // Spaces
        'UPPERCASE-VERSION',                  // Case variations
        'version_nonexistent_test',          // Non-existent version
        'version.with.dots',                 // Dots
        '123-numeric-start',                 // Starting with numbers
        'unicode-测试-version',               // Unicode characters
      ];

      for (const edgeCase of edgeCases) {
        const result = await client.callTool('activate_code_version', { codeVersionId: edgeCase });
        assert.equal(result.isError, true, `Should handle edge case: ${edgeCase}`);
        
        // Should get 404 or similar SFCC error, not parameter validation error
        assert.ok(
          result.content[0].text.includes('404') || 
          result.content[0].text.includes('not found') ||
          result.content[0].text.includes('InvalidParameterException'),
          `Should get SFCC API error for edge case: ${edgeCase}, got: ${result.content[0].text}`
        );
      }
    });
  });

  // ==================================================================================
  // SFCC API ERROR HANDLING AND RESPONSE PARSING
  // ==================================================================================
  describe('SFCC API Error Handling and Response Parsing', () => {
    test('should parse and format SFCC API errors correctly', async () => {
      const result = await client.callTool('activate_code_version', { 
        codeVersionId: 'nonexistent-test-version-12345' 
      });
      
      assert.equal(result.isError, true);
      assert.equal(result.content.length, 1);
      assert.equal(result.content[0].type, 'text');
      
      const errorText = result.content[0].text;
      assert.ok(errorText.startsWith('Error:'), 'Error should start with Error:');
      
      // Should contain SFCC fault information
      assert.ok(
        errorText.includes('404') || 
        errorText.includes('not found') ||
        errorText.includes('InvalidParameterException'),
        `Should contain SFCC fault info, got: ${errorText}`
      );
    });

    test('should handle different types of SFCC API errors consistently', async () => {
      const testVersions = [
        'definitely-nonexistent-version',
        'another-invalid-version-name',
        'test-error-scenario-version'
      ];

      const errorResponses = [];
      
      for (const versionId of testVersions) {
        const result = await client.callTool('activate_code_version', { codeVersionId: versionId });
        assert.equal(result.isError, true);
        errorResponses.push(result.content[0].text);
      }

      // All errors should follow similar format
      errorResponses.forEach(errorText => {
        assert.ok(errorText.startsWith('Error:'), 'All errors should start with Error:');
        assert.ok(errorText.length > 20, 'Error messages should be reasonably detailed');
      });
    });

    test('should handle malformed SFCC API responses gracefully', async () => {
      // Test with version ID that might cause unusual API responses
      const result = await client.callTool('activate_code_version', { 
        codeVersionId: 'test-malformed-response-handling' 
      });
      
      assert.equal(result.isError, true);
      assert.ok(result.content, 'Should always return content array');
      assert.ok(result.content[0].text, 'Should always return text content');
      assert.equal(typeof result.content[0].text, 'string', 'Error text should be string');
    });
  });

  // ==================================================================================
  // INTEGRATION WITH GET_CODE_VERSIONS WORKFLOW
  // ==================================================================================
  describe('Integration with get_code_versions Workflow', () => {
    test('should integrate with get_code_versions for complete workflow', async () => {
      // Step 1: Get list of available code versions
      const versionsResult = await client.callTool('get_code_versions', {});
      assert.equal(versionsResult.isError, false, 'get_code_versions should succeed');
      
      // Parse the response to understand available versions
      const versionsText = versionsResult.content[0].text;
      assert.ok(versionsText.length > 0, 'Should return version information');
      
      // Step 2: Try to activate a clearly non-existent version
      const activateResult = await client.callTool('activate_code_version', { 
        codeVersionId: 'workflow-test-nonexistent-version' 
      });
      assert.equal(activateResult.isError, true, 'Should fail for non-existent version');
      
      // Step 3: Verify error handling doesn't affect subsequent get_code_versions calls
      const versionsResult2 = await client.callTool('get_code_versions', {});
      assert.equal(versionsResult2.isError, false, 'get_code_versions should still work after failed activation');
    });

    test('should maintain consistent state across multiple tool calls', async () => {
      const operations = [
        { tool: 'get_code_versions', args: {} },
        { tool: 'activate_code_version', args: { codeVersionId: 'test-state-consistency-1' } },
        { tool: 'get_code_versions', args: {} },
        { tool: 'activate_code_version', args: { codeVersionId: 'test-state-consistency-2' } },
        { tool: 'get_code_versions', args: {} },
      ];

      const results = [];
      
      for (const operation of operations) {
        const result = await client.callTool(operation.tool, operation.args);
        results.push({ operation, result });
        
        // Each operation should return proper response structure
        assert.ok(result.content, `${operation.tool} should return content`);
        assert.ok(Array.isArray(result.content), `${operation.tool} content should be array`);
        assert.equal(typeof result.isError, 'boolean', `${operation.tool} should have isError boolean`);
      }

      // Verify get_code_versions calls succeeded while activate calls failed (expected for non-existent versions)
      const getVersionsResults = results.filter(r => r.operation.tool === 'get_code_versions');
      const activateResults = results.filter(r => r.operation.tool === 'activate_code_version');
      
      getVersionsResults.forEach((r, index) => {
        assert.equal(r.result.isError, false, `get_code_versions call ${index + 1} should succeed`);
      });
      
      activateResults.forEach((r, index) => {
        assert.equal(r.result.isError, true, `activate_code_version call ${index + 1} should fail for non-existent version`);
      });
    });
  });

  // ==================================================================================
  // ERROR RECOVERY AND RESILIENCE TESTING
  // ==================================================================================
  describe('Error Recovery and Resilience Testing', () => {
    test('should recover gracefully from various error scenarios', async () => {
      const errorScenarios = [
        { description: 'Empty codeVersionId', args: { codeVersionId: '' } },
        { description: 'Very long codeVersionId', args: { codeVersionId: 'x'.repeat(500) } },
        { description: 'Special characters', args: { codeVersionId: '!@#$%^&*()_+{}|:"<>?[]\\;\',./' } },
        { description: 'Unicode characters', args: { codeVersionId: '测试版本号码' } },
        { description: 'SQL injection attempt', args: { codeVersionId: "'; DROP TABLE versions; --" } },
      ];

      for (const scenario of errorScenarios) {
        const result = await client.callTool('activate_code_version', scenario.args);
        
        // Should handle all scenarios gracefully without throwing
        assert.equal(result.isError, true, `${scenario.description} should return error`);
        assert.ok(result.content, `${scenario.description} should return content`);
        assert.ok(result.content[0].text, `${scenario.description} should return error text`);
        
        // Verify server is still responsive after error
        const recoveryTest = await client.listTools();
        assert.ok(recoveryTest.length > 0, `Server should be responsive after ${scenario.description}`);
      }
    });

    test('should handle rapid sequential activation attempts', async () => {
      const rapidRequests = Array.from({ length: 10 }, (_, i) => ({
        codeVersionId: `rapid-test-version-${i}`
      }));

      const results = [];
      
      // Execute requests sequentially (MCP doesn't support concurrent requests)
      for (const request of rapidRequests) {
        const result = await client.callTool('activate_code_version', request);
        results.push(result);
      }

      // All requests should be handled properly
      results.forEach((result, index) => {
        assert.equal(result.isError, true, `Rapid request ${index} should fail for non-existent version`);
        assert.ok(result.content[0].text.length > 0, `Rapid request ${index} should have error message`);
      });

      // Server should still be responsive
      const finalTest = await client.listTools();
      assert.ok(finalTest.length > 0, 'Server should be responsive after rapid requests');
    });

    test('should maintain error isolation between requests', async () => {
      // Generate error
      const errorResult = await client.callTool('activate_code_version', { codeVersionId: '' });
      assert.equal(errorResult.isError, true);
      
      // Verify normal operation still works
      const normalResult = await client.callTool('get_code_versions', {});
      assert.equal(normalResult.isError, false, 'Normal operations should work after errors');
      
      // Generate different error
      const errorResult2 = await client.callTool('activate_code_version', { codeVersionId: 'another-error-test' });
      assert.equal(errorResult2.isError, true);
      
      // Verify isolation - errors should be different
      assert.notEqual(errorResult.content[0].text, errorResult2.content[0].text, 'Different errors should produce different messages');
    });
  });

  // ==================================================================================
  // RESPONSE FORMAT AND STRUCTURE VALIDATION
  // ==================================================================================
  describe('Response Format and Structure Validation', () => {
    test('should return consistent response structure across all scenarios', async () => {
      const testScenarios = [
        { name: 'missing parameter', args: {} },
        { name: 'empty parameter', args: { codeVersionId: '' } },
        { name: 'valid format nonexistent version', args: { codeVersionId: 'test-structure-validation' } },
        { name: 'special characters', args: { codeVersionId: 'test!@#$' } },
      ];

      for (const scenario of testScenarios) {
        const result = await client.callTool('activate_code_version', scenario.args);
        
        // Validate MCP response structure
        assert.ok('content' in result, `${scenario.name}: Should have content property`);
        assert.ok('isError' in result, `${scenario.name}: Should have isError property`);
        assert.ok(Array.isArray(result.content), `${scenario.name}: Content should be array`);
        assert.equal(typeof result.isError, 'boolean', `${scenario.name}: isError should be boolean`);
        
        // Validate content structure
        assert.equal(result.content.length, 1, `${scenario.name}: Should have exactly one content item`);
        assert.equal(result.content[0].type, 'text', `${scenario.name}: Content should be text type`);
        assert.ok(typeof result.content[0].text === 'string', `${scenario.name}: Text should be string`);
        assert.ok(result.content[0].text.length > 0, `${scenario.name}: Text should not be empty`);
        
        // All test scenarios should return errors for these test cases
        assert.equal(result.isError, true, `${scenario.name}: Should be error for test cases`);
      }
    });

    test('should format error messages consistently', async () => {
      const results = [];
      
      // Collect various error responses
      const errorCases = [
        'format-test-version-1',
        'format-test-version-2', 
        'format-test-version-3'
      ];
      
      for (const versionId of errorCases) {
        const result = await client.callTool('activate_code_version', { codeVersionId: versionId });
        results.push(result.content[0].text);
      }
      
      // All errors should start with "Error:"
      results.forEach((errorText, index) => {
        assert.ok(errorText.startsWith('Error:'), `Error ${index + 1} should start with 'Error:'`);
        assert.ok(errorText.length > 10, `Error ${index + 1} should be reasonably detailed`);
      });
    });
  });

  // ==================================================================================
  // BUSINESS LOGIC AND WORKFLOW VALIDATION
  // ==================================================================================
  describe('Business Logic and Workflow Validation', () => {
    test('should enforce code version management business rules', async () => {
      // Test that we get appropriate error for non-existent versions
      const result = await client.callTool('activate_code_version', { 
        codeVersionId: 'business-logic-test-version' 
      });
      
      assert.equal(result.isError, true);
      
      // Error should indicate version not found, not generic failure
      const errorText = result.content[0].text.toLowerCase();
      assert.ok(
        errorText.includes('not found') || 
        errorText.includes('404') ||
        errorText.includes('does not exist') ||
        errorText.includes('invalidparameterexception'),
        `Error should indicate version not found: ${result.content[0].text}`
      );
    });

    test('should validate code version activation preconditions', async () => {
      // According to tool description: "Only inactive code versions can be activated"
      // For non-existent versions, we should get appropriate error
      
      const result = await client.callTool('activate_code_version', { 
        codeVersionId: 'precondition-test-version' 
      });
      
      assert.equal(result.isError, true);
      
      // Should get proper SFCC API error about version not existing
      assert.ok(result.content[0].text.includes('Error:'));
    });

    test('should provide informative error messages for troubleshooting', async () => {
      const result = await client.callTool('activate_code_version', { 
        codeVersionId: 'troubleshooting-test-version' 
      });
      
      assert.equal(result.isError, true);
      
      const errorText = result.content[0].text;
      
      // Error should be helpful for developers
      assert.ok(errorText.length > 30, 'Error message should be detailed enough for troubleshooting');
      assert.ok(errorText.includes('Error:'), 'Should clearly indicate this is an error');
      
      // Should contain either version-specific info or general API error info
      assert.ok(
        errorText.includes('version') || 
        errorText.includes('404') ||
        errorText.includes('not found') ||
        errorText.includes('Request failed'),
        'Should contain helpful error context'
      );
    });
  });

  // ==================================================================================
  // PERFORMANCE AND RELIABILITY CHARACTERISTICS
  // ==================================================================================
  describe('Performance and Reliability Characteristics', () => {
    test('should handle operations within reasonable time bounds', async () => {
      const startTime = Date.now();
      
      const result = await client.callTool('activate_code_version', { 
        codeVersionId: 'performance-test-version' 
      });
      
      const duration = Date.now() - startTime;
      
      // Should complete within reasonable time (lenient for CI environments)
      assert.ok(duration < 10000, `Operation should complete within 10 seconds, took ${duration}ms`);
      
      // Should still return proper response
      assert.ok(result.content, 'Should return response even under timing constraints');
    });

    test('should maintain consistent response times across multiple calls', async () => {
      const durations = [];
      const testCalls = 5;
      
      for (let i = 0; i < testCalls; i++) {
        const startTime = Date.now();
        
        await client.callTool('activate_code_version', { 
          codeVersionId: `consistency-test-${i}` 
        });
        
        durations.push(Date.now() - startTime);
      }
      
      // All calls should complete within reasonable bounds
      durations.forEach((duration, index) => {
        assert.ok(duration < 10000, `Call ${index + 1} should complete within 10 seconds, took ${duration}ms`);
      });
      
      // Calculate variance (should not be extreme)
      const maxVariation = Math.max(...durations) / Math.min(...durations);
      
      // Lenient variance check for CI environments
      assert.ok(maxVariation < 50, `Response time variation should be reasonable, got ${maxVariation}x variation`);
    });

    test('should handle stress scenarios gracefully', async () => {
      // Test with various payload sizes and complexity
      const stressTests = [
        { name: 'Long version ID', codeVersionId: 'stress-test-' + 'x'.repeat(200) },
        { name: 'Complex characters', codeVersionId: 'stress-测试-🔥-version-!@#$%^&*()' },
        { name: 'JSON-like string', codeVersionId: '{"version": "test", "data": [1,2,3]}' },
        { name: 'XML-like string', codeVersionId: '<version>test</version><data>stress</data>' },
      ];

      for (const stressTest of stressTests) {
        const result = await client.callTool('activate_code_version', { 
          codeVersionId: stressTest.codeVersionId 
        });
        
        // Should handle gracefully without crashing
        assert.ok(result.content, `${stressTest.name}: Should return content`);
        assert.equal(typeof result.isError, 'boolean', `${stressTest.name}: Should return boolean isError`);
        
        // Server should remain responsive
        const healthCheck = await client.listTools();
        assert.ok(healthCheck.length > 0, `${stressTest.name}: Server should remain responsive`);
      }
    });
  });

  // ==================================================================================
  // EDGE CASES AND BOUNDARY CONDITIONS
  // ==================================================================================
  describe('Edge Cases and Boundary Conditions', () => {
    test('should handle maximum length version IDs', async () => {
      // Test various length boundaries
      const lengthTests = [
        { length: 100, name: '100 characters' },
        { length: 255, name: '255 characters (common limit)' },
        { length: 500, name: '500 characters' },
        { length: 1000, name: '1000 characters' },
      ];

      for (const lengthTest of lengthTests) {
        const longVersionId = 'test-' + 'x'.repeat(lengthTest.length - 5);
        
        const result = await client.callTool('activate_code_version', { 
          codeVersionId: longVersionId 
        });
        
        // Should handle gracefully (expect error for non-existent version)
        assert.equal(result.isError, true, `${lengthTest.name}: Should handle long version ID`);
        assert.ok(result.content[0].text.length > 0, `${lengthTest.name}: Should return error message`);
      }
    });

    test('should handle unusual character encodings and formats', async () => {
      const encodingTests = [
        { name: 'Unicode characters', value: 'version-测试-版本-号码' },
        { name: 'Emoji characters', value: 'version-🚀-💻-🔥' },
        { name: 'Control characters', value: 'version\n\t\r\b\f' },
        { name: 'High unicode', value: 'version-𝕧𝕖𝕣𝕤𝕚𝕠𝕟' },
        { name: 'Mixed scripts', value: 'version-αβγ-أبج-中文-🌍' },
      ];

      for (const encodingTest of encodingTests) {
        const result = await client.callTool('activate_code_version', { 
          codeVersionId: encodingTest.value 
        });
        
        // Should handle without server errors
        assert.ok(result.content, `${encodingTest.name}: Should return content`);
        assert.equal(typeof result.isError, 'boolean', `${encodingTest.name}: Should return boolean isError`);
        
        // Check server responsiveness
        const healthCheck = await client.listTools();
        assert.ok(healthCheck.length > 0, `${encodingTest.name}: Server should remain responsive`);
      }
    });

    test('should validate parameter completeness and format', async () => {
      // Test various parameter scenarios
      const parameterTests = [
        { name: 'Extra parameters', args: { codeVersionId: 'test', extraParam: 'should-be-ignored' } },
        { name: 'Case variations', args: { CodeVersionId: 'test-case' } }, // Wrong case
        { name: 'Nested object', args: { codeVersionId: { nested: 'test' } } },
        { name: 'Array value', args: { codeVersionId: ['test', 'array'] } },
      ];

      for (const paramTest of parameterTests) {
        const result = await client.callTool('activate_code_version', paramTest.args);
        
        // Should handle parameter variations appropriately
        assert.ok(result.content, `${paramTest.name}: Should return content`);
        assert.equal(typeof result.isError, 'boolean', `${paramTest.name}: Should return boolean isError`);
        
        if (paramTest.name === 'Extra parameters') {
          // Extra parameters might be acceptable if codeVersionId is valid string
          // We expect error because version doesn't exist, not parameter error
          assert.ok(
            result.content[0].text.includes('404') || 
            result.content[0].text.includes('not found') ||
            result.content[0].text.includes('codeVersionId must be a non-empty string'),
            `${paramTest.name}: Should handle extra parameters gracefully`
          );
        } else {
          // Other cases should fail parameter validation
          assert.equal(result.isError, true, `${paramTest.name}: Should fail validation`);
        }
      }
    });
  });

  // ==================================================================================
  // MOCK VALIDATION AND TESTING ENVIRONMENT
  // ==================================================================================
  describe('Mock Validation and Testing Environment', () => {
    test('should validate we are testing against mock/sandbox environment', async () => {
      // Ensure we're not accidentally testing against production
      const result = await client.callTool('activate_code_version', { 
        codeVersionId: 'PRODUCTION-SAFETY-CHECK-DO-NOT-ACTIVATE' 
      });
      
      // Should fail (which is expected for non-existent version in sandbox)
      assert.equal(result.isError, true, 'Should fail for test version in sandbox environment');
      
      // Verify we get sandbox-appropriate error (not production access denied)
      const errorText = result.content[0].text.toLowerCase();
      assert.ok(
        errorText.includes('not found') || 
        errorText.includes('404') ||
        errorText.includes('invalidparameterexception'),
        `Should get sandbox error, not production access error: ${result.content[0].text}`
      );
    });

    test('should have consistent mock behavior across test runs', async () => {
      const testVersion = 'consistent-mock-test-version';
      
      // Call the same operation multiple times
      const results = [];
      for (let i = 0; i < 3; i++) {
        const result = await client.callTool('activate_code_version', { 
          codeVersionId: testVersion 
        });
        results.push(result);
      }
      
      // All results should be consistent
      results.forEach((result, index) => {
        assert.equal(result.isError, true, `Call ${index + 1}: Should consistently return error`);
        assert.ok(result.content[0].text.length > 0, `Call ${index + 1}: Should have error message`);
      });
      
      // Error messages should be similar (allowing for some variation in timing/IDs)
      const errorTexts = results.map(r => r.content[0].text);
      
      errorTexts.forEach((errorText, index) => {
        assert.ok(
          errorText.startsWith('Error:'),
          `Call ${index + 1}: Should have consistent error format`
        );
      });
    });
  });
});
```

--------------------------------------------------------------------------------
/tests/mcp/yaml/search-sfcc-classes.full-mode.test.mcp.yml:
--------------------------------------------------------------------------------

```yaml
# ==================================================================================
# SFCC MCP Server - search_sfcc_classes Tool YAML Tests
# Comprehensive testing for SFCC class search functionality
# Tests both successful responses and error handling scenarios
# 
# Quick Test Commands:
# aegis "tests/mcp/yaml/search-sfcc-classes.full-mode.test.mcp.yml" --config "aegis.config.with-dw.json" --verbose
# aegis "tests/mcp/yaml/search-sfcc-classes.full-mode.test.mcp.yml" --config "aegis.config.with-dw.json" --debug --timing
# aegis query search_sfcc_classes '{"query": "catalog"}' --config "aegis.config.with-dw.json"
# aegis query search_sfcc_classes '{"query": "product"}' --config "aegis.config.with-dw.json"
# ==================================================================================
description: "SFCC MCP Server search_sfcc_classes tool - comprehensive validation"

# ==================================================================================
# BASIC TOOL STRUCTURE VALIDATION
# ==================================================================================
tests:
  - it: "should list search_sfcc_classes 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:search_sfcc_classes"
      stderr: "toBeEmpty"

  - it: "should have search_sfcc_classes 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:search_sfcc_classes"
      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:arrayContains:name:search_sfcc_classes"
      stderr: "toBeEmpty"

  - it: "should have proper inputSchema structure for search_sfcc_classes"
    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 - COMMON SEARCH TERMS
# ==================================================================================

  - it: "should execute with catalog search term"
    request:
      jsonrpc: "2.0"
      id: "exec-catalog-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-catalog-search"
        result:
          content:
            - type: "text"
              text: "match:contains:catalog"
          isError: false
      stderr: "toBeEmpty"

  - it: "should return JSON array structure for product search"
    request:
      jsonrpc: "2.0"
      id: "exec-product-json"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "product"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-product-json"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"  # Valid JSON array structure
          isError: false
      stderr: "toBeEmpty"

  - it: "should find customer-related classes"
    request:
      jsonrpc: "2.0"
      id: "exec-customer-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "customer"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-customer-search"
        result:
          content:
            - type: "text"
              text: "match:contains:customer"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find order-related classes"
    request:
      jsonrpc: "2.0"
      id: "exec-order-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "order"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-order-search"
        result:
          content:
            - type: "text"
              text: "match:contains:order"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find system-related classes"
    request:
      jsonrpc: "2.0"
      id: "exec-system-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "system"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-system-search"
        result:
          content:
            - type: "text"
              text: "match:contains:system"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find web-related classes"
    request:
      jsonrpc: "2.0"
      id: "exec-web-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "web"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-web-search"
        result:
          content:
            - type: "text"
              text: "match:contains:web"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find util-related classes"
    request:
      jsonrpc: "2.0"
      id: "exec-util-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "util"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-util-search"
        result:
          content:
            - type: "text"
              text: "match:contains:util"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# SEARCH RESULT STRUCTURE VALIDATION
# ==================================================================================

  - it: "should return JSON array in results"
    request:
      jsonrpc: "2.0"
      id: "validate-array-structure"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "validate-array-structure"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should return class names in array format"
    request:
      jsonrpc: "2.0"
      id: "validate-class-names"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "validate-class-names"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.catalog.Product"
          isError: false
      stderr: "toBeEmpty"

  - it: "should include multiple matching classes"
    request:
      jsonrpc: "2.0"
      id: "validate-multiple-classes"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "validate-multiple-classes"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.catalog.Catalog"
          isError: false
      stderr: "toBeEmpty"

  - it: "should format class names with quotes"
    request:
      jsonrpc: "2.0"
      id: "validate-quoted-names"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "product"
    expect:
      response:
        jsonrpc: "2.0"
        id: "validate-quoted-names"
        result:
          content:
            - type: "text"
              text: "match:regex:\"dw\\.catalog\\.Product\""
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# CASE SENSITIVITY AND SEARCH VARIATIONS
# ==================================================================================

  - it: "should handle uppercase search terms"
    request:
      jsonrpc: "2.0"
      id: "search-uppercase"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "CATALOG"
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-uppercase"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle mixed case search terms"
    request:
      jsonrpc: "2.0"
      id: "search-mixedcase"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "Product"
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-mixedcase"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle partial class names"
    request:
      jsonrpc: "2.0"
      id: "search-partial"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "cat"  # Should find catalog classes
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-partial"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle single character searches"
    request:
      jsonrpc: "2.0"
      id: "search-single-char"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "c"
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-single-char"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# SPECIFIC SFCC DOMAIN SEARCHES
# ==================================================================================

  - it: "should find dw.catalog namespace classes"
    request:
      jsonrpc: "2.0"
      id: "domain-catalog"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "domain-catalog"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.catalog"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find dw.customer namespace classes"
    request:
      jsonrpc: "2.0"
      id: "domain-customer"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "customer"
    expect:
      response:
        jsonrpc: "2.0"
        id: "domain-customer"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.customer"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find dw.order namespace classes"
    request:
      jsonrpc: "2.0"
      id: "domain-order"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "order"
    expect:
      response:
        jsonrpc: "2.0"
        id: "domain-order"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.order"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find dw.system namespace classes"
    request:
      jsonrpc: "2.0"
      id: "domain-system"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "system"
    expect:
      response:
        jsonrpc: "2.0"
        id: "domain-system"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.system"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find dw.web namespace classes"
    request:
      jsonrpc: "2.0"
      id: "domain-web"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "web"
    expect:
      response:
        jsonrpc: "2.0"
        id: "domain-web"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.web"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find dw.util namespace classes"
    request:
      jsonrpc: "2.0"
      id: "domain-util"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "util"
    expect:
      response:
        jsonrpc: "2.0"
        id: "domain-util"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.util"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# FUNCTIONAL SEARCH TESTS
# ==================================================================================

  - it: "should find inventory-related classes"
    request:
      jsonrpc: "2.0"
      id: "func-inventory"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "inventory"
    expect:
      response:
        jsonrpc: "2.0"
        id: "func-inventory"
        result:
          content:
            - type: "text"
              text: "match:contains:ProductInventoryList"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find price-related classes"
    request:
      jsonrpc: "2.0"
      id: "func-price"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "price"
    expect:
      response:
        jsonrpc: "2.0"
        id: "func-price"
        result:
          content:
            - type: "text"
              text: "match:contains:PriceBook"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find basket-related classes"
    request:
      jsonrpc: "2.0"
      id: "func-basket"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "basket"
    expect:
      response:
        jsonrpc: "2.0"
        id: "func-basket"
        result:
          content:
            - type: "text"
              text: "match:contains:Basket"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find payment-related classes"
    request:
      jsonrpc: "2.0"
      id: "func-payment"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "payment"
    expect:
      response:
        jsonrpc: "2.0"
        id: "func-payment"
        result:
          content:
            - type: "text"
              text: "match:contains:Payment"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find shipping-related classes"
    request:
      jsonrpc: "2.0"
      id: "func-shipping"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "shipping"
    expect:
      response:
        jsonrpc: "2.0"
        id: "func-shipping"
        result:
          content:
            - type: "text"
              text: "match:contains:Shipping"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# ERROR HANDLING TESTS
# ==================================================================================

  - it: "should handle empty query gracefully"
    request:
      jsonrpc: "2.0"
      id: "error-empty-query"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: ""
    expect:
      response:
        jsonrpc: "2.0"
        id: "error-empty-query"
        result:
          content:
            - type: "text"
              text: "match:contains:Error"
          isError: true
      stderr: "toBeEmpty"

  - it: "should handle missing query parameter"
    request:
      jsonrpc: "2.0"
      id: "error-missing-query"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments: {}
    expect:
      response:
        jsonrpc: "2.0"
        id: "error-missing-query"
        result:
          content:
            - type: "text"
              text: "match:contains:query"
          isError: true
      stderr: "toBeEmpty"

  - it: "should handle non-existent terms gracefully"
    request:
      jsonrpc: "2.0"
      id: "search-nonexistent"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "zzznothingfound"
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-nonexistent"
        result:
          content:
            - type: "text"
              text: "match:regex:^\\[\\s*\\]$"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle special characters in query"
    request:
      jsonrpc: "2.0"
      id: "search-special-chars"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "!@#$%"
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-special-chars"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle very long query strings"
    request:
      jsonrpc: "2.0"
      id: "search-long-query"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "verylongquerystringthatdoesnotmatchanythingbutshouldbetreatedgracefully"
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-long-query"
        result:
          content:
            - type: "text"
              text: "match:regex:^\\[\\s*\\]$"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# RESPONSE FORMAT VALIDATION
# ==================================================================================

  - it: "should return consistent MCP content structure"
    request:
      jsonrpc: "2.0"
      id: "format-content-structure"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "format-content-structure"
        result:
          content:
            match:arrayElements:
              match:partial:
                type: "text"
                text: "match:type:string"
          isError: false
      stderr: "toBeEmpty"

  - it: "should return single content item for successful calls"
    request:
      jsonrpc: "2.0"
      id: "format-single-content"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "product"
    expect:
      response:
        jsonrpc: "2.0"
        id: "format-single-content"
        result:
          content: "match:arrayLength:1"
          isError: false
      stderr: "toBeEmpty"

  - it: "should not set isError flag for successful responses"
    request:
      jsonrpc: "2.0"
      id: "format-no-error-flag"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "customer"
    expect:
      response:
        jsonrpc: "2.0"
        id: "format-no-error-flag"
        result:
          content: "match:type:array"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# EDGE CASES AND SEARCH BEHAVIOR
# ==================================================================================

  - it: "should handle numeric query terms"
    request:
      jsonrpc: "2.0"
      id: "edge-numeric-query"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "123"
    expect:
      response:
        jsonrpc: "2.0"
        id: "edge-numeric-query"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle whitespace in query"
    request:
      jsonrpc: "2.0"
      id: "edge-whitespace"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "  catalog  "
    expect:
      response:
        jsonrpc: "2.0"
        id: "edge-whitespace"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle common abbreviations"
    request:
      jsonrpc: "2.0"
      id: "edge-abbreviations"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "mgr"  # Should find manager classes
    expect:
      response:
        jsonrpc: "2.0"
        id: "edge-abbreviations"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle dots in search terms"
    request:
      jsonrpc: "2.0"
      id: "edge-dots"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "dw.catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "edge-dots"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# PERFORMANCE AND CONSISTENCY VALIDATION
# ==================================================================================

  - it: "should respond consistently for repeated searches"
    request:
      jsonrpc: "2.0"
      id: "perf-consistent-1"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-consistent-1"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should respond consistently for repeated searches (second time)"
    request:
      jsonrpc: "2.0"
      id: "perf-consistent-2"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-consistent-2"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# PERFORMANCE TIMING TESTS
# ==================================================================================

  - it: "should return search results within acceptable time"
    request:
      jsonrpc: "2.0"
      id: "perf-basic-timing"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-basic-timing"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      performance:
        maxResponseTime: "200ms"  # Search should be fast
      stderr: "toBeEmpty"

  - it: "should handle complex searches efficiently"
    request:
      jsonrpc: "2.0"
      id: "perf-complex-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "product"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-complex-search"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      performance:
        maxResponseTime: "100ms"  # Even complex searches should be under 100ms
      stderr: "toBeEmpty"

  - it: "should handle partial searches quickly"
    request:
      jsonrpc: "2.0"
      id: "perf-partial-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "cat"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-partial-search"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      performance:
        maxResponseTime: "100ms"  # Partial searches should be fast
      stderr: "toBeEmpty"

  - it: "should handle no-result searches efficiently"
    request:
      jsonrpc: "2.0"
      id: "perf-no-results"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "zzznothingfound"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-no-results"
        result:
          content:
            - type: "text"
              text: "match:regex:^\\[\\s*\\]$"
          isError: false
      performance:
        maxResponseTime: "150ms"  # No results should be very fast
      stderr: "toBeEmpty"

  - it: "should handle error cases quickly"
    request:
      jsonrpc: "2.0"
      id: "perf-error-timing"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: ""
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-error-timing"
        result:
          content:
            - type: "text"
              text: "match:contains:Error"
          isError: true
      performance:
        maxResponseTime: "150ms"  # Error handling should be very fast
      stderr: "toBeEmpty"

  - it: "should handle cached results quickly"
    request:
      jsonrpc: "2.0"
      id: "perf-cached-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"  # Same as first test - should be cached
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-cached-search"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      performance:
        maxResponseTime: "150ms"  # Cached responses should be extremely fast
      stderr: "toBeEmpty"

  - it: "should handle single character searches within timeout"
    request:
      jsonrpc: "2.0"
      id: "perf-single-char-timing"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "c"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-single-char-timing"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      performance:
        maxResponseTime: "100ms"  # Single char searches might return many results
      stderr: "toBeEmpty"

  - it: "should handle long queries efficiently"
    request:
      jsonrpc: "2.0"
      id: "perf-long-query-timing"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "verylongquerystringthatdoesnotmatchanythingbutshouldbetreatedgracefully"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-long-query-timing"
        result:
          content:
            - type: "text"
              text: "match:regex:^\\[\\s*\\]$"
          isError: false
      performance:
        maxResponseTime: "150ms"  # Long queries with no results should be fast
      stderr: "toBeEmpty"

# ==================================================================================
# SEARCH QUALITY AND RELEVANCE TESTS
# ==================================================================================

  - it: "should prioritize exact matches for common terms"
    request:
      jsonrpc: "2.0"
      id: "quality-exact-match"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "Product"
    expect:
      response:
        jsonrpc: "2.0"
        id: "quality-exact-match"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.catalog.Product"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find classes by functionality"
    request:
      jsonrpc: "2.0"
      id: "quality-functionality"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "inventory"
    expect:
      response:
        jsonrpc: "2.0"
        id: "quality-functionality"
        result:
          content:
            - type: "text"
              text: "match:contains:ProductInventoryList"
          isError: false
      stderr: "toBeEmpty"

  - it: "should include relevant namespace classes"
    request:
      jsonrpc: "2.0"
      id: "quality-namespace"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "system"
    expect:
      response:
        jsonrpc: "2.0"
        id: "quality-namespace"
        result:
          content:
            - type: "text"
              text: "match:regex:dw\\.system\\."
          isError: false
      stderr: "toBeEmpty"

```

--------------------------------------------------------------------------------
/tests/mcp/yaml/search-sfcc-classes.docs-only.test.mcp.yml:
--------------------------------------------------------------------------------

```yaml
# ==================================================================================
# SFCC MCP Server - search_sfcc_classes Tool YAML Tests
# Comprehensive testing for SFCC class search functionality
# Tests both successful responses and error handling scenarios
# 
# Quick Test Commands:
# aegis "tests/mcp/yaml/search-sfcc-classes.docs-only.test.mcp.yml" --config "aegis.config.docs-only.json" --verbose
# aegis "tests/mcp/yaml/search-sfcc-classes.docs-only.test.mcp.yml" --config "aegis.config.docs-only.json" --debug --timing
# aegis query search_sfcc_classes '{"query": "catalog"}' --config "aegis.config.docs-only.json"
# aegis query search_sfcc_classes '{"query": "product"}' --config "aegis.config.docs-only.json"
# ==================================================================================
description: "SFCC MCP Server search_sfcc_classes tool - comprehensive validation"

# ==================================================================================
# BASIC TOOL STRUCTURE VALIDATION
# ==================================================================================
tests:
  - it: "should list search_sfcc_classes 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:search_sfcc_classes"
      stderr: "toBeEmpty"

  - it: "should have search_sfcc_classes 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:search_sfcc_classes"
      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:arrayContains:name:search_sfcc_classes"
      stderr: "toBeEmpty"

  - it: "should have proper inputSchema structure for search_sfcc_classes"
    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 - COMMON SEARCH TERMS
# ==================================================================================

  - it: "should execute with catalog search term"
    request:
      jsonrpc: "2.0"
      id: "exec-catalog-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-catalog-search"
        result:
          content:
            - type: "text"
              text: "match:contains:catalog"
          isError: false
      stderr: "toBeEmpty"

  - it: "should return JSON array structure for product search"
    request:
      jsonrpc: "2.0"
      id: "exec-product-json"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "product"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-product-json"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"  # Valid JSON array structure
          isError: false
      stderr: "toBeEmpty"

  - it: "should find customer-related classes"
    request:
      jsonrpc: "2.0"
      id: "exec-customer-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "customer"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-customer-search"
        result:
          content:
            - type: "text"
              text: "match:contains:customer"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find order-related classes"
    request:
      jsonrpc: "2.0"
      id: "exec-order-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "order"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-order-search"
        result:
          content:
            - type: "text"
              text: "match:contains:order"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find system-related classes"
    request:
      jsonrpc: "2.0"
      id: "exec-system-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "system"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-system-search"
        result:
          content:
            - type: "text"
              text: "match:contains:system"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find web-related classes"
    request:
      jsonrpc: "2.0"
      id: "exec-web-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "web"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-web-search"
        result:
          content:
            - type: "text"
              text: "match:contains:web"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find util-related classes"
    request:
      jsonrpc: "2.0"
      id: "exec-util-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "util"
    expect:
      response:
        jsonrpc: "2.0"
        id: "exec-util-search"
        result:
          content:
            - type: "text"
              text: "match:contains:util"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# SEARCH RESULT STRUCTURE VALIDATION
# ==================================================================================

  - it: "should return JSON array in results"
    request:
      jsonrpc: "2.0"
      id: "validate-array-structure"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "validate-array-structure"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should return class names in array format"
    request:
      jsonrpc: "2.0"
      id: "validate-class-names"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "validate-class-names"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.catalog.Product"
          isError: false
      stderr: "toBeEmpty"

  - it: "should include multiple matching classes"
    request:
      jsonrpc: "2.0"
      id: "validate-multiple-classes"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "validate-multiple-classes"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.catalog.Catalog"
          isError: false
      stderr: "toBeEmpty"

  - it: "should format class names with quotes"
    request:
      jsonrpc: "2.0"
      id: "validate-quoted-names"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "product"
    expect:
      response:
        jsonrpc: "2.0"
        id: "validate-quoted-names"
        result:
          content:
            - type: "text"
              text: "match:regex:\"dw\\.catalog\\.Product\""
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# CASE SENSITIVITY AND SEARCH VARIATIONS
# ==================================================================================

  - it: "should handle uppercase search terms"
    request:
      jsonrpc: "2.0"
      id: "search-uppercase"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "CATALOG"
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-uppercase"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle mixed case search terms"
    request:
      jsonrpc: "2.0"
      id: "search-mixedcase"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "Product"
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-mixedcase"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle partial class names"
    request:
      jsonrpc: "2.0"
      id: "search-partial"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "cat"  # Should find catalog classes
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-partial"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle single character searches"
    request:
      jsonrpc: "2.0"
      id: "search-single-char"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "c"
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-single-char"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# SPECIFIC SFCC DOMAIN SEARCHES
# ==================================================================================

  - it: "should find dw.catalog namespace classes"
    request:
      jsonrpc: "2.0"
      id: "domain-catalog"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "domain-catalog"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.catalog"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find dw.customer namespace classes"
    request:
      jsonrpc: "2.0"
      id: "domain-customer"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "customer"
    expect:
      response:
        jsonrpc: "2.0"
        id: "domain-customer"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.customer"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find dw.order namespace classes"
    request:
      jsonrpc: "2.0"
      id: "domain-order"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "order"
    expect:
      response:
        jsonrpc: "2.0"
        id: "domain-order"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.order"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find dw.system namespace classes"
    request:
      jsonrpc: "2.0"
      id: "domain-system"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "system"
    expect:
      response:
        jsonrpc: "2.0"
        id: "domain-system"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.system"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find dw.web namespace classes"
    request:
      jsonrpc: "2.0"
      id: "domain-web"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "web"
    expect:
      response:
        jsonrpc: "2.0"
        id: "domain-web"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.web"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find dw.util namespace classes"
    request:
      jsonrpc: "2.0"
      id: "domain-util"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "util"
    expect:
      response:
        jsonrpc: "2.0"
        id: "domain-util"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.util"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# FUNCTIONAL SEARCH TESTS
# ==================================================================================

  - it: "should find inventory-related classes"
    request:
      jsonrpc: "2.0"
      id: "func-inventory"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "inventory"
    expect:
      response:
        jsonrpc: "2.0"
        id: "func-inventory"
        result:
          content:
            - type: "text"
              text: "match:contains:ProductInventoryList"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find price-related classes"
    request:
      jsonrpc: "2.0"
      id: "func-price"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "price"
    expect:
      response:
        jsonrpc: "2.0"
        id: "func-price"
        result:
          content:
            - type: "text"
              text: "match:contains:PriceBook"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find basket-related classes"
    request:
      jsonrpc: "2.0"
      id: "func-basket"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "basket"
    expect:
      response:
        jsonrpc: "2.0"
        id: "func-basket"
        result:
          content:
            - type: "text"
              text: "match:contains:Basket"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find payment-related classes"
    request:
      jsonrpc: "2.0"
      id: "func-payment"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "payment"
    expect:
      response:
        jsonrpc: "2.0"
        id: "func-payment"
        result:
          content:
            - type: "text"
              text: "match:contains:Payment"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find shipping-related classes"
    request:
      jsonrpc: "2.0"
      id: "func-shipping"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "shipping"
    expect:
      response:
        jsonrpc: "2.0"
        id: "func-shipping"
        result:
          content:
            - type: "text"
              text: "match:contains:Shipping"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# ERROR HANDLING TESTS
# ==================================================================================

  - it: "should handle empty query gracefully"
    request:
      jsonrpc: "2.0"
      id: "error-empty-query"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: ""
    expect:
      response:
        jsonrpc: "2.0"
        id: "error-empty-query"
        result:
          content:
            - type: "text"
              text: "match:contains:Error"
          isError: true
      stderr: "toBeEmpty"

  - it: "should handle missing query parameter"
    request:
      jsonrpc: "2.0"
      id: "error-missing-query"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments: {}
    expect:
      response:
        jsonrpc: "2.0"
        id: "error-missing-query"
        result:
          content:
            - type: "text"
              text: "match:contains:query"
          isError: true
      stderr: "toBeEmpty"

  - it: "should handle non-existent terms gracefully"
    request:
      jsonrpc: "2.0"
      id: "search-nonexistent"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "zzznothingfound"
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-nonexistent"
        result:
          content:
            - type: "text"
              text: "match:regex:^\\[\\s*\\]$"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle special characters in query"
    request:
      jsonrpc: "2.0"
      id: "search-special-chars"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "!@#$%"
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-special-chars"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle very long query strings"
    request:
      jsonrpc: "2.0"
      id: "search-long-query"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "verylongquerystringthatdoesnotmatchanythingbutshouldbetreatedgracefully"
    expect:
      response:
        jsonrpc: "2.0"
        id: "search-long-query"
        result:
          content:
            - type: "text"
              text: "match:regex:^\\[\\s*\\]$"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# RESPONSE FORMAT VALIDATION
# ==================================================================================

  - it: "should return consistent MCP content structure"
    request:
      jsonrpc: "2.0"
      id: "format-content-structure"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "format-content-structure"
        result:
          content:
            match:arrayElements:
              match:partial:
                type: "text"
                text: "match:type:string"
          isError: false
      stderr: "toBeEmpty"

  - it: "should return single content item for successful calls"
    request:
      jsonrpc: "2.0"
      id: "format-single-content"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "product"
    expect:
      response:
        jsonrpc: "2.0"
        id: "format-single-content"
        result:
          content: "match:arrayLength:1"
          isError: false
      stderr: "toBeEmpty"

  - it: "should not set isError flag for successful responses"
    request:
      jsonrpc: "2.0"
      id: "format-no-error-flag"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "customer"
    expect:
      response:
        jsonrpc: "2.0"
        id: "format-no-error-flag"
        result:
          content: "match:type:array"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# EDGE CASES AND SEARCH BEHAVIOR
# ==================================================================================

  - it: "should handle numeric query terms"
    request:
      jsonrpc: "2.0"
      id: "edge-numeric-query"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "123"
    expect:
      response:
        jsonrpc: "2.0"
        id: "edge-numeric-query"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle whitespace in query"
    request:
      jsonrpc: "2.0"
      id: "edge-whitespace"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "  catalog  "
    expect:
      response:
        jsonrpc: "2.0"
        id: "edge-whitespace"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle common abbreviations"
    request:
      jsonrpc: "2.0"
      id: "edge-abbreviations"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "mgr"  # Should find manager classes
    expect:
      response:
        jsonrpc: "2.0"
        id: "edge-abbreviations"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should handle dots in search terms"
    request:
      jsonrpc: "2.0"
      id: "edge-dots"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "dw.catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "edge-dots"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# PERFORMANCE AND CONSISTENCY VALIDATION
# ==================================================================================

  - it: "should respond consistently for repeated searches"
    request:
      jsonrpc: "2.0"
      id: "perf-consistent-1"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-consistent-1"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

  - it: "should respond consistently for repeated searches (second time)"
    request:
      jsonrpc: "2.0"
      id: "perf-consistent-2"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-consistent-2"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      stderr: "toBeEmpty"

# ==================================================================================
# PERFORMANCE TIMING TESTS
# ==================================================================================

  - it: "should return search results within acceptable time"
    request:
      jsonrpc: "2.0"
      id: "perf-basic-timing"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-basic-timing"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      performance:
        maxResponseTime: "100ms"  # Search should be fast
      stderr: "toBeEmpty"

  - it: "should handle complex searches efficiently"
    request:
      jsonrpc: "2.0"
      id: "perf-complex-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "product"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-complex-search"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      performance:
        maxResponseTime: "100ms"  # Even complex searches should be under 100ms
      stderr: "toBeEmpty"

  - it: "should handle partial searches quickly"
    request:
      jsonrpc: "2.0"
      id: "perf-partial-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "cat"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-partial-search"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      performance:
        maxResponseTime: "100ms"  # Partial searches should be fast
      stderr: "toBeEmpty"

  - it: "should handle no-result searches efficiently"
    request:
      jsonrpc: "2.0"
      id: "perf-no-results"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "zzznothingfound"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-no-results"
        result:
          content:
            - type: "text"
              text: "match:regex:^\\[\\s*\\]$"
          isError: false
      performance:
        maxResponseTime: "150ms"  # No results should be very fast
      stderr: "toBeEmpty"

  - it: "should handle error cases quickly"
    request:
      jsonrpc: "2.0"
      id: "perf-error-timing"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: ""
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-error-timing"
        result:
          content:
            - type: "text"
              text: "match:contains:Error"
          isError: true
      performance:
        maxResponseTime: "150ms"  # Error handling should be very fast
      stderr: "toBeEmpty"

  - it: "should handle cached results quickly"
    request:
      jsonrpc: "2.0"
      id: "perf-cached-search"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "catalog"  # Same as first test - should be cached
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-cached-search"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      performance:
        maxResponseTime: "150ms"  # Cached responses should be extremely fast
      stderr: "toBeEmpty"

  - it: "should handle single character searches within timeout"
    request:
      jsonrpc: "2.0"
      id: "perf-single-char-timing"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "c"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-single-char-timing"
        result:
          content:
            - type: "text"
              text: "match:regex:\\[[\\s\\S]*\\]"
          isError: false
      performance:
        maxResponseTime: "100ms"  # Single char searches might return many results
      stderr: "toBeEmpty"

  - it: "should handle long queries efficiently"
    request:
      jsonrpc: "2.0"
      id: "perf-long-query-timing"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "verylongquerystringthatdoesnotmatchanythingbutshouldbetreatedgracefully"
    expect:
      response:
        jsonrpc: "2.0"
        id: "perf-long-query-timing"
        result:
          content:
            - type: "text"
              text: "match:regex:^\\[\\s*\\]$"
          isError: false
      performance:
        maxResponseTime: "150ms"  # Long queries with no results should be fast
      stderr: "toBeEmpty"

# ==================================================================================
# SEARCH QUALITY AND RELEVANCE TESTS
# ==================================================================================

  - it: "should prioritize exact matches for common terms"
    request:
      jsonrpc: "2.0"
      id: "quality-exact-match"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "Product"
    expect:
      response:
        jsonrpc: "2.0"
        id: "quality-exact-match"
        result:
          content:
            - type: "text"
              text: "match:contains:dw.catalog.Product"
          isError: false
      stderr: "toBeEmpty"

  - it: "should find classes by functionality"
    request:
      jsonrpc: "2.0"
      id: "quality-functionality"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "inventory"
    expect:
      response:
        jsonrpc: "2.0"
        id: "quality-functionality"
        result:
          content:
            - type: "text"
              text: "match:contains:ProductInventoryList"
          isError: false
      stderr: "toBeEmpty"

  - it: "should include relevant namespace classes"
    request:
      jsonrpc: "2.0"
      id: "quality-namespace"
      method: "tools/call"
      params:
        name: "search_sfcc_classes"
        arguments:
          query: "system"
    expect:
      response:
        jsonrpc: "2.0"
        id: "quality-namespace"
        result:
          content:
            - type: "text"
              text: "match:regex:dw\\.system\\."
          isError: false
      stderr: "toBeEmpty"

```

--------------------------------------------------------------------------------
/docs/TopLevel/String.md:
--------------------------------------------------------------------------------

```markdown
## Package: TopLevel

# Class String

## Inheritance Hierarchy

- Object
  - String

## Description

The String object represents any sequence of zero or more characters that are to be treated strictly as text.

## Properties

### length

**Type:** Number

The length of the String object.

## Constructor Summary

String() Constructs the String.

String(num : Number) Constructs the String from the specified Number object.

String(str : String) Constructs a new String from the specified String object.

## Method Summary

### charAt

**Signature:** `charAt(index : Number) : String`

Returns a string containing the character at position index.

### charCodeAt

**Signature:** `charCodeAt(index : Number) : Number`

Returns the UTF-16 code unit at the given position index.

### codePointAt

**Signature:** `codePointAt(index : Number) : Number`

Returns the Unicode code point at the given position index.

### concat

**Signature:** `concat(strings : String...) : String`

Returns a new String created by concatenating the string arguments together.

### endsWith

**Signature:** `endsWith(searchString : String) : boolean`

Tests if this string ends with a given string.

### endsWith

**Signature:** `endsWith(searchString : String, length : Number) : boolean`

Tests if this string ends with a given string.

### equals

**Signature:** `equals(obj : Object) : boolean`

Returns true if this string is equal to the string representation of the passed objects.

### equalsIgnoreCase

**Signature:** `equalsIgnoreCase(obj : Object) : boolean`

Returns true if this string is equal to the string representation of the passed objects.

### fromCharCode

**Signature:** `static fromCharCode(c : Number...) : String`

Returns a new String from one or more UTF-16 code units.

### fromCodePoint

**Signature:** `static fromCodePoint(c : Number...) : String`

Returns a new String from one or more characters with Unicode code points.

### includes

**Signature:** `includes(substring : String) : boolean`

Returns if substring is contained in this String object.

### includes

**Signature:** `includes(substring : String, start : Number) : boolean`

Returns if substring is contained in this String object.

### indexOf

**Signature:** `indexOf(substring : String) : Number`

Returns the index of substring in this String object.

### indexOf

**Signature:** `indexOf(substring : String, start : Number) : Number`

Returns the index of substring in this String object using the specified start value as the location to begin searching.

### lastIndexOf

**Signature:** `lastIndexOf(substring : String) : Number`

Returns the last index of substring in this String object.

### lastIndexOf

**Signature:** `lastIndexOf(substring : String, start : Number) : Number`

Returns the last index of substring in this String object, using the specified start position as the location from which to begin the search.

### localeCompare

**Signature:** `localeCompare(other : String) : Number`

Returns a number indicating whether the current String sorts before, the same as, or after the parameter other, based on browser and system-dependent string localization.

### match

**Signature:** `match(regexp : RegExp) : String[]`

Returns an array of strings that match the regular expression regexp.

### normalize

**Signature:** `normalize() : String`

Returns the normalized form of this Unicode string.

### normalize

**Signature:** `normalize(form : String) : String`

Returns the normalized form of this Unicode string according to the standard as described in https://unicode.org/reports/tr15/.

### padEnd

**Signature:** `padEnd(targetLength : Number) : String`

Appends space characters to the current string to ensure the resulting string reaches the given target length.

### padEnd

**Signature:** `padEnd(targetLength : Number, fillString : String) : String`

Appends a string (possibly multiple times) to the current string to ensure the resulting string reaches the given target length.

### padStart

**Signature:** `padStart(targetLength : Number) : String`

Prepends space characters to the current string to ensure the resulting string reaches the given target length.

### padStart

**Signature:** `padStart(targetLength : Number, fillString : String) : String`

Prepends a string (possibly multiple times) to the current string to ensure the resulting string reaches the given target length.

### raw

**Signature:** `static raw(callSite : Object, substitutions : String...) : String`

The static String.raw() method is a tag function of template literals.

### repeat

**Signature:** `repeat(count : Number) : String`

Returns a new string repeating this string the given number of times.

### replace

**Signature:** `replace(regexp : RegExp, replacement : String) : String`

Returns a new String that results when matches of the regexp parameter are replaced by the replacement parameter.

### replace

**Signature:** `replace(regexp : RegExp, function : Function) : String`

Returns a new String that results when matches of the regexp parameter are replaced by using the specified function.

### replace

**Signature:** `replace(literal : String, replacement : String) : String`

Returns a new String that results when matches of the literal parameter are replaced by the replacement parameter.

### replace

**Signature:** `replace(literal : String, replacement : String, flags : String) : String`

Returns a new String that results when matches of the literal parameter are replaced by the replacement parameter.

### replace

**Signature:** `replace(literal : String, function : Function) : String`

Returns a new String that results when matches of the literal parameter are replaced by using the specified function.

### replace

**Signature:** `replace(literal : String, function : Function, flags : String) : String`

Returns a new String that results when matches of the literal parameter are replaced by using the specified function.

### search

**Signature:** `search(regexp : RegExp) : Number`

Searches for a match between the passed regular expression and this string and returns the zero-based index of the match, or -1 if no match is found.

### slice

**Signature:** `slice(start : Number, end : Number) : String`

Returns a substring of the current String where the specified start and end locations are used to delimit the String.

### split

**Signature:** `split(delimiter : String) : String[]`

Returns an array of String instances created by splitting the current String based on the delimiter.

### split

**Signature:** `split(regexp : RegExp) : String[]`

Returns an array of String instances created by splitting the current String based on the regular expression.

### split

**Signature:** `split(delimiter : String, limit : Number) : String[]`

Returns an array of String instances created by splitting the current String based on the delimiter and limited in size by the limit parameter.

### split

**Signature:** `split(regexp : RegExp, limit : Number) : String[]`

Returns an array of String instances created by splitting the current String based on the regular expression and limited in size by the limit parameter.

### startsWith

**Signature:** `startsWith(searchString : String) : boolean`

Tests if this string starts with a given string.

### startsWith

**Signature:** `startsWith(searchString : String, position : Number) : boolean`

Tests if this string starts with a given string.

### substr

**Signature:** `substr(start : Number) : String`

Creates and returns a new String by splitting the current string at the specified start location until the end of the String.

### substr

**Signature:** `substr(start : Number, length : Number) : String`

Creates and returns a new String by splitting the current string at the specified start location and limited by the length value.

### substring

**Signature:** `substring(from : Number) : String`

Creates and returns a new String by splitting the current string at the specified from location until the end of the String.

### substring

**Signature:** `substring(from : Number, to : Number) : String`

Creates and returns a new String by splitting the current string at the specified from location until the specified to location.

### toLocaleLowerCase

**Signature:** `toLocaleLowerCase() : String`

Returns a copy of the current string in all lower-case letters.

### toLocaleUpperCase

**Signature:** `toLocaleUpperCase() : String`

Returns a copy of the current string in all upper-case letters.

### toLowerCase

**Signature:** `toLowerCase() : String`

Returns a copy of the current string in all lower-case letters.

### toString

**Signature:** `toString() : String`

Returns a String value of this object.

### toUpperCase

**Signature:** `toUpperCase() : String`

Returns a copy of the current string in all upper-case letters.

### trim

**Signature:** `trim() : String`

Removes white space characters at the start and the end of the string.

### trimEnd

**Signature:** `trimEnd() : String`

Removes white space characters at the end of the string.

### trimLeft

**Signature:** `trimLeft() : String`

Removes white space characters at the start of the string.

### trimRight

**Signature:** `trimRight() : String`

Removes white space characters at the end of the string.

### trimStart

**Signature:** `trimStart() : String`

Removes white space characters at the start of the string.

### valueOf

**Signature:** `valueOf() : String`

Returns a String value of this object.

## Constructor Detail

## Method Detail

## Method Details

### charAt

**Signature:** `charAt(index : Number) : String`

**Description:** Returns a string containing the character at position index. You should use this method instead of substring when you need only a single character.

**Parameters:**

- `index`: the index at which the character string is located.

**Returns:**

a string containing the character at position index.

---

### charCodeAt

**Signature:** `charCodeAt(index : Number) : Number`

**Description:** Returns the UTF-16 code unit at the given position index. If the position is invalid NaN is returned.

**Parameters:**

- `index`: The index of the code unit within the string.

**Returns:**

a non-negative integer representing a UTF-16 code unit or NaN if the index is not valid.

---

### codePointAt

**Signature:** `codePointAt(index : Number) : Number`

**Description:** Returns the Unicode code point at the given position index. The index is a position within the string in UTF-16 encoding. If the index points to the begin of a surrogate pair the only the code unit at the position is returned. If the index is invalid undefined is returned.

**API Versioned:**

From version 21.2.

**Parameters:**

- `index`: The index of the starting code unit within the string.

**Returns:**

The Unicode code point, an UTF-16 code unit or undefined.

---

### concat

**Signature:** `concat(strings : String...) : String`

**Description:** Returns a new String created by concatenating the string arguments together.

**Parameters:**

- `strings`: zero, one, or more String arguments

**Returns:**

a new String created by concatenating the string arguments together.

---

### endsWith

**Signature:** `endsWith(searchString : String) : boolean`

**Description:** Tests if this string ends with a given string.

**API Versioned:**

From version 21.2.

**Parameters:**

- `searchString`: The characters to be searched for this string.

**Returns:**

true if the search string was found else false

---

### endsWith

**Signature:** `endsWith(searchString : String, length : Number) : boolean`

**Description:** Tests if this string ends with a given string.

**API Versioned:**

From version 21.2.

**Parameters:**

- `searchString`: The characters to be searched for this string.
- `length`: Assumes this string has only this given length.

**Returns:**

true if the search string was found else false

---

### equals

**Signature:** `equals(obj : Object) : boolean`

**Description:** Returns true if this string is equal to the string representation of the passed objects.

**Parameters:**

- `obj`: another object, typically another string

---

### equalsIgnoreCase

**Signature:** `equalsIgnoreCase(obj : Object) : boolean`

**Description:** Returns true if this string is equal to the string representation of the passed objects. The comparison is done case insensitive.

**Parameters:**

- `obj`: another object, typically another string

---

### fromCharCode

**Signature:** `static fromCharCode(c : Number...) : String`

**Description:** Returns a new String from one or more UTF-16 code units.

**Parameters:**

- `c`: zero, one, or more UTF-16 code units.

---

### fromCodePoint

**Signature:** `static fromCodePoint(c : Number...) : String`

**Description:** Returns a new String from one or more characters with Unicode code points.

**API Versioned:**

From version 21.2.

**Parameters:**

- `c`: zero, one, or more code points.

---

### includes

**Signature:** `includes(substring : String) : boolean`

**Description:** Returns if substring is contained in this String object.

**API Versioned:**

From version 21.2.

**Parameters:**

- `substring`: the String to search for in this String.

**Returns:**

true if substring occurs within the current string, else false.

---

### includes

**Signature:** `includes(substring : String, start : Number) : boolean`

**Description:** Returns if substring is contained in this String object.

**API Versioned:**

From version 21.2.

**Parameters:**

- `substring`: the String to search for in this String.
- `start`: the location in the String from which to begin the search.

**Returns:**

true if substring occurs within the current string, else false.

---

### indexOf

**Signature:** `indexOf(substring : String) : Number`

**Description:** Returns the index of substring in this String object. If there is no match, -1 is returned.

**Parameters:**

- `substring`: the String to search for in this String.

**Returns:**

the index of substring or -1.

---

### indexOf

**Signature:** `indexOf(substring : String, start : Number) : Number`

**Description:** Returns the index of substring in this String object using the specified start value as the location to begin searching. If there is no match, -1 is returned.

**Parameters:**

- `substring`: the String to search for in this String.
- `start`: the location in the String from which to begin the search.

**Returns:**

the index of substring or -1.

---

### lastIndexOf

**Signature:** `lastIndexOf(substring : String) : Number`

**Description:** Returns the last index of substring in this String object. If there is no match, -1 is returned.

**Parameters:**

- `substring`: the String to search for in this String.

**Returns:**

the last index of substring or -1.

---

### lastIndexOf

**Signature:** `lastIndexOf(substring : String, start : Number) : Number`

**Description:** Returns the last index of substring in this String object, using the specified start position as the location from which to begin the search. If there is no match, -1 is returned.

**Parameters:**

- `substring`: the String to search for in this String.
- `start`: the location from which to begin the search.

**Returns:**

the last index of substring or -1.

---

### localeCompare

**Signature:** `localeCompare(other : String) : Number`

**Description:** Returns a number indicating whether the current String sorts before, the same as, or after the parameter other, based on browser and system-dependent string localization.

**Parameters:**

- `other`: the String to compare against this String.

**Returns:**

a number indicating whether the current String sorts before, the same as, or after the parameter other.

---

### match

**Signature:** `match(regexp : RegExp) : String[]`

**Description:** Returns an array of strings that match the regular expression regexp.

**Parameters:**

- `regexp`: the regular expression to use.

**Returns:**

an array of strings that match the regular expression.

---

### normalize

**Signature:** `normalize() : String`

**Description:** Returns the normalized form of this Unicode string. Same as calling normalize(String) with parameter 'NFC'.

**API Versioned:**

From version 21.2.

**Returns:**

The normalized form of this Unicode string.

---

### normalize

**Signature:** `normalize(form : String) : String`

**Description:** Returns the normalized form of this Unicode string according to the standard as described in https://unicode.org/reports/tr15/. In a normalized string, identical text is replaced by identical sequences of code points.

**API Versioned:**

From version 21.2.

**Parameters:**

- `form`: The normalization variant to use. Must be one of 'NFC', 'NFD', 'NFKC', 'NFKD'.

**Returns:**

The normalized form of this Unicode string.

---

### padEnd

**Signature:** `padEnd(targetLength : Number) : String`

**Description:** Appends space characters to the current string to ensure the resulting string reaches the given target length.

**API Versioned:**

From version 21.2.

**Parameters:**

- `targetLength`: The length to be reached.

**Returns:**

This string if the string length is already greater than or equal to the target length. Else a new string with the targetLength ending with space characters.

---

### padEnd

**Signature:** `padEnd(targetLength : Number, fillString : String) : String`

**Description:** Appends a string (possibly multiple times) to the current string to ensure the resulting string reaches the given target length.

**API Versioned:**

From version 21.2.

**Parameters:**

- `targetLength`: The length to be reached.
- `fillString`: The string providing the characters to be used for filling.

**Returns:**

This string if the string length is already greater than or equal to the target length. Else a new string with the targetLength with the (possibly multiple times) added and truncated fillString.

---

### padStart

**Signature:** `padStart(targetLength : Number) : String`

**Description:** Prepends space characters to the current string to ensure the resulting string reaches the given target length.

**API Versioned:**

From version 21.2.

**Parameters:**

- `targetLength`: The length to be reached.

**Returns:**

This string if the string length is already greater than or equal to the target length. Else a new string with the targetLength starting with space characters.

---

### padStart

**Signature:** `padStart(targetLength : Number, fillString : String) : String`

**Description:** Prepends a string (possibly multiple times) to the current string to ensure the resulting string reaches the given target length.

**API Versioned:**

From version 21.2.

**Parameters:**

- `targetLength`: The length to be reached.
- `fillString`: The string providing the characters to be used for filling.

**Returns:**

This string if the string length is already greater than or equal to the target length. Else a new string with the targetLength with the (possibly multiple times) added and truncated fillString.

---

### raw

**Signature:** `static raw(callSite : Object, substitutions : String...) : String`

**Description:** The static String.raw() method is a tag function of template literals. It can be used in different ways: String.raw`Hello\n${40+2}!`; // returns: Hello\n42! // \ is here not an escape character like in string literals String.raw({ raw: ['a', 'b', 'c'] }, '-', '.' ); // returns: a-b.c

**API Versioned:**

From version 22.7.

**Parameters:**

- `callSite`: A well-formed template call site object, like { raw: ['a', 'b', 'c'] }.
- `substitutions`: The substitution values.

**Returns:**

A string constructed by the template with filled substitutions.

---

### repeat

**Signature:** `repeat(count : Number) : String`

**Description:** Returns a new string repeating this string the given number of times.

**API Versioned:**

From version 21.2.

**Parameters:**

- `count`: The number of times this string should be repeated. Must be non-negative.

**Returns:**

A new string repeating this string the given number of times.

---

### replace

**Signature:** `replace(regexp : RegExp, replacement : String) : String`

**Description:** Returns a new String that results when matches of the regexp parameter are replaced by the replacement parameter. The original String is not modified so you must capture the new String in a variable to preserve changes. If regexp has the global flag set, all occurrences are replaced, if the global flag is not set only the first occurrence is replaced.

**Parameters:**

- `regexp`: the regular expression to use.
- `replacement`: a String that is to take the place of all matches of regexp in the current String.

**Returns:**

a new String that results when matches of the regexp parameter are replaced by the replacement.

---

### replace

**Signature:** `replace(regexp : RegExp, function : Function) : String`

**Description:** Returns a new String that results when matches of the regexp parameter are replaced by using the specified function. The original String is not modified so you must capture the new String in a variable to preserve changes. When you specify a function as the second parameter, the function is invoked after the match has been performed.

**Parameters:**

- `regexp`: the regular expression to use.
- `function`: a Function that operates on matches of regexp in the current String.

**Returns:**

a new String that results when matches of the regexp parameter are replaced by the function.

---

### replace

**Signature:** `replace(literal : String, replacement : String) : String`

**Description:** Returns a new String that results when matches of the literal parameter are replaced by the replacement parameter. The original String is not modified so you must capture the new String in a variable to preserve changes. This method only replaces the first occurrence of the literal. To replace all occurrences see the polymorphic method with a regular expression as argument.

**Parameters:**

- `literal`: the literal string to locate.
- `replacement`: a String that is to take the place of all matches of regexp in the current String.

**Returns:**

a new String that results when the first match of the literal parameter is replaced by the replacement parameter.

---

### replace

**Signature:** `replace(literal : String, replacement : String, flags : String) : String`

**Description:** Returns a new String that results when matches of the literal parameter are replaced by the replacement parameter. The original String is not modified so you must capture the new String in a variable to preserve changes. This method only replaces the first occurrence of the literal. To replace all occurrences see the polymorphic method with a regular expression as argument. Note that if flags

**API Versioned:**

No longer available as of version 21.2.

**Deprecated:**

Use replace(RegExp, String) instead.

**Parameters:**

- `literal`: the literal string to locate.
- `replacement`: a String that is to take the place of all matches of regexp in the current String.
- `flags`: a String containing any combination of the Regular Expression flags of g - global match, i - ignore case, m - match over multiple lines.

**Returns:**

a new String that results when the first match of the literal parameter is replaced by the replacement parameter.

---

### replace

**Signature:** `replace(literal : String, function : Function) : String`

**Description:** Returns a new String that results when matches of the literal parameter are replaced by using the specified function. The original String is not modified so you must capture the new String in a variable to preserve changes. When you specify a function as the second parameter, the function is invoked after the match has been performed.

**Parameters:**

- `literal`: the literal string to locate.
- `function`: a Function that operates on the match of literal in the current String.

**Returns:**

a new String that results when the first match of the literal parameter is replaced by the specified function.

---

### replace

**Signature:** `replace(literal : String, function : Function, flags : String) : String`

**Description:** Returns a new String that results when matches of the literal parameter are replaced by using the specified function. The original String is not modified so you must capture the new String in a variable to preserve changes. When you specify a function as the second parameter, the function is invoked after the match has been performed.

**API Versioned:**

No longer available as of version 21.2.

**Deprecated:**

Use replace(RegExp, Function) instead.

**Parameters:**

- `literal`: the literal string to locate.
- `function`: a Function that operates on the match of literal in the current String.
- `flags`: a String containing any combination of the Regular Expression flags of g - global match, i - ignore case, m - match over multiple lines.

**Returns:**

a new String that results when the first match of the literal parameter is replaced by the specified function.

---

### search

**Signature:** `search(regexp : RegExp) : Number`

**Description:** Searches for a match between the passed regular expression and this string and returns the zero-based index of the match, or -1 if no match is found.

**Parameters:**

- `regexp`: the regular expression to use.

**Returns:**

the zero-based indexed value of the first character in the current string that matches the pattern of the regular expression regexp, or -1 if no match is found.

---

### slice

**Signature:** `slice(start : Number, end : Number) : String`

**Description:** Returns a substring of the current String where the specified start and end locations are used to delimit the String.

**Parameters:**

- `start`: the start position in the current String from which the slice will begin.
- `end`: the end position in the current String from which the slice will terminate.

**Returns:**

the String between the start and end positions.

---

### split

**Signature:** `split(delimiter : String) : String[]`

**Description:** Returns an array of String instances created by splitting the current String based on the delimiter.

**Parameters:**

- `delimiter`: the delimiter to use to split the string.

**Returns:**

an array of String instances created by splitting the current String based on the delimiter.

---

### split

**Signature:** `split(regexp : RegExp) : String[]`

**Description:** Returns an array of String instances created by splitting the current String based on the regular expression.

**Parameters:**

- `regexp`: the regular expression to use to split the string.

**Returns:**

an array of String instances created by splitting the current String based on the regular expression.

---

### split

**Signature:** `split(delimiter : String, limit : Number) : String[]`

**Description:** Returns an array of String instances created by splitting the current String based on the delimiter and limited in size by the limit parameter.

**Parameters:**

- `delimiter`: the delimiter to use to split the string.
- `limit`: controls the maximum number of items that will be returned.

**Returns:**

an array of String instances created by splitting the current String based on the delimiter and limited in size by the limit parameter.

---

### split

**Signature:** `split(regexp : RegExp, limit : Number) : String[]`

**Description:** Returns an array of String instances created by splitting the current String based on the regular expression and limited in size by the limit parameter.

**Parameters:**

- `regexp`: the regular expression to use to split the string.
- `limit`: controls the maximum number of items that will be returned.

**Returns:**

an array of String instances created by splitting the current String based on the regular expression and limited in size by the limit parameter.

---

### startsWith

**Signature:** `startsWith(searchString : String) : boolean`

**Description:** Tests if this string starts with a given string.

**API Versioned:**

From version 21.2.

**Parameters:**

- `searchString`: The characters to be searched for this string.

**Returns:**

true if the search string was found else false

---

### startsWith

**Signature:** `startsWith(searchString : String, position : Number) : boolean`

**Description:** Tests if this string starts with a given string.

**API Versioned:**

From version 21.2.

**Parameters:**

- `searchString`: The characters to be searched for this string.
- `position`: The position in this string at which to begin searching for searchString.

**Returns:**

true if the search string was found else false

---

### substr

**Signature:** `substr(start : Number) : String`

**Description:** Creates and returns a new String by splitting the current string at the specified start location until the end of the String.

**Parameters:**

- `start`: the start position in the current string from which the new string will be created.

**Returns:**

a new String created by splitting the current string starting at the specified start location until the end of the String.

---

### substr

**Signature:** `substr(start : Number, length : Number) : String`

**Description:** Creates and returns a new String by splitting the current string at the specified start location and limited by the length value.

**Parameters:**

- `start`: the start position in the current string from which the new string will be created.
- `length`: controls the length of the new string.

**Returns:**

a new String created by splitting the current string starting at the specified start location and limited by the length value.

---

### substring

**Signature:** `substring(from : Number) : String`

**Description:** Creates and returns a new String by splitting the current string at the specified from location until the end of the String.

**Parameters:**

- `from`: the start position in the current string from which the new string will be created.

**Returns:**

a new String created by splitting the current string starting at the specified from location until the end of the String.

---

### substring

**Signature:** `substring(from : Number, to : Number) : String`

**Description:** Creates and returns a new String by splitting the current string at the specified from location until the specified to location.

**Parameters:**

- `from`: the start position in the current string from which the new string will be created.
- `to`: the end position in the current string from which the new string will be created.

**Returns:**

a new String created by splitting the current string starting at the specified from location until the specified to location. value.

---

### toLocaleLowerCase

**Signature:** `toLocaleLowerCase() : String`

**Description:** Returns a copy of the current string in all lower-case letters.

**Returns:**

a copy of the current string in all lower-case letters.

---

### toLocaleUpperCase

**Signature:** `toLocaleUpperCase() : String`

**Description:** Returns a copy of the current string in all upper-case letters.

**Returns:**

a copy of the current string in all upper-case letters.

---

### toLowerCase

**Signature:** `toLowerCase() : String`

**Description:** Returns a copy of the current string in all lower-case letters.

**Returns:**

a copy of the current string in all lower-case letters.

---

### toString

**Signature:** `toString() : String`

**Description:** Returns a String value of this object.

**Returns:**

a String value of this object.

---

### toUpperCase

**Signature:** `toUpperCase() : String`

**Description:** Returns a copy of the current string in all upper-case letters.

**Returns:**

a copy of the current string in all upper-case letters.

---

### trim

**Signature:** `trim() : String`

**Description:** Removes white space characters at the start and the end of the string.

**Returns:**

A new string without leading and ending white space characters.

---

### trimEnd

**Signature:** `trimEnd() : String`

**Description:** Removes white space characters at the end of the string.

**API Versioned:**

From version 21.2.

**Returns:**

A new string without ending white space characters.

---

### trimLeft

**Signature:** `trimLeft() : String`

**Description:** Removes white space characters at the start of the string. trimStart() should be used instead of this.

**API Versioned:**

From version 21.2.

**Returns:**

A new string without leading white space characters.

---

### trimRight

**Signature:** `trimRight() : String`

**Description:** Removes white space characters at the end of the string. trimEnd() should be used instead of this.

**API Versioned:**

From version 21.2.

**Returns:**

A new string without ending white space characters.

---

### trimStart

**Signature:** `trimStart() : String`

**Description:** Removes white space characters at the start of the string.

**API Versioned:**

From version 21.2.

**Returns:**

A new string without leading white space characters.

---

### valueOf

**Signature:** `valueOf() : String`

**Description:** Returns a String value of this object.

**Returns:**

a String value of this object.

---
```
Page 32/43FirstPrevNextLast