1006 lines
105 KiB
Markdown
1006 lines
105 KiB
Markdown
# Build Execution Tracker
|
||
|
||
## Current status
|
||
|
||
- main baseline updated through: `feat/square-catalog-sync-repositories` (Stage 10C complete, 2026-07-25)
|
||
- audit completed: `chore/audit-state-sync` — Comprehensive State Audit (`PROJECT_STATE_AUDIT.md`) completed 2026-07-25; all findings incorporated into `master_development_brief.md` and this tracker
|
||
- merged: `feat/square-catalog-sync-service` (Stage 10D) — merged to main; 506/506 feature_wordpress, 167/167 feature_inventory; analyze clean
|
||
- main baseline updated through: `feat/square-sync-ui` (Stage 10F complete, merged 2026-07-25)
|
||
- merged: `feat/square-mobile-pos` (Stage 10C POS) — merged to main, commit `7bf8f55`
|
||
- merged: `feat/observability-error-logging` (Stage 16A) — error logging, crash capture, and bug reporting; merged to main 2026-08-29
|
||
- merged: `feat/custom-order-domain` (Stage 11A) — custom order domain and data; merged to main 2026-08-29, commit `85501fd`
|
||
- main baseline updated through: `feat/custom-order-domain` (Stage 11A complete, merged 2026-08-29)
|
||
- reconciled: `chore/state-reconciliation-flutter-347` — working tree vs. `main` reconciled 2026-09-25; toolchain moved to Flutter 3.47.0 / Dart 3.13.0; master documents re-baselined
|
||
- merged: `feat/custom-order-ui` (Stage 11B) — custom order intake UI; merged to main 2026-09-25, commit `6c299e8`
|
||
- main baseline updated through: `feat/custom-order-ui` (Stage 11B complete, merged 2026-09-25)
|
||
- merged: `feat/custom-order-tracking` (Stage 11C) — custom order tracking and fulfillment; merged to main 2026-09-25, commit `07e7e08`. **Stage 11 complete; audit finding P2.2 closed**
|
||
- main baseline updated through: `feat/custom-order-tracking` (Stage 11C complete, merged 2026-09-25)
|
||
- next branch: `feat/inventory-write-ops` (Stage 12A) — Inventory write operations and domain expansion
|
||
- total tests on branch: 2373/2373 passing (+329 new: 293 in feature_orders, 22 in kell_mobile, 14 in kell_web); dart analyze --fatal-infos clean across all 11 packages and apps
|
||
- note: previously quoted totals omitted `feature_policy` (17 tests); it is now included in the count
|
||
- release review: `docs/operations/release-checklist.md` created 2026-08-29 — per-environment release gates for Development, Test/QA, Staging, and Production
|
||
- toolchain: Flutter 3.47.0 / Dart 3.13.0. Flutter 3.47 auto-generates an `analyzer.exclude` block in every `analysis_options.yaml` on each `pub get` / `analyze` / `run` / `build` with no opt-out ([flutter#191160](https://github.com/flutter/flutter/issues/191160)). **Do not open a slice to revert it** — see "Toolchain baseline" in `master_development_brief.md`
|
||
|
||
## Slice tracker
|
||
|
||
### feat/custom-order-tracking
|
||
|
||
- status: merged to main (commit `07e7e08`)
|
||
- branch: `feat/custom-order-tracking`
|
||
- stage: 11C — Custom order tracking and fulfillment
|
||
- date: 2026-09-25
|
||
- baseline: `6c299e8` (main, Stage 11B complete)
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- closes audit findings: P2.2 (tracking portion — closes the finding entirely; Stage 11 is now complete)
|
||
- scope: domain, data, application, presentation, and app wiring across `feature_orders`, `kell_web`, and `kell_mobile`
|
||
- files added — `feature_orders` domain:
|
||
- `lib/src/domain/fulfillment_event.dart` — `FulfillmentEvent` (from/status/occurredAt/note) with `intake()`, `isIntake`, `isRework`, `hasNote`, `description`, and a `from|to|iso|note` wire format that sanitises separators out of notes; `fromWire()` tolerates malformed lines
|
||
- `lib/src/domain/material_usage.dart` — `MaterialUsage` (sku, quantity, displayName) with `isValid`, `label`, and a `sku|qty|name` wire format
|
||
- `lib/src/domain/material_consumption_port.dart` — `MaterialDeductionResult` (per-SKU `failures`, `isPartial`, `totalUnitsDeducted`, `summary`) and the `MaterialConsumptionPort` outbound port, plus `NoopMaterialConsumptionPort`
|
||
- files added — `feature_orders` application:
|
||
- `lib/src/application/advance_fulfillment.dart` — `AdvanceFulfillment` use case; adds no rule of its own, so the pipeline is defined in exactly one place
|
||
- `lib/src/application/complete_custom_order.dart` — `CompleteCustomOrder` + `CompleteCustomOrderResult`; advances **first**, deducts second, and never lets a stock failure fail the completion
|
||
- `lib/src/application/custom_order_tracking_controller.dart` — `CustomOrderTrackingController` (`ChangeNotifier`): custom-order-only load, stage filter, search over customer/ID/spec summary, `stageCounts`, `activeCount`, `advanceTo()` (routing completions through `CompleteCustomOrder`), and `consumeActionResult()` / `consumeDeductionWarning()`
|
||
- files added — `feature_orders` presentation:
|
||
- `lib/src/presentation/custom_order_tracking_page.dart` — `CustomOrderTrackingPage`; master-detail above `KcBreakpoints.medium`, pushed detail below it
|
||
- `lib/src/presentation/widgets/fulfillment_timeline.dart` — `FulfillmentTimeline`; dot-and-rail rows, rework marker, colour-coded by outcome
|
||
- `lib/src/presentation/widgets/custom_order_tracking_card.dart` — `CustomOrderTrackingCard`; leads with the **workshop stage**, spec summary, balance, and last update
|
||
- `lib/src/presentation/widgets/custom_order_tracking_detail.dart` — `CustomOrderTrackingDetail`; stage action, spec, deposit/balance, materials, timeline
|
||
- `lib/src/presentation/widgets/advance_stage_dialog.dart` — `showAdvanceStageDialog()` + `AdvanceStageResult`; offers only domain-legal stages and an operator progress note
|
||
- files changed — `feature_orders`:
|
||
- `lib/src/domain/order.dart` — added `fulfillmentHistory` and `materialUsage` (both default `const []`); added `currentStage`, `hasFulfillmentHistory`, `latestFulfillmentEvent`, `lastFulfillmentUpdate`, `allowedNextStages`, `isFulfillmentComplete`, `hasMaterialUsage`, `deductibleMaterials`, and the append-only `withFulfillmentEvent()`. **All existing fields, defaults, and `copyWith` semantics preserved** — every Stage 11A/11B test passed unchanged (792/792 verified before any new test was added)
|
||
- `lib/src/domain/orders_repository.dart` — `advanceFulfillmentStatus()` gained optional `note` and `occurredAt`; added `recordMaterialUsage()`
|
||
- `lib/src/data/fake_orders_repository.dart` — injectable `now` clock; `advanceFulfillmentStatus` appends an event; `createCustomOrder` seeds an intake event; `recordMaterialUsage` implemented; all five seeded commissions now carry realistic histories (KC-C2004 includes a rework loop) and material usage
|
||
- `lib/src/data/woo_commerce_orders_repository.dart` — injectable `now` clock; same history and material behaviour as the fake
|
||
- `lib/src/data/woo_commerce_order_mapper.dart` — two new meta keys (`_kc_fulfillment_history`, `_kc_material_usage`), `trackingMetaEntries()`, `historyFromMeta()`, `materialUsageFromMeta()`; malformed lines are skipped, empty lists are omitted rather than blanking remote values
|
||
- `lib/src/presentation/orders_page.dart` — optional `onTrackCustomOrders` callback adds a "Track Custom Orders" action beside the existing intake action; both omitted when the host has no route
|
||
- `lib/feature_orders.dart` — barrel exports for all new types
|
||
- `README.md` — documents the tracking workspace, the timeline, and the inventory-deduction port
|
||
- files changed — apps:
|
||
- `kell_web/lib/composition/inventory_material_consumption_adapter.dart` — **new** adapter bridging `InventoryRepository` to `MaterialConsumptionPort`; tolerant by contract, never throws, logs per-SKU failures
|
||
- `kell_web/lib/composition/app_services.dart` — `materialConsumptionPort` built from the inventory repository
|
||
- `kell_web/lib/routing/app_routes.dart` — new `/orders/tracking` route; `_parseStage()` returns `null` for an unknown stage rather than `FulfillmentStatus.fromWire`'s `quoted` default, which would be the wrong behaviour for a filter
|
||
- `kell_web/lib/navigation/app_navigation.dart` — `ordersToCustomOrderTracking()`
|
||
- `kell_mobile/lib/composition/inventory_material_consumption_adapter.dart` — **new**; deliberately duplicated rather than shared, matching the existing `get_dashboard_summary.dart` convention
|
||
- `kell_mobile/lib/composition/mobile_app_services.dart` — `materialConsumptionPort`
|
||
- `kell_mobile/lib/pages/mobile_custom_order_tracking_page.dart` — **new** full-screen `SafeArea` host for the shared page
|
||
- `kell_mobile/lib/pages/mobile_orders_page.dart` — small tracking FAB above the existing intake FAB; reloads the list on return
|
||
- `kell_mobile/lib/shell/mobile_shell.dart` — passes the material port through
|
||
- tests updated (contract widening):
|
||
- `feature_orders/test/widgets/orders_page_test.dart` — `_EmptyOrdersRepository` satisfies the widened contract
|
||
- `kell_web/test/dashboard/application/dashboard_controller_test.dart` — `_StubOrdersRepository` satisfies the widened contract
|
||
- tests added (329 new):
|
||
- `feature_orders/test/fulfillment_event_test.dart` — 32 tests (construction, intake, rework detection, description, wire round trip, separator/newline sanitisation, malformed-line tolerance, equality)
|
||
- `feature_orders/test/material_usage_test.dart` + `material_consumption_port_test.dart` — 41 tests (validity, labels, wire format, deduction-result shape, summaries, unmodifiable collections, noop port, partial failure)
|
||
- `feature_orders/test/order_tracking_test.dart` — 33 tests (defaults, `currentStage`, history accessors, allowed stages, deductible materials, `withFulfillmentEvent` immutability and append-only behaviour, `copyWith`)
|
||
- `feature_orders/test/fake_orders_repository_tracking_test.dart` — 31 tests (seeded-history integrity, incl. checks that **every** seeded transition is domain-legal and that each history ends at the stamped stage; note trimming, clock injection, illegal-advance no-op, `recordMaterialUsage` validation)
|
||
- `feature_orders/test/woo_commerce_tracking_meta_test.dart` — 22 tests (meta keys, packing, read/write round trip, malformed-line skipping, no payment identifier on the wire)
|
||
- `feature_orders/test/complete_custom_order_test.dart` — 22 tests (ordering — no deduction on a rejected transition; partial-failure warnings, unwired port, empty materials, `AdvanceFulfillment` delegation and verbatim rejection reasons)
|
||
- `feature_orders/test/custom_order_tracking_controller_test.dart` — 45 tests (load, stage filter, counts, search, selection, advance, rework, cancel, completion routing, deduction warnings, unwired use cases)
|
||
- `feature_orders/test/widgets/fulfillment_timeline_test.dart` — 14 tests (empty state, rows, timestamps, notes, rework marker, ordering, `newestFirst`, privacy)
|
||
- `feature_orders/test/widgets/custom_order_tracking_page_test.dart`, `custom_order_tracking_detail_test.dart`, `advance_stage_dialog_test.dart` — 53 tests (listing, stage chips with counts, search, intake action, header, stage-action states, spec, money, materials, timeline, dialog selection/notes/cancel)
|
||
- `kell_mobile/test/pages/mobile_custom_order_tracking_page_test.dart` — 9 tests (app bar, shared host, `SafeArea`, listing, chips, filtering, intake action, port injection)
|
||
- `kell_mobile/test/composition/inventory_material_consumption_adapter_test.dart` — 13 tests (real stock decrement, missing SKU, invalid record, rejected adjustment, throwing repository, plus **end-to-end** completion decrementing real inventory and a rejected completion leaving it untouched)
|
||
- `kell_web/test/routing/custom_order_tracking_route_test.dart` — 14 tests (route constant, shell rendering, listing, chips, timeline, stage argument, unknown stage ignored, `selectedId`, orders entry point, port identity)
|
||
- architecture: `feature_orders` still has **no dependency on `feature_inventory`**. The orders layer declares `MaterialConsumptionPort`; each app's composition layer supplies the adapter — the same "feature states what it needs, app decides how" pattern already used for cross-feature navigation callbacks
|
||
- ordering guarantee: `CompleteCustomOrder` advances the order **before** deducting, so an illegal jump to `completed` can never decrement stock. Asserted by test in both the use case suite and the end-to-end adapter suite
|
||
- privacy: operator progress notes are workshop-only and the dialog labels them as such; the timeline and tracking detail render **no payment identifier anywhere** — asserted by test. Log context is limited to order IDs, SKUs, stage names, and quantities, and still passes through `KcRedactor`
|
||
- tests: passed (1085/1085 feature_orders +293, 109/109 kell_mobile +22, 81/81 kell_web +14; all other packages unchanged — core 90, design_system 51, auth 42, integrations 123, data 63, feature_wordpress 545, feature_inventory 167, feature_policy 17)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found in `feature_orders`, `kell_web`, or `kell_mobile`)
|
||
- format: `dart format --line-length 100` applied to every file touched by this slice
|
||
- test-harness notes: the stage chip row scrolls horizontally, so tests `scrollUntilVisible` before tapping a later chip rather than working around a layout defect; the detail panel's indeterminate `LinearProgressIndicator` never settles, so the `isUpdating` test uses `pump()` rather than `pumpAndSettle()`
|
||
- defect found and fixed while testing: `CustomOrderTrackingCard`'s footer row overflowed at the 340 px master-list width; both halves are now `Flexible` with ellipsis
|
||
- brief updated: yes
|
||
|
||
### feat/custom-order-ui
|
||
|
||
- status: merged to main
|
||
- branch: `feat/custom-order-ui`
|
||
- stage: 11B — Custom order creation UI
|
||
- date: 2026-09-25
|
||
- baseline: `0e3987b` (main, Stage 11A complete + state reconciliation)
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- closes audit findings: P2.2 (UI portion — intake and confirmation; tracking remains open as Stage 11C)
|
||
- scope: application and presentation layers plus app wiring — **no domain or data change**; every repository contract from Stage 11A is consumed as-is
|
||
- files added — `feature_orders` application:
|
||
- `lib/src/application/create_custom_order.dart` — `CreateCustomOrder` use case wrapping `OrdersRepository.createCustomOrder`
|
||
- `lib/src/application/record_deposit.dart` — `RecordDeposit` use case wrapping `OrdersRepository.recordDeposit`; accepts **no** payment identifier
|
||
- `lib/src/application/custom_order_form_controller.dart` — `CustomOrderField` enum + `CustomOrderFormController` (`ChangeNotifier`): field state, field-keyed validation, `buildSpec()`, `submit()`, `reset()`, derived `estimatedPriceCents` / `depositAmountCents` / `balanceDueCents`, and the static `parseMoneyToCents()` money parser. Injectable clock and ID generator keep tests deterministic
|
||
- files added — `feature_orders` presentation:
|
||
- `lib/src/presentation/custom_order_form_page.dart` — `CustomOrderFormPage`; owns a controller unless one is injected, swaps to the confirmation page on success
|
||
- `lib/src/presentation/custom_order_confirmation_page.dart` — `CustomOrderConfirmationPage` with the commission summary and the deposit receipt
|
||
- `lib/src/presentation/widgets/fulfillment_status_chip.dart` — `FulfillmentStatusChip` over the design-system `KcStatusChip`
|
||
- `lib/src/presentation/widgets/reference_image_dialog.dart` — `showReferenceImageDialog()` + `ReferenceImageDialogResult` with URL validation
|
||
- files changed:
|
||
- `feature_orders/lib/src/presentation/orders_page.dart` — optional `onCreateCustomOrder` callback surfaces a "New Custom Order" toolbar action; omitted when the host has no intake route
|
||
- `feature_orders/lib/feature_orders.dart` — barrel exports for all new application and presentation types
|
||
- `feature_orders/README.md` — documents the intake UI and the cents-only money rule
|
||
- `kell_web/lib/routing/app_routes.dart` — new `/orders/custom` route rendering `CustomOrderFormPage` inside `AppShell`; orders route now passes `onCreateCustomOrder`
|
||
- `kell_web/lib/navigation/app_navigation.dart` — `ordersToCustomOrder()` and `customOrderToOrders()` handoffs
|
||
- `kell_mobile/lib/pages/mobile_custom_order_page.dart` — **new** full-screen `SafeArea` host for the shared form
|
||
- `kell_mobile/lib/pages/mobile_orders_page.dart` — extended FAB pushes the intake form and reloads the list on return
|
||
- tests added (146 new):
|
||
- `feature_orders/test/custom_order_form_controller_test.dart` — 82 tests (money parsing incl. separators/precision/negatives, initial state, setters, derived balance and clamping, reference image add/remove/dedupe, the full validation matrix, `buildSpec` mapping, submission, deposit quoting vs. collection, repository failure, duplicate ID, reset)
|
||
- `feature_orders/test/widgets/custom_order_form_page_test.dart` — 26 widget tests (section and field rendering, validation feedback per field, running balance, deposit method reveal, reference image dialog paths, submission → confirmation, "New Custom Order" reset, `onComplete`)
|
||
- `feature_orders/test/widgets/custom_order_confirmation_page_test.dart` — 24 widget tests (summary, spec rendering, deposit receipt quoted vs. paid, balance, **no payment identifier on screen**, actions, the 7-value `FulfillmentStatusChip` matrix)
|
||
- `feature_orders/test/widgets/orders_page_test.dart` — 3 new tests for the custom order entry point
|
||
- `kell_mobile/test/pages/mobile_custom_order_page_test.dart` — 6 tests (app bar, shared form host, `SafeArea`, sections, submit action, validation)
|
||
- `kell_web/test/routing/custom_order_route_test.dart` — 5 tests (route constant, route renders the form in the shell, intake sections, orders action present, action opens the form)
|
||
- privacy: the deposit receipt renders amount, method, date, and balance only — the transaction ID stays on `PaymentResult` and is asserted absent by test. The controller holds no payment identifier at any point
|
||
- money: every amount is typed as text and converted to **integer cents** by `parseMoneyToCents` before it reaches `DepositInfo`; the only `double` is the derived `OrderItem.unitPrice`, computed once from cents
|
||
- test-harness note: the intake form is taller than the default 800×600 test view, so the submit-button tests resize `tester.view` rather than working around a layout defect — the page scrolls normally on device
|
||
- toolchain note: `kell_web/pubspec.lock` picked up SDK-pinned transitive bumps on `flutter pub get` (`matcher` 0.12.19→0.12.20, `meta` 1.18.0→1.19.0, `test_api` 0.7.11→0.7.12, `vector_math` 2.2.0→2.4.3). Same accepted class as the `kell_mobile` bumps recorded under `chore/state-reconciliation-flutter-347`; committed so the lock file matches the toolchain in use
|
||
- tests: passed (792/792 feature_orders, 87/87 kell_mobile, 67/67 kell_web, 545/545 feature_wordpress, 167/167 feature_inventory, 123/123 integrations, 90/90 core, 63/63 data, 51/51 design_system, 42/42 auth, 17/17 feature_policy — **2044 total**)
|
||
- analyze: passed (`dart analyze --fatal-infos` — no issues found across all 11 packages and apps)
|
||
- brief updated: yes
|
||
|
||
### chore/state-reconciliation-flutter-347
|
||
|
||
- status: merged to main
|
||
- branch: `chore/state-reconciliation-flutter-347`
|
||
- stage: n/a — repository state reconciliation, no product code change
|
||
- date: 2026-09-25
|
||
- baseline: `92d83e0` (main, Stage 11A complete)
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- trigger: the working tree had drifted from `main` and local `main` was 4 commits ahead of `origin/main`
|
||
- scope: **documentation and toolchain hygiene only** — no `lib/` or `test/` source file was modified
|
||
|
||
#### What the drift actually was
|
||
|
||
1. **Flutter 3.47.0 `analysis_options.yaml` churn (accepted).** The local toolchain moved from
|
||
Flutter 3.44.x to **Flutter 3.47.0 / Dart 3.13.0**. Flutter 3.47 ships `AnalysisOptionsMigration`,
|
||
which unconditionally writes a fixed seven-entry `analyzer.exclude` block
|
||
(`build/**`, `android/**`, `ios/**`, `web/**`, `windows/**`, `macos/**`, `linux/**`)
|
||
into **every** `analysis_options.yaml` it finds. Upstream bugs:
|
||
[flutter#191160](https://github.com/flutter/flutter/issues/191160) and
|
||
[flutter#191131](https://github.com/flutter/flutter/issues/191131).
|
||
- Commit `92d83e0` previously tried to revert this. **That revert does not hold.** The migration
|
||
runs from `ensureReadyForPlatformSpecificTooling`, so `flutter pub get`, `flutter analyze`,
|
||
`flutter run`, and `flutter build` all rewrite the block. There is **no opt-out**.
|
||
This was confirmed empirically: a full `flutter test` sweep regenerated the block in 8
|
||
further packages that were clean beforehand.
|
||
- **Decision: accept and commit the block** in all 11 packages/apps rather than fight the tool.
|
||
Reverting it only produces a permanently dirty working tree and misleading diffs.
|
||
- **Safety check:** the `web/**` entry is the dangerous one (it can hide real Dart sources in
|
||
`dart create -t web` packages). Verified that neither `kell_web/web/` nor `kell_mobile/web/`
|
||
contains any `.dart` file, so nothing is dropped from analysis here. `dart analyze
|
||
--fatal-infos` remains clean across all 11 packages and apps.
|
||
2. **`kell_mobile` web scaffold (reverted).** Someone had run `flutter create --platforms=web`
|
||
inside `kell_mobile`, which produced an untracked `web/` directory (`index.html`,
|
||
`manifest.json`, `favicon.png`, 4 icons) and rewrote `.metadata` so the `android` platform
|
||
entry was **replaced** by `web`. `kell_mobile` is the Android target and its `android/`
|
||
directory is tracked, so this was unintended tool output, not a deliberate platform addition.
|
||
- **Decision: reverted.** `.metadata` restored to the tracked Android-only revision
|
||
(`ad70ec46…`); the untracked `web/` scaffold deleted. `kell_mobile` remains Android-only.
|
||
3. **`kell_mobile/pubspec.lock` transitive bumps (accepted).** Resolved under the newer SDK:
|
||
`clock` 1.1.2→1.1.3, `matcher` 0.12.19→0.12.20, `meta` 1.18.0→1.18.3,
|
||
`stack_trace` 1.12.1→1.12.2, `test_api` 0.7.11→0.7.12, `vector_math` 2.2.0→2.4.2,
|
||
plus `vm_service`. All transitive, all pinned by the Flutter SDK. Committed so the lock file
|
||
matches the toolchain that is actually in use.
|
||
|
||
#### Master document corrections
|
||
|
||
- `PROJECT_STATE_AUDIT.md` — **removed a duplicated `## 5. Summary Scorecard` section.** The file
|
||
carried the entire scorecard and readiness table twice (lines 615–657 and 658–702), the second
|
||
copy being a bad append. Removed the duplicate, leaving one authoritative §5.
|
||
- `PROJECT_STATE_AUDIT.md` — added a reconciliation notice clarifying that §1–§4 are the preserved
|
||
historical 2026-07-25 record while §5 is re-baselined to `main`.
|
||
- `PROJECT_STATE_AUDIT.md` §3.4 — test counts corrected to the verified run
|
||
(`core` 24→90, `design_system` 41→51, `feature_wordpress` 506→545, `feature_orders` 198→657,
|
||
`feature_policy` ~5→17, `kell_web` 24→62, `kell_mobile` 26→81).
|
||
- `PROJECT_STATE_AUDIT.md` §3.5 — marked three antipatterns resolved:
|
||
`SquareCatalogSyncService` ID conflation (10E), no logging infrastructure (16A),
|
||
no crash reporting (16A).
|
||
- `PROJECT_STATE_AUDIT.md` §5 — scorecard re-baselined with a test-count column; Square POS,
|
||
Square catalog/inventory sync, and observability moved to ✅; custom orders moved to ⚠️
|
||
(domain+data done, UI open).
|
||
- `master_development_brief.md` Appendix A — feature maturity matrix refreshed to the same
|
||
verified counts and maturity levels.
|
||
- `master_development_brief.md` — toolchain baseline recorded (Flutter 3.47.0 / Dart 3.13.0) with
|
||
the `analysis_options.yaml` caveat so the next slice does not try to revert it again.
|
||
|
||
- tests: passed (**1,898 / 1,898** — core 90, design_system 51, auth 42, integrations 123, data 63,
|
||
feature_wordpress 545, feature_inventory 167, feature_orders 657, feature_policy 17,
|
||
kell_web 62, kell_mobile 81). Identical to the Stage 11A total, confirming this slice changed
|
||
no behaviour.
|
||
- analyze: passed (`dart analyze --fatal-infos` — no issues found across all 11 packages and apps)
|
||
- brief updated: yes
|
||
|
||
### feat/custom-order-domain
|
||
|
||
- status: merged to main
|
||
- branch: `feat/custom-order-domain`
|
||
- stage: 11A — Custom order domain and data
|
||
- date: 2026-08-29
|
||
- baseline: `666abd2` (main, Stage 16A complete, 1,475/1,475 passing)
|
||
- commits: `86c630d` (implementation), `85501fd` (merge to main)
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- scope: domain and data layers only — no UI in this slice
|
||
- closes audit findings: P2.2 (domain + data portion; UI remains open as Stage 11B/11C) and P3.8 (`feature_orders` scaffolding files)
|
||
- files changed:
|
||
- `feature_orders/lib/src/domain/order_type.dart` — new `OrderType` enum (standard/custom) with `label`, `wireValue`, `fromWire()` defaulting to `standard`
|
||
- `feature_orders/lib/src/domain/custom_order_spec.dart` — new immutable `CustomOrderSpec` (material, color, size, dimensions, unmodifiable `referenceImageUrls`, notes, `estimatedCompletionDate`); `copyWith`, list-aware `==`/`hashCode`, `toString`, `isProductionReady`, `hasReferenceImages`, `summary`
|
||
- `feature_orders/lib/src/domain/deposit_info.dart` — new immutable `DepositInfo`; money as integer cents (`depositAmountCents`, `totalAmountCents`), `depositDate`, `settlementDate`, `depositPaid`, derived `balanceDueCents` (clamped at zero), `markDepositPaid()`, `markSettled()`, `formatCents()`, `.quoted()`; deliberately carries **no** payment identifier
|
||
- `feature_orders/lib/src/domain/fulfillment_status.dart` — new `FulfillmentStatus` (quoted → depositReceived → inProduction → qualityCheck → readyForPickup → completed, plus cancelled) with `label`, `stageIndex`, `pipeline`, `wireValue`, `fromWire()`; `FulfillmentTransition` extension with `allowedNextStatuses`, `canTransitionTo()`, `rejectionReason()`, `isTerminal`, `isSuccessful`, `requiresDeposit`
|
||
- `feature_orders/lib/src/domain/order.dart` — added `orderType` (defaults to `standard`), nullable `customOrderSpec`, `depositInfo`, `fulfillmentStatus`; added `isCustom`, `hasDeposit`, `balanceDueCents`; all existing fields, defaults, and `copyWith` semantics preserved
|
||
- `feature_orders/lib/src/domain/orders_repository.dart` — added `createCustomOrder()`, `updateCustomOrderSpec()`, `recordDeposit()`, `advanceFulfillmentStatus()`
|
||
- `feature_orders/lib/src/data/fake_orders_repository.dart` — implemented all four methods; injected `KcLogger` (defaults to `KcLogger.silent()`); five seeded custom orders `KC-C2001`…`KC-C2005` covering every non-terminal pipeline stage; existing rejection paths now logged via `_rejected()`
|
||
- `feature_orders/lib/src/data/woo_commerce_orders_repository.dart` — implemented all four methods; injected `KcLogger`; `_guard()` converts every exception into a logged failure result; `_loadCustomOrder()` validates existence and order type before any write; `_pushCustomOrderMeta()` sends only `_kc_` meta so commercial fields are never disturbed
|
||
- `feature_orders/lib/src/data/woo_commerce_order_mapper.dart` — 13 `_kc_`-prefixed meta keys with a documented mapping table; `customOrderMetaData()`, `specMetaEntries()`, `depositMetaEntries()`, `toMetaDataList()`; `fromJson()` reconstructs spec/deposit/type/stage; internal `_`-prefixed keys stay out of `Order.customFields`
|
||
- `feature_orders/lib/feature_orders.dart` — barrel updated with 4 new domain exports
|
||
- `feature_orders/pubspec.yaml` — added `core` path dependency (for `KcLogger`); description expanded
|
||
- `feature_wordpress/lib/src/data/woo_commerce_api_client.dart` — new `updateOrder(orderId, body)` generic order PUT, mirroring `updateProduct()`
|
||
- `feature_orders/.metadata`, `CHANGELOG.md`, `LICENSE`, `README.md` — P3.8 scaffolding (`.gitignore` already existed)
|
||
- `feature_orders/test/fake_orders_repository_test.dart` — seeded-count assertions updated 6 → 11 and 7 → 12; added a standard-order count test
|
||
- `feature_orders/test/orders_controller_test.dart` — count assertions updated for the larger seed set (11 total, 3 pending)
|
||
- `feature_orders/test/widgets/orders_page_test.dart` — order-count label updated to `11 orders`; `_EmptyOrdersRepository` satisfies the widened contract
|
||
- `kell_web/test/dashboard/application/dashboard_controller_test.dart` — `_StubOrdersRepository` satisfies the widened contract
|
||
- tests added:
|
||
- `feature_orders/test/order_type_test.dart` — 12 tests (enum shape, labels, wire round-trip, fallbacks)
|
||
- `feature_orders/test/custom_order_spec_test.dart` — 46 tests (construction, unmodifiable list, derived state, `summary` PII safety, `copyWith`, equality, `toString` leak checks)
|
||
- `feature_orders/test/deposit_info_test.dart` — 58 tests (cents arithmetic, balance derivation and clamping, formatting parity with `PaymentResult`, transitions, `copyWith`, equality, no-payment-identifier check)
|
||
- `feature_orders/test/fulfillment_status_test.dart` — 150 tests including the **exhaustive 7 × 7 transition matrix**: every legal pair asserted allowed, every other pair asserted rejected with an explanatory reason
|
||
- `feature_orders/test/fake_orders_repository_custom_test.dart` — 77 tests (seeded data shape, all four new methods, legal and illegal advances, log-context assertions, PII and money redaction checks)
|
||
- `feature_orders/test/woo_commerce_custom_order_test.dart` — 79 tests (meta read/write, round trip through every pipeline stage, malformed-meta tolerance, all four methods over `MockClient`, observability on pre-existing operations, no-payment-identifier-on-the-wire checks)
|
||
- observability: `KcLogger` injected into both repositories; rejections logged at `warning`, API failures at `error` with status code and originating exception; **no silent `catch (_) {}`**; log context limited to identifiers, operation names, and status names — never customer identity, addresses, money amounts, or payment identifiers; all context additionally passes through `KcRedactor`
|
||
- WooCommerce mapping: custom order state persisted as 13 `_kc_`-prefixed order meta keys (`_kc_order_type`, `_kc_fulfillment_status`, `_kc_spec_*`, `_kc_deposit_*`, `_kc_settlement_date`). `balanceDueCents` is derived on read, never persisted. The deposit transaction ID is deliberately excluded — order meta is readable by any store administrator
|
||
- tests: passed (1898/1898 total; feature_orders 657/657 +423; all other packages unchanged — core 90, design_system 51, auth 42, integrations 123, data 63, feature_wordpress 545, feature_inventory 167, kell_web 62, kell_mobile 81, feature_policy 17)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found across all 11 packages and apps)
|
||
- format: `dart format --line-length 100` applied to all files touched by this slice (matches the repo's `.vscode/settings.json` `dart.lineLength: 100`); `--set-exit-if-changed` clean across `feature_orders`, and the two files touched in `feature_wordpress` / `kell_web`
|
||
- known pre-existing issues (not introduced here, left untouched): `kell_web/lib/composition/app_services.dart` and `kell_web/lib/shell/app_nav_item.dart` are not format-clean at 100 cols; `tools/run_all_tests.sh` reports `TOTAL 0` under Git Bash on Windows because its `grep` for the `✓` glyph does not match the console encoding — per-package "All tests passed!" lines and the analyze gate remain accurate
|
||
- brief updated: yes
|
||
|
||
### feat/observability-error-logging
|
||
|
||
- status: merged to main
|
||
- branch: `feat/observability-error-logging`
|
||
- stage: 16A — Error logging, crash reporting, and bug reporting
|
||
- date: 2026-08-29
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- closes audit findings: P3.4 (structured logging), P3.5 (crash reporting), and the "No logging infrastructure" / "No crash reporting" architectural risks in `PROJECT_STATE_AUDIT.md` §3.4
|
||
- files changed:
|
||
- `core/lib/src/observability/kc_log_level.dart` — new `KcLogLevel` enum (debug/info/warning/error/fatal) with `severity`, `label`, `isAtLeast()`, `fromString()`
|
||
- `core/lib/src/observability/kc_log_record.dart` — new immutable `KcLogRecord` (level, source, message, timestamp, unmodifiable context, error, stackTrace); `format()`, `toJson()`, `isFailure`
|
||
- `core/lib/src/observability/kc_redactor.dart` — new `KcRedactor`; `isSensitiveKey()`, `redactMap()` (recurses nested maps/lists), `maskValue()`; 14 sensitive key fragments
|
||
- `core/lib/src/observability/kc_log_sink.dart` — new `KcLogSink` contract; `KcConsoleLogSink` (release-silent by default), `KcInMemoryLogSink` (bounded ring buffer with `recent()`/`recordsAtLeast()`/`clear()`), `KcMultiLogSink` (fault-tolerant fan-out)
|
||
- `core/lib/src/observability/kc_logger.dart` — new `KcLogger` facade; level helpers, threshold filtering, automatic context redaction, `forSource()`, `KcLogger.silent()`; never throws
|
||
- `core/lib/src/observability/kc_error_reporter.dart` — new `KcErrorReporter`; `install()` wires `FlutterError.onError` + `PlatformDispatcher.instance.onError`, `runGuarded()` wraps `runApp`, `restore()` for test isolation
|
||
- `core/lib/src/observability/kc_bug_report.dart` — new `KcBugSeverity` enum and `KcBugReport` model with redacted diagnostics, `hasFailureEvidence`, `toJson()`, `toMarkdown()`
|
||
- `core/lib/src/observability/kc_bug_report_service.dart` — new `KcBugReportResult`, `KcBugReportSink` contract, `KcInMemoryBugReportSink`, and `KcBugReportService` (validation, log-tail evidence, graceful sink-failure handling)
|
||
- `core/lib/src/observability/kc_observability.dart` — new `KcObservability` bundle; `standard()` and `silent()` factories guarantee logger and bug report service share one evidence buffer
|
||
- `core/lib/core.dart` — barrel updated with all 9 observability exports
|
||
- `design_system/lib/src/widgets/kc_bug_report_dialog.dart` — new `KcBugReportDraft` and `KcBugReportDialog` (title/description/severity/reporter, inline validation, no-credentials notice)
|
||
- `design_system/lib/design_system.dart` — barrel updated
|
||
- `kell_web/lib/composition/app_services.dart` — `observability` field + `logger`/`bugReportService` accessors + `appVersion`; all 4 factories stamp environment labels (FAKE/WP/SQ/MULTI)
|
||
- `kell_mobile/lib/composition/mobile_app_services.dart` — mirrored observability wiring across all 4 factories
|
||
- `kell_web/lib/main.dart` — `KcErrorReporter.install()` + `runGuarded()` + startup record
|
||
- `kell_mobile/lib/main.dart` — mirrored error handler installation and startup record
|
||
- `kell_web/lib/shell/app_shell.dart` — `_ReportProblemAction` app bar action wired to `bugReportService`
|
||
- `kell_mobile/lib/shell/mobile_shell.dart` — `_reportProblem()` app bar action capturing the active tab
|
||
- tests added:
|
||
- `core/test/observability_test.dart` — 56 tests across `KcLogLevel`, `KcRedactor`, `KcLogRecord`, `KcInMemoryLogSink`, `KcMultiLogSink`, `KcLogger`, `KcErrorReporter`, `KcBugSeverity`, `KcBugReport`, `KcBugReportService`
|
||
- `design_system/test/kc_bug_report_dialog_test.dart` — 10 tests (rendering, screen context, validation, trimming, severity selection, cancel)
|
||
- `kell_web/test/shell/bug_report_action_test.dart` — 10 tests (service wiring, shared buffer, environment labels, shell submission flow)
|
||
- `kell_mobile/test/shell/bug_report_action_test.dart` — 9 tests (service wiring, shared buffer, shell submission flow, active-tab capture)
|
||
- tests: passed (1475/1475 total; core 90/90 +56; design_system 51/51 +10; kell_web 62/62 +10; kell_mobile 81/81 +9)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found across all packages and apps)
|
||
- brief updated: yes
|
||
|
||
### feat/square-mobile-pos
|
||
|
||
- status: in progress (ready to merge)
|
||
- branch: `feat/square-mobile-pos`
|
||
- stage: 10C — Square Mobile POS / Checkout
|
||
- date: 2026-07-25
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_orders/lib/src/domain/payment_method.dart` — `PaymentMethod` enum (cash, card) with `label` and `iconHint` extensions
|
||
- `feature_orders/lib/src/domain/payment_result.dart` — `PaymentResult` immutable value object (transactionId, amountCents, method, completedAt, receiptUrl, amountFormatted)
|
||
- `feature_orders/lib/src/application/payment_service.dart` — `PaymentService` abstract contract + `PaymentException`
|
||
- `feature_orders/lib/src/application/checkout_controller.dart` — `CheckoutController` (ChangeNotifier), `CartEntry`, sealed `CheckoutState` hierarchy (idle/processing/success/error)
|
||
- `feature_orders/lib/src/data/fake_payment_service.dart` — `FakePaymentService` (always succeeds, counter-based IDs)
|
||
- `feature_orders/lib/feature_orders.dart` — barrel updated with all new exports
|
||
- `kell_mobile/lib/pages/mobile_checkout_page.dart` — `MobileCheckoutPage` (product selection → cart → payment → receipt flow; Cash + Card buttons; confirmation dialog; haptic feedback)
|
||
- `kell_mobile/lib/shell/mobile_shell.dart` — Sales tab (index 4) added; `CheckoutController` initialised in `didChangeDependencies`; `_titles` updated to 6 entries
|
||
- `kell_mobile/lib/composition/mobile_app_services.dart` — `paymentService` field + `checkoutCatalogue` field; `_fakeCatalogue` const; all factory constructors updated
|
||
- `kell_mobile/test/widget_test.dart` — updated destination count assertion 5 → 6
|
||
- tests added:
|
||
- `feature_orders/test/payment_method_test.dart` — 5 tests
|
||
- `feature_orders/test/payment_result_test.dart` — 11 tests
|
||
- `feature_orders/test/fake_payment_service_test.dart` — 4 tests
|
||
- `feature_orders/test/checkout_controller_test.dart` — 16 tests
|
||
- `kell_mobile/test/composition/mobile_app_services_test.dart` — 11 new tests (paymentService + checkoutCatalogue groups)
|
||
- `kell_mobile/test/pages/mobile_checkout_page_test.dart` — 11 widget tests
|
||
- tests: passed (1373/1373 total; feature_orders 234/234 +36; kell_mobile 72/72 +18)
|
||
- analyze: passed (dart analyze — no issues found across all packages)
|
||
- brief updated: yes
|
||
|
||
### feat/description-only-edit
|
||
|
||
- status: merged to main
|
||
- commit: `cebac4c`
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- tests: passed (212/212)
|
||
- analyze: passed
|
||
- brief updated: yes
|
||
|
||
### feat/category-only-edit
|
||
|
||
- status: merged to main
|
||
- commit: `8e7e4cb`
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- tests: passed (223/223 feature_wordpress, 5/5 kell_web dashboard)
|
||
- analyze: passed (dart analyze — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/post-write-consistency
|
||
|
||
- status: merged to main
|
||
- commit: `7acff83`
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/application/product_publishing_controller.dart` — added `_refreshSelection()` helper; wired into `load()` and all write methods to preserve/refresh `selectedDraft` by id after reload
|
||
- `feature_wordpress/test/product_publishing_controller_test.dart` — added 11 post-write consistency tests covering selection preservation, field refresh (status/price/name/description/category), lastModified, filter/search/sort persistence after writes, item repositioning under active sort, and filter-exit auto-reselection
|
||
- tests: passed (234/234 feature_wordpress)
|
||
- analyze: passed (dart analyze — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/publishing-ux-hardening
|
||
|
||
- status: merged to main
|
||
- commit: `b81016d`
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/presentation/widgets/product_preview_panel.dart` — added inline validation error state (`_nameError`, `_priceError`, `_descriptionError`, `_categoryError`); error messages shown below text fields on empty/invalid submit; errors cleared on cancel; added `onCategoryChanged` callback; text fields and save buttons disabled during `isUpdating`; added tooltips (`Save price`, `Save category`, `Cancel`) for consistency
|
||
- `feature_wordpress/lib/src/presentation/widgets/status_action_snack_bar.dart` — failure SnackBar now appends `errorMessage` detail to the failure text for operator visibility
|
||
- `feature_wordpress/test/widgets/product_preview_panel_test.dart` — added `onCategoryChanged` to test helper; added 13 new tests: inline validation errors (name, price, description, category), error-clears-on-cancel, valid-input-clears-error, and text-field-disabled-during-isUpdating for all four edit fields
|
||
- `feature_wordpress/test/widgets/status_action_snack_bar_test.dart` — updated 2 failure SnackBar assertions to match new wording that includes error detail
|
||
- tests: passed (247/247 feature_wordpress)
|
||
- analyze: passed (dart analyze — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/multi-select-groundwork
|
||
|
||
- status: merged to main
|
||
- date: 2026-05-22
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/application/product_publishing_controller.dart` — added multi-selection state (`toggleMultiSelect`, `clearMultiSelection`, `selectAllVisible`, `isMultiSelected`, `multiSelectedIds`, `multiSelectedCount`)
|
||
- `feature_wordpress/lib/src/presentation/widgets/product_draft_card.dart` — added optional leading checkbox for multi-select mode
|
||
- `feature_wordpress/lib/src/presentation/product_publishing_page.dart` — added `_MultiSelectBar` with selected-count display, Select All, and Clear actions
|
||
- `feature_wordpress/test/product_publishing_controller_test.dart` — added 15 new multi-select tests
|
||
- tests: passed (262/262 feature_wordpress)
|
||
- analyze: passed
|
||
- brief updated: yes
|
||
|
||
### feat/list-efficiency-improvements
|
||
|
||
- status: merged to main
|
||
- date: 2026-05-22
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/application/product_publishing_controller.dart` — added `ListDensity` enum, compact/standard view toggle, staleness detection (`isStale()`, `staleCount()` with 30-day threshold), keyboard navigation (`selectNextDraft`/`selectPreviousDraft` with wrapping)
|
||
- `feature_wordpress/lib/src/presentation/widgets/product_draft_card.dart` — added compact two-row layout variant, description snippet in standard card, stale indicator icon, `Flexible` overflow handling
|
||
- `feature_wordpress/lib/src/presentation/product_publishing_page.dart` — wired `Focus`+`onKeyEvent` for arrow keys and density toggle button
|
||
- `feature_wordpress/test/product_publishing_controller_test.dart` — added 32 new tests
|
||
- tests: passed (294/294 feature_wordpress, 5/5 kell_web dashboard)
|
||
- analyze: passed
|
||
- brief updated: yes
|
||
|
||
### feat/design-system-shared-widgets
|
||
|
||
- status: merged to main
|
||
- date: 2026-05-22
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `design_system/lib/design_system.dart` — expanded barrel exports with typography, layout, and 5 new widgets
|
||
- `design_system/lib/src/theme/kc_typography.dart` — new shared typography scale (KcTypography) with full Material 3 text style hierarchy and `applyKcTypography()` helper
|
||
- `design_system/lib/src/theme/kc_theme.dart` — updated to use `KcTypography.applyKcTypography()` instead of inline text styles
|
||
- `design_system/lib/src/layout/kc_breakpoints.dart` — new responsive breakpoint utilities (KcBreakpoints) with compact/medium/expanded/large queries and grid column helper
|
||
- `design_system/lib/src/widgets/kc_empty_state.dart` — migrated from kell_web EmptyStatePanel as KcEmptyState
|
||
- `design_system/lib/src/widgets/kc_section_header.dart` — migrated from kell_web SectionHeader as KcSectionHeader
|
||
- `design_system/lib/src/widgets/kc_summary_card.dart` — migrated from kell_web SummaryCard as KcSummaryCard
|
||
- `design_system/lib/src/widgets/kc_loading_state.dart` — new shared loading state widget
|
||
- `design_system/lib/src/widgets/kc_error_state.dart` — new shared error state widget with optional retry
|
||
- `design_system/test/design_system_test.dart` — expanded from 3 to 41 tests covering all new widgets, typography, breakpoints, colors, spacing
|
||
- `kell_web/lib/pages/dashboard_page.dart` — updated imports to use design_system widgets directly (KcSectionHeader, KcSummaryCard, KcEmptyState)
|
||
- `kell_web/lib/shell/widgets/empty_state_panel.dart` — replaced with backward-compatible typedef re-export
|
||
- `kell_web/lib/shell/widgets/section_header.dart` — replaced with backward-compatible typedef re-export
|
||
- `kell_web/lib/shell/widgets/summary_card.dart` — replaced with backward-compatible typedef re-export
|
||
- tests: passed (41/41 design_system, 294/294 feature_wordpress, 24/24 kell_web)
|
||
- analyze: passed (dart analyze — no issues found in design_system and kell_web)
|
||
- brief updated: yes
|
||
|
||
### feat/shared-composition-pattern
|
||
|
||
- status: merged to main
|
||
- date: 2026-05-22
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `core/lib/src/app/` — extracted shared composition abstractions (KcAppConfig, KcAppEnvironment, KcAppServices, KcServiceFactory, KcBootstrap, KcAppScope)
|
||
- `core/lib/core.dart` — expanded barrel exports for app composition
|
||
- `core/test/core_test.dart` — added 20 tests for shared composition abstractions
|
||
- `kell_web/` — updated to use core composition abstractions
|
||
- tests: passed (20/20 core, 41/41 design_system, 294/294 feature_wordpress, 24/24 kell_web)
|
||
- analyze: passed
|
||
- brief updated: yes
|
||
|
||
### feat/flutter-cicd
|
||
|
||
- status: merged to main
|
||
- date: 2026-05-22
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `.forgejo/workflows/flutter-analyze.yml` — new Forgejo Actions workflow for dart analyze on all 8 packages/apps
|
||
- `.forgejo/workflows/flutter-test.yml` — new Forgejo Actions workflow for flutter test per package with aggregate pass/fail summary
|
||
- `kell_creations_apps/tools/run_all_tests.sh` — new local CI helper script with optional --analyze flag
|
||
- `kell_creations_apps/tools/README.md` — documents scripts and CI workflow inventory
|
||
- tests: passed (20/20 core, 41/41 design_system, 294/294 feature_wordpress, 24/24 kell_web — 379 total)
|
||
- analyze: passed (dart analyze — no issues found across all 8 packages/apps)
|
||
- brief updated: yes
|
||
|
||
### feat/test-coverage-visibility
|
||
|
||
- status: merged to main
|
||
- date: 2026-05-22
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `.forgejo/workflows/flutter-test.yml` — enhanced to run flutter test --coverage, parse lcov.info, report per-package line coverage percentages in aggregate summary table
|
||
- `kell_creations_apps/tools/collect_coverage.sh` — new local coverage helper script with summary table
|
||
- `kell_creations_apps/tools/README.md` — documented collect_coverage.sh script
|
||
- `.gitignore` — added coverage/ directories
|
||
- `docs/development/master_development_brief.md` — marked Stage 4D complete, documented baseline coverage table, updated next branch to Stage 5A, partially resolved improvement #5
|
||
- tests: passed (20/20 core, 41/41 design_system, 294/294 feature_wordpress, 24/24 kell_web — 379 total)
|
||
- analyze: passed
|
||
- coverage baseline: core 85.7%, design_system 100.0%, feature_wordpress 84.7%, kell_web 54.1%, overall 78.4%
|
||
- brief updated: yes
|
||
|
||
### feat/android-app-shell
|
||
|
||
- status: merged to main
|
||
- date: 2026-05-28
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `kell_mobile/pubspec.yaml` — replaced default template dependencies with shared packages (`core`, `design_system`, `feature_inventory`, `feature_orders`, `feature_policy`, `feature_wordpress`); SDK constraint corrected to `^3.11.0`
|
||
- `kell_mobile/lib/main.dart` — replaced counter template with `KcBootstrap` entry point using `--dart-define` environment variables
|
||
- `kell_mobile/lib/app.dart` — new `KellMobileApp` widget with `KcAppScope<MobileAppServices>`, `KcTheme`, and environment badge
|
||
- `kell_mobile/lib/composition/mobile_app_services.dart` — new `MobileAppServices` extending `KcAppServices` with `fake()` and `wp()` factory constructors
|
||
- `kell_mobile/lib/shell/mobile_shell.dart` — new `MobileShell` with 5-tab `NavigationBar` (Dashboard, Inventory, Orders, Publishing, More) and `IndexedStack` body
|
||
- `kell_mobile/lib/dashboard/domain/dashboard_summary.dart` — shared `DashboardSummary` value object with `fromData()` and `empty()` constructors
|
||
- `kell_mobile/lib/dashboard/application/get_dashboard_summary.dart` — use case aggregating inventory, orders, and publishing repositories
|
||
- `kell_mobile/lib/dashboard/application/dashboard_controller.dart` — `ChangeNotifier` controller with loading/error/summary state
|
||
- `kell_mobile/lib/pages/dashboard_page.dart` — mobile-optimized dashboard with `GridView` summary cards using design system widgets
|
||
- `kell_mobile/lib/pages/finance_placeholder_page.dart` — placeholder page for Finance tab
|
||
- `kell_mobile/lib/pages/integrations_placeholder_page.dart` — placeholder page for Integrations tab
|
||
- `kell_mobile/test/widget_test.dart` — 6 widget tests covering shell loading, summary cards, environment badge, navigation bar, tab switching, and More menu
|
||
- 13 other `pubspec.yaml` files — SDK constraint corrected from `^3.11.4` to `^3.11.0` across all packages
|
||
- tests: passed (6/6 kell_mobile, 24/24 kell_web, 294/294 feature_wordpress — all passing)
|
||
- analyze: not yet run (SDK constraint fix was prerequisite)
|
||
- brief updated: yes
|
||
|
||
### feat/android-publishing-surface
|
||
|
||
- status: merged to main
|
||
- date: 2026-05-29
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_wordpress/lib/feature_wordpress.dart` — expanded barrel exports with `ProductPublishingController`, `ProductSortField`, `ProductDraftCard`, `ProductPreviewPanel`, and all 5 use cases + snack bar helpers for mobile consumption
|
||
- `kell_mobile/lib/pages/mobile_publishing_page.dart` — new mobile-optimized publishing workspace with search bar, horizontal filter chips, sort dropdown, product count, compact card list, pull-to-refresh, and push navigation to detail page
|
||
- `kell_mobile/lib/pages/mobile_product_detail_page.dart` — new full-screen product detail page wrapping shared `ProductPreviewPanel` with all narrow edit callbacks
|
||
- `kell_mobile/lib/shell/mobile_shell.dart` — Products tab (case 2) switched from `ProductPublishingPage` to `MobilePublishingPage`; removed unused `feature_wordpress` import
|
||
- `kell_mobile/test/widget_test.dart` — added 4 new mobile publishing surface tests (search bar, filter chips, product count, sort button) — 10 total kell_mobile tests
|
||
- tests: passed (10/10 kell_mobile)
|
||
- analyze: passed (dart analyze — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/android-feedback-polish
|
||
|
||
- status: merged to main
|
||
- date: 2026-05-29
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `kell_mobile/lib/pages/mobile_product_detail_page.dart` — converted from stateless to StatefulWidget; added local controller listener for SnackBar feedback in detail page context; added confirmation dialogs for publish/move-to-draft actions; added haptic feedback (mediumImpact for status, lightImpact for field edits) on successful actions
|
||
- `kell_mobile/lib/pages/mobile_publishing_page.dart` — added `_detailPageActive` guard to suppress SnackBars when detail page is pushed (prevents invisible behind-route feedback); updated `_navigateToDetail` to set/clear the guard flag using Navigator.push().then()
|
||
- `kell_mobile/test/widget_test.dart` — added 4 new Stage 6A tests: detail page navigation, confirmation dialog for status changes, product name in app bar, and back navigation returning to product list
|
||
- tests: passed (14/14 kell_mobile)
|
||
- analyze: passed (dart analyze — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/android-mobile-ux-hardening
|
||
|
||
- status: merged to main
|
||
- date: 2026-05-30
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/presentation/widgets/product_preview_panel.dart` — removed `constraints: BoxConstraints()` and `padding: EdgeInsets.zero` overrides from 12 `IconButton`s (edit/save/cancel for name, price, description, category) to restore Material Design 48×48dp minimum touch targets; replaced fixed-width `SizedBox(width: 80)` on price edit `TextField` with `Expanded` for flexible layout on narrow mobile screens; added `tooltip: 'Edit price'` for consistency with other edit buttons
|
||
- `kell_mobile/lib/pages/mobile_product_detail_page.dart` — wrapped `ProductPreviewPanel` in `SafeArea` to prevent content clipping under system UI on devices with notches/gesture bars
|
||
- `feature_wordpress/test/widgets/product_preview_panel_test.dart` — added 6 new touch target tests: rendered size ≥ 48×48dp verification for edit name, edit price, edit category, edit description, save/cancel name buttons, and flexible price edit TextField width
|
||
- tests: passed (300/300 feature_wordpress, 14/14 kell_mobile, 24/24 kell_web, 41/41 design_system — 379 total)
|
||
- analyze: passed
|
||
- brief updated: yes
|
||
|
||
### feat/bulk-status-actions
|
||
|
||
- status: merged to main
|
||
- commit: `2c3ed3b`
|
||
- date: 2026-05-30
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/application/product_publishing_controller.dart` — added `BulkActionResult` value class with `successCount`, `failureCount`, `targetStatus`, `failedProductNames`, `totalCount`, `allSucceeded`; added `lastBulkActionResult`, `consumeBulkActionResult()`, and `bulkUpdateStatus()` method that processes selected products sequentially with per-row updating state, then reloads once and clears multi-selection
|
||
- `feature_wordpress/lib/src/presentation/widgets/status_action_snack_bar.dart` — added `showBulkActionSnackBar()` helper with success/partial-failure/total-failure variants showing count summaries and up to 3 failed product names
|
||
- `feature_wordpress/lib/src/presentation/product_publishing_page.dart` — added `_confirmBulkMoveToDraft()` confirmation dialog; updated `_MultiSelectBar` with `onBulkMoveToDraft` callback and "Move to Draft" `OutlinedButton.icon`; added bulk result listener in `_onControllerChanged`
|
||
- `feature_wordpress/test/product_publishing_controller_test.dart` — added 11 new `bulkUpdateStatus` tests: no-op on empty selection, moves all to draft, sets result on all-success, clears multi-selection, clears updatingIds, handles mixed statuses, consume clears result, starts null, preserves preview selection, persists filter/sort, disposal safety
|
||
- tests: passed (311/311 feature_wordpress, 24/24 kell_web — 335+ total)
|
||
- analyze: passed (info-level only — 8 pre-existing unnecessary_import in test files)
|
||
- brief updated: yes
|
||
|
||
### feat/inventory-domain-expansion
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-10
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_inventory/lib/src/domain/inventory_item.dart` — expanded model with `description`, `imageUrl`, `category`, `reorderPoint`, `supplier`, `location`, `lastUpdated` fields; added `copyWith()`
|
||
- `feature_inventory/lib/src/domain/inventory_adjustment_result.dart` — new value object with `success`, `updatedItem`, `errorMessage`; named constructors `success()` and `failure()`
|
||
- `feature_inventory/lib/src/domain/inventory_repository.dart` — expanded contract with `adjustQuantity()`, `setQuantity()`, `createItem()`, `updateItem()`, `updateItemImage()`
|
||
- `feature_inventory/lib/src/data/fake_inventory_repository.dart` — expanded seed data (6 items with full fields, supplier/location, reorderPoint); implemented all write methods with status auto-update logic
|
||
- `feature_inventory/lib/src/application/adjust_inventory_quantity.dart` — new use case wrapping `adjustQuantity()`
|
||
- `feature_inventory/lib/src/application/create_inventory_item.dart` — new use case wrapping `createItem()`
|
||
- `feature_inventory/lib/src/application/update_inventory_item.dart` — new use case wrapping `updateItem()`
|
||
- `feature_inventory/lib/src/application/inventory_controller.dart` — added `isUpdating`, `lastActionResult`, `adjustQuantity()`, `createItem()`, `updateItem()`, `_refreshItem()` with pre-filter selectedItem refresh
|
||
- `feature_inventory/lib/src/presentation/inventory_page.dart` — updated `InventoryController` constructor call to pass all 4 use cases
|
||
- `feature_inventory/lib/feature_inventory.dart` — expanded barrel exports for all new types and use cases
|
||
- `feature_inventory/test/feature_inventory_test.dart` — 49 tests covering InventoryStatus, InventoryItem, InventoryAdjustmentResult, FakeInventoryRepository (all write methods), and InventoryController (read + write actions)
|
||
- `kell_web/test/dashboard/domain/dashboard_summary_test.dart` — updated InventoryItem construction to use expanded model
|
||
- `kell_web/test/dashboard/application/dashboard_controller_test.dart` — updated stub InventoryRepository to implement expanded contract
|
||
- tests: passed (49/49 feature_inventory, 24/24 kell_web, 20/20 core, 41/41 design_system, 311/311 feature_wordpress — 445 total)
|
||
- analyze: passed (dart analyze — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/inventory-page-ui
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-10
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_inventory/lib/src/presentation/inventory_page.dart` — full inventory page with search bar, status filter chips (All / In Stock / Low Stock / Out of Stock / Draft), item count display, `InventoryItemCard` list, `initialFilter` and `initialQuery` constructor params
|
||
- `feature_inventory/lib/src/presentation/widgets/inventory_status_chip.dart` — `InventoryStatusChip` widget mapping `InventoryStatus` to label and color
|
||
- `feature_inventory/lib/src/presentation/widgets/inventory_detail_panel.dart` — `InventoryDetailPanel` with name, SKU, description, quantity, price, status chip, supplier, location, reorder point, last updated; Adjust Quantity and View Product action buttons; `isUpdating` loading indicator
|
||
- `feature_inventory/lib/src/presentation/widgets/adjust_quantity_dialog.dart` — `AdjustQuantityDialog` with +/- delta input, reason field, and `AdjustQuantityDialogResult` value object
|
||
- `feature_inventory/lib/src/presentation/inventory_action_snack_bar.dart` — `showInventoryActionSnackBar()` helper for success/failure feedback
|
||
- `feature_inventory/lib/feature_inventory.dart` — expanded barrel exports for all new presentation types
|
||
- `feature_inventory/test/widgets/inventory_page_test.dart` — 26 new widget tests covering `InventoryStatusChip` (4), `InventoryDetailPanel` (11), `InventoryPage` (9), `AdjustQuantityDialogResult` (2)
|
||
- `kell_creations_apps/tools/run_all_tests.sh` — added `feature_inventory` to `TESTABLE` list
|
||
- tests: passed (75/75 feature_inventory, 311/311 feature_wordpress, 24/24 kell_web, 14/14 kell_mobile, 41/41 design_system, 20/20 core — 485 total)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/orders-domain
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-10
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_orders/lib/src/domain/order.dart` — added `customerPhone`, `notes`, `orderNotes` fields; added `copyWith()`
|
||
- `feature_orders/lib/src/domain/order_action_result.dart` — new value object with `success`, `updatedOrder`, `errorMessage`; named constructors `success()` and `failure()`
|
||
- `feature_orders/lib/src/domain/orders_repository.dart` — expanded contract with `updateOrderStatus()`, `addOrderNote()`, `createOrder()`
|
||
- `feature_orders/lib/src/data/fake_orders_repository.dart` — added `customerPhone` to seed data; implemented all write methods with duplicate-check, empty-note guard, and status auto-update
|
||
- `feature_orders/lib/src/application/update_order_status.dart` — new use case wrapping `updateOrderStatus()`
|
||
- `feature_orders/lib/src/application/add_order_note.dart` — new use case wrapping `addOrderNote()`
|
||
- `feature_orders/lib/src/application/create_order.dart` — new use case wrapping `createOrder()`
|
||
- `feature_orders/lib/src/application/orders_controller.dart` — added `isUpdating`, `lastActionResult`, `updateOrderStatus()`, `addOrderNote()`, `createOrder()`, `consumeActionResult()`, `_reloadAndRefresh()` with filter/search persistence after writes; write use cases are optional named params for backward compatibility
|
||
- `feature_orders/lib/feature_orders.dart` — expanded barrel exports for all new types and use cases
|
||
- `feature_orders/test/feature_orders_test.dart` — expanded domain tests: Order (copyWith, defaults, computed props), OrderItem, OrderStatus, OrderActionResult, barrel smoke test
|
||
- `feature_orders/test/fake_orders_repository_test.dart` — expanded with write method tests: updateOrderStatus (4), addOrderNote (6), createOrder (4)
|
||
- `feature_orders/test/orders_controller_test.dart` — expanded with write-side tests: updateOrderStatus (6), addOrderNote (6), createOrder (4), consumeActionResult (3), filter/search persistence (2); read-side tests preserved
|
||
- `kell_web/test/dashboard/application/dashboard_controller_test.dart` — updated `_StubOrdersRepository` to implement expanded `OrdersRepository` contract
|
||
- `kell_creations_apps/tools/run_all_tests.sh` — added `feature_orders` and `kell_mobile` to `TESTABLE` list
|
||
- tests: passed (90/90 feature_orders, 24/24 kell_web — all passing)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found in feature_orders and kell_web)
|
||
- brief updated: yes
|
||
|
||
### feat/orders-page-ui
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-10
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_orders/lib/src/presentation/orders_page.dart` — full orders page with search bar, status filter chips (All / Pending / Processing / Shipped / Delivered / Cancelled), order count display, `OrderCard` list, master-detail wide layout, push-navigation narrow layout; `initialFilter`, `initialQuery`, `initialSelectedId` constructor params; `onViewProduct` and `onViewInventory` cross-feature callbacks
|
||
- `feature_orders/lib/src/presentation/widgets/order_card.dart` — `OrderCard` with order ID, customer name, date, status chip, item count, and total
|
||
- `feature_orders/lib/src/presentation/widgets/order_detail_panel.dart` — `OrderDetailPanel` with customer info, shipping address, line items table, order total, order notes, status update dropdown, Add Note button, and `isUpdating` loading indicator; optional `onViewProduct`/`onViewInventory` cross-feature links per line item
|
||
- `feature_orders/lib/src/presentation/widgets/order_status_chip.dart` — `OrderStatusChip` mapping `OrderStatus` to label and color
|
||
- `feature_orders/lib/src/presentation/widgets/add_note_dialog.dart` — `AddNoteDialog` with text field, empty-note validation, and `AddNoteDialogResult` value object
|
||
- `feature_orders/lib/src/presentation/orders_action_snack_bar.dart` — `showOrderActionSnackBar()` helper for success/failure feedback
|
||
- `feature_orders/lib/feature_orders.dart` — expanded barrel exports for all new presentation types and `OrdersController`
|
||
- `feature_orders/test/widgets/orders_page_test.dart` — 25 new widget tests covering `OrderDetailPanel` (14), `AddNoteDialog` (3), `OrdersPage` (6), and `_EmptyOrdersRepository` test double
|
||
- tests: passed (115/115 feature_orders, 24/24 kell_web — 139 total for affected packages)
|
||
- analyze: passed (dart analyze — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/orders-mobile-surface
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-10
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `kell_mobile/lib/pages/mobile_orders_page.dart` — new `MobileOrdersPage` with search bar, horizontal status filter chips (All / Pending / Processing / Shipped / Delivered / Cancelled), order count display, `OrderCard` list at 160px height, pull-to-refresh, `_detailPageActive` guard to suppress behind-route SnackBars
|
||
- `kell_mobile/lib/pages/mobile_order_detail_page.dart` — new `MobileOrderDetailPage` wrapping shared `OrderDetailPanel`; StatefulWidget with local controller listener for SnackBar feedback; confirmation dialog before status changes; haptic feedback (mediumImpact for status, lightImpact for note additions); `SafeArea` wrapper
|
||
- `kell_mobile/lib/shell/mobile_shell.dart` — Orders tab (case 3) switched from shared `OrdersPage` to `MobileOrdersPage`; removed unused `feature_orders` direct import
|
||
- `kell_mobile/test/widget_test.dart` — added 6 new Stage 6B tests: Orders tab search bar, status filter chips, order count, order card navigation to detail, confirmation dialog for status change, back navigation returning to orders list — 20 total kell_mobile tests
|
||
- tests: passed (20/20 kell_mobile, 115/115 feature_orders — all passing)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/inventory-mobile-surface
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-10
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `kell_mobile/lib/pages/mobile_inventory_page.dart` — new `MobileInventoryPage` with search bar, horizontal status filter chips (All / In Stock / Low Stock / Out of Stock / Draft), item count display, compact `_MobileInventoryCard` list at 120px height showing name, SKU, status chip, and quantity-on-hand, pull-to-refresh, `_detailPageActive` guard to suppress behind-route SnackBars
|
||
- `kell_mobile/lib/pages/mobile_inventory_detail_page.dart` — new `MobileInventoryDetailPage` wrapping shared `InventoryDetailPanel`; StatefulWidget with local controller listener for SnackBar feedback; shows `showAdjustQuantityDialog` on Adjust Quantity tap; haptic feedback (mediumImpact on result, lightImpact on successful adjust); `SafeArea` wrapper
|
||
- `kell_mobile/lib/shell/mobile_shell.dart` — Inventory tab (case 1) switched from shared `InventoryPage` to `MobileInventoryPage`; removed unused `feature_inventory` direct import
|
||
- `kell_mobile/test/widget_test.dart` — added 6 new Stage 6C tests: Inventory tab search bar, status filter chips, item count, inventory card navigation to detail, adjust quantity dialog, back navigation returning to inventory list — 26 total kell_mobile tests
|
||
- tests: passed (26/26 kell_mobile, 75/75 feature_inventory — all passing)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found)
|
||
- brief updated: yes
|
||
|
||
### chore/analyze-cleanup-and-tracker-sync
|
||
|
||
- status: merged to main
|
||
- date: 2026-05-30
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_wordpress/test/product_publishing_controller_test.dart` — removed 3 unnecessary_import directives (get_product_drafts, product_publishing_controller, publish_product)
|
||
- `feature_wordpress/test/widgets/product_draft_card_test.dart` — removed 1 unnecessary_import directive (product_draft_card)
|
||
- `feature_wordpress/test/widgets/product_preview_panel_test.dart` — removed 1 unnecessary_import directive (product_preview_panel)
|
||
- `feature_wordpress/test/widgets/publish_status_chip_test.dart` — removed 1 unnecessary_import directive (publish_status_chip)
|
||
- `feature_wordpress/test/widgets/status_action_snack_bar_test.dart` — removed 2 unnecessary_import directives (product_publishing_controller, status_action_snack_bar)
|
||
- `kell_mobile/test/widget_test.dart` — removed unused `productCards` local variable
|
||
- `docs/development/build_execution_tracker.md` — updated Stage 7A to merged, synced current status
|
||
- `docs/development/master_development_brief.md` — updated next recommended branch, validation state, test counts
|
||
- tests: passed (311/311 feature_wordpress, 14/14 kell_mobile, 24/24 kell_web, 41/41 design_system, 20/20 core — 410 total)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found across all packages)
|
||
- brief updated: yes
|
||
|
||
### feat/integrations-contracts
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-11
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `integrations/lib/src/api_exception.dart` — new `ApiException` base class with `statusCode`, `message`, `body`; replaces placeholder `Calculator` class
|
||
- `integrations/lib/src/api_client.dart` — new `ApiClient` abstract class with `initialize()`, `dispose()`, `isReady`, `execute<T>()` lifecycle contract
|
||
- `integrations/lib/src/retry_policy.dart` — new `RetryPolicy` abstract class; `NoRetryPolicy` (never retries); `ExponentialBackoffRetryPolicy` (doubles delay per attempt, capped at `maxDelay`, retries on 5xx and network errors)
|
||
- `integrations/lib/src/rate_limiter.dart` — new `RateLimiter` abstract class; `NoRateLimiter` (no-op); `TokenBucketRateLimiter` (maxRequests per window, queues excess requests)
|
||
- `integrations/lib/src/integration_health_check.dart` — new `HealthCheckResult` value object with `healthy`/`unhealthy` named constructors; `IntegrationHealthCheck` abstract contract
|
||
- `integrations/lib/src/webhook_handler.dart` — new `WebhookEvent`, `WebhookProcessingStatus` enum, `WebhookResult` with `processed`/`ignored`/`failed` constructors; `WebhookHandler` abstract contract
|
||
- `integrations/lib/src/channel_adapter.dart` — new `ChannelProduct`, `ChannelOrder`, `ChannelOrderItem`, `ChannelInventoryCount` neutral value objects; `ChannelAdapter` abstract contract with products/orders/inventory operations
|
||
- `integrations/lib/integrations.dart` — replaced `Calculator` placeholder with barrel exports for all 7 new contract files
|
||
- `integrations/test/integrations_test.dart` — replaced placeholder test with 38 tests covering all contracts and value objects
|
||
- `feature_wordpress/lib/src/data/woo_commerce_api_client.dart` — `WooCommerceApiClient` now implements `ApiClient`; added `initialize()`, `isReady`, `execute<T>()`; `dispose()` also resets `_ready`
|
||
- `feature_wordpress/lib/src/data/woo_commerce_api_client.dart` — `WooCommerceApiException` now extends `ApiException` instead of implementing `Exception` directly
|
||
- `feature_wordpress/pubspec.yaml` — added `integrations: path: ../integrations` dependency
|
||
- `kell_creations_apps/tools/run_all_tests.sh` — added `packages/integrations` to both `TESTABLE` and `ANALYZABLE` lists
|
||
- tests: passed (38/38 integrations, 319/319 feature_wordpress — 357 total for affected packages)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found in integrations and feature_wordpress)
|
||
- brief updated: yes
|
||
|
||
### feat/data-layer-contracts
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-11
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `data/lib/src/local_cache.dart` — new `LocalCache<T>` abstract contract; `InMemoryCache<T>` implementation with TTL-based expiry, key enumeration, and dispose
|
||
- `data/lib/src/sync_queue.dart` — new `SyncOperationStatus` enum, `SyncOperation` value object with `copyWith()`; `SyncFlushResult` with `success`/`failure` constructors; `SyncQueue` abstract contract; `InMemorySyncQueue` implementation with enqueue, process (success/failure tracking), remove, pruneCompleted, and length
|
||
- `data/lib/src/conflict_resolver.dart` — new `ConflictResolution` enum, `ConflictResult<T>` with `useLocal`/`useRemote`/`merged`/`requiresReview` constructors; `ConflictResolver<T>` abstract contract; `LastWriteWinsResolver<T>`, `LocalAlwaysWinsResolver<T>`, `RemoteAlwaysWinsResolver<T>` concrete implementations
|
||
- `data/lib/src/change_tracker.dart` — new `ChangeState` enum, `TrackedChange<T>` value object with `copyWith()`; `ChangeTracker<T>` abstract contract; `InMemoryChangeTracker<T>` implementation with trackCreated/trackModified/trackDeleted/markSynced/markSyncError/pendingChanges/hasPendingChanges/clear
|
||
- `data/lib/src/data_mapper.dart` — new `DataMapper<TLocal, TRemote>` abstract contract with `fromRemote`/`toRemote`/`fromRemoteList`/`toRemoteList`; `DataMappingException` with field, message, rawValue
|
||
- `data/lib/data.dart` — replaced `Calculator` placeholder with barrel exports for all 5 new contract files
|
||
- `data/test/data_test.dart` — replaced placeholder test with 63 tests covering all contracts and implementations
|
||
- `kell_creations_apps/tools/run_all_tests.sh` — added `packages/data` to both `TESTABLE` and `ANALYZABLE` lists
|
||
- tests: passed (63/63 data)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/auth-foundation
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-11
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `auth/lib/src/domain/kc_user.dart` — `KcUser` value object with `id`, `displayName`, `email`, `role`; `KcUserRole` enum (`admin`, `operator`, `viewer`)
|
||
- `auth/lib/src/domain/auth_state.dart` — `AuthState` sealed class hierarchy: `AuthStateUnauthenticated`, `AuthStateAuthenticated`, `AuthStateLoading`, `AuthStateError`
|
||
- `auth/lib/src/domain/auth_exception.dart` — `AuthException` with `code` and `message`; named constructors `invalidCredentials`, `sessionExpired`, `networkError`, `unknown`
|
||
- `auth/lib/src/domain/auth_service.dart` — `AuthService` abstract contract with `login()`, `logout()`, `currentUser`, `authStateStream`, `isAuthenticated`
|
||
- `auth/lib/src/domain/credential_store.dart` — `CredentialKeys` constants; `CredentialStore` abstract contract with `save()`, `load()`, `delete()`, `clear()`
|
||
- `auth/lib/src/data/in_memory_credential_store.dart` — `InMemoryCredentialStore` implementation
|
||
- `auth/lib/src/data/fake_auth_service.dart` — `FakeAuthService` with configurable users, delay simulation, and stream broadcasting
|
||
- `auth/lib/auth.dart` — barrel exports for all auth types
|
||
- `auth/test/auth_test.dart` — 42 tests covering all domain models, contracts, and implementations
|
||
- `core/lib/src/app/kc_app_environment.dart` — added `KcAppEnvironment.square` value
|
||
- `kell_creations_apps/tools/run_all_tests.sh` — added `packages/auth` to `TESTABLE` and `ANALYZABLE` lists
|
||
- tests: passed (42/42 auth, 21/21 core — all passing)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/wc-orders-integration
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-11
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_orders/lib/src/domain/order_status.dart` — added `onHold`, `refunded`, `failed` values
|
||
- `feature_orders/lib/src/domain/order_item.dart` — added `productId`, `variationId`, `customizations` fields
|
||
- `feature_orders/lib/src/domain/order.dart` — added `paymentMethod`, `source`, `customFields` fields
|
||
- `feature_orders/lib/src/domain/orders_repository.dart` — added `getOrder(id)` to contract
|
||
- `feature_orders/lib/src/domain/order_source.dart` — new `OrderSource` enum (`online`, `market`, `manual`)
|
||
- `feature_orders/lib/src/data/fake_orders_repository.dart` — implemented `getOrder(id)` with null-safe lookup
|
||
- `feature_orders/lib/src/data/woo_commerce_order_mapper.dart` — new `WooCommerceOrderMapper` mapping WooCommerce JSON ↔ `Order` domain model
|
||
- `feature_orders/lib/src/data/woo_commerce_orders_repository.dart` — new `WooCommerceOrdersRepository` implementing full `OrdersRepository` contract via `WooCommerceApiClient`
|
||
- `feature_orders/lib/feature_orders.dart` — expanded barrel exports for all new types
|
||
- `feature_orders/pubspec.yaml` — added `feature_wordpress` dependency; added `http` dev dependency
|
||
- `feature_wordpress/lib/src/data/woo_commerce_api_client.dart` — added `getOrders()`, `getOrder(id)`, `updateOrderStatus()`, `createOrder()`, `addOrderNote()` methods
|
||
- `feature_wordpress/lib/feature_wordpress.dart` — exported `WooCommerceApiClient` and `WooCommerceApiException`
|
||
- `feature_orders/test/woo_commerce_order_mapper_test.dart` — 25 mapper tests covering full JSON → domain mapping, status mapping, item mapping, customizations, edge cases
|
||
- `feature_orders/test/woo_commerce_orders_repository_test.dart` — 23 repository and API client tests covering all CRUD operations, error handling, empty-note guard, and FakeOrdersRepository.getOrder
|
||
- tests: passed (198/198 feature_orders, 24/24 kell_web, 26/26 kell_mobile — 248 total for affected packages; 847/847 total across all packages)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found in feature_orders, feature_wordpress, kell_web, kell_mobile)
|
||
- brief updated: yes
|
||
|
||
### feat/bulk-operator-workflows
|
||
|
||
- status: merged to main
|
||
- date: 2026-05-30
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/data/wordpress_product_mapper.dart` — `toWooCommerceStatus()` now maps `PublishStatus.pendingReview` → `'pending'` instead of throwing `ArgumentError`; only `unpublished` throws
|
||
- `feature_wordpress/lib/src/presentation/product_publishing_page.dart` — added `_confirmBulkPublish()` and `_confirmBulkSubmitForReview()` confirmation dialogs; updated `_MultiSelectBar` with `onBulkPublish` and `onBulkSubmitForReview` callbacks; added "Publish" and "Submit for Review" `OutlinedButton.icon` buttons; refactored bar layout from `Row` to `Wrap` for responsive overflow
|
||
- `feature_wordpress/test/wordpress_product_mapper_test.dart` — updated `pendingReview` test: now expects `'pending'` return value instead of `ArgumentError`
|
||
- `feature_wordpress/test/product_publishing_controller_test.dart` — added 3 new bulk tests: publishes all selected products, submits all for review, handles mixed statuses to published
|
||
- `feature_wordpress/test/widgets/product_publishing_page_test.dart` — added 5 new widget tests: multi-select bar shows Publish button, Publish confirmation dialog, Submit for Review confirmation dialog, cancel preserves selection, plural count in dialog
|
||
- `feature_wordpress/test/wordpress_product_publishing_repository_test.dart` — removed `pendingReview` from unsupported-throws test; only `unpublished` asserted
|
||
- tests: passed (319/319 feature_wordpress)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/wc-inventory-sync
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-11
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_inventory/lib/src/domain/inventory_sync_status.dart` — new `InventorySyncStatus` enum (`notSynced`, `synced`, `pending`, `conflict`, `error`)
|
||
- `feature_inventory/lib/src/domain/inventory_item.dart` — added `wooCommerceProductId` (nullable int), `syncStatus`, `lastSyncedAt` fields; updated `copyWith()` to preserve/update all three
|
||
- `feature_inventory/lib/src/domain/inventory_repository.dart` — added `getItemBySku(sku)` and `syncWithRemote(id, remoteQuantity, reason)` to contract
|
||
- `feature_inventory/lib/src/data/fake_inventory_repository.dart` — updated seed data with `wooCommerceProductId`, `syncStatus`, `lastSyncedAt`; implemented `getItemBySku()` and `syncWithRemote()` with status auto-derivation and `lastSyncedAt` stamping
|
||
- `feature_inventory/lib/src/application/inventory_sync_service.dart` — new `InventorySyncService` orchestrating pull-only or bidirectional sync; `syncAll()`, `syncItem(id)`, `checkDifference(id)`; `InventorySyncResult` value object; `StockDifference` value object
|
||
- `feature_inventory/lib/src/data/woo_commerce_inventory_repository.dart` — new `WooCommerceInventoryRepository` implementing full `InventoryRepository` contract; `adjustQuantity()` and `setQuantity()` push to WooCommerce via `updateProductStock()`; `syncWithRemote()` pulls remote quantity and stamps `lastSyncedAt`; local-only items (no `wooCommerceProductId`) skip WooCommerce calls
|
||
- `feature_inventory/lib/feature_inventory.dart` — expanded barrel exports for `InventorySyncService`, `WooCommerceInventoryRepository`, `InventorySyncStatus`
|
||
- `feature_inventory/pubspec.yaml` — added `feature_wordpress: path: ../feature_wordpress` dependency; added `http: ^1.4.0` dev dependency
|
||
- `feature_wordpress/lib/src/data/woo_commerce_api_client.dart` — added `getProductStock(productId)`, `updateProductStock(productId, quantity)`, `batchUpdateStock(updates)` methods
|
||
- `feature_inventory/test/woo_commerce_inventory_sync_test.dart` — 57 new tests covering `InventorySyncStatus`, `InventoryItem` sync fields, `FakeInventoryRepository` (`getItemBySku`, `syncWithRemote`), `WooCommerceApiClient` stock methods, `WooCommerceInventoryRepository`, `InventorySyncService`, `StockDifference`, `InventorySyncResult`
|
||
- `kell_web/test/dashboard/application/dashboard_controller_test.dart` — updated `_StubInventoryRepository` and `_FailingInventoryRepository` stubs to implement expanded `InventoryRepository` contract (`getItemBySku`, `syncWithRemote`)
|
||
- tests: passed (132/132 feature_inventory, 24/24 kell_web, 319/319 feature_wordpress — all passing)
|
||
- analyze: passed (dart analyze — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/wc-catalog-expansion
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-11
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/domain/product_category.dart` — new `ProductCategory` value object with `id`, `name`, `slug`, `parentId`, `count`; `copyWith()`, `==`/`hashCode`, `toString()`
|
||
- `feature_wordpress/lib/src/domain/product_image.dart` — new `ProductImage` value object with `id`, `url`, `alt`, `position`; `copyWith()`, `==`/`hashCode`
|
||
- `feature_wordpress/lib/src/domain/product_publishing_repository.dart` — added `createProduct()`, `deleteProduct()`, `updateProductImages()`, `getProductImages()`, `getCategories()`, `createCategory()`, `updateCategory()`, `deleteCategory()` to contract
|
||
- `feature_wordpress/lib/src/data/fake_product_publishing_repository.dart` — implemented all 8 new repository methods; added seed categories (Jewelry, Accessories, Home Decor, Kitchen Accessories); `createProduct()` resolves category name from id; `createCategory()` auto-generates slug from name; `updateCategory()` and `deleteCategory()` throw `StateError` for unknown ids
|
||
- `feature_wordpress/lib/src/data/woo_commerce_api_client.dart` — added `createProduct()`, `deleteProduct()`, `getCategories()`, `createCategory()`, `updateCategory()`, `deleteCategory()`, `getProductImages()`, `setProductImages()` methods; `getCategories()` paginates with `per_page=100`
|
||
- `feature_wordpress/lib/src/data/wordpress_product_publishing_repository.dart` — implemented all 8 new repository methods delegating to `WooCommerceApiClient`; maps JSON ↔ domain models
|
||
- `feature_wordpress/lib/src/application/create_product.dart` — new `CreateProduct` use case
|
||
- `feature_wordpress/lib/src/application/delete_product.dart` — new `DeleteProduct` use case
|
||
- `feature_wordpress/lib/src/application/get_categories.dart` — new `GetCategories` use case
|
||
- `feature_wordpress/lib/src/application/create_category.dart` — new `CreateCategory` use case
|
||
- `feature_wordpress/lib/src/application/update_product_images.dart` — new `UpdateProductImages` use case
|
||
- `feature_wordpress/lib/feature_wordpress.dart` — exported all new domain models and use cases
|
||
- `feature_wordpress/test/wc_catalog_expansion_test.dart` — 69 new tests covering `ProductCategory`, `ProductImage`, `FakeProductPublishingRepository` (all new methods), `WooCommerceApiClient` (all new methods), `WordPressProductPublishingRepository` (all new methods), and all 5 use cases
|
||
- `kell_web/test/dashboard/application/dashboard_controller_test.dart` — updated `_StubProductPublishingRepository` to implement expanded `ProductPublishingRepository` contract
|
||
- `kell_creations_apps/packages/feature_wordpress/test/widgets/product_publishing_page_test.dart` — updated `_FakeProductPublishingRepository` stub to implement expanded contract
|
||
- tests: passed (388/388 feature_wordpress, 24/24 kell_web — all passing)
|
||
- analyze: passed (dart analyze — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/wc-catalog-expansion-ui
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-11
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/presentation/widgets/create_product_dialog.dart` — new `CreateProductDialog` StatefulWidget with name (required), price (required), SKU, category dropdown, description, and initial-status `SegmentedButton` (Draft / Review); inline validation errors; `CreateProductDialogResult` value object; `showCreateProductDialog()` helper
|
||
- `feature_wordpress/lib/src/presentation/category_management_page.dart` — new `CategoryManagementPage` with category list, add-category FAB, inline rename, delete with confirmation dialog, empty state, loading/error states; `CategoryManagementPage.route()` static helper
|
||
- `feature_wordpress/lib/src/application/product_publishing_controller.dart` — added `CreateProductResult` sealed class (`CreateProductSuccess`, `CreateProductFailure`); added `lastCreateProductResult`, `consumeCreateProductResult()`, `createNewProduct()` (calls `CreateProduct` use case, auto-selects new product, reloads); added `fetchCategories()` (calls `GetCategories` use case); `CreateProduct` and `GetCategories` use cases are optional named constructor params for backward compatibility
|
||
- `feature_wordpress/lib/src/presentation/product_publishing_page.dart` — added "New Product" `FilledButton.icon` in toolbar; wired `showCreateProductDialog()` → `controller.createNewProduct()`; added `showCreateProductSnackBar()` result listener; added "Manage Categories" `TextButton` in toolbar linking to `CategoryManagementPage`
|
||
- `feature_wordpress/lib/feature_wordpress.dart` — exported `CreateProductDialog`, `CreateProductDialogResult`, `showCreateProductDialog`, `CategoryManagementPage`, `CreateProductResult`, `CreateProductSuccess`, `CreateProductFailure`
|
||
- `kell_mobile/lib/pages/mobile_create_product_page.dart` — new `MobileCreateProductPage` full-screen form (name, price, SKU, category dropdown, description, initial status) with `AppBar` and "Create Product" action button; mirrors dialog fields in a scrollable page layout
|
||
- `kell_mobile/lib/pages/mobile_publishing_page.dart` — added "New Product" `FloatingActionButton` navigating to `MobileCreateProductPage`; wired result back to `controller.createNewProduct()`; added `showCreateProductSnackBar()` result listener
|
||
- `feature_wordpress/test/widgets/create_product_dialog_test.dart` — 13 new widget tests: renders fields, Cancel returns null, name/price validation errors, valid submit returns result, SKU/description included, category dropdown shown/hidden, initial status defaults to draft, error-clears-on-type, standalone render
|
||
- `feature_wordpress/test/widgets/category_management_page_test.dart` — 14 new widget tests: renders category list, empty state, add category dialog, rename inline, delete confirmation, loading state, error state, category count
|
||
- `feature_wordpress/test/product_publishing_controller_test.dart` — added 7 new controller tests: `createNewProduct` success/auto-select/failure/consume/null-use-case, `fetchCategories` success/null-use-case
|
||
- tests: passed (424/424 feature_wordpress — all passing)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found)
|
||
- brief updated: yes
|
||
|
||
### feat/square-api-client
|
||
|
||
- status: merged to main
|
||
- date: 2026-07-19
|
||
- inspection: complete
|
||
- implementation: complete
|
||
- files changed:
|
||
- `integrations/lib/src/square_api_client.dart` — new `SquareApiClient` implementing `ApiClient` contract; `sandbox()` and `production()` factory constructors; `initialize()`, `dispose()`, `isReady`, `execute<T>()` lifecycle; Catalog API (`listCatalogItems()` with cursor pagination, `getCatalogItem()`, `upsertCatalogItem()`, `deleteCatalogItem()`); Inventory API (`getInventoryCount()`, `batchChangeInventory()`); Orders API (`createOrder()`, `listOrders()`, `getOrder()`); Payments API (`createPayment()`, `getPayment()`); Bearer token + Square-Version headers on all requests
|
||
- `integrations/lib/src/square_api_exception.dart` — new `SquareApiException` extending `ApiException` with `statusCode`, `message`, `body`; `toString()` includes all fields
|
||
- `integrations/lib/integrations.dart` — expanded barrel exports for `SquareApiClient` and `SquareApiException`
|
||
- `integrations/test/square_api_client_test.dart` — 50 new tests covering `SquareApiException` (5), `SquareApiClient` construction (2), `ApiClient` contract (5), Catalog API (12), Inventory API (7), Orders API (9), Payments API (8), auth headers (2)
|
||
- `integrations/pubspec.yaml` — removed duplicate `http` dev dependency (was also in normal dependencies)
|
||
- `core/lib/src/composition/kc_app_environment.dart` — added `multi` value to `KcAppEnvironment` enum (joining existing `fake`, `wp`, `square`)
|
||
- `core/lib/src/composition/kc_app_config.dart` — added `KC_SQUARE_ACCESS_TOKEN`, `KC_SQUARE_LOCATION_ID`, `KC_SQUARE_ENVIRONMENT` dart-define key constants
|
||
- `core/test/core_test.dart` — added 3 new tests: `KcAppEnvironment.multi` exists, `KC_SQUARE_ACCESS_TOKEN` constant, `KC_SQUARE_LOCATION_ID` constant — 24 total core tests
|
||
- tests: passed (88/88 integrations, 24/24 kell_web, 26/26 kell_mobile, 424/424 feature_wordpress, 132/132 feature_inventory, 198/198 feature_orders, 41/41 design_system, 24/24 core — 957 total)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found across all 11 packages/apps)
|
||
- brief updated: yes
|
||
|
||
### feat/square-catalog-sync
|
||
|
||
- status: in progress on branch (commit `a6f888c`)
|
||
- date: 2026-07-25
|
||
- inspection: complete
|
||
- implementation: complete (Stage 10B slice)
|
||
- files changed:
|
||
- `integrations/lib/src/square_product_mapper.dart` — new `SquareProductMapper`; `fromSquareCatalogObject()` maps Square ITEM CatalogObject JSON → `ChannelProduct` (cents→dollars, `is_deleted` → `archived` status, first-variation SKU/price extraction); `fromSquareCatalogList()` batch variant skipping non-ITEM entries; `toSquareCatalogObject()` maps `ChannelProduct` → Square ITEM JSON (dollars→cents rounding, default variation with `FIXED_PRICING`, `location_overrides` with `track_inventory`, optional description/SKU omitted when null)
|
||
- `integrations/lib/src/square_inventory_mapper.dart` — new `SquareInventoryMapper`; `fromSquareInventoryCount()` maps Square InventoryCount JSON → `ChannelInventoryCount` (IN_STOCK only, string quantity parsed safely); `fromSquareInventoryCountList()` batch variant; `toSquareBatchChangeEntry()` maps `ChannelInventoryCount` → Square PHYSICAL_COUNT batch-change entry (quantity as string, RFC 3339 timestamp); `toSquareBatchChangeEntries()` batch variant
|
||
- `integrations/lib/integrations.dart` — added `square_inventory_mapper.dart` and `square_product_mapper.dart` to barrel exports
|
||
- `integrations/test/square_catalog_sync_test.dart` — 35 new tests: `SquareProductMapper` (20: fromSquareCatalogObject ×9, fromSquareCatalogList ×3, toSquareCatalogObject ×6) and `SquareInventoryMapper` (15: fromSquareInventoryCount ×8, fromSquareInventoryCountList ×3, toSquareBatchChangeEntry ×3, toSquareBatchChangeEntries ×2)
|
||
- `feature_wordpress/lib/src/domain/product_id_mapping.dart` — new `ProductIdMapping` value object with `localId`, `wooCommerceId`, `squareCatalogObjectId`, `squareVariationId`, `lastUpdated`; `copyWith()`, `==`/`hashCode`, `toString()`
|
||
- `feature_wordpress/lib/src/domain/product_id_mapping_repository.dart` — new `ProductIdMappingRepository` abstract contract: `getAllMappings()`, `getMappingByLocalId()`, `getMappingByWooCommerceId()`, `getMappingBySquareId()`, `saveMapping()` (upsert), `deleteMapping()` (no-op safe)
|
||
- `feature_wordpress/lib/src/data/fake_product_id_mapping_repository.dart` — new `FakeProductIdMappingRepository` in-memory implementation; seeded with 6 mappings matching fake catalog (products 1–3 fully synced with Square IDs, products 4–5 WooCommerce-only, product 6 draft/unsynced); 50ms simulated async delay on all operations; `getAllMappings()` returns `List.unmodifiable`
|
||
- `feature_wordpress/lib/feature_wordpress.dart` — added `fake_product_id_mapping_repository.dart`, `product_id_mapping.dart`, `product_id_mapping_repository.dart` to barrel exports
|
||
- `feature_wordpress/test/product_id_mapping_test.dart` — 23 new tests: `ProductIdMapping` (7: fields, null defaults, copyWith, equality, hashCode, toString) and `FakeProductIdMappingRepository` (16: getAllMappings, getMappingByLocalId, getMappingByWooCommerceId, getMappingBySquareId, seed state, saveMapping insert/replace/count, deleteMapping remove/count/no-op, unmodifiable list)
|
||
- tests: passed (123/123 integrations ← +35 new; 23/23 feature_wordpress product_id_mapping ← +23 new)
|
||
- analyze: clean (no new issues introduced)
|
||
- brief updated: yes
|
||
|
||
### feat/square-catalog-sync-service
|
||
|
||
- status: in progress on branch — ready for merge
|
||
- date: 2026-07-25
|
||
- inspection: complete
|
||
- implementation: complete (Stage 10D slice)
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/application/square_catalog_sync_service.dart` — new `SquareCatalogSyncService` application-layer service; `SyncError` value object with `itemId`, `message`, `==`/`hashCode`/`toString()`; `SquareSyncResult` value object with `catalogSynced`, `inventorySynced`, `catalogFailed`, `inventoryFailed`, `errors`, `totalProcessed`, `allSucceeded`, `merge()`; `InventorySyncAdapter` abstract contract with `syncItem(itemId, remoteQuantity)`; `syncCatalog()` fetches all products via `ProductPublishingRepository.getProductDrafts()`, looks up or creates `ProductIdMapping` per product via `ProductIdMappingRepository`, captures per-item failures without aborting; `syncInventory()` iterates all mappings with a `squareVariationId`, calls `InventorySyncAdapter.syncItem()` for each, captures per-item failures; `syncAll()` runs `syncCatalog()` then `syncInventory()` and merges results; no-op when no adapter provided
|
||
- `feature_wordpress/lib/feature_wordpress.dart` — added `square_catalog_sync_service.dart` to barrel exports (Application section)
|
||
- `feature_wordpress/test/square_catalog_sync_service_test.dart` — 31 new tests: `SyncError` (3: fields, equality, toString), `SquareSyncResult` (7: defaults, totalProcessed, allSucceeded×3, merge, toString), `syncCatalog` (9: empty, single, id match, multiple, existing-not-duplicated, fetch-failure, saveMapping-failure, partial-failure, SyncError-details), `syncInventory` (7: no-adapter, no-variationId-skipped, synced, false-return, throw-continues, getAllMappings-failure, empty-mappings), `syncAll` (5: merges, pre-seeded-variation-IDs, totalProcessed, catalog-failure-no-prevent-inventory, no-adapter)
|
||
- tests: passed (506/506 feature_wordpress ← +31 new, 167/167 feature_inventory — all passing)
|
||
- analyze: clean (dart analyze — no issues found)
|
||
- brief updated: yes
|
||
|
||
### chore/audit-state-sync
|
||
|
||
- status: complete (documentation-only — no code changes)
|
||
- date: 2026-07-25
|
||
- inspection: complete — full repository audit conducted against all 11 packages/apps
|
||
- implementation: complete
|
||
- audit reference: `PROJECT_STATE_AUDIT.md` — Kell Creations Operations Platform Comprehensive Code Audit
|
||
- files changed:
|
||
- `PROJECT_STATE_AUDIT.md` — new comprehensive audit document; covers monorepo architecture, built vs. remaining matrix for all 13 packages + 2 apps, technical debt assessment (dead code, error handling gaps, hardcoded values, test coverage, architectural antipatterns), and actionable engineering backlog (Phase 1/2/3 priorities)
|
||
- `docs/development/master_development_brief.md` — updated validation state (core 24/24, feature_wordpress 506/506 post-10D, total 1,015/1,015); updated next recommended branch to include P1.1–P1.5 scope; added "Comprehensive State Audit (2026-07-25)" section with platform scorecard, Phase 1/2/3 backlog tables, and key technical debt findings; updated Appendix A (feature maturity matrix — all test counts, completeness percentages, kell_web/kell_mobile rows added); updated Appendix B (integration landscape — all Square repos now marked complete, WC repos status corrected); updated Appendix C (Square keys moved from "Planned" to "Active"; KC_ENV values table updated with current status)
|
||
- `docs/development/build_execution_tracker.md` — updated current status section (audit completion noted, pending merge flagged, next branch scope documented); added this slice entry
|
||
- tests: n/a (documentation-only change)
|
||
- analyze: n/a (documentation-only change)
|
||
- brief updated: yes
|
||
- audit findings summary:
|
||
- 1,015/1,015 tests passing across all 11 packages/apps
|
||
- `dart analyze --fatal-infos` clean across all 11 packages/apps
|
||
- CRITICAL: `AppServices`/`MobileAppServices` have no `square()` or `multi()` factory — `KC_ENV=square` silently falls to fake mode
|
||
- HIGH: `SquareCatalogSyncService` ID conflation bug; `RetryPolicy`/`RateLimiter` not wired; `auth` package not imported by any app
|
||
- Phase 1 (5 items) → target `feat/square-catalog-sync-service-controller` (Stage 10E)
|
||
- Phase 2 (10 items) → Stages 10C, 11, 12, 13, 14, 15
|
||
- Phase 3 (12 items) → Stages 16A/B + standalone hardening tasks
|
||
|
||
### feat/square-catalog-sync-repositories
|
||
|
||
- status: in progress on branch — ready for merge
|
||
- date: 2026-07-25
|
||
- inspection: complete
|
||
- implementation: complete (Stage 10C slice)
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/data/square_catalog_repository.dart` — new `SquareCatalogRepository` implementing `ProductPublishingRepository`; backed by `SquareApiClient`; `getProductDrafts()` calls `listCatalogItems()` and maps via `SquareProductMapper`, populating an in-memory cache; `publishDraft()` returns cached draft with `published` status (no-op — Square items are always live); `updateProductStatus()`, `updateProductPrice()`, `updateProductName()`, `updateProductDescription()`, `updateProductCategory()` each mutate the cached `ProductDraft`, call `upsertCatalogItem()` with the updated Square JSON, and return the refreshed draft; `createProduct()` calls `upsertCatalogItem()` with a `#NEW_` idempotency key, maps the response, and adds to cache; `deleteProduct()` calls `deleteCatalogItem()` and removes from cache; `updateProductImages()`, `getCategories()`, `createCategory()`, `updateCategory()`, `deleteCategory()`, `getProductImages()` throw `UnsupportedError` (Square manages these separately)
|
||
- `feature_wordpress/lib/feature_wordpress.dart` — added `square_catalog_repository.dart` to barrel exports
|
||
- `feature_inventory/lib/src/domain/inventory_item.dart` — added `squareVariationId` (nullable String) field; updated `copyWith()` to preserve/update it
|
||
- `feature_inventory/lib/src/data/square_inventory_repository.dart` — new `SquareInventoryRepository` implementing `InventoryRepository`; backed by `SquareApiClient` + `initialItems` seed list; `getInventoryItems()` returns `List.unmodifiable`; `getItemBySku()` linear scan; `adjustQuantity()` validates non-negative result, pushes `batchChangeInventory()` when `squareVariationId` is set (stamps `synced`/`lastSyncedAt`), otherwise marks `notSynced`; `setQuantity()` validates non-negative, same Square push pattern; `syncWithRemote()` validates non-negative, calls `getInventoryCount()` when `squareVariationId` is set and uses live count (falls back to `remoteQuantity` on empty response), stamps `synced`/`lastSyncedAt`; `createItem()` appends to local store; `updateItem()` replaces by id and stamps `lastUpdated`; `updateItemImage()` updates `imageUrl` by id; all write failures return `InventoryAdjustmentResult.failure()` with descriptive messages; status auto-derived from quantity vs `reorderPoint`
|
||
- `feature_inventory/lib/feature_inventory.dart` — added `square_inventory_repository.dart` to barrel exports
|
||
- `feature_inventory/pubspec.yaml` — added `integrations: path: ../integrations` dependency
|
||
- `feature_wordpress/test/square_catalog_repository_test.dart` — 30 new tests: `getProductDrafts` (5: empty, single mapping, is_deleted status, multi+skip non-ITEM, cache population), `publishDraft` (2: success, StateError), `updateProductStatus` (2: upserts, StateError), `updateProductPrice` (2: upserts, StateError), `updateProductName` (1), `updateProductDescription` (1), `updateProductCategory` (1), `createProduct` (4: maps result, draft status, StateError on bad type, adds to cache), `deleteProduct` (1: removes from cache), unsupported operations (6: images/categories all throw UnsupportedError), status mapping (2), SquareApiException propagation (1)
|
||
- `feature_inventory/test/square_inventory_repository_test.dart` — 37 new tests: `getInventoryItems` (3: all items, empty, unmodifiable), `getItemBySku` (2), `adjustQuantity` (8: local-only, Square push, not-found, below-zero, API failure, inStock/lowStock/outOfStock status derivation), `setQuantity` (5: local-only, Square push, negative, not-found, API failure), `syncWithRemote` (6: local-only, Square pull, empty-count fallback, negative, not-found, API failure), `createItem` (2), `updateItem` (3: updates, StateError, stamps lastUpdated), `updateItemImage` (2), `InventoryItem.squareVariationId` (4: default null, constructor, copyWith preserve, copyWith update)
|
||
- tests: passed (123/123 integrations, 475/475 feature_wordpress ← +51 new, 167/167 feature_inventory ← +35 new)
|
||
- analyze: clean
|
||
- brief updated: yes
|
||
|
||
### feat/square-sync-ui
|
||
|
||
- status: ready for merge (branch `feat/square-sync-ui`)
|
||
- date: 2026-07-25
|
||
- inspection: complete
|
||
- implementation: complete (Stage 10F — Square sync UI surface)
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/presentation/widgets/square_sync_status_panel.dart` — new `SquareSyncStatusPanel` `StatefulWidget`; listens to `SquareSyncController`; shows status chip (`Never synced` / `OK` / `Partial` / `Error`), last-synced timestamp, `Syncing…` progress indicator during sync, `Sync Now` `FilledButton` (disabled while syncing), and last-sync-result section with Catalog/Inventory row counts when `lastResult` is non-null
|
||
- `feature_wordpress/lib/feature_wordpress.dart` — added `square_sync_status_panel.dart` to barrel exports (Presentation section)
|
||
- `kell_creations_apps/apps/kell_web/lib/pages/integrations_page.dart` — new `IntegrationsPage`; shows `SquareSyncStatusPanel` when `squareSyncController` is non-null; shows placeholder card with hub icon and "No integrations configured" message otherwise; "Square" section label when controller is present
|
||
- `kell_creations_apps/apps/kell_mobile/lib/pages/mobile_integrations_page.dart` — new `MobileIntegrationsPage`; mirrors `IntegrationsPage` layout for mobile; `SafeArea` wrapper
|
||
- `kell_creations_apps/apps/kell_web/lib/routing/app_routes.dart` — added `AppRoute.integrations` case routing to `IntegrationsPage(squareSyncController: services.squareSyncController)`
|
||
- `kell_creations_apps/apps/kell_mobile/lib/shell/mobile_shell.dart` — More tab (case 4) switched from `IntegrationsPlaceholderPage` to `MobileIntegrationsPage(squareSyncController: services.squareSyncController)`
|
||
- `feature_wordpress/test/square_sync_status_panel_test.dart` — 8 new widget tests: renders title, shows Never synced chip, shows Last synced: Never, Sync Now button enabled, shows OK chip after sync, shows last sync result section, rebuilds on notify, unregisters listener on dispose; uses `tester.pump(Duration)` to advance fake time through `Future.delayed` timers
|
||
- `kell_creations_apps/apps/kell_web/test/pages/integrations_page_test.dart` — 4 new widget tests: placeholder when controller null, shows `SquareSyncStatusPanel` when controller provided, shows Square section label, placeholder shows hub icon
|
||
- `kell_creations_apps/apps/kell_mobile/test/pages/mobile_integrations_page_test.dart` — 4 new widget tests: mirroring kell_web integrations page tests for mobile
|
||
- `kell_creations_apps/apps/kell_web/test/composition/app_services_test.dart` — expanded to 28 tests (added `squareSyncController` non-null assertion for `square()` factory, `multi()` factory tests, full `KcBootstrap` credential validation tests)
|
||
- `kell_creations_apps/apps/kell_mobile/test/composition/mobile_app_services_test.dart` — expanded to 28 tests (mirrored kell_web composition tests)
|
||
- tests: passed (545/545 feature_wordpress ← +8 new; 52/52 kell_web ← +5 new; 54/54 kell_mobile ← +5 new — 651 total across tested packages)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found across all packages)
|
||
- brief updated: yes
|
||
|
||
### feat/square-catalog-sync-service-controller
|
||
|
||
- status: ready for merge (branch `feat/square-catalog-sync-service-controller`)
|
||
- date: 2026-07-25
|
||
- inspection: complete
|
||
- implementation: complete (Stage 10E — all P1.1–P1.5 items)
|
||
- files changed:
|
||
- `feature_wordpress/lib/src/application/square_sync_controller.dart` — new `SquareSyncController` `ChangeNotifier`; `SyncPhase` enum (`idle`, `syncing`, `done`, `error`); `syncAll()` delegates to `SquareCatalogSyncService`, sets `phase`/`lastResult`/`lastError`, guards against concurrent calls; `reset()` returns to idle; `isLoading` getter; disposal guard prevents post-dispose notifications
|
||
- `feature_wordpress/lib/feature_wordpress.dart` — added `square_sync_controller.dart` to barrel exports (Application section)
|
||
- `kell_creations_apps/apps/kell_web/lib/composition/app_services.dart` — added `square()` factory (P1.1): `SquareCatalogRepository` as `productPublishingRepository`, `SquareInventoryRepository` as `inventoryRepository`, `SquareSyncController` wired to `SquareCatalogSyncService`; added `multi()` factory: `SquareInventoryRepository` + `WordPressProductPublishingRepository`; updated `KcBootstrap` to validate Square credentials (P1.5) and fall back to fake with warning; added `squareSyncController` field to `AppServices`
|
||
- `kell_creations_apps/apps/kell_mobile/lib/composition/mobile_app_services.dart` — mirrored `square()` and `multi()` factories; added `squareSyncController` field; same `KcBootstrap` Square credential validation
|
||
- `feature_wordpress/lib/src/domain/product_draft.dart` — added `squareCatalogObjectId` (nullable String) field to `ProductDraft`; updated `copyWith()` to preserve/update it; updated `==`/`hashCode`/`toString()`
|
||
- `feature_wordpress/lib/src/application/square_catalog_sync_service.dart` — fixed ID conflation bug (P1.2): `syncCatalog()` now reads `draft.squareCatalogObjectId` to look up existing mapping instead of using `draft.id`; mapping lookup uses `getMappingBySquareId()` when Square ID is present, falls back to `getMappingByLocalId()` for unsynced items; prevents duplicate mapping creation for already-synced products
|
||
- `feature_wordpress/test/square_sync_controller_test.dart` — 18 new tests: `SyncPhase` enum (1), `SquareSyncController` construction (2), `syncAll` success (3), `syncAll` error (2), concurrent guard (2), `reset()` (2), `isLoading` (2), disposal guard (2), `lastResult`/`lastError` lifecycle (2)
|
||
- `kell_creations_apps/apps/kell_web/test/composition/app_services_test.dart` — added `square()` factory tests (3: creates instance, `SquareCatalogRepository`, `SquareInventoryRepository`), `multi()` factory tests (2), `KcBootstrap` Square credential validation tests (3: selects square with credentials, selects multi with all credentials, falls back to fake without credentials) — 23 total kell_web composition tests
|
||
- `kell_creations_apps/apps/kell_mobile/test/composition/mobile_app_services_test.dart` — mirrored kell_web composition tests — 23 total kell_mobile composition tests
|
||
- tests: passed (537/537 feature_wordpress ← +31 new; 47/47 kell_web ← +23 new; 49/49 kell_mobile ← +23 new; 34/34 core; 167/167 feature_inventory — 834 total across tested packages)
|
||
- analyze: passed (dart analyze --fatal-infos — no issues found across all 5 packages)
|
||
- brief updated: yes
|