Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
412 commits
Select commit Hold shift + click to select a range
5bac264
Migrate 'Product attributes' region into BaseProductController (ARCH-…
KrzysztofPajak Aug 16, 2026
9daa238
Migrate 'Product attributes. Condition' region into BaseProductContro…
KrzysztofPajak Aug 17, 2026
bb22f38
Fix inaccurate comment on dropped Vendor ModelState.IsValid check (AR…
KrzysztofPajak Aug 17, 2026
f7f64c3
Migrate 'Product attribute values' region into BaseProductController …
KrzysztofPajak Aug 17, 2026
4664481
Plan fix: flag Vendor's field-level validators as dead code once Task…
KrzysztofPajak Aug 17, 2026
ed2e8f0
Correct row-20 narrative: Vendor was the at-risk host, not Admin (ARC…
KrzysztofPajak Aug 17, 2026
bc9727d
Migrate 'Product attribute combinations' region into BaseProductContr…
KrzysztofPajak Aug 17, 2026
62d77e2
Migrate 'Product Attribute combination - tier prices' region into Bas…
KrzysztofPajak Aug 17, 2026
e55e5ab
Migrate 'Reservation' region into BaseProductController (ARCH-001 Pha…
KrzysztofPajak Aug 17, 2026
871b0d2
Migrate 'Bids' region into BaseProductController (ARCH-001 Phase 1)
KrzysztofPajak Aug 17, 2026
06d4c9b
Drop storeId params from IProductViewModelService; inject IAdminDataS…
KrzysztofPajak Aug 17, 2026
526beee
Task 9 fix round 1: gate PrepareTierPriceModel's store dropdown by Sh…
KrzysztofPajak Aug 17, 2026
ae5a6d1
Reconcile remaining ProductViewModelService rows: vendor-scope produc…
KrzysztofPajak Aug 17, 2026
85ef2bf
Add tests for vendor-scoped product search and dead-param drops (ARCH…
KrzysztofPajak Aug 17, 2026
c1eb4b0
Force VendorId on InsertProductModel/UpdateProductModel for vendor sc…
KrzysztofPajak Aug 17, 2026
0a1a8e1
Plan fix: escalate Task 10 review's per-id ownership filter gap to a …
KrzysztofPajak Aug 17, 2026
e9eba6a
Reduce Admin and Store ProductController to thin BaseProductControlle…
KrzysztofPajak Aug 17, 2026
2bc3309
Filter selected product ids by ownership in Insert*ProductModel (ARCH…
KrzysztofPajak Aug 17, 2026
86f50b4
Delete stale Admin/Store ProductControllerTests.cs, superseded by thi…
KrzysztofPajak Aug 17, 2026
6787f53
Task 11 fix round 1: close review findings (attribute regression test…
KrzysztofPajak Aug 17, 2026
8bc4b86
Delete Vendor's duplicate ProductViewModelService/interface, use Admi…
KrzysztofPajak Aug 17, 2026
b521a35
Task 12 fix round 1: correct stale doc comment, escalate review's orp…
KrzysztofPajak Aug 17, 2026
26888ac
Trim Vendor ProductControllerTests to routing-only, delete superseded…
KrzysztofPajak Aug 17, 2026
f0f2c06
Trim VendorMappingTests to non-Product cases, delete orphaned Vendor …
KrzysztofPajak Aug 17, 2026
eec7855
Add ARCH-001 Phase 2 (view consolidation) design spec
KrzysztofPajak Aug 17, 2026
d0ea382
Add ARCH-001 Phase 2 (view consolidation) implementation plan
KrzysztofPajak Aug 17, 2026
8ca05b8
Fix plan: split fake namespace types into their own file (Task 2), C#…
KrzysztofPajak Aug 17, 2026
a0f5d86
Convert Grand.Web.AdminShared to a Razor Class Library (ARCH-001 Phas…
KrzysztofPajak Aug 17, 2026
d9ba038
Add AdminShared view fallback branch to ViewLocationExpander (ARCH-00…
KrzysztofPajak Aug 17, 2026
2fc0868
Migrate TierPriceCreatePopup to AdminShared, pilot for view consolida…
KrzysztofPajak Aug 17, 2026
6d1324d
Keep Product/List.cshtml as host-specific override, no unification (A…
KrzysztofPajak Aug 17, 2026
58d0a3d
Fix grand.plugin.props (#791)
KrzysztofPajak Aug 17, 2026
190125d
Keep Product/AttributeCombinationPopup.cshtml as host-specific overri…
KrzysztofPajak Aug 17, 2026
00b9aea
Keep Product/Partials/CreateOrUpdate.Info.cshtml as host-specific ove…
KrzysztofPajak Aug 17, 2026
9125fb9
Keep Product/Partials/CreateOrUpdate.Prices.cshtml as host-specific o…
KrzysztofPajak Aug 17, 2026
de545c6
Keep Product/Partials/CreateOrUpdate.PurchasedWithOrders.cshtml as ho…
KrzysztofPajak Aug 17, 2026
a7066ba
Migrate Product/Partials/CreateOrUpdate.cshtml to AdminShared (ARCH-0…
KrzysztofPajak Aug 17, 2026
8fb8dd6
Migrate BulkEdit.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 17, 2026
0eaf0b1
Migrate CreateOrUpdate.Additional.cshtml to AdminShared (ARCH-001 Pha…
KrzysztofPajak Aug 17, 2026
28dee1f
Migrate CreateOrUpdate.Calendar.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 17, 2026
279b5b2
Fix IAdminDataScope<Product> registration collision when hosts share …
KrzysztofPajak Aug 17, 2026
4c32d0c
Migrate CreateOrUpdate.Categories.cshtml to AdminShared (ARCH-001 Pha…
KrzysztofPajak Aug 17, 2026
3c0d1d6
Migrate CreateOrUpdate.Collections.cshtml to AdminShared (ARCH-001 Ph…
KrzysztofPajak Aug 17, 2026
16cdbd4
Migrate RequiredProductAddPopup.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 17, 2026
ce0068b
Migrate CreateOrUpdate.Discounts.cshtml to AdminShared (ARCH-001 Phas…
KrzysztofPajak Aug 17, 2026
ce5123c
Migrate CreateOrUpdate.Documents.cshtml to AdminShared (ARCH-001 Phas…
KrzysztofPajak Aug 17, 2026
0d01a32
Migrate AssociateProductToAttributeValuePopup.cshtml to AdminShared (…
KrzysztofPajak Aug 17, 2026
f3d9b00
Migrate AssociatedProductAddPopup.cshtml to AdminShared (ARCH-001 Pha…
KrzysztofPajak Aug 17, 2026
79543f0
Migrate BundleProductAddPopup.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 17, 2026
b0b4cb9
Migrate Create.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 17, 2026
fff0c26
Migrate CrossSellProductAddPopup.cshtml to AdminShared (ARCH-001 Phas…
KrzysztofPajak Aug 17, 2026
02bf8b1
Migrate Edit.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 17, 2026
0cdeafa
Migrate CreateOrUpdate.AssociatedProducts.cshtml to AdminShared (ARCH…
KrzysztofPajak Aug 17, 2026
8625051
Migrate CreateOrUpdate.Bids.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 17, 2026
25d5a8e
Migrate CreateOrUpdate.BundleProducts.cshtml to AdminShared (ARCH-001…
KrzysztofPajak Aug 17, 2026
a2e9802
Migrate CreateOrUpdate.CrossSells.cshtml to AdminShared (ARCH-001 Pha…
KrzysztofPajak Aug 17, 2026
f70a06b
Migrate CreateOrUpdate.Inventory.cshtml to AdminShared (ARCH-001 Phas…
KrzysztofPajak Aug 17, 2026
0058ffc
Migrate CreateOrUpdate.Pictures.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 17, 2026
2908cfe
Migrate CreateOrUpdate.ProductAttributes.TabAttributeCombinations.csh…
KrzysztofPajak Aug 17, 2026
956ec57
Migrate CreateOrUpdate.ProductAttributes.TabAttributes.cshtml to Admi…
KrzysztofPajak Aug 17, 2026
e3a89bb
Spec addendum: widget-zone selection uses per-area partial files, not…
KrzysztofPajak Aug 18, 2026
efb870b
Retrofit BulkEdit.cshtml widget-zone selection to per-area partial fi…
KrzysztofPajak Aug 18, 2026
f32c314
Retrofit Create.cshtml widget-zone selection to per-area partial file…
KrzysztofPajak Aug 18, 2026
117f659
Retrofit Edit.cshtml widget-zone selection to per-area partial files …
KrzysztofPajak Aug 18, 2026
a83be07
Retrofit CreateOrUpdate.Additional.cshtml widget-zone selection to pe…
KrzysztofPajak Aug 18, 2026
5cd268c
Retrofit CreateOrUpdate.AssociatedProducts.cshtml widget-zone selecti…
KrzysztofPajak Aug 18, 2026
3e38d30
Retrofit CreateOrUpdate.Bids.cshtml widget-zone selection to per-area…
KrzysztofPajak Aug 18, 2026
27bbd4f
Retrofit CreateOrUpdate.BundleProducts.cshtml widget-zone selection t…
KrzysztofPajak Aug 18, 2026
c13aa79
Retrofit CreateOrUpdate.Calendar.cshtml widget-zone selection to per-…
KrzysztofPajak Aug 18, 2026
791beb1
Retrofit CreateOrUpdate.Categories.cshtml widget-zone selection to pe…
KrzysztofPajak Aug 18, 2026
5c86aa2
Retrofit CreateOrUpdate.Collections.cshtml widget-zone selection to p…
KrzysztofPajak Aug 18, 2026
c16cdb1
Retrofit CreateOrUpdate.CrossSells.cshtml widget-zone selection to pe…
KrzysztofPajak Aug 18, 2026
8ab0c90
Retrofit CreateOrUpdate.cshtml (tab container) widget-zone selection …
KrzysztofPajak Aug 18, 2026
ecfa5e3
Retrofit CreateOrUpdate.Inventory.cshtml widget-zone selection to per…
KrzysztofPajak Aug 18, 2026
1aa394b
Retrofit CreateOrUpdate.Pictures.cshtml widget-zone selection to per-…
KrzysztofPajak Aug 18, 2026
dee12e0
Retrofit CreateOrUpdate.ProductAttributes.TabAttributeCombinations.cs…
KrzysztofPajak Aug 18, 2026
2054d36
Retrofit CreateOrUpdate.ProductAttributes.TabAttributes.cshtml widget…
KrzysztofPajak Aug 18, 2026
00ec639
Migrate CreateOrUpdate.ProductAttributes.cshtml to AdminShared (ARCH-…
KrzysztofPajak Aug 18, 2026
2c18fec
Migrate CreateOrUpdate.ProductPrices.cshtml to AdminShared (ARCH-001 …
KrzysztofPajak Aug 18, 2026
7486618
Migrate CreateOrUpdate.Recommended.cshtml to AdminShared (ARCH-001 Ph…
KrzysztofPajak Aug 18, 2026
c0eccc4
Migrate CreateOrUpdate.RelatedProducts.cshtml to AdminShared (ARCH-00…
KrzysztofPajak Aug 18, 2026
e739fa4
Migrate CreateOrUpdate.Reviews.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 18, 2026
1ba00e0
Migrate CreateOrUpdate.SEO.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 18, 2026
707e9a5
Migrate CreateOrUpdate.SimilarProducts.cshtml to AdminShared (ARCH-00…
KrzysztofPajak Aug 18, 2026
8cf623c
Migrate CreateOrUpdate.SpecificationAttributes.cshtml to AdminShared …
KrzysztofPajak Aug 18, 2026
64638dd
Migrate CreateOrUpdateProductAttributeValue.cshtml to AdminShared (AR…
KrzysztofPajak Aug 18, 2026
1eb7841
Migrate CreateOrUpdateTierPrice.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 18, 2026
2e73136
Migrate ProductAttributes.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 18, 2026
8d55f66
Migrate ProductAttributeConditionPopup.cshtml to AdminShared (ARCH-00…
KrzysztofPajak Aug 18, 2026
fcec3a1
Migrate ProductAttributeMappingPopup.cshtml to AdminShared (ARCH-001 …
KrzysztofPajak Aug 18, 2026
7df47dd
Migrate ProductAttributeValidationRulesPopup.cshtml to AdminShared (A…
KrzysztofPajak Aug 18, 2026
0d0c5be
Migrate ProductAttributeValueCreatePopup.cshtml to AdminShared (ARCH-…
KrzysztofPajak Aug 18, 2026
bbb5db0
Migrate ProductAttributeValueEditPopup.cshtml to AdminShared (ARCH-00…
KrzysztofPajak Aug 18, 2026
e5713dd
Migrate ProductPicturePopup.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 18, 2026
79d1df6
Migrate ProductSpecAttrPopup.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 18, 2026
57048e2
Migrate RecommendedProductAddPopup.cshtml to AdminShared (ARCH-001 Ph…
KrzysztofPajak Aug 18, 2026
78efefe
Migrate RelatedProductAddPopup.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 18, 2026
1d43f09
Migrate SimilarProductAddPopup.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 18, 2026
e64ad0c
Migrate TierPriceEditPopup.cshtml to AdminShared (ARCH-001 Phase 2)
KrzysztofPajak Aug 18, 2026
2b5b9d5
Fix dead admin widget zones in consolidated Product views
KrzysztofPajak Aug 18, 2026
36b25c2
Nest AdminShared views under /Views/AdminShared to avoid path collisions
KrzysztofPajak Aug 18, 2026
d337a12
Make RoutedProductDataScope fail closed on an unknown area
KrzysztofPajak Aug 18, 2026
38db1e8
Document the two host-detection idioms and guard _ViewStart on a null…
KrzysztofPajak Aug 18, 2026
65cde42
Amend Phase 2 spec with the post-review corrections
KrzysztofPajak Aug 18, 2026
4b14989
Amend Phase 2 spec: retire ResourceKeyPrefix as a content-gating idiom
KrzysztofPajak Aug 18, 2026
9db9612
Retire ResourceKeyPrefix as a content-gating idiom in Product views
KrzysztofPajak Aug 18, 2026
a414f97
Fix cross-store product export IDOR in ExportExcelAll
KrzysztofPajak Aug 18, 2026
b26b2c8
Wire Grand.Web.Store's own vc:store-widget into Product widget zones
KrzysztofPajak Aug 18, 2026
332c7b2
Remove dead IAdminDataScope<TEntity>.ApplyScope
KrzysztofPajak Aug 19, 2026
e4b2ef1
Harden BaseProductController against CodeQL CSRF finding; gitignore d…
KrzysztofPajak Aug 19, 2026
613fa35
Untrack docs/superpowers/ (now gitignored)
KrzysztofPajak Aug 19, 2026
f830ae7
Add @model ProductModel consistently across Product WidgetZone.*.cshtml
KrzysztofPajak Aug 23, 2026
f2e1c61
Minor fix
KrzysztofPajak Aug 23, 2026
9d136c7
Remove unused file
KrzysztofPajak Aug 23, 2026
5dc0489
Merge pull request #790 from grandnode/arch001/phase1-product-consoli…
KrzysztofPajak Aug 24, 2026
a7697d0
fix: split malformed .gitignore line (thumbs pattern was merged with …
KrzysztofPajak Aug 24, 2026
68e382f
feat(arch001): add RoutedCategoryDataScope and register IAdminDataSco…
KrzysztofPajak Aug 24, 2026
322bd10
feat(arch001): add BaseCategoryController skeleton with shared List r…
KrzysztofPajak Aug 24, 2026
e758c8d
feat(arch001): add Create/Edit/Delete region to BaseCategoryController
KrzysztofPajak Aug 24, 2026
ae15cfa
feat(arch001): add Picture region to BaseCategoryController
KrzysztofPajak Aug 24, 2026
1cfab35
test(arch001): add PicturePopup POST and error-branch coverage (task …
KrzysztofPajak Aug 24, 2026
61698f6
feat(arch001): add Export/Import region to BaseCategoryController
KrzysztofPajak Aug 24, 2026
ede5faf
feat(arch001): add Products region to BaseCategoryController
KrzysztofPajak Aug 24, 2026
2b2ce55
test(arch001): add store-scoped ProductAddPopup filtering + Delete/Li…
KrzysztofPajak Aug 24, 2026
dc42231
refactor(arch001): reduce Admin/Store CategoryController to thin Base…
KrzysztofPajak Aug 24, 2026
fa46d59
refactor(arch001): move shared Category views under Grand.Web.AdminSh…
KrzysztofPajak Aug 24, 2026
9598941
fix(arch001): guard SearchStoreId forcing so Admin's submitted store …
KrzysztofPajak Aug 24, 2026
c1a7ead
Merge pull request #792 from grandnode/arch001/phase3-category-consol…
KrzysztofPajak Aug 24, 2026
0186704
feat(arch001): add RoutedCollectionDataScope and register IAdminDataS…
KrzysztofPajak Aug 24, 2026
2408ec1
feat(arch001): add BaseCollectionController skeleton with shared List…
KrzysztofPajak Aug 24, 2026
d46e9f4
feat(arch001): add Create/Edit/Delete region to BaseCollectionController
KrzysztofPajak Aug 24, 2026
fd3225d
feat(arch001): add Picture region to BaseCollectionController
KrzysztofPajak Aug 24, 2026
589dd68
feat(arch001): add Export/Import region to BaseCollectionController
KrzysztofPajak Aug 24, 2026
48f8c62
feat(arch001): add Products region to BaseCollectionController
KrzysztofPajak Aug 24, 2026
93b7877
refactor(arch001): reduce Admin/Store CollectionController to thin Ba…
KrzysztofPajak Aug 24, 2026
9831e8e
refactor(arch001): move shared Collection views under Grand.Web.Admin…
KrzysztofPajak Aug 24, 2026
f49405f
Add workflow_dispatch trigger to build workflow
KrzysztofPajak Aug 24, 2026
22177b3
Merge pull request #793 from grandnode/feature/workflow-sonarcube
KrzysztofPajak Aug 24, 2026
a055740
Merge pull request #794 from grandnode/arch001/phase4-collection-cons…
KrzysztofPajak Aug 25, 2026
04bb86c
feat(arch001): add FilterOrderItems to IAdminDataScope<TEntity>
KrzysztofPajak Aug 25, 2026
e0294d1
feat(arch001): add AdminOrderDataScope (Sales-Manager-aware, not gene…
KrzysztofPajak Aug 25, 2026
54edd23
feat(arch001): add StoreOrderDataScope
KrzysztofPajak Aug 25, 2026
ebc43ef
feat(arch001): add VendorOrderDataScope with FilterOrderItems
KrzysztofPajak Aug 25, 2026
2e1d72e
feat(arch001): add RoutedOrderDataScope and register IAdminDataScope<…
KrzysztofPajak Aug 25, 2026
8456834
feat(arch001): add BaseOrderController skeleton with List region and …
KrzysztofPajak Aug 25, 2026
248d14d
feat(arch001): add Edit/PDF/search regions to BaseOrderController; wi…
KrzysztofPajak Aug 25, 2026
d35d4e2
refactor(arch001): remove Grand.Web.Vendor's duplicate IOrderViewMode…
KrzysztofPajak Aug 25, 2026
bf57ada
feat(arch001): add BaseOrderManagementController skeleton with Paymen…
KrzysztofPajak Aug 25, 2026
1c6b79d
feat(arch001): add Delete action to BaseOrderManagementController
KrzysztofPajak Aug 25, 2026
5fc265a
feat(arch001): add order totals/shipping method/user fields region
KrzysztofPajak Aug 25, 2026
d95c194
feat(arch001): add order item actions region (Save/Delete/Cancel/Rese…
KrzysztofPajak Aug 25, 2026
369cf90
feat(arch001): add license popup region
KrzysztofPajak Aug 25, 2026
90f90fd
feat(arch001): add AddProductToOrder region
KrzysztofPajak Aug 25, 2026
e614197
feat(arch001): add Addresses region
KrzysztofPajak Aug 25, 2026
ec95bf2
feat(arch001): add order notes region, preserving Admin-throws vs Sto…
KrzysztofPajak Aug 25, 2026
809385a
feat(arch001): cut Admin/Store/Vendor OrderController over to thin su…
KrzysztofPajak Aug 25, 2026
2379479
refactor(arch001): migrate Order views to Grand.Web.AdminShared, add …
KrzysztofPajak Aug 25, 2026
2fa96a2
fix(arch001): address final review findings (C1 Vendor Order view mod…
KrzysztofPajak Aug 25, 2026
af9da57
Merge pull request #795 from grandnode/arch001/phase5-order-consolida…
KrzysztofPajak Aug 25, 2026
cd62b2f
feat(arch001): add IAdminDataScope<Shipment> implementations (Store/V…
KrzysztofPajak Aug 25, 2026
a236bc5
refactor(arch001): move Vendor's lighter Shipment models into AdminSh…
KrzysztofPajak Aug 25, 2026
3fd2fda
refactor(arch001): reconcile IShipmentViewModelService onto scope, de…
KrzysztofPajak Aug 25, 2026
c01b8d8
feat(arch001): add BaseShipmentController List region
KrzysztofPajak Aug 25, 2026
6b1c218
feat(arch001): add BaseShipmentController AddShipment region, thread …
KrzysztofPajak Aug 25, 2026
d921c4e
feat(arch001): add BaseShipmentController details/tracking/ship/deliv…
KrzysztofPajak Aug 25, 2026
2cd2dbd
feat(arch001): add BaseShipmentController PDF export + bulk-action re…
KrzysztofPajak Aug 25, 2026
bc1ac20
feat(arch001): add BaseShipmentController notes region — controller/s…
KrzysztofPajak Aug 25, 2026
3fab6ee
feat(arch001): cut Admin/Store/Vendor ShipmentController over to thin…
KrzysztofPajak Aug 25, 2026
cb8fcf3
refactor(arch001): migrate Shipment views to Grand.Web.AdminShared, a…
KrzysztofPajak Aug 25, 2026
c5e618c
fix(arch001): template the warehouse-not-available Loc key in shared …
KrzysztofPajak Aug 25, 2026
41218d4
fix(arch001): restore Store/Vendor EditUserFields via BaseShipmentCon…
KrzysztofPajak Aug 26, 2026
f7b0e3c
feat(arch001): add IAdminDataScope<PaymentTransaction> implementation…
KrzysztofPajak Aug 26, 2026
8f549be
feat(arch001): add BasePaymentTransactionController skeleton with Lis…
KrzysztofPajak Aug 26, 2026
512620b
feat(arch001): add Edit + payment action buttons region to BasePaymen…
KrzysztofPajak Aug 26, 2026
81e79ce
feat(arch001): add partial refund/paid popups and Delete region, fix …
KrzysztofPajak Aug 26, 2026
7f2c7a3
feat(arch001): cut Admin/Store PaymentTransactionController over to t…
KrzysztofPajak Aug 26, 2026
0fa7b29
refactor(arch001): migrate PaymentTransaction views to Grand.Web.Admi…
KrzysztofPajak Aug 26, 2026
73c02e9
fix(arch001): address final review findings — disclose widget-tag fix…
KrzysztofPajak Aug 26, 2026
05dcd2e
Merge pull request #796 from grandnode/arch001/phase6-shipment-consol…
KrzysztofPajak Aug 26, 2026
a198d69
Merge branch 'develop' into arch001/phase7-paymenttransaction-consoli…
KrzysztofPajak Aug 26, 2026
245fcd7
fix(arch001): address CodeQL PR review findings on PaymentTransaction
KrzysztofPajak Aug 26, 2026
bfc80ff
Merge pull request #797 from grandnode/arch001/phase7-paymenttransact…
KrzysztofPajak Aug 26, 2026
271aa57
fix(admin): resolve partial-view name collision in Order AddressEdit …
KrzysztofPajak Aug 26, 2026
a6bb196
fix(web): remove spurious null-guard on Category.PageSizeOptions (#800)
KrzysztofPajak Aug 28, 2026
a4cbf7b
ARCH-001 Phase 8: MerchandiseReturn controller/service consolidation …
KrzysztofPajak Aug 28, 2026
b9f182c
ARCH-001 Phase 9: Reports controller/service consolidation (Admin/Sto…
KrzysztofPajak Aug 29, 2026
9ae0971
fix(arch001): consolidate VendorReview Admin/Vendor duplication (#802)
KrzysztofPajak Aug 29, 2026
d12ca76
ARCH-001 Phase 11: attributes family consolidation (#803)
KrzysztofPajak Sep 1, 2026
6c14db6
Add 2.4 migration to rename 'Staff' customer group to 'Store manager'…
KrzysztofPajak Sep 1, 2026
4a4e96c
ARCH-001 Phase 13: Brand controller/service consolidation (Admin/Stor…
KrzysztofPajak Sep 2, 2026
8507076
fix: remove unreachable IsStoreManager branches from Admin controller…
KrzysztofPajak Sep 2, 2026
b3f825e
ARCH-001 Phase 12: Discount controller/service consolidation (Admin/S…
KrzysztofPajak Sep 3, 2026
2da0b6b
ARCH-001 Phase 14: Blog controller/service consolidation (Admin/Store…
KrzysztofPajak Sep 3, 2026
43f1dd2
ARCH-001 Phase 15: Page controller/service consolidation (Admin/Store…
KrzysztofPajak Sep 3, 2026
e79754f
fix(store): drop dead-condition re-check in EditWarningCheck across P…
KrzysztofPajak Sep 3, 2026
92bce57
ARCH-001 Phase 16: News controller/service consolidation (Admin/Store…
KrzysztofPajak Sep 3, 2026
6deba9d
ARCH-001 Phase 17: GiftVoucher controller/service consolidation (Admi…
KrzysztofPajak Sep 3, 2026
a86ab29
ARCH-001 Phase 18: ProductReview controller/service consolidation (Ad…
KrzysztofPajak Sep 4, 2026
fe74135
ARCH-001 Phase 19: MessageTemplate controller/service consolidation (…
KrzysztofPajak Sep 5, 2026
9fe130e
Add GitHub Copilot instructions adapter for the .ai folder (#815)
Copilot Sep 5, 2026
8d0872f
Add regex match timeout to ApiQueryOptions (#816)
Copilot Sep 5, 2026
be22638
Dispose `_resetCacheToken` in MemoryCacheBase on teardown (#817)
Copilot Sep 5, 2026
e76485a
ARCH-001 Phase 21: EmailAccount controller/service consolidation (Adm…
KrzysztofPajak Sep 9, 2026
bc67ac4
ARCH-001 Phase 20: Customer controller/service consolidation (Admin/S…
KrzysztofPajak Sep 9, 2026
47ac862
ARCH-001 Phase 22: TaxCategory controller/service consolidation (Admi…
KrzysztofPajak Sep 9, 2026
9b13456
ARCH-001 Phase 23: Shipping sub-entities (Warehouse/ShippingMethod/De…
KrzysztofPajak Sep 11, 2026
ecb7f73
ARCH-001 Phase 24: shrink Admin CurrencyController/LanguageController…
KrzysztofPajak Sep 11, 2026
a1c414e
ARCH-001 Phase 25: consolidate Admin/Store PictureController (#826)
KrzysztofPajak Sep 11, 2026
9ec8003
ARCH-001 Phase 26: consolidate Admin/Store OnlineCustomerController i…
KrzysztofPajak Sep 11, 2026
ff40e3a
ARCH-001 Phase 27: consolidate SearchController's Category/Collection…
KrzysztofPajak Sep 11, 2026
3f49a5b
ARCH-001 Phase 28: consolidate Admin/Store/Vendor HomeController infr…
KrzysztofPajak Sep 11, 2026
e07e8f7
fix: close cross-store IDOR in Category/Collection/Brand ImportFromXl…
KrzysztofPajak Sep 11, 2026
21a48f5
ARCH-001: consolidate GetActiveStore() into IAdminStoreService (#831)
KrzysztofPajak Sep 11, 2026
82719e9
fix: resolve OpenApi/NPOI vulnerable package and all build warnings (…
KrzysztofPajak Sep 12, 2026
1050640
Fix 404 on shipping sub-entity edit pages (#833)
KrzysztofPajak Sep 12, 2026
f37bceb
build(deps-dev): bump js-yaml in /src/Web/Grand.Web/vueapp (#823)
dependabot[bot] Sep 12, 2026
20851fd
Collapse store Url/SecureUrl/SslEnabled onto a single Url (#834)
KrzysztofPajak Sep 12, 2026
39db0d5
Backfill missing 2.4 localization resources and bump nanoid (#835)
KrzysztofPajak Sep 12, 2026
ac02b16
Keep every store with an available currency (#836)
KrzysztofPajak Sep 13, 2026
4f8e654
Fix 404 when a store owner opens a shipping provider's configuration …
KrzysztofPajak Sep 13, 2026
29f3a81
Let store owners configure payment plugins per store (#840)
KrzysztofPajak Sep 13, 2026
19be138
Set 2.4.0 beta version (#841)
KrzysztofPajak Sep 13, 2026
e28d2c5
fix(store): close AvailableStores cross-store leak in Customer contro…
KrzysztofPajak Sep 13, 2026
e0e9e34
Migrate GrandNode.sln to the XML-based GrandNode.slnx (#842)
KrzysztofPajak Sep 14, 2026
846584c
Admin frontend modernization (#843)
KrzysztofPajak Sep 20, 2026
bb26fde
Move the storefront header icons to a bottom bar on phones (#847)
KrzysztofPajak Sep 22, 2026
8661912
Say what the storefront theme selector selects (#848)
KrzysztofPajak Sep 23, 2026
0a1b63b
feat(admin): admin panel on the component layer (#850)
KrzysztofPajak Sep 26, 2026
96f2563
Presentation-grade sample data for the installer (#851)
KrzysztofPajak Sep 26, 2026
33813e9
chore(admin): drop dead admin styles and clean up the dashboard (#853)
KrzysztofPajak Sep 27, 2026
cc91204
fix(admin): build plugin and discount rule urls from the path base, n…
KrzysztofPajak Sep 27, 2026
37d6657
Encode thumbnails at quality 80 instead of 100 (#855)
KrzysztofPajak Sep 27, 2026
9abfd1a
Nordic Editorial storefront theme (#852)
KrzysztofPajak Sep 27, 2026
6aae605
Fix installer host:port parsing and blank admin under Visual Studio (…
KrzysztofPajak Sep 27, 2026
fe16797
Restyle the panel sign-in screens and add password recovery to the pa…
KrzysztofPajak Sep 27, 2026
444652e
Replace the raster GrandNode mark in the panels with an SVG (#858)
KrzysztofPajak Sep 27, 2026
b34b780
Modern theme redesign: clean tech storefront on a thin Default layer …
KrzysztofPajak Sep 27, 2026
a8bde4b
Fix the sitemap XML task: empty page <loc> and crash without a work c…
KrzysztofPajak Sep 28, 2026
0990287
Give search engines and AI crawlers the real product availability (#861)
KrzysztofPajak Sep 29, 2026
2abbaed
Download import pictures only from public addresses as real images (#…
KrzysztofPajak Sep 30, 2026
a2527c3
Publish rating, shipping and return policy in the storefront JSON-LD …
KrzysztofPajak Sep 30, 2026
e6987bb
Admin hints as plain text, store no-discounts note, vendor profile la…
KrzysztofPajak Oct 1, 2026
e69893b
Share runtime-written files across instances via Application:MediaPat…
KrzysztofPajak Oct 1, 2026
80f41fa
Signed GHCR image with SBOM and SLSA provenance for release tags (#866)
KrzysztofPajak Oct 2, 2026
e1234cb
NuGet/npm update and admin panel fixes (#868)
KrzysztofPajak Oct 3, 2026
5649cf4
Drop schema.org microdata from the quick view template and make the e…
KrzysztofPajak Oct 3, 2026
f273f6a
Make the repository easier to find: README, docs and community files …
KrzysztofPajak Oct 3, 2026
c70372e
Remove unused appsettings keys and align admin panel appsettings (#871)
KrzysztofPajak Oct 3, 2026
45d9b9d
Set version 2.4.0 (#872)
KrzysztofPajak Oct 4, 2026
ac880bb
Merge main into 2.4.0 release (keep 2.4.x azure-pipelines.yml)
KrzysztofPajak Oct 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
15 changes: 15 additions & 0 deletions .ai/agents/admin-ui-specialist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
name: Admin UI Specialist
description: Make admin-facing changes affecting Main Admin, Store Owner, Vendor, shared admin models, permissions, navigation, validation, or scoped data access.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md, .ai/skills/admin-area-changes.md, and
.ai/skills/template-creation.md, which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then read `.ai/skills/admin-area-changes.md` for Main Admin, Store Owner,
Vendor, shared admin model, permission, navigation, validation, and scoped data access rules, and
`.ai/skills/template-creation.md` for Razor views, partials, and admin tag helper conventions. Run
`.ai/checklists/definition-of-done.md` before reporting the change complete.
15 changes: 15 additions & 0 deletions .ai/agents/architecture-reviewer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
name: Architecture Reviewer
description: Review design, layering, dependency direction, module boundaries, public contracts, and maintainability.
tools: ["codebase", "search", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md, .ai/skills/architecture-review.md, and
.ai/knowledge/architecture.md, which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then read `.ai/skills/architecture-review.md` for design, layering,
dependency, module boundary, and public contract review rules, and `.ai/knowledge/architecture.md`
for layering rules, DI lifetimes, mediator commands/queries, and domain events. Run
`.ai/checklists/code-review.md` before reporting the review complete.
16 changes: 16 additions & 0 deletions .ai/agents/bug-fixer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: Bug Fixer
description: Diagnose and fix a broken behavior when the root cause is not yet known — reproduce, find the cause, choose a fix, assess risk, test, verify.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md and .ai/workflows/fix-bug.md,
which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then follow `.ai/workflows/fix-bug.md` step by step; it names the
skills and knowledge to load once the cause is located, and hands off to the matching prompt
for the fix itself. Run `.ai/checklists/definition-of-done.md`, and
`.ai/checklists/security.md` or `.ai/checklists/performance.md` when the bug touches those
areas, before reporting the fix complete.
15 changes: 15 additions & 0 deletions .ai/agents/dependency-upgrader.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
name: Dependency Upgrader
description: Move a NuGet package, framework, or shared version, using central package management conventions.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md and .ai/workflows/upgrade-dependency.md,
which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then follow `.ai/workflows/upgrade-dependency.md` step by step, using
`.ai/standards/dependencies.md` for central package management, shared MSBuild props, project
references, output paths, and SDK selection rules. Run `.ai/checklists/definition-of-done.md`
before reporting the upgrade complete.
16 changes: 16 additions & 0 deletions .ai/agents/dotnet-expert.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: .NET Expert
description: Write or review idiomatic C#/.NET code — async/await, records, guard clauses, result objects, pattern matching, nullable types, and configuration binding.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md, .ai/skills/dotnet-review.md, and
.ai/knowledge/dotnet.md / .ai/knowledge/async.md, which remain the single source of truth.
Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then read `.ai/skills/dotnet-review.md` for C#, .NET, ASP.NET Core, and
.NET test review rules, `.ai/knowledge/dotnet.md` for idioms, and `.ai/knowledge/async.md` for
async/await, `CancellationToken`, and `Task` vs `ValueTask` conventions. Run
`.ai/checklists/definition-of-done.md` before reporting the change complete.
15 changes: 15 additions & 0 deletions .ai/agents/migration-writer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
name: Migration Writer
description: Add an upgrade migration that seeds or changes data for existing installations — settings, localization resources, permissions, admin sitemap entries, scheduled tasks, or document shape.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md and .ai/prompts/add-migration.md,
which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then follow `.ai/prompts/add-migration.md` step by step, using
`.ai/skills/database-review.md` for migration, schema, and data integrity rules, and
`.ai/templates/migration.md` as the scaffold. Run `.ai/checklists/data-change.md` and
`.ai/checklists/definition-of-done.md` before reporting the migration complete.
16 changes: 16 additions & 0 deletions .ai/agents/mongodb-expert.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: MongoDB Expert
description: Write or review MongoDB collections, filters, projections, indexes, repository queries, aggregations, updates, and data migrations.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md, .ai/skills/mongodb-review.md, and
.ai/knowledge/mongodb.md, which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then read `.ai/skills/mongodb-review.md` for collections, filters,
projections, indexes, aggregations, updates, and data migration review rules, and
`.ai/knowledge/mongodb.md` for `IRepository<T>` usage, query patterns, and partial update
conventions. Run `.ai/checklists/data-change.md` and `.ai/checklists/definition-of-done.md`
before reporting the change complete.
16 changes: 16 additions & 0 deletions .ai/agents/notification-specialist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: Notification Specialist
description: Work with message templates, DotLiquid tokens and drops, IMessageProviderService, queued email lifecycle, LiquidObjectBuilder, and domain event notification handlers.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md and .ai/skills/message-notification.md,
which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then read `.ai/skills/message-notification.md` for message templates,
DotLiquid tokens and drops, `IMessageProviderService`, queued email lifecycle,
`LiquidObjectBuilder`, the `MessageTokensAddedEvent` plugin extension point, and domain event
notification handler rules. Run `.ai/checklists/definition-of-done.md` before reporting the
change complete.
16 changes: 16 additions & 0 deletions .ai/agents/performance-investigator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: Performance Investigator
description: Diagnose slow behavior when the bottleneck is unknown — define, measure, explain, fix, re-measure.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md and .ai/workflows/investigate-performance.md,
which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then follow `.ai/workflows/investigate-performance.md` step by step, using
`.ai/knowledge/performance.md` for `ICacheBase`, cache key constants, pagination, and partial
field write rules, and `.ai/knowledge/caching.md` for key composition and cross-family
invalidation. Run `.ai/checklists/performance.md` and `.ai/checklists/definition-of-done.md`
before reporting the fix complete.
16 changes: 16 additions & 0 deletions .ai/agents/permission-navigation-specialist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: Permission & Navigation Specialist
description: Add or change permissions, PermissionSystemName, PermissionActionName, StandardPermission, PermissionProvider, controller authorization attributes, AdminSiteMap entries, or permission/navigation migrations.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md and .ai/skills/permission-navigation.md,
which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then read `.ai/skills/permission-navigation.md` for permissions,
`PermissionSystemName`, `PermissionActionName`, `StandardPermission`, `PermissionProvider`,
controller authorization attributes, `AdminSiteMap` entries, and permission or navigation
migration rules. Run `.ai/checklists/data-change.md` and `.ai/checklists/definition-of-done.md`
before reporting the change complete.
17 changes: 17 additions & 0 deletions .ai/agents/plugin-creator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
name: Plugin Creator
description: Scaffold a new installable GrandNode plugin (payment, shipping, tax, widget, external authentication, discount rule, exchange rate, or theme) end to end.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md and .ai/prompts/create-plugin.md,
which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then follow `.ai/prompts/create-plugin.md` step by step, using
`.ai/skills/plugin-module.md` (and the plugin-kind skill it points to, e.g.
`.ai/skills/plugin-payment.md`, `.ai/skills/plugin-shipping.md`, `.ai/skills/plugin-widget.md`,
`.ai/skills/plugin-discount-rules.md`) and `.ai/templates/plugin/base-plugin.md` as the scaffold.
Run `.ai/checklists/plugin-release.md` and `.ai/checklists/definition-of-done.md` before reporting
the plugin complete.
16 changes: 16 additions & 0 deletions .ai/agents/reviewer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: Reviewer
description: Review a pull request or diff against all applicable repository skills and checklists before it is accepted.
tools: ["codebase", "search", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md and .ai/prompts/review-change.md,
which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then follow `.ai/prompts/review-change.md` step by step: identify which
skills from `.ai/skills/` apply to the change, load relevant `.ai/knowledge/` context, and run
`.ai/checklists/code-review.md` plus any other checklist the change touches (`.ai/checklists/security.md`,
`.ai/checklists/performance.md`, `.ai/checklists/data-change.md`, `.ai/checklists/plugin-release.md`)
before reporting the review complete.
15 changes: 15 additions & 0 deletions .ai/agents/scheduled-task-writer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
name: Scheduled Task Writer
description: Add scheduled task classes using IScheduleTask, AddKeyedScoped registration, the ScheduleTask seed, multi-instance distributed locking, error handling, and task migrations.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md and .ai/skills/scheduled-task.md,
which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then read `.ai/skills/scheduled-task.md` for `IScheduleTask`,
`AddKeyedScoped` registration, the `ScheduleTask` seed, multi-instance distributed locking, error
handling, and task migration rules. Run `.ai/checklists/data-change.md` and
`.ai/checklists/definition-of-done.md` before reporting the task complete.
16 changes: 16 additions & 0 deletions .ai/agents/security-reviewer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: Security Reviewer
description: Audit authentication, authorization, input handling, secrets, cryptography, sensitive data, and trust-boundary code.
tools: ["codebase", "search", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md, .ai/skills/security-review.md, and
.ai/knowledge/security.md, which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then read `.ai/skills/security-review.md` for authentication,
authorization, input handling, secrets, cryptography, and trust-boundary review rules, and
`.ai/knowledge/security.md` for authorization checks, FluentValidation patterns, guard clauses,
HTML encoding, and safe MongoDB queries. Run `.ai/checklists/security.md` before reporting the
review complete.
15 changes: 15 additions & 0 deletions .ai/agents/test-writer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
name: Test Writer
description: Add or extend unit tests for a change, using the MSTest + Moq conventions already in src/Tests/.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md and .ai/prompts/write-tests.md,
which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then follow `.ai/prompts/write-tests.md` step by step, using
`.ai/knowledge/tests.md` for the MSTest + Moq patterns, test structure, validator testing, and
controller test setup. Run `.ai/checklists/definition-of-done.md` before reporting the tests
complete.
16 changes: 16 additions & 0 deletions .ai/agents/theme-builder.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: Theme Builder
description: Create a new storefront theme plugin, or override a subset of views in an existing theme, without forking the whole view tree.
tools: ["codebase", "search", "edit", "terminal"]
---

<!--
Adapter only. Full instructions live in AGENTS.md and .ai/prompts/create-theme.md,
which remain the single source of truth. Do not duplicate rules here.
-->

Read `AGENTS.md` first. Then follow `.ai/prompts/create-theme.md` step by step, using
`.ai/skills/theme-creation.md` for `IThemeView`, view-location fallback, and asset layout, and
`.ai/skills/frontend-bundle-workflow.md` for when to run the Vite build and how to commit bundle
output alongside source. Run `.ai/checklists/plugin-release.md` and
`.ai/checklists/definition-of-done.md` before reporting the theme complete.
19 changes: 19 additions & 0 deletions .ai/checklists/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Checklists

Cross-cutting gates. Skills carry their own domain checklists (a widget plugin's `Validation Checklist` belongs in the widget skill); these cover what no single skill owns.

| Checklist | Run it |
|---|---|
| `definition-of-done.md` | Before calling any change complete |
| `code-review.md` | When reviewing someone else's diff, or your own before opening a PR |
| `security.md` | When the change touches auth, input, scoped data, secrets, or file handling |
| `performance.md` | When the change adds a query, a loop over entities, or a page render path |
| `data-change.md` | When the change touches entities, migrations, settings, or persisted identities |
| `plugin-release.md` | Before shipping a plugin or theme |

## How to use

1. Run `definition-of-done.md` on every change. Add the situational ones the change triggers.
2. A checklist item is a question to answer, not a box to tick by reflex. "Yes, because …" is the passing answer.
3. Report items that do not apply as N/A with a reason. Silence reads as an unchecked box.
4. An item you cannot verify is a risk to state in the PR, not an item to skip.
107 changes: 107 additions & 0 deletions .ai/checklists/code-review.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# Checklist: Code Review

For reviewing a diff. Report only high-confidence findings, each with file, line, the rule violated, the failure it causes, and a minimal fix.

Use with `.ai/prompts/review-change.md`, which handles skill selection.

---

## Read the diff twice

- [ ] First pass: does the change do what its description claims?
- [ ] Second pass: what did it change that the description does not mention?

## Layering

- [ ] No business logic in a controller.
- [ ] No view model in a business service.
- [ ] No MongoDB driver type outside `Grand.Data`.
- [ ] No HTTP or `IWorkContext` dependency in `Grand.Domain`.
- [ ] No core → plugin reference.
- [ ] Services registered in `IStartupApplication`, not `Program.cs`.

## Scoping — the highest-yield section

- [ ] Every new query filters by store.
- [ ] Vendor-reachable code filters by `VendorId` and re-checks ownership on write.
- [ ] `LimitedToStores` / `LimitedToGroups` honoured where the entity supports them.
- [ ] Every new cache key contains store id — and language id if the data is localized.
- [ ] Settings loaded and saved with the same store scope.
- [ ] No `IWorkContext` in a scheduled task, migration, or plugin install.

## Duplication and reuse

- [ ] The logic does not already exist in a service, extension, or helper.
- [ ] A near-copy of an existing method was not introduced instead of a parameter.
- [ ] A third repetition of the same block was extracted rather than added.
- [ ] Copy-pasted code had **every** identifier updated — stale names from the source are a classic defect.

## Validation

- [ ] Inputs crossing a trust boundary are validated.
- [ ] Validators cover the new fields, not just the old ones.
- [ ] Guard clauses use `ArgumentNullException.ThrowIfNull`.
- [ ] Invalid model state does not partially save.

## Exception handling

- [ ] No empty `catch`, no `catch (Exception)` that continues silently.
- [ ] Expected business failures return results, not exceptions.
- [ ] Notification handlers cannot throw into the publisher.
- [ ] Migrations return `false` instead of throwing.
- [ ] Disposables are disposed.

## Logging

- [ ] Diagnosable failures are logged with store/entity/operation context.
- [ ] No secrets or personal data in log output.
- [ ] Log levels are proportionate.
- [ ] No logging in a hot loop.

## Async

- [ ] No `.Result`, `.Wait()`, `GetAwaiter().GetResult()`.
- [ ] No `async void`.
- [ ] No `Task.Run` wrapping synchronous work.
- [ ] `CancellationToken` forwarded where the surrounding signatures carry one.

## Data lifecycle

- [ ] Every write invalidates its cache prefix.
- [ ] Every write publishes its entity event.
- [ ] Cross-family caches that embed the entity are invalidated too.
- [ ] Migration `Identity` GUID is new.
- [ ] Migration is idempotent and destroys nothing operator-owned.
- [ ] No persisted identity renamed (plugin system name, permission name, template name, task name).

## Localization

- [ ] No hardcoded user-facing string.
- [ ] Resource keys follow the naming convention and are added **and** removed symmetrically in plugin install/uninstall.
- [ ] Localized entity properties read through the translation extension, not the raw property.

## Frontend

- [ ] Storefront data attributes preserved on touched views.
- [ ] Widget zones preserved.
- [ ] No `Html.Raw` on user content.
- [ ] Bundles rebuilt if source changed.

## Tests

- [ ] New behavior has tests, in the mirror project.
- [ ] Bug fixes have a regression test.
- [ ] No assertion weakened to make the suite pass.
- [ ] Tests mock at interface boundaries and hit no real database or network.

## Backward compatibility

- [ ] An existing installation upgrading in place still works.
- [ ] New settings default to previous behavior.
- [ ] No public interface, view model, or route changed without the PR saying so under "Breaking changes".

## Before submitting the review

- [ ] Every finding verified by opening the file — no speculative claims.
- [ ] Findings ranked by severity, not by file order.
- [ ] Style and preference comments omitted unless a mandatory rule is broken.
Loading
Loading