🛒 واجهة المتجر الإلكتروني (WebStore Storefront)

الباك-إند (موديول WebStore) جاهز وناضج ومختبَر — API كامل للمتجر (كتالوج، سلة، تشيك أوت، طلبات، روشتات، ولاء). المطلوب: بناء واجهة العميل من ثيم theme.zip («صيدليتي») وربطها بالـAPI. هذا تحليل الفجوة الكامل قبل كتابة أي كود. Backend WebStore API is mature & tested. Goal: build the customer storefront FE from the theme and wire it to the API. Gap analysis before any code.

📅 2026-07-18 📋 Phase-1 — بانتظار اعتماد المالك 🧩 الباك-إند موجود · الواجهة greenfield 🔬 مبني على فحص top-tier: BE API + الثيم + الأدلة
قرارات محسومة (تحديث 2026-07-18):التقنية = Angular مستقل (مشروع منفصل، نفس تصميم الثيم بالكامل) · ✅ يوصل للعميل كابديت MoonStack عادي (dist مبني، بلا build عند العميل) · ✅ الريبو = تطبيق ثانٍ في FE workspace الحالي (moon-erp-angular، مش ريبو جديد — عشان البيئات المتعددة، راجع §١٠). باقي القرارات المفتوحة: النطاق (MVP)، الدفع (COD أولًا)، اللغة — في §٨.

١ · المشكلة The problem

المالك عنده ثيم HTML كامل (theme.zip — صيدلية إلكترونية «صيدليتي»، ٢٩ صفحة، Tailwind + RTL عربي) وباك-إند مبني بالفعل (موديول WebStore — API متجر متكامل ومختبَر). عايز نعمل «العرض بتاع الاستور» = نحوّل الثيم الثابت إلى واجهة متجر حيّة تستهلك الـAPI الموجود: عرض المنتجات، السلة، التشيك أوت، الطلبات، الحساب، الروشتات، الولاء.

«done» تعني: عميل يفتح المتجر → يتصفّح المنتجات الحقيقية من قاعدة البيانات → يضيف للسلة → يسجّل دخول/حساب → يكمّل طلب حقيقي يظهر في لوحة الإدارة (ERP) → يتابع حالته ويرفع روشتة. كل ده على واجهة الثيم بشكلها الحالي، بس بربط فعلي بالباك-إند.
ملاحظة تفسير «السرفيسات موجوده»: المقصود — بحسب الفحص — أن خدمات/واجهات الباك-إند (الـAPI) موجودة وجاهزة، وليس «خدمات المعمل». المتجر كما هو مبني يبيع منتجات Inventory فقط (سلع)، مش تحاليل معمل أو خدمات عيادة (راجع قسم ٨).

٢ · الوضع الحالي (ما هو موجود فعلًا) Current state

أ) الباك-إند — موديول WebStore ناضج ومختبَر ✅

٤ شهور تطوير (مارس→يوليو ٢٠٢٦)، ٤٤ كوميت (STORE-001..066)، اتبنى ليطابق عقد تطبيق موبايل («100% mobile app API parity»). مؤخّرًا اتصلّب كتير (typed-defaults، image URLs، company-pin) + إضافتان: تحليلات العملاء والولاء.

~35endpoint عام (كتالوج+auth)
~40endpoint عميل مُوثّق
30جدول/موديل
46ملف اختبار Pest
~363تأكيد اختبار
الطبقةموجودمرجع
AuthSanctum PAT · تسجيل/دخول (username=email أو موبايل) · OTP · social-login (google/apple/facebook) · forgot/verify/reset · refresh-tokenStoreAuthService · Storefront/AuthController
كتالوجمنتجات (فلترة/فرز/صفحات) · تفاصيل + صور + variants + tiers · تقييمات · فئات + tree · مصنّعين · tagsCatalogProductController · CatalogCategoryController
سلةget/add/update/remove/clear · reorder · coupon apply/remove (auth-only)CartController · CartService
تشيك أوتvalidate · calculate (subtotal/discount/shipping) · place-order → طلب حقيقي + حدث محاسبيCheckoutController · CheckoutService
طلباتlist/detail · track (سجل حالات) · cancel · rate · حالات per-company (لا تُثبّت في الواجهة)OrderController
روشتاتlist/detail/create/update/delete (صورة عبر upload ثم مسار)PrescriptionController
حسابprofile · addresses (+governorates/cities cascade، الشحن per-city) · wishlist · loyalty summary/preview/pointsProfile/Address/Wishlist/LoyaltyController
محتوى/إعداداتsettings (لوجو/شحن/عنوان/تواصل/سوشيال/معدّل نقاط) · sliders · ads · offers · boardings · pages (CMS) · payment-methods · branches · couponsStoreSettingsController
رفع ملفاتupload/multi/delete (≤10MB، قرص public)FileUploadController

Base path: https://moonui.elbaset.com/moon-erp-be/api/store/... · Header: X-Authorization: Bearer <token> (يُفضّل على هذا الاستضافة) · Token في response.token · i18n عبر Accept-Language: ar|en · Tenancy: single-tenant مثبّت على company_id=4 (الواجهة لا ترسل أي شيء) · CORS: افتراضي *لا يحجب دومين منفصل.

ب) الثيم «صيدليتي» — تصميم كامل، لكن static 100% ⚠️

البُعدالحالة
الصفحات٢٩ صفحة HTML مكتملة التصميم (رئيسية، كتالوج، تفاصيل منتج، سلة، تشيك أوت، طلبات، حساب، روشتات، auth، about/contact)
ربط APIصفرapp.js (٣٦٦ سطر) مفيهوش أي fetch/axios/XHR. كله سلوك عرض (سلايدر، منيو، toasts). عدّاد السلة نص ثابت "5"، مفيش localStorage، مفيش حالة auth
القالب المشتركالهيدر/الفوتر/المنيو/الـmodals مكرّرة نسخ-لصق في كل الـ٢٩ صفحة — مفيش include/template
i18n/RTLعربي فقط (dir="rtl" ثابت). style-en.css موجود بس غير مستخدَم. مفيش data-i18n. زر «اللغة» بيفتح منيو بس مش بيبدّل لغة
Tailwindعبر CDN (cdn.tailwindcss.com) — dev-only، مش production-grade (غير مُنقّى، runtime)
مكتبات JSلا شيء (لا Swiper/jQuery). السلايدر vanilla يدوي. مفيش HTTP client/state/router
الصورروابط Unsplash خارجية عيّنة + Material Icons من CDN
تطابُق مهم: login الثيم يستخدم username + branch — وده يطابق الباك-إند (username=email/موبايل، والتسجيل بيتطلب branch_id). التصميم متوافق مع العقد، مش هيحتاج تعديل جذري في نموذج الدخول.

٣ · المطلوب Requested

٤ · الفجوة (GAP) — موجود مقابل مطلوب The gap

القدرةالثيم (الآن)الباك-إنداللي لازم يتعملالحجم
عرض المنتجاتكروت ثابتة data-*GET products جاهزrender ديناميكي + فلترة/فرز/صفحات + بحثمتوسط
تفاصيل منتجمعرض + تابات ثابتةproducts/{id} + reviewsربط الجاليري/السعر/المخزون/التقييمات/ذات صلةمتوسط
السلةعدّاد DOM ثابت، بلا حفظسلة auth-only، بلا guest cartسلة عميل client-side (localStorage) + مزامنة بعد الدخولكبير
التشيك أوتراديو دفع: كاش/بطاقة/InstaPay/محفظةcalculate + place-order (COD/pending)، بلا بوابة دفعربط الحساب/العنوان/الشحن + قرار الدفع (راجع ٨)كبير
Authفورمز action="x.html" (reload)Sanctum كامل + OTPAJAX + تخزين توكن + OTP concat + branch selectمتوسط
الطلبات/التتبّعكروت ثابتةorders + track جاهزربط القوائم + الحالات (من الـAPI مش ثابتة)صغير
الحسابفورمز ثابتةprofile/addresses/wishlist/coupons جاهزربط + cascade محافظة→مدينةمتوسط
الروشتاترفع + قوائم ثابتةupload ثم POST prescriptionsخطوتين رفع + ربط الحالةصغير
الولاءcheckbox «استخدم النقاط»loyalty/* + redeem inlineربط الرصيد/المعاينة/الاستخدام في التشيك أوتصغير
الهيدر المشتركمكرّر ×٢٩، ثابتpartial JS واحد يُحقن (سلة/دخول/فئات/بحث)متوسط
i18n (عربي/إنجليزي)عربي فقط، en ميّتAccept-Language جاهزطبقة ترجمة كاملة لو الإنجليزي مطلوبمتوسط
Tailwind productionCDN dev-onlybuild حقيقي (purge) بدل CDNصغير
الإشعاراتصفحة كاملةstub (يرجّع فاضي)إخفاء/تأجيل لحد ما يتبني نظام إشعاراتلاحقًا
أخطر فجوة — الدفع: الثيم بيوعد العميل بدفع بطاقة/InstaPay/محفظة فودافون، لكن place-order بيعمل طلب Pending فقط (زي الدفع عند الاستلام) — مفيش بوابة دفع/redirect/webhook. لو نطلق بخيارات دفع إلكتروني بدون باك-إند دفع = وعد كاذب للعميل. لازم قرار (قسم ٨).

٥ · الملفات المتأثرة والاعتماديات Affected files & deps

الواجهة (الثيم — كل الشغل هنا)

  • جديد: طبقة أساس — api-client.js (base URL + X-Authorization + Accept-Language + 401)، store-state.js (سلة/wishlist/auth في localStorage)، config.js (API base + عملة).
  • جديد: header.js/footer.js — يُحقن الهيدر الديناميكي بدل تعديل ٢٩ ملف.
  • تعديل: ٢٩ صفحة — استبدال البيانات الثابتة بـrender من الـAPI + تحويل ١٢ فورم لـAJAX.
  • جديد: build خفيف — Tailwind production + تجميع JS (Vite مثلًا).

الباك-إند (تغييرات صغيرة/اختيارية فقط)

  • لا شيء إلزامي للـMVP — العقد جاهز ومختبَر.
  • اختياري: إضافة إعدادات store.currency / store.name / ألوان (غير موجودة في settings).
  • أمان (قبل الإطلاق): إغلاق otp_bypass_enabled (افتراضي ON، كود 123456) + توصيل مُرسِل SMS (الـOTP حاليًا يُسجّل فقط).
  • باج بسيط: تسريب قائمة الكوبونات العامة عبر الشركات (StoreCouponController::index لا يستخدم trait الـtenancy).
  • قرار: بوابة دفع (Paymob/Fawry) لو الدفع الإلكتروني مطلوب.

المسارات الأساسية: Modules/WebStore/routes/{public,customer}.php · Storefront/*Controller.php · Http/Resources/* · Concerns/ResolvesStoreCompany.php · config/config.php · core app/Models/Product.php.

٦ · الحالات الحدّية Edge cases

الحالةالمعالجة
سلة الزائر (غير مسجّل)لا يوجد guest cart بالباك-إند → سلة client-side في localStorage، تُدمج (replay POST cart/items) بعد الدخول.
منتج نفد/تعطّل بين الإضافة والدفعcheckout/validate + place-order يرجّعوا 422 → عرض رسالة وتحديث السلة.
توكن منتهٍ (401)interceptor: مسح الجلسة + توجيه login (زي بورتال B2B). لا يوجد logout endpoint → الخروج = حذف التوكن محليًا.
OTP لا يصل فعليًاحاليًا يُسجّل فقط (لا SMS). قبل الإطلاق: توصيل مُرسِل، وإلا forgot-password لا يعمل لمستخدم حقيقي.
الحالات (طلب/دفع)per-company DB rows — تُقرأ من كائن الطلب (status.color/name)، ممنوع تثبيتها في الواجهة.
الشحنper-city (city.shipping_cost) → يظهر فقط بعد اختيار عنوان في checkout/calculate. لا ضريبة (tax=0 ثابت).
اختيار الفرع عند التسجيلالتسجيل يتطلب branch_id → لازم GET branches واختيار إجباري (احتكاك UX — راجع ٨).
الصورمعظم الـresources ترجّع image_url مطلق؛ التحقق من image في قائمة المنتجات (accessor) — fallback placeholder.
العملة/اسم المتجر/الألوانغير موجودة في settings → إما ثابتة في الواجهة أو نضيف إعدادات (راجع ٨).

٧ · خطة التنفيذ — Work Packages Execution plan

مرتّبة بالتسلسل. النطاق المقترح = MVP أولًا ثم توسعة (راجع قرار ٨-ب). كل WP = نطاق + ملفات + تحقّق. اختبارات الباك-إند خضراء بالفعل (٤٦ ملف)؛ اختبار الواجهة = يدوي/e2e على المسار الحقيقي.

WP0 — الأساس تمكيني

سكافولد: build (Tailwind production + Vite)، api-client.js (base + X-Authorization + Accept-Language + 401 interceptor)، store-state.js (سلة/wishlist/auth localStorage)، header.js/footer.js مُحقَن، config.js. نشر skeleton.
تحقّق: صفحة تجيب GET settings + GET products وتعرضهم.

WP1 — الرحلة الأساسية (MVP) القلب

كتالوج: index (سلايدر/فئات/منتجات) · products (فلترة/فرز/صفحات/بحث) · product-detail (جاليري/سعر/مخزون/تقييمات/ذات صلة) · categories.
سلة+تشيك أوت: cart (client-side + coupon) · checkout (calculate + place-order) · order-success · order-tracking.
Auth: login · register (+branch) · verify-otp (٦ خانات) · forgot/reset.
تحقّق: طلب حقيقي كامل يظهر في لوحة ERP + يتتبّع. [FIN] — التشيك أوت يمرّ على Codex + مراجعة عناية (فلوس).

WP2 — الحساب

profile · addresses (+ cascade محافظة→مدينة + set default) · wishlist · coupons · orders + order-detail (reorder/cancel/rate). تحقّق: CRUD عنوان + إعادة طلب.

WP3 — الروشتات

prescription-upload (upload ثم POST prescriptions) · prescriptions (قائمة+حالة) · prescription-detail. تحقّق: رفع صورة → تظهر بالحالة الصحيحة.

WP4 — المحتوى والولاء

ربط sliders/ads/offers في الرئيسية · loyalty (رصيد/معاينة/استخدام في التشيك أوت) · about/contact/pages (CMS) · account-coupons/notifications (الإشعارات stub → تُخفى/تُؤجّل). تحقّق: استخدام نقاط يخصم فعليًا في الطلب.

WP5 — تصليب الإطلاق بوابة إطلاق

إغلاق otp_bypass + توصيل SMS · قرار/تنفيذ بوابة الدفع · إصلاح تسريب الكوبونات · Tailwind production نهائي · i18n إنجليزي (لو مطلوب) · CORS lockdown (اختياري). [FIN]/أمان — Codex + مراجعة قبل الإطلاق العام.

WP6 — دمج التوزيع في MoonStack توزيع الأسطول

خلّي الـstorefront ينزل لكل العملاء كابديت عادي (تفصيل §١٠):
(١) إضافة تطبيق storefront للـworkspace الحالي (ng generate application storefront في moon-erp-angular) ببناء --base-href /store/.
(٢) توسعة /fullpush + moonstack-release-from-git.sh ليبنوا التطبيقين (أدمن → /app، متجر → /store).
(٣) تسجيل dist المتجر كـexternal frontend ثانٍ في الحزمة (package.frontend2public/store) + إضافة 'store' لـmanifest.frontend_paths (استبدال نظيف بلا chunks قديمة).
(٤) كاتب config.json للمتجر (apiUrl per-client، يُصان عبر الابديتات — نمط /app/assets/config.json). تحقّق: إصدار تجريبي → العميل ياخد /store في ابديت delta بلا build عنده.

٨ · قرارات تحتاج المالك Owner decisions

أ) تقنية الواجهة محوري

توضيح مهم: «مستقل» ≠ بدون Angular. «مستقل» = منفصل عن تطبيق الإدارة moon-erp في الكود والنشر. وده يتعمل بـAngular أو بالثيم كما هو — الاتنين ينفع «مستقل».

Angular مستقل (مشروع جديد) قوي استراتيجيًا

تطبيق Angular 21 جديد ومنفصل للمتجر (مش جوّه moon-erp)، نحتفظ بتصميم الثيم بالكامل (نفس HTML وكلاسات Tailwind، بس مقسّمة لمكوّنات وبياناتها من الـAPI). Tailwind يشتغل في Angular.

ليه: متسق مع خبرة الفريق (Angular shop، عندكم Angular 21 ضخم) · مكوّنات قابلة لإعادة الاستخدام · state/router/i18n جاهزين · صيانة أفضل. عيب: شغل أولي أكبر شوية (نقل الماركب لمكوّنات — التصميم متحفظ ١٠٠٪).

الثيم كما هو (vanilla/Alpine + Tailwind)

نحافظ على الـ٢٩ صفحة HTML بالظبط + طبقة JS خفيفة تكلّم الـAPI + build إنتاجي، ننشره كدومين مستقل.

ليه: أسرع إطلاق، أقل شغل، الثيم بلا لمس. عيب: vanilla عبر ٢٩ صفحة = صيانة أصعب، بلا إعادة استخدام مكوّنات، state/routing يدوي.

داخل moon-erp (غير موصى) تجنّب

موديول متجر جوّه تطبيق الإدارة. يخلط موقع العميل بلوحة الإدارة (auth/routing/bundle مختلطين). غير الخيار الأول (Angular منفصل). كذلك Blade داخل الموديول يربط الواجهة بالمونوليث ويضيّع طبيعة الـSPA.

✅ محسوم (المالك 2026-07-18): Angular مستقل. مشروع Angular 21 منفصل، نفس تصميم الثيم بالكامل (pixel-identical — نحتفظ بماركب Tailwind ولا نستبدله بـPrimeNG المرئي).

ب) نطاق أول تسليم

الموصى به: MVP أولًا (WP1: الرحلة الأساسية) ثم توسعة بالـWPs — أأمن وأسرع للتحقّق. البديل: كل الـ٢٩ صفحة دفعة واحدة (أشمل، أبطأ، مخاطرة أعلى).

ج) الدفع الإلكتروني مالي

الباك-إند مفيهوش بوابة دفع. الخيارات: (1) إطلاق COD/دفع-عند-الاستلام فقط الآن (نخفي بطاقة/محفظة) — أسرع وصادق. (2) دمج بوابة (Paymob/Fawry/InstaPay) — شغل باك-إند إضافي (redirect + webhook + تحديث حالة الدفع). توصيتي: ابدأ COD، وبوابة الدفع WP لاحق.

د) بيع خدمات المعمل/العيادة؟

المتجر كما هو يبيع منتجات Inventory فقط (بوابة status=Active & is_active). تحاليل LIS وخدمات العيادة مش قابلة للبيع حاليًا. لو المالك عايز صيدلية تبيع تحاليل أونلاين = فيتشر باك-إند منفصل (خارج نطاق ربط الثيم).

هـ) النشر + العملة + اللغة

٩ · معاينة الواجهة المتوقّعة (before → after) Expected UI

التصميم لا يتغيّر — الثيم هو المعاينة البصرية. اللي يتغيّر = البيانات والسلوك (من ثابت → حيّ). المحاكيات أدناه تقارب شكل الثيم (برتقالي، Tajawal) وتوضّح الحالة قبل/بعد.

١) كارت منتج + عدّاد السلة (الرئيسية/الكتالوج)

قبل — ثابت
🛒5
💊
باراسيتامول ٥٠٠ (عيّنة)
٢٥ ٣٠

عدّاد 5 نص ثابت · منتج عيّنة · «أضف» بتحرّك DOM بلا حفظ

بعد — حيّ من الـAPI
🛒3
💊
اسم المنتج الحقيقي
sale_price قبل الخصم

GET products · العدّاد = طول السلة الفعلية · «أضف» → localStorage/POST cart/items + toast

٢) الهيدر — دخول مقابل حسابي (يتحقن من header.js)

قبل
تسجيل الدخول

دايمًا «تسجيل الدخول» — مفيش فرع لحالة الدخول

بعد
❤️2 🛒3 حسابي ▾

مسجّل → «حسابي» + عدّادات حيّة · غير مسجّل → «تسجيل الدخول»

٣) التشيك أوت — الدفع (الفجوة الأخطر)

الثيم (يوعد)
💵 عند الاستلام
💳 بطاقة
📱 InstaPay
📲 محفظة فودافون

٤ خيارات — لكن ٣ منها بلا باك-إند دفع

MVP الصادق (موصى به)
💵 عند الاستلام ✓
💳 بطاقة (قريبًا)
📱 InstaPay (قريبًا)

نُظهر المتاح فعلًا فقط؛ الباقي «قريبًا» لحد بوابة الدفع (قرار ٨-ج)

٤) التسجيل — اختيار الفرع (احتكاك من العقد)

الفرع * اختر فرعًا ▾ (GET branches)
اسم المستخدم (email/موبايل) *
الموبايل · كلمة المرور

التسجيل يتطلب branch_id إجباري — الثيم أصلًا فيه حقل «الفرع» فالتطابق موجود.

الخلاصة البصرية: شكل المتجر النهائي = نفس الثيم الحالي بالظبط، الفرق إن كل رقم/كارت/زر بقى حقيقي ومربوط. التعديل الوحيد المرئي المقترح = إخفاء خيارات الدفع غير المدعومة (صدق مع العميل) لحد بوابة الدفع.

١٠ · التوزيع عبر MoonStack (يوصل للعميل كابديت عادي) Distribution

الهدف: العميل يعمل ابديت من MoonStack زي أي مرة → الاستور ينزل معاه تلقائيًا. الفحص أكّد إن ده ممكن ومباشر — MoonStack أصلًا نظام توصيل واجهات مبنية جاهزة.

كيف يشتغل النظام حاليًا (مؤكّد من الكود + الـmanifest الحيّ)

الخلاصة: المتجر = «تطبيق Angular مبني تاني عند public/store»

السؤالالإجابة المؤكّدة
ينزل كابديت MoonStack؟✅ نعم — dist المتجر يُحزَم كـfrontend ثانٍ، ويُنسخ لدوكروت العميل زي /app بالظبط، عبر نفس مسار التوقيع/الـrollback/الـdelta.
build عند العميل؟❌ لا — يُبنى على سيرفر الإصدار، ويُشحن مبني (يحترم حد PMEM).
يظهر عند العميل فين؟https://<client>/store/ (base-href /store/) — تلقائيًا بلا تعديل .htaccess. أو subdomain عبر vhost على public/store.
رابط الـAPI لكل عميل؟config.json خاص بالمتجر (apiUrl per-client) يُكتب وقت التثبيت ويُصان عبر الابديتات — نفس نمط /app/assets/config.json.

قرار الريبو — محسوم بعد اعتبار البيئات المتعددة محسوم

القيد الحاسم (المالك): فيه بيئات ديفيلوب متعددة (moonui/2/3 وغيرها) بتعليمات قديمة بتكلون ريبوين بس (BE + moon-erp-angular). ريبو تالت جديد = بيئات عمياء عنه (مش هتكلونه ولا تبنيه ولا تنشره) + كل تولينج/onboarding/fullpush لازم يتعلّم عنه. التكلفة التشغيلية عبر ٣+ بيئات أكبر من مكسب «العزل النظيف».

القرار: الاستور تطبيق ثانٍ داخل ريبو الـFE الحالي (moon-erp-angular) — Angular multi-project workspace، مش ريبو جديد. الـangular.json أصلًا workspace (newProjectRoot: projects) فيه مشروع moon-erp؛ نضيف تطبيق storefront بـng generate application storefrontprojects/storefront/ ببناء مستقل (--base-href /store/).

البُعدريبو جديد ❌تطبيق ثانٍ في FE workspace ✅
البيئات القائمة (moon2/3)عمياء عنه (تعليمات قديمة)تاخده مجانًا مع كلون الـFE
onboarding بيئة جديدة«اكلون ريبو تالت»صفر تغيير — جاي مع الـFE
/fullpushمسار ثالث كاملسطر ng build storefront + deploy /store واحد
MoonStack release-from-gitكلون + كريدنشال ثانٍنفس الكلون، ng build ثانٍ بس
الفصل أدمن/متجرريبومشروعان منفصلان (سورس/راوتنج/dist مستقل) — فصل نظيف بردو

التنازل المقبول: قطار إصدار مشترك (كوميت المتجر والأدمن على نفس الفرع/الميرج — طبيعي لفريقكم) + وقت بناء أطول شوية (تطبيقان). مقابل: صفر بيئة عمياء، أقل تولينج، مسار توزيع واحد.

🔴 بند أمان جانبي (غير متعلّق بالخطة، للتنبيه): الـremotes بتوع الريبوهات فيها PAT بالنص الصريح (ghp_…) — يُنصح بتدويرها (rotate).
Moon ERP — تحليل واجهة المتجر الإلكتروني · Phase-1 (بحث فقط، صفر كود) · 2026-07-18
مبني على فحص top-tier للباك-إند (WebStore API + auth + tenancy) والثيم (٢٩ صفحة) والأدلة (git/KB/config). بانتظار اعتماد المالك قبل أي تنفيذ.