Latest Releases

These releases come straight from our repositories. Latest releases may not be published yet.

swissup / argento-hyva

1.3.6 Jul

swissup / argento-breeze

3.1.0 Jul
  • 3.1.0

    Report (rev.1)

    Package was generated and uploaded to GitHub on with the following dependencies:

    swissup/module-ajaxpro:1.7.36

    swissup/module-ajaxsearch:1.14.10

    swissup/module-amp:1.6.0

    swissup/module-askit:1.14.24

    swissup/module-attributepages:1.8.6

    swissup/module-breeze-ai:1.0.7

    swissup/module-breeze-content-builder-migration:1.0.1

    swissup/module-breeze-layout-builder:1.0.0

    swissup/module-chat-gpt-assistant:1.1.4

    swissup/module-compare:1.2.8

    swissup/module-easy-slide:1.8.18

    swissup/module-easybanner:1.9.24

    swissup/module-easycatalogimg:1.5.14

    swissup/module-easytabs:1.13.4

    swissup/module-fblike:1.3.9

    swissup/module-featured-attributes:1.1.9

    swissup/module-gdpr:1.9.1

    swissup/module-gdpr-askit:1.1.3

    swissup/module-gdpr-reviewreminder:1.0.0

    swissup/module-gdpr-testimonials:1.1.1

    swissup/module-highlight:1.11.9

    swissup/module-hover-gallery:1.3.15

    swissup/module-hreflang:1.6.12

    swissup/module-hreflang-import-export:1.0.1

    swissup/module-navigationpro:1.18.0

    swissup/module-pagespeed:1.18.0

    swissup/module-pro-labels:1.10.0

    swissup/module-pro-labels-configurable-product:1.0.9

    swissup/module-quantity-switcher:1.2.2

    swissup/module-reviewreminder:1.1.19

    swissup/module-rich-snippets:1.8.4

    swissup/module-seo-canonical:1.11.10

    swissup/module-seo-core:1.3.10

    swissup/module-seo-cross-links:1.1.26

    swissup/module-seo-html-sitemap:1.1.23

    swissup/module-seo-images:1.3.21

    swissup/module-seo-pager:1.4.0

    swissup/module-seo-templates:1.7.12

    swissup/module-seo-urls:1.5.55

    swissup/module-seo-xml-sitemap:1.2.0

    swissup/module-sold-together:1.11.4

    swissup/module-sold-together-email:1.0.0

    swissup/module-sold-together-import-export:1.0.2

    swissup/module-testimonials:1.4.0

    swissup/module-theme-editor-argentobreeze-business:1.0.2

    swissup/module-theme-editor-argentobreeze-chic:1.0.3

    swissup/module-theme-editor-argentobreeze-force:1.1.1

    swissup/module-theme-editor-argentobreeze-stripes:1.1.2

    swissup/theme-frontend-argentobreeze-blank:3.1.0

    swissup/theme-frontend-argentobreeze-business:3.0.1

    swissup/theme-frontend-argentobreeze-chic:3.0.0

    swissup/theme-frontend-argentobreeze-force:3.0.0

    swissup/theme-frontend-argentobreeze-stripes:3.1.0

    swissup/module-core:1.12.27

    swissup/module-suggestpage:1.2.14

    swissup/module-breeze-content-builder:1.0.6

    swissup/module-image-optimizer:1.0.12

    swissup/module-theme-editor:1.12.0

    Changelog (autogenerated)

    swissup/module-ajaxpro — 1.7.36 (was 1.7.34)
    • Version 1.7.36 82272a

    • test: config options and type-source coverage

      Covers the options x settings surface at the logic level:
      - Helper\Config: master switch (every feature off when
      ajaxpro/main/enabled is 0), the override-minicart handle whitelist
      (allowed only for minicart / shopping-cart handles, matching the
      system.xml depends), standalone flags that ignore the master switch,
      and type casts.
      - Source\Handle / Source\Type: lock the popup handle and cart type
      enumerations referenced by name across system.xml, layout and config.

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> 8f91cf

    • test: popup gating matrix across component flavors and popup types

      Runs the gating scenarios (popup after add-to-cart, silence on stale
      re-fetch, redirect flow) for every combination of component flavor
      (luma uiComponent / breeze view) and cartHandle popup type (minicart,
      shopping cart, suggest page), plus the simple-popup messages gate and
      closeTimeout config variations (disabled, countdown with continue
      button, reset on user activity).

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> ef33d0

    • test: integration coverage of the popup gating chain

      Covers section update -> _subscribe -> ModalManager.checkAndShow end
      to end: popup after add-to-cart post, popup after redirect-based add
      to cart, silence on stale section re-fetch (the bsxl scenario), no
      reopen after the popup was shown. This chain is the only protection
      on both stacks since disposableCustomerData was dropped (#54).

      Refs #54

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> 4f7514

    • refactor: drop disposableCustomerData, unify luma and breeze strategy

      Luma applied the disposableCustomerData extender to ajaxpro sections
      (wiping them from storage and section_data_ids cookie after use) while
      Breeze had it commented out — the divergence made stale-section bugs
      Breeze-only and the behavior hard to reason about.

      Since 048361e the popup opens only within 30s after a real add-to-cart
      post (is-ajaxpro-request marker), so a stale re-fetch on page load can
      not trigger it on either stack. Ajaxpro sections now persist like any
      other customer-data section on both frontends.

      Verified on luma storefront: popup on add to cart, section persists,
      stale section re-fetch on navigation stays silent.

      Closes #54

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> b0a6dd

    • refactor: replace PostHelper preference with a before plugin

      The preference on Magento\Framework\Data\Helper\PostHelper replaced
      the core class entirely and conflicted silently with other modules
      customizing the same helper. A before plugin composes instead.

      before (not after/around): the decision "caller did not pass uenc
      explicitly" is only visible in the original arguments, and no result
      re-serialization is needed. Semantics are identical to the old
      override: inside an ajax request reuse the real page uenc from the
      request parameters.

      Old helper class kept as @deprecated for code extending it.

      Closes #55

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> 4f0ca4

    • chore: strict_types in all php files, drop dead code

      - declare(strict_types=1) in every php file (project standard);
      verified with php -l, unit tests and storefront smoke run
      - remove commented-out debug/dead blocks (md5 debug, unused methods,
      disabled section actions)
      - drop stale deprecated setup_version from module.xml (no Setup/ dir)

      Refs #53

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> a46452

    • test: cover event handling hygiene fixes (issue #52)

      Refs #52

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> bf5db7

    • fix: event handling hygiene in frontend js

      - Namespace click handlers (.off('click.ajaxpro')) in floating cart
      and minicart override: bare .off() also removed handlers attached
      by other modules.
      - Cap modal-manager register() polling at 10s and register anyway:
      on pages with permanent ajax activity $.active never reaches 0 and
      the interval lived forever.
      - Dispose customer-data subscriptions on destroy (ajaxpro.js,
      compare.js) to avoid duplicate handlers after component re-init.
      - Fix dead fallback typo: form.prop('prop') -> form.prop('action').

      Closes #52

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> 635251

    • test: cover modal auto-close timer (issue #51)

      Refs #51

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> e53aaf

    • fix: modal auto-close timer throws instead of closing the modal

      setTimeout received this.closeModal unbound, so the closeTimeout
      feature fired with `this` pointing at window and threw a TypeError.
      Same defect in luma and breeze variants.

      Closes #51

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> d4fe2b

    • test: cover ajax notice message suppression (issue #49)

      Adds phpunit setup (mirrors module-breeze-theme-editor) and wires
      bin/test unit.

      Refs #49

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> 67257d

    • test: cover section reload once-guard (issue #50)

      Refs #50

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> ceb693

    • fix: infinite section reload loop on website/store mismatch

      Minicart and floating cart views reloaded cart sections whenever the
      cart section website_id/storeId diverged from window.checkout. When
      the quote really belongs to another website/store (same-domain
      multi-store), reloading can never fix the mismatch, and since the
      Breeze view re-creates on every contentUpdated, the check re-fired
      after each reload — an endless cart/ajaxpro-cart request stream.

      Reload at most once per page load and guard undefined website_id in
      the floating cart (undefined !== websiteId used to trigger it too).

      Closes #50

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> 84dcbd

    • fix: notice messages silently dropped on every ajax request

      isMessageToIgnore() compared strpos() result with 1 instead of false,
      so it returned true for nearly any message and addNoticeMessage()
      discarded all ajax notices — not only the two "choose options"
      messages it was meant to suppress.

      Closes #49

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> 79940e

    • Version 1.7.35 148d35

    • test: add jest suite for is-ajaxpro-request

      Setup mirrors module-breeze-theme-editor: jsdom, AMD transform,
      Magento_Customer mocks. Run with bin/test [jest].

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> e6ff4c

    • fix: popup opening on page load when ajaxpro sections expire

      Any GET customer/section/load with ajaxpro-product in sections was
      treated as an add-to-cart request. Expired ajaxpro sections (logged-in
      customer, out-of-sync section_data_ids cookie) are re-fetched on every
      page load, so the cart popup opened on plain category navigation.

      Trust the section load only within 30s after a real ajaxpro POST.
      Marker lives in sessionStorage: survives redirect-based add to cart,
      per-tab, cleared once the popup is shown.

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> 048361

    swissup/module-askit — 1.14.24 (was 1.14.23)
    • Version 1.14.24 3b54b7

    • test: drop addMethods() for PHPUnit 12 compatibility

      PHPUnit 12 removed MockBuilder::addMethods(). CaptchaTest used it to
      mock getControllerAction() on the Observer mock, but that is a magic
      DataObject getter, not a declared method.

      Replace the two mocks with a real Observer created with the data set
      (`new Observer(['controller_action' => $controller])`) so the magic
      getter returns the controller. Tests pass on both PHPUnit 9.6 (current
      CI) and PHPUnit 12.5.

      Refs swissup/module-askit#67

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 8412ad

    • Fixed php 8.4 error: Cannot unset property $totalCount because it might have hooks in a subclass a679be

    • Use the frontend URL builder directly in blocks (BCB preview fix) 82af94

    swissup/module-attributepages — 1.8.6 (was 1.8.5)
    • Added ability to move description to bottom:

      ```
      <referenceBlock name="attributepage.attribute.view">
      <arguments>
      <argument name="is_description_at_bottom" xsi:type="boolean">true</argument>
      </arguments>
      </referenceBlock>
      ``` f46297

    swissup/module-breeze-ai — 1.0.7 (was )
    • Version 1.0.7 61c0a2

    • fix(bulk): save category values in target store scope, not current store d01e4d

    • test(bulk): integration repro for category translate store scope bug 6ad2e6

    • feat(mcp): config flag to disable MCP endpoint

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> e3deb3

    • fix(bulk): use excludeMode() to detect cross-page Select All

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> c13907

    • test(mcp): unit and integration tests for MCP endpoint

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> 862703

    • docs(plan): add MCP server plan

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> a2adce

    • feat(mcp): MCP server endpoint with generate, translate, list_prompts and graphql tools

      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> 5befa0

    • Version 1.0.5 3cbcd3

    • feat(bulk): add SKU column with filter to the product grid

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 56d536

    • Version 1.0.4 d832eb

    • fix(translate): emulate target store when saving custom option titles

      ProductCustomOptionRepository::save() re-fetches the product by SKU without a
      store, so the option store_id is derived from Product::getStoreId(), which falls
      back to the current store. In the bulk queue consumer that is the default store,
      so translated option/value titles were written to the wrong store and the target
      store kept showing defaults. Emulate the target store around the save so titles
      persist on the intended store view.

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 5b9941

    • fix(bulk): show the "* Store-scoped custom attribute" note only when a * field exists

      Excluding url_key left installs with no dynamic attributes showing an orphaned
      legend. Render the note only when at least one translate field is dynamic.

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> e1e3cf

    • fix(bulk): add Select All for translate fields and real space between checkbox and label

      Magento's admin__control-checkbox hides the native input and draws the box via a
      label pseudo-element, so the flex gap added no visible spacing. Switch the
      translate field checkboxes to native inputs (visible, flex gap = real space) and
      add a "Select All" checkbox that toggles every field in the panel.

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> efd64b

    • Version 1.0.3 ae74dd

    • fix(translate): support All Store Views target and exclude url_key from auto-translate

      - Bulk translate to "All Store Views" (target_store_id=0) previously threw in the
      Translate skill (it requires a specific store) and would have written media/option
      titles to the default store. BulkConsumer now expands target 0 to every store view
      except the source, for products and categories alike.
      - url_key is excluded from dynamic attribute discovery: it is saved raw via
      updateAttributes() with no sanitization or URL-rewrite regeneration, so an AI
      translation would break product URLs.
      - translateCategories now also skips empty source values, matching products.

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 48d09b

    • feat(translate): translate customizable option titles and value titles in bulk

      Adds OptionTranslator (mirrors MediaTranslator): translates custom option titles
      and their value titles per store view via ProductRepository, which persists
      store-scoped title rows without touching default-store values. New bulk-translate
      pseudo-field "custom_options" routed from BulkConsumer. Closes #36.

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 8a5a0b

    • docs(tests): add bulk-translate scenarios for dynamic attributes, image labels and video

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 70bf34

    • test: replace willReturnMap with willReturnCallback for PHPUnit 9 compatibility

      Reproduced the CI failure with PHPUnit 9.6: willReturnMap matched getById()
      differently than PHPUnit 10 (it pads invocation args with the method's declared
      defaults before matching, so the 3-arg map entries never matched the 4-param
      getById signature), returning null and fataling before any test output — which
      the CI reports as "Internal server error". willReturnCallback is version-stable.
      Also give ProductAttributeProvider entity-type test a real assertion.

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 6113db

    • fix(media): replace nullsafe operator with explicit null checks

      The CI PHPUnit step bundles an older php-parser that fails on the nullsafe
      operator (?->), the only PHP 8.0+ syntax unique to this module's new code,
      crashing the runner before any test output. Use explicit null checks instead.

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 28e0e0

    • test(media): drop Magento gallery-interface mocks for CI compatibility

      The CI unit runner (PHPUnit 9, no generated/ code) chokes when mocking the
      media gallery entry interface because its extension-attribute methods type-hint
      generated-only classes. MediaTranslator only duck-types entry methods, so use
      anonymous-class entries and the concrete Product mock instead. Also inline the
      video-type check to drop the gallery interface import from production.

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 9d660b

    • test(media): use anonymous class for gallery extension stub

      Avoids both the "interface must be in its own file" coding-standard error and
      any reference to the generated extension interface. getExtensionAttributes() is
      untyped, so an anonymous class exposing getVideoContent() suffices.

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> e9d8d6

    • test(media): stub generated extension interface so unit tests run without code generation

      The CI unit step runs on a fresh checkout with no generated/ code; mocking
      ProductAttributeMediaGalleryEntryExtensionInterface directly autoloaded a
      generated-only class and crashed the runner. getExtensionAttributes() is
      untyped, so a local stub interface is sufficient.

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 9102d5

    • feat(translate): translate image labels, gallery labels and video metadata in bulk

      Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> 7df1e3

    • feat(translate): show frontend label with * suffix for dynamic attributes

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 60291a

    • feat(translate): dynamic product attributes via InputFieldProviderInterface

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> fbb8b1

    • fix(filter): skip nested arrays in attribute value implode

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 145340

    • Version 1.0.1 1eb344

    • fix(model): fix delete button using deleteConfirm like prompt delete button

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 7c11e6

    • fix(grid): remove unused checkbox columns from model and prompt grids

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> c06c48

    • fix(menu): use Swissup_Core parent, works without BreezeThemeEditor, fixes #32

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 818adc

    • fix(model): add dataType select to status and is_default columns in grid

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 70aa86

    • fix(prompt): add dataType select to status column in grid

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 1670cd

    • fix(prompt): unset empty entity_id on create to prevent UPDATE instead of INSERT

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> c905b5

    • fix(prompt): convert empty model_id to null, prevent FK violation on save

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 93e9f8

    • fix(prompt): convert field_ids array to string before save

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> df6e3b

    • Revert "refactor(admin): simplify dataScope extraction via getPostValue('data')"

      This reverts commit 5a9f43dd56d6122354d7ede8c83076c55a8bbdbf. 0d71ff

    • refactor(admin): simplify dataScope extraction via getPostValue('data') 5a9f43

    • fix(admin): extract form data from UI component dataScope, fixes #29 #30 5ffaf1

    • fix(bulk): use selected() not allSelected() to detect exclude mode, fixes #31 3d9147

    • docs: add test scenarios 1cc9f5

    • fix(translate): source from global scope, entity-aware save message

      Fixes #25 #26 #27 405576

    • fix(prompts): add patch for installs that missed category-name prompt

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 38430e

    • fix(dataprovider): use empty() to avoid undefined key warning on extra_config

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> e31e45

    • refactor(block): extract BulkAction logic into ViewData service, fix unit tests

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 88c8a5

    • fix(prompts): add missing category-name default prompt

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 5c2aca

    • test(e2e): add agent pipeline integration test for discovery + GraphQL search

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 6a55e9

    • feat(discovery): add /.well-known/ai-plugin.json endpoint and tests

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 1b8ebe

    • feat(discovery): serve /llms.txt via custom router for AI agent discoverability

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 6d85aa

    • feat(setup): add UpdateDefaultPromptsV2 patch to refresh default prompts

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> ee3cec

    • test(bulk): update translate tests to match productAction/target-store fix

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> e9155b

    • test(skill): add free-form chat and prompt_id-required unit tests

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> cda711

    • fix(chat): allow free-form messages without prompt_id (#21)

      When no stored prompt is selected in the AI Assistant chat, send
      history directly to the AI instead of throwing prompt_id required.

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 6ab498

    • feat(model): add max_tokens field to AI model config (#15)

      Exposed in Advanced section of the model form. Stored in extra_config
      JSON. All three providers (OpenAI, Claude, Gemini) now honour the limit.

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 31f482

    • Revert "fix(menu): move Breeze AI to its own group under Swissup root (#19)"

      This reverts commit a23caeca651929cb57260de907d29821ef84bc38. 1084de

    • fix(menu): move Breeze AI to its own group under Swissup root (#19)

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> a23cae

    • fix(bulk): save translated attributes to target store view (#17)

      Products: use ProductAction::updateAttributes with explicit targetStoreId.
      Categories: load in target store context before saving.

      Loading from sourceStoreId and changing storeId on the same object
      before save does not reliably scope EAV writes to the target store.

      Closes https://github.com/swissup/module-breeze-ai/issues/17

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 5e30c4

    • fix(bulk): handle Select All — pass all_selected flag, resolve IDs server-side

      Closes #18 15c1e7

    • fix(bulk): activate Run button on Select All using totalSelected observable

      Closes #16 add847

    • fix(bulk): hide grid sticky-header in wizard, move Run button into step body

      Closes #13 fe080e

    • fix(translate): use store view value as source, fall back to global if empty

      Closes #12 4f5649

    • fix(generate): use store view locale when generating content fa5bae

    • chore(e2e): ignore package-lock.json 1321c8

    • test(e2e): add category entity flow and grid visibility tests ed3cb9

    • chore(e2e): add .gitignore, exclude node_modules and auth 23acde

    • fix(bulk): move grid outside form, use uiRegistry for selection; add e2e tests 6721bb

    • feat(ui): replace spin with wave pulse animation on loading 140c55

    • fix(bulk): add space between checkbox and label in translate fields 097220

    • fix(bulk): move wizard CSS to LESS, fix fieldset borders dad671

    • feat(bulk): step-by-step wizard UI, add block tests, fix coding standard

      Close #5 d543a2

    • feat(cms): add AI buttons support for CMS page SEO fields

      Close #2 1e90f0

    • feat(ui): preview generated content before applying

      Close #9 433b71

    • feat(ui): show locale code next to store view name in translate form

      Close #10

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> d2f617

    • fix(di): add category name field to InputFieldPool

      Close #7

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 8d3f87

    • fix(translate): preserve HTML tags and links during translation

      Close #6

      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> 6a3868

    • fix(ui): remove circle from Breeze icon, unify icon across Generate and Translate buttons 0ddc29

    • feat(ui): replace ChatGPT icon with Breeze logo, rename buttons to AI Generate/Translate/Chat 44523d

    • fix(filter): handle array value from multiselect getFrontend()->getValue() 9f5ef6

    • fix(filter): use is_visible + input type instead of is_visible_on_front

      getIsVisibleOnFront() = 0 for all catalog attributes (name, sku, price
      etc) so {{attribute code="*"}} always returned empty string.

      New logic: is_visible=1 AND frontend_input NOT IN excluded types
      (date, media_image, image, gallery, hidden). Includes text, textarea,
      select, multiselect, boolean, price, weight.

      Add FilterTest cases for langCodeDirective and attributeDirective. 205910

    • fix(popup): use Magento action-primary button, reduce textarea rows to 4 93c018

    • fix(prompts): add product-name prompt, fix product-meta-keyword typo 4eda0f

    • revert: remove FixPromptFieldIds data patch

      No releases yet — fix directly in InstallDefaultPrompts instead. 122ef2

    • fix(prompts): fix product-meta-keyword typo in InstallDefaultPrompts cfb7b6

    • fix(prompts): fix product-meta-keyword typo, add product-name prompt

      - prompt #5 field_ids: product-meta-keyword → product-meta-keywords
      - add new 'Generate Product Name' prompt for product-name field 6eda92

    • test,docs: update tests and docs for Phase 5 bulk refactoring

      - Remove 4 old consumer tests
      - Add BulkConsumerTest, GenerateServiceTest
      - Update GenerateTest, TranslateTest, SkillGenerateTest
      - Update DEVELOPMENT.md, SESSION.md with Phase 5 status
      - Add phase-5.md and refactoring-skill-prompt.md plans f000f3

    • feat(css): add BulkAction page styles cc5c33

    • refactor(bulk): remove old per-entity bulk controllers, blocks, consumers

      Replaced by universal BulkAction page (Phase 5). Deleted:
      - 4 controllers (product/category × generate/translate)
      - 9 block classes
      - 4 MQ consumers
      - 4 layouts, 3 templates
      - product_listing.xml mass-actions (swissup_breezeai_generate/translate) b3f6db

    • feat(view): add BulkAction layout and edit.phtml template

      Single-page form: entity radio, skill radio, store selects,
      generate fields (checkbox+prompt), translate fields (checkboxes),
      UI grid, sticky Run button. Inline JS handles entity/skill switching
      and grid checkbox collection. 8232d2

    • feat(ui): add BulkDataProviders and bulk UI component grids

      Product and category grids for the BulkAction page with ID/name
      columns, filters, pagination, and mass-select support. d25290

    • feat(bulk): add BulkConsumer, BulkAction controllers, and Edit block

      BulkConsumer replaces 4 old consumers — routes by skill/entity_type.
      BulkAction/Edit: GET form page.
      BulkAction/Save: validates POST, schedules MQ jobs via BulkScheduleTrait. be4b73

    • refactor(acl,menu): consolidate bulk ACL resources and menu item

      4 separate ACL resources (bulk_product_generate, bulk_product_translate,
      bulk_category_generate, bulk_category_translate) → single bulk_action.
      Menu: 'Generate Content for Categories' → 'AI Bulk Action'. 78e03f

    • feat(di): register product name field in InputFieldPool d0d391

    • refactor(mq): replace 4 topics/consumers with single swissup.breezeai.bulk

      4 separate queues (product-generate, product-translate, category-generate,
      category-translate) → one universal queue handled by BulkConsumer. becb6c

    • feat(skill): add getSupportedAttributes() to SkillInterface

      BulkAction UI needs per-skill attribute lists. Generate uses
      InputFieldPool; Translate switches from hardcoded const to
      InputFieldPool so both stay in sync with di.xml registrations.

      Also moves translateForAllStores + saveAttributeForStore out of
      Translate skill into GenerateService (single responsibility). b04e25

    • fix(generate): convert history arrays to MessageInterface objects

      JSON deserialization produces plain arrays; OpenAi::chat() closure
      requires MessageInterface. Convert in GenerateService before passing
      to skill.

      Closes #4 60f191

    • fix(openai): handle TypeError from openai-php/client v0.10 string response

      v0.10 Response::data() returns array|string; string body passed to
      CreateResponse::from(array) causes TypeError. Catch \TypeError with
      a clear message. Bump constraint to ^0.10 || ^0.19 to allow upgrade. dda01d

    • fix(menu): move Breeze AI below Content Builder b9b95e

    • fix(menu): reduce submenu indent to 28px e01066

    • fix(menu): apply muted color to Breeze AI group title only e4a344

    • feat(menu): add muted color for Breeze AI submenu items 7e2474

    • fix(menu): increase specificity for Breeze AI submenu indent 3d93d8

    • feat(menu): add indent for Breeze AI submenu items 154112

    • fix(menu): shorten menu item titles within Breeze AI group 253b57

    • feat(menu): group Breeze AI items under dedicated submenu 8764fc

    • fix(model): replace parent::_beforeSave() call to fix PHPStan error 1737c7

    • fix(model): remove invalid return type from _beforeSave b96839

    • refactor(consumers+controllers): extract AbstractConsumer and BulkScheduleTrait to eliminate duplication 6093cd

    • fix(cs): fix self-closing path tags and unescaped output d1089b

    • fix(js): skip service fields when attaching AI buttons 708dbb

    • test(integration): add admin HTTP integration tests for generate endpoint

      - AbstractAdminApiTest: cURL-based login (form_key, admin cookie, secret key)
      - GenerateTest: 7 cases covering generate, translate, validation, no-auth
      - bin/test integration: runs via phpfpm container with CURL_CONNECT_TO routing
      - AI tests skipped unless TEST_AI_ENABLED=1

      Key findings: Magento requires form_key in POST params even with
      CsrfAwareActionInterface; admin cookie value = PHP session ID in Redis. 4f1b6f

    • docs: add session summary d2d983

    • fix(block): remove typed $_template to fix PHP 8.3 fatal error

      Parent Magento\Backend\Block\Widget\Form declares $_template without
      a type; redefining it with 'string' type causes a fatal error in PHP 8.3. ede0fa

    • refactor(blocks): extract AbstractGenerateAttributes base class

      Product and Category generate-tab blocks shared ~100 lines of identical
      renderFieldRow/getFieldPromptsHtml/TabInterface code. Extract into
      AbstractGenerateAttributes; concrete classes now only define field list
      and fieldId prefix. 71ed4a

    • docs: move DEVELOPMENT.md to docs/, add integration tests plan 42fb8d

    • refactor(translate): remove store selector, use current scope

      Single product translate no longer shows a store picker modal:
      - scope=0 (All Store Views): translates & saves to DB for every
      non-default store view automatically, shows success alert
      - scope=X (specific store): translates and writes result directly
      into the form field; admin saves manually

      Also fix FormDataProviderTest missing RequestInterface arg. 98ec57

    • fix(prompts): replace invalid directives with correct attribute syntax

      {{product_name}} / {{category_name}} are not recognized directives —
      filter silently drops them, leaving AI with no product context.

      Replace with {{attribute code="name"}}, add {{categories}},
      {{attribute code="*"}}, {{langCode}} context matching legacy module.

      Also adds Testing Checklist to DEVELOPMENT.md. 10e739

    • fix: cast websiteId to int in bulk product generate save 23ab31

    • fix(model-form): save new record and restore model on edit

      - Save.php: unset entity_id/form_key before addData to prevent empty
      entity_id string blocking INSERT (Magento treated it as UPDATE id=0)
      - FormDataProvider: inject RequestInterface; add getMeta() that passes
      savedModel config to JS so edit form shows the correct model option
      - model-select.js: read savedModel config on first onProviderChange call
      (via imports) to restore the persisted value instead of resetting to
      the first option of the newly-loaded provider list 76cf4b

    • fix: throw LocalizedException when translate field is empty ffc9e1

    • feat: add menu item for bulk category AI generate fbe18d

    • fix: add TabInterface to Category Content Attributes block 327067

    • feat(phase-4): bulk category AI content generation

      - CategoryConsumer: generate+save per category via Generate skill
      - Controllers: Edit (render page) + Save (dispatch async bulk)
      - Block/Attributes: field/prompt selector for category fields
      - Block/Edit: flat category list + store view selector
      - Template: checkbox list with Select All, store view dropdown
      - Queue: add swissup.breezeai.category.attribute.update topic
      - ACL: add bulk_category_generate resource
      - Tests: CategoryConsumerTest (11 tests) 09198b

    • test: add CategoryTranslateConsumer unit tests e45eaa

    • docs: mark phase-3 done, update phase-4 status

      refactor(assistant): wrap buttons in .ai-field-actions container 889ea1

    • refactor: extract translate attributes HTML to shared phtml template, base abstract block 171d07

    • fix: translate button use action-default style + ai-field-actions wrapper, align with generate button d5e9e1

    • feat(phase-3): category bulk translate — controllers, consumer, queue topic, layout, ACL a68cc7

    • feat(phase-3): manual translate UI — inject translate button per field, modal with store selector, apply result to store scope 89596b

    • refactor: extract PromptRepositoryInterface, ModelConfigRepositoryInterface; add setters to ModelConfigInterface; use interfaces in DI 087226

    • refactor: add @api markers, public const, ResultInterface return types to interfaces and controllers fbf28d

    • feat: dynamic model list based on selected provider in model form 4c0d39

    • feat: add Translate skill and bulk product translation (Phase 3) b28da1

    • docs: add bulk product content generation guide to README 4d321f

    • fix: correct product-meta-keyword field_id in default prompts (remove extra 's') 046ea4

    • refactor: render field rows without attribute inputs in bulk form dc7e9f

    • fix: use settings syntax for mass action URL, fix incompatible method signature 1a4321

    • fix: remove incompatible return type from _getAdditionalElementHtml 3004ee

    • test: add extra params and edge case tests for Claude and Gemini providers cccaad

    • chore: ignore .playwright-mcp directory 9551d8

    • feat(phase-2): add Claude and Gemini providers 3f1e47

    • test: add ConsumerTest for bulk product AI generation 5ad94f

    • feat(step-11): bulk product AI content generation via MessageQueue 701783

    • docs: mark step-10, step-12 as done in plan 33d605

    • test: add ModelConfig, ModelConfigRepository, FormDataProvider tests

      - ModelConfigTest: getModel custom resolve, encrypt/decrypt api_key,
      isEnabled, isDefault, getBaseUrl, getOrganization, getExtra JSON
      - ModelConfigRepositoryTest: getById happy/not-found, getDefault with
      is_default flag, fallback to first enabled, throws when none exist
      - FormDataProviderTest: api_key mask, empty key, id indexing, cache 3ea4df

    • feat(step-10): AI Model & Prompt CRUD admin UI

      - Model/Prompt controllers (Index, NewAction, Edit, Save, Delete)
      - UI listing + form components for both entities
      - Form buttons (Back, Delete, Save) for both entities
      - DataProviders: listing + form (api_key masked as ****** in form)
      - Save controller encrypts api_key via Encryptor; mask ignored on save
      - switcherConfig hides custom_model field unless model=custom
      - Advanced fieldset (collapsible) for base_url, organization
      - Source classes: FieldId, ModelOptions, OpenAiModel (+gpt-4o-mini)
      - Menu items under Swissup > Breeze (sortOrder 120/130) 889e2c

    • docs: update plan — step-09 done, phase-1 progress 87003f

    • feat(step-09): frontend JS assistant + styles

      - assistant.js: MutationObserver inject AI button per field
      - auto-select prompt if one, dropdown if multiple
      - REST POST to /rest/default/V1/breezeai/generate with X-Requested-With
      - TinyMCE + plain textarea support on apply
      - _module.less: button + prompt select styles
      - Fix apiUrl in Js block to use rest/default/V1 prefix a21c82

    • feat(step-08): admin JS block + layout for product/category edit

      - Js block renders JSON config (apiUrl, entityType, entityId, fields+prompts)
      - js.phtml initializes Swissup_BreezeAi/js/assistant component
      - Layout: catalog_product_edit + catalog_category_edit inject block before.body.end 952053

    • feat(step-08): REST API endpoint POST /V1/breezeai/generate

      - GenerateInterface — typed contract with MessageInterface[] history
      - GenerateService — load entity by type, dispatch to SkillPool
      - webapi.xml — route secured by Swissup_BreezeAi::manage ACL
      - acl.xml — add manage resource under assistant
      - PromptRepository::getListByFieldId() — filter prompts by field ID
      - Tests: GenerateServiceTest, PromptRepositoryTest b555db

    • feat(step-07): InputFieldPool via DI — replaces Observer/Event approach

      - InputFieldInterface with ENTITY_PRODUCT/CATEGORY constants
      - InputField DTO, all config via constructor promoted properties
      - InputFieldPool: getAll(), getByEntityType(), getById()
      - 9 built-in fields as virtualType in di.xml (product + category)
      - Third-party modules extend via di.xml array merge (unique key = add, same key = override) 5b5d59

    • refactor(step-06b): code revision — dead deps, field constants, MessageInterface

      - Remove unused constructor in Helper/Config
      - Add field constants to ModelConfigInterface, use in ModelConfig/Repository/Collection
      - Remove dead deps: CatalogHelper (Product filter), StoreManagerInterface (Category filter)
      - Remove dead code: STATUS_DISABLED x2, addProviderFilter()
      - Add isEnabled() gate-check in AiRequest::send()
      - Add MessageInterface + Message DTO
      - SkillInterface::execute() — typed history as separate param MessageInterface[]
      - OpenAi::chat() uses getRole()/getContent() instead of array access
      - Generate skill builds Message objects, adapts to new execute() signature
      - Update AiRequestTest, GenerateTest (new signature + history merge test) cae984

    • feat(step-06): add Filter layer, Generate skill, SkillPool, PromptRepository

      - Model/Filter/Filter.php: base template filter with attribute/langCode directives
      - Model/Filter/Product.php: adds categories directive (breadcrumb paths)
      - Model/Filter/Category.php: adds subcats directive
      - Model/Skill/Generate.php: resolves prompt, filters content, calls AiRequest
      - Model/SkillPool.php: registry pattern, mirrors ProviderPool
      - Model/PromptRepository.php: getById/save/delete
      - Prompt::getContent() explicit method (needed for mocks)
      - di.xml: register Generate skill in SkillPool
      - config.xml: remove provider defaults (moved to DB)
      - 34/34 unit tests passing 9525b7

    • feat(step-05): ModelConfig entity+repository, Prompt entity, DB schema, refactor provider interface to use ModelConfigInterface 97f515

    • test: add unit tests for Config, ProviderPool, AiRequest, OpenAi provider 7bd0ad

    • docs: add development plan and per-step task files 424bb2

    • feat(step-04): OpenAI provider, ProviderPool, AiRequest, DI registration b719ec

    • feat(step-03): admin config, menu, ACL, Helper/Config, model sources 8e2498

    • feat(step-02): ProviderInterface and SkillInterface b720d9

    • feat(step-01): module skeleton, composer deps, routes cb7145

    swissup/module-easy-slide — 1.8.18 (was 1.8.17)
    swissup/module-easytabs — 1.13.4 (was 1.13.2)
    swissup/module-gdpr — 1.9.1 (was 1.8.5)
    • Version 1.9.1 5e0c58

    • PHP 8.5 fix ea894d

    • Add files via upload 5cabb8

    • Version 1.9.0 30de7e

    • Blocked Cookies => Unregistered Cookies cc499a

    • Show count of blocked cookies in the button label 0a3907

    • Ability to register selected blocked cookie 1d5955

    • Cleanup corresponding blocked cookies when saving the cookie 0fa019

    • Redirect back to the page where the client pressed "Allow selection" 3a28cd

    • Add notice about * in cookie names 423049

    • Cleanup blocked cookies using cron. Keep up to 100 latest records 4eca60

    • PHP 8.5 fix ca663e

    swissup/module-pagespeed — 1.18.0 (was 1.17.8)
    • Version 1.18.0 75bd79

    • test: add attribute metadata for PHPUnit 12 discovery

      PHPUnit 12 dropped doc-comment metadata: @dataProvider providers were
      not applied and @test snake_case methods were not discovered. Add
      #[DataProvider]/#[Test] attributes while keeping the annotations so
      the suite still runs on PHPUnit 9.6 (CI) and 10.5 (local), which
      ignore unknown attribute classes.

      Also accept the unused third data-set argument in testGetFilename —
      PHPUnit 12 warns when a provider passes more arguments than the test
      method accepts.

      Verified: PHPUnit 12.5.31 exit 0 (631 tests), PHPUnit 10.5.47 OK.

      Refs #92 5b20fe

    • feat!: remove Expire Header feature

      BREAKING CHANGE: Body\Expire optimizer, `pagespeed/expire/*` config
      and its admin section are removed.

      The feature set `Cache-Control: public, max-age=31536000` on document
      HTML for guest pages. Browsers and hosting-side proxies (invisible to
      the Varnish config check) cache such pages beyond any server-side
      flush, so merchants could not push content/price updates to returning
      visitors for up to a year. No PageSpeed/CWV benefit to offset that.
      Orphaned core_config_data rows are harmless.

      Closes #91 f659e6

    • chore: ignore phpunit cache and playwright artifacts be8bda

    • test: drop APIs removed in PHPUnit 12 from Test/Unit

      - replace getMockBuilder('stdClass')->addMethods() with createMock()
      of real classes (Store, Minify_HTML, HeaderInterface)
      - validate optimizers before logger init in Pipeline so expected
      InvalidArgumentException surfaces even without logger classes
      - register module-logger, module-image, mrclay/minify in tests
      bootstrap autoloader (absent from standalone test autoload)

      Refs #92 5393a1

    • fix(preload): prevent double download of scripts already in DOM

      DeferJs: remove addPreloadLinks() entirely — every external <script src>
      stayed live in the DOM while also getting a <link rel=prefetch> hint,
      causing the browser to fetch the file twice (confirmed: CookiePal,
      Elfsight, requirejs-config-breeze on mobile).

      - Remove Preload dependency, preload property, addPreloadLinks() method
      and all 4 call-sites from DeferJs
      - Remove script src collection in prepareElement()

      AddLinkPreload: add defensive liveScriptSrcs guard — skip any script
      href that already exists as a <script src> tag in the DOM, regardless
      of how it ended up in the Preload singleton.

      Tests: remove preloaderMock from DeferJsTest + DeferJsRegressionTest;
      add testScriptsAlreadyInDomAreNotPrefetched and
      testScriptsNotInDomCanGetPrefetchHint to AddLinkPreloadTest.

      Fixes #95 4b539f

    • fix(preload): per-type rel/fetchpriority; honor isEnabled config

      - Replace global priority counter with per-type counters
      - ALWAYS_PRELOAD_TYPES: font/style/image always rel=preload; scripts=prefetch
      - FETCHPRIORITY_LIMIT_BY_TYPE: null=unlimited (fonts), 2 styles, 1 image (LCP), 0 scripts
      - Fix isEnabled() hardcoded true -> config->isLinkPreloadEnabled()
      - Use array_key_exists to correctly handle null sentinel vs missing key (null??0 bug)
      - Add tests: image=preload, scripts=prefetch, per-type fetchpriority limits, isEnabled toggle

      Fixes #93 #94 84b155

    • feat: add dedicated cache type to isolate optimizer entries from block_html

      - Add Model/Cache/Type.php: new Magento cache type (swissup_pagespeed)
      - Add etc/cache.xml: register type with label/description
      - Update CacheManager: use Type::TYPE_IDENTIFIER instead of block_html,
      add Type::CACHE_TAG to entry tags for proper TagScope scoping

      Fixes Redis Default Cache pollution where 1.2M+ SWISSUP_PAGESPEED entries
      were mixed into the block_html cache type. Optimizer cache is now
      independently manageable in Stores > Cache Management. 9a552e

    swissup/module-pro-labels — 1.10.0 (was 1.9.1)
    • Version 1.10.0 79b19f

    • Restore deprecate getProductLabels method for compatibility with older versions (close #47). 85974e

    • Refactor models (#46)

      * Refactor Data, LabelsProvider, ManualLabelsProcessor, and SystemLabelsProcessor to use ProductLabels helper and improve type hinting

      * Refactor Catalog helper to improve type hinting and streamline constructor properties

      * Refactor AbstractLabel and ProductLabels helpers to improve type hinting and streamline method signatures

      * Refactor LabelInterface and Label model to improve type hinting and streamline method signatures

      * Address Copilot suggestions. 072cea

    • Address Copilot suggestions. 5a19dd

    • Refactor LabelInterface and Label model to improve type hinting and streamline method signatures f5a2e2

    • Refactor AbstractLabel and ProductLabels helpers to improve type hinting and streamline method signatures fac13c

    • Refactor Catalog helper to improve type hinting and streamline constructor properties bd402b

    • Refactor Data, LabelsProvider, ManualLabelsProcessor, and SystemLabelsProcessor to use ProductLabels helper and improve type hinting 26bb79

    • Refactor renderLabels method to use require for prolabels module 067179

    • Feature/active period (#45)

      * Add from_timestamp and to_timestamp fields to Label model and interface

      * Add isActive function and filterLabels method to manage label visibility based on timestamps

      * Implement AMP helper integration and enhance label fetching logic.
      Fetch only active labels when AMP storefront is enabled.

      * Address Copilot suggestions. c7e128

    • Address Copilot suggestions. d937b5

    • Implement AMP helper integration and enhance label fetching logic.
      Fetch only active labels when AMP storefront is enabled. 2f1652

    • Add isActive function and filterLabels method to manage label visibility based on timestamps bc3140

    • Add from_timestamp and to_timestamp fields to Label model and interface bec56c

    • Version 1.9.2 54e250

    • Fixed ParseError error with template minification enabled d87fce

    swissup/module-rich-snippets — 1.8.4 (was 1.8.2)
    • Version 1.8.4 3c45a4

    • Add regex validation to modifier modal and alert on invalid patterns d3f200

    • Fix issue with not saving of reordered modifiers. 7f18af

    • Add regex modifier for PCRE find-and-replace functionality (#43) d10bd9

    • Add strip_pagebuilder modifier to remove Page Builder markup (#43) 7a6f70

    swissup/module-seo-canonical — 1.11.10 (was 1.11.9)
    • Version 1.11.10 c94f86

    • Refactor type hints and return types in Config, Data, and UrlMaker classes af4b62

    • Fallback to current store when product is not assigned to forced store (close #2) 71c8ec

    swissup/module-seo-pager — 1.4.0 (was 1.3.5)
    • Version 1.4.0 0b9adc

    • Refactor Renderer class: streamline constructor properties and extract request variable logic into a separate method 5831e2

    • Enchance allowlist filter sets configuration for strategy. Update canonical URL. Close #6 07b704

    • Refactor Data helper: improve type hints and use constants for configuration paths c0f932

    • Add allowlist filter sets configuration for strategy (#6) 38c8b2

    swissup/module-seo-templates — 1.7.12 (was 1.7.10)
    • Version 1.7.12 4f7a81

    • PHP 8.5 fix 014b8a

    • Version 1.7.11 485c39

    • Add index to swissup_seotemplates_data for improved query performance (close #22) 5c24d9

    • Introduce FilterValueResolver service to make module compatible with Smile Elasticsuite (close #21) d54a51

    swissup/module-seo-urls — 1.5.55 (was 1.5.54)
    swissup/module-seo-xml-sitemap — 1.2.0 (was 1.1.16)
    • Version 1.2.0 c26fd8

    • Refactor Category plugin for improved type safety and code clarity. Drop Magento2.1.x support. 1c398c

    • Feature/product min lastmod (#6)

      * Refactor Category plugin for improved type safety and code clarity. Drop Magento2.1.x support.

      * Add product options configuration and date handling in admin settings

      * Add forced minimal lastmod date handling for products in sitemap

      * Refactor Category plugin to use Helper for image include policy retrieval

      * Add strict types and improve type safety in Data helper methods

      * Refactor XML configuration for sitemap settings by modularizing into separate files for categories, pages, other links, and advanced settings.

      * Address Copilot comments 1fc7bc

    • Address Copilot comments f7bf57

    • Refactor XML configuration for sitemap settings by modularizing into separate files for categories, pages, other links, and advanced settings. 55e24f

    • Add strict types and improve type safety in Data helper methods 782f41

    • Refactor Category plugin to use Helper for image include policy retrieval 386e7d

    • Add forced minimal lastmod date handling for products in sitemap e69cb2

    • Add product options configuration and date handling in admin settings 372385

    • Refactor Category plugin for improved type safety and code clarity. Drop Magento2.1.x support. d7935f

    swissup/theme-frontend-argentobreeze-blank — 3.1.0 (was 3.0.0)
    swissup/theme-frontend-argentobreeze-business — 3.0.1 (was 3.0.0)
    • Hide toolbar limiter on all pages, not only on the pages with pagination
      Closes #15 f98fea

    swissup/theme-frontend-argentobreeze-stripes — 3.1.0 (was 3.0.0)
    • Version 3.1.0 cf02ec

    • Enabled mobile slider layout for banners 03acd2

    • Use 4:5 mobile images 1bc409

    • Switch to slider mobile layout for Benefits block 1f5466

    • Enabled hover-zoom for 5 banners e5e6b1

    • Added separate mobile slider and slide styles improvements cf2cd1

    • Updated homepage BCB content 7d11cd

    • Updated highlight style for BCB c8becc

    • Updated homepage BCB content 6219af

    • Added EasySlide styles and smaller images 3b4ec3

    • BCB Homepage: added banners, highlight blocks, and brands 9c4383

    • BCB Homepage: added benefits and slider 29b8df

    • Added footer colors to Theme Editor a99a23

    swissup/module-breeze-content-builder — 1.0.6 (was 1.0.2)
    • Version 1.0.6 7b6bda

    • Added Mobile Layout (stack/slider) config for Columns and Grid components 453502

    • Banner component: added Hover Zoom property 56e6e9

    • Version 1.0.5 e3b376

    • Added Breeze scrollReveal settings for Banner component 93e172

    • Remove drafts when running installer 62b92e

    • Added Collage layout for Banner component (BreezeStripes compatibility) 10fca2

    • Added 2 Columns (25/75) layout for Columns component (BreezeStripes) 30ed38

    • Added Column Divider prop for the Columns component 0ac3e9

    • Allow using html in Text component inline svg (BreezeStripes fix) 14baf5

    • Version 1.0.4 dab817

    • Fixed missing css class in Featured Product component a87e23

    • Pass current page_id for widgets like AskIt, closes #29 7b5bae

    • Fixed installer to use next content version instead of hard-coded v1 853c63

    • Version 1.0.3 308f5e

    • History fix for header/footer da7091

    • Added methods to expand sections 8e346f

    • Do not show Label field for Header and Footer items cc4f6a

    • WIP: implementing Header and Footer management #7 6bc911

    swissup/module-theme-editor — 1.12.0 (was 1.11.7)
    • No commits found

swissup / pro-labels

1.10.0 Jul

swissup / askit

1.14.24 Jul

swissup / knowledge-base

1.1.45 Jul

swissup / ajaxpro

1.7.35 Jul

swissup / pagespeed

1.18.0 Jul
  • 1.18.0

    Report (rev.1)

    Package was generated and uploaded to GitHub on with the following dependencies:

    swissup/module-pagespeed:1.18.0

    swissup/module-core:1.12.27

    swissup/module-image-optimizer:1.0.12

    Changelog (autogenerated)

    swissup/module-pagespeed — 1.18.0 (was 1.17.7)
    • Version 1.18.0 75bd79

    • test: add attribute metadata for PHPUnit 12 discovery

      PHPUnit 12 dropped doc-comment metadata: @dataProvider providers were
      not applied and @test snake_case methods were not discovered. Add
      #[DataProvider]/#[Test] attributes while keeping the annotations so
      the suite still runs on PHPUnit 9.6 (CI) and 10.5 (local), which
      ignore unknown attribute classes.

      Also accept the unused third data-set argument in testGetFilename —
      PHPUnit 12 warns when a provider passes more arguments than the test
      method accepts.

      Verified: PHPUnit 12.5.31 exit 0 (631 tests), PHPUnit 10.5.47 OK.

      Refs #92 5b20fe

    • feat!: remove Expire Header feature

      BREAKING CHANGE: Body\Expire optimizer, `pagespeed/expire/*` config
      and its admin section are removed.

      The feature set `Cache-Control: public, max-age=31536000` on document
      HTML for guest pages. Browsers and hosting-side proxies (invisible to
      the Varnish config check) cache such pages beyond any server-side
      flush, so merchants could not push content/price updates to returning
      visitors for up to a year. No PageSpeed/CWV benefit to offset that.
      Orphaned core_config_data rows are harmless.

      Closes #91 f659e6

    • chore: ignore phpunit cache and playwright artifacts be8bda

    • test: drop APIs removed in PHPUnit 12 from Test/Unit

      - replace getMockBuilder('stdClass')->addMethods() with createMock()
      of real classes (Store, Minify_HTML, HeaderInterface)
      - validate optimizers before logger init in Pipeline so expected
      InvalidArgumentException surfaces even without logger classes
      - register module-logger, module-image, mrclay/minify in tests
      bootstrap autoloader (absent from standalone test autoload)

      Refs #92 5393a1

    • fix(preload): prevent double download of scripts already in DOM

      DeferJs: remove addPreloadLinks() entirely — every external <script src>
      stayed live in the DOM while also getting a <link rel=prefetch> hint,
      causing the browser to fetch the file twice (confirmed: CookiePal,
      Elfsight, requirejs-config-breeze on mobile).

      - Remove Preload dependency, preload property, addPreloadLinks() method
      and all 4 call-sites from DeferJs
      - Remove script src collection in prepareElement()

      AddLinkPreload: add defensive liveScriptSrcs guard — skip any script
      href that already exists as a <script src> tag in the DOM, regardless
      of how it ended up in the Preload singleton.

      Tests: remove preloaderMock from DeferJsTest + DeferJsRegressionTest;
      add testScriptsAlreadyInDomAreNotPrefetched and
      testScriptsNotInDomCanGetPrefetchHint to AddLinkPreloadTest.

      Fixes #95 4b539f

    • fix(preload): per-type rel/fetchpriority; honor isEnabled config

      - Replace global priority counter with per-type counters
      - ALWAYS_PRELOAD_TYPES: font/style/image always rel=preload; scripts=prefetch
      - FETCHPRIORITY_LIMIT_BY_TYPE: null=unlimited (fonts), 2 styles, 1 image (LCP), 0 scripts
      - Fix isEnabled() hardcoded true -> config->isLinkPreloadEnabled()
      - Use array_key_exists to correctly handle null sentinel vs missing key (null??0 bug)
      - Add tests: image=preload, scripts=prefetch, per-type fetchpriority limits, isEnabled toggle

      Fixes #93 #94 84b155

    • feat: add dedicated cache type to isolate optimizer entries from block_html

      - Add Model/Cache/Type.php: new Magento cache type (swissup_pagespeed)
      - Add etc/cache.xml: register type with label/description
      - Update CacheManager: use Type::TYPE_IDENTIFIER instead of block_html,
      add Type::CACHE_TAG to entry tags for proper TagScope scoping

      Fixes Redis Default Cache pollution where 1.2M+ SWISSUP_PAGESPEED entries
      were mixed into the block_html cache type. Optimizer cache is now
      independently manageable in Stores > Cache Management. 9a552e

    • Version 1.17.8 fdc783

    • fix: correct double-backslash handling in ScriptTagEscaper JS parser

      A double backslash (\) in a JS string escapes the backslash itself,
      not the following character. The old check 'prevChar === \' incorrectly
      treated the char after \\ as escaped, causing findClosingScriptTag to
      never exit the string and escape the entire remaining HTML including
      </body> and </html>.

      Replace single-char prevChar check with isPrecededByOddBackslashes()
      helper that counts consecutive preceding backslashes: odd = escaped,
      even = not escaped. Applied to both the skip-escaped-char guard and
      the string-delimiter detection. 995cee

    • fix: prevent DeferJs from moving New Relic (NREUM) scripts out of head

      NREUM scripts must execute synchronously in <head> before any other JS.
      DeferJs was moving them to body end, breaking New Relic initialization.

      - Add NREUM signatures to DeferJs ignore list (window.NREUM, NREUM.init,
      NREUM.info, NREUM.loader_config)
      - Remove overly broad NREUM check from AfterRenderResultPlugin that
      disabled ALL optimization when any page content contained 'newrelic'
      - Add position-based tests that fail without the fix and pass with it 174268

    • Fixed script parsing issue caused with New Relic (Unexpected token '<') 2ebe4d

    • fix: add TTL to optimizer cache entries in CacheManager (30-day lifetime) 4b6e50

    • fix: remove block_html tag from optimizer cache entries in CacheManager (close #90) 445044

swissup / cache-warmer

1.0.40 Jul