Recent Activities

This page shows what are we working on.

swissup / module-seo-pager

7 hours ago success

breezefront / theme-frontend-breeze-enterprise-eir

7 hours ago success
  • head
    • Breadcrumbs 196469

    • Done with search (#2) d8e0f3

    • Enhance minisearch functionality with slideout behavior and styling adjustments without Ajaxsearch (#2) 8c4a9d

    • Minisearch styles when ajaxsearch disabled... in progress (#2) 259fac

    • Remove unused styles from viewcart action and update empty subtitle styles in minicart (#2) dba7a5

    • Minicart complete (#2) 56efd2

    • Search on desktop (#2) 9c587e

    • BCB homepage: added videos section 7ee864

    • Minicart inprogress (only buttons to adjust)... (#2) c1be91

    • Minicart update in progress.... c3d18b

    • Minicart update in progress... (#2) 55e7b9

    • INstaller. Create dummy CMS block header_panel_info to allow user add custom content (#2) f70d58

    • Adjust minicart counter (#2) 03e843

    • BCB homepage: Added brand logos section b905f1

    • BCB homepage: Added testimonials section 2ab2cf

    • Update newsletter styles: adjust input border and add consent positioning (#2) 02d37d

    • Header. Update search behaviou and look of the result dropown. 993432

    • BCB homepage: Added FAQ a0bfde

    • Add focused search styles. d80f88

    • BCB homepage: added new sections 875068

    • BCB homepage: added ECI and full-width banner d40cfa

    • Top navigation added. 8fa9a3

    • Remove color from menu links dec081

    • Clone currency and store switchers in header slideout menu for improved functionality de36e3

    • Enhance header and newsletter styles for improved layout and responsiveness in header slideout menu. b63dd0

    • Installer. Update header slideout menu styles. 825795

    • Update footer top content HTML to enhance newsletter section styling.
      Don't set font familiy for header in Page Builder ba0b81

    • BCB homepage WIP b228af

    • Basic navpro slideout styles 75ac0e

    • Refactor header slideout menu and newsletter styles for improved layout and consistency 3b42ff

    • Header slideout menu... d4f174

    • Listing styles for the list mode and old price update. cbff61

    • Update README.md to clarify usage of `with-bottom-divider` CSS class and provide detailed instructions 1b9ea5

    • Pagination and make with-bottom-divider general. 37ea17

    • Added list banner 5 config; updated installer, moved it to json a43985

    • Add new layout configuration and remove easybanner references; update footer content and styles 87165b

    • Refactor easybanner configuration and installer for product listing banners 8b1d0d

    • Installer. Listing grid banner added. 914c01

    • Add swatches variables and layout styles d59581

    • Update positioning for filter title and content in layered navigation 8cbd21

    • Add image dimensions for product listings and related widgets in view.xml 6985cd

    • layout and styles for category view, product toolbar, shop by button 08fd27

    • Add layered navigation styles and update imports 944ff1

    • Keep working on prodcut listing and category page. 411088

    • Keep working on product listing toolbar. ebcfac

    • Working on product listing and toolbar look. 1ab39d

    • Add Cooper* font 132906

    • Add listing item styles and variables e725b5

    • Product lisnting in progress - grey bg and border radius. 4e7c35

    • Add new variable files for colors, typography, header, footer, icons, navigation, popover, minisearch, and gradient ba122c

    • Refactor footer and newsletter styles for improved consistency and responsiveness d831e4

    • Footer top newsletter - some updates. 452ca5

    • Add footer top content block and styles for newsletter integration (WIP) 128131

    • Footer bottom. 8d58ea

    • Add footer content block and styles for enhanced footer layout 4d6b1b

    • Header. Hide menu on medium screens. Update search look on monile. e0146d

    • Installer. Add navigation slideout menu a89fd5

    • Add EasySlide functionality for header panel with custom slides and styles e55b0b

breezefront / module-breeze-ai

13 hours ago success
  • head
    • fix(admin): keep AI actions off the field's scope row (#96)

      .admin__field-control holds more than the input. Magento renders the error
      label, the note, additional info and — at store-view scope only — the
      admin__field-service block carrying "Use Default Value" into it as siblings of
      the field. Making that container a flex row for the AI actions (#82) hoisted all
      of them onto the field's line; the field, at flex-basis 0, then collapsed to a
      sliver and its value read as empty. A merchant on 2.4.9 reported a store-scoped
      Text Area attribute rendering blank with the scope checkbox displaced, and
      rolled back to 1.2.0.

      Give every child its own full-width row, then opt the field and the actions back
      onto a shared first row. That keeps what #82 asked for and puts everything else
      back where it sits with no actions at all.

      Also ship the removal path the same report asked for: Setup\Uninstall drops the
      module's tables and configuration so module:uninstall --remove-data leaves
      nothing behind, and docs/UNINSTALL.md covers both turning the module off and
      taking it out, including why a disabled module's own di.xml cannot be the source
      of a preference the 2.4.9 compiler rejects. 9c5b39

    • feat(content-builder): let the AI place Magento widgets (#91) (#95)

      * feat(content-builder): let the AI place Magento widgets (#91)

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

      * fix(content-builder): describe only the enabled widgets, and offer no select we cannot list (#91)

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

      * fix(content-builder): write the widget defaults the prompt promises, and report what a directive could not carry (#91)

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

      ---------

      Co-authored-by: Claude Opus 5 <noreply@anthropic.com> dd87e3

    • fix(content-builder): write the widget defaults the prompt promises, and report what a directive could not carry (#91)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> d652df

    • fix(content-builder): describe only the enabled widgets, and offer no select we cannot list (#91)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 60f747

    • feat(content-builder): let the AI place Magento widgets (#91)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 5be597

    • Merge pull request #94 from breezefront/fix/vision-test-post-max-size

      test(vision): let a test narrow the post_max_size setUp established ee92e8

    • fix(content-builder): describe only the enabled widgets, and offer no select we cannot list (#91)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> bbfe20

    • test(vision): let a test narrow the post_max_size setUp established

      The first willReturn matcher answered every invocation, so the second one
      a test body added never fired and the cap test asserted against 64M.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> a5fccd

    • feat(content-builder): let the AI place Magento widgets (#91)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 3a19b3

    • Merge pull request #92 from breezefront/feat/85-image-extraction

      feat(content-builder): take a generated page's images from the screenshot (#85) 8b2d79

    • fix(image): scan a trimmed edge exactly, and compare whole origins (#85)

      Round four. Four of the five inline comments repeat findings already fixed in
      the two commits before this one; these are what was left.

      The trim sampled every Nth pixel along an edge, which is safe for a
      photograph's flat margin and wrong for the one case the trim exists to serve: a
      line icon's stroke is a pixel or two wide, can fall between samples, and the
      edge then reads as empty and the outline is cut off the icon. A crop small
      enough to be an icon is now scanned pixel by pixel; the sampled path stays for
      anything larger.

      The media base URL was compared to the web base URL by host alone, so media on
      https://shop.test:8443/ looked local to a storefront on the default port and
      was written as a root-relative path that resolves against the wrong server.
      Scheme, host and port are compared together.

      Prune read every matching content document into memory before picking the file
      names out of them. It streams the rows instead — the names are forty
      characters each, the documents are whole pages.

      Both descriptions of the setting said that turning it off makes every image a
      placeholder. Since the brief's own images are now left alone, that is no longer
      what happens.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 47ab31

    • fix(content-builder): keep repaired icons in their band, and check GD first (#85)

      Round three of the review.

      Clamping a box to its band and then squaring it up put it back outside: an
      icon against a section edge grew through the boundary and cropped pixels from
      the section next door. It is moved back inside rather than cut down, because
      cutting it down restores exactly the flattened box the repair exists to
      rescue. A box the grid flattened onto a single line is also kept now when that
      line falls inside the band — intersecting a zero-height box with anything
      leaves nothing, so the band check was throwing away the very shape squaredUp()
      was written for.

      WebP is an optional part of GD and every crop ends in an imagewebp() call, so
      a server built without it failed on the last step of each crop and kept every
      placeholder without saying why. The setting answers false there, once, with
      the reason in the log — and the prompt then does not spend tokens asking for
      coordinates nothing can use.

      The base screenshot rule lost the word "logo" when it was rescoped, which left
      an extraction-disabled build without the instruction it had before this branch
      existed. Restored.

      Prune's per-run cap now counts what it removes rather than what it looks at.
      Skipping a file costs a stat and an array lookup since the reference lookup
      became one scan per table, so spending the budget on files that were never
      going away only let them hide the collectable ones behind them, in the same
      order, every night.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> f0884f

    • fix(content-builder): keep the brief's images, and judge crops by the prop (#85)

      Four from the second review round.

      The stand-in host was matched with str_ends_with, so notdummyimage.com — a
      domain belonging to somebody else — counted as ours and an icon supplied from
      it would have had its switch closed. Matched as the host itself or a subdomain
      of it now.

      A crop's kind was decided by its size alone. The symbol thresholds are close to
      "anything but a blank square", which is what a monochrome line icon needs, and
      a wireframe's grey box with a cross through it is small enough to be handed
      them — so the one thing the detector exists to reject sailed past it. Size
      still decides how a region is cut; what the result is allowed to be is decided
      by the prop, and only a prop named for an icon is judged as a symbol.

      A background image the brief had already supplied was overwritten by the band
      fallback whenever the model reported no region for it. Naming an image is a
      decision and a region is a guess about where one is, so extraction now fills
      only a prop that is empty or still holds the generated stand-in — every image
      prop, not only the background that exposed it.

      Prune asked "is this file referenced" once per file: three LIKE queries against
      unindexed text columns, up to fifteen hundred full scans in one cron run on a
      backlog. It reads the names back out of the content instead, once per table per
      run, and not at all on a night with nothing old enough to remove.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 933f93

    • fix(content-builder): choose the screenshot, and the switch, deliberately (#85)

      Two more from the review, both about a decision that was being made by
      accident.

      BuildPage hands over every image the conversation carries, and extraction cut
      from the first of them. In the screenshot modal there is only ever one, but in
      the editor's chat panel the reference the admin has just sent sits behind the
      one they sent an hour ago — so the model described the new design and the crops
      came out of the old one, silently. A region names no image and nothing here can
      tell them apart, so the newest is cropped as the best available guess, and the
      build says so when there was more than one to choose from.

      The other is the icon case. Filling an image prop with a dummyimage.com box is
      right where the prop always renders: the merchant sees a labelled grey
      rectangle and knows to replace it. Behind a switch it is not, because the
      component offers a better answer — a feature card without an icon, which is
      what the switch's own default says. The stand-in now counts as unfilled there,
      and the host it is recognised by is the constant the prompt is written from
      rather than a second copy of the string.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 4c31e2

    • fix(content-builder): answer the review on extracted images (#85)

      Six things the review found, none of which change what a good run produces:

      - A background whose box was unusable fell back to its band and got its
      picture, but the failed box had already added a warning telling the merchant
      to set the image in the editor. The fallback is resolved first, and the
      warning is left for the case where nothing was found.
      - The symbol threshold was two colours, which is what a crisp monochrome icon
      quantises to. Its own docblock says "no second colour worth the name" — one.
      The WebP round trip usually adds enough noise to hide this, so it cost an
      icon only where the screenshot drew one cleanly.
      - Reusing a stored crop kept the old mtime, so a draft could adopt a file
      already past the retention window and have it pruned before the page was
      saved. A reused crop is touched.
      - Prune spent its per-run budget on files it had already decided to keep,
      which let a directory of recent crops hide the old ones behind them on every
      run. Only files past the cutoff count against it.
      - The upload limit bounds compressed bytes, not the bitmap they unpack into.
      The measurement already happens before anything decodes, so an implausible
      pixel area is refused there rather than in the allocation after it.
      - The README promised a warning for every unfilled image prop. A prop the
      design said nothing about passes silently, and that is the normal wireframe
      case, so the sentence now says what the code does.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 6e71f8

    • test(image): read the WebP signature instead of silencing getimagesize (#85)

      The Magento2 standard rejects the error suppression, and the assertion did
      not need it: the question is what bytes were written, which the RIFF/WEBP
      container signature answers on its own.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> c02438

    • feat(content-builder): take a generated page's images from the screenshot (#85)

      A page built from a real design came back with a dummyimage.com box wherever
      the design had a photo, and the admin replaced every one by hand. The merchant
      already handed us the picture: the model is now asked, on the build call that
      was happening anyway, where each image is, and the region is cropped out of the
      screenshot locally and stored in media.

      Two coordinate sources, because neither works alone. A per-prop box is the only
      thing that can locate an icon and is loose about it; a band's vertical extent is
      coarse but dependable. So a box is held to its own band before it is used — a
      hero box spanning three bands was the common failure on a tall screenshot — a
      box the 0..1000 grid flattened is squared up on its surviving axis, a small box
      is padded and trimmed back onto its own content, and a background image falls
      back to the band strip when no usable box came back.

      A crop that turns out to hold a wireframe placeholder is skipped and the
      dummyimage URL kept: a grey rectangle stored as the page's hero is worse than
      the placeholder it replaced. Symbols are judged by their own thresholds, since a
      line icon is monochrome by design. Generating an image for those regions is the
      separate second half of #85.

      Model/Image carries no Content Builder dependency — the per-band build loop of
      #84 crops the same screenshot with the same services. 53eece

  • 1.4.0
    • chore(release): 1.4.0

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 0bcf86

    • Merge pull request #89 from breezefront/claude/relaxed-shirley-d523bc

      feat(backup): restore values overwritten by an AI run (#8) 1593f6

    • test(backup): cover the selection path and grid columns; honest run date (#8) 551936

    • Merge pull request #90 from breezefront/fix/composer-constraints

      fix(composer): tighten dependency constraints (breezefront/breeze-ai#1) 976098

    • fix(openai): stop advising an upgrade PHP 8.1 cannot install

      The TypeError branch told the user to update openai-php/client to ^0.19.
      Only 0.10.x reaches it, and 0.10.x is also the only branch PHP 8.1 can
      install: 0.11 and up require PHP 8.2. On the stores that actually hit
      this, the advice was impossible to follow.

      Name the PHP requirement instead of a client version.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> e3f75f

    • fix(composer): tighten dependency constraints (breezefront/breeze-ai#1)

      - php: "^7.4|^8.0|^8.1|^8.2" collapsed to ">=7.4 <9" anyway, since ^8.0
      already covers 8.1-8.4. It also claimed support for PHP 7.4/8.0, which
      cannot work: openai-php/client 0.10.x requires PHP ^8.1 and 0.19.x
      requires ^8.2, so no version resolves below 8.1. Now "^8.1", matching
      swissup/module-breeze.
      - magento/framework: "*" guarded nothing. Dropped, as in module-breeze
      and module-breeze-integrations.

      swissup/module-core stays "*" — it is pulled in transitively and no
      specific core version is required.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> b725ac

    • fix(backup): declare restore isolation, strict capture, scope-true wording (#8) ad050c

    • fix(backup): re-check selections, capture and write together (#8) d54dbe

    • fix(backup): row action bypasses the mass-action filter, keep uncaptured video columns (#8)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 12ba05

    • fix(backup): keep restores retriable, recorded and correctly scoped (#8)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 0fb862

    • fix(backup): one capture per field, per-commit counts, gated mass action (#8)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 7ed888

    • feat(backup): restore values overwritten by an AI run (#8)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 3ec08b

    • Merge pull request #88 from breezefront/claude/beautiful-liskov-50c01d

      feat(usage): log tokens, cost and duration per AI call (#86) 6aba08

    • fix(usage): say when the ledger stops recording, distrust stored rates (#86) 784abb

    • fix(usage): escape separators so a value cannot forge a field (#86) 085672

    • fix(usage): price the model that answered, keep one line per call (#86) 4ac0c0

    • fix(usage): count reasoning tokens, keep sub-cent charges (#86) 7549fb

    • fix(usage): never infer a rate the ledger cannot stand behind (#86) a856a8

    • test(usage): cover the log wiring, not just the writer (#86) 0117c1

    • feat(usage): log tokens, cost and duration per AI call (#86) 128d10

breezefront / module-breeze-content-builder

13 hours ago success
  • head
    • Merge pull request #36 from breezefront/fix/widget-description-for-ai

      docs(components): stop telling the AI a known widget directive is invented 45a7e6

    • docs(components): stop telling the AI a known widget directive is invented

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 3d1aa4

  • 1.2.0
    • Version 1.2.0 7f774f

    • Changes for support of the contact us page 812853

    • Added h1 for the Text component and switched to tags instead of CSS classes e054e6

    • Added new Map component c2d71b

    • Improve Columns vertical stretch 6b5da8

swissup / module-marketplace

13 hours ago success
  • head
    • Stop running composer from the backend

      Running composer through the web server was never reliable, so the backend no
      longer dispatches composer operations. Install, Update, Remove, Enable and
      Disable now open a modal with the command to copy and run in a terminal, both
      for a single row and for a massaction. Run Installer stays a real backend
      operation - the one-click installer does not use composer.

      Enable and Disable had no console equivalent, so marketplace:package:enable and
      marketplace:package:disable were added (aliases marketplace:enable and
      marketplace:disable).

      Channel configuration and Tasks History are removed from the backend as well.
      Channels are managed with the marketplace:channel:* and marketplace:auth:*
      commands. With the settings form gone, ChannelsSave was the last job producer,
      so the whole queue is removed: JobDispatcher, QueueDispatcher, Validator, the
      Job entity, the activity widget, the queue crons and the job table.

      The SettingsDataProvider modifiers are kept as empty stubs so that the channel
      modules registering them in the pool keep compiling.

      BREAKING: the swissup_marketplace_job table is dropped on setup:upgrade, and
      HandlerInterface::validateBeforeDispatch() is removed - it had no callers left.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> d70a96

    • Forward command output strings to terminal c17318

    • Allow using dry-run option 2d329d

    • Reuse composer_cache from user's directory if possible 9cc10a

    • Command shortcuts 2cfa4c

  • 1.11.0
    • Version 1.11.0 e5e9b8

    • Fixed PHP stan return type errors 49ac60

    • Allow to run installer for themes missing in composer.lock 7bb9ca

swissup / argento-breeze

15 hours ago success

swissup / argento-m2

19 hours ago success

swissup / theme-frontend-argentobreeze-business

19 hours ago success

swissup / module-quantity-switcher

19 hours ago success
  • 1.2.4
    • Version 1.2.4 e4c020

    • Merge pull request #5 from swissup/fix/arrow-room-lost-after-mount

      fix(arrows): keep the arrow room after the switcher mounts 1a9480

    • fix(arrows): keep the arrow room after the switcher mounts

      `.control:has(> .input-text.qty)` only matches the server-rendered markup.
      `product.js` wraps the input into `.qty-wrapper` on init, after which the input
      is no longer a direct child of `.control`, the rule stops matching and the 20px
      reserved on each side for the arrows disappears — the arrows overflow the field
      and the layout shifts once JS runs.

      Match the input as a descendant instead, which holds both before and after the
      wrap. Verified in the browser: `.control` padding went `0px 20px` -> `0px` the
      moment the wrapper was inserted, and stays `0px 20px` with this selector.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 082597

  • 1.2.3
    • Version 1.2.3 f2d44f

    • Fixed MSI error for bundle products (with no MSI source) on the cart page aa1c46

breezefront / module-breeze-theme-editor

19 hours ago success
  • 1.0.14
    • Version 1.0.14 4db3c2

    • docs: add QA test plan for COLOR_BACKGROUND field (#30)

      Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> ddaa52

    • docs: add QA test plan for COLOR_BACKGROUND field

      Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> 26b678

  • 1.0.13
    • Version 1.0.13 99f37c

    • Merge pull request #29 from breezefront/feature/color-background-gradient

      feat: COLOR_BACKGROUND field type with gradient support c2fd43

    • style: drop closing slash on void input tags (Magento Coding Standard)

      Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> a84957

    • feat: add COLOR_BACKGROUND field type with gradient support

      Implements the COLOR_BACKGROUND field type (issue #22) — a color field that
      accepts either a solid color or a CSS gradient, analogous to Shopify's
      `color_background` setting. Enables gradient backgrounds for elements exposed
      as CSS variables (e.g. footer `--footer-bg`).

      Backend:
      - CssValueFormatter: formatColorBackground() passes gradients through with
      comment-escaping, delegates solid values to the color pipeline; getComment
      handles the new type.
      - ValidationService: accepts gradient / palette-ref / solid-hex values.
      - SectionFormatter + CssVariableBuilder: treat color_background like color for
      format resolution and palette-var emission; gradients pass through untouched.
      - schema.graphqls: COLOR_BACKGROUND enum value.

      Frontend (Alpine/Tailwind theme editor, adminhtml):
      - gradient-utils: pure parse/serialize/detect + stop manipulation
      (paren-aware split so var()/rgb() stops survive), plus presets.
      - color-background renderer: gradient swatch vs solid, reuses the color
      renderer for solid; own compiled-template slot.
      - color-background handler: two-tab popup (Solid Pickr + palette / Gradient
      editor), preset swatches, draggable stops, position input, linear/radial,
      angle slider, per-stop Pickr; commits raw CSS gradient.
      - _gradient-picker.less styles; registered in field-renderer / field-handlers.

      Tests: PHPUnit (formatter/validation/section/cssvar) + Jest
      (gradient-utils, renderer, handler) — all green.

      Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> b5a3ef