Recent Activities
This page shows what are we working on.
-
head
-
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
-
Update README.md 8c7433
-
Update .gitignore 728872
-
Create LICENSE b5365f
-
Create module.xml c5b252
-
Create registration.php f5ca9f
-
Create composer.json 67ff9d
-
Update .gitignore 92992c
-
Initial commit 94d452
-
-
1.9.0
-
Version 1.9.0 ae8816
-
-
1.9.0
-
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
-
-
1.35.0
-
1.34.5
-
Version 1.34.5 6a3abb
-
-
1.35.0
-
1.34.5
-
1.5.4
-
head
-
1.0.2
-
1.2.0
-
1.1.3
-
1.2.0
-
Version 1.2.0 102c7c
-
Generated styles 88d646
-
Add AJAX search configuration options to the theme 8daf2c
-
Add theme variables for product details and action button styles; update related CSS classes c6feca
-
Refactor button styles and update easytabs theme variables
- Updated button styles to use new CSS variables for primary and secondary buttons, enhancing maintainability and consistency.
- Modified easytabs theme styles to utilize CSS variables for label colors and background images, improving customization options.
- Added new CSS variables for button states and easytabs collapsed background, ensuring a cohesive design system. c96cb9 -
Add theme variables for footer background, foreground, and copyright styles; update related CSS classes 02663c
-
Add theme variables for page header background and foreground colors, section border color and border width. a4efa8
-
Add theme variables for page header background and foreground colors 4b8628
-
Add README.md with installation and customization instructions 9afbe8
-
Add font-size variable to root CSS for consistency 545c16
-
Update icon sizes for various product and gallery templates ced6b7
-
Update image dimensions for product page and srcset configurations
Co-authored-by: Copilot <copilot@github.com> b4549d -
Add responsive image support for product gallery and update view configuration b83d49
-
Fixed Search Form 13c5a9
-
Ajax Search integration #30 74f83b
-
Improve filter layout for 1 column layout #29 b142db
-
-
1.1.3
-
1.2.0
-
1.1.3